From 6327cfe9381b6505e29b35c2cd839e3721effc51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Zasso?= Date: Thu, 19 Nov 2020 21:14:36 +0100 Subject: [PATCH 01/24] deps: update V8 to 8.7.220 --- deps/v8/AUTHORS | 6 + deps/v8/BUILD.gn | 184 +- deps/v8/COMMON_OWNERS | 1 + deps/v8/DEPS | 32 +- deps/v8/LICENSE.valgrind | 45 - deps/v8/PPC_OWNERS | 6 +- deps/v8/S390_OWNERS | 6 +- deps/v8/gni/v8.gni | 5 +- deps/v8/include/cppgc/OWNERS | 2 + deps/v8/include/cppgc/default-platform.h | 14 +- deps/v8/include/cppgc/heap.h | 2 +- .../cppgc/internal/prefinalizer-handler.h | 2 +- deps/v8/include/cppgc/member.h | 34 +- deps/v8/include/js_protocol.pdl | 26 +- deps/v8/include/v8-internal.h | 3 +- deps/v8/include/v8-metrics.h | 8 +- deps/v8/include/v8-platform.h | 35 +- deps/v8/include/v8-profiler.h | 28 +- deps/v8/include/v8-version.h | 6 +- deps/v8/include/v8.h | 121 +- deps/v8/include/v8config.h | 12 + deps/v8/infra/mb/mb_config.pyl | 32 +- deps/v8/infra/testing/PRESUBMIT.py | 5 +- deps/v8/infra/testing/builders.pyl | 141 +- deps/v8/samples/process.cc | 2 +- deps/v8/src/DEPS | 5 +- deps/v8/src/api/api.cc | 130 +- deps/v8/src/asmjs/asm-js.cc | 2 +- deps/v8/src/asmjs/asm-parser.cc | 36 +- .../ast/ast-function-literal-id-reindexer.cc | 9 +- deps/v8/src/ast/scopes.cc | 1 - deps/v8/src/base/atomicops.h | 23 +- deps/v8/src/base/cpu.cc | 59 + deps/v8/src/base/macros.h | 4 +- deps/v8/src/base/once.cc | 4 + .../src/base/platform/condition-variable.cc | 32 +- .../v8/src/base/platform/condition-variable.h | 6 + deps/v8/src/base/platform/mutex.cc | 37 +- deps/v8/src/base/platform/mutex.h | 12 + deps/v8/src/base/platform/platform-posix.cc | 36 +- .../src/base/platform/platform-starboard.cc | 499 ++ deps/v8/src/base/platform/platform-win32.cc | 9 +- deps/v8/src/base/platform/platform.h | 9 + deps/v8/src/base/platform/semaphore.cc | 15 + deps/v8/src/base/platform/semaphore.h | 6 + deps/v8/src/base/platform/time.cc | 36 +- deps/v8/src/base/platform/time.h | 3 + deps/v8/src/builtins/accessors.cc | 10 +- deps/v8/src/builtins/arm/builtins-arm.cc | 101 +- deps/v8/src/builtins/arm64/builtins-arm64.cc | 74 +- deps/v8/src/builtins/array-reverse.tq | 2 +- deps/v8/src/builtins/arraybuffer.tq | 66 + deps/v8/src/builtins/base.tq | 14 +- deps/v8/src/builtins/builtins-arraybuffer.cc | 29 - deps/v8/src/builtins/builtins-async-module.cc | 6 +- deps/v8/src/builtins/builtins-call-gen.cc | 26 +- deps/v8/src/builtins/builtins-call.cc | 39 - .../src/builtins/builtins-collections-gen.cc | 14 +- .../src/builtins/builtins-constructor-gen.cc | 65 +- .../src/builtins/builtins-constructor-gen.h | 4 + .../src/builtins/builtins-conversion-gen.cc | 11 +- deps/v8/src/builtins/builtins-definitions.h | 7 +- deps/v8/src/builtins/builtins-handler-gen.cc | 123 +- deps/v8/src/builtins/builtins-ic-gen.cc | 1 + deps/v8/src/builtins/builtins-internal-gen.cc | 36 +- deps/v8/src/builtins/builtins-intl.cc | 4 +- deps/v8/src/builtins/builtins-object-gen.cc | 23 +- deps/v8/src/builtins/builtins-object-gen.h | 14 - deps/v8/src/builtins/builtins-proxy-gen.cc | 5 +- deps/v8/src/builtins/builtins-regexp-gen.cc | 38 +- deps/v8/src/builtins/builtins-string.tq | 7 +- deps/v8/src/builtins/builtins.cc | 24 + deps/v8/src/builtins/conversion.tq | 4 +- deps/v8/src/builtins/frame-arguments.tq | 38 +- deps/v8/src/builtins/frames.tq | 9 + deps/v8/src/builtins/ia32/builtins-ia32.cc | 141 +- deps/v8/src/builtins/ic-callable.tq | 18 + deps/v8/src/builtins/internal.tq | 8 +- deps/v8/src/builtins/iterator.tq | 13 +- deps/v8/src/builtins/mips/builtins-mips.cc | 556 +- .../v8/src/builtins/mips64/builtins-mips64.cc | 591 ++- deps/v8/src/builtins/ppc/builtins-ppc.cc | 728 ++- deps/v8/src/builtins/s390/builtins-s390.cc | 736 ++- .../src/builtins/torque-csa-header-includes.h | 4 +- deps/v8/src/builtins/typed-array-from.tq | 64 +- deps/v8/src/builtins/wasm.tq | 4 + deps/v8/src/builtins/x64/builtins-x64.cc | 814 ++- deps/v8/src/codegen/arm/assembler-arm-inl.h | 2 +- .../codegen/arm/interface-descriptors-arm.cc | 5 + .../v8/src/codegen/arm/macro-assembler-arm.cc | 15 +- deps/v8/src/codegen/arm/register-arm.h | 5 +- .../v8/src/codegen/arm64/instructions-arm64.h | 2 +- .../arm64/interface-descriptors-arm64.cc | 5 + .../codegen/arm64/macro-assembler-arm64.cc | 6 +- .../src/codegen/arm64/macro-assembler-arm64.h | 8 + deps/v8/src/codegen/arm64/register-arm64.cc | 4 + deps/v8/src/codegen/arm64/register-arm64.h | 7 +- deps/v8/src/codegen/bailout-reason.h | 1 + deps/v8/src/codegen/code-stub-assembler.cc | 604 ++- deps/v8/src/codegen/code-stub-assembler.h | 292 +- deps/v8/src/codegen/compiler.cc | 140 +- deps/v8/src/codegen/compiler.h | 4 - deps/v8/src/codegen/external-reference.h | 3 +- .../ia32/interface-descriptors-ia32.cc | 5 + .../src/codegen/ia32/macro-assembler-ia32.cc | 5 +- .../src/codegen/ia32/macro-assembler-ia32.h | 5 +- deps/v8/src/codegen/interface-descriptors.cc | 16 + deps/v8/src/codegen/interface-descriptors.h | 49 +- deps/v8/src/codegen/macro-assembler.h | 8 +- .../mips/interface-descriptors-mips.cc | 5 + .../src/codegen/mips/macro-assembler-mips.cc | 43 +- .../src/codegen/mips/macro-assembler-mips.h | 26 + .../mips64/interface-descriptors-mips64.cc | 5 + .../codegen/mips64/macro-assembler-mips64.cc | 86 +- .../codegen/mips64/macro-assembler-mips64.h | 29 + .../src/codegen/optimized-compilation-info.cc | 6 - .../src/codegen/optimized-compilation-info.h | 44 +- deps/v8/src/codegen/ppc/constants-ppc.h | 48 +- .../codegen/ppc/interface-descriptors-ppc.cc | 5 + .../v8/src/codegen/ppc/macro-assembler-ppc.cc | 36 +- deps/v8/src/codegen/ppc/macro-assembler-ppc.h | 26 + .../s390/interface-descriptors-s390.cc | 5 + .../src/codegen/s390/macro-assembler-s390.cc | 35 +- .../src/codegen/s390/macro-assembler-s390.h | 26 + deps/v8/src/codegen/signature.h | 12 +- .../codegen/x64/interface-descriptors-x64.cc | 5 + .../v8/src/codegen/x64/macro-assembler-x64.cc | 52 +- deps/v8/src/common/assert-scope.cc | 2 + deps/v8/src/common/assert-scope.h | 13 +- deps/v8/src/common/globals.h | 34 +- deps/v8/src/common/message-template.h | 2 + .../optimizing-compile-dispatcher.cc | 2 +- deps/v8/src/compiler/access-builder.cc | 21 +- deps/v8/src/compiler/access-builder.h | 2 + deps/v8/src/compiler/access-info.cc | 16 + deps/v8/src/compiler/allocation-builder-inl.h | 4 +- .../backend/arm/code-generator-arm.cc | 13 +- .../backend/arm/instruction-codes-arm.h | 4 +- .../backend/arm/instruction-scheduler-arm.cc | 4 +- .../backend/arm/instruction-selector-arm.cc | 8 +- .../backend/arm64/code-generator-arm64.cc | 59 +- .../backend/arm64/instruction-codes-arm64.h | 20 +- .../arm64/instruction-scheduler-arm64.cc | 16 +- .../arm64/instruction-selector-arm64.cc | 60 +- .../compiler/backend/code-generator-impl.h | 6 + .../v8/src/compiler/backend/code-generator.cc | 12 +- deps/v8/src/compiler/backend/code-generator.h | 8 +- .../backend/ia32/code-generator-ia32.cc | 35 +- .../backend/ia32/instruction-codes-ia32.h | 4 +- .../ia32/instruction-scheduler-ia32.cc | 4 +- .../backend/ia32/instruction-selector-ia32.cc | 23 +- .../src/compiler/backend/instruction-codes.h | 2 + .../compiler/backend/instruction-selector.cc | 125 +- .../compiler/backend/instruction-selector.h | 18 + .../compiler/backend/live-range-separator.cc | 199 - .../compiler/backend/live-range-separator.h | 61 - .../backend/mips/code-generator-mips.cc | 29 +- .../backend/mips/instruction-codes-mips.h | 4 +- .../mips/instruction-scheduler-mips.cc | 4 +- .../backend/mips/instruction-selector-mips.cc | 21 +- .../backend/mips64/code-generator-mips64.cc | 90 +- .../backend/mips64/instruction-codes-mips64.h | 4 +- .../mips64/instruction-scheduler-mips64.cc | 4 +- .../mips64/instruction-selector-mips64.cc | 58 +- deps/v8/src/compiler/backend/ppc/OWNERS | 6 +- .../backend/ppc/code-generator-ppc.cc | 172 +- .../backend/ppc/instruction-codes-ppc.h | 19 +- .../backend/ppc/instruction-scheduler-ppc.cc | 19 +- .../backend/ppc/instruction-selector-ppc.cc | 45 +- .../compiler/backend/register-allocator.cc | 688 +-- .../src/compiler/backend/register-allocator.h | 69 +- .../backend/s390/code-generator-s390.cc | 361 +- .../backend/s390/instruction-codes-s390.h | 4 +- .../s390/instruction-scheduler-s390.cc | 4 +- .../backend/s390/instruction-selector-s390.cc | 12 +- .../backend/x64/code-generator-x64.cc | 326 +- .../backend/x64/instruction-codes-x64.h | 4 +- .../backend/x64/instruction-scheduler-x64.cc | 4 +- .../backend/x64/instruction-selector-x64.cc | 47 +- .../v8/src/compiler/bytecode-graph-builder.cc | 148 +- deps/v8/src/compiler/bytecode-graph-builder.h | 7 +- deps/v8/src/compiler/c-linkage.cc | 131 +- deps/v8/src/compiler/code-assembler.cc | 7 +- deps/v8/src/compiler/common-operator.h | 73 + .../src/compiler/compilation-dependencies.cc | 8 + deps/v8/src/compiler/compilation-dependency.h | 4 + .../src/compiler/effect-control-linearizer.cc | 283 +- .../src/compiler/escape-analysis-reducer.cc | 9 +- deps/v8/src/compiler/graph-assembler.cc | 76 +- deps/v8/src/compiler/graph-assembler.h | 50 +- deps/v8/src/compiler/graph-reducer.cc | 15 +- deps/v8/src/compiler/graph-reducer.h | 5 +- deps/v8/src/compiler/graph-visualizer.cc | 3 - deps/v8/src/compiler/heap-refs.h | 128 +- deps/v8/src/compiler/js-call-reducer.cc | 81 +- deps/v8/src/compiler/js-call-reducer.h | 5 + deps/v8/src/compiler/js-create-lowering.cc | 7 +- deps/v8/src/compiler/js-generic-lowering.cc | 101 +- deps/v8/src/compiler/js-graph.cc | 3 + deps/v8/src/compiler/js-graph.h | 1 + deps/v8/src/compiler/js-heap-broker.cc | 1344 ++--- deps/v8/src/compiler/js-heap-broker.h | 31 +- deps/v8/src/compiler/js-heap-copy-reducer.cc | 7 + deps/v8/src/compiler/js-inlining.cc | 4 +- deps/v8/src/compiler/js-intrinsic-lowering.cc | 2 +- .../js-native-context-specialization.cc | 11 +- deps/v8/src/compiler/js-operator.cc | 14 + deps/v8/src/compiler/js-operator.h | 17 + deps/v8/src/compiler/js-typed-lowering.cc | 34 +- deps/v8/src/compiler/linkage.cc | 11 +- deps/v8/src/compiler/linkage.h | 44 +- .../src/compiler/machine-operator-reducer.cc | 2 +- deps/v8/src/compiler/machine-operator.cc | 8 +- deps/v8/src/compiler/machine-operator.h | 6 +- deps/v8/src/compiler/opcodes.h | 55 +- deps/v8/src/compiler/operator-properties.cc | 2 + deps/v8/src/compiler/pipeline.cc | 137 +- deps/v8/src/compiler/processed-feedback.h | 7 +- .../src/compiler/property-access-builder.cc | 54 +- .../compiler/scheduled-machine-lowering.cc | 2 +- .../serializer-for-background-compilation.cc | 8 + deps/v8/src/compiler/simd-scalar-lowering.cc | 569 +- deps/v8/src/compiler/simd-scalar-lowering.h | 8 + deps/v8/src/compiler/simplified-lowering.cc | 1 + .../compiler/simplified-operator-reducer.cc | 33 + deps/v8/src/compiler/simplified-operator.cc | 32 +- deps/v8/src/compiler/simplified-operator.h | 39 +- .../src/compiler/store-store-elimination.cc | 3 +- deps/v8/src/compiler/typer.cc | 9 +- deps/v8/src/compiler/verifier.cc | 4 + deps/v8/src/compiler/wasm-compiler.cc | 441 +- deps/v8/src/compiler/wasm-compiler.h | 17 +- deps/v8/src/d8/async-hooks-wrapper.cc | 6 +- deps/v8/src/d8/d8-platforms.cc | 4 +- deps/v8/src/d8/d8-posix.cc | 10 +- deps/v8/src/d8/d8.cc | 332 +- deps/v8/src/d8/d8.h | 141 +- deps/v8/src/debug/debug-evaluate.cc | 2 +- deps/v8/src/debug/debug-interface.h | 7 + deps/v8/src/debug/debug.cc | 23 +- deps/v8/src/debug/liveedit.cc | 2 +- deps/v8/src/debug/ppc/OWNERS | 6 +- .../deoptimizer/arm64/deoptimizer-arm64.cc | 15 +- .../deoptimizer/deoptimizer-cfi-builtins.cc | 47 + .../src/deoptimizer/deoptimizer-cfi-empty.cc | 14 + deps/v8/src/deoptimizer/deoptimizer.cc | 460 +- deps/v8/src/deoptimizer/deoptimizer.h | 47 +- .../src/diagnostics/basic-block-profiler.cc | 2 +- .../v8/src/diagnostics/basic-block-profiler.h | 2 +- deps/v8/src/diagnostics/ia32/disasm-ia32.cc | 4 + deps/v8/src/diagnostics/objects-debug.cc | 87 +- deps/v8/src/diagnostics/objects-printer.cc | 15 +- deps/v8/src/diagnostics/unwinder.cc | 103 +- .../src/diagnostics/unwinding-info-win64.cc | 31 - .../src/execution/arm/frame-constants-arm.h | 36 +- deps/v8/src/execution/arm/simulator-arm.cc | 22 +- .../execution/arm64/frame-constants-arm64.cc | 7 +- .../execution/arm64/frame-constants-arm64.h | 4 +- .../arm64/pointer-authentication-arm64.h | 68 +- deps/v8/src/execution/frame-constants.h | 127 +- deps/v8/src/execution/frames-inl.h | 13 +- deps/v8/src/execution/frames.cc | 79 +- deps/v8/src/execution/frames.h | 5 + deps/v8/src/execution/isolate.cc | 60 +- deps/v8/src/execution/isolate.h | 24 +- .../src/execution/mips/frame-constants-mips.h | 8 +- .../execution/mips64/frame-constants-mips64.h | 8 +- .../execution/pointer-authentication-dummy.h | 18 +- .../v8/src/execution/pointer-authentication.h | 15 +- .../src/execution/ppc/frame-constants-ppc.h | 4 +- deps/v8/src/execution/ppc/simulator-ppc.cc | 8 +- deps/v8/src/execution/runtime-profiler.cc | 156 +- deps/v8/src/execution/runtime-profiler.h | 19 +- .../src/execution/s390/frame-constants-s390.h | 4 +- deps/v8/src/execution/s390/simulator-s390.cc | 9 +- deps/v8/src/execution/thread-local-top.cc | 4 + deps/v8/src/execution/thread-local-top.h | 12 + deps/v8/src/execution/v8threads.cc | 6 +- deps/v8/src/execution/v8threads.h | 3 + deps/v8/src/flags/flag-definitions.h | 196 +- deps/v8/src/flags/flags.cc | 353 +- deps/v8/src/handles/handles.cc | 2 +- deps/v8/src/handles/handles.h | 9 + .../heap/base/asm/ppc/push_registers_asm.cc | 4 +- deps/v8/src/heap/base/worklist.cc | 19 + deps/v8/src/heap/base/worklist.h | 451 ++ deps/v8/src/heap/concurrent-allocator.cc | 24 +- deps/v8/src/heap/concurrent-allocator.h | 3 - .../v8/src/heap/conservative-stack-visitor.cc | 78 + deps/v8/src/heap/conservative-stack-visitor.h | 32 + deps/v8/src/heap/cppgc-js/cpp-heap.cc | 32 +- deps/v8/src/heap/cppgc-js/cpp-heap.h | 6 + deps/v8/src/heap/cppgc/default-job.h | 186 + deps/v8/src/heap/cppgc/default-platform.cc | 78 +- deps/v8/src/heap/cppgc/garbage-collector.h | 13 +- deps/v8/src/heap/cppgc/gc-invoker.cc | 28 +- deps/v8/src/heap/cppgc/gc-invoker.h | 1 + deps/v8/src/heap/cppgc/heap-base.cc | 9 +- deps/v8/src/heap/cppgc/heap-base.h | 17 +- deps/v8/src/heap/cppgc/heap-growing.cc | 68 +- deps/v8/src/heap/cppgc/heap-growing.h | 5 +- deps/v8/src/heap/cppgc/heap.cc | 71 +- deps/v8/src/heap/cppgc/heap.h | 16 +- .../cppgc/incremental-marking-schedule.cc | 74 + .../heap/cppgc/incremental-marking-schedule.h | 53 + deps/v8/src/heap/cppgc/marker.cc | 278 +- deps/v8/src/heap/cppgc/marker.h | 115 +- deps/v8/src/heap/cppgc/marking-state.cc | 20 + deps/v8/src/heap/cppgc/marking-state.h | 59 +- deps/v8/src/heap/cppgc/marking-verifier.cc | 17 +- deps/v8/src/heap/cppgc/marking-verifier.h | 7 + deps/v8/src/heap/cppgc/marking-visitor.h | 2 +- deps/v8/src/heap/cppgc/marking-worklists.cc | 10 - deps/v8/src/heap/cppgc/marking-worklists.h | 17 +- deps/v8/src/heap/cppgc/object-allocator.cc | 3 +- .../v8/src/heap/cppgc/prefinalizer-handler.cc | 2 +- deps/v8/src/heap/cppgc/stats-collector.cc | 14 +- deps/v8/src/heap/cppgc/stats-collector.h | 4 + deps/v8/src/heap/cppgc/sweeper.cc | 26 +- deps/v8/src/heap/cppgc/sweeper.h | 2 +- deps/v8/src/heap/cppgc/worklist.h | 473 -- deps/v8/src/heap/factory-base.cc | 3 +- deps/v8/src/heap/factory.cc | 9 +- deps/v8/src/heap/factory.h | 2 +- deps/v8/src/heap/heap-inl.h | 25 +- deps/v8/src/heap/heap-write-barrier-inl.h | 6 +- deps/v8/src/heap/heap-write-barrier.cc | 38 +- deps/v8/src/heap/heap-write-barrier.h | 9 +- deps/v8/src/heap/heap.cc | 175 +- deps/v8/src/heap/heap.h | 39 +- deps/v8/src/heap/incremental-marking.cc | 8 +- deps/v8/src/heap/incremental-marking.h | 2 + deps/v8/src/heap/index-generator.cc | 48 + deps/v8/src/heap/index-generator.h | 43 + deps/v8/src/heap/local-heap-inl.h | 7 +- deps/v8/src/heap/local-heap.cc | 15 + deps/v8/src/heap/local-heap.h | 7 + deps/v8/src/heap/mark-compact-inl.h | 5 +- deps/v8/src/heap/mark-compact.cc | 38 +- deps/v8/src/heap/mark-compact.h | 6 +- deps/v8/src/heap/marking-barrier-inl.h | 6 +- deps/v8/src/heap/marking-barrier.cc | 171 +- deps/v8/src/heap/marking-barrier.h | 30 +- deps/v8/src/heap/marking-visitor-inl.h | 4 +- deps/v8/src/heap/marking-visitor.h | 3 +- deps/v8/src/heap/marking-worklist-inl.h | 269 - deps/v8/src/heap/marking-worklist.h | 117 +- deps/v8/src/heap/marking.h | 3 +- deps/v8/src/heap/memory-chunk-layout.h | 7 + deps/v8/src/heap/memory-chunk.cc | 4 + deps/v8/src/heap/memory-chunk.h | 8 + deps/v8/src/heap/new-spaces.cc | 2 + deps/v8/src/heap/object-start-bitmap.h | 188 + deps/v8/src/heap/object-stats.cc | 2 +- deps/v8/src/heap/objects-visiting.h | 3 +- deps/v8/src/heap/paged-spaces.cc | 18 +- deps/v8/src/heap/paged-spaces.h | 8 +- deps/v8/src/heap/safepoint.cc | 4 - deps/v8/src/heap/safepoint.h | 4 - deps/v8/src/heap/scavenger.cc | 2 +- deps/v8/src/heap/setup-heap-internal.cc | 6 +- deps/v8/src/heap/sweeper.cc | 8 + deps/v8/src/ic/accessor-assembler.cc | 492 +- deps/v8/src/ic/accessor-assembler.h | 122 +- deps/v8/src/ic/handler-configuration.cc | 322 +- deps/v8/src/ic/handler-configuration.h | 64 +- deps/v8/src/ic/ic-inl.h | 9 +- deps/v8/src/ic/ic.cc | 211 +- deps/v8/src/ic/ic.h | 22 +- deps/v8/src/init/bootstrapper.cc | 8 +- deps/v8/src/inspector/DEPS | 1 + deps/v8/src/inspector/string-16.cc | 8 + deps/v8/src/inspector/string-16.h | 1 + .../src/inspector/v8-profiler-agent-impl.cc | 158 +- .../v8/src/inspector/v8-profiler-agent-impl.h | 10 +- deps/v8/src/inspector/value-mirror.cc | 26 + deps/v8/src/interpreter/OWNERS | 1 - .../src/interpreter/bytecode-array-builder.cc | 9 +- .../src/interpreter/bytecode-array-builder.h | 4 + deps/v8/src/interpreter/bytecode-generator.cc | 69 +- deps/v8/src/interpreter/bytecode-generator.h | 1 + deps/v8/src/interpreter/bytecode-register.cc | 2 +- deps/v8/src/interpreter/bytecodes.h | 2 + .../src/interpreter/interpreter-generator.cc | 32 +- .../interpreter-intrinsics-generator.cc | 2 +- .../src/interpreter/interpreter-intrinsics.h | 2 +- deps/v8/src/interpreter/interpreter.cc | 4 +- deps/v8/src/libplatform/OWNERS | 1 + deps/v8/src/libplatform/default-job.cc | 106 +- deps/v8/src/libplatform/default-job.h | 53 +- deps/v8/src/libsampler/sampler.cc | 2 +- deps/v8/src/logging/code-events.h | 6 - deps/v8/src/logging/counters.cc | 11 + deps/v8/src/logging/counters.h | 6 +- deps/v8/src/logging/log-utils.cc | 106 +- deps/v8/src/logging/log-utils.h | 59 +- deps/v8/src/logging/log.cc | 299 +- deps/v8/src/logging/log.h | 21 +- deps/v8/src/numbers/conversions.cc | 73 +- deps/v8/src/numbers/hash-seed-inl.h | 1 - deps/v8/src/objects/allocation-site-scopes.h | 4 +- deps/v8/src/objects/api-callbacks-inl.h | 2 +- deps/v8/src/objects/api-callbacks.h | 4 +- deps/v8/src/objects/arguments.h | 2 +- deps/v8/src/objects/arguments.tq | 59 +- deps/v8/src/objects/backing-store.cc | 8 +- deps/v8/src/objects/bigint.cc | 37 +- deps/v8/src/objects/bigint.h | 14 +- deps/v8/src/objects/cell.h | 2 +- .../objects/class-definitions-tq-deps-inl.h | 2 +- deps/v8/src/objects/code-inl.h | 47 +- deps/v8/src/objects/code-kind.h | 16 +- deps/v8/src/objects/code.cc | 50 +- deps/v8/src/objects/code.h | 18 +- deps/v8/src/objects/compressed-slots-inl.h | 10 + deps/v8/src/objects/compressed-slots.h | 2 + deps/v8/src/objects/contexts-inl.h | 1 + deps/v8/src/objects/contexts.h | 2 +- deps/v8/src/objects/debug-objects.h | 2 +- deps/v8/src/objects/descriptor-array-inl.h | 2 +- deps/v8/src/objects/descriptor-array.h | 2 +- deps/v8/src/objects/elements-kind.cc | 7 + deps/v8/src/objects/elements-kind.h | 4 +- deps/v8/src/objects/elements.cc | 7 +- deps/v8/src/objects/embedder-data-array.h | 2 +- deps/v8/src/objects/embedder-data-slot-inl.h | 4 +- deps/v8/src/objects/embedder-data-slot.h | 4 +- deps/v8/src/objects/feedback-vector-inl.h | 64 +- deps/v8/src/objects/feedback-vector.cc | 27 +- deps/v8/src/objects/feedback-vector.h | 69 +- deps/v8/src/objects/feedback-vector.tq | 11 +- deps/v8/src/objects/fixed-array-inl.h | 15 +- deps/v8/src/objects/fixed-array.h | 14 +- deps/v8/src/objects/fixed-array.tq | 2 +- deps/v8/src/objects/foreign.h | 2 +- deps/v8/src/objects/free-space.h | 2 +- deps/v8/src/objects/heap-object.h | 4 +- deps/v8/src/objects/instance-type.h | 3 +- deps/v8/src/objects/internal-index.h | 3 +- deps/v8/src/objects/intl-objects.tq | 2 + deps/v8/src/objects/js-array-buffer.h | 2 +- deps/v8/src/objects/js-array.h | 2 +- deps/v8/src/objects/js-break-iterator.h | 2 +- deps/v8/src/objects/js-collator.cc | 29 +- deps/v8/src/objects/js-date-time-format.cc | 85 +- deps/v8/src/objects/js-date-time-format.h | 2 +- deps/v8/src/objects/js-function-inl.h | 304 ++ deps/v8/src/objects/js-function.cc | 295 +- deps/v8/src/objects/js-function.h | 96 +- deps/v8/src/objects/js-objects.cc | 33 +- deps/v8/src/objects/js-objects.h | 4 +- deps/v8/src/objects/js-promise.h | 2 +- deps/v8/src/objects/js-proxy.h | 2 +- deps/v8/src/objects/js-regexp-inl.h | 10 +- .../src/objects/js-regexp-string-iterator.h | 2 +- deps/v8/src/objects/js-regexp.h | 20 +- deps/v8/src/objects/js-segment-iterator-inl.h | 2 + deps/v8/src/objects/js-segment-iterator.cc | 8 + deps/v8/src/objects/js-segment-iterator.h | 1 + deps/v8/src/objects/js-segments.cc | 5 +- deps/v8/src/objects/js-segments.h | 2 +- deps/v8/src/objects/js-weak-refs.h | 2 +- deps/v8/src/objects/literal-objects.cc | 2 +- deps/v8/src/objects/lookup-inl.h | 54 +- deps/v8/src/objects/lookup.cc | 45 +- deps/v8/src/objects/lookup.h | 18 +- deps/v8/src/objects/map-inl.h | 3 +- deps/v8/src/objects/map-updater.cc | 13 +- deps/v8/src/objects/map.cc | 18 +- deps/v8/src/objects/map.h | 5 +- deps/v8/src/objects/maybe-object-inl.h | 13 + deps/v8/src/objects/maybe-object.h | 3 + deps/v8/src/objects/module.cc | 155 +- deps/v8/src/objects/module.h | 13 +- deps/v8/src/objects/name-inl.h | 6 + deps/v8/src/objects/name.h | 10 +- deps/v8/src/objects/object-list-macros.h | 2 +- deps/v8/src/objects/object-macros-undef.h | 7 - deps/v8/src/objects/object-macros.h | 47 +- .../objects/objects-body-descriptors-inl.h | 34 +- deps/v8/src/objects/objects-definitions.h | 3 +- deps/v8/src/objects/objects-inl.h | 2 +- deps/v8/src/objects/objects.cc | 50 +- .../src/objects/primitive-heap-object-inl.h | 2 +- deps/v8/src/objects/primitive-heap-object.h | 2 +- deps/v8/src/objects/property-array.h | 2 +- deps/v8/src/objects/property-cell.h | 2 +- .../src/objects/property-descriptor-object.h | 2 +- deps/v8/src/objects/prototype-info.h | 2 +- deps/v8/src/objects/scope-info.h | 2 +- deps/v8/src/objects/script.h | 2 +- .../v8/src/objects/shared-function-info-inl.h | 3 + deps/v8/src/objects/shared-function-info.h | 8 +- deps/v8/src/objects/shared-function-info.tq | 1 + deps/v8/src/objects/slots-inl.h | 4 + deps/v8/src/objects/slots.h | 1 + deps/v8/src/objects/source-text-module.cc | 11 +- deps/v8/src/objects/source-text-module.h | 2 +- deps/v8/src/objects/stack-frame-info.h | 2 +- deps/v8/src/objects/stack-frame-info.tq | 1 - deps/v8/src/objects/string-table.cc | 106 +- deps/v8/src/objects/string-table.h | 16 +- deps/v8/src/objects/string.cc | 2 + deps/v8/src/objects/struct-inl.h | 2 +- deps/v8/src/objects/struct.h | 2 +- deps/v8/src/objects/synthetic-module.cc | 21 +- deps/v8/src/objects/tagged-field.h | 6 +- deps/v8/src/objects/templates.h | 2 +- deps/v8/src/objects/transitions-inl.h | 8 + deps/v8/src/objects/transitions.cc | 4 +- deps/v8/src/objects/transitions.h | 13 +- deps/v8/src/objects/value-serializer.cc | 1 - deps/v8/src/parsing/expression-scope.h | 4 +- deps/v8/src/parsing/parser-base.h | 25 +- deps/v8/src/parsing/parser.cc | 2 +- deps/v8/src/parsing/parser.h | 2 +- deps/v8/src/parsing/preparser.cc | 4 +- deps/v8/src/profiler/cpu-profiler-inl.h | 22 +- deps/v8/src/profiler/cpu-profiler.cc | 36 +- deps/v8/src/profiler/cpu-profiler.h | 16 +- deps/v8/src/profiler/heap-profiler.cc | 12 +- deps/v8/src/profiler/heap-profiler.h | 4 +- .../src/profiler/heap-snapshot-generator.cc | 128 +- .../v8/src/profiler/heap-snapshot-generator.h | 14 + deps/v8/src/profiler/profile-generator.cc | 86 +- deps/v8/src/profiler/profile-generator.h | 41 +- deps/v8/src/profiler/profiler-listener.cc | 7 - deps/v8/src/profiler/profiler-listener.h | 1 - deps/v8/src/profiler/profiler-stats.cc | 55 + deps/v8/src/profiler/profiler-stats.h | 49 + deps/v8/src/profiler/tick-sample.cc | 69 +- deps/v8/src/profiler/tick-sample.h | 5 +- .../experimental/experimental-bytecode.cc | 107 + .../experimental/experimental-bytecode.h | 210 + .../experimental/experimental-compiler.cc | 616 +++ .../experimental/experimental-compiler.h | 34 + .../experimental/experimental-interpreter.cc | 454 ++ .../experimental/experimental-interpreter.h | 38 + .../src/regexp/experimental/experimental.cc | 213 +- .../v8/src/regexp/experimental/experimental.h | 19 +- deps/v8/src/regexp/ppc/OWNERS | 6 +- deps/v8/src/regexp/regexp-ast.h | 9 +- deps/v8/src/regexp/regexp-compiler-tonode.cc | 47 +- deps/v8/src/regexp/regexp.cc | 146 +- deps/v8/src/regexp/regexp.h | 25 +- deps/v8/src/runtime/runtime-bigint.cc | 13 +- deps/v8/src/runtime/runtime-compiler.cc | 30 +- deps/v8/src/runtime/runtime-interpreter.cc | 2 +- deps/v8/src/runtime/runtime-object.cc | 58 +- deps/v8/src/runtime/runtime-regexp.cc | 19 +- deps/v8/src/runtime/runtime-scopes.cc | 8 +- deps/v8/src/runtime/runtime-test.cc | 29 +- deps/v8/src/runtime/runtime-wasm.cc | 36 +- deps/v8/src/runtime/runtime.h | 16 +- deps/v8/src/snapshot/OWNERS | 2 +- deps/v8/src/snapshot/code-serializer.cc | 10 +- deps/v8/src/snapshot/context-deserializer.cc | 11 +- deps/v8/src/snapshot/context-serializer.cc | 6 +- deps/v8/src/snapshot/context-serializer.h | 2 +- .../v8/src/snapshot/deserializer-allocator.cc | 32 +- deps/v8/src/snapshot/deserializer-allocator.h | 21 +- deps/v8/src/snapshot/deserializer.cc | 751 ++- deps/v8/src/snapshot/deserializer.h | 60 +- .../snapshot/embedded/embedded-file-writer.cc | 48 +- .../snapshot/embedded/embedded-file-writer.h | 15 + .../platform-embedded-file-writer-aix.cc | 12 +- .../platform-embedded-file-writer-aix.h | 4 +- .../platform-embedded-file-writer-base.h | 3 + .../platform-embedded-file-writer-generic.cc | 7 + .../platform-embedded-file-writer-generic.h | 4 +- .../platform-embedded-file-writer-mac.cc | 4 + .../platform-embedded-file-writer-mac.h | 4 +- .../platform-embedded-file-writer-win.cc | 6 +- .../platform-embedded-file-writer-win.h | 2 +- deps/v8/src/snapshot/object-deserializer.cc | 4 +- .../v8/src/snapshot/read-only-deserializer.cc | 2 +- deps/v8/src/snapshot/read-only-serializer.cc | 9 +- deps/v8/src/snapshot/references.h | 3 +- .../src/snapshot/serializer-deserializer.cc | 15 +- .../v8/src/snapshot/serializer-deserializer.h | 163 +- deps/v8/src/snapshot/serializer.cc | 240 +- deps/v8/src/snapshot/serializer.h | 45 +- deps/v8/src/snapshot/snapshot-data.cc | 2 +- deps/v8/src/snapshot/snapshot-source-sink.cc | 9 +- deps/v8/src/snapshot/snapshot-source-sink.h | 13 +- deps/v8/src/snapshot/snapshot.cc | 15 +- deps/v8/src/snapshot/snapshot.h | 4 +- deps/v8/src/snapshot/startup-deserializer.cc | 2 +- deps/v8/src/snapshot/startup-serializer.cc | 4 +- deps/v8/src/snapshot/startup-serializer.h | 2 +- deps/v8/src/strings/char-predicates-inl.h | 10 +- deps/v8/src/strings/char-predicates.h | 1 - deps/v8/src/strings/string-builder-inl.h | 4 +- deps/v8/src/strings/string-search.h | 9 + .../torque/class-debug-reader-generator.cc | 2 +- deps/v8/src/torque/implementation-visitor.cc | 71 +- deps/v8/src/torque/instance-type-generator.cc | 2 +- deps/v8/src/torque/torque-parser.cc | 13 +- deps/v8/src/torque/types.cc | 5 +- deps/v8/src/utils/identity-map.cc | 15 +- deps/v8/src/utils/identity-map.h | 3 + deps/v8/src/utils/utils.h | 4 + .../wasm/baseline/arm/liftoff-assembler-arm.h | 223 +- .../baseline/arm64/liftoff-assembler-arm64.h | 158 +- .../baseline/ia32/liftoff-assembler-ia32.h | 197 +- .../v8/src/wasm/baseline/liftoff-assembler.cc | 53 +- deps/v8/src/wasm/baseline/liftoff-assembler.h | 31 +- deps/v8/src/wasm/baseline/liftoff-compiler.cc | 366 +- deps/v8/src/wasm/baseline/liftoff-compiler.h | 3 +- deps/v8/src/wasm/baseline/liftoff-register.h | 3 + .../baseline/mips/liftoff-assembler-mips.h | 89 +- .../mips64/liftoff-assembler-mips64.h | 202 +- deps/v8/src/wasm/baseline/ppc/OWNERS | 6 +- .../wasm/baseline/ppc/liftoff-assembler-ppc.h | 91 +- .../baseline/s390/liftoff-assembler-s390.h | 91 +- .../wasm/baseline/x64/liftoff-assembler-x64.h | 136 +- deps/v8/src/wasm/c-api.cc | 17 +- deps/v8/src/wasm/code-space-access.h | 69 + deps/v8/src/wasm/compilation-environment.h | 29 +- deps/v8/src/wasm/decoder.h | 7 + deps/v8/src/wasm/function-body-decoder-impl.h | 272 +- deps/v8/src/wasm/function-body-decoder.cc | 2 +- deps/v8/src/wasm/function-compiler.cc | 35 +- deps/v8/src/wasm/function-compiler.h | 4 +- deps/v8/src/wasm/graph-builder-interface.cc | 3 +- deps/v8/src/wasm/module-compiler.cc | 594 ++- deps/v8/src/wasm/module-compiler.h | 7 +- deps/v8/src/wasm/module-decoder.cc | 309 +- deps/v8/src/wasm/module-instantiate.cc | 125 +- deps/v8/src/wasm/struct-types.h | 17 +- deps/v8/src/wasm/value-type.h | 115 +- deps/v8/src/wasm/wasm-code-manager.cc | 101 +- deps/v8/src/wasm/wasm-code-manager.h | 17 + deps/v8/src/wasm/wasm-constants.h | 49 +- deps/v8/src/wasm/wasm-debug-evaluate.cc | 4 +- deps/v8/src/wasm/wasm-debug.cc | 115 +- deps/v8/src/wasm/wasm-engine.cc | 35 +- deps/v8/src/wasm/wasm-feature-flags.h | 29 +- deps/v8/src/wasm/wasm-js.cc | 26 +- deps/v8/src/wasm/wasm-limits.h | 13 +- deps/v8/src/wasm/wasm-module-builder.cc | 9 +- deps/v8/src/wasm/wasm-module.cc | 17 +- deps/v8/src/wasm/wasm-module.h | 71 +- deps/v8/src/wasm/wasm-objects-inl.h | 7 +- deps/v8/src/wasm/wasm-objects.cc | 304 +- deps/v8/src/wasm/wasm-objects.h | 48 +- deps/v8/src/wasm/wasm-objects.tq | 22 +- deps/v8/src/wasm/wasm-opcodes-inl.h | 26 +- deps/v8/src/wasm/wasm-opcodes.cc | 29 +- deps/v8/src/wasm/wasm-opcodes.h | 62 +- deps/v8/src/wasm/wasm-serialization.cc | 2 + deps/v8/src/wasm/wasm-subtyping.cc | 362 +- deps/v8/src/wasm/wasm-subtyping.h | 59 +- deps/v8/src/wasm/wasm-value.h | 8 + deps/v8/src/zone/accounting-allocator.cc | 1 - deps/v8/src/zone/zone.h | 3 +- deps/v8/test/benchmarks/benchmarks.status | 12 + deps/v8/test/cctest/BUILD.gn | 10 +- deps/v8/test/cctest/OWNERS | 2 + deps/v8/test/cctest/cctest.cc | 40 +- deps/v8/test/cctest/cctest.h | 12 +- deps/v8/test/cctest/cctest.status | 48 +- .../test/cctest/compiler/serializer-tester.cc | 5 + .../test-js-context-specialization.cc | 2 +- .../cctest/compiler/test-js-typed-lowering.cc | 4 +- .../compiler/test-machine-operator-reducer.cc | 3 +- .../test-run-calls-to-external-references.cc | 560 ++ deps/v8/test/cctest/heap/heap-tester.h | 4 +- deps/v8/test/cctest/heap/heap-utils.cc | 43 +- deps/v8/test/cctest/heap/heap-utils.h | 10 +- deps/v8/test/cctest/heap/test-alloc.cc | 4 + .../cctest/heap/test-concurrent-allocation.cc | 142 + .../test/cctest/heap/test-embedder-tracing.cc | 12 +- deps/v8/test/cctest/heap/test-heap.cc | 187 +- .../cctest/heap/test-incremental-marking.cc | 1 + .../cctest/heap/test-invalidated-slots.cc | 4 + deps/v8/test/cctest/heap/test-mark-compact.cc | 41 + .../test/cctest/heap/test-page-promotion.cc | 2 +- deps/v8/test/cctest/heap/test-spaces.cc | 15 +- deps/v8/test/cctest/heap/test-unmapper.cc | 1 + .../ArrayLiterals.golden | 6 +- .../CallAndSpread.golden | 2 +- .../DestructuringAssignment.golden | 8 +- .../bytecode_expectations/NewAndSpread.golden | 2 +- .../PrivateAccessorAccess.golden | 8 +- .../PrivateMethodAccess.golden | 4 +- .../StaticPrivateMethodAccess.golden | 20 +- .../SuperCallAndSpread.golden | 2 +- .../WideRegisters.golden | 28 +- .../test/cctest/libplatform/test-tracing.cc | 7 +- deps/v8/test/cctest/test-api-interceptors.cc | 12 +- deps/v8/test/cctest/test-api-stack-traces.cc | 10 +- deps/v8/test/cctest/test-api.cc | 246 +- deps/v8/test/cctest/test-assembler-arm64.cc | 4 +- deps/v8/test/cctest/test-assembler-x64.cc | 2 +- .../test/cctest/test-code-stub-assembler.cc | 28 +- deps/v8/test/cctest/test-compiler.cc | 3 +- .../test-concurrent-descriptor-array.cc | 4 +- .../test/cctest/test-concurrent-prototype.cc | 6 +- deps/v8/test/cctest/test-cpu-profiler.cc | 327 +- deps/v8/test/cctest/test-debug-helper.cc | 42 +- deps/v8/test/cctest/test-debug.cc | 113 +- deps/v8/test/cctest/test-descriptor-array.cc | 424 ++ deps/v8/test/cctest/test-dictionary.cc | 2 + deps/v8/test/cctest/test-disasm-ia32.cc | 2 + .../test/cctest/test-field-type-tracking.cc | 67 +- deps/v8/test/cctest/test-heap-profiler.cc | 62 +- deps/v8/test/cctest/test-icache.cc | 5 + deps/v8/test/cctest/test-local-handles.cc | 6 +- deps/v8/test/cctest/test-log.cc | 51 +- .../v8/test/cctest/test-persistent-handles.cc | 4 +- deps/v8/test/cctest/test-platform.cc | 2 +- deps/v8/test/cctest/test-profile-generator.cc | 4 +- deps/v8/test/cctest/test-regexp.cc | 27 +- deps/v8/test/cctest/test-sampler-api.cc | 2 +- deps/v8/test/cctest/test-serialize.cc | 91 +- deps/v8/test/cctest/test-strings.cc | 1 + deps/v8/test/cctest/test-transitions.h | 2 + .../test/cctest/test-unwinder-code-pages.cc | 110 +- deps/v8/test/cctest/test-unwinder.cc | 634 --- deps/v8/test/cctest/test-weakmaps.cc | 2 + deps/v8/test/cctest/test-weaksets.cc | 2 + deps/v8/test/cctest/torque/test-torque.cc | 8 +- deps/v8/test/cctest/wasm/test-c-wasm-entry.cc | 3 +- deps/v8/test/cctest/wasm/test-gc.cc | 102 +- .../cctest/wasm/test-jump-table-assembler.cc | 33 +- .../cctest/wasm/test-run-wasm-interpreter.cc | 20 +- .../test/cctest/wasm/test-run-wasm-module.cc | 8 +- .../cctest/wasm/test-run-wasm-simd-liftoff.cc | 14 +- .../test-run-wasm-simd-scalar-lowering.cc | 231 + .../v8/test/cctest/wasm/test-run-wasm-simd.cc | 184 +- deps/v8/test/cctest/wasm/test-run-wasm.cc | 28 +- .../cctest/wasm/test-streaming-compilation.cc | 525 +- .../test/cctest/wasm/test-wasm-breakpoints.cc | 7 + deps/v8/test/cctest/wasm/test-wasm-metrics.cc | 330 ++ .../cctest/wasm/test-wasm-shared-engine.cc | 4 +- deps/v8/test/cctest/wasm/wasm-run-utils.cc | 7 +- deps/v8/test/common/wasm/test-signatures.h | 8 + deps/v8/test/common/wasm/wasm-interpreter.cc | 34 +- deps/v8/test/common/wasm/wasm-macro-gen.h | 104 +- .../v8/test/common/wasm/wasm-module-runner.cc | 46 +- deps/v8/test/common/wasm/wasm-module-runner.h | 14 +- deps/v8/test/debugger/debugger.status | 4 +- deps/v8/test/fuzzer/fuzzer-support.cc | 8 +- deps/v8/test/fuzzer/wasm-async.cc | 8 + deps/v8/test/fuzzer/wasm-compile.cc | 61 +- deps/v8/test/fuzzer/wasm-fuzzer-common.cc | 29 +- deps/v8/test/fuzzer/wasm.cc | 2 - deps/v8/test/fuzzer/wasm/regress-1127717.wasm | Bin 0 -> 128 bytes deps/v8/test/fuzzilli/libreprl.c | 527 +- deps/v8/test/fuzzilli/libreprl.h | 123 +- deps/v8/test/fuzzilli/main.cc | 62 +- deps/v8/test/inspector/BUILD.gn | 1 + .../counters/collection-expected.txt | 2 + deps/v8/test/inspector/counters/collection.js | 83 + .../counters/enable-disable-expected.txt | 6 + .../test/inspector/counters/enable-disable.js | 51 + ...sm-get-breakable-locations-byte-offsets.js | 2 +- .../debugger/wasm-scope-info-expected.txt | 190 +- .../wasm-scope-info-liftoff-expected.txt | 54 +- .../debugger/wasm-scope-info-liftoff.js | 20 +- .../inspector/debugger/wasm-scope-info.js | 75 +- ...oint-breaks-on-first-breakable-location.js | 2 +- .../debugger/wasm-step-after-trap.js | 5 +- .../debugger/wasm-stepping-liftoff.js | 2 +- .../heap-profiler/console-retaining-path.js | 2 +- deps/v8/test/inspector/inspector-test.cc | 75 +- deps/v8/test/inspector/inspector.status | 12 + .../runtime-call-stats/collection.js | 2 +- .../enable-disable-expected.txt | 9 +- .../runtime-call-stats/enable-disable.js | 68 +- ...evaluate-repl-mode-code-cache-expected.txt | 24 + .../runtime/evaluate-repl-mode-code-cache.js | 23 + deps/v8/test/intl/intl.status | 5 +- deps/v8/test/intl/regress-10438.js | 4 +- deps/v8/test/intl/regress-10613.js | 5 +- deps/v8/test/intl/regress-10836.js | 45 + deps/v8/test/intl/regress-1121156.js | 11 + deps/v8/test/intl/regress-1130489.js | 30 + deps/v8/test/intl/regress-1132641.js | 8 + deps/v8/test/intl/regress-9084.js | 10 + deps/v8/test/js-perf-test/SuperIC.json | 364 ++ .../SuperIC/megamorphic-mixin-getter.js | 43 + .../js-perf-test/SuperIC/megamorphic-mixin.js | 40 + .../SuperIC/monomorphic-getter.js | 35 + .../monomorphic-mega-receivers-getter.js | 57 + .../SuperIC/monomorphic-mega-receivers.js | 55 + .../test/js-perf-test/SuperIC/monomorphic.js | 32 + .../SuperIC/polymorphic-mixin-getter.js | 44 + ...polymorphic-mixin-mega-receivers-getter.js | 63 + .../polymorphic-mixin-mega-receivers.js | 59 + .../js-perf-test/SuperIC/polymorphic-mixin.js | 41 + deps/v8/test/js-perf-test/SuperIC/run.js | 24 + .../fail/assert-in-promise-fail-recursive.out | 1 - .../test/message/wasm-trace-memory-liftoff.js | 2 +- deps/v8/test/message/wasm-trace-memory.js | 2 +- deps/v8/test/mjsunit/BUILD.gn | 24 +- deps/v8/test/mjsunit/asm/regress-1069173.js | 18 + .../call-lhs-web-compat-early-errors.js | 69 + .../test/mjsunit/check-bounds-array-index.js | 1 + .../check-bounds-string-from-char-code-at.js | 1 + .../mjsunit/compiler/consecutive-addition.js | 30 + ...ative-context-specialization-hole-check.js | 2 +- .../test/mjsunit/compiler/regress-1126771.js | 45 + .../test/mjsunit/compiler/regress-1127405.js | 18 + .../compiler/serializer-dead-after-jump.js | 1 + .../compiler/serializer-dead-after-return.js | 1 + deps/v8/test/mjsunit/constant-folding-2.js | 1 + .../mjsunit/destruct-array-spread-done.js | 26 + .../mjsunit/ensure-growing-store-learns.js | 9 +- deps/v8/test/mjsunit/es6/object-assign.js | 17 + deps/v8/test/mjsunit/es6/super-ic.js | 456 ++ .../es6/unicode-regexp-ignore-case-noi18n.js | 26 +- deps/v8/test/mjsunit/es8/object-values.js | 6 + .../modules-import-15-top-level-await.mjs | 2 +- .../mjsunit/harmony/modules-import-15.mjs | 2 +- deps/v8/test/mjsunit/harmony/to-string.js | 52 +- .../harmony/typedarray-set-length-detach.js | 19 + .../test/mjsunit/math-floor-of-div-nosudiv.js | 1 + deps/v8/test/mjsunit/math-floor-of-div.js | 2 +- deps/v8/test/mjsunit/mjsunit.status | 93 +- .../mjsunit/parallel-optimize-disabled.js | 54 - .../test/mjsunit/random-bit-correlations.js | 6 +- .../v8/test/mjsunit/regexp-backtrack-limit.js | 2 +- deps/v8/test/mjsunit/regexp-experimental.js | 98 + .../test/mjsunit/regexp-tier-up-multiple.js | 1 + deps/v8/test/mjsunit/regexp-tier-up.js | 1 + deps/v8/test/mjsunit/regress-1120905.js | 30 + .../test/mjsunit/regress/regress-1034449.js | 1 + deps/v8/test/mjsunit/regress/regress-10802.js | 12 + .../test/mjsunit/regress/regress-1112155.js | 32 + .../test/mjsunit/regress/regress-1123379.js | 16 + .../test/mjsunit/regress/regress-1125871.js | 25 + .../test/mjsunit/regress/regress-1132111.js | 23 - .../test/mjsunit/regress/regress-1143772.js | 71 + deps/v8/test/mjsunit/regress/regress-1156.js | 49 - .../v8/test/mjsunit/regress/regress-356053.js | 2 +- .../v8/test/mjsunit/regress/regress-411210.js | 2 +- .../v8/test/mjsunit/regress/regress-487981.js | 2 +- deps/v8/test/mjsunit/regress/regress-6288.js | 4 +- .../v8/test/mjsunit/regress/regress-740694.js | 2 +- deps/v8/test/mjsunit/regress/regress-8265.js | 2 - .../v8/test/mjsunit/regress/regress-863810.js | 2 +- .../v8/test/mjsunit/regress/regress-883059.js | 2 +- deps/v8/test/mjsunit/regress/regress-9832.js | 2 +- .../mjsunit/regress/regress-crbug-1027025.js | 2 +- .../mjsunit/regress/regress-crbug-1137586.js | 16 + .../mjsunit/regress/regress-crbug-664506.js | 2 +- .../mjsunit/regress/regress-crbug-882233-2.js | 2 + .../test/mjsunit/regress/regress-v8-9656.js | 3 +- .../mjsunit/regress/wasm/regress-02256.js | 2 +- .../mjsunit/regress/wasm/regress-02256b.js | 5 +- .../mjsunit/regress/wasm/regress-02862.js | 2 +- .../mjsunit/regress/wasm/regress-1014798.js | 6 +- .../mjsunit/regress/wasm/regress-1026680.js | 2 +- .../mjsunit/regress/wasm/regress-1027410.js | 2 +- .../mjsunit/regress/wasm/regress-1054466.js | 2 +- .../mjsunit/regress/wasm/regress-1070078.js | 8 +- .../mjsunit/regress/wasm/regress-1074586.js | 2 +- .../mjsunit/regress/wasm/regress-1075953.js | 2 +- .../mjsunit/regress/wasm/regress-1079449.js | 8 +- .../mjsunit/regress/wasm/regress-10831.js | 47 + .../mjsunit/regress/wasm/regress-10898.js | 44 + .../mjsunit/regress/wasm/regress-1116019.js | 2 +- .../mjsunit/regress/wasm/regress-1125951.js | 20 + .../mjsunit/regress/wasm/regress-1137608.js | 46 + .../mjsunit/regress/wasm/regress-1140549.js | 25 + .../mjsunit/regress/wasm/regress-1146861.js | 56 + .../mjsunit/regress/wasm/regress-666741.js | 2 +- .../test/mjsunit/regress/wasm/regress-7508.js | 2 +- .../test/mjsunit/regress/wasm/regress-7565.js | 2 +- .../test/mjsunit/regress/wasm/regress-7579.js | 2 +- .../mjsunit/regress/wasm/regress-763697.js | 2 +- .../test/mjsunit/regress/wasm/regress-7785.js | 4 +- .../mjsunit/regress/wasm/regress-808848.js | 2 +- .../mjsunit/regress/wasm/regress-819869.js | 2 +- .../mjsunit/regress/wasm/regress-854050.js | 2 +- .../mjsunit/regress/wasm/regress-864509.js | 2 +- .../test/mjsunit/regress/wasm/regress-9017.js | 2 +- .../mjsunit/regress/wasm/regress-905815.js | 2 +- .../mjsunit/regress/wasm/regress-910824.js | 2 +- .../mjsunit/regress/wasm/regress-917588.js | 2 +- .../mjsunit/regress/wasm/regress-918284.js | 2 +- .../mjsunit/regress/wasm/regress-918917.js | 2 +- .../mjsunit/regress/wasm/regress-919308.js | 2 +- .../mjsunit/regress/wasm/regress-922432.js | 2 +- .../mjsunit/regress/wasm/regress-922670.js | 2 +- .../mjsunit/regress/wasm/regress-922933.js | 2 +- .../sloppy-arguments-property-access.js | 67 + deps/v8/test/mjsunit/string-case.js | 3 +- .../mjsunit/tools/{codemap.js => codemap.mjs} | 4 +- .../tools/{consarray.js => consarray.mjs} | 4 +- .../tools/{csvparser.js => csvparser.mjs} | 3 +- .../mjsunit/tools/{dumpcpp.js => dumpcpp.mjs} | 9 +- deps/v8/test/mjsunit/tools/foozzie.js | 5 + deps/v8/test/mjsunit/tools/log.js | 25 + deps/v8/test/mjsunit/tools/log_two_byte.js | 39 + .../mjsunit/tools/{profile.js => profile.mjs} | 4 +- .../{profile_view.js => profile_view.mjs} | 4 +- .../test/mjsunit/tools/profviz-test.default | 1566 ------ deps/v8/test/mjsunit/tools/profviz-test.log | 2613 --------- deps/v8/test/mjsunit/tools/profviz.js | 84 - .../tools/{splaytree.js => splaytree.mjs} | 3 +- .../{tickprocessor.js => tickprocessor.mjs} | 9 +- deps/v8/test/mjsunit/tools/timeline.mjs | 31 + deps/v8/test/mjsunit/wasm/anyfunc.js | 4 +- deps/v8/test/mjsunit/wasm/atomics.js | 2 +- deps/v8/test/mjsunit/wasm/call-ref.js | 98 +- .../mjsunit/wasm/compare-exchange-stress.js | 8 +- .../mjsunit/wasm/compare-exchange64-stress.js | 4 +- deps/v8/test/mjsunit/wasm/errors.js | 3 +- .../test/mjsunit/wasm/exceptions-externref.js | 2 +- .../test/mjsunit/wasm/exceptions-rethrow.js | 6 +- deps/v8/test/mjsunit/wasm/exceptions-simd.js | 4 +- deps/v8/test/mjsunit/wasm/exceptions.js | 8 +- .../mjsunit/wasm/externref-globals-liftoff.js | 8 + .../v8/test/mjsunit/wasm/externref-globals.js | 22 + .../v8/test/mjsunit/wasm/externref-liftoff.js | 8 + deps/v8/test/mjsunit/wasm/externref.js | 4 +- deps/v8/test/mjsunit/wasm/futex.js | 2 +- deps/v8/test/mjsunit/wasm/generic-wrapper.js | 651 ++- .../test/mjsunit/wasm/liftoff-simd-params.js | 2 +- deps/v8/test/mjsunit/wasm/multi-value-simd.js | 2 +- .../v8/test/mjsunit/wasm/reference-globals.js | 105 + deps/v8/test/mjsunit/wasm/reference-tables.js | 91 + deps/v8/test/mjsunit/wasm/simd-errors.js | 2 +- deps/v8/test/mjsunit/wasm/simd-globals.js | 14 +- .../mjsunit/wasm/test-wasm-module-builder.js | 11 +- .../test/mjsunit/wasm/tier-up-testing-flag.js | 2 +- .../test/mjsunit/wasm/wasm-dynamic-tiering.js | 2 +- .../test/mjsunit/wasm/wasm-module-builder.js | 171 +- deps/v8/test/test262/test262.status | 133 +- deps/v8/test/unittests/BUILD.gn | 45 +- .../v8/test/unittests/api/isolate-unittest.cc | 2 +- .../compiler/branch-elimination-unittest.cc | 3 +- .../constant-folding-reducer-unittest.cc | 3 +- .../compiler/graph-reducer-unittest.cc | 22 +- .../compiler/js-call-reducer-unittest.cc | 4 +- .../compiler/js-create-lowering-unittest.cc | 3 +- .../js-intrinsic-lowering-unittest.cc | 3 +- .../compiler/js-typed-lowering-unittest.cc | 3 +- .../machine-operator-reducer-unittest.cc | 13 +- deps/v8/test/unittests/compiler/ppc/OWNERS | 6 +- .../compiler/regalloc/live-range-unittest.cc | 191 - .../regalloc/register-allocator-unittest.cc | 56 - .../simplified-operator-reducer-unittest.cc | 62 +- .../compiler/typed-optimization-unittest.cc | 3 +- .../unittests/heap/base/run-all-unittests.cc | 17 + .../unittests/heap/base/worklist-unittest.cc | 311 ++ .../heap/cppgc/concurrent-marking-unittest.cc | 159 + .../heap/cppgc/concurrent-sweeper-unittest.cc | 2 +- .../heap/cppgc/gc-invoker-unittest.cc | 43 +- .../heap/cppgc/heap-growing-unittest.cc | 39 +- .../incremental-marking-schedule-unittest.cc | 95 + .../unittests/heap/cppgc/marker-unittest.cc | 173 +- .../heap/cppgc/marking-verifier-unittest.cc | 22 + .../heap/cppgc/marking-visitor-unittest.cc | 4 +- .../unittests/heap/cppgc/member-unittest.cc | 35 + .../unittests/heap/cppgc/sweeper-unittest.cc | 2 +- .../unittests/heap/cppgc/test-platform.cc | 85 +- .../test/unittests/heap/cppgc/test-platform.h | 66 +- .../unittests/heap/cppgc/worklist-unittest.cc | 346 -- .../heap/cppgc/write-barrier-unittest.cc | 54 +- deps/v8/test/unittests/heap/heap-unittest.cc | 2 + .../heap/index-generator-unittest.cc | 50 + .../heap/object-start-bitmap-unittest.cc | 174 + .../test/unittests/heap/safepoint-unittest.cc | 14 +- .../bytecode-array-builder-unittest.cc | 1 + .../bytecode-array-writer-unittest.cc | 8 +- .../libplatform/default-job-unittest.cc | 76 +- deps/v8/test/unittests/unittests.status | 21 + .../wasm/control-transfer-unittest.cc | 106 +- .../wasm/function-body-decoder-unittest.cc | 205 +- .../wasm/loop-assignment-analysis-unittest.cc | 8 +- .../wasm/module-decoder-memory64-unittest.cc | 80 + .../unittests/wasm/module-decoder-unittest.cc | 877 ++-- .../test/unittests/wasm/subtyping-unittest.cc | 157 +- deps/v8/test/wasm-js/testcfg.py | 5 + deps/v8/test/wasm-js/tests.tar.gz.sha1 | 2 +- deps/v8/test/wasm-js/wasm-js.status | 4 +- deps/v8/test/wasm-spec-tests/testcfg.py | 5 + .../v8/test/wasm-spec-tests/tests.tar.gz.sha1 | 2 +- .../wasm-spec-tests/wasm-spec-tests.status | 22 + deps/v8/third_party/jinja2/OWNERS | 2 +- deps/v8/third_party/v8/builtins/array-sort.tq | 2 +- deps/v8/third_party/zlib/BUILD.gn | 26 +- deps/v8/third_party/zlib/DEPS | 3 - deps/v8/third_party/zlib/deflate.c | 40 +- .../zlib/patches/0006-fix-check_match.patch | 42 + deps/v8/tools/android-sync.sh | 1 - deps/v8/tools/arguments.mjs | 78 + deps/v8/tools/clusterfuzz/v8_mock.js | 7 + deps/v8/tools/codemap.mjs | 321 ++ deps/v8/tools/consarray.mjs | 92 + deps/v8/tools/csvparser.mjs | 105 + deps/v8/tools/debug_helper/BUILD.gn | 11 +- deps/v8/tools/debug_helper/OWNERS | 1 + .../debug_helper/debug-helper-internal.cc | 2 +- .../debug_helper/debug-helper-internal.h | 31 + deps/v8/tools/debug_helper/debug-helper.h | 26 +- .../debug_helper/get-object-properties.cc | 79 +- .../tools/debug_helper/list-object-classes.cc | 2 +- deps/v8/tools/dump-cpp.py | 6 +- .../{dumpcpp-driver.js => dumpcpp-driver.mjs} | 6 + deps/v8/tools/{dumpcpp.js => dumpcpp.mjs} | 11 +- deps/v8/tools/gcmole/gcmole-tools.tar.gz.sha1 | 2 +- deps/v8/tools/gcmole/gcmole.cc | 18 +- deps/v8/tools/gcmole/run-gcmole.py | 2 +- deps/v8/tools/gen-postmortem-metadata.py | 3 - deps/v8/tools/ic-explorer.html | 11 +- deps/v8/tools/ic-processor | 8 +- ...ssor-driver.js => ic-processor-driver.mjs} | 3 + .../{ic-processor.js => ic-processor.mjs} | 10 +- deps/v8/tools/linux-tick-processor | 7 +- deps/v8/tools/logreader.mjs | 248 + deps/v8/tools/map-processor | 8 +- ...sor-driver.js => map-processor-driver.mjs} | 5 + deps/v8/tools/map-processor.html | 11 +- .../{map-processor.js => map-processor.mjs} | 21 +- deps/v8/tools/parse-processor | 7 +- ...r-driver.js => parse-processor-driver.mjs} | 5 + deps/v8/tools/parse-processor.html | 28 +- ...parse-processor.js => parse-processor.mjs} | 12 +- deps/v8/tools/plot-timer-events | 93 - deps/v8/tools/profile.js | 321 +- deps/v8/tools/profile.mjs | 1175 +++++ deps/v8/tools/profile_view.mjs | 202 + deps/v8/tools/profviz/composer.js | 557 -- .../tools/profviz/gnuplot-4.6.3-emscripten.js | 4658 ----------------- deps/v8/tools/profviz/profviz.css | 138 - deps/v8/tools/profviz/profviz.html | 158 - deps/v8/tools/profviz/profviz.js | 286 - deps/v8/tools/profviz/stdio.js | 56 - deps/v8/tools/profviz/worker.js | 171 - deps/v8/tools/sourcemap.mjs | 382 ++ deps/v8/tools/splaytree.mjs | 327 ++ deps/v8/tools/system-analyzer/app-model.mjs | 7 + deps/v8/tools/system-analyzer/events.mjs | 15 +- deps/v8/tools/system-analyzer/helper.mjs | 28 +- deps/v8/tools/system-analyzer/ic-model.mjs | 8 +- .../system-analyzer/ic-panel-template.html | 109 +- deps/v8/tools/system-analyzer/ic-panel.mjs | 62 +- .../v8/tools/system-analyzer/ic-processor.mjs | 282 - deps/v8/tools/system-analyzer/index.css | 16 + deps/v8/tools/system-analyzer/index.html | 75 +- deps/v8/tools/system-analyzer/index.mjs | 100 +- .../log-file-reader-template.html | 42 +- .../tools/system-analyzer/log-file-reader.mjs | 127 +- deps/v8/tools/system-analyzer/log/ic.mjs | 60 + .../{event.mjs => log/log.mjs} | 7 +- deps/v8/tools/system-analyzer/log/map.mjs | 296 ++ .../system-analyzer/map-panel-template.html | 9 +- deps/v8/tools/system-analyzer/map-panel.mjs | 7 +- .../map-panel/map-details-template.html | 4 +- .../system-analyzer/map-panel/map-details.mjs | 19 +- .../map-panel/map-transitions.mjs | 4 +- .../tools/system-analyzer/map-processor.mjs | 538 -- deps/v8/tools/system-analyzer/processor.mjs | 347 ++ .../source-panel-template.html | 52 + .../v8/tools/system-analyzer/source-panel.mjs | 189 + .../system-analyzer/stats-panel-template.html | 6 +- deps/v8/tools/system-analyzer/stats-panel.mjs | 5 +- .../timeline-panel-template.html | 72 +- .../tools/system-analyzer/timeline-panel.mjs | 141 +- deps/v8/tools/system-analyzer/timeline.mjs | 45 +- .../timeline/timeline-track-template.html | 57 +- .../timeline/timeline-track.mjs | 253 +- deps/v8/tools/testrunner/base_runner.py | 19 +- .../v8/tools/testrunner/local/junit_output.py | 49 - deps/v8/tools/testrunner/local/statusfile.py | 1 + deps/v8/tools/testrunner/local/variants.py | 58 +- deps/v8/tools/testrunner/num_fuzzer.py | 4 + deps/v8/tools/testrunner/objects/testcase.py | 68 +- deps/v8/tools/testrunner/standard_runner.py | 16 - .../tools/testrunner/testproc/expectation.py | 9 +- deps/v8/tools/testrunner/testproc/progress.py | 44 +- deps/v8/tools/tick-processor.html | 32 +- deps/v8/tools/tickprocessor-driver.mjs | 88 + deps/v8/tools/tickprocessor.mjs | 983 ++++ deps/v8/tools/trace-maps-processor.py | 175 - deps/v8/tools/unittests/run_tests_test.py | 24 +- .../testdata/testroot1/v8_build_config.json | 1 + .../testdata/testroot2/v8_build_config.json | 1 + deps/v8/tools/v8heapconst.py | 312 +- deps/v8/tools/v8windbg/OWNERS | 1 + deps/v8/tools/v8windbg/src/local-variables.cc | 12 + .../tools/v8windbg/src/object-inspection.cc | 51 +- .../v8/tools/v8windbg/src/object-inspection.h | 4 + .../v8windbg/src/v8-debug-helper-interop.cc | 59 +- .../v8windbg/src/v8-debug-helper-interop.h | 3 + deps/v8/tools/wasm/update-wasm-spec-tests.sh | 7 +- deps/v8/tools/whitespace.txt | 2 +- deps/v8/tools/windows-tick-processor.bat | 2 +- deps/v8/tools/zone-stats/details-selection.js | 12 +- deps/v8/tools/zone-stats/global-timeline.js | 3 +- 1095 files changed, 40668 insertions(+), 27830 deletions(-) delete mode 100644 deps/v8/LICENSE.valgrind create mode 100644 deps/v8/include/cppgc/OWNERS create mode 100644 deps/v8/src/base/platform/platform-starboard.cc create mode 100644 deps/v8/src/builtins/arraybuffer.tq delete mode 100644 deps/v8/src/builtins/builtins-call.cc delete mode 100644 deps/v8/src/builtins/builtins-object-gen.h delete mode 100644 deps/v8/src/compiler/backend/live-range-separator.cc delete mode 100644 deps/v8/src/compiler/backend/live-range-separator.h create mode 100644 deps/v8/src/deoptimizer/deoptimizer-cfi-builtins.cc create mode 100644 deps/v8/src/deoptimizer/deoptimizer-cfi-empty.cc create mode 100644 deps/v8/src/heap/base/worklist.cc create mode 100644 deps/v8/src/heap/base/worklist.h create mode 100644 deps/v8/src/heap/conservative-stack-visitor.cc create mode 100644 deps/v8/src/heap/conservative-stack-visitor.h create mode 100644 deps/v8/src/heap/cppgc/default-job.h create mode 100644 deps/v8/src/heap/cppgc/incremental-marking-schedule.cc create mode 100644 deps/v8/src/heap/cppgc/incremental-marking-schedule.h create mode 100644 deps/v8/src/heap/cppgc/marking-state.cc delete mode 100644 deps/v8/src/heap/cppgc/worklist.h create mode 100644 deps/v8/src/heap/index-generator.cc create mode 100644 deps/v8/src/heap/index-generator.h create mode 100644 deps/v8/src/heap/object-start-bitmap.h create mode 100644 deps/v8/src/objects/js-function-inl.h create mode 100644 deps/v8/src/profiler/profiler-stats.cc create mode 100644 deps/v8/src/profiler/profiler-stats.h create mode 100644 deps/v8/src/regexp/experimental/experimental-bytecode.cc create mode 100644 deps/v8/src/regexp/experimental/experimental-bytecode.h create mode 100644 deps/v8/src/regexp/experimental/experimental-compiler.cc create mode 100644 deps/v8/src/regexp/experimental/experimental-compiler.h create mode 100644 deps/v8/src/regexp/experimental/experimental-interpreter.cc create mode 100644 deps/v8/src/regexp/experimental/experimental-interpreter.h create mode 100644 deps/v8/src/wasm/code-space-access.h create mode 100644 deps/v8/test/cctest/test-descriptor-array.cc delete mode 100644 deps/v8/test/cctest/test-unwinder.cc create mode 100644 deps/v8/test/cctest/wasm/test-wasm-metrics.cc create mode 100644 deps/v8/test/fuzzer/wasm/regress-1127717.wasm create mode 100644 deps/v8/test/inspector/counters/collection-expected.txt create mode 100644 deps/v8/test/inspector/counters/collection.js create mode 100644 deps/v8/test/inspector/counters/enable-disable-expected.txt create mode 100644 deps/v8/test/inspector/counters/enable-disable.js create mode 100644 deps/v8/test/inspector/runtime/evaluate-repl-mode-code-cache-expected.txt create mode 100644 deps/v8/test/inspector/runtime/evaluate-repl-mode-code-cache.js create mode 100644 deps/v8/test/intl/regress-10836.js create mode 100644 deps/v8/test/intl/regress-1121156.js create mode 100644 deps/v8/test/intl/regress-1130489.js create mode 100644 deps/v8/test/intl/regress-1132641.js create mode 100644 deps/v8/test/intl/regress-9084.js create mode 100644 deps/v8/test/js-perf-test/SuperIC.json create mode 100644 deps/v8/test/js-perf-test/SuperIC/megamorphic-mixin-getter.js create mode 100644 deps/v8/test/js-perf-test/SuperIC/megamorphic-mixin.js create mode 100644 deps/v8/test/js-perf-test/SuperIC/monomorphic-getter.js create mode 100644 deps/v8/test/js-perf-test/SuperIC/monomorphic-mega-receivers-getter.js create mode 100644 deps/v8/test/js-perf-test/SuperIC/monomorphic-mega-receivers.js create mode 100644 deps/v8/test/js-perf-test/SuperIC/monomorphic.js create mode 100644 deps/v8/test/js-perf-test/SuperIC/polymorphic-mixin-getter.js create mode 100644 deps/v8/test/js-perf-test/SuperIC/polymorphic-mixin-mega-receivers-getter.js create mode 100644 deps/v8/test/js-perf-test/SuperIC/polymorphic-mixin-mega-receivers.js create mode 100644 deps/v8/test/js-perf-test/SuperIC/polymorphic-mixin.js create mode 100644 deps/v8/test/js-perf-test/SuperIC/run.js create mode 100644 deps/v8/test/mjsunit/asm/regress-1069173.js create mode 100644 deps/v8/test/mjsunit/call-lhs-web-compat-early-errors.js create mode 100644 deps/v8/test/mjsunit/compiler/consecutive-addition.js create mode 100644 deps/v8/test/mjsunit/compiler/regress-1126771.js create mode 100644 deps/v8/test/mjsunit/compiler/regress-1127405.js create mode 100644 deps/v8/test/mjsunit/destruct-array-spread-done.js create mode 100644 deps/v8/test/mjsunit/es6/super-ic.js create mode 100644 deps/v8/test/mjsunit/harmony/typedarray-set-length-detach.js delete mode 100644 deps/v8/test/mjsunit/parallel-optimize-disabled.js create mode 100644 deps/v8/test/mjsunit/regexp-experimental.js create mode 100644 deps/v8/test/mjsunit/regress-1120905.js create mode 100644 deps/v8/test/mjsunit/regress/regress-10802.js create mode 100644 deps/v8/test/mjsunit/regress/regress-1112155.js create mode 100644 deps/v8/test/mjsunit/regress/regress-1123379.js create mode 100644 deps/v8/test/mjsunit/regress/regress-1125871.js delete mode 100644 deps/v8/test/mjsunit/regress/regress-1132111.js create mode 100644 deps/v8/test/mjsunit/regress/regress-1143772.js delete mode 100644 deps/v8/test/mjsunit/regress/regress-1156.js create mode 100644 deps/v8/test/mjsunit/regress/regress-crbug-1137586.js create mode 100644 deps/v8/test/mjsunit/regress/wasm/regress-10831.js create mode 100644 deps/v8/test/mjsunit/regress/wasm/regress-10898.js create mode 100644 deps/v8/test/mjsunit/regress/wasm/regress-1125951.js create mode 100644 deps/v8/test/mjsunit/regress/wasm/regress-1137608.js create mode 100644 deps/v8/test/mjsunit/regress/wasm/regress-1140549.js create mode 100644 deps/v8/test/mjsunit/regress/wasm/regress-1146861.js create mode 100644 deps/v8/test/mjsunit/sloppy-arguments-property-access.js rename deps/v8/test/mjsunit/tools/{codemap.js => codemap.mjs} (98%) rename deps/v8/test/mjsunit/tools/{consarray.js => consarray.mjs} (96%) rename deps/v8/test/mjsunit/tools/{csvparser.js => csvparser.mjs} (97%) rename deps/v8/test/mjsunit/tools/{dumpcpp.js => dumpcpp.mjs} (87%) create mode 100644 deps/v8/test/mjsunit/tools/log.js create mode 100644 deps/v8/test/mjsunit/tools/log_two_byte.js rename deps/v8/test/mjsunit/tools/{profile.js => profile.mjs} (98%) rename deps/v8/test/mjsunit/tools/{profile_view.js => profile_view.mjs} (95%) delete mode 100644 deps/v8/test/mjsunit/tools/profviz-test.default delete mode 100644 deps/v8/test/mjsunit/tools/profviz-test.log delete mode 100644 deps/v8/test/mjsunit/tools/profviz.js rename deps/v8/test/mjsunit/tools/{splaytree.js => splaytree.mjs} (98%) rename deps/v8/test/mjsunit/tools/{tickprocessor.js => tickprocessor.mjs} (98%) create mode 100644 deps/v8/test/mjsunit/tools/timeline.mjs create mode 100644 deps/v8/test/mjsunit/wasm/externref-globals-liftoff.js create mode 100644 deps/v8/test/mjsunit/wasm/externref-liftoff.js create mode 100644 deps/v8/test/mjsunit/wasm/reference-globals.js create mode 100644 deps/v8/test/mjsunit/wasm/reference-tables.js create mode 100644 deps/v8/test/unittests/heap/base/run-all-unittests.cc create mode 100644 deps/v8/test/unittests/heap/base/worklist-unittest.cc create mode 100644 deps/v8/test/unittests/heap/cppgc/concurrent-marking-unittest.cc create mode 100644 deps/v8/test/unittests/heap/cppgc/incremental-marking-schedule-unittest.cc delete mode 100644 deps/v8/test/unittests/heap/cppgc/worklist-unittest.cc create mode 100644 deps/v8/test/unittests/heap/index-generator-unittest.cc create mode 100644 deps/v8/test/unittests/heap/object-start-bitmap-unittest.cc create mode 100644 deps/v8/test/unittests/wasm/module-decoder-memory64-unittest.cc delete mode 100644 deps/v8/third_party/zlib/DEPS create mode 100644 deps/v8/third_party/zlib/patches/0006-fix-check_match.patch create mode 100644 deps/v8/tools/arguments.mjs create mode 100644 deps/v8/tools/codemap.mjs create mode 100644 deps/v8/tools/consarray.mjs create mode 100644 deps/v8/tools/csvparser.mjs create mode 100644 deps/v8/tools/debug_helper/OWNERS rename deps/v8/tools/{dumpcpp-driver.js => dumpcpp-driver.mjs} (87%) rename deps/v8/tools/{dumpcpp.js => dumpcpp.mjs} (82%) rename deps/v8/tools/{ic-processor-driver.js => ic-processor-driver.mjs} (88%) rename deps/v8/tools/{ic-processor.js => ic-processor.mjs} (94%) create mode 100644 deps/v8/tools/logreader.mjs rename deps/v8/tools/{map-processor-driver.js => map-processor-driver.mjs} (87%) rename deps/v8/tools/{map-processor.js => map-processor.mjs} (97%) rename deps/v8/tools/{parse-processor-driver.js => parse-processor-driver.mjs} (87%) rename deps/v8/tools/{parse-processor.js => parse-processor.mjs} (99%) delete mode 100755 deps/v8/tools/plot-timer-events create mode 100644 deps/v8/tools/profile.mjs create mode 100644 deps/v8/tools/profile_view.mjs delete mode 100644 deps/v8/tools/profviz/composer.js delete mode 100644 deps/v8/tools/profviz/gnuplot-4.6.3-emscripten.js delete mode 100644 deps/v8/tools/profviz/profviz.css delete mode 100644 deps/v8/tools/profviz/profviz.html delete mode 100644 deps/v8/tools/profviz/profviz.js delete mode 100644 deps/v8/tools/profviz/stdio.js delete mode 100644 deps/v8/tools/profviz/worker.js create mode 100644 deps/v8/tools/sourcemap.mjs create mode 100644 deps/v8/tools/splaytree.mjs delete mode 100644 deps/v8/tools/system-analyzer/ic-processor.mjs create mode 100644 deps/v8/tools/system-analyzer/log/ic.mjs rename deps/v8/tools/system-analyzer/{event.mjs => log/log.mjs} (89%) create mode 100644 deps/v8/tools/system-analyzer/log/map.mjs delete mode 100644 deps/v8/tools/system-analyzer/map-processor.mjs create mode 100644 deps/v8/tools/system-analyzer/processor.mjs create mode 100644 deps/v8/tools/system-analyzer/source-panel-template.html create mode 100644 deps/v8/tools/system-analyzer/source-panel.mjs delete mode 100644 deps/v8/tools/testrunner/local/junit_output.py create mode 100644 deps/v8/tools/tickprocessor-driver.mjs create mode 100644 deps/v8/tools/tickprocessor.mjs delete mode 100755 deps/v8/tools/trace-maps-processor.py create mode 100644 deps/v8/tools/v8windbg/OWNERS diff --git a/deps/v8/AUTHORS b/deps/v8/AUTHORS index 32268da1cb9115..36abcfba774a44 100644 --- a/deps/v8/AUTHORS +++ b/deps/v8/AUTHORS @@ -25,6 +25,7 @@ Code Aurora Forum <*@codeaurora.org> Home Jinni Inc. <*@homejinni.com> IBM Inc. <*@*.ibm.com> IBM Inc. <*@ibm.com> +Red Hat Inc. <*@redhat.com> Samsung <*@*.samsung.com> Samsung <*@samsung.com> Joyent, Inc <*@joyent.com> @@ -40,6 +41,7 @@ Groupon <*@groupon.com> Meteor Development Group <*@meteor.com> Cloudflare, Inc. <*@cloudflare.com> Julia Computing, Inc. <*@juliacomputing.com> +CodeWeavers, Inc. <*@codeweavers.com> Aaron Bieber Aaron O'Mullan @@ -75,6 +77,7 @@ Choongwoo Han Chris Nardi Christopher A. Taylor Colin Ihrig +Cong Zuo Daniel Andersson Daniel Bevenius Daniel James @@ -102,6 +105,7 @@ Henrique Ferreiro Hirofumi Mako Honggyu Kim Huáng Jùnliàng +HyeockJin Kim Iain Ireland Ingvar Stepanyan Ioseb Dzmanashvili @@ -132,6 +136,7 @@ Loo Rong Jie Luis Reis Luke Zarko Maciej Małecki +Marcel Laverdet Marcin Cieślak Marcin Wiącek Martin Bidlingmaier @@ -219,3 +224,4 @@ Zeynep Cankara Zhao Jiazhong Zhongping Wang 柳荣一 +Tianping Yang diff --git a/deps/v8/BUILD.gn b/deps/v8/BUILD.gn index bda33c185fe683..94b598bc9a2882 100644 --- a/deps/v8/BUILD.gn +++ b/deps/v8/BUILD.gn @@ -109,8 +109,11 @@ declare_args() { v8_enable_pointer_compression = "" v8_enable_31bit_smis_on_64bit_arch = false + # Disable arguments adaptor frame (sets -dV8_NO_ARGUMENTS_ADAPTOR). + v8_disable_arguments_adaptor = false + # Reverse JS arguments order in the stack (sets -dV8_REVERSE_JSARGS). - v8_enable_reverse_jsargs = false + v8_enable_reverse_jsargs = true # Sets -dOBJECT_PRINT. v8_enable_object_print = "" @@ -183,9 +186,9 @@ declare_args() { # Controls the threshold for on-heap/off-heap Typed Arrays. v8_typed_array_max_size_in_heap = 64 - v8_enable_gdbjit = - ((v8_current_cpu == "x86" || v8_current_cpu == "x64") && - (is_linux || is_mac)) || (v8_current_cpu == "ppc64" && is_linux) + v8_enable_gdbjit = ((v8_current_cpu == "x86" || v8_current_cpu == "x64") && + (is_linux || is_chromeos || is_mac)) || + (v8_current_cpu == "ppc64" && (is_linux || is_chromeos)) # Temporary flag to allow embedders to update their microtasks scopes # while rolling in a new version of V8. @@ -338,13 +341,24 @@ assert(v8_current_cpu == "arm64" || !v8_control_flow_integrity, if (v8_enable_shared_ro_heap && v8_enable_pointer_compression) { assert( - is_linux || is_android, + is_linux || is_chromeos || is_android, "Sharing read-only heap with pointer compression is only supported on Linux or Android") } +assert(!v8_use_multi_snapshots || !v8_control_flow_integrity, + "Control-flow integrity does not support multisnapshots") + +assert( + !v8_enable_pointer_compression || !v8_enable_shared_ro_heap, + "Pointer compression is not supported with shared read-only heap enabled") + assert(!v8_enable_heap_sandbox || v8_enable_pointer_compression, "V8 Heap Sandbox requires pointer compression") +assert( + !v8_disable_arguments_adaptor || v8_enable_reverse_jsargs, + "Disabling the arguments adaptor frame requires reversing the JS arguments stack") + assert(!v8_enable_unconditional_write_barriers || !v8_disable_write_barriers, "Write barriers can't be both enabled and disabled") @@ -361,6 +375,9 @@ if (v8_enable_single_generation == true) { "Requires unconditional write barriers or none (which disables incremental marking)") } +assert(!v8_enable_conservative_stack_scanning || v8_enable_single_generation, + "Conservative stack scanning requires single generation") + v8_random_seed = "314159265" v8_toolset_for_shell = "host" @@ -369,7 +386,7 @@ v8_toolset_for_shell = "host" # config("internal_config_base") { - # Only targets in this file and its subdirs can depend on this. + # Only targets in this file and its subdirs can depend on this. visibility = [ "./*" ] configs = [ ":v8_tracing_config" ] @@ -383,6 +400,7 @@ config("internal_config_base") { config("internal_config") { defines = [] + # Only targets in this file and its subdirs can depend on this. visibility = [ "./*" ] @@ -496,6 +514,9 @@ config("v8_header_features") { if (v8_imminent_deprecation_warnings) { defines += [ "V8_IMMINENT_DEPRECATION_WARNINGS" ] } + if (v8_disable_arguments_adaptor) { + defines += [ "V8_NO_ARGUMENTS_ADAPTOR" ] + } if (v8_enable_reverse_jsargs) { defines += [ "V8_REVERSE_JSARGS" ] } @@ -581,6 +602,9 @@ config("features") { if (v8_enable_single_generation) { defines += [ "V8_ENABLE_SINGLE_GENERATION" ] } + if (v8_enable_conservative_stack_scanning) { + defines += [ "V8_ENABLE_CONSERVATIVE_STACK_SCANNING" ] + } if (v8_disable_write_barriers) { defines += [ "V8_DISABLE_WRITE_BARRIERS" ] } @@ -836,7 +860,7 @@ config("toolchain") { # TODO(jochen): Add support for compiling with simulators. if (v8_enable_debugging_features) { - if (is_linux && v8_enable_backtrace) { + if ((is_linux || is_chromeos) && v8_enable_backtrace) { ldflags += [ "-rdynamic" ] } @@ -1014,7 +1038,7 @@ action("postmortem-metadata") { # NOSORT sources = [ - "$target_gen_dir/torque-generated/instance-types-tq.h", + "$target_gen_dir/torque-generated/instance-types.h", "src/objects/allocation-site.h", "src/objects/allocation-site-inl.h", "src/objects/cell.h", @@ -1038,6 +1062,7 @@ action("postmortem-metadata") { "src/objects/js-array-buffer-inl.h", "src/objects/js-array.h", "src/objects/js-array-inl.h", + "src/objects/js-function-inl.h", "src/objects/js-function.cc", "src/objects/js-function.h", "src/objects/js-objects.cc", @@ -1107,6 +1132,7 @@ torque_files = [ "src/builtins/array-splice.tq", "src/builtins/array-unshift.tq", "src/builtins/array.tq", + "src/builtins/arraybuffer.tq", "src/builtins/base.tq", "src/builtins/bigint.tq", "src/builtins/boolean.tq", @@ -1277,9 +1303,9 @@ template("run_torque") { action("run_torque" + suffix) { visibility = [ ":*", + "test/cctest/:*", "tools/debug_helper/:*", "tools/gcmole/:*", - "test/cctest/:*", ] deps = [ ":torque($toolchain)" ] @@ -1291,35 +1317,37 @@ template("run_torque") { destination_folder = "$target_gen_dir/torque-generated$suffix" files = [ - "bit-fields-tq.h", - "builtin-definitions-tq.h", - "interface-descriptors-tq.inc", - "factory-tq.cc", - "factory-tq.inc", - "field-offsets-tq.h", - "class-verifiers-tq.cc", - "class-verifiers-tq.h", - "enum-verifiers-tq.cc", - "objects-printer-tq.cc", - "objects-body-descriptors-tq-inl.inc", - "class-definitions-tq.cc", - "class-definitions-tq-inl.h", - "class-definitions-tq.h", - "class-debug-readers-tq.cc", - "class-debug-readers-tq.h", - "exported-macros-assembler-tq.cc", - "exported-macros-assembler-tq.h", - "csa-types-tq.h", - "instance-types-tq.h", - "internal-class-definitions-tq.h", - "internal-class-definitions-tq-inl.h", - "exported-class-definitions-tq.h", - "exported-class-definitions-tq-inl.h", + "$target_gen_dir/torque-generated/bit-fields.h", + "$target_gen_dir/torque-generated/builtin-definitions.h", + "$target_gen_dir/torque-generated/interface-descriptors.inc", + "$target_gen_dir/torque-generated/factory.cc", + "$target_gen_dir/torque-generated/factory.inc", + "$target_gen_dir/torque-generated/field-offsets.h", + "$target_gen_dir/torque-generated/class-verifiers.cc", + "$target_gen_dir/torque-generated/class-verifiers.h", + "$target_gen_dir/torque-generated/enum-verifiers.cc", + "$target_gen_dir/torque-generated/objects-printer.cc", + "$target_gen_dir/torque-generated/objects-body-descriptors-inl.inc", + "$target_gen_dir/torque-generated/class-definitions.cc", + "$target_gen_dir/torque-generated/class-definitions-inl.h", + "$target_gen_dir/torque-generated/class-definitions.h", + "$target_gen_dir/torque-generated/class-debug-readers.cc", + "$target_gen_dir/torque-generated/class-debug-readers.h", + "$target_gen_dir/torque-generated/exported-macros-assembler.cc", + "$target_gen_dir/torque-generated/exported-macros-assembler.h", + "$target_gen_dir/torque-generated/csa-types.h", + "$target_gen_dir/torque-generated/instance-types.h", + "$target_gen_dir/torque-generated/internal-class-definitions.h", + "$target_gen_dir/torque-generated/internal-class-definitions-inl.h", + "$target_gen_dir/torque-generated/exported-class-definitions.h", + "$target_gen_dir/torque-generated/exported-class-definitions-inl.h", ] outputs = [] foreach(file, files) { - outputs += [ "$destination_folder/$file" ] + outputs += [ string_replace(file, + "$target_gen_dir/torque-generated", + destination_folder) ] } foreach(file, torque_files) { @@ -1395,10 +1423,10 @@ v8_source_set("torque_generated_initializers") { public_deps = [ ":v8_maybe_icu" ] sources = [ - "$target_gen_dir/torque-generated/csa-types-tq.h", - "$target_gen_dir/torque-generated/enum-verifiers-tq.cc", - "$target_gen_dir/torque-generated/exported-macros-assembler-tq.cc", - "$target_gen_dir/torque-generated/exported-macros-assembler-tq.h", + "$target_gen_dir/torque-generated/csa-types.h", + "$target_gen_dir/torque-generated/enum-verifiers.cc", + "$target_gen_dir/torque-generated/exported-macros-assembler.cc", + "$target_gen_dir/torque-generated/exported-macros-assembler.h", "src/torque/runtime-support.h", ] foreach(file, torque_files) { @@ -1424,11 +1452,11 @@ v8_source_set("torque_generated_definitions") { public_deps = [ ":v8_maybe_icu" ] sources = [ - "$target_gen_dir/torque-generated/class-definitions-tq.cc", - "$target_gen_dir/torque-generated/class-verifiers-tq.cc", - "$target_gen_dir/torque-generated/class-verifiers-tq.h", - "$target_gen_dir/torque-generated/factory-tq.cc", - "$target_gen_dir/torque-generated/objects-printer-tq.cc", + "$target_gen_dir/torque-generated/class-definitions.cc", + "$target_gen_dir/torque-generated/class-verifiers.cc", + "$target_gen_dir/torque-generated/class-verifiers.h", + "$target_gen_dir/torque-generated/factory.cc", + "$target_gen_dir/torque-generated/objects-printer.cc", ] configs = [ ":internal_config" ] @@ -1467,7 +1495,11 @@ template("run_mksnapshot") { suffix = "_$name" } action("run_mksnapshot_" + name) { - visibility = [ ":*" ] # Only targets in this file can depend on this. + # Only targets in this file and running mkgrokdump can depend on this. + visibility = [ + ":*", + "tools/debug_helper:run_mkgrokdump", + ] deps = [ ":mksnapshot($v8_snapshot_toolchain)" ] @@ -1633,12 +1665,13 @@ action("v8_dump_build_config") { "is_ubsan_vptr=$is_ubsan_vptr", "target_cpu=\"$target_cpu\"", "v8_current_cpu=\"$v8_current_cpu\"", + "v8_enable_concurrent_marking=$v8_enable_concurrent_marking", "v8_enable_i18n_support=$v8_enable_i18n_support", "v8_enable_verify_predictable=$v8_enable_verify_predictable", - "v8_target_cpu=\"$v8_target_cpu\"", "v8_enable_verify_csa=$v8_enable_verify_csa", "v8_enable_lite_mode=$v8_enable_lite_mode", "v8_enable_pointer_compression=$v8_enable_pointer_compression", + "v8_target_cpu=\"$v8_target_cpu\"", ] if (v8_current_cpu == "mips" || v8_current_cpu == "mipsel" || @@ -1668,6 +1701,9 @@ v8_source_set("v8_snapshot") { public = [] sources = [ "src/init/setup-isolate-deserialize.cc" ] + if (v8_control_flow_integrity) { + sources += [ "src/deoptimizer/deoptimizer-cfi-builtins.cc" ] + } if (emit_builtins_as_inline_asm) { deps += [ ":asm_to_inline_asm_default" ] sources += [ "$target_gen_dir/embedded.cc" ] @@ -1935,8 +1971,6 @@ v8_compiler_sources = [ "src/compiler/backend/instruction.h", "src/compiler/backend/jump-threading.cc", "src/compiler/backend/jump-threading.h", - "src/compiler/backend/live-range-separator.cc", - "src/compiler/backend/live-range-separator.h", "src/compiler/backend/mid-tier-register-allocator.cc", "src/compiler/backend/mid-tier-register-allocator.h", "src/compiler/backend/move-optimizer.cc", @@ -2274,7 +2308,6 @@ v8_source_set("v8_base_without_compiler") { "src/builtins/builtins-arraybuffer.cc", "src/builtins/builtins-async-module.cc", "src/builtins/builtins-bigint.cc", - "src/builtins/builtins-call.cc", "src/builtins/builtins-callsite.cc", "src/builtins/builtins-collections.cc", "src/builtins/builtins-console.cc", @@ -2562,6 +2595,8 @@ v8_source_set("v8_base_without_compiler") { "src/heap/incremental-marking-job.h", "src/heap/incremental-marking.cc", "src/heap/incremental-marking.h", + "src/heap/index-generator.cc", + "src/heap/index-generator.h", "src/heap/invalidated-slots-inl.h", "src/heap/invalidated-slots.cc", "src/heap/invalidated-slots.h", @@ -2839,6 +2874,7 @@ v8_source_set("v8_base_without_compiler") { "src/objects/js-display-names-inl.h", "src/objects/js-display-names.cc", "src/objects/js-display-names.h", + "src/objects/js-function-inl.h", "src/objects/js-function.cc", "src/objects/js-function.h", "src/objects/js-generator-inl.h", @@ -3042,6 +3078,8 @@ v8_source_set("v8_base_without_compiler") { "src/profiler/profile-generator.h", "src/profiler/profiler-listener.cc", "src/profiler/profiler-listener.h", + "src/profiler/profiler-stats.cc", + "src/profiler/profiler-stats.h", "src/profiler/sampling-heap-profiler.cc", "src/profiler/sampling-heap-profiler.h", "src/profiler/strings-storage.cc", @@ -3050,6 +3088,12 @@ v8_source_set("v8_base_without_compiler") { "src/profiler/tick-sample.h", "src/profiler/tracing-cpu-profiler.cc", "src/profiler/tracing-cpu-profiler.h", + "src/regexp/experimental/experimental-bytecode.cc", + "src/regexp/experimental/experimental-bytecode.h", + "src/regexp/experimental/experimental-compiler.cc", + "src/regexp/experimental/experimental-compiler.h", + "src/regexp/experimental/experimental-interpreter.cc", + "src/regexp/experimental/experimental-interpreter.h", "src/regexp/experimental/experimental.cc", "src/regexp/experimental/experimental.h", "src/regexp/property-sequences.cc", @@ -3237,6 +3281,7 @@ v8_source_set("v8_base_without_compiler") { "src/wasm/baseline/liftoff-compiler.cc", "src/wasm/baseline/liftoff-compiler.h", "src/wasm/baseline/liftoff-register.h", + "src/wasm/code-space-access.h", "src/wasm/compilation-environment.h", "src/wasm/decoder.h", "src/wasm/function-body-decoder-impl.h", @@ -3339,6 +3384,14 @@ v8_source_set("v8_base_without_compiler") { sources += [ "src/heap/third-party/heap-api-stub.cc" ] } + if (v8_enable_conservative_stack_scanning) { + sources += [ + "src/heap/conservative-stack-visitor.cc", + "src/heap/conservative-stack-visitor.h", + "src/heap/object-start-bitmap.h", + ] + } + if (v8_enable_wasm_gdb_remote_debugging) { sources += [ "src/debug/wasm/gdb-server/gdb-remote-util.cc", @@ -3425,7 +3478,7 @@ v8_source_set("v8_base_without_compiler") { # iOS Xcode simulator builds run on an x64 target. iOS and macOS are both # based on Darwin and thus POSIX-compliant to a similar degree. - if (is_linux || is_mac || is_ios || target_os == "freebsd") { + if (is_linux || is_chromeos || is_mac || is_ios || target_os == "freebsd") { sources += [ "src/trap-handler/handler-inside-posix.cc", "src/trap-handler/handler-inside-posix.h", @@ -3677,6 +3730,7 @@ v8_source_set("v8_base_without_compiler") { deps = [ ":cppgc_base", ":torque_generated_definitions", + ":v8_cppgc_shared", ":v8_headers", ":v8_libbase", ":v8_libsampler", @@ -3769,7 +3823,7 @@ v8_source_set("v8_base_without_compiler") { libs += [ "atomic" ] } - if (v8_enable_vtunetracemark && (is_linux || is_win)) { + if (v8_enable_vtunetracemark && (is_linux || is_chromeos || is_win)) { sources += [ "src/extensions/vtunedomain-support-extension.cc", "src/extensions/vtunedomain-support-extension.h", @@ -4014,7 +4068,7 @@ v8_component("v8_libbase") { } } - if (is_linux) { + if (is_linux || is_chromeos) { sources += [ "src/base/debug/stack_trace_posix.cc", "src/base/platform/platform-linux.cc", @@ -4205,6 +4259,8 @@ v8_source_set("v8_cppgc_shared") { sources = [ "src/heap/base/stack.cc", "src/heap/base/stack.h", + "src/heap/base/worklist.cc", + "src/heap/base/worklist.h", ] if (is_clang || !is_win) { @@ -4272,6 +4328,7 @@ v8_source_set("cppgc_base") { "include/cppgc/visitor.h", "include/v8config.h", "src/heap/cppgc/allocation.cc", + "src/heap/cppgc/default-job.h", "src/heap/cppgc/default-platform.cc", "src/heap/cppgc/free-list.cc", "src/heap/cppgc/free-list.h", @@ -4294,11 +4351,14 @@ v8_source_set("cppgc_base") { "src/heap/cppgc/heap-visitor.h", "src/heap/cppgc/heap.cc", "src/heap/cppgc/heap.h", + "src/heap/cppgc/incremental-marking-schedule.cc", + "src/heap/cppgc/incremental-marking-schedule.h", "src/heap/cppgc/liveness-broker.cc", "src/heap/cppgc/liveness-broker.h", "src/heap/cppgc/logging.cc", "src/heap/cppgc/marker.cc", "src/heap/cppgc/marker.h", + "src/heap/cppgc/marking-state.cc", "src/heap/cppgc/marking-state.h", "src/heap/cppgc/marking-verifier.cc", "src/heap/cppgc/marking-verifier.h", @@ -4330,7 +4390,6 @@ v8_source_set("cppgc_base") { "src/heap/cppgc/virtual-memory.cc", "src/heap/cppgc/virtual-memory.h", "src/heap/cppgc/visitor.cc", - "src/heap/cppgc/worklist.h", "src/heap/cppgc/write-barrier.cc", ] @@ -4449,6 +4508,10 @@ if (current_toolchain == v8_snapshot_toolchain) { "src/snapshot/snapshot-empty.cc", ] + if (v8_control_flow_integrity) { + sources += [ "src/deoptimizer/deoptimizer-cfi-empty.cc" ] + } + configs = [ ":internal_config" ] deps = [ @@ -4709,6 +4772,15 @@ if (is_component_build) { configs = [ ":internal_config" ] public_configs = [ ":external_config" ] } + + v8_component("v8_cppgc_shared_for_testing") { + testonly = true + + public_deps = [ ":v8_cppgc_shared" ] + + configs = [ ":internal_config" ] + public_configs = [ ":external_config" ] + } } else { group("v8") { public_deps = [ @@ -4746,6 +4818,14 @@ if (is_component_build) { public_configs = [ ":external_config" ] } + + group("v8_cppgc_shared_for_testing") { + testonly = true + + public_deps = [ ":v8_cppgc_shared" ] + + public_configs = [ ":external_config" ] + } } v8_executable("d8") { diff --git a/deps/v8/COMMON_OWNERS b/deps/v8/COMMON_OWNERS index bfd539fb42076e..74026eaeffd497 100644 --- a/deps/v8/COMMON_OWNERS +++ b/deps/v8/COMMON_OWNERS @@ -37,6 +37,7 @@ szuend@chromium.org tebbi@chromium.org thibaudm@chromium.org ulan@chromium.org +vahl@chromium.org verwaest@chromium.org victorgomes@chromium.org yangguo@chromium.org diff --git a/deps/v8/DEPS b/deps/v8/DEPS index 7726a6973ec1df..6bddd2cc9f0cab 100644 --- a/deps/v8/DEPS +++ b/deps/v8/DEPS @@ -41,10 +41,10 @@ vars = { 'mac_xcode_version': 'default', # GN CIPD package version. - 'gn_version': 'git_revision:e327ffdc503815916db2543ec000226a8df45163', + 'gn_version': 'git_revision:e002e68a48d1c82648eadde2f6aafa20d08c36f2', # luci-go CIPD package version. - 'luci_go': 'git_revision:b022173f8069cf8001d4cf2a87ce7c5f0eae220f', + 'luci_go': 'git_revision:83c3df996b224edf5061840744395707a0e513e7', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling android_sdk_build-tools_version @@ -82,15 +82,15 @@ vars = { deps = { 'build': - Var('chromium_url') + '/chromium/src/build.git' + '@' + '78b2991b0494c775e437770def455fe40061038f', + Var('chromium_url') + '/chromium/src/build.git' + '@' + '38a49c12ded01dd8c4628b432cb7eebfb29e77f1', 'third_party/depot_tools': - Var('chromium_url') + '/chromium/tools/depot_tools.git' + '@' + '5cff4e3b5cf3116071761cbca363d416b413a064', + Var('chromium_url') + '/chromium/tools/depot_tools.git' + '@' + '1099c11d5d12255458303c1ba4e5584cfde90477', 'third_party/icu': - Var('chromium_url') + '/chromium/deps/icu.git' + '@' + '79326efe26e5440f530963704c3c0ff965b3a4ac', + Var('chromium_url') + '/chromium/deps/icu.git' + '@' + 'aef20f06d47ba76fdf13abcdb033e2a408b5a94d', 'third_party/instrumented_libraries': Var('chromium_url') + '/chromium/src/third_party/instrumented_libraries.git' + '@' + '3c52ccdd3b9edf8fb7b3bd8ba945cce47d887ea8', 'buildtools': - Var('chromium_url') + '/chromium/src/buildtools.git' + '@' + 'b00ad0af636401e5eb4b5d0ab01b65164dca1914', + Var('chromium_url') + '/chromium/src/buildtools.git' + '@' + '3ff4f5027b4b81a6c9c36d64d71444f2709a4896', 'buildtools/clang_format/script': Var('chromium_url') + '/chromium/llvm-project/cfe/tools/clang-format.git' + '@' + '96636aa0e9f047f17447f2d45a094d0b59ed7917', 'buildtools/linux64': { @@ -178,7 +178,7 @@ deps = { 'dep_type': 'cipd', }, 'third_party/catapult': { - 'url': Var('chromium_url') + '/catapult.git' + '@' + 'abfdfbb6683802d3a46ed515246573729ea147ff', + 'url': Var('chromium_url') + '/catapult.git' + '@' + '18d69fb4e7b2225974dfc306ca0c11a58fe4e917', 'condition': 'checkout_android', }, 'third_party/colorama/src': { @@ -196,17 +196,17 @@ deps = { 'condition': 'checkout_google_benchmark', }, 'third_party/jinja2': - Var('chromium_url') + '/chromium/src/third_party/jinja2.git' + '@' + '61cfe2ac6c9108534c43b4039a95a0980251f266', + Var('chromium_url') + '/chromium/src/third_party/jinja2.git' + '@' + 'a82a4944a7f2496639f34a89c9923be5908b80aa', 'third_party/markupsafe': Var('chromium_url') + '/chromium/src/third_party/markupsafe.git' + '@' + 'f2fb0f21ef1e1d4ffd43be8c63fc3d4928dea7ab', 'tools/swarming_client': - Var('chromium_url') + '/infra/luci/client-py.git' + '@' + '4c095d04179dc725a300085ae21fe3b79900d072', + Var('chromium_url') + '/infra/luci/client-py.git' + '@' + '44c13d73156581ea09b9389001e58c23a4b8d70a', 'test/benchmarks/data': Var('chromium_url') + '/v8/deps/third_party/benchmarks.git' + '@' + '05d7188267b4560491ff9155c5ee13e207ecd65f', 'test/mozilla/data': Var('chromium_url') + '/v8/deps/third_party/mozilla-tests.git' + '@' + 'f6c578a10ea707b1a8ab0b88943fe5115ce2b9be', 'test/test262/data': - Var('chromium_url') + '/external/github.com/tc39/test262.git' + '@' + 'e73054f75e08e329e73e0f77bf92503ad5b83d0f', + Var('chromium_url') + '/external/github.com/tc39/test262.git' + '@' + '63976020376c8c2b0ebabf37c364f25288d4b93b', 'test/test262/harness': Var('chromium_url') + '/external/github.com/test262-utils/test262-harness-py.git' + '@' + '4555345a943d0c99a9461182705543fb171dda4b', 'third_party/qemu-linux-x64': { @@ -233,7 +233,7 @@ deps = { 'packages': [ { 'package': 'fuchsia/third_party/aemu/linux-amd64', - 'version': 'cG1zzefbD24rFmPDujqP0rrEG0uXUhH8axBOrD619hoC' + 'version': 'FfxmX7LQ9OID3pVAmcemr6u9lK3xjXzAXxvqzEcclMwC' }, ], 'condition': 'host_os == "linux" and checkout_fuchsia', @@ -250,7 +250,7 @@ deps = { 'dep_type': 'cipd', }, 'tools/clang': - Var('chromium_url') + '/chromium/src/tools/clang.git' + '@' + '299e8a233942b1978a4c0dbc301f363a6729c4e2', + Var('chromium_url') + '/chromium/src/tools/clang.git' + '@' + '3017edade60658a699be776d9e282509a902ffe9', 'tools/luci-go': { 'packages': [ { @@ -284,15 +284,19 @@ deps = { 'third_party/protobuf': Var('chromium_url') + '/external/github.com/google/protobuf'+ '@' + 'b68a347f56137b4b1a746e8c7438495a6ac1bd91', 'third_party/zlib': - Var('chromium_url') + '/chromium/src/third_party/zlib.git'+ '@' + 'd53accfbd0382a98ad7378045631866449b5f92e', + Var('chromium_url') + '/chromium/src/third_party/zlib.git'+ '@' + '4668feaaa47973a6f9d9f9caeb14cd03731854f1', 'third_party/jsoncpp/source': - Var('chromium_url') + '/external/github.com/open-source-parsers/jsoncpp.git'+ '@' + '645250b6690785be60ab6780ce4b58698d884d11', + Var('chromium_url') + '/external/github.com/open-source-parsers/jsoncpp.git'+ '@' + '9059f5cad030ba11d37818847443a53918c327b1', 'third_party/ittapi': { # Force checkout ittapi libraries to pass v8 header includes check on # bots that has check_v8_header_includes enabled. 'url': Var('chromium_url') + '/external/github.com/intel/ittapi' + '@' + 'b4ae0122ba749163096058b4f1bb065bf4a7de94', 'condition': "checkout_ittapi or check_v8_header_includes", }, + 'third_party/requests': { + 'url': Var('chromium_url') + '/external/github.com/kennethreitz/requests.git' + '@' + 'bfb93d4b7d269a8735f1b216093e7e9a9fdc4517', + 'condition': 'checkout_android', + }, } include_rules = [ diff --git a/deps/v8/LICENSE.valgrind b/deps/v8/LICENSE.valgrind deleted file mode 100644 index fd8ebaf5099213..00000000000000 --- a/deps/v8/LICENSE.valgrind +++ /dev/null @@ -1,45 +0,0 @@ ----------------------------------------------------------------- - -Notice that the following BSD-style license applies to this one -file (valgrind.h) only. The rest of Valgrind is licensed under the -terms of the GNU General Public License, version 2, unless -otherwise indicated. See the COPYING file in the source -distribution for details. - ----------------------------------------------------------------- - -This file is part of Valgrind, a dynamic binary instrumentation -framework. - -Copyright (C) 2000-2007 Julian Seward. 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. The origin of this software must not be misrepresented; you must - not claim that you wrote the original software. If you use this - software in a product, an acknowledgment in the product - documentation would be appreciated but is not required. - -3. Altered source versions must be plainly marked as such, and must - not be misrepresented as being the original software. - -4. The name of the author may not 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. diff --git a/deps/v8/PPC_OWNERS b/deps/v8/PPC_OWNERS index 6d1a8fc472cfe1..6edd45a6ef2e04 100644 --- a/deps/v8/PPC_OWNERS +++ b/deps/v8/PPC_OWNERS @@ -1,4 +1,4 @@ -jyan@ca.ibm.com +junyan@redhat.com joransiu@ca.ibm.com -michael_dawson@ca.ibm.com -miladfar@ca.ibm.com \ No newline at end of file +midawson@redhat.com +mfarazma@redhat.com diff --git a/deps/v8/S390_OWNERS b/deps/v8/S390_OWNERS index 6d1a8fc472cfe1..6edd45a6ef2e04 100644 --- a/deps/v8/S390_OWNERS +++ b/deps/v8/S390_OWNERS @@ -1,4 +1,4 @@ -jyan@ca.ibm.com +junyan@redhat.com joransiu@ca.ibm.com -michael_dawson@ca.ibm.com -miladfar@ca.ibm.com \ No newline at end of file +midawson@redhat.com +mfarazma@redhat.com diff --git a/deps/v8/gni/v8.gni b/deps/v8/gni/v8.gni index 413b0d38107749..edc944ef0c7a96 100644 --- a/deps/v8/gni/v8.gni +++ b/deps/v8/gni/v8.gni @@ -67,6 +67,9 @@ declare_args() { # Add fuzzilli fuzzer support. v8_fuzzilli = false + # Scan the call stack conservatively during garbage collection. + v8_enable_conservative_stack_scanning = false + v8_enable_google_benchmark = checkout_google_benchmark } @@ -218,7 +221,7 @@ template("v8_executable") { configs -= invoker.remove_configs } configs += invoker.configs - if (is_linux) { + if (is_linux || is_chromeos) { # For enabling ASLR. ldflags = [ "-pie" ] } diff --git a/deps/v8/include/cppgc/OWNERS b/deps/v8/include/cppgc/OWNERS new file mode 100644 index 00000000000000..6ccabf60b15cd1 --- /dev/null +++ b/deps/v8/include/cppgc/OWNERS @@ -0,0 +1,2 @@ +bikineev@chromium.org +omerkatz@chromium.org \ No newline at end of file diff --git a/deps/v8/include/cppgc/default-platform.h b/deps/v8/include/cppgc/default-platform.h index 24b1cd14982f9a..da8129a81b1480 100644 --- a/deps/v8/include/cppgc/default-platform.h +++ b/deps/v8/include/cppgc/default-platform.h @@ -6,7 +6,6 @@ #define INCLUDE_CPPGC_DEFAULT_PLATFORM_H_ #include -#include // NOLINT(build/c++11) #include #include "cppgc/platform.h" @@ -14,6 +13,10 @@ namespace cppgc { +namespace internal { +class DefaultJob; +} // namespace internal + /** * Default task runner implementation. Keep posted tasks in a list that can be * processed by calling RunSingleTask() or RunUntilIdle(). @@ -26,8 +29,11 @@ class V8_EXPORT DefaultTaskRunner final : public cppgc::TaskRunner { DefaultTaskRunner& operator=(const DefaultTaskRunner&) = delete; void PostTask(std::unique_ptr task) override; - void PostNonNestableTask(std::unique_ptr task) override; void PostDelayedTask(std::unique_ptr task, double) override; + + bool NonNestableTasksEnabled() const final { return false; } + bool NonNestableDelayedTasksEnabled() const final { return false; } + void PostNonNestableTask(std::unique_ptr task) override; void PostNonNestableDelayedTask(std::unique_ptr task, double) override; @@ -58,6 +64,8 @@ class V8_EXPORT DefaultPlatform final : public Platform { std::shared_ptr GetForegroundTaskRunner() final; + // DefaultPlatform does not support job priorities. All jobs would be + // assigned the same priority regardless of the cppgc::TaskPriority parameter. std::unique_ptr PostJob( cppgc::TaskPriority priority, std::unique_ptr job_task) final; @@ -68,7 +76,7 @@ class V8_EXPORT DefaultPlatform final : public Platform { private: std::unique_ptr page_allocator_; std::shared_ptr foreground_task_runner_; - std::vector> job_threads_; + std::vector> jobs_; }; } // namespace cppgc diff --git a/deps/v8/include/cppgc/heap.h b/deps/v8/include/cppgc/heap.h index ca0dbeca7ffe01..029158f4a5884c 100644 --- a/deps/v8/include/cppgc/heap.h +++ b/deps/v8/include/cppgc/heap.h @@ -84,7 +84,7 @@ class V8_EXPORT Heap { std::vector> custom_spaces; /** - * Specifies whether conserative stack scan is supported. When conservative + * Specifies whether conservative stack scan is supported. When conservative * stack scan is not supported, the collector may try to invoke * garbage collections using non-nestable task, which are guaranteed to have * no interesting stack, through the provided Platform. If such tasks are diff --git a/deps/v8/include/cppgc/internal/prefinalizer-handler.h b/deps/v8/include/cppgc/internal/prefinalizer-handler.h index ea0eca02a0e492..64b07ec9112689 100644 --- a/deps/v8/include/cppgc/internal/prefinalizer-handler.h +++ b/deps/v8/include/cppgc/internal/prefinalizer-handler.h @@ -18,7 +18,7 @@ class V8_EXPORT PreFinalizerRegistrationDispatcher final { void* object; PreFinalizerCallback callback; - bool operator==(const PreFinalizer& other); + bool operator==(const PreFinalizer& other) const; }; static void RegisterPrefinalizer(PreFinalizer pre_finalizer); diff --git a/deps/v8/include/cppgc/member.h b/deps/v8/include/cppgc/member.h index 22c1adc0af7c3c..116a2c7e54a2e6 100644 --- a/deps/v8/include/cppgc/member.h +++ b/deps/v8/include/cppgc/member.h @@ -58,6 +58,7 @@ class BasicMember final : private MemberBase, private CheckingPolicy { this->CheckPointer(Get()); } BasicMember(T& raw) : BasicMember(&raw) {} // NOLINT + // Copy ctor. BasicMember(const BasicMember& other) : BasicMember(other.Get()) {} // Allow heterogeneous construction. template & other) : BasicMember(other.Get()) {} + // Move ctor. + BasicMember(BasicMember&& other) noexcept : BasicMember(other.Get()) { + other.Clear(); + } + // Allow heterogeneous move construction. + template ::value>> + BasicMember( // NOLINT + BasicMember&& other) noexcept + : BasicMember(other.Get()) { + other.Clear(); + } // Construction from Persistent. template ::value>> @@ -90,6 +106,22 @@ class BasicMember final : private MemberBase, private CheckingPolicy { OtherCheckingPolicy>& other) { return operator=(other.Get()); } + // Move assignment. + BasicMember& operator=(BasicMember&& other) noexcept { + operator=(other.Get()); + other.Clear(); + return *this; + } + // Heterogeneous move assignment. + template ::value>> + BasicMember& operator=(BasicMember&& other) noexcept { + operator=(other.Get()); + other.Clear(); + return *this; + } // Assignment from Persistent. template ::Perform(T* data) {} template V8_INLINE void PerformCastCheck(T* data) { - CastCheck::value>::Perform(data); + CastCheck::value && + !std::is_same>::value>::Perform(data); } // A base class for backing stores, which is needed due to vagaries of diff --git a/deps/v8/include/v8-metrics.h b/deps/v8/include/v8-metrics.h index a511c01e5afe41..9734ac1b36ab96 100644 --- a/deps/v8/include/v8-metrics.h +++ b/deps/v8/include/v8-metrics.h @@ -16,7 +16,7 @@ struct WasmModuleDecoded { bool success = false; size_t module_size_in_bytes = 0; size_t function_count = 0; - int64_t wall_clock_time_in_us = 0; + int64_t wall_clock_time_in_us = -1; }; struct WasmModuleCompiled { @@ -28,20 +28,20 @@ struct WasmModuleCompiled { bool success = false; size_t code_size_in_bytes = 0; size_t liftoff_bailout_count = 0; - int64_t wall_clock_time_in_us = 0; + int64_t wall_clock_time_in_us = -1; }; struct WasmModuleInstantiated { bool async = false; bool success = false; size_t imported_function_count = 0; - int64_t wall_clock_time_in_us = 0; + int64_t wall_clock_time_in_us = -1; }; struct WasmModuleTieredUp { bool lazy = false; size_t code_size_in_bytes = 0; - int64_t wall_clock_time_in_us = 0; + int64_t wall_clock_time_in_us = -1; }; struct WasmModulesPerIsolate { diff --git a/deps/v8/include/v8-platform.h b/deps/v8/include/v8-platform.h index aae381b080617f..7bb79a18414bec 100644 --- a/deps/v8/include/v8-platform.h +++ b/deps/v8/include/v8-platform.h @@ -175,9 +175,15 @@ class JobDelegate { * Returns a task_id unique among threads currently running this job, such * that GetTaskId() < worker count. To achieve this, the same task_id may be * reused by a different thread after a worker_task returns. + */ + virtual uint8_t GetTaskId() = 0; + + /** + * Returns true if the current task is called from the thread currently + * running JobHandle::Join(). * TODO(etiennep): Make pure virtual once custom embedders implement it. */ - virtual uint8_t GetTaskId() { return 0; } + virtual bool IsJoiningThread() const { return false; } }; /** @@ -212,9 +218,8 @@ class JobHandle { /** * Returns true if there's no work pending and no worker running. - * TODO(etiennep): Make pure virtual once custom embedders implement it. */ - virtual bool IsCompleted() { return true; } + virtual bool IsCompleted() = 0; /** * Returns true if associated with a Job and other methods may be called. @@ -233,23 +238,17 @@ class JobTask { virtual void Run(JobDelegate* delegate) = 0; /** - * Controls the maximum number of threads calling Run() concurrently. Run() is - * only invoked if the number of threads previously running Run() was less - * than the value returned. Since GetMaxConcurrency() is a leaf function, it - * must not call back any JobHandle methods. + * Controls the maximum number of threads calling Run() concurrently, given + * the number of threads currently assigned to this job and executing Run(). + * Run() is only invoked if the number of threads previously running Run() was + * less than the value returned. Since GetMaxConcurrency() is a leaf function, + * it must not call back any JobHandle methods. */ - virtual size_t GetMaxConcurrency() const = 0; + virtual size_t GetMaxConcurrency(size_t worker_count) const = 0; - /* - * Meant to replace the version above, given the number of threads currently - * assigned to this job and executing Run(). This is useful when the result - * must include local work items not visible globaly by other workers. - * TODO(etiennep): Replace the version above by this once custom embedders are - * migrated. - */ - size_t GetMaxConcurrency(size_t worker_count) const { - return GetMaxConcurrency(); - } + // TODO(1114823): Clean up once all overrides are removed. + V8_DEPRECATED("Use the version that takes |worker_count|.") + virtual size_t GetMaxConcurrency() const { return 0; } }; /** diff --git a/deps/v8/include/v8-profiler.h b/deps/v8/include/v8-profiler.h index c3b25e8d6a6302..7ec19937343e73 100644 --- a/deps/v8/include/v8-profiler.h +++ b/deps/v8/include/v8-profiler.h @@ -6,6 +6,7 @@ #define V8_V8_PROFILER_H_ #include + #include #include #include @@ -268,6 +269,8 @@ class V8_EXPORT CpuProfilingOptions { * interval, set via SetSamplingInterval(). If * zero, the sampling interval will be equal to * the profiler's sampling interval. + * \param filter_context Deprecated option to filter by context, currently a + * no-op. */ CpuProfilingOptions( CpuProfilingMode mode = kLeafNodeLineNumbers, @@ -281,13 +284,9 @@ class V8_EXPORT CpuProfilingOptions { private: friend class internal::CpuProfile; - bool has_filter_context() const { return !filter_context_.IsEmpty(); } - void* raw_filter_context() const; - CpuProfilingMode mode_; unsigned max_samples_; int sampling_interval_us_; - CopyablePersistentTraits::CopyablePersistent filter_context_; }; /** @@ -712,6 +711,19 @@ class V8_EXPORT EmbedderGraph { public: class Node { public: + /** + * Detachedness specifies whether an object is attached or detached from the + * main application state. While unkown in general, there may be objects + * that specifically know their state. V8 passes this information along in + * the snapshot. Users of the snapshot may use it to annotate the object + * graph. + */ + enum class Detachedness : uint8_t { + kUnknown = 0, + kAttached = 1, + kDetached = 2, + }; + Node() = default; virtual ~Node() = default; virtual const char* Name() = 0; @@ -736,6 +748,14 @@ class V8_EXPORT EmbedderGraph { */ virtual NativeObject GetNativeObject() { return nullptr; } + /** + * Detachedness state of a given object. While unkown in general, there may + * be objects that specifically know their state. V8 passes this information + * along in the snapshot. Users of the snapshot may use it to annotate the + * object graph. + */ + virtual Detachedness GetDetachedness() { return Detachedness::kUnknown; } + Node(const Node&) = delete; Node& operator=(const Node&) = delete; }; diff --git a/deps/v8/include/v8-version.h b/deps/v8/include/v8-version.h index 8060900855bcbc..f1728db8a68975 100644 --- a/deps/v8/include/v8-version.h +++ b/deps/v8/include/v8-version.h @@ -9,9 +9,9 @@ // NOTE these macros are used by some of the tool scripts and the build // system so their names cannot be changed without changing the scripts. #define V8_MAJOR_VERSION 8 -#define V8_MINOR_VERSION 6 -#define V8_BUILD_NUMBER 395 -#define V8_PATCH_LEVEL 17 +#define V8_MINOR_VERSION 7 +#define V8_BUILD_NUMBER 220 +#define V8_PATCH_LEVEL 26 // Use 1 for candidates and 0 otherwise. // (Boolean macro values are not supported by all preprocessors.) diff --git a/deps/v8/include/v8.h b/deps/v8/include/v8.h index 261d3b3f06064d..32687d90b5f96f 100644 --- a/deps/v8/include/v8.h +++ b/deps/v8/include/v8.h @@ -19,6 +19,7 @@ #include #include +#include #include #include #include @@ -1318,6 +1319,32 @@ class V8_EXPORT SealHandleScope { * The superclass of objects that can reside on V8's heap. */ class V8_EXPORT Data { + public: + /** + * Returns true if this data is a |v8::Value|. + */ + bool IsValue() const; + + /** + * Returns true if this data is a |v8::Module|. + */ + bool IsModule() const; + + /** + * Returns true if this data is a |v8::Private|. + */ + bool IsPrivate() const; + + /** + * Returns true if this data is a |v8::ObjectTemplate|. + */ + bool IsObjectTemplate() const; + + /** + * Returns true if this data is a |v8::FunctionTemplate|. + */ + bool IsFunctionTemplate() const; + private: Data(); }; @@ -1629,6 +1656,11 @@ class V8_EXPORT Module : public Data { "the latter will crash with a failed CHECK().") void SetSyntheticModuleExport(Local export_name, Local export_value); + + V8_INLINE static Module* Cast(Data* data); + + private: + static void CheckCast(Data* obj); }; /** @@ -1802,11 +1834,9 @@ class V8_EXPORT ScriptCompiler { public: enum Encoding { ONE_BYTE, TWO_BYTE, UTF8 }; -#if defined(_MSC_VER) && _MSC_VER >= 1910 /* Disable on VS2015 */ V8_DEPRECATE_SOON( "This class takes ownership of source_stream, so use the constructor " "taking a unique_ptr to make these semantics clearer") -#endif StreamedSource(ExternalSourceStream* source_stream, Encoding encoding); StreamedSource(std::unique_ptr source_stream, Encoding encoding); @@ -2262,14 +2292,6 @@ struct JSEntryStub { MemoryRange code; }; -struct UnwindState { - MemoryRange code_range; - MemoryRange embedded_code_range; - JSEntryStub js_entry_stub; - JSEntryStub js_construct_entry_stub; - JSEntryStub js_run_microtasks_entry_stub; -}; - struct JSEntryStubs { JSEntryStub js_entry_stub; JSEntryStub js_construct_entry_stub; @@ -2934,6 +2956,8 @@ class V8_EXPORT Value : public Data { bool FullIsUndefined() const; bool FullIsNull() const; bool FullIsString() const; + + static void CheckCast(Data* that); }; @@ -3089,10 +3113,18 @@ class V8_EXPORT String : public Name { V8_INLINE static Local Empty(Isolate* isolate); /** - * Returns true if the string is external + * Returns true if the string is external two-byte. + * */ + V8_DEPRECATE_SOON( + "Use String::IsExternalTwoByte() or String::IsExternalOneByte()") bool IsExternal() const; + /** + * Returns true if the string is both external and two-byte. + */ + bool IsExternalTwoByte() const; + /** * Returns true if the string is both external and one-byte. */ @@ -5020,13 +5052,6 @@ class V8_EXPORT BackingStore : public v8::internal::BackingStoreBase { */ bool IsShared() const; - /** - * Prevent implicit instantiation of operator delete with size_t argument. - * The size_t argument would be incorrect because ptr points to the - * internal BackingStore object. - */ - void operator delete(void* ptr) { ::operator delete(ptr); } - /** * Wrapper around ArrayBuffer::Allocator::Reallocate that preserves IsShared. * Assumes that the backing_store was allocated by the ArrayBuffer allocator @@ -7348,6 +7373,7 @@ class PromiseRejectMessage { typedef void (*PromiseRejectCallback)(PromiseRejectMessage message); // --- Microtasks Callbacks --- +V8_DEPRECATE_SOON("Use *WithData version.") typedef void (*MicrotasksCompletedCallback)(Isolate*); typedef void (*MicrotasksCompletedCallbackWithData)(Isolate*, void*); typedef void (*MicrotaskCallback)(void* data); @@ -9333,13 +9359,6 @@ class V8_EXPORT Isolate { */ void GetCodeRange(void** start, size_t* length_in_bytes); - /** - * Returns the UnwindState necessary for use with the Unwinder API. - */ - // TODO(petermarshall): Remove this API. - V8_DEPRECATED("Use entry_stubs + code_pages version.") - UnwindState GetUnwindState(); - /** * Returns the JSEntryStubs necessary for use with the Unwinder API. */ @@ -10697,12 +10716,14 @@ class V8_EXPORT Unwinder { * * The unwinder also needs the virtual memory range of all possible V8 code * objects. There are two ranges required - the heap code range and the range - * for code embedded in the binary. The V8 API provides all required inputs - * via an UnwindState object through the Isolate::GetUnwindState() API. These - * values will not change after Isolate initialization, so the same - * |unwind_state| can be used for multiple calls. + * for code embedded in the binary. + * + * Available on x64, ARM64 and ARM32. * - * \param unwind_state Input state for the Isolate that the stack comes from. + * \param code_pages A list of all of the ranges in which V8 has allocated + * executable code. The caller should obtain this list by calling + * Isolate::CopyCodePages() during the same interrupt/thread suspension that + * captures the stack. * \param register_state The current registers. This is an in-out param that * will be overwritten with the register values after unwinding, on success. * \param stack_base The resulting stack pointer and frame pointer values are @@ -10713,20 +10734,6 @@ class V8_EXPORT Unwinder { * * \return True on success. */ - // TODO(petermarshall): Remove this API - V8_DEPRECATED("Use entry_stubs + code_pages version.") - static bool TryUnwindV8Frames(const UnwindState& unwind_state, - RegisterState* register_state, - const void* stack_base); - - /** - * The same as above, but is available on x64, ARM64 and ARM32. - * - * \param code_pages A list of all of the ranges in which V8 has allocated - * executable code. The caller should obtain this list by calling - * Isolate::CopyCodePages() during the same interrupt/thread suspension that - * captures the stack. - */ static bool TryUnwindV8Frames(const JSEntryStubs& entry_stubs, size_t code_pages_length, const MemoryRange* code_pages, @@ -10734,20 +10741,13 @@ class V8_EXPORT Unwinder { const void* stack_base); /** - * Whether the PC is within the V8 code range represented by code_range or - * embedded_code_range in |unwind_state|. + * Whether the PC is within the V8 code range represented by code_pages. * * If this returns false, then calling UnwindV8Frames() with the same PC * and unwind_state will always fail. If it returns true, then unwinding may * (but not necessarily) be successful. - */ - // TODO(petermarshall): Remove this API - V8_DEPRECATED("Use code_pages version.") - static bool PCIsInV8(const UnwindState& unwind_state, void* pc); - - /** - * The same as above, but is available on x64, ARM64 and ARM32. See the - * comment on TryUnwindV8Frames. + * + * Available on x64, ARM64 and ARM32 */ static bool PCIsInV8(size_t code_pages_length, const MemoryRange* code_pages, void* pc); @@ -11586,6 +11586,13 @@ template Value* Value::Cast(T* value) { return static_cast(value); } +template <> +V8_INLINE Value* Value::Cast(Data* value) { +#ifdef V8_ENABLE_CHECKS + CheckCast(value); +#endif + return static_cast(value); +} Boolean* Boolean::Cast(v8::Value* value) { #ifdef V8_ENABLE_CHECKS @@ -11618,6 +11625,12 @@ Private* Private::Cast(Data* data) { return reinterpret_cast(data); } +Module* Module::Cast(Data* data) { +#ifdef V8_ENABLE_CHECKS + CheckCast(data); +#endif + return reinterpret_cast(data); +} Number* Number::Cast(v8::Value* value) { #ifdef V8_ENABLE_CHECKS diff --git a/deps/v8/include/v8config.h b/deps/v8/include/v8config.h index bbd1d6ce978e6c..a047874c4064f6 100644 --- a/deps/v8/include/v8config.h +++ b/deps/v8/include/v8config.h @@ -70,6 +70,7 @@ // V8_OS_POSIX - POSIX compatible (mostly everything except Windows) // V8_OS_QNX - QNX Neutrino // V8_OS_SOLARIS - Sun Solaris and OpenSolaris +// V8_OS_STARBOARD - Starboard (platform abstraction for Cobalt) // V8_OS_AIX - AIX // V8_OS_WIN - Microsoft Windows @@ -93,6 +94,8 @@ #elif defined(__sun) # define V8_OS_POSIX 1 # define V8_OS_SOLARIS 1 +#elif defined(STARBOARD) +# define V8_OS_STARBOARD 1 #elif defined(_AIX) #define V8_OS_POSIX 1 #define V8_OS_AIX 1 @@ -479,6 +482,15 @@ V8 shared library set USING_V8_SHARED. #endif // V8_OS_WIN +// Support for floating point parameters in calls to C. +// It's currently enabled only for the platforms listed below. We don't plan +// to add support for IA32, because it has a totally different approach +// (using FP stack). As support is added to more platforms, please make sure +// to list them here in order to enable tests of this functionality. +#if defined(V8_TARGET_ARCH_X64) +#define V8_ENABLE_FP_PARAMS_IN_C_LINKAGE +#endif + // clang-format on #endif // V8CONFIG_H_ diff --git a/deps/v8/infra/mb/mb_config.pyl b/deps/v8/infra/mb/mb_config.pyl index e385083aef8fcd..7d5cc73026c277 100644 --- a/deps/v8/infra/mb/mb_config.pyl +++ b/deps/v8/infra/mb/mb_config.pyl @@ -75,9 +75,13 @@ 'V8 Mac64 - debug': 'debug_x64', 'V8 Mac64 GC Stress': 'debug_x64', 'V8 Mac64 ASAN': 'release_x64_asan_no_lsan', + 'V8 Mac - arm64 - release builder': 'release_arm64', + 'V8 Mac - arm64 - sim - debug builder': 'debug_simulate_arm64', + 'V8 Mac - arm64 - sim - release builder': 'release_simulate_arm64', # Sanitizers. 'V8 Linux64 ASAN': 'release_x64_asan', 'V8 Linux64 TSAN - builder': 'release_x64_tsan', + 'V8 Linux64 TSAN - no-concurrent-marking - builder': 'release_x64_tsan_no_cm', 'V8 Linux - arm64 - sim - CFI': 'release_simulate_arm64_cfi', 'V8 Linux - arm64 - sim - MSAN': 'release_simulate_arm64_msan', # Misc. @@ -236,6 +240,7 @@ 'v8_linux64_fuzzilli_ng': 'release_x64_fuzzilli', 'v8_linux64_msan_rel_ng': 'release_simulate_arm64_msan_minimal_symbols', 'v8_linux64_tsan_rel_ng': 'release_x64_tsan_minimal_symbols', + 'v8_linux64_tsan_no_cm_rel_ng': 'release_x64_tsan_no_cm', 'v8_linux64_tsan_isolates_rel_ng': 'release_x64_tsan_minimal_symbols', 'v8_linux64_ubsan_rel_ng': 'release_x64_ubsan_minimal_symbols', @@ -253,6 +258,9 @@ 'v8_mac_arm64_rel_ng': 'release_arm64', 'v8_mac_arm64_dbg_ng': 'debug_arm64', 'v8_mac_arm64_full_dbg_ng': 'full_debug_arm64', + 'v8_mac_arm64_sim_rel_ng': 'release_simulate_arm64_trybot', + 'v8_mac_arm64_sim_dbg_ng': 'debug_simulate_arm64', + 'v8_mac_arm64_sim_nodcheck_rel_ng': 'release_simulate_arm64', 'v8_mac64_gc_stress_dbg_ng': 'debug_x64_trybot', 'v8_mac64_rel_ng': 'release_x64_trybot', 'v8_mac64_dbg': 'debug_x64', @@ -424,15 +432,15 @@ # Official configs for arm 'official_arm': [ - 'release_bot', 'arm', 'hard_float', 'official'], + 'release_bot', 'arm', 'hard_float', 'official', 'disable_pgo'], 'official_arm64': [ - 'release_bot', 'arm64', 'hard_float', 'official'], + 'release_bot', 'arm64', 'hard_float', 'official', 'disable_pgo'], 'official_android_arm': [ 'release_bot', 'arm', 'android', 'minimal_symbols', - 'android_strip_outputs', 'official'], + 'android_strip_outputs', 'official', 'disable_pgo'], 'official_android_arm64': [ 'release_bot', 'arm64', 'android', 'minimal_symbols', - 'android_strip_outputs', 'official'], + 'android_strip_outputs', 'official', 'disable_pgo'], # Release configs for x64. 'release_x64': [ @@ -488,6 +496,8 @@ 'release_trybot', 'x64', 'v8_enable_test_features'], 'release_x64_tsan': [ 'release_bot', 'x64', 'tsan'], + 'release_x64_tsan_no_cm': [ + 'release_bot', 'x64', 'tsan', 'disable_concurrent_marking'], 'release_x64_tsan_minimal_symbols': [ 'release_bot', 'x64', 'tsan', 'minimal_symbols'], 'release_x64_ubsan': [ @@ -504,7 +514,7 @@ # Official configs for x64. 'official_x64': [ - 'release_bot', 'x64', 'official'], + 'release_bot', 'x64', 'official', 'disable_pgo'], # Debug configs for x64. 'debug_x64': [ @@ -577,7 +587,7 @@ # Official configs for x86. 'official_x86': [ - 'release_bot', 'x86', 'official'], + 'release_bot', 'x86', 'official', 'disable_pgo'], # Torque compare test 'torque_compare': [ @@ -586,7 +596,7 @@ 'mixins': { 'android': { - 'gn_args': 'target_os="android" v8_android_log_stdout=true', + 'gn_args': 'target_os="android" v8_android_log_stdout=true default_min_sdk_version=19', }, 'android_strip_outputs': { @@ -650,6 +660,14 @@ 'mixins': ['debug_bot', 'minimal_symbols'], }, + 'disable_concurrent_marking': { + 'gn_args': 'v8_enable_concurrent_marking=false', + }, + + 'disable_pgo': { + 'gn_args': 'chrome_pgo_phase=0', + }, + 'fuchsia': { 'gn_args': 'target_os="fuchsia"', }, diff --git a/deps/v8/infra/testing/PRESUBMIT.py b/deps/v8/infra/testing/PRESUBMIT.py index c701f02e56ecce..178ba9f707c011 100644 --- a/deps/v8/infra/testing/PRESUBMIT.py +++ b/deps/v8/infra/testing/PRESUBMIT.py @@ -30,6 +30,7 @@ 'device_os', 'device_type', 'os', + 'pool', ] # This is not an exhaustive list. It only reflects what we currently use. If @@ -121,9 +122,9 @@ def _check_test(error_msg, test): if not all(isinstance(x, basestring) for x in test_args): errors += error_msg('If specified, all test_args must be strings') - # Limit shards to 12 to avoid erroneous resource exhaustion. + # Limit shards to 14 to avoid erroneous resource exhaustion. errors += _check_int_range( - error_msg, test, 'shards', lower_bound=1, upper_bound=12) + error_msg, test, 'shards', lower_bound=1, upper_bound=14) variant = test.get('variant', 'default') if not variant or not isinstance(variant, basestring): diff --git a/deps/v8/infra/testing/builders.pyl b/deps/v8/infra/testing/builders.pyl index d652fdbdbfde00..c5ee5e496f45cd 100644 --- a/deps/v8/infra/testing/builders.pyl +++ b/deps/v8/infra/testing/builders.pyl @@ -258,6 +258,7 @@ {'name': 'test262', 'shards': 7}, {'name': 'v8testing', 'shards': 3}, {'name': 'v8testing', 'variant': 'extra', 'shards': 3}, + {'name': 'v8testing', 'variant': 'no_local_heaps'}, {'name': 'v8testing', 'variant': 'slow_path'}, ], }, @@ -330,7 +331,7 @@ {'name': 'v8testing', 'variant': 'infra_staging', 'shards': 2}, # Native context independent code. {'name': 'v8testing', 'variant': 'nci'}, - {'name': 'v8testing', 'variant': 'nci_as_highest_tier'}, + {'name': 'v8testing', 'variant': 'nci_as_midtier'}, # Stress sampling. {'name': 'mjsunit', 'variant': 'stress_sampling'}, {'name': 'webkit', 'variant': 'stress_sampling'}, @@ -420,9 +421,27 @@ {'name': 'test262', 'variant': 'default', 'shards': 3}, {'name': 'v8testing', 'shards': 5}, {'name': 'v8testing', 'variant': 'extra', 'shards': 3}, + {'name': 'v8testing', 'variant': 'no_local_heaps'}, {'name': 'v8testing', 'variant': 'slow_path'}, ], }, + 'v8_linux64_tsan_no_cm_rel_ng_triggered': { + 'swarming_dimensions' : { + 'os': 'Ubuntu-16.04', + }, + 'tests': [ + { + 'name': 'v8testing', + 'shards': 6, + }, + { + 'name': 'v8testing', + 'suffix': 'future', + 'test_args': ['--extra-flags=--future'], + 'shards': 6, + }, + ], + }, 'v8_linux64_tsan_isolates_rel_ng_triggered': { 'swarming_dimensions' : { 'os': 'Ubuntu-16.04', @@ -457,8 +476,8 @@ {'name': 'mjsunit_sp_frame_access'}, {'name': 'mozilla', 'shards': 4}, {'name': 'test262', 'variant': 'default', 'shards': 4}, - {'name': 'v8testing', 'shards': 12}, - {'name': 'v8testing', 'variant': 'extra', 'shards': 8}, + {'name': 'v8testing', 'shards': 14}, + {'name': 'v8testing', 'variant': 'extra', 'shards': 10}, {'name': 'v8testing', 'variant': 'trusted', 'shards': 5}, ], }, @@ -478,7 +497,7 @@ {'name': 'mjsunit_sp_frame_access', 'shards': 4}, {'name': 'mozilla', 'shards': 4}, {'name': 'test262', 'variant': 'default', 'shards': 4}, - {'name': 'v8testing', 'shards': 12}, + {'name': 'v8testing', 'shards': 14}, {'name': 'v8testing', 'variant': 'extra', 'shards': 10}, {'name': 'v8testing', 'variant': 'trusted', 'shards': 5}, ], @@ -632,32 +651,59 @@ }, 'v8_mac_arm64_rel_ng_triggered': { 'swarming_dimensions' : { - 'cpu': 'x86-64', - 'os': 'Mac-10.13', + 'cpu': 'arm64', + 'os': 'Mac-11', + 'pool': 'chromium.tests.mac-arm64', }, 'tests': [ {'name': 'v8testing'}, - {'name': 'test262'}, ], }, 'v8_mac_arm64_dbg_ng_triggered': { 'swarming_dimensions' : { - 'cpu': 'x86-64', - 'os': 'Mac-10.13', + 'cpu': 'arm64', + 'os': 'Mac-11', + 'pool': 'chromium.tests.mac-arm64', }, 'tests': [ {'name': 'v8testing'}, - {'name': 'test262'}, ], }, 'v8_mac_arm64_full_dbg_ng_triggered': { + 'swarming_dimensions' : { + 'cpu': 'arm64', + 'os': 'Mac-11', + 'pool': 'chromium.tests.mac-arm64', + }, + 'tests': [ + {'name': 'v8testing'}, + ], + }, + 'v8_mac_arm64_sim_rel_ng_triggered': { 'swarming_dimensions' : { 'cpu': 'x86-64', 'os': 'Mac-10.13', }, 'tests': [ - {'name': 'v8testing'}, - {'name': 'test262'}, + {'name': 'v8testing', 'shards': 8}, + ], + }, + 'v8_mac_arm64_sim_dbg_ng_triggered': { + 'swarming_dimensions' : { + 'cpu': 'x86-64', + 'os': 'Mac-10.13', + }, + 'tests': [ + {'name': 'v8testing', 'shards': 8}, + ], + }, + 'v8_mac_arm64_sim_nodcheck_rel_ng_triggered': { + 'swarming_dimensions' : { + 'cpu': 'x86-64', + 'os': 'Mac-10.13', + }, + 'tests': [ + {'name': 'v8testing', 'shards': 8}, ], }, ############################################################################## @@ -993,7 +1039,7 @@ {'name': 'v8testing', 'variant': 'infra_staging', 'shards': 2}, # Native context independent code. {'name': 'v8testing', 'variant': 'nci'}, - {'name': 'v8testing', 'variant': 'nci_as_highest_tier'}, + {'name': 'v8testing', 'variant': 'nci_as_midtier'}, # Stress sampling. {'name': 'mjsunit', 'variant': 'stress_sampling'}, {'name': 'webkit', 'variant': 'stress_sampling'}, @@ -1025,7 +1071,7 @@ {'name': 'v8testing', 'variant': 'infra_staging'}, # Native context independent code. {'name': 'v8testing', 'variant': 'nci'}, - {'name': 'v8testing', 'variant': 'nci_as_highest_tier'}, + {'name': 'v8testing', 'variant': 'nci_as_midtier'}, # Stress sampling. {'name': 'mjsunit', 'variant': 'stress_sampling'}, {'name': 'webkit', 'variant': 'stress_sampling'}, @@ -1094,6 +1140,7 @@ {'name': 'test262', 'shards': 5}, {'name': 'v8testing', 'shards': 2}, {'name': 'v8testing', 'variant': 'extra', 'shards': 2}, + {'name': 'v8testing', 'variant': 'no_local_heaps', 'shards': 1}, {'name': 'v8testing', 'variant': 'slow_path', 'shards': 1}, ], }, @@ -1119,6 +1166,7 @@ {'name': 'test262', 'variant': 'default', 'shards': 3}, {'name': 'v8testing', 'shards': 5}, {'name': 'v8testing', 'variant': 'extra', 'shards': 3}, + {'name': 'v8testing', 'variant': 'no_local_heaps', 'shards': 1}, {'name': 'v8testing', 'variant': 'slow_path', 'shards': 1}, ], }, @@ -1161,6 +1209,23 @@ {'name': 'v8testing', 'test_args': ['--isolates'], 'shards': 7}, ], }, + 'V8 Linux64 TSAN - no-concurrent-marking': { + 'swarming_dimensions' : { + 'os': 'Ubuntu-16.04', + }, + 'tests': [ + { + 'name': 'v8testing', + 'shards': 6, + }, + { + 'name': 'v8testing', + 'suffix': 'future', + 'test_args': ['--extra-flags=--future'], + 'shards': 6, + }, + ], + }, 'V8 Linux64 UBSan': { 'swarming_dimensions' : { 'os': 'Ubuntu-16.04', @@ -1214,6 +1279,50 @@ {'name': 'd8testing', 'test_args': ['--gc-stress'], 'shards': 4}, ], }, + 'V8 Mac - arm64 - release': { + 'swarming_dimensions' : { + 'os': 'Mac-11', + 'cpu': 'arm64', + 'pool': 'chromium.tests.mac-arm64', + }, + 'swarming_task_attrs': { + 'expiration': 14400, + 'hard_timeout': 3600, + 'priority': 35, + }, + 'tests': [ + {'name': 'd8testing'}, + {'name': 'd8testing', 'variant': 'extra'}, + ], + }, + 'V8 Mac - arm64 - sim - debug': { + 'swarming_dimensions' : { + 'cpu': 'x86-64', + 'os': 'Mac-10.13', + }, + 'swarming_task_attrs': { + 'expiration': 14400, + 'hard_timeout': 3600, + 'priority': 35, + }, + 'tests': [ + {'name': 'v8testing', 'shards': 8}, + ], + }, + 'V8 Mac - arm64 - sim - release': { + 'swarming_dimensions' : { + 'cpu': 'x86-64', + 'os': 'Mac-10.13', + }, + 'swarming_task_attrs': { + 'expiration': 14400, + 'hard_timeout': 3600, + 'priority': 35, + }, + 'tests': [ + {'name': 'v8testing', 'shards': 8}, + ], + }, 'V8 Win32': { 'swarming_dimensions': { 'cpu': 'x86-64', @@ -1511,8 +1620,8 @@ {'name': 'mjsunit_sp_frame_access'}, {'name': 'mozilla', 'shards': 2}, {'name': 'test262', 'variant': 'default', 'shards': 2}, - {'name': 'v8testing', 'shards': 10}, - {'name': 'v8testing', 'variant': 'extra', 'shards': 6}, + {'name': 'v8testing', 'shards': 12}, + {'name': 'v8testing', 'variant': 'extra', 'shards': 9}, {'name': 'v8testing', 'variant': 'trusted', 'shards': 2}, ], }, diff --git a/deps/v8/samples/process.cc b/deps/v8/samples/process.cc index b23329dc107f12..dec0d570311f15 100644 --- a/deps/v8/samples/process.cc +++ b/deps/v8/samples/process.cc @@ -183,7 +183,7 @@ bool JsHttpRequestProcessor::Initialize(map* opts, // Create a template for the global object where we set the // built-in global functions. Local global = ObjectTemplate::New(GetIsolate()); - global->Set(String::NewFromUtf8Literal(GetIsolate(), "log"), + global->Set(GetIsolate(), "log", FunctionTemplate::New(GetIsolate(), LogCallback)); // Each processor gets its own context so different processors don't diff --git a/deps/v8/src/DEPS b/deps/v8/src/DEPS index 6b4b6661bd3690..e10d171f260d36 100644 --- a/deps/v8/src/DEPS +++ b/deps/v8/src/DEPS @@ -28,6 +28,8 @@ include_rules = [ "+src/heap/read-only-heap-inl.h", "+src/heap/read-only-heap.h", "+src/heap/safepoint.h", + "+src/heap/base/stack.h", + "+src/heap/conservative-stack-visitor.h", "-src/inspector", "-src/interpreter", "+src/interpreter/bytecode-array-accessor.h", @@ -52,7 +54,8 @@ include_rules = [ "-src/libplatform", "-include/libplatform", "+builtins-generated", - "+torque-generated" + "+torque-generated", + "+starboard", ] specific_include_rules = { diff --git a/deps/v8/src/api/api.cc b/deps/v8/src/api/api.cc index 9f0f6673d65781..b49ad728a8e4d5 100644 --- a/deps/v8/src/api/api.cc +++ b/deps/v8/src/api/api.cc @@ -786,7 +786,7 @@ StartupData SnapshotCreator::CreateBlob( i::Snapshot::ClearReconstructableDataForSerialization( isolate, function_code_handling == FunctionCodeHandling::kClear); - i::DisallowHeapAllocation no_gc_from_here_on; + i::DisallowGarbageCollection no_gc_from_here_on; // Create a vector with all contexts and clear associated Persistent fields. // Note these contexts may be dead after calling Clear(), but will not be @@ -1192,6 +1192,34 @@ void* SealHandleScope::operator new[](size_t) { base::OS::Abort(); } void SealHandleScope::operator delete(void*, size_t) { base::OS::Abort(); } void SealHandleScope::operator delete[](void*, size_t) { base::OS::Abort(); } +bool Data::IsModule() const { return Utils::OpenHandle(this)->IsModule(); } + +bool Data::IsValue() const { + i::DisallowHeapAllocation no_gc; + i::Handle self = Utils::OpenHandle(this); + if (self->IsSmi()) { + return true; + } + i::HeapObject heap_object = i::HeapObject::cast(*self); + DCHECK(!heap_object.IsTheHole()); + if (heap_object.IsSymbol()) { + return !i::Symbol::cast(heap_object).is_private(); + } + return heap_object.IsPrimitiveHeapObject() || heap_object.IsJSReceiver(); +} + +bool Data::IsPrivate() const { + return Utils::OpenHandle(this)->IsPrivateSymbol(); +} + +bool Data::IsObjectTemplate() const { + return Utils::OpenHandle(this)->IsObjectTemplateInfo(); +} + +bool Data::IsFunctionTemplate() const { + return Utils::OpenHandle(this)->IsFunctionTemplateInfo(); +} + void Context::Enter() { i::Handle env = Utils::OpenHandle(this); i::Isolate* isolate = env->GetIsolate(); @@ -3394,7 +3422,9 @@ bool Value::FullIsString() const { return result; } -bool Value::IsSymbol() const { return Utils::OpenHandle(this)->IsSymbol(); } +bool Value::IsSymbol() const { + return Utils::OpenHandle(this)->IsPublicSymbol(); +} bool Value::IsArray() const { return Utils::OpenHandle(this)->IsJSArray(); } @@ -3649,6 +3679,10 @@ void i::Internals::CheckInitializedImpl(v8::Isolate* external_isolate) { "Isolate is not initialized or V8 has died"); } +void v8::Value::CheckCast(Data* that) { + Utils::ApiCheck(that->IsValue(), "v8::Value::Cast", "Data is not a Value"); +} + void External::CheckCast(v8::Value* that) { Utils::ApiCheck(that->IsExternal(), "v8::External::Cast", "Value is not an External"); @@ -3694,6 +3728,11 @@ void v8::Private::CheckCast(v8::Data* that) { "v8::Private::Cast", "Value is not a Private"); } +void v8::Module::CheckCast(v8::Data* that) { + i::Handle obj = Utils::OpenHandle(that); + Utils::ApiCheck(obj->IsModule(), "v8::Module::Cast", "Value is not a Module"); +} + void v8::Number::CheckCast(v8::Value* that) { i::Handle obj = Utils::OpenHandle(that); Utils::ApiCheck(obj->IsNumber(), "v8::Number::Cast()", @@ -5421,6 +5460,10 @@ int String::Write(Isolate* isolate, uint16_t* buffer, int start, int length, } bool v8::String::IsExternal() const { + return IsExternalTwoByte(); +} + +bool v8::String::IsExternalTwoByte() const { i::Handle str = Utils::OpenHandle(this); return i::StringShape(*str).IsExternalTwoByte(); } @@ -8500,21 +8543,34 @@ void Isolate::GetHeapStatistics(HeapStatistics* heap_statistics) { i::Isolate* isolate = reinterpret_cast(this); i::Heap* heap = isolate->heap(); - heap_statistics->total_heap_size_ = heap->CommittedMemory(); + // The order of acquiring memory statistics is important here. We query in + // this order because of concurrent allocation: 1) used memory 2) comitted + // physical memory 3) committed memory. Therefore the condition used <= + // committed physical <= committed should hold. + heap_statistics->used_global_handles_size_ = heap->UsedGlobalHandlesSize(); + heap_statistics->total_global_handles_size_ = heap->TotalGlobalHandlesSize(); + DCHECK_LE(heap_statistics->used_global_handles_size_, + heap_statistics->total_global_handles_size_); + + heap_statistics->used_heap_size_ = heap->SizeOfObjects(); heap_statistics->total_physical_size_ = heap->CommittedPhysicalMemory(); + heap_statistics->total_heap_size_ = heap->CommittedMemory(); + heap_statistics->total_available_size_ = heap->Available(); - heap_statistics->used_heap_size_ = heap->SizeOfObjects(); - heap_statistics->total_global_handles_size_ = heap->TotalGlobalHandlesSize(); - heap_statistics->used_global_handles_size_ = heap->UsedGlobalHandlesSize(); if (!i::ReadOnlyHeap::IsReadOnlySpaceShared()) { i::ReadOnlySpace* ro_space = heap->read_only_space(); - heap_statistics->total_heap_size_ += ro_space->CommittedMemory(); + heap_statistics->used_heap_size_ += ro_space->Size(); heap_statistics->total_physical_size_ += ro_space->CommittedPhysicalMemory(); - heap_statistics->used_heap_size_ += ro_space->Size(); + heap_statistics->total_heap_size_ += ro_space->CommittedMemory(); } + // TODO(dinfuehr): Right now used <= committed physical does not hold. Fix + // this and add DCHECK. + DCHECK_LE(heap_statistics->used_heap_size_, + heap_statistics->total_heap_size_); + heap_statistics->total_heap_size_executable_ = heap->CommittedMemoryExecutable(); heap_statistics->heap_size_limit_ = heap->MaxReserved(); @@ -8933,33 +8989,6 @@ void Isolate::GetCodeRange(void** start, size_t* length_in_bytes) { *length_in_bytes = code_range.size(); } -UnwindState Isolate::GetUnwindState() { - UnwindState unwind_state; - void* code_range_start; - GetCodeRange(&code_range_start, &unwind_state.code_range.length_in_bytes); - unwind_state.code_range.start = code_range_start; - - i::Isolate* isolate = reinterpret_cast(this); - unwind_state.embedded_code_range.start = - reinterpret_cast(isolate->embedded_blob_code()); - unwind_state.embedded_code_range.length_in_bytes = - isolate->embedded_blob_code_size(); - - std::array, 3> entry_stubs = { - {{i::Builtins::kJSEntry, &unwind_state.js_entry_stub}, - {i::Builtins::kJSConstructEntry, &unwind_state.js_construct_entry_stub}, - {i::Builtins::kJSRunMicrotasksEntry, - &unwind_state.js_run_microtasks_entry_stub}}}; - for (auto& pair : entry_stubs) { - i::Code js_entry = isolate->heap()->builtin(pair.first); - pair.second->code.start = - reinterpret_cast(js_entry.InstructionStart()); - pair.second->code.length_in_bytes = js_entry.InstructionSize(); - } - - return unwind_state; -} - JSEntryStubs Isolate::GetJSEntryStubs() { JSEntryStubs entry_stubs; @@ -10103,9 +10132,8 @@ debug::ConsoleCallArguments::ConsoleCallArguments( args.length() > 1 ? args.address_of_first_argument() : nullptr, args.length() - 1) {} -int debug::GetStackFrameId(v8::Local frame) { - return Utils::OpenHandle(*frame)->id(); -} +// Marked V8_DEPRECATED. +int debug::GetStackFrameId(v8::Local frame) { return 0; } v8::Local debug::GetDetailedStackTrace( Isolate* v8_isolate, v8::Local v8_error) { @@ -10216,6 +10244,14 @@ int64_t debug::GetNextRandomInt64(v8::Isolate* v8_isolate) { ->NextInt64(); } +void debug::EnumerateRuntimeCallCounters(v8::Isolate* v8_isolate, + RuntimeCallCounterCallback callback) { + i::Isolate* isolate = reinterpret_cast(v8_isolate); + if (isolate->counters()) { + isolate->counters()->runtime_call_stats()->EnumerateCounters(callback); + } +} + int debug::GetDebuggingId(v8::Local function) { i::Handle callable = v8::Utils::OpenHandle(*function); if (!callable->IsJSFunction()) return i::DebugInfo::kNoDebuggingId; @@ -10633,20 +10669,7 @@ CpuProfilingOptions::CpuProfilingOptions(CpuProfilingMode mode, MaybeLocal filter_context) : mode_(mode), max_samples_(max_samples), - sampling_interval_us_(sampling_interval_us) { - if (!filter_context.IsEmpty()) { - Local local_filter_context = filter_context.ToLocalChecked(); - filter_context_.Reset(local_filter_context->GetIsolate(), - local_filter_context); - } -} - -void* CpuProfilingOptions::raw_filter_context() const { - return reinterpret_cast( - i::Context::cast(*Utils::OpenPersistent(filter_context_)) - .native_context() - .address()); -} + sampling_interval_us_(sampling_interval_us) {} void CpuProfiler::Dispose() { delete reinterpret_cast(this); } @@ -10847,8 +10870,7 @@ static i::HeapSnapshot* ToInternal(const HeapSnapshot* snapshot) { void HeapSnapshot::Delete() { i::Isolate* isolate = ToInternal(this)->profiler()->isolate(); - if (isolate->heap_profiler()->GetSnapshotsCount() > 1 || - isolate->heap_profiler()->IsTakingSnapshot()) { + if (isolate->heap_profiler()->GetSnapshotsCount() > 1) { ToInternal(this)->Delete(); } else { // If this is the last snapshot, clean up all accessory data as well. diff --git a/deps/v8/src/asmjs/asm-js.cc b/deps/v8/src/asmjs/asm-js.cc index ce9f653ee3b162..2553ecb91927ba 100644 --- a/deps/v8/src/asmjs/asm-js.cc +++ b/deps/v8/src/asmjs/asm-js.cc @@ -297,7 +297,7 @@ inline bool IsValidAsmjsMemorySize(size_t size) { // Enforce asm.js spec minimum size. if (size < (1u << 12u)) return false; // Enforce engine-limited and flag-limited maximum allocation size. - if (size > wasm::max_initial_mem_pages() * uint64_t{wasm::kWasmPageSize}) { + if (size > wasm::max_mem_pages() * uint64_t{wasm::kWasmPageSize}) { return false; } // Enforce power-of-2 sizes for 2^12 - 2^24. diff --git a/deps/v8/src/asmjs/asm-parser.cc b/deps/v8/src/asmjs/asm-parser.cc index 559c6b12d0b618..42179bace1cc45 100644 --- a/deps/v8/src/asmjs/asm-parser.cc +++ b/deps/v8/src/asmjs/asm-parser.cc @@ -273,14 +273,14 @@ void AsmJsParser::SkipSemicolon() { void AsmJsParser::Begin(AsmJsScanner::token_t label) { BareBegin(BlockKind::kRegular, label); - current_function_builder_->EmitWithU8(kExprBlock, kLocalVoid); + current_function_builder_->EmitWithU8(kExprBlock, kVoidCode); } void AsmJsParser::Loop(AsmJsScanner::token_t label) { BareBegin(BlockKind::kLoop, label); size_t position = scanner_.Position(); current_function_builder_->AddAsmWasmOffset(position, position); - current_function_builder_->EmitWithU8(kExprLoop, kLocalVoid); + current_function_builder_->EmitWithU8(kExprLoop, kVoidCode); } void AsmJsParser::End() { @@ -459,9 +459,15 @@ void AsmJsParser::ValidateModuleVar(bool mutable_variable) { if (uvalue > 0x7FFFFFFF) { FAIL("Numeric literal out of range"); } - DeclareGlobal(info, mutable_variable, - mutable_variable ? AsmType::Int() : AsmType::Signed(), - kWasmI32, WasmInitExpr(-static_cast(uvalue))); + if (uvalue == 0) { + // '-0' is treated as float. + DeclareGlobal(info, mutable_variable, AsmType::Float(), kWasmF32, + WasmInitExpr(-0.f)); + } else { + DeclareGlobal(info, mutable_variable, + mutable_variable ? AsmType::Int() : AsmType::Signed(), + kWasmI32, WasmInitExpr(-static_cast(uvalue))); + } } else { FAIL("Expected numeric literal"); } @@ -1049,7 +1055,7 @@ void AsmJsParser::Block() { bool can_break_to_block = pending_label_ != 0; if (can_break_to_block) { BareBegin(BlockKind::kNamed, pending_label_); - current_function_builder_->EmitWithU8(kExprBlock, kLocalVoid); + current_function_builder_->EmitWithU8(kExprBlock, kVoidCode); } pending_label_ = 0; EXPECT_TOKEN('{'); @@ -1092,7 +1098,7 @@ void AsmJsParser::IfStatement() { RECURSE(Expression(AsmType::Int())); EXPECT_TOKEN(')'); BareBegin(BlockKind::kOther); - current_function_builder_->EmitWithU8(kExprIf, kLocalVoid); + current_function_builder_->EmitWithU8(kExprIf, kVoidCode); RECURSE(ValidateStatement()); if (Check(TOK(else))) { current_function_builder_->Emit(kExprElse); @@ -1175,7 +1181,7 @@ void AsmJsParser::DoStatement() { Loop(); // c: block { // but treated like loop so continue works BareBegin(BlockKind::kLoop, pending_label_); - current_function_builder_->EmitWithU8(kExprBlock, kLocalVoid); + current_function_builder_->EmitWithU8(kExprBlock, kVoidCode); pending_label_ = 0; EXPECT_TOKEN(TOK(do)); // BODY @@ -1216,7 +1222,7 @@ void AsmJsParser::ForStatement() { Loop(); // c: block { // but treated like loop so continue works BareBegin(BlockKind::kLoop, pending_label_); - current_function_builder_->EmitWithU8(kExprBlock, kLocalVoid); + current_function_builder_->EmitWithU8(kExprBlock, kVoidCode); pending_label_ = 0; if (!Peek(';')) { // if (!CONDITION) break a; @@ -1316,7 +1322,7 @@ void AsmJsParser::SwitchStatement() { size_t count = cases.size() + 1; for (size_t i = 0; i < count; ++i) { BareBegin(BlockKind::kOther); - current_function_builder_->EmitWithU8(kExprBlock, kLocalVoid); + current_function_builder_->EmitWithU8(kExprBlock, kVoidCode); } int table_pos = 0; for (auto c : cases) { @@ -2057,7 +2063,7 @@ AsmType* AsmJsParser::ConditionalExpression() { if (!test->IsA(AsmType::Int())) { FAILn("Expected int in condition of ternary operator."); } - current_function_builder_->EmitWithU8(kExprIf, kLocalI32); + current_function_builder_->EmitWithU8(kExprIf, kI32Code); size_t fixup = current_function_builder_->GetPosition() - 1; // Assumes encoding knowledge. AsmType* cons = nullptr; @@ -2068,13 +2074,13 @@ AsmType* AsmJsParser::ConditionalExpression() { RECURSEn(alt = AssignmentExpression()); current_function_builder_->Emit(kExprEnd); if (cons->IsA(AsmType::Int()) && alt->IsA(AsmType::Int())) { - current_function_builder_->FixupByte(fixup, kLocalI32); + current_function_builder_->FixupByte(fixup, kI32Code); return AsmType::Int(); } else if (cons->IsA(AsmType::Double()) && alt->IsA(AsmType::Double())) { - current_function_builder_->FixupByte(fixup, kLocalF64); + current_function_builder_->FixupByte(fixup, kF64Code); return AsmType::Double(); } else if (cons->IsA(AsmType::Float()) && alt->IsA(AsmType::Float())) { - current_function_builder_->FixupByte(fixup, kLocalF32); + current_function_builder_->FixupByte(fixup, kF32Code); return AsmType::Float(); } else { FAILn("Type mismatch in ternary operator."); @@ -2331,7 +2337,7 @@ AsmType* AsmJsParser::ValidateCall() { } else { current_function_builder_->Emit(kExprI32LeS); } - current_function_builder_->EmitWithU8(kExprIf, kLocalI32); + current_function_builder_->EmitWithU8(kExprIf, kI32Code); current_function_builder_->EmitGetLocal(tmp_x.get()); current_function_builder_->Emit(kExprElse); current_function_builder_->EmitGetLocal(tmp_y.get()); diff --git a/deps/v8/src/ast/ast-function-literal-id-reindexer.cc b/deps/v8/src/ast/ast-function-literal-id-reindexer.cc index 8c9318bfe7475d..b583b5e4214ad4 100644 --- a/deps/v8/src/ast/ast-function-literal-id-reindexer.cc +++ b/deps/v8/src/ast/ast-function-literal-id-reindexer.cc @@ -54,10 +54,10 @@ void AstFunctionLiteralIdReindexer::VisitClassLiteral(ClassLiteral* expr) { // Private fields have their key and value present in // instance_members_initializer_function, so they will // already have been visited. - if (prop->kind() == ClassLiteralProperty::Kind::FIELD) { - CheckVisited(prop->value()); - } else { + if (prop->value()->IsFunctionLiteral()) { Visit(prop->value()); + } else { + CheckVisited(prop->value()); } } ZonePtrList* props = expr->public_members(); @@ -67,8 +67,7 @@ void AstFunctionLiteralIdReindexer::VisitClassLiteral(ClassLiteral* expr) { // Public fields with computed names have their key // and value present in instance_members_initializer_function, so they will // already have been visited. - if (prop->is_computed_name() && - prop->kind() == ClassLiteralProperty::Kind::FIELD) { + if (prop->is_computed_name() && !prop->value()->IsFunctionLiteral()) { if (!prop->key()->IsLiteral()) { CheckVisited(prop->key()); } diff --git a/deps/v8/src/ast/scopes.cc b/deps/v8/src/ast/scopes.cc index 6e0e238d33e58a..c9a3b400a70383 100644 --- a/deps/v8/src/ast/scopes.cc +++ b/deps/v8/src/ast/scopes.cc @@ -1629,7 +1629,6 @@ const char* Header(ScopeType scope_type, FunctionKind function_kind, bool is_declaration_scope) { switch (scope_type) { case EVAL_SCOPE: return "eval"; - // TODO(adamk): Should we print concise method scopes specially? case FUNCTION_SCOPE: if (IsGeneratorFunction(function_kind)) return "function*"; if (IsAsyncFunction(function_kind)) return "async function"; diff --git a/deps/v8/src/base/atomicops.h b/deps/v8/src/base/atomicops.h index 01a01c5ff4c33a..5d6422be520db6 100644 --- a/deps/v8/src/base/atomicops.h +++ b/deps/v8/src/base/atomicops.h @@ -36,9 +36,25 @@ #include "src/base/base-export.h" #include "src/base/build_config.h" +#if defined(V8_OS_STARBOARD) +#include "starboard/atomic.h" + +#if SB_API_VERSION < 10 +#error Your version of Starboard must support SbAtomic8 in order to use V8. +#endif // SB_API_VERSION < 10 +#endif // V8_OS_STARBOARD + namespace v8 { namespace base { +#ifdef V8_OS_STARBOARD +using Atomic8 = SbAtomic8; +using Atomic16 = int16_t; +using Atomic32 = SbAtomic32; +#if SB_IS_64_BIT +using Atomic64 = SbAtomic64; +#endif +#else using Atomic8 = char; using Atomic16 = int16_t; using Atomic32 = int32_t; @@ -51,10 +67,15 @@ using Atomic64 = int64_t; using Atomic64 = intptr_t; #endif // defined(__ILP32__) #endif // defined(V8_HOST_ARCH_64_BIT) +#endif // V8_OS_STARBOARD // Use AtomicWord for a machine-sized pointer. It will use the Atomic32 or // Atomic64 routines below, depending on your architecture. +#if defined(V8_OS_STARBOARD) +using AtomicWord = SbAtomicPtr; +#else using AtomicWord = intptr_t; +#endif // Atomically execute: // result = *ptr; @@ -126,7 +147,7 @@ Atomic64 Acquire_Load(volatile const Atomic64* ptr); } // namespace base } // namespace v8 -#if defined(V8_OS_WIN) +#if defined(V8_OS_WIN) || defined(V8_OS_STARBOARD) #include "src/base/atomicops_internals_std.h" #else // TODO(ulan): Switch to std version after performance regression with Wheezy diff --git a/deps/v8/src/base/cpu.cc b/deps/v8/src/base/cpu.cc index bae1afe7d1d8ce..c0e9e707aa27bd 100644 --- a/deps/v8/src/base/cpu.cc +++ b/deps/v8/src/base/cpu.cc @@ -4,6 +4,10 @@ #include "src/base/cpu.h" +#if defined(STARBOARD) +#include "starboard/cpu_features.h" +#endif + #if V8_LIBC_MSVCRT #include // __cpuid() #endif @@ -347,6 +351,54 @@ static bool HasListItem(const char* list, const char* item) { #endif // V8_HOST_ARCH_ARM || V8_HOST_ARCH_ARM64 || // V8_HOST_ARCH_MIPS || V8_HOST_ARCH_MIPS64 +#if defined(STARBOARD) + +bool CPU::StarboardDetectCPU() { +#if (SB_API_VERSION >= 11) + SbCPUFeatures features; + if (!SbCPUFeaturesGet(&features)) { + return false; + } + architecture_ = features.arm.architecture_generation; + switch (features.architecture) { + case kSbCPUFeaturesArchitectureArm: + case kSbCPUFeaturesArchitectureArm64: + has_neon_ = features.arm.has_neon; + has_thumb2_ = features.arm.has_thumb2; + has_vfp_ = features.arm.has_vfp; + has_vfp3_ = features.arm.has_vfp3; + has_vfp3_d32_ = features.arm.has_vfp3_d32; + has_idiva_ = features.arm.has_idiva; + break; + case kSbCPUFeaturesArchitectureX86: + case kSbCPUFeaturesArchitectureX86_64: + // Following flags are mandatory for V8 + has_cmov_ = features.x86.has_cmov; + has_sse2_ = features.x86.has_sse2; + // These flags are optional + has_sse3_ = features.x86.has_sse3; + has_ssse3_ = features.x86.has_ssse3; + has_sse41_ = features.x86.has_sse41; + has_sahf_ = features.x86.has_sahf; + has_avx_ = features.x86.has_avx; + has_fma3_ = features.x86.has_fma3; + has_bmi1_ = features.x86.has_bmi1; + has_bmi2_ = features.x86.has_bmi2; + has_lzcnt_ = features.x86.has_lzcnt; + has_popcnt_ = features.x86.has_popcnt; + break; + default: + return false; + } + + return true; +#else // SB_API_VERSION >= 11 + return false; +#endif +} + +#endif + CPU::CPU() : stepping_(0), model_(0), @@ -389,6 +441,13 @@ CPU::CPU() has_non_stop_time_stamp_counter_(false), has_msa_(false) { memcpy(vendor_, "Unknown", 8); + +#if defined(STARBOARD) + if (StarboardDetectCPU()) { + return; + } +#endif + #if V8_HOST_ARCH_IA32 || V8_HOST_ARCH_X64 int cpu_info[4]; diff --git a/deps/v8/src/base/macros.h b/deps/v8/src/base/macros.h index cea15280a485cd..37cab78f08fcbc 100644 --- a/deps/v8/src/base/macros.h +++ b/deps/v8/src/base/macros.h @@ -336,14 +336,14 @@ inline T RoundDown(T x, intptr_t m) { STATIC_ASSERT(std::is_integral::value); // m must be a power of two. DCHECK(m != 0 && ((m & (m - 1)) == 0)); - return x & -m; + return x & static_cast(-m); } template constexpr inline T RoundDown(T x) { STATIC_ASSERT(std::is_integral::value); // m must be a power of two. STATIC_ASSERT(m != 0 && ((m & (m - 1)) == 0)); - return x & -m; + return x & static_cast(-m); } // Return the smallest multiple of m which is >= x. diff --git a/deps/v8/src/base/once.cc b/deps/v8/src/base/once.cc index dbf6500746ef21..ad0acbaab04e74 100644 --- a/deps/v8/src/base/once.cc +++ b/deps/v8/src/base/once.cc @@ -6,6 +6,8 @@ #ifdef _WIN32 #include +#elif defined(V8_OS_STARBOARD) +#include "starboard/thread.h" #else #include #endif @@ -40,6 +42,8 @@ void CallOnceImpl(OnceType* once, std::function init_func) { ONCE_STATE_EXECUTING_FUNCTION) { #ifdef _WIN32 ::Sleep(0); +#elif defined(V8_OS_STARBOARD) + SbThreadYield(); #else sched_yield(); #endif diff --git a/deps/v8/src/base/platform/condition-variable.cc b/deps/v8/src/base/platform/condition-variable.cc index 5ea70835eefc4c..04ea29181bb4b9 100644 --- a/deps/v8/src/base/platform/condition-variable.cc +++ b/deps/v8/src/base/platform/condition-variable.cc @@ -159,7 +159,37 @@ bool ConditionVariable::WaitFor(Mutex* mutex, const TimeDelta& rel_time) { return result != 0; } -#endif // V8_OS_POSIX +#elif V8_OS_STARBOARD + +ConditionVariable::ConditionVariable() { + SbConditionVariableCreate(&native_handle_, nullptr); +} + +ConditionVariable::~ConditionVariable() { + SbConditionVariableDestroy(&native_handle_); +} + +void ConditionVariable::NotifyOne() { + SbConditionVariableSignal(&native_handle_); +} + +void ConditionVariable::NotifyAll() { + SbConditionVariableBroadcast(&native_handle_); +} + +void ConditionVariable::Wait(Mutex* mutex) { + SbConditionVariableWait(&native_handle_, &mutex->native_handle()); +} + +bool ConditionVariable::WaitFor(Mutex* mutex, const TimeDelta& rel_time) { + SbTime microseconds = static_cast(rel_time.InMicroseconds()); + SbConditionVariableResult result = SbConditionVariableWaitTimed( + &native_handle_, &mutex->native_handle(), microseconds); + DCHECK(result != kSbConditionVariableFailed); + return result == kSbConditionVariableSignaled; +} + +#endif // V8_OS_STARBOARD } // namespace base } // namespace v8 diff --git a/deps/v8/src/base/platform/condition-variable.h b/deps/v8/src/base/platform/condition-variable.h index e864f32872cacb..8b5c7cf56922a4 100644 --- a/deps/v8/src/base/platform/condition-variable.h +++ b/deps/v8/src/base/platform/condition-variable.h @@ -9,6 +9,10 @@ #include "src/base/lazy-instance.h" #include "src/base/platform/mutex.h" +#if V8_OS_STARBOARD +#include "starboard/common/condition_variable.h" +#endif + namespace v8 { namespace base { @@ -64,6 +68,8 @@ class V8_BASE_EXPORT ConditionVariable final { using NativeHandle = pthread_cond_t; #elif V8_OS_WIN using NativeHandle = CONDITION_VARIABLE; +#elif V8_OS_STARBOARD + using NativeHandle = SbConditionVariable; #endif NativeHandle& native_handle() { diff --git a/deps/v8/src/base/platform/mutex.cc b/deps/v8/src/base/platform/mutex.cc index 2e2f7f93209b22..40702f493ea445 100644 --- a/deps/v8/src/base/platform/mutex.cc +++ b/deps/v8/src/base/platform/mutex.cc @@ -294,7 +294,42 @@ bool SharedMutex::TryLockExclusive() { return TryAcquireSRWLockExclusive(&native_handle_); } -#endif // V8_OS_POSIX +#elif V8_OS_STARBOARD + +Mutex::Mutex() { SbMutexCreate(&native_handle_); } + +Mutex::~Mutex() { SbMutexDestroy(&native_handle_); } + +void Mutex::Lock() { SbMutexAcquire(&native_handle_); } + +void Mutex::Unlock() { SbMutexRelease(&native_handle_); } + +RecursiveMutex::RecursiveMutex() {} + +RecursiveMutex::~RecursiveMutex() {} + +void RecursiveMutex::Lock() { native_handle_.Acquire(); } + +void RecursiveMutex::Unlock() { native_handle_.Release(); } + +bool RecursiveMutex::TryLock() { return native_handle_.AcquireTry(); } + +SharedMutex::SharedMutex() = default; + +SharedMutex::~SharedMutex() = default; + +void SharedMutex::LockShared() { native_handle_.AcquireReadLock(); } + +void SharedMutex::LockExclusive() { native_handle_.AcquireWriteLock(); } + +void SharedMutex::UnlockShared() { native_handle_.ReleaseReadLock(); } + +void SharedMutex::UnlockExclusive() { native_handle_.ReleaseWriteLock(); } + +bool SharedMutex::TryLockShared() { return false; } + +bool SharedMutex::TryLockExclusive() { return false; } +#endif // V8_OS_STARBOARD } // namespace base } // namespace v8 diff --git a/deps/v8/src/base/platform/mutex.h b/deps/v8/src/base/platform/mutex.h index c3144f7ceb5365..7a19b2f4aa7225 100644 --- a/deps/v8/src/base/platform/mutex.h +++ b/deps/v8/src/base/platform/mutex.h @@ -16,6 +16,12 @@ #include // NOLINT #endif +#if V8_OS_STARBOARD +#include "starboard/common/mutex.h" +#include "starboard/common/recursive_mutex.h" +#include "starboard/common/rwlock.h" +#endif + namespace v8 { namespace base { @@ -58,6 +64,8 @@ class V8_BASE_EXPORT Mutex final { using NativeHandle = pthread_mutex_t; #elif V8_OS_WIN using NativeHandle = SRWLOCK; +#elif V8_OS_STARBOARD + using NativeHandle = SbMutex; #endif NativeHandle& native_handle() { @@ -159,6 +167,8 @@ class V8_BASE_EXPORT RecursiveMutex final { using NativeHandle = pthread_mutex_t; #elif V8_OS_WIN using NativeHandle = CRITICAL_SECTION; +#elif V8_OS_STARBOARD + using NativeHandle = starboard::RecursiveMutex; #endif NativeHandle native_handle_; @@ -247,6 +257,8 @@ class V8_BASE_EXPORT SharedMutex final { using NativeHandle = pthread_rwlock_t; #elif V8_OS_WIN using NativeHandle = SRWLOCK; +#elif V8_OS_STARBOARD + using NativeHandle = starboard::RWLock; #endif NativeHandle native_handle_; diff --git a/deps/v8/src/base/platform/platform-posix.cc b/deps/v8/src/base/platform/platform-posix.cc index 14294019d90dd0..89173b593a6ce8 100644 --- a/deps/v8/src/base/platform/platform-posix.cc +++ b/deps/v8/src/base/platform/platform-posix.cc @@ -111,7 +111,7 @@ const int kMmapFd = VM_MAKE_TAG(255); const int kMmapFd = -1; #endif // !V8_OS_MACOSX -#if defined(__APPLE__) && V8_TARGET_ARCH_ARM64 +#if defined(V8_TARGET_OS_MACOSX) && V8_HOST_ARCH_ARM64 // During snapshot generation in cross builds, sysconf() runs on the Intel // host and returns host page size, while the snapshot needs to use the // target page size. @@ -151,6 +151,14 @@ int GetFlagsForMemoryPermission(OS::MemoryPermission access, #if V8_OS_QNX flags |= MAP_LAZY; #endif // V8_OS_QNX +#if V8_OS_MACOSX && V8_HOST_ARCH_ARM64 && defined(MAP_JIT) && \ + !defined(V8_OS_IOS) + // TODO(jkummerow): using the V8_OS_IOS define is a crude approximation + // of the fact that we don't want to set the MAP_JIT flag when + // FLAG_jitless == true, as src/base/ doesn't know any flags. + // TODO(crbug.com/1117591): This is only needed for code spaces. + flags |= MAP_JIT; +#endif } return flags; } @@ -238,21 +246,18 @@ int OS::ActivationFrameAlignment() { // static size_t OS::AllocatePageSize() { -#if defined(__APPLE__) && V8_TARGET_ARCH_ARM64 +#if defined(V8_TARGET_OS_MACOSX) && V8_HOST_ARCH_ARM64 return kAppleArmPageSize; #else - return static_cast(sysconf(_SC_PAGESIZE)); + static size_t page_size = static_cast(sysconf(_SC_PAGESIZE)); + return page_size; #endif } // static size_t OS::CommitPageSize() { -#if defined(__APPLE__) && V8_TARGET_ARCH_ARM64 - static size_t page_size = kAppleArmPageSize; -#else - static size_t page_size = getpagesize(); -#endif - return page_size; + // Commit and allocate page size are the same on posix. + return OS::AllocatePageSize(); } // static @@ -270,9 +275,13 @@ void* OS::GetRandomMmapAddr() { MutexGuard guard(rng_mutex.Pointer()); GetPlatformRandomNumberGenerator()->NextBytes(&raw_addr, sizeof(raw_addr)); } -#if defined(__APPLE__) && V8_TARGET_ARCH_ARM64 +#if V8_HOST_ARCH_ARM64 +#if defined(V8_TARGET_OS_MACOSX) DCHECK_EQ(1 << 14, AllocatePageSize()); - raw_addr = RoundDown(raw_addr, 1 << 14); +#endif + // Keep the address page-aligned, AArch64 supports 4K, 16K and 64K + // configurations. + raw_addr = RoundDown(raw_addr, AllocatePageSize()); #endif #if defined(V8_USE_ADDRESS_SANITIZER) || defined(MEMORY_SANITIZER) || \ defined(THREAD_SANITIZER) || defined(LEAK_SANITIZER) @@ -675,9 +684,7 @@ FILE* OS::OpenTemporaryFile() { return tmpfile(); } - -const char* const OS::LogFileOpenMode = "w"; - +const char* const OS::LogFileOpenMode = "w+"; void OS::Print(const char* format, ...) { va_list args; @@ -1009,7 +1016,6 @@ void* Stack::GetStackStart() { pthread_attr_destroy(&attr); return reinterpret_cast(base) + size; } - pthread_attr_destroy(&attr); #if defined(V8_LIBC_GLIBC) // pthread_getattr_np can fail for the main thread. In this case diff --git a/deps/v8/src/base/platform/platform-starboard.cc b/deps/v8/src/base/platform/platform-starboard.cc new file mode 100644 index 00000000000000..16bb2d494b30fb --- /dev/null +++ b/deps/v8/src/base/platform/platform-starboard.cc @@ -0,0 +1,499 @@ +// Copyright 2020 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Platform-specific code for Starboard goes here. Starboard is the platform +// abstraction layer for Cobalt, an HTML5 container used mainly by YouTube +// apps in the livingroom. + +#include "src/base/lazy-instance.h" +#include "src/base/macros.h" +#include "src/base/platform/platform.h" +#include "src/base/platform/time.h" +#include "src/base/timezone-cache.h" +#include "src/base/utils/random-number-generator.h" +#include "starboard/common/condition_variable.h" +#include "starboard/common/log.h" +#include "starboard/common/string.h" +#include "starboard/configuration.h" +#include "starboard/configuration_constants.h" +#include "starboard/memory.h" +#include "starboard/time.h" +#include "starboard/time_zone.h" + +namespace v8 { +namespace base { + +#ifdef __arm__ +bool OS::ArmUsingHardFloat() { + // GCC versions 4.6 and above define __ARM_PCS or __ARM_PCS_VFP to specify + // the Floating Point ABI used (PCS stands for Procedure Call Standard). + // We use these as well as a couple of other defines to statically determine + // what FP ABI used. + // GCC versions 4.4 and below don't support hard-fp. + // GCC versions 4.5 may support hard-fp without defining __ARM_PCS or + // __ARM_PCS_VFP. + +#define GCC_VERSION \ + (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) +#if GCC_VERSION >= 40600 && !defined(__clang__) +#if defined(__ARM_PCS_VFP) + return true; +#else + return false; +#endif + +#elif GCC_VERSION < 40500 && !defined(__clang__) + return false; + +#else +#if defined(__ARM_PCS_VFP) + return true; +#elif defined(__ARM_PCS) || defined(__SOFTFP__) || defined(__SOFTFP) || \ + !defined(__VFP_FP__) + return false; +#else +#error \ + "Your version of compiler does not report the FP ABI compiled for." \ + "Please report it on this issue" \ + "http://code.google.com/p/v8/issues/detail?id=2140" + +#endif +#endif +#undef GCC_VERSION +} +#endif // def __arm__ + +namespace { + +static LazyInstance::type + platform_random_number_generator = LAZY_INSTANCE_INITIALIZER; +static LazyMutex rng_mutex = LAZY_MUTEX_INITIALIZER; + +bool g_hard_abort = false; + +} // namespace + +void OS::Initialize(bool hard_abort, const char* const gc_fake_mmap) { + g_hard_abort = hard_abort; + // This is only used on Posix, we don't need to use it for anything. +} + +int OS::GetUserTime(uint32_t* secs, uint32_t* usecs) { +#if SB_API_VERSION >= 12 + if (!SbTimeIsTimeThreadNowSupported()) return -1; +#endif + +#if SB_API_VERSION >= 12 || SB_HAS(TIME_THREAD_NOW) + SbTimeMonotonic thread_now = SbTimeGetMonotonicThreadNow(); + *secs = thread_now / kSbTimeSecond; + *usecs = thread_now % kSbTimeSecond; + return 0; +#else + return -1; +#endif +} + +double OS::TimeCurrentMillis() { return Time::Now().ToJsTime(); } + +int OS::ActivationFrameAlignment() { +#if V8_TARGET_ARCH_ARM + // On EABI ARM targets this is required for fp correctness in the + // runtime system. + return 8; +#elif V8_TARGET_ARCH_MIPS + return 8; +#elif V8_TARGET_ARCH_S390 + return 8; +#else + // Otherwise we just assume 16 byte alignment, i.e.: + // - With gcc 4.4 the tree vectorization optimizer can generate code + // that requires 16 byte alignment such as movdqa on x86. + // - Mac OS X, PPC and Solaris (64-bit) activation frames must + // be 16 byte-aligned; see "Mac OS X ABI Function Call Guide" + return 16; +#endif +} + +// static +size_t OS::AllocatePageSize() { return kSbMemoryPageSize; } + +// static +size_t OS::CommitPageSize() { return kSbMemoryPageSize; } + +// static +void OS::SetRandomMmapSeed(int64_t seed) { SB_NOTIMPLEMENTED(); } + +// static +void* OS::GetRandomMmapAddr() { return nullptr; } + +void* Allocate(void* address, size_t size, OS::MemoryPermission access) { + SbMemoryMapFlags sb_flags; + switch (access) { + case OS::MemoryPermission::kNoAccess: + sb_flags = SbMemoryMapFlags(0); + break; + case OS::MemoryPermission::kReadWrite: + sb_flags = SbMemoryMapFlags(kSbMemoryMapProtectReadWrite); + break; + default: + SB_LOG(ERROR) << "The requested memory allocation access is not" + " implemented for Starboard: " + << static_cast(access); + return nullptr; + } + void* result = SbMemoryMap(size, sb_flags, "v8::Base::Allocate"); + if (result == SB_MEMORY_MAP_FAILED) { + return nullptr; + } + return result; +} + +// The following code was taken from old v8 to deal with rounding up pointers. +namespace { +// Compute the 0-relative offset of some absolute value x of type T. +// This allows conversion of Addresses and integral types into +// 0-relative int offsets. +template +constexpr inline intptr_t OffsetFrom(T x) { + return x - static_cast(0); +} + +// Compute the absolute value of type T for some 0-relative offset x. +// This allows conversion of 0-relative int offsets into Addresses and +// integral types. +template +constexpr inline T AddressFrom(intptr_t x) { + return static_cast(static_cast(0) + x); +} + +template +inline T RoundDown(T x, intptr_t m) { + // m must be a power of two. + DCHECK(m != 0 && ((m & (m - 1)) == 0)); + return AddressFrom(OffsetFrom(x) & -m); +} + +template +inline T RoundUpOld(T x, intptr_t m) { + return RoundDown(static_cast(x + m - 1), m); +} +} // namespace + +// static +void* OS::Allocate(void* address, size_t size, size_t alignment, + MemoryPermission access) { + size_t page_size = AllocatePageSize(); + DCHECK_EQ(0, size % page_size); + DCHECK_EQ(0, alignment % page_size); + address = AlignedAddress(address, alignment); + // Add the maximum misalignment so we are guaranteed an aligned base address. + size_t request_size = size + (alignment - page_size); + request_size = RoundUp(request_size, OS::AllocatePageSize()); + void* result = base::Allocate(address, request_size, access); + if (result == nullptr) return nullptr; + + // Unmap memory allocated before the aligned base address. + uint8_t* base = static_cast(result); + uint8_t* aligned_base = RoundUpOld(base, alignment); + if (aligned_base != base) { + DCHECK_LT(base, aligned_base); + size_t prefix_size = static_cast(aligned_base - base); + CHECK(Free(base, prefix_size)); + request_size -= prefix_size; + } + // Unmap memory allocated after the potentially unaligned end. + if (size != request_size) { + DCHECK_LT(size, request_size); + size_t suffix_size = request_size - size; + CHECK(Free(aligned_base + size, suffix_size)); + request_size -= suffix_size; + } + + DCHECK_EQ(size, request_size); + return static_cast(aligned_base); +} + +// static +bool OS::Free(void* address, const size_t size) { + return SbMemoryUnmap(address, size); +} + +// static +bool OS::Release(void* address, size_t size) { + return SbMemoryUnmap(address, size); +} + +// static +bool OS::SetPermissions(void* address, size_t size, MemoryPermission access) { + SbMemoryMapFlags new_protection; + switch (access) { + case OS::MemoryPermission::kNoAccess: + new_protection = SbMemoryMapFlags(0); + break; + case OS::MemoryPermission::kRead: + new_protection = SbMemoryMapFlags(kSbMemoryMapProtectRead); + case OS::MemoryPermission::kReadWrite: + new_protection = SbMemoryMapFlags(kSbMemoryMapProtectReadWrite); + break; + case OS::MemoryPermission::kReadExecute: +#if SB_CAN(MAP_EXECUTABLE_MEMORY) + new_protection = + SbMemoryMapFlags(kSbMemoryMapProtectRead | kSbMemoryMapProtectExec); +#else + UNREACHABLE(); +#endif + break; + default: + // All other types are not supported by Starboard. + return false; + } + return SbMemoryProtect(address, size, new_protection); +} + +// static +bool OS::HasLazyCommits() { + SB_NOTIMPLEMENTED(); + return false; +} + +void OS::Sleep(TimeDelta interval) { SbThreadSleep(interval.InMicroseconds()); } + +void OS::Abort() { SbSystemBreakIntoDebugger(); } + +void OS::DebugBreak() { SbSystemBreakIntoDebugger(); } + +class StarboardMemoryMappedFile final : public OS::MemoryMappedFile { + public: + ~StarboardMemoryMappedFile() final; + void* memory() const final { + SB_NOTIMPLEMENTED(); + return nullptr; + } + size_t size() const final { + SB_NOTIMPLEMENTED(); + return 0u; + } +}; + +// static +OS::MemoryMappedFile* OS::MemoryMappedFile::open(const char* name, + FileMode mode) { + SB_NOTIMPLEMENTED(); + return nullptr; +} + +// static +OS::MemoryMappedFile* OS::MemoryMappedFile::create(const char* name, + size_t size, void* initial) { + SB_NOTIMPLEMENTED(); + return nullptr; +} + +StarboardMemoryMappedFile::~StarboardMemoryMappedFile() { SB_NOTIMPLEMENTED(); } + +int OS::GetCurrentProcessId() { + SB_NOTIMPLEMENTED(); + return 0; +} + +int OS::GetCurrentThreadId() { return SbThreadGetId(); } + +int OS::GetLastError() { return SbSystemGetLastError(); } + +// ---------------------------------------------------------------------------- +// POSIX stdio support. +// + +FILE* OS::FOpen(const char* path, const char* mode) { + SB_NOTIMPLEMENTED(); + return nullptr; +} + +bool OS::Remove(const char* path) { + SB_NOTIMPLEMENTED(); + return false; +} + +char OS::DirectorySeparator() { return kSbFileSepChar; } + +bool OS::isDirectorySeparator(const char ch) { + return ch == DirectorySeparator(); +} + +FILE* OS::OpenTemporaryFile() { + SB_NOTIMPLEMENTED(); + return nullptr; +} + +const char* const OS::LogFileOpenMode = "\0"; + +void OS::Print(const char* format, ...) { + va_list args; + va_start(args, format); + VPrint(format, args); + va_end(args); +} + +void OS::VPrint(const char* format, va_list args) { + SbLogRawFormat(format, args); +} + +void OS::FPrint(FILE* out, const char* format, ...) { + va_list args; + va_start(args, format); + VPrintError(format, args); + va_end(args); +} + +void OS::VFPrint(FILE* out, const char* format, va_list args) { + SbLogRawFormat(format, args); +} + +void OS::PrintError(const char* format, ...) { + va_list args; + va_start(args, format); + VPrintError(format, args); + va_end(args); +} + +void OS::VPrintError(const char* format, va_list args) { + // Starboard has no concept of stderr vs stdout. + SbLogRawFormat(format, args); +} + +int OS::SNPrintF(char* str, int length, const char* format, ...) { + va_list args; + va_start(args, format); + int result = VSNPrintF(str, length, format, args); + va_end(args); + return result; +} + +int OS::VSNPrintF(char* str, int length, const char* format, va_list args) { + int n = SbStringFormat(str, length, format, args); + if (n < 0 || n >= length) { + // If the length is zero, the assignment fails. + if (length > 0) str[length - 1] = '\0'; + return -1; + } else { + return n; + } +} + +// ---------------------------------------------------------------------------- +// POSIX string support. +// + +void OS::StrNCpy(char* dest, int length, const char* src, size_t n) { + SbStringCopy(dest, src, n); +} + +// ---------------------------------------------------------------------------- +// POSIX thread support. +// + +class Thread::PlatformData { + public: + PlatformData() : thread_(kSbThreadInvalid) {} + SbThread thread_; // Thread handle for pthread. + // Synchronizes thread creation + Mutex thread_creation_mutex_; +}; + +Thread::Thread(const Options& options) + : data_(new PlatformData), + stack_size_(options.stack_size()), + start_semaphore_(nullptr) { + set_name(options.name()); +} + +Thread::~Thread() { delete data_; } + +static void SetThreadName(const char* name) { SbThreadSetName(name); } + +static void* ThreadEntry(void* arg) { + Thread* thread = reinterpret_cast(arg); + // We take the lock here to make sure that pthread_create finished first since + // we don't know which thread will run first (the original thread or the new + // one). + { LockGuard lock_guard(&thread->data()->thread_creation_mutex_); } + SetThreadName(thread->name()); + // DCHECK_NE(thread->data()->thread_, kNoThread); + thread->NotifyStartedAndRun(); + + return nullptr; +} + +void Thread::set_name(const char* name) { + strncpy(name_, name, sizeof(name_)); + name_[sizeof(name_) - 1] = '\0'; +} + +void Thread::Start() { + data_->thread_ = + SbThreadCreate(stack_size_, kSbThreadNoPriority, kSbThreadNoAffinity, + true, name_, ThreadEntry, this); +} + +void Thread::Join() { SbThreadJoin(data_->thread_, nullptr); } + +Thread::LocalStorageKey Thread::CreateThreadLocalKey() { + return SbThreadCreateLocalKey(nullptr); +} + +void Thread::DeleteThreadLocalKey(LocalStorageKey key) { + SbThreadDestroyLocalKey(key); +} + +void* Thread::GetThreadLocal(LocalStorageKey key) { + return SbThreadGetLocalValue(key); +} + +void Thread::SetThreadLocal(LocalStorageKey key, void* value) { + bool result = SbThreadSetLocalValue(key, value); + DCHECK(result); +} + +class StarboardTimezoneCache : public TimezoneCache { + public: + double DaylightSavingsOffset(double time_ms) override { return 0.0; } + void Clear(TimeZoneDetection time_zone_detection) override {} + ~StarboardTimezoneCache() override {} + + protected: + static const int msPerSecond = 1000; +}; + +class StarboardDefaultTimezoneCache : public StarboardTimezoneCache { + public: + const char* LocalTimezone(double time_ms) override { + return SbTimeZoneGetName(); + } + double LocalTimeOffset(double time_ms, bool is_utc) override { + return SbTimeZoneGetCurrent() * 60000.0; + } + + ~StarboardDefaultTimezoneCache() override {} +}; + +TimezoneCache* OS::CreateTimezoneCache() { + return new StarboardDefaultTimezoneCache(); +} + +std::vector OS::GetSharedLibraryAddresses() { + SB_NOTIMPLEMENTED(); + return {}; +} + +void OS::SignalCodeMovingGC() { SB_NOTIMPLEMENTED(); } + +void OS::AdjustSchedulingParams() {} + +bool OS::DiscardSystemPages(void* address, size_t size) { + // Starboard API does not support this function yet. + return true; +} + +} // namespace base +} // namespace v8 diff --git a/deps/v8/src/base/platform/platform-win32.cc b/deps/v8/src/base/platform/platform-win32.cc index 5db3e343103dd0..3eb11d88f5c339 100644 --- a/deps/v8/src/base/platform/platform-win32.cc +++ b/deps/v8/src/base/platform/platform-win32.cc @@ -603,8 +603,7 @@ FILE* OS::OpenTemporaryFile() { // Open log file in binary mode to avoid /n -> /r/n conversion. -const char* const OS::LogFileOpenMode = "wb"; - +const char* const OS::LogFileOpenMode = "wb+"; // Print (debug) message to console. void OS::Print(const char* format, ...) { @@ -1397,9 +1396,11 @@ void OS::AdjustSchedulingParams() {} // static void* Stack::GetStackStart() { #if defined(V8_TARGET_ARCH_X64) - return reinterpret_cast(__readgsqword(offsetof(NT_TIB64, StackBase))); + return reinterpret_cast( + reinterpret_cast(NtCurrentTeb())->StackBase); #elif defined(V8_TARGET_ARCH_32_BIT) - return reinterpret_cast(__readfsdword(offsetof(NT_TIB, StackBase))); + return reinterpret_cast( + reinterpret_cast(NtCurrentTeb())->StackBase); #elif defined(V8_TARGET_ARCH_ARM64) // Windows 8 and later, see // https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-getcurrentthreadstacklimits diff --git a/deps/v8/src/base/platform/platform.h b/deps/v8/src/base/platform/platform.h index d5f59d1d7a8d8a..caa063944e0360 100644 --- a/deps/v8/src/base/platform/platform.h +++ b/deps/v8/src/base/platform/platform.h @@ -74,6 +74,9 @@ inline intptr_t InternalGetExistingThreadLocal(intptr_t index) { #elif defined(__APPLE__) && (V8_HOST_ARCH_IA32 || V8_HOST_ARCH_X64) +// tvOS simulator does not use intptr_t as TLS key. +#if !defined(V8_OS_STARBOARD) || !defined(TARGET_OS_SIMULATOR) + #define V8_FAST_TLS_SUPPORTED 1 extern V8_BASE_EXPORT intptr_t kMacTlsBaseOffset; @@ -94,6 +97,8 @@ inline intptr_t InternalGetExistingThreadLocal(intptr_t index) { return result; } +#endif // !defined(V8_OS_STARBOARD) || !defined(TARGET_OS_SIMULATOR) + #endif #endif // V8_NO_FAST_TLS @@ -323,7 +328,11 @@ inline void EnsureConsoleOutput() { class V8_BASE_EXPORT Thread { public: // Opaque data type for thread-local storage keys. +#if V8_OS_STARBOARD + using LocalStorageKey = SbThreadLocalKey; +#else using LocalStorageKey = int32_t; +#endif class Options { public: diff --git a/deps/v8/src/base/platform/semaphore.cc b/deps/v8/src/base/platform/semaphore.cc index 66464d8258dc9b..0cd04634ba14ad 100644 --- a/deps/v8/src/base/platform/semaphore.cc +++ b/deps/v8/src/base/platform/semaphore.cc @@ -157,6 +157,21 @@ bool Semaphore::WaitFor(const TimeDelta& rel_time) { } } +#elif V8_OS_STARBOARD + +Semaphore::Semaphore(int count) : native_handle_(count) { DCHECK_GE(count, 0); } + +Semaphore::~Semaphore() {} + +void Semaphore::Signal() { native_handle_.Put(); } + +void Semaphore::Wait() { native_handle_.Take(); } + +bool Semaphore::WaitFor(const TimeDelta& rel_time) { + SbTime microseconds = rel_time.InMicroseconds(); + return native_handle_.TakeWait(microseconds); +} + #endif // V8_OS_MACOSX } // namespace base diff --git a/deps/v8/src/base/platform/semaphore.h b/deps/v8/src/base/platform/semaphore.h index c4937acadd19a7..0c0b877da29750 100644 --- a/deps/v8/src/base/platform/semaphore.h +++ b/deps/v8/src/base/platform/semaphore.h @@ -17,6 +17,10 @@ #include // NOLINT #endif +#if V8_OS_STARBOARD +#include "starboard/common/semaphore.h" +#endif + namespace v8 { namespace base { @@ -55,6 +59,8 @@ class V8_BASE_EXPORT Semaphore final { using NativeHandle = sem_t; #elif V8_OS_WIN using NativeHandle = HANDLE; +#elif V8_OS_STARBOARD + using NativeHandle = starboard::Semaphore; #endif NativeHandle& native_handle() { diff --git a/deps/v8/src/base/platform/time.cc b/deps/v8/src/base/platform/time.cc index e72f90d2147965..78574b776d3fa2 100644 --- a/deps/v8/src/base/platform/time.cc +++ b/deps/v8/src/base/platform/time.cc @@ -26,6 +26,10 @@ #include "src/base/logging.h" #include "src/base/platform/platform.h" +#if V8_OS_STARBOARD +#include "starboard/time.h" +#endif + namespace { #if V8_OS_MACOSX @@ -449,7 +453,13 @@ struct timeval Time::ToTimeval() const { return tv; } -#endif // V8_OS_WIN +#elif V8_OS_STARBOARD + +Time Time::Now() { return Time(SbTimeToPosix(SbTimeGetNow())); } + +Time Time::NowFromSystemTime() { return Now(); } + +#endif // V8_OS_STARBOARD // static TimeTicks TimeTicks::HighResolutionNow() { @@ -717,6 +727,8 @@ TimeTicks TimeTicks::Now() { ticks = (gethrtime() / Time::kNanosecondsPerMicrosecond); #elif V8_OS_POSIX ticks = ClockNow(CLOCK_MONOTONIC); +#elif V8_OS_STARBOARD + ticks = SbTimeGetMonotonicNow(); #else #error platform does not implement TimeTicks::HighResolutionNow. #endif // V8_OS_MACOSX @@ -740,7 +752,15 @@ bool TimeTicks::IsHighResolution() { bool ThreadTicks::IsSupported() { -#if (defined(_POSIX_THREAD_CPUTIME) && (_POSIX_THREAD_CPUTIME >= 0)) || \ +#if V8_OS_STARBOARD +#if SB_API_VERSION >= 12 + return SbTimeIsTimeThreadNowSupported(); +#elif SB_HAS(TIME_THREAD_NOW) + return true; +#else + return false; +#endif +#elif(defined(_POSIX_THREAD_CPUTIME) && (_POSIX_THREAD_CPUTIME >= 0)) || \ defined(V8_OS_MACOSX) || defined(V8_OS_ANDROID) || defined(V8_OS_SOLARIS) return true; #elif defined(V8_OS_WIN) @@ -752,7 +772,17 @@ bool ThreadTicks::IsSupported() { ThreadTicks ThreadTicks::Now() { -#if V8_OS_MACOSX +#if V8_OS_STARBOARD +#if SB_API_VERSION >= 12 + if (SbTimeIsTimeThreadNowSupported()) + return ThreadTicks(SbTimeGetMonotonicThreadNow()); + UNREACHABLE(); +#elif SB_HAS(TIME_THREAD_NOW) + return ThreadTicks(SbTimeGetMonotonicThreadNow()); +#else + UNREACHABLE(); +#endif +#elif V8_OS_MACOSX return ThreadTicks(ComputeThreadTicks()); #elif(defined(_POSIX_THREAD_CPUTIME) && (_POSIX_THREAD_CPUTIME >= 0)) || \ defined(V8_OS_ANDROID) diff --git a/deps/v8/src/base/platform/time.h b/deps/v8/src/base/platform/time.h index 7f1fe9d632185e..2fc7859dd74117 100644 --- a/deps/v8/src/base/platform/time.h +++ b/deps/v8/src/base/platform/time.h @@ -91,6 +91,9 @@ class V8_BASE_EXPORT TimeDelta final { return TimeDelta(nanoseconds / TimeConstants::kNanosecondsPerMicrosecond); } + static TimeDelta FromSecondsD(double seconds) { + return FromDouble(seconds * TimeConstants::kMicrosecondsPerSecond); + } static TimeDelta FromMillisecondsD(double milliseconds) { return FromDouble(milliseconds * TimeConstants::kMicrosecondsPerMillisecond); diff --git a/deps/v8/src/builtins/accessors.cc b/deps/v8/src/builtins/accessors.cc index cc99b1e6c4bcd1..4258b07a7bf7e2 100644 --- a/deps/v8/src/builtins/accessors.cc +++ b/deps/v8/src/builtins/accessors.cc @@ -462,16 +462,20 @@ Handle GetFrameArguments(Isolate* isolate, return ArgumentsForInlinedFunction(frame, function_index); } +#ifdef V8_NO_ARGUMENTS_ADAPTOR + const int length = frame->GetActualArgumentCount(); +#else // Find the frame that holds the actual arguments passed to the function. if (it->frame()->has_adapted_arguments()) { it->AdvanceOneFrame(); DCHECK(it->frame()->is_arguments_adaptor()); } frame = it->frame(); - - // Get the number of arguments and construct an arguments object - // mirror for the right frame and the underlying function. const int length = frame->ComputeParametersCount(); +#endif + + // Construct an arguments object mirror for the right frame and the underlying + // function. Handle function(frame->function(), isolate); Handle arguments = isolate->factory()->NewArgumentsObject(function, length); diff --git a/deps/v8/src/builtins/arm/builtins-arm.cc b/deps/v8/src/builtins/arm/builtins-arm.cc index 982c1abbd0971b..e0a6ee1611e23c 100644 --- a/deps/v8/src/builtins/arm/builtins-arm.cc +++ b/deps/v8/src/builtins/arm/builtins-arm.cc @@ -45,20 +45,26 @@ void Builtins::Generate_Adaptor(MacroAssembler* masm, Address address) { static void GenerateTailCallToReturnedCode(MacroAssembler* masm, Runtime::FunctionId function_id) { // ----------- S t a t e ------------- + // -- r0 : actual argument count // -- r1 : target function (preserved for callee) // -- r3 : new target (preserved for callee) // ----------------------------------- { FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL); - // Push a copy of the target function and the new target. + // Push a copy of the target function, the new target and the actual + // argument count. // Push function as parameter to the runtime call. - __ Push(r1, r3, r1); + __ SmiTag(kJavaScriptCallArgCountRegister); + __ Push(kJavaScriptCallTargetRegister, kJavaScriptCallNewTargetRegister, + kJavaScriptCallArgCountRegister, kJavaScriptCallTargetRegister); __ CallRuntime(function_id, 1); __ mov(r2, r0); - // Restore target function and new target. - __ Pop(r1, r3); + // Restore target function, new target and actual argument count. + __ Pop(kJavaScriptCallTargetRegister, kJavaScriptCallNewTargetRegister, + kJavaScriptCallArgCountRegister); + __ SmiUntag(kJavaScriptCallArgCountRegister); } static_assert(kJavaScriptCallCodeStartRegister == r2, "ABI mismatch"); __ JumpCodeObject(r2); @@ -532,6 +538,13 @@ constexpr int kPushedStackSpace = kNumCalleeSaved * kPointerSize + 4 * kPointerSize /* r5, r6, r7, scratch */ + EntryFrameConstants::kCallerFPOffset; +// Assert that the EntryFrameConstants are in sync with the builtin. +static_assert(kPushedStackSpace == EntryFrameConstants::kDirectCallerSPOffset + + 3 * kPointerSize /* r5, r6, r7*/ + + EntryFrameConstants::kCallerFPOffset, + "Pushed stack space and frame constants do not match. See " + "frame-constants-arm.h"); + // Called with the native C calling convention. The corresponding function // signature is either: // @@ -896,6 +909,7 @@ static void TailCallOptimizedCodeSlot(MacroAssembler* masm, Register optimized_code_entry, Register scratch) { // ----------- S t a t e ------------- + // -- r0 : actual argument count // -- r3 : new target (preserved for callee if needed, and caller) // -- r1 : target function (preserved for callee if needed, and caller) // ----------------------------------- @@ -929,6 +943,7 @@ static void TailCallOptimizedCodeSlot(MacroAssembler* masm, static void MaybeOptimizeCode(MacroAssembler* masm, Register feedback_vector, Register optimization_marker) { // ----------- S t a t e ------------- + // -- r0 : actual argument count // -- r3 : new target (preserved for callee if needed, and caller) // -- r1 : target function (preserved for callee if needed, and caller) // -- feedback vector (preserved for caller if needed) @@ -1040,10 +1055,10 @@ static void AdvanceBytecodeOffsetOrReturn(MacroAssembler* masm, // Generate code for entering a JS function with the interpreter. // On entry to the function the receiver and arguments have been pushed on the -// stack left to right. The actual argument count matches the formal parameter -// count expected by the function. +// stack left to right. // // The live registers are: +// o r0: actual argument count (not including the receiver) // o r1: the JS function object being called. // o r3: the incoming new target or generator object // o cp: our context @@ -1059,15 +1074,15 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) { // Get the bytecode array from the function object and load it into // kInterpreterBytecodeArrayRegister. - __ ldr(r0, FieldMemOperand(closure, JSFunction::kSharedFunctionInfoOffset)); + __ ldr(r4, FieldMemOperand(closure, JSFunction::kSharedFunctionInfoOffset)); __ ldr(kInterpreterBytecodeArrayRegister, - FieldMemOperand(r0, SharedFunctionInfo::kFunctionDataOffset)); - GetSharedFunctionInfoBytecode(masm, kInterpreterBytecodeArrayRegister, r4); + FieldMemOperand(r4, SharedFunctionInfo::kFunctionDataOffset)); + GetSharedFunctionInfoBytecode(masm, kInterpreterBytecodeArrayRegister, r8); // The bytecode array could have been flushed from the shared function info, // if so, call into CompileLazy. Label compile_lazy; - __ CompareObjectType(kInterpreterBytecodeArrayRegister, r0, no_reg, + __ CompareObjectType(kInterpreterBytecodeArrayRegister, r4, no_reg, BYTECODE_ARRAY_TYPE); __ b(ne, &compile_lazy); @@ -1129,8 +1144,8 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) { Operand(BytecodeArray::kHeaderSize - kHeapObjectTag)); // Push bytecode array and Smi tagged bytecode array offset. - __ SmiTag(r0, kInterpreterBytecodeOffsetRegister); - __ Push(kInterpreterBytecodeArrayRegister, r0); + __ SmiTag(r4, kInterpreterBytecodeOffsetRegister); + __ Push(kInterpreterBytecodeArrayRegister, r4); // Allocate the local and temporary register file on the stack. Label stack_overflow; @@ -2105,31 +2120,69 @@ void Builtins::Generate_CallOrConstructForwardVarargs(MacroAssembler* masm, __ sub(r5, r5, r2, SetCC); __ b(le, &stack_done); { + // ----------- S t a t e ------------- + // -- r0 : the number of arguments already in the stack (not including the + // receiver) + // -- r1 : the target to call (can be any Object) + // -- r2 : start index (to support rest parameters) + // -- r3 : the new.target (for [[Construct]] calls) + // -- r4 : point to the caller stack frame + // -- r5 : number of arguments to copy, i.e. arguments count - start index + // ----------------------------------- + // Check for stack overflow. - Generate_StackOverflowCheck(masm, r5, r2, &stack_overflow); + Generate_StackOverflowCheck(masm, r5, scratch, &stack_overflow); // Forward the arguments from the caller frame. +#ifdef V8_REVERSE_JSARGS + // Point to the first argument to copy (skipping the receiver). + __ add(r4, r4, + Operand(CommonFrameConstants::kFixedFrameSizeAboveFp + + kSystemPointerSize)); + __ add(r4, r4, Operand(r2, LSL, kSystemPointerSizeLog2)); + + // Move the arguments already in the stack, + // including the receiver and the return address. + { + Label copy, check; + Register num = r8, src = r9, + dest = r2; // r7 and r10 are context and root. + __ mov(src, sp); + // Update stack pointer. + __ lsl(scratch, r5, Operand(kSystemPointerSizeLog2)); + __ AllocateStackSpace(scratch); + __ mov(dest, sp); + __ mov(num, r0); + __ b(&check); + __ bind(©); + __ ldr(scratch, MemOperand(src, kSystemPointerSize, PostIndex)); + __ str(scratch, MemOperand(dest, kSystemPointerSize, PostIndex)); + __ sub(num, num, Operand(1), SetCC); + __ bind(&check); + __ b(ge, ©); + } +#endif + // Copy arguments from the caller frame. + // TODO(victorgomes): Consider using forward order as potentially more cache + // friendly. { Label loop; -#ifdef V8_REVERSE_JSARGS - // Skips frame pointer and old receiver. - __ add(r4, r4, Operand(2 * kPointerSize)); - __ pop(r8); // Save new receiver. -#else +#ifndef V8_REVERSE_JSARGS // Skips frame pointer. - __ add(r4, r4, Operand(kPointerSize)); + __ add(r4, r4, Operand(CommonFrameConstants::kFixedFrameSizeAboveFp)); #endif __ add(r0, r0, r5); __ bind(&loop); { - __ ldr(scratch, MemOperand(r4, r5, LSL, kPointerSizeLog2)); - __ push(scratch); __ sub(r5, r5, Operand(1), SetCC); - __ b(ne, &loop); - } + __ ldr(scratch, MemOperand(r4, r5, LSL, kSystemPointerSizeLog2)); #ifdef V8_REVERSE_JSARGS - __ push(r8); // Recover new receiver. + __ str(scratch, MemOperand(r2, r5, LSL, kSystemPointerSizeLog2)); +#else + __ push(scratch); #endif + __ b(ne, &loop); + } } } __ b(&stack_done); diff --git a/deps/v8/src/builtins/arm64/builtins-arm64.cc b/deps/v8/src/builtins/arm64/builtins-arm64.cc index e34b07908bb455..be6d70eb08a7c0 100644 --- a/deps/v8/src/builtins/arm64/builtins-arm64.cc +++ b/deps/v8/src/builtins/arm64/builtins-arm64.cc @@ -45,21 +45,27 @@ void Builtins::Generate_Adaptor(MacroAssembler* masm, Address address) { static void GenerateTailCallToReturnedCode(MacroAssembler* masm, Runtime::FunctionId function_id) { // ----------- S t a t e ------------- + // -- x0 : actual argument count // -- x1 : target function (preserved for callee) // -- x3 : new target (preserved for callee) // ----------------------------------- { FrameScope scope(masm, StackFrame::INTERNAL); - // Push a copy of the target function and the new target. + // Push a copy of the target function, the new target and the actual + // argument count. + __ SmiTag(kJavaScriptCallArgCountRegister); + __ Push(kJavaScriptCallTargetRegister, kJavaScriptCallNewTargetRegister, + kJavaScriptCallArgCountRegister, padreg); // Push another copy as a parameter to the runtime call. - __ Push(x1, x3); - __ PushArgument(x1); + __ PushArgument(kJavaScriptCallTargetRegister); __ CallRuntime(function_id, 1); __ Mov(x2, x0); - // Restore target function and new target. - __ Pop(x3, x1); + // Restore target function, new target and actual argument count. + __ Pop(padreg, kJavaScriptCallArgCountRegister, + kJavaScriptCallNewTargetRegister, kJavaScriptCallTargetRegister); + __ SmiUntag(kJavaScriptCallArgCountRegister); } static_assert(kJavaScriptCallCodeStartRegister == x2, "ABI mismatch"); @@ -1041,6 +1047,7 @@ static void TailCallOptimizedCodeSlot(MacroAssembler* masm, Register optimized_code_entry, Register scratch) { // ----------- S t a t e ------------- + // -- x0 : actual argument count // -- x3 : new target (preserved for callee if needed, and caller) // -- x1 : target function (preserved for callee if needed, and caller) // ----------------------------------- @@ -1081,6 +1088,7 @@ static void TailCallOptimizedCodeSlot(MacroAssembler* masm, static void MaybeOptimizeCode(MacroAssembler* masm, Register feedback_vector, Register optimization_marker) { // ----------- S t a t e ------------- + // -- x0 : actual argument count // -- x3 : new target (preserved for callee if needed, and caller) // -- x1 : target function (preserved for callee if needed, and caller) // -- feedback vector (preserved for caller if needed) @@ -1189,10 +1197,10 @@ static void AdvanceBytecodeOffsetOrReturn(MacroAssembler* masm, // Generate code for entering a JS function with the interpreter. // On entry to the function the receiver and arguments have been pushed on the -// stack left to right. The actual argument count matches the formal parameter -// count expected by the function. +// stack left to right. // // The live registers are: +// - x0: actual argument count (not including the receiver) // - x1: the JS function object being called. // - x3: the incoming new target or generator object // - cp: our context. @@ -1208,16 +1216,16 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) { // Get the bytecode array from the function object and load it into // kInterpreterBytecodeArrayRegister. __ LoadTaggedPointerField( - x0, FieldMemOperand(closure, JSFunction::kSharedFunctionInfoOffset)); + x4, FieldMemOperand(closure, JSFunction::kSharedFunctionInfoOffset)); __ LoadTaggedPointerField( kInterpreterBytecodeArrayRegister, - FieldMemOperand(x0, SharedFunctionInfo::kFunctionDataOffset)); + FieldMemOperand(x4, SharedFunctionInfo::kFunctionDataOffset)); GetSharedFunctionInfoBytecode(masm, kInterpreterBytecodeArrayRegister, x11); // The bytecode array could have been flushed from the shared function info, // if so, call into CompileLazy. Label compile_lazy; - __ CompareObjectType(kInterpreterBytecodeArrayRegister, x0, x0, + __ CompareObjectType(kInterpreterBytecodeArrayRegister, x4, x4, BYTECODE_ARRAY_TYPE); __ B(ne, &compile_lazy); @@ -1266,8 +1274,9 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) { // the frame (that is done below). __ Bind(&push_stack_frame); FrameScope frame_scope(masm, StackFrame::MANUAL); - __ Push(lr, fp, cp, closure); - __ Add(fp, sp, StandardFrameConstants::kFixedFrameSizeFromFp); + __ Push(lr, fp); + __ mov(fp, sp); + __ Push(cp, closure); // Reset code age. // Reset code age and the OSR arming. The OSR field and BytecodeAgeOffset are @@ -1283,9 +1292,13 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) { __ Mov(kInterpreterBytecodeOffsetRegister, Operand(BytecodeArray::kHeaderSize - kHeapObjectTag)); - // Push bytecode array and Smi tagged bytecode array offset. - __ SmiTag(x0, kInterpreterBytecodeOffsetRegister); - __ Push(kInterpreterBytecodeArrayRegister, x0); + // Push actual argument count, bytecode array, Smi tagged bytecode array + // offset and an undefined (to properly align the stack pointer). + STATIC_ASSERT(TurboAssembler::kExtraSlotClaimedByPrologue == 1); + __ LoadRoot(kInterpreterAccumulatorRegister, RootIndex::kUndefinedValue); + __ SmiTag(x6, kInterpreterBytecodeOffsetRegister); + __ Push(kJavaScriptCallArgCountRegister, kInterpreterBytecodeArrayRegister, + x6, kInterpreterAccumulatorRegister); // Allocate the local and temporary register file on the stack. Label stack_overflow; @@ -1308,11 +1321,9 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) { // Note: there should always be at least one stack slot for the return // register in the register file. Label loop_header; - __ LoadRoot(kInterpreterAccumulatorRegister, RootIndex::kUndefinedValue); __ Lsr(x11, x11, kSystemPointerSizeLog2); - // Round up the number of registers to a multiple of 2, to align the stack - // to 16 bytes. - __ Add(x11, x11, 1); + // Round down (since we already have an undefined in the stack) the number + // of registers to a multiple of 2, to align the stack to 16 bytes. __ Bic(x11, x11, 1); __ PushMultipleTimes(kInterpreterAccumulatorRegister, x11); __ Bind(&loop_header); @@ -2308,6 +2319,7 @@ void LeaveArgumentsAdaptorFrame(MacroAssembler* masm) { // one slot up or one slot down, as needed. void Generate_PrepareForCopyingVarargs(MacroAssembler* masm, Register argc, Register len) { + Label exit; #ifdef V8_REVERSE_JSARGS Label even; Register slots_to_copy = x10; @@ -2330,6 +2342,7 @@ void Generate_PrepareForCopyingVarargs(MacroAssembler* masm, Register argc, } __ Bind(&even); + __ Cbz(slots_to_claim, &exit); __ Claim(slots_to_claim); // Move the arguments already in the stack including the receiver. @@ -2341,7 +2354,7 @@ void Generate_PrepareForCopyingVarargs(MacroAssembler* masm, Register argc, __ CopyDoubleWords(dst, src, slots_to_copy); } #else // !V8_REVERSE_JSARGS - Label len_odd, exit; + Label len_odd; Register slots_to_copy = x10; // If needed. __ Add(slots_to_copy, argc, 1); __ Add(argc, argc, len); @@ -2393,8 +2406,8 @@ void Generate_PrepareForCopyingVarargs(MacroAssembler* masm, Register argc, Operand(scratch, LSL, kSystemPointerSizeLog2)); // Store padding. } - __ Bind(&exit); #endif // !V8_REVERSE_JSARGS + __ Bind(&exit); } } // namespace @@ -2562,8 +2575,21 @@ void Builtins::Generate_CallOrConstructForwardVarargs(MacroAssembler* masm, // Push varargs. { Register dst = x13; - __ Add(args_fp, args_fp, 2 * kSystemPointerSize); +#ifdef V8_REVERSE_JSARGS + // Point to the fist argument to copy from (skipping receiver). + __ Add(args_fp, args_fp, + CommonFrameConstants::kFixedFrameSizeAboveFp + kSystemPointerSize); + __ lsl(start_index, start_index, kSystemPointerSizeLog2); + __ Add(args_fp, args_fp, start_index); + // Point to the position to copy to. + __ Add(x10, argc, 1); + __ SlotAddress(dst, x10); + // Update total number of arguments. + __ Add(argc, argc, len); +#else + __ Add(args_fp, args_fp, CommonFrameConstants::kFixedFrameSizeAboveFp); __ SlotAddress(dst, 0); +#endif __ CopyDoubleWords(dst, args_fp, len); } __ B(&stack_done); @@ -3438,7 +3464,7 @@ void Builtins::Generate_WasmDebugBreak(MacroAssembler* masm) { // Save all parameter registers. They might hold live values, we restore // them after the runtime call. __ PushXRegList(WasmDebugBreakFrameConstants::kPushedGpRegs); - __ PushDRegList(WasmDebugBreakFrameConstants::kPushedFpRegs); + __ PushQRegList(WasmDebugBreakFrameConstants::kPushedFpRegs); // Initialize the JavaScript context with 0. CEntry will use it to // set the current context on the isolate. @@ -3446,7 +3472,7 @@ void Builtins::Generate_WasmDebugBreak(MacroAssembler* masm) { __ CallRuntime(Runtime::kWasmDebugBreak, 0); // Restore registers. - __ PopDRegList(WasmDebugBreakFrameConstants::kPushedFpRegs); + __ PopQRegList(WasmDebugBreakFrameConstants::kPushedFpRegs); __ PopXRegList(WasmDebugBreakFrameConstants::kPushedGpRegs); } __ Ret(); diff --git a/deps/v8/src/builtins/array-reverse.tq b/deps/v8/src/builtins/array-reverse.tq index 11c325140ee442..fe9df2b9b507f2 100644 --- a/deps/v8/src/builtins/array-reverse.tq +++ b/deps/v8/src/builtins/array-reverse.tq @@ -45,7 +45,7 @@ StoreElement( implicit context: Context)( elements: FixedArrayBase, index: Smi, value: float64) { const elems: FixedDoubleArray = UnsafeCast(elements); - StoreFixedDoubleArrayElementSmi(elems, index, value); + StoreFixedDoubleArrayElement(elems, index, value); } // Fast-path for all PACKED_* elements kinds. These do not need to check diff --git a/deps/v8/src/builtins/arraybuffer.tq b/deps/v8/src/builtins/arraybuffer.tq new file mode 100644 index 00000000000000..179c4b38fd2cc9 --- /dev/null +++ b/deps/v8/src/builtins/arraybuffer.tq @@ -0,0 +1,66 @@ +// Copyright 2020 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +namespace arraybuffer { + +// #sec-get-arraybuffer.prototype.bytelength +transitioning javascript builtin ArrayBufferPrototypeGetByteLength( + js-implicit context: NativeContext, receiver: JSAny)(): Number { + // 1. Let O be the this value. + // 2. Perform ? RequireInternalSlot(O, [[ArrayBufferData]]). + const o = Cast(receiver) otherwise + ThrowTypeError( + MessageTemplate::kIncompatibleMethodReceiver, + 'get ArrayBuffer.prototype.byteLength', receiver); + // 3. If IsSharedArrayBuffer(O) is true, throw a TypeError exception. + if (IsSharedArrayBuffer(o)) { + ThrowTypeError( + MessageTemplate::kIncompatibleMethodReceiver, + 'get ArrayBuffer.prototype.byteLength', receiver); + } + // 4. If IsDetachedBuffer(O) is true, throw a TypeError exception. + // TODO(v8:4895): We don't actually throw here. + // 5. Let length be O.[[ArrayBufferByteLength]]. + const length = o.byte_length; + // 6. Return length. + return Convert(length); +} + +// #sec-get-sharedarraybuffer.prototype.bytelength +transitioning javascript builtin SharedArrayBufferPrototypeGetByteLength( + js-implicit context: NativeContext, receiver: JSAny)(): Number { + // 1. Let O be the this value. + // 2. Perform ? RequireInternalSlot(O, [[ArrayBufferData]]). + const o = Cast(receiver) otherwise + ThrowTypeError( + MessageTemplate::kIncompatibleMethodReceiver, + 'get SharedArrayBuffer.prototype.byteLength', receiver); + // 3. If IsSharedArrayBuffer(O) is false, throw a TypeError exception. + if (!IsSharedArrayBuffer(o)) { + ThrowTypeError( + MessageTemplate::kIncompatibleMethodReceiver, + 'get SharedArrayBuffer.prototype.byteLength', receiver); + } + // 4. Let length be O.[[ArrayBufferByteLength]]. + const length = o.byte_length; + // 5. Return length. + return Convert(length); +} + +// #sec-arraybuffer.isview +transitioning javascript builtin ArrayBufferIsView(arg: JSAny): Boolean { + // 1. If Type(arg) is not Object, return false. + // 2. If arg has a [[ViewedArrayBuffer]] internal slot, return true. + // 3. Return false. + typeswitch (arg) { + case (JSArrayBufferView): { + return True; + } + case (JSAny): { + return False; + } + } +} + +} // namespace arraybuffer diff --git a/deps/v8/src/builtins/base.tq b/deps/v8/src/builtins/base.tq index fc35c2a45737d9..eed7bc6e976aab 100644 --- a/deps/v8/src/builtins/base.tq +++ b/deps/v8/src/builtins/base.tq @@ -330,6 +330,7 @@ extern enum MessageTemplate { kWasmTrapNullDereference, kWasmTrapIllegalCast, kWasmTrapArrayOutOfBounds, + kWasmTrapWasmJSFunction, kWeakRefsRegisterTargetAndHoldingsMustNotBeSame, kWeakRefsRegisterTargetMustBeObject, kWeakRefsUnregisterTokenMustBeObject, @@ -608,6 +609,7 @@ extern macro CodeStubAssembler::AllocateNameDictionary(constexpr int32): extern builtin ToObject(Context, JSAny): JSReceiver; extern macro ToObject_Inline(Context, JSAny): JSReceiver; +extern macro IsUndefined(Object): bool; extern macro IsNullOrUndefined(Object): bool; extern macro IsString(HeapObject): bool; extern macro IsSeqOneByteString(HeapObject): bool; @@ -635,6 +637,7 @@ extern transitioning runtime TransitionElementsKindWithKind( extern macro LoadBufferObject(RawPtr, constexpr int32): Object; extern macro LoadBufferPointer(RawPtr, constexpr int32): RawPtr; extern macro LoadBufferSmi(RawPtr, constexpr int32): Smi; +extern macro LoadBufferIntptr(RawPtr, constexpr int32): intptr; extern runtime StringEqual(Context, String, String): Oddball; extern builtin StringLessThan(Context, String, String): Boolean; @@ -1036,6 +1039,12 @@ const kOneByteStringMap: Map = OneByteStringMapConstant(); // The map of a non-internalized internal SeqTwoByteString. const kStringMap: Map = StringMapConstant(); +macro OutOfBounds(index: T, length: X): bool { + return UintPtrGreaterThanOrEqual( + Convert(Convert(index)), + Convert(Convert(length))); +} + extern macro IsPrototypeInitialArrayPrototype(implicit context: Context)(Map): bool; extern macro IsNoElementsProtectorCellInvalid(): bool; @@ -1632,14 +1641,15 @@ macro IsIntegerOrSomeInfinity(o: Object): bool { } builtin CheckNumberInRange(implicit context: Context)( - value: Number, min: Number, max: Number): Undefined { + value: Number, min: Number, max: Number, nodeId: Smi): Undefined { if (IsIntegerOrSomeInfinity(value) && min <= value && value <= max) { return Undefined; } else { - Print('Range type assertion failed! (value/min/max)'); + Print('Range type assertion failed! (value/min/max/nodeId)'); Print(value); Print(min); Print(max); + Print(nodeId); unreachable; } } diff --git a/deps/v8/src/builtins/builtins-arraybuffer.cc b/deps/v8/src/builtins/builtins-arraybuffer.cc index b062b9ca3ce166..62d7d820c07f26 100644 --- a/deps/v8/src/builtins/builtins-arraybuffer.cc +++ b/deps/v8/src/builtins/builtins-arraybuffer.cc @@ -105,35 +105,6 @@ BUILTIN(ArrayBufferConstructor_DoNotInitialize) { InitializedFlag::kUninitialized); } -// ES6 section 24.1.4.1 get ArrayBuffer.prototype.byteLength -BUILTIN(ArrayBufferPrototypeGetByteLength) { - const char* const kMethodName = "get ArrayBuffer.prototype.byteLength"; - HandleScope scope(isolate); - CHECK_RECEIVER(JSArrayBuffer, array_buffer, kMethodName); - CHECK_SHARED(false, array_buffer, kMethodName); - // TODO(franzih): According to the ES6 spec, we should throw a TypeError - // here if the JSArrayBuffer is detached. - return *isolate->factory()->NewNumberFromSize(array_buffer->byte_length()); -} - -// ES7 sharedmem 6.3.4.1 get SharedArrayBuffer.prototype.byteLength -BUILTIN(SharedArrayBufferPrototypeGetByteLength) { - const char* const kMethodName = "get SharedArrayBuffer.prototype.byteLength"; - HandleScope scope(isolate); - CHECK_RECEIVER(JSArrayBuffer, array_buffer, - "get SharedArrayBuffer.prototype.byteLength"); - CHECK_SHARED(true, array_buffer, kMethodName); - return *isolate->factory()->NewNumberFromSize(array_buffer->byte_length()); -} - -// ES6 section 24.1.3.1 ArrayBuffer.isView ( arg ) -BUILTIN(ArrayBufferIsView) { - SealHandleScope shs(isolate); - DCHECK_EQ(2, args.length()); - Object arg = args[1]; - return isolate->heap()->ToBoolean(arg.IsJSArrayBufferView()); -} - static Object SliceHelper(BuiltinArguments args, Isolate* isolate, const char* kMethodName, bool is_shared) { HandleScope scope(isolate); diff --git a/deps/v8/src/builtins/builtins-async-module.cc b/deps/v8/src/builtins/builtins-async-module.cc index fecdb31cf3cdb9..7128ad7e9d35bf 100644 --- a/deps/v8/src/builtins/builtins-async-module.cc +++ b/deps/v8/src/builtins/builtins-async-module.cc @@ -11,8 +11,7 @@ namespace internal { BUILTIN(CallAsyncModuleFulfilled) { HandleScope handle_scope(isolate); - Handle module( - isolate->global_handles()->Create(*args.at(0))); + Handle module(args.at(0)); SourceTextModule::AsyncModuleExecutionFulfilled(isolate, module); return ReadOnlyRoots(isolate).undefined_value(); } @@ -22,8 +21,7 @@ BUILTIN(CallAsyncModuleRejected) { // Arguments should be a SourceTextModule and an exception object. DCHECK_EQ(args.length(), 2); - Handle module( - isolate->global_handles()->Create(*args.at(0))); + Handle module(args.at(0)); Handle exception(args.at(1)); SourceTextModule::AsyncModuleExecutionRejected(isolate, module, exception); return ReadOnlyRoots(isolate).undefined_value(); diff --git a/deps/v8/src/builtins/builtins-call-gen.cc b/deps/v8/src/builtins/builtins-call-gen.cc index f7919b78f47993..61ae06bf9e4593 100644 --- a/deps/v8/src/builtins/builtins-call-gen.cc +++ b/deps/v8/src/builtins/builtins-call-gen.cc @@ -176,6 +176,11 @@ void CallOrConstructBuiltinsAssembler::CallOrConstructWithArrayLike( TVARIABLE(Int32T, var_length); BIND(&if_array); { + TNode kind = LoadMapElementsKind(arguments_list_map); + GotoIf( + IsElementsKindGreaterThan(kind, LAST_ANY_NONEXTENSIBLE_ELEMENTS_KIND), + &if_runtime); + TNode js_object = CAST(arguments_list); // Try to extract the elements from a JSArray object. var_elements = LoadElements(js_object); @@ -191,11 +196,6 @@ void CallOrConstructBuiltinsAssembler::CallOrConstructWithArrayLike( STATIC_ASSERT(HOLEY_DOUBLE_ELEMENTS == 5); STATIC_ASSERT(LAST_FAST_ELEMENTS_KIND == HOLEY_DOUBLE_ELEMENTS); - TNode kind = LoadMapElementsKind(arguments_list_map); - - GotoIf( - IsElementsKindGreaterThan(kind, LAST_ANY_NONEXTENSIBLE_ELEMENTS_KIND), - &if_runtime); Branch(Word32And(kind, Int32Constant(1)), &if_holey_array, &if_done); } @@ -317,7 +317,7 @@ void CallOrConstructBuiltinsAssembler::CallOrConstructWithSpread( Label if_smiorobject(this), if_double(this), if_generic(this, Label::kDeferred); - TVARIABLE(Int32T, var_length); + TVARIABLE(JSArray, var_js_array); TVARIABLE(FixedArrayBase, var_elements); TVARIABLE(Int32T, var_elements_kind); @@ -342,9 +342,8 @@ void CallOrConstructBuiltinsAssembler::CallOrConstructWithSpread( { // The fast-path accesses the {spread} elements directly. TNode spread_kind = LoadMapElementsKind(spread_map); + var_js_array = spread_array; var_elements_kind = spread_kind; - var_length = - LoadAndUntagToWord32ObjectField(spread_array, JSArray::kLengthOffset); var_elements = LoadElements(spread_array); // Check elements kind of {spread}. @@ -372,8 +371,8 @@ void CallOrConstructBuiltinsAssembler::CallOrConstructWithSpread( TNode list = CAST(CallBuiltin(Builtins::kIterableToListMayPreserveHoles, context, spread, iterator_fn)); - var_length = LoadAndUntagToWord32ObjectField(list, JSArray::kLengthOffset); + var_js_array = list; var_elements = LoadElements(list); var_elements_kind = LoadElementsKind(list); Branch(Int32LessThan(var_elements_kind.value(), @@ -398,8 +397,9 @@ void CallOrConstructBuiltinsAssembler::CallOrConstructWithSpread( BIND(&if_smiorobject); { + TNode length = LoadAndUntagToWord32ObjectField( + var_js_array.value(), JSArray::kLengthOffset); TNode elements = var_elements.value(); - TNode length = var_length.value(); CSA_ASSERT(this, Int32LessThanOrEqual( length, Int32Constant(FixedArray::kMaxLength))); @@ -415,9 +415,11 @@ void CallOrConstructBuiltinsAssembler::CallOrConstructWithSpread( BIND(&if_double); { - GotoIf(Word32Equal(var_length.value(), Int32Constant(0)), &if_smiorobject); + TNode length = LoadAndUntagToWord32ObjectField( + var_js_array.value(), JSArray::kLengthOffset); + GotoIf(Word32Equal(length, Int32Constant(0)), &if_smiorobject); CallOrConstructDoubleVarargs(target, new_target, CAST(var_elements.value()), - var_length.value(), args_count, context, + length, args_count, context, var_elements_kind.value()); } } diff --git a/deps/v8/src/builtins/builtins-call.cc b/deps/v8/src/builtins/builtins-call.cc deleted file mode 100644 index 36732ba3980afe..00000000000000 --- a/deps/v8/src/builtins/builtins-call.cc +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright 2016 the V8 project authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "src/builtins/builtins-utils.h" -#include "src/builtins/builtins.h" -#include "src/execution/isolate.h" -#include "src/handles/handles-inl.h" -#include "src/objects/objects-inl.h" - -namespace v8 { -namespace internal { - -Handle Builtins::CallFunction(ConvertReceiverMode mode) { - switch (mode) { - case ConvertReceiverMode::kNullOrUndefined: - return builtin_handle(kCallFunction_ReceiverIsNullOrUndefined); - case ConvertReceiverMode::kNotNullOrUndefined: - return builtin_handle(kCallFunction_ReceiverIsNotNullOrUndefined); - case ConvertReceiverMode::kAny: - return builtin_handle(kCallFunction_ReceiverIsAny); - } - UNREACHABLE(); -} - -Handle Builtins::Call(ConvertReceiverMode mode) { - switch (mode) { - case ConvertReceiverMode::kNullOrUndefined: - return builtin_handle(kCall_ReceiverIsNullOrUndefined); - case ConvertReceiverMode::kNotNullOrUndefined: - return builtin_handle(kCall_ReceiverIsNotNullOrUndefined); - case ConvertReceiverMode::kAny: - return builtin_handle(kCall_ReceiverIsAny); - } - UNREACHABLE(); -} - -} // namespace internal -} // namespace v8 diff --git a/deps/v8/src/builtins/builtins-collections-gen.cc b/deps/v8/src/builtins/builtins-collections-gen.cc index db708c633ccded..9769d785b5d358 100644 --- a/deps/v8/src/builtins/builtins-collections-gen.cc +++ b/deps/v8/src/builtins/builtins-collections-gen.cc @@ -1728,13 +1728,13 @@ void CollectionsBuiltinsAssembler::StoreOrderedHashMapNewEntry( kTaggedSize * (OrderedHashMap::HashTableStartIndex() + OrderedHashMap::kValueOffset)); UnsafeStoreFixedArrayElement( - table, entry_start, bucket_entry, SKIP_WRITE_BARRIER, + table, entry_start, bucket_entry, kTaggedSize * (OrderedHashMap::HashTableStartIndex() + OrderedHashMap::kChainOffset)); // Update the bucket head. UnsafeStoreFixedArrayElement( - table, bucket, SmiTag(occupancy), SKIP_WRITE_BARRIER, + table, bucket, SmiTag(occupancy), OrderedHashMap::HashTableStartIndex() * kTaggedSize); // Bump the elements count. @@ -1896,13 +1896,13 @@ void CollectionsBuiltinsAssembler::StoreOrderedHashSetNewEntry( table, entry_start, key, UPDATE_WRITE_BARRIER, kTaggedSize * OrderedHashSet::HashTableStartIndex()); UnsafeStoreFixedArrayElement( - table, entry_start, bucket_entry, SKIP_WRITE_BARRIER, + table, entry_start, bucket_entry, kTaggedSize * (OrderedHashSet::HashTableStartIndex() + OrderedHashSet::kChainOffset)); // Update the bucket head. UnsafeStoreFixedArrayElement( - table, bucket, SmiTag(occupancy), SKIP_WRITE_BARRIER, + table, bucket, SmiTag(occupancy), OrderedHashSet::HashTableStartIndex() * kTaggedSize); // Bump the elements count. @@ -2491,9 +2491,9 @@ void WeakCollectionsBuiltinsAssembler::AddEntry( UnsafeStoreFixedArrayElement(table, value_index, value); // See HashTableBase::ElementAdded(). - UnsafeStoreFixedArrayElement( - table, EphemeronHashTable::kNumberOfElementsIndex, - SmiFromIntPtr(number_of_elements), SKIP_WRITE_BARRIER); + UnsafeStoreFixedArrayElement(table, + EphemeronHashTable::kNumberOfElementsIndex, + SmiFromIntPtr(number_of_elements)); } TNode WeakCollectionsBuiltinsAssembler::AllocateTable( diff --git a/deps/v8/src/builtins/builtins-constructor-gen.cc b/deps/v8/src/builtins/builtins-constructor-gen.cc index c313d773f38b46..ecab531e2cf187 100644 --- a/deps/v8/src/builtins/builtins-constructor-gen.cc +++ b/deps/v8/src/builtins/builtins-constructor-gen.cc @@ -352,7 +352,7 @@ TNode ConstructorBuiltinsAssembler::CreateRegExpLiteral( TNode feedback_vector = CAST(maybe_feedback_vector); TNode literal_site = CAST(LoadFeedbackVectorSlot(feedback_vector, slot)); - GotoIf(NotHasBoilerplate(literal_site), &call_runtime); + GotoIfNot(HasBoilerplate(literal_site), &call_runtime); { TNode boilerplate = CAST(literal_site); int size = @@ -386,7 +386,7 @@ TNode ConstructorBuiltinsAssembler::CreateShallowArrayLiteral( TNode maybe_allocation_site = CAST(LoadFeedbackVectorSlot(feedback_vector, slot)); - GotoIf(NotHasBoilerplate(maybe_allocation_site), call_runtime); + GotoIfNot(HasBoilerplate(maybe_allocation_site), call_runtime); TNode allocation_site = CAST(maybe_allocation_site); TNode boilerplate = CAST(LoadBoilerplate(allocation_site)); @@ -447,7 +447,7 @@ TNode ConstructorBuiltinsAssembler::CreateShallowObjectLiteral( Label* call_runtime) { TNode maybe_allocation_site = CAST(LoadFeedbackVectorSlot(feedback_vector, slot)); - GotoIf(NotHasBoilerplate(maybe_allocation_site), call_runtime); + GotoIfNot(HasBoilerplate(maybe_allocation_site), call_runtime); TNode allocation_site = CAST(maybe_allocation_site); TNode boilerplate = LoadBoilerplate(allocation_site); @@ -589,29 +589,7 @@ TNode ConstructorBuiltinsAssembler::CreateShallowObjectLiteral( StoreObjectFieldNoWriteBarrier(copy, offset, field); }, kTaggedSize, IndexAdvanceMode::kPost); - Comment("Copy mutable HeapNumber values"); - BuildFastLoop( - offset.value(), instance_size, - [=](TNode offset) { - TNode field = LoadObjectField(copy, offset); - Label copy_heap_number(this, Label::kDeferred), continue_loop(this); - // We only have to clone complex field values. - GotoIf(TaggedIsSmi(field), &continue_loop); - // TODO(leszeks): Read the field descriptor to decide if this heap - // number is mutable or not. - Branch(IsHeapNumber(CAST(field)), ©_heap_number, - &continue_loop); - BIND(©_heap_number); - { - TNode double_value = LoadHeapNumberValue(CAST(field)); - TNode heap_number = - AllocateHeapNumberWithValue(double_value); - StoreObjectField(copy, offset, heap_number); - Goto(&continue_loop); - } - BIND(&continue_loop); - }, - kTaggedSize, IndexAdvanceMode::kPost); + CopyMutableHeapNumbersInObject(copy, offset.value(), instance_size); Goto(&done_init); } BIND(&done_init); @@ -623,10 +601,7 @@ TNode ConstructorBuiltinsAssembler::CreateShallowObjectLiteral( TNode ConstructorBuiltinsAssembler::CreateEmptyObjectLiteral( TNode context) { TNode native_context = LoadNativeContext(context); - TNode object_function = - CAST(LoadContextElement(native_context, Context::OBJECT_FUNCTION_INDEX)); - TNode map = LoadObjectField( - object_function, JSFunction::kPrototypeOrInitialMapOffset); + TNode map = LoadObjectFunctionInitialMap(native_context); // Ensure that slack tracking is disabled for the map. STATIC_ASSERT(Map::kNoSlackTracking == 0); CSA_ASSERT(this, IsClearWord32( @@ -637,5 +612,35 @@ TNode ConstructorBuiltinsAssembler::CreateEmptyObjectLiteral( return result; } +void ConstructorBuiltinsAssembler::CopyMutableHeapNumbersInObject( + TNode copy, TNode start_offset, + TNode end_offset) { + // Iterate over all object properties of a freshly copied object and + // duplicate mutable heap numbers. + if (FLAG_unbox_double_fields) return; + Comment("Copy mutable HeapNumber values"); + BuildFastLoop( + start_offset, end_offset, + [=](TNode offset) { + TNode field = LoadObjectField(copy, offset); + Label copy_heap_number(this, Label::kDeferred), continue_loop(this); + // We only have to clone complex field values. + GotoIf(TaggedIsSmi(field), &continue_loop); + // TODO(leszeks): Read the field descriptor to decide if this heap + // number is mutable or not. + Branch(IsHeapNumber(CAST(field)), ©_heap_number, &continue_loop); + BIND(©_heap_number); + { + TNode double_value = LoadHeapNumberValue(CAST(field)); + TNode heap_number = + AllocateHeapNumberWithValue(double_value); + StoreObjectField(copy, offset, heap_number); + Goto(&continue_loop); + } + BIND(&continue_loop); + }, + kTaggedSize, IndexAdvanceMode::kPost); +} + } // namespace internal } // namespace v8 diff --git a/deps/v8/src/builtins/builtins-constructor-gen.h b/deps/v8/src/builtins/builtins-constructor-gen.h index 2ed83229eba4e2..6599e17ca04753 100644 --- a/deps/v8/src/builtins/builtins-constructor-gen.h +++ b/deps/v8/src/builtins/builtins-constructor-gen.h @@ -47,6 +47,10 @@ class ConstructorBuiltinsAssembler : public CodeStubAssembler { TNode target, TNode new_target, Label* call_runtime); + + void CopyMutableHeapNumbersInObject(TNode copy, + TNode start_offset, + TNode instance_size); }; } // namespace internal diff --git a/deps/v8/src/builtins/builtins-conversion-gen.cc b/deps/v8/src/builtins/builtins-conversion-gen.cc index 54fa752969e505..cf56c5366c05cf 100644 --- a/deps/v8/src/builtins/builtins-conversion-gen.cc +++ b/deps/v8/src/builtins/builtins-conversion-gen.cc @@ -14,15 +14,18 @@ namespace internal { // ES6 section 7.1.3 ToNumber ( argument ) TF_BUILTIN(ToNumber, CodeStubAssembler) { - // TODO(solanes, v8:6949): Changing this to a TNode crashes with the - // empty context. Context might not be needed, but it is propagated all over - // the place and hard to pull out. - Node* context = Parameter(Descriptor::kContext); + TNode context = CAST(Parameter(Descriptor::kContext)); TNode input = CAST(Parameter(Descriptor::kArgument)); Return(ToNumber(context, input)); } +TF_BUILTIN(PlainPrimitiveToNumber, CodeStubAssembler) { + TNode input = CAST(Parameter(Descriptor::kArgument)); + + Return(PlainPrimitiveToNumber(input)); +} + // Like ToNumber, but also converts BigInts. TF_BUILTIN(ToNumberConvertBigInt, CodeStubAssembler) { TNode context = CAST(Parameter(Descriptor::kContext)); diff --git a/deps/v8/src/builtins/builtins-definitions.h b/deps/v8/src/builtins/builtins-definitions.h index a6e020ada3f419..511e748acdaa2c 100644 --- a/deps/v8/src/builtins/builtins-definitions.h +++ b/deps/v8/src/builtins/builtins-definitions.h @@ -8,7 +8,7 @@ #include "builtins-generated/bytecodes-builtins-list.h" // include generated header -#include "torque-generated/builtin-definitions-tq.h" +#include "torque-generated/builtin-definitions.h" namespace v8 { namespace internal { @@ -189,6 +189,7 @@ namespace internal { \ /* Type conversions */ \ TFC(ToNumber, TypeConversion) \ + TFC(PlainPrimitiveToNumber, TypeConversionNoContext) \ TFC(ToNumberConvertBigInt, TypeConversion) \ TFC(Typeof, Typeof) \ TFC(GetSuperConstructor, Typeof) \ @@ -341,8 +342,6 @@ namespace internal { /* ES #sec-arraybuffer-constructor */ \ CPP(ArrayBufferConstructor) \ CPP(ArrayBufferConstructor_DoNotInitialize) \ - CPP(ArrayBufferPrototypeGetByteLength) \ - CPP(ArrayBufferIsView) \ CPP(ArrayBufferPrototypeSlice) \ \ /* AsyncFunction */ \ @@ -536,6 +535,7 @@ namespace internal { TFH(LoadIC_Noninlined, LoadWithVector) \ TFH(LoadICTrampoline, Load) \ TFH(LoadICTrampoline_Megamorphic, Load) \ + TFH(LoadSuperIC, LoadWithReceiverAndVector) \ TFH(KeyedLoadIC, LoadWithVector) \ TFH(KeyedLoadIC_Megamorphic, LoadWithVector) \ TFH(KeyedLoadICTrampoline, Load) \ @@ -721,7 +721,6 @@ namespace internal { TFS(SetOrSetIteratorToList, kSource) \ \ /* SharedArrayBuffer */ \ - CPP(SharedArrayBufferPrototypeGetByteLength) \ CPP(SharedArrayBufferPrototypeSlice) \ TFJ(AtomicsLoad, 2, kReceiver, kArray, kIndex) \ TFJ(AtomicsStore, 3, kReceiver, kArray, kIndex, kValue) \ diff --git a/deps/v8/src/builtins/builtins-handler-gen.cc b/deps/v8/src/builtins/builtins-handler-gen.cc index 3f4a53a3461bd4..8075a597e82c8c 100644 --- a/deps/v8/src/builtins/builtins-handler-gen.cc +++ b/deps/v8/src/builtins/builtins-handler-gen.cc @@ -9,7 +9,7 @@ #include "src/ic/ic.h" #include "src/ic/keyed-store-generic.h" #include "src/objects/objects-inl.h" -#include "torque-generated/exported-macros-assembler-tq.h" +#include "torque-generated/exported-macros-assembler.h" namespace v8 { namespace internal { @@ -40,123 +40,8 @@ class HandlerBuiltinsAssembler : public CodeStubAssembler { void Generate_ElementsTransitionAndStore(KeyedAccessStoreMode store_mode); void Generate_StoreFastElementIC(KeyedAccessStoreMode store_mode); - - enum class ArgumentsAccessMode { kLoad, kStore, kHas }; - - // Emits keyed sloppy arguments has. Returns whether the key is in the - // arguments. - TNode HasKeyedSloppyArguments(TNode receiver, - TNode key, Label* bailout) { - return EmitKeyedSloppyArguments(receiver, key, base::nullopt, bailout, - ArgumentsAccessMode::kHas); - } - - // Emits keyed sloppy arguments load. Returns either the loaded value. - TNode LoadKeyedSloppyArguments(TNode receiver, - TNode key, Label* bailout) { - return EmitKeyedSloppyArguments(receiver, key, base::nullopt, bailout, - ArgumentsAccessMode::kLoad); - } - - // Emits keyed sloppy arguments store. - void StoreKeyedSloppyArguments(TNode receiver, TNode key, - TNode value, Label* bailout) { - EmitKeyedSloppyArguments(receiver, key, value, bailout, - ArgumentsAccessMode::kStore); - } - - private: - // Emits keyed sloppy arguments load if the |value| is nullopt or store - // otherwise. Returns either the loaded value or |value|. - TNode EmitKeyedSloppyArguments(TNode receiver, - TNode key, - base::Optional> value, - Label* bailout, - ArgumentsAccessMode access_mode); }; -TNode HandlerBuiltinsAssembler::EmitKeyedSloppyArguments( - TNode receiver, TNode tagged_key, - base::Optional> value, Label* bailout, - ArgumentsAccessMode access_mode) { - GotoIfNot(TaggedIsSmi(tagged_key), bailout); - TNode key = SmiUntag(CAST(tagged_key)); - GotoIf(IntPtrLessThan(key, IntPtrConstant(0)), bailout); - - TNode elements = CAST(LoadElements(receiver)); - TNode elements_length = LoadAndUntagFixedArrayBaseLength(elements); - - TVARIABLE(Object, var_result); - if (access_mode == ArgumentsAccessMode::kStore) { - var_result = *value; - } else { - DCHECK(access_mode == ArgumentsAccessMode::kLoad || - access_mode == ArgumentsAccessMode::kHas); - } - Label if_mapped(this), if_unmapped(this), end(this, &var_result); - - GotoIf(UintPtrGreaterThanOrEqual(key, elements_length), &if_unmapped); - - TNode mapped_index = - LoadSloppyArgumentsElementsMappedEntries(elements, key); - Branch(TaggedEqual(mapped_index, TheHoleConstant()), &if_unmapped, - &if_mapped); - - BIND(&if_mapped); - { - TNode mapped_index_intptr = SmiUntag(CAST(mapped_index)); - TNode the_context = LoadSloppyArgumentsElementsContext(elements); - if (access_mode == ArgumentsAccessMode::kLoad) { - TNode result = - LoadContextElement(the_context, mapped_index_intptr); - CSA_ASSERT(this, TaggedNotEqual(result, TheHoleConstant())); - var_result = result; - } else if (access_mode == ArgumentsAccessMode::kHas) { - CSA_ASSERT(this, Word32BinaryNot(IsTheHole(LoadContextElement( - the_context, mapped_index_intptr)))); - var_result = TrueConstant(); - } else { - StoreContextElement(the_context, mapped_index_intptr, *value); - } - Goto(&end); - } - - BIND(&if_unmapped); - { - TNode backing_store_ho = - LoadSloppyArgumentsElementsArguments(elements); - GotoIf(TaggedNotEqual(LoadMap(backing_store_ho), FixedArrayMapConstant()), - bailout); - TNode backing_store = CAST(backing_store_ho); - - TNode backing_store_length = - LoadAndUntagFixedArrayBaseLength(backing_store); - - // Out-of-bounds access may involve prototype chain walk and is handled - // in runtime. - GotoIf(UintPtrGreaterThanOrEqual(key, backing_store_length), bailout); - - // The key falls into unmapped range. - if (access_mode == ArgumentsAccessMode::kStore) { - StoreFixedArrayElement(backing_store, key, *value); - } else { - TNode value = LoadFixedArrayElement(backing_store, key); - GotoIf(TaggedEqual(value, TheHoleConstant()), bailout); - - if (access_mode == ArgumentsAccessMode::kHas) { - var_result = TrueConstant(); - } else { - DCHECK_EQ(access_mode, ArgumentsAccessMode::kLoad); - var_result = value; - } - } - Goto(&end); - } - - BIND(&end); - return var_result.value(); -} - TF_BUILTIN(LoadIC_StringLength, CodeStubAssembler) { TNode string = CAST(Parameter(Descriptor::kReceiver)); Return(LoadStringLengthAsSmi(string)); @@ -463,7 +348,7 @@ TF_BUILTIN(KeyedLoadIC_SloppyArguments, HandlerBuiltinsAssembler) { Label miss(this); - TNode result = LoadKeyedSloppyArguments(receiver, key, &miss); + TNode result = SloppyArgumentsLoad(receiver, key, &miss); Return(result); BIND(&miss); @@ -485,7 +370,7 @@ void HandlerBuiltinsAssembler::Generate_KeyedStoreIC_SloppyArguments() { Label miss(this); - StoreKeyedSloppyArguments(receiver, key, value, &miss); + SloppyArgumentsStore(receiver, key, value, &miss); Return(value); BIND(&miss); @@ -538,7 +423,7 @@ TF_BUILTIN(KeyedHasIC_SloppyArguments, HandlerBuiltinsAssembler) { Label miss(this); - TNode result = HasKeyedSloppyArguments(receiver, key, &miss); + TNode result = SloppyArgumentsHas(receiver, key, &miss); Return(result); BIND(&miss); diff --git a/deps/v8/src/builtins/builtins-ic-gen.cc b/deps/v8/src/builtins/builtins-ic-gen.cc index 723b50630915cd..c4de83929cddb3 100644 --- a/deps/v8/src/builtins/builtins-ic-gen.cc +++ b/deps/v8/src/builtins/builtins-ic-gen.cc @@ -26,6 +26,7 @@ IC_BUILTIN(LoadIC_Noninlined) IC_BUILTIN(LoadIC_NoFeedback) IC_BUILTIN(LoadICTrampoline) IC_BUILTIN(LoadICTrampoline_Megamorphic) +IC_BUILTIN(LoadSuperIC) IC_BUILTIN(KeyedLoadIC) IC_BUILTIN(KeyedLoadIC_Megamorphic) IC_BUILTIN(KeyedLoadIC_PolymorphicName) diff --git a/deps/v8/src/builtins/builtins-internal-gen.cc b/deps/v8/src/builtins/builtins-internal-gen.cc index d8a5463288dda4..13698758e67adc 100644 --- a/deps/v8/src/builtins/builtins-internal-gen.cc +++ b/deps/v8/src/builtins/builtins-internal-gen.cc @@ -738,15 +738,39 @@ TF_BUILTIN(AdaptorWithBuiltinExitFrame, CodeStubAssembler) { // ConstructStubs implemented in C++ will be run in the context of the caller // instead of the callee, due to the way that [[Construct]] is defined for // ordinary functions). - TNode context = - CAST(LoadObjectField(target, JSFunction::kContextOffset)); + TNode context = LoadJSFunctionContext(target); + + TNode actual_argc = + UncheckedCast(Parameter(Descriptor::kActualArgumentsCount)); + + TVARIABLE(Int32T, pushed_argc, actual_argc); + +#ifdef V8_NO_ARGUMENTS_ADAPTOR + TNode shared = LoadJSFunctionSharedFunctionInfo(target); + + TNode formal_count = + UncheckedCast(LoadSharedFunctionInfoFormalParameterCount(shared)); + + // The number of arguments pushed is the maximum of actual arguments count + // and formal parameters count. Except when the formal parameters count is + // the sentinel. + Label check_argc(this), update_argc(this), done_argc(this); + + Branch(Word32Equal(formal_count, Int32Constant(kDontAdaptArgumentsSentinel)), + &done_argc, &check_argc); + BIND(&check_argc); + Branch(Int32GreaterThan(formal_count, pushed_argc.value()), &update_argc, + &done_argc); + BIND(&update_argc); + pushed_argc = formal_count; + Goto(&done_argc); + BIND(&done_argc); +#endif // Update arguments count for CEntry to contain the number of arguments // including the receiver and the extra arguments. - TNode argc = - UncheckedCast(Parameter(Descriptor::kActualArgumentsCount)); - argc = Int32Add( - argc, + TNode argc = Int32Add( + pushed_argc.value(), Int32Constant(BuiltinExitFrameConstants::kNumExtraArgsWithReceiver)); const bool builtin_exit_frame = true; diff --git a/deps/v8/src/builtins/builtins-intl.cc b/deps/v8/src/builtins/builtins-intl.cc index d5cdc16db358db..58b09aeaee33ad 100644 --- a/deps/v8/src/builtins/builtins-intl.cc +++ b/deps/v8/src/builtins/builtins-intl.cc @@ -1034,8 +1034,8 @@ BUILTIN(SegmentsPrototypeContaining) { Object::ToInteger(isolate, index)); double const n = index->Number(); - RETURN_RESULT_OR_FAILURE( - isolate, JSSegments::Containing(isolate, segments, static_cast(n))); + RETURN_RESULT_OR_FAILURE(isolate, + JSSegments::Containing(isolate, segments, n)); } // ecma402 #sec-%segmentsprototype%-@@iterator diff --git a/deps/v8/src/builtins/builtins-object-gen.cc b/deps/v8/src/builtins/builtins-object-gen.cc index 60cc12ee17607b..bcc2f8ea64af5b 100644 --- a/deps/v8/src/builtins/builtins-object-gen.cc +++ b/deps/v8/src/builtins/builtins-object-gen.cc @@ -2,8 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "src/builtins/builtins-object-gen.h" - #include "src/builtins/builtins-utils-gen.h" #include "src/builtins/builtins.h" #include "src/codegen/code-stub-assembler.h" @@ -1031,7 +1029,7 @@ TF_BUILTIN(ObjectCreate, ObjectBuiltinsAssembler) { TNode prototype = args.GetOptionalArgumentValue(kPrototypeArg); TNode properties = args.GetOptionalArgumentValue(kPropertiesArg); - TNode context = CAST(Parameter(Descriptor::kContext)); + TNode native_context = CAST(Parameter(Descriptor::kContext)); Label call_runtime(this, Label::kDeferred), prototype_valid(this), no_properties(this); @@ -1067,14 +1065,13 @@ TF_BUILTIN(ObjectCreate, ObjectBuiltinsAssembler) { { TVARIABLE(Map, map); TVARIABLE(HeapObject, properties); - Label non_null_proto(this), instantiate_map(this), good(this); + Label null_proto(this), non_null_proto(this), instantiate_map(this); - Branch(IsNull(prototype), &good, &non_null_proto); + Branch(IsNull(prototype), &null_proto, &non_null_proto); - BIND(&good); + BIND(&null_proto); { - map = CAST(LoadContextElement( - context, Context::SLOW_OBJECT_WITH_NULL_PROTOTYPE_MAP)); + map = LoadSlowObjectWithNullPrototypeMap(native_context); properties = AllocateNameDictionary(NameDictionary::kInitialCapacity); Goto(&instantiate_map); } @@ -1082,11 +1079,7 @@ TF_BUILTIN(ObjectCreate, ObjectBuiltinsAssembler) { BIND(&non_null_proto); { properties = EmptyFixedArrayConstant(); - TNode object_function = - CAST(LoadContextElement(context, Context::OBJECT_FUNCTION_INDEX)); - TNode object_function_map = LoadObjectField( - object_function, JSFunction::kPrototypeOrInitialMapOffset); - map = object_function_map; + map = LoadObjectFunctionInitialMap(native_context); GotoIf(TaggedEqual(prototype, LoadMapPrototype(map.value())), &instantiate_map); // Try loading the prototype info. @@ -1110,8 +1103,8 @@ TF_BUILTIN(ObjectCreate, ObjectBuiltinsAssembler) { BIND(&call_runtime); { - TNode result = - CallRuntime(Runtime::kObjectCreate, context, prototype, properties); + TNode result = CallRuntime(Runtime::kObjectCreate, native_context, + prototype, properties); args.PopAndReturn(result); } } diff --git a/deps/v8/src/builtins/builtins-object-gen.h b/deps/v8/src/builtins/builtins-object-gen.h deleted file mode 100644 index fa0024cde2ef3d..00000000000000 --- a/deps/v8/src/builtins/builtins-object-gen.h +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2018 the V8 project authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef V8_BUILTINS_BUILTINS_OBJECT_GEN_H_ -#define V8_BUILTINS_BUILTINS_OBJECT_GEN_H_ - -#include "src/codegen/code-stub-assembler.h" - -namespace v8 { -namespace internal {} // namespace internal -} // namespace v8 - -#endif // V8_BUILTINS_BUILTINS_OBJECT_GEN_H_ diff --git a/deps/v8/src/builtins/builtins-proxy-gen.cc b/deps/v8/src/builtins/builtins-proxy-gen.cc index 1e7b9c7057cfe2..5b4b9d25361fe0 100644 --- a/deps/v8/src/builtins/builtins-proxy-gen.cc +++ b/deps/v8/src/builtins/builtins-proxy-gen.cc @@ -3,15 +3,14 @@ // found in the LICENSE file. #include "src/builtins/builtins-proxy-gen.h" + #include "src/builtins/builtins-utils-gen.h" #include "src/builtins/builtins-utils.h" #include "src/builtins/builtins.h" - #include "src/logging/counters.h" #include "src/objects/js-proxy.h" #include "src/objects/objects-inl.h" - -#include "torque-generated/exported-macros-assembler-tq.h" +#include "torque-generated/exported-macros-assembler.h" namespace v8 { namespace internal { diff --git a/deps/v8/src/builtins/builtins-regexp-gen.cc b/deps/v8/src/builtins/builtins-regexp-gen.cc index dace357d56a475..8be87180eb3cc8 100644 --- a/deps/v8/src/builtins/builtins-regexp-gen.cc +++ b/deps/v8/src/builtins/builtins-regexp-gen.cc @@ -257,11 +257,15 @@ TNode RegExpBuiltinsAssembler::ConstructNewResultFromMatchInfo( TNode data = CAST(LoadObjectField(regexp, JSRegExp::kDataOffset)); - // We reach this point only if captures exist, implying that this is an - // IRREGEXP JSRegExp. - CSA_ASSERT(this, - SmiEqual(CAST(LoadFixedArrayElement(data, JSRegExp::kTagIndex)), - SmiConstant(JSRegExp::IRREGEXP))); + // We reach this point only if captures exist, implying that the assigned + // regexp engine must be able to handle captures. + CSA_ASSERT( + this, + Word32Or( + SmiEqual(CAST(LoadFixedArrayElement(data, JSRegExp::kTagIndex)), + SmiConstant(JSRegExp::IRREGEXP)), + SmiEqual(CAST(LoadFixedArrayElement(data, JSRegExp::kTagIndex)), + SmiConstant(JSRegExp::EXPERIMENTAL)))); // The names fixed array associates names at even indices with a capture // index at odd indices. @@ -284,8 +288,7 @@ TNode RegExpBuiltinsAssembler::ConstructNewResultFromMatchInfo( TNode num_properties = WordSar(names_length, 1); TNode native_context = LoadNativeContext(context); - TNode map = CAST(LoadContextElement( - native_context, Context::SLOW_OBJECT_WITH_NULL_PROTOTYPE_MAP)); + TNode map = LoadSlowObjectWithNullPrototypeMap(native_context); TNode properties = AllocateNameDictionary(num_properties, kAllowLargeObjectAllocation); @@ -614,9 +617,8 @@ TNode RegExpBuiltinsAssembler::RegExpExecInternal( GotoIf(SmiGreaterThan(register_count, available_slots), &runtime); // Fill match_info. - UnsafeStoreFixedArrayElement(match_info, - RegExpMatchInfo::kNumberOfCapturesIndex, - register_count, SKIP_WRITE_BARRIER); + UnsafeStoreFixedArrayElement( + match_info, RegExpMatchInfo::kNumberOfCapturesIndex, register_count); UnsafeStoreFixedArrayElement(match_info, RegExpMatchInfo::kLastSubjectIndex, string); UnsafeStoreFixedArrayElement(match_info, RegExpMatchInfo::kLastInputIndex, @@ -852,19 +854,17 @@ TF_BUILTIN(RegExpExecAtom, RegExpBuiltinsAssembler) { const TNode match_to = SmiAdd(match_from, LoadStringLengthAsSmi(needle_string)); - UnsafeStoreFixedArrayElement( - match_info, RegExpMatchInfo::kNumberOfCapturesIndex, - SmiConstant(kNumRegisters), SKIP_WRITE_BARRIER); + UnsafeStoreFixedArrayElement(match_info, + RegExpMatchInfo::kNumberOfCapturesIndex, + SmiConstant(kNumRegisters)); UnsafeStoreFixedArrayElement(match_info, RegExpMatchInfo::kLastSubjectIndex, subject_string); UnsafeStoreFixedArrayElement(match_info, RegExpMatchInfo::kLastInputIndex, subject_string); - UnsafeStoreFixedArrayElement(match_info, - RegExpMatchInfo::kFirstCaptureIndex, - match_from, SKIP_WRITE_BARRIER); - UnsafeStoreFixedArrayElement(match_info, - RegExpMatchInfo::kFirstCaptureIndex + 1, - match_to, SKIP_WRITE_BARRIER); + UnsafeStoreFixedArrayElement( + match_info, RegExpMatchInfo::kFirstCaptureIndex, match_from); + UnsafeStoreFixedArrayElement( + match_info, RegExpMatchInfo::kFirstCaptureIndex + 1, match_to); Return(match_info); } diff --git a/deps/v8/src/builtins/builtins-string.tq b/deps/v8/src/builtins/builtins-string.tq index 816cbb4c11b1e8..6c1eec1b2d68a5 100644 --- a/deps/v8/src/builtins/builtins-string.tq +++ b/deps/v8/src/builtins/builtins-string.tq @@ -6,8 +6,9 @@ namespace string { -// TODO(bbudge) Remove the 'RT' suffix on this runtime function. -extern transitioning runtime ToStringRT(Context, JSAny): String; +namespace runtime { +extern transitioning runtime ToString(Context, JSAny): String; +} @export transitioning macro ToStringImpl(context: Context, o: JSAny): String { @@ -31,7 +32,7 @@ transitioning macro ToStringImpl(context: Context, o: JSAny): String { ThrowTypeError(MessageTemplate::kSymbolToString); } case (JSAny): { - return ToStringRT(context, o); + return runtime::ToString(context, o); } } } diff --git a/deps/v8/src/builtins/builtins.cc b/deps/v8/src/builtins/builtins.cc index f79ddaa5e4c3dd..31682f397457a7 100644 --- a/deps/v8/src/builtins/builtins.cc +++ b/deps/v8/src/builtins/builtins.cc @@ -118,6 +118,30 @@ const char* Builtins::Lookup(Address pc) { return nullptr; } +Handle Builtins::CallFunction(ConvertReceiverMode mode) { + switch (mode) { + case ConvertReceiverMode::kNullOrUndefined: + return builtin_handle(kCallFunction_ReceiverIsNullOrUndefined); + case ConvertReceiverMode::kNotNullOrUndefined: + return builtin_handle(kCallFunction_ReceiverIsNotNullOrUndefined); + case ConvertReceiverMode::kAny: + return builtin_handle(kCallFunction_ReceiverIsAny); + } + UNREACHABLE(); +} + +Handle Builtins::Call(ConvertReceiverMode mode) { + switch (mode) { + case ConvertReceiverMode::kNullOrUndefined: + return builtin_handle(kCall_ReceiverIsNullOrUndefined); + case ConvertReceiverMode::kNotNullOrUndefined: + return builtin_handle(kCall_ReceiverIsNotNullOrUndefined); + case ConvertReceiverMode::kAny: + return builtin_handle(kCall_ReceiverIsAny); + } + UNREACHABLE(); +} + Handle Builtins::NonPrimitiveToPrimitive(ToPrimitiveHint hint) { switch (hint) { case ToPrimitiveHint::kDefault: diff --git a/deps/v8/src/builtins/conversion.tq b/deps/v8/src/builtins/conversion.tq index 14b953f416c7ef..5a2dccd068c817 100644 --- a/deps/v8/src/builtins/conversion.tq +++ b/deps/v8/src/builtins/conversion.tq @@ -3,7 +3,7 @@ // found in the LICENSE file. namespace runtime { -extern transitioning runtime ToStringRT(Context, BigInt): String; +extern transitioning runtime ToString(Context, BigInt): String; } extern enum OrdinaryToPrimitiveHint { kString, kNumber } @@ -90,7 +90,7 @@ transitioning builtin ToName(implicit context: Context)(input: JSAny): Name { case (b: BigInt): { // We don't have a fast-path for BigInt currently, so just // tail call to the %ToString runtime function here for now. - tail runtime::ToStringRT(context, b); + tail runtime::ToString(context, b); } case (o: Oddball): { return o.to_string; diff --git a/deps/v8/src/builtins/frame-arguments.tq b/deps/v8/src/builtins/frame-arguments.tq index d57b2f4f01ba90..27f3266e2dbada 100644 --- a/deps/v8/src/builtins/frame-arguments.tq +++ b/deps/v8/src/builtins/frame-arguments.tq @@ -11,6 +11,8 @@ struct Arguments { extern operator '[]' macro GetArgumentValue(Arguments, intptr): JSAny; extern macro GetFrameArguments(FrameWithArguments, intptr): Arguments; +const kNoArgumentsAdaptor: + constexpr bool generates 'kNoArgumentsAdaptor'; struct ArgumentsIterator { macro Next(): Object labels NoMore { @@ -47,18 +49,30 @@ macro GetFrameWithArgumentsInfo(implicit context: Context)(): const shared: SharedFunctionInfo = f.shared_function_info; const formalParameterCount: bint = Convert(Convert(shared.formal_parameter_count)); - const argumentCount: bint = formalParameterCount; + if constexpr (kNoArgumentsAdaptor) { + // TODO(victorgomes): When removing the v8_disable_arguments_adaptor flag, + // FrameWithArgumentsInfo can be simplified, since the frame field already + // contains the argument count. + const argumentCount: bint = Convert(frame.argument_count); + return FrameWithArgumentsInfo{ + frame, + argument_count: argumentCount, + formal_parameter_count: formalParameterCount + }; + } else { + const argumentCount: bint = formalParameterCount; - const adaptor = Cast(frame.caller) - otherwise return FrameWithArgumentsInfo{ - frame, - argument_count: argumentCount, - formal_parameter_count: formalParameterCount - }; + const adaptor = Cast(frame.caller) + otherwise return FrameWithArgumentsInfo{ + frame, + argument_count: argumentCount, + formal_parameter_count: formalParameterCount + }; - return FrameWithArgumentsInfo{ - frame: adaptor, - argument_count: Convert(adaptor.length), - formal_parameter_count: formalParameterCount - }; + return FrameWithArgumentsInfo{ + frame: adaptor, + argument_count: Convert(adaptor.length), + formal_parameter_count: formalParameterCount + }; + } } diff --git a/deps/v8/src/builtins/frames.tq b/deps/v8/src/builtins/frames.tq index ef01b67b76185f..3b716b7a64725f 100644 --- a/deps/v8/src/builtins/frames.tq +++ b/deps/v8/src/builtins/frames.tq @@ -49,6 +49,9 @@ macro LoadPointerFromFrame(f: Frame, o: constexpr int32): RawPtr { macro LoadSmiFromFrame(f: Frame, o: constexpr int32): Smi { return LoadBufferSmi(f, o); } +macro LoadIntptrFromFrame(f: Frame, o: constexpr int32): intptr { + return LoadBufferIntptr(f, o); +} const kStandardFrameFunctionOffset: constexpr int31 generates 'StandardFrameConstants::kFunctionOffset'; @@ -67,6 +70,12 @@ operator '.caller' macro LoadCallerFromFrame(f: Frame): Frame { return %RawDownCast(result); } +const kStandardFrameArgCOffset: constexpr int31 + generates 'StandardFrameConstants::kArgCOffset'; +operator '.argument_count' macro LoadArgCFromFrame(f: Frame): intptr { + return LoadIntptrFromFrame(f, kStandardFrameArgCOffset); +} + type ContextOrFrameType = Context|FrameType; Cast(implicit context: Context)(o: Object): ContextOrFrameType diff --git a/deps/v8/src/builtins/ia32/builtins-ia32.cc b/deps/v8/src/builtins/ia32/builtins-ia32.cc index 10b9a9e308241a..41181410b52bb3 100644 --- a/deps/v8/src/builtins/ia32/builtins-ia32.cc +++ b/deps/v8/src/builtins/ia32/builtins-ia32.cc @@ -41,23 +41,29 @@ void Builtins::Generate_Adaptor(MacroAssembler* masm, Address address) { static void GenerateTailCallToReturnedCode(MacroAssembler* masm, Runtime::FunctionId function_id) { // ----------- S t a t e ------------- + // -- eax : actual argument count // -- edx : new target (preserved for callee) // -- edi : target function (preserved for callee) // ----------------------------------- { FrameScope scope(masm, StackFrame::INTERNAL); - // Push a copy of the target function and the new target. - __ push(edi); - __ push(edx); + // Push a copy of the target function, the new target and the actual + // argument count. + __ push(kJavaScriptCallTargetRegister); + __ push(kJavaScriptCallNewTargetRegister); + __ SmiTag(kJavaScriptCallArgCountRegister); + __ push(kJavaScriptCallArgCountRegister); // Function is also the parameter to the runtime call. - __ push(edi); + __ push(kJavaScriptCallTargetRegister); __ CallRuntime(function_id, 1); __ mov(ecx, eax); - // Restore target function and new target. - __ pop(edx); - __ pop(edi); + // Restore target function, new target and actual argument count. + __ pop(kJavaScriptCallArgCountRegister); + __ SmiUntag(kJavaScriptCallArgCountRegister); + __ pop(kJavaScriptCallNewTargetRegister); + __ pop(kJavaScriptCallTargetRegister); } static_assert(kJavaScriptCallCodeStartRegister == ecx, "ABI mismatch"); @@ -831,6 +837,7 @@ static void TailCallRuntimeIfMarkerEquals(MacroAssembler* masm, static void TailCallOptimizedCodeSlot(MacroAssembler* masm, Register optimized_code_entry) { // ----------- S t a t e ------------- + // -- eax : actual argument count // -- edx : new target (preserved for callee if needed, and caller) // -- edi : target function (preserved for callee if needed, and caller) // ----------------------------------- @@ -868,6 +875,7 @@ static void TailCallOptimizedCodeSlot(MacroAssembler* masm, static void MaybeOptimizeCode(MacroAssembler* masm, Register optimization_marker) { // ----------- S t a t e ------------- + // -- eax : actual argument count // -- edx : new target (preserved for callee if needed, and caller) // -- edi : target function (preserved for callee if needed, and caller) // -- optimization_marker : a Smi containing a non-zero optimization marker. @@ -985,10 +993,10 @@ static void AdvanceBytecodeOffsetOrReturn(MacroAssembler* masm, // Generate code for entering a JS function with the interpreter. // On entry to the function the receiver and arguments have been pushed on the -// stack left to right. The actual argument count matches the formal parameter -// count expected by the function. +// stack left to right. // // The live registers are: +// o eax: actual argument count (not including the receiver) // o edi: the JS function object being called // o edx: the incoming new target or generator object // o esi: our context @@ -1000,6 +1008,8 @@ static void AdvanceBytecodeOffsetOrReturn(MacroAssembler* masm, void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) { Register closure = edi; + __ movd(xmm0, eax); // Spill actual argument count. + // The bytecode array could have been flushed from the shared function info, // if so, call into CompileLazy. Label compile_lazy; @@ -1050,8 +1060,10 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) { FrameScope frame_scope(masm, StackFrame::MANUAL); __ push(ebp); // Caller's frame pointer. __ mov(ebp, esp); - __ push(esi); // Callee's context. - __ push(edi); // Callee's JS function. + __ push(kContextRegister); // Callee's context. + __ push(kJavaScriptCallTargetRegister); // Callee's JS function. + __ movd(kJavaScriptCallArgCountRegister, xmm0); + __ push(kJavaScriptCallArgCountRegister); // Actual argument count. // Get the bytecode array from the function object and load it into // kInterpreterBytecodeArrayRegister. @@ -1204,6 +1216,8 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) { __ bind(&optimized_code_slot_not_empty); Label maybe_has_optimized_code; + // Restore actual argument count. + __ movd(eax, xmm0); // Check if optimized code marker is actually a weak reference to the // optimized code as opposed to an optimization marker. __ JumpIfNotSmi(optimized_code_entry, &maybe_has_optimized_code); @@ -1218,6 +1232,8 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) { TailCallOptimizedCodeSlot(masm, optimized_code_entry); __ bind(&compile_lazy); + // Restore actual argument count. + __ movd(eax, xmm0); GenerateTailCallToReturnedCode(masm, Runtime::kCompileLazy); __ bind(&stack_overflow); @@ -2266,38 +2282,88 @@ void Builtins::Generate_CallOrConstructForwardVarargs(MacroAssembler* masm, __ sub(edx, ecx); __ j(less_equal, &stack_done); { - Generate_StackOverflowCheck(masm, edx, ecx, &stack_overflow); + // ----------- S t a t e ------------- + // -- eax : the number of arguments already in the stack (not including the + // receiver) + // -- ecx : start index (to support rest parameters) + // -- edx : number of arguments to copy, i.e. arguments count - start index + // -- edi : the target to call (can be any Object) + // -- esi : point to the caller stack frame + // -- xmm0 : context for the Call / Construct builtin + // -- xmm1 : the new target (for [[Construct]] calls) + // ----------------------------------- // Forward the arguments from the caller frame. +#ifdef V8_REVERSE_JSARGS + __ movd(xmm2, edi); // Preserve the target to call. + Generate_StackOverflowCheck(masm, edx, edi, &stack_overflow); + __ movd(xmm3, ebx); // Preserve root register. + + Register scratch = ebx; + + // Point to the first argument to copy (skipping receiver). + __ lea(ecx, Operand(ecx, times_system_pointer_size, + CommonFrameConstants::kFixedFrameSizeAboveFp + + kSystemPointerSize)); + __ add(esi, ecx); + + // Move the arguments already in the stack, + // including the receiver and the return address. { + Label copy, check; + Register src = ecx, current = edi; + // Update stack pointer. + __ mov(src, esp); + __ lea(scratch, Operand(edx, times_system_pointer_size, 0)); + __ AllocateStackSpace(scratch); + // Include return address and receiver. + __ add(eax, Immediate(2)); + __ Set(current, 0); + __ jmp(&check); + // Loop. + __ bind(©); + __ mov(scratch, Operand(src, current, times_system_pointer_size, 0)); + __ mov(Operand(esp, current, times_system_pointer_size, 0), scratch); + __ inc(current); + __ bind(&check); + __ cmp(current, eax); + __ j(less, ©); + __ lea(ecx, Operand(esp, eax, times_system_pointer_size, 0)); + } + + // Update total number of arguments. + __ sub(eax, Immediate(2)); + __ add(eax, edx); + + // Copy the additional caller arguments onto the stack. + // TODO(victorgomes): Consider using forward order as potentially more cache + // friendly. + { + Register src = esi, dest = ecx, num = edx; Label loop; - __ add(eax, edx); - __ PopReturnAddressTo(ecx); -#ifdef V8_REVERSE_JSARGS - // TODO(victor): When we remove the arguments adaptor machinery above, - // we can free the scratch register and avoid this move. - __ movd(xmm2, ebx); // Save root register. - __ Pop(ebx); // Save new receiver. -#endif __ bind(&loop); - { - __ dec(edx); -#ifdef V8_REVERSE_JSARGS - // Skips old receiver. - __ Push(Operand(scratch, edx, times_system_pointer_size, - kFPOnStackSize + kPCOnStackSize + kSystemPointerSize)); + __ dec(num); + __ mov(scratch, Operand(src, num, times_system_pointer_size, 0)); + __ mov(Operand(dest, num, times_system_pointer_size, 0), scratch); + __ j(not_zero, &loop); + } + + __ movd(ebx, xmm3); // Restore root register. + __ movd(edi, xmm2); // Restore the target to call. #else - __ Push(Operand(scratch, edx, times_system_pointer_size, - kFPOnStackSize + kPCOnStackSize)); -#endif - __ j(not_zero, &loop); - } -#ifdef V8_REVERSE_JSARGS - __ Push(ebx); // Push new receiver. - __ movd(ebx, xmm2); // Recover root register. -#endif - __ PushReturnAddressFrom(ecx); + Generate_StackOverflowCheck(masm, edx, ecx, &stack_overflow); + Label loop; + __ add(eax, edx); + __ PopReturnAddressTo(ecx); + __ bind(&loop); + { + __ dec(edx); + __ Push(Operand(scratch, edx, times_system_pointer_size, + kFPOnStackSize + kPCOnStackSize)); + __ j(not_zero, &loop); } + __ PushReturnAddressFrom(ecx); +#endif } __ bind(&stack_done); @@ -2308,6 +2374,9 @@ void Builtins::Generate_CallOrConstructForwardVarargs(MacroAssembler* masm, __ Jump(code, RelocInfo::CODE_TARGET); __ bind(&stack_overflow); +#ifdef V8_REVERSE_JSARGS + __ movd(edi, xmm2); // Restore the target to call. +#endif __ movd(esi, xmm0); // Restore the context. __ TailCallRuntime(Runtime::kThrowStackOverflow); } diff --git a/deps/v8/src/builtins/ic-callable.tq b/deps/v8/src/builtins/ic-callable.tq index 95e107a9a69f89..8ee7fab17a8105 100644 --- a/deps/v8/src/builtins/ic-callable.tq +++ b/deps/v8/src/builtins/ic-callable.tq @@ -53,6 +53,12 @@ macro TransitionToMegamorphic(implicit context: Context)( macro CollectCallFeedback( maybeTarget: JSAny, context: Context, maybeFeedbackVector: Undefined|FeedbackVector, slotId: uintptr): void { + // TODO(v8:9891): Remove this assert once all callers are ported to Torque. + // This assert ensures correctness of maybeFeedbackVector's type which can + // be easily broken for calls from CSA. + assert( + IsUndefined(maybeFeedbackVector) || + Is(maybeFeedbackVector)); const feedbackVector = Cast(maybeFeedbackVector) otherwise return; IncrementCallCount(feedbackVector, slotId); @@ -97,6 +103,12 @@ macro CollectCallFeedback( macro CollectInstanceOfFeedback( maybeTarget: JSAny, context: Context, maybeFeedbackVector: Undefined|FeedbackVector, slotId: uintptr): void { + // TODO(v8:9891): Remove this assert once all callers are ported to Torque. + // This assert ensures correctness of maybeFeedbackVector's type which can + // be easily broken for calls from CSA. + assert( + IsUndefined(maybeFeedbackVector) || + Is(maybeFeedbackVector)); const feedbackVector = Cast(maybeFeedbackVector) otherwise return; // Note: The call count is not incremented. @@ -134,6 +146,12 @@ macro CollectConstructFeedback(implicit context: Context)( maybeFeedbackVector: Undefined|FeedbackVector, slotId: uintptr): never labels ConstructGeneric, ConstructArray(AllocationSite) { + // TODO(v8:9891): Remove this assert once all callers are ported to Torque. + // This assert ensures correctness of maybeFeedbackVector's type which can + // be easily broken for calls from CSA. + assert( + IsUndefined(maybeFeedbackVector) || + Is(maybeFeedbackVector)); const feedbackVector = Cast(maybeFeedbackVector) otherwise goto ConstructGeneric; IncrementCallCount(feedbackVector, slotId); diff --git a/deps/v8/src/builtins/internal.tq b/deps/v8/src/builtins/internal.tq index b6512da471d32e..c377a2a179c24d 100644 --- a/deps/v8/src/builtins/internal.tq +++ b/deps/v8/src/builtins/internal.tq @@ -14,11 +14,17 @@ extern runtime BytecodeBudgetInterruptFromCode(implicit context: Context)( builtin GetTemplateObject( context: Context, shared: SharedFunctionInfo, description: TemplateObjectDescription, slot: uintptr, - maybeFeedbackVector: FeedbackVector|Undefined): JSArray { + maybeFeedbackVector: Undefined|FeedbackVector): JSArray { // TODO(jgruber): Consider merging with the GetTemplateObject bytecode // handler; the current advantage of the split implementation is that the // bytecode can skip most work if feedback exists. + // TODO(v8:9891): Remove this assert once all callers are ported to Torque. + // This assert ensures correctness of maybeFeedbackVector's type which can + // be easily broken for calls from CSA. + assert( + IsUndefined(maybeFeedbackVector) || + Is(maybeFeedbackVector)); try { const vector = Cast(maybeFeedbackVector) otherwise CallRuntime; diff --git a/deps/v8/src/builtins/iterator.tq b/deps/v8/src/builtins/iterator.tq index 1354c434e7f51a..5d65db0957c1eb 100644 --- a/deps/v8/src/builtins/iterator.tq +++ b/deps/v8/src/builtins/iterator.tq @@ -50,9 +50,16 @@ extern builtin IterableToFixedArrayWithSymbolLookupSlow( transitioning builtin GetIteratorWithFeedback( context: Context, receiver: JSAny, loadSlot: TaggedIndex, - callSlot: TaggedIndex, feedback: Undefined|FeedbackVector): JSAny { + callSlot: TaggedIndex, + maybeFeedbackVector: Undefined|FeedbackVector): JSAny { + // TODO(v8:9891): Remove this assert once all callers are ported to Torque. + // This assert ensures correctness of maybeFeedbackVector's type which can + // be easily broken for calls from CSA. + assert( + IsUndefined(maybeFeedbackVector) || + Is(maybeFeedbackVector)); let iteratorMethod: JSAny; - typeswitch (feedback) { + typeswitch (maybeFeedbackVector) { case (Undefined): { iteratorMethod = GetProperty(receiver, IteratorSymbolConstant()); } @@ -64,7 +71,7 @@ transitioning builtin GetIteratorWithFeedback( // TODO(v8:10047): Use TaggedIndex here once TurboFan supports it. const callSlotSmi: Smi = TaggedIndexToSmi(callSlot); return CallIteratorWithFeedback( - context, receiver, iteratorMethod, callSlotSmi, feedback); + context, receiver, iteratorMethod, callSlotSmi, maybeFeedbackVector); } transitioning builtin CallIteratorWithFeedback( diff --git a/deps/v8/src/builtins/mips/builtins-mips.cc b/deps/v8/src/builtins/mips/builtins-mips.cc index cefa88401d9aa8..66700a71196b13 100644 --- a/deps/v8/src/builtins/mips/builtins-mips.cc +++ b/deps/v8/src/builtins/mips/builtins-mips.cc @@ -40,19 +40,25 @@ void Builtins::Generate_Adaptor(MacroAssembler* masm, Address address) { static void GenerateTailCallToReturnedCode(MacroAssembler* masm, Runtime::FunctionId function_id) { // ----------- S t a t e ------------- + // -- a0 : actual argument count // -- a1 : target function (preserved for callee) // -- a3 : new target (preserved for callee) // ----------------------------------- { FrameScope scope(masm, StackFrame::INTERNAL); - // Push a copy of the target function and the new target. + // Push a copy of the target function, the new target and the actual + // argument count. // Push function as parameter to the runtime call. - __ Push(a1, a3, a1); + __ SmiTag(kJavaScriptCallArgCountRegister); + __ Push(kJavaScriptCallTargetRegister, kJavaScriptCallNewTargetRegister, + kJavaScriptCallArgCountRegister, kJavaScriptCallTargetRegister); __ CallRuntime(function_id, 1); - // Restore target function and new target. - __ Pop(a1, a3); + // Restore target function, new target and actual argument count. + __ Pop(kJavaScriptCallTargetRegister, kJavaScriptCallNewTargetRegister, + kJavaScriptCallArgCountRegister); + __ SmiUntag(kJavaScriptCallArgCountRegister); } static_assert(kJavaScriptCallCodeStartRegister == a2, "ABI mismatch"); @@ -97,33 +103,24 @@ void Generate_JSBuiltinsConstructStubHelper(MacroAssembler* masm) { __ SmiTag(a0); __ Push(cp, a0); __ SmiUntag(a0); - +#ifdef V8_REVERSE_JSARGS + // Set up pointer to last argument (skip receiver). + __ Addu( + t2, fp, + Operand(StandardFrameConstants::kCallerSPOffset + kSystemPointerSize)); + // Copy arguments and receiver to the expression stack. + __ PushArray(t2, a0, t3, t0); + // The receiver for the builtin/api call. + __ PushRoot(RootIndex::kTheHoleValue); +#else // The receiver for the builtin/api call. __ PushRoot(RootIndex::kTheHoleValue); - // Set up pointer to last argument. __ Addu(t2, fp, Operand(StandardFrameConstants::kCallerSPOffset)); // Copy arguments and receiver to the expression stack. - Label loop, entry; - __ mov(t3, a0); - // ----------- S t a t e ------------- - // -- a0: number of arguments (untagged) - // -- a3: new target - // -- t2: pointer to last argument - // -- t3: counter - // -- sp[0*kPointerSize]: the hole (receiver) - // -- sp[1*kPointerSize]: number of arguments (tagged) - // -- sp[2*kPointerSize]: context - // ----------------------------------- - __ jmp(&entry); - __ bind(&loop); - __ Lsa(t0, t2, t3, kPointerSizeLog2); - __ lw(t1, MemOperand(t0)); - __ push(t1); - __ bind(&entry); - __ Addu(t3, t3, Operand(-1)); - __ Branch(&loop, greater_equal, t3, Operand(zero_reg)); + __ PushArray(t2, a0, t3, t0); +#endif // Call the function. // a0: number of arguments (untagged) @@ -134,12 +131,12 @@ void Generate_JSBuiltinsConstructStubHelper(MacroAssembler* masm) { // Restore context from the frame. __ lw(cp, MemOperand(fp, ConstructFrameConstants::kContextOffset)); // Restore smi-tagged arguments count from the frame. - __ lw(a1, MemOperand(fp, ConstructFrameConstants::kLengthOffset)); + __ lw(t3, MemOperand(fp, ConstructFrameConstants::kLengthOffset)); // Leave construct frame. } // Remove caller arguments from the stack and return. - __ Lsa(sp, sp, a1, kPointerSizeLog2 - 1); + __ Lsa(sp, sp, t3, kPointerSizeLog2 - 1); __ Addu(sp, sp, kPointerSize); __ Ret(); } @@ -224,11 +221,30 @@ void Builtins::Generate_JSConstructStubGeneric(MacroAssembler* masm) { // Restore new target. __ Pop(a3); + +#ifdef V8_REVERSE_JSARGS + // Push the allocated receiver to the stack. + __ Push(v0); + // We need two copies because we may have to return the original one + // and the calling conventions dictate that the called function pops the + // receiver. The second copy is pushed after the arguments, we saved in s0 + // since v0 will store the return value of callRuntime. + __ mov(s0, v0); + + // Set up pointer to last argument. + __ Addu( + t2, fp, + Operand(StandardFrameConstants::kCallerSPOffset + kSystemPointerSize)); +#else // Push the allocated receiver to the stack. We need two copies // because we may have to return the original one and the calling // conventions dictate that the called function pops the receiver. __ Push(v0, v0); + // Set up pointer to last argument. + __ Addu(t2, fp, Operand(StandardFrameConstants::kCallerSPOffset)); +#endif + // ----------- S t a t e ------------- // -- r3: new target // -- sp[0*kPointerSize]: implicit receiver @@ -244,9 +260,6 @@ void Builtins::Generate_JSConstructStubGeneric(MacroAssembler* masm) { __ lw(a0, MemOperand(fp, ConstructFrameConstants::kLengthOffset)); __ SmiUntag(a0); - // Set up pointer to last argument. - __ Addu(t2, fp, Operand(StandardFrameConstants::kCallerSPOffset)); - Label enough_stack_space, stack_overflow; Generate_StackOverflowCheck(masm, a0, t0, t1, &stack_overflow); __ Branch(&enough_stack_space); @@ -261,28 +274,13 @@ void Builtins::Generate_JSConstructStubGeneric(MacroAssembler* masm) { __ bind(&enough_stack_space); // Copy arguments and receiver to the expression stack. - Label loop, entry; - __ mov(t3, a0); - // ----------- S t a t e ------------- - // -- a0: number of arguments (untagged) - // -- a3: new target - // -- t2: pointer to last argument - // -- t3: counter - // -- sp[0*kPointerSize]: implicit receiver - // -- sp[1*kPointerSize]: implicit receiver - // -- sp[2*kPointerSize]: padding - // -- a1 and sp[3*kPointerSize]: constructor function - // -- sp[4*kPointerSize]: number of arguments (tagged) - // -- sp[5*kPointerSize]: context - // ----------------------------------- - __ jmp(&entry); - __ bind(&loop); - __ Lsa(t0, t2, t3, kPointerSizeLog2); - __ lw(t1, MemOperand(t0)); - __ push(t1); - __ bind(&entry); - __ Addu(t3, t3, Operand(-1)); - __ Branch(&loop, greater_equal, t3, Operand(zero_reg)); + __ PushArray(t2, a0, t0, t1); +#ifdef V8_REVERSE_JSARGS + // We need two copies because we may have to return the original one + // and the calling conventions dictate that the called function pops the + // receiver. The second copy is pushed after the arguments. + __ Push(s0); +#endif // Call the function. __ InvokeFunctionWithNewTarget(a1, a3, a0, CALL_FUNCTION); @@ -577,11 +575,8 @@ static void Generate_JSEntryTrampolineHelper(MacroAssembler* masm, __ li(cp, context_address); __ lw(cp, MemOperand(cp)); - // Push the function and the receiver onto the stack. - __ Push(a2, a3); - - __ mov(a3, a1); - __ mov(a1, a2); + // Push the function onto the stack. + __ Push(a2); __ lw(s0, MemOperand(fp, StandardFrameConstants::kCallerFPOffset)); __ lw(a0, @@ -589,18 +584,34 @@ static void Generate_JSEntryTrampolineHelper(MacroAssembler* masm, __ lw(s0, MemOperand(s0, kPushedStackSpace + EntryFrameConstants::kArgvOffset)); - // a0: argc - // a1: function - // a3: new.target - // s0: argv - // Check if we have enough stack space to push all arguments. // Clobbers a2 and t0. - Generate_CheckStackOverflow(masm, a0, a2, t0); + __ addiu(t1, a0, 1); + Generate_CheckStackOverflow(masm, t1, t0, t2); // Copy arguments to the stack in a loop. // a0: argc // s0: argv, i.e. points to first arg +#ifdef V8_REVERSE_JSARGS + Label loop, entry; + __ Lsa(t2, s0, a0, kPointerSizeLog2); + __ b(&entry); + __ nop(); // Branch delay slot nop. + // t2 points past last arg. + __ bind(&loop); + __ addiu(t2, t2, -kPointerSize); + __ lw(t0, MemOperand(t2)); // Read next parameter. + __ lw(t0, MemOperand(t0)); // Dereference handle. + __ push(t0); // Push parameter. + __ bind(&entry); + __ Branch(&loop, ne, s0, Operand(t2)); + + // Push the receiver. + __ Push(a3); +#else + // Push the receiver. + __ Push(a3); + Label loop, entry; __ Lsa(t2, s0, a0, kPointerSizeLog2); __ b(&entry); @@ -613,10 +624,13 @@ static void Generate_JSEntryTrampolineHelper(MacroAssembler* masm, __ push(t0); // Push parameter. __ bind(&entry); __ Branch(&loop, ne, s0, Operand(t2)); +#endif // a0: argc // a1: function // a3: new.target + __ mov(a3, a1); + __ mov(a1, a2); // Initialize all JavaScript callee-saved registers, since they will be seen // by the garbage collector as part of handlers. @@ -711,9 +725,11 @@ void Builtins::Generate_ResumeGeneratorTrampoline(MacroAssembler* masm) { LoadStackLimit(masm, kScratchReg, StackLimitKind::kRealStackLimit); __ Branch(&stack_overflow, lo, sp, Operand(kScratchReg)); +#ifndef V8_REVERSE_JSARGS // Push receiver. __ lw(t1, FieldMemOperand(a1, JSGeneratorObject::kReceiverOffset)); __ Push(t1); +#endif // ----------- S t a t e ------------- // -- a1 : the JSGeneratorObject to resume @@ -731,6 +747,20 @@ void Builtins::Generate_ResumeGeneratorTrampoline(MacroAssembler* masm) { __ lw(t1, FieldMemOperand(a1, JSGeneratorObject::kParametersAndRegistersOffset)); { +#ifdef V8_REVERSE_JSARGS + Label done_loop, loop; + __ bind(&loop); + __ Subu(a3, a3, Operand(1)); + __ Branch(&done_loop, lt, a3, Operand(zero_reg)); + __ Lsa(kScratchReg, t1, a3, kPointerSizeLog2); + __ Lw(kScratchReg, FieldMemOperand(kScratchReg, FixedArray::kHeaderSize)); + __ Push(kScratchReg); + __ Branch(&loop); + __ bind(&done_loop); + // Push receiver. + __ Lw(kScratchReg, FieldMemOperand(a1, JSGeneratorObject::kReceiverOffset)); + __ Push(kScratchReg); +#else Label done_loop, loop; __ Move(t2, zero_reg); __ bind(&loop); @@ -742,6 +772,7 @@ void Builtins::Generate_ResumeGeneratorTrampoline(MacroAssembler* masm) { __ Addu(t2, t2, Operand(1)); __ Branch(&loop); __ bind(&done_loop); +#endif } // Underlying function needs to have bytecode available. @@ -844,6 +875,7 @@ static void TailCallOptimizedCodeSlot(MacroAssembler* masm, Register optimized_code_entry, Register scratch1, Register scratch2) { // ----------- S t a t e ------------- + // -- a0 : actual argument count // -- a3 : new target (preserved for callee if needed, and caller) // -- a1 : target function (preserved for callee if needed, and caller) // ----------------------------------- @@ -880,6 +912,7 @@ static void TailCallOptimizedCodeSlot(MacroAssembler* masm, static void MaybeOptimizeCode(MacroAssembler* masm, Register feedback_vector, Register optimization_marker) { // ----------- S t a t e ------------- + // -- a0 : actual argument count // -- a3 : new target (preserved for callee if needed, and caller) // -- a1 : target function (preserved for callee if needed, and caller) // -- feedback vector (preserved for caller if needed) @@ -989,10 +1022,10 @@ static void AdvanceBytecodeOffsetOrReturn(MacroAssembler* masm, // Generate code for entering a JS function with the interpreter. // On entry to the function the receiver and arguments have been pushed on the -// stack left to right. The actual argument count matches the formal parameter -// count expected by the function. +// stack left to right. // // The live registers are: +// o a0 : actual argument count (not including the receiver) // o a1: the JS function object being called. // o a3: the incoming new target or generator object // o cp: our context @@ -1008,16 +1041,18 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) { // Get the bytecode array from the function object and load it into // kInterpreterBytecodeArrayRegister. - __ lw(a0, FieldMemOperand(closure, JSFunction::kSharedFunctionInfoOffset)); + __ lw(kScratchReg, + FieldMemOperand(closure, JSFunction::kSharedFunctionInfoOffset)); __ lw(kInterpreterBytecodeArrayRegister, - FieldMemOperand(a0, SharedFunctionInfo::kFunctionDataOffset)); - GetSharedFunctionInfoBytecode(masm, kInterpreterBytecodeArrayRegister, t0); + FieldMemOperand(kScratchReg, SharedFunctionInfo::kFunctionDataOffset)); + GetSharedFunctionInfoBytecode(masm, kInterpreterBytecodeArrayRegister, + kScratchReg); // The bytecode array could have been flushed from the shared function info, // if so, call into CompileLazy. Label compile_lazy; - __ GetObjectType(kInterpreterBytecodeArrayRegister, a0, a0); - __ Branch(&compile_lazy, ne, a0, Operand(BYTECODE_ARRAY_TYPE)); + __ GetObjectType(kInterpreterBytecodeArrayRegister, kScratchReg, kScratchReg); + __ Branch(&compile_lazy, ne, kScratchReg, Operand(BYTECODE_ARRAY_TYPE)); // Load the feedback vector from the closure. __ lw(feedback_vector, @@ -1215,22 +1250,21 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) { } static void Generate_InterpreterPushArgs(MacroAssembler* masm, - Register num_args, Register index, + Register num_args, + Register start_address, Register scratch, Register scratch2) { // Find the address of the last argument. - __ mov(scratch2, num_args); - __ sll(scratch2, scratch2, kPointerSizeLog2); - __ Subu(scratch2, index, Operand(scratch2)); + __ Subu(scratch, num_args, Operand(1)); + __ sll(scratch, scratch, kPointerSizeLog2); + __ Subu(start_address, start_address, scratch); // Push the arguments. - Label loop_header, loop_check; - __ Branch(&loop_check); - __ bind(&loop_header); - __ lw(scratch, MemOperand(index)); - __ Addu(index, index, Operand(-kPointerSize)); - __ push(scratch); - __ bind(&loop_check); - __ Branch(&loop_header, hi, index, Operand(scratch2)); +#ifdef V8_REVERSE_JSARGS + __ PushArray(start_address, num_args, scratch, scratch2, + TurboAssembler::PushArrayOrder::kReverse); +#else + __ PushArray(start_address, num_args, scratch, scratch2); +#endif } // static @@ -1247,10 +1281,37 @@ void Builtins::Generate_InterpreterPushArgsThenCallImpl( // ----------------------------------- Label stack_overflow; +#ifdef V8_REVERSE_JSARGS + if (mode == InterpreterPushArgsMode::kWithFinalSpread) { + // The spread argument should not be pushed. + __ Subu(a0, a0, Operand(1)); + } +#endif + __ Addu(t0, a0, Operand(1)); // Add one for receiver. Generate_StackOverflowCheck(masm, t0, t4, t1, &stack_overflow); +#ifdef V8_REVERSE_JSARGS + if (receiver_mode == ConvertReceiverMode::kNullOrUndefined) { + // Don't copy receiver. + __ mov(t0, a0); + } + + // This function modifies a2, t4 and t1. + Generate_InterpreterPushArgs(masm, t0, a2, t4, t1); + + if (receiver_mode == ConvertReceiverMode::kNullOrUndefined) { + __ PushRoot(RootIndex::kUndefinedValue); + } + + if (mode == InterpreterPushArgsMode::kWithFinalSpread) { + // Pass the spread in the register a2. + // a2 already points to the penultime argument, the spread + // is below that. + __ Lw(a2, MemOperand(a2, -kSystemPointerSize)); + } +#else // Push "undefined" as the receiver arg if we need to. if (receiver_mode == ConvertReceiverMode::kNullOrUndefined) { __ PushRoot(RootIndex::kUndefinedValue); @@ -1264,6 +1325,7 @@ void Builtins::Generate_InterpreterPushArgsThenCallImpl( __ Pop(a2); // Pass the spread in a register __ Subu(a0, a0, Operand(1)); // Subtract one for spread } +#endif // Call the target. if (mode == InterpreterPushArgsMode::kWithFinalSpread) { @@ -1293,11 +1355,32 @@ void Builtins::Generate_InterpreterPushArgsThenConstructImpl( // -- t4 : address of the first argument // ----------------------------------- Label stack_overflow; + __ addiu(t2, a0, 1); + Generate_StackOverflowCheck(masm, t2, t1, t0, &stack_overflow); + +#ifdef V8_REVERSE_JSARGS + if (mode == InterpreterPushArgsMode::kWithFinalSpread) { + // The spread argument should not be pushed. + __ Subu(a0, a0, Operand(1)); + } + + Generate_InterpreterPushArgs(masm, a0, t4, t1, t0); // Push a slot for the receiver. __ push(zero_reg); - Generate_StackOverflowCheck(masm, a0, t1, t0, &stack_overflow); + if (mode == InterpreterPushArgsMode::kWithFinalSpread) { + // Pass the spread in the register a2. + // t4 already points to the penultimate argument, the spread + // lies in the next interpreter register. + // __ Subu(t4, t4, Operand(kSystemPointerSize)); + __ Lw(a2, MemOperand(t4, -kSystemPointerSize)); + } else { + __ AssertUndefinedOrAllocationSite(a2, t0); + } +#else + // Push a slot for the receiver. + __ push(zero_reg); // This function modified t4, t1 and t0. Generate_InterpreterPushArgs(masm, a0, t4, t1, t0); @@ -1308,6 +1391,7 @@ void Builtins::Generate_InterpreterPushArgsThenConstructImpl( } else { __ AssertUndefinedOrAllocationSite(a2, t0); } +#endif if (mode == InterpreterPushArgsMode::kArrayFunction) { __ AssertFunction(a1); @@ -1467,13 +1551,30 @@ void Generate_ContinueToBuiltinHelper(MacroAssembler* masm, bool with_result) { const RegisterConfiguration* config(RegisterConfiguration::Default()); int allocatable_register_count = config->num_allocatable_general_registers(); + UseScratchRegisterScope temps(masm); + Register scratch = temps.Acquire(); // Temp register is not allocatable. + // Register scratch = t3; if (with_result) { +#ifdef V8_REVERSE_JSARGS + if (java_script_builtin) { + __ mov(scratch, v0); + } else { + // Overwrite the hole inserted by the deoptimizer with the return value + // from the LAZY deopt point. + __ sw(v0, + MemOperand( + sp, config->num_allocatable_general_registers() * kPointerSize + + BuiltinContinuationFrameConstants::kFixedFrameSize)); + } +#else // Overwrite the hole inserted by the deoptimizer with the return value from // the LAZY deopt point. __ sw(v0, MemOperand( sp, config->num_allocatable_general_registers() * kPointerSize + BuiltinContinuationFrameConstants::kFixedFrameSize)); + USE(scratch); +#endif } for (int i = allocatable_register_count - 1; i >= 0; --i) { int code = config->GetAllocatableGeneralCode(i); @@ -1482,6 +1583,22 @@ void Generate_ContinueToBuiltinHelper(MacroAssembler* masm, __ SmiUntag(Register::from_code(code)); } } + +#ifdef V8_REVERSE_JSARGS + if (with_result && java_script_builtin) { + // Overwrite the hole inserted by the deoptimizer with the return value from + // the LAZY deopt point. t0 contains the arguments count, the return value + // from LAZY is always the last argument. + __ Addu(a0, a0, + Operand(BuiltinContinuationFrameConstants::kFixedSlotCount)); + __ Lsa(t0, sp, a0, kSystemPointerSizeLog2); + __ Sw(scratch, MemOperand(t0)); + // Recover arguments count. + __ Subu(a0, a0, + Operand(BuiltinContinuationFrameConstants::kFixedSlotCount)); + } +#endif + __ lw(fp, MemOperand( sp, BuiltinContinuationFrameConstants::kFixedFrameSizeFromFp)); // Load builtin index (stored as a Smi) and use it to get the builtin start @@ -1568,15 +1685,25 @@ void Builtins::Generate_FunctionPrototypeApply(MacroAssembler* masm) { // -- sp[8] : receiver // ----------------------------------- - // 1. Load receiver into a1, argArray into a0 (if present), remove all + // 1. Load receiver into a1, argArray into a2 (if present), remove all // arguments from the stack (including the receiver), and push thisArg (if // present) instead. { Label no_arg; - Register scratch = t0; __ LoadRoot(a2, RootIndex::kUndefinedValue); __ mov(a3, a2); // Lsa() cannot be used hare as scratch value used later. +#ifdef V8_REVERSE_JSARGS + __ lw(a1, MemOperand(sp)); // receiver + __ Branch(&no_arg, eq, a0, Operand(zero_reg)); + __ lw(a3, MemOperand(sp, kSystemPointerSize)); // thisArg + __ Branch(&no_arg, eq, a0, Operand(1)); + __ lw(a2, MemOperand(sp, 2 * kSystemPointerSize)); // argArray + __ bind(&no_arg); + __ Lsa(sp, sp, a0, kPointerSizeLog2); + __ sw(a3, MemOperand(sp)); +#else + Register scratch = t0; __ sll(scratch, a0, kPointerSizeLog2); __ Addu(a0, sp, Operand(scratch)); __ lw(a1, MemOperand(a0)); // receiver @@ -1590,6 +1717,7 @@ void Builtins::Generate_FunctionPrototypeApply(MacroAssembler* masm) { __ Addu(sp, sp, Operand(scratch)); __ sw(a2, MemOperand(sp)); __ mov(a2, a3); +#endif } // ----------- S t a t e ------------- @@ -1622,6 +1750,23 @@ void Builtins::Generate_FunctionPrototypeApply(MacroAssembler* masm) { // static void Builtins::Generate_FunctionPrototypeCall(MacroAssembler* masm) { +#ifdef V8_REVERSE_JSARGS + // 1. Get the callable to call (passed as receiver) from the stack. + __ Pop(a1); + + // 2. Make sure we have at least one argument. + // a0: actual number of arguments + { + Label done; + __ Branch(&done, ne, a0, Operand(zero_reg)); + __ PushRoot(RootIndex::kUndefinedValue); + __ Addu(a0, a0, Operand(1)); + __ bind(&done); + } + + // 3. Adjust the actual number of arguments. + __ addiu(a0, a0, -1); +#else // 1. Make sure we have at least one argument. // a0: actual number of arguments { @@ -1634,8 +1779,7 @@ void Builtins::Generate_FunctionPrototypeCall(MacroAssembler* masm) { // 2. Get the function to call (passed as receiver) from the stack. // a0: actual number of arguments - __ Lsa(kScratchReg, sp, a0, kPointerSizeLog2); - __ lw(a1, MemOperand(kScratchReg)); + __ LoadReceiver(a1, a0); // 3. Shift arguments and return address one slot down on the stack // (overwriting the original receiver). Adjust argument count to make @@ -1657,6 +1801,7 @@ void Builtins::Generate_FunctionPrototypeCall(MacroAssembler* masm) { __ Subu(a0, a0, Operand(1)); __ Pop(); } +#endif // 4. Call the callable. __ Jump(masm->isolate()->builtins()->Call(), RelocInfo::CODE_TARGET); @@ -1676,10 +1821,21 @@ void Builtins::Generate_ReflectApply(MacroAssembler* masm) { // thisArgument (if present) instead. { Label no_arg; - Register scratch = t0; __ LoadRoot(a1, RootIndex::kUndefinedValue); __ mov(a2, a1); __ mov(a3, a1); +#ifdef V8_REVERSE_JSARGS + __ Branch(&no_arg, eq, a0, Operand(zero_reg)); + __ lw(a1, MemOperand(sp, kSystemPointerSize)); // target + __ Branch(&no_arg, eq, a0, Operand(1)); + __ lw(a3, MemOperand(sp, 2 * kSystemPointerSize)); // thisArgument + __ Branch(&no_arg, eq, a0, Operand(2)); + __ lw(a2, MemOperand(sp, 3 * kSystemPointerSize)); // argumentsList + __ bind(&no_arg); + __ Lsa(sp, sp, a0, kPointerSizeLog2); + __ sw(a3, MemOperand(sp)); +#else + Register scratch = t0; __ sll(scratch, a0, kPointerSizeLog2); __ mov(a0, scratch); __ Subu(a0, a0, Operand(kPointerSize)); @@ -1696,6 +1852,7 @@ void Builtins::Generate_ReflectApply(MacroAssembler* masm) { __ Addu(sp, sp, Operand(scratch)); __ sw(a2, MemOperand(sp)); __ mov(a2, a3); +#endif } // ----------- S t a t e ------------- @@ -1721,16 +1878,30 @@ void Builtins::Generate_ReflectConstruct(MacroAssembler* masm) { // -- sp[8] : target // -- sp[12] : receiver // ----------------------------------- + // NOTE: The order of args in the stack are reversed if V8_REVERSE_JSARGS - // 1. Load target into a1 (if present), argumentsList into a0 (if present), + // 1. Load target into a1 (if present), argumentsList into a2 (if present), // new.target into a3 (if present, otherwise use target), remove all // arguments from the stack (including the receiver), and push thisArgument // (if present) instead. { Label no_arg; - Register scratch = t0; __ LoadRoot(a1, RootIndex::kUndefinedValue); __ mov(a2, a1); +#ifdef V8_REVERSE_JSARGS + __ mov(t0, a1); + __ Branch(&no_arg, eq, a0, Operand(zero_reg)); + __ lw(a1, MemOperand(sp, kSystemPointerSize)); // target + __ mov(a3, a1); // new.target defaults to target + __ Branch(&no_arg, eq, a0, Operand(1)); + __ lw(a2, MemOperand(sp, 2 * kSystemPointerSize)); // argumentsList + __ Branch(&no_arg, eq, a0, Operand(2)); + __ lw(a3, MemOperand(sp, 3 * kSystemPointerSize)); // new.target + __ bind(&no_arg); + __ Lsa(sp, sp, a0, kPointerSizeLog2); + __ sw(t0, MemOperand(sp)); // set undefined to the receiver +#else + Register scratch = t0; // Lsa() cannot be used hare as scratch value used later. __ sll(scratch, a0, kPointerSizeLog2); __ Addu(a0, sp, Operand(scratch)); @@ -1747,6 +1918,7 @@ void Builtins::Generate_ReflectConstruct(MacroAssembler* masm) { __ lw(a3, MemOperand(a0)); // new.target __ bind(&no_arg); __ Addu(sp, sp, Operand(scratch)); +#endif } // ----------- S t a t e ------------- @@ -1821,6 +1993,29 @@ void Builtins::Generate_CallOrConstructVarargs(MacroAssembler* masm, Label stack_overflow; Generate_StackOverflowCheck(masm, t0, kScratchReg, t1, &stack_overflow); +#ifdef V8_REVERSE_JSARGS + // Move the arguments already in the stack, + // including the receiver and the return address. + { + Label copy; + Register src = t3, dest = t4; + __ mov(src, sp); + __ sll(t1, t0, kSystemPointerSizeLog2); + __ Subu(sp, sp, Operand(t1)); + // Update stack pointer. + __ mov(dest, sp); + __ Addu(t1, a0, Operand(zero_reg)); + + __ bind(©); + __ Lw(t2, MemOperand(src, 0)); + __ Sw(t2, MemOperand(dest, 0)); + __ Subu(t1, t1, Operand(1)); + __ Addu(src, src, Operand(kSystemPointerSize)); + __ Addu(dest, dest, Operand(kSystemPointerSize)); + __ Branch(©, ge, t1, Operand(zero_reg)); + } +#endif + // Push arguments onto the stack (thisArgument is already on the stack). { __ mov(t2, zero_reg); @@ -1830,11 +2025,16 @@ void Builtins::Generate_CallOrConstructVarargs(MacroAssembler* masm, __ Branch(&done, eq, t2, Operand(t0)); __ Lsa(kScratchReg, a2, t2, kPointerSizeLog2); __ lw(kScratchReg, FieldMemOperand(kScratchReg, FixedArray::kHeaderSize)); + __ Addu(t2, t2, Operand(1)); __ Branch(&push, ne, t1, Operand(kScratchReg)); __ LoadRoot(kScratchReg, RootIndex::kUndefinedValue); __ bind(&push); +#ifdef V8_REVERSE_JSARGS + __ Sw(kScratchReg, MemOperand(t4, 0)); + __ Addu(t4, t4, Operand(kSystemPointerSize)); +#else __ Push(kScratchReg); - __ Addu(t2, t2, Operand(1)); +#endif __ Branch(&loop); __ bind(&done); __ Addu(a0, a0, t2); @@ -1906,15 +2106,56 @@ void Builtins::Generate_CallOrConstructForwardVarargs(MacroAssembler* masm, Generate_StackOverflowCheck(masm, t2, t0, t1, &stack_overflow); // Forward the arguments from the caller frame. + +#ifdef V8_REVERSE_JSARGS + // Point to the first argument to copy (skipping the receiver). + __ Addu(t3, t3, + Operand(CommonFrameConstants::kFixedFrameSizeAboveFp + + kSystemPointerSize)); + __ Lsa(t3, t3, a2, kSystemPointerSizeLog2); + + // Move the arguments already in the stack, + // including the receiver and the return address. + { + Label copy; + Register src = t5, dest = a2; + __ mov(src, sp); + // Update stack pointer. + __ sll(t6, t2, kSystemPointerSizeLog2); + __ Subu(sp, sp, Operand(t6)); + __ mov(dest, sp); + __ Addu(t7, a0, Operand(zero_reg)); + + __ bind(©); + __ Lw(t6, MemOperand(src, 0)); + __ Sw(t6, MemOperand(dest, 0)); + __ Subu(t7, t7, Operand(1)); + __ Addu(src, src, Operand(kSystemPointerSize)); + __ Addu(dest, dest, Operand(kSystemPointerSize)); + __ Branch(©, ge, t7, Operand(zero_reg)); + } +#endif + + // Copy arguments from the caller frame. + // TODO(victorgomes): Consider using forward order as potentially more cache + // friendly. { Label loop; +#ifndef V8_REVERSE_JSARGS + __ Addu(t3, t3, Operand(CommonFrameConstants::kFixedFrameSizeAboveFp)); +#endif __ Addu(a0, a0, t2); __ bind(&loop); { + __ Subu(t2, t2, Operand(1)); __ Lsa(kScratchReg, t3, t2, kPointerSizeLog2); - __ lw(kScratchReg, MemOperand(kScratchReg, 1 * kPointerSize)); + __ lw(kScratchReg, MemOperand(kScratchReg)); +#ifdef V8_REVERSE_JSARGS + __ Lsa(t0, a2, t2, kPointerSizeLog2); + __ Sw(kScratchReg, MemOperand(t0)); +#else __ push(kScratchReg); - __ Subu(t2, t2, Operand(1)); +#endif __ Branch(&loop, ne, t2, Operand(zero_reg)); } } @@ -1970,8 +2211,7 @@ void Builtins::Generate_CallFunction(MacroAssembler* masm, __ LoadGlobalProxy(a3); } else { Label convert_to_object, convert_receiver; - __ Lsa(kScratchReg, sp, a0, kPointerSizeLog2); - __ lw(a3, MemOperand(kScratchReg)); + __ LoadReceiver(a3, a0); __ JumpIfSmi(a3, &convert_to_object); STATIC_ASSERT(LAST_JS_RECEIVER_TYPE == LAST_TYPE); __ GetObjectType(a3, t0, t0); @@ -2007,8 +2247,7 @@ void Builtins::Generate_CallFunction(MacroAssembler* masm, __ lw(a2, FieldMemOperand(a1, JSFunction::kSharedFunctionInfoOffset)); __ bind(&convert_receiver); } - __ Lsa(kScratchReg, sp, a0, kPointerSizeLog2); - __ sw(a3, MemOperand(kScratchReg)); + __ StoreReceiver(a3, a0, kScratchReg); } __ bind(&done_convert); @@ -2042,9 +2281,8 @@ void Builtins::Generate_CallBoundFunctionImpl(MacroAssembler* masm) { // Patch the receiver to [[BoundThis]]. { - __ lw(kScratchReg, FieldMemOperand(a1, JSBoundFunction::kBoundThisOffset)); - __ Lsa(t0, sp, a0, kPointerSizeLog2); - __ sw(kScratchReg, MemOperand(t0)); + __ lw(t0, FieldMemOperand(a1, JSBoundFunction::kBoundThisOffset)); + __ StoreReceiver(t0, a0, kScratchReg); } // Load [[BoundArguments]] into a2 and length of that into t0. @@ -2063,13 +2301,11 @@ void Builtins::Generate_CallBoundFunctionImpl(MacroAssembler* masm) { { Label done; __ sll(t1, t0, kPointerSizeLog2); - __ Subu(sp, sp, Operand(t1)); + __ Subu(t1, sp, Operand(t1)); // Check the stack for overflow. We are not trying to catch interruptions // (i.e. debug break and preemption) here, so check the "real stack limit". LoadStackLimit(masm, kScratchReg, StackLimitKind::kRealStackLimit); - __ Branch(&done, hs, sp, Operand(kScratchReg)); - // Restore the stack pointer. - __ Addu(sp, sp, Operand(t1)); + __ Branch(&done, hs, t1, Operand(kScratchReg)); { FrameScope scope(masm, StackFrame::MANUAL); __ EnterFrame(StackFrame::INTERNAL); @@ -2078,6 +2314,29 @@ void Builtins::Generate_CallBoundFunctionImpl(MacroAssembler* masm) { __ bind(&done); } +#ifdef V8_REVERSE_JSARGS + // Pop receiver. + __ Pop(t1); + + // Push [[BoundArguments]]. + { + Label loop, done_loop; + __ Addu(a0, a0, Operand(t0)); + __ Addu(a2, a2, Operand(FixedArray::kHeaderSize - kHeapObjectTag)); + __ bind(&loop); + __ Subu(t0, t0, Operand(1)); + __ Branch(&done_loop, lt, t0, Operand(zero_reg)); + __ Lsa(kScratchReg, a2, t0, kPointerSizeLog2); + __ Lw(kScratchReg, MemOperand(kScratchReg)); + __ Push(kScratchReg); + __ Branch(&loop); + __ bind(&done_loop); + } + + // Push receiver. + __ Push(t1); +#else + __ mov(sp, t1); // Relocate arguments down the stack. { Label loop, done_loop; @@ -2111,6 +2370,7 @@ void Builtins::Generate_CallBoundFunctionImpl(MacroAssembler* masm) { __ Branch(&loop); __ bind(&done_loop); } +#endif // Call the [[BoundTargetFunction]] via the Call builtin. __ lw(a1, FieldMemOperand(a1, JSBoundFunction::kBoundTargetFunctionOffset)); @@ -2146,8 +2406,7 @@ void Builtins::Generate_Call(MacroAssembler* masm, ConvertReceiverMode mode) { // 2. Call to something else, which might have a [[Call]] internal method (if // not we raise an exception). // Overwrite the original receiver with the (original) target. - __ Lsa(kScratchReg, sp, a0, kPointerSizeLog2); - __ sw(a1, MemOperand(kScratchReg)); + __ StoreReceiver(a1, a0, kScratchReg); // Let the "call_as_function_delegate" take care of the rest. __ LoadNativeContextSlot(Context::CALL_AS_FUNCTION_DELEGATE_INDEX, a1); __ Jump(masm->isolate()->builtins()->CallFunction( @@ -2220,13 +2479,11 @@ void Builtins::Generate_ConstructBoundFunction(MacroAssembler* masm) { { Label done; __ sll(t1, t0, kPointerSizeLog2); - __ Subu(sp, sp, Operand(t1)); + __ Subu(t1, sp, Operand(t1)); // Check the stack for overflow. We are not trying to catch interruptions // (i.e. debug break and preemption) here, so check the "real stack limit". LoadStackLimit(masm, kScratchReg, StackLimitKind::kRealStackLimit); - __ Branch(&done, hs, sp, Operand(kScratchReg)); - // Restore the stack pointer. - __ Addu(sp, sp, Operand(t1)); + __ Branch(&done, hs, t1, Operand(kScratchReg)); { FrameScope scope(masm, StackFrame::MANUAL); __ EnterFrame(StackFrame::INTERNAL); @@ -2235,6 +2492,29 @@ void Builtins::Generate_ConstructBoundFunction(MacroAssembler* masm) { __ bind(&done); } +#ifdef V8_REVERSE_JSARGS + // Pop receiver + __ Pop(t1); + + // Push [[BoundArguments]]. + { + Label loop, done_loop; + __ Addu(a0, a0, Operand(t0)); + __ Addu(a2, a2, Operand(FixedArray::kHeaderSize - kHeapObjectTag)); + __ bind(&loop); + __ Subu(t0, t0, Operand(1)); + __ Branch(&done_loop, lt, t0, Operand(zero_reg)); + __ Lsa(kScratchReg, a2, t0, kPointerSizeLog2); + __ Lw(kScratchReg, MemOperand(kScratchReg)); + __ Push(kScratchReg); + __ Branch(&loop); + __ bind(&done_loop); + } + + // Push receiver. + __ Push(t1); +#else + __ mov(sp, t1); // Relocate arguments down the stack. { Label loop, done_loop; @@ -2268,6 +2548,7 @@ void Builtins::Generate_ConstructBoundFunction(MacroAssembler* masm) { __ Branch(&loop); __ bind(&done_loop); } +#endif // Patch new.target to [[BoundTargetFunction]] if new.target equals target. { @@ -2320,8 +2601,7 @@ void Builtins::Generate_Construct(MacroAssembler* masm) { __ bind(&non_proxy); { // Overwrite the original receiver with the (original) target. - __ Lsa(kScratchReg, sp, a0, kPointerSizeLog2); - __ sw(a1, MemOperand(kScratchReg)); + __ StoreReceiver(a1, a0, kScratchReg); // Let the "call_as_constructor_delegate" take care of the rest. __ LoadNativeContextSlot(Context::CALL_AS_CONSTRUCTOR_DELEGATE_INDEX, a1); __ Jump(masm->isolate()->builtins()->CallFunction(), @@ -2362,7 +2642,11 @@ void Builtins::Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm) { Generate_StackOverflowCheck(masm, a2, t1, kScratchReg, &stack_overflow); // Calculate copy start address into a0 and copy end address into t1. +#ifdef V8_REVERSE_JSARGS + __ Lsa(a0, fp, a2, kPointerSizeLog2); +#else __ Lsa(a0, fp, a0, kPointerSizeLog2 - kSmiTagSize); +#endif // Adjust for return address and receiver. __ Addu(a0, a0, Operand(2 * kPointerSize)); // Compute copy end address. @@ -2391,6 +2675,37 @@ void Builtins::Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm) { EnterArgumentsAdaptorFrame(masm); Generate_StackOverflowCheck(masm, a2, t1, kScratchReg, &stack_overflow); +#ifdef V8_REVERSE_JSARGS + // Fill the remaining expected arguments with undefined. + __ LoadRoot(t0, RootIndex::kUndefinedValue); + __ SmiUntag(t2, a0); + __ Subu(t2, a2, Operand(t2)); + __ sll(t1, t2, kSystemPointerSizeLog2); + __ Subu(t1, fp, t1); + // Adjust for frame. + __ Subu(t1, t1, + Operand(ArgumentsAdaptorFrameConstants::kFixedFrameSizeFromFp + + kSystemPointerSize)); + + Label fill; + __ bind(&fill); + __ push(t0); + __ Branch(&fill, ne, sp, Operand(t1)); + + // Calculate copy start address into a0 and copy end address is fp. + __ Lsa(a0, fp, a0, kPointerSizeLog2 - kSmiTagSize); + + // Copy the arguments (including the receiver) to the new stack frame. + Label copy; + __ bind(©); + + // Adjust load for return address and receiver. + __ Lw(t0, MemOperand(a0, 2 * kSystemPointerSize)); + __ push(t0); + + __ Branch(USE_DELAY_SLOT, ©, ne, a0, Operand(fp)); + __ Subu(a0, a0, Operand(kSystemPointerSize)); +#else // Calculate copy start address into a0 and copy end address into t3. // a0: actual number of arguments as a smi // a1: function @@ -2433,6 +2748,7 @@ void Builtins::Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm) { __ Subu(sp, sp, kPointerSize); __ Branch(USE_DELAY_SLOT, &fill, ne, sp, Operand(t1)); __ sw(t0, MemOperand(sp)); +#endif } // Call the entry point. @@ -2484,6 +2800,12 @@ void Builtins::Generate_WasmCompileLazy(MacroAssembler* masm) { constexpr RegList gp_regs = Register::ListOf(a0, a2, a3); constexpr RegList fp_regs = DoubleRegister::ListOf(f2, f4, f6, f8, f10, f12, f14); + constexpr int16_t num_to_push = base::bits::CountPopulation(gp_regs) + + base::bits::CountPopulation(fp_regs); + // The number of regs to be pushed before kWasmInstanceRegister should be + // equal to kNumberOfSavedAllParamRegs. + STATIC_ASSERT(num_to_push == + WasmCompileLazyFrameConstants::kNumberOfSavedAllParamRegs); __ MultiPush(gp_regs); __ MultiPushFPU(fp_regs); @@ -3000,7 +3322,15 @@ void Builtins::Generate_CallApiCallback(MacroAssembler* masm) { // FunctionCallbackInfo::values_ (points at the first varargs argument passed // on the stack). - __ Subu(scratch, base, Operand(1 * kPointerSize)); +#ifdef V8_REVERSE_JSARGS + __ Addu(scratch, scratch, + Operand((FCA::kArgsLength + 1) * kSystemPointerSize)); +#else + __ Addu(scratch, scratch, + Operand((FCA::kArgsLength - 1) * kSystemPointerSize)); + __ sll(t2, argc, kSystemPointerSizeLog2); + __ Addu(scratch, scratch, t2); +#endif __ sw(scratch, MemOperand(sp, 2 * kPointerSize)); // FunctionCallbackInfo::length_. diff --git a/deps/v8/src/builtins/mips64/builtins-mips64.cc b/deps/v8/src/builtins/mips64/builtins-mips64.cc index 8093d102116b2e..04fce6b2a1c8fa 100644 --- a/deps/v8/src/builtins/mips64/builtins-mips64.cc +++ b/deps/v8/src/builtins/mips64/builtins-mips64.cc @@ -40,18 +40,24 @@ void Builtins::Generate_Adaptor(MacroAssembler* masm, Address address) { static void GenerateTailCallToReturnedCode(MacroAssembler* masm, Runtime::FunctionId function_id) { // ----------- S t a t e ------------- + // -- a0 : actual argument count // -- a1 : target function (preserved for callee) // -- a3 : new target (preserved for callee) // ----------------------------------- { FrameScope scope(masm, StackFrame::INTERNAL); - // Push a copy of the function onto the stack. - // Push a copy of the target function and the new target. - __ Push(a1, a3, a1); + // Push a copy of the target function, the new target and the actual + // argument count. + // Push function as parameter to the runtime call. + __ SmiTag(kJavaScriptCallArgCountRegister); + __ Push(kJavaScriptCallTargetRegister, kJavaScriptCallNewTargetRegister, + kJavaScriptCallArgCountRegister, kJavaScriptCallTargetRegister); __ CallRuntime(function_id, 1); - // Restore target function and new target. - __ Pop(a1, a3); + // Restore target function, new target and actual argument count. + __ Pop(kJavaScriptCallTargetRegister, kJavaScriptCallNewTargetRegister, + kJavaScriptCallArgCountRegister); + __ SmiUntag(kJavaScriptCallArgCountRegister); } static_assert(kJavaScriptCallCodeStartRegister == a2, "ABI mismatch"); @@ -98,32 +104,24 @@ void Generate_JSBuiltinsConstructStubHelper(MacroAssembler* masm) { __ Push(cp, a0); __ SmiUntag(a0); +#ifdef V8_REVERSE_JSARGS + // Set up pointer to last argument (skip receiver). + __ Daddu( + t2, fp, + Operand(StandardFrameConstants::kCallerSPOffset + kSystemPointerSize)); + // Copy arguments and receiver to the expression stack. + __ PushArray(t2, a0, t3, t0); + // The receiver for the builtin/api call. + __ PushRoot(RootIndex::kTheHoleValue); +#else // The receiver for the builtin/api call. __ PushRoot(RootIndex::kTheHoleValue); - // Set up pointer to last argument. __ Daddu(t2, fp, Operand(StandardFrameConstants::kCallerSPOffset)); // Copy arguments and receiver to the expression stack. - Label loop, entry; - __ mov(t3, a0); - // ----------- S t a t e ------------- - // -- a0: number of arguments (untagged) - // -- a3: new target - // -- t2: pointer to last argument - // -- t3: counter - // -- sp[0*kPointerSize]: the hole (receiver) - // -- sp[1*kPointerSize]: number of arguments (tagged) - // -- sp[2*kPointerSize]: context - // ----------------------------------- - __ jmp(&entry); - __ bind(&loop); - __ Dlsa(t0, t2, t3, kPointerSizeLog2); - __ Ld(t1, MemOperand(t0)); - __ push(t1); - __ bind(&entry); - __ Daddu(t3, t3, Operand(-1)); - __ Branch(&loop, greater_equal, t3, Operand(zero_reg)); + __ PushArray(t2, a0, t3, t0); +#endif // Call the function. // a0: number of arguments (untagged) @@ -134,13 +132,13 @@ void Generate_JSBuiltinsConstructStubHelper(MacroAssembler* masm) { // Restore context from the frame. __ Ld(cp, MemOperand(fp, ConstructFrameConstants::kContextOffset)); // Restore smi-tagged arguments count from the frame. - __ Ld(a1, MemOperand(fp, ConstructFrameConstants::kLengthOffset)); + __ Ld(t3, MemOperand(fp, ConstructFrameConstants::kLengthOffset)); // Leave construct frame. } // Remove caller arguments from the stack and return. - __ SmiScale(a4, a1, kPointerSizeLog2); - __ Daddu(sp, sp, a4); + __ SmiScale(t3, t3, kPointerSizeLog2); + __ Daddu(sp, sp, t3); __ Daddu(sp, sp, kPointerSize); __ Ret(); } @@ -182,7 +180,7 @@ void Builtins::Generate_JSConstructStubGeneric(MacroAssembler* masm) { // Preserve the incoming parameters on the stack. __ SmiTag(a0); __ Push(cp, a0, a1); - __ PushRoot(RootIndex::kTheHoleValue); + __ PushRoot(RootIndex::kUndefinedValue); __ Push(a3); // ----------- S t a t e ------------- @@ -225,11 +223,30 @@ void Builtins::Generate_JSConstructStubGeneric(MacroAssembler* masm) { // Restore new target. __ Pop(a3); + +#ifdef V8_REVERSE_JSARGS + // Push the allocated receiver to the stack. + __ Push(v0); + + // We need two copies because we may have to return the original one + // and the calling conventions dictate that the called function pops the + // receiver. The second copy is pushed after the arguments, we saved in a6 + // since v0 will store the return value of callRuntime. + __ mov(a6, v0); + + // Set up pointer to last argument. + __ Daddu(t2, fp, Operand(StandardFrameConstants::kCallerSPOffset + + kSystemPointerSize)); +#else // Push the allocated receiver to the stack. We need two copies // because we may have to return the original one and the calling // conventions dictate that the called function pops the receiver. __ Push(v0, v0); + // Set up pointer to last argument. + __ Daddu(t2, fp, Operand(StandardFrameConstants::kCallerSPOffset)); +#endif + // ----------- S t a t e ------------- // -- r3: new target // -- sp[0*kPointerSize]: implicit receiver @@ -245,9 +262,6 @@ void Builtins::Generate_JSConstructStubGeneric(MacroAssembler* masm) { __ Ld(a0, MemOperand(fp, ConstructFrameConstants::kLengthOffset)); __ SmiUntag(a0); - // Set up pointer to last argument. - __ Daddu(t2, fp, Operand(StandardFrameConstants::kCallerSPOffset)); - Label enough_stack_space, stack_overflow; Generate_StackOverflowCheck(masm, a0, t0, t1, &stack_overflow); __ Branch(&enough_stack_space); @@ -262,28 +276,13 @@ void Builtins::Generate_JSConstructStubGeneric(MacroAssembler* masm) { __ bind(&enough_stack_space); // Copy arguments and receiver to the expression stack. - Label loop, entry; - __ mov(t3, a0); - // ----------- S t a t e ------------- - // -- a0: number of arguments (untagged) - // -- a3: new target - // -- t2: pointer to last argument - // -- t3: counter - // -- sp[0*kPointerSize]: implicit receiver - // -- sp[1*kPointerSize]: implicit receiver - // -- sp[2*kPointerSize]: padding - // -- a1 and sp[3*kPointerSize]: constructor function - // -- sp[4*kPointerSize]: number of arguments (tagged) - // -- sp[5*kPointerSize]: context - // ----------------------------------- - __ jmp(&entry); - __ bind(&loop); - __ Dlsa(t0, t2, t3, kPointerSizeLog2); - __ Ld(t1, MemOperand(t0)); - __ push(t1); - __ bind(&entry); - __ Daddu(t3, t3, Operand(-1)); - __ Branch(&loop, greater_equal, t3, Operand(zero_reg)); + __ PushArray(t2, a0, t0, t1); +#ifdef V8_REVERSE_JSARGS + // We need two copies because we may have to return the original one + // and the calling conventions dictate that the called function pops the + // receiver. The second copy is pushed after the arguments, + __ Push(a6); +#endif // Call the function. __ InvokeFunctionWithNewTarget(a1, a3, a0, CALL_FUNCTION); @@ -404,9 +403,11 @@ void Builtins::Generate_ResumeGeneratorTrampoline(MacroAssembler* masm) { LoadStackLimit(masm, kScratchReg, StackLimitKind::kRealStackLimit); __ Branch(&stack_overflow, lo, sp, Operand(kScratchReg)); +#ifndef V8_REVERSE_JSARGS // Push receiver. __ Ld(a5, FieldMemOperand(a1, JSGeneratorObject::kReceiverOffset)); __ Push(a5); +#endif // ----------- S t a t e ------------- // -- a1 : the JSGeneratorObject to resume @@ -426,6 +427,20 @@ void Builtins::Generate_ResumeGeneratorTrampoline(MacroAssembler* masm) { __ Ld(t1, FieldMemOperand(a1, JSGeneratorObject::kParametersAndRegistersOffset)); { +#ifdef V8_REVERSE_JSARGS + Label done_loop, loop; + __ bind(&loop); + __ Dsubu(a3, a3, Operand(1)); + __ Branch(&done_loop, lt, a3, Operand(zero_reg)); + __ Dlsa(kScratchReg, t1, a3, kPointerSizeLog2); + __ Ld(kScratchReg, FieldMemOperand(kScratchReg, FixedArray::kHeaderSize)); + __ Push(kScratchReg); + __ Branch(&loop); + __ bind(&done_loop); + // Push receiver. + __ Ld(kScratchReg, FieldMemOperand(a1, JSGeneratorObject::kReceiverOffset)); + __ Push(kScratchReg); +#else Label done_loop, loop; __ Move(t2, zero_reg); __ bind(&loop); @@ -437,6 +452,7 @@ void Builtins::Generate_ResumeGeneratorTrampoline(MacroAssembler* masm) { __ Daddu(t2, t2, Operand(1)); __ Branch(&loop); __ bind(&done_loop); +#endif } // Underlying function needs to have bytecode available. @@ -745,26 +761,36 @@ static void Generate_JSEntryTrampolineHelper(MacroAssembler* masm, __ li(cp, context_address); __ Ld(cp, MemOperand(cp)); - // Push the function and the receiver onto the stack. - __ Push(a2, a3); + // Push the function onto the stack. + __ Push(a2); // Check if we have enough stack space to push all arguments. - // Clobbers a0 and a3. - Generate_CheckStackOverflow(masm, a4, a0, a3); - - // Setup new.target, function and argc. - __ mov(a3, a1); - __ mov(a1, a2); - __ mov(a0, a4); - - // a0: argc - // a1: function - // a3: new.target - // a5: argv + __ daddiu(a6, a4, 1); + Generate_CheckStackOverflow(masm, a6, a0, s2); // Copy arguments to the stack in a loop. - // a3: argc + // a4: argc // a5: argv, i.e. points to first arg +#ifdef V8_REVERSE_JSARGS + Label loop, entry; + __ Dlsa(s1, a5, a4, kPointerSizeLog2); + __ b(&entry); + __ nop(); // Branch delay slot nop. + // s1 points past last arg. + __ bind(&loop); + __ daddiu(s1, s1, -kPointerSize); + __ Ld(s2, MemOperand(s1)); // Read next parameter. + __ Ld(s2, MemOperand(s2)); // Dereference handle. + __ push(s2); // Push parameter. + __ bind(&entry); + __ Branch(&loop, ne, a5, Operand(s1)); + + // Push the receive. + __ Push(a3); +#else + // Push the receive. + __ Push(a3); + Label loop, entry; __ Dlsa(s1, a5, a4, kPointerSizeLog2); __ b(&entry); @@ -778,9 +804,14 @@ static void Generate_JSEntryTrampolineHelper(MacroAssembler* masm, __ bind(&entry); __ Branch(&loop, ne, a5, Operand(s1)); +#endif + // a0: argc // a1: function // a3: new.target + __ mov(a3, a1); + __ mov(a1, a2); + __ mov(a0, a4); // Initialize all JavaScript callee-saved registers, since they will be seen // by the garbage collector as part of handlers. @@ -862,6 +893,7 @@ static void TailCallOptimizedCodeSlot(MacroAssembler* masm, Register optimized_code_entry, Register scratch1, Register scratch2) { // ----------- S t a t e ------------- + // -- a0 : actual argument count // -- a3 : new target (preserved for callee if needed, and caller) // -- a1 : target function (preserved for callee if needed, and caller) // ----------------------------------- @@ -899,6 +931,7 @@ static void TailCallOptimizedCodeSlot(MacroAssembler* masm, static void MaybeOptimizeCode(MacroAssembler* masm, Register feedback_vector, Register optimization_marker) { // ----------- S t a t e ------------- + // -- a0 : actual argument count // -- a3 : new target (preserved for callee if needed, and caller) // -- a1 : target function (preserved for callee if needed, and caller) // -- feedback vector (preserved for caller if needed) @@ -1008,10 +1041,10 @@ static void AdvanceBytecodeOffsetOrReturn(MacroAssembler* masm, // Generate code for entering a JS function with the interpreter. // On entry to the function the receiver and arguments have been pushed on the -// stack left to right. The actual argument count matches the formal parameter -// count expected by the function. +// stack left to right. // // The live registers are: +// o a0 : actual argument count (not including the receiver) // o a1: the JS function object being called. // o a3: the incoming new target or generator object // o cp: our context @@ -1027,16 +1060,18 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) { // Get the bytecode array from the function object and load it into // kInterpreterBytecodeArrayRegister. - __ Ld(a0, FieldMemOperand(closure, JSFunction::kSharedFunctionInfoOffset)); + __ Ld(kScratchReg, + FieldMemOperand(closure, JSFunction::kSharedFunctionInfoOffset)); __ Ld(kInterpreterBytecodeArrayRegister, - FieldMemOperand(a0, SharedFunctionInfo::kFunctionDataOffset)); - GetSharedFunctionInfoBytecode(masm, kInterpreterBytecodeArrayRegister, a4); + FieldMemOperand(kScratchReg, SharedFunctionInfo::kFunctionDataOffset)); + GetSharedFunctionInfoBytecode(masm, kInterpreterBytecodeArrayRegister, + kScratchReg); // The bytecode array could have been flushed from the shared function info, // if so, call into CompileLazy. Label compile_lazy; - __ GetObjectType(kInterpreterBytecodeArrayRegister, a0, a0); - __ Branch(&compile_lazy, ne, a0, Operand(BYTECODE_ARRAY_TYPE)); + __ GetObjectType(kInterpreterBytecodeArrayRegister, kScratchReg, kScratchReg); + __ Branch(&compile_lazy, ne, kScratchReg, Operand(BYTECODE_ARRAY_TYPE)); // Load the feedback vector from the closure. __ Ld(feedback_vector, @@ -1235,22 +1270,22 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) { } static void Generate_InterpreterPushArgs(MacroAssembler* masm, - Register num_args, Register index, - Register scratch, Register scratch2) { + Register num_args, + Register start_address, + Register scratch, + Register scratch2) { // Find the address of the last argument. - __ mov(scratch2, num_args); - __ dsll(scratch2, scratch2, kPointerSizeLog2); - __ Dsubu(scratch2, index, Operand(scratch2)); + __ Dsubu(scratch, num_args, Operand(1)); + __ dsll(scratch, scratch, kPointerSizeLog2); + __ Dsubu(start_address, start_address, scratch); // Push the arguments. - Label loop_header, loop_check; - __ Branch(&loop_check); - __ bind(&loop_header); - __ Ld(scratch, MemOperand(index)); - __ Daddu(index, index, Operand(-kPointerSize)); - __ push(scratch); - __ bind(&loop_check); - __ Branch(&loop_header, hi, index, Operand(scratch2)); +#ifdef V8_REVERSE_JSARGS + __ PushArray(start_address, num_args, scratch, scratch2, + TurboAssembler::PushArrayOrder::kReverse); +#else + __ PushArray(start_address, num_args, scratch, scratch2); +#endif } // static @@ -1267,15 +1302,42 @@ void Builtins::Generate_InterpreterPushArgsThenCallImpl( // ----------------------------------- Label stack_overflow; +#ifdef V8_REVERSE_JSARGS + if (mode == InterpreterPushArgsMode::kWithFinalSpread) { + // The spread argument should not be pushed. + __ Dsubu(a0, a0, Operand(1)); + } +#endif + __ Daddu(a3, a0, Operand(1)); // Add one for receiver. - // Push "undefined" as the receiver arg if we need to. + Generate_StackOverflowCheck(masm, a3, a4, t0, &stack_overflow); + +#ifdef V8_REVERSE_JSARGS + if (receiver_mode == ConvertReceiverMode::kNullOrUndefined) { + // Don't copy receiver. + __ mov(a3, a0); + } + + // This function modifies a2, t0 and a4. + Generate_InterpreterPushArgs(masm, a3, a2, a4, t0); + if (receiver_mode == ConvertReceiverMode::kNullOrUndefined) { __ PushRoot(RootIndex::kUndefinedValue); - __ Dsubu(a3, a3, Operand(1)); // Subtract one for receiver. } - Generate_StackOverflowCheck(masm, a3, a4, t0, &stack_overflow); + if (mode == InterpreterPushArgsMode::kWithFinalSpread) { + // Pass the spread in the register a2. + // a2 already points to the penultime argument, the spread + // is below that. + __ Ld(a2, MemOperand(a2, -kSystemPointerSize)); + } +#else + // Push "undefined" as the receiver arg if we need to. + if (receiver_mode == ConvertReceiverMode::kNullOrUndefined) { + __ PushRoot(RootIndex::kUndefinedValue); + __ mov(a3, a0); + } // This function modifies a2, t0 and a4. Generate_InterpreterPushArgs(masm, a3, a2, a4, t0); @@ -1284,6 +1346,7 @@ void Builtins::Generate_InterpreterPushArgsThenCallImpl( __ Pop(a2); // Pass the spread in a register __ Dsubu(a0, a0, Operand(1)); // Subtract one for spread } +#endif // Call the target. if (mode == InterpreterPushArgsMode::kWithFinalSpread) { @@ -1313,11 +1376,32 @@ void Builtins::Generate_InterpreterPushArgsThenConstructImpl( // -- a4 : address of the first argument // ----------------------------------- Label stack_overflow; + __ daddiu(a6, a0, 1); + Generate_StackOverflowCheck(masm, a6, a5, t0, &stack_overflow); + +#ifdef V8_REVERSE_JSARGS + if (mode == InterpreterPushArgsMode::kWithFinalSpread) { + // The spread argument should not be pushed. + __ Dsubu(a0, a0, Operand(1)); + } + + // Push the arguments, This function modifies t0, a4 and a5. + Generate_InterpreterPushArgs(masm, a0, a4, a5, t0); // Push a slot for the receiver. __ push(zero_reg); - Generate_StackOverflowCheck(masm, a0, a5, t0, &stack_overflow); + if (mode == InterpreterPushArgsMode::kWithFinalSpread) { + // Pass the spread in the register a2. + // a4 already points to the penultimate argument, the spread + // lies in the next interpreter register. + __ Ld(a2, MemOperand(a4, -kSystemPointerSize)); + } else { + __ AssertUndefinedOrAllocationSite(a2, t0); + } +#else + // Push a slot for the receiver. + __ push(zero_reg); // This function modifies t0, a4 and a5. Generate_InterpreterPushArgs(masm, a0, a4, a5, t0); @@ -1328,6 +1412,7 @@ void Builtins::Generate_InterpreterPushArgsThenConstructImpl( } else { __ AssertUndefinedOrAllocationSite(a2, t0); } +#endif if (mode == InterpreterPushArgsMode::kArrayFunction) { __ AssertFunction(a1); @@ -1486,7 +1571,12 @@ void Generate_ContinueToBuiltinHelper(MacroAssembler* masm, bool with_result) { const RegisterConfiguration* config(RegisterConfiguration::Default()); int allocatable_register_count = config->num_allocatable_general_registers(); + Register scratch = t3; if (with_result) { +#ifdef V8_REVERSE_JSARGS + if (java_script_builtin) { + __ mov(scratch, v0); + } else { // Overwrite the hole inserted by the deoptimizer with the return value from // the LAZY deopt point. __ Sd(v0, @@ -1494,6 +1584,16 @@ void Generate_ContinueToBuiltinHelper(MacroAssembler* masm, sp, config->num_allocatable_general_registers() * kPointerSize + BuiltinContinuationFrameConstants::kFixedFrameSize)); } +#else + // Overwrite the hole inserted by the deoptimizer with the return value from + // the LAZY deopt point. + __ Sd(v0, + MemOperand( + sp, config->num_allocatable_general_registers() * kPointerSize + + BuiltinContinuationFrameConstants::kFixedFrameSize)); + USE(scratch); +#endif + } for (int i = allocatable_register_count - 1; i >= 0; --i) { int code = config->GetAllocatableGeneralCode(i); __ Pop(Register::from_code(code)); @@ -1501,6 +1601,22 @@ void Generate_ContinueToBuiltinHelper(MacroAssembler* masm, __ SmiUntag(Register::from_code(code)); } } + +#ifdef V8_REVERSE_JSARGS + if (with_result && java_script_builtin) { + // Overwrite the hole inserted by the deoptimizer with the return value from + // the LAZY deopt point. t0 contains the arguments count, the return value + // from LAZY is always the last argument. + __ Daddu(a0, a0, + Operand(BuiltinContinuationFrameConstants::kFixedSlotCount)); + __ Dlsa(t0, sp, a0, kSystemPointerSizeLog2); + __ Sd(scratch, MemOperand(t0)); + // Recover arguments count. + __ Dsubu(a0, a0, + Operand(BuiltinContinuationFrameConstants::kFixedSlotCount)); + } +#endif + __ Ld(fp, MemOperand( sp, BuiltinContinuationFrameConstants::kFixedFrameSizeFromFp)); // Load builtin index (stored as a Smi) and use it to get the builtin start @@ -1602,6 +1718,18 @@ void Builtins::Generate_FunctionPrototypeApply(MacroAssembler* masm) { // Claim (2 - argc) dummy arguments form the stack, to put the stack in a // consistent state for a simple pop operation. +#ifdef V8_REVERSE_JSARGS + __ mov(scratch, argc); + __ Ld(this_arg, MemOperand(sp, kPointerSize)); + __ Ld(arg_array, MemOperand(sp, 2 * kPointerSize)); + __ Movz(arg_array, undefined_value, scratch); // if argc == 0 + __ Movz(this_arg, undefined_value, scratch); // if argc == 0 + __ Dsubu(scratch, scratch, Operand(1)); + __ Movz(arg_array, undefined_value, scratch); // if argc == 1 + __ Ld(receiver, MemOperand(sp)); + __ Dlsa(sp, sp, argc, kSystemPointerSizeLog2); + __ Sd(this_arg, MemOperand(sp)); +#else __ Dsubu(sp, sp, Operand(2 * kPointerSize)); __ Dlsa(sp, sp, argc, kPointerSizeLog2); __ mov(scratch, argc); @@ -1612,6 +1740,7 @@ void Builtins::Generate_FunctionPrototypeApply(MacroAssembler* masm) { __ Movz(arg_array, undefined_value, scratch); // if argc == 1 __ Ld(receiver, MemOperand(sp)); __ Sd(this_arg, MemOperand(sp)); +#endif } // ----------- S t a t e ------------- @@ -1646,6 +1775,25 @@ void Builtins::Generate_FunctionPrototypeApply(MacroAssembler* masm) { // static void Builtins::Generate_FunctionPrototypeCall(MacroAssembler* masm) { +#ifdef V8_REVERSE_JSARGS + // 1. Get the callable to call (passed as receiver) from the stack. + { + __ Pop(a1); + } + + // 2. Make sure we have at least one argument. + // a0: actual number of arguments + { + Label done; + __ Branch(&done, ne, a0, Operand(zero_reg)); + __ PushRoot(RootIndex::kUndefinedValue); + __ Daddu(a0, a0, Operand(1)); + __ bind(&done); + } + + // 3. Adjust the actual number of arguments. + __ daddiu(a0, a0, -1); +#else // 1. Make sure we have at least one argument. // a0: actual number of arguments { @@ -1658,8 +1806,7 @@ void Builtins::Generate_FunctionPrototypeCall(MacroAssembler* masm) { // 2. Get the function to call (passed as receiver) from the stack. // a0: actual number of arguments - __ Dlsa(kScratchReg, sp, a0, kPointerSizeLog2); - __ Ld(a1, MemOperand(kScratchReg)); + __ LoadReceiver(a1, a0); // 3. Shift arguments and return address one slot down on the stack // (overwriting the original receiver). Adjust argument count to make @@ -1681,6 +1828,7 @@ void Builtins::Generate_FunctionPrototypeCall(MacroAssembler* masm) { __ Dsubu(a0, a0, Operand(1)); __ Pop(); } +#endif // 4. Call the callable. __ Jump(masm->isolate()->builtins()->Call(), RelocInfo::CODE_TARGET); @@ -1711,6 +1859,23 @@ void Builtins::Generate_ReflectApply(MacroAssembler* masm) { // Claim (3 - argc) dummy arguments form the stack, to put the stack in a // consistent state for a simple pop operation. +#ifdef V8_REVERSE_JSARGS + __ mov(scratch, argc); + __ Ld(target, MemOperand(sp, kPointerSize)); + __ Ld(this_argument, MemOperand(sp, 2 * kPointerSize)); + __ Ld(arguments_list, MemOperand(sp, 3 * kPointerSize)); + __ Movz(arguments_list, undefined_value, scratch); // if argc == 0 + __ Movz(this_argument, undefined_value, scratch); // if argc == 0 + __ Movz(target, undefined_value, scratch); // if argc == 0 + __ Dsubu(scratch, scratch, Operand(1)); + __ Movz(arguments_list, undefined_value, scratch); // if argc == 1 + __ Movz(this_argument, undefined_value, scratch); // if argc == 1 + __ Dsubu(scratch, scratch, Operand(1)); + __ Movz(arguments_list, undefined_value, scratch); // if argc == 2 + + __ Dlsa(sp, sp, argc, kSystemPointerSizeLog2); + __ Sd(this_argument, MemOperand(sp, 0)); // Overwrite receiver +#else __ Dsubu(sp, sp, Operand(3 * kPointerSize)); __ Dlsa(sp, sp, argc, kPointerSizeLog2); __ mov(scratch, argc); @@ -1725,6 +1890,7 @@ void Builtins::Generate_ReflectApply(MacroAssembler* masm) { __ Movz(arguments_list, undefined_value, scratch); // if argc == 2 __ Sd(this_argument, MemOperand(sp, 0)); // Overwrite receiver +#endif } // ----------- S t a t e ------------- @@ -1751,6 +1917,8 @@ void Builtins::Generate_ReflectConstruct(MacroAssembler* masm) { // -- sp[8] : target (dummy value if argc == 0) // -- sp[12] : receiver // ----------------------------------- + // NOTE: The order of args in the stack are reversed if V8_REVERSE_JSARGS + Register argc = a0; Register arguments_list = a2; Register target = a1; @@ -1768,6 +1936,23 @@ void Builtins::Generate_ReflectConstruct(MacroAssembler* masm) { // Claim (3 - argc) dummy arguments form the stack, to put the stack in a // consistent state for a simple pop operation. +#ifdef V8_REVERSE_JSARGS + __ mov(scratch, argc); + __ Ld(target, MemOperand(sp, kPointerSize)); + __ Ld(arguments_list, MemOperand(sp, 2 * kPointerSize)); + __ Ld(new_target, MemOperand(sp, 3 * kPointerSize)); + __ Movz(arguments_list, undefined_value, scratch); // if argc == 0 + __ Movz(new_target, undefined_value, scratch); // if argc == 0 + __ Movz(target, undefined_value, scratch); // if argc == 0 + __ Dsubu(scratch, scratch, Operand(1)); + __ Movz(arguments_list, undefined_value, scratch); // if argc == 1 + __ Movz(new_target, target, scratch); // if argc == 1 + __ Dsubu(scratch, scratch, Operand(1)); + __ Movz(new_target, target, scratch); // if argc == 2 + + __ Dlsa(sp, sp, argc, kSystemPointerSizeLog2); + __ Sd(undefined_value, MemOperand(sp, 0)); // Overwrite receiver +#else __ Dsubu(sp, sp, Operand(3 * kPointerSize)); __ Dlsa(sp, sp, argc, kPointerSizeLog2); __ mov(scratch, argc); @@ -1779,9 +1964,10 @@ void Builtins::Generate_ReflectConstruct(MacroAssembler* masm) { __ Movz(arguments_list, undefined_value, scratch); // if argc == 1 __ Movz(new_target, target, scratch); // if argc == 1 __ Dsubu(scratch, scratch, Operand(1)); - __ Movz(new_target, target, scratch); // if argc == 2 + __ Movz(new_target, target, scratch); // if argc == 2 __ Sd(undefined_value, MemOperand(sp, 0)); // Overwrite receiver +#endif } // ----------- S t a t e ------------- @@ -1860,6 +2046,29 @@ void Builtins::Generate_CallOrConstructVarargs(MacroAssembler* masm, Label stack_overflow; Generate_StackOverflowCheck(masm, len, kScratchReg, a5, &stack_overflow); +#ifdef V8_REVERSE_JSARGS + // Move the arguments already in the stack, + // including the receiver and the return address. + { + Label copy; + Register src = a6, dest = a7; + __ mov(src, sp); + __ dsll(t0, a4, kSystemPointerSizeLog2); + __ Dsubu(sp, sp, Operand(t0)); + // Update stack pointer. + __ mov(dest, sp); + __ Daddu(t0, a0, Operand(zero_reg)); + + __ bind(©); + __ Ld(t1, MemOperand(src, 0)); + __ Sd(t1, MemOperand(dest, 0)); + __ Dsubu(t0, t0, Operand(1)); + __ Daddu(src, src, Operand(kSystemPointerSize)); + __ Daddu(dest, dest, Operand(kSystemPointerSize)); + __ Branch(©, ge, t0, Operand(zero_reg)); + } +#endif + // Push arguments onto the stack (thisArgument is already on the stack). { Label done, push, loop; @@ -1874,11 +2083,17 @@ void Builtins::Generate_CallOrConstructVarargs(MacroAssembler* masm, __ LoadRoot(t1, RootIndex::kTheHoleValue); __ bind(&loop); __ Ld(a5, MemOperand(src)); + __ daddiu(src, src, kPointerSize); __ Branch(&push, ne, a5, Operand(t1)); __ LoadRoot(a5, RootIndex::kUndefinedValue); __ bind(&push); - __ daddiu(src, src, kPointerSize); +#ifdef V8_REVERSE_JSARGS + __ Sd(a5, MemOperand(a7, 0)); + __ Daddu(a7, a7, Operand(kSystemPointerSize)); + __ Daddu(scratch, scratch, Operand(kSystemPointerSize)); +#else __ Push(a5); +#endif __ Branch(&loop, ne, scratch, Operand(sp)); __ bind(&done); } @@ -1949,15 +2164,56 @@ void Builtins::Generate_CallOrConstructForwardVarargs(MacroAssembler* masm, Generate_StackOverflowCheck(masm, a7, a4, a5, &stack_overflow); // Forward the arguments from the caller frame. + +#ifdef V8_REVERSE_JSARGS + // Point to the first argument to copy (skipping the receiver). + __ Daddu(a6, a6, + Operand(CommonFrameConstants::kFixedFrameSizeAboveFp + + kSystemPointerSize)); + __ Dlsa(a6, a6, a2, kSystemPointerSizeLog2); + + // Move the arguments already in the stack, + // including the receiver and the return address. + { + Label copy; + Register src = t0, dest = a2; + __ mov(src, sp); + // Update stack pointer. + __ dsll(t1, a7, kSystemPointerSizeLog2); + __ Dsubu(sp, sp, Operand(t1)); + __ mov(dest, sp); + __ Daddu(t2, a0, Operand(zero_reg)); + + __ bind(©); + __ Ld(t1, MemOperand(src, 0)); + __ Sd(t1, MemOperand(dest, 0)); + __ Dsubu(t2, t2, Operand(1)); + __ Daddu(src, src, Operand(kSystemPointerSize)); + __ Daddu(dest, dest, Operand(kSystemPointerSize)); + __ Branch(©, ge, t2, Operand(zero_reg)); + } +#endif + + // Copy arguments from the caller frame. + // TODO(victorgomes): Consider using forward order as potentially more cache + // friendly. { Label loop; +#ifndef V8_REVERSE_JSARGS + __ Daddu(a6, a6, Operand(CommonFrameConstants::kFixedFrameSizeAboveFp)); +#endif __ Daddu(a0, a0, a7); __ bind(&loop); { - __ Dlsa(kScratchReg, a6, a7, kPointerSizeLog2); - __ Ld(kScratchReg, MemOperand(kScratchReg, 1 * kPointerSize)); - __ push(kScratchReg); __ Subu(a7, a7, Operand(1)); + __ Dlsa(t0, a6, a7, kPointerSizeLog2); + __ Ld(kScratchReg, MemOperand(t0)); +#ifdef V8_REVERSE_JSARGS + __ Dlsa(t0, a2, a7, kPointerSizeLog2); + __ Sd(kScratchReg, MemOperand(t0)); +#else + __ push(kScratchReg); +#endif __ Branch(&loop, ne, a7, Operand(zero_reg)); } } @@ -2013,8 +2269,7 @@ void Builtins::Generate_CallFunction(MacroAssembler* masm, __ LoadGlobalProxy(a3); } else { Label convert_to_object, convert_receiver; - __ Dlsa(kScratchReg, sp, a0, kPointerSizeLog2); - __ Ld(a3, MemOperand(kScratchReg)); + __ LoadReceiver(a3, a0); __ JumpIfSmi(a3, &convert_to_object); STATIC_ASSERT(LAST_JS_RECEIVER_TYPE == LAST_TYPE); __ GetObjectType(a3, a4, a4); @@ -2050,8 +2305,7 @@ void Builtins::Generate_CallFunction(MacroAssembler* masm, __ Ld(a2, FieldMemOperand(a1, JSFunction::kSharedFunctionInfoOffset)); __ bind(&convert_receiver); } - __ Dlsa(kScratchReg, sp, a0, kPointerSizeLog2); - __ Sd(a3, MemOperand(kScratchReg)); + __ StoreReceiver(a3, a0, kScratchReg); } __ bind(&done_convert); @@ -2085,9 +2339,8 @@ void Builtins::Generate_CallBoundFunctionImpl(MacroAssembler* masm) { // Patch the receiver to [[BoundThis]]. { - __ Ld(kScratchReg, FieldMemOperand(a1, JSBoundFunction::kBoundThisOffset)); - __ Dlsa(a4, sp, a0, kPointerSizeLog2); - __ Sd(kScratchReg, MemOperand(a4)); + __ Ld(t0, FieldMemOperand(a1, JSBoundFunction::kBoundThisOffset)); + __ StoreReceiver(t0, a0, kScratchReg); } // Load [[BoundArguments]] into a2 and length of that into a4. @@ -2105,13 +2358,11 @@ void Builtins::Generate_CallBoundFunctionImpl(MacroAssembler* masm) { { Label done; __ dsll(a5, a4, kPointerSizeLog2); - __ Dsubu(sp, sp, Operand(a5)); + __ Dsubu(t0, sp, Operand(a5)); // Check the stack for overflow. We are not trying to catch interruptions // (i.e. debug break and preemption) here, so check the "real stack limit". LoadStackLimit(masm, kScratchReg, StackLimitKind::kRealStackLimit); - __ Branch(&done, hs, sp, Operand(kScratchReg)); - // Restore the stack pointer. - __ Daddu(sp, sp, Operand(a5)); + __ Branch(&done, hs, t0, Operand(kScratchReg)); { FrameScope scope(masm, StackFrame::MANUAL); __ EnterFrame(StackFrame::INTERNAL); @@ -2120,6 +2371,30 @@ void Builtins::Generate_CallBoundFunctionImpl(MacroAssembler* masm) { __ bind(&done); } +#ifdef V8_REVERSE_JSARGS + // Pop receiver. + __ Pop(t0); + + // Push [[BoundArguments]]. + { + Label loop, done_loop; + __ SmiUntag(a4, FieldMemOperand(a2, FixedArray::kLengthOffset)); + __ Daddu(a0, a0, Operand(a4)); + __ Daddu(a2, a2, Operand(FixedArray::kHeaderSize - kHeapObjectTag)); + __ bind(&loop); + __ Dsubu(a4, a4, Operand(1)); + __ Branch(&done_loop, lt, a4, Operand(zero_reg)); + __ Dlsa(a5, a2, a4, kPointerSizeLog2); + __ Ld(kScratchReg, MemOperand(a5)); + __ Push(kScratchReg); + __ Branch(&loop); + __ bind(&done_loop); + } + + // Push receiver. + __ Push(t0); +#else + __ mov(sp, t0); // Relocate arguments down the stack. { Label loop, done_loop; @@ -2152,6 +2427,7 @@ void Builtins::Generate_CallBoundFunctionImpl(MacroAssembler* masm) { __ Branch(&loop); __ bind(&done_loop); } +#endif // Call the [[BoundTargetFunction]] via the Call builtin. __ Ld(a1, FieldMemOperand(a1, JSBoundFunction::kBoundTargetFunctionOffset)); @@ -2186,8 +2462,7 @@ void Builtins::Generate_Call(MacroAssembler* masm, ConvertReceiverMode mode) { // 2. Call to something else, which might have a [[Call]] internal method (if // not we raise an exception). // Overwrite the original receiver with the (original) target. - __ Dlsa(kScratchReg, sp, a0, kPointerSizeLog2); - __ Sd(a1, MemOperand(kScratchReg)); + __ StoreReceiver(a1, a0, kScratchReg); // Let the "call_as_function_delegate" take care of the rest. __ LoadNativeContextSlot(Context::CALL_AS_FUNCTION_DELEGATE_INDEX, a1); __ Jump(masm->isolate()->builtins()->CallFunction( @@ -2258,13 +2533,11 @@ void Builtins::Generate_ConstructBoundFunction(MacroAssembler* masm) { { Label done; __ dsll(a5, a4, kPointerSizeLog2); - __ Dsubu(sp, sp, Operand(a5)); + __ Dsubu(t0, sp, Operand(a5)); // Check the stack for overflow. We are not trying to catch interruptions // (i.e. debug break and preemption) here, so check the "real stack limit". LoadStackLimit(masm, kScratchReg, StackLimitKind::kRealStackLimit); - __ Branch(&done, hs, sp, Operand(kScratchReg)); - // Restore the stack pointer. - __ Daddu(sp, sp, Operand(a5)); + __ Branch(&done, hs, t0, Operand(kScratchReg)); { FrameScope scope(masm, StackFrame::MANUAL); __ EnterFrame(StackFrame::INTERNAL); @@ -2273,6 +2546,30 @@ void Builtins::Generate_ConstructBoundFunction(MacroAssembler* masm) { __ bind(&done); } +#ifdef V8_REVERSE_JSARGS + // Pop receiver. + __ Pop(t0); + + // Push [[BoundArguments]]. + { + Label loop, done_loop; + __ SmiUntag(a4, FieldMemOperand(a2, FixedArray::kLengthOffset)); + __ Daddu(a0, a0, Operand(a4)); + __ Daddu(a2, a2, Operand(FixedArray::kHeaderSize - kHeapObjectTag)); + __ bind(&loop); + __ Dsubu(a4, a4, Operand(1)); + __ Branch(&done_loop, lt, a4, Operand(zero_reg)); + __ Dlsa(a5, a2, a4, kPointerSizeLog2); + __ Ld(kScratchReg, MemOperand(a5)); + __ Push(kScratchReg); + __ Branch(&loop); + __ bind(&done_loop); + } + + // Push receiver. + __ Push(t0); +#else + __ mov(sp, t0); // Relocate arguments down the stack. { Label loop, done_loop; @@ -2305,6 +2602,7 @@ void Builtins::Generate_ConstructBoundFunction(MacroAssembler* masm) { __ Branch(&loop); __ bind(&done_loop); } +#endif // Patch new.target to [[BoundTargetFunction]] if new.target equals target. { @@ -2357,8 +2655,7 @@ void Builtins::Generate_Construct(MacroAssembler* masm) { __ bind(&non_proxy); { // Overwrite the original receiver with the (original) target. - __ Dlsa(kScratchReg, sp, a0, kPointerSizeLog2); - __ Sd(a1, MemOperand(kScratchReg)); + __ StoreReceiver(a1, a0, kScratchReg); // Let the "call_as_constructor_delegate" take care of the rest. __ LoadNativeContextSlot(Context::CALL_AS_CONSTRUCTOR_DELEGATE_INDEX, a1); __ Jump(masm->isolate()->builtins()->CallFunction(), @@ -2399,8 +2696,14 @@ void Builtins::Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm) { Generate_StackOverflowCheck(masm, a2, a5, kScratchReg, &stack_overflow); // Calculate copy start address into a0 and copy end address into a4. +#ifdef V8_REVERSE_JSARGS + __ dsll(a0, a2, kPointerSizeLog2); + __ Daddu(a0, fp, a0); +#else __ SmiScale(a0, a0, kPointerSizeLog2); __ Daddu(a0, fp, a0); +#endif + // Adjust for return address and receiver. __ Daddu(a0, a0, Operand(2 * kPointerSize)); // Compute copy end address. @@ -2429,6 +2732,38 @@ void Builtins::Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm) { EnterArgumentsAdaptorFrame(masm); Generate_StackOverflowCheck(masm, a2, a5, kScratchReg, &stack_overflow); +#ifdef V8_REVERSE_JSARGS + // Fill the remaining expected arguments with undefined. + __ LoadRoot(t0, RootIndex::kUndefinedValue); + __ SmiUntag(t1, a0); + __ Dsubu(t2, a2, Operand(t1)); + __ dsll(a4, t2, kSystemPointerSizeLog2); + __ Dsubu(a4, fp, a4); + // Adjust for frame. + __ Dsubu(a4, a4, + Operand(ArgumentsAdaptorFrameConstants::kFixedFrameSizeFromFp + + kSystemPointerSize)); + + Label fill; + __ bind(&fill); + __ push(t0); + __ Branch(&fill, ne, sp, Operand(a4)); + + // Calculate copy start address into r0 and copy end address is fp. + __ SmiScale(a0, a0, kPointerSizeLog2); + __ Daddu(a0, fp, a0); + + // Copy the arguments (including the receiver) to the new stack frame. + Label copy; + __ bind(©); + + // Adjust load for return address and receiver. + __ Ld(t0, MemOperand(a0, 2 * kSystemPointerSize)); + __ push(t0); + + __ Branch(USE_DELAY_SLOT, ©, ne, a0, Operand(fp)); + __ Dsubu(a0, a0, Operand(kSystemPointerSize)); +#else // Calculate copy start address into a0 and copy end address into a7. // a0: actual number of arguments as a smi // a1: function @@ -2472,6 +2807,7 @@ void Builtins::Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm) { __ Dsubu(sp, sp, kPointerSize); __ Branch(USE_DELAY_SLOT, &fill, ne, sp, Operand(a4)); __ Sd(a5, MemOperand(sp)); +#endif } // Call the entry point. @@ -2524,6 +2860,12 @@ void Builtins::Generate_WasmCompileLazy(MacroAssembler* masm) { Register::ListOf(a0, a2, a3, a4, a5, a6, a7); constexpr RegList fp_regs = DoubleRegister::ListOf(f2, f4, f6, f8, f10, f12, f14); + constexpr int16_t num_to_push = base::bits::CountPopulation(gp_regs) + + base::bits::CountPopulation(fp_regs); + // The number of regs to be pushed before kWasmInstanceRegister should be + // equal to kNumberOfSavedAllParamRegs. + STATIC_ASSERT(num_to_push == + WasmCompileLazyFrameConstants::kNumberOfSavedAllParamRegs); __ MultiPush(gp_regs); __ MultiPushFPU(fp_regs); @@ -3043,7 +3385,16 @@ void Builtins::Generate_CallApiCallback(MacroAssembler* masm) { // FunctionCallbackInfo::values_ (points at the first varargs argument passed // on the stack). - __ Dsubu(scratch, base, Operand(1 * kPointerSize)); +#ifdef V8_REVERSE_JSARGS + __ Daddu(scratch, scratch, + Operand((FCA::kArgsLength + 1) * kSystemPointerSize)); +#else + __ Daddu(scratch, scratch, + Operand((FCA::kArgsLength - 1) * kSystemPointerSize)); + __ dsll(t2, argc, kSystemPointerSizeLog2); + __ Daddu(scratch, scratch, t2); +#endif + __ Sd(scratch, MemOperand(sp, 2 * kPointerSize)); // FunctionCallbackInfo::length_. diff --git a/deps/v8/src/builtins/ppc/builtins-ppc.cc b/deps/v8/src/builtins/ppc/builtins-ppc.cc index 8b3bc956994003..8f262818abb5b3 100644 --- a/deps/v8/src/builtins/ppc/builtins-ppc.cc +++ b/deps/v8/src/builtins/ppc/builtins-ppc.cc @@ -38,20 +38,26 @@ void Builtins::Generate_Adaptor(MacroAssembler* masm, Address address) { static void GenerateTailCallToReturnedCode(MacroAssembler* masm, Runtime::FunctionId function_id) { // ----------- S t a t e ------------- + // -- r3 : actual argument count // -- r4 : target function (preserved for callee) // -- r6 : new target (preserved for callee) // ----------------------------------- { FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL); - // Push a copy of the target function and the new target. + // Push a copy of the target function, the new target and the actual + // argument count. // Push function as parameter to the runtime call. - __ Push(r4, r6, r4); + __ SmiTag(kJavaScriptCallArgCountRegister); + __ Push(kJavaScriptCallTargetRegister, kJavaScriptCallNewTargetRegister, + kJavaScriptCallArgCountRegister, kJavaScriptCallTargetRegister); __ CallRuntime(function_id, 1); __ mr(r5, r3); - // Restore target function and new target. - __ Pop(r4, r6); + // Restore target function, new target and actual argument count. + __ Pop(kJavaScriptCallTargetRegister, kJavaScriptCallNewTargetRegister, + kJavaScriptCallArgCountRegister); + __ SmiUntag(kJavaScriptCallArgCountRegister); } static_assert(kJavaScriptCallCodeStartRegister == r5, "ABI mismatch"); __ JumpCodeObject(r5); @@ -116,34 +122,25 @@ void Generate_JSBuiltinsConstructStubHelper(MacroAssembler* masm) { __ SmiTag(r3); __ Push(cp, r3); __ SmiUntag(r3, SetRC); + +#ifdef V8_REVERSE_JSARGS + // Set up pointer to last argument (skip receiver). + __ addi( + r7, fp, + Operand(StandardFrameConstants::kCallerSPOffset + kSystemPointerSize)); + // Copy arguments and receiver to the expression stack. + __ PushArray(r7, r3, r8, r0); + // The receiver for the builtin/api call. + __ PushRoot(RootIndex::kTheHoleValue); +#else // The receiver for the builtin/api call. __ PushRoot(RootIndex::kTheHoleValue); // Set up pointer to last argument. __ addi(r7, fp, Operand(StandardFrameConstants::kCallerSPOffset)); // Copy arguments and receiver to the expression stack. - - Label loop, no_args; - // ----------- S t a t e ------------- - // -- r3: number of arguments (untagged) - // -- r4: constructor function - // -- r6: new target - // -- r7: pointer to last argument - // -- cr0: condition indicating whether r3 is zero - // -- sp[0*kSystemPointerSize]: the hole (receiver) - // -- sp[1*kSystemPointerSize]: number of arguments (tagged) - // -- sp[2*kSystemPointerSize]: context - // ----------------------------------- - __ beq(&no_args, cr0); - __ ShiftLeftImm(scratch, r3, Operand(kSystemPointerSizeLog2)); - __ sub(sp, sp, scratch); - __ mtctr(r3); - __ bind(&loop); - __ subi(scratch, scratch, Operand(kSystemPointerSize)); - __ LoadPX(r0, MemOperand(r7, scratch)); - __ StorePX(r0, MemOperand(sp, scratch)); - __ bdnz(&loop); - __ bind(&no_args); + __ PushArray(r7, r3, r8, r0); +#endif // Call the function. // r3: number of arguments (untagged) @@ -157,15 +154,15 @@ void Generate_JSBuiltinsConstructStubHelper(MacroAssembler* masm) { // Restore context from the frame. __ LoadP(cp, MemOperand(fp, ConstructFrameConstants::kContextOffset)); // Restore smi-tagged arguments count from the frame. - __ LoadP(r4, MemOperand(fp, ConstructFrameConstants::kLengthOffset)); + __ LoadP(scratch, MemOperand(fp, ConstructFrameConstants::kLengthOffset)); // Leave construct frame. } // Remove caller arguments from the stack and return. STATIC_ASSERT(kSmiTagSize == 1 && kSmiTag == 0); - __ SmiToPtrArrayOffset(r4, r4); - __ add(sp, sp, r4); + __ SmiToPtrArrayOffset(scratch, scratch); + __ add(sp, sp, scratch); __ addi(sp, sp, Operand(kSystemPointerSize)); __ blr(); @@ -242,11 +239,31 @@ void Builtins::Generate_JSConstructStubGeneric(MacroAssembler* masm) { // Restore new target. __ Pop(r6); + +#ifdef V8_REVERSE_JSARGS + // Push the allocated receiver to the stack. + __ Push(r3); + // We need two copies because we may have to return the original one + // and the calling conventions dictate that the called function pops the + // receiver. The second copy is pushed after the arguments, we saved in r6 + // since r0 needs to store the number of arguments before + // InvokingFunction. + __ mr(r9, r3); + + // Set up pointer to first argument (skip receiver). + __ addi( + r7, fp, + Operand(StandardFrameConstants::kCallerSPOffset + kSystemPointerSize)); +#else // Push the allocated receiver to the stack. We need two copies // because we may have to return the original one and the calling // conventions dictate that the called function pops the receiver. __ Push(r3, r3); + // Set up pointer to last argument. + __ addi(r7, fp, Operand(StandardFrameConstants::kCallerSPOffset)); +#endif + // ----------- S t a t e ------------- // -- r6: new target // -- sp[0*kSystemPointerSize]: implicit receiver @@ -262,9 +279,6 @@ void Builtins::Generate_JSConstructStubGeneric(MacroAssembler* masm) { __ LoadP(r3, MemOperand(fp, ConstructFrameConstants::kLengthOffset)); __ SmiUntag(r3); - // Set up pointer to last argument. - __ addi(r7, fp, Operand(StandardFrameConstants::kCallerSPOffset)); - Label enough_stack_space, stack_overflow; Generate_StackOverflowCheck(masm, r3, r8, &stack_overflow); __ b(&enough_stack_space); @@ -279,30 +293,12 @@ void Builtins::Generate_JSConstructStubGeneric(MacroAssembler* masm) { __ bind(&enough_stack_space); // Copy arguments and receiver to the expression stack. - Label loop, no_args; - // ----------- S t a t e ------------- - // -- r3: number of arguments (untagged) - // -- r6: new target - // -- r7: pointer to last argument - // -- cr0: condition indicating whether r3 is zero - // -- sp[0*kSystemPointerSize]: implicit receiver - // -- sp[1*kSystemPointerSize]: implicit receiver - // -- sp[2*kSystemPointerSize]: padding - // -- r4 and sp[3*kSystemPointerSize]: constructor function - // -- sp[4*kSystemPointerSize]: number of arguments (tagged) - // -- sp[5*kSystemPointerSize]: context - // ----------------------------------- - __ cmpi(r3, Operand::Zero()); - __ beq(&no_args); - __ ShiftLeftImm(r9, r3, Operand(kSystemPointerSizeLog2)); - __ sub(sp, sp, r9); - __ mtctr(r3); - __ bind(&loop); - __ subi(r9, r9, Operand(kSystemPointerSize)); - __ LoadPX(r0, MemOperand(r7, r9)); - __ StorePX(r0, MemOperand(sp, r9)); - __ bdnz(&loop); - __ bind(&no_args); + __ PushArray(r7, r3, r8, r0); + +#ifdef V8_REVERSE_JSARGS + // Push implicit receiver. + __ Push(r9); +#endif // Call the function. { @@ -439,10 +435,12 @@ void Builtins::Generate_ResumeGeneratorTrampoline(MacroAssembler* masm) { __ cmpl(sp, scratch); __ blt(&stack_overflow); +#ifndef V8_REVERSE_JSARGS // Push receiver. __ LoadTaggedPointerField( scratch, FieldMemOperand(r4, JSGeneratorObject::kReceiverOffset)); __ Push(scratch); +#endif // ----------- S t a t e ------------- // -- r4 : the JSGeneratorObject to resume @@ -461,6 +459,29 @@ void Builtins::Generate_ResumeGeneratorTrampoline(MacroAssembler* masm) { r5, FieldMemOperand(r4, JSGeneratorObject::kParametersAndRegistersOffset)); { +#ifdef V8_REVERSE_JSARGS + Label done_loop, loop; + + __ mr(r9, r6); + + __ bind(&loop); + __ subi(r9, r9, Operand(1)); + __ cmpi(r9, Operand::Zero()); + __ blt(&done_loop); + __ ShiftLeftImm(r10, r9, Operand(kTaggedSizeLog2)); + __ add(scratch, r5, r10); + __ LoadAnyTaggedField(scratch, + FieldMemOperand(scratch, FixedArray::kHeaderSize)); + __ Push(scratch); + __ b(&loop); + + __ bind(&done_loop); + + // Push receiver. + __ LoadAnyTaggedField( + scratch, FieldMemOperand(r4, JSGeneratorObject::kReceiverOffset)); + __ Push(scratch); +#else Label loop, done_loop; __ cmpi(r6, Operand::Zero()); __ ble(&done_loop); @@ -477,6 +498,7 @@ void Builtins::Generate_ResumeGeneratorTrampoline(MacroAssembler* masm) { __ bdnz(&loop); __ bind(&done_loop); +#endif } // Underlying function needs to have bytecode available. @@ -771,50 +793,60 @@ static void Generate_JSEntryTrampolineHelper(MacroAssembler* masm, __ Move(cp, context_address); __ LoadP(cp, MemOperand(cp)); - // Push the function and the receiver onto the stack. - __ Push(r5, r6); + // Push the function. + __ Push(r5); // Check if we have enough stack space to push all arguments. - // Clobbers r3 and r6. - Generate_CheckStackOverflow(masm, r7, r3, r6); + __ addi(r3, r7, Operand(1)); + Generate_CheckStackOverflow(masm, r3, r9, r0); - // r4: new.target - // r5: function + // Copy arguments to the stack in a loop. + // r4: function // r7: argc - // r8: argv - // r0,r3,r6,r9, cp may be clobbered + // r8: argv, i.e. points to first arg +#ifdef V8_REVERSE_JSARGS + Label loop, done; + __ cmpi(r7, Operand::Zero()); + __ beq(&done); - // Setup new.target, argc and function. - __ mr(r3, r7); - __ mr(r6, r4); - __ mr(r4, r5); + __ ShiftLeftImm(r9, r7, Operand(kSystemPointerSizeLog2)); + __ add(r8, r8, r9); // point to last arg - // r3: argc - // r4: function - // r6: new.target - // r8: argv + __ mtctr(r7); + __ bind(&loop); + __ LoadPU(r9, MemOperand(r8, -kSystemPointerSize)); // read next parameter + __ LoadP(r0, MemOperand(r9)); // dereference handle + __ push(r0); // push parameter + __ bdnz(&loop); + __ bind(&done); - // Copy arguments to the stack in a loop. - // r4: function - // r3: argc - // r8: argv, i.e. points to first arg - Label loop, entry; - __ ShiftLeftImm(r0, r3, Operand(kSystemPointerSizeLog2)); - __ add(r5, r8, r0); - // r5 points past last arg. - __ b(&entry); + // Push the receiver. + __ Push(r6); + +#else + // Push the receiver. + __ Push(r6); + + Label loop, done; + __ cmpi(r7, Operand::Zero()); + __ beq(&done); + + __ mtctr(r7); + __ subi(r8, r8, Operand(kSystemPointerSize)); __ bind(&loop); - __ LoadP(r9, MemOperand(r8)); // read next parameter - __ addi(r8, r8, Operand(kSystemPointerSize)); + __ LoadPU(r9, MemOperand(r8, kSystemPointerSize)); // read next parameter __ LoadP(r0, MemOperand(r9)); // dereference handle __ push(r0); // push parameter - __ bind(&entry); - __ cmp(r8, r5); - __ bne(&loop); + __ bdnz(&loop); + __ bind(&done); +#endif // r3: argc // r4: function // r6: new.target + __ mr(r3, r7); + __ mr(r6, r4); + __ mr(r4, r5); // Initialize all JavaScript callee-saved registers, since they will be seen // by the garbage collector as part of handlers. @@ -902,6 +934,7 @@ static void TailCallOptimizedCodeSlot(MacroAssembler* masm, Register optimized_code_entry, Register scratch) { // ----------- S t a t e ------------- + // -- r3 : actual argument count // -- r6 : new target (preserved for callee if needed, and caller) // -- r4 : target function (preserved for callee if needed, and caller) // ----------------------------------- @@ -938,6 +971,7 @@ static void TailCallOptimizedCodeSlot(MacroAssembler* masm, static void MaybeOptimizeCode(MacroAssembler* masm, Register feedback_vector, Register optimization_marker) { // ----------- S t a t e ------------- + // -- r3 : actual argument count // -- r6 : new target (preserved for callee if needed, and caller) // -- r4 : target function (preserved for callee if needed, and caller) // -- feedback vector (preserved for caller if needed) @@ -1050,10 +1084,10 @@ static void AdvanceBytecodeOffsetOrReturn(MacroAssembler* masm, } // Generate code for entering a JS function with the interpreter. // On entry to the function the receiver and arguments have been pushed on the -// stack left to right. The actual argument count matches the formal parameter -// count expected by the function. +// stack left to right. // // The live registers are: +// o r3: actual argument count (not including the receiver) // o r4: the JS function object being called. // o r6: the incoming new target or generator object // o cp: our context @@ -1071,17 +1105,17 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) { // Get the bytecode array from the function object and load it into // kInterpreterBytecodeArrayRegister. __ LoadTaggedPointerField( - r3, FieldMemOperand(closure, JSFunction::kSharedFunctionInfoOffset)); + r7, FieldMemOperand(closure, JSFunction::kSharedFunctionInfoOffset)); // Load original bytecode array or the debug copy. __ LoadTaggedPointerField( kInterpreterBytecodeArrayRegister, - FieldMemOperand(r3, SharedFunctionInfo::kFunctionDataOffset)); - GetSharedFunctionInfoBytecode(masm, kInterpreterBytecodeArrayRegister, r7); + FieldMemOperand(r7, SharedFunctionInfo::kFunctionDataOffset)); + GetSharedFunctionInfoBytecode(masm, kInterpreterBytecodeArrayRegister, ip); // The bytecode array could have been flushed from the shared function info, // if so, call into CompileLazy. Label compile_lazy; - __ CompareObjectType(kInterpreterBytecodeArrayRegister, r3, no_reg, + __ CompareObjectType(kInterpreterBytecodeArrayRegister, r7, no_reg, BYTECODE_ARRAY_TYPE); __ bne(&compile_lazy); @@ -1154,8 +1188,8 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) { Operand(BytecodeArray::kHeaderSize - kHeapObjectTag)); // Push bytecode array and Smi tagged bytecode array offset. - __ SmiTag(r3, kInterpreterBytecodeOffsetRegister); - __ Push(kInterpreterBytecodeArrayRegister, r3); + __ SmiTag(r7, kInterpreterBytecodeOffsetRegister); + __ Push(kInterpreterBytecodeArrayRegister, r7); // Allocate the local and temporary register file on the stack. Label stack_overflow; @@ -1295,18 +1329,19 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) { } static void Generate_InterpreterPushArgs(MacroAssembler* masm, - Register num_args, Register index, - Register count, Register scratch) { - Label loop, skip; - __ cmpi(count, Operand::Zero()); - __ beq(&skip); - __ addi(index, index, Operand(kSystemPointerSize)); // Bias up for LoadPU - __ mtctr(count); - __ bind(&loop); - __ LoadPU(scratch, MemOperand(index, -kSystemPointerSize)); - __ push(scratch); - __ bdnz(&loop); - __ bind(&skip); + Register num_args, + Register start_address, + Register scratch) { + __ subi(scratch, num_args, Operand(1)); + __ ShiftLeftImm(scratch, scratch, Operand(kSystemPointerSizeLog2)); + __ sub(start_address, start_address, scratch); + // Push the arguments. +#ifdef V8_REVERSE_JSARGS + __ PushArray(start_address, num_args, scratch, r0, + TurboAssembler::PushArrayOrder::kReverse); +#else + __ PushArray(start_address, num_args, scratch, r0); +#endif } // static @@ -1323,11 +1358,38 @@ void Builtins::Generate_InterpreterPushArgsThenCallImpl( // ----------------------------------- Label stack_overflow; +#ifdef V8_REVERSE_JSARGS + if (mode == InterpreterPushArgsMode::kWithFinalSpread) { + // The spread argument should not be pushed. + __ subi(r3, r3, Operand(1)); + } +#endif + // Calculate number of arguments (add one for receiver). __ addi(r6, r3, Operand(1)); Generate_StackOverflowCheck(masm, r6, ip, &stack_overflow); +#ifdef V8_REVERSE_JSARGS + if (receiver_mode == ConvertReceiverMode::kNullOrUndefined) { + // Don't copy receiver. Argument count is correct. + __ mr(r6, r3); + } + + // Push the arguments. + Generate_InterpreterPushArgs(masm, r6, r5, r7); + + if (receiver_mode == ConvertReceiverMode::kNullOrUndefined) { + __ PushRoot(RootIndex::kUndefinedValue); + } + + if (mode == InterpreterPushArgsMode::kWithFinalSpread) { + // Pass the spread in the register r3. + // r2 already points to the penultimate argument, the spread + // lies in the next interpreter register. + __ LoadP(r5, MemOperand(r5, -kSystemPointerSize)); + } +#else // Push "undefined" as the receiver arg if we need to. if (receiver_mode == ConvertReceiverMode::kNullOrUndefined) { __ PushRoot(RootIndex::kUndefinedValue); @@ -1335,12 +1397,13 @@ void Builtins::Generate_InterpreterPushArgsThenCallImpl( } // Push the arguments. r5, r6, r7 will be modified. - Generate_InterpreterPushArgs(masm, r6, r5, r6, r7); + Generate_InterpreterPushArgs(masm, r6, r5, r7); if (mode == InterpreterPushArgsMode::kWithFinalSpread) { __ Pop(r5); // Pass the spread in a register __ subi(r3, r3, Operand(1)); // Subtract one for spread } +#endif // Call the target. if (mode == InterpreterPushArgsMode::kWithFinalSpread) { @@ -1370,25 +1433,48 @@ void Builtins::Generate_InterpreterPushArgsThenConstructImpl( // -- r7 : address of the first argument // ----------------------------------- Label stack_overflow; + __ addi(r8, r3, Operand(1)); + Generate_StackOverflowCheck(masm, r8, ip, &stack_overflow); + +#ifdef V8_REVERSE_JSARGS + if (mode == InterpreterPushArgsMode::kWithFinalSpread) { + // The spread argument should not be pushed. + __ subi(r3, r3, Operand(1)); + } + + // Push the arguments. + Generate_InterpreterPushArgs(masm, r3, r7, r8); + + // Push a slot for the receiver to be constructed. + __ li(r0, Operand::Zero()); + __ push(r0); + + if (mode == InterpreterPushArgsMode::kWithFinalSpread) { + // Pass the spread in the register r2. + // r4 already points to the penultimate argument, the spread + // lies in the next interpreter register. + __ subi(r7, r7, Operand(kSystemPointerSize)); + __ LoadP(r5, MemOperand(r7)); + } else { + __ AssertUndefinedOrAllocationSite(r5, r8); + } +#else // Push a slot for the receiver to be constructed. __ li(r0, Operand::Zero()); __ push(r0); // Push the arguments (skip if none). - Label skip; - __ cmpi(r3, Operand::Zero()); - __ beq(&skip); - Generate_StackOverflowCheck(masm, r3, ip, &stack_overflow); - // Push the arguments. r8, r7, r9 will be modified. - Generate_InterpreterPushArgs(masm, r3, r7, r3, r9); - __ bind(&skip); + Generate_InterpreterPushArgs(masm, r3, r7, r8); if (mode == InterpreterPushArgsMode::kWithFinalSpread) { __ Pop(r5); // Pass the spread in a register __ subi(r3, r3, Operand(1)); // Subtract one for spread } else { __ AssertUndefinedOrAllocationSite(r5, r8); } + +#endif + if (mode == InterpreterPushArgsMode::kArrayFunction) { __ AssertFunction(r4); @@ -1554,7 +1640,21 @@ void Generate_ContinueToBuiltinHelper(MacroAssembler* masm, bool with_result) { const RegisterConfiguration* config(RegisterConfiguration::Default()); int allocatable_register_count = config->num_allocatable_general_registers(); + Register scratch = ip; if (with_result) { +#ifdef V8_REVERSE_JSARGS + if (java_script_builtin) { + __ mr(scratch, r3); + } else { + // Overwrite the hole inserted by the deoptimizer with the return value + // from the LAZY deopt point. + __ StoreP( + r3, MemOperand( + sp, config->num_allocatable_general_registers() * + kSystemPointerSize + + BuiltinContinuationFrameConstants::kFixedFrameSize)); + } +#else // Overwrite the hole inserted by the deoptimizer with the return value from // the LAZY deopt point. __ StoreP( @@ -1562,6 +1662,8 @@ void Generate_ContinueToBuiltinHelper(MacroAssembler* masm, MemOperand(sp, config->num_allocatable_general_registers() * kSystemPointerSize + BuiltinContinuationFrameConstants::kFixedFrameSize)); + USE(scratch); +#endif } for (int i = allocatable_register_count - 1; i >= 0; --i) { int code = config->GetAllocatableGeneralCode(i); @@ -1570,6 +1672,20 @@ void Generate_ContinueToBuiltinHelper(MacroAssembler* masm, __ SmiUntag(Register::from_code(code)); } } +#ifdef V8_REVERSE_JSARGS + if (java_script_builtin && with_result) { + // Overwrite the hole inserted by the deoptimizer with the return value from + // the LAZY deopt point. r0 contains the arguments count, the return value + // from LAZY is always the last argument. + __ addi(r3, r3, + Operand(BuiltinContinuationFrameConstants::kFixedSlotCount)); + __ ShiftLeftImm(r0, r3, Operand(kSystemPointerSizeLog2)); + __ StorePX(scratch, MemOperand(sp, r0)); + // Recover arguments count. + __ subi(r3, r3, + Operand(BuiltinContinuationFrameConstants::kFixedSlotCount)); + } +#endif __ LoadP( fp, MemOperand(sp, BuiltinContinuationFrameConstants::kFixedFrameSizeFromFp)); @@ -1676,23 +1792,42 @@ void Builtins::Generate_FunctionPrototypeApply(MacroAssembler* masm) { // arguments from the stack (including the receiver), and push thisArg (if // present) instead. { - Label skip; - Register arg_size = r8; - Register new_sp = r6; - Register scratch = r7; - __ ShiftLeftImm(arg_size, r3, Operand(kSystemPointerSizeLog2)); - __ add(new_sp, sp, arg_size); - __ LoadRoot(scratch, RootIndex::kUndefinedValue); - __ mr(r5, scratch); - __ LoadP(r4, MemOperand(new_sp, 0)); // receiver - __ cmpi(arg_size, Operand(kSystemPointerSize)); - __ blt(&skip); - __ LoadP(scratch, MemOperand(new_sp, 1 * -kSystemPointerSize)); // thisArg - __ beq(&skip); - __ LoadP(r5, MemOperand(new_sp, 2 * -kSystemPointerSize)); // argArray - __ bind(&skip); - __ mr(sp, new_sp); - __ StoreP(scratch, MemOperand(sp, 0)); + __ LoadRoot(r8, RootIndex::kUndefinedValue); + __ mr(r5, r8); + +#ifdef V8_REVERSE_JSARGS + Label done; + + __ LoadP(r4, MemOperand(sp)); // receiver + __ cmpi(r3, Operand(1)); + __ blt(&done); + __ LoadP(r8, MemOperand(sp, kSystemPointerSize)); // thisArg + __ cmpi(r3, Operand(2)); + __ blt(&done); + __ LoadP(r5, MemOperand(sp, 2 * kSystemPointerSize)); // argArray + + __ bind(&done); +#else + Label done; + __ ShiftLeftImm(r4, r3, Operand(kSystemPointerSizeLog2)); + __ LoadPX(r4, MemOperand(sp, r4)); // receiver + + __ li(r0, Operand(1)); + __ sub(r7, r3, r0, LeaveOE, SetRC); + __ blt(&done, cr0); + __ ShiftLeftImm(r8, r7, Operand(kSystemPointerSizeLog2)); + __ LoadPX(r8, MemOperand(sp, r8)); + + __ sub(r7, r7, r0, LeaveOE, SetRC); + __ blt(&done, cr0); + __ ShiftLeftImm(r5, r7, Operand(kSystemPointerSizeLog2)); + __ LoadPX(r5, MemOperand(sp, r5)); + + __ bind(&done); +#endif + __ ShiftLeftImm(ip, r3, Operand(kSystemPointerSizeLog2)); + __ add(sp, sp, ip); + __ StoreP(r8, MemOperand(sp)); } // ----------- S t a t e ------------- @@ -1725,6 +1860,24 @@ void Builtins::Generate_FunctionPrototypeApply(MacroAssembler* masm) { // static void Builtins::Generate_FunctionPrototypeCall(MacroAssembler* masm) { +#ifdef V8_REVERSE_JSARGS + // 1. Get the callable to call (passed as receiver) from the stack. + __ Pop(r4); + + // 2. Make sure we have at least one argument. + // r3: actual number of arguments + { + Label done; + __ cmpi(r3, Operand::Zero()); + __ bne(&done); + __ PushRoot(RootIndex::kUndefinedValue); + __ addi(r3, r3, Operand(1)); + __ bind(&done); + } + + // 3. Adjust the actual number of arguments. + __ subi(r3, r3, Operand(1)); +#else // 1. Make sure we have at least one argument. // r3: actual number of arguments { @@ -1738,8 +1891,7 @@ void Builtins::Generate_FunctionPrototypeCall(MacroAssembler* masm) { // 2. Get the callable to call (passed as receiver) from the stack. // r3: actual number of arguments - __ ShiftLeftImm(r5, r3, Operand(kSystemPointerSizeLog2)); - __ LoadPX(r4, MemOperand(sp, r5)); + __ LoadReceiver(r4, r3); // 3. Shift arguments and return address one slot down on the stack // (overwriting the original receiver). Adjust argument count to make @@ -1750,6 +1902,7 @@ void Builtins::Generate_FunctionPrototypeCall(MacroAssembler* masm) { Register scratch = r6; Label loop; // Calculate the copy start address (destination). Copy end address is sp. + __ ShiftLeftImm(r5, r3, Operand(kSystemPointerSizeLog2)); __ add(r5, sp, r5); __ mtctr(r3); @@ -1763,6 +1916,7 @@ void Builtins::Generate_FunctionPrototypeCall(MacroAssembler* masm) { __ subi(r3, r3, Operand(1)); __ pop(); } +#endif // 4. Call the callable. __ Jump(masm->isolate()->builtins()->Call(), RelocInfo::CODE_TARGET); @@ -1781,27 +1935,47 @@ void Builtins::Generate_ReflectApply(MacroAssembler* masm) { // remove all arguments from the stack (including the receiver), and push // thisArgument (if present) instead. { - Label skip; - Register arg_size = r8; - Register new_sp = r6; - Register scratch = r7; - __ ShiftLeftImm(arg_size, r3, Operand(kSystemPointerSizeLog2)); - __ add(new_sp, sp, arg_size); __ LoadRoot(r4, RootIndex::kUndefinedValue); - __ mr(scratch, r4); + __ mr(r8, r4); __ mr(r5, r4); - __ cmpi(arg_size, Operand(kSystemPointerSize)); - __ blt(&skip); - __ LoadP(r4, MemOperand(new_sp, 1 * -kSystemPointerSize)); // target - __ beq(&skip); - __ LoadP(scratch, - MemOperand(new_sp, 2 * -kSystemPointerSize)); // thisArgument - __ cmpi(arg_size, Operand(2 * kSystemPointerSize)); - __ beq(&skip); - __ LoadP(r5, MemOperand(new_sp, 3 * -kSystemPointerSize)); // argumentsList - __ bind(&skip); - __ mr(sp, new_sp); - __ StoreP(scratch, MemOperand(sp, 0)); + +#ifdef V8_REVERSE_JSARGS + Label done; + + __ cmpi(r3, Operand(1)); + __ blt(&done); + __ LoadP(r4, MemOperand(sp, kSystemPointerSize)); // thisArg + __ cmpi(r3, Operand(2)); + __ blt(&done); + __ LoadP(r8, MemOperand(sp, 2 * kSystemPointerSize)); // argArray + __ cmpi(r3, Operand(3)); + __ blt(&done); + __ LoadP(r5, MemOperand(sp, 3 * kSystemPointerSize)); // argArray + + __ bind(&done); +#else + Label done; + __ li(r0, Operand(1)); + __ sub(r7, r3, r0, LeaveOE, SetRC); + __ blt(&done, cr0); + __ ShiftLeftImm(r4, r7, Operand(kSystemPointerSizeLog2)); + __ LoadPX(r4, MemOperand(sp, r4)); // receiver + + __ sub(r7, r7, r0, LeaveOE, SetRC); + __ blt(&done, cr0); + __ ShiftLeftImm(r8, r7, Operand(kSystemPointerSizeLog2)); + __ LoadPX(r8, MemOperand(sp, r8)); + + __ sub(r7, r7, r0, LeaveOE, SetRC); + __ blt(&done, cr0); + __ ShiftLeftImm(r5, r7, Operand(kSystemPointerSizeLog2)); + __ LoadPX(r5, MemOperand(sp, r5)); + + __ bind(&done); +#endif + __ ShiftLeftImm(ip, r3, Operand(kSystemPointerSizeLog2)); + __ add(sp, sp, ip); + __ StoreP(r8, MemOperand(sp)); } // ----------- S t a t e ------------- @@ -1827,32 +2001,59 @@ void Builtins::Generate_ReflectConstruct(MacroAssembler* masm) { // -- sp[8] : target // -- sp[12] : receiver // ----------------------------------- + // NOTE: The order of args in the stack are reversed if V8_REVERSE_JSARGS // 1. Load target into r4 (if present), argumentsList into r5 (if present), // new.target into r6 (if present, otherwise use target), remove all // arguments from the stack (including the receiver), and push thisArgument // (if present) instead. { - Label skip; - Register arg_size = r8; - Register new_sp = r7; - __ ShiftLeftImm(arg_size, r3, Operand(kSystemPointerSizeLog2)); - __ add(new_sp, sp, arg_size); __ LoadRoot(r4, RootIndex::kUndefinedValue); __ mr(r5, r4); + +#ifdef V8_REVERSE_JSARGS + Label done; + + __ mr(r7, r4); + __ cmpi(r3, Operand(1)); + __ blt(&done); + __ LoadP(r4, MemOperand(sp, kSystemPointerSize)); // thisArg __ mr(r6, r4); - __ StoreP(r4, MemOperand(new_sp, 0)); // receiver (undefined) - __ cmpi(arg_size, Operand(kSystemPointerSize)); - __ blt(&skip); - __ LoadP(r4, MemOperand(new_sp, 1 * -kSystemPointerSize)); // target - __ mr(r6, r4); // new.target defaults to target - __ beq(&skip); - __ LoadP(r5, MemOperand(new_sp, 2 * -kSystemPointerSize)); // argumentsList - __ cmpi(arg_size, Operand(2 * kSystemPointerSize)); - __ beq(&skip); - __ LoadP(r6, MemOperand(new_sp, 3 * -kSystemPointerSize)); // new.target - __ bind(&skip); - __ mr(sp, new_sp); + __ cmpi(r3, Operand(2)); + __ blt(&done); + __ LoadP(r5, MemOperand(sp, 2 * kSystemPointerSize)); // argArray + __ cmpi(r3, Operand(3)); + __ blt(&done); + __ LoadP(r6, MemOperand(sp, 3 * kSystemPointerSize)); // argArray + __ bind(&done); + __ ShiftLeftImm(r0, r3, Operand(kSystemPointerSizeLog2)); + __ add(sp, sp, r0); + __ StoreP(r7, MemOperand(sp)); +#else + Label done; + __ ShiftLeftImm(ip, r3, Operand(kSystemPointerSizeLog2)); + __ StorePX(r5, MemOperand(sp, ip)); + __ li(r0, Operand(1)); + __ sub(r7, r3, r0, LeaveOE, SetRC); + __ blt(&done, cr0); + __ ShiftLeftImm(r4, r7, Operand(kSystemPointerSizeLog2)); + __ LoadPX(r4, MemOperand(sp, r4)); // receiver + + __ mr(r6, r4); + __ sub(r7, r7, r0, LeaveOE, SetRC); + __ blt(&done, cr0); + __ ShiftLeftImm(r5, r7, Operand(kSystemPointerSizeLog2)); + __ LoadPX(r5, MemOperand(sp, r5)); + + __ sub(r7, r7, r0, LeaveOE, SetRC); + __ blt(&done, cr0); + __ ShiftLeftImm(r6, r7, Operand(kSystemPointerSizeLog2)); + __ LoadPX(r6, MemOperand(sp, r6)); + + __ bind(&done); + __ ShiftLeftImm(r0, r3, Operand(kSystemPointerSizeLog2)); + __ add(sp, sp, r0); +#endif } // ----------- S t a t e ------------- @@ -1941,6 +2142,27 @@ void Builtins::Generate_CallOrConstructVarargs(MacroAssembler* masm, Label stack_overflow; Generate_StackOverflowCheck(masm, r7, scratch, &stack_overflow); +#ifdef V8_REVERSE_JSARGS + // Move the arguments already in the stack, + // including the receiver and the return address. + { + Label copy; + Register src = r9, dest = r8; + __ addi(src, sp, Operand(-kSystemPointerSize)); + __ ShiftLeftImm(r0, r7, Operand(kSystemPointerSizeLog2)); + __ sub(sp, sp, r0); + // Update stack pointer. + __ addi(dest, sp, Operand(-kSystemPointerSize)); + __ addi(r0, r3, Operand(1)); + __ mtctr(r0); + + __ bind(©); + __ LoadPU(r0, MemOperand(src, kSystemPointerSize)); + __ StorePU(r0, MemOperand(dest, kSystemPointerSize)); + __ bdnz(©); + } +#endif + // Push arguments onto the stack (thisArgument is already on the stack). { Label loop, no_args, skip; @@ -1956,7 +2178,11 @@ void Builtins::Generate_CallOrConstructVarargs(MacroAssembler* masm, __ bne(&skip); __ LoadRoot(scratch, RootIndex::kUndefinedValue); __ bind(&skip); +#ifdef V8_REVERSE_JSARGS + __ StorePU(scratch, MemOperand(r8, kSystemPointerSize)); +#else __ push(scratch); +#endif __ bdnz(&loop); __ bind(&no_args); __ add(r3, r3, r7); @@ -2027,24 +2253,70 @@ void Builtins::Generate_CallOrConstructForwardVarargs(MacroAssembler* masm, __ bind(&arguments_done); Label stack_done, stack_overflow; - __ sub(r8, r8, r5); - __ cmpi(r8, Operand::Zero()); - __ ble(&stack_done); + __ sub(r8, r8, r5, LeaveOE, SetRC); + __ ble(&stack_done, cr0); { + // ----------- S t a t e ------------- + // -- r3 : the number of arguments already in the stack (not including the + // receiver) + // -- r4 : the target to call (can be any Object) + // -- r5 : start index (to support rest parameters) + // -- r6 : the new.target (for [[Construct]] calls) + // -- r7 : point to the caller stack frame + // -- r8 : number of arguments to copy, i.e. arguments count - start index + // ----------------------------------- + // Check for stack overflow. - Generate_StackOverflowCheck(masm, r8, r5, &stack_overflow); + Generate_StackOverflowCheck(masm, r8, scratch, &stack_overflow); // Forward the arguments from the caller frame. +#ifdef V8_REVERSE_JSARGS + // Point to the first argument to copy (skipping the receiver). + __ addi(r7, r7, + Operand(CommonFrameConstants::kFixedFrameSizeAboveFp + + kSystemPointerSize)); + __ ShiftLeftImm(scratch, r5, Operand(kSystemPointerSizeLog2)); + __ add(r7, r7, scratch); + + // Move the arguments already in the stack, + // including the receiver and the return address. + { + Label copy; + Register src = ip, dest = r5; // r7 and r10 are context and root. + __ addi(src, sp, Operand(-kSystemPointerSize)); + // Update stack pointer. + __ ShiftLeftImm(scratch, r8, Operand(kSystemPointerSizeLog2)); + __ sub(sp, sp, scratch); + __ addi(dest, sp, Operand(-kSystemPointerSize)); + __ addi(r0, r3, Operand(1)); + __ mtctr(r0); + + __ bind(©); + __ LoadPU(r0, MemOperand(src, kSystemPointerSize)); + __ StorePU(r0, MemOperand(dest, kSystemPointerSize)); + __ bdnz(©); + } +#endif + // Copy arguments from the caller frame. + // TODO(victorgomes): Consider using forward order as potentially more cache + // friendly. { Label loop; - __ addi(r7, r7, Operand(kSystemPointerSize)); +#ifndef V8_REVERSE_JSARGS + __ addi(r7, r7, Operand(CommonFrameConstants::kFixedFrameSizeAboveFp)); +#endif __ add(r3, r3, r8); + __ addi(r5, r5, Operand(kSystemPointerSize)); __ bind(&loop); { - __ ShiftLeftImm(scratch, r8, Operand(kSystemPointerSizeLog2)); - __ LoadPX(scratch, MemOperand(r7, scratch)); - __ push(scratch); __ subi(r8, r8, Operand(1)); + __ ShiftLeftImm(scratch, r8, Operand(kSystemPointerSizeLog2)); + __ LoadPX(r0, MemOperand(r7, scratch)); +#ifdef V8_REVERSE_JSARGS + __ StorePX(r0, MemOperand(r5, scratch)); +#else + __ push(r0); +#endif __ cmpi(r8, Operand::Zero()); __ bne(&loop); } @@ -2101,8 +2373,7 @@ void Builtins::Generate_CallFunction(MacroAssembler* masm, __ LoadGlobalProxy(r6); } else { Label convert_to_object, convert_receiver; - __ ShiftLeftImm(r6, r3, Operand(kSystemPointerSizeLog2)); - __ LoadPX(r6, MemOperand(sp, r6)); + __ LoadReceiver(r6, r3); __ JumpIfSmi(r6, &convert_to_object); STATIC_ASSERT(LAST_JS_RECEIVER_TYPE == LAST_TYPE); __ CompareObjectType(r6, r7, r7, FIRST_JS_RECEIVER_TYPE); @@ -2139,8 +2410,7 @@ void Builtins::Generate_CallFunction(MacroAssembler* masm, r5, FieldMemOperand(r4, JSFunction::kSharedFunctionInfoOffset)); __ bind(&convert_receiver); } - __ ShiftLeftImm(r7, r3, Operand(kSystemPointerSizeLog2)); - __ StorePX(r6, MemOperand(sp, r7)); + __ StoreReceiver(r6, r3, r7); } __ bind(&done_convert); @@ -2198,8 +2468,6 @@ void Generate_PushBoundArguments(MacroAssembler* masm) { // (i.e. debug break and preemption) here, so check the "real stack // limit". { - UseScratchRegisterScope temps(masm); - Register scratch = temps.Acquire(); LoadStackLimit(masm, scratch, StackLimitKind::kRealStackLimit); __ cmpl(r0, scratch); } @@ -2212,6 +2480,30 @@ void Generate_PushBoundArguments(MacroAssembler* masm) { __ bind(&done); } +#ifdef V8_REVERSE_JSARGS + // Pop receiver. + __ Pop(r8); + + // Push [[BoundArguments]]. + { + Label loop, done; + __ add(r3, r3, r7); // Adjust effective number of arguments. + __ addi(r5, r5, Operand(FixedArray::kHeaderSize - kHeapObjectTag)); + __ mtctr(r7); + + __ bind(&loop); + __ subi(r7, r7, Operand(1)); + __ ShiftLeftImm(scratch, r7, Operand(kTaggedSizeLog2)); + __ add(scratch, scratch, r5); + __ LoadAnyTaggedField(scratch, MemOperand(scratch)); + __ Push(scratch); + __ bdnz(&loop); + __ bind(&done); + } + + // Push receiver. + __ Push(r8); +#else __ mr(scratch, sp); __ mr(sp, r0); @@ -2248,6 +2540,7 @@ void Generate_PushBoundArguments(MacroAssembler* masm) { __ bdnz(&loop); __ add(r3, r3, r7); } +#endif } __ bind(&no_bound_arguments); } @@ -2265,8 +2558,7 @@ void Builtins::Generate_CallBoundFunctionImpl(MacroAssembler* masm) { // Patch the receiver to [[BoundThis]]. __ LoadAnyTaggedField(r6, FieldMemOperand(r4, JSBoundFunction::kBoundThisOffset)); - __ ShiftLeftImm(r0, r3, Operand(kSystemPointerSizeLog2)); - __ StorePX(r6, MemOperand(sp, r0)); + __ StoreReceiver(r6, r3, ip); // Push the [[BoundArguments]] onto the stack. Generate_PushBoundArguments(masm); @@ -2307,8 +2599,7 @@ void Builtins::Generate_Call(MacroAssembler* masm, ConvertReceiverMode mode) { // 2. Call to something else, which might have a [[Call]] internal method (if // not we raise an exception). // Overwrite the original receiver the (original) target. - __ ShiftLeftImm(r8, r3, Operand(kSystemPointerSizeLog2)); - __ StorePX(r4, MemOperand(sp, r8)); + __ StoreReceiver(r4, r3, r8); // Let the "call_as_function_delegate" take care of the rest. __ LoadNativeContextSlot(Context::CALL_AS_FUNCTION_DELEGATE_INDEX, r4); __ Jump(masm->isolate()->builtins()->CallFunction( @@ -2423,8 +2714,7 @@ void Builtins::Generate_Construct(MacroAssembler* masm) { __ bind(&non_proxy); { // Overwrite the original receiver with the (original) target. - __ ShiftLeftImm(r8, r3, Operand(kSystemPointerSizeLog2)); - __ StorePX(r4, MemOperand(sp, r8)); + __ StoreReceiver(r4, r3, r8); // Let the "call_as_constructor_delegate" take care of the rest. __ LoadNativeContextSlot(Context::CALL_AS_CONSTRUCTOR_DELEGATE_INDEX, r4); __ Jump(masm->isolate()->builtins()->CallFunction(), @@ -2452,9 +2742,11 @@ void Builtins::Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm) { __ LoadTaggedPointerField( r7, FieldMemOperand(r4, JSFunction::kSharedFunctionInfoOffset)); __ lwz(r7, FieldMemOperand(r7, SharedFunctionInfo::kFlagsOffset)); +#ifndef V8_REVERSE_JSARGS __ TestBitMask(r7, SharedFunctionInfo::IsSafeToSkipArgumentsAdaptorBit::kMask, r0); __ bne(&skip_adapt_arguments, cr0); +#endif // ------------------------------------------- // Adapt arguments. @@ -2475,8 +2767,13 @@ void Builtins::Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm) { // r4: function // r5: expected number of arguments // r6: new target (passed through to callee) +#ifdef V8_REVERSE_JSARGS + __ ShiftLeftImm(r3, r5, Operand(kSystemPointerSizeLog2)); + __ add(r3, r3, fp); +#else __ SmiToPtrArrayOffset(r3, r3); __ add(r3, r3, fp); +#endif // adjust for return address and receiver __ addi(r3, r3, Operand(2 * kSystemPointerSize)); __ ShiftLeftImm(r7, r5, Operand(kSystemPointerSizeLog2)); @@ -2506,6 +2803,52 @@ void Builtins::Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm) { EnterArgumentsAdaptorFrame(masm); Generate_StackOverflowCheck(masm, r5, r8, &stack_overflow); +#ifdef V8_REVERSE_JSARGS + // Fill the remaining expected arguments with undefined. + // r0: actual number of arguments as a smi + // r1: function + // r2: expected number of arguments + // r3: new target (passed through to callee) + __ LoadRoot(r8, RootIndex::kUndefinedValue); + __ SmiUntag(r0, r3); + __ sub(r9, r5, r0); + __ ShiftLeftImm(r7, r9, Operand(kSystemPointerSizeLog2)); + __ sub(r7, fp, r7); + // Adjust for frame. + __ subi(r7, r7, + Operand(ArgumentsAdaptorFrameConstants::kFixedFrameSizeFromFp + + kSystemPointerSize)); + + Label fill; + __ bind(&fill); + __ push(r8); + __ cmp(sp, r7); + __ b(ne, &fill); + + // Calculate copy start address into r0 and copy end address is fp. + // r0: actual number of arguments as a smi + // r1: function + // r2: expected number of arguments + // r3: new target (passed through to callee) + __ SmiToPtrArrayOffset(r3, r3); + __ add(r3, r3, fp); + + // Copy the arguments (including the receiver) to the new stack frame. + // r0: copy start address + // r1: function + // r2: expected number of arguments + // r3: new target (passed through to callee) + Label copy; + __ bind(©); + + // Adjust load for return address and receiver. + __ LoadP(r8, MemOperand(r3, 2 * kSystemPointerSize)); + __ push(r8); + + __ cmp(r3, fp); // Compare before moving to next argument. + __ subi(r3, r3, Operand(kSystemPointerSize)); + __ b(ne, ©); +#else // Calculate copy start address into r0 and copy end address is fp. // r3: actual number of arguments as a smi // r4: function @@ -2545,6 +2888,7 @@ void Builtins::Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm) { __ push(r0); __ cmp(sp, r7); __ bne(&fill); +#endif } // Call the entry point. @@ -3112,6 +3456,7 @@ void Builtins::Generate_CallApiCallback(MacroAssembler* masm) { // -- sp[(argc - 1)* 4] : first argument // -- sp[(argc + 0) * 4] : receiver // ----------------------------------- + // NOTE: The order of args are reversed if V8_REVERSE_JSARGS Register api_function_address = r4; Register argc = r5; @@ -3186,10 +3531,15 @@ void Builtins::Generate_CallApiCallback(MacroAssembler* masm) { // FunctionCallbackInfo::values_ (points at the first varargs argument passed // on the stack). +#ifdef V8_REVERSE_JSARGS + __ addi(scratch, scratch, + Operand((FCA::kArgsLength + 1) * kSystemPointerSize)); +#else __ addi(scratch, scratch, Operand((FCA::kArgsLength - 1) * kSystemPointerSize)); __ ShiftLeftImm(ip, argc, Operand(kSystemPointerSizeLog2)); __ add(scratch, scratch, ip); +#endif __ StoreP(scratch, MemOperand(sp, (kStackFrameExtraParamSlot + 2) * kSystemPointerSize)); diff --git a/deps/v8/src/builtins/s390/builtins-s390.cc b/deps/v8/src/builtins/s390/builtins-s390.cc index b0c15825445ee4..3743df4ddb9d50 100644 --- a/deps/v8/src/builtins/s390/builtins-s390.cc +++ b/deps/v8/src/builtins/s390/builtins-s390.cc @@ -38,20 +38,26 @@ void Builtins::Generate_Adaptor(MacroAssembler* masm, Address address) { static void GenerateTailCallToReturnedCode(MacroAssembler* masm, Runtime::FunctionId function_id) { // ----------- S t a t e ------------- + // -- r2 : actual argument count // -- r3 : target function (preserved for callee) // -- r5 : new target (preserved for callee) // ----------------------------------- { FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL); - // Push a copy of the target function and the new target. + // Push a copy of the target function, the new target and the actual + // argument count. // Push function as parameter to the runtime call. - __ Push(r3, r5, r3); + __ SmiTag(kJavaScriptCallArgCountRegister); + __ Push(kJavaScriptCallTargetRegister, kJavaScriptCallNewTargetRegister, + kJavaScriptCallArgCountRegister, kJavaScriptCallTargetRegister); __ CallRuntime(function_id, 1); __ LoadRR(r4, r2); - // Restore target function and new target. - __ Pop(r3, r5); + // Restore target function, new target and actual argument count. + __ Pop(kJavaScriptCallTargetRegister, kJavaScriptCallNewTargetRegister, + kJavaScriptCallArgCountRegister); + __ SmiUntag(kJavaScriptCallArgCountRegister); } static_assert(kJavaScriptCallCodeStartRegister == r4, "ABI mismatch"); __ JumpCodeObject(r4); @@ -115,31 +121,24 @@ void Generate_JSBuiltinsConstructStubHelper(MacroAssembler* masm) { __ SmiTag(r2); __ Push(cp, r2); __ SmiUntag(r2); + +#ifdef V8_REVERSE_JSARGS + // Set up pointer to last argument (skip receiver). + __ la(r6, MemOperand(fp, StandardFrameConstants::kCallerSPOffset + + kSystemPointerSize)); + // Copy arguments and receiver to the expression stack. + __ PushArray(r6, r2, r1, r0); + // The receiver for the builtin/api call. + __ PushRoot(RootIndex::kTheHoleValue); +#else // The receiver for the builtin/api call. __ PushRoot(RootIndex::kTheHoleValue); // Set up pointer to last argument. __ la(r6, MemOperand(fp, StandardFrameConstants::kCallerSPOffset)); // Copy arguments and receiver to the expression stack. - // r2: number of arguments - // r3: constructor function - // r4: address of last argument (caller sp) - // r5: new target - // cr0: condition indicating whether r2 is zero - // sp[0]: receiver - // sp[1]: receiver - // sp[2]: number of arguments (smi-tagged) - Label loop, no_args; - __ beq(&no_args); - __ ShiftLeftP(scratch, r2, Operand(kSystemPointerSizeLog2)); - __ SubP(sp, sp, scratch); - __ LoadRR(r1, r2); - __ bind(&loop); - __ lay(scratch, MemOperand(scratch, -kSystemPointerSize)); - __ LoadP(r0, MemOperand(scratch, r6)); - __ StoreP(r0, MemOperand(scratch, sp)); - __ BranchOnCount(r1, &loop); - __ bind(&no_args); + __ PushArray(r6, r2, r1, r0); +#endif // Call the function. // r2: number of arguments @@ -236,11 +235,30 @@ void Builtins::Generate_JSConstructStubGeneric(MacroAssembler* masm) { // Restore new target. __ Pop(r5); + +#ifdef V8_REVERSE_JSARGS + // Push the allocated receiver to the stack. + __ Push(r2); + // We need two copies because we may have to return the original one + // and the calling conventions dictate that the called function pops the + // receiver. The second copy is pushed after the arguments, we saved in r6 + // since r0 needs to store the number of arguments before + // InvokingFunction. + __ LoadRR(r8, r2); + + // Set up pointer to first argument (skip receiver). + __ la(r6, MemOperand(fp, StandardFrameConstants::kCallerSPOffset + + kSystemPointerSize)); +#else // Push the allocated receiver to the stack. We need two copies // because we may have to return the original one and the calling // conventions dictate that the called function pops the receiver. __ Push(r2, r2); + // Set up pointer to last argument. + __ la(r6, MemOperand(fp, StandardFrameConstants::kCallerSPOffset)); +#endif + // ----------- S t a t e ------------- // -- r5: new target // -- sp[0*kSystemPointerSize]: implicit receiver @@ -256,9 +274,6 @@ void Builtins::Generate_JSConstructStubGeneric(MacroAssembler* masm) { __ LoadP(r2, MemOperand(fp, ConstructFrameConstants::kLengthOffset)); __ SmiUntag(r2); - // Set up pointer to last argument. - __ la(r6, MemOperand(fp, StandardFrameConstants::kCallerSPOffset)); - Label enough_stack_space, stack_overflow; Generate_StackOverflowCheck(masm, r2, r7, &stack_overflow); __ b(&enough_stack_space); @@ -273,31 +288,12 @@ void Builtins::Generate_JSConstructStubGeneric(MacroAssembler* masm) { __ bind(&enough_stack_space); // Copy arguments and receiver to the expression stack. - Label loop, no_args; - // ----------- S t a t e ------------- - // -- r2: number of arguments (untagged) - // -- r5: new target - // -- r6: pointer to last argument - // -- cr0: condition indicating whether r2 is zero - // -- sp[0*kSystemPointerSize]: implicit receiver - // -- sp[1*kSystemPointerSize]: implicit receiver - // -- sp[2*kSystemPointerSize]: padding - // -- r3 and sp[3*kSystemPointerSize]: constructor function - // -- sp[4*kSystemPointerSize]: number of arguments (tagged) - // -- sp[5*kSystemPointerSize]: context - // ----------------------------------- + __ PushArray(r6, r2, r1, r0); - __ ltgr(r2, r2); - __ beq(&no_args); - __ ShiftLeftP(r8, r2, Operand(kSystemPointerSizeLog2)); - __ SubP(sp, sp, r8); - __ LoadRR(r1, r2); - __ bind(&loop); - __ lay(r8, MemOperand(r8, -kSystemPointerSize)); - __ LoadP(r0, MemOperand(r8, r6)); - __ StoreP(r0, MemOperand(r8, sp)); - __ BranchOnCount(r1, &loop); - __ bind(&no_args); +#ifdef V8_REVERSE_JSARGS + // Push implicit receiver. + __ Push(r8); +#endif // Call the function. __ InvokeFunctionWithNewTarget(r3, r5, r2, CALL_FUNCTION); @@ -432,10 +428,12 @@ void Builtins::Generate_ResumeGeneratorTrampoline(MacroAssembler* masm) { __ CmpLogicalP(sp, scratch); __ blt(&stack_overflow); +#ifndef V8_REVERSE_JSARGS // Push receiver. __ LoadTaggedPointerField( scratch, FieldMemOperand(r3, JSGeneratorObject::kReceiverOffset)); __ Push(scratch); +#endif // ----------- S t a t e ------------- // -- r3 : the JSGeneratorObject to resume @@ -454,6 +452,27 @@ void Builtins::Generate_ResumeGeneratorTrampoline(MacroAssembler* masm) { r4, FieldMemOperand(r3, JSGeneratorObject::kParametersAndRegistersOffset)); { +#ifdef V8_REVERSE_JSARGS + Label done_loop, loop; + __ LoadRR(r8, r5); + + __ bind(&loop); + __ SubP(r8, r8, Operand(1)); + __ blt(&done_loop); + __ ShiftLeftP(r1, r8, Operand(kTaggedSizeLog2)); + __ la(scratch, MemOperand(r4, r1)); + __ LoadAnyTaggedField(scratch, + FieldMemOperand(scratch, FixedArray::kHeaderSize)); + __ Push(scratch); + __ b(&loop); + + __ bind(&done_loop); + + // Push receiver. + __ LoadAnyTaggedField( + scratch, FieldMemOperand(r3, JSGeneratorObject::kReceiverOffset)); + __ Push(scratch); +#else Label loop, done_loop; __ ShiftLeftP(r1, r5, Operand(kSystemPointerSizeLog2)); __ SubP(sp, r1); @@ -480,6 +499,7 @@ void Builtins::Generate_ResumeGeneratorTrampoline(MacroAssembler* masm) { __ BranchRelativeOnIdxHighP(r5, r1, &loop); __ bind(&done_loop); +#endif } // Underlying function needs to have bytecode available. @@ -808,6 +828,17 @@ static void Generate_JSEntryTrampolineHelper(MacroAssembler* masm, // [fp + kPushedStackSpace + 20 * kSystemPointerSize]: argv // r0,r2,r7-r9, cp may be clobbered + __ LoadRR(r2, r6); + // Load argv from the stack. + __ LoadP( + r6, MemOperand(fp, kPushedStackSpace + EntryFrameConstants::kArgvOffset)); + + // r2: argc + // r3: new.target + // r4: function + // r5: receiver + // r6: argv + // Enter an internal frame. { // FrameScope ends up calling MacroAssembler::EnterFrame here @@ -819,34 +850,12 @@ static void Generate_JSEntryTrampolineHelper(MacroAssembler* masm, __ Move(cp, context_address); __ LoadP(cp, MemOperand(cp)); - // Push the function and the receiver onto the stack. - __ Push(r4, r5); + // Push the function + __ Push(r4); // Check if we have enough stack space to push all arguments. - // Clobbers r5 and r0. - Generate_CheckStackOverflow(masm, r6, r5, r0); - - // r3: new.target - // r4: function - // r6: argc - // [fp + kPushedStackSpace + 20 * kSystemPointerSize]: argv - // r0,r2,r5,r7-r9, cp may be clobbered - - // Setup new.target, argc and function. - __ LoadRR(r2, r6); - __ LoadRR(r5, r3); - __ LoadRR(r3, r4); - - // Load argv from the stack. - __ LoadP(r6, MemOperand(fp)); - __ LoadP(r6, MemOperand( - r6, kPushedStackSpace + EntryFrameConstants::kArgvOffset)); - - // r2: argc - // r3: function - // r5: new.target - // r6: argv - // r0,r4,r7-r9, cp may be clobbered + __ AddP(r7, r2, Operand(1)); + Generate_CheckStackOverflow(masm, r7, r1, r0); // Copy arguments to the stack in a loop from argv to sp. // The arguments are actually placed in reverse order on sp @@ -858,22 +867,55 @@ static void Generate_JSEntryTrampolineHelper(MacroAssembler* masm, // r7: scratch reg to hold scaled argc // r8: scratch reg to hold arg handle // r9: scratch reg to hold index into argv + +#ifdef V8_REVERSE_JSARGS Label argLoop, argExit; - intptr_t zero = 0; - __ ShiftLeftP(r7, r2, Operand(kSystemPointerSizeLog2)); - __ SubRR(sp, r7); // Buy the stack frame to fit args - __ LoadImmP(r9, Operand(zero)); // Initialize argv index + + __ ShiftLeftP(r9, r2, Operand(kSystemPointerSizeLog2)); + __ lay(r9, MemOperand(r6, r9, -kSystemPointerSize)); // point to last arg + + __ ltgr(r7, r2); + + __ beq(&argExit, Label::kNear); __ bind(&argLoop); - __ CmpPH(r7, Operand(zero)); + + __ LoadP(r8, MemOperand(r9)); // read next parameter + __ LoadP(r0, MemOperand(r8)); // dereference handle + __ Push(r0); + __ lay(r9, MemOperand(r9, -kSystemPointerSize)); // r9++; + __ SubP(r7, r7, Operand(1)); + __ bgt(&argLoop); + + __ bind(&argExit); + + // Push the receiver. + __ Push(r5); + +#else + // Push the receiver. + __ Push(r5); + + Label argLoop, argExit; + + __ LoadRR(r9, r6); + __ ltgr(r7, r2); __ beq(&argExit, Label::kNear); - __ lay(r7, MemOperand(r7, -kSystemPointerSize)); - __ LoadP(r8, MemOperand(r9, r6)); // read next parameter - __ la(r9, MemOperand(r9, kSystemPointerSize)); // r9++; + __ bind(&argLoop); + + __ LoadP(r8, MemOperand(r9)); // read next parameter __ LoadP(r0, MemOperand(r8)); // dereference handle - __ StoreP(r0, MemOperand(r7, sp)); // push parameter - __ b(&argLoop); + __ Push(r0); + __ la(r9, MemOperand(r9, kSystemPointerSize)); // r9++; + // __ lay(r7, MemOperand(r7, -kSystemPointerSize)); + __ SubP(r7, r7, Operand(1)); + __ bgt(&argLoop); + __ bind(&argExit); +#endif + // Setup new.target, argc and function. + __ LoadRR(r5, r3); + __ LoadRR(r3, r4); // r2: argc // r3: function // r5: new.target @@ -964,6 +1006,7 @@ static void TailCallOptimizedCodeSlot(MacroAssembler* masm, Register optimized_code_entry, Register scratch) { // ----------- S t a t e ------------- + // -- r2 : actual argument count // -- r5 : new target (preserved for callee if needed, and caller) // -- r3 : target function (preserved for callee if needed, and caller) // ----------------------------------- @@ -999,6 +1042,7 @@ static void TailCallOptimizedCodeSlot(MacroAssembler* masm, static void MaybeOptimizeCode(MacroAssembler* masm, Register feedback_vector, Register optimization_marker) { // ----------- S t a t e ------------- + // -- r2 : actual argument count // -- r5 : new target (preserved for callee if needed, and caller) // -- r3 : target function (preserved for callee if needed, and caller) // -- feedback vector (preserved for caller if needed) @@ -1112,10 +1156,10 @@ static void AdvanceBytecodeOffsetOrReturn(MacroAssembler* masm, // Generate code for entering a JS function with the interpreter. // On entry to the function the receiver and arguments have been pushed on the -// stack left to right. The actual argument count matches the formal parameter -// count expected by the function. +// stack left to right. // // The live registers are: +// o r2: actual argument count (not including the receiver) // o r3: the JS function object being called. // o r5: the incoming new target or generator object // o cp: our context @@ -1133,17 +1177,17 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) { // Get the bytecode array from the function object and load it into // kInterpreterBytecodeArrayRegister. __ LoadTaggedPointerField( - r2, FieldMemOperand(closure, JSFunction::kSharedFunctionInfoOffset)); + r6, FieldMemOperand(closure, JSFunction::kSharedFunctionInfoOffset)); // Load original bytecode array or the debug copy. __ LoadTaggedPointerField( kInterpreterBytecodeArrayRegister, - FieldMemOperand(r2, SharedFunctionInfo::kFunctionDataOffset)); - GetSharedFunctionInfoBytecode(masm, kInterpreterBytecodeArrayRegister, r6); + FieldMemOperand(r6, SharedFunctionInfo::kFunctionDataOffset)); + GetSharedFunctionInfoBytecode(masm, kInterpreterBytecodeArrayRegister, ip); // The bytecode array could have been flushed from the shared function info, // if so, call into CompileLazy. Label compile_lazy; - __ CompareObjectType(kInterpreterBytecodeArrayRegister, r2, no_reg, + __ CompareObjectType(kInterpreterBytecodeArrayRegister, r6, no_reg, BYTECODE_ARRAY_TYPE); __ bne(&compile_lazy); @@ -1355,20 +1399,19 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) { } static void Generate_InterpreterPushArgs(MacroAssembler* masm, - Register num_args, Register index, - Register count, Register scratch) { - Label loop, skip; - __ CmpP(count, Operand::Zero()); - __ beq(&skip); - __ AddP(index, index, Operand(kSystemPointerSize)); // Bias up for LoadPU - __ LoadRR(r0, count); - __ bind(&loop); - __ LoadP(scratch, MemOperand(index, -kSystemPointerSize)); - __ lay(index, MemOperand(index, -kSystemPointerSize)); - __ push(scratch); - __ SubP(r0, Operand(1)); - __ bne(&loop); - __ bind(&skip); + Register num_args, + Register start_address, + Register scratch) { + __ SubP(scratch, num_args, Operand(1)); + __ ShiftLeftP(scratch, scratch, Operand(kSystemPointerSizeLog2)); + __ SubP(start_address, start_address, scratch); + // Push the arguments. +#ifdef V8_REVERSE_JSARGS + __ PushArray(start_address, num_args, r1, scratch, + TurboAssembler::PushArrayOrder::kReverse); +#else + __ PushArray(start_address, num_args, r1, scratch); +#endif } // static @@ -1385,10 +1428,37 @@ void Builtins::Generate_InterpreterPushArgsThenCallImpl( // ----------------------------------- Label stack_overflow; +#ifdef V8_REVERSE_JSARGS + if (mode == InterpreterPushArgsMode::kWithFinalSpread) { + // The spread argument should not be pushed. + __ SubP(r2, r2, Operand(1)); + } +#endif + // Calculate number of arguments (AddP one for receiver). __ AddP(r5, r2, Operand(1)); Generate_StackOverflowCheck(masm, r5, ip, &stack_overflow); +#ifdef V8_REVERSE_JSARGS + if (receiver_mode == ConvertReceiverMode::kNullOrUndefined) { + // Don't copy receiver. Argument count is correct. + __ LoadRR(r5, r2); + } + + // Push the arguments. + Generate_InterpreterPushArgs(masm, r5, r4, r6); + + if (receiver_mode == ConvertReceiverMode::kNullOrUndefined) { + __ PushRoot(RootIndex::kUndefinedValue); + } + + if (mode == InterpreterPushArgsMode::kWithFinalSpread) { + // Pass the spread in the register r2. + // r2 already points to the penultimate argument, the spread + // lies in the next interpreter register. + __ LoadP(r4, MemOperand(r4, -kSystemPointerSize)); + } +#else // Push "undefined" as the receiver arg if we need to. if (receiver_mode == ConvertReceiverMode::kNullOrUndefined) { __ PushRoot(RootIndex::kUndefinedValue); @@ -1396,11 +1466,12 @@ void Builtins::Generate_InterpreterPushArgsThenCallImpl( } // Push the arguments. - Generate_InterpreterPushArgs(masm, r5, r4, r5, r6); + Generate_InterpreterPushArgs(masm, r5, r4, r6); if (mode == InterpreterPushArgsMode::kWithFinalSpread) { __ Pop(r4); // Pass the spread in a register __ SubP(r2, r2, Operand(1)); // Subtract one for spread } +#endif // Call the target. if (mode == InterpreterPushArgsMode::kWithFinalSpread) { @@ -1430,18 +1501,38 @@ void Builtins::Generate_InterpreterPushArgsThenConstructImpl( // -- r6 : address of the first argument // ----------------------------------- Label stack_overflow; + __ AddP(r7, r2, Operand(1)); + Generate_StackOverflowCheck(masm, r7, ip, &stack_overflow); + +#ifdef V8_REVERSE_JSARGS + if (mode == InterpreterPushArgsMode::kWithFinalSpread) { + // The spread argument should not be pushed. + __ SubP(r2, r2, Operand(1)); + } + + // Push the arguments. r4 and r5 will be modified. + Generate_InterpreterPushArgs(masm, r2, r6, r7); + // Push a slot for the receiver to be constructed. + __ mov(r0, Operand::Zero()); + __ push(r0); + + if (mode == InterpreterPushArgsMode::kWithFinalSpread) { + // Pass the spread in the register r2. + // r4 already points to the penultimate argument, the spread + // lies in the next interpreter register. + __ lay(r6, MemOperand(r6, -kSystemPointerSize)); + __ LoadP(r4, MemOperand(r6)); + } else { + __ AssertUndefinedOrAllocationSite(r4, r7); + } +#else // Push a slot for the receiver to be constructed. __ LoadImmP(r0, Operand::Zero()); __ push(r0); // Push the arguments (skip if none). - Label skip; - __ CmpP(r2, Operand::Zero()); - __ beq(&skip); - Generate_StackOverflowCheck(masm, r2, ip, &stack_overflow); - Generate_InterpreterPushArgs(masm, r2, r6, r2, r7); - __ bind(&skip); + Generate_InterpreterPushArgs(masm, r2, r6, r7); if (mode == InterpreterPushArgsMode::kWithFinalSpread) { __ Pop(r4); // Pass the spread in a register @@ -1449,6 +1540,9 @@ void Builtins::Generate_InterpreterPushArgsThenConstructImpl( } else { __ AssertUndefinedOrAllocationSite(r4, r7); } + +#endif + if (mode == InterpreterPushArgsMode::kArrayFunction) { __ AssertFunction(r3); @@ -1611,7 +1705,21 @@ void Generate_ContinueToBuiltinHelper(MacroAssembler* masm, bool with_result) { const RegisterConfiguration* config(RegisterConfiguration::Default()); int allocatable_register_count = config->num_allocatable_general_registers(); + Register scratch = ip; if (with_result) { +#ifdef V8_REVERSE_JSARGS + if (java_script_builtin) { + __ LoadRR(scratch, r2); + } else { + // Overwrite the hole inserted by the deoptimizer with the return value + // from the LAZY deopt point. + __ StoreP( + r2, MemOperand( + sp, config->num_allocatable_general_registers() * + kSystemPointerSize + + BuiltinContinuationFrameConstants::kFixedFrameSize)); + } +#else // Overwrite the hole inserted by the deoptimizer with the return value from // the LAZY deopt point. __ StoreP( @@ -1619,6 +1727,8 @@ void Generate_ContinueToBuiltinHelper(MacroAssembler* masm, MemOperand(sp, config->num_allocatable_general_registers() * kSystemPointerSize + BuiltinContinuationFrameConstants::kFixedFrameSize)); + USE(scratch); +#endif } for (int i = allocatable_register_count - 1; i >= 0; --i) { int code = config->GetAllocatableGeneralCode(i); @@ -1627,6 +1737,20 @@ void Generate_ContinueToBuiltinHelper(MacroAssembler* masm, __ SmiUntag(Register::from_code(code)); } } +#ifdef V8_REVERSE_JSARGS + if (java_script_builtin && with_result) { + // Overwrite the hole inserted by the deoptimizer with the return value from + // the LAZY deopt point. r0 contains the arguments count, the return value + // from LAZY is always the last argument. + __ AddP(r2, r2, + Operand(BuiltinContinuationFrameConstants::kFixedSlotCount)); + __ ShiftLeftP(r1, r2, Operand(kSystemPointerSizeLog2)); + __ StoreP(scratch, MemOperand(sp, r1)); + // Recover arguments count. + __ SubP(r2, r2, + Operand(BuiltinContinuationFrameConstants::kFixedSlotCount)); + } +#endif __ LoadP( fp, MemOperand(sp, BuiltinContinuationFrameConstants::kFixedFrameSizeFromFp)); @@ -1725,23 +1849,41 @@ void Builtins::Generate_FunctionPrototypeApply(MacroAssembler* masm) { // arguments from the stack (including the receiver), and push thisArg (if // present) instead. { - Label skip; - Register arg_size = r7; - Register new_sp = r5; - Register scratch = r6; - __ ShiftLeftP(arg_size, r2, Operand(kSystemPointerSizeLog2)); - __ AddP(new_sp, sp, arg_size); - __ LoadRoot(scratch, RootIndex::kUndefinedValue); - __ LoadRR(r4, scratch); - __ LoadP(r3, MemOperand(new_sp, 0)); // receiver - __ CmpP(arg_size, Operand(kSystemPointerSize)); - __ blt(&skip); - __ LoadP(scratch, MemOperand(new_sp, 1 * -kSystemPointerSize)); // thisArg - __ beq(&skip); - __ LoadP(r4, MemOperand(new_sp, 2 * -kSystemPointerSize)); // argArray - __ bind(&skip); - __ LoadRR(sp, new_sp); - __ StoreP(scratch, MemOperand(sp, 0)); + __ LoadRoot(r7, RootIndex::kUndefinedValue); + __ LoadRR(r4, r7); + +#ifdef V8_REVERSE_JSARGS + Label done; + + __ LoadP(r3, MemOperand(sp)); // receiver + __ cghi(r2, Operand(1)); + __ blt(&done); + __ LoadP(r7, MemOperand(sp, kSystemPointerSize)); // thisArg + __ cghi(r2, Operand(2)); + __ blt(&done); + __ LoadP(r4, MemOperand(sp, 2 * kSystemPointerSize)); // argArray + + __ bind(&done); +#else + Label done; + __ ShiftLeftP(r1, r2, Operand(kSystemPointerSizeLog2)); + __ LoadP(r3, MemOperand(sp, r1)); // receiver + + __ SubP(r6, r2, Operand(1)); + __ blt(&done); + __ ShiftLeftP(r1, r6, Operand(kSystemPointerSizeLog2)); + __ LoadP(r7, MemOperand(sp, r1)); + + __ SubP(r6, r6, Operand(1)); + __ blt(&done); + __ ShiftLeftP(r1, r6, Operand(kSystemPointerSizeLog2)); + __ LoadP(r4, MemOperand(sp, r1)); + + __ bind(&done); +#endif + __ ShiftLeftP(r1, r2, Operand(kSystemPointerSizeLog2)); + __ lay(sp, MemOperand(sp, r1)); + __ StoreP(r7, MemOperand(sp)); } // ----------- S t a t e ------------- @@ -1774,6 +1916,24 @@ void Builtins::Generate_FunctionPrototypeApply(MacroAssembler* masm) { // static void Builtins::Generate_FunctionPrototypeCall(MacroAssembler* masm) { +#ifdef V8_REVERSE_JSARGS + // 1. Get the callable to call (passed as receiver) from the stack. + __ Pop(r3); + + // 2. Make sure we have at least one argument. + // r2: actual number of arguments + { + Label done; + __ cghi(r2, Operand::Zero()); + __ b(ne, &done); + __ PushRoot(RootIndex::kUndefinedValue); + __ AddP(r2, r2, Operand(1)); + __ bind(&done); + } + + // 3. Adjust the actual number of arguments. + __ SubP(r2, r2, Operand(1)); +#else // 1. Make sure we have at least one argument. // r2: actual number of arguments { @@ -1787,8 +1947,7 @@ void Builtins::Generate_FunctionPrototypeCall(MacroAssembler* masm) { // r2: actual number of arguments // 2. Get the callable to call (passed as receiver) from the stack. - __ ShiftLeftP(r4, r2, Operand(kSystemPointerSizeLog2)); - __ LoadP(r3, MemOperand(sp, r4)); + __ LoadReceiver(r3, r2); // 3. Shift arguments and return address one slot down on the stack // (overwriting the original receiver). Adjust argument count to make @@ -1799,7 +1958,8 @@ void Builtins::Generate_FunctionPrototypeCall(MacroAssembler* masm) { Register scratch = r5; Label loop; // Calculate the copy start address (destination). Copy end address is sp. - __ AddP(r4, sp, r4); + __ ShiftLeftP(r4, r2, Operand(kSystemPointerSizeLog2)); + __ lay(r4, MemOperand(sp, r4)); __ bind(&loop); __ LoadP(scratch, MemOperand(r4, -kSystemPointerSize)); @@ -1812,6 +1972,7 @@ void Builtins::Generate_FunctionPrototypeCall(MacroAssembler* masm) { __ SubP(r2, Operand(1)); __ pop(); } +#endif // 4. Call the callable. __ Jump(masm->isolate()->builtins()->Call(), RelocInfo::CODE_TARGET); @@ -1830,27 +1991,46 @@ void Builtins::Generate_ReflectApply(MacroAssembler* masm) { // remove all arguments from the stack (including the receiver), and push // thisArgument (if present) instead. { - Label skip; - Register arg_size = r7; - Register new_sp = r5; - Register scratch = r6; - __ ShiftLeftP(arg_size, r2, Operand(kSystemPointerSizeLog2)); - __ AddP(new_sp, sp, arg_size); __ LoadRoot(r3, RootIndex::kUndefinedValue); - __ LoadRR(scratch, r3); + __ LoadRR(r7, r3); __ LoadRR(r4, r3); - __ CmpP(arg_size, Operand(kSystemPointerSize)); - __ blt(&skip); - __ LoadP(r3, MemOperand(new_sp, 1 * -kSystemPointerSize)); // target - __ beq(&skip); - __ LoadP(scratch, - MemOperand(new_sp, 2 * -kSystemPointerSize)); // thisArgument - __ CmpP(arg_size, Operand(2 * kSystemPointerSize)); - __ beq(&skip); - __ LoadP(r4, MemOperand(new_sp, 3 * -kSystemPointerSize)); // argumentsList - __ bind(&skip); - __ LoadRR(sp, new_sp); - __ StoreP(scratch, MemOperand(sp, 0)); + +#ifdef V8_REVERSE_JSARGS + Label done; + + __ cghi(r2, Operand(1)); + __ blt(&done); + __ LoadP(r3, MemOperand(sp, kSystemPointerSize)); // thisArg + __ cghi(r2, Operand(2)); + __ blt(&done); + __ LoadP(r7, MemOperand(sp, 2 * kSystemPointerSize)); // argArray + __ cghi(r2, Operand(3)); + __ blt(&done); + __ LoadP(r4, MemOperand(sp, 3 * kSystemPointerSize)); // argArray + + __ bind(&done); +#else + Label done; + __ SubP(r6, r2, Operand(1)); + __ blt(&done); + __ ShiftLeftP(r1, r6, Operand(kSystemPointerSizeLog2)); + __ LoadP(r3, MemOperand(sp, r1)); // receiver + + __ SubP(r6, r6, Operand(1)); + __ blt(&done); + __ ShiftLeftP(r1, r6, Operand(kSystemPointerSizeLog2)); + __ LoadP(r7, MemOperand(sp, r1)); + + __ SubP(r6, r6, Operand(1)); + __ blt(&done); + __ ShiftLeftP(r1, r6, Operand(kSystemPointerSizeLog2)); + __ LoadP(r4, MemOperand(sp, r1)); + + __ bind(&done); +#endif + __ ShiftLeftP(r1, r2, Operand(kSystemPointerSizeLog2)); + __ lay(sp, MemOperand(sp, r1)); + __ StoreP(r7, MemOperand(sp)); } // ----------- S t a t e ------------- @@ -1876,32 +2056,58 @@ void Builtins::Generate_ReflectConstruct(MacroAssembler* masm) { // -- sp[8] : target // -- sp[12] : receiver // ----------------------------------- + // NOTE: The order of args in the stack are reversed if V8_REVERSE_JSARGS // 1. Load target into r3 (if present), argumentsList into r4 (if present), // new.target into r5 (if present, otherwise use target), remove all // arguments from the stack (including the receiver), and push thisArgument // (if present) instead. { - Label skip; - Register arg_size = r7; - Register new_sp = r6; - __ ShiftLeftP(arg_size, r2, Operand(kSystemPointerSizeLog2)); - __ AddP(new_sp, sp, arg_size); __ LoadRoot(r3, RootIndex::kUndefinedValue); __ LoadRR(r4, r3); + +#ifdef V8_REVERSE_JSARGS + Label done; + + __ LoadRR(r6, r3); + __ cghi(r2, Operand(1)); + __ blt(&done); + __ LoadP(r3, MemOperand(sp, kSystemPointerSize)); // thisArg __ LoadRR(r5, r3); - __ StoreP(r3, MemOperand(new_sp, 0)); // receiver (undefined) - __ CmpP(arg_size, Operand(kSystemPointerSize)); - __ blt(&skip); - __ LoadP(r3, MemOperand(new_sp, 1 * -kSystemPointerSize)); // target - __ LoadRR(r5, r3); // new.target defaults to target - __ beq(&skip); - __ LoadP(r4, MemOperand(new_sp, 2 * -kSystemPointerSize)); // argumentsList - __ CmpP(arg_size, Operand(2 * kSystemPointerSize)); - __ beq(&skip); - __ LoadP(r5, MemOperand(new_sp, 3 * -kSystemPointerSize)); // new.target - __ bind(&skip); - __ LoadRR(sp, new_sp); + __ cghi(r2, Operand(2)); + __ blt(&done); + __ LoadP(r4, MemOperand(sp, 2 * kSystemPointerSize)); // argArray + __ cghi(r2, Operand(3)); + __ blt(&done); + __ LoadP(r5, MemOperand(sp, 3 * kSystemPointerSize)); // argArray + __ bind(&done); + __ ShiftLeftP(r1, r2, Operand(kSystemPointerSizeLog2)); + __ lay(sp, MemOperand(sp, r1)); + __ StoreP(r6, MemOperand(sp)); +#else + Label done; + __ ShiftLeftP(r1, r2, Operand(kSystemPointerSizeLog2)); + __ StoreP(r4, MemOperand(sp, r1)); + __ SubP(r6, r2, Operand(1)); + __ blt(&done); + __ ShiftLeftP(r1, r6, Operand(kSystemPointerSizeLog2)); + __ LoadP(r3, MemOperand(sp, r1)); // receiver + + __ LoadRR(r5, r3); + __ SubP(r6, r6, Operand(1)); + __ blt(&done); + __ ShiftLeftP(r1, r6, Operand(kSystemPointerSizeLog2)); + __ LoadP(r4, MemOperand(sp, r1)); + + __ SubP(r6, r6, Operand(1)); + __ blt(&done); + __ ShiftLeftP(r1, r6, Operand(kSystemPointerSizeLog2)); + __ LoadP(r5, MemOperand(sp, r1)); + + __ bind(&done); + __ ShiftLeftP(r1, r2, Operand(kSystemPointerSizeLog2)); + __ lay(sp, MemOperand(sp, r1)); +#endif } // ----------- S t a t e ------------- @@ -2000,6 +2206,30 @@ void Builtins::Generate_CallOrConstructVarargs(MacroAssembler* masm, Label stack_overflow; Generate_StackOverflowCheck(masm, r6, scratch, &stack_overflow); +#ifdef V8_REVERSE_JSARGS + // Move the arguments already in the stack, + // including the receiver and the return address. + { + Label copy, check; + Register num = ip, src = r8, dest = r7; + __ LoadRR(src, sp); + __ ShiftLeftP(r1, r6, Operand(kSystemPointerSizeLog2)); + __ SubP(sp, sp, r1); + // Update stack pointer. + __ LoadRR(dest, sp); + __ ltgr(num, r2); + __ b(&check); + __ bind(©); + __ LoadP(r0, MemOperand(src)); + __ lay(src, MemOperand(src, kSystemPointerSize)); + __ StoreP(r0, MemOperand(dest)); + __ lay(dest, MemOperand(dest, kSystemPointerSize)); + __ SubP(num, num, Operand(1)); + __ bind(&check); + __ b(ge, ©); + } +#endif + // Push arguments onto the stack (thisArgument is already on the stack). { Label loop, no_args, skip; @@ -2015,7 +2245,12 @@ void Builtins::Generate_CallOrConstructVarargs(MacroAssembler* masm, __ bne(&skip, Label::kNear); __ LoadRoot(scratch, RootIndex::kUndefinedValue); __ bind(&skip); - __ push(scratch); +#ifdef V8_REVERSE_JSARGS + __ StoreP(scratch, MemOperand(r7)); + __ lay(r7, MemOperand(r7, kSystemPointerSize)); +#else + __ Push(scratch); +#endif __ BranchOnCount(r1, &loop); __ bind(&no_args); __ AddP(r2, r2, r6); @@ -2087,23 +2322,73 @@ void Builtins::Generate_CallOrConstructForwardVarargs(MacroAssembler* masm, Label stack_done, stack_overflow; __ SubP(r7, r7, r4); - __ CmpP(r7, Operand::Zero()); __ ble(&stack_done); { + // ----------- S t a t e ------------- + // -- r2 : the number of arguments already in the stack (not including the + // receiver) + // -- r3 : the target to call (can be any Object) + // -- r4 : start index (to support rest parameters) + // -- r5 : the new.target (for [[Construct]] calls) + // -- r6 : point to the caller stack frame + // -- r7 : number of arguments to copy, i.e. arguments count - start index + // ----------------------------------- + // Check for stack overflow. - Generate_StackOverflowCheck(masm, r7, r4, &stack_overflow); + Generate_StackOverflowCheck(masm, r7, scratch, &stack_overflow); // Forward the arguments from the caller frame. +#ifdef V8_REVERSE_JSARGS + __ LoadRR(r5, r5); + // Point to the first argument to copy (skipping the receiver). + __ AddP(r6, r6, + Operand(CommonFrameConstants::kFixedFrameSizeAboveFp + + kSystemPointerSize)); + __ ShiftLeftP(scratch, r4, Operand(kSystemPointerSizeLog2)); + __ AddP(r6, r6, scratch); + + // Move the arguments already in the stack, + // including the receiver and the return address. + { + Label copy, check; + Register num = r1, src = ip, + dest = r4; // r7 and r10 are context and root. + __ LoadRR(src, sp); + // Update stack pointer. + __ ShiftLeftP(scratch, r7, Operand(kSystemPointerSizeLog2)); + __ SubP(sp, sp, scratch); + __ LoadRR(dest, sp); + __ ltgr(num, r2); + __ b(&check); + __ bind(©); + __ LoadP(r0, MemOperand(src)); + __ lay(src, MemOperand(src, kSystemPointerSize)); + __ StoreP(r0, MemOperand(dest)); + __ lay(dest, MemOperand(dest, kSystemPointerSize)); + __ SubP(num, num, Operand(1)); + __ bind(&check); + __ b(ge, ©); + } +#endif + // Copy arguments from the caller frame. + // TODO(victorgomes): Consider using forward order as potentially more cache + // friendly. { Label loop; - __ AddP(r6, r6, Operand(kSystemPointerSize)); +#ifndef V8_REVERSE_JSARGS + __ AddP(r6, r6, Operand(CommonFrameConstants::kFixedFrameSizeAboveFp)); +#endif __ AddP(r2, r2, r7); __ bind(&loop); { - __ ShiftLeftP(scratch, r7, Operand(kSystemPointerSizeLog2)); - __ LoadP(scratch, MemOperand(r6, scratch)); - __ push(scratch); __ SubP(r7, r7, Operand(1)); + __ ShiftLeftP(r1, r7, Operand(kSystemPointerSizeLog2)); + __ LoadP(scratch, MemOperand(r6, r1)); +#ifdef V8_REVERSE_JSARGS + __ StoreP(scratch, MemOperand(r4, r1)); +#else + __ push(scratch); +#endif __ CmpP(r7, Operand::Zero()); __ bne(&loop); } @@ -2160,8 +2445,7 @@ void Builtins::Generate_CallFunction(MacroAssembler* masm, __ LoadGlobalProxy(r5); } else { Label convert_to_object, convert_receiver; - __ ShiftLeftP(r5, r2, Operand(kSystemPointerSizeLog2)); - __ LoadP(r5, MemOperand(sp, r5)); + __ LoadReceiver(r5, r2); __ JumpIfSmi(r5, &convert_to_object); STATIC_ASSERT(LAST_JS_RECEIVER_TYPE == LAST_TYPE); __ CompareObjectType(r5, r6, r6, FIRST_JS_RECEIVER_TYPE); @@ -2198,8 +2482,7 @@ void Builtins::Generate_CallFunction(MacroAssembler* masm, r4, FieldMemOperand(r3, JSFunction::kSharedFunctionInfoOffset)); __ bind(&convert_receiver); } - __ ShiftLeftP(r6, r2, Operand(kSystemPointerSizeLog2)); - __ StoreP(r5, MemOperand(sp, r6)); + __ StoreReceiver(r5, r2, r6); } __ bind(&done_convert); @@ -2269,6 +2552,29 @@ void Generate_PushBoundArguments(MacroAssembler* masm) { __ bind(&done); } +#ifdef V8_REVERSE_JSARGS + // Pop receiver. + __ Pop(r7); + + // Push [[BoundArguments]]. + { + Label loop, done; + __ AddP(r2, r2, r6); // Adjust effective number of arguments. + __ AddP(r4, r4, Operand(FixedArray::kHeaderSize - kHeapObjectTag)); + + __ bind(&loop); + __ SubP(r1, r6, Operand(1)); + __ ShiftLeftP(r1, r1, Operand(kTaggedSizeLog2)); + __ LoadAnyTaggedField(scratch, MemOperand(r4, r1), r0); + __ Push(scratch); + __ SubP(r6, r6, Operand(1)); + __ bgt(&loop); + __ bind(&done); + } + + // Push receiver. + __ Push(r7); +#else __ LoadRR(scratch, sp); __ LoadRR(sp, r1); @@ -2303,6 +2609,7 @@ void Generate_PushBoundArguments(MacroAssembler* masm) { __ BranchOnCount(r1, &loop); __ AddP(r2, r2, r6); } +#endif } __ bind(&no_bound_arguments); } @@ -2320,8 +2627,7 @@ void Builtins::Generate_CallBoundFunctionImpl(MacroAssembler* masm) { // Patch the receiver to [[BoundThis]]. __ LoadAnyTaggedField(r5, FieldMemOperand(r3, JSBoundFunction::kBoundThisOffset)); - __ ShiftLeftP(r1, r2, Operand(kSystemPointerSizeLog2)); - __ StoreP(r5, MemOperand(sp, r1)); + __ StoreReceiver(r5, r2, r1); // Push the [[BoundArguments]] onto the stack. Generate_PushBoundArguments(masm); @@ -2362,8 +2668,7 @@ void Builtins::Generate_Call(MacroAssembler* masm, ConvertReceiverMode mode) { // 2. Call to something else, which might have a [[Call]] internal method (if // not we raise an exception). // Overwrite the original receiver the (original) target. - __ ShiftLeftP(r7, r2, Operand(kSystemPointerSizeLog2)); - __ StoreP(r3, MemOperand(sp, r7)); + __ StoreReceiver(r3, r2, r7); // Let the "call_as_function_delegate" take care of the rest. __ LoadNativeContextSlot(Context::CALL_AS_FUNCTION_DELEGATE_INDEX, r3); __ Jump(masm->isolate()->builtins()->CallFunction( @@ -2477,8 +2782,7 @@ void Builtins::Generate_Construct(MacroAssembler* masm) { __ bind(&non_proxy); { // Overwrite the original receiver with the (original) target. - __ ShiftLeftP(r7, r2, Operand(kSystemPointerSizeLog2)); - __ StoreP(r3, MemOperand(sp, r7)); + __ StoreReceiver(r3, r2, r7); // Let the "call_as_constructor_delegate" take care of the rest. __ LoadNativeContextSlot(Context::CALL_AS_CONSTRUCTOR_DELEGATE_INDEX, r3); __ Jump(masm->isolate()->builtins()->CallFunction(), @@ -2506,10 +2810,12 @@ void Builtins::Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm) { __ LoadTaggedPointerField( r6, FieldMemOperand(r3, JSFunction::kSharedFunctionInfoOffset)); __ LoadlW(r6, FieldMemOperand(r6, SharedFunctionInfo::kFlagsOffset)); +#ifndef V8_REVERSE_JSARGS __ tmlh(r6, Operand(SharedFunctionInfo::IsSafeToSkipArgumentsAdaptorBit::kMask >> 16)); __ bne(&skip_adapt_arguments); +#endif // ------------------------------------------- // Adapt arguments. @@ -2530,8 +2836,13 @@ void Builtins::Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm) { // r3: function // r4: expected number of arguments // r5: new target (passed through to callee) +#ifdef V8_REVERSE_JSARGS + __ ShiftLeftP(r2, r4, Operand(kSystemPointerSizeLog2)); + __ AddP(r2, fp); +#else __ SmiToPtrArrayOffset(r2, r2); __ AddP(r2, fp); +#endif // adjust for return address and receiver __ AddP(r2, r2, Operand(2 * kSystemPointerSize)); __ ShiftLeftP(r6, r4, Operand(kSystemPointerSizeLog2)); @@ -2561,6 +2872,52 @@ void Builtins::Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm) { EnterArgumentsAdaptorFrame(masm); Generate_StackOverflowCheck(masm, r4, r7, &stack_overflow); +#ifdef V8_REVERSE_JSARGS + // Fill the remaining expected arguments with undefined. + // r0: actual number of arguments as a smi + // r1: function + // r2: expected number of arguments + // r3: new target (passed through to callee) + __ LoadRoot(r7, RootIndex::kUndefinedValue); + __ SmiUntag(r1, r2); + __ SubP(r8, r4, r1); + __ ShiftLeftP(r1, r8, Operand(kSystemPointerSizeLog2)); + __ SubP(r6, fp, r1); + // Adjust for frame. + __ SubP(r6, r6, + Operand(ArgumentsAdaptorFrameConstants::kFixedFrameSizeFromFp + + kSystemPointerSize)); + + Label fill; + __ bind(&fill); + __ push(r7); + __ CmpP(sp, r6); + __ b(ne, &fill); + + // Calculate copy start address into r0 and copy end address is fp. + // r0: actual number of arguments as a smi + // r1: function + // r2: expected number of arguments + // r3: new target (passed through to callee) + __ SmiToPtrArrayOffset(r2, r2); + __ lay(r2, MemOperand(r2, fp)); + + // Copy the arguments (including the receiver) to the new stack frame. + // r0: copy start address + // r1: function + // r2: expected number of arguments + // r3: new target (passed through to callee) + Label copy; + __ bind(©); + + // Adjust load for return address and receiver. + __ LoadP(r7, MemOperand(r2, 2 * kSystemPointerSize)); + __ push(r7); + + __ CmpP(r2, fp); // Compare before moving to next argument. + __ lay(r2, MemOperand(r2, -kSystemPointerSize)); + __ b(ne, ©); +#else // Calculate copy start address into r0 and copy end address is fp. // r2: actual number of arguments as a smi // r3: function @@ -2599,6 +2956,7 @@ void Builtins::Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm) { __ push(r0); __ CmpP(sp, r6); __ bne(&fill); +#endif } // Call the entry point. @@ -3154,6 +3512,7 @@ void Builtins::Generate_CallApiCallback(MacroAssembler* masm) { // -- sp[(argc - 1) * 4] : first argument // -- sp[(argc + 0) * 4] : receiver // ----------------------------------- + // NOTE: The order of args are reversed if V8_REVERSE_JSARGS Register api_function_address = r3; Register argc = r4; @@ -3228,10 +3587,15 @@ void Builtins::Generate_CallApiCallback(MacroAssembler* masm) { // FunctionCallbackInfo::values_ (points at the first varargs argument passed // on the stack). +#ifdef V8_REVERSE_JSARGS + __ AddP(scratch, scratch, + Operand((FCA::kArgsLength + 1) * kSystemPointerSize)); +#else __ AddP(scratch, scratch, Operand((FCA::kArgsLength - 1) * kSystemPointerSize)); __ ShiftLeftP(r1, argc, Operand(kSystemPointerSizeLog2)); __ AddP(scratch, scratch, r1); +#endif __ StoreP(scratch, MemOperand(sp, (kStackFrameExtraParamSlot + 2) * kSystemPointerSize)); diff --git a/deps/v8/src/builtins/torque-csa-header-includes.h b/deps/v8/src/builtins/torque-csa-header-includes.h index 560f704d66c554..879fda5bbeafb4 100644 --- a/deps/v8/src/builtins/torque-csa-header-includes.h +++ b/deps/v8/src/builtins/torque-csa-header-includes.h @@ -13,7 +13,7 @@ #include "src/codegen/code-stub-assembler.h" #include "src/compiler/code-assembler.h" #include "src/utils/utils.h" -#include "torque-generated/csa-types-tq.h" -#include "torque-generated/field-offsets-tq.h" +#include "torque-generated/csa-types.h" +#include "torque-generated/field-offsets.h" #endif // V8_BUILTINS_TORQUE_CSA_HEADER_INCLUDES_H_ diff --git a/deps/v8/src/builtins/typed-array-from.tq b/deps/v8/src/builtins/typed-array-from.tq index 56d4d1d6cf75d3..df9ebbf3b4709c 100644 --- a/deps/v8/src/builtins/typed-array-from.tq +++ b/deps/v8/src/builtins/typed-array-from.tq @@ -10,6 +10,8 @@ const kBuiltinNameFrom: constexpr string = '%TypedArray%.from'; type BuiltinsName extends int31 constexpr 'Builtins::Name'; const kTypedArrayPrototypeValues: constexpr BuiltinsName generates 'Builtins::kTypedArrayPrototypeValues'; +const kArrayPrototypeValues: constexpr BuiltinsName + generates 'Builtins::kArrayPrototypeValues'; extern builtin IterableToList(implicit context: Context)(JSAny, JSAny): JSArray; @@ -56,9 +58,9 @@ TypedArrayFrom(js-implicit context: NativeContext, receiver: JSAny)( otherwise IteratorIsUndefined, IteratorNotCallable; try { - // TypedArrays have iterators, so normally we would go through the - // IterableToList case below, which would convert the TypedArray to a - // JSArray (boxing the values if they won't fit in a Smi). + // TypedArrays and JSArrays have iterators, so normally we would go + // through the IterableToList case below, which would convert the + // source to a JSArray (boxing the values if they won't fit in a Smi). // // However, if we can guarantee that the source object has the // built-in iterator and that the %ArrayIteratorPrototype%.next method @@ -73,29 +75,55 @@ TypedArrayFrom(js-implicit context: NativeContext, receiver: JSAny)( // // Drop through to the default check_iterator behavior if any of these // checks fail. - const sourceTypedArray = - Cast(source) otherwise UseUserProvidedIterator; - const sourceBuffer = sourceTypedArray.buffer; - if (IsDetachedBuffer(sourceBuffer)) goto UseUserProvidedIterator; - // Check that the iterator function is exactly - // Builtins::kTypedArrayPrototypeValues. + // If there is a mapping, we need to gather the values from the + // iterables before applying the mapping. + if (mapping) goto UseUserProvidedIterator; + const iteratorFn = Cast(usingIterator) otherwise UseUserProvidedIterator; - if (!TaggedEqual( - iteratorFn.shared_function_info.function_data, - SmiConstant(kTypedArrayPrototypeValues))) - goto UseUserProvidedIterator; // Check that the ArrayIterator prototype's "next" method hasn't been // overridden. if (IsArrayIteratorProtectorCellInvalid()) goto UseUserProvidedIterator; - // Source is a TypedArray with unmodified iterator behavior. Use the - // source object directly, taking advantage of the special-case code - // in TypedArrayCopyElements - finalLength = sourceTypedArray.length; - finalSource = source; + typeswitch (source) { + case (sourceArray: JSArray): { + // Check that the iterator function is exactly + // Builtins::kArrayPrototypeValues. + if (!TaggedEqual( + iteratorFn.shared_function_info.function_data, + SmiConstant(kArrayPrototypeValues))) { + goto UseUserProvidedIterator; + } + + // Source is a JSArray with unmodified iterator behavior. Use the + // source object directly, taking advantage of the special-case code + // in TypedArrayCopyElements + finalLength = Convert(sourceArray.length); + finalSource = source; + } + case (sourceTypedArray: JSTypedArray): { + const sourceBuffer = sourceTypedArray.buffer; + if (IsDetachedBuffer(sourceBuffer)) goto UseUserProvidedIterator; + + // Check that the iterator function is exactly + // Builtins::kTypedArrayPrototypeValues. + if (!TaggedEqual( + iteratorFn.shared_function_info.function_data, + SmiConstant(kTypedArrayPrototypeValues))) + goto UseUserProvidedIterator; + + // Source is a TypedArray with unmodified iterator behavior. Use the + // source object directly, taking advantage of the special-case code + // in TypedArrayCopyElements + finalLength = sourceTypedArray.length; + finalSource = source; + } + case (Object): { + goto UseUserProvidedIterator; + } + } } label UseUserProvidedIterator { // 6. If usingIterator is not undefined, then // a. Let values be ? IterableToList(source, usingIterator). diff --git a/deps/v8/src/builtins/wasm.tq b/deps/v8/src/builtins/wasm.tq index 1ebc610b2ab510..fda048518a87f6 100644 --- a/deps/v8/src/builtins/wasm.tq +++ b/deps/v8/src/builtins/wasm.tq @@ -424,4 +424,8 @@ builtin ThrowWasmTrapIllegalCast(): JSAny { builtin ThrowWasmTrapArrayOutOfBounds(): JSAny { tail WasmTrap(SmiConstant(MessageTemplate::kWasmTrapArrayOutOfBounds)); } + +builtin ThrowWasmTrapWasmJSFunction(): JSAny { + tail WasmTrap(SmiConstant(MessageTemplate::kWasmTrapWasmJSFunction)); +} } diff --git a/deps/v8/src/builtins/x64/builtins-x64.cc b/deps/v8/src/builtins/x64/builtins-x64.cc index e12ff0bcbef975..b94817f6f50b2d 100644 --- a/deps/v8/src/builtins/x64/builtins-x64.cc +++ b/deps/v8/src/builtins/x64/builtins-x64.cc @@ -2,7 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "src/codegen/x64/register-x64.h" #if V8_TARGET_ARCH_X64 #include "src/api/api-arguments.h" @@ -45,23 +44,29 @@ void Builtins::Generate_Adaptor(MacroAssembler* masm, Address address) { static void GenerateTailCallToReturnedCode(MacroAssembler* masm, Runtime::FunctionId function_id) { // ----------- S t a t e ------------- + // -- rax : actual argument count // -- rdx : new target (preserved for callee) // -- rdi : target function (preserved for callee) // ----------------------------------- { FrameScope scope(masm, StackFrame::INTERNAL); - // Push a copy of the target function and the new target. - __ Push(rdi); - __ Push(rdx); + // Push a copy of the target function, the new target and the actual + // argument count. + __ Push(kJavaScriptCallTargetRegister); + __ Push(kJavaScriptCallNewTargetRegister); + __ SmiTag(kJavaScriptCallArgCountRegister); + __ Push(kJavaScriptCallArgCountRegister); // Function is also the parameter to the runtime call. - __ Push(rdi); + __ Push(kJavaScriptCallTargetRegister); __ CallRuntime(function_id, 1); __ movq(rcx, rax); - // Restore target function and new target. - __ Pop(rdx); - __ Pop(rdi); + // Restore target function, new target and actual argument count. + __ Pop(kJavaScriptCallArgCountRegister); + __ SmiUntag(kJavaScriptCallArgCountRegister); + __ Pop(kJavaScriptCallNewTargetRegister); + __ Pop(kJavaScriptCallTargetRegister); } static_assert(kJavaScriptCallCodeStartRegister == rcx, "ABI mismatch"); __ JumpCodeObject(rcx); @@ -126,6 +131,11 @@ void Generate_JSBuiltinsConstructStubHelper(MacroAssembler* masm) { __ Push(rsi); __ Push(rcx); + // TODO(victorgomes): When the arguments adaptor is completely removed, we + // should get the formal parameter count and copy the arguments in its + // correct position (including any undefined), instead of delaying this to + // InvokeFunction. + #ifdef V8_REVERSE_JSARGS // Set up pointer to first argument (skip receiver). __ leaq(rbx, Operand(rbp, StandardFrameConstants::kCallerSPOffset + @@ -282,6 +292,11 @@ void Builtins::Generate_JSConstructStubGeneric(MacroAssembler* masm) { __ bind(&enough_stack_space); + // TODO(victorgomes): When the arguments adaptor is completely removed, we + // should get the formal parameter count and copy the arguments in its + // correct position (including any undefined), instead of delaying this to + // InvokeFunction. + // Copy arguments to the expression stack. __ PushArray(rbx, rax, rcx); @@ -907,21 +922,38 @@ static void ReplaceClosureCodeWithOptimizedCode(MacroAssembler* masm, static void LeaveInterpreterFrame(MacroAssembler* masm, Register scratch1, Register scratch2) { - Register args_count = scratch1; - Register return_pc = scratch2; - - // Get the arguments + receiver count. - __ movq(args_count, + Register params_size = scratch1; + // Get the size of the formal parameters + receiver (in bytes). + __ movq(params_size, Operand(rbp, InterpreterFrameConstants::kBytecodeArrayFromFp)); - __ movl(args_count, - FieldOperand(args_count, BytecodeArray::kParameterSizeOffset)); + __ movl(params_size, + FieldOperand(params_size, BytecodeArray::kParameterSizeOffset)); + +#ifdef V8_NO_ARGUMENTS_ADAPTOR + Register actual_params_size = scratch2; + // Compute the size of the actual parameters + receiver (in bytes). + __ movq(actual_params_size, + Operand(rbp, StandardFrameConstants::kArgCOffset)); + __ leaq(actual_params_size, + Operand(actual_params_size, times_system_pointer_size, + kSystemPointerSize)); + + // If actual is bigger than formal, then we should use it to free up the stack + // arguments. + Label corrected_args_count; + __ cmpq(params_size, actual_params_size); + __ j(greater_equal, &corrected_args_count, Label::kNear); + __ movq(params_size, actual_params_size); + __ bind(&corrected_args_count); +#endif // Leave the frame (also dropping the register file). __ leave(); // Drop receiver + arguments. + Register return_pc = scratch2; __ PopReturnAddressTo(return_pc); - __ addq(rsp, args_count); + __ addq(rsp, params_size); __ PushReturnAddressFrom(return_pc); } @@ -940,6 +972,7 @@ static void TailCallRuntimeIfMarkerEquals(MacroAssembler* masm, static void MaybeOptimizeCode(MacroAssembler* masm, Register feedback_vector, Register optimization_marker) { // ----------- S t a t e ------------- + // -- rax : actual argument count // -- rdx : new target (preserved for callee if needed, and caller) // -- rdi : target function (preserved for callee if needed, and caller) // -- feedback vector (preserved for caller if needed) @@ -974,6 +1007,7 @@ static void TailCallOptimizedCodeSlot(MacroAssembler* masm, Register optimized_code_entry, Register scratch1, Register scratch2) { // ----------- S t a t e ------------- + // -- rax : actual argument count // -- rdx : new target (preserved for callee if needed, and caller) // -- rdi : target function (preserved for callee if needed, and caller) // ----------------------------------- @@ -1087,10 +1121,10 @@ static void AdvanceBytecodeOffsetOrReturn(MacroAssembler* masm, // Generate code for entering a JS function with the interpreter. // On entry to the function the receiver and arguments have been pushed on the -// stack left to right. The actual argument count matches the formal parameter -// count expected by the function. +// stack left to right. // // The live registers are: +// o rax: actual argument count (not including the receiver) // o rdi: the JS function object being called // o rdx: the incoming new target or generator object // o rsi: our context @@ -1106,17 +1140,19 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) { // Get the bytecode array from the function object and load it into // kInterpreterBytecodeArrayRegister. __ LoadTaggedPointerField( - rax, FieldOperand(closure, JSFunction::kSharedFunctionInfoOffset)); + kScratchRegister, + FieldOperand(closure, JSFunction::kSharedFunctionInfoOffset)); __ LoadTaggedPointerField( kInterpreterBytecodeArrayRegister, - FieldOperand(rax, SharedFunctionInfo::kFunctionDataOffset)); + FieldOperand(kScratchRegister, SharedFunctionInfo::kFunctionDataOffset)); GetSharedFunctionInfoBytecode(masm, kInterpreterBytecodeArrayRegister, kScratchRegister); // The bytecode array could have been flushed from the shared function info, // if so, call into CompileLazy. Label compile_lazy; - __ CmpObjectType(kInterpreterBytecodeArrayRegister, BYTECODE_ARRAY_TYPE, rax); + __ CmpObjectType(kInterpreterBytecodeArrayRegister, BYTECODE_ARRAY_TYPE, + kScratchRegister); __ j(not_equal, &compile_lazy); // Load the feedback vector from the closure. @@ -1162,8 +1198,9 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) { FrameScope frame_scope(masm, StackFrame::MANUAL); __ pushq(rbp); // Caller's frame pointer. __ movq(rbp, rsp); - __ Push(rsi); // Callee's context. - __ Push(rdi); // Callee's JS function. + __ Push(kContextRegister); // Callee's context. + __ Push(kJavaScriptCallTargetRegister); // Callee's JS function. + __ Push(kJavaScriptCallArgCountRegister); // Actual argument count. // Reset code age and the OSR arming. The OSR field and BytecodeAgeOffset are // 8-bit fields next to each other, so we could just optimize by writing a @@ -2345,6 +2382,12 @@ void Builtins::Generate_CallOrConstructForwardVarargs(MacroAssembler* masm, __ bind(&new_target_constructor); } +#ifdef V8_NO_ARGUMENTS_ADAPTOR + // TODO(victorgomes): Remove this copy when all the arguments adaptor frame + // code is erased. + __ movq(rbx, rbp); + __ movq(r8, Operand(rbp, StandardFrameConstants::kArgCOffset)); +#else // Check if we have an arguments adaptor frame below the function frame. Label arguments_adaptor, arguments_done; __ movq(rbx, Operand(rbp, StandardFrameConstants::kCallerFPOffset)); @@ -2366,42 +2409,88 @@ void Builtins::Generate_CallOrConstructForwardVarargs(MacroAssembler* masm, Operand(rbx, ArgumentsAdaptorFrameConstants::kLengthOffset)); } __ bind(&arguments_done); +#endif Label stack_done, stack_overflow; __ subl(r8, rcx); __ j(less_equal, &stack_done); { + // ----------- S t a t e ------------- + // -- rax : the number of arguments already in the stack (not including the + // receiver) + // -- rbx : point to the caller stack frame + // -- rcx : start index (to support rest parameters) + // -- rdx : the new target (for [[Construct]] calls) + // -- rdi : the target to call (can be any Object) + // -- r8 : number of arguments to copy, i.e. arguments count - start index + // ----------------------------------- + // Check for stack overflow. - Generate_StackOverflowCheck(masm, r8, rcx, &stack_overflow, Label::kNear); + Generate_StackOverflowCheck(masm, r8, r12, &stack_overflow, Label::kNear); // Forward the arguments from the caller frame. +#ifdef V8_REVERSE_JSARGS + // Move the arguments already in the stack, + // including the receiver and the return address. + { + Label copy, check; + Register src = r9, dest = rsp, num = r12, current = r11; + __ movq(src, rsp); + __ leaq(kScratchRegister, Operand(r8, times_system_pointer_size, 0)); + __ AllocateStackSpace(kScratchRegister); + __ leaq(num, Operand(rax, 2)); // Number of words to copy. + // +2 for receiver and return address. + __ Set(current, 0); + __ jmp(&check); + __ bind(©); + __ movq(kScratchRegister, + Operand(src, current, times_system_pointer_size, 0)); + __ movq(Operand(dest, current, times_system_pointer_size, 0), + kScratchRegister); + __ incq(current); + __ bind(&check); + __ cmpq(current, num); + __ j(less, ©); + __ leaq(r9, Operand(rsp, num, times_system_pointer_size, 0)); + } + + __ addl(rax, r8); // Update total number of arguments. + + // Point to the first argument to copy (skipping receiver). + __ leaq(rcx, Operand(rcx, times_system_pointer_size, + CommonFrameConstants::kFixedFrameSizeAboveFp + + kSystemPointerSize)); + __ addq(rbx, rcx); + + // Copy the additional caller arguments onto the stack. + // TODO(victorgomes): Consider using forward order as potentially more cache + // friendly. + { + Register src = rbx, dest = r9, num = r8; + Label loop; + __ bind(&loop); + __ decq(num); + __ movq(kScratchRegister, + Operand(src, num, times_system_pointer_size, 0)); + __ movq(Operand(dest, num, times_system_pointer_size, 0), + kScratchRegister); + __ j(not_zero, &loop); + } +#else { Label loop; __ addl(rax, r8); __ PopReturnAddressTo(rcx); -#ifdef V8_REVERSE_JSARGS - // The new receiver is already on the stack. Save it to push it later. - __ Pop(kScratchRegister); -#endif __ bind(&loop); { __ decl(r8); -#ifdef V8_REVERSE_JSARGS - // Skips the old receiver. - __ Push(Operand(rbx, r8, times_system_pointer_size, - kFPOnStackSize + kPCOnStackSize + kSystemPointerSize)); -#else __ Push(Operand(rbx, r8, times_system_pointer_size, kFPOnStackSize + kPCOnStackSize)); -#endif __ j(not_zero, &loop); } -#ifdef V8_REVERSE_JSARGS - // Recover the new receiver. - __ Push(kScratchRegister); -#endif __ PushReturnAddressFrom(rcx); } +#endif } __ jmp(&stack_done, Label::kNear); __ bind(&stack_overflow); @@ -3200,19 +3289,66 @@ void Builtins::Generate_DoubleToI(MacroAssembler* masm) { __ ret(0); } +namespace { +// Helper functions for the GenericJSToWasmWrapper. +void PrepareForBuiltinCall(MacroAssembler* masm, MemOperand GCScanSlotPlace, + const int GCScanSlotCount, Register current_param, + Register param_limit, + Register current_int_param_slot, + Register current_float_param_slot, + Register valuetypes_array_ptr, + Register wasm_instance, Register function_data) { + // Pushes and puts the values in order onto the stack before builtin calls for + // the GenericJSToWasmWrapper. + __ movq(GCScanSlotPlace, Immediate(GCScanSlotCount)); + __ pushq(current_param); + __ pushq(param_limit); + __ pushq(current_int_param_slot); + __ pushq(current_float_param_slot); + __ pushq(valuetypes_array_ptr); + __ pushq(wasm_instance); + __ pushq(function_data); + // We had to prepare the parameters for the Call: we have to put the context + // into rsi. + __ LoadAnyTaggedField( + rsi, + MemOperand(wasm_instance, wasm::ObjectAccess::ToTagged( + WasmInstanceObject::kNativeContextOffset))); +} + +void RestoreAfterBuiltinCall(MacroAssembler* masm, Register function_data, + Register wasm_instance, + Register valuetypes_array_ptr, + Register current_float_param_slot, + Register current_int_param_slot, + Register param_limit, Register current_param) { + // Pop and load values from the stack in order into the registers after + // builtin calls for the GenericJSToWasmWrapper. + __ popq(function_data); + __ popq(wasm_instance); + __ popq(valuetypes_array_ptr); + __ popq(current_float_param_slot); + __ popq(current_int_param_slot); + __ popq(param_limit); + __ popq(current_param); +} +} // namespace + void Builtins::Generate_GenericJSToWasmWrapper(MacroAssembler* masm) { // Set up the stackframe. __ EnterFrame(StackFrame::JS_TO_WASM); + // ------------------------------------------- + // Load the Wasm exported function data and the Wasm instance. + // ------------------------------------------- Register closure = rdi; - Register shared_function_info = rbx; + Register shared_function_info = closure; __ LoadAnyTaggedField( shared_function_info, MemOperand( closure, wasm::ObjectAccess::SharedFunctionInfoOffsetInTaggedJSFunction())); closure = no_reg; - Register function_data = shared_function_info; __ LoadAnyTaggedField( function_data, @@ -3226,34 +3362,373 @@ void Builtins::Generate_GenericJSToWasmWrapper(MacroAssembler* masm) { MemOperand(function_data, WasmExportedFunctionData::kInstanceOffset - kHeapObjectTag)); - // Int signature_type gives the number of int32 params (can be only 0 or 1). - Register signature_type = r9; - __ SmiUntagField( - signature_type, - MemOperand(function_data, WasmExportedFunctionData::kSignatureTypeOffset - - kHeapObjectTag)); + // ------------------------------------------- + // Load values from the signature. + // ------------------------------------------- + Register foreign_signature = r11; + __ LoadAnyTaggedField( + foreign_signature, + MemOperand(function_data, + WasmExportedFunctionData::kSignatureOffset - kHeapObjectTag)); + Register signature = foreign_signature; + __ movq(signature, + MemOperand(foreign_signature, wasm::ObjectAccess::ToTagged( + Foreign::kForeignAddressOffset))); + foreign_signature = no_reg; + Register return_count = r8; + __ movq(return_count, + MemOperand(signature, wasm::FunctionSig::kReturnCountOffset)); + Register param_count = rcx; + __ movq(param_count, + MemOperand(signature, wasm::FunctionSig::kParameterCountOffset)); + Register valuetypes_array_ptr = signature; + __ movq(valuetypes_array_ptr, + MemOperand(signature, wasm::FunctionSig::kRepsOffset)); + signature = no_reg; - __ cmpl(signature_type, Immediate(0)); + // ------------------------------------------- + // Set up the stack. + // ------------------------------------------- + // We store values on the stack to restore them after function calls. + // We cannot push values onto the stack right before the wasm call. The wasm + // function expects the parameters, that didn't fit into the registers, on the + // top of the stack. + // We will have to save a value indicating the GC the number + // of values on the top of the stack that have to be scanned before calling + // the Wasm function. + constexpr int kFrameMarkerOffset = -kSystemPointerSize; + constexpr int kGCScanSlotCountOffset = + kFrameMarkerOffset - kSystemPointerSize; + constexpr int kParamCountOffset = kGCScanSlotCountOffset - kSystemPointerSize; + constexpr int kReturnCountOffset = kParamCountOffset - kSystemPointerSize; + constexpr int kValueTypesArrayStartOffset = + kReturnCountOffset - kSystemPointerSize; + // We set and use this slot only when moving parameters into the parameter + // registers (so no GC scan is needed). + constexpr int kFunctionDataOffset = + kValueTypesArrayStartOffset - kSystemPointerSize; + constexpr int kLastSpillOffset = kFunctionDataOffset; + constexpr int kNumSpillSlots = 5; + __ subq(rsp, Immediate(kNumSpillSlots * kSystemPointerSize)); + __ movq(MemOperand(rbp, kParamCountOffset), param_count); + __ movq(MemOperand(rbp, kReturnCountOffset), return_count); + __ movq(MemOperand(rbp, kValueTypesArrayStartOffset), valuetypes_array_ptr); - // In 0 param case jump through parameter handling. - Label params_done; - __ j(equal, ¶ms_done); + // ------------------------------------------- + // Parameter handling. + // ------------------------------------------- + Label prepare_for_wasm_call; + __ cmpl(param_count, Immediate(0)); + + // IF we have 0 params: jump through parameter handling. + __ j(equal, &prepare_for_wasm_call); + + // ELSE: + // Make sure we have the same number of arguments in order to be able to load + // the arguments using static offsets below. + __ cmpl(kJavaScriptCallArgCountRegister, param_count); + __ Check(equal, AbortReason::kInvalidNumberOfJsArgs); - // Param handling. + // ------------------------------------------- + // Create 2 sections for integer and float params. + // ------------------------------------------- + // We will create 2 sections on the stack for the evaluated parameters: + // Integer and Float section, both with parameter count size. We will place + // the parameters into these sections depending on their valuetype. This way + // we can easily fill the general purpose and floating point parameter + // registers and place the remaining parameters onto the stack in proper order + // for the Wasm function. These remaining params are the final stack + // parameters for the call to WebAssembly. Example of the stack layout after + // processing 2 int and 1 float parameters when param_count is 4. + // +-----------------+ + // | rbp | + // |-----------------|------------------------------- + // | | Slots we defined + // | Saved values | when setting up + // | | the stack + // | | + // +-Integer section-+--- <--- start_int_section ---- + // | 1st int param | + // |- - - - - - - - -| + // | 2nd int param | + // |- - - - - - - - -| <----- current_int_param_slot + // | | (points to the stackslot + // |- - - - - - - - -| where the next int param should be placed) + // | | + // +--Float section--+--- <--- start_float_section -- + // | 1st float param | + // |- - - - - - - - -| <---- current_float_param_slot + // | | (points to the stackslot + // |- - - - - - - - -| where the next float param should be placed) + // | | + // |- - - - - - - - -| + // | | + // +---Final stack---+------------------------------ + // +-parameters for--+------------------------------ + // +-the Wasm call---+------------------------------ + // | . . . | + + constexpr int kIntegerSectionStartOffset = + kLastSpillOffset - kSystemPointerSize; + // For Integer section. + // Set the current_int_param_slot to point to the start of the section. + Register current_int_param_slot = r14; + __ leaq(current_int_param_slot, MemOperand(rsp, -kSystemPointerSize)); + Register params_size = param_count; + param_count = no_reg; + __ shlq(params_size, Immediate(kSystemPointerSizeLog2)); + __ subq(rsp, params_size); + + // For Float section. + // Set the current_float_param_slot to point to the start of the section. + Register current_float_param_slot = r15; + __ leaq(current_float_param_slot, MemOperand(rsp, -kSystemPointerSize)); + __ subq(rsp, params_size); + params_size = no_reg; + param_count = rcx; + __ movq(param_count, MemOperand(rbp, kParamCountOffset)); + + // ------------------------------------------- + // Set up for the param evaluation loop. + // ------------------------------------------- + // We will loop through the params starting with the 1st param. + // The order of processing the params is important. We have to evaluate them + // in an increasing order. + // Not reversed Reversed + // +-----------------+------+-----------------+--------------- + // | receiver | | param n | + // |- - - - - - - - -| |- - - - - - - - -| + // | param 1 | | param n-1 | Caller + // | ... | | ... | frame slots + // | param n-1 | | param 1 | + // |- - - - - - - - -| |- - - - - - - - -| + // | param n | | receiver | + // -+-----------------+------+-----------------+--------------- + // | return addr | | return addr | + // |- - - - - - - - -|<-FP->|- - - - - - - - -| + // | rbp | | rbp | Spill slots + // |- - - - - - - - -| |- - - - - - - - -| + // + // [rbp + current_param] gives us the parameter we are processing. + // We iterate through half-open interval <1st param, [rbp + param_limit]). + + Register current_param = rbx; + Register param_limit = rdx; +#ifdef V8_REVERSE_JSARGS + constexpr int kReceiverOnStackSize = kSystemPointerSize; + __ movq(current_param, + Immediate(kFPOnStackSize + kPCOnStackSize + kReceiverOnStackSize)); + __ movq(param_limit, param_count); + __ shlq(param_limit, Immediate(kSystemPointerSizeLog2)); + __ addq(param_limit, + Immediate(kFPOnStackSize + kPCOnStackSize + kReceiverOnStackSize)); + const int increment = kSystemPointerSize; +#else + __ movq(current_param, param_count); + __ shlq(current_param, Immediate(kSystemPointerSizeLog2)); + __ addq(current_param, Immediate(kFPOnStackSize)); + __ movq(param_limit, Immediate(kFPOnStackSize)); + const int increment = -kSystemPointerSize; +#endif Register param = rax; - const int firstParamOffset = 16; - __ movq(param, MemOperand(rbp, firstParamOffset)); + // We have to check the types of the params. The ValueType array contains + // first the return then the param types. + constexpr int kValueTypeSize = sizeof(wasm::ValueType); + STATIC_ASSERT(kValueTypeSize == 4); + const int32_t kValueTypeSizeLog2 = log2(kValueTypeSize); + // Set the ValueType array pointer to point to the first parameter. + Register returns_size = return_count; + return_count = no_reg; + __ shlq(returns_size, Immediate(kValueTypeSizeLog2)); + __ addq(valuetypes_array_ptr, returns_size); + returns_size = no_reg; + Register valuetype = r12; + + // ------------------------------------------- + // Param evaluation loop. + // ------------------------------------------- + Label loop_through_params; + __ bind(&loop_through_params); - Label not_smi; - __ JumpIfNotSmi(param, ¬_smi); + __ movq(param, MemOperand(rbp, current_param, times_1, 0)); + __ movl(valuetype, + Operand(valuetypes_array_ptr, wasm::ValueType::bit_field_offset())); - // Change from smi to int32. + // ------------------------------------------- + // Param conversion. + // ------------------------------------------- + // If param is a Smi we can easily convert it. Otherwise we'll call a builtin + // for conversion. + Label convert_param; + __ cmpq(valuetype, Immediate(wasm::kWasmI32.raw_bit_field())); + __ j(not_equal, &convert_param); + __ JumpIfNotSmi(param, &convert_param); + // Change the paramfrom Smi to int32. __ SmiUntag(param); + // Zero extend. + __ movl(param, param); + // Place the param into the proper slot in Integer section. + __ movq(MemOperand(current_int_param_slot, 0), param); + __ subq(current_int_param_slot, Immediate(kSystemPointerSize)); + + // ------------------------------------------- + // Param conversion done. + // ------------------------------------------- + Label param_conversion_done; + __ bind(¶m_conversion_done); + + __ addq(current_param, Immediate(increment)); + __ addq(valuetypes_array_ptr, Immediate(kValueTypeSize)); + + __ cmpq(current_param, param_limit); + __ j(not_equal, &loop_through_params); + + // ------------------------------------------- + // Move the parameters into the proper param registers. + // ------------------------------------------- + // The Wasm function expects that the params can be popped from the top of the + // stack in an increasing order. + // We can always move the values on the beginning of the sections into the GP + // or FP parameter registers. If the parameter count is less than the number + // of parameter registers, we may move values into the registers that are not + // in the section. + // ----------- S t a t e ------------- + // -- r8 : start_int_section + // -- rdi : start_float_section + // -- r14 : current_int_param_slot + // -- r15 : current_float_param_slot + // -- r11 : valuetypes_array_ptr + // -- r12 : valuetype + // -- rsi : wasm_instance + // -- GpParamRegisters = rax, rdx, rcx, rbx, r9 + // ----------------------------------- + + Register temp_params_size = rax; + __ movq(temp_params_size, MemOperand(rbp, kParamCountOffset)); + __ shlq(temp_params_size, Immediate(kSystemPointerSizeLog2)); + // We want to use the register of the function_data = rdi. + __ movq(MemOperand(rbp, kFunctionDataOffset), function_data); + Register start_float_section = function_data; + function_data = no_reg; + __ movq(start_float_section, rbp); + __ addq(start_float_section, Immediate(kIntegerSectionStartOffset)); + __ subq(start_float_section, temp_params_size); + temp_params_size = no_reg; + // Fill the FP param registers. + __ Movsd(xmm1, MemOperand(start_float_section, 0)); + __ Movsd(xmm2, MemOperand(start_float_section, -kSystemPointerSize)); + __ Movsd(xmm3, MemOperand(start_float_section, -2 * kSystemPointerSize)); + __ Movsd(xmm4, MemOperand(start_float_section, -3 * kSystemPointerSize)); + __ Movsd(xmm5, MemOperand(start_float_section, -4 * kSystemPointerSize)); + __ Movsd(xmm6, MemOperand(start_float_section, -5 * kSystemPointerSize)); + // We want the start to point to the last properly placed param. + __ subq(start_float_section, Immediate(5 * kSystemPointerSize)); + + Register start_int_section = r8; + __ movq(start_int_section, rbp); + __ addq(start_int_section, Immediate(kIntegerSectionStartOffset)); + // Fill the GP param registers. + __ movq(rax, MemOperand(start_int_section, 0)); + __ movq(rdx, MemOperand(start_int_section, -kSystemPointerSize)); + __ movq(rcx, MemOperand(start_int_section, -2 * kSystemPointerSize)); + __ movq(rbx, MemOperand(start_int_section, -3 * kSystemPointerSize)); + __ movq(r9, MemOperand(start_int_section, -4 * kSystemPointerSize)); + // We want the start to point to the last properly placed param. + __ subq(start_int_section, Immediate(4 * kSystemPointerSize)); + + // ------------------------------------------- + // Place the final stack parameters to the proper place. + // ------------------------------------------- + // We want the current_param_slot (insertion) pointers to point at the last + // param of the section instead of the next free slot. + __ addq(current_int_param_slot, Immediate(kSystemPointerSize)); + __ addq(current_float_param_slot, Immediate(kSystemPointerSize)); + + // ------------------------------------------- + // Final stack parameters loop. + // ------------------------------------------- + // The parameters that didn't fit into the registers should be placed on the + // top of the stack contiguously. The interval of parameters between the + // start_section and the current_param_slot pointers define the remaining + // parameters of the section. + // We can iterate through the valuetypes array to decide from which section we + // need to push the parameter onto the top of the stack. By iterating in a + // reversed order we can easily pick the last parameter of the proper section. + // The parameter of the section is pushed on the top of the stack only if the + // interval of remaining params is not empty. This way we ensure that only + // params that didn't fit into param registers are pushed again. + + Label loop_through_valuetypes; + __ bind(&loop_through_valuetypes); + + // We iterated through the valuetypes array, we are one field over the end in + // the beginning. Also, we have to decrement it in each iteration. + __ subq(valuetypes_array_ptr, Immediate(kValueTypeSize)); + + // Check if there are still remaining integer params. + Label continue_loop; + __ cmpq(start_int_section, current_int_param_slot); + // If there are remaining integer params. + __ j(greater, &continue_loop); + + // Check if there are still remaining float params. + __ cmpq(start_float_section, current_float_param_slot); + // If there aren't any params remaining. + Label params_done; + __ j(less_equal, ¶ms_done); + + __ bind(&continue_loop); + __ movl(valuetype, + Operand(valuetypes_array_ptr, wasm::ValueType::bit_field_offset())); + Label place_integer_param; + Label place_float_param; + __ cmpq(valuetype, Immediate(wasm::kWasmI32.raw_bit_field())); + __ j(equal, &place_integer_param); + + __ cmpq(valuetype, Immediate(wasm::kWasmI64.raw_bit_field())); + __ j(equal, &place_integer_param); + + __ cmpq(valuetype, Immediate(wasm::kWasmF32.raw_bit_field())); + __ j(equal, &place_float_param); + + __ cmpq(valuetype, Immediate(wasm::kWasmF64.raw_bit_field())); + __ j(equal, &place_float_param); + + __ int3(); + + __ bind(&place_integer_param); + __ cmpq(start_int_section, current_int_param_slot); + // If there aren't any integer params remaining, just floats, then go to the + // next valuetype. + __ j(less_equal, &loop_through_valuetypes); + + // Copy the param from the integer section to the actual parameter area. + __ pushq(MemOperand(current_int_param_slot, 0)); + __ addq(current_int_param_slot, Immediate(kSystemPointerSize)); + __ jmp(&loop_through_valuetypes); + + __ bind(&place_float_param); + __ cmpq(start_float_section, current_float_param_slot); + // If there aren't any float params remaining, just integers, then go to the + // next valuetype. + __ j(less_equal, &loop_through_valuetypes); + + // Copy the param from the float section to the actual parameter area. + __ pushq(MemOperand(current_float_param_slot, 0)); + __ addq(current_float_param_slot, Immediate(kSystemPointerSize)); + __ jmp(&loop_through_valuetypes); __ bind(¶ms_done); + // Restore function_data after we are done with parameter placement. + function_data = rdi; + __ movq(function_data, MemOperand(rbp, kFunctionDataOffset)); + __ bind(&prepare_for_wasm_call); + // ------------------------------------------- + // Prepare for the Wasm call. + // ------------------------------------------- // Set thread_in_wasm_flag. - Register thread_in_wasm_flag_addr = rdx; + Register thread_in_wasm_flag_addr = r12; __ movq( thread_in_wasm_flag_addr, MemOperand(kRootRegister, Isolate::thread_in_wasm_flag_address_offset())); @@ -3267,7 +3742,7 @@ void Builtins::Generate_GenericJSToWasmWrapper(MacroAssembler* masm) { thread_in_wasm_flag_addr = no_reg; Register jump_table_offset = function_data; - __ DecompressTaggedSigned( + __ LoadAnyTaggedField( jump_table_offset, MemOperand( function_data, @@ -3281,12 +3756,22 @@ void Builtins::Generate_GenericJSToWasmWrapper(MacroAssembler* masm) { jump_table_offset = no_reg; jump_table_start = no_reg; - __ pushq(signature_type); + // We set the indicating value for the GC to the proper one for Wasm call. + constexpr int kWasmCallGCScanSlotCount = 0; + __ movq(MemOperand(rbp, kGCScanSlotCountOffset), + Immediate(kWasmCallGCScanSlotCount)); + // ------------------------------------------- + // Call the Wasm function. + // ------------------------------------------- __ call(function_entry); function_entry = no_reg; - __ popq(signature_type); + // ------------------------------------------- + // Resetting after the Wasm call. + // ------------------------------------------- + // Restore rsp to free the reserved stack slots for the sections. + __ leaq(rsp, MemOperand(rbp, kLastSpillOffset)); // Unset thread_in_wasm_flag. thread_in_wasm_flag_addr = r8; @@ -3294,45 +3779,208 @@ void Builtins::Generate_GenericJSToWasmWrapper(MacroAssembler* masm) { thread_in_wasm_flag_addr, MemOperand(kRootRegister, Isolate::thread_in_wasm_flag_address_offset())); __ movl(MemOperand(thread_in_wasm_flag_addr, 0), Immediate(0)); + thread_in_wasm_flag_addr = no_reg; + // ------------------------------------------- + // Return handling. + // ------------------------------------------- + return_count = r8; + __ movq(return_count, MemOperand(rbp, kReturnCountOffset)); Register return_reg = rax; + + // If we have 1 return value, then jump to conversion. + __ cmpl(return_count, Immediate(1)); + Label convert_return; + __ j(equal, &convert_return); + + // Otherwise load undefined. __ LoadRoot(return_reg, RootIndex::kUndefinedValue); + Label return_done; + __ bind(&return_done); + __ movq(param_count, MemOperand(rbp, kParamCountOffset)); + + // ------------------------------------------- // Deconstrunct the stack frame. + // ------------------------------------------- __ LeaveFrame(StackFrame::JS_TO_WASM); - __ cmpl(signature_type, Immediate(0)); + // We have to remove the caller frame slots: + // - JS arguments + // - the receiver + // and transfer the control to the return address (the return address is + // expected to be on the top of the stack). + // We cannot use just the ret instruction for this, because we cannot pass the + // number of slots to remove in a Register as an argument. + Register return_addr = rbx; + __ popq(return_addr); + Register caller_frame_slots_count = param_count; + __ addq(caller_frame_slots_count, Immediate(1)); + __ shlq(caller_frame_slots_count, Immediate(kSystemPointerSizeLog2)); + __ addq(rsp, caller_frame_slots_count); + __ pushq(return_addr); + __ ret(0); - Label ret_0_param; - __ j(equal, &ret_0_param); + // -------------------------------------------------------------------------- + // Deferred code. + // -------------------------------------------------------------------------- - __ ret(16); + // ------------------------------------------- + // Param conversion builtins. + // ------------------------------------------- + __ bind(&convert_param); + // The order of pushes is important. We want the heap objects, that should be + // scanned by GC, to be on the top of the stack. + // We have to set the indicating value for the GC to the number of values on + // the top of the stack that have to be scanned before calling the builtin + // function. + // The builtin expects the parameter to be in register param = rax. - __ bind(&ret_0_param); - __ ret(8); + constexpr int kBuiltinCallGCScanSlotCount = 2; + PrepareForBuiltinCall(masm, MemOperand(rbp, kGCScanSlotCountOffset), + kBuiltinCallGCScanSlotCount, current_param, param_limit, + current_int_param_slot, current_float_param_slot, + valuetypes_array_ptr, wasm_instance, function_data); - // Handle the conversion to int32 when the param is not a smi. - __ bind(¬_smi); + Label param_kWasmI32_not_smi; + Label param_kWasmI64; + Label param_kWasmF32; + Label param_kWasmF64; - // The order of pushes is important. We want the heap objects, that should be - // scanned by GC, to be on the top of the stack. - __ pushq(signature_type); - __ pushq(wasm_instance); - __ pushq(function_data); - __ LoadAnyTaggedField( - rsi, - MemOperand(wasm_instance, wasm::ObjectAccess::ToTagged( - WasmInstanceObject::kNativeContextOffset))); - // We had to prepare the parameters for the Call: - // put the value into rax, and the context to rsi. + __ cmpq(valuetype, Immediate(wasm::kWasmI32.raw_bit_field())); + __ j(equal, ¶m_kWasmI32_not_smi); + + __ cmpq(valuetype, Immediate(wasm::kWasmI64.raw_bit_field())); + __ j(equal, ¶m_kWasmI64); + + __ cmpq(valuetype, Immediate(wasm::kWasmF32.raw_bit_field())); + __ j(equal, ¶m_kWasmF32); + + __ cmpq(valuetype, Immediate(wasm::kWasmF64.raw_bit_field())); + __ j(equal, ¶m_kWasmF64); + + __ int3(); + + __ bind(¶m_kWasmI32_not_smi); __ Call(BUILTIN_CODE(masm->isolate(), WasmTaggedNonSmiToInt32), RelocInfo::CODE_TARGET); + // Param is the result of the builtin. + __ AssertZeroExtended(param); + RestoreAfterBuiltinCall(masm, function_data, wasm_instance, + valuetypes_array_ptr, current_float_param_slot, + current_int_param_slot, param_limit, current_param); + __ movq(MemOperand(current_int_param_slot, 0), param); + __ subq(current_int_param_slot, Immediate(kSystemPointerSize)); + __ jmp(¶m_conversion_done); + + __ bind(¶m_kWasmI64); + __ Call(BUILTIN_CODE(masm->isolate(), BigIntToI64), RelocInfo::CODE_TARGET); + RestoreAfterBuiltinCall(masm, function_data, wasm_instance, + valuetypes_array_ptr, current_float_param_slot, + current_int_param_slot, param_limit, current_param); + __ movq(MemOperand(current_int_param_slot, 0), param); + __ subq(current_int_param_slot, Immediate(kSystemPointerSize)); + __ jmp(¶m_conversion_done); + + __ bind(¶m_kWasmF32); + __ Call(BUILTIN_CODE(masm->isolate(), WasmTaggedToFloat64), + RelocInfo::CODE_TARGET); + RestoreAfterBuiltinCall(masm, function_data, wasm_instance, + valuetypes_array_ptr, current_float_param_slot, + current_int_param_slot, param_limit, current_param); + // Clear higher bits. + __ Xorpd(xmm1, xmm1); + // Truncate float64 to float32. + __ Cvtsd2ss(xmm1, xmm0); + __ Movsd(MemOperand(current_float_param_slot, 0), xmm1); + __ subq(current_float_param_slot, Immediate(kSystemPointerSize)); + __ jmp(¶m_conversion_done); + + __ bind(¶m_kWasmF64); + __ Call(BUILTIN_CODE(masm->isolate(), WasmTaggedToFloat64), + RelocInfo::CODE_TARGET); + RestoreAfterBuiltinCall(masm, function_data, wasm_instance, + valuetypes_array_ptr, current_float_param_slot, + current_int_param_slot, param_limit, current_param); + __ Movsd(MemOperand(current_float_param_slot, 0), xmm0); + __ subq(current_float_param_slot, Immediate(kSystemPointerSize)); + __ jmp(¶m_conversion_done); - __ popq(function_data); - __ popq(wasm_instance); - __ popq(signature_type); + // ------------------------------------------- + // Return conversions. + // ------------------------------------------- + __ bind(&convert_return); + // We have to make sure that the kGCScanSlotCount is set correctly when we + // call the builtins for conversion. For these builtins it's the same as for + // the Wasm call, that is, kGCScanSlotCount = 0, so we don't have to reset it. + // We don't need the JS context for these builtin calls. + + __ movq(valuetypes_array_ptr, MemOperand(rbp, kValueTypesArrayStartOffset)); + // The first valuetype of the array is the return's valuetype. + __ movl(valuetype, + Operand(valuetypes_array_ptr, wasm::ValueType::bit_field_offset())); + + Label return_kWasmI32; + Label return_kWasmI64; + Label return_kWasmF32; + Label return_kWasmF64; + + __ cmpq(valuetype, Immediate(wasm::kWasmI32.raw_bit_field())); + __ j(equal, &return_kWasmI32); + + __ cmpq(valuetype, Immediate(wasm::kWasmI64.raw_bit_field())); + __ j(equal, &return_kWasmI64); + + __ cmpq(valuetype, Immediate(wasm::kWasmF32.raw_bit_field())); + __ j(equal, &return_kWasmF32); + + __ cmpq(valuetype, Immediate(wasm::kWasmF64.raw_bit_field())); + __ j(equal, &return_kWasmF64); - __ jmp(¶ms_done); + __ int3(); + + __ bind(&return_kWasmI32); + Label to_heapnumber; + // If pointer compression is disabled, we can convert the return to a smi. + if (SmiValuesAre32Bits()) { + __ SmiTag(return_reg); + } else { + Register temp = rbx; + __ movq(temp, return_reg); + // Double the return value to test if it can be a Smi. + __ addl(temp, return_reg); + temp = no_reg; + // If there was overflow, convert the return value to a HeapNumber. + __ j(overflow, &to_heapnumber); + // If there was no overflow, we can convert to Smi. + __ SmiTag(return_reg); + } + __ jmp(&return_done); + + // Handle the conversion of the I32 return value to HeapNumber when it cannot + // be a smi. + __ bind(&to_heapnumber); + __ Call(BUILTIN_CODE(masm->isolate(), WasmInt32ToHeapNumber), + RelocInfo::CODE_TARGET); + __ jmp(&return_done); + + __ bind(&return_kWasmI64); + __ Call(BUILTIN_CODE(masm->isolate(), I64ToBigInt), RelocInfo::CODE_TARGET); + __ jmp(&return_done); + + __ bind(&return_kWasmF32); + // The builtin expects the value to be in xmm0. + __ Movss(xmm0, xmm1); + __ Call(BUILTIN_CODE(masm->isolate(), WasmFloat32ToNumber), + RelocInfo::CODE_TARGET); + __ jmp(&return_done); + + __ bind(&return_kWasmF64); + // The builtin expects the value to be in xmm0. + __ Movsd(xmm0, xmm1); + __ Call(BUILTIN_CODE(masm->isolate(), WasmFloat64ToNumber), + RelocInfo::CODE_TARGET); + __ jmp(&return_done); } namespace { diff --git a/deps/v8/src/codegen/arm/assembler-arm-inl.h b/deps/v8/src/codegen/arm/assembler-arm-inl.h index 45ec07a382822b..b5f8b9609b467d 100644 --- a/deps/v8/src/codegen/arm/assembler-arm-inl.h +++ b/deps/v8/src/codegen/arm/assembler-arm-inl.h @@ -51,7 +51,7 @@ bool CpuFeatures::SupportsOptimizer() { return true; } bool CpuFeatures::SupportsWasmSimd128() { return IsSupported(NEON); } -int DoubleRegister::NumRegisters() { +int DoubleRegister::SupportedRegisterCount() { return CpuFeatures::IsSupported(VFP32DREGS) ? 32 : 16; } diff --git a/deps/v8/src/codegen/arm/interface-descriptors-arm.cc b/deps/v8/src/codegen/arm/interface-descriptors-arm.cc index b457376610c0d0..731d175393f890 100644 --- a/deps/v8/src/codegen/arm/interface-descriptors-arm.cc +++ b/deps/v8/src/codegen/arm/interface-descriptors-arm.cc @@ -52,6 +52,11 @@ const Register LoadDescriptor::SlotRegister() { return r0; } const Register LoadWithVectorDescriptor::VectorRegister() { return r3; } +const Register +LoadWithReceiverAndVectorDescriptor::LookupStartObjectRegister() { + return r4; +} + const Register StoreDescriptor::ReceiverRegister() { return r1; } const Register StoreDescriptor::NameRegister() { return r2; } const Register StoreDescriptor::ValueRegister() { return r0; } diff --git a/deps/v8/src/codegen/arm/macro-assembler-arm.cc b/deps/v8/src/codegen/arm/macro-assembler-arm.cc index 7b9e73e1d911ce..319ee39ef73c1d 100644 --- a/deps/v8/src/codegen/arm/macro-assembler-arm.cc +++ b/deps/v8/src/codegen/arm/macro-assembler-arm.cc @@ -57,7 +57,7 @@ int TurboAssembler::RequiredStackSizeForCallerSaved(SaveFPRegsMode fp_mode, bytes += NumRegs(list) * kPointerSize; if (fp_mode == kSaveFPRegs) { - bytes += DwVfpRegister::NumRegisters() * DwVfpRegister::kSizeInBytes; + bytes += DwVfpRegister::kNumRegisters * DwVfpRegister::kSizeInBytes; } return bytes; @@ -84,7 +84,7 @@ int TurboAssembler::PushCallerSaved(SaveFPRegsMode fp_mode, Register exclusion1, if (fp_mode == kSaveFPRegs) { SaveFPRegs(sp, lr); - bytes += DwVfpRegister::NumRegisters() * DwVfpRegister::kSizeInBytes; + bytes += DwVfpRegister::kNumRegisters * DwVfpRegister::kSizeInBytes; } return bytes; @@ -95,7 +95,7 @@ int TurboAssembler::PopCallerSaved(SaveFPRegsMode fp_mode, Register exclusion1, int bytes = 0; if (fp_mode == kSaveFPRegs) { RestoreFPRegs(sp, lr); - bytes += DwVfpRegister::NumRegisters() * DwVfpRegister::kSizeInBytes; + bytes += DwVfpRegister::kNumRegisters * DwVfpRegister::kSizeInBytes; } RegList exclusions = 0; @@ -879,6 +879,7 @@ void TurboAssembler::PushStandardFrame(Register function_reg) { int offset = -StandardFrameConstants::kContextOffset; offset += function_reg.is_valid() ? kPointerSize : 0; add(fp, sp, Operand(offset)); + Push(kJavaScriptCallArgCountRegister); } void TurboAssembler::VFPCanonicalizeNaN(const DwVfpRegister dst, @@ -2284,11 +2285,11 @@ int TurboAssembler::CalculateStackPassedWords(int num_reg_arguments, int num_double_arguments) { int stack_passed_words = 0; if (use_eabi_hardfloat()) { - // In the hard floating point calling convention, we can use - // all double registers to pass doubles. - if (num_double_arguments > DoubleRegister::NumRegisters()) { + // In the hard floating point calling convention, we can use all double + // registers to pass doubles. + if (num_double_arguments > DoubleRegister::SupportedRegisterCount()) { stack_passed_words += - 2 * (num_double_arguments - DoubleRegister::NumRegisters()); + 2 * (num_double_arguments - DoubleRegister::SupportedRegisterCount()); } } else { // In the soft floating point calling convention, every double diff --git a/deps/v8/src/codegen/arm/register-arm.h b/deps/v8/src/codegen/arm/register-arm.h index 77ae14f98cc834..6cb6c602c254cd 100644 --- a/deps/v8/src/codegen/arm/register-arm.h +++ b/deps/v8/src/codegen/arm/register-arm.h @@ -181,7 +181,10 @@ class DwVfpRegister : public RegisterBase { public: static constexpr int kSizeInBytes = 8; - inline static int NumRegisters(); + // This function differs from kNumRegisters by returning the number of double + // registers supported by the current CPU, while kNumRegisters always returns + // 32. + inline static int SupportedRegisterCount(); static void split_code(int reg_code, int* vm, int* m) { DCHECK(from_code(reg_code).is_valid()); diff --git a/deps/v8/src/codegen/arm64/instructions-arm64.h b/deps/v8/src/codegen/arm64/instructions-arm64.h index c115fb692469f2..b8335e0741bfa2 100644 --- a/deps/v8/src/codegen/arm64/instructions-arm64.h +++ b/deps/v8/src/codegen/arm64/instructions-arm64.h @@ -460,7 +460,7 @@ class Instruction { static const int ImmPCRelRangeBitwidth = 21; static bool IsValidPCRelOffset(ptrdiff_t offset) { return is_int21(offset); } void SetPCRelImmTarget(const AssemblerOptions& options, Instruction* target); - void SetBranchImmTarget(Instruction* target); + V8_EXPORT_PRIVATE void SetBranchImmTarget(Instruction* target); }; // Simulator/Debugger debug instructions --------------------------------------- diff --git a/deps/v8/src/codegen/arm64/interface-descriptors-arm64.cc b/deps/v8/src/codegen/arm64/interface-descriptors-arm64.cc index 61c8947bd44692..0c9beba7761500 100644 --- a/deps/v8/src/codegen/arm64/interface-descriptors-arm64.cc +++ b/deps/v8/src/codegen/arm64/interface-descriptors-arm64.cc @@ -52,6 +52,11 @@ const Register LoadDescriptor::SlotRegister() { return x0; } const Register LoadWithVectorDescriptor::VectorRegister() { return x3; } +const Register +LoadWithReceiverAndVectorDescriptor::LookupStartObjectRegister() { + return x4; +} + const Register StoreDescriptor::ReceiverRegister() { return x1; } const Register StoreDescriptor::NameRegister() { return x2; } const Register StoreDescriptor::ValueRegister() { return x0; } diff --git a/deps/v8/src/codegen/arm64/macro-assembler-arm64.cc b/deps/v8/src/codegen/arm64/macro-assembler-arm64.cc index 2d3e27e5302f40..fef1758aaa81a8 100644 --- a/deps/v8/src/codegen/arm64/macro-assembler-arm64.cc +++ b/deps/v8/src/codegen/arm64/macro-assembler-arm64.cc @@ -2312,8 +2312,10 @@ void TurboAssembler::TruncateDoubleToI(Isolate* isolate, Zone* zone, } void TurboAssembler::Prologue() { - Push(lr, fp, cp, x1); - Add(fp, sp, StandardFrameConstants::kFixedFrameSizeFromFp); + Push(lr, fp); + mov(fp, sp); + STATIC_ASSERT(kExtraSlotClaimedByPrologue == 1); + Push(cp, kJSFunctionRegister, kJavaScriptCallArgCountRegister, padreg); } void TurboAssembler::EnterFrame(StackFrame::Type type) { diff --git a/deps/v8/src/codegen/arm64/macro-assembler-arm64.h b/deps/v8/src/codegen/arm64/macro-assembler-arm64.h index 0cb9e823198006..655c44f819b955 100644 --- a/deps/v8/src/codegen/arm64/macro-assembler-arm64.h +++ b/deps/v8/src/codegen/arm64/macro-assembler-arm64.h @@ -1276,6 +1276,8 @@ class V8_EXPORT_PRIVATE TurboAssembler : public TurboAssemblerBase { inline void Mrs(const Register& rt, SystemRegister sysreg); inline void Msr(SystemRegister sysreg, const Register& rt); + // Prologue claims an extra slot due to arm64's alignement constraints. + static constexpr int kExtraSlotClaimedByPrologue = 1; // Generates function prologue code. void Prologue(); @@ -1712,6 +1714,12 @@ class V8_EXPORT_PRIVATE MacroAssembler : public TurboAssembler { inline void PopWRegList(RegList regs) { PopSizeRegList(regs, kWRegSizeInBits); } + inline void PushQRegList(RegList regs) { + PushSizeRegList(regs, kQRegSizeInBits, CPURegister::kVRegister); + } + inline void PopQRegList(RegList regs) { + PopSizeRegList(regs, kQRegSizeInBits, CPURegister::kVRegister); + } inline void PushDRegList(RegList regs) { PushSizeRegList(regs, kDRegSizeInBits, CPURegister::kVRegister); } diff --git a/deps/v8/src/codegen/arm64/register-arm64.cc b/deps/v8/src/codegen/arm64/register-arm64.cc index 6a56ce18f6bc71..9144884550f4a5 100644 --- a/deps/v8/src/codegen/arm64/register-arm64.cc +++ b/deps/v8/src/codegen/arm64/register-arm64.cc @@ -136,6 +136,10 @@ VectorFormat ScalarFormatFromLaneSize(int laneSize) { } } +VectorFormat VectorFormatFillQ(int laneSize) { + return VectorFormatFillQ(ScalarFormatFromLaneSize(laneSize)); +} + VectorFormat ScalarFormatFromFormat(VectorFormat vform) { return ScalarFormatFromLaneSize(LaneSizeInBitsFromFormat(vform)); } diff --git a/deps/v8/src/codegen/arm64/register-arm64.h b/deps/v8/src/codegen/arm64/register-arm64.h index 28bbed9ee09cb1..fbbb0a18dadf8f 100644 --- a/deps/v8/src/codegen/arm64/register-arm64.h +++ b/deps/v8/src/codegen/arm64/register-arm64.h @@ -281,6 +281,7 @@ VectorFormat VectorFormatDoubleLanes(VectorFormat vform); VectorFormat VectorFormatHalfLanes(VectorFormat vform); VectorFormat ScalarFormatFromLaneSize(int lanesize); VectorFormat VectorFormatHalfWidthDoubleLanes(VectorFormat vform); +VectorFormat VectorFormatFillQ(int laneSize); VectorFormat VectorFormatFillQ(VectorFormat vform); VectorFormat ScalarFormatFromFormat(VectorFormat vform); V8_EXPORT_PRIVATE unsigned RegisterSizeInBitsFromFormat(VectorFormat vform); @@ -345,6 +346,10 @@ class VRegister : public CPURegister { return VRegister::Create(code(), kDRegSizeInBits, 1); } + VRegister Format(VectorFormat f) const { + return VRegister::Create(code(), f); + } + bool Is8B() const { return (Is64Bits() && (lane_count_ == 8)); } bool Is16B() const { return (Is128Bits() && (lane_count_ == 16)); } bool Is4H() const { return (Is64Bits() && (lane_count_ == 4)); } @@ -519,8 +524,6 @@ using Simd128Register = VRegister; // Lists of registers. class V8_EXPORT_PRIVATE CPURegList { public: - CPURegList() = default; - template explicit CPURegList(CPURegister reg0, CPURegisters... regs) : list_(CPURegister::ListOf(reg0, regs...)), diff --git a/deps/v8/src/codegen/bailout-reason.h b/deps/v8/src/codegen/bailout-reason.h index 3e01dca7d0cbbe..e55e691a08e521 100644 --- a/deps/v8/src/codegen/bailout-reason.h +++ b/deps/v8/src/codegen/bailout-reason.h @@ -30,6 +30,7 @@ namespace internal { V(kInvalidJumpTableIndex, "Invalid jump table index") \ V(kInvalidParametersAndRegistersInGenerator, \ "invalid parameters and registers in generator") \ + V(kInvalidNumberOfJsArgs, "Invalid number of JS arguments") \ V(kMissingBytecodeArray, "Missing bytecode array from function") \ V(kObjectNotTagged, "The object is not tagged") \ V(kObjectTagged, "The object is tagged") \ diff --git a/deps/v8/src/codegen/code-stub-assembler.cc b/deps/v8/src/codegen/code-stub-assembler.cc index 5a8d0bad030a4e..184a31c8a349c4 100644 --- a/deps/v8/src/codegen/code-stub-assembler.cc +++ b/deps/v8/src/codegen/code-stub-assembler.cc @@ -287,23 +287,23 @@ TNode CodeStubAssembler::IntPtrOrSmiConstant(int value) { return ReinterpretCast(IntPtrConstant(value)); } -bool CodeStubAssembler::TryGetIntPtrOrSmiConstantValue(Node* maybe_constant, - int* value, - ParameterMode mode) { +bool CodeStubAssembler::TryGetIntPtrOrSmiConstantValue( + TNode maybe_constant, int* value) { + Smi smi_constant; + if (ToSmiConstant(maybe_constant, &smi_constant)) { + *value = Smi::ToInt(smi_constant); + return true; + } + return false; +} + +bool CodeStubAssembler::TryGetIntPtrOrSmiConstantValue( + TNode maybe_constant, int* value) { int32_t int32_constant; - if (mode == INTPTR_PARAMETERS) { if (ToInt32Constant(maybe_constant, &int32_constant)) { *value = int32_constant; return true; } - } else { - DCHECK_EQ(mode, SMI_PARAMETERS); - Smi smi_constant; - if (ToSmiConstant(maybe_constant, &smi_constant)) { - *value = Smi::ToInt(smi_constant); - return true; - } - } return false; } @@ -318,14 +318,6 @@ TNode CodeStubAssembler::IntPtrRoundUpToPowerOfTwo32( return Signed(IntPtrAdd(value, IntPtrConstant(1))); } -Node* CodeStubAssembler::MatchesParameterMode(Node* value, ParameterMode mode) { - if (mode == SMI_PARAMETERS) { - return TaggedIsSmi(value); - } else { - return Int32Constant(1); - } -} - TNode CodeStubAssembler::WordIsPowerOfTwo(SloppyTNode value) { intptr_t constant; if (ToIntPtrConstant(value, &constant)) { @@ -1383,20 +1375,6 @@ TNode CodeStubAssembler::LoadFromParentFrame(int offset) { return LoadFullTagged(frame_pointer, IntPtrConstant(offset)); } -Node* CodeStubAssembler::LoadObjectField(TNode object, int offset, - MachineType type) { - CSA_ASSERT(this, IsStrong(object)); - return LoadFromObject(type, object, IntPtrConstant(offset - kHeapObjectTag)); -} - -Node* CodeStubAssembler::LoadObjectField(TNode object, - TNode offset, - MachineType type) { - CSA_ASSERT(this, IsStrong(object)); - return LoadFromObject(type, object, - IntPtrSub(offset, IntPtrConstant(kHeapObjectTag))); -} - TNode CodeStubAssembler::LoadAndUntagObjectField( SloppyTNode object, int offset) { if (SmiValuesAre32Bits()) { @@ -1405,8 +1383,7 @@ TNode CodeStubAssembler::LoadAndUntagObjectField( #endif return ChangeInt32ToIntPtr(LoadObjectField(object, offset)); } else { - return SmiToIntPtr( - LoadObjectField(object, offset, MachineType::TaggedSigned())); + return SmiToIntPtr(LoadObjectField(object, offset)); } } @@ -1416,11 +1393,9 @@ TNode CodeStubAssembler::LoadAndUntagToWord32ObjectField( #if V8_TARGET_LITTLE_ENDIAN offset += 4; #endif - return UncheckedCast( - LoadObjectField(object, offset, MachineType::Int32())); + return LoadObjectField(object, offset); } else { - return SmiToInt32( - LoadObjectField(object, offset, MachineType::TaggedSigned())); + return SmiToInt32(LoadObjectField(object, offset)); } } @@ -1428,8 +1403,7 @@ TNode CodeStubAssembler::LoadHeapNumberValue( SloppyTNode object) { CSA_ASSERT(this, Word32Or(IsHeapNumber(object), IsOddball(object))); STATIC_ASSERT(HeapNumber::kValueOffset == Oddball::kToNumberRawOffset); - return TNode::UncheckedCast(LoadObjectField( - object, HeapNumber::kValueOffset, MachineType::Float64())); + return LoadObjectField(object, HeapNumber::kValueOffset); } TNode CodeStubAssembler::GetInstanceTypeMap(InstanceType instance_type) { @@ -1440,10 +1414,7 @@ TNode CodeStubAssembler::GetInstanceTypeMap(InstanceType instance_type) { } TNode CodeStubAssembler::LoadMap(SloppyTNode object) { - // TODO(v8:9637): Do a proper LoadObjectField and remove UncheckedCast - // when we can avoid making Large code objects due to TNodification. - return UncheckedCast(LoadObjectField(object, HeapObject::kMapOffset, - MachineType::TaggedPointer())); + return LoadObjectField(object, HeapObject::kMapOffset); } TNode CodeStubAssembler::LoadInstanceType( @@ -1567,9 +1538,8 @@ TNode CodeStubAssembler::LoadAndUntagWeakFixedArrayLength( TNode CodeStubAssembler::LoadNumberOfDescriptors( TNode array) { - return UncheckedCast( - LoadObjectField(array, DescriptorArray::kNumberOfDescriptorsOffset, - MachineType::Int16())); + return UncheckedCast(LoadObjectField( + array, DescriptorArray::kNumberOfDescriptorsOffset)); } TNode CodeStubAssembler::LoadNumberOfOwnDescriptors(TNode map) { @@ -1581,19 +1551,18 @@ TNode CodeStubAssembler::LoadNumberOfOwnDescriptors(TNode map) { TNode CodeStubAssembler::LoadMapBitField(SloppyTNode map) { CSA_SLOW_ASSERT(this, IsMap(map)); return UncheckedCast( - LoadObjectField(map, Map::kBitFieldOffset, MachineType::Uint8())); + LoadObjectField(map, Map::kBitFieldOffset)); } TNode CodeStubAssembler::LoadMapBitField2(SloppyTNode map) { CSA_SLOW_ASSERT(this, IsMap(map)); return UncheckedCast( - LoadObjectField(map, Map::kBitField2Offset, MachineType::Uint8())); + LoadObjectField(map, Map::kBitField2Offset)); } TNode CodeStubAssembler::LoadMapBitField3(SloppyTNode map) { CSA_SLOW_ASSERT(this, IsMap(map)); - return UncheckedCast( - LoadObjectField(map, Map::kBitField3Offset, MachineType::Uint32())); + return LoadObjectField(map, Map::kBitField3Offset); } TNode CodeStubAssembler::LoadMapInstanceType(SloppyTNode map) { @@ -1754,12 +1723,13 @@ TNode CodeStubAssembler::LoadJSReceiverIdentityHash( return var_hash.value(); } -TNode CodeStubAssembler::LoadNameHashField(SloppyTNode name) { - CSA_ASSERT(this, IsName(name)); - return LoadObjectField(name, Name::kHashFieldOffset); +TNode CodeStubAssembler::LoadNameHashAssumeComputed(TNode name) { + TNode hash_field = LoadNameHashField(name); + CSA_ASSERT(this, IsClearWord32(hash_field, Name::kHashNotComputedMask)); + return Unsigned(Word32Shr(hash_field, Int32Constant(Name::kHashShift))); } -TNode CodeStubAssembler::LoadNameHash(SloppyTNode name, +TNode CodeStubAssembler::LoadNameHash(TNode name, Label* if_hash_not_computed) { TNode hash_field = LoadNameHashField(name); if (if_hash_not_computed != nullptr) { @@ -1922,42 +1892,36 @@ TNode CodeStubAssembler::LoadArrayLength( return LoadAndUntagWeakFixedArrayLength(array); } -template -TNode CodeStubAssembler::LoadArrayElement(TNode array, - int array_header_size, - Node* index_node, - int additional_offset, - ParameterMode parameter_mode, - LoadSensitivity needs_poisoning) { - CSA_ASSERT(this, IntPtrGreaterThanOrEqual( - ParameterToIntPtr(index_node, parameter_mode), - IntPtrConstant(0))); +template +TNode CodeStubAssembler::LoadArrayElement( + TNode array, int array_header_size, TNode index_node, + int additional_offset, LoadSensitivity needs_poisoning) { + // TODO(v8:9708): Do we want to keep both IntPtrT and UintPtrT variants? + static_assert(std::is_same::value || + std::is_same::value || + std::is_same::value, + "Only Smi, UintPtrT or IntPtrT indices are allowed"); + CSA_ASSERT(this, IntPtrGreaterThanOrEqual(ParameterToIntPtr(index_node), + IntPtrConstant(0))); DCHECK(IsAligned(additional_offset, kTaggedSize)); int32_t header_size = array_header_size + additional_offset - kHeapObjectTag; - TNode offset = ElementOffsetFromIndex(index_node, HOLEY_ELEMENTS, - parameter_mode, header_size); + TNode offset = + ElementOffsetFromIndex(index_node, HOLEY_ELEMENTS, header_size); CSA_ASSERT(this, IsOffsetInBounds(offset, LoadArrayLength(array), array_header_size)); - constexpr MachineType machine_type = MachineTypeOf::value; + constexpr MachineType machine_type = MachineTypeOf::value; // TODO(gsps): Remove the Load case once LoadFromObject supports poisoning if (needs_poisoning == LoadSensitivity::kSafe) { - return UncheckedCast(LoadFromObject(machine_type, array, offset)); + return UncheckedCast(LoadFromObject(machine_type, array, offset)); } else { - return UncheckedCast(Load(machine_type, array, offset, needs_poisoning)); + return UncheckedCast( + Load(machine_type, array, offset, needs_poisoning)); } } -template TNode -CodeStubAssembler::LoadArrayElement(TNode, - int, Node*, int, - ParameterMode, - LoadSensitivity); - -template TNode -CodeStubAssembler::LoadArrayElement(TNode, - int, Node*, int, - ParameterMode, - LoadSensitivity); +template V8_EXPORT_PRIVATE TNode +CodeStubAssembler::LoadArrayElement( + TNode, int, TNode, int, LoadSensitivity); template TNode CodeStubAssembler::LoadFixedArrayElement( @@ -1971,14 +1935,12 @@ TNode CodeStubAssembler::LoadFixedArrayElement( CSA_ASSERT(this, IsFixedArraySubclass(object)); CSA_ASSERT(this, IsNotWeakFixedArraySubclass(object)); - ParameterMode parameter_mode = - std::is_same::value ? SMI_PARAMETERS : INTPTR_PARAMETERS; if (NeedsBoundsCheck(check_bounds)) { - FixedArrayBoundsCheck(object, index, additional_offset, parameter_mode); + FixedArrayBoundsCheck(object, index, additional_offset); } TNode element = LoadArrayElement(object, FixedArray::kHeaderSize, index, - additional_offset, parameter_mode, needs_poisoning); + additional_offset, needs_poisoning); return CAST(element); } @@ -1997,43 +1959,41 @@ CodeStubAssembler::LoadFixedArrayElement(TNode, LoadSensitivity, CheckBounds); void CodeStubAssembler::FixedArrayBoundsCheck(TNode array, - Node* index, - int additional_offset, - ParameterMode parameter_mode) { + TNode index, + int additional_offset) { if (!FLAG_fixed_array_bounds_checks) return; DCHECK(IsAligned(additional_offset, kTaggedSize)); - if (parameter_mode == ParameterMode::SMI_PARAMETERS) { - TNode effective_index; - Smi constant_index; - bool index_is_constant = ToSmiConstant(index, &constant_index); - if (index_is_constant) { - effective_index = SmiConstant(Smi::ToInt(constant_index) + - additional_offset / kTaggedSize); - } else if (additional_offset != 0) { - effective_index = - SmiAdd(CAST(index), SmiConstant(additional_offset / kTaggedSize)); - } else { - effective_index = CAST(index); - } - CSA_CHECK(this, SmiBelow(effective_index, LoadFixedArrayBaseLength(array))); + TNode effective_index; + Smi constant_index; + bool index_is_constant = ToSmiConstant(index, &constant_index); + if (index_is_constant) { + effective_index = SmiConstant(Smi::ToInt(constant_index) + + additional_offset / kTaggedSize); } else { - // IntPtrAdd does constant-folding automatically. - TNode effective_index = - IntPtrAdd(UncheckedCast(index), - IntPtrConstant(additional_offset / kTaggedSize)); - CSA_CHECK(this, UintPtrLessThan(effective_index, - LoadAndUntagFixedArrayBaseLength(array))); + effective_index = + SmiAdd(index, SmiConstant(additional_offset / kTaggedSize)); } + CSA_CHECK(this, SmiBelow(effective_index, LoadFixedArrayBaseLength(array))); +} + +void CodeStubAssembler::FixedArrayBoundsCheck(TNode array, + TNode index, + int additional_offset) { + if (!FLAG_fixed_array_bounds_checks) return; + DCHECK(IsAligned(additional_offset, kTaggedSize)); + // IntPtrAdd does constant-folding automatically. + TNode effective_index = + IntPtrAdd(index, IntPtrConstant(additional_offset / kTaggedSize)); + CSA_CHECK(this, UintPtrLessThan(effective_index, + LoadAndUntagFixedArrayBaseLength(array))); } TNode CodeStubAssembler::LoadPropertyArrayElement( TNode object, SloppyTNode index) { int additional_offset = 0; - ParameterMode parameter_mode = INTPTR_PARAMETERS; LoadSensitivity needs_poisoning = LoadSensitivity::kSafe; return CAST(LoadArrayElement(object, PropertyArray::kHeaderSize, index, - additional_offset, parameter_mode, - needs_poisoning)); + additional_offset, needs_poisoning)); } TNode CodeStubAssembler::LoadPropertyArrayLength( @@ -2334,8 +2294,8 @@ template TNode CodeStubAssembler::LoadFeedbackVectorSlot( TNode feedback_vector, TNode slot, int additional_offset) { - int32_t header_size = - FeedbackVector::kFeedbackSlotsOffset + additional_offset - kHeapObjectTag; + int32_t header_size = FeedbackVector::kRawFeedbackSlotsOffset + + additional_offset - kHeapObjectTag; TNode offset = ElementOffsetFromIndex(slot, HOLEY_ELEMENTS, header_size); CSA_SLOW_ASSERT( @@ -2386,8 +2346,7 @@ TNode CodeStubAssembler::LoadAndUntagToWord32FixedArrayElement( TNode CodeStubAssembler::LoadWeakFixedArrayElement( TNode object, TNode index, int additional_offset) { return LoadArrayElement(object, WeakFixedArray::kHeaderSize, index, - additional_offset, INTPTR_PARAMETERS, - LoadSensitivity::kSafe); + additional_offset, LoadSensitivity::kSafe); } TNode CodeStubAssembler::LoadFixedDoubleArrayElement( @@ -2550,6 +2509,20 @@ TNode CodeStubAssembler::LoadModuleContext( return UncheckedCast(cur_context.value()); } +TNode CodeStubAssembler::LoadObjectFunctionInitialMap( + TNode native_context) { + TNode object_function = + CAST(LoadContextElement(native_context, Context::OBJECT_FUNCTION_INDEX)); + return CAST(LoadJSFunctionPrototypeOrInitialMap(object_function)); +} + +TNode CodeStubAssembler::LoadSlowObjectWithNullPrototypeMap( + TNode native_context) { + TNode map = CAST(LoadContextElement( + native_context, Context::SLOW_OBJECT_WITH_NULL_PROTOTYPE_MAP)); + return map; +} + TNode CodeStubAssembler::LoadJSArrayElementsMap( SloppyTNode kind, SloppyTNode native_context) { CSA_ASSERT(this, IsFastElementsKind(kind)); @@ -2572,9 +2545,9 @@ TNode CodeStubAssembler::IsGeneratorFunction( function, JSFunction::kSharedFunctionInfoOffset); const TNode function_kind = - DecodeWord32(LoadObjectField( - shared_function_info, SharedFunctionInfo::kFlagsOffset, - MachineType::Uint32())); + DecodeWord32( + LoadObjectField(shared_function_info, + SharedFunctionInfo::kFlagsOffset)); // See IsGeneratorFunction(FunctionKind kind). return IsInRange(function_kind, FunctionKind::kAsyncConciseGeneratorMethod, @@ -2711,13 +2684,15 @@ void CodeStubAssembler::StoreObjectFieldRoot(TNode object, } } +template void CodeStubAssembler::StoreFixedArrayOrPropertyArrayElement( - TNode> object, Node* index_node, - TNode value, WriteBarrierMode barrier_mode, int additional_offset, - ParameterMode parameter_mode) { - CSA_SLOW_ASSERT( - this, Word32Or(IsFixedArraySubclass(object), IsPropertyArray(object))); - CSA_SLOW_ASSERT(this, MatchesParameterMode(index_node, parameter_mode)); + TNode> object, TNode index_node, + TNode value, WriteBarrierMode barrier_mode, int additional_offset) { + // TODO(v8:9708): Do we want to keep both IntPtrT and UintPtrT variants? + static_assert(std::is_same::value || + std::is_same::value || + std::is_same::value, + "Only Smi, UintPtrT or IntPtrT index is allowed"); DCHECK(barrier_mode == SKIP_WRITE_BARRIER || barrier_mode == UNSAFE_SKIP_WRITE_BARRIER || barrier_mode == UPDATE_WRITE_BARRIER || @@ -2727,8 +2702,8 @@ void CodeStubAssembler::StoreFixedArrayOrPropertyArrayElement( static_cast(PropertyArray::kHeaderSize)); int header_size = FixedArray::kHeaderSize + additional_offset - kHeapObjectTag; - TNode offset = ElementOffsetFromIndex(index_node, HOLEY_ELEMENTS, - parameter_mode, header_size); + TNode offset = + ElementOffsetFromIndex(index_node, HOLEY_ELEMENTS, header_size); STATIC_ASSERT(static_cast(FixedArrayBase::kLengthOffset) == static_cast(WeakFixedArray::kLengthOffset)); STATIC_ASSERT(static_cast(FixedArrayBase::kLengthOffset) == @@ -2764,22 +2739,45 @@ void CodeStubAssembler::StoreFixedArrayOrPropertyArrayElement( } } +template V8_EXPORT_PRIVATE void +CodeStubAssembler::StoreFixedArrayOrPropertyArrayElement( + TNode>, TNode, TNode, + WriteBarrierMode, int); + +template V8_EXPORT_PRIVATE void +CodeStubAssembler::StoreFixedArrayOrPropertyArrayElement( + TNode>, TNode, TNode, + WriteBarrierMode, int); + +template V8_EXPORT_PRIVATE void +CodeStubAssembler::StoreFixedArrayOrPropertyArrayElement( + TNode>, TNode, TNode, + WriteBarrierMode, int); + +template void CodeStubAssembler::StoreFixedDoubleArrayElement( - TNode object, Node* index_node, TNode value, - ParameterMode parameter_mode, CheckBounds check_bounds) { - CSA_SLOW_ASSERT(this, MatchesParameterMode(index_node, parameter_mode)); + TNode object, TNode index, TNode value, + CheckBounds check_bounds) { + // TODO(v8:9708): Do we want to keep both IntPtrT and UintPtrT variants? + static_assert(std::is_same::value || + std::is_same::value || + std::is_same::value, + "Only Smi, UintPtrT or IntPtrT index is allowed"); if (NeedsBoundsCheck(check_bounds)) { - FixedArrayBoundsCheck(object, index_node, 0, parameter_mode); + FixedArrayBoundsCheck(object, index, 0); } - TNode offset = - ElementOffsetFromIndex(index_node, PACKED_DOUBLE_ELEMENTS, parameter_mode, - FixedArray::kHeaderSize - kHeapObjectTag); + TNode offset = ElementOffsetFromIndex( + index, PACKED_DOUBLE_ELEMENTS, FixedArray::kHeaderSize - kHeapObjectTag); MachineRepresentation rep = MachineRepresentation::kFloat64; // Make sure we do not store signalling NaNs into double arrays. TNode value_silenced = Float64SilenceNaN(value); StoreNoWriteBarrier(rep, object, offset, value_silenced); } +// Export the Smi version which is used outside of code-stub-assembler. +template V8_EXPORT_PRIVATE void CodeStubAssembler::StoreFixedDoubleArrayElement< + Smi>(TNode, TNode, TNode, CheckBounds); + void CodeStubAssembler::StoreFeedbackVectorSlot( TNode feedback_vector, TNode slot, TNode value, WriteBarrierMode barrier_mode, @@ -2788,8 +2786,8 @@ void CodeStubAssembler::StoreFeedbackVectorSlot( DCHECK(barrier_mode == SKIP_WRITE_BARRIER || barrier_mode == UNSAFE_SKIP_WRITE_BARRIER || barrier_mode == UPDATE_WRITE_BARRIER); - int header_size = - FeedbackVector::kFeedbackSlotsOffset + additional_offset - kHeapObjectTag; + int header_size = FeedbackVector::kRawFeedbackSlotsOffset + + additional_offset - kHeapObjectTag; TNode offset = ElementOffsetFromIndex(Signed(slot), HOLEY_ELEMENTS, header_size); // Check that slot <= feedback_vector.length. @@ -2900,12 +2898,10 @@ void CodeStubAssembler::TryStoreArrayElement(ElementsKind kind, Label* bailout, GotoIfNotNumber(value, bailout); } - ParameterMode mode = OptimalParameterMode(); if (IsDoubleElementsKind(kind)) { - StoreElement(elements, kind, index, ChangeNumberToFloat64(CAST(value)), - mode); + StoreElement(elements, kind, index, ChangeNumberToFloat64(CAST(value))); } else { - StoreElement(elements, kind, index, value, mode); + StoreElement(elements, kind, index, value); } } @@ -3040,18 +3036,16 @@ void CodeStubAssembler::StoreBigIntDigit(TNode bigint, TNode CodeStubAssembler::LoadBigIntBitfield(TNode bigint) { return UncheckedCast( - LoadObjectField(bigint, BigInt::kBitfieldOffset, MachineType::Uint32())); + LoadObjectField(bigint, BigInt::kBitfieldOffset)); } TNode CodeStubAssembler::LoadBigIntDigit(TNode bigint, intptr_t digit_index) { CHECK_LE(0, digit_index); CHECK_LT(digit_index, BigInt::kMaxLength); - return UncheckedCast( - LoadObjectField(bigint, - BigInt::kDigitsOffset + - static_cast(digit_index) * kSystemPointerSize, - MachineType::UintPtr())); + return LoadObjectField( + bigint, BigInt::kDigitsOffset + + static_cast(digit_index) * kSystemPointerSize); } TNode CodeStubAssembler::LoadBigIntDigit(TNode bigint, @@ -3059,8 +3053,7 @@ TNode CodeStubAssembler::LoadBigIntDigit(TNode bigint, TNode offset = IntPtrAdd(IntPtrConstant(BigInt::kDigitsOffset), IntPtrMul(digit_index, IntPtrConstant(kSystemPointerSize))); - return UncheckedCast( - LoadObjectField(bigint, offset, MachineType::UintPtr())); + return LoadObjectField(bigint, offset); } TNode CodeStubAssembler::AllocateByteArray(TNode length, @@ -3650,7 +3643,7 @@ TNode CodeStubAssembler::AllocateJSArray( BIND(&nonempty); { FillFixedArrayWithValue(kind, elements, IntPtrConstant(0), capacity, - RootIndex::kTheHoleValue, INTPTR_PARAMETERS); + RootIndex::kTheHoleValue); Goto(&out); } @@ -3776,10 +3769,8 @@ TNode CodeStubAssembler::AllocateFixedArray( const intptr_t kMaxLength = IsDoubleElementsKind(kind) ? FixedDoubleArray::kMaxLength : FixedArray::kMaxLength; - const ParameterMode parameter_mode = - std::is_same::value ? SMI_PARAMETERS : INTPTR_PARAMETERS; intptr_t capacity_constant; - if (ToParameterConstant(capacity, &capacity_constant, parameter_mode)) { + if (ToParameterConstant(capacity, &capacity_constant)) { CHECK_LE(capacity_constant, kMaxLength); } else { Label if_out_of_memory(this, Label::kDeferred), next(this); @@ -3885,9 +3876,6 @@ TNode CodeStubAssembler::ExtractToFixedArray( } } - const ParameterMode parameter_mode = - std::is_same::value ? SMI_PARAMETERS : INTPTR_PARAMETERS; - BIND(&new_space_check); { bool handle_old_space = !FLAG_young_generation_large_objects; @@ -3899,8 +3887,7 @@ TNode CodeStubAssembler::ExtractToFixedArray( } else { int constant_count; handle_old_space = - !TryGetIntPtrOrSmiConstantValue(count, &constant_count, - parameter_mode) || + !TryGetIntPtrOrSmiConstantValue(count, &constant_count) || (constant_count > FixedArray::GetMaxLengthForNewSpaceAllocation(PACKED_ELEMENTS)); } @@ -3941,7 +3928,7 @@ TNode CodeStubAssembler::ExtractToFixedArray( // convert any values. Since {to_elements} is in new-space, CopyElements // will efficiently use memcpy. FillFixedArrayWithValue(to_kind, to_elements, count, capacity, - RootIndex::kTheHoleValue, parameter_mode); + RootIndex::kTheHoleValue); CopyElements(to_kind, to_elements, IntPtrConstant(0), source, ParameterToIntPtr(first), ParameterToIntPtr(count), SKIP_WRITE_BARRIER); @@ -3971,7 +3958,7 @@ TNode CodeStubAssembler::ExtractToFixedArray( var_result = to_elements; FillFixedArrayWithValue(to_smi_kind, to_elements, count, capacity, - RootIndex::kTheHoleValue, parameter_mode); + RootIndex::kTheHoleValue); // CopyElements will try to use memcpy if it's not conflicting with // GC. Otherwise it will copy elements by elements, but skip write // barriers (since we're copying smis to smis). @@ -4014,9 +4001,6 @@ TNode CodeStubAssembler::ExtractFixedDoubleArrayFillingHoles( DCHECK_NE(var_holes_converted, nullptr); CSA_ASSERT(this, IsFixedDoubleArrayMap(fixed_array_map)); - const ParameterMode parameter_mode = - std::is_same::value ? SMI_PARAMETERS : INTPTR_PARAMETERS; - TVARIABLE(FixedArrayBase, var_result); const ElementsKind kind = PACKED_DOUBLE_ELEMENTS; TNode to_elements = @@ -4035,7 +4019,7 @@ TNode CodeStubAssembler::ExtractFixedDoubleArrayFillingHoles( // This copy can trigger GC, so we pre-initialize the array with holes. FillFixedArrayWithValue(kind, to_elements, IntPtrOrSmiConstant(0), - capacity, RootIndex::kTheHoleValue, parameter_mode); + capacity, RootIndex::kTheHoleValue); const int first_element_offset = FixedArray::kHeaderSize - kHeapObjectTag; TNode first_from_element_offset = @@ -4142,8 +4126,6 @@ TNode CodeStubAssembler::ExtractFixedArray( } } - const ParameterMode parameter_mode = - std::is_same::value ? SMI_PARAMETERS : INTPTR_PARAMETERS; if (extract_flags & ExtractFixedArrayFlag::kFixedArrays) { // Here we can only get |source| as FixedArray, never FixedDoubleArray. // PACKED_ELEMENTS is used to signify that the source is a FixedArray. @@ -4172,10 +4154,9 @@ TNode CodeStubAssembler::ExtractFixedArray( TNode to_elements = AllocateFixedArray(kind, *capacity, allocation_flags, source_map); FillFixedArrayWithValue(kind, to_elements, *count, *capacity, - RootIndex::kTheHoleValue, parameter_mode); + RootIndex::kTheHoleValue); CopyElements(kind, to_elements, IntPtrConstant(0), source, - ParameterToIntPtr(*first, parameter_mode), - ParameterToIntPtr(*count, parameter_mode)); + ParameterToIntPtr(*first), ParameterToIntPtr(*count)); var_result = to_elements; } @@ -4240,17 +4221,18 @@ void CodeStubAssembler::FillPropertyArrayWithUndefined( [this, value](TNode array, TNode offset) { StoreNoWriteBarrier(MachineRepresentation::kTagged, array, offset, value); - }, - INTPTR_PARAMETERS); + }); } +template void CodeStubAssembler::FillFixedArrayWithValue(ElementsKind kind, TNode array, - Node* from_node, Node* to_node, - RootIndex value_root_index, - ParameterMode mode) { - CSA_SLOW_ASSERT(this, MatchesParameterMode(from_node, mode)); - CSA_SLOW_ASSERT(this, MatchesParameterMode(to_node, mode)); + TNode from_index, + TNode to_index, + RootIndex value_root_index) { + static_assert( + std::is_same::value || std::is_same::value, + "Only Smi or IntPtrT from and to are allowed"); CSA_SLOW_ASSERT(this, IsFixedArrayWithKind(array, kind)); DCHECK(value_root_index == RootIndex::kTheHoleValue || value_root_index == RootIndex::kUndefinedValue); @@ -4264,7 +4246,7 @@ void CodeStubAssembler::FillFixedArrayWithValue(ElementsKind kind, } BuildFastArrayForEach( - array, kind, from_node, to_node, + array, kind, from_index, to_index, [this, value, float_value, kind](TNode array, TNode offset) { if (IsDoubleElementsKind(kind)) { @@ -4274,10 +4256,18 @@ void CodeStubAssembler::FillFixedArrayWithValue(ElementsKind kind, StoreNoWriteBarrier(MachineRepresentation::kTagged, array, offset, value); } - }, - mode); + }); } +template V8_EXPORT_PRIVATE void + CodeStubAssembler::FillFixedArrayWithValue(ElementsKind, + TNode, + TNode, + TNode, + RootIndex); +template V8_EXPORT_PRIVATE void CodeStubAssembler::FillFixedArrayWithValue( + ElementsKind, TNode, TNode, TNode, RootIndex); + void CodeStubAssembler::StoreDoubleHole(TNode object, TNode offset) { TNode double_hole = @@ -4436,14 +4426,14 @@ void CodeStubAssembler::MoveElements(ElementsKind kind, { // Make a loop for the stores. BuildFastArrayForEach(elements, kind, begin, end, loop_body, - INTPTR_PARAMETERS, ForEachDirection::kForward); + ForEachDirection::kForward); Goto(&finished); } BIND(&iterate_backward); { BuildFastArrayForEach(elements, kind, begin, end, loop_body, - INTPTR_PARAMETERS, ForEachDirection::kReverse); + ForEachDirection::kReverse); Goto(&finished); } } @@ -4523,7 +4513,7 @@ void CodeStubAssembler::CopyElements(ElementsKind kind, Store(dst_elements, delta_offset, element); } }, - INTPTR_PARAMETERS, ForEachDirection::kForward); + ForEachDirection::kForward); Goto(&finished); } BIND(&finished); @@ -4569,8 +4559,6 @@ void CodeStubAssembler::CopyFixedArrayElements( Is64() ? ReinterpretCast(Int64Constant(kHoleNanInt64)) : ReinterpretCast(Int32Constant(kHoleNanLower32)); - const ParameterMode mode = - std::is_same::value ? SMI_PARAMETERS : INTPTR_PARAMETERS; // If copying might trigger a GC, we pre-initialize the FixedArray such that // it's always in a consistent state. if (convert_holes == HoleConversionMode::kConvertToUndefined) { @@ -4579,17 +4567,17 @@ void CodeStubAssembler::CopyFixedArrayElements( // Later if we run into a hole in the source we can just skip the writing // to the target and are still guaranteed that we get an undefined. FillFixedArrayWithValue(to_kind, to_array, IntPtrOrSmiConstant(0), - element_count, RootIndex::kUndefinedValue, mode); + element_count, RootIndex::kUndefinedValue); FillFixedArrayWithValue(to_kind, to_array, element_count, capacity, - RootIndex::kTheHoleValue, mode); + RootIndex::kTheHoleValue); } else if (doubles_to_objects_conversion) { // Pre-initialized the target with holes so later if we run into a hole in // the source we can just skip the writing to the target. FillFixedArrayWithValue(to_kind, to_array, IntPtrOrSmiConstant(0), - capacity, RootIndex::kTheHoleValue, mode); + capacity, RootIndex::kTheHoleValue); } else if (element_count != capacity) { FillFixedArrayWithValue(to_kind, to_array, element_count, capacity, - RootIndex::kTheHoleValue, mode); + RootIndex::kTheHoleValue); } TNode first_from_element_offset = @@ -4754,8 +4742,7 @@ void CodeStubAssembler::CopyPropertyArrayValues(TNode from_array, StoreNoWriteBarrier(MachineRepresentation::kTagged, to_array, offset, value); } - }, - INTPTR_PARAMETERS); + }); #ifdef DEBUG // Zap {from_array} if the copying above has made it invalid. @@ -6769,6 +6756,12 @@ TNode CodeStubAssembler::NumberToString(TNode input) { return result.value(); } +// TODO(solanes, v8:6949): Refactor this to check for JSReceivers first. If we +// have a JSReceiver, extract the primitive and fallthrough. Otherwise, continue +// asking for the other instance types. This will make it so that we can remove +// the loop (which was looping at most once). Also, see if we can make use of +// PlainPrimitiveNonNumberToNumber to de-duplicate code, maybe changing it to a +// TryPlainPrimitiveNonNumberToNumber with a Label* as a parameter. TNode CodeStubAssembler::NonNumberToNumberOrNumeric( TNode context, TNode input, Object::Conversion mode, BigIntHandling bigint_handling) { @@ -6806,7 +6799,6 @@ TNode CodeStubAssembler::NonNumberToNumberOrNumeric( } BIND(&if_inputisbigint); - CSA_ASSERT(this, Word32And(TaggedIsNotSmi(context), IsContext(context))); if (mode == Object::Conversion::kToNumeric) { var_result = CAST(input); Goto(&end); @@ -6831,9 +6823,9 @@ TNode CodeStubAssembler::NonNumberToNumberOrNumeric( BIND(&if_inputisreceiver); { - CSA_ASSERT(this, Word32And(TaggedIsNotSmi(context), IsContext(context))); - // The {input} is a JSReceiver, we need to convert it to a Primitive first - // using the ToPrimitive type conversion, preferably yielding a Number. + // The {input} is a JSReceiver, we need to convert it to a Primitive + // first using the ToPrimitive type conversion, preferably yielding a + // Number. Callable callable = CodeFactory::NonPrimitiveToPrimitive( isolate(), ToPrimitiveHint::kNumber); TNode result = CallStub(callable, context, input); @@ -6846,15 +6838,16 @@ TNode CodeStubAssembler::NonNumberToNumberOrNumeric( BIND(&if_done); { - // The ToPrimitive conversion already gave us a Number/Numeric, so we're - // done. + // The ToPrimitive conversion already gave us a Number/Numeric, so + // we're done. var_result = CAST(result); Goto(&end); } BIND(&if_notdone); { - // We now have a Primitive {result}, but it's not yet a Number/Numeric. + // We now have a Primitive {result}, but it's not yet a + // Number/Numeric. var_input = CAST(result); Goto(&loop); } @@ -6862,7 +6855,6 @@ TNode CodeStubAssembler::NonNumberToNumberOrNumeric( BIND(&if_inputisother); { - CSA_ASSERT(this, Word32And(TaggedIsNotSmi(context), IsContext(context))); // The {input} is something else (e.g. Symbol), let the runtime figure // out the correct exception. // Note: We cannot tail call to the runtime here, as js-to-wasm @@ -6887,14 +6879,46 @@ TNode CodeStubAssembler::NonNumberToNumberOrNumeric( } TNode CodeStubAssembler::NonNumberToNumber( - SloppyTNode context, SloppyTNode input, + TNode context, SloppyTNode input, BigIntHandling bigint_handling) { return CAST(NonNumberToNumberOrNumeric( context, input, Object::Conversion::kToNumber, bigint_handling)); } +TNode CodeStubAssembler::PlainPrimitiveNonNumberToNumber( + TNode input) { + CSA_ASSERT(this, Word32BinaryNot(IsHeapNumber(input))); + TVARIABLE(Number, var_result); + Label done(this); + + // Dispatch on the {input} instance type. + TNode input_instance_type = LoadInstanceType(input); + Label if_inputisstring(this), if_inputisoddball(this); + GotoIf(IsStringInstanceType(input_instance_type), &if_inputisstring); + CSA_ASSERT(this, InstanceTypeEqual(input_instance_type, ODDBALL_TYPE)); + Goto(&if_inputisoddball); + + BIND(&if_inputisstring); + { + // The {input} is a String, use the fast stub to convert it to a Number. + TNode string_input = CAST(input); + var_result = StringToNumber(string_input); + Goto(&done); + } + + BIND(&if_inputisoddball); + { + // The {input} is an Oddball, we just need to load the Number value of it. + var_result = LoadObjectField(input, Oddball::kToNumberOffset); + Goto(&done); + } + + BIND(&done); + return var_result.value(); +} + TNode CodeStubAssembler::NonNumberToNumeric( - SloppyTNode context, SloppyTNode input) { + TNode context, SloppyTNode input) { return NonNumberToNumberOrNumeric(context, input, Object::Conversion::kToNumeric); } @@ -6923,7 +6947,7 @@ TNode CodeStubAssembler::ToNumber_Inline(SloppyTNode context, return var_result.value(); } -TNode CodeStubAssembler::ToNumber(SloppyTNode context, +TNode CodeStubAssembler::ToNumber(TNode context, SloppyTNode input, BigIntHandling bigint_handling) { TVARIABLE(Number, var_result); @@ -6956,6 +6980,37 @@ TNode CodeStubAssembler::ToNumber(SloppyTNode context, return var_result.value(); } +TNode CodeStubAssembler::PlainPrimitiveToNumber(TNode input) { + TVARIABLE(Number, var_result); + Label end(this); + + Label not_smi(this, Label::kDeferred); + GotoIfNot(TaggedIsSmi(input), ¬_smi); + TNode input_smi = CAST(input); + var_result = input_smi; + Goto(&end); + + BIND(¬_smi); + { + Label not_heap_number(this, Label::kDeferred); + TNode input_ho = CAST(input); + GotoIfNot(IsHeapNumber(input_ho), ¬_heap_number); + + TNode input_hn = CAST(input_ho); + var_result = input_hn; + Goto(&end); + + BIND(¬_heap_number); + { + var_result = PlainPrimitiveNonNumberToNumber(input_ho); + Goto(&end); + } + } + + BIND(&end); + return var_result.value(); +} + TNode CodeStubAssembler::ToBigInt(TNode context, TNode input) { TVARIABLE(BigInt, var_result); @@ -7429,7 +7484,7 @@ template TNode CodeStubAssembler::LoadDescriptorArrayElement( TNode object, TNode index, int additional_offset) { - return LoadArrayElement( + return LoadArrayElement( object, DescriptorArray::kHeaderSize, index, additional_offset); } @@ -7967,7 +8022,7 @@ void CodeStubAssembler::LookupBinary(TNode unique_name, TNode limit = Unsigned(Int32Sub(NumberOfEntries(array), Int32Constant(1))); TVARIABLE(Uint32T, var_high, limit); - TNode hash = LoadNameHashField(unique_name); + TNode hash = LoadNameHashAssumeComputed(unique_name); CSA_ASSERT(this, Word32NotEqual(hash, Int32Constant(0))); // Assume non-empty array. @@ -7985,7 +8040,7 @@ void CodeStubAssembler::LookupBinary(TNode unique_name, TNode sorted_key_index = GetSortedKeyIndex(array, mid); TNode mid_name = GetKey(array, sorted_key_index); - TNode mid_hash = LoadNameHashField(mid_name); + TNode mid_hash = LoadNameHashAssumeComputed(mid_name); Label mid_greater(this), mid_less(this), merge(this); Branch(Uint32GreaterThanOrEqual(mid_hash, hash), &mid_greater, &mid_less); @@ -8012,7 +8067,7 @@ void CodeStubAssembler::LookupBinary(TNode unique_name, TNode sort_index = GetSortedKeyIndex(array, var_low.value()); TNode current_name = GetKey(array, sort_index); - TNode current_hash = LoadNameHashField(current_name); + TNode current_hash = LoadNameHashAssumeComputed(current_name); GotoIf(Word32NotEqual(current_hash, hash), if_not_found); Label next(this); GotoIf(TaggedNotEqual(current_name, unique_name), &next); @@ -8169,7 +8224,7 @@ void CodeStubAssembler::ForEachEnumerableOwnProperty( { Label slow_load(this, Label::kDeferred); - var_value = CallGetterIfAccessor(var_value.value(), + var_value = CallGetterIfAccessor(var_value.value(), object, var_details.value(), context, object, &slow_load, kCallJSGetter); Goto(&callback); @@ -8571,12 +8626,14 @@ void CodeStubAssembler::LoadPropertyFromGlobalDictionary( Comment("] LoadPropertyFromGlobalDictionary"); } -// |value| is the property backing store's contents, which is either a value -// or an accessor pair, as specified by |details|. -// Returns either the original value, or the result of the getter call. +// |value| is the property backing store's contents, which is either a value or +// an accessor pair, as specified by |details|. |holder| is a JSObject or a +// PropertyCell (TODO: use UnionT). Returns either the original value, or the +// result of the getter call. TNode CodeStubAssembler::CallGetterIfAccessor( - TNode value, TNode details, TNode context, - TNode receiver, Label* if_bailout, GetOwnPropertyMode mode) { + TNode value, TNode holder, TNode details, + TNode context, TNode receiver, Label* if_bailout, + GetOwnPropertyMode mode) { TVARIABLE(Object, var_value, value); Label done(this), if_accessor_info(this, Label::kDeferred); @@ -8616,7 +8673,7 @@ TNode CodeStubAssembler::CallGetterIfAccessor( GotoIfNot(IsTheHole(cached_property_name), if_bailout); TNode creation_context = - GetCreationContext(CAST(receiver), if_bailout); + GetCreationContext(CAST(holder), if_bailout); var_value = CallBuiltin( Builtins::kCallFunctionTemplate_CheckAccessAndCompatibleReceiver, creation_context, getter, IntPtrConstant(0), receiver); @@ -8630,17 +8687,16 @@ TNode CodeStubAssembler::CallGetterIfAccessor( // AccessorInfo case. BIND(&if_accessor_info); { - CSA_ASSERT(this, TaggedIsNotSmi(receiver)); TNode accessor_info = CAST(value); Label if_array(this), if_function(this), if_wrapper(this); - // Dispatch based on {receiver} instance type. - TNode receiver_map = LoadMap(CAST(receiver)); - TNode receiver_instance_type = LoadMapInstanceType(receiver_map); - GotoIf(IsJSArrayInstanceType(receiver_instance_type), &if_array); - GotoIf(IsJSFunctionInstanceType(receiver_instance_type), &if_function); - Branch(IsJSPrimitiveWrapperInstanceType(receiver_instance_type), - &if_wrapper, if_bailout); + // Dispatch based on {holder} instance type. + TNode holder_map = LoadMap(holder); + TNode holder_instance_type = LoadMapInstanceType(holder_map); + GotoIf(IsJSArrayInstanceType(holder_instance_type), &if_array); + GotoIf(IsJSFunctionInstanceType(holder_instance_type), &if_function); + Branch(IsJSPrimitiveWrapperInstanceType(holder_instance_type), &if_wrapper, + if_bailout); // JSArray AccessorInfo case. BIND(&if_array); @@ -8649,7 +8705,7 @@ TNode CodeStubAssembler::CallGetterIfAccessor( GotoIfNot(IsLengthString( LoadObjectField(accessor_info, AccessorInfo::kNameOffset)), if_bailout); - TNode array = CAST(receiver); + TNode array = CAST(holder); var_value = LoadJSArrayLength(array); Goto(&done); } @@ -8662,9 +8718,9 @@ TNode CodeStubAssembler::CallGetterIfAccessor( LoadObjectField(accessor_info, AccessorInfo::kNameOffset)), if_bailout); - GotoIfPrototypeRequiresRuntimeLookup(CAST(receiver), receiver_map, - if_bailout); - var_value = LoadJSFunctionPrototype(CAST(receiver), if_bailout); + TNode function = CAST(holder); + GotoIfPrototypeRequiresRuntimeLookup(function, holder_map, if_bailout); + var_value = LoadJSFunctionPrototype(function, if_bailout); Goto(&done); } @@ -8676,11 +8732,10 @@ TNode CodeStubAssembler::CallGetterIfAccessor( GotoIfNot(IsLengthString( LoadObjectField(accessor_info, AccessorInfo::kNameOffset)), if_bailout); - TNode receiver_value = - LoadJSPrimitiveWrapperValue(CAST(receiver)); - GotoIfNot(TaggedIsNotSmi(receiver_value), if_bailout); - GotoIfNot(IsString(CAST(receiver_value)), if_bailout); - var_value = LoadStringLengthAsSmi(CAST(receiver_value)); + TNode holder_value = LoadJSPrimitiveWrapperValue(CAST(holder)); + GotoIfNot(TaggedIsNotSmi(holder_value), if_bailout); + GotoIfNot(IsString(CAST(holder_value)), if_bailout); + var_value = LoadStringLengthAsSmi(CAST(holder_value)); Goto(&done); } } @@ -8756,8 +8811,8 @@ void CodeStubAssembler::TryGetOwnProperty( *var_raw_value = *var_value; } TNode value = - CallGetterIfAccessor(var_value->value(), var_details->value(), context, - receiver, if_bailout, mode); + CallGetterIfAccessor(var_value->value(), object, var_details->value(), + context, receiver, if_bailout, mode); *var_value = value; Goto(if_found_value); } @@ -9173,21 +9228,6 @@ TNode CodeStubAssembler::OrdinaryHasInstance( return var_result.value(); } -TNode CodeStubAssembler::ElementOffsetFromIndex(Node* index_node, - ElementsKind kind, - ParameterMode mode, - int base_size) { - CSA_SLOW_ASSERT(this, MatchesParameterMode(index_node, mode)); - if (mode == SMI_PARAMETERS) { - return ElementOffsetFromIndex(ReinterpretCast(index_node), kind, - base_size); - } else { - DCHECK(mode == INTPTR_PARAMETERS); - return ElementOffsetFromIndex(ReinterpretCast(index_node), kind, - base_size); - } -} - template TNode CodeStubAssembler::ElementOffsetFromIndex( TNode index_node, ElementsKind kind, int base_size) { @@ -9482,11 +9522,16 @@ MachineRepresentation ElementsKindToMachineRepresentation(ElementsKind kind) { } // namespace +template void CodeStubAssembler::StoreElement(Node* elements, ElementsKind kind, - Node* index, Node* value, - ParameterMode mode) { + TNode index, Node* value) { + // TODO(v8:9708): Do we want to keep both IntPtrT and UintPtrT variants? + static_assert(std::is_same::value || + std::is_same::value || + std::is_same::value, + "Only Smi, UintPtrT or IntPtrT index is allowed"); if (kind == BIGINT64_ELEMENTS || kind == BIGUINT64_ELEMENTS) { - TNode offset = ElementOffsetFromIndex(index, kind, mode, 0); + TNode offset = ElementOffsetFromIndex(index, kind, 0); TVARIABLE(UintPtrT, var_low); // Only used on 32-bit platforms. TVARIABLE(UintPtrT, var_high); @@ -9515,22 +9560,31 @@ void CodeStubAssembler::StoreElement(Node* elements, ElementsKind kind, CSA_ASSERT(this, Word32Equal(UncheckedCast(value), Word32And(Int32Constant(0xFF), value))); } - TNode offset = ElementOffsetFromIndex(index, kind, mode, 0); + TNode offset = ElementOffsetFromIndex(index, kind, 0); // TODO(cbruni): Add OOB check once typed. MachineRepresentation rep = ElementsKindToMachineRepresentation(kind); StoreNoWriteBarrier(rep, elements, offset, value); return; } else if (IsDoubleElementsKind(kind)) { TNode value_float64 = UncheckedCast(value); - StoreFixedDoubleArrayElement(CAST(elements), index, value_float64, mode); + StoreFixedDoubleArrayElement(CAST(elements), index, value_float64); } else { WriteBarrierMode barrier_mode = IsSmiElementsKind(kind) ? UNSAFE_SKIP_WRITE_BARRIER : UPDATE_WRITE_BARRIER; - StoreFixedArrayElement(CAST(elements), index, value, barrier_mode, 0, mode); + StoreFixedArrayElement(CAST(elements), index, value, barrier_mode, 0); } } +template V8_EXPORT_PRIVATE void CodeStubAssembler::StoreElement( + Node*, ElementsKind, TNode, Node*); + +template V8_EXPORT_PRIVATE void CodeStubAssembler::StoreElement( + Node*, ElementsKind, TNode, Node*); + +template V8_EXPORT_PRIVATE void CodeStubAssembler::StoreElement( + Node*, ElementsKind, TNode, Node*); + TNode CodeStubAssembler::Int32ToUint8Clamped( TNode int32_value) { Label done(this); @@ -9801,8 +9855,7 @@ void CodeStubAssembler::EmitElementStore( GotoIf(IsFixedCOWArrayMap(LoadMap(elements)), bailout); } - // TODO(ishell): introduce TryToIntPtrOrSmi() and use OptimalParameterMode(). - ParameterMode parameter_mode = INTPTR_PARAMETERS; + // TODO(ishell): introduce TryToIntPtrOrSmi() and use BInt. TNode intptr_key = TryToIntptr(key, bailout); // TODO(rmcilroy): TNodify the converted value once this funciton and @@ -9843,8 +9896,7 @@ void CodeStubAssembler::EmitElementStore( } TNode data_ptr = LoadJSTypedArrayDataPtr(typed_array); - StoreElement(data_ptr, elements_kind, intptr_key, converted_value, - parameter_mode); + StoreElement(data_ptr, elements_kind, intptr_key, converted_value); Goto(&done); BIND(&update_value_and_bailout); @@ -9968,8 +10020,7 @@ void CodeStubAssembler::EmitElementStore( } CSA_ASSERT(this, Word32BinaryNot(IsFixedCOWArrayMap(LoadMap(elements)))); - StoreElement(elements, elements_kind, intptr_key, converted_value, - parameter_mode); + StoreElement(elements, elements_kind, intptr_key, converted_value); } TNode CodeStubAssembler::CheckForCapacityGrow( @@ -10222,9 +10273,9 @@ TNode CodeStubAssembler::StoreWeakReferenceInFeedbackVector( return weak_value; } -TNode CodeStubAssembler::NotHasBoilerplate( +TNode CodeStubAssembler::HasBoilerplate( TNode maybe_literal_site) { - return TaggedIsSmi(maybe_literal_site); + return TaggedIsNotSmi(maybe_literal_site); } TNode CodeStubAssembler::LoadTransitionInfo( @@ -10304,16 +10355,16 @@ template TNode CodeStubAssembler::BuildFastLoop( TNode end_index, const FastLoopBody& body, int increment, IndexAdvanceMode advance_mode); +template void CodeStubAssembler::BuildFastArrayForEach( - const CodeStubAssembler::VariableList& vars, Node* fixed_array, - ElementsKind kind, Node* first_element_inclusive, - Node* last_element_exclusive, const FastArrayForEachBody& body, - ParameterMode mode, ForEachDirection direction) { + TNode, HeapObject>> array, + ElementsKind kind, TNode first_element_inclusive, + TNode last_element_exclusive, const FastArrayForEachBody& body, + ForEachDirection direction) { STATIC_ASSERT(FixedArray::kHeaderSize == FixedDoubleArray::kHeaderSize); - CSA_SLOW_ASSERT(this, MatchesParameterMode(first_element_inclusive, mode)); - CSA_SLOW_ASSERT(this, MatchesParameterMode(last_element_exclusive, mode)); - CSA_SLOW_ASSERT(this, Word32Or(IsFixedArrayWithKind(fixed_array, kind), - IsPropertyArray(fixed_array))); + CSA_SLOW_ASSERT(this, Word32Or(IsFixedArrayWithKind(array, kind), + IsPropertyArray(array))); + int32_t first_val; bool constant_first = ToInt32Constant(first_element_inclusive, &first_val); int32_t last_val; @@ -10327,32 +10378,29 @@ void CodeStubAssembler::BuildFastArrayForEach( TNode index = IntPtrConstant(i); TNode offset = ElementOffsetFromIndex( index, kind, FixedArray::kHeaderSize - kHeapObjectTag); - body(CAST(fixed_array), offset); + body(array, offset); } } else { for (int i = last_val - 1; i >= first_val; --i) { TNode index = IntPtrConstant(i); TNode offset = ElementOffsetFromIndex( index, kind, FixedArray::kHeaderSize - kHeapObjectTag); - body(CAST(fixed_array), offset); + body(array, offset); } } return; } } - TNode start = - ElementOffsetFromIndex(first_element_inclusive, kind, mode, - FixedArray::kHeaderSize - kHeapObjectTag); - TNode limit = - ElementOffsetFromIndex(last_element_exclusive, kind, mode, - FixedArray::kHeaderSize - kHeapObjectTag); + TNode start = ElementOffsetFromIndex( + first_element_inclusive, kind, FixedArray::kHeaderSize - kHeapObjectTag); + TNode limit = ElementOffsetFromIndex( + last_element_exclusive, kind, FixedArray::kHeaderSize - kHeapObjectTag); if (direction == ForEachDirection::kReverse) std::swap(start, limit); int increment = IsDoubleElementsKind(kind) ? kDoubleSize : kTaggedSize; BuildFastLoop( - vars, start, limit, - [&](TNode offset) { body(CAST(fixed_array), offset); }, + start, limit, [&](TNode offset) { body(array, offset); }, direction == ForEachDirection::kReverse ? -increment : increment, direction == ForEachDirection::kReverse ? IndexAdvanceMode::kPre : IndexAdvanceMode::kPost); diff --git a/deps/v8/src/codegen/code-stub-assembler.h b/deps/v8/src/codegen/code-stub-assembler.h index de2c16d35f934f..8306b7e4660523 100644 --- a/deps/v8/src/codegen/code-stub-assembler.h +++ b/deps/v8/src/codegen/code-stub-assembler.h @@ -22,7 +22,7 @@ #include "src/objects/smi.h" #include "src/objects/tagged-index.h" #include "src/roots/roots.h" -#include "torque-generated/exported-macros-assembler-tq.h" +#include "torque-generated/exported-macros-assembler.h" namespace v8 { namespace internal { @@ -290,6 +290,13 @@ enum class PrimitiveType { kBoolean, kNumber, kString, kSymbol }; #define CSA_SLOW_ASSERT(csa, ...) ((void)0) #endif +// Provides a constexpr boolean to be used inside Torque. +#ifdef V8_NO_ARGUMENTS_ADAPTOR +constexpr bool kNoArgumentsAdaptor = true; +#else +constexpr bool kNoArgumentsAdaptor = false; +#endif + // Provides JavaScript-specific "macro-assembler" functionality on top of the // CodeAssembler. By factoring the JavaScript-isms out of the CodeAssembler, // it's possible to add JavaScript-specific useful CodeAssembler "macros" @@ -318,30 +325,10 @@ class V8_EXPORT_PRIVATE CodeStubAssembler using AllocationFlags = base::Flags; - enum ParameterMode { SMI_PARAMETERS, INTPTR_PARAMETERS }; - - // On 32-bit platforms, there is a slight performance advantage to doing all - // of the array offset/index arithmetic with SMIs, since it's possible - // to save a few tag/untag operations without paying an extra expense when - // calculating array offset (the smi math can be folded away) and there are - // fewer live ranges. Thus only convert indices to untagged value on 64-bit - // platforms. - ParameterMode OptimalParameterMode() const { -#if defined(BINT_IS_SMI) - return SMI_PARAMETERS; -#elif defined(BINT_IS_INTPTR) - return INTPTR_PARAMETERS; -#else -#error Unknown BInt type. -#endif - } - TNode ParameterToIntPtr(TNode value) { return SmiUntag(value); } TNode ParameterToIntPtr(TNode value) { return value; } - // TODO(v8:9708): remove once all uses are ported. - TNode ParameterToIntPtr(Node* value, ParameterMode mode) { - if (mode == SMI_PARAMETERS) value = SmiUntag(value); - return UncheckedCast(value); + TNode ParameterToIntPtr(TNode value) { + return Signed(value); } TNode ParameterToTagged(TNode value) { return value; } @@ -351,22 +338,21 @@ class V8_EXPORT_PRIVATE CodeStubAssembler template TNode TaggedToParameter(TNode value); - bool ToParameterConstant(Node* node, intptr_t* out, ParameterMode mode) { - if (mode == ParameterMode::SMI_PARAMETERS) { - Smi constant; - if (ToSmiConstant(node, &constant)) { - *out = static_cast(constant.value()); - return true; - } - } else { - DCHECK_EQ(mode, ParameterMode::INTPTR_PARAMETERS); - intptr_t constant; - if (ToIntPtrConstant(node, &constant)) { - *out = constant; - return true; - } + bool ToParameterConstant(TNode node, intptr_t* out) { + Smi constant; + if (ToSmiConstant(node, &constant)) { + *out = static_cast(constant.value()); + return true; } + return false; + } + bool ToParameterConstant(TNode node, intptr_t* out) { + intptr_t constant; + if (ToIntPtrConstant(node, &constant)) { + *out = constant; + return true; + } return false; } @@ -461,19 +447,7 @@ class V8_EXPORT_PRIVATE CodeStubAssembler return CAST(heap_object); } - Node* MatchesParameterMode(Node* value, ParameterMode mode); - #define PARAMETER_BINOP(OpName, IntPtrOpName, SmiOpName) \ - /* TODO(v8:9708): remove once all uses are ported. */ \ - Node* OpName(Node* a, Node* b, ParameterMode mode) { \ - if (mode == SMI_PARAMETERS) { \ - return SmiOpName(CAST(a), CAST(b)); \ - } else { \ - DCHECK_EQ(INTPTR_PARAMETERS, mode); \ - return IntPtrOpName(UncheckedCast(a), \ - UncheckedCast(b)); \ - } \ - } \ TNode OpName(TNode a, TNode b) { return SmiOpName(a, b); } \ TNode OpName(TNode a, TNode b) { \ return IntPtrOpName(a, b); \ @@ -486,22 +460,11 @@ class V8_EXPORT_PRIVATE CodeStubAssembler ReinterpretCast(a), ReinterpretCast(b))); \ } // TODO(v8:9708): Define BInt operations once all uses are ported. - PARAMETER_BINOP(IntPtrOrSmiMin, IntPtrMin, SmiMin) PARAMETER_BINOP(IntPtrOrSmiAdd, IntPtrAdd, SmiAdd) PARAMETER_BINOP(IntPtrOrSmiSub, IntPtrSub, SmiSub) #undef PARAMETER_BINOP #define PARAMETER_BINOP(OpName, IntPtrOpName, SmiOpName) \ - /* TODO(v8:9708): remove once all uses are ported. */ \ - TNode OpName(Node* a, Node* b, ParameterMode mode) { \ - if (mode == SMI_PARAMETERS) { \ - return SmiOpName(CAST(a), CAST(b)); \ - } else { \ - DCHECK_EQ(INTPTR_PARAMETERS, mode); \ - return IntPtrOpName(UncheckedCast(a), \ - UncheckedCast(b)); \ - } \ - } \ TNode OpName(TNode a, TNode b) { return SmiOpName(a, b); } \ TNode OpName(TNode a, TNode b) { \ return IntPtrOpName(a, b); \ @@ -515,12 +478,9 @@ class V8_EXPORT_PRIVATE CodeStubAssembler // TODO(v8:9708): Define BInt operations once all uses are ported. PARAMETER_BINOP(IntPtrOrSmiEqual, WordEqual, SmiEqual) PARAMETER_BINOP(IntPtrOrSmiNotEqual, WordNotEqual, SmiNotEqual) - PARAMETER_BINOP(IntPtrOrSmiLessThan, IntPtrLessThan, SmiLessThan) PARAMETER_BINOP(IntPtrOrSmiLessThanOrEqual, IntPtrLessThanOrEqual, SmiLessThanOrEqual) PARAMETER_BINOP(IntPtrOrSmiGreaterThan, IntPtrGreaterThan, SmiGreaterThan) - PARAMETER_BINOP(IntPtrOrSmiGreaterThanOrEqual, IntPtrGreaterThanOrEqual, - SmiGreaterThanOrEqual) PARAMETER_BINOP(UintPtrOrSmiLessThan, UintPtrLessThan, SmiBelow) PARAMETER_BINOP(UintPtrOrSmiGreaterThanOrEqual, UintPtrGreaterThanOrEqual, SmiAboveOrEqual) @@ -573,8 +533,9 @@ class V8_EXPORT_PRIVATE CodeStubAssembler template TNode IntPtrOrSmiConstant(int value); - bool TryGetIntPtrOrSmiConstantValue(Node* maybe_constant, int* value, - ParameterMode mode); + bool TryGetIntPtrOrSmiConstantValue(TNode maybe_constant, int* value); + bool TryGetIntPtrOrSmiConstantValue(TNode maybe_constant, + int* value); // Round the 32bits payload of the provided word up to the next power of two. TNode IntPtrRoundUpToPowerOfTwo32(TNode value); @@ -1049,35 +1010,43 @@ class V8_EXPORT_PRIVATE CodeStubAssembler TNode LoadBufferSmi(TNode buffer, int offset) { return CAST(LoadBufferObject(buffer, offset)); } + TNode LoadBufferIntptr(TNode buffer, int offset) { + return LoadBufferData(buffer, offset); + } // Load a field from an object on the heap. template , TNode>::value, int>::type = 0> TNode LoadObjectField(TNode object, int offset) { - return CAST(LoadObjectField(object, offset, MachineTypeOf::value)); + return CAST(LoadFromObject(MachineTypeOf::value, object, + IntPtrConstant(offset - kHeapObjectTag))); } template , TNode>::value, int>::type = 0> TNode LoadObjectField(TNode object, int offset) { return UncheckedCast( - LoadObjectField(object, offset, MachineTypeOf::value)); + LoadFromObject(MachineTypeOf::value, object, + IntPtrConstant(offset - kHeapObjectTag))); } TNode LoadObjectField(TNode object, int offset) { return UncheckedCast( - LoadObjectField(object, offset, MachineType::AnyTagged())); + LoadFromObject(MachineType::AnyTagged(), object, + IntPtrConstant(offset - kHeapObjectTag))); } TNode LoadObjectField(TNode object, TNode offset) { return UncheckedCast( - LoadObjectField(object, offset, MachineType::AnyTagged())); + LoadFromObject(MachineType::AnyTagged(), object, + IntPtrSub(offset, IntPtrConstant(kHeapObjectTag)))); } template , TNode>::value, int>::type = 0> TNode LoadObjectField(TNode object, TNode offset) { return UncheckedCast( - LoadObjectField(object, offset, MachineTypeOf::value)); + LoadFromObject(MachineTypeOf::value, object, + IntPtrSub(offset, IntPtrConstant(kHeapObjectTag)))); } // Load a SMI field and untag it. TNode LoadAndUntagObjectField(SloppyTNode object, @@ -1088,8 +1057,7 @@ class V8_EXPORT_PRIVATE CodeStubAssembler TNode LoadMaybeWeakObjectField(SloppyTNode object, int offset) { - return UncheckedCast( - LoadObjectField(object, offset, MachineType::AnyTagged())); + return UncheckedCast(LoadObjectField(object, offset)); } TNode LoadConstructorOrBackPointer(TNode map) { @@ -1240,13 +1208,12 @@ class V8_EXPORT_PRIVATE CodeStubAssembler // Check if the map is set for slow properties. TNode IsDictionaryMap(SloppyTNode map); - // Load the hash field of a name as an uint32 value. - TNode LoadNameHashField(SloppyTNode name); - // Load the hash value of a name as an uint32 value. + // Load the Name::hash() value of a name as an uint32 value. // If {if_hash_not_computed} label is specified then it also checks if // hash is actually computed. - TNode LoadNameHash(SloppyTNode name, + TNode LoadNameHash(TNode name, Label* if_hash_not_computed = nullptr); + TNode LoadNameHashAssumeComputed(TNode name); // Load length field of a String object as Smi value. TNode LoadStringLengthAsSmi(TNode string); @@ -1297,9 +1264,16 @@ class V8_EXPORT_PRIVATE CodeStubAssembler TNode MakeWeak(TNode value); - void FixedArrayBoundsCheck(TNode array, Node* index, - int additional_offset = 0, - ParameterMode parameter_mode = INTPTR_PARAMETERS); + void FixedArrayBoundsCheck(TNode array, TNode index, + int additional_offset); + + void FixedArrayBoundsCheck(TNode array, TNode index, + int additional_offset); + + void FixedArrayBoundsCheck(TNode array, TNode index, + int additional_offset) { + FixedArrayBoundsCheck(array, Signed(index), additional_offset); + } // Array is any array-like type that has a fixed header followed by // tagged elements. @@ -1308,11 +1282,10 @@ class V8_EXPORT_PRIVATE CodeStubAssembler // Array is any array-like type that has a fixed header followed by // tagged elements. - template - TNode LoadArrayElement( - TNode array, int array_header_size, Node* index, + template + TNode LoadArrayElement( + TNode array, int array_header_size, TNode index, int additional_offset = 0, - ParameterMode parameter_mode = INTPTR_PARAMETERS, LoadSensitivity needs_poisoning = LoadSensitivity::kSafe); template @@ -1440,6 +1413,11 @@ class V8_EXPORT_PRIVATE CodeStubAssembler if_equal); } + // Loads the initial map of the the Object constructor. + TNode LoadObjectFunctionInitialMap(TNode native_context); + TNode LoadSlowObjectWithNullPrototypeMap( + TNode native_context); + TNode LoadJSArrayElementsMap(ElementsKind kind, SloppyTNode native_context); TNode LoadJSArrayElementsMap(SloppyTNode kind, @@ -1510,21 +1488,18 @@ class V8_EXPORT_PRIVATE CodeStubAssembler WriteBarrierMode barrier_mode = UPDATE_WRITE_BARRIER, CheckBounds check_bounds = CheckBounds::kAlways) { return StoreFixedArrayElement(object, IntPtrConstant(index), value, - barrier_mode, 0, INTPTR_PARAMETERS, - check_bounds); + barrier_mode, 0, check_bounds); } // This doesn't emit a bounds-check. As part of the security-performance // tradeoff, only use it if it is performance critical. void UnsafeStoreFixedArrayElement( - TNode object, int index, SloppyTNode value, + TNode object, int index, TNode value, WriteBarrierMode barrier_mode = UPDATE_WRITE_BARRIER) { return StoreFixedArrayElement(object, index, value, barrier_mode, CheckBounds::kDebugOnly); } - void UnsafeStoreFixedArrayElement( - TNode object, int index, TNode value, - WriteBarrierMode barrier_mode = SKIP_WRITE_BARRIER) { - DCHECK_EQ(SKIP_WRITE_BARRIER, barrier_mode); + void UnsafeStoreFixedArrayElement(TNode object, int index, + TNode value) { return StoreFixedArrayElement(object, index, value, UNSAFE_SKIP_WRITE_BARRIER, CheckBounds::kDebugOnly); @@ -1533,63 +1508,53 @@ class V8_EXPORT_PRIVATE CodeStubAssembler TNode value, CheckBounds check_bounds = CheckBounds::kAlways) { return StoreFixedArrayElement(object, IntPtrConstant(index), value, - UNSAFE_SKIP_WRITE_BARRIER, 0, - INTPTR_PARAMETERS, check_bounds); - } - // This doesn't emit a bounds-check. As part of the security-performance - // tradeoff, only use it if it is performance critical. - void UnsafeStoreFixedArrayElement(TNode object, int index, - TNode value) { - return StoreFixedArrayElement(object, index, value, - CheckBounds::kDebugOnly); + UNSAFE_SKIP_WRITE_BARRIER, 0, check_bounds); } - + template void StoreFixedArrayElement( - TNode array, Node* index, SloppyTNode value, + TNode array, TNode index, SloppyTNode value, WriteBarrierMode barrier_mode = UPDATE_WRITE_BARRIER, int additional_offset = 0, - ParameterMode parameter_mode = INTPTR_PARAMETERS, CheckBounds check_bounds = CheckBounds::kAlways) { + // TODO(v8:9708): Do we want to keep both IntPtrT and UintPtrT variants? + static_assert(std::is_same::value || + std::is_same::value || + std::is_same::value, + "Only Smi, UintPtrT or IntPtrT index is allowed"); if (NeedsBoundsCheck(check_bounds)) { - FixedArrayBoundsCheck(array, index, additional_offset, parameter_mode); + FixedArrayBoundsCheck(array, index, additional_offset); } StoreFixedArrayOrPropertyArrayElement(array, index, value, barrier_mode, - additional_offset, parameter_mode); + additional_offset); } - // This doesn't emit a bounds-check. As part of the security-performance // tradeoff, only use it if it is performance critical. void UnsafeStoreFixedArrayElement( - TNode array, Node* index, SloppyTNode value, + TNode array, TNode index, TNode value, WriteBarrierMode barrier_mode = UPDATE_WRITE_BARRIER, - int additional_offset = 0, - ParameterMode parameter_mode = INTPTR_PARAMETERS) { + int additional_offset = 0) { return StoreFixedArrayElement(array, index, value, barrier_mode, - additional_offset, parameter_mode, - CheckBounds::kDebugOnly); + additional_offset, CheckBounds::kDebugOnly); } - void UnsafeStoreFixedArrayElement( - TNode array, Node* index, TNode value, - WriteBarrierMode barrier_mode = SKIP_WRITE_BARRIER, - int additional_offset = 0, - ParameterMode parameter_mode = INTPTR_PARAMETERS) { - DCHECK_EQ(SKIP_WRITE_BARRIER, barrier_mode); + + void UnsafeStoreFixedArrayElement(TNode array, + TNode index, TNode value, + int additional_offset) { return StoreFixedArrayElement(array, index, value, UNSAFE_SKIP_WRITE_BARRIER, additional_offset, - parameter_mode, CheckBounds::kDebugOnly); + CheckBounds::kDebugOnly); } void StorePropertyArrayElement(TNode array, TNode index, TNode value) { - StoreFixedArrayOrPropertyArrayElement( - array, index, value, UPDATE_WRITE_BARRIER, 0, INTPTR_PARAMETERS); + StoreFixedArrayOrPropertyArrayElement(array, index, value, + UPDATE_WRITE_BARRIER); } void StoreFixedArrayElement( TNode array, TNode index, TNode value, WriteBarrierMode barrier_mode = UPDATE_WRITE_BARRIER) { - StoreFixedArrayElement(array, index, value, barrier_mode, 0, - SMI_PARAMETERS); + StoreFixedArrayElement(array, index, value, barrier_mode, 0); } void StoreFixedArrayElement( TNode array, TNode index, TNode value, @@ -1605,28 +1570,13 @@ class V8_EXPORT_PRIVATE CodeStubAssembler int additional_offset = 0) { DCHECK_EQ(SKIP_WRITE_BARRIER, barrier_mode); StoreFixedArrayElement(array, index, TNode{value}, - UNSAFE_SKIP_WRITE_BARRIER, additional_offset, - SMI_PARAMETERS); + UNSAFE_SKIP_WRITE_BARRIER, additional_offset); } + template void StoreFixedDoubleArrayElement( - TNode object, Node* index, TNode value, - ParameterMode parameter_mode = INTPTR_PARAMETERS, - CheckBounds check_bounds = CheckBounds::kAlways); - // This doesn't emit a bounds-check. As part of the security-performance - // tradeoff, only use it if it is performance critical. - void UnsafeStoreFixedDoubleArrayElement( - TNode object, Node* index, TNode value, - ParameterMode parameter_mode = INTPTR_PARAMETERS) { - return StoreFixedDoubleArrayElement(object, index, value, parameter_mode, - CheckBounds::kDebugOnly); - } - - void StoreFixedDoubleArrayElementSmi(TNode object, - TNode index, - TNode value) { - StoreFixedDoubleArrayElement(object, index, value, SMI_PARAMETERS); - } + TNode object, TNode index, + TNode value, CheckBounds check_bounds = CheckBounds::kAlways); void StoreDoubleHole(TNode object, TNode offset); void StoreFixedDoubleArrayHole(TNode array, @@ -1886,10 +1836,10 @@ class V8_EXPORT_PRIVATE CodeStubAssembler TNode originalArray, TNode len); + template void FillFixedArrayWithValue(ElementsKind kind, TNode array, - Node* from_index, Node* to_index, - RootIndex value_root_index, - ParameterMode mode = INTPTR_PARAMETERS); + TNode from_index, TNode to_index, + RootIndex value_root_index); // Uses memset to effectively initialize the given FixedArray with zeroes. void FillFixedArrayWithSmiZero(TNode array, @@ -2513,20 +2463,23 @@ class V8_EXPORT_PRIVATE CodeStubAssembler // Convert a Non-Number object to a Number. TNode NonNumberToNumber( - SloppyTNode context, SloppyTNode input, + TNode context, SloppyTNode input, BigIntHandling bigint_handling = BigIntHandling::kThrow); // Convert a Non-Number object to a Numeric. - TNode NonNumberToNumeric(SloppyTNode context, + TNode NonNumberToNumeric(TNode context, SloppyTNode input); // Convert any object to a Number. // Conforms to ES#sec-tonumber if {bigint_handling} == kThrow. // With {bigint_handling} == kConvertToNumber, matches behavior of // tc39.github.io/proposal-bigint/#sec-number-constructor-number-value. TNode ToNumber( - SloppyTNode context, SloppyTNode input, + TNode context, SloppyTNode input, BigIntHandling bigint_handling = BigIntHandling::kThrow); TNode ToNumber_Inline(SloppyTNode context, SloppyTNode input); + // Convert any plain primitive to a Number. No need to handle BigInts since + // they are not plain primitives. + TNode PlainPrimitiveToNumber(TNode input); // Try to convert an object to a BigInt. Throws on failure (e.g. for Numbers). // https://tc39.github.io/proposal-bigint/#sec-to-bigint @@ -3155,12 +3108,9 @@ class V8_EXPORT_PRIVATE CodeStubAssembler // TODO(turbofan): For BIGINT64_ELEMENTS and BIGUINT64_ELEMENTS // we pass {value} as BigInt object instead of int64_t. We should // teach TurboFan to handle int64_t on 32-bit platforms eventually. - void StoreElement(Node* elements, ElementsKind kind, Node* index, Node* value, - ParameterMode mode); - void StoreElement(TNode elements, ElementsKind kind, - TNode index, Node* value) { - return StoreElement(elements, kind, index, value, INTPTR_PARAMETERS); - } + template + void StoreElement(Node* elements, ElementsKind kind, TNode index, + Node* value); // Implements the BigInt part of // https://tc39.github.io/proposal-bigint/#sec-numbertorawbytes, @@ -3202,8 +3152,7 @@ class V8_EXPORT_PRIVATE CodeStubAssembler TNode CreateAllocationSiteInFeedbackVector( TNode feedback_vector, TNode slot); - // TODO(ishell, cbruni): Change to HasBoilerplate. - TNode NotHasBoilerplate(TNode maybe_literal_site); + TNode HasBoilerplate(TNode maybe_literal_site); TNode LoadTransitionInfo(TNode allocation_site); TNode LoadBoilerplate(TNode allocation_site); TNode LoadElementsKind(TNode allocation_site); @@ -3233,23 +3182,13 @@ class V8_EXPORT_PRIVATE CodeStubAssembler using FastArrayForEachBody = std::function array, TNode offset)>; + template void BuildFastArrayForEach( - const CodeStubAssembler::VariableList& vars, Node* array, - ElementsKind kind, Node* first_element_inclusive, - Node* last_element_exclusive, const FastArrayForEachBody& body, - ParameterMode mode = INTPTR_PARAMETERS, + TNode, HeapObject>> array, + ElementsKind kind, TNode first_element_inclusive, + TNode last_element_exclusive, const FastArrayForEachBody& body, ForEachDirection direction = ForEachDirection::kReverse); - void BuildFastArrayForEach( - Node* array, ElementsKind kind, Node* first_element_inclusive, - Node* last_element_exclusive, const FastArrayForEachBody& body, - ParameterMode mode = INTPTR_PARAMETERS, - ForEachDirection direction = ForEachDirection::kReverse) { - CodeStubAssembler::VariableList list(0, zone()); - BuildFastArrayForEach(list, array, kind, first_element_inclusive, - last_element_exclusive, body, mode, direction); - } - template TNode GetArrayAllocationSize(TNode element_count, ElementsKind kind, int header_size) { @@ -3407,9 +3346,6 @@ class V8_EXPORT_PRIVATE CodeStubAssembler template TNode ElementOffsetFromIndex(TNode index, ElementsKind kind, int base_size = 0); - // TODO(v8:9708): remove once all uses are ported. - TNode ElementOffsetFromIndex(Node* index, ElementsKind kind, - ParameterMode mode, int base_size = 0); // Check that a field offset is within the bounds of the an object. TNode IsOffsetInBounds(SloppyTNode offset, @@ -3612,6 +3548,7 @@ class V8_EXPORT_PRIVATE CodeStubAssembler Label* bailout); TNode CallGetterIfAccessor(TNode value, + TNode holder, TNode details, TNode context, TNode receiver, Label* if_bailout, @@ -3701,10 +3638,6 @@ class V8_EXPORT_PRIVATE CodeStubAssembler TVariable* var_maybe_bigint = nullptr, TVariable* var_feedback = nullptr); - Node* LoadObjectField(TNode object, int offset, MachineType type); - Node* LoadObjectField(TNode object, TNode offset, - MachineType type); - // Low-level accessors for Descriptor arrays. template TNode LoadDescriptorArrayElement(TNode object, @@ -3719,11 +3652,14 @@ class V8_EXPORT_PRIVATE CodeStubAssembler return CodeAssembler::LoadRoot(root_index); } + template void StoreFixedArrayOrPropertyArrayElement( - TNode> array, Node* index, + TNode> array, TNode index, TNode value, WriteBarrierMode barrier_mode = UPDATE_WRITE_BARRIER, - int additional_offset = 0, - ParameterMode parameter_mode = INTPTR_PARAMETERS); + int additional_offset = 0); + + // Converts {input} to a number. {input} must be a plain primitve. + TNode PlainPrimitiveNonNumberToNumber(TNode input); }; class V8_EXPORT_PRIVATE CodeStubArguments { diff --git a/deps/v8/src/codegen/compiler.cc b/deps/v8/src/codegen/compiler.cc index bcc97e32f729fd..33b6bbb9458dc0 100644 --- a/deps/v8/src/codegen/compiler.cc +++ b/deps/v8/src/codegen/compiler.cc @@ -40,6 +40,7 @@ #include "src/interpreter/interpreter.h" #include "src/logging/log-inl.h" #include "src/objects/feedback-cell-inl.h" +#include "src/objects/js-function-inl.h" #include "src/objects/map.h" #include "src/objects/object-list-macros.h" #include "src/objects/shared-function-info.h" @@ -59,12 +60,32 @@ namespace internal { namespace { bool IsForNativeContextIndependentCachingOnly(CodeKind kind) { + // NCI code is only cached (and not installed on the JSFunction upon + // successful compilation), unless the testing-only + // FLAG_turbo_nci_as_midtier is enabled. return CodeKindIsNativeContextIndependentJSFunction(kind) && - !FLAG_turbo_nci_as_highest_tier; + !FLAG_turbo_nci_as_midtier; } -bool IsForNativeContextIndependentCachingOnly(OptimizedCompilationInfo* info) { - return IsForNativeContextIndependentCachingOnly(info->code_kind()); +// This predicate is currently needed only because the nci-as-midtier testing +// configuration is special. A quick summary of compilation configurations: +// +// - Turbofan (and currently Turboprop) uses both the optimization marker and +// the optimized code cache (underneath, the marker and the cache share the same +// slot on the feedback vector). +// - Native context independent (NCI) code uses neither the marker nor the +// cache. +// - The NCI-as-midtier testing configuration uses the marker, but not the +// cache. +// +// This predicate supports that last case. In the near future, this last case is +// expected to change s.t. code kinds use the marker iff they use the optimized +// code cache (details still TBD). In that case, the existing +// CodeKindIsStoredInOptimizedCodeCache is sufficient and this extra predicate +// can be removed. +// TODO(jgruber,rmcilroy,v8:8888): Remove this predicate once that has happened. +bool UsesOptimizationMarker(CodeKind kind) { + return !IsForNativeContextIndependentCachingOnly(kind); } class CompilerTracer : public AllStatic { @@ -835,12 +856,16 @@ V8_WARN_UNUSED_RESULT MaybeHandle GetCodeFromOptimizedCodeCache( // Caching of optimized code enabled and optimized code found. DCHECK(!code.marked_for_deoptimization()); DCHECK(function->shared().is_compiled()); + DCHECK(CodeKindIsStoredInOptimizedCodeCache(code.kind())); + DCHECK_IMPLIES(!osr_offset.IsNone(), + code.kind() == CodeKind::OPTIMIZED_FUNCTION); return Handle(code, isolate); } return MaybeHandle(); } void ClearOptimizedCodeCache(OptimizedCompilationInfo* compilation_info) { + DCHECK(UsesOptimizationMarker(compilation_info->code_kind())); Handle function = compilation_info->closure(); if (compilation_info->osr_offset().IsNone()) { Handle vector = @@ -851,21 +876,22 @@ void ClearOptimizedCodeCache(OptimizedCompilationInfo* compilation_info) { void InsertCodeIntoOptimizedCodeCache( OptimizedCompilationInfo* compilation_info) { - // Cached NCI code currently does not use the optimization marker field. - if (IsForNativeContextIndependentCachingOnly(compilation_info)) return; - - if (!CodeKindIsOptimizedJSFunction(compilation_info->code_kind())) return; + const CodeKind kind = compilation_info->code_kind(); + if (!CodeKindIsStoredInOptimizedCodeCache(kind)) { + if (UsesOptimizationMarker(kind)) { + ClearOptimizedCodeCache(compilation_info); + } + return; + } - // Function context specialization folds-in the function context, - // so no sharing can occur. if (compilation_info->function_context_specializing()) { - // Native context specialized code is not shared, so make sure the optimized - // code cache is clear. + // Function context specialization folds-in the function context, so no + // sharing can occur. Make sure the optimized code cache is cleared. ClearOptimizedCodeCache(compilation_info); return; } - // Cache optimized context-specific code. + // Cache optimized code. Handle code = compilation_info->code(); Handle function = compilation_info->closure(); Handle shared(function->shared(), function->GetIsolate()); @@ -876,6 +902,7 @@ void InsertCodeIntoOptimizedCodeCache( handle(function->feedback_vector(), function->GetIsolate()); FeedbackVector::SetOptimizedCode(vector, code); } else { + DCHECK_EQ(kind, CodeKind::OPTIMIZED_FUNCTION); OSROptimizedCodeCache::AddOptimizedCode(native_context, shared, code, compilation_info->osr_offset()); } @@ -885,9 +912,7 @@ void InsertCodeIntoCompilationCache(Isolate* isolate, OptimizedCompilationInfo* info) { if (!CodeKindIsNativeContextIndependentJSFunction(info->code_kind())) return; - // TODO(jgruber,v8:8888): This should turn into a DCHECK once we - // spawn dedicated NCI compile tasks. - if (!info->osr_offset().IsNone()) return; + DCHECK(info->osr_offset().IsNone()); Handle code = info->code(); DCHECK(!info->function_context_specializing()); @@ -984,16 +1009,29 @@ bool GetOptimizedCodeLater(std::unique_ptr job, PrintF(" for concurrent optimization.\n"); } - // Set the optimization marker and return a code object which checks it. - if (!IsForNativeContextIndependentCachingOnly(code_kind)) { - // Cached NCI code currently does not use the optimization marker field. + if (CodeKindIsStoredInOptimizedCodeCache(code_kind)) { function->SetOptimizationMarker(OptimizationMarker::kInOptimizationQueue); } - DCHECK(function->ActiveTierIsIgnition()); + DCHECK(function->ActiveTierIsIgnition() || function->ActiveTierIsNCI()); DCHECK(function->shared().HasBytecodeArray()); return true; } +// Returns the code object at which execution continues after a concurrent +// optimization job has been started (but not finished). +Handle ContinuationForConcurrentOptimization( + Isolate* isolate, Handle function) { + Handle cached_code; + if (FLAG_turbo_nci && function->NextTier() == CodeKindForTopTier() && + GetCodeFromCompilationCache(isolate, handle(function->shared(), isolate)) + .ToHandle(&cached_code)) { + // Tiering up to Turbofan and cached optimized code exists. Continue + // execution there until TF optimization has finished. + return cached_code; + } + return BUILTIN_CODE(isolate, InterpreterEntryTrampoline); +} + MaybeHandle GetOptimizedCode(Handle function, ConcurrencyMode mode, CodeKind code_kind, BailoutId osr_offset = BailoutId::None(), @@ -1005,7 +1043,10 @@ MaybeHandle GetOptimizedCode(Handle function, // Make sure we clear the optimization marker on the function so that we // don't try to re-optimize. - if (function->HasOptimizationMarker()) { + // If compiling for NCI caching only (which does not use the optimization + // marker), don't touch the marker to avoid interfering with Turbofan + // compilation. + if (UsesOptimizationMarker(code_kind) && function->HasOptimizationMarker()) { function->ClearOptimizationMarker(); } @@ -1024,13 +1065,14 @@ MaybeHandle GetOptimizedCode(Handle function, // turbo_filter. if (!FLAG_opt || !shared->PassesFilter(FLAG_turbo_filter)) return {}; - // If code was pending optimization for testing, delete remove the entry - // from the table that was preventing the bytecode from being flushed + // If code was pending optimization for testing, remove the entry from the + // table that was preventing the bytecode from being flushed. if (V8_UNLIKELY(FLAG_testing_d8_test_runner)) { PendingOptimizationTable::FunctionWasOptimized(isolate, function); } - if (!IsForNativeContextIndependentCachingOnly(code_kind)) { + // Check the optimized code cache (stored on the SharedFunctionInfo). + if (CodeKindIsStoredInOptimizedCodeCache(code_kind)) { Handle cached_code; if (GetCodeFromOptimizedCodeCache(function, osr_offset) .ToHandle(&cached_code)) { @@ -1043,13 +1085,18 @@ MaybeHandle GetOptimizedCode(Handle function, DCHECK(shared->is_compiled()); function->feedback_vector().set_profiler_ticks(0); - if (CodeKindIsNativeContextIndependentJSFunction(code_kind) && - osr_offset == BailoutId::None()) { - // Don't generate NCI code when we've already done so in the past. + // Check the compilation cache (stored on the Isolate, shared between native + // contexts). + if (CodeKindIsNativeContextIndependentJSFunction(code_kind)) { + DCHECK(osr_offset.IsNone()); + DCHECK(FLAG_turbo_nci_as_midtier || shared->has_optimized_at_least_once()); + Handle cached_code; if (GetCodeFromCompilationCache(isolate, shared).ToHandle(&cached_code)) { - if (FLAG_trace_turbo_nci) + CHECK_EQ(cached_code->kind(), CodeKind::NATIVE_CONTEXT_INDEPENDENT); + if (FLAG_trace_turbo_nci) { CompilationCacheCode::TraceHit(shared, cached_code); + } return cached_code; } } @@ -1071,11 +1118,11 @@ MaybeHandle GetOptimizedCode(Handle function, has_script, osr_offset, osr_frame)); OptimizedCompilationInfo* compilation_info = job->compilation_info(); - // Prepare the job and launch cocncurrent compilation, or compile now. + // Prepare the job and launch concurrent compilation, or compile now. if (mode == ConcurrencyMode::kConcurrent) { if (GetOptimizedCodeLater(std::move(job), isolate, compilation_info, code_kind, function)) { - return BUILTIN_CODE(isolate, InterpreterEntryTrampoline); + return ContinuationForConcurrentOptimization(isolate, function); } } else { DCHECK_EQ(mode, ConcurrencyMode::kNotConcurrent); @@ -1582,6 +1629,7 @@ bool Compiler::CollectSourcePositions(Isolate* isolate, // Collecting source positions requires allocating a new source position // table. DCHECK(AllowHeapAllocation::IsAllowed()); + DCHECK(AllowGarbageCollection::IsAllowed()); Handle bytecode = handle(shared_info->GetBytecodeArray(), isolate); @@ -1653,7 +1701,7 @@ bool Compiler::CollectSourcePositions(Isolate* isolate, shared_info->GetDebugInfo().HasInstrumentedBytecodeArray()) { ByteArray source_position_table = job->compilation_info()->bytecode_array()->SourcePositionTable(); - shared_info->GetDebugBytecodeArray().set_source_position_table( + shared_info->GetDebugBytecodeArray().set_synchronized_source_position_table( source_position_table); } @@ -1835,7 +1883,8 @@ bool Compiler::CompileOptimized(Handle function, ConcurrencyMode mode, CodeKind code_kind) { DCHECK(CodeKindIsOptimizedJSFunction(code_kind)); - if (function->HasAttachedOptimizedCode()) return true; + // If the requested code kind is already available, do nothing. + if (function->HasAvailableCodeKind(code_kind)) return true; Isolate* isolate = function->GetIsolate(); DCHECK(AllowCompilation::IsAllowed(isolate)); @@ -1858,12 +1907,14 @@ bool Compiler::CompileOptimized(Handle function, DCHECK(!isolate->has_pending_exception()); DCHECK(function->shared().is_compiled()); DCHECK(function->is_compiled()); - DCHECK_IMPLIES(function->HasOptimizationMarker(), - function->IsInOptimizationQueue()); - DCHECK_IMPLIES(function->HasOptimizationMarker(), - function->ChecksOptimizationMarker()); - DCHECK_IMPLIES(function->IsInOptimizationQueue(), - mode == ConcurrencyMode::kConcurrent); + if (UsesOptimizationMarker(code_kind)) { + DCHECK_IMPLIES(function->HasOptimizationMarker(), + function->IsInOptimizationQueue()); + DCHECK_IMPLIES(function->HasOptimizationMarker(), + function->ChecksOptimizationMarker()); + DCHECK_IMPLIES(function->IsInOptimizationQueue(), + mode == ConcurrencyMode::kConcurrent); + } return true; } @@ -2553,10 +2604,13 @@ MaybeHandle Compiler::GetSharedFunctionInfoForScript( LanguageMode language_mode = construct_language_mode(FLAG_use_strict); CompilationCache* compilation_cache = isolate->compilation_cache(); - // Do a lookup in the compilation cache but not for extensions. + // For extensions or REPL mode scripts neither do a compilation cache lookup, + // nor put the compilation result back into the cache. + const bool use_compilation_cache = + extension == nullptr && script_details.repl_mode == REPLMode::kNo; MaybeHandle maybe_result; IsCompiledScope is_compiled_scope; - if (extension == nullptr) { + if (use_compilation_cache) { bool can_consume_code_cache = compile_options == ScriptCompiler::kConsumeCodeCache; if (can_consume_code_cache) { @@ -2622,7 +2676,7 @@ MaybeHandle Compiler::GetSharedFunctionInfoForScript( // Add the result to the isolate cache. Handle result; - if (extension == nullptr && maybe_result.ToHandle(&result)) { + if (use_compilation_cache && maybe_result.ToHandle(&result)) { DCHECK(is_compiled_scope.is_compiled()); compilation_cache->PutScript(source, isolate->native_context(), language_mode, result); @@ -2933,8 +2987,9 @@ bool Compiler::FinalizeOptimizedCompilationJob(OptimizedCompilationJob* job, Handle shared = compilation_info->shared_info(); + CodeKind code_kind = compilation_info->code_kind(); const bool should_install_code_on_function = - !IsForNativeContextIndependentCachingOnly(compilation_info); + !IsForNativeContextIndependentCachingOnly(code_kind); if (should_install_code_on_function) { // Reset profiler ticks, function is no longer considered hot. compilation_info->closure()->feedback_vector().set_profiler_ticks(0); @@ -2969,7 +3024,8 @@ bool Compiler::FinalizeOptimizedCompilationJob(OptimizedCompilationJob* job, CompilerTracer::TraceAbortedJob(isolate, compilation_info); compilation_info->closure()->set_code(shared->GetCode()); // Clear the InOptimizationQueue marker, if it exists. - if (compilation_info->closure()->IsInOptimizationQueue()) { + if (UsesOptimizationMarker(code_kind) && + compilation_info->closure()->IsInOptimizationQueue()) { compilation_info->closure()->ClearOptimizationMarker(); } return CompilationJob::FAILED; diff --git a/deps/v8/src/codegen/compiler.h b/deps/v8/src/codegen/compiler.h index 2af1baa2774f35..1e3ed00f935535 100644 --- a/deps/v8/src/codegen/compiler.h +++ b/deps/v8/src/codegen/compiler.h @@ -44,10 +44,6 @@ class WorkerThreadRuntimeCallStats; using UnoptimizedCompilationJobList = std::forward_list>; -inline bool ShouldSpawnExtraNativeContextIndependentCompilationJob() { - return FLAG_turbo_nci && !FLAG_turbo_nci_as_highest_tier; -} - // The V8 compiler API. // // This is the central hub for dispatching to the various compilers within V8. diff --git a/deps/v8/src/codegen/external-reference.h b/deps/v8/src/codegen/external-reference.h index eaadc6fbad40f2..e35e12237bc1aa 100644 --- a/deps/v8/src/codegen/external-reference.h +++ b/deps/v8/src/codegen/external-reference.h @@ -303,7 +303,8 @@ class ExternalReference { ExternalReference() : address_(kNullAddress) {} static ExternalReference Create(const SCTableReference& table_ref); static ExternalReference Create(StatsCounter* counter); - static ExternalReference Create(ApiFunction* ptr, Type type); + static V8_EXPORT_PRIVATE ExternalReference Create(ApiFunction* ptr, + Type type); static ExternalReference Create(const Runtime::Function* f); static ExternalReference Create(IsolateAddressId id, Isolate* isolate); static ExternalReference Create(Runtime::FunctionId id); diff --git a/deps/v8/src/codegen/ia32/interface-descriptors-ia32.cc b/deps/v8/src/codegen/ia32/interface-descriptors-ia32.cc index 9b96dc1d8cf23d..0177e36c4b9d13 100644 --- a/deps/v8/src/codegen/ia32/interface-descriptors-ia32.cc +++ b/deps/v8/src/codegen/ia32/interface-descriptors-ia32.cc @@ -55,6 +55,11 @@ const Register LoadDescriptor::SlotRegister() { return eax; } const Register LoadWithVectorDescriptor::VectorRegister() { return no_reg; } +const Register +LoadWithReceiverAndVectorDescriptor::LookupStartObjectRegister() { + return edi; +} + const Register StoreDescriptor::ReceiverRegister() { return edx; } const Register StoreDescriptor::NameRegister() { return ecx; } const Register StoreDescriptor::ValueRegister() { return no_reg; } diff --git a/deps/v8/src/codegen/ia32/macro-assembler-ia32.cc b/deps/v8/src/codegen/ia32/macro-assembler-ia32.cc index 8b1cc912987751..9558cf540deef8 100644 --- a/deps/v8/src/codegen/ia32/macro-assembler-ia32.cc +++ b/deps/v8/src/codegen/ia32/macro-assembler-ia32.cc @@ -805,8 +805,9 @@ void TurboAssembler::StubPrologue(StackFrame::Type type) { void TurboAssembler::Prologue() { push(ebp); // Caller's frame pointer. mov(ebp, esp); - push(esi); // Callee's context. - push(edi); // Callee's JS function. + push(kContextRegister); // Callee's context. + push(kJSFunctionRegister); // Callee's JS function. + push(kJavaScriptCallArgCountRegister); // Actual argument count. } void TurboAssembler::EnterFrame(StackFrame::Type type) { diff --git a/deps/v8/src/codegen/ia32/macro-assembler-ia32.h b/deps/v8/src/codegen/ia32/macro-assembler-ia32.h index ef26309a2bddbf..72d574f14c5956 100644 --- a/deps/v8/src/codegen/ia32/macro-assembler-ia32.h +++ b/deps/v8/src/codegen/ia32/macro-assembler-ia32.h @@ -208,6 +208,9 @@ class V8_EXPORT_PRIVATE TurboAssembler : public TurboAssemblerBase { void Popcnt(Register dst, Register src) { Popcnt(dst, Operand(src)); } void Popcnt(Register dst, Operand src); + void PushReturnAddressFrom(Register src) { push(src); } + void PopReturnAddressTo(Register dst) { pop(dst); } + void Ret(); // Root register utility functions. @@ -820,8 +823,6 @@ class V8_EXPORT_PRIVATE MacroAssembler : public TurboAssembler { void Pop(Register dst) { pop(dst); } void Pop(Operand dst) { pop(dst); } - void PushReturnAddressFrom(Register src) { push(src); } - void PopReturnAddressTo(Register dst) { pop(dst); } // --------------------------------------------------------------------------- // In-place weak references. diff --git a/deps/v8/src/codegen/interface-descriptors.cc b/deps/v8/src/codegen/interface-descriptors.cc index 00f774f93c3ff5..8a6235fa0898e1 100644 --- a/deps/v8/src/codegen/interface-descriptors.cc +++ b/deps/v8/src/codegen/interface-descriptors.cc @@ -221,6 +221,16 @@ void LoadGlobalWithVectorDescriptor::InitializePlatformSpecific( data->InitializePlatformSpecific(arraysize(registers), registers); } +void LoadWithReceiverAndVectorDescriptor::InitializePlatformSpecific( + CallInterfaceDescriptorData* data) { + DCHECK(!AreAliased(ReceiverRegister(), LookupStartObjectRegister(), + NameRegister(), SlotRegister(), VectorRegister())); + Register registers[] = {ReceiverRegister(), LookupStartObjectRegister(), + NameRegister(), SlotRegister(), VectorRegister()}; + int len = arraysize(registers) - kStackArgumentsCount; + data->InitializePlatformSpecific(len, registers); +} + void StoreGlobalDescriptor::InitializePlatformSpecific( CallInterfaceDescriptorData* data) { Register registers[] = {NameRegister(), ValueRegister(), SlotRegister()}; @@ -277,6 +287,12 @@ void TypeConversionDescriptor::InitializePlatformSpecific( data->InitializePlatformSpecific(arraysize(registers), registers); } +void TypeConversionNoContextDescriptor::InitializePlatformSpecific( + CallInterfaceDescriptorData* data) { + Register registers[] = {TypeConversionDescriptor::ArgumentRegister()}; + data->InitializePlatformSpecific(arraysize(registers), registers); +} + void TypeConversionStackParameterDescriptor::InitializePlatformSpecific( CallInterfaceDescriptorData* data) { data->InitializePlatformSpecific(0, nullptr); diff --git a/deps/v8/src/codegen/interface-descriptors.h b/deps/v8/src/codegen/interface-descriptors.h index 1f025d37a3ffb5..d307502276021b 100644 --- a/deps/v8/src/codegen/interface-descriptors.h +++ b/deps/v8/src/codegen/interface-descriptors.h @@ -78,6 +78,7 @@ namespace internal { V(LoadGlobalWithVector) \ V(LoadNoFeedback) \ V(LoadWithVector) \ + V(LoadWithReceiverAndVector) \ V(NoContext) \ V(RecordWrite) \ V(ResumeGenerator) \ @@ -92,6 +93,7 @@ namespace internal { V(StringAtAsString) \ V(StringSubstring) \ V(TypeConversion) \ + V(TypeConversionNoContext) \ V(TypeConversionStackParameter) \ V(Typeof) \ V(UnaryOp_WithFeedback) \ @@ -503,6 +505,10 @@ STATIC_ASSERT(kMaxTFSBuiltinRegisterParams <= kMaxBuiltinRegisterParams); DEFINE_RESULT_AND_PARAMETER_TYPES(MachineType::AnyTagged() /* result */, \ ##__VA_ARGS__) +// When the extra arguments described here are located in the stack, they are +// just above the return address in the frame. Therefore, they are either the +// first arguments when V8_REVERSE_JSARGS is enabled, or otherwise the last +// arguments. #define DEFINE_JS_PARAMETERS(...) \ static constexpr int kDescriptorFlags = \ CallInterfaceDescriptorData::kAllowVarArgs; \ @@ -817,6 +823,34 @@ class LoadWithVectorDescriptor : public LoadDescriptor { static const int kStackArgumentsCount = kPassLastArgsOnStack ? 1 : 0; }; +// Like LoadWithVectorDescriptor, except we pass the receiver (the object which +// should be used as the receiver for accessor function calls) and the lookup +// start object separately. +class LoadWithReceiverAndVectorDescriptor : public LoadWithVectorDescriptor { + public: + // TODO(v8:9497): Revert the Machine type for kSlot to the + // TaggedSigned once Torque can emit better call descriptors + DEFINE_PARAMETERS(kReceiver, kLookupStartObject, kName, kSlot, kVector) + DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(), // kReceiver + MachineType::AnyTagged(), // kLookupStartObject + MachineType::AnyTagged(), // kName + MachineType::AnyTagged(), // kSlot + MachineType::AnyTagged()) // kVector + DECLARE_DESCRIPTOR(LoadWithReceiverAndVectorDescriptor, + LoadWithVectorDescriptor) + + static const Register LookupStartObjectRegister(); + +#if V8_TARGET_ARCH_IA32 + static const bool kPassLastArgsOnStack = true; +#else + static const bool kPassLastArgsOnStack = false; +#endif + + // Pass vector through the stack. + static const int kStackArgumentsCount = kPassLastArgsOnStack ? 1 : 0; +}; + class LoadGlobalWithVectorDescriptor : public LoadGlobalDescriptor { public: DEFINE_PARAMETERS(kName, kSlot, kVector) @@ -876,6 +910,13 @@ class TypeConversionDescriptor final : public CallInterfaceDescriptor { static const Register ArgumentRegister(); }; +class TypeConversionNoContextDescriptor final : public CallInterfaceDescriptor { + public: + DEFINE_PARAMETERS_NO_CONTEXT(kArgument) + DEFINE_PARAMETER_TYPES(MachineType::AnyTagged()) + DECLARE_DESCRIPTOR(TypeConversionNoContextDescriptor, CallInterfaceDescriptor) +}; + class TypeConversionStackParameterDescriptor final : public CallInterfaceDescriptor { public: @@ -927,8 +968,8 @@ class CallTrampolineDescriptor : public CallInterfaceDescriptor { class CallVarargsDescriptor : public CallInterfaceDescriptor { public: - DEFINE_PARAMETERS(kTarget, kActualArgumentsCount, kArgumentsLength, - kArgumentsList) + DEFINE_PARAMETERS_VARARGS(kTarget, kActualArgumentsCount, kArgumentsLength, + kArgumentsList) DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(), // kTarget MachineType::Int32(), // kActualArgumentsCount MachineType::Int32(), // kArgumentsLength @@ -938,7 +979,7 @@ class CallVarargsDescriptor : public CallInterfaceDescriptor { class CallForwardVarargsDescriptor : public CallInterfaceDescriptor { public: - DEFINE_PARAMETERS(kTarget, kActualArgumentsCount, kStartIndex) + DEFINE_PARAMETERS_VARARGS(kTarget, kActualArgumentsCount, kStartIndex) DEFINE_PARAMETER_TYPES(MachineType::AnyTagged(), // kTarget MachineType::Int32(), // kActualArgumentsCount MachineType::Int32()) // kStartIndex @@ -1536,7 +1577,7 @@ BUILTIN_LIST_TFS(DEFINE_TFS_BUILTIN_DESCRIPTOR) // This file contains interface descriptor class definitions for builtins // defined in Torque. It is included here because the class definitions need to // precede the definition of name##Descriptor::key() below. -#include "torque-generated/interface-descriptors-tq.inc" +#include "torque-generated/interface-descriptors.inc" #undef DECLARE_DEFAULT_DESCRIPTOR #undef DECLARE_DESCRIPTOR_WITH_BASE diff --git a/deps/v8/src/codegen/macro-assembler.h b/deps/v8/src/codegen/macro-assembler.h index 01175e585e920a..a213fc504e1d23 100644 --- a/deps/v8/src/codegen/macro-assembler.h +++ b/deps/v8/src/codegen/macro-assembler.h @@ -60,8 +60,14 @@ enum AllocationFlags { namespace v8 { namespace internal { -// Simulators only support C calls with up to kMaxCParameters parameters. +// Maximum number of parameters supported in calls to C/C++. The C++ standard +// defines a limit of 256 parameters but in simulator builds we provide only +// limited support. +#ifdef USE_SIMULATOR static constexpr int kMaxCParameters = 10; +#else +static constexpr int kMaxCParameters = 256; +#endif class FrameScope { public: diff --git a/deps/v8/src/codegen/mips/interface-descriptors-mips.cc b/deps/v8/src/codegen/mips/interface-descriptors-mips.cc index 4945ce43957a0b..132811a17339a3 100644 --- a/deps/v8/src/codegen/mips/interface-descriptors-mips.cc +++ b/deps/v8/src/codegen/mips/interface-descriptors-mips.cc @@ -78,6 +78,11 @@ const Register LoadDescriptor::SlotRegister() { return a0; } const Register LoadWithVectorDescriptor::VectorRegister() { return a3; } +const Register +LoadWithReceiverAndVectorDescriptor::LookupStartObjectRegister() { + return t0; +} + const Register StoreDescriptor::ReceiverRegister() { return a1; } const Register StoreDescriptor::NameRegister() { return a2; } const Register StoreDescriptor::ValueRegister() { return a0; } diff --git a/deps/v8/src/codegen/mips/macro-assembler-mips.cc b/deps/v8/src/codegen/mips/macro-assembler-mips.cc index efb2dc11e1fd84..f9a0f7f076466e 100644 --- a/deps/v8/src/codegen/mips/macro-assembler-mips.cc +++ b/deps/v8/src/codegen/mips/macro-assembler-mips.cc @@ -146,10 +146,11 @@ void TurboAssembler::PushCommonFrame(Register marker_reg) { void TurboAssembler::PushStandardFrame(Register function_reg) { int offset = -StandardFrameConstants::kContextOffset; if (function_reg.is_valid()) { - Push(ra, fp, cp, function_reg); - offset += kPointerSize; + Push(ra, fp, cp, function_reg, kJavaScriptCallArgCountRegister); + offset += 2 * kPointerSize; } else { - Push(ra, fp, cp); + Push(ra, fp, cp, kJavaScriptCallArgCountRegister); + offset += kPointerSize; } Addu(fp, sp, Operand(offset)); } @@ -4182,6 +4183,33 @@ void TurboAssembler::Push(Smi smi) { push(scratch); } +void TurboAssembler::PushArray(Register array, Register size, Register scratch, + Register scratch2, PushArrayOrder order) { + DCHECK(!AreAliased(array, size, scratch, scratch2)); + Label loop, entry; + if (order == PushArrayOrder::kReverse) { + mov(scratch, zero_reg); + jmp(&entry); + bind(&loop); + Lsa(scratch2, array, scratch, kPointerSizeLog2); + Lw(scratch2, MemOperand(scratch2)); + push(scratch2); + Addu(scratch, scratch, Operand(1)); + bind(&entry); + Branch(&loop, less, scratch, Operand(size)); + } else { + mov(scratch, size); + jmp(&entry); + bind(&loop); + Lsa(scratch2, array, scratch, kPointerSizeLog2); + Lw(scratch2, MemOperand(scratch2)); + push(scratch2); + bind(&entry); + Addu(scratch, scratch, Operand(-1)); + Branch(&loop, greater_equal, scratch, Operand(zero_reg)); + } +} + void MacroAssembler::MaybeDropFrames() { // Check whether we need to drop frames to restart a function on the stack. li(a1, ExternalReference::debug_restart_fp_address(isolate())); @@ -4350,8 +4378,9 @@ void MacroAssembler::InvokePrologue(Register expected_parameter_count, Label* done, InvokeFlag flag) { Label regular_invoke; - // Check whether the expected and actual arguments count match. The registers - // are set up according to contract with ArgumentsAdaptorTrampoline: + // Check whether the expected and actual arguments count match. The + // registers are set up according to contract with + // ArgumentsAdaptorTrampoline: // a0: actual arguments count // a1: function (passed through to callee) // a2: expected arguments count @@ -4385,8 +4414,8 @@ void MacroAssembler::CheckDebugHook(Register fun, Register new_target, { // Load receiver to pass it later to DebugOnFunctionCall hook. - Lsa(at, sp, actual_parameter_count, kPointerSizeLog2); - lw(t0, MemOperand(at)); + LoadReceiver(t0, actual_parameter_count); + FrameScope frame(this, has_frame() ? StackFrame::NONE : StackFrame::INTERNAL); SmiTag(expected_parameter_count); diff --git a/deps/v8/src/codegen/mips/macro-assembler-mips.h b/deps/v8/src/codegen/mips/macro-assembler-mips.h index d7441c2fcf61a3..cafcc429414897 100644 --- a/deps/v8/src/codegen/mips/macro-assembler-mips.h +++ b/deps/v8/src/codegen/mips/macro-assembler-mips.h @@ -312,6 +312,10 @@ class V8_EXPORT_PRIVATE TurboAssembler : public TurboAssemblerBase { sw(src, MemOperand(sp, 0)); } + enum PushArrayOrder { kNormal, kReverse }; + void PushArray(Register array, Register size, Register scratch, + Register scratch2, PushArrayOrder order = kNormal); + void SaveRegisters(RegList registers); void RestoreRegisters(RegList registers); @@ -905,6 +909,28 @@ class V8_EXPORT_PRIVATE MacroAssembler : public TurboAssembler { public: using TurboAssembler::TurboAssembler; + // It assumes that the arguments are located below the stack pointer. + // argc is the number of arguments not including the receiver. + // TODO(victorgomes): Remove this function once we stick with the reversed + // arguments order. + void LoadReceiver(Register dest, Register argc) { +#ifdef V8_REVERSE_JSARGS + Lw(dest, MemOperand(sp, 0)); +#else + Lsa(dest, sp, argc, kPointerSizeLog2); + Lw(dest, MemOperand(dest, 0)); +#endif + } + + void StoreReceiver(Register rec, Register argc, Register scratch) { +#ifdef V8_REVERSE_JSARGS + Sw(rec, MemOperand(sp, 0)); +#else + Lsa(scratch, sp, argc, kPointerSizeLog2); + Sw(rec, MemOperand(scratch, 0)); +#endif + } + // Swap two registers. If the scratch register is omitted then a slightly // less efficient form using xor instead of mov is emitted. void Swap(Register reg1, Register reg2, Register scratch = no_reg); diff --git a/deps/v8/src/codegen/mips64/interface-descriptors-mips64.cc b/deps/v8/src/codegen/mips64/interface-descriptors-mips64.cc index 9e33d39eba83c4..40146070079fa7 100644 --- a/deps/v8/src/codegen/mips64/interface-descriptors-mips64.cc +++ b/deps/v8/src/codegen/mips64/interface-descriptors-mips64.cc @@ -78,6 +78,11 @@ const Register LoadDescriptor::SlotRegister() { return a0; } const Register LoadWithVectorDescriptor::VectorRegister() { return a3; } +const Register +LoadWithReceiverAndVectorDescriptor::LookupStartObjectRegister() { + return a4; +} + const Register StoreDescriptor::ReceiverRegister() { return a1; } const Register StoreDescriptor::NameRegister() { return a2; } const Register StoreDescriptor::ValueRegister() { return a0; } diff --git a/deps/v8/src/codegen/mips64/macro-assembler-mips64.cc b/deps/v8/src/codegen/mips64/macro-assembler-mips64.cc index 785cf4aa5ccfb6..509153e6c2b8d7 100644 --- a/deps/v8/src/codegen/mips64/macro-assembler-mips64.cc +++ b/deps/v8/src/codegen/mips64/macro-assembler-mips64.cc @@ -144,10 +144,11 @@ void TurboAssembler::PushCommonFrame(Register marker_reg) { void TurboAssembler::PushStandardFrame(Register function_reg) { int offset = -StandardFrameConstants::kContextOffset; if (function_reg.is_valid()) { - Push(ra, fp, cp, function_reg); - offset += kPointerSize; + Push(ra, fp, cp, function_reg, kJavaScriptCallArgCountRegister); + offset += 2 * kPointerSize; } else { - Push(ra, fp, cp); + Push(ra, fp, cp, kJavaScriptCallArgCountRegister); + offset += kPointerSize; } Daddu(fp, sp, Operand(offset)); } @@ -2612,6 +2613,38 @@ void TurboAssembler::Round_s_s(FPURegister dst, FPURegister src) { }); } +void TurboAssembler::MSARoundW(MSARegister dst, MSARegister src, + FPURoundingMode mode) { + BlockTrampolinePoolScope block_trampoline_pool(this); + Register scratch = t8; + Register scratch2 = at; + cfcmsa(scratch, MSACSR); + if (mode == kRoundToNearest) { + scratch2 = zero_reg; + } else { + li(scratch2, Operand(mode)); + } + ctcmsa(MSACSR, scratch2); + frint_w(dst, src); + ctcmsa(MSACSR, scratch); +} + +void TurboAssembler::MSARoundD(MSARegister dst, MSARegister src, + FPURoundingMode mode) { + BlockTrampolinePoolScope block_trampoline_pool(this); + Register scratch = t8; + Register scratch2 = at; + cfcmsa(scratch, MSACSR); + if (mode == kRoundToNearest) { + scratch2 = zero_reg; + } else { + li(scratch2, Operand(mode)); + } + ctcmsa(MSACSR, scratch2); + frint_d(dst, src); + ctcmsa(MSACSR, scratch); +} + void MacroAssembler::Madd_s(FPURegister fd, FPURegister fr, FPURegister fs, FPURegister ft, FPURegister scratch) { DCHECK(fr != scratch && fs != scratch && ft != scratch); @@ -4377,13 +4410,13 @@ void TurboAssembler::BranchLong(Label* L, BranchDelaySlot bdslot) { } else { // Generate position independent long branch. BlockTrampolinePoolScope block_trampoline_pool(this); - int64_t imm64; - imm64 = branch_long_offset(L); + int64_t imm64 = branch_long_offset(L); DCHECK(is_int32(imm64)); + int32_t imm32 = static_cast(imm64); or_(t8, ra, zero_reg); nal(); // Read PC into ra register. - lui(t9, (imm64 & kHiMaskOf32) >> kLuiShift); // Branch delay slot. - ori(t9, t9, (imm64 & kImm16Mask)); + lui(t9, (imm32 & kHiMaskOf32) >> kLuiShift); // Branch delay slot. + ori(t9, t9, (imm32 & kImm16Mask)); daddu(t9, ra, t9); if (bdslot == USE_DELAY_SLOT) { or_(ra, t8, zero_reg); @@ -4401,12 +4434,12 @@ void TurboAssembler::BranchAndLinkLong(Label* L, BranchDelaySlot bdslot) { } else { // Generate position independent long branch and link. BlockTrampolinePoolScope block_trampoline_pool(this); - int64_t imm64; - imm64 = branch_long_offset(L); + int64_t imm64 = branch_long_offset(L); DCHECK(is_int32(imm64)); - lui(t8, (imm64 & kHiMaskOf32) >> kLuiShift); + int32_t imm32 = static_cast(imm64); + lui(t8, (imm32 & kHiMaskOf32) >> kLuiShift); nal(); // Read PC into ra register. - ori(t8, t8, (imm64 & kImm16Mask)); // Branch delay slot. + ori(t8, t8, (imm32 & kImm16Mask)); // Branch delay slot. daddu(t8, ra, t8); jalr(t8); // Emit a nop in the branch delay slot if required. @@ -4488,6 +4521,33 @@ void TurboAssembler::Push(Handle handle) { push(scratch); } +void TurboAssembler::PushArray(Register array, Register size, Register scratch, + Register scratch2, PushArrayOrder order) { + DCHECK(!AreAliased(array, size, scratch, scratch2)); + Label loop, entry; + if (order == PushArrayOrder::kReverse) { + mov(scratch, zero_reg); + jmp(&entry); + bind(&loop); + Dlsa(scratch2, array, scratch, kPointerSizeLog2); + Ld(scratch2, MemOperand(scratch2)); + push(scratch2); + Daddu(scratch, scratch, Operand(1)); + bind(&entry); + Branch(&loop, less, scratch, Operand(size)); + } else { + mov(scratch, size); + jmp(&entry); + bind(&loop); + Dlsa(scratch2, array, scratch, kPointerSizeLog2); + Ld(scratch2, MemOperand(scratch2)); + push(scratch2); + bind(&entry); + Daddu(scratch, scratch, Operand(-1)); + Branch(&loop, greater_equal, scratch, Operand(zero_reg)); + } +} + void MacroAssembler::MaybeDropFrames() { // Check whether we need to drop frames to restart a function on the stack. li(a1, ExternalReference::debug_restart_fp_address(isolate())); @@ -4696,8 +4756,8 @@ void MacroAssembler::CheckDebugHook(Register fun, Register new_target, { // Load receiver to pass it later to DebugOnFunctionCall hook. - Dlsa(t0, sp, actual_parameter_count, kPointerSizeLog2); - Ld(t0, MemOperand(t0)); + LoadReceiver(t0, actual_parameter_count); + FrameScope frame(this, has_frame() ? StackFrame::NONE : StackFrame::INTERNAL); SmiTag(expected_parameter_count); diff --git a/deps/v8/src/codegen/mips64/macro-assembler-mips64.h b/deps/v8/src/codegen/mips64/macro-assembler-mips64.h index c8b8d2876fc72e..56380cc8b2b167 100644 --- a/deps/v8/src/codegen/mips64/macro-assembler-mips64.h +++ b/deps/v8/src/codegen/mips64/macro-assembler-mips64.h @@ -334,6 +334,10 @@ class V8_EXPORT_PRIVATE TurboAssembler : public TurboAssemblerBase { Sd(src, MemOperand(sp, 0)); } + enum PushArrayOrder { kNormal, kReverse }; + void PushArray(Register array, Register size, Register scratch, + Register scratch2, PushArrayOrder order = kNormal); + void SaveRegisters(RegList registers); void RestoreRegisters(RegList registers); @@ -787,6 +791,9 @@ class V8_EXPORT_PRIVATE TurboAssembler : public TurboAssemblerBase { void Floor_s_s(FPURegister fd, FPURegister fs); void Ceil_s_s(FPURegister fd, FPURegister fs); + void MSARoundW(MSARegister dst, MSARegister src, FPURoundingMode mode); + void MSARoundD(MSARegister dst, MSARegister src, FPURoundingMode mode); + // Jump the register contains a smi. void JumpIfSmi(Register value, Label* smi_label, Register scratch = at, BranchDelaySlot bd = PROTECT); @@ -909,6 +916,28 @@ class V8_EXPORT_PRIVATE MacroAssembler : public TurboAssembler { public: using TurboAssembler::TurboAssembler; + // It assumes that the arguments are located below the stack pointer. + // argc is the number of arguments not including the receiver. + // TODO(victorgomes): Remove this function once we stick with the reversed + // arguments order. + void LoadReceiver(Register dest, Register argc) { +#ifdef V8_REVERSE_JSARGS + Ld(dest, MemOperand(sp, 0)); +#else + Dlsa(dest, sp, argc, kPointerSizeLog2); + Ld(dest, MemOperand(dest, 0)); +#endif + } + + void StoreReceiver(Register rec, Register argc, Register scratch) { +#ifdef V8_REVERSE_JSARGS + Sd(rec, MemOperand(sp, 0)); +#else + Dlsa(scratch, sp, argc, kPointerSizeLog2); + Sd(rec, MemOperand(scratch, 0)); +#endif + } + bool IsNear(Label* L, Condition cond, int rs_reg); // Swap two registers. If the scratch register is omitted then a slightly diff --git a/deps/v8/src/codegen/optimized-compilation-info.cc b/deps/v8/src/codegen/optimized-compilation-info.cc index 160691cf89d1a7..b2c100aa052be9 100644 --- a/deps/v8/src/codegen/optimized-compilation-info.cc +++ b/deps/v8/src/codegen/optimized-compilation-info.cc @@ -111,12 +111,6 @@ void OptimizedCompilationInfo::ConfigureFlags() { default: break; } - - if (FLAG_turbo_control_flow_aware_allocation) { - set_turbo_control_flow_aware_allocation(); - } else { - set_turbo_preprocess_ranges(); - } } OptimizedCompilationInfo::~OptimizedCompilationInfo() { diff --git a/deps/v8/src/codegen/optimized-compilation-info.h b/deps/v8/src/codegen/optimized-compilation-info.h index ac45bc29398a01..4de8ba16450f95 100644 --- a/deps/v8/src/codegen/optimized-compilation-info.h +++ b/deps/v8/src/codegen/optimized-compilation-info.h @@ -46,29 +46,27 @@ class V8_EXPORT_PRIVATE OptimizedCompilationInfo final { // Various configuration flags for a compilation, as well as some properties // of the compiled code produced by a compilation. -#define FLAGS(V) \ - V(FunctionContextSpecializing, function_context_specializing, 0) \ - V(Inlining, inlining, 1) \ - V(DisableFutureOptimization, disable_future_optimization, 2) \ - V(Splitting, splitting, 3) \ - V(SourcePositions, source_positions, 4) \ - V(BailoutOnUninitialized, bailout_on_uninitialized, 5) \ - V(LoopPeeling, loop_peeling, 6) \ - V(UntrustedCodeMitigations, untrusted_code_mitigations, 7) \ - V(SwitchJumpTable, switch_jump_table, 8) \ - V(CalledWithCodeStartRegister, called_with_code_start_register, 9) \ - V(PoisonRegisterArguments, poison_register_arguments, 10) \ - V(AllocationFolding, allocation_folding, 11) \ - V(AnalyzeEnvironmentLiveness, analyze_environment_liveness, 12) \ - V(TraceTurboJson, trace_turbo_json, 13) \ - V(TraceTurboGraph, trace_turbo_graph, 14) \ - V(TraceTurboScheduled, trace_turbo_scheduled, 15) \ - V(TraceTurboAllocation, trace_turbo_allocation, 16) \ - V(TraceHeapBroker, trace_heap_broker, 17) \ - V(WasmRuntimeExceptionSupport, wasm_runtime_exception_support, 18) \ - V(TurboControlFlowAwareAllocation, turbo_control_flow_aware_allocation, 19) \ - V(TurboPreprocessRanges, turbo_preprocess_ranges, 20) \ - V(ConcurrentInlining, concurrent_inlining, 21) +#define FLAGS(V) \ + V(FunctionContextSpecializing, function_context_specializing, 0) \ + V(Inlining, inlining, 1) \ + V(DisableFutureOptimization, disable_future_optimization, 2) \ + V(Splitting, splitting, 3) \ + V(SourcePositions, source_positions, 4) \ + V(BailoutOnUninitialized, bailout_on_uninitialized, 5) \ + V(LoopPeeling, loop_peeling, 6) \ + V(UntrustedCodeMitigations, untrusted_code_mitigations, 7) \ + V(SwitchJumpTable, switch_jump_table, 8) \ + V(CalledWithCodeStartRegister, called_with_code_start_register, 9) \ + V(PoisonRegisterArguments, poison_register_arguments, 10) \ + V(AllocationFolding, allocation_folding, 11) \ + V(AnalyzeEnvironmentLiveness, analyze_environment_liveness, 12) \ + V(TraceTurboJson, trace_turbo_json, 13) \ + V(TraceTurboGraph, trace_turbo_graph, 14) \ + V(TraceTurboScheduled, trace_turbo_scheduled, 15) \ + V(TraceTurboAllocation, trace_turbo_allocation, 16) \ + V(TraceHeapBroker, trace_heap_broker, 17) \ + V(WasmRuntimeExceptionSupport, wasm_runtime_exception_support, 18) \ + V(ConcurrentInlining, concurrent_inlining, 19) enum Flag { #define DEF_ENUM(Camel, Lower, Bit) k##Camel = 1 << Bit, diff --git a/deps/v8/src/codegen/ppc/constants-ppc.h b/deps/v8/src/codegen/ppc/constants-ppc.h index b91b40ca154466..306175e06df737 100644 --- a/deps/v8/src/codegen/ppc/constants-ppc.h +++ b/deps/v8/src/codegen/ppc/constants-ppc.h @@ -385,7 +385,23 @@ using Instr = uint32_t; /* VSX Vector Convert Signed Fixed-Point Word to Single-Precision */ \ V(xvcvsxwsp, XVCVSXWSP, 0xF00002E0) \ /* VSX Vector Convert Unsigned Fixed-Point Word to Single-Precision */ \ - V(xvcvuxwsp, XVCVUXWSP, 0xF00002A0) + V(xvcvuxwsp, XVCVUXWSP, 0xF00002A0) \ + /* VSX Vector Round to Double-Precision Integer toward +Infinity */ \ + V(xvrdpip, XVRDPIP, 0xF00003A4) \ + /* VSX Vector Round to Double-Precision Integer toward -Infinity */ \ + V(xvrdpim, XVRDPIM, 0xF00003E4) \ + /* VSX Vector Round to Double-Precision Integer toward Zero */ \ + V(xvrdpiz, XVRDPIZ, 0xF0000364) \ + /* VSX Vector Round to Double-Precision Integer */ \ + V(xvrdpi, XVRDPI, 0xF0000324) \ + /* VSX Vector Round to Single-Precision Integer toward +Infinity */ \ + V(xvrspip, XVRSPIP, 0xF00002A4) \ + /* VSX Vector Round to Single-Precision Integer toward -Infinity */ \ + V(xvrspim, XVRSPIM, 0xF00002E4) \ + /* VSX Vector Round to Single-Precision Integer toward Zero */ \ + V(xvrspiz, XVRSPIZ, 0xF0000264) \ + /* VSX Vector Round to Single-Precision Integer */ \ + V(xvrspi, XVRSPI, 0xF0000224) #define PPC_XX2_OPCODE_UNUSED_LIST(V) \ /* VSX Scalar Square Root Double-Precision */ \ @@ -497,28 +513,12 @@ using Instr = uint32_t; V(xvnabsdp, XVNABSDP, 0xF00007A4) \ /* VSX Vector Negative Absolute Value Single-Precision */ \ V(xvnabssp, XVNABSSP, 0xF00006A4) \ - /* VSX Vector Round to Double-Precision Integer */ \ - V(xvrdpi, XVRDPI, 0xF0000324) \ /* VSX Vector Round to Double-Precision Integer using Current rounding */ \ /* mode */ \ V(xvrdpic, XVRDPIC, 0xF00003AC) \ - /* VSX Vector Round to Double-Precision Integer toward -Infinity */ \ - V(xvrdpim, XVRDPIM, 0xF00003E4) \ - /* VSX Vector Round to Double-Precision Integer toward +Infinity */ \ - V(xvrdpip, XVRDPIP, 0xF00003A4) \ - /* VSX Vector Round to Double-Precision Integer toward Zero */ \ - V(xvrdpiz, XVRDPIZ, 0xF0000364) \ - /* VSX Vector Round to Single-Precision Integer */ \ - V(xvrspi, XVRSPI, 0xF0000224) \ /* VSX Vector Round to Single-Precision Integer using Current rounding */ \ /* mode */ \ V(xvrspic, XVRSPIC, 0xF00002AC) \ - /* VSX Vector Round to Single-Precision Integer toward -Infinity */ \ - V(xvrspim, XVRSPIM, 0xF00002E4) \ - /* VSX Vector Round to Single-Precision Integer toward +Infinity */ \ - V(xvrspip, XVRSPIP, 0xF00002A4) \ - /* VSX Vector Round to Single-Precision Integer toward Zero */ \ - V(xvrspiz, XVRSPIZ, 0xF0000264) \ /* VSX Vector Reciprocal Square Root Estimate Double-Precision */ \ V(xvrsqrtedp, XVRSQRTEDP, 0xF0000328) \ /* VSX Vector Test for software Square Root Double-Precision */ \ @@ -2342,7 +2342,13 @@ using Instr = uint32_t; /* Vector Average Unsigned Byte */ \ V(vavgub, VAVGUB, 0x10000402) \ /* Vector Average Unsigned Halfword */ \ - V(vavguh, VAVGUH, 0x10000442) + V(vavguh, VAVGUH, 0x10000442) \ + /* Vector Logical AND with Complement */ \ + V(vandc, VANDC, 0x10000444) \ + /* Vector Minimum Single-Precision */ \ + V(vminfp, VMINFP, 0x1000044A) \ + /* Vector Maximum Single-Precision */ \ + V(vmaxfp, VMAXFP, 0x1000040A) #define PPC_VX_OPCODE_C_FORM_LIST(V) \ /* Vector Unpack Low Signed Halfword */ \ @@ -2373,8 +2379,6 @@ using Instr = uint32_t; V(vadduqm, VADDUQM, 0x10000100) \ /* Vector Add Unsigned Word Saturate */ \ V(vadduws, VADDUWS, 0x10000280) \ - /* Vector Logical AND with Complement */ \ - V(vandc, VANDC, 0x10000444) \ /* Vector Average Signed Byte */ \ V(vavgsb, VAVGSB, 0x10000502) \ /* Vector Average Signed Halfword */ \ @@ -2411,10 +2415,6 @@ using Instr = uint32_t; V(vgbbd, VGBBD, 0x1000050C) \ /* Vector Log Base 2 Estimate Single-Precision */ \ V(vlogefp, VLOGEFP, 0x100001CA) \ - /* Vector Maximum Single-Precision */ \ - V(vmaxfp, VMAXFP, 0x1000040A) \ - /* Vector Minimum Single-Precision */ \ - V(vminfp, VMINFP, 0x1000044A) \ /* Vector Merge High Byte */ \ V(vmrghb, VMRGHB, 0x1000000C) \ /* Vector Merge High Halfword */ \ diff --git a/deps/v8/src/codegen/ppc/interface-descriptors-ppc.cc b/deps/v8/src/codegen/ppc/interface-descriptors-ppc.cc index cab95e2f41ef0f..4d68e01285388e 100644 --- a/deps/v8/src/codegen/ppc/interface-descriptors-ppc.cc +++ b/deps/v8/src/codegen/ppc/interface-descriptors-ppc.cc @@ -52,6 +52,11 @@ const Register LoadDescriptor::SlotRegister() { return r3; } const Register LoadWithVectorDescriptor::VectorRegister() { return r6; } +const Register +LoadWithReceiverAndVectorDescriptor::LookupStartObjectRegister() { + return r7; +} + const Register StoreDescriptor::ReceiverRegister() { return r4; } const Register StoreDescriptor::NameRegister() { return r5; } const Register StoreDescriptor::ValueRegister() { return r3; } diff --git a/deps/v8/src/codegen/ppc/macro-assembler-ppc.cc b/deps/v8/src/codegen/ppc/macro-assembler-ppc.cc index c99977a5be4ea0..4a526384e04991 100644 --- a/deps/v8/src/codegen/ppc/macro-assembler-ppc.cc +++ b/deps/v8/src/codegen/ppc/macro-assembler-ppc.cc @@ -320,6 +320,38 @@ void TurboAssembler::Push(Smi smi) { push(r0); } +void TurboAssembler::PushArray(Register array, Register size, Register scratch, + Register scratch2, PushArrayOrder order) { + Label loop, done; + + if (order == kNormal) { + cmpi(size, Operand::Zero()); + beq(&done); + ShiftLeftImm(scratch, size, Operand(kSystemPointerSizeLog2)); + add(scratch, array, scratch); + mtctr(size); + + bind(&loop); + LoadPU(scratch2, MemOperand(scratch, -kSystemPointerSize)); + StorePU(scratch2, MemOperand(sp, -kSystemPointerSize)); + bdnz(&loop); + + bind(&done); + } else { + cmpi(size, Operand::Zero()); + beq(&done); + + mtctr(size); + subi(scratch, array, Operand(kSystemPointerSize)); + + bind(&loop); + LoadPU(scratch2, MemOperand(scratch, kSystemPointerSize)); + StorePU(scratch2, MemOperand(sp, -kSystemPointerSize)); + bdnz(&loop); + bind(&done); + } +} + void TurboAssembler::Move(Register dst, Handle value, RelocInfo::Mode rmode) { // TODO(jgruber,v8:8887): Also consider a root-relative load when generating @@ -775,6 +807,7 @@ void TurboAssembler::PushStandardFrame(Register function_reg) { } } addi(fp, sp, Operand(fp_delta * kSystemPointerSize)); + Push(kJavaScriptCallArgCountRegister); } void TurboAssembler::RestoreFrameStateForTailCall() { @@ -1350,8 +1383,7 @@ void MacroAssembler::CheckDebugHook(Register fun, Register new_target, { // Load receiver to pass it later to DebugOnFunctionCall hook. - ShiftLeftImm(r7, actual_parameter_count, Operand(kSystemPointerSizeLog2)); - LoadPX(r7, MemOperand(sp, r7)); + LoadReceiver(r7, actual_parameter_count); FrameScope frame(this, has_frame() ? StackFrame::NONE : StackFrame::INTERNAL); diff --git a/deps/v8/src/codegen/ppc/macro-assembler-ppc.h b/deps/v8/src/codegen/ppc/macro-assembler-ppc.h index 0e9c764add425e..a74985cbe13800 100644 --- a/deps/v8/src/codegen/ppc/macro-assembler-ppc.h +++ b/deps/v8/src/codegen/ppc/macro-assembler-ppc.h @@ -237,6 +237,10 @@ class V8_EXPORT_PRIVATE TurboAssembler : public TurboAssemblerBase { StoreP(src1, MemOperand(sp, 4 * kSystemPointerSize)); } + enum PushArrayOrder { kNormal, kReverse }; + void PushArray(Register array, Register size, Register scratch, + Register scratch2, PushArrayOrder order = kNormal); + void Pop(Register dst) { pop(dst); } // Pop two registers. Pops rightmost register first (from lower address). @@ -719,6 +723,28 @@ class V8_EXPORT_PRIVATE MacroAssembler : public TurboAssembler { public: using TurboAssembler::TurboAssembler; + // It assumes that the arguments are located below the stack pointer. + // argc is the number of arguments not including the receiver. + // TODO(victorgomes): Remove this function once we stick with the reversed + // arguments order. + void LoadReceiver(Register dest, Register argc) { +#ifdef V8_REVERSE_JSARGS + LoadP(dest, MemOperand(sp, 0)); +#else + ShiftLeftImm(dest, argc, Operand(kSystemPointerSizeLog2)); + LoadPX(dest, MemOperand(sp, dest)); +#endif + } + + void StoreReceiver(Register rec, Register argc, Register scratch) { +#ifdef V8_REVERSE_JSARGS + StoreP(rec, MemOperand(sp, 0)); +#else + ShiftLeftImm(scratch, argc, Operand(kSystemPointerSizeLog2)); + StorePX(rec, MemOperand(sp, scratch)); +#endif + } + // --------------------------------------------------------------------------- // GC Support diff --git a/deps/v8/src/codegen/s390/interface-descriptors-s390.cc b/deps/v8/src/codegen/s390/interface-descriptors-s390.cc index 9e341c357bab4f..6c56c19b5af929 100644 --- a/deps/v8/src/codegen/s390/interface-descriptors-s390.cc +++ b/deps/v8/src/codegen/s390/interface-descriptors-s390.cc @@ -52,6 +52,11 @@ const Register LoadDescriptor::SlotRegister() { return r2; } const Register LoadWithVectorDescriptor::VectorRegister() { return r5; } +const Register +LoadWithReceiverAndVectorDescriptor::LookupStartObjectRegister() { + return r6; +} + const Register StoreDescriptor::ReceiverRegister() { return r3; } const Register StoreDescriptor::NameRegister() { return r4; } const Register StoreDescriptor::ValueRegister() { return r2; } diff --git a/deps/v8/src/codegen/s390/macro-assembler-s390.cc b/deps/v8/src/codegen/s390/macro-assembler-s390.cc index 08adf57ff7c98d..5c9fe62dd1e554 100644 --- a/deps/v8/src/codegen/s390/macro-assembler-s390.cc +++ b/deps/v8/src/codegen/s390/macro-assembler-s390.cc @@ -379,6 +379,37 @@ void TurboAssembler::BranchRelativeOnIdxHighP(Register dst, Register inc, #endif // V8_TARGET_ARCH_S390X } +void TurboAssembler::PushArray(Register array, Register size, Register scratch, + Register scratch2, PushArrayOrder order) { + Label loop, done; + + if (order == kNormal) { + ShiftLeftP(scratch, size, Operand(kSystemPointerSizeLog2)); + lay(scratch, MemOperand(array, scratch)); + bind(&loop); + CmpP(array, scratch); + bge(&done); + lay(scratch, MemOperand(scratch, -kSystemPointerSize)); + lay(sp, MemOperand(sp, -kSystemPointerSize)); + MoveChar(MemOperand(sp), MemOperand(scratch), Operand(kSystemPointerSize)); + b(&loop); + bind(&done); + } else { + DCHECK_NE(scratch2, r0); + ShiftLeftP(scratch, size, Operand(kSystemPointerSizeLog2)); + lay(scratch, MemOperand(array, scratch)); + LoadRR(scratch2, array); + bind(&loop); + CmpP(scratch2, scratch); + bge(&done); + lay(sp, MemOperand(sp, -kSystemPointerSize)); + MoveChar(MemOperand(sp), MemOperand(scratch2), Operand(kSystemPointerSize)); + lay(scratch2, MemOperand(scratch2, kSystemPointerSize)); + b(&loop); + bind(&done); + } +} + void TurboAssembler::MultiPush(RegList regs, Register location) { int16_t num_to_push = base::bits::CountPopulation(regs); int16_t stack_offset = num_to_push * kSystemPointerSize; @@ -759,6 +790,7 @@ void TurboAssembler::PushStandardFrame(Register function_reg) { fp_delta = 1; } la(fp, MemOperand(sp, fp_delta * kSystemPointerSize)); + Push(kJavaScriptCallArgCountRegister); } void TurboAssembler::RestoreFrameStateForTailCall() { @@ -1379,8 +1411,7 @@ void MacroAssembler::CheckDebugHook(Register fun, Register new_target, { // Load receiver to pass it later to DebugOnFunctionCall hook. - ShiftLeftP(r6, actual_parameter_count, Operand(kSystemPointerSizeLog2)); - LoadP(r6, MemOperand(sp, r6)); + LoadReceiver(r6, actual_parameter_count); FrameScope frame(this, has_frame() ? StackFrame::NONE : StackFrame::INTERNAL); diff --git a/deps/v8/src/codegen/s390/macro-assembler-s390.h b/deps/v8/src/codegen/s390/macro-assembler-s390.h index 8b267eb2c6fd6b..f66be8c2efd745 100644 --- a/deps/v8/src/codegen/s390/macro-assembler-s390.h +++ b/deps/v8/src/codegen/s390/macro-assembler-s390.h @@ -592,6 +592,10 @@ class V8_EXPORT_PRIVATE TurboAssembler : public TurboAssemblerBase { StoreP(src5, MemOperand(sp, 0)); } + enum PushArrayOrder { kNormal, kReverse }; + void PushArray(Register array, Register size, Register scratch, + Register scratch2, PushArrayOrder order = kNormal); + void Pop(Register dst) { pop(dst); } // Pop two registers. Pops rightmost register first (from lower address). @@ -1063,6 +1067,28 @@ class V8_EXPORT_PRIVATE MacroAssembler : public TurboAssembler { public: using TurboAssembler::TurboAssembler; + // It assumes that the arguments are located below the stack pointer. + // argc is the number of arguments not including the receiver. + // TODO(victorgomes): Remove this function once we stick with the reversed + // arguments order. + void LoadReceiver(Register dest, Register argc) { +#ifdef V8_REVERSE_JSARGS + LoadP(dest, MemOperand(sp, 0)); +#else + ShiftLeftP(dest, argc, Operand(kSystemPointerSizeLog2)); + LoadP(dest, MemOperand(sp, dest)); +#endif + } + + void StoreReceiver(Register rec, Register argc, Register scratch) { +#ifdef V8_REVERSE_JSARGS + StoreP(rec, MemOperand(sp, 0)); +#else + ShiftLeftP(scratch, argc, Operand(kSystemPointerSizeLog2)); + StoreP(rec, MemOperand(sp, scratch)); +#endif + } + void CallRuntime(const Runtime::Function* f, int num_arguments, SaveFPRegsMode save_doubles = kDontSaveFPRegs); void CallRuntimeSaveDoubles(Runtime::FunctionId fid) { diff --git a/deps/v8/src/codegen/signature.h b/deps/v8/src/codegen/signature.h index 1213a1fd495602..bba3a1b13d8091 100644 --- a/deps/v8/src/codegen/signature.h +++ b/deps/v8/src/codegen/signature.h @@ -21,7 +21,12 @@ class Signature : public ZoneObject { const T* reps) : return_count_(return_count), parameter_count_(parameter_count), - reps_(reps) {} + reps_(reps) { + DCHECK_EQ(kReturnCountOffset, offsetof(Signature, return_count_)); + DCHECK_EQ(kParameterCountOffset, offsetof(Signature, parameter_count_)); + DCHECK_EQ(kRepsOffset, offsetof(Signature, reps_)); + STATIC_ASSERT(std::is_standard_layout>::value); + } size_t return_count() const { return return_count_; } size_t parameter_count() const { return parameter_count_; } @@ -99,6 +104,11 @@ class Signature : public ZoneObject { T* buffer_; }; + static constexpr size_t kReturnCountOffset = 0; + static constexpr size_t kParameterCountOffset = + kReturnCountOffset + kSizetSize; + static constexpr size_t kRepsOffset = kParameterCountOffset + kSizetSize; + protected: size_t return_count_; size_t parameter_count_; diff --git a/deps/v8/src/codegen/x64/interface-descriptors-x64.cc b/deps/v8/src/codegen/x64/interface-descriptors-x64.cc index d86089ca1dcb05..5a9c386eb8b29e 100644 --- a/deps/v8/src/codegen/x64/interface-descriptors-x64.cc +++ b/deps/v8/src/codegen/x64/interface-descriptors-x64.cc @@ -54,6 +54,11 @@ const Register LoadDescriptor::SlotRegister() { return rax; } const Register LoadWithVectorDescriptor::VectorRegister() { return rbx; } +const Register +LoadWithReceiverAndVectorDescriptor::LookupStartObjectRegister() { + return rdi; +} + const Register StoreDescriptor::ReceiverRegister() { return rdx; } const Register StoreDescriptor::NameRegister() { return rcx; } const Register StoreDescriptor::ValueRegister() { return rax; } diff --git a/deps/v8/src/codegen/x64/macro-assembler-x64.cc b/deps/v8/src/codegen/x64/macro-assembler-x64.cc index faa96b7d3f1410..7f7ff5038adcc7 100644 --- a/deps/v8/src/codegen/x64/macro-assembler-x64.cc +++ b/deps/v8/src/codegen/x64/macro-assembler-x64.cc @@ -2365,6 +2365,51 @@ void MacroAssembler::InvokePrologue(Register expected_parameter_count, Label* done, InvokeFlag flag) { if (expected_parameter_count != actual_parameter_count) { Label regular_invoke; +#ifdef V8_NO_ARGUMENTS_ADAPTOR + // Skip if adaptor sentinel. + cmpl(expected_parameter_count, Immediate(kDontAdaptArgumentsSentinel)); + j(equal, ®ular_invoke, Label::kNear); + + // Skip if overapplication or if expected number of arguments. + subq(expected_parameter_count, actual_parameter_count); + j(less_equal, ®ular_invoke, Label::kNear); + + // Underapplication. Move the arguments already in the stack, including the + // receiver and the return address. + { + Label copy, check; + Register src = r8, dest = rsp, num = r9, current = r11; + movq(src, rsp); + leaq(kScratchRegister, + Operand(expected_parameter_count, times_system_pointer_size, 0)); + AllocateStackSpace(kScratchRegister); + // Extra words are the receiver and the return address (if a jump). + int extra_words = flag == CALL_FUNCTION ? 1 : 2; + leaq(num, Operand(rax, extra_words)); // Number of words to copy. + Set(current, 0); + // Fall-through to the loop body because there are non-zero words to copy. + bind(©); + movq(kScratchRegister, + Operand(src, current, times_system_pointer_size, 0)); + movq(Operand(dest, current, times_system_pointer_size, 0), + kScratchRegister); + incq(current); + bind(&check); + cmpq(current, num); + j(less, ©); + leaq(r8, Operand(rsp, num, times_system_pointer_size, 0)); + } + // Fill remaining expected arguments with undefined values. + LoadRoot(kScratchRegister, RootIndex::kUndefinedValue); + { + Label loop; + bind(&loop); + decq(expected_parameter_count); + movq(Operand(r8, expected_parameter_count, times_system_pointer_size, 0), + kScratchRegister); + j(greater, &loop, Label::kNear); + } +#else // Both expected and actual are in (different) registers. This // is the case when we invoke functions using call and apply. cmpq(expected_parameter_count, actual_parameter_count); @@ -2378,6 +2423,8 @@ void MacroAssembler::InvokePrologue(Register expected_parameter_count, } else { Jump(adaptor, RelocInfo::CODE_TARGET); } +#endif + bind(®ular_invoke); } else { Move(rax, actual_parameter_count); @@ -2430,8 +2477,9 @@ void TurboAssembler::StubPrologue(StackFrame::Type type) { void TurboAssembler::Prologue() { pushq(rbp); // Caller's frame pointer. movq(rbp, rsp); - Push(rsi); // Callee's context. - Push(rdi); // Callee's JS function. + Push(kContextRegister); // Callee's context. + Push(kJSFunctionRegister); // Callee's JS function. + Push(kJavaScriptCallArgCountRegister); // Actual argument count. } void TurboAssembler::EnterFrame(StackFrame::Type type) { diff --git a/deps/v8/src/common/assert-scope.cc b/deps/v8/src/common/assert-scope.cc index 64b5415bc90f52..531ac4e024f8de 100644 --- a/deps/v8/src/common/assert-scope.cc +++ b/deps/v8/src/common/assert-scope.cc @@ -120,6 +120,8 @@ bool PerIsolateAssertScope::IsAllowed(Isolate* isolate) { // ----------------------------------------------------------------------------- // Instantiations. +template class PerThreadAssertScope; +template class PerThreadAssertScope; template class PerThreadAssertScope; template class PerThreadAssertScope; template class PerThreadAssertScope; diff --git a/deps/v8/src/common/assert-scope.h b/deps/v8/src/common/assert-scope.h index 85b9a47d5c0ffc..b958ca4bedc3c4 100644 --- a/deps/v8/src/common/assert-scope.h +++ b/deps/v8/src/common/assert-scope.h @@ -28,6 +28,7 @@ struct PointerWithPayloadTraits { }; enum PerThreadAssertType { + GARBAGE_COLLECTION_ASSERT, HEAP_ALLOCATION_ASSERT, HANDLE_ALLOCATION_ASSERT, HANDLE_DEREFERENCE_ASSERT, @@ -126,7 +127,17 @@ using DisallowHandleAllocation = using AllowHandleAllocation = PerThreadAssertScopeDebugOnly; -// Scope to document where we do not expect any allocation and GC. +// Scope to document where we do not expect garbage collections. It differs from +// DisallowHeapAllocation by also forbiding safepoints. +using DisallowGarbageCollection = + PerThreadAssertScopeDebugOnly; + +// Scope to introduce an exception to DisallowGarbageCollection. +using AllowGarbageCollection = + PerThreadAssertScopeDebugOnly; + +// Scope to document where we do not expect any allocation and GC. Deprecated +// and will eventually be removed, use DisallowGarbageCollection instead. using DisallowHeapAllocation = PerThreadAssertScopeDebugOnly; #ifdef DEBUG diff --git a/deps/v8/src/common/globals.h b/deps/v8/src/common/globals.h index dbc6b9af9be02a..0e9d815207869b 100644 --- a/deps/v8/src/common/globals.h +++ b/deps/v8/src/common/globals.h @@ -186,14 +186,13 @@ constexpr int kElidedFrameSlots = 0; #endif constexpr int kDoubleSizeLog2 = 3; -constexpr size_t kMaxWasmCodeMB = 1024; + +// Total wasm code space per engine (i.e. per process) is limited to make +// certain attacks that rely on heap spraying harder. +// This limit was increased to 2GB in August 2020 and we have security clearance +// to increase to 4GB if needed. +constexpr size_t kMaxWasmCodeMB = 2048; constexpr size_t kMaxWasmCodeMemory = kMaxWasmCodeMB * MB; -#if V8_TARGET_ARCH_ARM64 -// ARM64 only supports direct calls within a 128 MB range. -constexpr size_t kMaxWasmCodeSpaceSize = 128 * MB; -#else -constexpr size_t kMaxWasmCodeSpaceSize = kMaxWasmCodeMemory; -#endif #if V8_HOST_ARCH_64_BIT constexpr int kSystemPointerSizeLog2 = 3; @@ -747,20 +746,20 @@ using WeakSlotCallbackWithHeap = bool (*)(Heap* heap, FullObjectSlot pointer); // NOTE: SpaceIterator depends on AllocationSpace enumeration values being // consecutive. enum AllocationSpace { - RO_SPACE, // Immortal, immovable and immutable objects, - NEW_SPACE, // Young generation semispaces for regular objects collected with - // Scavenger. - OLD_SPACE, // Old generation regular object space. - CODE_SPACE, // Old generation code object space, marked executable. - MAP_SPACE, // Old generation map object space, non-movable. - LO_SPACE, // Old generation large object space. + RO_SPACE, // Immortal, immovable and immutable objects, + OLD_SPACE, // Old generation regular object space. + CODE_SPACE, // Old generation code object space, marked executable. + MAP_SPACE, // Old generation map object space, non-movable. + LO_SPACE, // Old generation large object space. CODE_LO_SPACE, // Old generation large code object space. NEW_LO_SPACE, // Young generation large object space. + NEW_SPACE, // Young generation semispaces for regular objects collected with + // Scavenger. FIRST_SPACE = RO_SPACE, - LAST_SPACE = NEW_LO_SPACE, - FIRST_MUTABLE_SPACE = NEW_SPACE, - LAST_MUTABLE_SPACE = NEW_LO_SPACE, + LAST_SPACE = NEW_SPACE, + FIRST_MUTABLE_SPACE = OLD_SPACE, + LAST_MUTABLE_SPACE = NEW_SPACE, FIRST_GROWABLE_PAGED_SPACE = OLD_SPACE, LAST_GROWABLE_PAGED_SPACE = MAP_SPACE }; @@ -1628,6 +1627,7 @@ enum class LoadSensitivity { V(TrapRethrowNull) \ V(TrapNullDereference) \ V(TrapIllegalCast) \ + V(TrapWasmJSFunction) \ V(TrapArrayOutOfBounds) enum KeyedAccessLoadMode { diff --git a/deps/v8/src/common/message-template.h b/deps/v8/src/common/message-template.h index c4edee49212489..b7bbc6da84ca03 100644 --- a/deps/v8/src/common/message-template.h +++ b/deps/v8/src/common/message-template.h @@ -318,6 +318,7 @@ namespace internal { T(BigIntDivZero, "Division by zero") \ T(BigIntNegativeExponent, "Exponent must be positive") \ T(BigIntTooBig, "Maximum BigInt size exceeded") \ + T(CantSetOptionXWhenYIsUsed, "Can't set option % when % is used") \ T(DateRange, "Provided date is not in valid range.") \ T(ExpectedLocation, \ "Expected letters optionally connected with underscores or hyphens for " \ @@ -562,6 +563,7 @@ namespace internal { T(WasmTrapNullDereference, "dereferencing a null pointer") \ T(WasmTrapIllegalCast, "illegal cast") \ T(WasmTrapArrayOutOfBounds, "array element access out of bounds") \ + T(WasmTrapWasmJSFunction, "cannot call WebAssembly.Function with call_ref") \ T(WasmExceptionError, "wasm exception") \ /* Asm.js validation related */ \ T(AsmJsInvalid, "Invalid asm.js: %") \ diff --git a/deps/v8/src/compiler-dispatcher/optimizing-compile-dispatcher.cc b/deps/v8/src/compiler-dispatcher/optimizing-compile-dispatcher.cc index 6848ca20607c59..528a9babe33041 100644 --- a/deps/v8/src/compiler-dispatcher/optimizing-compile-dispatcher.cc +++ b/deps/v8/src/compiler-dispatcher/optimizing-compile-dispatcher.cc @@ -214,7 +214,7 @@ void OptimizingCompileDispatcher::InstallOptimizedFunctions() { } OptimizedCompilationInfo* info = job->compilation_info(); Handle function(*info->closure(), isolate_); - if (function->HasAvailableOptimizedCode()) { + if (function->HasAvailableCodeKind(info->code_kind())) { if (FLAG_trace_concurrent_recompilation) { PrintF(" ** Aborting compilation for "); function->ShortPrint(); diff --git a/deps/v8/src/compiler/access-builder.cc b/deps/v8/src/compiler/access-builder.cc index 1b3b2752b67a36..f9d15264e65a68 100644 --- a/deps/v8/src/compiler/access-builder.cc +++ b/deps/v8/src/compiler/access-builder.cc @@ -17,7 +17,7 @@ #include "src/objects/objects-inl.h" #include "src/objects/ordered-hash-table.h" #include "src/objects/source-text-module.h" -#include "torque-generated/exported-class-definitions-tq.h" +#include "torque-generated/exported-class-definitions.h" namespace v8 { namespace internal { @@ -870,6 +870,15 @@ FieldAccess AccessBuilder::ForFeedbackVectorSlot(int index) { return access; } +// static +FieldAccess AccessBuilder::ForWeakFixedArraySlot(int index) { + int offset = WeakFixedArray::OffsetOfElementAt(index); + FieldAccess access = {kTaggedBase, offset, + Handle(), MaybeHandle(), + Type::Any(), MachineType::AnyTagged(), + kFullWriteBarrier}; + return access; +} // static FieldAccess AccessBuilder::ForCellValue() { FieldAccess access = {kTaggedBase, Cell::kValueOffset, @@ -1239,6 +1248,16 @@ FieldAccess AccessBuilder::ForFeedbackVectorClosureFeedbackCellArray() { return access; } +// static +FieldAccess AccessBuilder::ForFeedbackVectorOptimizedCodeWeakOrSmi() { + FieldAccess access = { + kTaggedBase, FeedbackVector::kOptimizedCodeWeakOrSmiOffset, + Handle(), MaybeHandle(), + Type::Any(), MachineType::AnyTagged(), + kFullWriteBarrier}; + return access; +} + } // namespace compiler } // namespace internal } // namespace v8 diff --git a/deps/v8/src/compiler/access-builder.h b/deps/v8/src/compiler/access-builder.h index 52c1261ff0e756..af5882988df6e3 100644 --- a/deps/v8/src/compiler/access-builder.h +++ b/deps/v8/src/compiler/access-builder.h @@ -293,6 +293,7 @@ class V8_EXPORT_PRIVATE AccessBuilder final // Provides access to WeakFixedArray elements. static ElementAccess ForWeakFixedArrayElement(); + static FieldAccess ForWeakFixedArraySlot(int index); // Provides access to FixedArray elements. static ElementAccess ForFixedArrayElement(); @@ -344,6 +345,7 @@ class V8_EXPORT_PRIVATE AccessBuilder final // Provides access to a FeedbackVector fields. static FieldAccess ForFeedbackVectorClosureFeedbackCellArray(); + static FieldAccess ForFeedbackVectorOptimizedCodeWeakOrSmi(); private: DISALLOW_IMPLICIT_CONSTRUCTORS(AccessBuilder); diff --git a/deps/v8/src/compiler/access-info.cc b/deps/v8/src/compiler/access-info.cc index 4fb5ebd69cf307..046927e9430e89 100644 --- a/deps/v8/src/compiler/access-info.cc +++ b/deps/v8/src/compiler/access-info.cc @@ -40,6 +40,19 @@ bool CanInlinePropertyAccess(Handle map) { !map->is_access_check_needed(); } +#ifdef DEBUG +bool HasFieldRepresentationDependenciesOnMap( + ZoneVector& dependencies, + Handle const& field_owner_map) { + for (auto dep : dependencies) { + if (dep->IsFieldRepresentationDependencyOnMap(field_owner_map)) { + return true; + } + } + return false; +} +#endif + } // namespace @@ -84,6 +97,9 @@ PropertyAccessInfo PropertyAccessInfo::DataField( FieldIndex field_index, Representation field_representation, Type field_type, Handle field_owner_map, MaybeHandle field_map, MaybeHandle holder, MaybeHandle transition_map) { + DCHECK_IMPLIES( + field_representation.IsDouble(), + HasFieldRepresentationDependenciesOnMap(dependencies, field_owner_map)); return PropertyAccessInfo(kDataField, holder, transition_map, field_index, field_representation, field_type, field_owner_map, field_map, {{receiver_map}, zone}, diff --git a/deps/v8/src/compiler/allocation-builder-inl.h b/deps/v8/src/compiler/allocation-builder-inl.h index 2b6109f49e27a3..8a9d74e07138a2 100644 --- a/deps/v8/src/compiler/allocation-builder-inl.h +++ b/deps/v8/src/compiler/allocation-builder-inl.h @@ -8,8 +8,8 @@ #include "src/compiler/access-builder.h" #include "src/compiler/allocation-builder.h" #include "src/objects/map-inl.h" -#include "torque-generated/exported-class-definitions-tq-inl.h" -#include "torque-generated/exported-class-definitions-tq.h" +#include "torque-generated/exported-class-definitions-inl.h" +#include "torque-generated/exported-class-definitions.h" namespace v8 { namespace internal { diff --git a/deps/v8/src/compiler/backend/arm/code-generator-arm.cc b/deps/v8/src/compiler/backend/arm/code-generator-arm.cc index b01297e03aaa1a..2c7e85623929ba 100644 --- a/deps/v8/src/compiler/backend/arm/code-generator-arm.cc +++ b/deps/v8/src/compiler/backend/arm/code-generator-arm.cc @@ -2026,7 +2026,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( Simd128Register rhs = i.InputSimd128Register(1); DCHECK_EQ(dst, lhs); - // Move rhs only when rhs is strictly greater (mi). + // Move rhs only when rhs is strictly lesser (mi). __ VFPCompareAndSetFlags(rhs.low(), lhs.low()); __ vmov(dst.low(), rhs.low(), mi); __ VFPCompareAndSetFlags(rhs.high(), lhs.high()); @@ -2039,7 +2039,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( Simd128Register rhs = i.InputSimd128Register(1); DCHECK_EQ(dst, lhs); - // Move rhs only when rhs is strictly greater (mi). + // Move rhs only when rhs is strictly greater (gt). __ VFPCompareAndSetFlags(rhs.low(), lhs.low()); __ vmov(dst.low(), rhs.low(), gt); __ VFPCompareAndSetFlags(rhs.high(), lhs.high()); @@ -2150,7 +2150,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( case kArmI64x2Neg: { Simd128Register dst = i.OutputSimd128Register(); __ vmov(dst, uint64_t{0}); - __ vqsub(NeonS64, dst, dst, i.InputSimd128Register(0)); + __ vsub(Neon64, dst, dst, i.InputSimd128Register(0)); break; } case kArmI64x2Shl: { @@ -3097,7 +3097,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( i.InputSimd128Register(1), i.InputInt4(2)); break; } - case kArmS8x16Swizzle: { + case kArmI8x16Swizzle: { Simd128Register dst = i.OutputSimd128Register(), tbl = i.InputSimd128Register(0), src = i.InputSimd128Register(1); @@ -3106,7 +3106,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( __ vtbl(dst.high(), table, src.high()); break; } - case kArmS8x16Shuffle: { + case kArmI8x16Shuffle: { Simd128Register dst = i.OutputSimd128Register(), src0 = i.InputSimd128Register(0), src1 = i.InputSimd128Register(1); @@ -3648,9 +3648,6 @@ void CodeGenerator::AssembleConstructFrame() { } } else if (call_descriptor->IsJSFunctionCall()) { __ Prologue(); - if (call_descriptor->PushArgumentCount()) { - __ Push(kJavaScriptCallArgCountRegister); - } } else { __ StubPrologue(info()->GetOutputStackFrameType()); if (call_descriptor->IsWasmFunctionCall()) { diff --git a/deps/v8/src/compiler/backend/arm/instruction-codes-arm.h b/deps/v8/src/compiler/backend/arm/instruction-codes-arm.h index 64707cb6124837..b3ee561e279177 100644 --- a/deps/v8/src/compiler/backend/arm/instruction-codes-arm.h +++ b/deps/v8/src/compiler/backend/arm/instruction-codes-arm.h @@ -307,8 +307,8 @@ namespace compiler { V(ArmS8x16TransposeLeft) \ V(ArmS8x16TransposeRight) \ V(ArmS8x16Concat) \ - V(ArmS8x16Swizzle) \ - V(ArmS8x16Shuffle) \ + V(ArmI8x16Swizzle) \ + V(ArmI8x16Shuffle) \ V(ArmS32x2Reverse) \ V(ArmS16x4Reverse) \ V(ArmS16x2Reverse) \ diff --git a/deps/v8/src/compiler/backend/arm/instruction-scheduler-arm.cc b/deps/v8/src/compiler/backend/arm/instruction-scheduler-arm.cc index aa9fa9e17bc8b7..6459d22a117aa2 100644 --- a/deps/v8/src/compiler/backend/arm/instruction-scheduler-arm.cc +++ b/deps/v8/src/compiler/backend/arm/instruction-scheduler-arm.cc @@ -287,8 +287,8 @@ int InstructionScheduler::GetTargetInstructionFlags( case kArmS8x16TransposeLeft: case kArmS8x16TransposeRight: case kArmS8x16Concat: - case kArmS8x16Swizzle: - case kArmS8x16Shuffle: + case kArmI8x16Swizzle: + case kArmI8x16Shuffle: case kArmS32x2Reverse: case kArmS16x4Reverse: case kArmS16x2Reverse: diff --git a/deps/v8/src/compiler/backend/arm/instruction-selector-arm.cc b/deps/v8/src/compiler/backend/arm/instruction-selector-arm.cc index c53c8f372e64a6..e868a1a47ae6b2 100644 --- a/deps/v8/src/compiler/backend/arm/instruction-selector-arm.cc +++ b/deps/v8/src/compiler/backend/arm/instruction-selector-arm.cc @@ -2870,7 +2870,7 @@ void ArrangeShuffleTable(ArmOperandGenerator* g, Node* input0, Node* input1, } // namespace -void InstructionSelector::VisitS8x16Shuffle(Node* node) { +void InstructionSelector::VisitI8x16Shuffle(Node* node) { uint8_t shuffle[kSimd128Size]; bool is_swizzle; CanonicalizeShuffle(node, shuffle, &is_swizzle); @@ -2923,18 +2923,18 @@ void InstructionSelector::VisitS8x16Shuffle(Node* node) { // Code generator uses vtbl, arrange sources to form a valid lookup table. InstructionOperand src0, src1; ArrangeShuffleTable(&g, input0, input1, &src0, &src1); - Emit(kArmS8x16Shuffle, g.DefineAsRegister(node), src0, src1, + Emit(kArmI8x16Shuffle, g.DefineAsRegister(node), src0, src1, g.UseImmediate(wasm::SimdShuffle::Pack4Lanes(shuffle)), g.UseImmediate(wasm::SimdShuffle::Pack4Lanes(shuffle + 4)), g.UseImmediate(wasm::SimdShuffle::Pack4Lanes(shuffle + 8)), g.UseImmediate(wasm::SimdShuffle::Pack4Lanes(shuffle + 12))); } -void InstructionSelector::VisitS8x16Swizzle(Node* node) { +void InstructionSelector::VisitI8x16Swizzle(Node* node) { ArmOperandGenerator g(this); // We don't want input 0 (the table) to be the same as output, since we will // modify output twice (low and high), and need to keep the table the same. - Emit(kArmS8x16Swizzle, g.DefineAsRegister(node), + Emit(kArmI8x16Swizzle, g.DefineAsRegister(node), g.UseUniqueRegister(node->InputAt(0)), g.UseRegister(node->InputAt(1))); } diff --git a/deps/v8/src/compiler/backend/arm64/code-generator-arm64.cc b/deps/v8/src/compiler/backend/arm64/code-generator-arm64.cc index cee865127640c7..65245024087c60 100644 --- a/deps/v8/src/compiler/backend/arm64/code-generator-arm64.cc +++ b/deps/v8/src/compiler/backend/arm64/code-generator-arm64.cc @@ -2551,18 +2551,18 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( i.InputSimd128Register(1).V16B(), i.InputInt4(2)); break; } - case kArm64S8x16Swizzle: { + case kArm64I8x16Swizzle: { __ Tbl(i.OutputSimd128Register().V16B(), i.InputSimd128Register(0).V16B(), i.InputSimd128Register(1).V16B()); break; } - case kArm64S8x16Shuffle: { + case kArm64I8x16Shuffle: { Simd128Register dst = i.OutputSimd128Register().V16B(), src0 = i.InputSimd128Register(0).V16B(), src1 = i.InputSimd128Register(1).V16B(); // Unary shuffle table is in src0, binary shuffle table is in src0, src1, // which must be consecutive. - int64_t mask = 0; + uint32_t mask = 0; if (src0 == src1) { mask = 0x0F0F0F0F; } else { @@ -2601,20 +2601,9 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( __ Add(i.OutputRegister32(), i.OutputRegister32(), 1); break; } - case kArm64S8x16LoadSplat: { - __ ld1r(i.OutputSimd128Register().V16B(), i.MemoryOperand(0)); - break; - } - case kArm64S16x8LoadSplat: { - __ ld1r(i.OutputSimd128Register().V8H(), i.MemoryOperand(0)); - break; - } - case kArm64S32x4LoadSplat: { - __ ld1r(i.OutputSimd128Register().V4S(), i.MemoryOperand(0)); - break; - } - case kArm64S64x2LoadSplat: { - __ ld1r(i.OutputSimd128Register().V2D(), i.MemoryOperand(0)); + case kArm64LoadSplat: { + VectorFormat f = VectorFormatFillQ(MiscField::decode(opcode)); + __ ld1r(i.OutputSimd128Register().Format(f), i.MemoryOperand(0)); break; } case kArm64I16x8Load8x8S: { @@ -2647,6 +2636,14 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( __ Uxtl(i.OutputSimd128Register().V2D(), i.OutputSimd128Register().V2S()); break; } + case kArm64S128LoadMem32Zero: { + __ Ldr(i.OutputSimd128Register().S(), i.MemoryOperand(0)); + break; + } + case kArm64S128LoadMem64Zero: { + __ Ldr(i.OutputSimd128Register().D(), i.MemoryOperand(0)); + break; + } #define SIMD_REDUCE_OP_CASE(Op, Instr, format, FORMAT) \ case Op: { \ UseScratchRegisterScope scope(tasm()); \ @@ -2657,13 +2654,10 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( __ Cset(i.OutputRegister32(), ne); \ break; \ } - // for AnyTrue, the format does not matter, umaxv does not support 2D - SIMD_REDUCE_OP_CASE(kArm64V64x2AnyTrue, Umaxv, kFormatS, 4S); - SIMD_REDUCE_OP_CASE(kArm64V32x4AnyTrue, Umaxv, kFormatS, 4S); + // For AnyTrue, the format does not matter. + SIMD_REDUCE_OP_CASE(kArm64V128AnyTrue, Umaxv, kFormatS, 4S); SIMD_REDUCE_OP_CASE(kArm64V32x4AllTrue, Uminv, kFormatS, 4S); - SIMD_REDUCE_OP_CASE(kArm64V16x8AnyTrue, Umaxv, kFormatH, 8H); SIMD_REDUCE_OP_CASE(kArm64V16x8AllTrue, Uminv, kFormatH, 8H); - SIMD_REDUCE_OP_CASE(kArm64V8x16AnyTrue, Umaxv, kFormatB, 16B); SIMD_REDUCE_OP_CASE(kArm64V8x16AllTrue, Uminv, kFormatB, 16B); } return kSuccess; @@ -2911,7 +2905,12 @@ void CodeGenerator::AssembleConstructFrame() { if (frame_access_state()->has_frame()) { // Link the frame if (call_descriptor->IsJSFunctionCall()) { + STATIC_ASSERT(InterpreterFrameConstants::kFixedFrameSize % 16 == 8); + DCHECK_EQ(required_slots % 2, 1); __ Prologue(); + // Update required_slots count since we have just claimed one extra slot. + STATIC_ASSERT(TurboAssembler::kExtraSlotClaimedByPrologue == 1); + required_slots -= TurboAssembler::kExtraSlotClaimedByPrologue; } else { __ Push(lr, fp); __ Mov(fp, sp); @@ -2929,7 +2928,13 @@ void CodeGenerator::AssembleConstructFrame() { // to allocate the remaining stack slots. if (FLAG_code_comments) __ RecordComment("-- OSR entrypoint --"); osr_pc_offset_ = __ pc_offset(); - required_slots -= osr_helper()->UnoptimizedFrameSlots(); + size_t unoptimized_frame_slots = osr_helper()->UnoptimizedFrameSlots(); + DCHECK(call_descriptor->IsJSFunctionCall()); + DCHECK_EQ(unoptimized_frame_slots % 2, 1); + // One unoptimized frame slot has already been claimed when the actual + // arguments count was pushed. + required_slots -= + unoptimized_frame_slots - TurboAssembler::kExtraSlotClaimedByPrologue; ResetSpeculationPoison(); } @@ -2984,13 +2989,7 @@ void CodeGenerator::AssembleConstructFrame() { // recording their argument count. switch (call_descriptor->kind()) { case CallDescriptor::kCallJSFunction: - if (call_descriptor->PushArgumentCount()) { - __ Claim(required_slots + 1); // Claim extra slot for argc. - __ Str(kJavaScriptCallArgCountRegister, - MemOperand(fp, OptimizedBuiltinFrameConstants::kArgCOffset)); - } else { - __ Claim(required_slots); - } + __ Claim(required_slots); break; case CallDescriptor::kCallCodeObject: { UseScratchRegisterScope temps(tasm()); diff --git a/deps/v8/src/compiler/backend/arm64/instruction-codes-arm64.h b/deps/v8/src/compiler/backend/arm64/instruction-codes-arm64.h index e74819d9d6b255..7f84a3504bfe2e 100644 --- a/deps/v8/src/compiler/backend/arm64/instruction-codes-arm64.h +++ b/deps/v8/src/compiler/backend/arm64/instruction-codes-arm64.h @@ -367,26 +367,20 @@ namespace compiler { V(Arm64S8x16TransposeLeft) \ V(Arm64S8x16TransposeRight) \ V(Arm64S8x16Concat) \ - V(Arm64S8x16Swizzle) \ - V(Arm64S8x16Shuffle) \ + V(Arm64I8x16Swizzle) \ + V(Arm64I8x16Shuffle) \ V(Arm64S32x2Reverse) \ V(Arm64S16x4Reverse) \ V(Arm64S16x2Reverse) \ V(Arm64S8x8Reverse) \ V(Arm64S8x4Reverse) \ V(Arm64S8x2Reverse) \ - V(Arm64V64x2AnyTrue) \ + V(Arm64V128AnyTrue) \ V(Arm64V64x2AllTrue) \ - V(Arm64V32x4AnyTrue) \ V(Arm64V32x4AllTrue) \ - V(Arm64V16x8AnyTrue) \ V(Arm64V16x8AllTrue) \ - V(Arm64V8x16AnyTrue) \ V(Arm64V8x16AllTrue) \ - V(Arm64S8x16LoadSplat) \ - V(Arm64S16x8LoadSplat) \ - V(Arm64S32x4LoadSplat) \ - V(Arm64S64x2LoadSplat) \ + V(Arm64LoadSplat) \ V(Arm64I16x8Load8x8S) \ V(Arm64I16x8Load8x8U) \ V(Arm64I32x4Load16x4S) \ @@ -428,7 +422,11 @@ namespace compiler { V(Arm64Word64AtomicCompareExchangeUint8) \ V(Arm64Word64AtomicCompareExchangeUint16) \ V(Arm64Word64AtomicCompareExchangeUint32) \ - V(Arm64Word64AtomicCompareExchangeUint64) + V(Arm64Word64AtomicCompareExchangeUint64) \ + V(Arm64S128LoadMem32Zero) \ + V(Arm64S128LoadMem64Zero) +// TODO(v8:10930) Adding new codes before these atomic instructions causes a +// mksnapshot error. // Addressing modes represent the "shape" of inputs to an instruction. // Many instructions support multiple addressing modes. Addressing modes diff --git a/deps/v8/src/compiler/backend/arm64/instruction-scheduler-arm64.cc b/deps/v8/src/compiler/backend/arm64/instruction-scheduler-arm64.cc index 5d75c5147e2313..6c572d2a1cbb00 100644 --- a/deps/v8/src/compiler/backend/arm64/instruction-scheduler-arm64.cc +++ b/deps/v8/src/compiler/backend/arm64/instruction-scheduler-arm64.cc @@ -337,21 +337,18 @@ int InstructionScheduler::GetTargetInstructionFlags( case kArm64S8x16TransposeLeft: case kArm64S8x16TransposeRight: case kArm64S8x16Concat: - case kArm64S8x16Swizzle: - case kArm64S8x16Shuffle: + case kArm64I8x16Swizzle: + case kArm64I8x16Shuffle: case kArm64S32x2Reverse: case kArm64S16x4Reverse: case kArm64S16x2Reverse: case kArm64S8x8Reverse: case kArm64S8x4Reverse: case kArm64S8x2Reverse: - case kArm64V64x2AnyTrue: + case kArm64V128AnyTrue: case kArm64V64x2AllTrue: - case kArm64V32x4AnyTrue: case kArm64V32x4AllTrue: - case kArm64V16x8AnyTrue: case kArm64V16x8AllTrue: - case kArm64V8x16AnyTrue: case kArm64V8x16AllTrue: case kArm64TestAndBranch32: case kArm64TestAndBranch: @@ -373,16 +370,15 @@ int InstructionScheduler::GetTargetInstructionFlags( case kArm64LdrDecompressTaggedPointer: case kArm64LdrDecompressAnyTagged: case kArm64Peek: - case kArm64S8x16LoadSplat: - case kArm64S16x8LoadSplat: - case kArm64S32x4LoadSplat: - case kArm64S64x2LoadSplat: + case kArm64LoadSplat: case kArm64I16x8Load8x8S: case kArm64I16x8Load8x8U: case kArm64I32x4Load16x4S: case kArm64I32x4Load16x4U: case kArm64I64x2Load32x2S: case kArm64I64x2Load32x2U: + case kArm64S128LoadMem32Zero: + case kArm64S128LoadMem64Zero: return kIsLoadOperation; case kArm64Claim: diff --git a/deps/v8/src/compiler/backend/arm64/instruction-selector-arm64.cc b/deps/v8/src/compiler/backend/arm64/instruction-selector-arm64.cc index 5f19a6bb7cbb5a..fac7f9c1d1146b 100644 --- a/deps/v8/src/compiler/backend/arm64/instruction-selector-arm64.cc +++ b/deps/v8/src/compiler/backend/arm64/instruction-selector-arm64.cc @@ -607,19 +607,23 @@ void InstructionSelector::VisitLoadTransform(Node* node) { bool require_add = false; switch (params.transformation) { case LoadTransformation::kS8x16LoadSplat: - opcode = kArm64S8x16LoadSplat; + opcode = kArm64LoadSplat; + opcode |= MiscField::encode(8); require_add = true; break; case LoadTransformation::kS16x8LoadSplat: - opcode = kArm64S16x8LoadSplat; + opcode = kArm64LoadSplat; + opcode |= MiscField::encode(16); require_add = true; break; case LoadTransformation::kS32x4LoadSplat: - opcode = kArm64S32x4LoadSplat; + opcode = kArm64LoadSplat; + opcode |= MiscField::encode(32); require_add = true; break; case LoadTransformation::kS64x2LoadSplat: - opcode = kArm64S64x2LoadSplat; + opcode = kArm64LoadSplat; + opcode |= MiscField::encode(64); require_add = true; break; case LoadTransformation::kI16x8Load8x8S: @@ -640,6 +644,12 @@ void InstructionSelector::VisitLoadTransform(Node* node) { case LoadTransformation::kI64x2Load32x2U: opcode = kArm64I64x2Load32x2U; break; + case LoadTransformation::kS128LoadMem32Zero: + opcode = kArm64S128LoadMem32Zero; + break; + case LoadTransformation::kS128LoadMem64Zero: + opcode = kArm64S128LoadMem64Zero; + break; default: UNIMPLEMENTED(); } @@ -1397,7 +1407,7 @@ void InstructionSelector::VisitWord64Ror(Node* node) { V(Float64Max, kArm64Float64Max) \ V(Float32Min, kArm64Float32Min) \ V(Float64Min, kArm64Float64Min) \ - V(S8x16Swizzle, kArm64S8x16Swizzle) + V(I8x16Swizzle, kArm64I8x16Swizzle) #define RR_VISITOR(Name, opcode) \ void InstructionSelector::Visit##Name(Node* node) { \ @@ -1775,10 +1785,9 @@ void InstructionSelector::VisitChangeInt32ToInt64(Node* node) { VisitRR(this, kArm64Sxtw, node); } -void InstructionSelector::VisitChangeUint32ToUint64(Node* node) { - Arm64OperandGenerator g(this); - Node* value = node->InputAt(0); - switch (value->opcode()) { +bool InstructionSelector::ZeroExtendsWord32ToWord64NoPhis(Node* node) { + DCHECK_NE(node->opcode(), IrOpcode::kPhi); + switch (node->opcode()) { case IrOpcode::kWord32And: case IrOpcode::kWord32Or: case IrOpcode::kWord32Xor: @@ -1805,26 +1814,31 @@ void InstructionSelector::VisitChangeUint32ToUint64(Node* node) { // 32-bit operations will write their result in a W register (implicitly // clearing the top 32-bit of the corresponding X register) so the // zero-extension is a no-op. - EmitIdentity(node); - return; + return true; } case IrOpcode::kLoad: { // As for the operations above, a 32-bit load will implicitly clear the // top 32 bits of the destination register. - LoadRepresentation load_rep = LoadRepresentationOf(value->op()); + LoadRepresentation load_rep = LoadRepresentationOf(node->op()); switch (load_rep.representation()) { case MachineRepresentation::kWord8: case MachineRepresentation::kWord16: case MachineRepresentation::kWord32: - EmitIdentity(node); - return; + return true; default: - break; + return false; } - break; } default: - break; + return false; + } +} + +void InstructionSelector::VisitChangeUint32ToUint64(Node* node) { + Arm64OperandGenerator g(this); + Node* value = node->InputAt(0); + if (ZeroExtendsWord32ToWord64(value)) { + return EmitIdentity(node); } Emit(kArm64Mov32, g.DefineAsRegister(node), g.UseRegister(value)); } @@ -3225,13 +3239,13 @@ void InstructionSelector::VisitInt64AbsWithOverflow(Node* node) { V(I8x16Neg, kArm64I8x16Neg) \ V(I8x16Abs, kArm64I8x16Abs) \ V(S128Not, kArm64S128Not) \ - V(V64x2AnyTrue, kArm64V64x2AnyTrue) \ + V(V64x2AnyTrue, kArm64V128AnyTrue) \ V(V64x2AllTrue, kArm64V64x2AllTrue) \ - V(V32x4AnyTrue, kArm64V32x4AnyTrue) \ + V(V32x4AnyTrue, kArm64V128AnyTrue) \ V(V32x4AllTrue, kArm64V32x4AllTrue) \ - V(V16x8AnyTrue, kArm64V16x8AnyTrue) \ + V(V16x8AnyTrue, kArm64V128AnyTrue) \ V(V16x8AllTrue, kArm64V16x8AllTrue) \ - V(V8x16AnyTrue, kArm64V8x16AnyTrue) \ + V(V8x16AnyTrue, kArm64V128AnyTrue) \ V(V8x16AllTrue, kArm64V8x16AllTrue) #define SIMD_SHIFT_OP_LIST(V) \ @@ -3597,7 +3611,7 @@ void ArrangeShuffleTable(Arm64OperandGenerator* g, Node* input0, Node* input1, } // namespace -void InstructionSelector::VisitS8x16Shuffle(Node* node) { +void InstructionSelector::VisitI8x16Shuffle(Node* node) { uint8_t shuffle[kSimd128Size]; bool is_swizzle; CanonicalizeShuffle(node, shuffle, &is_swizzle); @@ -3647,7 +3661,7 @@ void InstructionSelector::VisitS8x16Shuffle(Node* node) { // Code generator uses vtbl, arrange sources to form a valid lookup table. InstructionOperand src0, src1; ArrangeShuffleTable(&g, input0, input1, &src0, &src1); - Emit(kArm64S8x16Shuffle, g.DefineAsRegister(node), src0, src1, + Emit(kArm64I8x16Shuffle, g.DefineAsRegister(node), src0, src1, g.UseImmediate(wasm::SimdShuffle::Pack4Lanes(shuffle)), g.UseImmediate(wasm::SimdShuffle::Pack4Lanes(shuffle + 4)), g.UseImmediate(wasm::SimdShuffle::Pack4Lanes(shuffle + 8)), diff --git a/deps/v8/src/compiler/backend/code-generator-impl.h b/deps/v8/src/compiler/backend/code-generator-impl.h index e335135240e579..88f82fe930bdfb 100644 --- a/deps/v8/src/compiler/backend/code-generator-impl.h +++ b/deps/v8/src/compiler/backend/code-generator-impl.h @@ -259,6 +259,12 @@ class OutOfLineCode : public ZoneObject { inline bool HasCallDescriptorFlag(Instruction* instr, CallDescriptor::Flag flag) { + STATIC_ASSERT(CallDescriptor::kFlagsBitsEncodedInInstructionCode == 10); +#ifdef DEBUG + static constexpr int kInstructionCodeFlagsMask = + ((1 << CallDescriptor::kFlagsBitsEncodedInInstructionCode) - 1); + DCHECK_EQ(static_cast(flag) & kInstructionCodeFlagsMask, flag); +#endif return MiscField::decode(instr->opcode()) & flag; } diff --git a/deps/v8/src/compiler/backend/code-generator.cc b/deps/v8/src/compiler/backend/code-generator.cc index 6e740b18f858d5..33a80f52d0d6b5 100644 --- a/deps/v8/src/compiler/backend/code-generator.cc +++ b/deps/v8/src/compiler/backend/code-generator.cc @@ -613,8 +613,8 @@ void CodeGenerator::GetPushCompatibleMoves(Instruction* instr, // then the full gap resolver must be used since optimization with // pushes don't participate in the parallel move and might clobber // values needed for the gap resolve. - if (source.IsStackSlot() && LocationOperand::cast(source).index() >= - first_push_compatible_index) { + if (source.IsAnyStackSlot() && LocationOperand::cast(source).index() >= + first_push_compatible_index) { pushes->clear(); return; } @@ -973,15 +973,13 @@ Label* CodeGenerator::AddJumpTable(Label** targets, size_t target_count) { } void CodeGenerator::RecordCallPosition(Instruction* instr) { - CallDescriptor::Flags flags(MiscField::decode(instr->opcode())); - - bool needs_frame_state = (flags & CallDescriptor::kNeedsFrameState); - + const bool needs_frame_state = + HasCallDescriptorFlag(instr, CallDescriptor::kNeedsFrameState); RecordSafepoint(instr->reference_map(), needs_frame_state ? Safepoint::kLazyDeopt : Safepoint::kNoLazyDeopt); - if (flags & CallDescriptor::kHasExceptionHandler) { + if (HasCallDescriptorFlag(instr, CallDescriptor::kHasExceptionHandler)) { InstructionOperandConverter i(this, instr); RpoNumber handler_rpo = i.InputRpo(instr->InputCount() - 1); DCHECK(instructions()->InstructionBlockAt(handler_rpo)->IsHandler()); diff --git a/deps/v8/src/compiler/backend/code-generator.h b/deps/v8/src/compiler/backend/code-generator.h index 74ec66f8d8cb93..26d03f129ac10a 100644 --- a/deps/v8/src/compiler/backend/code-generator.h +++ b/deps/v8/src/compiler/backend/code-generator.h @@ -310,11 +310,11 @@ class V8_EXPORT_PRIVATE CodeGenerator final : public GapResolver::Assembler { static bool IsValidPush(InstructionOperand source, PushTypeFlags push_type); - // Generate a list moves from an instruction that are candidates to be turned - // into push instructions on platforms that support them. In general, the list - // of push candidates are moves to a set of contiguous destination + // Generate a list of moves from an instruction that are candidates to be + // turned into push instructions on platforms that support them. In general, + // the list of push candidates are moves to a set of contiguous destination // InstructionOperand locations on the stack that don't clobber values that - // are needed for resolve the gap or use values generated by the gap, + // are needed to resolve the gap or use values generated by the gap, // i.e. moves that can be hoisted together before the actual gap and assembled // together. static void GetPushCompatibleMoves(Instruction* instr, diff --git a/deps/v8/src/compiler/backend/ia32/code-generator-ia32.cc b/deps/v8/src/compiler/backend/ia32/code-generator-ia32.cc index 2878d6e56bac25..077324a31f76e0 100644 --- a/deps/v8/src/compiler/backend/ia32/code-generator-ia32.cc +++ b/deps/v8/src/compiler/backend/ia32/code-generator-ia32.cc @@ -2214,9 +2214,11 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( __ psrld(kScratchDoubleReg, 1); __ andps(dst, kScratchDoubleReg); } else { + // TODO(zhin) Improve codegen for this case. __ pcmpeqd(dst, dst); + __ movups(kScratchDoubleReg, src); __ psrld(dst, 1); - __ andps(dst, src); + __ andps(dst, kScratchDoubleReg); } break; } @@ -2236,9 +2238,11 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( __ pslld(kScratchDoubleReg, 31); __ xorps(dst, kScratchDoubleReg); } else { + // TODO(zhin) Improve codegen for this case. __ pcmpeqd(dst, dst); + __ movups(kScratchDoubleReg, src); __ pslld(dst, 31); - __ xorps(dst, src); + __ xorps(dst, kScratchDoubleReg); } break; } @@ -2251,7 +2255,9 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( break; } case kSSEF32x4Sqrt: { - __ sqrtps(i.OutputSimd128Register(), i.InputOperand(0)); + // TODO(zhin) Improve codegen for this case. + __ movups(kScratchDoubleReg, i.InputOperand(0)); + __ sqrtps(i.OutputSimd128Register(), kScratchDoubleReg); break; } case kAVXF32x4Sqrt: { @@ -2348,7 +2354,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( Operand src1 = i.InputOperand(1); // See comment above for correction of minps. __ movups(kScratchDoubleReg, src1); - __ vminps(kScratchDoubleReg, kScratchDoubleReg, dst); + __ vminps(kScratchDoubleReg, kScratchDoubleReg, src0); __ vminps(dst, src0, src1); __ vorps(dst, dst, kScratchDoubleReg); __ vcmpneqps(kScratchDoubleReg, dst, dst); @@ -2381,11 +2387,12 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( case kAVXF32x4Max: { CpuFeatureScope avx_scope(tasm(), AVX); XMMRegister dst = i.OutputSimd128Register(); + XMMRegister src0 = i.InputSimd128Register(0); Operand src1 = i.InputOperand(1); // See comment above for correction of maxps. __ vmovups(kScratchDoubleReg, src1); - __ vmaxps(kScratchDoubleReg, kScratchDoubleReg, dst); - __ vmaxps(dst, dst, src1); + __ vmaxps(kScratchDoubleReg, kScratchDoubleReg, src0); + __ vmaxps(dst, src0, src1); __ vxorps(dst, dst, kScratchDoubleReg); __ vorps(kScratchDoubleReg, kScratchDoubleReg, dst); __ vsubps(kScratchDoubleReg, kScratchDoubleReg, dst); @@ -3643,8 +3650,10 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( __ pcmpeqd(kScratchDoubleReg, kScratchDoubleReg); __ pxor(dst, kScratchDoubleReg); } else { + // TODO(zhin) Improve codegen for this case. __ pcmpeqd(dst, dst); - __ pxor(dst, src); + __ movups(kScratchDoubleReg, src); + __ pxor(dst, kScratchDoubleReg); } break; } @@ -3715,7 +3724,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( __ Andnps(dst, src1); break; } - case kIA32S8x16Swizzle: { + case kIA32I8x16Swizzle: { DCHECK_EQ(i.OutputSimd128Register(), i.InputSimd128Register(0)); XMMRegister dst = i.OutputSimd128Register(); XMMRegister mask = i.TempSimd128Register(0); @@ -3728,7 +3737,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( __ Pshufb(dst, mask); break; } - case kIA32S8x16Shuffle: { + case kIA32I8x16Shuffle: { XMMRegister dst = i.OutputSimd128Register(); Operand src0 = i.InputOperand(0); Register tmp = i.TempRegister(0); @@ -4690,9 +4699,6 @@ void CodeGenerator::AssembleConstructFrame() { } } else if (call_descriptor->IsJSFunctionCall()) { __ Prologue(); - if (call_descriptor->PushArgumentCount()) { - __ push(kJavaScriptCallArgCountRegister); - } } else { __ StubPrologue(info()->GetOutputStackFrameType()); if (call_descriptor->IsWasmFunctionCall()) { @@ -4836,10 +4842,11 @@ void CodeGenerator::AssembleReturn(InstructionOperand* pop) { } else { Register pop_reg = g.ToRegister(pop); Register scratch_reg = pop_reg == ecx ? edx : ecx; - __ pop(scratch_reg); + __ PopReturnAddressTo(scratch_reg); __ lea(esp, Operand(esp, pop_reg, times_system_pointer_size, static_cast(pop_size))); - __ jmp(scratch_reg); + __ PushReturnAddressFrom(scratch_reg); + __ Ret(); } } diff --git a/deps/v8/src/compiler/backend/ia32/instruction-codes-ia32.h b/deps/v8/src/compiler/backend/ia32/instruction-codes-ia32.h index 8f9f4fcf1c00b5..eca9dc92278a2c 100644 --- a/deps/v8/src/compiler/backend/ia32/instruction-codes-ia32.h +++ b/deps/v8/src/compiler/backend/ia32/instruction-codes-ia32.h @@ -355,8 +355,8 @@ namespace compiler { V(SSES128Select) \ V(AVXS128Select) \ V(IA32S128AndNot) \ - V(IA32S8x16Swizzle) \ - V(IA32S8x16Shuffle) \ + V(IA32I8x16Swizzle) \ + V(IA32I8x16Shuffle) \ V(IA32S8x16LoadSplat) \ V(IA32S16x8LoadSplat) \ V(IA32S32x4LoadSplat) \ diff --git a/deps/v8/src/compiler/backend/ia32/instruction-scheduler-ia32.cc b/deps/v8/src/compiler/backend/ia32/instruction-scheduler-ia32.cc index 51a9a18e4416ea..24abd58c7fc027 100644 --- a/deps/v8/src/compiler/backend/ia32/instruction-scheduler-ia32.cc +++ b/deps/v8/src/compiler/backend/ia32/instruction-scheduler-ia32.cc @@ -336,8 +336,8 @@ int InstructionScheduler::GetTargetInstructionFlags( case kSSES128Select: case kAVXS128Select: case kIA32S128AndNot: - case kIA32S8x16Swizzle: - case kIA32S8x16Shuffle: + case kIA32I8x16Swizzle: + case kIA32I8x16Shuffle: case kIA32S32x4Swizzle: case kIA32S32x4Shuffle: case kIA32S16x8Blend: diff --git a/deps/v8/src/compiler/backend/ia32/instruction-selector-ia32.cc b/deps/v8/src/compiler/backend/ia32/instruction-selector-ia32.cc index b0556fd4efeccd..fec4053871bd14 100644 --- a/deps/v8/src/compiler/backend/ia32/instruction-selector-ia32.cc +++ b/deps/v8/src/compiler/backend/ia32/instruction-selector-ia32.cc @@ -2687,7 +2687,7 @@ bool TryMatchArchShuffle(const uint8_t* shuffle, const ShuffleEntry* table, } // namespace -void InstructionSelector::VisitS8x16Shuffle(Node* node) { +void InstructionSelector::VisitI8x16Shuffle(Node* node) { uint8_t shuffle[kSimd128Size]; bool is_swizzle; CanonicalizeShuffle(node, shuffle, &is_swizzle); @@ -2704,9 +2704,12 @@ void InstructionSelector::VisitS8x16Shuffle(Node* node) { // AVX and swizzles don't generally need DefineSameAsFirst to avoid a move. bool no_same_as_first = use_avx || is_swizzle; // We generally need UseRegister for input0, Use for input1. + // TODO(v8:9198): We don't have 16-byte alignment for SIMD operands yet, but + // we retain this logic (continue setting these in the various shuffle match + // clauses), but ignore it when selecting registers or slots. bool src0_needs_reg = true; bool src1_needs_reg = false; - ArchOpcode opcode = kIA32S8x16Shuffle; // general shuffle is the default + ArchOpcode opcode = kIA32I8x16Shuffle; // general shuffle is the default uint8_t offset; uint8_t shuffle32x4[4]; @@ -2794,7 +2797,7 @@ void InstructionSelector::VisitS8x16Shuffle(Node* node) { src0_needs_reg = true; imms[imm_count++] = index; } - if (opcode == kIA32S8x16Shuffle) { + if (opcode == kIA32I8x16Shuffle) { // Use same-as-first for general swizzle, but not shuffle. no_same_as_first = !is_swizzle; src0_needs_reg = !no_same_as_first; @@ -2810,16 +2813,18 @@ void InstructionSelector::VisitS8x16Shuffle(Node* node) { Node* input0 = node->InputAt(0); InstructionOperand dst = no_same_as_first ? g.DefineAsRegister(node) : g.DefineSameAsFirst(node); - InstructionOperand src0 = - src0_needs_reg ? g.UseRegister(input0) : g.Use(input0); + // TODO(v8:9198): Use src0_needs_reg when we have memory alignment for SIMD. + InstructionOperand src0 = g.UseRegister(input0); + USE(src0_needs_reg); int input_count = 0; InstructionOperand inputs[2 + kMaxImms + kMaxTemps]; inputs[input_count++] = src0; if (!is_swizzle) { Node* input1 = node->InputAt(1); - inputs[input_count++] = - src1_needs_reg ? g.UseRegister(input1) : g.Use(input1); + // TODO(v8:9198): Use src1_needs_reg when we have memory alignment for SIMD. + inputs[input_count++] = g.UseRegister(input1); + USE(src1_needs_reg); } for (int i = 0; i < imm_count; ++i) { inputs[input_count++] = g.UseImmediate(imms[i]); @@ -2827,10 +2832,10 @@ void InstructionSelector::VisitS8x16Shuffle(Node* node) { Emit(opcode, 1, &dst, input_count, inputs, temp_count, temps); } -void InstructionSelector::VisitS8x16Swizzle(Node* node) { +void InstructionSelector::VisitI8x16Swizzle(Node* node) { IA32OperandGenerator g(this); InstructionOperand temps[] = {g.TempSimd128Register()}; - Emit(kIA32S8x16Swizzle, g.DefineSameAsFirst(node), + Emit(kIA32I8x16Swizzle, g.DefineSameAsFirst(node), g.UseRegister(node->InputAt(0)), g.UseUniqueRegister(node->InputAt(1)), arraysize(temps), temps); } diff --git a/deps/v8/src/compiler/backend/instruction-codes.h b/deps/v8/src/compiler/backend/instruction-codes.h index 84d5d249b83487..8772a78df0ce3a 100644 --- a/deps/v8/src/compiler/backend/instruction-codes.h +++ b/deps/v8/src/compiler/backend/instruction-codes.h @@ -270,6 +270,8 @@ using InstructionCode = uint32_t; // continuation into a single InstructionCode which is stored as part of // the instruction. using ArchOpcodeField = base::BitField; +static_assert(ArchOpcodeField::is_valid(kLastArchOpcode), + "All opcodes must fit in the 9-bit ArchOpcodeField."); using AddressingModeField = base::BitField; using FlagsModeField = base::BitField; using FlagsConditionField = base::BitField; diff --git a/deps/v8/src/compiler/backend/instruction-selector.cc b/deps/v8/src/compiler/backend/instruction-selector.cc index d1594f9305a8c1..1c14832bbfeb56 100644 --- a/deps/v8/src/compiler/backend/instruction-selector.cc +++ b/deps/v8/src/compiler/backend/instruction-selector.cc @@ -62,7 +62,12 @@ InstructionSelector::InstructionSelector( trace_turbo_(trace_turbo), tick_counter_(tick_counter), max_unoptimized_frame_height_(max_unoptimized_frame_height), - max_pushed_argument_count_(max_pushed_argument_count) { + max_pushed_argument_count_(max_pushed_argument_count) +#if V8_TARGET_ARCH_64_BIT + , + phi_states_(node_count, Upper32BitsState::kNotYetChecked, zone) +#endif +{ DCHECK_EQ(*max_unoptimized_frame_height, 0); // Caller-initialized. instructions_.reserve(node_count); @@ -2214,10 +2219,10 @@ void InstructionSelector::VisitNode(Node* node) { return MarkAsSimd128(node), VisitS128Select(node); case IrOpcode::kS128AndNot: return MarkAsSimd128(node), VisitS128AndNot(node); - case IrOpcode::kS8x16Swizzle: - return MarkAsSimd128(node), VisitS8x16Swizzle(node); - case IrOpcode::kS8x16Shuffle: - return MarkAsSimd128(node), VisitS8x16Shuffle(node); + case IrOpcode::kI8x16Swizzle: + return MarkAsSimd128(node), VisitI8x16Swizzle(node); + case IrOpcode::kI8x16Shuffle: + return MarkAsSimd128(node), VisitI8x16Shuffle(node); case IrOpcode::kV64x2AnyTrue: return MarkAsWord32(node), VisitV64x2AnyTrue(node); case IrOpcode::kV64x2AllTrue: @@ -2681,39 +2686,6 @@ void InstructionSelector::VisitI64x2MinU(Node* node) { UNIMPLEMENTED(); } void InstructionSelector::VisitI64x2MaxU(Node* node) { UNIMPLEMENTED(); } #endif // !V8_TARGET_ARCH_X64 && !V8_TARGET_ARCH_S390X -#if !V8_TARGET_ARCH_ARM64 && !V8_TARGET_ARCH_ARM && !V8_TARGET_ARCH_IA32 && \ - !V8_TARGET_ARCH_X64 && !V8_TARGET_ARCH_S390X && !V8_TARGET_ARCH_MIPS && \ - !V8_TARGET_ARCH_MIPS64 -// TODO(v8:10308) Bitmask operations are in prototype now, we can remove these -// guards when they go into the proposal. -void InstructionSelector::VisitI8x16BitMask(Node* node) { UNIMPLEMENTED(); } -void InstructionSelector::VisitI16x8BitMask(Node* node) { UNIMPLEMENTED(); } -void InstructionSelector::VisitI32x4BitMask(Node* node) { UNIMPLEMENTED(); } -// TODO(v8:10501) Prototyping pmin and pmax instructions. -void InstructionSelector::VisitF32x4Pmin(Node* node) { UNIMPLEMENTED(); } -void InstructionSelector::VisitF32x4Pmax(Node* node) { UNIMPLEMENTED(); } -void InstructionSelector::VisitF64x2Pmin(Node* node) { UNIMPLEMENTED(); } -void InstructionSelector::VisitF64x2Pmax(Node* node) { UNIMPLEMENTED(); } -#endif // !V8_TARGET_ARCH_ARM64 && !V8_TARGET_ARCH_ARM && !V8_TARGET_ARCH_IA32 - // && !V8_TARGET_ARCH_X64 && !V8_TARGET_ARCH_S390X && - // !V8_TARGET_ARCH_MIPS && !V8_TARGET_ARCH_MIPS64 - -#if !V8_TARGET_ARCH_X64 && !V8_TARGET_ARCH_ARM64 && !V8_TARGET_ARCH_S390X && \ - !V8_TARGET_ARCH_IA32 && !V8_TARGET_ARCH_ARM && !V8_TARGET_ARCH_MIPS && \ - !V8_TARGET_ARCH_MIPS64 -// TODO(v8:10553) Prototyping floating point rounding instructions. -void InstructionSelector::VisitF64x2Ceil(Node* node) { UNIMPLEMENTED(); } -void InstructionSelector::VisitF64x2Floor(Node* node) { UNIMPLEMENTED(); } -void InstructionSelector::VisitF64x2Trunc(Node* node) { UNIMPLEMENTED(); } -void InstructionSelector::VisitF64x2NearestInt(Node* node) { UNIMPLEMENTED(); } -void InstructionSelector::VisitF32x4Ceil(Node* node) { UNIMPLEMENTED(); } -void InstructionSelector::VisitF32x4Floor(Node* node) { UNIMPLEMENTED(); } -void InstructionSelector::VisitF32x4Trunc(Node* node) { UNIMPLEMENTED(); } -void InstructionSelector::VisitF32x4NearestInt(Node* node) { UNIMPLEMENTED(); } -#endif // !V8_TARGET_ARCH_X64 && !V8_TARGET_ARCH_ARM64 && !V8_TARGET_ARCH_S390X - // && !V8_TARGET_ARCH_IA32 && !V8_TARGET_ARCH_ARM && - // !V8_TARGET_ARCH_MIPS && !V8_TARGET_ARCH_MIPS64 - #if !V8_TARGET_ARCH_X64 && !V8_TARGET_ARCH_IA32 && !V8_TARGET_ARCH_ARM64 && \ !V8_TARGET_ARCH_ARM // TODO(v8:10583) Prototype i32x4.dot_i16x8_s @@ -2737,10 +2709,20 @@ void InstructionSelector::VisitParameter(Node* node) { } namespace { + LinkageLocation ExceptionLocation() { return LinkageLocation::ForRegister(kReturnRegister0.code(), MachineType::IntPtr()); } + +constexpr InstructionCode EncodeCallDescriptorFlags( + InstructionCode opcode, CallDescriptor::Flags flags) { + // Note: Not all bits of `flags` are preserved. + STATIC_ASSERT(CallDescriptor::kFlagsBitsEncodedInInstructionCode == + MiscField::kSize); + return opcode | MiscField::encode(flags & MiscField::kMax); +} + } // namespace void InstructionSelector::VisitIfException(Node* node) { @@ -2863,6 +2845,7 @@ void InstructionSelector::VisitCall(Node* node, BasicBlock* handler) { #if ABI_USES_FUNCTION_DESCRIPTORS // Highest misc_field bit is used on AIX to indicate if a CFunction call // has function descriptor or not. + STATIC_ASSERT(MiscField::kSize == kHasFunctionDescriptorBitShift + 1); if (!call_descriptor->NoFunctionDescriptor()) { misc_field |= 1 << kHasFunctionDescriptorBitShift; } @@ -2871,18 +2854,18 @@ void InstructionSelector::VisitCall(Node* node, BasicBlock* handler) { break; } case CallDescriptor::kCallCodeObject: - opcode = kArchCallCodeObject | MiscField::encode(flags); + opcode = EncodeCallDescriptorFlags(kArchCallCodeObject, flags); break; case CallDescriptor::kCallJSFunction: - opcode = kArchCallJSFunction | MiscField::encode(flags); + opcode = EncodeCallDescriptorFlags(kArchCallJSFunction, flags); break; case CallDescriptor::kCallWasmCapiFunction: case CallDescriptor::kCallWasmFunction: case CallDescriptor::kCallWasmImportWrapper: - opcode = kArchCallWasmFunction | MiscField::encode(flags); + opcode = EncodeCallDescriptorFlags(kArchCallWasmFunction, flags); break; case CallDescriptor::kCallBuiltinPointer: - opcode = kArchCallBuiltinPointer | MiscField::encode(flags); + opcode = EncodeCallDescriptorFlags(kArchCallBuiltinPointer, flags); break; } @@ -2912,9 +2895,9 @@ void InstructionSelector::VisitTailCall(Node* node) { auto call_descriptor = CallDescriptorOf(node->op()); CallDescriptor* caller = linkage()->GetIncomingDescriptor(); - DCHECK(caller->CanTailCall(CallDescriptorOf(node->op()))); const CallDescriptor* callee = CallDescriptorOf(node->op()); - int stack_param_delta = callee->GetStackParameterDelta(caller); + DCHECK(caller->CanTailCall(callee)); + const int stack_param_delta = callee->GetStackParameterDelta(caller); CallBuffer buffer(zone(), call_descriptor, nullptr); // Compute InstructionOperands for inputs and outputs. @@ -2931,7 +2914,7 @@ void InstructionSelector::VisitTailCall(Node* node) { // Select the appropriate opcode based on the call type. InstructionCode opcode; InstructionOperandVector temps(zone()); - if (linkage()->GetIncomingDescriptor()->IsJSFunctionCall()) { + if (caller->IsJSFunctionCall()) { switch (call_descriptor->kind()) { case CallDescriptor::kCallCodeObject: opcode = kArchTailCallCodeObjectFromJSFunction; @@ -2960,7 +2943,7 @@ void InstructionSelector::VisitTailCall(Node* node) { return; } } - opcode |= MiscField::encode(call_descriptor->flags()); + opcode = EncodeCallDescriptorFlags(opcode, call_descriptor->flags()); Emit(kArchPrepareTailCall, g.NoOutput()); @@ -2969,7 +2952,7 @@ void InstructionSelector::VisitTailCall(Node* node) { // instruction. This is used by backends that need to pad arguments for stack // alignment, in order to store an optional slot of padding above the // arguments. - int optional_padding_slot = callee->GetFirstUnusedStackSlot(); + const int optional_padding_slot = callee->GetFirstUnusedStackSlot(); buffer.instruction_args.push_back(g.TempImmediate(optional_padding_slot)); const int first_unused_stack_slot = @@ -3131,6 +3114,54 @@ bool InstructionSelector::CanProduceSignalingNaN(Node* node) { return true; } +#if V8_TARGET_ARCH_64_BIT +bool InstructionSelector::ZeroExtendsWord32ToWord64(Node* node, + int recursion_depth) { + // To compute whether a Node sets its upper 32 bits to zero, there are three + // cases. + // 1. Phi node, with a computed result already available in phi_states_: + // Read the value from phi_states_. + // 2. Phi node, with no result available in phi_states_ yet: + // Recursively check its inputs, and store the result in phi_states_. + // 3. Anything else: + // Call the architecture-specific ZeroExtendsWord32ToWord64NoPhis. + + // Limit recursion depth to avoid the possibility of stack overflow on very + // large functions. + const int kMaxRecursionDepth = 100; + + if (node->opcode() == IrOpcode::kPhi) { + Upper32BitsState current = phi_states_[node->id()]; + if (current != Upper32BitsState::kNotYetChecked) { + return current == Upper32BitsState::kUpperBitsGuaranteedZero; + } + + // If further recursion is prevented, we can't make any assumptions about + // the output of this phi node. + if (recursion_depth >= kMaxRecursionDepth) { + return false; + } + + // Mark the current node so that we skip it if we recursively visit it + // again. Or, said differently, we compute a largest fixed-point so we can + // be optimistic when we hit cycles. + phi_states_[node->id()] = Upper32BitsState::kUpperBitsGuaranteedZero; + + int input_count = node->op()->ValueInputCount(); + for (int i = 0; i < input_count; ++i) { + Node* input = NodeProperties::GetValueInput(node, i); + if (!ZeroExtendsWord32ToWord64(input, recursion_depth + 1)) { + phi_states_[node->id()] = Upper32BitsState::kNoGuarantee; + return false; + } + } + + return true; + } + return ZeroExtendsWord32ToWord64NoPhis(node); +} +#endif // V8_TARGET_ARCH_64_BIT + namespace { FrameStateDescriptor* GetFrameStateDescriptorInternal(Zone* zone, Node* state) { diff --git a/deps/v8/src/compiler/backend/instruction-selector.h b/deps/v8/src/compiler/backend/instruction-selector.h index 0aa5dbbeaff006..6452e3ec4cb49f 100644 --- a/deps/v8/src/compiler/backend/instruction-selector.h +++ b/deps/v8/src/compiler/backend/instruction-selector.h @@ -667,6 +667,17 @@ class V8_EXPORT_PRIVATE InstructionSelector final { void VisitWord64AtomicNarrowBinop(Node* node, ArchOpcode uint8_op, ArchOpcode uint16_op, ArchOpcode uint32_op); +#if V8_TARGET_ARCH_64_BIT + bool ZeroExtendsWord32ToWord64(Node* node, int recursion_depth = 0); + bool ZeroExtendsWord32ToWord64NoPhis(Node* node); + + enum Upper32BitsState : uint8_t { + kNotYetChecked, + kUpperBitsGuaranteedZero, + kNoGuarantee, + }; +#endif // V8_TARGET_ARCH_64_BIT + // =========================================================================== Zone* const zone_; @@ -702,6 +713,13 @@ class V8_EXPORT_PRIVATE InstructionSelector final { // arguments (for calls). Later used to apply an offset to stack checks. size_t* max_unoptimized_frame_height_; size_t* max_pushed_argument_count_; + +#if V8_TARGET_ARCH_64_BIT + // Holds lazily-computed results for whether phi nodes guarantee their upper + // 32 bits to be zero. Indexed by node ID; nobody reads or writes the values + // for non-phi nodes. + ZoneVector phi_states_; +#endif }; } // namespace compiler diff --git a/deps/v8/src/compiler/backend/live-range-separator.cc b/deps/v8/src/compiler/backend/live-range-separator.cc deleted file mode 100644 index acfe23dd06db77..00000000000000 --- a/deps/v8/src/compiler/backend/live-range-separator.cc +++ /dev/null @@ -1,199 +0,0 @@ -// Copyright 2015 the V8 project authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "src/compiler/backend/live-range-separator.h" -#include "src/compiler/backend/register-allocator.h" - -namespace v8 { -namespace internal { -namespace compiler { - -#define TRACE_COND(cond, ...) \ - do { \ - if (cond) PrintF(__VA_ARGS__); \ - } while (false) - -namespace { - -void CreateSplinter(TopLevelLiveRange* range, - TopTierRegisterAllocationData* data, - LifetimePosition first_cut, LifetimePosition last_cut, - bool trace_alloc) { - DCHECK(!range->IsSplinter()); - // We can ignore ranges that live solely in deferred blocks. - // If a range ends right at the end of a deferred block, it is marked by - // the range builder as ending at gap start of the next block - since the - // end is a position where the variable isn't live. We need to take that - // into consideration. - LifetimePosition max_allowed_end = last_cut.NextFullStart(); - - if (first_cut <= range->Start() && max_allowed_end >= range->End()) { - return; - } - - LifetimePosition start = Max(first_cut, range->Start()); - LifetimePosition end = Min(last_cut, range->End()); - - if (start < end) { - // Ensure the original range has a spill range associated, before it gets - // splintered. Splinters will point to it. This way, when attempting to - // reuse spill slots of splinters, during allocation, we avoid clobbering - // such slots. - if (range->MayRequireSpillRange()) { - data->CreateSpillRangeForLiveRange(range); - } - if (range->splinter() == nullptr) { - TopLevelLiveRange* splinter = - data->NextLiveRange(range->representation()); - DCHECK_NULL(data->live_ranges()[splinter->vreg()]); - data->live_ranges()[splinter->vreg()] = splinter; - range->SetSplinter(splinter); - } - Zone* zone = data->allocation_zone(); - TRACE_COND(trace_alloc, - "creating splinter %d for range %d between %d and %d\n", - range->splinter()->vreg(), range->vreg(), - start.ToInstructionIndex(), end.ToInstructionIndex()); - range->Splinter(start, end, zone); - } -} - -void SetSlotUse(TopLevelLiveRange* range) { - range->reset_slot_use(); - for (const UsePosition* pos = range->first_pos(); - !range->has_slot_use() && pos != nullptr; pos = pos->next()) { - if (pos->type() == UsePositionType::kRequiresSlot) { - range->register_slot_use(TopLevelLiveRange::SlotUseKind::kGeneralSlotUse); - } - } -} - -void SplinterLiveRange(TopLevelLiveRange* range, - TopTierRegisterAllocationData* data) { - const InstructionSequence* code = data->code(); - UseInterval* interval = range->first_interval(); - - LifetimePosition first_cut = LifetimePosition::Invalid(); - LifetimePosition last_cut = LifetimePosition::Invalid(); - - while (interval != nullptr) { - // We have to cache these here, as splintering might destroy the original - // interval below. - UseInterval* next_interval = interval->next(); - LifetimePosition interval_end = interval->end(); - const InstructionBlock* first_block = - code->GetInstructionBlock(interval->FirstGapIndex()); - const InstructionBlock* last_block = - code->GetInstructionBlock(interval->LastGapIndex()); - int first_block_nr = first_block->rpo_number().ToInt(); - int last_block_nr = last_block->rpo_number().ToInt(); - for (int block_id = first_block_nr; block_id <= last_block_nr; ++block_id) { - const InstructionBlock* current_block = - code->InstructionBlockAt(RpoNumber::FromInt(block_id)); - if (current_block->IsDeferred()) { - if (!first_cut.IsValid()) { - first_cut = LifetimePosition::GapFromInstructionIndex( - current_block->first_instruction_index()); - } - // We splinter until the last gap in the block. I assume this is done to - // leave a little range to be allocated by normal register allocation - // and then use that range to connect when splinters are merged back. - // This might be done as control flow resolution does not insert moves - // if two consecutive blocks in rpo order are also consecutive in - // control flow. - last_cut = LifetimePosition::GapFromInstructionIndex( - current_block->last_instruction_index()); - } else { - if (first_cut.IsValid()) { - CreateSplinter(range, data, first_cut, last_cut, - data->is_trace_alloc()); - first_cut = LifetimePosition::Invalid(); - last_cut = LifetimePosition::Invalid(); - } - } - } - // If we reach the end of an interval with a first_cut and last_cut set, it - // means that we can splinter to the end of the interval, as the value dies - // in this control flow branch or is not live in the next block. In the - // former case, we won't need to reload the value, so we can splinter to the - // end of its lifetime. In the latter case, control flow resolution will - // have to connect blocks anyway, so we can also splinter to the end of the - // block, too. - if (first_cut.IsValid()) { - CreateSplinter(range, data, first_cut, interval_end, - data->is_trace_alloc()); - first_cut = LifetimePosition::Invalid(); - last_cut = LifetimePosition::Invalid(); - } - interval = next_interval; - } - - // Redo has_slot_use - if (range->has_slot_use() && range->splinter() != nullptr) { - SetSlotUse(range); - SetSlotUse(range->splinter()); - } -} - -} // namespace - -void LiveRangeSeparator::Splinter() { - size_t virt_reg_count = data()->live_ranges().size(); - for (size_t vreg = 0; vreg < virt_reg_count; ++vreg) { - TopLevelLiveRange* range = data()->live_ranges()[vreg]; - if (range == nullptr || range->IsEmpty() || range->IsSplinter()) { - continue; - } - int first_instr = range->first_interval()->FirstGapIndex(); - if (!data()->code()->GetInstructionBlock(first_instr)->IsDeferred()) { - SplinterLiveRange(range, data()); - } - } -} - -void LiveRangeMerger::MarkRangesSpilledInDeferredBlocks() { - const InstructionSequence* code = data()->code(); - for (TopLevelLiveRange* top : data()->live_ranges()) { - if (top == nullptr || top->IsEmpty() || top->splinter() == nullptr || - top->HasSpillOperand() || !top->splinter()->HasSpillRange()) { - continue; - } - - LiveRange* child = top; - for (; child != nullptr; child = child->next()) { - if (child->spilled() || - child->NextSlotPosition(child->Start()) != nullptr) { - break; - } - } - if (child == nullptr) { - DCHECK(!data()->is_turbo_control_flow_aware_allocation()); - top->TreatAsSpilledInDeferredBlock(data()->allocation_zone(), - code->InstructionBlockCount()); - } - } -} - -void LiveRangeMerger::Merge() { - MarkRangesSpilledInDeferredBlocks(); - - int live_range_count = static_cast(data()->live_ranges().size()); - for (int i = 0; i < live_range_count; ++i) { - TopLevelLiveRange* range = data()->live_ranges()[i]; - if (range == nullptr || range->IsEmpty() || !range->IsSplinter()) { - continue; - } - TopLevelLiveRange* splinter_parent = range->splintered_from(); - - int to_remove = range->vreg(); - splinter_parent->Merge(range, data()->allocation_zone()); - data()->live_ranges()[to_remove] = nullptr; - } -} - -#undef TRACE_COND - -} // namespace compiler -} // namespace internal -} // namespace v8 diff --git a/deps/v8/src/compiler/backend/live-range-separator.h b/deps/v8/src/compiler/backend/live-range-separator.h deleted file mode 100644 index f84b275e0805ff..00000000000000 --- a/deps/v8/src/compiler/backend/live-range-separator.h +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright 2015 the V8 project authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef V8_COMPILER_BACKEND_LIVE_RANGE_SEPARATOR_H_ -#define V8_COMPILER_BACKEND_LIVE_RANGE_SEPARATOR_H_ - -#include "src/zone/zone.h" -namespace v8 { -namespace internal { - -class Zone; - -namespace compiler { - -class TopTierRegisterAllocationData; - -// A register allocation pair of transformations: splinter and merge live ranges -class LiveRangeSeparator final : public ZoneObject { - public: - LiveRangeSeparator(TopTierRegisterAllocationData* data, Zone* zone) - : data_(data), zone_(zone) {} - - void Splinter(); - - private: - TopTierRegisterAllocationData* data() const { return data_; } - Zone* zone() const { return zone_; } - - TopTierRegisterAllocationData* const data_; - Zone* const zone_; - - DISALLOW_COPY_AND_ASSIGN(LiveRangeSeparator); -}; - -class LiveRangeMerger final : public ZoneObject { - public: - LiveRangeMerger(TopTierRegisterAllocationData* data, Zone* zone) - : data_(data), zone_(zone) {} - - void Merge(); - - private: - TopTierRegisterAllocationData* data() const { return data_; } - Zone* zone() const { return zone_; } - - // Mark ranges spilled in deferred blocks, that also cover non-deferred code. - // We do nothing special for ranges fully contained in deferred blocks, - // because they would "spill in deferred blocks" anyway. - void MarkRangesSpilledInDeferredBlocks(); - - TopTierRegisterAllocationData* const data_; - Zone* const zone_; - - DISALLOW_COPY_AND_ASSIGN(LiveRangeMerger); -}; - -} // namespace compiler -} // namespace internal -} // namespace v8 -#endif // V8_COMPILER_BACKEND_LIVE_RANGE_SEPARATOR_H_ diff --git a/deps/v8/src/compiler/backend/mips/code-generator-mips.cc b/deps/v8/src/compiler/backend/mips/code-generator-mips.cc index 07416ab8ba8cc6..5457883feebab7 100644 --- a/deps/v8/src/compiler/backend/mips/code-generator-mips.cc +++ b/deps/v8/src/compiler/backend/mips/code-generator-mips.cc @@ -1239,7 +1239,13 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( break; } case kMipsAbsS: - __ abs_s(i.OutputSingleRegister(), i.InputSingleRegister(0)); + if (IsMipsArchVariant(kMips32r6)) { + __ abs_s(i.OutputSingleRegister(), i.InputSingleRegister(0)); + } else { + __ mfc1(kScratchReg, i.InputSingleRegister(0)); + __ Ins(kScratchReg, zero_reg, 31, 1); + __ mtc1(kScratchReg, i.OutputSingleRegister()); + } break; case kMipsSqrtS: { __ sqrt_s(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); @@ -1330,9 +1336,19 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( __ MovFromFloatResult(i.OutputDoubleRegister()); break; } - case kMipsAbsD: - __ abs_d(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); + case kMipsAbsD: { + FPURegister src = i.InputDoubleRegister(0); + FPURegister dst = i.OutputDoubleRegister(); + if (IsMipsArchVariant(kMips32r6)) { + __ abs_d(dst, src); + } else { + __ Move(dst, src); + __ mfhc1(kScratchReg, src); + __ Ins(kScratchReg, zero_reg, 31, 1); + __ mthc1(kScratchReg, dst); + } break; + } case kMipsNegS: __ Neg_s(i.OutputSingleRegister(), i.InputSingleRegister(0)); break; @@ -3274,7 +3290,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( __ sldi_b(dst, i.InputSimd128Register(1), i.InputInt4(2)); break; } - case kMipsS8x16Shuffle: { + case kMipsI8x16Shuffle: { CpuFeatureScope msa_scope(tasm(), MIPS_SIMD); Simd128Register dst = i.OutputSimd128Register(), src0 = i.InputSimd128Register(0), @@ -3299,7 +3315,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( __ vshf_b(dst, src1, src0); break; } - case kMipsS8x16Swizzle: { + case kMipsI8x16Swizzle: { Simd128Register dst = i.OutputSimd128Register(), tbl = i.InputSimd128Register(0), ctl = i.InputSimd128Register(1); @@ -3905,9 +3921,6 @@ void CodeGenerator::AssembleConstructFrame() { } } else if (call_descriptor->IsJSFunctionCall()) { __ Prologue(); - if (call_descriptor->PushArgumentCount()) { - __ Push(kJavaScriptCallArgCountRegister); - } } else { __ StubPrologue(info()->GetOutputStackFrameType()); if (call_descriptor->IsWasmFunctionCall()) { diff --git a/deps/v8/src/compiler/backend/mips/instruction-codes-mips.h b/deps/v8/src/compiler/backend/mips/instruction-codes-mips.h index b95bd82d28ee75..46ce3d359ab0b2 100644 --- a/deps/v8/src/compiler/backend/mips/instruction-codes-mips.h +++ b/deps/v8/src/compiler/backend/mips/instruction-codes-mips.h @@ -307,8 +307,8 @@ namespace compiler { V(MipsS8x16PackOdd) \ V(MipsS8x16InterleaveEven) \ V(MipsS8x16InterleaveOdd) \ - V(MipsS8x16Shuffle) \ - V(MipsS8x16Swizzle) \ + V(MipsI8x16Shuffle) \ + V(MipsI8x16Swizzle) \ V(MipsS8x16Concat) \ V(MipsS8x8Reverse) \ V(MipsS8x4Reverse) \ diff --git a/deps/v8/src/compiler/backend/mips/instruction-scheduler-mips.cc b/deps/v8/src/compiler/backend/mips/instruction-scheduler-mips.cc index 507bb146641d9a..64e78b81229bf5 100644 --- a/deps/v8/src/compiler/backend/mips/instruction-scheduler-mips.cc +++ b/deps/v8/src/compiler/backend/mips/instruction-scheduler-mips.cc @@ -273,8 +273,8 @@ int InstructionScheduler::GetTargetInstructionFlags( case kMipsS8x16InterleaveRight: case kMipsS8x16PackEven: case kMipsS8x16PackOdd: - case kMipsS8x16Shuffle: - case kMipsS8x16Swizzle: + case kMipsI8x16Shuffle: + case kMipsI8x16Swizzle: case kMipsS8x2Reverse: case kMipsS8x4Reverse: case kMipsS8x8Reverse: diff --git a/deps/v8/src/compiler/backend/mips/instruction-selector-mips.cc b/deps/v8/src/compiler/backend/mips/instruction-selector-mips.cc index 6aabbf3761703e..b552b0dec15173 100644 --- a/deps/v8/src/compiler/backend/mips/instruction-selector-mips.cc +++ b/deps/v8/src/compiler/backend/mips/instruction-selector-mips.cc @@ -1388,9 +1388,9 @@ void InstructionSelector::VisitUnalignedLoad(Node* node) { ArchOpcode opcode = kArchNop; switch (load_rep.representation()) { - case MachineRepresentation::kBit: // Fall through. case MachineRepresentation::kWord8: - UNREACHABLE(); + opcode = load_rep.IsUnsigned() ? kMipsLbu : kMipsLb; + break; case MachineRepresentation::kWord16: opcode = load_rep.IsUnsigned() ? kMipsUlhu : kMipsUlh; break; @@ -1409,6 +1409,7 @@ void InstructionSelector::VisitUnalignedLoad(Node* node) { case MachineRepresentation::kSimd128: opcode = kMipsMsaLd; break; + case MachineRepresentation::kBit: // Fall through. case MachineRepresentation::kCompressedPointer: // Fall through. case MachineRepresentation::kCompressed: // Fall through. case MachineRepresentation::kWord64: // Fall through. @@ -1446,9 +1447,9 @@ void InstructionSelector::VisitUnalignedStore(Node* node) { case MachineRepresentation::kFloat64: opcode = kMipsUsdc1; break; - case MachineRepresentation::kBit: // Fall through. case MachineRepresentation::kWord8: - UNREACHABLE(); + opcode = kMipsSb; + break; case MachineRepresentation::kWord16: opcode = kMipsUsh; break; @@ -1461,6 +1462,7 @@ void InstructionSelector::VisitUnalignedStore(Node* node) { case MachineRepresentation::kSimd128: opcode = kMipsMsaSt; break; + case MachineRepresentation::kBit: // Fall through. case MachineRepresentation::kCompressedPointer: // Fall through. case MachineRepresentation::kCompressed: // Fall through. case MachineRepresentation::kWord64: // Fall through. @@ -2378,7 +2380,7 @@ bool TryMatchArchShuffle(const uint8_t* shuffle, const ShuffleEntry* table, } // namespace -void InstructionSelector::VisitS8x16Shuffle(Node* node) { +void InstructionSelector::VisitI8x16Shuffle(Node* node) { uint8_t shuffle[kSimd128Size]; bool is_swizzle; CanonicalizeShuffle(node, shuffle, &is_swizzle); @@ -2404,7 +2406,7 @@ void InstructionSelector::VisitS8x16Shuffle(Node* node) { g.UseImmediate(wasm::SimdShuffle::Pack4Lanes(shuffle32x4))); return; } - Emit(kMipsS8x16Shuffle, g.DefineAsRegister(node), g.UseRegister(input0), + Emit(kMipsI8x16Shuffle, g.DefineAsRegister(node), g.UseRegister(input0), g.UseRegister(input1), g.UseImmediate(wasm::SimdShuffle::Pack4Lanes(shuffle)), g.UseImmediate(wasm::SimdShuffle::Pack4Lanes(shuffle + 4)), @@ -2412,15 +2414,14 @@ void InstructionSelector::VisitS8x16Shuffle(Node* node) { g.UseImmediate(wasm::SimdShuffle::Pack4Lanes(shuffle + 12))); } -void InstructionSelector::VisitS8x16Swizzle(Node* node) { +void InstructionSelector::VisitI8x16Swizzle(Node* node) { MipsOperandGenerator g(this); InstructionOperand temps[] = {g.TempSimd128Register()}; // We don't want input 0 or input 1 to be the same as output, since we will // modify output before do the calculation. - Emit(kMipsS8x16Swizzle, g.DefineAsRegister(node), + Emit(kMipsI8x16Swizzle, g.DefineAsRegister(node), g.UseUniqueRegister(node->InputAt(0)), - g.UseUniqueRegister(node->InputAt(1)), - arraysize(temps), temps); + g.UseUniqueRegister(node->InputAt(1)), arraysize(temps), temps); } void InstructionSelector::VisitSignExtendWord8ToInt32(Node* node) { diff --git a/deps/v8/src/compiler/backend/mips64/code-generator-mips64.cc b/deps/v8/src/compiler/backend/mips64/code-generator-mips64.cc index 2fda592ae129c3..bb01eab9241d64 100644 --- a/deps/v8/src/compiler/backend/mips64/code-generator-mips64.cc +++ b/deps/v8/src/compiler/backend/mips64/code-generator-mips64.cc @@ -1318,7 +1318,13 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( break; } case kMips64AbsS: - __ abs_s(i.OutputSingleRegister(), i.InputSingleRegister(0)); + if (kArchVariant == kMips64r6) { + __ abs_s(i.OutputSingleRegister(), i.InputSingleRegister(0)); + } else { + __ mfc1(kScratchReg, i.InputSingleRegister(0)); + __ Dins(kScratchReg, zero_reg, 31, 1); + __ mtc1(kScratchReg, i.OutputSingleRegister()); + } break; case kMips64NegS: __ Neg_s(i.OutputSingleRegister(), i.InputSingleRegister(0)); @@ -1378,7 +1384,13 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( break; } case kMips64AbsD: - __ abs_d(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); + if (kArchVariant == kMips64r6) { + __ abs_d(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); + } else { + __ dmfc1(kScratchReg, i.InputDoubleRegister(0)); + __ Dins(kScratchReg, zero_reg, 63, 1); + __ dmtc1(kScratchReg, i.OutputDoubleRegister()); + } break; case kMips64NegD: __ Neg_d(i.OutputDoubleRegister(), i.InputDoubleRegister(0)); @@ -1810,19 +1822,20 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( } break; case kMips64Peek: { - // The incoming value is 0-based, but we need a 1-based value. - int reverse_slot = i.InputInt32(0) + 1; + int reverse_slot = i.InputInt32(0); int offset = FrameSlotToFPOffset(frame()->GetTotalFrameSlotCount() - reverse_slot); if (instr->OutputAt(0)->IsFPRegister()) { LocationOperand* op = LocationOperand::cast(instr->OutputAt(0)); if (op->representation() == MachineRepresentation::kFloat64) { __ Ldc1(i.OutputDoubleRegister(), MemOperand(fp, offset)); - } else { - DCHECK_EQ(op->representation(), MachineRepresentation::kFloat32); - __ lwc1( + } else if (op->representation() == MachineRepresentation::kFloat32) { + __ Lwc1( i.OutputSingleRegister(0), MemOperand(fp, offset + kLessSignificantWordInDoublewordOffset)); + } else { + DCHECK_EQ(MachineRepresentation::kSimd128, op->representation()); + __ ld_b(i.OutputSimd128Register(), MemOperand(fp, offset)); } } else { __ Ld(i.OutputRegister(0), MemOperand(fp, offset)); @@ -2304,38 +2317,26 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( } case kMips64F64x2Ceil: { CpuFeatureScope msa_scope(tasm(), MIPS_SIMD); - __ cfcmsa(kScratchReg, MSACSR); - __ li(kScratchReg2, kRoundToPlusInf); - __ ctcmsa(MSACSR, kScratchReg2); - __ frint_d(i.OutputSimd128Register(), i.InputSimd128Register(0)); - __ ctcmsa(MSACSR, kScratchReg); + __ MSARoundD(i.OutputSimd128Register(), i.InputSimd128Register(0), + kRoundToPlusInf); break; } case kMips64F64x2Floor: { CpuFeatureScope msa_scope(tasm(), MIPS_SIMD); - __ cfcmsa(kScratchReg, MSACSR); - __ li(kScratchReg2, kRoundToMinusInf); - __ ctcmsa(MSACSR, kScratchReg2); - __ frint_d(i.OutputSimd128Register(), i.InputSimd128Register(0)); - __ ctcmsa(MSACSR, kScratchReg); + __ MSARoundD(i.OutputSimd128Register(), i.InputSimd128Register(0), + kRoundToMinusInf); break; } case kMips64F64x2Trunc: { CpuFeatureScope msa_scope(tasm(), MIPS_SIMD); - __ cfcmsa(kScratchReg, MSACSR); - __ li(kScratchReg2, kRoundToZero); - __ ctcmsa(MSACSR, kScratchReg2); - __ frint_d(i.OutputSimd128Register(), i.InputSimd128Register(0)); - __ ctcmsa(MSACSR, kScratchReg); + __ MSARoundD(i.OutputSimd128Register(), i.InputSimd128Register(0), + kRoundToZero); break; } case kMips64F64x2NearestInt: { CpuFeatureScope msa_scope(tasm(), MIPS_SIMD); - __ cfcmsa(kScratchReg, MSACSR); - // kRoundToNearest == 0 - __ ctcmsa(MSACSR, zero_reg); - __ frint_d(i.OutputSimd128Register(), i.InputSimd128Register(0)); - __ ctcmsa(MSACSR, kScratchReg); + __ MSARoundD(i.OutputSimd128Register(), i.InputSimd128Register(0), + kRoundToNearest); break; } case kMips64I64x2ReplaceLane: { @@ -2676,38 +2677,26 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( } case kMips64F32x4Ceil: { CpuFeatureScope msa_scope(tasm(), MIPS_SIMD); - __ cfcmsa(kScratchReg, MSACSR); - __ li(kScratchReg2, kRoundToPlusInf); - __ ctcmsa(MSACSR, kScratchReg2); - __ frint_w(i.OutputSimd128Register(), i.InputSimd128Register(0)); - __ ctcmsa(MSACSR, kScratchReg); + __ MSARoundW(i.OutputSimd128Register(), i.InputSimd128Register(0), + kRoundToPlusInf); break; } case kMips64F32x4Floor: { CpuFeatureScope msa_scope(tasm(), MIPS_SIMD); - __ cfcmsa(kScratchReg, MSACSR); - __ li(kScratchReg2, kRoundToMinusInf); - __ ctcmsa(MSACSR, kScratchReg2); - __ frint_w(i.OutputSimd128Register(), i.InputSimd128Register(0)); - __ ctcmsa(MSACSR, kScratchReg); + __ MSARoundW(i.OutputSimd128Register(), i.InputSimd128Register(0), + kRoundToMinusInf); break; } case kMips64F32x4Trunc: { CpuFeatureScope msa_scope(tasm(), MIPS_SIMD); - __ cfcmsa(kScratchReg, MSACSR); - __ li(kScratchReg2, kRoundToZero); - __ ctcmsa(MSACSR, kScratchReg2); - __ frint_w(i.OutputSimd128Register(), i.InputSimd128Register(0)); - __ ctcmsa(MSACSR, kScratchReg); + __ MSARoundW(i.OutputSimd128Register(), i.InputSimd128Register(0), + kRoundToZero); break; } case kMips64F32x4NearestInt: { CpuFeatureScope msa_scope(tasm(), MIPS_SIMD); - __ cfcmsa(kScratchReg, MSACSR); - // kRoundToNearest == 0 - __ ctcmsa(MSACSR, zero_reg); - __ frint_w(i.OutputSimd128Register(), i.InputSimd128Register(0)); - __ ctcmsa(MSACSR, kScratchReg); + __ MSARoundW(i.OutputSimd128Register(), i.InputSimd128Register(0), + kRoundToNearest); break; } case kMips64I32x4SConvertF32x4: { @@ -3520,7 +3509,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( __ sldi_b(dst, i.InputSimd128Register(1), i.InputInt4(2)); break; } - case kMips64S8x16Shuffle: { + case kMips64I8x16Shuffle: { CpuFeatureScope msa_scope(tasm(), MIPS_SIMD); Simd128Register dst = i.OutputSimd128Register(), src0 = i.InputSimd128Register(0), @@ -3545,7 +3534,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( __ vshf_b(dst, src1, src0); break; } - case kMips64S8x16Swizzle: { + case kMips64I8x16Swizzle: { Simd128Register dst = i.OutputSimd128Register(), tbl = i.InputSimd128Register(0), ctl = i.InputSimd128Register(1); @@ -4202,9 +4191,6 @@ void CodeGenerator::AssembleConstructFrame() { } } else if (call_descriptor->IsJSFunctionCall()) { __ Prologue(); - if (call_descriptor->PushArgumentCount()) { - __ Push(kJavaScriptCallArgCountRegister); - } } else { __ StubPrologue(info()->GetOutputStackFrameType()); if (call_descriptor->IsWasmFunctionCall()) { diff --git a/deps/v8/src/compiler/backend/mips64/instruction-codes-mips64.h b/deps/v8/src/compiler/backend/mips64/instruction-codes-mips64.h index fb603165175b2d..577db6347ccd3d 100644 --- a/deps/v8/src/compiler/backend/mips64/instruction-codes-mips64.h +++ b/deps/v8/src/compiler/backend/mips64/instruction-codes-mips64.h @@ -342,8 +342,8 @@ namespace compiler { V(Mips64S8x16PackOdd) \ V(Mips64S8x16InterleaveEven) \ V(Mips64S8x16InterleaveOdd) \ - V(Mips64S8x16Shuffle) \ - V(Mips64S8x16Swizzle) \ + V(Mips64I8x16Shuffle) \ + V(Mips64I8x16Swizzle) \ V(Mips64S8x16Concat) \ V(Mips64S8x8Reverse) \ V(Mips64S8x4Reverse) \ diff --git a/deps/v8/src/compiler/backend/mips64/instruction-scheduler-mips64.cc b/deps/v8/src/compiler/backend/mips64/instruction-scheduler-mips64.cc index 347cf577ded68a..caf472bf30be69 100644 --- a/deps/v8/src/compiler/backend/mips64/instruction-scheduler-mips64.cc +++ b/deps/v8/src/compiler/backend/mips64/instruction-scheduler-mips64.cc @@ -305,8 +305,8 @@ int InstructionScheduler::GetTargetInstructionFlags( case kMips64S8x2Reverse: case kMips64S8x4Reverse: case kMips64S8x8Reverse: - case kMips64S8x16Shuffle: - case kMips64S8x16Swizzle: + case kMips64I8x16Shuffle: + case kMips64I8x16Swizzle: case kMips64Sar: case kMips64Seb: case kMips64Seh: diff --git a/deps/v8/src/compiler/backend/mips64/instruction-selector-mips64.cc b/deps/v8/src/compiler/backend/mips64/instruction-selector-mips64.cc index 16cc2bfa86bd01..2c807b41832dc0 100644 --- a/deps/v8/src/compiler/backend/mips64/instruction-selector-mips64.cc +++ b/deps/v8/src/compiler/backend/mips64/instruction-selector-mips64.cc @@ -1399,35 +1399,40 @@ void InstructionSelector::VisitChangeInt32ToInt64(Node* node) { } } -void InstructionSelector::VisitChangeUint32ToUint64(Node* node) { - Mips64OperandGenerator g(this); - Node* value = node->InputAt(0); - switch (value->opcode()) { +bool InstructionSelector::ZeroExtendsWord32ToWord64NoPhis(Node* node) { + DCHECK_NE(node->opcode(), IrOpcode::kPhi); + switch (node->opcode()) { // 32-bit operations will write their result in a 64 bit register, // clearing the top 32 bits of the destination register. case IrOpcode::kUint32Div: case IrOpcode::kUint32Mod: - case IrOpcode::kUint32MulHigh: { - Emit(kArchNop, g.DefineSameAsFirst(node), g.Use(value)); - return; - } + case IrOpcode::kUint32MulHigh: + return true; case IrOpcode::kLoad: { - LoadRepresentation load_rep = LoadRepresentationOf(value->op()); + LoadRepresentation load_rep = LoadRepresentationOf(node->op()); if (load_rep.IsUnsigned()) { switch (load_rep.representation()) { case MachineRepresentation::kWord8: case MachineRepresentation::kWord16: case MachineRepresentation::kWord32: - Emit(kArchNop, g.DefineSameAsFirst(node), g.Use(value)); - return; + return true; default: - break; + return false; } } - break; + return false; } default: - break; + return false; + } +} + +void InstructionSelector::VisitChangeUint32ToUint64(Node* node) { + Mips64OperandGenerator g(this); + Node* value = node->InputAt(0); + if (ZeroExtendsWord32ToWord64(value)) { + Emit(kArchNop, g.DefineSameAsFirst(node), g.Use(value)); + return; } Emit(kMips64Dext, g.DefineAsRegister(node), g.UseRegister(node->InputAt(0)), g.TempImmediate(0), g.TempImmediate(32)); @@ -1711,7 +1716,7 @@ void InstructionSelector::EmitPrepareResults( Node* node) { Mips64OperandGenerator g(this); - int reverse_slot = 0; + int reverse_slot = 1; for (PushParameter output : *results) { if (!output.location.IsCallerFrameSlot()) continue; // Skip any alignment holes in nodes. @@ -1721,6 +1726,8 @@ void InstructionSelector::EmitPrepareResults( MarkAsFloat32(output.node); } else if (output.location.GetType() == MachineType::Float64()) { MarkAsFloat64(output.node); + } else if (output.location.GetType() == MachineType::Simd128()) { + MarkAsSimd128(output.node); } Emit(kMips64Peek, g.DefineAsRegister(output.node), g.UseImmediate(reverse_slot)); @@ -1747,9 +1754,9 @@ void InstructionSelector::VisitUnalignedLoad(Node* node) { case MachineRepresentation::kFloat64: opcode = kMips64Uldc1; break; - case MachineRepresentation::kBit: // Fall through. case MachineRepresentation::kWord8: - UNREACHABLE(); + opcode = load_rep.IsUnsigned() ? kMips64Lbu : kMips64Lb; + break; case MachineRepresentation::kWord16: opcode = load_rep.IsUnsigned() ? kMips64Ulhu : kMips64Ulh; break; @@ -1765,6 +1772,7 @@ void InstructionSelector::VisitUnalignedLoad(Node* node) { case MachineRepresentation::kSimd128: opcode = kMips64MsaLd; break; + case MachineRepresentation::kBit: // Fall through. case MachineRepresentation::kCompressedPointer: // Fall through. case MachineRepresentation::kCompressed: // Fall through. case MachineRepresentation::kNone: @@ -1799,9 +1807,9 @@ void InstructionSelector::VisitUnalignedStore(Node* node) { case MachineRepresentation::kFloat64: opcode = kMips64Usdc1; break; - case MachineRepresentation::kBit: // Fall through. case MachineRepresentation::kWord8: - UNREACHABLE(); + opcode = kMips64Sb; + break; case MachineRepresentation::kWord16: opcode = kMips64Ush; break; @@ -1817,6 +1825,7 @@ void InstructionSelector::VisitUnalignedStore(Node* node) { case MachineRepresentation::kSimd128: opcode = kMips64MsaSt; break; + case MachineRepresentation::kBit: // Fall through. case MachineRepresentation::kCompressedPointer: // Fall through. case MachineRepresentation::kCompressed: // Fall through. case MachineRepresentation::kNone: @@ -3073,7 +3082,7 @@ bool TryMatchArchShuffle(const uint8_t* shuffle, const ShuffleEntry* table, } // namespace -void InstructionSelector::VisitS8x16Shuffle(Node* node) { +void InstructionSelector::VisitI8x16Shuffle(Node* node) { uint8_t shuffle[kSimd128Size]; bool is_swizzle; CanonicalizeShuffle(node, shuffle, &is_swizzle); @@ -3099,7 +3108,7 @@ void InstructionSelector::VisitS8x16Shuffle(Node* node) { g.UseImmediate(wasm::SimdShuffle::Pack4Lanes(shuffle32x4))); return; } - Emit(kMips64S8x16Shuffle, g.DefineAsRegister(node), g.UseRegister(input0), + Emit(kMips64I8x16Shuffle, g.DefineAsRegister(node), g.UseRegister(input0), g.UseRegister(input1), g.UseImmediate(wasm::SimdShuffle::Pack4Lanes(shuffle)), g.UseImmediate(wasm::SimdShuffle::Pack4Lanes(shuffle + 4)), @@ -3107,15 +3116,14 @@ void InstructionSelector::VisitS8x16Shuffle(Node* node) { g.UseImmediate(wasm::SimdShuffle::Pack4Lanes(shuffle + 12))); } -void InstructionSelector::VisitS8x16Swizzle(Node* node) { +void InstructionSelector::VisitI8x16Swizzle(Node* node) { Mips64OperandGenerator g(this); InstructionOperand temps[] = {g.TempSimd128Register()}; // We don't want input 0 or input 1 to be the same as output, since we will // modify output before do the calculation. - Emit(kMips64S8x16Swizzle, g.DefineAsRegister(node), + Emit(kMips64I8x16Swizzle, g.DefineAsRegister(node), g.UseUniqueRegister(node->InputAt(0)), - g.UseUniqueRegister(node->InputAt(1)), - arraysize(temps), temps); + g.UseUniqueRegister(node->InputAt(1)), arraysize(temps), temps); } void InstructionSelector::VisitSignExtendWord8ToInt32(Node* node) { diff --git a/deps/v8/src/compiler/backend/ppc/OWNERS b/deps/v8/src/compiler/backend/ppc/OWNERS index 6d1a8fc472cfe1..6edd45a6ef2e04 100644 --- a/deps/v8/src/compiler/backend/ppc/OWNERS +++ b/deps/v8/src/compiler/backend/ppc/OWNERS @@ -1,4 +1,4 @@ -jyan@ca.ibm.com +junyan@redhat.com joransiu@ca.ibm.com -michael_dawson@ca.ibm.com -miladfar@ca.ibm.com \ No newline at end of file +midawson@redhat.com +mfarazma@redhat.com diff --git a/deps/v8/src/compiler/backend/ppc/code-generator-ppc.cc b/deps/v8/src/compiler/backend/ppc/code-generator-ppc.cc index 9d112495b3431f..767247b2fd8535 100644 --- a/deps/v8/src/compiler/backend/ppc/code-generator-ppc.cc +++ b/deps/v8/src/compiler/backend/ppc/code-generator-ppc.cc @@ -449,41 +449,42 @@ void EmitWordLoadPoisoningIfNeeded(CodeGenerator* codegen, Instruction* instr, DCHECK_EQ(LeaveRC, i.OutputRCBit()); \ } while (0) -#define ASSEMBLE_FLOAT_MAX() \ - do { \ - DoubleRegister left_reg = i.InputDoubleRegister(0); \ - DoubleRegister right_reg = i.InputDoubleRegister(1); \ - DoubleRegister result_reg = i.OutputDoubleRegister(); \ - Label check_nan_left, check_zero, return_left, return_right, done; \ - __ fcmpu(left_reg, right_reg); \ - __ bunordered(&check_nan_left); \ - __ beq(&check_zero); \ - __ bge(&return_left); \ - __ b(&return_right); \ - \ - __ bind(&check_zero); \ - __ fcmpu(left_reg, kDoubleRegZero); \ - /* left == right != 0. */ \ - __ bne(&return_left); \ - /* At this point, both left and right are either 0 or -0. */ \ - __ fadd(result_reg, left_reg, right_reg); \ - __ b(&done); \ - \ - __ bind(&check_nan_left); \ - __ fcmpu(left_reg, left_reg); \ - /* left == NaN. */ \ - __ bunordered(&return_left); \ - __ bind(&return_right); \ - if (right_reg != result_reg) { \ - __ fmr(result_reg, right_reg); \ - } \ - __ b(&done); \ - \ - __ bind(&return_left); \ - if (left_reg != result_reg) { \ - __ fmr(result_reg, left_reg); \ - } \ - __ bind(&done); \ +#define ASSEMBLE_FLOAT_MAX() \ + do { \ + DoubleRegister left_reg = i.InputDoubleRegister(0); \ + DoubleRegister right_reg = i.InputDoubleRegister(1); \ + DoubleRegister result_reg = i.OutputDoubleRegister(); \ + Label check_zero, return_left, return_right, return_nan, done; \ + __ fcmpu(left_reg, right_reg); \ + __ bunordered(&return_nan); \ + __ beq(&check_zero); \ + __ bge(&return_left); \ + __ b(&return_right); \ + \ + __ bind(&check_zero); \ + __ fcmpu(left_reg, kDoubleRegZero); \ + /* left == right != 0. */ \ + __ bne(&return_left); \ + /* At this point, both left and right are either 0 or -0. */ \ + __ fadd(result_reg, left_reg, right_reg); \ + __ b(&done); \ + \ + __ bind(&return_nan); \ + /* If left or right are NaN, fadd propagates the appropriate one.*/ \ + __ fadd(result_reg, left_reg, right_reg); \ + __ b(&done); \ + \ + __ bind(&return_right); \ + if (right_reg != result_reg) { \ + __ fmr(result_reg, right_reg); \ + } \ + __ b(&done); \ + \ + __ bind(&return_left); \ + if (left_reg != result_reg) { \ + __ fmr(result_reg, left_reg); \ + } \ + __ bind(&done); \ } while (0) #define ASSEMBLE_FLOAT_MIN() \ @@ -491,9 +492,9 @@ void EmitWordLoadPoisoningIfNeeded(CodeGenerator* codegen, Instruction* instr, DoubleRegister left_reg = i.InputDoubleRegister(0); \ DoubleRegister right_reg = i.InputDoubleRegister(1); \ DoubleRegister result_reg = i.OutputDoubleRegister(); \ - Label check_nan_left, check_zero, return_left, return_right, done; \ + Label check_zero, return_left, return_right, return_nan, done; \ __ fcmpu(left_reg, right_reg); \ - __ bunordered(&check_nan_left); \ + __ bunordered(&return_nan); \ __ beq(&check_zero); \ __ ble(&return_left); \ __ b(&return_right); \ @@ -515,10 +516,10 @@ void EmitWordLoadPoisoningIfNeeded(CodeGenerator* codegen, Instruction* instr, __ fneg(result_reg, result_reg); \ __ b(&done); \ \ - __ bind(&check_nan_left); \ - __ fcmpu(left_reg, left_reg); \ - /* left == NaN. */ \ - __ bunordered(&return_left); \ + __ bind(&return_nan); \ + /* If left or right are NaN, fadd propagates the appropriate one.*/ \ + __ fadd(result_reg, left_reg, right_reg); \ + __ b(&done); \ \ __ bind(&return_right); \ if (right_reg != result_reg) { \ @@ -3228,7 +3229,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( i.InputSimd128Register(1)); break; } - case kPPC_S8x16Shuffle: { + case kPPC_I8x16Shuffle: { Simd128Register dst = i.OutputSimd128Register(), src0 = i.InputSimd128Register(0), src1 = i.InputSimd128Register(1); @@ -3287,7 +3288,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( i.InputSimd128Register(1)); break; } - case kPPC_S8x16Swizzle: { + case kPPC_I8x16Swizzle: { // Reverse the input to match IBM lane numbering. Simd128Register tempFPReg1 = i.ToSimd128Register(instr->TempAt(0)); __ addi(sp, sp, Operand(-16)); @@ -3355,6 +3356,88 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( i.InputSimd128Register(1)); break; } + case kPPC_S128AndNot: { + Simd128Register dst = i.OutputSimd128Register(); + Simd128Register src = i.InputSimd128Register(0); + __ vandc(dst, src, i.InputSimd128Register(1)); + break; + } + case kPPC_F64x2Div: { + __ xvdivdp(i.OutputSimd128Register(), i.InputSimd128Register(0), + i.InputSimd128Register(1)); + break; + } +#define F64X2_MIN_MAX_NAN(result) \ + Simd128Register tempFPReg1 = i.ToSimd128Register(instr->TempAt(0)); \ + __ xvcmpeqdp(tempFPReg1, i.InputSimd128Register(0), \ + i.InputSimd128Register(0)); \ + __ vsel(result, i.InputSimd128Register(0), result, tempFPReg1); \ + __ xvcmpeqdp(tempFPReg1, i.InputSimd128Register(1), \ + i.InputSimd128Register(1)); \ + __ vsel(i.OutputSimd128Register(), i.InputSimd128Register(1), result, \ + tempFPReg1); + case kPPC_F64x2Min: { + __ xvmindp(kScratchDoubleReg, i.InputSimd128Register(0), + i.InputSimd128Register(1)); + // We need to check if an input is NAN and preserve it. + F64X2_MIN_MAX_NAN(kScratchDoubleReg) + break; + } + case kPPC_F64x2Max: { + __ xvmaxdp(kScratchDoubleReg, i.InputSimd128Register(0), + i.InputSimd128Register(1)); + // We need to check if an input is NAN and preserve it. + F64X2_MIN_MAX_NAN(kScratchDoubleReg) + break; + } +#undef F64X2_MIN_MAX_NAN + case kPPC_F32x4Div: { + __ xvdivsp(i.OutputSimd128Register(), i.InputSimd128Register(0), + i.InputSimd128Register(1)); + break; + } + case kPPC_F32x4Min: { + __ vminfp(i.OutputSimd128Register(), i.InputSimd128Register(0), + i.InputSimd128Register(1)); + break; + } + case kPPC_F32x4Max: { + __ vmaxfp(i.OutputSimd128Register(), i.InputSimd128Register(0), + i.InputSimd128Register(1)); + break; + } + case kPPC_F64x2Ceil: { + __ xvrdpip(i.OutputSimd128Register(), i.InputSimd128Register(0)); + break; + } + case kPPC_F64x2Floor: { + __ xvrdpim(i.OutputSimd128Register(), i.InputSimd128Register(0)); + break; + } + case kPPC_F64x2Trunc: { + __ xvrdpiz(i.OutputSimd128Register(), i.InputSimd128Register(0)); + break; + } + case kPPC_F64x2NearestInt: { + __ xvrdpi(i.OutputSimd128Register(), i.InputSimd128Register(0)); + break; + } + case kPPC_F32x4Ceil: { + __ xvrspip(i.OutputSimd128Register(), i.InputSimd128Register(0)); + break; + } + case kPPC_F32x4Floor: { + __ xvrspim(i.OutputSimd128Register(), i.InputSimd128Register(0)); + break; + } + case kPPC_F32x4Trunc: { + __ xvrspiz(i.OutputSimd128Register(), i.InputSimd128Register(0)); + break; + } + case kPPC_F32x4NearestInt: { + __ xvrspi(i.OutputSimd128Register(), i.InputSimd128Register(0)); + break; + } case kPPC_StoreCompressTagged: { ASSEMBLE_STORE_INTEGER(StoreTaggedField, StoreTaggedFieldX); break; @@ -3631,9 +3714,6 @@ void CodeGenerator::AssembleConstructFrame() { } } else if (call_descriptor->IsJSFunctionCall()) { __ Prologue(); - if (call_descriptor->PushArgumentCount()) { - __ Push(kJavaScriptCallArgCountRegister); - } } else { StackFrame::Type type = info()->GetOutputStackFrameType(); // TODO(mbrandy): Detect cases where ip is the entrypoint (for diff --git a/deps/v8/src/compiler/backend/ppc/instruction-codes-ppc.h b/deps/v8/src/compiler/backend/ppc/instruction-codes-ppc.h index 9dc7bf49d096ec..fb5151ebd44479 100644 --- a/deps/v8/src/compiler/backend/ppc/instruction-codes-ppc.h +++ b/deps/v8/src/compiler/backend/ppc/instruction-codes-ppc.h @@ -207,6 +207,13 @@ namespace compiler { V(PPC_F64x2Sqrt) \ V(PPC_F64x2Qfma) \ V(PPC_F64x2Qfms) \ + V(PPC_F64x2Div) \ + V(PPC_F64x2Min) \ + V(PPC_F64x2Max) \ + V(PPC_F64x2Ceil) \ + V(PPC_F64x2Floor) \ + V(PPC_F64x2Trunc) \ + V(PPC_F64x2NearestInt) \ V(PPC_F32x4Splat) \ V(PPC_F32x4ExtractLane) \ V(PPC_F32x4ReplaceLane) \ @@ -225,6 +232,13 @@ namespace compiler { V(PPC_F32x4Sqrt) \ V(PPC_F32x4SConvertI32x4) \ V(PPC_F32x4UConvertI32x4) \ + V(PPC_F32x4Div) \ + V(PPC_F32x4Min) \ + V(PPC_F32x4Max) \ + V(PPC_F32x4Ceil) \ + V(PPC_F32x4Floor) \ + V(PPC_F32x4Trunc) \ + V(PPC_F32x4NearestInt) \ V(PPC_I64x2Splat) \ V(PPC_I64x2ExtractLane) \ V(PPC_I64x2ReplaceLane) \ @@ -338,8 +352,8 @@ namespace compiler { V(PPC_I8x16AddSaturateU) \ V(PPC_I8x16SubSaturateU) \ V(PPC_I8x16RoundingAverageU) \ - V(PPC_S8x16Shuffle) \ - V(PPC_S8x16Swizzle) \ + V(PPC_I8x16Shuffle) \ + V(PPC_I8x16Swizzle) \ V(PPC_V64x2AnyTrue) \ V(PPC_V32x4AnyTrue) \ V(PPC_V16x8AnyTrue) \ @@ -354,6 +368,7 @@ namespace compiler { V(PPC_S128Zero) \ V(PPC_S128Not) \ V(PPC_S128Select) \ + V(PPC_S128AndNot) \ V(PPC_StoreCompressTagged) \ V(PPC_LoadDecompressTaggedSigned) \ V(PPC_LoadDecompressTaggedPointer) \ diff --git a/deps/v8/src/compiler/backend/ppc/instruction-scheduler-ppc.cc b/deps/v8/src/compiler/backend/ppc/instruction-scheduler-ppc.cc index 0493d81dd73f1e..8beaa8539c836f 100644 --- a/deps/v8/src/compiler/backend/ppc/instruction-scheduler-ppc.cc +++ b/deps/v8/src/compiler/backend/ppc/instruction-scheduler-ppc.cc @@ -130,6 +130,13 @@ int InstructionScheduler::GetTargetInstructionFlags( case kPPC_F64x2Sqrt: case kPPC_F64x2Qfma: case kPPC_F64x2Qfms: + case kPPC_F64x2Div: + case kPPC_F64x2Min: + case kPPC_F64x2Max: + case kPPC_F64x2Ceil: + case kPPC_F64x2Floor: + case kPPC_F64x2Trunc: + case kPPC_F64x2NearestInt: case kPPC_F32x4Splat: case kPPC_F32x4ExtractLane: case kPPC_F32x4ReplaceLane: @@ -150,6 +157,13 @@ int InstructionScheduler::GetTargetInstructionFlags( case kPPC_F32x4UConvertI32x4: case kPPC_F32x4Qfma: case kPPC_F32x4Qfms: + case kPPC_F32x4Div: + case kPPC_F32x4Min: + case kPPC_F32x4Max: + case kPPC_F32x4Ceil: + case kPPC_F32x4Floor: + case kPPC_F32x4Trunc: + case kPPC_F32x4NearestInt: case kPPC_I64x2Splat: case kPPC_I64x2ExtractLane: case kPPC_I64x2ReplaceLane: @@ -261,8 +275,8 @@ int InstructionScheduler::GetTargetInstructionFlags( case kPPC_I8x16AddSaturateU: case kPPC_I8x16SubSaturateU: case kPPC_I8x16RoundingAverageU: - case kPPC_S8x16Shuffle: - case kPPC_S8x16Swizzle: + case kPPC_I8x16Shuffle: + case kPPC_I8x16Swizzle: case kPPC_V64x2AnyTrue: case kPPC_V32x4AnyTrue: case kPPC_V16x8AnyTrue: @@ -277,6 +291,7 @@ int InstructionScheduler::GetTargetInstructionFlags( case kPPC_S128Zero: case kPPC_S128Not: case kPPC_S128Select: + case kPPC_S128AndNot: return kNoOpcodeFlags; case kPPC_LoadWordS8: diff --git a/deps/v8/src/compiler/backend/ppc/instruction-selector-ppc.cc b/deps/v8/src/compiler/backend/ppc/instruction-selector-ppc.cc index 507542e28cc626..0c61821cf5baaa 100644 --- a/deps/v8/src/compiler/backend/ppc/instruction-selector-ppc.cc +++ b/deps/v8/src/compiler/backend/ppc/instruction-selector-ppc.cc @@ -1200,6 +1200,10 @@ void InstructionSelector::VisitSignExtendWord32ToInt64(Node* node) { VisitRR(this, kPPC_ExtendSignWord32, node); } +bool InstructionSelector::ZeroExtendsWord32ToWord64NoPhis(Node* node) { + UNIMPLEMENTED(); +} + void InstructionSelector::VisitChangeUint32ToUint64(Node* node) { // TODO(mbrandy): inspect input to see if nop is appropriate. VisitRR(this, kPPC_Uint32ToUint64, node); @@ -2156,6 +2160,9 @@ void InstructionSelector::VisitInt64AbsWithOverflow(Node* node) { V(F64x2Ne) \ V(F64x2Le) \ V(F64x2Lt) \ + V(F64x2Div) \ + V(F64x2Min) \ + V(F64x2Max) \ V(F32x4Add) \ V(F32x4AddHoriz) \ V(F32x4Sub) \ @@ -2164,6 +2171,9 @@ void InstructionSelector::VisitInt64AbsWithOverflow(Node* node) { V(F32x4Ne) \ V(F32x4Lt) \ V(F32x4Le) \ + V(F32x4Div) \ + V(F32x4Min) \ + V(F32x4Max) \ V(I64x2Add) \ V(I64x2Sub) \ V(I64x2Mul) \ @@ -2222,15 +2232,20 @@ void InstructionSelector::VisitInt64AbsWithOverflow(Node* node) { V(I8x16AddSaturateU) \ V(I8x16SubSaturateU) \ V(I8x16RoundingAverageU) \ + V(I8x16Swizzle) \ V(S128And) \ V(S128Or) \ V(S128Xor) \ - V(S8x16Swizzle) + V(S128AndNot) #define SIMD_UNOP_LIST(V) \ V(F64x2Abs) \ V(F64x2Neg) \ V(F64x2Sqrt) \ + V(F64x2Ceil) \ + V(F64x2Floor) \ + V(F64x2Trunc) \ + V(F64x2NearestInt) \ V(F32x4Abs) \ V(F32x4Neg) \ V(F32x4RecipApprox) \ @@ -2238,6 +2253,10 @@ void InstructionSelector::VisitInt64AbsWithOverflow(Node* node) { V(F32x4Sqrt) \ V(F32x4SConvertI32x4) \ V(F32x4UConvertI32x4) \ + V(F32x4Ceil) \ + V(F32x4Floor) \ + V(F32x4Trunc) \ + V(F32x4NearestInt) \ V(I64x2Neg) \ V(I32x4Neg) \ V(I32x4Abs) \ @@ -2361,7 +2380,7 @@ SIMD_BOOL_LIST(SIMD_VISIT_BOOL) #undef SIMD_BOOL_LIST #undef SIMD_TYPES -void InstructionSelector::VisitS8x16Shuffle(Node* node) { +void InstructionSelector::VisitI8x16Shuffle(Node* node) { uint8_t shuffle[kSimd128Size]; bool is_swizzle; CanonicalizeShuffle(node, shuffle, &is_swizzle); @@ -2378,7 +2397,7 @@ void InstructionSelector::VisitS8x16Shuffle(Node* node) { ? max_index - current_index : total_lane_count - current_index + max_index); } - Emit(kPPC_S8x16Shuffle, g.DefineAsRegister(node), g.UseUniqueRegister(input0), + Emit(kPPC_I8x16Shuffle, g.DefineAsRegister(node), g.UseUniqueRegister(input0), g.UseUniqueRegister(input1), g.UseImmediate(wasm::SimdShuffle::Pack4Lanes(shuffle_remapped)), g.UseImmediate(wasm::SimdShuffle::Pack4Lanes(shuffle_remapped + 4)), @@ -2400,7 +2419,11 @@ void InstructionSelector::VisitS128Select(Node* node) { void InstructionSelector::VisitS128Const(Node* node) { UNIMPLEMENTED(); } -void InstructionSelector::VisitS128AndNot(Node* node) { UNIMPLEMENTED(); } +void InstructionSelector::VisitI8x16BitMask(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI16x8BitMask(Node* node) { UNIMPLEMENTED(); } + +void InstructionSelector::VisitI32x4BitMask(Node* node) { UNIMPLEMENTED(); } void InstructionSelector::EmitPrepareResults( ZoneVector* results, const CallDescriptor* call_descriptor, @@ -2427,19 +2450,15 @@ void InstructionSelector::EmitPrepareResults( } } -void InstructionSelector::VisitF32x4Div(Node* node) { UNIMPLEMENTED(); } - -void InstructionSelector::VisitF32x4Min(Node* node) { UNIMPLEMENTED(); } - -void InstructionSelector::VisitF32x4Max(Node* node) { UNIMPLEMENTED(); } +void InstructionSelector::VisitLoadTransform(Node* node) { UNIMPLEMENTED(); } -void InstructionSelector::VisitF64x2Div(Node* node) { UNIMPLEMENTED(); } +void InstructionSelector::VisitF32x4Pmin(Node* node) { UNIMPLEMENTED(); } -void InstructionSelector::VisitF64x2Min(Node* node) { UNIMPLEMENTED(); } +void InstructionSelector::VisitF32x4Pmax(Node* node) { UNIMPLEMENTED(); } -void InstructionSelector::VisitF64x2Max(Node* node) { UNIMPLEMENTED(); } +void InstructionSelector::VisitF64x2Pmin(Node* node) { UNIMPLEMENTED(); } -void InstructionSelector::VisitLoadTransform(Node* node) { UNIMPLEMENTED(); } +void InstructionSelector::VisitF64x2Pmax(Node* node) { UNIMPLEMENTED(); } // static MachineOperatorBuilder::Flags diff --git a/deps/v8/src/compiler/backend/register-allocator.cc b/deps/v8/src/compiler/backend/register-allocator.cc index b3b40281b96620..30724647c6b94f 100644 --- a/deps/v8/src/compiler/backend/register-allocator.cc +++ b/deps/v8/src/compiler/backend/register-allocator.cc @@ -300,7 +300,6 @@ LiveRange::LiveRange(int relative_id, MachineRepresentation rep, next_(nullptr), current_interval_(nullptr), last_processed_use_(nullptr), - splitting_pointer_(nullptr), current_hint_position_(nullptr) { DCHECK(AllocatedOperand::IsSupportedRepresentation(rep)); bits_ = AssignedRegisterField::encode(kUnassignedRegister) | @@ -597,10 +596,7 @@ UsePosition* LiveRange::DetachAt(LifetimePosition position, LiveRange* result, // Find the last use position before the split and the first use // position after it. - UsePosition* use_after = - splitting_pointer_ == nullptr || splitting_pointer_->pos() > position - ? first_pos() - : splitting_pointer_; + UsePosition* use_after = first_pos(); UsePosition* use_before = nullptr; if (split_at_start) { // The split position coincides with the beginning of a use interval (the @@ -819,24 +815,16 @@ TopLevelLiveRange::TopLevelLiveRange(int vreg, MachineRepresentation rep) : LiveRange(0, rep, this), vreg_(vreg), last_child_id_(0), - splintered_from_(nullptr), spill_operand_(nullptr), spill_move_insertion_locations_(nullptr), spilled_in_deferred_blocks_(false), has_preassigned_slot_(false), spill_start_index_(kMaxInt), last_pos_(nullptr), - last_child_covers_(this), - splinter_(nullptr) { + last_child_covers_(this) { bits_ |= SpillTypeField::encode(SpillType::kNoSpillType); } -#if DEBUG -int TopLevelLiveRange::debug_virt_reg() const { - return IsSplinter() ? splintered_from()->vreg() : vreg(); -} -#endif - void TopLevelLiveRange::RecordSpillLocation(Zone* zone, int gap_index, InstructionOperand* operand) { DCHECK(HasNoSpillType()); @@ -925,157 +913,6 @@ AllocatedOperand TopLevelLiveRange::GetSpillRangeOperand() const { return AllocatedOperand(LocationOperand::STACK_SLOT, representation(), index); } -void TopLevelLiveRange::Splinter(LifetimePosition start, LifetimePosition end, - Zone* zone) { - DCHECK(start != Start() || end != End()); - DCHECK(start < end); - - TopLevelLiveRange splinter_temp(-1, representation()); - UsePosition* last_in_splinter = nullptr; - // Live ranges defined in deferred blocks stay in deferred blocks, so we - // don't need to splinter them. That means that start should always be - // after the beginning of the range. - DCHECK(start > Start()); - - if (end >= End()) { - DCHECK(start > Start()); - DetachAt(start, &splinter_temp, zone, ConnectHints); - next_ = nullptr; - } else { - DCHECK(start < End() && Start() < end); - - const int kInvalidId = std::numeric_limits::max(); - - UsePosition* last = DetachAt(start, &splinter_temp, zone, ConnectHints); - - LiveRange end_part(kInvalidId, this->representation(), nullptr); - // The last chunk exits the deferred region, and we don't want to connect - // hints here, because the non-deferred region shouldn't be affected - // by allocation decisions on the deferred path. - last_in_splinter = - splinter_temp.DetachAt(end, &end_part, zone, DoNotConnectHints); - - next_ = end_part.next_; - last_interval_->set_next(end_part.first_interval_); - // The next splinter will happen either at or after the current interval. - // We can optimize DetachAt by setting current_interval_ accordingly, - // which will then be picked up by FirstSearchIntervalForPosition. - current_interval_ = last_interval_; - last_interval_ = end_part.last_interval_; - - if (first_pos_ == nullptr) { - first_pos_ = end_part.first_pos_; - } else { - splitting_pointer_ = last; - if (last != nullptr) last->set_next(end_part.first_pos_); - } - } - - if (splinter()->IsEmpty()) { - splinter()->first_interval_ = splinter_temp.first_interval_; - splinter()->last_interval_ = splinter_temp.last_interval_; - } else { - splinter()->last_interval_->set_next(splinter_temp.first_interval_); - splinter()->last_interval_ = splinter_temp.last_interval_; - } - if (splinter()->first_pos() == nullptr) { - splinter()->first_pos_ = splinter_temp.first_pos_; - } else { - splinter()->last_pos_->set_next(splinter_temp.first_pos_); - } - if (last_in_splinter != nullptr) { - splinter()->last_pos_ = last_in_splinter; - } else { - if (splinter()->first_pos() != nullptr && - splinter()->last_pos_ == nullptr) { - splinter()->last_pos_ = splinter()->first_pos(); - for (UsePosition* pos = splinter()->first_pos(); pos != nullptr; - pos = pos->next()) { - splinter()->last_pos_ = pos; - } - } - } -#if DEBUG - Verify(); - splinter()->Verify(); -#endif -} - -void TopLevelLiveRange::SetSplinteredFrom(TopLevelLiveRange* splinter_parent) { - splintered_from_ = splinter_parent; - if (!HasSpillOperand() && splinter_parent->spill_range_ != nullptr) { - SetSpillRange(splinter_parent->spill_range_); - } -} - -void TopLevelLiveRange::UpdateSpillRangePostMerge(TopLevelLiveRange* merged) { - DCHECK(merged->TopLevel() == this); - - if (HasNoSpillType() && merged->HasSpillRange()) { - set_spill_type(merged->spill_type()); - DCHECK_LT(0, GetSpillRange()->live_ranges().size()); - merged->spill_range_ = nullptr; - merged->bits_ = - SpillTypeField::update(merged->bits_, SpillType::kNoSpillType); - } -} - -void TopLevelLiveRange::Merge(TopLevelLiveRange* other, Zone* zone) { - DCHECK(Start() < other->Start()); - DCHECK(other->splintered_from() == this); - - LiveRange* first = this; - LiveRange* second = other; - DCHECK(first->Start() < second->Start()); - while (first != nullptr && second != nullptr) { - DCHECK(first != second); - // Make sure the ranges are in order each time we iterate. - if (second->Start() < first->Start()) { - LiveRange* tmp = second; - second = first; - first = tmp; - continue; - } - - if (first->End() <= second->Start()) { - if (first->next() == nullptr || - first->next()->Start() > second->Start()) { - // First is in order before second. - LiveRange* temp = first->next(); - first->next_ = second; - first = temp; - } else { - // First is in order before its successor (or second), so advance first. - first = first->next(); - } - continue; - } - - DCHECK(first->Start() < second->Start()); - // If first and second intersect, split first. - if (first->Start() < second->End() && second->Start() < first->End()) { - LiveRange* temp = first->SplitAt(second->Start(), zone); - CHECK(temp != first); - temp->set_spilled(first->spilled()); - if (!temp->spilled()) - temp->set_assigned_register(first->assigned_register()); - - first->next_ = second; - first = temp; - continue; - } - DCHECK(first->End() <= second->Start()); - } - - TopLevel()->UpdateParentForAllChildren(TopLevel()); - TopLevel()->UpdateSpillRangePostMerge(other); - TopLevel()->register_slot_use(other->slot_use_kind()); - -#if DEBUG - Verify(); -#endif -} - void TopLevelLiveRange::VerifyChildrenInOrder() const { LifetimePosition last_end = End(); for (const LiveRange* child = this->next(); child != nullptr; @@ -1271,8 +1108,7 @@ void PrintBlockRow(std::ostream& os, const InstructionBlocks& blocks) { void LinearScanAllocator::PrintRangeRow(std::ostream& os, const TopLevelLiveRange* toplevel) { int position = 0; - os << std::setw(3) << toplevel->vreg() - << (toplevel->IsSplinter() ? "s:" : ": "); + os << std::setw(3) << toplevel->vreg() << ": "; const char* kind_string; switch (toplevel->spill_type()) { @@ -1340,10 +1176,9 @@ SpillRange::SpillRange(TopLevelLiveRange* parent, Zone* zone) : live_ranges_(zone), assigned_slot_(kUnassignedSlot), byte_width_(ByteWidthForStackSlot(parent->representation())) { - // Spill ranges are created for top level, non-splintered ranges. This is so - // that, when merging decisions are made, we consider the full extent of the - // virtual register, and avoid clobbering it. - DCHECK(!parent->IsSplinter()); + // Spill ranges are created for top level. This is so that, when merging + // decisions are made, we consider the full extent of the virtual register, + // and avoid clobbering it. UseInterval* result = nullptr; UseInterval* node = nullptr; // Copy the intervals for all ranges. @@ -1646,32 +1481,16 @@ SpillRange* TopTierRegisterAllocationData::AssignSpillRangeToLiveRange( SpillRange* spill_range = range->GetAllocatedSpillRange(); if (spill_range == nullptr) { - DCHECK(!range->IsSplinter()); spill_range = allocation_zone()->New(range, allocation_zone()); } if (spill_mode == SpillMode::kSpillDeferred && (range->spill_type() != SpillType::kSpillRange)) { - DCHECK(is_turbo_control_flow_aware_allocation()); range->set_spill_type(SpillType::kDeferredSpillRange); } else { range->set_spill_type(SpillType::kSpillRange); } - int spill_range_index = - range->IsSplinter() ? range->splintered_from()->vreg() : range->vreg(); - - spill_ranges()[spill_range_index] = spill_range; - - return spill_range; -} - -SpillRange* TopTierRegisterAllocationData::CreateSpillRangeForLiveRange( - TopLevelLiveRange* range) { - DCHECK(is_turbo_preprocess_ranges()); - DCHECK(!range->HasSpillOperand()); - DCHECK(!range->IsSplinter()); - SpillRange* spill_range = - allocation_zone()->New(range, allocation_zone()); + spill_ranges()[range->vreg()] = spill_range; return spill_range; } @@ -2337,15 +2156,10 @@ void LiveRangeBuilder::ProcessInstructions(const InstructionBlock* block, int vreg = unalloc->virtual_register(); live->Add(vreg); if (unalloc->HasSlotPolicy()) { - if (data()->is_turbo_control_flow_aware_allocation()) { - data()->GetOrCreateLiveRangeFor(vreg)->register_slot_use( - block->IsDeferred() - ? TopLevelLiveRange::SlotUseKind::kDeferredSlotUse - : TopLevelLiveRange::SlotUseKind::kGeneralSlotUse); - } else { - data()->GetOrCreateLiveRangeFor(vreg)->register_slot_use( - TopLevelLiveRange::SlotUseKind::kGeneralSlotUse); - } + data()->GetOrCreateLiveRangeFor(vreg)->register_slot_use( + block->IsDeferred() + ? TopLevelLiveRange::SlotUseKind::kDeferredSlotUse + : TopLevelLiveRange::SlotUseKind::kGeneralSlotUse); } } Use(block_start_position, use_pos, input, spill_mode); @@ -2917,12 +2731,7 @@ void RegisterAllocator::SplitAndSpillRangesDefinedByMemoryOperand() { next_pos = next_pos.NextStart(); } - // With splinters, we can be more strict and skip over positions - // not strictly needing registers. - UsePosition* pos = - range->IsSplinter() - ? range->NextRegisterPosition(next_pos) - : range->NextUsePositionRegisterIsBeneficial(next_pos); + UsePosition* pos = range->NextUsePositionRegisterIsBeneficial(next_pos); // If the range already has a spill operand and it doesn't need a // register immediately, split it and spill the first part of the range. if (pos == nullptr) { @@ -3025,66 +2834,42 @@ LifetimePosition RegisterAllocator::FindOptimalSpillingPos( block->IsLoopHeader() ? block : GetContainingLoop(code(), block); if (loop_header == nullptr) return pos; - if (data()->is_turbo_control_flow_aware_allocation()) { - while (loop_header != nullptr) { - // We are going to spill live range inside the loop. - // If possible try to move spilling position backwards to loop header. - // This will reduce number of memory moves on the back edge. - LifetimePosition loop_start = LifetimePosition::GapFromInstructionIndex( - loop_header->first_instruction_index()); - // Stop if we moved to a loop header before the value is defined or - // at the define position that is not beneficial to spill. - if (range->TopLevel()->Start() > loop_start || - (range->TopLevel()->Start() == loop_start && - range->TopLevel()->SpillAtLoopHeaderNotBeneficial())) - return pos; - - LiveRange* live_at_header = range->TopLevel()->GetChildCovers(loop_start); - - if (live_at_header != nullptr && !live_at_header->spilled()) { - for (LiveRange* check_use = live_at_header; - check_use != nullptr && check_use->Start() < pos; - check_use = check_use->next()) { - // If we find a use for which spilling is detrimental, don't spill - // at the loop header - UsePosition* next_use = - check_use->NextUsePositionSpillDetrimental(loop_start); - // UsePosition at the end of a UseInterval may - // have the same value as the start of next range. - if (next_use != nullptr && next_use->pos() <= pos) { - return pos; - } + while (loop_header != nullptr) { + // We are going to spill live range inside the loop. + // If possible try to move spilling position backwards to loop header. + // This will reduce number of memory moves on the back edge. + LifetimePosition loop_start = LifetimePosition::GapFromInstructionIndex( + loop_header->first_instruction_index()); + // Stop if we moved to a loop header before the value is defined or + // at the define position that is not beneficial to spill. + if (range->TopLevel()->Start() > loop_start || + (range->TopLevel()->Start() == loop_start && + range->TopLevel()->SpillAtLoopHeaderNotBeneficial())) + return pos; + + LiveRange* live_at_header = range->TopLevel()->GetChildCovers(loop_start); + + if (live_at_header != nullptr && !live_at_header->spilled()) { + for (LiveRange* check_use = live_at_header; + check_use != nullptr && check_use->Start() < pos; + check_use = check_use->next()) { + // If we find a use for which spilling is detrimental, don't spill + // at the loop header + UsePosition* next_use = + check_use->NextUsePositionSpillDetrimental(loop_start); + // UsePosition at the end of a UseInterval may + // have the same value as the start of next range. + if (next_use != nullptr && next_use->pos() <= pos) { + return pos; } - // No register beneficial use inside the loop before the pos. - *begin_spill_out = live_at_header; - pos = loop_start; } - - // Try hoisting out to an outer loop. - loop_header = GetContainingLoop(code(), loop_header); + // No register beneficial use inside the loop before the pos. + *begin_spill_out = live_at_header; + pos = loop_start; } - } else { - const UsePosition* prev_use = - range->PreviousUsePositionRegisterIsBeneficial(pos); - - while (loop_header != nullptr) { - // We are going to spill live range inside the loop. - // If possible try to move spilling position backwards to loop header - // inside the current range. This will reduce number of memory moves on - // the back edge. - LifetimePosition loop_start = LifetimePosition::GapFromInstructionIndex( - loop_header->first_instruction_index()); - - if (range->Covers(loop_start)) { - if (prev_use == nullptr || prev_use->pos() < loop_start) { - // No register beneficial use inside the loop before the pos. - pos = loop_start; - } - } - // Try hoisting out to an outer loop. - loop_header = GetContainingLoop(code(), loop_header); - } + // Try hoisting out to an outer loop. + loop_header = GetContainingLoop(code(), loop_header); } return pos; } @@ -3761,9 +3546,7 @@ void LinearScanAllocator::AllocateRegisters() { // those. Not only does this produce a potentially bad assignment, it also // breaks with the invariant that we undo spills that happen in deferred code // when crossing a deferred/non-deferred boundary. - while (!unhandled_live_ranges().empty() || - (data()->is_turbo_control_flow_aware_allocation() && - last_block < max_blocks)) { + while (!unhandled_live_ranges().empty() || last_block < max_blocks) { data()->tick_counter()->TickAndMaybeEnterSafepoint(); LiveRange* current = unhandled_live_ranges().empty() ? nullptr @@ -3773,160 +3556,155 @@ void LinearScanAllocator::AllocateRegisters() { #ifdef DEBUG allocation_finger_ = position; #endif - if (data()->is_turbo_control_flow_aware_allocation()) { - // Splintering is not supported. - CHECK(!data()->is_turbo_preprocess_ranges()); - // Check whether we just moved across a block boundary. This will trigger - // for the first range that is past the current boundary. - if (position >= next_block_boundary) { - TRACE("Processing boundary at %d leaving %d\n", - next_block_boundary.value(), last_block.ToInt()); - - // Forward state to before block boundary - LifetimePosition end_of_block = next_block_boundary.PrevStart().End(); - ForwardStateTo(end_of_block); - - // Remember this state. - InstructionBlock* current_block = data()->code()->GetInstructionBlock( - next_block_boundary.ToInstructionIndex()); - - // Store current spill state (as the state at end of block). For - // simplicity, we store the active ranges, e.g., the live ranges that - // are not spilled. - data()->RememberSpillState(last_block, active_live_ranges()); - - // Only reset the state if this was not a direct fallthrough. Otherwise - // control flow resolution will get confused (it does not expect changes - // across fallthrough edges.). - bool fallthrough = (current_block->PredecessorCount() == 1) && - current_block->predecessors()[0].IsNext( - current_block->rpo_number()); - - // When crossing a deferred/non-deferred boundary, we have to load or - // remove the deferred fixed ranges from inactive. - if ((spill_mode == SpillMode::kSpillDeferred) != - current_block->IsDeferred()) { - // Update spill mode. - spill_mode = current_block->IsDeferred() - ? SpillMode::kSpillDeferred - : SpillMode::kSpillAtDefinition; - - ForwardStateTo(next_block_boundary); + // Check whether we just moved across a block boundary. This will trigger + // for the first range that is past the current boundary. + if (position >= next_block_boundary) { + TRACE("Processing boundary at %d leaving %d\n", + next_block_boundary.value(), last_block.ToInt()); + + // Forward state to before block boundary + LifetimePosition end_of_block = next_block_boundary.PrevStart().End(); + ForwardStateTo(end_of_block); + + // Remember this state. + InstructionBlock* current_block = data()->code()->GetInstructionBlock( + next_block_boundary.ToInstructionIndex()); + + // Store current spill state (as the state at end of block). For + // simplicity, we store the active ranges, e.g., the live ranges that + // are not spilled. + data()->RememberSpillState(last_block, active_live_ranges()); + + // Only reset the state if this was not a direct fallthrough. Otherwise + // control flow resolution will get confused (it does not expect changes + // across fallthrough edges.). + bool fallthrough = + (current_block->PredecessorCount() == 1) && + current_block->predecessors()[0].IsNext(current_block->rpo_number()); + + // When crossing a deferred/non-deferred boundary, we have to load or + // remove the deferred fixed ranges from inactive. + if ((spill_mode == SpillMode::kSpillDeferred) != + current_block->IsDeferred()) { + // Update spill mode. + spill_mode = current_block->IsDeferred() + ? SpillMode::kSpillDeferred + : SpillMode::kSpillAtDefinition; + + ForwardStateTo(next_block_boundary); #ifdef DEBUG - // Allow allocation at current position. - allocation_finger_ = next_block_boundary; + // Allow allocation at current position. + allocation_finger_ = next_block_boundary; #endif - UpdateDeferredFixedRanges(spill_mode, current_block); - } + UpdateDeferredFixedRanges(spill_mode, current_block); + } - // Allocation relies on the fact that each non-deferred block has at - // least one non-deferred predecessor. Check this invariant here. - DCHECK_IMPLIES(!current_block->IsDeferred(), - HasNonDeferredPredecessor(current_block)); + // Allocation relies on the fact that each non-deferred block has at + // least one non-deferred predecessor. Check this invariant here. + DCHECK_IMPLIES(!current_block->IsDeferred(), + HasNonDeferredPredecessor(current_block)); - if (!fallthrough) { + if (!fallthrough) { #ifdef DEBUG - // Allow allocation at current position. - allocation_finger_ = next_block_boundary; + // Allow allocation at current position. + allocation_finger_ = next_block_boundary; #endif - // We are currently at next_block_boundary - 1. Move the state to the - // actual block boundary position. In particular, we have to - // reactivate inactive ranges so that they get rescheduled for - // allocation if they were not live at the predecessors. - ForwardStateTo(next_block_boundary); - - RangeWithRegisterSet to_be_live(data()->allocation_zone()); - - // If we end up deciding to use the state of the immediate - // predecessor, it is better not to perform a change. It would lead to - // the same outcome anyway. - // This may never happen on boundaries between deferred and - // non-deferred code, as we rely on explicit respill to ensure we - // spill at definition. - bool no_change_required = false; - - auto pick_state_from = [this, current_block]( - RpoNumber pred, - RangeWithRegisterSet* to_be_live) -> bool { - TRACE("Using information from B%d\n", pred.ToInt()); - // If this is a fall-through that is not across a deferred - // boundary, there is nothing to do. - bool is_noop = pred.IsNext(current_block->rpo_number()); - if (!is_noop) { - auto& spill_state = data()->GetSpillState(pred); - TRACE("Not a fallthrough. Adding %zu elements...\n", - spill_state.size()); - LifetimePosition pred_end = - LifetimePosition::GapFromInstructionIndex( - this->code()->InstructionBlockAt(pred)->code_end()); - for (const auto range : spill_state) { - // Filter out ranges that were split or had their register - // stolen by backwards working spill heuristics. These have - // been spilled after the fact, so ignore them. - if (range->End() < pred_end || !range->HasRegisterAssigned()) - continue; - to_be_live->emplace(range); - } - } - return is_noop; - }; - - // Multiple cases here: - // 1) We have a single predecessor => this is a control flow split, so - // just restore the predecessor state. - // 2) We have two predecessors => this is a conditional, so break ties - // based on what to do based on forward uses, trying to benefit - // the same branch if in doubt (make one path fast). - // 3) We have many predecessors => this is a switch. Compute union - // based on majority, break ties by looking forward. - if (current_block->PredecessorCount() == 1) { - TRACE("Single predecessor for B%d\n", - current_block->rpo_number().ToInt()); - no_change_required = - pick_state_from(current_block->predecessors()[0], &to_be_live); - } else if (current_block->PredecessorCount() == 2) { - TRACE("Two predecessors for B%d\n", - current_block->rpo_number().ToInt()); - // If one of the branches does not contribute any information, - // e.g. because it is deferred or a back edge, we can short cut - // here right away. - RpoNumber chosen_predecessor = RpoNumber::Invalid(); - if (!ConsiderBlockForControlFlow( - current_block, current_block->predecessors()[0])) { - chosen_predecessor = current_block->predecessors()[1]; - } else if (!ConsiderBlockForControlFlow( - current_block, current_block->predecessors()[1])) { - chosen_predecessor = current_block->predecessors()[0]; - } else { - chosen_predecessor = ChooseOneOfTwoPredecessorStates( - current_block, next_block_boundary); + // We are currently at next_block_boundary - 1. Move the state to the + // actual block boundary position. In particular, we have to + // reactivate inactive ranges so that they get rescheduled for + // allocation if they were not live at the predecessors. + ForwardStateTo(next_block_boundary); + + RangeWithRegisterSet to_be_live(data()->allocation_zone()); + + // If we end up deciding to use the state of the immediate + // predecessor, it is better not to perform a change. It would lead to + // the same outcome anyway. + // This may never happen on boundaries between deferred and + // non-deferred code, as we rely on explicit respill to ensure we + // spill at definition. + bool no_change_required = false; + + auto pick_state_from = [this, current_block]( + RpoNumber pred, + RangeWithRegisterSet* to_be_live) -> bool { + TRACE("Using information from B%d\n", pred.ToInt()); + // If this is a fall-through that is not across a deferred + // boundary, there is nothing to do. + bool is_noop = pred.IsNext(current_block->rpo_number()); + if (!is_noop) { + auto& spill_state = data()->GetSpillState(pred); + TRACE("Not a fallthrough. Adding %zu elements...\n", + spill_state.size()); + LifetimePosition pred_end = + LifetimePosition::GapFromInstructionIndex( + this->code()->InstructionBlockAt(pred)->code_end()); + for (const auto range : spill_state) { + // Filter out ranges that were split or had their register + // stolen by backwards working spill heuristics. These have + // been spilled after the fact, so ignore them. + if (range->End() < pred_end || !range->HasRegisterAssigned()) + continue; + to_be_live->emplace(range); } - no_change_required = - pick_state_from(chosen_predecessor, &to_be_live); - + } + return is_noop; + }; + + // Multiple cases here: + // 1) We have a single predecessor => this is a control flow split, so + // just restore the predecessor state. + // 2) We have two predecessors => this is a conditional, so break ties + // based on what to do based on forward uses, trying to benefit + // the same branch if in doubt (make one path fast). + // 3) We have many predecessors => this is a switch. Compute union + // based on majority, break ties by looking forward. + if (current_block->PredecessorCount() == 1) { + TRACE("Single predecessor for B%d\n", + current_block->rpo_number().ToInt()); + no_change_required = + pick_state_from(current_block->predecessors()[0], &to_be_live); + } else if (current_block->PredecessorCount() == 2) { + TRACE("Two predecessors for B%d\n", + current_block->rpo_number().ToInt()); + // If one of the branches does not contribute any information, + // e.g. because it is deferred or a back edge, we can short cut + // here right away. + RpoNumber chosen_predecessor = RpoNumber::Invalid(); + if (!ConsiderBlockForControlFlow(current_block, + current_block->predecessors()[0])) { + chosen_predecessor = current_block->predecessors()[1]; + } else if (!ConsiderBlockForControlFlow( + current_block, current_block->predecessors()[1])) { + chosen_predecessor = current_block->predecessors()[0]; } else { - // Merge at the end of, e.g., a switch. - ComputeStateFromManyPredecessors(current_block, &to_be_live); + chosen_predecessor = ChooseOneOfTwoPredecessorStates( + current_block, next_block_boundary); } + no_change_required = pick_state_from(chosen_predecessor, &to_be_live); - if (!no_change_required) { - SpillNotLiveRanges(&to_be_live, next_block_boundary, spill_mode); - ReloadLiveRanges(to_be_live, next_block_boundary); - } + } else { + // Merge at the end of, e.g., a switch. + ComputeStateFromManyPredecessors(current_block, &to_be_live); + } + + if (!no_change_required) { + SpillNotLiveRanges(&to_be_live, next_block_boundary, spill_mode); + ReloadLiveRanges(to_be_live, next_block_boundary); } - // Update block information - last_block = current_block->rpo_number(); - next_block_boundary = LifetimePosition::InstructionFromInstructionIndex( - current_block->last_instruction_index()) - .NextFullStart(); - - // We might have created new unhandled live ranges, so cycle around the - // loop to make sure we pick the top most range in unhandled for - // processing. - continue; } + // Update block information + last_block = current_block->rpo_number(); + next_block_boundary = LifetimePosition::InstructionFromInstructionIndex( + current_block->last_instruction_index()) + .NextFullStart(); + + // We might have created new unhandled live ranges, so cycle around the + // loop to make sure we pick the top most range in unhandled for + // processing. + continue; } DCHECK_NOT_NULL(current); @@ -3952,28 +3730,6 @@ void LinearScanAllocator::AllocateRegisters() { } } -bool LinearScanAllocator::TrySplitAndSpillSplinter(LiveRange* range) { - DCHECK(!data()->is_turbo_control_flow_aware_allocation()); - DCHECK(range->TopLevel()->IsSplinter()); - // If we can spill the whole range, great. Otherwise, split above the - // first use needing a register and spill the top part. - const UsePosition* next_reg = range->NextRegisterPosition(range->Start()); - if (next_reg == nullptr) { - Spill(range, SpillMode::kSpillAtDefinition); - return true; - } else if (range->FirstHintPosition() == nullptr) { - // If there was no hint, but we have a use position requiring a - // register, apply the hot path heuristics. - return false; - } else if (next_reg->pos().PrevStart() > range->Start()) { - LiveRange* tail = SplitRangeAt(range, next_reg->pos().PrevStart()); - AddToUnhandled(tail); - Spill(range, SpillMode::kSpillAtDefinition); - return true; - } - return false; -} - void LinearScanAllocator::SetLiveRangeAssignedRegister(LiveRange* range, int reg) { data()->MarkAllocated(range->representation(), reg); @@ -4198,49 +3954,17 @@ void LinearScanAllocator::FindFreeRegistersForRange( // High-level register allocation summary: // -// For regular, or hot (i.e. not splinter) ranges, we attempt to first -// allocate first the preferred (hint) register. If that is not possible, -// we find a register that's free, and allocate that. If that's not possible, -// we search for a register to steal from a range that was allocated. The -// goal is to optimize for throughput by avoiding register-to-memory -// moves, which are expensive. -// -// For splinters, the goal is to minimize the number of moves. First we try -// to allocate the preferred register (more discussion follows). Failing that, -// we bail out and spill as far as we can, unless the first use is at start, -// case in which we apply the same behavior as we do for regular ranges. -// If there is no hint, we apply the hot-path behavior. -// -// For the splinter, the hint register may come from: -// -// - the hot path (we set it at splintering time with SetHint). In this case, if -// we cannot offer the hint register, spilling is better because it's at most -// 1 move, while trying to find and offer another register is at least 1 move. -// -// - a constraint. If we cannot offer that register, it's because there is some -// interference. So offering the hint register up to the interference would -// result -// in a move at the interference, plus a move to satisfy the constraint. This is -// also the number of moves if we spill, with the potential of the range being -// already spilled and thus saving a move (the spill). -// Note that this can only be an input constraint, if it were an output one, -// the range wouldn't be a splinter because it means it'd be defined in a -// deferred -// block, and we don't mark those as splinters (they live in deferred blocks -// only). -// -// - a phi. The same analysis as in the case of the input constraint applies. -// +// We attempt to first allocate the preferred (hint) register. If that is not +// possible, we find a register that's free, and allocate that. If that's not +// possible, we search for a register to steal from a range that was allocated. +// The goal is to optimize for throughput by avoiding register-to-memory moves, +// which are expensive. void LinearScanAllocator::ProcessCurrentRange(LiveRange* current, SpillMode spill_mode) { EmbeddedVector free_until_pos; FindFreeRegistersForRange(current, free_until_pos); if (!TryAllocatePreferredReg(current, free_until_pos)) { - if (current->TopLevel()->IsSplinter()) { - DCHECK(!data()->is_turbo_control_flow_aware_allocation()); - if (TrySplitAndSpillSplinter(current)) return; - } if (!TryAllocateFreeReg(current, free_until_pos)) { AllocateBlockedReg(current, spill_mode); } @@ -4725,30 +4449,26 @@ OperandAssigner::OperandAssigner(TopTierRegisterAllocationData* data) : data_(data) {} void OperandAssigner::DecideSpillingMode() { - if (data()->is_turbo_control_flow_aware_allocation()) { - for (auto range : data()->live_ranges()) { - data()->tick_counter()->TickAndMaybeEnterSafepoint(); - int max_blocks = data()->code()->InstructionBlockCount(); - if (range != nullptr && range->IsSpilledOnlyInDeferredBlocks(data())) { - // If the range is spilled only in deferred blocks and starts in - // a non-deferred block, we transition its representation here so - // that the LiveRangeConnector processes them correctly. If, - // however, they start in a deferred block, we uograde them to - // spill at definition, as that definition is in a deferred block - // anyway. While this is an optimization, the code in LiveRangeConnector - // relies on it! - if (GetInstructionBlock(data()->code(), range->Start())->IsDeferred()) { - TRACE("Live range %d is spilled and alive in deferred code only\n", - range->vreg()); - range->TransitionRangeToSpillAtDefinition(); - } else { - TRACE( - "Live range %d is spilled deferred code only but alive outside\n", + for (auto range : data()->live_ranges()) { + data()->tick_counter()->TickAndMaybeEnterSafepoint(); + int max_blocks = data()->code()->InstructionBlockCount(); + if (range != nullptr && range->IsSpilledOnlyInDeferredBlocks(data())) { + // If the range is spilled only in deferred blocks and starts in + // a non-deferred block, we transition its representation here so + // that the LiveRangeConnector processes them correctly. If, + // however, they start in a deferred block, we uograde them to + // spill at definition, as that definition is in a deferred block + // anyway. While this is an optimization, the code in LiveRangeConnector + // relies on it! + if (GetInstructionBlock(data()->code(), range->Start())->IsDeferred()) { + TRACE("Live range %d is spilled and alive in deferred code only\n", range->vreg()); - DCHECK(data()->is_turbo_control_flow_aware_allocation()); - range->TransitionRangeToDeferredSpill(data()->allocation_zone(), - max_blocks); - } + range->TransitionRangeToSpillAtDefinition(); + } else { + TRACE("Live range %d is spilled deferred code only but alive outside\n", + range->vreg()); + range->TransitionRangeToDeferredSpill(data()->allocation_zone(), + max_blocks); } } } diff --git a/deps/v8/src/compiler/backend/register-allocator.h b/deps/v8/src/compiler/backend/register-allocator.h index a9dc2900f10d5a..87c0afbcfc93d0 100644 --- a/deps/v8/src/compiler/backend/register-allocator.h +++ b/deps/v8/src/compiler/backend/register-allocator.h @@ -175,11 +175,7 @@ class LifetimePosition final { std::ostream& operator<<(std::ostream& os, const LifetimePosition pos); -enum class RegisterAllocationFlag : unsigned { - kTurboControlFlowAwareAllocation = 1 << 0, - kTurboPreprocessRanges = 1 << 1, - kTraceAllocation = 1 << 2 -}; +enum class RegisterAllocationFlag : unsigned { kTraceAllocation = 1 << 0 }; using RegisterAllocationFlags = base::Flags; @@ -210,14 +206,6 @@ class TopTierRegisterAllocationData final : public RegisterAllocationData { // regular code (kSpillAtDefinition). enum SpillMode { kSpillAtDefinition, kSpillDeferred }; - bool is_turbo_control_flow_aware_allocation() const { - return flags_ & RegisterAllocationFlag::kTurboControlFlowAwareAllocation; - } - - bool is_turbo_preprocess_ranges() const { - return flags_ & RegisterAllocationFlag::kTurboPreprocessRanges; - } - bool is_trace_alloc() { return flags_ & RegisterAllocationFlag::kTraceAllocation; } @@ -615,7 +603,7 @@ class V8_EXPORT_PRIVATE LiveRange : public NON_EXPORTED_BASE(ZoneObject) { // Can this live range be spilled at this position. bool CanBeSpilled(LifetimePosition pos) const; - // Splitting primitive used by both splitting and splintering members. + // Splitting primitive used by splitting members. // Performs the split, but does not link the resulting ranges. // The given position must follow the start of the range. // All uses following the given position will be moved from this @@ -708,7 +696,7 @@ class V8_EXPORT_PRIVATE LiveRange : public NON_EXPORTED_BASE(ZoneObject) { using ControlFlowRegisterHint = base::BitField; // Bits 28-31 are used by TopLevelLiveRange. - // Unique among children and splinters of the same virtual register. + // Unique among children of the same virtual register. int relative_id_; uint32_t bits_; UseInterval* last_interval_; @@ -720,8 +708,6 @@ class V8_EXPORT_PRIVATE LiveRange : public NON_EXPORTED_BASE(ZoneObject) { mutable UseInterval* current_interval_; // This is used as a cache, it doesn't affect correctness. mutable UsePosition* last_processed_use_; - // Cache the last position splintering stopped at. - mutable UsePosition* splitting_pointer_; // This is used as a cache in BuildLiveRanges and during register allocation. UsePosition* current_hint_position_; LiveRangeBundle* bundle_ = nullptr; @@ -853,16 +839,6 @@ class V8_EXPORT_PRIVATE TopLevelLiveRange final : public LiveRange { // Shorten the most recently added interval by setting a new start. void ShortenTo(LifetimePosition start, bool trace_alloc); - // Detaches between start and end, and attributes the resulting range to - // result. - // The current range is pointed to as "splintered_from". No parent/child - // relationship is established between this and result. - void Splinter(LifetimePosition start, LifetimePosition end, Zone* zone); - - // Assuming other was splintered from this range, embeds other and its - // children as part of the children sequence of this range. - void Merge(TopLevelLiveRange* other, Zone* zone); - // Spill range management. void SetSpillRange(SpillRange* spill_range); @@ -963,19 +939,12 @@ class V8_EXPORT_PRIVATE TopLevelLiveRange final : public LiveRange { } } - TopLevelLiveRange* splintered_from() const { return splintered_from_; } - bool IsSplinter() const { return splintered_from_ != nullptr; } bool MayRequireSpillRange() const { - DCHECK(!IsSplinter()); return !HasSpillOperand() && spill_range_ == nullptr; } void UpdateSpillRangePostMerge(TopLevelLiveRange* merged); int vreg() const { return vreg_; } -#if DEBUG - int debug_virt_reg() const; -#endif - void Verify() const; void VerifyChildrenInOrder() const; @@ -985,19 +954,13 @@ class V8_EXPORT_PRIVATE TopLevelLiveRange final : public LiveRange { // if you call it with a non-decreasing sequence of positions. LiveRange* GetChildCovers(LifetimePosition pos); - int GetNextChildId() { - return IsSplinter() ? splintered_from()->GetNextChildId() - : ++last_child_id_; - } + int GetNextChildId() { return ++last_child_id_; } int GetMaxChildCount() const { return last_child_id_ + 1; } bool IsSpilledOnlyInDeferredBlocks( const TopTierRegisterAllocationData* data) const { - if (data->is_turbo_control_flow_aware_allocation()) { - return spill_type() == SpillType::kDeferredSpillRange; - } - return spilled_in_deferred_blocks_; + return spill_type() == SpillType::kDeferredSpillRange; } struct SpillMoveInsertionList; @@ -1007,17 +970,6 @@ class V8_EXPORT_PRIVATE TopLevelLiveRange final : public LiveRange { DCHECK(!IsSpilledOnlyInDeferredBlocks(data)); return spill_move_insertion_locations_; } - TopLevelLiveRange* splinter() const { return splinter_; } - void SetSplinter(TopLevelLiveRange* splinter) { - DCHECK_NULL(splinter_); - DCHECK_NOT_NULL(splinter); - - splinter_ = splinter; - splinter->relative_id_ = GetNextChildId(); - splinter->set_spill_type(spill_type()); - splinter->SetSplinteredFrom(this); - if (bundle_ != nullptr) splinter->set_bundle(bundle_); - } void MarkHasPreassignedSlot() { has_preassigned_slot_ = true; } bool has_preassigned_slot() const { return has_preassigned_slot_; } @@ -1056,7 +1008,6 @@ class V8_EXPORT_PRIVATE TopLevelLiveRange final : public LiveRange { private: friend class LiveRange; - void SetSplinteredFrom(TopLevelLiveRange* splinter_parent); // If spill type is kSpillRange, then this value indicates whether we've // chosen to spill at the definition or at some later points. @@ -1076,7 +1027,6 @@ class V8_EXPORT_PRIVATE TopLevelLiveRange final : public LiveRange { int vreg_; int last_child_id_; - TopLevelLiveRange* splintered_from_; union { // Correct value determined by spill_type() InstructionOperand* spill_operand_; @@ -1096,7 +1046,6 @@ class V8_EXPORT_PRIVATE TopLevelLiveRange final : public LiveRange { int spill_start_index_; UsePosition* last_pos_; LiveRange* last_child_covers_; - TopLevelLiveRange* splinter_; DISALLOW_COPY_AND_ASSIGN(TopLevelLiveRange); }; @@ -1310,11 +1259,8 @@ class LiveRangeBuilder final : public ZoneObject { spill_mode); } SpillMode SpillModeForBlock(const InstructionBlock* block) const { - if (data()->is_turbo_control_flow_aware_allocation()) { - return block->IsDeferred() ? SpillMode::kSpillDeferred - : SpillMode::kSpillAtDefinition; - } - return SpillMode::kSpillAtDefinition; + return block->IsDeferred() ? SpillMode::kSpillDeferred + : SpillMode::kSpillAtDefinition; } TopTierRegisterAllocationData* const data_; ZoneMap phi_hints_; @@ -1529,7 +1475,6 @@ class LinearScanAllocator final : public RegisterAllocator { Vector free_until_pos); void ProcessCurrentRange(LiveRange* current, SpillMode spill_mode); void AllocateBlockedReg(LiveRange* range, SpillMode spill_mode); - bool TrySplitAndSpillSplinter(LiveRange* range); // Spill the given life range after position pos. void SpillAfter(LiveRange* range, LifetimePosition pos, SpillMode spill_mode); diff --git a/deps/v8/src/compiler/backend/s390/code-generator-s390.cc b/deps/v8/src/compiler/backend/s390/code-generator-s390.cc index 12b1167d4df70f..f3ab25630f7bbd 100644 --- a/deps/v8/src/compiler/backend/s390/code-generator-s390.cc +++ b/deps/v8/src/compiler/backend/s390/code-generator-s390.cc @@ -643,184 +643,184 @@ static inline int AssembleUnaryOp(Instruction* instr, _R _r, _M _m, _I _i) { __ MovFromFloatResult(i.OutputDoubleRegister()); \ } while (0) -#define ASSEMBLE_DOUBLE_MAX() \ - do { \ - DoubleRegister left_reg = i.InputDoubleRegister(0); \ - DoubleRegister right_reg = i.InputDoubleRegister(1); \ - DoubleRegister result_reg = i.OutputDoubleRegister(); \ - Label check_nan_left, check_zero, return_left, return_right, done; \ - __ cdbr(left_reg, right_reg); \ - __ bunordered(&check_nan_left, Label::kNear); \ - __ beq(&check_zero); \ - __ bge(&return_left, Label::kNear); \ - __ b(&return_right, Label::kNear); \ - \ - __ bind(&check_zero); \ - __ lzdr(kDoubleRegZero); \ - __ cdbr(left_reg, kDoubleRegZero); \ - /* left == right != 0. */ \ - __ bne(&return_left, Label::kNear); \ - /* At this point, both left and right are either 0 or -0. */ \ - /* N.B. The following works because +0 + -0 == +0 */ \ - /* For max we want logical-and of sign bit: (L + R) */ \ - __ ldr(result_reg, left_reg); \ - __ adbr(result_reg, right_reg); \ - __ b(&done, Label::kNear); \ - \ - __ bind(&check_nan_left); \ - __ cdbr(left_reg, left_reg); \ - /* left == NaN. */ \ - __ bunordered(&return_left, Label::kNear); \ - \ - __ bind(&return_right); \ - if (right_reg != result_reg) { \ - __ ldr(result_reg, right_reg); \ - } \ - __ b(&done, Label::kNear); \ - \ - __ bind(&return_left); \ - if (left_reg != result_reg) { \ - __ ldr(result_reg, left_reg); \ - } \ - __ bind(&done); \ +#define ASSEMBLE_DOUBLE_MAX() \ + do { \ + DoubleRegister left_reg = i.InputDoubleRegister(0); \ + DoubleRegister right_reg = i.InputDoubleRegister(1); \ + DoubleRegister result_reg = i.OutputDoubleRegister(); \ + Label check_zero, return_left, return_right, return_nan, done; \ + __ cdbr(left_reg, right_reg); \ + __ bunordered(&return_nan, Label::kNear); \ + __ beq(&check_zero); \ + __ bge(&return_left, Label::kNear); \ + __ b(&return_right, Label::kNear); \ + \ + __ bind(&check_zero); \ + __ lzdr(kDoubleRegZero); \ + __ cdbr(left_reg, kDoubleRegZero); \ + /* left == right != 0. */ \ + __ bne(&return_left, Label::kNear); \ + /* At this point, both left and right are either 0 or -0. */ \ + /* N.B. The following works because +0 + -0 == +0 */ \ + /* For max we want logical-and of sign bit: (L + R) */ \ + __ ldr(result_reg, left_reg); \ + __ adbr(result_reg, right_reg); \ + __ b(&done, Label::kNear); \ + \ + __ bind(&return_nan); \ + /* If left or right are NaN, adbr propagates the appropriate one.*/ \ + __ adbr(left_reg, right_reg); \ + __ b(&return_left, Label::kNear); \ + \ + __ bind(&return_right); \ + if (right_reg != result_reg) { \ + __ ldr(result_reg, right_reg); \ + } \ + __ b(&done, Label::kNear); \ + \ + __ bind(&return_left); \ + if (left_reg != result_reg) { \ + __ ldr(result_reg, left_reg); \ + } \ + __ bind(&done); \ } while (0) -#define ASSEMBLE_DOUBLE_MIN() \ - do { \ - DoubleRegister left_reg = i.InputDoubleRegister(0); \ - DoubleRegister right_reg = i.InputDoubleRegister(1); \ - DoubleRegister result_reg = i.OutputDoubleRegister(); \ - Label check_nan_left, check_zero, return_left, return_right, done; \ - __ cdbr(left_reg, right_reg); \ - __ bunordered(&check_nan_left, Label::kNear); \ - __ beq(&check_zero); \ - __ ble(&return_left, Label::kNear); \ - __ b(&return_right, Label::kNear); \ - \ - __ bind(&check_zero); \ - __ lzdr(kDoubleRegZero); \ - __ cdbr(left_reg, kDoubleRegZero); \ - /* left == right != 0. */ \ - __ bne(&return_left, Label::kNear); \ - /* At this point, both left and right are either 0 or -0. */ \ - /* N.B. The following works because +0 + -0 == +0 */ \ - /* For min we want logical-or of sign bit: -(-L + -R) */ \ - __ lcdbr(left_reg, left_reg); \ - __ ldr(result_reg, left_reg); \ - if (left_reg == right_reg) { \ - __ adbr(result_reg, right_reg); \ - } else { \ - __ sdbr(result_reg, right_reg); \ - } \ - __ lcdbr(result_reg, result_reg); \ - __ b(&done, Label::kNear); \ - \ - __ bind(&check_nan_left); \ - __ cdbr(left_reg, left_reg); \ - /* left == NaN. */ \ - __ bunordered(&return_left, Label::kNear); \ - \ - __ bind(&return_right); \ - if (right_reg != result_reg) { \ - __ ldr(result_reg, right_reg); \ - } \ - __ b(&done, Label::kNear); \ - \ - __ bind(&return_left); \ - if (left_reg != result_reg) { \ - __ ldr(result_reg, left_reg); \ - } \ - __ bind(&done); \ +#define ASSEMBLE_DOUBLE_MIN() \ + do { \ + DoubleRegister left_reg = i.InputDoubleRegister(0); \ + DoubleRegister right_reg = i.InputDoubleRegister(1); \ + DoubleRegister result_reg = i.OutputDoubleRegister(); \ + Label check_zero, return_left, return_right, return_nan, done; \ + __ cdbr(left_reg, right_reg); \ + __ bunordered(&return_nan, Label::kNear); \ + __ beq(&check_zero); \ + __ ble(&return_left, Label::kNear); \ + __ b(&return_right, Label::kNear); \ + \ + __ bind(&check_zero); \ + __ lzdr(kDoubleRegZero); \ + __ cdbr(left_reg, kDoubleRegZero); \ + /* left == right != 0. */ \ + __ bne(&return_left, Label::kNear); \ + /* At this point, both left and right are either 0 or -0. */ \ + /* N.B. The following works because +0 + -0 == +0 */ \ + /* For min we want logical-or of sign bit: -(-L + -R) */ \ + __ lcdbr(left_reg, left_reg); \ + __ ldr(result_reg, left_reg); \ + if (left_reg == right_reg) { \ + __ adbr(result_reg, right_reg); \ + } else { \ + __ sdbr(result_reg, right_reg); \ + } \ + __ lcdbr(result_reg, result_reg); \ + __ b(&done, Label::kNear); \ + \ + __ bind(&return_nan); \ + /* If left or right are NaN, adbr propagates the appropriate one.*/ \ + __ adbr(left_reg, right_reg); \ + __ b(&return_left, Label::kNear); \ + \ + __ bind(&return_right); \ + if (right_reg != result_reg) { \ + __ ldr(result_reg, right_reg); \ + } \ + __ b(&done, Label::kNear); \ + \ + __ bind(&return_left); \ + if (left_reg != result_reg) { \ + __ ldr(result_reg, left_reg); \ + } \ + __ bind(&done); \ } while (0) -#define ASSEMBLE_FLOAT_MAX() \ - do { \ - DoubleRegister left_reg = i.InputDoubleRegister(0); \ - DoubleRegister right_reg = i.InputDoubleRegister(1); \ - DoubleRegister result_reg = i.OutputDoubleRegister(); \ - Label check_nan_left, check_zero, return_left, return_right, done; \ - __ cebr(left_reg, right_reg); \ - __ bunordered(&check_nan_left, Label::kNear); \ - __ beq(&check_zero); \ - __ bge(&return_left, Label::kNear); \ - __ b(&return_right, Label::kNear); \ - \ - __ bind(&check_zero); \ - __ lzdr(kDoubleRegZero); \ - __ cebr(left_reg, kDoubleRegZero); \ - /* left == right != 0. */ \ - __ bne(&return_left, Label::kNear); \ - /* At this point, both left and right are either 0 or -0. */ \ - /* N.B. The following works because +0 + -0 == +0 */ \ - /* For max we want logical-and of sign bit: (L + R) */ \ - __ ldr(result_reg, left_reg); \ - __ aebr(result_reg, right_reg); \ - __ b(&done, Label::kNear); \ - \ - __ bind(&check_nan_left); \ - __ cebr(left_reg, left_reg); \ - /* left == NaN. */ \ - __ bunordered(&return_left, Label::kNear); \ - \ - __ bind(&return_right); \ - if (right_reg != result_reg) { \ - __ ldr(result_reg, right_reg); \ - } \ - __ b(&done, Label::kNear); \ - \ - __ bind(&return_left); \ - if (left_reg != result_reg) { \ - __ ldr(result_reg, left_reg); \ - } \ - __ bind(&done); \ +#define ASSEMBLE_FLOAT_MAX() \ + do { \ + DoubleRegister left_reg = i.InputDoubleRegister(0); \ + DoubleRegister right_reg = i.InputDoubleRegister(1); \ + DoubleRegister result_reg = i.OutputDoubleRegister(); \ + Label check_zero, return_left, return_right, return_nan, done; \ + __ cebr(left_reg, right_reg); \ + __ bunordered(&return_nan, Label::kNear); \ + __ beq(&check_zero); \ + __ bge(&return_left, Label::kNear); \ + __ b(&return_right, Label::kNear); \ + \ + __ bind(&check_zero); \ + __ lzdr(kDoubleRegZero); \ + __ cebr(left_reg, kDoubleRegZero); \ + /* left == right != 0. */ \ + __ bne(&return_left, Label::kNear); \ + /* At this point, both left and right are either 0 or -0. */ \ + /* N.B. The following works because +0 + -0 == +0 */ \ + /* For max we want logical-and of sign bit: (L + R) */ \ + __ ldr(result_reg, left_reg); \ + __ aebr(result_reg, right_reg); \ + __ b(&done, Label::kNear); \ + \ + __ bind(&return_nan); \ + /* If left or right are NaN, aebr propagates the appropriate one.*/ \ + __ aebr(left_reg, right_reg); \ + __ b(&return_left, Label::kNear); \ + \ + __ bind(&return_right); \ + if (right_reg != result_reg) { \ + __ ldr(result_reg, right_reg); \ + } \ + __ b(&done, Label::kNear); \ + \ + __ bind(&return_left); \ + if (left_reg != result_reg) { \ + __ ldr(result_reg, left_reg); \ + } \ + __ bind(&done); \ } while (0) -#define ASSEMBLE_FLOAT_MIN() \ - do { \ - DoubleRegister left_reg = i.InputDoubleRegister(0); \ - DoubleRegister right_reg = i.InputDoubleRegister(1); \ - DoubleRegister result_reg = i.OutputDoubleRegister(); \ - Label check_nan_left, check_zero, return_left, return_right, done; \ - __ cebr(left_reg, right_reg); \ - __ bunordered(&check_nan_left, Label::kNear); \ - __ beq(&check_zero); \ - __ ble(&return_left, Label::kNear); \ - __ b(&return_right, Label::kNear); \ - \ - __ bind(&check_zero); \ - __ lzdr(kDoubleRegZero); \ - __ cebr(left_reg, kDoubleRegZero); \ - /* left == right != 0. */ \ - __ bne(&return_left, Label::kNear); \ - /* At this point, both left and right are either 0 or -0. */ \ - /* N.B. The following works because +0 + -0 == +0 */ \ - /* For min we want logical-or of sign bit: -(-L + -R) */ \ - __ lcebr(left_reg, left_reg); \ - __ ldr(result_reg, left_reg); \ - if (left_reg == right_reg) { \ - __ aebr(result_reg, right_reg); \ - } else { \ - __ sebr(result_reg, right_reg); \ - } \ - __ lcebr(result_reg, result_reg); \ - __ b(&done, Label::kNear); \ - \ - __ bind(&check_nan_left); \ - __ cebr(left_reg, left_reg); \ - /* left == NaN. */ \ - __ bunordered(&return_left, Label::kNear); \ - \ - __ bind(&return_right); \ - if (right_reg != result_reg) { \ - __ ldr(result_reg, right_reg); \ - } \ - __ b(&done, Label::kNear); \ - \ - __ bind(&return_left); \ - if (left_reg != result_reg) { \ - __ ldr(result_reg, left_reg); \ - } \ - __ bind(&done); \ +#define ASSEMBLE_FLOAT_MIN() \ + do { \ + DoubleRegister left_reg = i.InputDoubleRegister(0); \ + DoubleRegister right_reg = i.InputDoubleRegister(1); \ + DoubleRegister result_reg = i.OutputDoubleRegister(); \ + Label check_zero, return_left, return_right, return_nan, done; \ + __ cebr(left_reg, right_reg); \ + __ bunordered(&return_nan, Label::kNear); \ + __ beq(&check_zero); \ + __ ble(&return_left, Label::kNear); \ + __ b(&return_right, Label::kNear); \ + \ + __ bind(&check_zero); \ + __ lzdr(kDoubleRegZero); \ + __ cebr(left_reg, kDoubleRegZero); \ + /* left == right != 0. */ \ + __ bne(&return_left, Label::kNear); \ + /* At this point, both left and right are either 0 or -0. */ \ + /* N.B. The following works because +0 + -0 == +0 */ \ + /* For min we want logical-or of sign bit: -(-L + -R) */ \ + __ lcebr(left_reg, left_reg); \ + __ ldr(result_reg, left_reg); \ + if (left_reg == right_reg) { \ + __ aebr(result_reg, right_reg); \ + } else { \ + __ sebr(result_reg, right_reg); \ + } \ + __ lcebr(result_reg, result_reg); \ + __ b(&done, Label::kNear); \ + \ + __ bind(&return_nan); \ + /* If left or right are NaN, aebr propagates the appropriate one.*/ \ + __ aebr(left_reg, right_reg); \ + __ b(&return_left, Label::kNear); \ + \ + __ bind(&return_right); \ + if (right_reg != result_reg) { \ + __ ldr(result_reg, right_reg); \ + } \ + __ b(&done, Label::kNear); \ + \ + __ bind(&return_left); \ + if (left_reg != result_reg) { \ + __ ldr(result_reg, left_reg); \ + } \ + __ bind(&done); \ } while (0) // // Only MRI mode for these instructions available @@ -2581,7 +2581,8 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( case kS390_LoadReverseSimd128: { AddressingMode mode = kMode_None; MemOperand operand = i.MemoryOperand(&mode); - if (CpuFeatures::IsSupported(VECTOR_ENHANCE_FACILITY_2)) { + if (CpuFeatures::IsSupported(VECTOR_ENHANCE_FACILITY_2) && + is_uint12(operand.offset())) { __ vlbr(i.OutputSimd128Register(), operand, Condition(4)); } else { __ lrvg(r0, operand); @@ -2643,7 +2644,8 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( size_t index = 0; AddressingMode mode = kMode_None; MemOperand operand = i.MemoryOperand(&mode, &index); - if (CpuFeatures::IsSupported(VECTOR_ENHANCE_FACILITY_2)) { + if (CpuFeatures::IsSupported(VECTOR_ENHANCE_FACILITY_2) && + is_uint12(operand.offset())) { __ vstbr(i.InputSimd128Register(index), operand, Condition(4)); } else { __ vlgv(r0, i.InputSimd128Register(index), MemOperand(r0, 1), @@ -3280,8 +3282,8 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( Register scratch_0 = r0; Register scratch_1 = r1; for (int i = 0; i < 2; i++) { - __ vlgv(scratch_0, src0, MemOperand(r0, 0), Condition(3)); - __ vlgv(scratch_1, src1, MemOperand(r0, 0), Condition(3)); + __ vlgv(scratch_0, src0, MemOperand(r0, i), Condition(3)); + __ vlgv(scratch_1, src1, MemOperand(r0, i), Condition(3)); __ Mul64(scratch_0, scratch_1); scratch_0 = r1; scratch_1 = ip; @@ -4176,7 +4178,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( break; } #undef BINOP_EXTRACT - case kS390_S8x16Shuffle: { + case kS390_I8x16Shuffle: { Simd128Register dst = i.OutputSimd128Register(), src0 = i.InputSimd128Register(0), src1 = i.InputSimd128Register(1); @@ -4196,7 +4198,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( __ vperm(dst, src0, src1, kScratchDoubleReg, Condition(0), Condition(0)); break; } - case kS390_S8x16Swizzle: { + case kS390_I8x16Swizzle: { Simd128Register dst = i.OutputSimd128Register(), src0 = i.InputSimd128Register(0), src1 = i.InputSimd128Register(1); @@ -4579,9 +4581,6 @@ void CodeGenerator::AssembleConstructFrame() { } } else if (call_descriptor->IsJSFunctionCall()) { __ Prologue(ip); - if (call_descriptor->PushArgumentCount()) { - __ Push(kJavaScriptCallArgCountRegister); - } } else { StackFrame::Type type = info()->GetOutputStackFrameType(); // TODO(mbrandy): Detect cases where ip is the entrypoint (for diff --git a/deps/v8/src/compiler/backend/s390/instruction-codes-s390.h b/deps/v8/src/compiler/backend/s390/instruction-codes-s390.h index 693b555ae78e80..ab7973c089f6c0 100644 --- a/deps/v8/src/compiler/backend/s390/instruction-codes-s390.h +++ b/deps/v8/src/compiler/backend/s390/instruction-codes-s390.h @@ -365,8 +365,8 @@ namespace compiler { V(S390_I8x16RoundingAverageU) \ V(S390_I8x16Abs) \ V(S390_I8x16BitMask) \ - V(S390_S8x16Shuffle) \ - V(S390_S8x16Swizzle) \ + V(S390_I8x16Shuffle) \ + V(S390_I8x16Swizzle) \ V(S390_V64x2AnyTrue) \ V(S390_V32x4AnyTrue) \ V(S390_V16x8AnyTrue) \ diff --git a/deps/v8/src/compiler/backend/s390/instruction-scheduler-s390.cc b/deps/v8/src/compiler/backend/s390/instruction-scheduler-s390.cc index 1117ec51411a2d..c0a854b7f1cadb 100644 --- a/deps/v8/src/compiler/backend/s390/instruction-scheduler-s390.cc +++ b/deps/v8/src/compiler/backend/s390/instruction-scheduler-s390.cc @@ -311,8 +311,8 @@ int InstructionScheduler::GetTargetInstructionFlags( case kS390_I8x16RoundingAverageU: case kS390_I8x16Abs: case kS390_I8x16BitMask: - case kS390_S8x16Shuffle: - case kS390_S8x16Swizzle: + case kS390_I8x16Shuffle: + case kS390_I8x16Swizzle: case kS390_V64x2AnyTrue: case kS390_V32x4AnyTrue: case kS390_V16x8AnyTrue: diff --git a/deps/v8/src/compiler/backend/s390/instruction-selector-s390.cc b/deps/v8/src/compiler/backend/s390/instruction-selector-s390.cc index bb74050dcf7d56..ee3e996169b7a4 100644 --- a/deps/v8/src/compiler/backend/s390/instruction-selector-s390.cc +++ b/deps/v8/src/compiler/backend/s390/instruction-selector-s390.cc @@ -2201,6 +2201,10 @@ void InstructionSelector::VisitFloat64LessThanOrEqual(Node* node) { VisitFloat64Compare(this, node, &cont); } +bool InstructionSelector::ZeroExtendsWord32ToWord64NoPhis(Node* node) { + UNIMPLEMENTED(); +} + void InstructionSelector::EmitPrepareArguments( ZoneVector* arguments, const CallDescriptor* call_descriptor, Node* node) { @@ -2820,7 +2824,7 @@ SIMD_VISIT_PMIN_MAX(F32x4Pmax) #undef SIMD_VISIT_PMIN_MAX #undef SIMD_TYPES -void InstructionSelector::VisitS8x16Shuffle(Node* node) { +void InstructionSelector::VisitI8x16Shuffle(Node* node) { uint8_t shuffle[kSimd128Size]; uint8_t* shuffle_p = &shuffle[0]; bool is_swizzle; @@ -2841,7 +2845,7 @@ void InstructionSelector::VisitS8x16Shuffle(Node* node) { } shuffle_p = &shuffle_remapped[0]; #endif - Emit(kS390_S8x16Shuffle, g.DefineAsRegister(node), + Emit(kS390_I8x16Shuffle, g.DefineAsRegister(node), g.UseUniqueRegister(input0), g.UseUniqueRegister(input1), g.UseImmediate(wasm::SimdShuffle::Pack4Lanes(shuffle_p)), g.UseImmediate(wasm::SimdShuffle::Pack4Lanes(shuffle_p + 4)), @@ -2849,9 +2853,9 @@ void InstructionSelector::VisitS8x16Shuffle(Node* node) { g.UseImmediate(wasm::SimdShuffle::Pack4Lanes(shuffle_p + 12))); } -void InstructionSelector::VisitS8x16Swizzle(Node* node) { +void InstructionSelector::VisitI8x16Swizzle(Node* node) { S390OperandGenerator g(this); - Emit(kS390_S8x16Swizzle, g.DefineAsRegister(node), + Emit(kS390_I8x16Swizzle, g.DefineAsRegister(node), g.UseUniqueRegister(node->InputAt(0)), g.UseUniqueRegister(node->InputAt(1))); } diff --git a/deps/v8/src/compiler/backend/x64/code-generator-x64.cc b/deps/v8/src/compiler/backend/x64/code-generator-x64.cc index b84df8192596f6..e0cf602b11ee20 100644 --- a/deps/v8/src/compiler/backend/x64/code-generator-x64.cc +++ b/deps/v8/src/compiler/backend/x64/code-generator-x64.cc @@ -194,94 +194,6 @@ class OutOfLineLoadFloat64NaN final : public OutOfLineCode { XMMRegister const result_; }; -class OutOfLineF32x4Min final : public OutOfLineCode { - public: - OutOfLineF32x4Min(CodeGenerator* gen, XMMRegister result, XMMRegister error) - : OutOfLineCode(gen), result_(result), error_(error) {} - - void Generate() final { - // |result| is the partial result, |kScratchDoubleReg| is the error. - // propagate -0's and NaNs (possibly non-canonical) from the error. - __ Orps(error_, result_); - // Canonicalize NaNs by quieting and clearing the payload. - __ Cmpps(result_, error_, int8_t{3}); - __ Orps(error_, result_); - __ Psrld(result_, byte{10}); - __ Andnps(result_, error_); - } - - private: - XMMRegister const result_; - XMMRegister const error_; -}; - -class OutOfLineF64x2Min final : public OutOfLineCode { - public: - OutOfLineF64x2Min(CodeGenerator* gen, XMMRegister result, XMMRegister error) - : OutOfLineCode(gen), result_(result), error_(error) {} - - void Generate() final { - // |result| is the partial result, |kScratchDoubleReg| is the error. - // propagate -0's and NaNs (possibly non-canonical) from the error. - __ Orpd(error_, result_); - // Canonicalize NaNs by quieting and clearing the payload. - __ Cmppd(result_, error_, int8_t{3}); - __ Orpd(error_, result_); - __ Psrlq(result_, 13); - __ Andnpd(result_, error_); - } - - private: - XMMRegister const result_; - XMMRegister const error_; -}; - -class OutOfLineF32x4Max final : public OutOfLineCode { - public: - OutOfLineF32x4Max(CodeGenerator* gen, XMMRegister result, XMMRegister error) - : OutOfLineCode(gen), result_(result), error_(error) {} - - void Generate() final { - // |result| is the partial result, |kScratchDoubleReg| is the error. - // Propagate NaNs (possibly non-canonical). - __ Orps(result_, error_); - // Propagate sign errors and (subtle) quiet NaNs. - __ Subps(result_, error_); - // Canonicalize NaNs by clearing the payload. Sign is non-deterministic. - __ Cmpps(error_, result_, int8_t{3}); - __ Psrld(error_, byte{10}); - __ Andnps(error_, result_); - __ Movaps(result_, error_); - } - - private: - XMMRegister const result_; - XMMRegister const error_; -}; - -class OutOfLineF64x2Max final : public OutOfLineCode { - public: - OutOfLineF64x2Max(CodeGenerator* gen, XMMRegister result, XMMRegister error) - : OutOfLineCode(gen), result_(result), error_(error) {} - - void Generate() final { - // |result| is the partial result, |kScratchDoubleReg| is the error. - // Propagate NaNs (possibly non-canonical). - __ Orpd(result_, error_); - // Propagate sign errors and (subtle) quiet NaNs. - __ Subpd(result_, error_); - // Canonicalize NaNs by clearing the payload. Sign is non-deterministic. - __ Cmppd(error_, result_, int8_t{3}); - __ Psrlq(error_, byte{13}); - __ Andnpd(error_, result_); - __ Movapd(result_, error_); - } - - private: - XMMRegister const result_; - XMMRegister const error_; -}; - class OutOfLineTruncateDoubleToI final : public OutOfLineCode { public: OutOfLineTruncateDoubleToI(CodeGenerator* gen, Register result, @@ -745,13 +657,33 @@ void CodeGenerator::AssemblePopArgumentsAdaptorFrame(Register args_reg, namespace { -void AdjustStackPointerForTailCall(TurboAssembler* assembler, +void AdjustStackPointerForTailCall(Instruction* instr, + TurboAssembler* assembler, Linkage* linkage, + OptimizedCompilationInfo* info, FrameAccessState* state, int new_slot_above_sp, bool allow_shrinkage = true) { - int current_sp_offset = state->GetSPToFPSlotCount() + - StandardFrameConstants::kFixedSlotCountAboveFp; - int stack_slot_delta = new_slot_above_sp - current_sp_offset; + int stack_slot_delta; + if (HasCallDescriptorFlag(instr, CallDescriptor::kIsTailCallForTierUp)) { + // For this special tail-call mode, the callee has the same arguments and + // linkage as the caller, and arguments adapter frames must be preserved. + // Thus we simply have reset the stack pointer register to its original + // value before frame construction. + // See also: AssembleConstructFrame. + DCHECK(!info->is_osr()); + DCHECK_EQ(linkage->GetIncomingDescriptor()->CalleeSavedRegisters(), 0); + DCHECK_EQ(linkage->GetIncomingDescriptor()->CalleeSavedFPRegisters(), 0); + DCHECK_EQ(state->frame()->GetReturnSlotCount(), 0); + stack_slot_delta = (state->frame()->GetTotalFrameSlotCount() - + kReturnAddressStackSlotCount) * + -1; + DCHECK_LE(stack_slot_delta, 0); + } else { + int current_sp_offset = state->GetSPToFPSlotCount() + + StandardFrameConstants::kFixedSlotCountAboveFp; + stack_slot_delta = new_slot_above_sp - current_sp_offset; + } + if (stack_slot_delta > 0) { assembler->AllocateStackSpace(stack_slot_delta * kSystemPointerSize); state->IncreaseSPDelta(stack_slot_delta); @@ -778,12 +710,14 @@ void CodeGenerator::AssembleTailCallBeforeGap(Instruction* instr, if (!pushes.empty() && (LocationOperand::cast(pushes.back()->destination()).index() + 1 == first_unused_stack_slot)) { + DCHECK(!HasCallDescriptorFlag(instr, CallDescriptor::kIsTailCallForTierUp)); X64OperandConverter g(this, instr); for (auto move : pushes) { LocationOperand destination_location( LocationOperand::cast(move->destination())); InstructionOperand source(move->source()); - AdjustStackPointerForTailCall(tasm(), frame_access_state(), + AdjustStackPointerForTailCall(instr, tasm(), linkage(), info(), + frame_access_state(), destination_location.index()); if (source.IsStackSlot()) { LocationOperand source_location(LocationOperand::cast(source)); @@ -801,14 +735,15 @@ void CodeGenerator::AssembleTailCallBeforeGap(Instruction* instr, move->Eliminate(); } } - AdjustStackPointerForTailCall(tasm(), frame_access_state(), - first_unused_stack_slot, false); + AdjustStackPointerForTailCall(instr, tasm(), linkage(), info(), + frame_access_state(), first_unused_stack_slot, + false); } void CodeGenerator::AssembleTailCallAfterGap(Instruction* instr, int first_unused_stack_slot) { - AdjustStackPointerForTailCall(tasm(), frame_access_state(), - first_unused_stack_slot); + AdjustStackPointerForTailCall(instr, tasm(), linkage(), info(), + frame_access_state(), first_unused_stack_slot); } // Check that {kJavaScriptCallCodeStartRegister} is correct. @@ -912,12 +847,13 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( break; } case kArchTailCallCodeObjectFromJSFunction: - case kArchTailCallCodeObject: { - if (arch_opcode == kArchTailCallCodeObjectFromJSFunction) { + if (!HasCallDescriptorFlag(instr, CallDescriptor::kIsTailCallForTierUp)) { AssemblePopArgumentsAdaptorFrame(kJavaScriptCallArgCountRegister, i.TempRegister(0), i.TempRegister(1), i.TempRegister(2)); } + V8_FALLTHROUGH; + case kArchTailCallCodeObject: { if (HasImmediateInput(instr, 0)) { Handle code = i.InputCode(0); __ Jump(code, RelocInfo::CODE_TARGET); @@ -2348,6 +2284,16 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( int slot = MiscField::decode(instr->opcode()); if (HasImmediateInput(instr, 0)) { __ movq(Operand(rsp, slot * kSystemPointerSize), i.InputImmediate(0)); + } else if (instr->InputAt(0)->IsFPRegister()) { + LocationOperand* op = LocationOperand::cast(instr->InputAt(0)); + if (op->representation() == MachineRepresentation::kFloat64) { + __ Movsd(Operand(rsp, slot * kSystemPointerSize), + i.InputDoubleRegister(0)); + } else { + DCHECK_EQ(MachineRepresentation::kFloat32, op->representation()); + __ Movss(Operand(rsp, slot * kSystemPointerSize), + i.InputFloatRegister(0)); + } } else { __ movq(Operand(rsp, slot * kSystemPointerSize), i.InputRegister(0)); } @@ -2419,18 +2365,18 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( XMMRegister src1 = i.InputSimd128Register(1), dst = i.OutputSimd128Register(); DCHECK_EQ(dst, i.InputSimd128Register(0)); - // The minpd instruction doesn't propagate NaNs and -0's in its first - // operand. Perform minpd in both orders and compare results. Handle the - // unlikely case of discrepancies out of line. + // The minpd instruction doesn't propagate NaNs and +0's in its first + // operand. Perform minpd in both orders, merge the resuls, and adjust. __ Movapd(kScratchDoubleReg, src1); __ Minpd(kScratchDoubleReg, dst); __ Minpd(dst, src1); - // Most likely there is no difference and we're done. - __ Xorpd(kScratchDoubleReg, dst); - __ Ptest(kScratchDoubleReg, kScratchDoubleReg); - auto ool = zone()->New(this, dst, kScratchDoubleReg); - __ j(not_zero, ool->entry()); - __ bind(ool->exit()); + // propagate -0's and NaNs, which may be non-canonical. + __ Orpd(kScratchDoubleReg, dst); + // Canonicalize NaNs by quieting and clearing the payload. + __ Cmppd(dst, kScratchDoubleReg, int8_t{3}); + __ Orpd(kScratchDoubleReg, dst); + __ Psrlq(dst, 13); + __ Andnpd(dst, kScratchDoubleReg); break; } case kX64F64x2Max: { @@ -2438,17 +2384,20 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( dst = i.OutputSimd128Register(); DCHECK_EQ(dst, i.InputSimd128Register(0)); // The maxpd instruction doesn't propagate NaNs and +0's in its first - // operand. Perform maxpd in both orders and compare results. Handle the - // unlikely case of discrepancies out of line. + // operand. Perform maxpd in both orders, merge the resuls, and adjust. __ Movapd(kScratchDoubleReg, src1); __ Maxpd(kScratchDoubleReg, dst); __ Maxpd(dst, src1); - // Most likely there is no difference and we're done. - __ Xorpd(kScratchDoubleReg, dst); - __ Ptest(kScratchDoubleReg, kScratchDoubleReg); - auto ool = zone()->New(this, dst, kScratchDoubleReg); - __ j(not_zero, ool->entry()); - __ bind(ool->exit()); + // Find discrepancies. + __ Xorpd(dst, kScratchDoubleReg); + // Propagate NaNs, which may be non-canonical. + __ Orpd(kScratchDoubleReg, dst); + // Propagate sign discrepancy and (subtle) quiet NaNs. + __ Subpd(kScratchDoubleReg, dst); + // Canonicalize NaNs by clearing the payload. Sign is non-deterministic. + __ Cmppd(dst, kScratchDoubleReg, int8_t{3}); + __ Psrlq(dst, 13); + __ Andnpd(dst, kScratchDoubleReg); break; } case kX64F64x2Eq: { @@ -2612,18 +2561,18 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( XMMRegister src1 = i.InputSimd128Register(1), dst = i.OutputSimd128Register(); DCHECK_EQ(dst, i.InputSimd128Register(0)); - // The minps instruction doesn't propagate NaNs and -0's in its first - // operand. Perform minps in both orders and compare results. Handle the - // unlikely case of discrepancies out of line. + // The minps instruction doesn't propagate NaNs and +0's in its first + // operand. Perform minps in both orders, merge the resuls, and adjust. __ Movaps(kScratchDoubleReg, src1); __ Minps(kScratchDoubleReg, dst); __ Minps(dst, src1); - // Most likely there is no difference and we're done. - __ Xorps(kScratchDoubleReg, dst); - __ Ptest(kScratchDoubleReg, kScratchDoubleReg); - auto ool = zone()->New(this, dst, kScratchDoubleReg); - __ j(not_zero, ool->entry()); - __ bind(ool->exit()); + // propagate -0's and NaNs, which may be non-canonical. + __ Orps(kScratchDoubleReg, dst); + // Canonicalize NaNs by quieting and clearing the payload. + __ Cmpps(dst, kScratchDoubleReg, int8_t{3}); + __ Orps(kScratchDoubleReg, dst); + __ Psrld(dst, byte{10}); + __ Andnps(dst, kScratchDoubleReg); break; } case kX64F32x4Max: { @@ -2631,17 +2580,20 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( dst = i.OutputSimd128Register(); DCHECK_EQ(dst, i.InputSimd128Register(0)); // The maxps instruction doesn't propagate NaNs and +0's in its first - // operand. Perform maxps in both orders and compare results. Handle the - // unlikely case of discrepancies out of line. + // operand. Perform maxps in both orders, merge the resuls, and adjust. __ Movaps(kScratchDoubleReg, src1); __ Maxps(kScratchDoubleReg, dst); __ Maxps(dst, src1); - // Most likely there is no difference and we're done. - __ Xorps(kScratchDoubleReg, dst); - __ Ptest(kScratchDoubleReg, kScratchDoubleReg); - auto ool = zone()->New(this, dst, kScratchDoubleReg); - __ j(not_zero, ool->entry()); - __ bind(ool->exit()); + // Find discrepancies. + __ Xorps(dst, kScratchDoubleReg); + // Propagate NaNs, which may be non-canonical. + __ Orps(kScratchDoubleReg, dst); + // Propagate sign discrepancy and (subtle) quiet NaNs. + __ Subps(kScratchDoubleReg, dst); + // Canonicalize NaNs by clearing the payload. Sign is non-deterministic. + __ Cmpps(dst, kScratchDoubleReg, int8_t{3}); + __ Psrld(dst, byte{10}); + __ Andnps(dst, kScratchDoubleReg); break; } case kX64F32x4Eq: { @@ -3724,7 +3676,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( __ Andnps(dst, i.InputSimd128Register(1)); break; } - case kX64S8x16Swizzle: { + case kX64I8x16Swizzle: { DCHECK_EQ(i.OutputSimd128Register(), i.InputSimd128Register(0)); XMMRegister dst = i.OutputSimd128Register(); XMMRegister mask = i.TempSimd128Register(0); @@ -3737,7 +3689,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( __ Pshufb(dst, mask); break; } - case kX64S8x16Shuffle: { + case kX64I8x16Shuffle: { XMMRegister dst = i.OutputSimd128Register(); XMMRegister tmp_simd = i.TempSimd128Register(0); if (instr->InputCount() == 5) { // only one input operand @@ -4454,7 +4406,7 @@ static const int kQuadWordSize = 16; } // namespace void CodeGenerator::FinishFrame(Frame* frame) { - auto call_descriptor = linkage()->GetIncomingDescriptor(); + CallDescriptor* call_descriptor = linkage()->GetIncomingDescriptor(); const RegList saves_fp = call_descriptor->CalleeSavedFPRegisters(); if (saves_fp != 0) { @@ -4492,9 +4444,6 @@ void CodeGenerator::AssembleConstructFrame() { } } else if (call_descriptor->IsJSFunctionCall()) { __ Prologue(); - if (call_descriptor->PushArgumentCount()) { - __ pushq(kJavaScriptCallArgCountRegister); - } } else { __ StubPrologue(info()->GetOutputStackFrameType()); if (call_descriptor->IsWasmFunctionCall()) { @@ -4610,7 +4559,7 @@ void CodeGenerator::AssembleConstructFrame() { } } -void CodeGenerator::AssembleReturn(InstructionOperand* pop) { +void CodeGenerator::AssembleReturn(InstructionOperand* additional_pop_count) { auto call_descriptor = linkage()->GetIncomingDescriptor(); // Restore registers. @@ -4643,39 +4592,91 @@ void CodeGenerator::AssembleReturn(InstructionOperand* pop) { unwinding_info_writer_.MarkBlockWillExit(); - // Might need rcx for scratch if pop_size is too big or if there is a variable - // pop count. + // We might need rcx and rdx for scratch. DCHECK_EQ(0u, call_descriptor->CalleeSavedRegisters() & rcx.bit()); DCHECK_EQ(0u, call_descriptor->CalleeSavedRegisters() & rdx.bit()); - size_t pop_size = call_descriptor->StackParameterCount() * kSystemPointerSize; + int parameter_count = + static_cast(call_descriptor->StackParameterCount()); X64OperandConverter g(this, nullptr); + Register pop_reg = additional_pop_count->IsImmediate() + ? rcx + : g.ToRegister(additional_pop_count); + Register scratch_reg = pop_reg == rcx ? rdx : rcx; + Register argc_reg = + additional_pop_count->IsImmediate() ? pop_reg : scratch_reg; +#ifdef V8_NO_ARGUMENTS_ADAPTOR + // Functions with JS linkage have at least one parameter (the receiver). + // If {parameter_count} == 0, it means it is a builtin with + // kDontAdaptArgumentsSentinel, which takes care of JS arguments popping + // itself. + const bool drop_jsargs = frame_access_state()->has_frame() && + call_descriptor->IsJSFunctionCall() && + parameter_count != 0; +#else + const bool drop_jsargs = false; +#endif if (call_descriptor->IsCFunctionCall()) { AssembleDeconstructFrame(); } else if (frame_access_state()->has_frame()) { - if (pop->IsImmediate() && g.ToConstant(pop).ToInt32() == 0) { + if (additional_pop_count->IsImmediate() && + g.ToConstant(additional_pop_count).ToInt32() == 0) { // Canonicalize JSFunction return sites for now. if (return_label_.is_bound()) { __ jmp(&return_label_); return; } else { __ bind(&return_label_); - AssembleDeconstructFrame(); } - } else { - AssembleDeconstructFrame(); } + if (drop_jsargs) { + // Get the actual argument count. + __ movq(argc_reg, Operand(rbp, StandardFrameConstants::kArgCOffset)); + } + AssembleDeconstructFrame(); } - if (pop->IsImmediate()) { - pop_size += g.ToConstant(pop).ToInt32() * kSystemPointerSize; - CHECK_LT(pop_size, static_cast(std::numeric_limits::max())); - __ Ret(static_cast(pop_size), rcx); + if (drop_jsargs) { + // In addition to the slots given by {additional_pop_count}, we must pop all + // arguments from the stack (including the receiver). This number of + // arguments is given by max(1 + argc_reg, parameter_count). + Label argc_reg_has_final_count; + // Exclude the receiver to simplify the computation. We'll account for it at + // the end. + int parameter_count_withouth_receiver = parameter_count - 1; + if (parameter_count_withouth_receiver != 0) { + __ cmpq(argc_reg, Immediate(parameter_count_withouth_receiver)); + __ j(greater_equal, &argc_reg_has_final_count, Label::kNear); + __ movq(argc_reg, Immediate(parameter_count_withouth_receiver)); + __ bind(&argc_reg_has_final_count); + } + // Add additional pop count. + if (additional_pop_count->IsImmediate()) { + DCHECK_EQ(pop_reg, argc_reg); + int additional_count = g.ToConstant(additional_pop_count).ToInt32(); + if (additional_count != 0) { + __ addq(pop_reg, Immediate(additional_count)); + } + } else { + __ addq(pop_reg, argc_reg); + } + __ PopReturnAddressTo(scratch_reg); + __ leaq(rsp, Operand(rsp, pop_reg, times_system_pointer_size, + kSystemPointerSize)); // Also pop the receiver. + // We use a return instead of a jump for better return address prediction. + __ PushReturnAddressFrom(scratch_reg); + __ Ret(); + } else if (additional_pop_count->IsImmediate()) { + int additional_count = g.ToConstant(additional_pop_count).ToInt32(); + size_t pop_size = (parameter_count + additional_count) * kSystemPointerSize; + CHECK_LE(pop_size, static_cast(std::numeric_limits::max())); + __ Ret(static_cast(pop_size), scratch_reg); } else { - Register pop_reg = g.ToRegister(pop); - Register scratch_reg = pop_reg == rcx ? rdx : rcx; - __ popq(scratch_reg); - __ leaq(rsp, Operand(rsp, pop_reg, times_8, static_cast(pop_size))); - __ jmp(scratch_reg); + int pop_size = static_cast(parameter_count * kSystemPointerSize); + __ PopReturnAddressTo(scratch_reg); + __ leaq(rsp, Operand(rsp, pop_reg, times_system_pointer_size, + static_cast(pop_size))); + __ PushReturnAddressFrom(scratch_reg); + __ Ret(); } } @@ -4923,15 +4924,10 @@ void CodeGenerator::AssembleSwap(InstructionOperand* source, case MoveType::kRegisterToStack: { if (source->IsRegister()) { Register src = g.ToRegister(source); - __ pushq(src); - frame_access_state()->IncreaseSPDelta(1); - unwinding_info_writer_.MaybeIncreaseBaseOffsetAt(__ pc_offset(), - kSystemPointerSize); - __ movq(src, g.ToOperand(destination)); - frame_access_state()->IncreaseSPDelta(-1); - __ popq(g.ToOperand(destination)); - unwinding_info_writer_.MaybeIncreaseBaseOffsetAt(__ pc_offset(), - -kSystemPointerSize); + Operand dst = g.ToOperand(destination); + __ movq(kScratchRegister, src); + __ movq(src, dst); + __ movq(dst, kScratchRegister); } else { DCHECK(source->IsFPRegister()); XMMRegister src = g.ToDoubleRegister(source); diff --git a/deps/v8/src/compiler/backend/x64/instruction-codes-x64.h b/deps/v8/src/compiler/backend/x64/instruction-codes-x64.h index 21f718b3155e04..7312121a0af1d1 100644 --- a/deps/v8/src/compiler/backend/x64/instruction-codes-x64.h +++ b/deps/v8/src/compiler/backend/x64/instruction-codes-x64.h @@ -325,8 +325,8 @@ namespace compiler { V(X64S128Xor) \ V(X64S128Select) \ V(X64S128AndNot) \ - V(X64S8x16Swizzle) \ - V(X64S8x16Shuffle) \ + V(X64I8x16Swizzle) \ + V(X64I8x16Shuffle) \ V(X64S8x16LoadSplat) \ V(X64S16x8LoadSplat) \ V(X64S32x4LoadSplat) \ diff --git a/deps/v8/src/compiler/backend/x64/instruction-scheduler-x64.cc b/deps/v8/src/compiler/backend/x64/instruction-scheduler-x64.cc index 56ca9f1dc12363..169753b40eeb87 100644 --- a/deps/v8/src/compiler/backend/x64/instruction-scheduler-x64.cc +++ b/deps/v8/src/compiler/backend/x64/instruction-scheduler-x64.cc @@ -303,8 +303,8 @@ int InstructionScheduler::GetTargetInstructionFlags( case kX64V32x4AllTrue: case kX64V16x8AnyTrue: case kX64V16x8AllTrue: - case kX64S8x16Swizzle: - case kX64S8x16Shuffle: + case kX64I8x16Swizzle: + case kX64I8x16Shuffle: case kX64S32x4Swizzle: case kX64S32x4Shuffle: case kX64S16x8Blend: diff --git a/deps/v8/src/compiler/backend/x64/instruction-selector-x64.cc b/deps/v8/src/compiler/backend/x64/instruction-selector-x64.cc index 7df4fcbebd3101..db212677ea889a 100644 --- a/deps/v8/src/compiler/backend/x64/instruction-selector-x64.cc +++ b/deps/v8/src/compiler/backend/x64/instruction-selector-x64.cc @@ -1297,9 +1297,9 @@ void InstructionSelector::VisitChangeInt32ToInt64(Node* node) { } } -namespace { - -bool ZeroExtendsWord32ToWord64(Node* node) { +bool InstructionSelector::ZeroExtendsWord32ToWord64NoPhis(Node* node) { + X64OperandGenerator g(this); + DCHECK_NE(node->opcode(), IrOpcode::kPhi); switch (node->opcode()) { case IrOpcode::kWord32And: case IrOpcode::kWord32Or: @@ -1353,13 +1353,20 @@ bool ZeroExtendsWord32ToWord64(Node* node) { return false; } } + case IrOpcode::kInt32Constant: + case IrOpcode::kInt64Constant: + // Constants are loaded with movl or movq, or xorl for zero; see + // CodeGenerator::AssembleMove. So any non-negative constant that fits + // in a 32-bit signed integer is zero-extended to 64 bits. + if (g.CanBeImmediate(node)) { + return g.GetImmediateIntegerValue(node) >= 0; + } + return false; default: return false; } } -} // namespace - void InstructionSelector::VisitChangeUint32ToUint64(Node* node) { X64OperandGenerator g(this); Node* value = node->InputAt(0); @@ -2271,7 +2278,12 @@ void InstructionSelector::VisitSwitch(Node* node, const SwitchInfo& sw) { value_operand, g.TempImmediate(-sw.min_value())); } else { // Zero extend, because we use it as 64-bit index into the jump table. - Emit(kX64Movl, index_operand, value_operand); + if (ZeroExtendsWord32ToWord64(node->InputAt(0))) { + // Input value has already been zero-extended. + index_operand = value_operand; + } else { + Emit(kX64Movl, index_operand, value_operand); + } } // Generate a table lookup. return EmitTableSwitch(sw, index_operand); @@ -3257,7 +3269,7 @@ bool TryMatchArchShuffle(const uint8_t* shuffle, const ShuffleEntry* table, } // namespace -void InstructionSelector::VisitS8x16Shuffle(Node* node) { +void InstructionSelector::VisitI8x16Shuffle(Node* node) { uint8_t shuffle[kSimd128Size]; bool is_swizzle; CanonicalizeShuffle(node, shuffle, &is_swizzle); @@ -3273,9 +3285,12 @@ void InstructionSelector::VisitS8x16Shuffle(Node* node) { // Swizzles don't generally need DefineSameAsFirst to avoid a move. bool no_same_as_first = is_swizzle; // We generally need UseRegister for input0, Use for input1. + // TODO(v8:9198): We don't have 16-byte alignment for SIMD operands yet, but + // we retain this logic (continue setting these in the various shuffle match + // clauses), but ignore it when selecting registers or slots. bool src0_needs_reg = true; bool src1_needs_reg = false; - ArchOpcode opcode = kX64S8x16Shuffle; // general shuffle is the default + ArchOpcode opcode = kX64I8x16Shuffle; // general shuffle is the default uint8_t offset; uint8_t shuffle32x4[4]; @@ -3365,7 +3380,7 @@ void InstructionSelector::VisitS8x16Shuffle(Node* node) { src0_needs_reg = true; imms[imm_count++] = index; } - if (opcode == kX64S8x16Shuffle) { + if (opcode == kX64I8x16Shuffle) { // Use same-as-first for general swizzle, but not shuffle. no_same_as_first = !is_swizzle; src0_needs_reg = !no_same_as_first; @@ -3381,16 +3396,18 @@ void InstructionSelector::VisitS8x16Shuffle(Node* node) { Node* input0 = node->InputAt(0); InstructionOperand dst = no_same_as_first ? g.DefineAsRegister(node) : g.DefineSameAsFirst(node); - InstructionOperand src0 = - src0_needs_reg ? g.UseUniqueRegister(input0) : g.UseUnique(input0); + // TODO(v8:9198): Use src0_needs_reg when we have memory alignment for SIMD. + InstructionOperand src0 = g.UseUniqueRegister(input0); + USE(src0_needs_reg); int input_count = 0; InstructionOperand inputs[2 + kMaxImms + kMaxTemps]; inputs[input_count++] = src0; if (!is_swizzle) { Node* input1 = node->InputAt(1); - inputs[input_count++] = - src1_needs_reg ? g.UseUniqueRegister(input1) : g.UseUnique(input1); + // TODO(v8:9198): Use src1_needs_reg when we have memory alignment for SIMD. + inputs[input_count++] = g.UseUniqueRegister(input1); + USE(src1_needs_reg); } for (int i = 0; i < imm_count; ++i) { inputs[input_count++] = g.UseImmediate(imms[i]); @@ -3398,10 +3415,10 @@ void InstructionSelector::VisitS8x16Shuffle(Node* node) { Emit(opcode, 1, &dst, input_count, inputs, temp_count, temps); } -void InstructionSelector::VisitS8x16Swizzle(Node* node) { +void InstructionSelector::VisitI8x16Swizzle(Node* node) { X64OperandGenerator g(this); InstructionOperand temps[] = {g.TempSimd128Register()}; - Emit(kX64S8x16Swizzle, g.DefineSameAsFirst(node), + Emit(kX64I8x16Swizzle, g.DefineSameAsFirst(node), g.UseRegister(node->InputAt(0)), g.UseUniqueRegister(node->InputAt(1)), arraysize(temps), temps); } diff --git a/deps/v8/src/compiler/bytecode-graph-builder.cc b/deps/v8/src/compiler/bytecode-graph-builder.cc index ecdfe72d7dced2..7855bc4c444e5c 100644 --- a/deps/v8/src/compiler/bytecode-graph-builder.cc +++ b/deps/v8/src/compiler/bytecode-graph-builder.cc @@ -39,7 +39,7 @@ class BytecodeGraphBuilder { BailoutId osr_offset, JSGraph* jsgraph, CallFrequency const& invocation_frequency, SourcePositionTable* source_positions, int inlining_id, - BytecodeGraphBuilderFlags flags, + CodeKind code_kind, BytecodeGraphBuilderFlags flags, TickCounter* tick_counter); // Creates a graph by visiting bytecodes. @@ -63,8 +63,26 @@ class BytecodeGraphBuilder { // Get or create the node that represents the outer function closure. Node* GetFunctionClosure(); + CodeKind code_kind() const { return code_kind_; } bool native_context_independent() const { - return native_context_independent_; + return CodeKindIsNativeContextIndependentJSFunction(code_kind_); + } + bool generate_full_feedback_collection() const { + // NCI code currently collects full feedback. + DCHECK_IMPLIES(native_context_independent(), + CollectFeedbackInGenericLowering()); + return native_context_independent(); + } + + static JSTypeHintLowering::LoweringResult NoChange() { + return JSTypeHintLowering::LoweringResult::NoChange(); + } + bool CanApplyTypeHintLowering(IrOpcode::Value opcode) const { + return !generate_full_feedback_collection() || + !IrOpcode::IsFeedbackCollectingOpcode(opcode); + } + bool CanApplyTypeHintLowering(const Operator* op) const { + return CanApplyTypeHintLowering(static_cast(op->opcode())); } // The node representing the current feedback vector is generated once prior @@ -97,6 +115,12 @@ class BytecodeGraphBuilder { Node* BuildLoadFeedbackCell(int index); + // Checks the optimization marker and potentially triggers compilation or + // installs the finished code object. + // Only relevant for specific code kinds (see + // CodeKindChecksOptimizationMarker). + void MaybeBuildTierUpCheck(); + // Builder for loading the a native context field. Node* BuildLoadNativeContextField(int index); @@ -426,7 +450,7 @@ class BytecodeGraphBuilder { int input_buffer_size_; Node** input_buffer_; - const bool native_context_independent_; + const CodeKind code_kind_; Node* feedback_cell_node_; Node* feedback_vector_node_; Node* native_context_node_; @@ -958,7 +982,7 @@ BytecodeGraphBuilder::BytecodeGraphBuilder( SharedFunctionInfoRef const& shared_info, FeedbackVectorRef const& feedback_vector, BailoutId osr_offset, JSGraph* jsgraph, CallFrequency const& invocation_frequency, - SourcePositionTable* source_positions, int inlining_id, + SourcePositionTable* source_positions, int inlining_id, CodeKind code_kind, BytecodeGraphBuilderFlags flags, TickCounter* tick_counter) : broker_(broker), local_zone_(local_zone), @@ -977,7 +1001,7 @@ BytecodeGraphBuilder::BytecodeGraphBuilder( bytecode_array().parameter_count(), bytecode_array().register_count(), shared_info.object())), source_position_iterator_(std::make_unique( - bytecode_array().source_positions())), + bytecode_array().SourcePositionTable())), bytecode_iterator_( std::make_unique(bytecode_array())), bytecode_analysis_(broker_->GetBytecodeAnalysis( @@ -997,8 +1021,7 @@ BytecodeGraphBuilder::BytecodeGraphBuilder( current_exception_handler_(0), input_buffer_size_(0), input_buffer_(nullptr), - native_context_independent_( - flags & BytecodeGraphBuilderFlag::kNativeContextIndependent), + code_kind_(code_kind), feedback_cell_node_(nullptr), feedback_vector_node_(nullptr), native_context_node_(nullptr), @@ -1120,6 +1143,19 @@ Node* BytecodeGraphBuilder::BuildLoadNativeContext() { return native_context; } +void BytecodeGraphBuilder::MaybeBuildTierUpCheck() { + if (!CodeKindChecksOptimizationMarker(code_kind())) return; + + Environment* env = environment(); + Node* control = env->GetControlDependency(); + Node* effect = env->GetEffectDependency(); + + effect = graph()->NewNode(simplified()->TierUpCheck(), feedback_vector_node(), + effect, control); + + env->UpdateEffectDependency(effect); +} + Node* BytecodeGraphBuilder::BuildLoadNativeContextField(int index) { Node* result = NewNode(javascript()->LoadContext(0, index, true)); NodeProperties::ReplaceContextInput(result, native_context_node()); @@ -1141,8 +1177,9 @@ void BytecodeGraphBuilder::CreateGraph() { // Set up the basic structure of the graph. Outputs for {Start} are the formal // parameters (including the receiver) plus new target, number of arguments, // context and closure. - int actual_parameter_count = bytecode_array().parameter_count() + 4; - graph()->SetStart(graph()->NewNode(common()->Start(actual_parameter_count))); + int start_output_arity = StartNode::OutputArityForFormalParameterCount( + bytecode_array().parameter_count()); + graph()->SetStart(graph()->NewNode(common()->Start(start_output_arity))); Environment env(this, bytecode_array().register_count(), bytecode_array().parameter_count(), @@ -1152,7 +1189,9 @@ void BytecodeGraphBuilder::CreateGraph() { CreateFeedbackCellNode(); CreateFeedbackVectorNode(); + MaybeBuildTierUpCheck(); CreateNativeContextNode(); + VisitBytecodes(); // Finish the basic structure of the graph. @@ -1539,6 +1578,7 @@ Node* BytecodeGraphBuilder::BuildLoadGlobal(NameRef name, DCHECK(IsLoadGlobalICKind(broker()->GetFeedbackSlotKind(feedback))); const Operator* op = javascript()->LoadGlobal(name.object(), feedback, typeof_mode); + DCHECK(IrOpcode::IsFeedbackCollectingOpcode(op->opcode())); return NewNode(op, feedback_vector_node()); } @@ -1574,6 +1614,7 @@ void BytecodeGraphBuilder::VisitStaGlobal() { GetLanguageModeFromSlotKind(broker()->GetFeedbackSlotKind(feedback)); const Operator* op = javascript()->StoreGlobal(language_mode, name.object(), feedback); + DCHECK(IrOpcode::IsFeedbackCollectingOpcode(op->opcode())); Node* node = NewNode(op, value, feedback_vector_node()); environment()->RecordAfterState(node, Environment::kAttachFrameState); } @@ -1598,6 +1639,7 @@ void BytecodeGraphBuilder::VisitStaInArrayLiteral() { node = lowering.value(); } else { DCHECK(!lowering.Changed()); + DCHECK(IrOpcode::IsFeedbackCollectingOpcode(op->opcode())); node = NewNode(op, array, index, value, feedback_vector_node()); } @@ -1626,6 +1668,7 @@ void BytecodeGraphBuilder::VisitStaDataPropertyInLiteral() { node = lowering.value(); } else { DCHECK(!lowering.Changed()); + DCHECK(IrOpcode::IsFeedbackCollectingOpcode(op->opcode())); node = NewNode(op, object, name, value, jsgraph()->Constant(flags), feedback_vector_node()); } @@ -1980,6 +2023,7 @@ void BytecodeGraphBuilder::VisitLdaNamedProperty() { node = lowering.value(); } else { DCHECK(!lowering.Changed()); + DCHECK(IrOpcode::IsFeedbackCollectingOpcode(op->opcode())); node = NewNode(op, object, feedback_vector_node()); } environment()->BindAccumulator(node, Environment::kAttachFrameState); @@ -1992,10 +2036,25 @@ void BytecodeGraphBuilder::VisitLdaNamedPropertyNoFeedback() { NameRef name(broker(), bytecode_iterator().GetConstantForIndexOperand(1, isolate())); const Operator* op = javascript()->LoadNamed(name.object(), FeedbackSource()); + DCHECK(IrOpcode::IsFeedbackCollectingOpcode(op->opcode())); Node* node = NewNode(op, object, feedback_vector_node()); environment()->BindAccumulator(node, Environment::kAttachFrameState); } +void BytecodeGraphBuilder::VisitLdaNamedPropertyFromSuper() { + PrepareEagerCheckpoint(); + Node* receiver = + environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(0)); + Node* home_object = environment()->LookupAccumulator(); + NameRef name(broker(), + bytecode_iterator().GetConstantForIndexOperand(1, isolate())); + const Operator* op = javascript()->LoadNamedFromSuper(name.object()); + // TODO(marja, v8:9237): Use lowering. + + Node* node = NewNode(op, receiver, home_object); + environment()->BindAccumulator(node, Environment::kAttachFrameState); +} + void BytecodeGraphBuilder::VisitLdaKeyedProperty() { PrepareEagerCheckpoint(); Node* key = environment()->LookupAccumulator(); @@ -2017,6 +2076,7 @@ void BytecodeGraphBuilder::VisitLdaKeyedProperty() { STATIC_ASSERT(JSLoadPropertyNode::ObjectIndex() == 0); STATIC_ASSERT(JSLoadPropertyNode::KeyIndex() == 1); STATIC_ASSERT(JSLoadPropertyNode::FeedbackVectorIndex() == 2); + DCHECK(IrOpcode::IsFeedbackCollectingOpcode(op->opcode())); node = NewNode(op, object, key, feedback_vector_node()); } environment()->BindAccumulator(node, Environment::kAttachFrameState); @@ -2054,6 +2114,7 @@ void BytecodeGraphBuilder::BuildNamedStore(StoreMode store_mode) { node = lowering.value(); } else { DCHECK(!lowering.Changed()); + DCHECK(IrOpcode::IsFeedbackCollectingOpcode(op->opcode())); node = NewNode(op, object, value, feedback_vector_node()); } environment()->RecordAfterState(node, Environment::kAttachFrameState); @@ -2074,6 +2135,7 @@ void BytecodeGraphBuilder::VisitStaNamedPropertyNoFeedback() { static_cast(bytecode_iterator().GetFlagOperand(2)); const Operator* op = javascript()->StoreNamed(language_mode, name.object(), FeedbackSource()); + DCHECK(IrOpcode::IsFeedbackCollectingOpcode(op->opcode())); Node* node = NewNode(op, object, value, feedback_vector_node()); environment()->RecordAfterState(node, Environment::kAttachFrameState); } @@ -2108,6 +2170,7 @@ void BytecodeGraphBuilder::VisitStaKeyedProperty() { STATIC_ASSERT(JSStorePropertyNode::KeyIndex() == 1); STATIC_ASSERT(JSStorePropertyNode::ValueIndex() == 2); STATIC_ASSERT(JSStorePropertyNode::FeedbackVectorIndex() == 3); + DCHECK(IrOpcode::IsFeedbackCollectingOpcode(op->opcode())); node = NewNode(op, object, key, value, feedback_vector_node()); } @@ -2243,9 +2306,10 @@ void BytecodeGraphBuilder::VisitCreateRegExpLiteral() { FeedbackSource pair = CreateFeedbackSource(slot_id); int literal_flags = bytecode_iterator().GetFlagOperand(2); STATIC_ASSERT(JSCreateLiteralRegExpNode::FeedbackVectorIndex() == 0); - Node* literal = NewNode(javascript()->CreateLiteralRegExp( - constant_pattern.object(), pair, literal_flags), - feedback_vector_node()); + const Operator* op = javascript()->CreateLiteralRegExp( + constant_pattern.object(), pair, literal_flags); + DCHECK(IrOpcode::IsFeedbackCollectingOpcode(op->opcode())); + Node* literal = NewNode(op, feedback_vector_node()); environment()->BindAccumulator(literal, Environment::kAttachFrameState); } @@ -2265,18 +2329,20 @@ void BytecodeGraphBuilder::VisitCreateArrayLiteral() { int number_of_elements = array_boilerplate_description.constants_elements_length(); STATIC_ASSERT(JSCreateLiteralArrayNode::FeedbackVectorIndex() == 0); - Node* literal = NewNode( + const Operator* op = javascript()->CreateLiteralArray(array_boilerplate_description.object(), - pair, literal_flags, number_of_elements), - feedback_vector_node()); + pair, literal_flags, number_of_elements); + DCHECK(IrOpcode::IsFeedbackCollectingOpcode(op->opcode())); + Node* literal = NewNode(op, feedback_vector_node()); environment()->BindAccumulator(literal, Environment::kAttachFrameState); } void BytecodeGraphBuilder::VisitCreateEmptyArrayLiteral() { int const slot_id = bytecode_iterator().GetIndexOperand(0); FeedbackSource pair = CreateFeedbackSource(slot_id); - Node* literal = NewNode(javascript()->CreateEmptyLiteralArray(pair), - feedback_vector_node()); + const Operator* op = javascript()->CreateEmptyLiteralArray(pair); + DCHECK(IrOpcode::IsFeedbackCollectingOpcode(op->opcode())); + Node* literal = NewNode(op, feedback_vector_node()); environment()->BindAccumulator(literal); } @@ -2296,10 +2362,10 @@ void BytecodeGraphBuilder::VisitCreateObjectLiteral() { interpreter::CreateObjectLiteralFlags::FlagsBits::decode(bytecode_flags); int number_of_properties = constant_properties.size(); STATIC_ASSERT(JSCreateLiteralObjectNode::FeedbackVectorIndex() == 0); - Node* literal = NewNode( - javascript()->CreateLiteralObject(constant_properties.object(), pair, - literal_flags, number_of_properties), - feedback_vector_node()); + const Operator* op = javascript()->CreateLiteralObject( + constant_properties.object(), pair, literal_flags, number_of_properties); + DCHECK(IrOpcode::IsFeedbackCollectingOpcode(op->opcode())); + Node* literal = NewNode(op, feedback_vector_node()); environment()->BindAccumulator(literal, Environment::kAttachFrameState); } @@ -2318,6 +2384,7 @@ void BytecodeGraphBuilder::VisitCloneObject() { javascript()->CloneObject(CreateFeedbackSource(slot), flags); STATIC_ASSERT(JSCloneObjectNode::SourceIndex() == 0); STATIC_ASSERT(JSCloneObjectNode::FeedbackVectorIndex() == 1); + DCHECK(IrOpcode::IsFeedbackCollectingOpcode(op->opcode())); Node* value = NewNode(op, source, feedback_vector_node()); environment()->BindAccumulator(value, Environment::kAttachFrameState); } @@ -2329,10 +2396,10 @@ void BytecodeGraphBuilder::VisitGetTemplateObject() { TemplateObjectDescriptionRef description( broker(), bytecode_iterator().GetConstantForIndexOperand(0, isolate())); STATIC_ASSERT(JSGetTemplateObjectNode::FeedbackVectorIndex() == 0); - Node* template_object = - NewNode(javascript()->GetTemplateObject(description.object(), - shared_info().object(), source), - feedback_vector_node()); + const Operator* op = javascript()->GetTemplateObject( + description.object(), shared_info().object(), source); + DCHECK(IrOpcode::IsFeedbackCollectingOpcode(op->opcode())); + Node* template_object = NewNode(op, feedback_vector_node()); environment()->BindAccumulator(template_object); } @@ -2378,6 +2445,7 @@ void BytecodeGraphBuilder::BuildCall(ConvertReceiverMode receiver_mode, const Operator* op = javascript()->Call(arg_count, frequency, feedback, receiver_mode, speculation_mode, CallFeedbackRelation::kRelated); + DCHECK(IrOpcode::IsFeedbackCollectingOpcode(op->opcode())); JSTypeHintLowering::LoweringResult lowering = TryBuildSimplifiedCall( op, args, static_cast(arg_count), feedback.slot); @@ -2563,6 +2631,7 @@ void BytecodeGraphBuilder::VisitCallWithSpread() { const Operator* op = javascript()->CallWithSpread( JSCallWithSpreadNode::ArityForArgc(arg_count), frequency, feedback, speculation_mode); + DCHECK(IrOpcode::IsFeedbackCollectingOpcode(op->opcode())); JSTypeHintLowering::LoweringResult lowering = TryBuildSimplifiedCall( op, args, static_cast(arg_count), feedback.slot); @@ -2687,6 +2756,7 @@ void BytecodeGraphBuilder::VisitConstruct() { const uint32_t arg_count = static_cast(reg_count); const uint32_t arity = JSConstructNode::ArityForArgc(arg_count); const Operator* op = javascript()->Construct(arity, frequency, feedback); + DCHECK(IrOpcode::IsFeedbackCollectingOpcode(op->opcode())); Node* const* args = GetConstructArgumentsFromRegister(callee, new_target, first_reg, arg_count); JSTypeHintLowering::LoweringResult lowering = TryBuildSimplifiedConstruct( @@ -2719,6 +2789,7 @@ void BytecodeGraphBuilder::VisitConstructWithSpread() { const uint32_t arity = JSConstructNode::ArityForArgc(arg_count); const Operator* op = javascript()->ConstructWithSpread(arity, frequency, feedback); + DCHECK(IrOpcode::IsFeedbackCollectingOpcode(op->opcode())); Node* const* args = GetConstructArgumentsFromRegister(callee, new_target, first_reg, arg_count); JSTypeHintLowering::LoweringResult lowering = TryBuildSimplifiedConstruct( @@ -2848,6 +2919,7 @@ void BytecodeGraphBuilder::BuildUnaryOp(const Operator* op) { node = lowering.value(); } else { DCHECK(!lowering.Changed()); + DCHECK(IrOpcode::IsFeedbackCollectingOpcode(op->opcode())); node = NewNode(op, operand, feedback_vector_node()); } @@ -2872,6 +2944,7 @@ void BytecodeGraphBuilder::BuildBinaryOp(const Operator* op) { node = lowering.value(); } else { DCHECK(!lowering.Changed()); + DCHECK(IrOpcode::IsFeedbackCollectingOpcode(op->opcode())); node = NewNode(op, left, right, feedback_vector_node()); } @@ -3029,6 +3102,7 @@ void BytecodeGraphBuilder::BuildBinaryOpWithImmediate(const Operator* op) { node = lowering.value(); } else { DCHECK(!lowering.Changed()); + DCHECK(IrOpcode::IsFeedbackCollectingOpcode(op->opcode())); node = NewNode(op, left, right, feedback_vector_node()); } environment()->BindAccumulator(node, Environment::kAttachFrameState); @@ -3167,6 +3241,7 @@ void BytecodeGraphBuilder::BuildCompareOp(const Operator* op) { node = lowering.value(); } else { DCHECK(!lowering.Changed()); + DCHECK(IrOpcode::IsFeedbackCollectingOpcode(op->opcode())); node = NewNode(op, left, right, feedback_vector_node()); } environment()->BindAccumulator(node, Environment::kAttachFrameState); @@ -3226,8 +3301,9 @@ void BytecodeGraphBuilder::VisitTestIn() { STATIC_ASSERT(JSHasPropertyNode::ObjectIndex() == 0); STATIC_ASSERT(JSHasPropertyNode::KeyIndex() == 1); STATIC_ASSERT(JSHasPropertyNode::FeedbackVectorIndex() == 2); - Node* node = NewNode(javascript()->HasProperty(feedback), object, key, - feedback_vector_node()); + const Operator* op = javascript()->HasProperty(feedback); + DCHECK(IrOpcode::IsFeedbackCollectingOpcode(op->opcode())); + Node* node = NewNode(op, object, key, feedback_vector_node()); environment()->BindAccumulator(node, Environment::kAttachFrameState); } @@ -3608,6 +3684,7 @@ void BytecodeGraphBuilder::VisitGetIterator() { DCHECK(!lowering.Changed()); STATIC_ASSERT(JSGetIteratorNode::ReceiverIndex() == 0); STATIC_ASSERT(JSGetIteratorNode::FeedbackVectorIndex() == 1); + DCHECK(IrOpcode::IsFeedbackCollectingOpcode(op->opcode())); Node* iterator = NewNode(op, receiver, feedback_vector_node()); environment()->BindAccumulator(iterator, Environment::kAttachFrameState); } @@ -4007,6 +4084,7 @@ JSTypeHintLowering::LoweringResult BytecodeGraphBuilder::TryBuildSimplifiedUnaryOp(const Operator* op, Node* operand, FeedbackSlot slot) { + if (!CanApplyTypeHintLowering(op)) return NoChange(); Node* effect = environment()->GetEffectDependency(); Node* control = environment()->GetControlDependency(); JSTypeHintLowering::LoweringResult result = @@ -4020,6 +4098,7 @@ JSTypeHintLowering::LoweringResult BytecodeGraphBuilder::TryBuildSimplifiedBinaryOp(const Operator* op, Node* left, Node* right, FeedbackSlot slot) { + if (!CanApplyTypeHintLowering(op)) return NoChange(); Node* effect = environment()->GetEffectDependency(); Node* control = environment()->GetControlDependency(); JSTypeHintLowering::LoweringResult result = @@ -4034,6 +4113,7 @@ BytecodeGraphBuilder::TryBuildSimplifiedForInNext(Node* receiver, Node* cache_array, Node* cache_type, Node* index, FeedbackSlot slot) { + if (!CanApplyTypeHintLowering(IrOpcode::kJSForInNext)) return NoChange(); Node* effect = environment()->GetEffectDependency(); Node* control = environment()->GetControlDependency(); JSTypeHintLowering::LoweringResult result = @@ -4046,6 +4126,7 @@ BytecodeGraphBuilder::TryBuildSimplifiedForInNext(Node* receiver, JSTypeHintLowering::LoweringResult BytecodeGraphBuilder::TryBuildSimplifiedForInPrepare(Node* enumerator, FeedbackSlot slot) { + if (!CanApplyTypeHintLowering(IrOpcode::kJSForInPrepare)) return NoChange(); Node* effect = environment()->GetEffectDependency(); Node* control = environment()->GetControlDependency(); JSTypeHintLowering::LoweringResult result = @@ -4058,6 +4139,7 @@ BytecodeGraphBuilder::TryBuildSimplifiedForInPrepare(Node* enumerator, JSTypeHintLowering::LoweringResult BytecodeGraphBuilder::TryBuildSimplifiedToNumber(Node* value, FeedbackSlot slot) { + if (!CanApplyTypeHintLowering(IrOpcode::kJSToNumber)) return NoChange(); Node* effect = environment()->GetEffectDependency(); Node* control = environment()->GetControlDependency(); JSTypeHintLowering::LoweringResult result = @@ -4069,6 +4151,7 @@ BytecodeGraphBuilder::TryBuildSimplifiedToNumber(Node* value, JSTypeHintLowering::LoweringResult BytecodeGraphBuilder::TryBuildSimplifiedCall( const Operator* op, Node* const* args, int arg_count, FeedbackSlot slot) { + if (!CanApplyTypeHintLowering(op)) return NoChange(); Node* effect = environment()->GetEffectDependency(); Node* control = environment()->GetControlDependency(); JSTypeHintLowering::LoweringResult result = @@ -4083,6 +4166,7 @@ BytecodeGraphBuilder::TryBuildSimplifiedConstruct(const Operator* op, Node* const* args, int arg_count, FeedbackSlot slot) { + if (!CanApplyTypeHintLowering(op)) return NoChange(); Node* effect = environment()->GetEffectDependency(); Node* control = environment()->GetControlDependency(); JSTypeHintLowering::LoweringResult result = @@ -4097,6 +4181,7 @@ BytecodeGraphBuilder::TryBuildSimplifiedGetIterator(const Operator* op, Node* receiver, FeedbackSlot load_slot, FeedbackSlot call_slot) { + if (!CanApplyTypeHintLowering(op)) return NoChange(); Node* effect = environment()->GetEffectDependency(); Node* control = environment()->GetControlDependency(); JSTypeHintLowering::LoweringResult early_reduction = @@ -4110,6 +4195,7 @@ JSTypeHintLowering::LoweringResult BytecodeGraphBuilder::TryBuildSimplifiedLoadNamed(const Operator* op, Node* receiver, FeedbackSlot slot) { + if (!CanApplyTypeHintLowering(op)) return NoChange(); Node* effect = environment()->GetEffectDependency(); Node* control = environment()->GetControlDependency(); JSTypeHintLowering::LoweringResult early_reduction = @@ -4123,6 +4209,7 @@ JSTypeHintLowering::LoweringResult BytecodeGraphBuilder::TryBuildSimplifiedLoadKeyed(const Operator* op, Node* receiver, Node* key, FeedbackSlot slot) { + if (!CanApplyTypeHintLowering(op)) return NoChange(); Node* effect = environment()->GetEffectDependency(); Node* control = environment()->GetControlDependency(); JSTypeHintLowering::LoweringResult result = @@ -4136,6 +4223,7 @@ JSTypeHintLowering::LoweringResult BytecodeGraphBuilder::TryBuildSimplifiedStoreNamed(const Operator* op, Node* receiver, Node* value, FeedbackSlot slot) { + if (!CanApplyTypeHintLowering(op)) return NoChange(); Node* effect = environment()->GetEffectDependency(); Node* control = environment()->GetControlDependency(); JSTypeHintLowering::LoweringResult result = @@ -4150,6 +4238,7 @@ BytecodeGraphBuilder::TryBuildSimplifiedStoreKeyed(const Operator* op, Node* receiver, Node* key, Node* value, FeedbackSlot slot) { + if (!CanApplyTypeHintLowering(op)) return NoChange(); Node* effect = environment()->GetEffectDependency(); Node* control = environment()->GetControlDependency(); JSTypeHintLowering::LoweringResult result = @@ -4387,13 +4476,14 @@ void BuildGraphFromBytecode(JSHeapBroker* broker, Zone* local_zone, BailoutId osr_offset, JSGraph* jsgraph, CallFrequency const& invocation_frequency, SourcePositionTable* source_positions, - int inlining_id, BytecodeGraphBuilderFlags flags, + int inlining_id, CodeKind code_kind, + BytecodeGraphBuilderFlags flags, TickCounter* tick_counter) { DCHECK(broker->IsSerializedForCompilation(shared_info, feedback_vector)); BytecodeGraphBuilder builder( broker, local_zone, broker->target_native_context(), shared_info, feedback_vector, osr_offset, jsgraph, invocation_frequency, - source_positions, inlining_id, flags, tick_counter); + source_positions, inlining_id, code_kind, flags, tick_counter); builder.CreateGraph(); } diff --git a/deps/v8/src/compiler/bytecode-graph-builder.h b/deps/v8/src/compiler/bytecode-graph-builder.h index 1667a4d57d2677..a8423904f8fb6a 100644 --- a/deps/v8/src/compiler/bytecode-graph-builder.h +++ b/deps/v8/src/compiler/bytecode-graph-builder.h @@ -7,8 +7,9 @@ #include "src/compiler/js-operator.h" #include "src/compiler/js-type-hint-lowering.h" -#include "src/utils/utils.h" #include "src/handles/handles.h" +#include "src/objects/code-kind.h" +#include "src/utils/utils.h" namespace v8 { @@ -33,7 +34,6 @@ enum class BytecodeGraphBuilderFlag : uint8_t { // bytecode analysis. kAnalyzeEnvironmentLiveness = 1 << 1, kBailoutOnUninitialized = 1 << 2, - kNativeContextIndependent = 1 << 3, }; using BytecodeGraphBuilderFlags = base::Flags; @@ -45,7 +45,8 @@ void BuildGraphFromBytecode(JSHeapBroker* broker, Zone* local_zone, BailoutId osr_offset, JSGraph* jsgraph, CallFrequency const& invocation_frequency, SourcePositionTable* source_positions, - int inlining_id, BytecodeGraphBuilderFlags flags, + int inlining_id, CodeKind code_kind, + BytecodeGraphBuilderFlags flags, TickCounter* tick_counter); } // namespace compiler diff --git a/deps/v8/src/compiler/c-linkage.cc b/deps/v8/src/compiler/c-linkage.cc index fdf0a66a22cf2b..af467f2bb14116 100644 --- a/deps/v8/src/compiler/c-linkage.cc +++ b/deps/v8/src/compiler/c-linkage.cc @@ -31,6 +31,7 @@ namespace { // == x64 windows ============================================================ #define STACK_SHADOW_WORDS 4 #define PARAM_REGISTERS rcx, rdx, r8, r9 +#define FP_PARAM_REGISTERS xmm0, xmm1, xmm2, xmm3 #define CALLEE_SAVE_REGISTERS \ rbx.bit() | rdi.bit() | rsi.bit() | r12.bit() | r13.bit() | r14.bit() | \ r15.bit() @@ -42,6 +43,7 @@ namespace { #else // V8_TARGET_OS_WIN // == x64 other ============================================================== #define PARAM_REGISTERS rdi, rsi, rdx, rcx, r8, r9 +#define FP_PARAM_REGISTERS xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7 #define CALLEE_SAVE_REGISTERS \ rbx.bit() | r12.bit() | r13.bit() | r14.bit() | r15.bit() #endif // V8_TARGET_OS_WIN @@ -137,38 +139,116 @@ namespace { #endif } // namespace +#ifdef V8_TARGET_OS_WIN +// As defined in +// https://docs.microsoft.com/en-us/cpp/build/x64-calling-convention?view=vs-2019#parameter-passing, +// Windows calling convention doesn't differentiate between GP and FP params +// when counting how many of them should be placed in registers. That's why +// we use the same counter {i} for both types here. +void BuildParameterLocations(const MachineSignature* msig, + size_t kFPParamRegisterCount, + size_t kParamRegisterCount, + const DoubleRegister* kFPParamRegisters, + const v8::internal::Register* kParamRegisters, + LocationSignature::Builder* out_locations) { +#ifdef STACK_SHADOW_WORDS + int stack_offset = STACK_SHADOW_WORDS; +#else + int stack_offset = 0; +#endif + CHECK_EQ(kFPParamRegisterCount, kParamRegisterCount); + + for (size_t i = 0; i < msig->parameter_count(); i++) { + MachineType type = msig->GetParam(i); + bool spill = (i >= kParamRegisterCount); + if (spill) { + out_locations->AddParam( + LinkageLocation::ForCallerFrameSlot(-1 - stack_offset, type)); + stack_offset++; + } else { + if (IsFloatingPoint(type.representation())) { + out_locations->AddParam( + LinkageLocation::ForRegister(kFPParamRegisters[i].code(), type)); + } else { + out_locations->AddParam( + LinkageLocation::ForRegister(kParamRegisters[i].code(), type)); + } + } + } +} +#else // V8_TARGET_OS_WIN +// As defined in https://www.agner.org/optimize/calling_conventions.pdf, +// Section 7, Linux and Mac place parameters in consecutive registers, +// differentiating between GP and FP params. That's why we maintain two +// separate counters here. +void BuildParameterLocations(const MachineSignature* msig, + size_t kFPParamRegisterCount, + size_t kParamRegisterCount, + const DoubleRegister* kFPParamRegisters, + const v8::internal::Register* kParamRegisters, + LocationSignature::Builder* out_locations) { +#ifdef STACK_SHADOW_WORDS + int stack_offset = STACK_SHADOW_WORDS; +#else + int stack_offset = 0; +#endif + size_t num_params = 0; + size_t num_fp_params = 0; + for (size_t i = 0; i < msig->parameter_count(); i++) { + MachineType type = msig->GetParam(i); + bool spill = IsFloatingPoint(type.representation()) + ? (num_fp_params >= kFPParamRegisterCount) + : (num_params >= kParamRegisterCount); + if (spill) { + out_locations->AddParam( + LinkageLocation::ForCallerFrameSlot(-1 - stack_offset, type)); + stack_offset++; + } else { + if (IsFloatingPoint(type.representation())) { + out_locations->AddParam(LinkageLocation::ForRegister( + kFPParamRegisters[num_fp_params].code(), type)); + ++num_fp_params; + } else { + out_locations->AddParam(LinkageLocation::ForRegister( + kParamRegisters[num_params].code(), type)); + ++num_params; + } + } + } +} +#endif // V8_TARGET_OS_WIN // General code uses the above configuration data. CallDescriptor* Linkage::GetSimplifiedCDescriptor(Zone* zone, const MachineSignature* msig, CallDescriptor::Flags flags) { +#ifdef UNSUPPORTED_C_LINKAGE + // This method should not be called on unknown architectures. + FATAL("requested C call descriptor on unsupported architecture"); + return nullptr; +#endif + DCHECK_LE(msig->parameter_count(), static_cast(kMaxCParameters)); LocationSignature::Builder locations(zone, msig->return_count(), msig->parameter_count()); + +#ifndef V8_ENABLE_FP_PARAMS_IN_C_LINKAGE // Check the types of the signature. - // Currently no floating point parameters or returns are allowed because - // on ia32, the FP top of stack is involved. - for (size_t i = 0; i < msig->return_count(); i++) { - MachineRepresentation rep = msig->GetReturn(i).representation(); - CHECK_NE(MachineRepresentation::kFloat32, rep); - CHECK_NE(MachineRepresentation::kFloat64, rep); - } for (size_t i = 0; i < msig->parameter_count(); i++) { MachineRepresentation rep = msig->GetParam(i).representation(); CHECK_NE(MachineRepresentation::kFloat32, rep); CHECK_NE(MachineRepresentation::kFloat64, rep); } - -#ifdef UNSUPPORTED_C_LINKAGE - // This method should not be called on unknown architectures. - FATAL("requested C call descriptor on unsupported architecture"); - return nullptr; #endif - // Add return location(s). - CHECK_GE(2, locations.return_count_); + // Add return location(s). We don't support FP returns for now. + for (size_t i = 0; i < locations.return_count_; i++) { + MachineType type = msig->GetReturn(i); + CHECK(!IsFloatingPoint(type.representation())); + } + CHECK_GE(2, locations.return_count_); if (locations.return_count_ > 0) { locations.AddReturn(LinkageLocation::ForRegister(kReturnRegister0.code(), msig->GetReturn(0))); @@ -178,8 +258,6 @@ CallDescriptor* Linkage::GetSimplifiedCDescriptor(Zone* zone, msig->GetReturn(1))); } - const int parameter_count = static_cast(msig->parameter_count()); - #ifdef PARAM_REGISTERS const v8::internal::Register kParamRegisters[] = {PARAM_REGISTERS}; const int kParamRegisterCount = static_cast(arraysize(kParamRegisters)); @@ -188,22 +266,17 @@ CallDescriptor* Linkage::GetSimplifiedCDescriptor(Zone* zone, const int kParamRegisterCount = 0; #endif -#ifdef STACK_SHADOW_WORDS - int stack_offset = STACK_SHADOW_WORDS; +#ifdef FP_PARAM_REGISTERS + const DoubleRegister kFPParamRegisters[] = {FP_PARAM_REGISTERS}; + const size_t kFPParamRegisterCount = arraysize(kFPParamRegisters); #else - int stack_offset = 0; + const DoubleRegister* kFPParamRegisters = nullptr; + const size_t kFPParamRegisterCount = 0; #endif + // Add register and/or stack parameter(s). - for (int i = 0; i < parameter_count; i++) { - if (i < kParamRegisterCount) { - locations.AddParam(LinkageLocation::ForRegister(kParamRegisters[i].code(), - msig->GetParam(i))); - } else { - locations.AddParam(LinkageLocation::ForCallerFrameSlot( - -1 - stack_offset, msig->GetParam(i))); - stack_offset++; - } - } + BuildParameterLocations(msig, kFPParamRegisterCount, kParamRegisterCount, + kFPParamRegisters, kParamRegisters, &locations); #ifdef CALLEE_SAVE_REGISTERS const RegList kCalleeSaveRegisters = CALLEE_SAVE_REGISTERS; diff --git a/deps/v8/src/compiler/code-assembler.cc b/deps/v8/src/compiler/code-assembler.cc index 5f5ff66cfe5792..273058ba25963d 100644 --- a/deps/v8/src/compiler/code-assembler.cc +++ b/deps/v8/src/compiler/code-assembler.cc @@ -64,11 +64,8 @@ CodeAssemblerState::CodeAssemblerState(Isolate* isolate, Zone* zone, int32_t builtin_index) : CodeAssemblerState( isolate, zone, - Linkage::GetJSCallDescriptor( - zone, false, parameter_count, - (kind == CodeKind::BUILTIN ? CallDescriptor::kPushArgumentCount - : CallDescriptor::kNoFlags) | - CallDescriptor::kCanUseRoots), + Linkage::GetJSCallDescriptor(zone, false, parameter_count, + CallDescriptor::kCanUseRoots), kind, name, poisoning_level, builtin_index) {} CodeAssemblerState::CodeAssemblerState(Isolate* isolate, Zone* zone, diff --git a/deps/v8/src/compiler/common-operator.h b/deps/v8/src/compiler/common-operator.h index 22547aa45c1aae..f68780394aee3b 100644 --- a/deps/v8/src/compiler/common-operator.h +++ b/deps/v8/src/compiler/common-operator.h @@ -12,6 +12,8 @@ #include "src/common/globals.h" #include "src/compiler/feedback-source.h" #include "src/compiler/frame-states.h" +#include "src/compiler/linkage.h" +#include "src/compiler/node-properties.h" #include "src/deoptimizer/deoptimize-reason.h" #include "src/zone/zone-containers.h" #include "src/zone/zone-handle-set.h" @@ -565,6 +567,77 @@ class V8_EXPORT_PRIVATE CommonOperatorBuilder final DISALLOW_COPY_AND_ASSIGN(CommonOperatorBuilder); }; +// Node wrappers. + +class CommonNodeWrapperBase : public NodeWrapper { + public: + explicit constexpr CommonNodeWrapperBase(Node* node) : NodeWrapper(node) {} + + // Valid iff this node has exactly one effect input. + Effect effect() const { + DCHECK_EQ(node()->op()->EffectInputCount(), 1); + return Effect{NodeProperties::GetEffectInput(node())}; + } + + // Valid iff this node has exactly one control input. + Control control() const { + DCHECK_EQ(node()->op()->ControlInputCount(), 1); + return Control{NodeProperties::GetControlInput(node())}; + } +}; + +#define DEFINE_INPUT_ACCESSORS(Name, name, TheIndex, Type) \ + static constexpr int Name##Index() { return TheIndex; } \ + TNode name() const { \ + return TNode::UncheckedCast( \ + NodeProperties::GetValueInput(node(), TheIndex)); \ + } + +class StartNode final : public CommonNodeWrapperBase { + public: + explicit constexpr StartNode(Node* node) : CommonNodeWrapperBase(node) { + CONSTEXPR_DCHECK(node->opcode() == IrOpcode::kStart); + } + + // The receiver is counted as part of formal parameters. + static constexpr int kReceiverOutputCount = 1; + // These outputs are in addition to formal parameters. + static constexpr int kExtraOutputCount = 4; + + // Takes the formal parameter count of the current function (including + // receiver) and returns the number of value outputs of the start node. + static constexpr int OutputArityForFormalParameterCount(int argc) { + constexpr int kClosure = 1; + constexpr int kNewTarget = 1; + constexpr int kArgCount = 1; + constexpr int kContext = 1; + STATIC_ASSERT(kClosure + kNewTarget + kArgCount + kContext == + kExtraOutputCount); + // Checking related linkage methods here since they rely on Start node + // layout. + CONSTEXPR_DCHECK(Linkage::kJSCallClosureParamIndex == -1); + CONSTEXPR_DCHECK(Linkage::GetJSCallNewTargetParamIndex(argc) == argc + 0); + CONSTEXPR_DCHECK(Linkage::GetJSCallArgCountParamIndex(argc) == argc + 1); + CONSTEXPR_DCHECK(Linkage::GetJSCallContextParamIndex(argc) == argc + 2); + return argc + kClosure + kNewTarget + kArgCount + kContext; + } + + int FormalParameterCount() const { + DCHECK_GE(node()->op()->ValueOutputCount(), + kExtraOutputCount + kReceiverOutputCount); + return node()->op()->ValueOutputCount() - kExtraOutputCount; + } + + int FormalParameterCountWithoutReceiver() const { + DCHECK_GE(node()->op()->ValueOutputCount(), + kExtraOutputCount + kReceiverOutputCount); + return node()->op()->ValueOutputCount() - kExtraOutputCount - + kReceiverOutputCount; + } +}; + +#undef DEFINE_INPUT_ACCESSORS + } // namespace compiler } // namespace internal } // namespace v8 diff --git a/deps/v8/src/compiler/compilation-dependencies.cc b/deps/v8/src/compiler/compilation-dependencies.cc index 33e1930499c839..263a5a5f1e74a2 100644 --- a/deps/v8/src/compiler/compilation-dependencies.cc +++ b/deps/v8/src/compiler/compilation-dependencies.cc @@ -8,6 +8,7 @@ #include "src/execution/protectors.h" #include "src/handles/handles-inl.h" #include "src/objects/allocation-site-inl.h" +#include "src/objects/js-function-inl.h" #include "src/objects/objects-inl.h" #include "src/zone/zone-handle-set.h" @@ -179,6 +180,13 @@ class FieldRepresentationDependency final : public CompilationDependency { DependentCode::kFieldRepresentationGroup); } +#ifdef DEBUG + bool IsFieldRepresentationDependencyOnMap( + Handle const& receiver_map) const override { + return owner_.object().equals(receiver_map); + } +#endif + private: MapRef owner_; InternalIndex descriptor_; diff --git a/deps/v8/src/compiler/compilation-dependency.h b/deps/v8/src/compiler/compilation-dependency.h index e5726a0ddb8dc4..751e8d9f3524af 100644 --- a/deps/v8/src/compiler/compilation-dependency.h +++ b/deps/v8/src/compiler/compilation-dependency.h @@ -22,6 +22,10 @@ class CompilationDependency : public ZoneObject { #ifdef DEBUG virtual bool IsPretenureModeDependency() const { return false; } + virtual bool IsFieldRepresentationDependencyOnMap( + Handle const& receiver_map) const { + return false; + } #endif }; diff --git a/deps/v8/src/compiler/effect-control-linearizer.cc b/deps/v8/src/compiler/effect-control-linearizer.cc index 14dd26ba7fc958..98ca00c78b2fd9 100644 --- a/deps/v8/src/compiler/effect-control-linearizer.cc +++ b/deps/v8/src/compiler/effect-control-linearizer.cc @@ -45,7 +45,7 @@ class EffectControlLinearizer { maintain_schedule_(maintain_schedule), source_positions_(source_positions), node_origins_(node_origins), - graph_assembler_(js_graph, temp_zone, + graph_assembler_(js_graph, temp_zone, base::nullopt, should_maintain_schedule() ? schedule : nullptr), frame_state_zapper_(nullptr) {} @@ -179,7 +179,8 @@ class EffectControlLinearizer { void LowerCheckEqualsInternalizedString(Node* node, Node* frame_state); void LowerCheckEqualsSymbol(Node* node, Node* frame_state); Node* LowerTypeOf(Node* node); - Node* LowerUpdateInterruptBudget(Node* node); + void LowerTierUpCheck(Node* node); + void LowerUpdateInterruptBudget(Node* node); Node* LowerToBoolean(Node* node); Node* LowerPlainPrimitiveToNumber(Node* node); Node* LowerPlainPrimitiveToWord32(Node* node); @@ -265,6 +266,7 @@ class EffectControlLinearizer { Node* ObjectIsSmi(Node* value); Node* LoadFromSeqString(Node* receiver, Node* position, Node* is_one_byte); Node* TruncateWordToInt32(Node* value); + Node* MakeWeakForComparison(Node* heap_object); Node* BuildIsWeakReferenceTo(Node* maybe_object, Node* value); Node* BuildIsClearedWeakReference(Node* maybe_object); Node* BuildIsStrongReference(Node* value); @@ -282,8 +284,9 @@ class EffectControlLinearizer { DeoptimizeReason reason); // Helper functions used in LowerDynamicCheckMaps - void CheckPolymorphic(Node* feedback, Node* value_map, Node* handler, - GraphAssemblerLabel<0>* done, Node* frame_state); + void CheckPolymorphic(Node* expected_polymorphic_array, Node* actual_map, + Node* actual_handler, GraphAssemblerLabel<0>* done, + Node* frame_state); void ProcessMonomorphic(Node* handler, GraphAssemblerLabel<0>* done, Node* frame_state, int slot, Node* vector); void BranchOnICState(int slot_index, Node* vector, Node* value_map, @@ -1138,8 +1141,11 @@ bool EffectControlLinearizer::TryWireInStateEffect(Node* node, case IrOpcode::kTypeOf: result = LowerTypeOf(node); break; + case IrOpcode::kTierUpCheck: + LowerTierUpCheck(node); + break; case IrOpcode::kUpdateInterruptBudget: - result = LowerUpdateInterruptBudget(node); + LowerUpdateInterruptBudget(node); break; case IrOpcode::kNewDoubleElements: result = LowerNewDoubleElements(node); @@ -1881,51 +1887,107 @@ void EffectControlLinearizer::LowerCheckMaps(Node* node, Node* frame_state) { } } -void EffectControlLinearizer::CheckPolymorphic(Node* feedback_slot, - Node* value_map, Node* handler, +void EffectControlLinearizer::CheckPolymorphic(Node* expected_polymorphic_array, + Node* actual_map, + Node* actual_handler, GraphAssemblerLabel<0>* done, Node* frame_state) { - Node* feedback_slot_map = - __ LoadField(AccessBuilder::ForMap(), feedback_slot); - Node* is_weak_fixed_array_check = - __ TaggedEqual(feedback_slot_map, __ WeakFixedArrayMapConstant()); + Node* expected_polymorphic_array_map = + __ LoadField(AccessBuilder::ForMap(), expected_polymorphic_array); + Node* is_weak_fixed_array = __ TaggedEqual(expected_polymorphic_array_map, + __ WeakFixedArrayMapConstant()); __ DeoptimizeIfNot(DeoptimizeReason::kTransitionedToMegamorphicIC, - FeedbackSource(), is_weak_fixed_array_check, frame_state, + FeedbackSource(), is_weak_fixed_array, frame_state, IsSafetyCheck::kCriticalSafetyCheck); - Node* length = ChangeSmiToInt32( - __ LoadField(AccessBuilder::ForWeakFixedArrayLength(), feedback_slot)); - auto loop = __ MakeLoopLabel(MachineRepresentation::kWord32); - __ Goto(&loop, __ Int32Constant(0)); - __ Bind(&loop); - { - Node* index = loop.PhiAt(0); - Node* check = __ Int32LessThan(index, length); - __ DeoptimizeIfNot(DeoptimizeKind::kBailout, DeoptimizeReason::kMissingMap, - FeedbackSource(), check, frame_state, - IsSafetyCheck::kCriticalSafetyCheck); + Node* polymorphic_array = expected_polymorphic_array; - Node* maybe_map = __ LoadElement(AccessBuilder::ForWeakFixedArrayElement(), - feedback_slot, index); - auto continue_loop = __ MakeLabel(); - - __ GotoIfNot(BuildIsWeakReferenceTo(maybe_map, value_map), &continue_loop); - constexpr int kHandlerOffsetInEntry = 1; - Node* maybe_handler = __ LoadElement( - AccessBuilder::ForWeakFixedArrayElement(), feedback_slot, - __ Int32Add(index, __ Int32Constant(kHandlerOffsetInEntry))); - Node* handler_check = __ TaggedEqual(maybe_handler, handler); - __ DeoptimizeIfNot(DeoptimizeReason::kWrongHandler, FeedbackSource(), - handler_check, frame_state, - IsSafetyCheck::kCriticalSafetyCheck); + // This is now a weak pointer that we're holding in the register, we + // need to be careful about spilling and reloading it (as it could + // get cleared in between). There's no runtime call here that could + // cause a spill so we should be safe. + Node* weak_actual_map = MakeWeakForComparison(actual_map); + Node* length = ChangeSmiToInt32(__ LoadField( + AccessBuilder::ForWeakFixedArrayLength(), polymorphic_array)); + auto do_handler_check = __ MakeLabel(MachineRepresentation::kWord32); - __ Goto(done); + GraphAssemblerLabel<0> labels[] = {__ MakeLabel(), __ MakeLabel(), + __ MakeLabel(), __ MakeLabel()}; - __ Bind(&continue_loop); - constexpr int kEntrySize = 2; - index = __ Int32Add(index, __ Int32Constant(kEntrySize)); - __ Goto(&loop, index); + STATIC_ASSERT(FLAG_max_minimorphic_map_checks == arraysize(labels)); + DCHECK_GE(FLAG_max_minimorphic_map_checks, + FLAG_max_valid_polymorphic_map_count); + + // The following generates a switch based on the length of the + // array: + // + // if length >= 4: goto labels[3] + // if length == 3: goto labels[2] + // if length == 2: goto labels[1] + // if length == 1: goto labels[0] + __ GotoIf(__ Int32LessThanOrEqual( + __ Int32Constant(FeedbackIterator::SizeFor(4)), length), + &labels[3]); + __ GotoIf( + __ Word32Equal(length, __ Int32Constant(FeedbackIterator::SizeFor(3))), + &labels[2]); + __ GotoIf( + __ Word32Equal(length, __ Int32Constant(FeedbackIterator::SizeFor(2))), + &labels[1]); + __ GotoIf( + __ Word32Equal(length, __ Int32Constant(FeedbackIterator::SizeFor(1))), + &labels[0]); + + // We should never have an polymorphic feedback array of size 0. + __ Unreachable(done); + + // This loop generates code like this to do the dynamic map check: + // + // labels[3]: + // maybe_map = load(polymorphic_array, i) + // if weak_actual_map == maybe_map goto handler_check + // goto labels[2] + // labels[2]: + // maybe_map = load(polymorphic_array, i - 1) + // if weak_actual_map == maybe_map goto handler_check + // goto labels[1] + // labels[1]: + // maybe_map = load(polymorphic_array, i - 2) + // if weak_actual_map == maybe_map goto handler_check + // goto labels[0] + // labels[0]: + // maybe_map = load(polymorphic_array, i - 3) + // if weak_actual_map == maybe_map goto handler_check + // bailout + for (int i = arraysize(labels) - 1; i >= 0; i--) { + __ Bind(&labels[i]); + Node* maybe_map = __ LoadField(AccessBuilder::ForWeakFixedArraySlot( + FeedbackIterator::MapIndexForEntry(i)), + polymorphic_array); + Node* map_check = __ TaggedEqual(maybe_map, weak_actual_map); + + int handler_index = FeedbackIterator::HandlerIndexForEntry(i); + __ GotoIf(map_check, &do_handler_check, __ Int32Constant(handler_index)); + if (i > 0) { + __ Goto(&labels[i - 1]); + } else { + // TODO(turbofan): Add support for gasm->Deoptimize. + __ DeoptimizeIf(DeoptimizeKind::kBailout, DeoptimizeReason::kMissingMap, + FeedbackSource(), __ IntPtrConstant(1), + FrameState(frame_state)); + __ Unreachable(done); + } } + + __ Bind(&do_handler_check); + Node* handler_index = do_handler_check.PhiAt(0); + Node* maybe_handler = + __ LoadElement(AccessBuilder::ForWeakFixedArrayElement(), + polymorphic_array, handler_index); + __ DeoptimizeIfNot(DeoptimizeReason::kWrongHandler, FeedbackSource(), + __ TaggedEqual(maybe_handler, actual_handler), frame_state, + IsSafetyCheck::kCriticalSafetyCheck); + __ Goto(done); } void EffectControlLinearizer::ProcessMonomorphic(Node* handler, @@ -2599,8 +2661,7 @@ Node* EffectControlLinearizer::LowerCheckedUint32Bounds(Node* node, __ Branch(check, &done, &if_abort); __ Bind(&if_abort); - __ Unreachable(); - __ Goto(&done); + __ Unreachable(&done); __ Bind(&done); } @@ -2646,8 +2707,7 @@ Node* EffectControlLinearizer::LowerCheckedUint64Bounds(Node* node, __ Branch(check, &done, &if_abort); __ Bind(&if_abort); - __ Unreachable(); - __ Goto(&done); + __ Unreachable(&done); __ Bind(&done); } @@ -3678,12 +3738,89 @@ Node* EffectControlLinearizer::LowerTypeOf(Node* node) { __ NoContextConstant()); } -Node* EffectControlLinearizer::LowerUpdateInterruptBudget(Node* node) { +void EffectControlLinearizer::LowerTierUpCheck(Node* node) { + TierUpCheckNode n(node); + TNode vector = n.feedback_vector(); + + Node* optimization_marker = __ LoadField( + AccessBuilder::ForFeedbackVectorOptimizedCodeWeakOrSmi(), vector); + + // TODO(jgruber): The branch introduces a sequence of spills before the + // branch (and restores at `fallthrough`) that are completely unnecessary + // since the IfFalse continuation ends in a tail call. Investigate how to + // avoid these and fix it. + + // TODO(jgruber): Combine the checks below for none/queued, e.g. by + // reorganizing OptimizationMarker values such that the least significant bit + // says whether the value is interesting or not. Also update the related + // check in the InterpreterEntryTrampoline. + + auto fallthrough = __ MakeLabel(); + auto optimization_marker_is_not_none = __ MakeDeferredLabel(); + auto optimization_marker_is_neither_none_nor_queued = __ MakeDeferredLabel(); + __ BranchWithHint( + __ TaggedEqual(optimization_marker, __ SmiConstant(static_cast( + OptimizationMarker::kNone))), + &fallthrough, &optimization_marker_is_not_none, BranchHint::kTrue); + + __ Bind(&optimization_marker_is_not_none); + __ BranchWithHint( + __ TaggedEqual(optimization_marker, + __ SmiConstant(static_cast( + OptimizationMarker::kInOptimizationQueue))), + &fallthrough, &optimization_marker_is_neither_none_nor_queued, + BranchHint::kNone); + + __ Bind(&optimization_marker_is_neither_none_nor_queued); + + // The optimization marker field contains a non-trivial value, and some + // action has to be taken. For example, perhaps tier-up has been requested + // and we need to kick off a compilation job; or optimized code is available + // and should be tail-called. + // + // Currently we delegate these tasks to the InterpreterEntryTrampoline. + // TODO(jgruber,v8:8888): Consider a dedicated builtin instead. + + const int parameter_count = + StartNode{graph()->start()}.FormalParameterCount(); + TNode code = + __ HeapConstant(BUILTIN_CODE(isolate(), InterpreterEntryTrampoline)); + Node* target = __ Parameter(Linkage::kJSCallClosureParamIndex); + Node* new_target = + __ Parameter(Linkage::GetJSCallNewTargetParamIndex(parameter_count)); + Node* argc = + __ Parameter(Linkage::GetJSCallArgCountParamIndex(parameter_count)); + Node* context = + __ Parameter(Linkage::GetJSCallContextParamIndex(parameter_count)); + + JSTrampolineDescriptor descriptor; + CallDescriptor::Flags flags = CallDescriptor::kFixedTargetRegister | + CallDescriptor::kIsTailCallForTierUp; + auto call_descriptor = Linkage::GetStubCallDescriptor( + graph()->zone(), descriptor, descriptor.GetStackParameterCount(), flags, + Operator::kNoProperties); + Node* nodes[] = {code, target, new_target, argc, + context, __ effect(), __ control()}; + +#ifdef DEBUG + static constexpr int kCodeContextEffectControl = 4; + DCHECK_EQ(arraysize(nodes), + descriptor.GetParameterCount() + kCodeContextEffectControl); +#endif // DEBUG + + __ TailCall(call_descriptor, arraysize(nodes), nodes); + + __ Bind(&fallthrough); +} + +void EffectControlLinearizer::LowerUpdateInterruptBudget(Node* node) { UpdateInterruptBudgetNode n(node); TNode feedback_cell = n.feedback_cell(); TNode budget = __ LoadField( AccessBuilder::ForFeedbackCellInterruptBudget(), feedback_cell); Node* new_budget = __ Int32Add(budget, __ Int32Constant(n.delta())); + __ StoreField(AccessBuilder::ForFeedbackCellInterruptBudget(), feedback_cell, + new_budget); if (n.delta() < 0) { auto next = __ MakeLabel(); auto if_budget_exhausted = __ MakeDeferredLabel(); @@ -3697,9 +3834,6 @@ Node* EffectControlLinearizer::LowerUpdateInterruptBudget(Node* node) { __ Bind(&next); } - __ StoreField(AccessBuilder::ForFeedbackCellInterruptBudget(), feedback_cell, - new_budget); - return nullptr; } Node* EffectControlLinearizer::LowerToBoolean(Node* node) { @@ -3716,6 +3850,14 @@ Node* EffectControlLinearizer::LowerToBoolean(Node* node) { } Node* EffectControlLinearizer::LowerArgumentsLength(Node* node) { +#ifdef V8_NO_ARGUMENTS_ADAPTOR + return ChangeIntPtrToSmi( + __ Load(MachineType::Pointer(), __ LoadFramePointer(), + __ IntPtrConstant(StandardFrameConstants::kArgCOffset))); +#else + auto done = __ MakeLabel(MachineRepresentation::kTaggedSigned); + Node* frame = __ LoadFramePointer(); + Node* arguments_frame = NodeProperties::GetValueInput(node, 0); int formal_parameter_count = FormalParameterCountOf(node->op()); DCHECK_LE(0, formal_parameter_count); @@ -3724,9 +3866,6 @@ Node* EffectControlLinearizer::LowerArgumentsLength(Node* node) { // We have to distinguish the case when there is an arguments adaptor frame // (i.e., arguments_frame != LoadFramePointer()). auto if_adaptor_frame = __ MakeLabel(); - auto done = __ MakeLabel(MachineRepresentation::kTaggedSigned); - - Node* frame = __ LoadFramePointer(); __ GotoIf(__ TaggedEqual(arguments_frame, frame), &done, __ SmiConstant(formal_parameter_count)); __ Goto(&if_adaptor_frame); @@ -3736,24 +3875,30 @@ Node* EffectControlLinearizer::LowerArgumentsLength(Node* node) { MachineType::Pointer(), arguments_frame, __ IntPtrConstant(ArgumentsAdaptorFrameConstants::kLengthOffset))); __ Goto(&done, arguments_length); - __ Bind(&done); return done.PhiAt(0); +#endif } Node* EffectControlLinearizer::LowerRestLength(Node* node) { - Node* arguments_frame = NodeProperties::GetValueInput(node, 0); int formal_parameter_count = FormalParameterCountOf(node->op()); DCHECK_LE(0, formal_parameter_count); + auto done = __ MakeLabel(MachineRepresentation::kTaggedSigned); + Node* frame = __ LoadFramePointer(); + +#ifdef V8_NO_ARGUMENTS_ADAPTOR + Node* arguments_length = ChangeIntPtrToSmi( + __ Load(MachineType::Pointer(), frame, + __ IntPtrConstant(StandardFrameConstants::kArgCOffset))); +#else + Node* arguments_frame = NodeProperties::GetValueInput(node, 0); + // The RestLength node is computing the number of rest parameters, // which is max(0, actual_parameter_count - formal_parameter_count). // We have to distinguish the case, when there is an arguments adaptor frame // (i.e., arguments_frame != LoadFramePointer()). auto if_adaptor_frame = __ MakeLabel(); - auto done = __ MakeLabel(MachineRepresentation::kTaggedSigned); - - Node* frame = __ LoadFramePointer(); __ GotoIf(__ TaggedEqual(arguments_frame, frame), &done, __ SmiConstant(0)); __ Goto(&if_adaptor_frame); @@ -3761,6 +3906,7 @@ Node* EffectControlLinearizer::LowerRestLength(Node* node) { Node* arguments_length = __ BitcastWordToTaggedSigned(__ Load( MachineType::Pointer(), arguments_frame, __ IntPtrConstant(ArgumentsAdaptorFrameConstants::kLengthOffset))); +#endif Node* rest_length = __ SmiSub(arguments_length, __ SmiConstant(formal_parameter_count)); @@ -4019,7 +4165,11 @@ Node* EffectControlLinearizer::LowerNumberSameValue(Node* node) { Node* EffectControlLinearizer::LowerDeadValue(Node* node) { Node* input = NodeProperties::GetValueInput(node, 0); if (input->opcode() != IrOpcode::kUnreachable) { - Node* unreachable = __ Unreachable(); + // There is no fundamental reason not to connect to end here, except it + // integrates into the way the graph is constructed in a simpler way at + // this point. + // TODO(jgruber): Connect to end here as well. + Node* unreachable = __ UnreachableWithoutConnectToEnd(); NodeProperties::ReplaceValueInput(node, unreachable, 0); } return gasm()->AddNode(node); @@ -5104,8 +5254,8 @@ Node* EffectControlLinearizer::LowerFastApiCall(Node* node) { } builder.AddParam(MachineType::Pointer()); // has_error - CallDescriptor* call_descriptor = Linkage::GetSimplifiedCDescriptor( - graph()->zone(), builder.Build(), CallDescriptor::kNoFlags); + CallDescriptor* call_descriptor = + Linkage::GetSimplifiedCDescriptor(graph()->zone(), builder.Build()); call_descriptor->SetCFunctionInfo(c_signature); @@ -5698,9 +5848,7 @@ void EffectControlLinearizer::LowerTransitionAndStoreNumberElement(Node* node) { // loop peeling can break this assumption. __ GotoIf(__ Word32Equal(kind, __ Int32Constant(HOLEY_DOUBLE_ELEMENTS)), &do_store); - // TODO(turbofan): It would be good to have an "Unreachable()" node type. - __ DebugBreak(); - __ Goto(&do_store); + __ Unreachable(&do_store); } __ Bind(&transition_smi_array); // deferred code. @@ -5878,7 +6026,7 @@ Node* EffectControlLinearizer::LowerAssertType(Node* node) { Node* const min = __ NumberConstant(range->Min()); Node* const max = __ NumberConstant(range->Max()); CallBuiltin(Builtins::kCheckNumberInRange, node->op()->properties(), input, - min, max); + min, max, __ SmiConstant(node->id())); return input; } @@ -6438,6 +6586,13 @@ Node* EffectControlLinearizer::BuildIsStrongReference(Node* value) { __ Int32Constant(kHeapObjectTag)); } +Node* EffectControlLinearizer::MakeWeakForComparison(Node* heap_object) { + // TODO(gsathya): Specialize this for pointer compression. + return __ BitcastWordToTagged( + __ WordOr(__ BitcastTaggedToWord(heap_object), + __ IntPtrConstant(kWeakHeapObjectTag))); +} + Node* EffectControlLinearizer::BuildStrongReferenceFromWeakReference( Node* maybe_object) { return __ BitcastWordToTagged( diff --git a/deps/v8/src/compiler/escape-analysis-reducer.cc b/deps/v8/src/compiler/escape-analysis-reducer.cc index b3c348c57980b4..89a8d4e118292c 100644 --- a/deps/v8/src/compiler/escape-analysis-reducer.cc +++ b/deps/v8/src/compiler/escape-analysis-reducer.cc @@ -318,8 +318,13 @@ void EscapeAnalysisReducer::Finalize() { #ifdef V8_REVERSE_JSARGS Node* offset_to_first_elem = jsgraph()->Constant( CommonFrameConstants::kFixedSlotCountAboveFp); - NodeProperties::SetType(offset_to_first_elem, - TypeCache::Get()->kArgumentsLengthType); + if (!NodeProperties::IsTyped(offset_to_first_elem)) { + NodeProperties::SetType( + offset_to_first_elem, + Type::Constant(CommonFrameConstants::kFixedSlotCountAboveFp, + jsgraph()->graph()->zone())); + } + Node* offset = jsgraph()->graph()->NewNode( jsgraph()->simplified()->NumberAdd(), index, offset_to_first_elem); diff --git a/deps/v8/src/compiler/graph-assembler.cc b/deps/v8/src/compiler/graph-assembler.cc index ae999b66154753..975efedf0fb2fc 100644 --- a/deps/v8/src/compiler/graph-assembler.cc +++ b/deps/v8/src/compiler/graph-assembler.cc @@ -32,6 +32,7 @@ class GraphAssembler::BasicBlockUpdater { void AddBranch(Node* branch, BasicBlock* tblock, BasicBlock* fblock); void AddGoto(BasicBlock* to); void AddGoto(BasicBlock* from, BasicBlock* to); + void AddTailCall(Node* node); void StartBlock(BasicBlock* block); BasicBlock* Finalize(BasicBlock* original); @@ -267,6 +268,18 @@ void GraphAssembler::BasicBlockUpdater::AddGoto(BasicBlock* from, current_block_ = nullptr; } +void GraphAssembler::BasicBlockUpdater::AddTailCall(Node* node) { + DCHECK_EQ(node->opcode(), IrOpcode::kTailCall); + DCHECK_NOT_NULL(current_block_); + + if (state_ == kUnchanged) { + CopyForChange(); + } + + schedule_->AddTailCall(current_block_, node); + current_block_ = nullptr; +} + void GraphAssembler::BasicBlockUpdater::UpdateSuccessors(BasicBlock* block) { for (SuccessorInfo succ : saved_successors_) { (succ.block->predecessors())[succ.index] = block; @@ -316,12 +329,15 @@ BasicBlock* GraphAssembler::BasicBlockUpdater::Finalize(BasicBlock* original) { return block; } -GraphAssembler::GraphAssembler(MachineGraph* mcgraph, Zone* zone, - Schedule* schedule, bool mark_loop_exits) +GraphAssembler::GraphAssembler( + MachineGraph* mcgraph, Zone* zone, + base::Optional node_changed_callback, + Schedule* schedule, bool mark_loop_exits) : temp_zone_(zone), mcgraph_(mcgraph), effect_(nullptr), control_(nullptr), + node_changed_callback_(node_changed_callback), block_updater_(schedule != nullptr ? new BasicBlockUpdater(schedule, mcgraph->graph(), mcgraph->common(), zone) @@ -380,6 +396,11 @@ Node* GraphAssembler::ExternalConstant(ExternalReference ref) { return AddClonedNode(mcgraph()->ExternalConstant(ref)); } +Node* GraphAssembler::Parameter(int index) { + return AddNode( + graph()->NewNode(common()->Parameter(index), graph()->start())); +} + Node* JSGraphAssembler::CEntryStubConstant(int result_size) { return AddClonedNode(jsgraph()->CEntryStubConstant(result_size)); } @@ -624,7 +645,20 @@ Node* GraphAssembler::DebugBreak() { graph()->NewNode(machine()->DebugBreak(), effect(), control())); } -Node* GraphAssembler::Unreachable() { +Node* GraphAssembler::Unreachable( + GraphAssemblerLabel<0u>* block_updater_successor) { + Node* result = UnreachableWithoutConnectToEnd(); + if (block_updater_ == nullptr) { + ConnectUnreachableToEnd(); + InitializeEffectControl(nullptr, nullptr); + } else { + DCHECK_NOT_NULL(block_updater_successor); + Goto(block_updater_successor); + } + return result; +} + +Node* GraphAssembler::UnreachableWithoutConnectToEnd() { return AddNode( graph()->NewNode(common()->Unreachable(), effect(), control())); } @@ -685,9 +719,9 @@ Node* GraphAssembler::UnsafePointerAdd(Node* base, Node* external) { } TNode JSGraphAssembler::PlainPrimitiveToNumber(TNode value) { - return AddNode(graph()->NewNode(PlainPrimitiveToNumberOperator(), - ToNumberBuiltinConstant(), value, - NoContextConstant(), effect())); + return AddNode(graph()->NewNode( + PlainPrimitiveToNumberOperator(), PlainPrimitiveToNumberBuiltinConstant(), + value, effect())); } Node* GraphAssembler::BitcastWordToTaggedSigned(Node* value) { @@ -768,6 +802,28 @@ TNode GraphAssembler::Call(const Operator* op, int inputs_size, return AddNode(graph()->NewNode(op, inputs_size, inputs)); } +void GraphAssembler::TailCall(const CallDescriptor* call_descriptor, + int inputs_size, Node** inputs) { +#ifdef DEBUG + static constexpr int kTargetEffectControl = 3; + DCHECK_EQ(inputs_size, + call_descriptor->ParameterCount() + kTargetEffectControl); +#endif // DEBUG + + Node* node = AddNode(graph()->NewNode(common()->TailCall(call_descriptor), + inputs_size, inputs)); + + if (block_updater_) block_updater_->AddTailCall(node); + + // Unlike ConnectUnreachableToEnd, the TailCall node terminates a block; to + // keep it live, it *must* be connected to End (also in Turboprop schedules). + NodeProperties::MergeControlToEnd(graph(), common(), node); + + // Setting effect, control to nullptr effectively terminates the current block + // by disallowing the addition of new nodes until a new label has been bound. + InitializeEffectControl(nullptr, nullptr); +} + void GraphAssembler::BranchWithCriticalSafetyCheck( Node* condition, GraphAssemblerLabel<0u>* if_true, GraphAssemblerLabel<0u>* if_false) { @@ -860,10 +916,13 @@ void GraphAssembler::ConnectUnreachableToEnd() { // to disconnect them from the graph, so we just leave the unreachable nodes // in the schedule. // TODO(9684): Add a scheduled dead-code elimination phase to remove all the - // subsiquent unreacahble code from the schedule. + // subsequent unreachable code from the schedule. if (!block_updater_) { Node* throw_node = graph()->NewNode(common()->Throw(), effect(), control()); NodeProperties::MergeControlToEnd(graph(), common(), throw_node); + if (node_changed_callback_.has_value()) { + (*node_changed_callback_)(graph()->end()); + } effect_ = control_ = mcgraph()->Dead(); } } @@ -906,7 +965,8 @@ void GraphAssembler::InitializeEffectControl(Node* effect, Node* control) { Operator const* JSGraphAssembler::PlainPrimitiveToNumberOperator() { if (!to_number_operator_.is_set()) { - Callable callable = Builtins::CallableFor(isolate(), Builtins::kToNumber); + Callable callable = + Builtins::CallableFor(isolate(), Builtins::kPlainPrimitiveToNumber); CallDescriptor::Flags flags = CallDescriptor::kNoFlags; auto call_descriptor = Linkage::GetStubCallDescriptor( graph()->zone(), callable.descriptor(), diff --git a/deps/v8/src/compiler/graph-assembler.h b/deps/v8/src/compiler/graph-assembler.h index 2b2dbb5d67f964..1be52317c0f53f 100644 --- a/deps/v8/src/compiler/graph-assembler.h +++ b/deps/v8/src/compiler/graph-assembler.h @@ -91,6 +91,7 @@ class BasicBlock; V(Word64Or) \ V(WordAnd) \ V(WordEqual) \ + V(WordOr) \ V(WordSar) \ V(WordSarShiftOutZeros) \ V(WordShl) \ @@ -126,6 +127,7 @@ class BasicBlock; V(One, Number) \ V(TheHole, Oddball) \ V(ToNumberBuiltin, Code) \ + V(PlainPrimitiveToNumberBuiltin, Code) \ V(True, Boolean) \ V(Undefined, Oddball) \ V(Zero, Number) @@ -182,12 +184,15 @@ class GraphAssemblerLabel { const std::array representations_; }; +using NodeChangedCallback = std::function; class V8_EXPORT_PRIVATE GraphAssembler { public: // Constructs a GraphAssembler. If {schedule} is not null, the graph assembler // will maintain the schedule as it updates blocks. - GraphAssembler(MachineGraph* jsgraph, Zone* zone, - Schedule* schedule = nullptr, bool mark_loop_exits = false); + GraphAssembler( + MachineGraph* jsgraph, Zone* zone, + base::Optional node_changed_callback = base::nullopt, + Schedule* schedule = nullptr, bool mark_loop_exits = false); virtual ~GraphAssembler(); void Reset(BasicBlock* block); @@ -239,6 +244,8 @@ class V8_EXPORT_PRIVATE GraphAssembler { Node* Projection(int index, Node* value); Node* ExternalConstant(ExternalReference ref); + Node* Parameter(int index); + Node* LoadFramePointer(); Node* LoadHeapNumberValue(Node* heap_number); @@ -252,10 +259,20 @@ class V8_EXPORT_PRIVATE GraphAssembler { CHECKED_ASSEMBLER_MACH_BINOP_LIST(BINOP_DECL) #undef BINOP_DECL - // Debugging Node* DebugBreak(); - Node* Unreachable(); + // Unreachable nodes are similar to Goto in that they reset effect/control to + // nullptr and it's thus not possible to append other nodes without first + // binding a new label. + // The block_updater_successor label is a crutch to work around block updater + // weaknesses (see the related comment in ConnectUnreachableToEnd); if the + // block updater exists, we cannot connect unreachable to end, instead we + // must preserve the Goto pattern. + Node* Unreachable(GraphAssemblerLabel<0u>* block_updater_successor = nullptr); + // This special variant doesn't connect the Unreachable node to end, and does + // not reset current effect/control. Intended only for special use-cases like + // lowering DeadValue. + Node* UnreachableWithoutConnectToEnd(); Node* IntPtrEqual(Node* left, Node* right); Node* TaggedEqual(Node* left, Node* right); @@ -315,6 +332,8 @@ class V8_EXPORT_PRIVATE GraphAssembler { Args... args); template TNode Call(const Operator* op, Node* first_arg, Args... args); + void TailCall(const CallDescriptor* call_descriptor, int inputs_size, + Node** inputs); // Basic control operations. template @@ -350,6 +369,13 @@ class V8_EXPORT_PRIVATE GraphAssembler { void GotoIfNot(Node* condition, GraphAssemblerLabel* label, Vars...); + bool HasActiveBlock() const { + // This is false if the current block has been terminated (e.g. by a Goto or + // Unreachable). In that case, a new label must be bound before we can + // continue emitting nodes. + return control() != nullptr; + } + // Updates current effect and control based on outputs of {node}. V8_INLINE void UpdateEffectControlWith(Node* node) { if (node->op()->EffectOutputCount() > 0) { @@ -375,8 +401,8 @@ class V8_EXPORT_PRIVATE GraphAssembler { void ConnectUnreachableToEnd(); - Control control() { return Control(control_); } - Effect effect() { return Effect(effect_); } + Control control() const { return Control(control_); } + Effect effect() const { return Effect(effect_); } protected: class BasicBlockUpdater; @@ -485,6 +511,9 @@ class V8_EXPORT_PRIVATE GraphAssembler { MachineGraph* mcgraph_; Node* effect_; Node* control_; + // {node_changed_callback_} should be called when a node outside the + // subgraph created by the graph assembler changes. + base::Optional node_changed_callback_; std::unique_ptr block_updater_; // Track loop information in order to properly mark loop exits with @@ -753,9 +782,12 @@ class V8_EXPORT_PRIVATE JSGraphAssembler : public GraphAssembler { public: // Constructs a JSGraphAssembler. If {schedule} is not null, the graph // assembler will maintain the schedule as it updates blocks. - JSGraphAssembler(JSGraph* jsgraph, Zone* zone, Schedule* schedule = nullptr, - bool mark_loop_exits = false) - : GraphAssembler(jsgraph, zone, schedule, mark_loop_exits), + JSGraphAssembler( + JSGraph* jsgraph, Zone* zone, + base::Optional node_changed_callback = base::nullopt, + Schedule* schedule = nullptr, bool mark_loop_exits = false) + : GraphAssembler(jsgraph, zone, node_changed_callback, schedule, + mark_loop_exits), jsgraph_(jsgraph) {} Node* SmiConstant(int32_t value); diff --git a/deps/v8/src/compiler/graph-reducer.cc b/deps/v8/src/compiler/graph-reducer.cc index 17789a0432a1c1..155d6fa8effbf4 100644 --- a/deps/v8/src/compiler/graph-reducer.cc +++ b/deps/v8/src/compiler/graph-reducer.cc @@ -2,12 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "src/compiler/graph-reducer.h" + #include #include #include "src/codegen/tick-counter.h" -#include "src/compiler/graph-reducer.h" #include "src/compiler/graph.h" +#include "src/compiler/js-heap-broker.h" #include "src/compiler/node-properties.h" #include "src/compiler/node.h" #include "src/compiler/verifier.h" @@ -27,14 +29,15 @@ enum class GraphReducer::State : uint8_t { void Reducer::Finalize() {} GraphReducer::GraphReducer(Zone* zone, Graph* graph, TickCounter* tick_counter, - Node* dead) + JSHeapBroker* broker, Node* dead) : graph_(graph), dead_(dead), state_(graph, 4), reducers_(zone), revisit_(zone), stack_(zone), - tick_counter_(tick_counter) { + tick_counter_(tick_counter), + broker_(broker) { if (dead != nullptr) { NodeProperties::SetType(dead_, Type::None()); } @@ -94,6 +97,9 @@ Reduction GraphReducer::Reduce(Node* const node) { // all the other reducers for this node, as now there may be more // opportunities for reduction. if (FLAG_trace_turbo_reduction) { + UnparkedScopeIfNeeded unparked(broker_); + // TODO(neis): Disallow racy handle dereference once we stop + // supporting --no-local-heaps --no-turbo-direct-heap-access. AllowHandleDereference allow_deref; StdoutStream{} << "- In-place update of #" << *node << " by reducer " << (*i)->reducer_name() << std::endl; @@ -104,6 +110,9 @@ Reduction GraphReducer::Reduce(Node* const node) { } else { // {node} was replaced by another node. if (FLAG_trace_turbo_reduction) { + UnparkedScopeIfNeeded unparked(broker_); + // TODO(neis): Disallow racy handle dereference once we stop + // supporting --no-local-heaps --no-turbo-direct-heap-access. AllowHandleDereference allow_deref; StdoutStream{} << "- Replacement of #" << *node << " with #" << *(reduction.replacement()) << " by reducer " diff --git a/deps/v8/src/compiler/graph-reducer.h b/deps/v8/src/compiler/graph-reducer.h index 3c15214d93265a..95454098d59f85 100644 --- a/deps/v8/src/compiler/graph-reducer.h +++ b/deps/v8/src/compiler/graph-reducer.h @@ -17,8 +17,8 @@ class TickCounter; namespace compiler { -// Forward declarations. class Graph; +class JSHeapBroker; class Node; // NodeIds are identifying numbers for nodes that can be used to index auxiliary @@ -136,7 +136,7 @@ class V8_EXPORT_PRIVATE GraphReducer : public NON_EXPORTED_BASE(AdvancedReducer::Editor) { public: GraphReducer(Zone* zone, Graph* graph, TickCounter* tick_counter, - Node* dead = nullptr); + JSHeapBroker* broker, Node* dead = nullptr); ~GraphReducer() override; Graph* graph() const { return graph_; } @@ -189,6 +189,7 @@ class V8_EXPORT_PRIVATE GraphReducer ZoneQueue revisit_; ZoneStack stack_; TickCounter* const tick_counter_; + JSHeapBroker* const broker_; DISALLOW_COPY_AND_ASSIGN(GraphReducer); }; diff --git a/deps/v8/src/compiler/graph-visualizer.cc b/deps/v8/src/compiler/graph-visualizer.cc index f767e9ea4d6da7..36372f5d0216b4 100644 --- a/deps/v8/src/compiler/graph-visualizer.cc +++ b/deps/v8/src/compiler/graph-visualizer.cc @@ -774,10 +774,7 @@ void GraphC1Visualizer::PrintLiveRange(const LiveRange* range, const char* type, } } - // The toplevel range might be a splinter. Pre-resolve those here so that - // they have a proper parent. const TopLevelLiveRange* parent = range->TopLevel(); - if (parent->IsSplinter()) parent = parent->splintered_from(); os_ << " " << parent->vreg() << ":" << parent->relative_id(); // TODO(herhut) Find something useful to print for the hint field diff --git a/deps/v8/src/compiler/heap-refs.h b/deps/v8/src/compiler/heap-refs.h index 137f61cc49ea11..f66b67863284f1 100644 --- a/deps/v8/src/compiler/heap-refs.h +++ b/deps/v8/src/compiler/heap-refs.h @@ -10,6 +10,7 @@ #include "src/objects/elements-kind.h" #include "src/objects/feedback-vector.h" #include "src/objects/instance-type.h" +#include "src/utils/boxed-float.h" namespace v8 { class CFunctionInfo; @@ -47,57 +48,68 @@ enum class OddballType : uint8_t { kOther // Oddball, but none of the above. }; +// This list is sorted such that subtypes appear before their supertypes. +// This list must not contain a type if it doesn't contain all of its subtypes +// too. For example, it CANNOT contain FixedArrayBase if it doesn't contain +// FixedDoubleArray, BytecodeArray and FixedArray. +// DO NOT VIOLATE THESE TWO PROPERTIES! +// Classes on this list will skip serialization when +// FLAG_turbo_direct_heap_access is on. Otherwise, they might get serialized. +#define HEAP_BROKER_NEVER_SERIALIZED_OBJECT_LIST(V) \ + /* Subtypes of FixedArray */ \ + V(ObjectBoilerplateDescription) \ + /* Subtypes of HeapObject */ \ + V(AccessorInfo) \ + V(ArrayBoilerplateDescription) \ + V(Cell) \ + V(TemplateObjectDescription) + // This list is sorted such that subtypes appear before their supertypes. // DO NOT VIOLATE THIS PROPERTY! -#define HEAP_BROKER_OBJECT_LIST(V) \ - /* Subtypes of JSObject */ \ - V(JSArray) \ - V(JSBoundFunction) \ - V(JSDataView) \ - V(JSFunction) \ - V(JSGlobalObject) \ - V(JSGlobalProxy) \ - V(JSRegExp) \ - V(JSTypedArray) \ - /* Subtypes of Context */ \ - V(NativeContext) \ - /* Subtypes of FixedArray */ \ - V(Context) \ - V(ObjectBoilerplateDescription) \ - V(ScopeInfo) \ - V(ScriptContextTable) \ - /* Subtypes of FixedArrayBase */ \ - V(BytecodeArray) \ - V(FixedArray) \ - V(FixedDoubleArray) \ - /* Subtypes of Name */ \ - V(InternalizedString) \ - V(String) \ - V(Symbol) \ - /* Subtypes of JSReceiver */ \ - V(JSObject) \ - /* Subtypes of HeapObject */ \ - V(AccessorInfo) \ - V(AllocationSite) \ - V(ArrayBoilerplateDescription) \ - V(BigInt) \ - V(CallHandlerInfo) \ - V(Cell) \ - V(Code) \ - V(DescriptorArray) \ - V(FeedbackCell) \ - V(FeedbackVector) \ - V(FixedArrayBase) \ - V(FunctionTemplateInfo) \ - V(HeapNumber) \ - V(JSReceiver) \ - V(Map) \ - V(Name) \ - V(PropertyCell) \ - V(SharedFunctionInfo) \ - V(SourceTextModule) \ - V(TemplateObjectDescription) \ - /* Subtypes of Object */ \ +#define HEAP_BROKER_SERIALIZED_OBJECT_LIST(V) \ + /* Subtypes of JSObject */ \ + V(JSArray) \ + V(JSBoundFunction) \ + V(JSDataView) \ + V(JSFunction) \ + V(JSGlobalObject) \ + V(JSGlobalProxy) \ + V(JSRegExp) \ + V(JSTypedArray) \ + /* Subtypes of Context */ \ + V(NativeContext) \ + /* Subtypes of FixedArray */ \ + V(Context) \ + V(ScopeInfo) \ + V(ScriptContextTable) \ + /* Subtypes of FixedArrayBase */ \ + V(BytecodeArray) \ + V(FixedArray) \ + V(FixedDoubleArray) \ + /* Subtypes of Name */ \ + V(InternalizedString) \ + V(String) \ + V(Symbol) \ + /* Subtypes of JSReceiver */ \ + V(JSObject) \ + /* Subtypes of HeapObject */ \ + V(AllocationSite) \ + V(BigInt) \ + V(CallHandlerInfo) \ + V(Code) \ + V(DescriptorArray) \ + V(FeedbackCell) \ + V(FeedbackVector) \ + V(FixedArrayBase) \ + V(FunctionTemplateInfo) \ + V(HeapNumber) \ + V(JSReceiver) \ + V(Map) \ + V(Name) \ + V(PropertyCell) \ + V(SharedFunctionInfo) \ + V(SourceTextModule) \ + /* Subtypes of Object */ \ V(HeapObject) class CompilationDependencies; @@ -107,7 +119,8 @@ class ObjectData; class PerIsolateCompilerCache; class PropertyAccessInfo; #define FORWARD_DECL(Name) class Name##Ref; -HEAP_BROKER_OBJECT_LIST(FORWARD_DECL) +HEAP_BROKER_SERIALIZED_OBJECT_LIST(FORWARD_DECL) +HEAP_BROKER_NEVER_SERIALIZED_OBJECT_LIST(FORWARD_DECL) #undef FORWARD_DECL class V8_EXPORT_PRIVATE ObjectRef { @@ -127,11 +140,13 @@ class V8_EXPORT_PRIVATE ObjectRef { int AsSmi() const; #define HEAP_IS_METHOD_DECL(Name) bool Is##Name() const; - HEAP_BROKER_OBJECT_LIST(HEAP_IS_METHOD_DECL) + HEAP_BROKER_SERIALIZED_OBJECT_LIST(HEAP_IS_METHOD_DECL) + HEAP_BROKER_NEVER_SERIALIZED_OBJECT_LIST(HEAP_IS_METHOD_DECL) #undef HEAP_IS_METHOD_DECL #define HEAP_AS_METHOD_DECL(Name) Name##Ref As##Name() const; - HEAP_BROKER_OBJECT_LIST(HEAP_AS_METHOD_DECL) + HEAP_BROKER_SERIALIZED_OBJECT_LIST(HEAP_AS_METHOD_DECL) + HEAP_BROKER_NEVER_SERIALIZED_OBJECT_LIST(HEAP_AS_METHOD_DECL) #undef HEAP_AS_METHOD_DECL bool IsNullOrUndefined() const; @@ -293,7 +308,6 @@ class JSDataViewRef : public JSObjectRef { Handle object() const; size_t byte_length() const; - size_t byte_offset() const; }; class JSBoundFunctionRef : public JSObjectRef { @@ -704,8 +718,7 @@ class FixedDoubleArrayRef : public FixedArrayBaseRef { Handle object() const; - double get_scalar(int i) const; - bool is_the_hole(int i) const; + Float64 get(int i) const; }; class BytecodeArrayRef : public FixedArrayBaseRef { @@ -722,8 +735,7 @@ class BytecodeArrayRef : public FixedArrayBaseRef { uint8_t get(int index) const; Address GetFirstBytecodeAddress() const; - // Source position table. - Handle source_positions() const; + Handle SourcePositionTable() const; // Constant pool access. Handle GetConstantAtIndex(int index) const; @@ -877,8 +889,6 @@ class CellRef : public HeapObjectRef { DEFINE_REF_CONSTRUCTOR(Cell, HeapObjectRef) Handle object() const; - - ObjectRef value() const; }; class JSGlobalObjectRef : public JSObjectRef { diff --git a/deps/v8/src/compiler/js-call-reducer.cc b/deps/v8/src/compiler/js-call-reducer.cc index 0a48bcbcc6fc04..94a6b3a7c79272 100644 --- a/deps/v8/src/compiler/js-call-reducer.cc +++ b/deps/v8/src/compiler/js-call-reducer.cc @@ -51,10 +51,15 @@ class JSCallReducerAssembler : public JSGraphAssembler { static constexpr bool kMarkLoopExits = true; public: - JSCallReducerAssembler(JSGraph* jsgraph, Zone* zone, Node* node) - : JSGraphAssembler(jsgraph, zone, nullptr, kMarkLoopExits), + JSCallReducerAssembler(JSCallReducer* reducer, Node* node) + : JSGraphAssembler( + reducer->JSGraphForGraphAssembler(), + reducer->ZoneForGraphAssembler(), + [reducer](Node* n) { reducer->RevisitForGraphAssembler(n); }, + nullptr, kMarkLoopExits), node_(node), - outermost_catch_scope_(CatchScope::Outermost(zone)), + outermost_catch_scope_( + CatchScope::Outermost(reducer->ZoneForGraphAssembler())), catch_scope_(&outermost_catch_scope_) { InitializeEffectControl(NodeProperties::GetEffectInput(node), NodeProperties::GetControlInput(node)); @@ -143,11 +148,11 @@ class JSCallReducerAssembler : public JSGraphAssembler { gasm_->Bind(&if_true); if (then_body_) then_body_(); - gasm_->Goto(&merge); + if (gasm_->HasActiveBlock()) gasm_->Goto(&merge); gasm_->Bind(&if_false); if (else_body_) else_body_(); - gasm_->Goto(&merge); + if (gasm_->HasActiveBlock()) gasm_->Goto(&merge); gasm_->Bind(&merge); } @@ -209,11 +214,13 @@ class JSCallReducerAssembler : public JSGraphAssembler { gasm_->Bind(&if_true); TNode then_result = then_body_(); - gasm_->Goto(&merge, then_result); + if (gasm_->HasActiveBlock()) gasm_->Goto(&merge, then_result); gasm_->Bind(&if_false); TNode else_result = else_body_(); - gasm_->Goto(&merge, else_result); + if (gasm_->HasActiveBlock()) { + gasm_->Goto(&merge, else_result); + } gasm_->Bind(&merge); return merge.PhiAt(0); @@ -658,9 +665,8 @@ enum class ArrayIndexOfIncludesVariant { kIncludes, kIndexOf }; // builtins. class IteratingArrayBuiltinReducerAssembler : public JSCallReducerAssembler { public: - IteratingArrayBuiltinReducerAssembler(JSGraph* jsgraph, Zone* zone, - Node* node) - : JSCallReducerAssembler(jsgraph, zone, node) { + IteratingArrayBuiltinReducerAssembler(JSCallReducer* reducer, Node* node) + : JSCallReducerAssembler(reducer, node) { DCHECK(FLAG_turbo_inline_array_builtins); } @@ -784,9 +790,9 @@ class IteratingArrayBuiltinReducerAssembler : public JSCallReducerAssembler { class PromiseBuiltinReducerAssembler : public JSCallReducerAssembler { public: - PromiseBuiltinReducerAssembler(JSGraph* jsgraph, Zone* zone, Node* node, + PromiseBuiltinReducerAssembler(JSCallReducer* reducer, Node* node, JSHeapBroker* broker) - : JSCallReducerAssembler(jsgraph, zone, node), broker_(broker) { + : JSCallReducerAssembler(reducer, node), broker_(broker) { DCHECK_EQ(IrOpcode::kJSConstruct, node->opcode()); } @@ -876,12 +882,12 @@ class PromiseBuiltinReducerAssembler : public JSCallReducerAssembler { class FastApiCallReducerAssembler : public JSCallReducerAssembler { public: FastApiCallReducerAssembler( - JSGraph* jsgraph, Zone* zone, Node* node, Address c_function, + JSCallReducer* reducer, Node* node, Address c_function, const CFunctionInfo* c_signature, const FunctionTemplateInfoRef function_template_info, Node* receiver, Node* holder, const SharedFunctionInfoRef shared, Node* target, const int arity, Node* effect) - : JSCallReducerAssembler(jsgraph, zone, node), + : JSCallReducerAssembler(reducer, node), c_function_(c_function), c_signature_(c_signature), function_template_info_(function_template_info), @@ -1420,7 +1426,6 @@ TNode IteratingArrayBuiltinReducerAssembler::ReduceArrayPrototypeReduce( Bind(&continue_label); }); Unreachable(); // The loop is exited either by deopt or a jump to below. - InitializeEffectControl(nullptr, nullptr); // TODO(jgruber): This manual fiddling with blocks could be avoided by // implementing a `break` mechanic for loop builders. @@ -2244,7 +2249,7 @@ Reduction JSCallReducer::ReduceMathUnary(Node* node, const Operator* op) { return Replace(value); } - JSCallReducerAssembler a(jsgraph(), temp_zone(), node); + JSCallReducerAssembler a(this, node); Node* subgraph = a.ReduceMathUnary(op); return ReplaceWithSubgraph(&a, subgraph); } @@ -2261,7 +2266,7 @@ Reduction JSCallReducer::ReduceMathBinary(Node* node, const Operator* op) { return Replace(value); } - JSCallReducerAssembler a(jsgraph(), temp_zone(), node); + JSCallReducerAssembler a(this, node); Node* subgraph = a.ReduceMathBinary(op); return ReplaceWithSubgraph(&a, subgraph); } @@ -3283,7 +3288,7 @@ Reduction JSCallReducer::ReduceArrayForEach( IteratingArrayBuiltinHelper h(node, broker(), jsgraph(), dependencies()); if (!h.can_reduce()) return h.inference()->NoChange(); - IteratingArrayBuiltinReducerAssembler a(jsgraph(), temp_zone(), node); + IteratingArrayBuiltinReducerAssembler a(this, node); a.InitializeEffectControl(h.effect(), h.control()); TNode subgraph = a.ReduceArrayPrototypeForEach( h.inference(), h.has_stability_dependency(), h.elements_kind(), shared); @@ -3296,7 +3301,7 @@ Reduction JSCallReducer::ReduceArrayReduce( IteratingArrayBuiltinHelper h(node, broker(), jsgraph(), dependencies()); if (!h.can_reduce()) return h.inference()->NoChange(); - IteratingArrayBuiltinReducerAssembler a(jsgraph(), temp_zone(), node); + IteratingArrayBuiltinReducerAssembler a(this, node); a.InitializeEffectControl(h.effect(), h.control()); TNode subgraph = a.ReduceArrayPrototypeReduce( h.inference(), h.has_stability_dependency(), h.elements_kind(), @@ -3310,7 +3315,7 @@ Reduction JSCallReducer::ReduceArrayReduceRight( IteratingArrayBuiltinHelper h(node, broker(), jsgraph(), dependencies()); if (!h.can_reduce()) return h.inference()->NoChange(); - IteratingArrayBuiltinReducerAssembler a(jsgraph(), temp_zone(), node); + IteratingArrayBuiltinReducerAssembler a(this, node); a.InitializeEffectControl(h.effect(), h.control()); TNode subgraph = a.ReduceArrayPrototypeReduce( h.inference(), h.has_stability_dependency(), h.elements_kind(), @@ -3329,7 +3334,7 @@ Reduction JSCallReducer::ReduceArrayMap(Node* node, return h.inference()->NoChange(); } - IteratingArrayBuiltinReducerAssembler a(jsgraph(), temp_zone(), node); + IteratingArrayBuiltinReducerAssembler a(this, node); a.InitializeEffectControl(h.effect(), h.control()); TNode subgraph = @@ -3349,7 +3354,7 @@ Reduction JSCallReducer::ReduceArrayFilter( return h.inference()->NoChange(); } - IteratingArrayBuiltinReducerAssembler a(jsgraph(), temp_zone(), node); + IteratingArrayBuiltinReducerAssembler a(this, node); a.InitializeEffectControl(h.effect(), h.control()); TNode subgraph = @@ -3364,7 +3369,7 @@ Reduction JSCallReducer::ReduceArrayFind(Node* node, IteratingArrayBuiltinHelper h(node, broker(), jsgraph(), dependencies()); if (!h.can_reduce()) return h.inference()->NoChange(); - IteratingArrayBuiltinReducerAssembler a(jsgraph(), temp_zone(), node); + IteratingArrayBuiltinReducerAssembler a(this, node); a.InitializeEffectControl(h.effect(), h.control()); TNode subgraph = a.ReduceArrayPrototypeFind( @@ -3379,7 +3384,7 @@ Reduction JSCallReducer::ReduceArrayFindIndex( IteratingArrayBuiltinHelper h(node, broker(), jsgraph(), dependencies()); if (!h.can_reduce()) return h.inference()->NoChange(); - IteratingArrayBuiltinReducerAssembler a(jsgraph(), temp_zone(), node); + IteratingArrayBuiltinReducerAssembler a(this, node); a.InitializeEffectControl(h.effect(), h.control()); TNode subgraph = a.ReduceArrayPrototypeFind( @@ -3394,7 +3399,7 @@ Reduction JSCallReducer::ReduceArrayEvery(Node* node, IteratingArrayBuiltinHelper h(node, broker(), jsgraph(), dependencies()); if (!h.can_reduce()) return h.inference()->NoChange(); - IteratingArrayBuiltinReducerAssembler a(jsgraph(), temp_zone(), node); + IteratingArrayBuiltinReducerAssembler a(this, node); a.InitializeEffectControl(h.effect(), h.control()); TNode subgraph = a.ReduceArrayPrototypeEverySome( @@ -3410,7 +3415,7 @@ Reduction JSCallReducer::ReduceArrayIncludes(Node* node) { IteratingArrayBuiltinHelper h(node, broker(), jsgraph(), dependencies()); if (!h.can_reduce()) return h.inference()->NoChange(); - IteratingArrayBuiltinReducerAssembler a(jsgraph(), temp_zone(), node); + IteratingArrayBuiltinReducerAssembler a(this, node); a.InitializeEffectControl(h.effect(), h.control()); TNode subgraph = a.ReduceArrayPrototypeIndexOfIncludes( @@ -3425,7 +3430,7 @@ Reduction JSCallReducer::ReduceArrayIndexOf(Node* node) { IteratingArrayBuiltinHelper h(node, broker(), jsgraph(), dependencies()); if (!h.can_reduce()) return h.inference()->NoChange(); - IteratingArrayBuiltinReducerAssembler a(jsgraph(), temp_zone(), node); + IteratingArrayBuiltinReducerAssembler a(this, node); a.InitializeEffectControl(h.effect(), h.control()); TNode subgraph = a.ReduceArrayPrototypeIndexOfIncludes( @@ -3439,7 +3444,7 @@ Reduction JSCallReducer::ReduceArraySome(Node* node, IteratingArrayBuiltinHelper h(node, broker(), jsgraph(), dependencies()); if (!h.can_reduce()) return h.inference()->NoChange(); - IteratingArrayBuiltinReducerAssembler a(jsgraph(), temp_zone(), node); + IteratingArrayBuiltinReducerAssembler a(this, node); a.InitializeEffectControl(h.effect(), h.control()); TNode subgraph = a.ReduceArrayPrototypeEverySome( @@ -3623,9 +3628,9 @@ Reduction JSCallReducer::ReduceCallApiFunction( if (FLAG_turbo_fast_api_calls && c_function != kNullAddress) { const CFunctionInfo* c_signature = function_template_info.c_signature(); - FastApiCallReducerAssembler a(jsgraph(), graph()->zone(), node, c_function, - c_signature, function_template_info, receiver, - holder, shared, target, argc, effect); + FastApiCallReducerAssembler a(this, node, c_function, c_signature, + function_template_info, receiver, holder, + shared, target, argc, effect); Node* fast_call_subgraph = a.ReduceFastApiCall(); ReplaceWithSubgraph(&a, fast_call_subgraph); @@ -4804,7 +4809,7 @@ Reduction JSCallReducer::ReduceStringPrototypeSubstring(Node* node) { return NoChange(); } - JSCallReducerAssembler a(jsgraph(), temp_zone(), node); + JSCallReducerAssembler a(this, node); Node* subgraph = a.ReduceStringPrototypeSubstring(); return ReplaceWithSubgraph(&a, subgraph); } @@ -4818,7 +4823,7 @@ Reduction JSCallReducer::ReduceStringPrototypeSlice(Node* node) { return NoChange(); } - JSCallReducerAssembler a(jsgraph(), temp_zone(), node); + JSCallReducerAssembler a(this, node); Node* subgraph = a.ReduceStringPrototypeSlice(); return ReplaceWithSubgraph(&a, subgraph); } @@ -6316,7 +6321,7 @@ Reduction JSCallReducer::ReducePromiseConstructor(Node* node) { if (broker()->is_native_context_independent()) return NoChange(); DisallowHeapAccessIf no_heap_access(should_disallow_heap_access()); - PromiseBuiltinReducerAssembler a(jsgraph(), temp_zone(), node, broker()); + PromiseBuiltinReducerAssembler a(this, node, broker()); // We only inline when we have the executor. if (a.ConstructArity() < 1) return NoChange(); @@ -7322,11 +7327,11 @@ Reduction JSCallReducer::ReduceDataViewAccess(Node* node, DataViewAccess access, // We only deal with DataViews here whose [[ByteLength]] is at least // {element_size}, as for all other DataViews it'll be out-of-bounds. JSDataViewRef dataview = m.Ref(broker()).AsJSDataView(); - if (dataview.byte_length() < element_size) return NoChange(); + size_t length = dataview.byte_length(); + if (length < element_size) return NoChange(); - // Check that the {offset} is within range of the {byte_length}. - Node* byte_length = - jsgraph()->Constant(dataview.byte_length() - (element_size - 1)); + // Check that the {offset} is within range of the {length}. + Node* byte_length = jsgraph()->Constant(length - (element_size - 1)); offset = effect = graph()->NewNode(simplified()->CheckBounds(p.feedback()), offset, byte_length, effect, control); } else { diff --git a/deps/v8/src/compiler/js-call-reducer.h b/deps/v8/src/compiler/js-call-reducer.h index 139ef7dfa4c449..fe5af04aa86306 100644 --- a/deps/v8/src/compiler/js-call-reducer.h +++ b/deps/v8/src/compiler/js-call-reducer.h @@ -64,6 +64,11 @@ class V8_EXPORT_PRIVATE JSCallReducer final : public AdvancedReducer { // and does a final attempt to reduce the nodes in the waitlist. void Finalize() final; + // JSCallReducer outsources much work to a graph assembler. + void RevisitForGraphAssembler(Node* node) { Revisit(node); } + Zone* ZoneForGraphAssembler() const { return temp_zone(); } + JSGraph* JSGraphForGraphAssembler() const { return jsgraph(); } + private: Reduction ReduceBooleanConstructor(Node* node); Reduction ReduceCallApiFunction(Node* node, diff --git a/deps/v8/src/compiler/js-create-lowering.cc b/deps/v8/src/compiler/js-create-lowering.cc index 9fe968825fe07c..1f3169fad3b4a8 100644 --- a/deps/v8/src/compiler/js-create-lowering.cc +++ b/deps/v8/src/compiler/js-create-lowering.cc @@ -28,7 +28,7 @@ #include "src/objects/js-regexp-inl.h" #include "src/objects/objects-inl.h" #include "src/objects/template-objects.h" -#include "torque-generated/exported-class-definitions-tq.h" +#include "torque-generated/exported-class-definitions.h" namespace v8 { namespace internal { @@ -1770,10 +1770,11 @@ Node* JSCreateLowering::AllocateFastLiteralElements(Node* effect, Node* control, if (elements_map.instance_type() == FIXED_DOUBLE_ARRAY_TYPE) { FixedDoubleArrayRef elements = boilerplate_elements.AsFixedDoubleArray(); for (int i = 0; i < elements_length; ++i) { - if (elements.is_the_hole(i)) { + Float64 value = elements.get(i); + if (value.is_hole_nan()) { elements_values[i] = jsgraph()->TheHoleConstant(); } else { - elements_values[i] = jsgraph()->Constant(elements.get_scalar(i)); + elements_values[i] = jsgraph()->Constant(value.get_scalar()); } } } else { diff --git a/deps/v8/src/compiler/js-generic-lowering.cc b/deps/v8/src/compiler/js-generic-lowering.cc index 0950248087491c..81bafa6183a418 100644 --- a/deps/v8/src/compiler/js-generic-lowering.cc +++ b/deps/v8/src/compiler/js-generic-lowering.cc @@ -315,6 +315,13 @@ void JSGenericLowering::LowerJSLoadNamed(Node* node) { } } +void JSGenericLowering::LowerJSLoadNamedFromSuper(Node* node) { + JSLoadNamedFromSuperNode n(node); + NamedAccess const& p = n.Parameters(); + node->InsertInput(zone(), 2, jsgraph()->HeapConstant(p.name())); + ReplaceWithRuntimeCall(node, Runtime::kLoadFromSuper); +} + void JSGenericLowering::LowerJSLoadGlobal(Node* node) { JSLoadGlobalNode n(node); const LoadGlobalParameters& p = n.Parameters(); @@ -522,9 +529,14 @@ void JSGenericLowering::LowerJSCreateArguments(Node* node) { void JSGenericLowering::LowerJSCreateArray(Node* node) { CreateArrayParameters const& p = CreateArrayParametersOf(node->op()); int const arity = static_cast(p.arity()); + auto interface_descriptor = ArrayConstructorDescriptor{}; auto call_descriptor = Linkage::GetStubCallDescriptor( - zone(), ArrayConstructorDescriptor{}, arity + 1, - CallDescriptor::kNeedsFrameState, node->op()->properties()); + zone(), interface_descriptor, arity + 1, CallDescriptor::kNeedsFrameState, + node->op()->properties()); + // If this fails, we might need to update the parameter reordering code + // to ensure that the additional arguments passed via stack are pushed + // between top of stack and JS arguments. + DCHECK_EQ(interface_descriptor.GetStackParameterCount(), 0); Node* stub_code = jsgraph()->ArrayConstructorStubConstant(); Node* stub_arity = jsgraph()->Int32Constant(arity); MaybeHandle const maybe_site = p.site(); @@ -773,6 +785,10 @@ void JSGenericLowering::LowerJSConstructForwardVarargs(Node* node) { int const arg_count = static_cast(p.arity() - 2); CallDescriptor::Flags flags = FrameStateFlagForCall(node); Callable callable = CodeFactory::ConstructForwardVarargs(isolate()); + // If this fails, we might need to update the parameter reordering code + // to ensure that the additional arguments passed via stack are pushed + // between top of stack and JS arguments. + DCHECK_EQ(callable.descriptor().GetStackParameterCount(), 0); auto call_descriptor = Linkage::GetStubCallDescriptor( zone(), callable.descriptor(), arg_count + 1, flags); Node* stub_code = jsgraph()->HeapConstant(callable.code()); @@ -801,12 +817,20 @@ void JSGenericLowering::LowerJSConstruct(Node* node) { arg_count + kReceiver + kMaybeFeedbackVector; Callable callable = Builtins::CallableFor(isolate(), Builtins::kConstruct_WithFeedback); + // If this fails, we might need to update the parameter reordering code + // to ensure that the additional arguments passed via stack are pushed + // between top of stack and JS arguments. + DCHECK_EQ(callable.descriptor().GetStackParameterCount(), + kMaybeFeedbackVector); auto call_descriptor = Linkage::GetStubCallDescriptor( zone(), callable.descriptor(), stack_argument_count, flags); Node* stub_code = jsgraph()->HeapConstant(callable.code()); Node* stub_arity = jsgraph()->Int32Constant(arg_count); Node* slot = jsgraph()->Int32Constant(p.feedback().index()); Node* receiver = jsgraph()->UndefinedConstant(); +#ifdef V8_REVERSE_JSARGS + Node* feedback_vector = node->RemoveInput(n.FeedbackVectorIndex()); +#endif // Register argument inputs are followed by stack argument inputs (such as // feedback_vector). Both are listed in ascending order. Note that // the receiver is implicitly placed on the stack and is thus inserted @@ -815,10 +839,16 @@ void JSGenericLowering::LowerJSConstruct(Node* node) { node->InsertInput(zone(), 0, stub_code); node->InsertInput(zone(), 3, stub_arity); node->InsertInput(zone(), 4, slot); +#ifdef V8_REVERSE_JSARGS + node->InsertInput(zone(), 5, feedback_vector); + node->InsertInput(zone(), 6, receiver); + // After: {code, target, new_target, arity, slot, vector, receiver, + // ...args}. +#else node->InsertInput(zone(), 5, receiver); - // After: {code, target, new_target, arity, slot, receiver, ...args, // vector}. +#endif NodeProperties::ChangeOp(node, common()->Call(call_descriptor)); } else { @@ -857,12 +887,19 @@ void JSGenericLowering::LowerJSConstructWithArrayLike(Node* node) { arg_count - kArgumentList + kReceiver + kMaybeFeedbackVector; Callable callable = Builtins::CallableFor( isolate(), Builtins::kConstructWithArrayLike_WithFeedback); + // If this fails, we might need to update the parameter reordering code + // to ensure that the additional arguments passed via stack are pushed + // between top of stack and JS arguments. + DCHECK_EQ(callable.descriptor().GetStackParameterCount(), + kMaybeFeedbackVector); auto call_descriptor = Linkage::GetStubCallDescriptor( zone(), callable.descriptor(), stack_argument_count, flags); Node* stub_code = jsgraph()->HeapConstant(callable.code()); Node* receiver = jsgraph()->UndefinedConstant(); Node* slot = jsgraph()->Int32Constant(p.feedback().index()); - +#ifdef V8_REVERSE_JSARGS + Node* feedback_vector = node->RemoveInput(n.FeedbackVectorIndex()); +#endif // Register argument inputs are followed by stack argument inputs (such as // feedback_vector). Both are listed in ascending order. Note that // the receiver is implicitly placed on the stack and is thus inserted @@ -870,16 +907,26 @@ void JSGenericLowering::LowerJSConstructWithArrayLike(Node* node) { // TODO(jgruber): Implement a simpler way to specify these mutations. node->InsertInput(zone(), 0, stub_code); node->InsertInput(zone(), 4, slot); +#ifdef V8_REVERSE_JSARGS + node->InsertInput(zone(), 5, feedback_vector); + node->InsertInput(zone(), 6, receiver); + // After: {code, target, new_target, arguments_list, slot, vector, + // receiver}. +#else node->InsertInput(zone(), 5, receiver); - // After: {code, target, new_target, arguments_list, slot, receiver, // vector}. +#endif NodeProperties::ChangeOp(node, common()->Call(call_descriptor)); } else { const int stack_argument_count = arg_count - kArgumentList + kReceiver; Callable callable = Builtins::CallableFor(isolate(), Builtins::kConstructWithArrayLike); + // If this fails, we might need to update the parameter reordering code + // to ensure that the additional arguments passed via stack are pushed + // between top of stack and JS arguments. + DCHECK_EQ(callable.descriptor().GetStackParameterCount(), 0); auto call_descriptor = Linkage::GetStubCallDescriptor( zone(), callable.descriptor(), stack_argument_count, flags); Node* stub_code = jsgraph()->HeapConstant(callable.code()); @@ -911,6 +958,11 @@ void JSGenericLowering::LowerJSConstructWithSpread(Node* node) { arg_count + kReceiver + kMaybeFeedbackVector; Callable callable = Builtins::CallableFor( isolate(), Builtins::kConstructWithSpread_WithFeedback); + // If this fails, we might need to update the parameter reordering code + // to ensure that the additional arguments passed via stack are pushed + // between top of stack and JS arguments. + DCHECK_EQ(callable.descriptor().GetStackParameterCount(), + kTheSpread + kMaybeFeedbackVector); auto call_descriptor = Linkage::GetStubCallDescriptor( zone(), callable.descriptor(), stack_argument_count, flags); Node* stub_code = jsgraph()->HeapConstant(callable.code()); @@ -920,6 +972,10 @@ void JSGenericLowering::LowerJSConstructWithSpread(Node* node) { // on the stack here. Node* stub_arity = jsgraph()->Int32Constant(arg_count - kTheSpread); Node* receiver = jsgraph()->UndefinedConstant(); +#ifdef V8_REVERSE_JSARGS + Node* feedback_vector = node->RemoveInput(n.FeedbackVectorIndex()); + Node* spread = node->RemoveInput(n.LastArgumentIndex()); +#endif // Register argument inputs are followed by stack argument inputs (such as // feedback_vector). Both are listed in ascending order. Note that @@ -929,15 +985,26 @@ void JSGenericLowering::LowerJSConstructWithSpread(Node* node) { node->InsertInput(zone(), 0, stub_code); node->InsertInput(zone(), 3, stub_arity); node->InsertInput(zone(), 4, slot); +#ifdef V8_REVERSE_JSARGS + node->InsertInput(zone(), 5, spread); + node->InsertInput(zone(), 6, feedback_vector); + node->InsertInput(zone(), 7, receiver); + // After: {code, target, new_target, arity, slot, spread, vector, receiver, + // ...args}. +#else node->InsertInput(zone(), 5, receiver); - // After: {code, target, new_target, arity, slot, receiver, ...args, spread, // vector}. +#endif NodeProperties::ChangeOp(node, common()->Call(call_descriptor)); } else { const int stack_argument_count = arg_count + kReceiver - kTheSpread; Callable callable = CodeFactory::ConstructWithSpread(isolate()); + // If this fails, we might need to update the parameter reordering code + // to ensure that the additional arguments passed via stack are pushed + // between top of stack and JS arguments. + DCHECK_EQ(callable.descriptor().GetStackParameterCount(), 0); auto call_descriptor = Linkage::GetStubCallDescriptor( zone(), callable.descriptor(), stack_argument_count, flags); Node* stub_code = jsgraph()->HeapConstant(callable.code()); @@ -1091,6 +1158,11 @@ void JSGenericLowering::LowerJSCallWithSpread(Node* node) { arg_count - kTheSpread + kReceiver + kMaybeFeedbackVector; Callable callable = Builtins::CallableFor( isolate(), Builtins::kCallWithSpread_WithFeedback); + // If this fails, we might need to update the parameter reordering code + // to ensure that the additional arguments passed via stack are pushed + // between top of stack and JS arguments. + DCHECK_EQ(callable.descriptor().GetStackParameterCount(), + kMaybeFeedbackVector); auto call_descriptor = Linkage::GetStubCallDescriptor( zone(), callable.descriptor(), stack_argument_count, flags); Node* stub_code = jsgraph()->HeapConstant(callable.code()); @@ -1107,22 +1179,29 @@ void JSGenericLowering::LowerJSCallWithSpread(Node* node) { // Shuffling inputs. // Before: {target, receiver, ...args, spread, vector}. - +#ifdef V8_REVERSE_JSARGS + Node* feedback_vector = node->RemoveInput(n.FeedbackVectorIndex()); +#endif Node* spread = node->RemoveInput(n.LastArgumentIndex()); - - // Now: {target, receiver, ...args, vector}. - node->InsertInput(zone(), 0, stub_code); node->InsertInput(zone(), 2, stub_arity); node->InsertInput(zone(), 3, spread); node->InsertInput(zone(), 4, slot); - +#ifdef V8_REVERSE_JSARGS + node->InsertInput(zone(), 5, feedback_vector); + // After: {code, target, arity, spread, slot, vector, receiver, ...args}. +#else // After: {code, target, arity, spread, slot, receiver, ...args, vector}. +#endif NodeProperties::ChangeOp(node, common()->Call(call_descriptor)); } else { const int stack_argument_count = arg_count - kTheSpread + kReceiver; Callable callable = CodeFactory::CallWithSpread(isolate()); + // If this fails, we might need to update the parameter reordering code + // to ensure that the additional arguments passed via stack are pushed + // between top of stack and JS arguments. + DCHECK_EQ(callable.descriptor().GetStackParameterCount(), 0); auto call_descriptor = Linkage::GetStubCallDescriptor( zone(), callable.descriptor(), stack_argument_count, flags); Node* stub_code = jsgraph()->HeapConstant(callable.code()); diff --git a/deps/v8/src/compiler/js-graph.cc b/deps/v8/src/compiler/js-graph.cc index 6b8d9761fffde8..120f8ee21d673f 100644 --- a/deps/v8/src/compiler/js-graph.cc +++ b/deps/v8/src/compiler/js-graph.cc @@ -129,6 +129,9 @@ DEFINE_GETTER(BooleanMapConstant, HeapConstant(factory()->boolean_map())) DEFINE_GETTER(ToNumberBuiltinConstant, HeapConstant(BUILTIN_CODE(isolate(), ToNumber))) +DEFINE_GETTER(PlainPrimitiveToNumberBuiltinConstant, + HeapConstant(BUILTIN_CODE(isolate(), PlainPrimitiveToNumber))) + DEFINE_GETTER(EmptyFixedArrayConstant, HeapConstant(factory()->empty_fixed_array())) diff --git a/deps/v8/src/compiler/js-graph.h b/deps/v8/src/compiler/js-graph.h index b055f399df3c71..a17b615b3bbeb4 100644 --- a/deps/v8/src/compiler/js-graph.h +++ b/deps/v8/src/compiler/js-graph.h @@ -85,6 +85,7 @@ class V8_EXPORT_PRIVATE JSGraph : public MachineGraph { V(BigIntMapConstant) \ V(BooleanMapConstant) \ V(ToNumberBuiltinConstant) \ + V(PlainPrimitiveToNumberBuiltinConstant) \ V(EmptyFixedArrayConstant) \ V(EmptyStringConstant) \ V(FixedArrayMapConstant) \ diff --git a/deps/v8/src/compiler/js-heap-broker.cc b/deps/v8/src/compiler/js-heap-broker.cc index 123297bc73d530..be05929bbc7ced 100644 --- a/deps/v8/src/compiler/js-heap-broker.cc +++ b/deps/v8/src/compiler/js-heap-broker.cc @@ -34,7 +34,6 @@ #include "src/objects/objects-inl.h" #include "src/objects/template-objects-inl.h" #include "src/objects/templates.h" -#include "src/utils/boxed-float.h" #include "src/utils/utils.h" namespace v8 { @@ -45,7 +44,10 @@ namespace compiler { #define TRACE_MISSING(broker, x) TRACE_BROKER_MISSING(broker, x) #define FORWARD_DECL(Name) class Name##Data; -HEAP_BROKER_OBJECT_LIST(FORWARD_DECL) +HEAP_BROKER_SERIALIZED_OBJECT_LIST(FORWARD_DECL) +// TODO(solanes, v8:10866): Remove once FLAG_turbo_direct_heap_access is +// removed. +HEAP_BROKER_NEVER_SERIALIZED_OBJECT_LIST(FORWARD_DECL) #undef FORWARD_DECL // There are three kinds of ObjectData values. @@ -71,15 +73,19 @@ enum ObjectDataKind { kSmi, kSerializedHeapObject, kUnserializedHeapObject, + kNeverSerializedHeapObject, kUnserializedReadOnlyHeapObject }; -class AllowHandleAllocationIf { +class AllowHandleAllocationIfNeeded { public: - explicit AllowHandleAllocationIf(ObjectDataKind kind, - JSHeapBroker::BrokerMode mode) { + explicit AllowHandleAllocationIfNeeded(ObjectDataKind kind, + JSHeapBroker::BrokerMode mode, + bool direct_heap_access = false) { DCHECK_IMPLIES(mode == JSHeapBroker::BrokerMode::kSerialized, - kind == kUnserializedReadOnlyHeapObject); + kind == kUnserializedReadOnlyHeapObject || + kind == kNeverSerializedHeapObject || + (direct_heap_access && kind == kSerializedHeapObject)); if (kind == kUnserializedHeapObject) maybe_allow_handle_.emplace(); } @@ -87,31 +93,33 @@ class AllowHandleAllocationIf { base::Optional maybe_allow_handle_; }; -class AllowHandleDereferenceIf { +class AllowHandleDereferenceIfNeeded { public: - explicit AllowHandleDereferenceIf(ObjectDataKind kind, - JSHeapBroker::BrokerMode mode) { + explicit AllowHandleDereferenceIfNeeded(ObjectDataKind kind, + JSHeapBroker::BrokerMode mode, + bool direct_heap_access = false) + : AllowHandleDereferenceIfNeeded(kind) { DCHECK_IMPLIES(mode == JSHeapBroker::BrokerMode::kSerialized, - kind == kUnserializedReadOnlyHeapObject); - if (kind == kUnserializedHeapObject || - kind == kUnserializedReadOnlyHeapObject) - maybe_allow_handle_.emplace(); + kind == kUnserializedReadOnlyHeapObject || + kind == kNeverSerializedHeapObject || + (direct_heap_access && kind == kSerializedHeapObject)); } - explicit AllowHandleDereferenceIf(ObjectDataKind kind) { + explicit AllowHandleDereferenceIfNeeded(ObjectDataKind kind) { if (kind == kUnserializedHeapObject || - kind == kUnserializedReadOnlyHeapObject) + kind == kUnserializedReadOnlyHeapObject) { maybe_allow_handle_.emplace(); + } } private: base::Optional maybe_allow_handle_; }; -class AllowHeapAllocationIf { +class AllowHeapAllocationIfNeeded { public: - explicit AllowHeapAllocationIf(ObjectDataKind kind, - JSHeapBroker::BrokerMode mode) { + explicit AllowHeapAllocationIfNeeded(ObjectDataKind kind, + JSHeapBroker::BrokerMode mode) { DCHECK_IMPLIES(mode == JSHeapBroker::BrokerMode::kSerialized, kind == kUnserializedReadOnlyHeapObject); if (kind == kUnserializedHeapObject) maybe_allow_handle_.emplace(); @@ -154,20 +162,29 @@ class ObjectData : public ZoneObject { broker->mode() == JSHeapBroker::kSerializing, broker->isolate()->handle_scope_data()->canonical_scope != nullptr); CHECK_IMPLIES(broker->mode() == JSHeapBroker::kSerialized, - IsReadOnlyHeapObject(*object)); + (kind == kUnserializedReadOnlyHeapObject && + IsReadOnlyHeapObject(*object)) || + kind == kNeverSerializedHeapObject); } -#define DECLARE_IS_AND_AS(Name) \ - bool Is##Name() const; \ - Name##Data* As##Name(); - HEAP_BROKER_OBJECT_LIST(DECLARE_IS_AND_AS) -#undef DECLARE_IS_AND_AS +#define DECLARE_IS(Name) bool Is##Name() const; + HEAP_BROKER_SERIALIZED_OBJECT_LIST(DECLARE_IS) + HEAP_BROKER_NEVER_SERIALIZED_OBJECT_LIST(DECLARE_IS) +#undef DECLARE_IS + +#define DECLARE_AS(Name) Name##Data* As##Name(); + HEAP_BROKER_SERIALIZED_OBJECT_LIST(DECLARE_AS) + // TODO(solanes, v8:10866): Remove once FLAG_turbo_direct_heap_access is + // removed. + HEAP_BROKER_NEVER_SERIALIZED_OBJECT_LIST(DECLARE_AS) +#undef DECLARE_AS Handle object() const { return object_; } ObjectDataKind kind() const { return kind_; } bool is_smi() const { return kind_ == kSmi; } bool should_access_heap() const { return kind_ == kUnserializedHeapObject || + kind_ == kNeverSerializedHeapObject || kind_ == kUnserializedReadOnlyHeapObject; } @@ -216,7 +233,7 @@ class PropertyCellData : public HeapObjectData { // TODO(mslekova): Once we have real-world usage data, we might want to // reimplement this as sorted vector instead, to reduce the memory overhead. -typedef ZoneMap KnownReceiversMap; +typedef ZoneMap KnownReceiversMap; class FunctionTemplateInfoData : public HeapObjectData { public: @@ -228,7 +245,7 @@ class FunctionTemplateInfoData : public HeapObjectData { bool has_call_code() const { return has_call_code_; } void SerializeCallCode(JSHeapBroker* broker); - CallHandlerInfoData* call_code() const { return call_code_; } + ObjectData* call_code() const { return call_code_; } Address c_function() const { return c_function_; } const CFunctionInfo* c_signature() const { return c_signature_; } KnownReceiversMap& known_receivers() { return known_receivers_; } @@ -238,7 +255,7 @@ class FunctionTemplateInfoData : public HeapObjectData { bool accept_any_receiver_ = false; bool has_call_code_ = false; - CallHandlerInfoData* call_code_ = nullptr; + ObjectData* call_code_ = nullptr; const Address c_function_; const CFunctionInfo* const c_signature_; KnownReceiversMap known_receivers_; @@ -310,9 +327,10 @@ void FunctionTemplateInfoData::SerializeCallCode(JSHeapBroker* broker) { TraceScope tracer(broker, this, "FunctionTemplateInfoData::SerializeCallCode"); auto function_template_info = Handle::cast(object()); - call_code_ = broker->GetOrCreateData(function_template_info->call_code()) - ->AsCallHandlerInfo(); - call_code_->Serialize(broker); + call_code_ = broker->GetOrCreateData(function_template_info->call_code()); + if (!call_code_->should_access_heap()) { + call_code_->AsCallHandlerInfo()->Serialize(broker); + } } void CallHandlerInfoData::Serialize(JSHeapBroker* broker) { @@ -451,7 +469,8 @@ base::Optional GetOwnElementFromHeap(JSHeapBroker* broker, LookupIterator it(broker->isolate(), receiver, index, LookupIterator::OWN); if (it.state() == LookupIterator::DATA && (!constant_only || (it.IsReadOnly() && !it.IsConfigurable()))) { - return ObjectRef(broker, it.GetDataValue()); + return ObjectRef(broker, + broker->CanonicalPersistentHandle(it.GetDataValue())); } return base::nullopt; } @@ -519,7 +538,7 @@ class JSTypedArrayData : public JSObjectData { void Serialize(JSHeapBroker* broker); bool serialized() const { return serialized_; } - HeapObjectData* buffer() const { return buffer_; } + ObjectData* buffer() const { return buffer_; } private: bool const is_on_heap_; @@ -527,7 +546,7 @@ class JSTypedArrayData : public JSObjectData { void* const data_ptr_; bool serialized_ = false; - HeapObjectData* buffer_ = nullptr; + ObjectData* buffer_ = nullptr; }; JSTypedArrayData::JSTypedArrayData(JSHeapBroker* broker, ObjectData** storage, @@ -546,7 +565,7 @@ void JSTypedArrayData::Serialize(JSHeapBroker* broker) { if (!is_on_heap()) { DCHECK_NULL(buffer_); - buffer_ = broker->GetOrCreateData(typed_array->buffer())->AsHeapObject(); + buffer_ = broker->GetOrCreateData(typed_array->buffer()); } } @@ -555,7 +574,9 @@ class ArrayBoilerplateDescriptionData : public HeapObjectData { ArrayBoilerplateDescriptionData(JSHeapBroker* broker, ObjectData** storage, Handle object) : HeapObjectData(broker, storage, object), - constants_elements_length_(object->constant_elements().length()) {} + constants_elements_length_(object->constant_elements().length()) { + DCHECK(!FLAG_turbo_direct_heap_access); + } int constants_elements_length() const { return constants_elements_length_; } @@ -567,7 +588,9 @@ class ObjectBoilerplateDescriptionData : public HeapObjectData { public: ObjectBoilerplateDescriptionData(JSHeapBroker* broker, ObjectData** storage, Handle object) - : HeapObjectData(broker, storage, object), size_(object->size()) {} + : HeapObjectData(broker, storage, object), size_(object->size()) { + DCHECK(!FLAG_turbo_direct_heap_access); + } int size() const { return size_; } @@ -581,11 +604,9 @@ class JSDataViewData : public JSObjectData { Handle object); size_t byte_length() const { return byte_length_; } - size_t byte_offset() const { return byte_offset_; } private: size_t const byte_length_; - size_t const byte_offset_; }; class JSBoundFunctionData : public JSObjectData { @@ -624,13 +645,13 @@ class JSFunctionData : public JSObjectData { void Serialize(JSHeapBroker* broker); bool serialized() const { return serialized_; } - ContextData* context() const { return context_; } - NativeContextData* native_context() const { return native_context_; } + ObjectData* context() const { return context_; } + ObjectData* native_context() const { return native_context_; } ObjectData* initial_map() const { return initial_map_; } ObjectData* prototype() const { return prototype_; } - SharedFunctionInfoData* shared() const { return shared_; } - FeedbackVectorData* feedback_vector() const { return feedback_vector_; } - CodeData* code() const { return code_; } + ObjectData* shared() const { return shared_; } + ObjectData* feedback_vector() const { return feedback_vector_; } + ObjectData* code() const { return code_; } int initial_map_instance_size_with_min_slack() const { CHECK(serialized_); return initial_map_instance_size_with_min_slack_; @@ -645,13 +666,13 @@ class JSFunctionData : public JSObjectData { bool serialized_ = false; - ContextData* context_ = nullptr; - NativeContextData* native_context_ = nullptr; + ObjectData* context_ = nullptr; + ObjectData* native_context_ = nullptr; ObjectData* initial_map_ = nullptr; ObjectData* prototype_ = nullptr; - SharedFunctionInfoData* shared_ = nullptr; - FeedbackVectorData* feedback_vector_ = nullptr; - CodeData* code_ = nullptr; + ObjectData* shared_ = nullptr; + ObjectData* feedback_vector_ = nullptr; + ObjectData* code_ = nullptr; int initial_map_instance_size_with_min_slack_; }; @@ -683,7 +704,8 @@ class HeapNumberData : public HeapObjectData { public: HeapNumberData(JSHeapBroker* broker, ObjectData** storage, Handle object) - : HeapObjectData(broker, storage, object), value_(object->value()) {} + : HeapObjectData(broker, storage, object), value_(object->value()) { + } double value() const { return value_; } @@ -696,10 +718,8 @@ class ContextData : public HeapObjectData { ContextData(JSHeapBroker* broker, ObjectData** storage, Handle object); - // {previous} will return the closest valid context possible to desired - // {depth}, decrementing {depth} for each previous link successfully followed. - ContextData* previous( - JSHeapBroker* broker, size_t* depth, + ObjectData* previous( + JSHeapBroker* broker, SerializationPolicy policy = SerializationPolicy::kAssumeSerialized); // Returns nullptr if the slot index isn't valid or wasn't serialized, @@ -710,32 +730,22 @@ class ContextData : public HeapObjectData { private: ZoneMap slots_; - ContextData* previous_ = nullptr; + ObjectData* previous_ = nullptr; }; ContextData::ContextData(JSHeapBroker* broker, ObjectData** storage, Handle object) : HeapObjectData(broker, storage, object), slots_(broker->zone()) {} -ContextData* ContextData::previous(JSHeapBroker* broker, size_t* depth, - SerializationPolicy policy) { - if (*depth == 0) return this; - +ObjectData* ContextData::previous(JSHeapBroker* broker, + SerializationPolicy policy) { if (policy == SerializationPolicy::kSerializeIfNeeded && previous_ == nullptr) { TraceScope tracer(broker, this, "ContextData::previous"); Handle context = Handle::cast(object()); - Object prev = context->unchecked_previous(); - if (prev.IsContext()) { - previous_ = broker->GetOrCreateData(prev)->AsContext(); - } - } - - if (previous_ != nullptr) { - *depth = *depth - 1; - return previous_->previous(broker, depth, policy); + previous_ = broker->GetOrCreateData(context->unchecked_previous()); } - return this; + return previous_; } ObjectData* ContextData::GetSlot(JSHeapBroker* broker, int index, @@ -763,16 +773,16 @@ ObjectData* ContextData::GetSlot(JSHeapBroker* broker, int index, class NativeContextData : public ContextData { public: #define DECL_ACCESSOR(type, name) \ - type##Data* name() const { return name##_; } + ObjectData* name() const { return name##_; } BROKER_NATIVE_CONTEXT_FIELDS(DECL_ACCESSOR) #undef DECL_ACCESSOR - const ZoneVector& function_maps() const { + const ZoneVector& function_maps() const { CHECK(serialized_); return function_maps_; } - ScopeInfoData* scope_info() const { + ObjectData* scope_info() const { CHECK(serialized_); return scope_info_; } @@ -783,11 +793,11 @@ class NativeContextData : public ContextData { private: bool serialized_ = false; -#define DECL_MEMBER(type, name) type##Data* name##_ = nullptr; +#define DECL_MEMBER(type, name) ObjectData* name##_ = nullptr; BROKER_NATIVE_CONTEXT_FIELDS(DECL_MEMBER) #undef DECL_MEMBER - ZoneVector function_maps_; - ScopeInfoData* scope_info_ = nullptr; + ZoneVector function_maps_; + ObjectData* scope_info_ = nullptr; }; class NameData : public HeapObjectData { @@ -806,7 +816,7 @@ class StringData : public NameData { bool is_external_string() const { return is_external_string_; } bool is_seq_string() const { return is_seq_string_; } - StringData* GetCharAsString( + ObjectData* GetCharAsString( JSHeapBroker* broker, uint32_t index, SerializationPolicy policy = SerializationPolicy::kAssumeSerialized); @@ -820,7 +830,7 @@ class StringData : public NameData { // Known individual characters as strings, corresponding to the semantics of // element access (s[i]). The first pair component is always less than // {length_}. The second component is never nullptr. - ZoneVector> chars_as_strings_; + ZoneVector> chars_as_strings_; static constexpr int kMaxLengthForDoubleConversion = 23; }; @@ -859,7 +869,7 @@ class InternalizedStringData : public StringData { uint32_t array_index_; }; -StringData* StringData::GetCharAsString(JSHeapBroker* broker, uint32_t index, +ObjectData* StringData::GetCharAsString(JSHeapBroker* broker, uint32_t index, SerializationPolicy policy) { if (index >= static_cast(length())) return nullptr; @@ -874,8 +884,7 @@ StringData* StringData::GetCharAsString(JSHeapBroker* broker, uint32_t index, base::Optional element = GetOwnElementFromHeap(broker, object(), index, true); - StringData* result = - element.has_value() ? element->data()->AsString() : nullptr; + ObjectData* result = element.has_value() ? element->data() : nullptr; chars_as_strings_.push_back({index, result}); return result; } @@ -987,7 +996,7 @@ class AllocationSiteData : public HeapObjectData { AllocationType GetAllocationType() const { return GetAllocationType_; } ObjectData* nested_site() const { return nested_site_; } bool IsFastLiteral() const { return IsFastLiteral_; } - JSObjectData* boilerplate() const { return boilerplate_; } + ObjectData* boilerplate() const { return boilerplate_; } // These are only valid if PointsToLiteral is false. ElementsKind GetElementsKind() const { return GetElementsKind_; } @@ -998,7 +1007,7 @@ class AllocationSiteData : public HeapObjectData { AllocationType const GetAllocationType_; ObjectData* nested_site_ = nullptr; bool IsFastLiteral_ = false; - JSObjectData* boilerplate_ = nullptr; + ObjectData* boilerplate_ = nullptr; ElementsKind GetElementsKind_ = NO_ELEMENTS; bool CanInlineCall_ = false; bool serialized_boilerplate_ = false; @@ -1008,7 +1017,8 @@ class BigIntData : public HeapObjectData { public: BigIntData(JSHeapBroker* broker, ObjectData** storage, Handle object) : HeapObjectData(broker, storage, object), - as_uint64_(object->AsUint64(nullptr)) {} + as_uint64_(object->AsUint64(nullptr)) { + } uint64_t AsUint64() const { return as_uint64_; } @@ -1025,11 +1035,11 @@ class ScriptContextTableData : public HeapObjectData { }; struct PropertyDescriptor { - NameData* key = nullptr; + ObjectData* key = nullptr; ObjectData* value = nullptr; PropertyDetails details = PropertyDetails::Empty(); FieldIndex field_index; - MapData* field_owner = nullptr; + ObjectData* field_owner = nullptr; ObjectData* field_type = nullptr; bool is_unboxed_double_field = false; }; @@ -1069,7 +1079,7 @@ class MapData : public HeapObjectData { // Extra information. void SerializeElementsKindGeneralizations(JSHeapBroker* broker); - const ZoneVector& elements_kind_generalizations() const { + const ZoneVector& elements_kind_generalizations() const { CHECK(serialized_elements_kind_generalizations_); return elements_kind_generalizations_; } @@ -1080,12 +1090,16 @@ class MapData : public HeapObjectData { InternalIndex descriptor_index); void SerializeOwnDescriptors(JSHeapBroker* broker); ObjectData* GetStrongValue(InternalIndex descriptor_index) const; + // TODO(neis): This code needs to be changed to allow for ObjectData* instance + // descriptors. However, this is likely to require a non-trivial refactoring + // of how maps are serialized because actual instance descriptors don't + // contain information about owner maps. DescriptorArrayData* instance_descriptors() const { return instance_descriptors_; } void SerializeRootMap(JSHeapBroker* broker); - MapData* FindRootMap() const; + ObjectData* FindRootMap() const; void SerializeConstructor(JSHeapBroker* broker); ObjectData* GetConstructor() const { @@ -1094,7 +1108,7 @@ class MapData : public HeapObjectData { } void SerializeBackPointer(JSHeapBroker* broker); - HeapObjectData* GetBackPointer() const { + ObjectData* GetBackPointer() const { CHECK(serialized_backpointer_); return backpointer_; } @@ -1128,7 +1142,7 @@ class MapData : public HeapObjectData { bool const is_abandoned_prototype_map_; bool serialized_elements_kind_generalizations_ = false; - ZoneVector elements_kind_generalizations_; + ZoneVector elements_kind_generalizations_; bool serialized_own_descriptors_ = false; DescriptorArrayData* instance_descriptors_ = nullptr; @@ -1137,13 +1151,13 @@ class MapData : public HeapObjectData { ObjectData* constructor_ = nullptr; bool serialized_backpointer_ = false; - HeapObjectData* backpointer_ = nullptr; + ObjectData* backpointer_ = nullptr; bool serialized_prototype_ = false; ObjectData* prototype_ = nullptr; bool serialized_root_map_ = false; - MapData* root_map_ = nullptr; + ObjectData* root_map_ = nullptr; bool serialized_for_element_load_ = false; @@ -1152,7 +1166,9 @@ class MapData : public HeapObjectData { AccessorInfoData::AccessorInfoData(JSHeapBroker* broker, ObjectData** storage, Handle object) - : HeapObjectData(broker, storage, object) {} + : HeapObjectData(broker, storage, object) { + DCHECK(!FLAG_turbo_direct_heap_access); +} AllocationSiteData::AllocationSiteData(JSHeapBroker* broker, ObjectData** storage, @@ -1178,12 +1194,14 @@ void AllocationSiteData::SerializeBoilerplate(JSHeapBroker* broker) { CHECK(IsFastLiteral_); DCHECK_NULL(boilerplate_); - boilerplate_ = broker->GetOrCreateData(site->boilerplate())->AsJSObject(); - boilerplate_->SerializeAsBoilerplate(broker); + boilerplate_ = broker->GetOrCreateData(site->boilerplate()); + if (!boilerplate_->should_access_heap()) { + boilerplate_->AsJSObject()->SerializeAsBoilerplate(broker); + } DCHECK_NULL(nested_site_); nested_site_ = broker->GetOrCreateData(site->nested_site()); - if (nested_site_->IsAllocationSite()) { + if (nested_site_->IsAllocationSite() && !nested_site_->should_access_heap()) { nested_site_->AsAllocationSite()->SerializeBoilerplate(broker); } } @@ -1198,13 +1216,13 @@ HeapObjectData::HeapObjectData(JSHeapBroker* broker, ObjectData** storage, // meta map (whose map is itself), this member has not yet been // initialized. map_(broker->GetOrCreateData(object->map())) { - CHECK(broker->SerializingAllowed()); + CHECK_EQ(broker->mode(), JSHeapBroker::kSerializing); } InstanceType HeapObjectData::GetMapInstanceType() const { ObjectData* map_data = map(); if (map_data->should_access_heap()) { - AllowHandleDereferenceIf allow_handle_dereference(kind()); + AllowHandleDereferenceIfNeeded allow_handle_dereference(kind()); return Handle::cast(map_data->object())->instance_type(); } return map_data->AsMap()->instance_type(); @@ -1290,17 +1308,15 @@ void JSFunctionData::Serialize(JSHeapBroker* broker) { DCHECK_NULL(feedback_vector_); DCHECK_NULL(code_); - context_ = broker->GetOrCreateData(function->context())->AsContext(); - native_context_ = - broker->GetOrCreateData(function->native_context())->AsNativeContext(); - shared_ = broker->GetOrCreateData(function->shared())->AsSharedFunctionInfo(); + context_ = broker->GetOrCreateData(function->context()); + native_context_ = broker->GetOrCreateData(function->native_context()); + shared_ = broker->GetOrCreateData(function->shared()); feedback_vector_ = has_feedback_vector() ? broker->GetOrCreateData(function->feedback_vector()) - ->AsFeedbackVector() : nullptr; - code_ = broker->GetOrCreateData(function->code())->AsCode(); + code_ = broker->GetOrCreateData(function->code()); initial_map_ = has_initial_map() - ? broker->GetOrCreateData(function->initial_map())->AsMap() + ? broker->GetOrCreateData(function->initial_map()) : nullptr; prototype_ = has_prototype() ? broker->GetOrCreateData(function->prototype()) : nullptr; @@ -1336,8 +1352,7 @@ void MapData::SerializeElementsKindGeneralizations(JSHeapBroker* broker) { if (IsMoreGeneralElementsKindTransition(from_kind, to_kind)) { Handle target = Map::AsElementsKind(broker->isolate(), self.object(), to_kind); - elements_kind_generalizations_.push_back( - broker->GetOrCreateData(target)->AsMap()); + elements_kind_generalizations_.push_back(broker->GetOrCreateData(target)); } } } @@ -1359,16 +1374,16 @@ class FeedbackCellData : public HeapObjectData { FeedbackCellData(JSHeapBroker* broker, ObjectData** storage, Handle object); - HeapObjectData* value() const { return value_; } + ObjectData* value() const { return value_; } private: - HeapObjectData* const value_; + ObjectData* const value_; }; FeedbackCellData::FeedbackCellData(JSHeapBroker* broker, ObjectData** storage, Handle object) : HeapObjectData(broker, storage, object), - value_(broker->GetOrCreateData(object->value())->AsHeapObject()) {} + value_(broker->GetOrCreateData(object->value())) {} class FeedbackVectorData : public HeapObjectData { public: @@ -1377,21 +1392,20 @@ class FeedbackVectorData : public HeapObjectData { double invocation_count() const { return invocation_count_; } - SharedFunctionInfoData* shared_function_info() { + ObjectData* shared_function_info() { CHECK(serialized_); return shared_function_info_; } void Serialize(JSHeapBroker* broker); bool serialized() const { return serialized_; } - FeedbackCellData* GetClosureFeedbackCell(JSHeapBroker* broker, - int index) const; + ObjectData* GetClosureFeedbackCell(JSHeapBroker* broker, int index) const; private: double const invocation_count_; bool serialized_ = false; - SharedFunctionInfoData* shared_function_info_; + ObjectData* shared_function_info_; ZoneVector closure_feedback_cell_array_; }; @@ -1402,8 +1416,8 @@ FeedbackVectorData::FeedbackVectorData(JSHeapBroker* broker, invocation_count_(object->invocation_count()), closure_feedback_cell_array_(broker->zone()) {} -FeedbackCellData* FeedbackVectorData::GetClosureFeedbackCell( - JSHeapBroker* broker, int index) const { +ObjectData* FeedbackVectorData::GetClosureFeedbackCell(JSHeapBroker* broker, + int index) const { CHECK_GE(index, 0); size_t cell_array_size = closure_feedback_cell_array_.size(); @@ -1414,7 +1428,7 @@ FeedbackCellData* FeedbackVectorData::GetClosureFeedbackCell( return nullptr; } CHECK_LT(index, cell_array_size); - return closure_feedback_cell_array_[index]->AsFeedbackCell(); + return closure_feedback_cell_array_[index]; } void FeedbackVectorData::Serialize(JSHeapBroker* broker) { @@ -1425,7 +1439,7 @@ void FeedbackVectorData::Serialize(JSHeapBroker* broker) { Handle vector = Handle::cast(object()); Handle sfi(vector->shared_function_info(), broker->isolate()); - shared_function_info_ = broker->GetOrCreateData(sfi)->AsSharedFunctionInfo(); + shared_function_info_ = broker->GetOrCreateData(sfi); DCHECK(closure_feedback_cell_array_.empty()); int length = vector->closure_feedback_cell_array().length(); closure_feedback_cell_array_.reserve(length); @@ -1467,8 +1481,7 @@ class FixedArrayData : public FixedArrayBaseData { JSDataViewData::JSDataViewData(JSHeapBroker* broker, ObjectData** storage, Handle object) : JSObjectData(broker, storage, object), - byte_length_(object->byte_length()), - byte_offset_(object->byte_offset()) {} + byte_length_(object->byte_length()) {} JSBoundFunctionData::JSBoundFunctionData(JSHeapBroker* broker, ObjectData** storage, @@ -1485,10 +1498,12 @@ void JSBoundFunctionData::Serialize(JSHeapBroker* broker) { DCHECK_NULL(bound_target_function_); bound_target_function_ = broker->GetOrCreateData(function->bound_target_function()); - if (bound_target_function_->IsJSBoundFunction()) { - bound_target_function_->AsJSBoundFunction()->Serialize(broker); - } else if (bound_target_function_->IsJSFunction()) { - bound_target_function_->AsJSFunction()->Serialize(broker); + if (!bound_target_function_->should_access_heap()) { + if (bound_target_function_->IsJSBoundFunction()) { + bound_target_function_->AsJSBoundFunction()->Serialize(broker); + } else if (bound_target_function_->IsJSFunction()) { + bound_target_function_->AsJSFunction()->Serialize(broker); + } } DCHECK_NULL(bound_arguments_); @@ -1547,7 +1562,8 @@ class FixedDoubleArrayData : public FixedArrayBaseData { FixedDoubleArrayData::FixedDoubleArrayData(JSHeapBroker* broker, ObjectData** storage, Handle object) - : FixedArrayBaseData(broker, storage, object), contents_(broker->zone()) {} + : FixedArrayBaseData(broker, storage, object), contents_(broker->zone()) { +} void FixedDoubleArrayData::SerializeContents(JSHeapBroker* broker) { if (serialized_contents_) return; @@ -1567,6 +1583,12 @@ void FixedDoubleArrayData::SerializeContents(JSHeapBroker* broker) { class BytecodeArrayData : public FixedArrayBaseData { public: + int register_count() const { return register_count_; } + int parameter_count() const { return parameter_count_; } + interpreter::Register incoming_new_target_or_generator_register() const { + return incoming_new_target_or_generator_register_; + } + Handle GetConstantAtIndex(int index, Isolate* isolate) const { return constant_pool_[index]->object(); } @@ -1599,9 +1621,17 @@ class BytecodeArrayData : public FixedArrayBaseData { BytecodeArrayData(JSHeapBroker* broker, ObjectData** storage, Handle object) : FixedArrayBaseData(broker, storage, object), + register_count_(object->register_count()), + parameter_count_(object->parameter_count()), + incoming_new_target_or_generator_register_( + object->incoming_new_target_or_generator_register()), constant_pool_(broker->zone()) {} private: + int const register_count_; + int const parameter_count_; + interpreter::Register const incoming_new_target_or_generator_register_; + bool is_serialized_for_compilation_ = false; ZoneVector constant_pool_; }; @@ -1671,7 +1701,7 @@ class ScopeInfoData : public HeapObjectData { bool has_outer_scope_info() const { return has_outer_scope_info_; } int flags() const { return flags_; } - ScopeInfoData* outer_scope_info() const { return outer_scope_info_; } + ObjectData* outer_scope_info() const { return outer_scope_info_; } void SerializeScopeInfoChain(JSHeapBroker* broker); private: @@ -1680,7 +1710,7 @@ class ScopeInfoData : public HeapObjectData { int const flags_; // Only serialized via SerializeScopeInfoChain. - ScopeInfoData* outer_scope_info_; + ObjectData* outer_scope_info_; }; ScopeInfoData::ScopeInfoData(JSHeapBroker* broker, ObjectData** storage, @@ -1694,11 +1724,11 @@ ScopeInfoData::ScopeInfoData(JSHeapBroker* broker, ObjectData** storage, void ScopeInfoData::SerializeScopeInfoChain(JSHeapBroker* broker) { if (outer_scope_info_) return; if (!has_outer_scope_info_) return; - outer_scope_info_ = - broker - ->GetOrCreateData(Handle::cast(object())->OuterScopeInfo()) - ->AsScopeInfo(); - outer_scope_info_->SerializeScopeInfoChain(broker); + outer_scope_info_ = broker->GetOrCreateData( + Handle::cast(object())->OuterScopeInfo()); + if (!outer_scope_info_->should_access_heap()) { + outer_scope_info_->AsScopeInfo()->SerializeScopeInfoChain(broker); + } } class SharedFunctionInfoData : public HeapObjectData { @@ -1708,21 +1738,19 @@ class SharedFunctionInfoData : public HeapObjectData { int builtin_id() const { return builtin_id_; } int context_header_size() const { return context_header_size_; } - BytecodeArrayData* GetBytecodeArray() const { return GetBytecodeArray_; } + ObjectData* GetBytecodeArray() const { return GetBytecodeArray_; } void SerializeFunctionTemplateInfo(JSHeapBroker* broker); - ScopeInfoData* scope_info() const { return scope_info_; } + ObjectData* scope_info() const { return scope_info_; } void SerializeScopeInfoChain(JSHeapBroker* broker); - FunctionTemplateInfoData* function_template_info() const { - return function_template_info_; - } - JSArrayData* GetTemplateObject(FeedbackSlot slot) const { + ObjectData* function_template_info() const { return function_template_info_; } + ObjectData* GetTemplateObject(FeedbackSlot slot) const { auto lookup_it = template_objects_.find(slot.ToInt()); if (lookup_it != template_objects_.cend()) { return lookup_it->second; } return nullptr; } - void SetTemplateObject(FeedbackSlot slot, JSArrayData* object) { + void SetTemplateObject(FeedbackSlot slot, ObjectData* object) { CHECK( template_objects_.insert(std::make_pair(slot.ToInt(), object)).second); } @@ -1735,13 +1763,13 @@ class SharedFunctionInfoData : public HeapObjectData { private: int const builtin_id_; int context_header_size_; - BytecodeArrayData* const GetBytecodeArray_; + ObjectData* const GetBytecodeArray_; #define DECL_MEMBER(type, name) type const name##_; BROKER_SFI_FIELDS(DECL_MEMBER) #undef DECL_MEMBER - FunctionTemplateInfoData* function_template_info_; - ZoneMap template_objects_; - ScopeInfoData* scope_info_; + ObjectData* function_template_info_; + ZoneMap template_objects_; + ObjectData* scope_info_; }; SharedFunctionInfoData::SharedFunctionInfoData( @@ -1754,7 +1782,6 @@ SharedFunctionInfoData::SharedFunctionInfoData( GetBytecodeArray_( object->HasBytecodeArray() ? broker->GetOrCreateData(object->GetBytecodeArray()) - ->AsBytecodeArray() : nullptr) #define INIT_MEMBER(type, name) , name##_(object->name()) BROKER_SFI_FIELDS(INIT_MEMBER) @@ -1770,23 +1797,17 @@ SharedFunctionInfoData::SharedFunctionInfoData( void SharedFunctionInfoData::SerializeFunctionTemplateInfo( JSHeapBroker* broker) { if (function_template_info_) return; - - function_template_info_ = - broker - ->GetOrCreateData(handle( - Handle::cast(object())->function_data(), - broker->isolate())) - ->AsFunctionTemplateInfo(); + function_template_info_ = broker->GetOrCreateData( + Handle::cast(object())->function_data()); } void SharedFunctionInfoData::SerializeScopeInfoChain(JSHeapBroker* broker) { if (scope_info_) return; - scope_info_ = - broker - ->GetOrCreateData( - Handle::cast(object())->scope_info()) - ->AsScopeInfo(); - scope_info_->SerializeScopeInfoChain(broker); + scope_info_ = broker->GetOrCreateData( + Handle::cast(object())->scope_info()); + if (!scope_info_->should_access_heap()) { + scope_info_->AsScopeInfo()->SerializeScopeInfoChain(broker); + } } class SourceTextModuleData : public HeapObjectData { @@ -1795,13 +1816,13 @@ class SourceTextModuleData : public HeapObjectData { Handle object); void Serialize(JSHeapBroker* broker); - CellData* GetCell(JSHeapBroker* broker, int cell_index) const; + ObjectData* GetCell(JSHeapBroker* broker, int cell_index) const; ObjectData* GetImportMeta(JSHeapBroker* broker) const; private: bool serialized_ = false; - ZoneVector imports_; - ZoneVector exports_; + ZoneVector imports_; + ZoneVector exports_; ObjectData* import_meta_; }; @@ -1813,15 +1834,15 @@ SourceTextModuleData::SourceTextModuleData(JSHeapBroker* broker, exports_(broker->zone()), import_meta_(nullptr) {} -CellData* SourceTextModuleData::GetCell(JSHeapBroker* broker, - int cell_index) const { +ObjectData* SourceTextModuleData::GetCell(JSHeapBroker* broker, + int cell_index) const { if (!serialized_) { DCHECK(imports_.empty()); TRACE_BROKER_MISSING(broker, "module cell " << cell_index << " on " << this); return nullptr; } - CellData* cell; + ObjectData* cell; switch (SourceTextModuleDescriptor::GetCellIndexKind(cell_index)) { case SourceTextModuleDescriptor::kImport: cell = imports_.at(SourceTextModule::ImportIndex(cell_index)); @@ -1856,7 +1877,7 @@ void SourceTextModuleData::Serialize(JSHeapBroker* broker) { int const imports_length = imports->length(); imports_.reserve(imports_length); for (int i = 0; i < imports_length; ++i) { - imports_.push_back(broker->GetOrCreateData(imports->get(i))->AsCell()); + imports_.push_back(broker->GetOrCreateData(imports->get(i))); } TRACE(broker, "Copied " << imports_.size() << " imports"); @@ -1865,7 +1886,7 @@ void SourceTextModuleData::Serialize(JSHeapBroker* broker) { int const exports_length = exports->length(); exports_.reserve(exports_length); for (int i = 0; i < exports_length; ++i) { - exports_.push_back(broker->GetOrCreateData(exports->get(i))->AsCell()); + exports_.push_back(broker->GetOrCreateData(exports->get(i))); } TRACE(broker, "Copied " << exports_.size() << " exports"); @@ -1876,35 +1897,20 @@ void SourceTextModuleData::Serialize(JSHeapBroker* broker) { class CellData : public HeapObjectData { public: - CellData(JSHeapBroker* broker, ObjectData** storage, Handle object); - - void Serialize(JSHeapBroker* broker); - ObjectData* value() { return value_; } - - private: - ObjectData* value_ = nullptr; + CellData(JSHeapBroker* broker, ObjectData** storage, Handle object) + : HeapObjectData(broker, storage, object) { + DCHECK(!FLAG_turbo_direct_heap_access); + } }; -CellData::CellData(JSHeapBroker* broker, ObjectData** storage, - Handle object) - : HeapObjectData(broker, storage, object) {} - -void CellData::Serialize(JSHeapBroker* broker) { - if (value_ != nullptr) return; - - TraceScope tracer(broker, this, "CellData::Serialize"); - auto cell = Handle::cast(object()); - value_ = broker->GetOrCreateData(cell->value()); -} - class JSGlobalObjectData : public JSObjectData { public: JSGlobalObjectData(JSHeapBroker* broker, ObjectData** storage, Handle object); bool IsDetached() const { return is_detached_; } - PropertyCellData* GetPropertyCell( - JSHeapBroker* broker, NameData* name, + ObjectData* GetPropertyCell( + JSHeapBroker* broker, ObjectData* name, SerializationPolicy policy = SerializationPolicy::kAssumeSerialized); private: @@ -1914,7 +1920,7 @@ class JSGlobalObjectData : public JSObjectData { // (1) are known to exist as property cells on the global object, or // (2) are known not to (possibly they don't exist at all). // In case (2), the second pair component is nullptr. - ZoneVector> properties_; + ZoneVector> properties_; }; JSGlobalObjectData::JSGlobalObjectData(JSHeapBroker* broker, @@ -1951,8 +1957,9 @@ base::Optional GetPropertyCellFromHeap(JSHeapBroker* broker, } } // namespace -PropertyCellData* JSGlobalObjectData::GetPropertyCell( - JSHeapBroker* broker, NameData* name, SerializationPolicy policy) { +ObjectData* JSGlobalObjectData::GetPropertyCell(JSHeapBroker* broker, + ObjectData* name, + SerializationPolicy policy) { CHECK_NOT_NULL(name); for (auto const& p : properties_) { if (p.first == name) return p.second; @@ -1963,12 +1970,14 @@ PropertyCellData* JSGlobalObjectData::GetPropertyCell( return nullptr; } - PropertyCellData* result = nullptr; + ObjectData* result = nullptr; base::Optional cell = GetPropertyCellFromHeap(broker, Handle::cast(name->object())); if (cell.has_value()) { - cell->Serialize(); - result = cell->data()->AsPropertyCell(); + result = cell->data(); + if (!result->should_access_heap()) { + result->AsPropertyCell()->Serialize(broker); + } } properties_.push_back({name, result}); return result; @@ -1978,7 +1987,9 @@ class TemplateObjectDescriptionData : public HeapObjectData { public: TemplateObjectDescriptionData(JSHeapBroker* broker, ObjectData** storage, Handle object) - : HeapObjectData(broker, storage, object) {} + : HeapObjectData(broker, storage, object) { + DCHECK(!FLAG_turbo_direct_heap_access); + } }; class CodeData : public HeapObjectData { @@ -1993,23 +2004,43 @@ class CodeData : public HeapObjectData { unsigned const inlined_bytecode_size_; }; -#define DEFINE_IS_AND_AS(Name) \ +#define DEFINE_IS(Name) \ bool ObjectData::Is##Name() const { \ if (should_access_heap()) { \ - AllowHandleDereferenceIf allow_handle_dereference(kind()); \ + AllowHandleDereferenceIfNeeded allow_handle_dereference(kind()); \ return object()->Is##Name(); \ } \ if (is_smi()) return false; \ InstanceType instance_type = \ static_cast(this)->GetMapInstanceType(); \ return InstanceTypeChecker::Is##Name(instance_type); \ - } \ - Name##Data* ObjectData::As##Name() { \ - CHECK(Is##Name()); \ - return static_cast(this); \ } -HEAP_BROKER_OBJECT_LIST(DEFINE_IS_AND_AS) -#undef DEFINE_IS_AND_AS +HEAP_BROKER_SERIALIZED_OBJECT_LIST(DEFINE_IS) +HEAP_BROKER_NEVER_SERIALIZED_OBJECT_LIST(DEFINE_IS) +#undef DEFINE_IS + +#define DEFINE_AS(Name) \ + Name##Data* ObjectData::As##Name() { \ + CHECK(Is##Name()); \ + CHECK_EQ(kind_, kSerializedHeapObject); \ + return static_cast(this); \ + } +HEAP_BROKER_SERIALIZED_OBJECT_LIST(DEFINE_AS) +#undef DEFINE_AS + +// TODO(solanes, v8:10866): Remove once FLAG_turbo_direct_heap_access is +// removed. +// This macro defines the Asxxx methods for NeverSerialized objects, which +// should only be used with direct heap access off. +#define DEFINE_AS(Name) \ + Name##Data* ObjectData::As##Name() { \ + DCHECK(!FLAG_turbo_direct_heap_access); \ + CHECK(Is##Name()); \ + CHECK_EQ(kind_, kSerializedHeapObject); \ + return static_cast(this); \ + } +HEAP_BROKER_NEVER_SERIALIZED_OBJECT_LIST(DEFINE_AS) +#undef DEFINE_AS const JSObjectField& JSObjectData::GetInobjectField(int property_index) const { CHECK_LT(static_cast(property_index), inobject_fields_.size()); @@ -2058,7 +2089,7 @@ void MapData::SerializeBackPointer(JSHeapBroker* broker) { Handle map = Handle::cast(object()); DCHECK_NULL(backpointer_); DCHECK(!map->IsContextMap()); - backpointer_ = broker->GetOrCreateData(map->GetBackPointer())->AsHeapObject(); + backpointer_ = broker->GetOrCreateData(map->GetBackPointer()); } void MapData::SerializePrototype(JSHeapBroker* broker) { @@ -2086,7 +2117,6 @@ void MapData::SerializeOwnDescriptors(JSHeapBroker* broker) { ObjectData* MapData::GetStrongValue(InternalIndex descriptor_index) const { auto data = instance_descriptors_->contents().find(descriptor_index.as_int()); if (data == instance_descriptors_->contents().end()) return nullptr; - return data->second.value; } @@ -2111,28 +2141,26 @@ void MapData::SerializeOwnDescriptor(JSHeapBroker* broker, CHECK_EQ(*descriptors, map->instance_descriptors()); PropertyDescriptor d; - d.key = - broker->GetOrCreateData(descriptors->GetKey(descriptor_index))->AsName(); + d.key = broker->GetOrCreateData(descriptors->GetKey(descriptor_index)); MaybeObject value = descriptors->GetValue(descriptor_index); HeapObject obj; if (value.GetHeapObjectIfStrong(&obj)) { - d.value = broker->GetOrCreateData(handle(obj, broker->isolate())); + d.value = broker->GetOrCreateData(obj); } d.details = descriptors->GetDetails(descriptor_index); if (d.details.location() == kField) { d.field_index = FieldIndex::ForDescriptor(*map, descriptor_index); d.field_owner = - broker->GetOrCreateData(map->FindFieldOwner(isolate, descriptor_index)) - ->AsMap(); + broker->GetOrCreateData(map->FindFieldOwner(isolate, descriptor_index)); d.field_type = broker->GetOrCreateData(descriptors->GetFieldType(descriptor_index)); d.is_unboxed_double_field = map->IsUnboxedDoubleField(d.field_index); } contents[descriptor_index.as_int()] = d; - if (d.details.location() == kField) { + if (d.details.location() == kField && !d.field_owner->should_access_heap()) { // Recurse on the owner map. - d.field_owner->SerializeOwnDescriptor(broker, descriptor_index); + d.field_owner->AsMap()->SerializeOwnDescriptor(broker, descriptor_index); } TRACE(broker, "Copied descriptor " << descriptor_index.as_int() << " into " @@ -2147,11 +2175,10 @@ void MapData::SerializeRootMap(JSHeapBroker* broker) { TraceScope tracer(broker, this, "MapData::SerializeRootMap"); Handle map = Handle::cast(object()); DCHECK_NULL(root_map_); - root_map_ = - broker->GetOrCreateData(map->FindRootMap(broker->isolate()))->AsMap(); + root_map_ = broker->GetOrCreateData(map->FindRootMap(broker->isolate())); } -MapData* MapData::FindRootMap() const { return root_map_; } +ObjectData* MapData::FindRootMap() const { return root_map_; } void JSObjectData::SerializeRecursiveAsBoilerplate(JSHeapBroker* broker, int depth) { @@ -2206,13 +2233,16 @@ void JSObjectData::SerializeRecursiveAsBoilerplate(JSHeapBroker* broker, Handle value(fast_elements->get(i), isolate); if (value->IsJSObject()) { ObjectData* value_data = broker->GetOrCreateData(value); - value_data->AsJSObject()->SerializeRecursiveAsBoilerplate(broker, - depth - 1); + if (!value_data->should_access_heap()) { + value_data->AsJSObject()->SerializeRecursiveAsBoilerplate(broker, + depth - 1); + } } } } else { CHECK(boilerplate->HasDoubleElements()); CHECK_LE(elements_object->Size(), kMaxRegularHeapObjectSize); + DCHECK_EQ(elements_->kind(), ObjectDataKind::kSerializedHeapObject); elements_->AsFixedDoubleArray()->SerializeContents(broker); } @@ -2255,7 +2285,7 @@ void JSObjectData::SerializeRecursiveAsBoilerplate(JSHeapBroker* broker, value = isolate->factory()->uninitialized_value(); } ObjectData* value_data = broker->GetOrCreateData(value); - if (value->IsJSObject()) { + if (value_data->IsJSObject() && !value_data->should_access_heap()) { value_data->AsJSObject()->SerializeRecursiveAsBoilerplate(broker, depth - 1); } @@ -2303,29 +2333,36 @@ Isolate* ObjectRef::isolate() const { return broker()->isolate(); } ContextRef ContextRef::previous(size_t* depth, SerializationPolicy policy) const { DCHECK_NOT_NULL(depth); + if (data_->should_access_heap()) { - AllowHandleAllocationIf allow_handle_allocation(data()->kind(), - broker()->mode()); - AllowHandleDereferenceIf allow_handle_dereference(data()->kind(), - broker()->mode()); + AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(), + broker()->mode()); + AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(), + broker()->mode()); Context current = *object(); while (*depth != 0 && current.unchecked_previous().IsContext()) { current = Context::cast(current.unchecked_previous()); (*depth)--; } - return ContextRef(broker(), handle(current, broker()->isolate())); + return ContextRef(broker(), broker()->CanonicalPersistentHandle(current)); } - ContextData* current = this->data()->AsContext(); - return ContextRef(broker(), current->previous(broker(), depth, policy)); + + if (*depth == 0) return *this; + + ObjectData* previous_data = data()->AsContext()->previous(broker(), policy); + if (previous_data == nullptr || !previous_data->IsContext()) return *this; + + *depth = *depth - 1; + return ContextRef(broker(), previous_data).previous(depth, policy); } base::Optional ContextRef::get(int index, SerializationPolicy policy) const { if (data_->should_access_heap()) { - AllowHandleAllocationIf allow_handle_allocation(data()->kind(), - broker()->mode()); - AllowHandleDereferenceIf allow_handle_dereference(data()->kind(), - broker()->mode()); + AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(), + broker()->mode()); + AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(), + broker()->mode()); Handle value(object()->get(index), broker()->isolate()); return ObjectRef(broker(), value); } @@ -2520,8 +2557,6 @@ void JSHeapBroker::Retire() { #endif // DEBUG } -bool JSHeapBroker::SerializingAllowed() const { return mode() == kSerializing; } - void JSHeapBroker::SetTargetNativeContextRef( Handle native_context) { // The MapData constructor uses {target_native_context_}. This creates a @@ -2632,37 +2667,29 @@ void JSHeapBroker::InitializeAndStartSerializing( CollectArrayAndObjectPrototypes(); - // Serialize Cells Factory* const f = isolate()->factory(); - GetOrCreateData(f->array_buffer_detaching_protector()) - ->AsPropertyCell() - ->Serialize(this); - GetOrCreateData(f->array_constructor_protector()) - ->AsPropertyCell() - ->Serialize(this); - GetOrCreateData(f->array_iterator_protector()) - ->AsPropertyCell() - ->Serialize(this); - GetOrCreateData(f->array_species_protector()) - ->AsPropertyCell() - ->Serialize(this); - GetOrCreateData(f->many_closures_cell())->AsFeedbackCell(); - GetOrCreateData(f->no_elements_protector()) - ->AsPropertyCell() - ->Serialize(this); - GetOrCreateData(f->promise_hook_protector()) - ->AsPropertyCell() - ->Serialize(this); - GetOrCreateData(f->promise_species_protector()) - ->AsPropertyCell() - ->Serialize(this); - GetOrCreateData(f->promise_then_protector()) - ->AsPropertyCell() - ->Serialize(this); - GetOrCreateData(f->string_length_protector()) - ->AsPropertyCell() - ->Serialize(this); - // - CEntry stub + { + ObjectData* data; + data = GetOrCreateData(f->array_buffer_detaching_protector()); + if (!data->should_access_heap()) data->AsPropertyCell()->Serialize(this); + data = GetOrCreateData(f->array_constructor_protector()); + if (!data->should_access_heap()) data->AsPropertyCell()->Serialize(this); + data = GetOrCreateData(f->array_iterator_protector()); + if (!data->should_access_heap()) data->AsPropertyCell()->Serialize(this); + data = GetOrCreateData(f->array_species_protector()); + if (!data->should_access_heap()) data->AsPropertyCell()->Serialize(this); + data = GetOrCreateData(f->no_elements_protector()); + if (!data->should_access_heap()) data->AsPropertyCell()->Serialize(this); + data = GetOrCreateData(f->promise_hook_protector()); + if (!data->should_access_heap()) data->AsPropertyCell()->Serialize(this); + data = GetOrCreateData(f->promise_species_protector()); + if (!data->should_access_heap()) data->AsPropertyCell()->Serialize(this); + data = GetOrCreateData(f->promise_then_protector()); + if (!data->should_access_heap()) data->AsPropertyCell()->Serialize(this); + data = GetOrCreateData(f->string_length_protector()); + if (!data->should_access_heap()) data->AsPropertyCell()->Serialize(this); + } + GetOrCreateData(f->many_closures_cell()); GetOrCreateData( CodeFactory::CEntry(isolate(), 1, kDontSaveFPRegs, kArgvOnStack, true)); @@ -2683,15 +2710,29 @@ ObjectData* JSHeapBroker::GetOrCreateData(Handle object) { } else if (IsReadOnlyHeapObject(*object)) { object_data = zone()->New(this, data_storage, object, kUnserializedReadOnlyHeapObject); -#define CREATE_DATA_IF_MATCH(name) \ +// TODO(solanes, v8:10866): Remove the if/else in this macro once we remove the +// FLAG_turbo_direct_heap_access. +#define CREATE_DATA_FOR_DIRECT_READ(name) \ + } else if (object->Is##name()) { \ + if (FLAG_turbo_direct_heap_access) { \ + object_data = zone()->New( \ + this, data_storage, object, kNeverSerializedHeapObject); \ + } else { \ + CHECK_EQ(mode(), kSerializing); \ + AllowHandleAllocation handle_allocation; \ + object_data = zone()->New(this, data_storage, \ + Handle::cast(object)); \ + } + HEAP_BROKER_NEVER_SERIALIZED_OBJECT_LIST(CREATE_DATA_FOR_DIRECT_READ) +#undef CREATE_DATA_FOR_DIRECT_READ +#define CREATE_DATA_FOR_SERIALIZATION(name) \ } else if (object->Is##name()) { \ - CHECK(SerializingAllowed()); \ + CHECK_EQ(mode(), kSerializing); \ AllowHandleAllocation handle_allocation; \ object_data = zone()->New(this, data_storage, \ Handle::cast(object)); - - HEAP_BROKER_OBJECT_LIST(CREATE_DATA_IF_MATCH) -#undef CREATE_DATA_IF_MATCH + HEAP_BROKER_SERIALIZED_OBJECT_LIST(CREATE_DATA_FOR_SERIALIZATION) +#undef CREATE_DATA_FOR_SERIALIZATION } else { UNREACHABLE(); } @@ -2704,7 +2745,7 @@ ObjectData* JSHeapBroker::GetOrCreateData(Handle object) { // clang-format on ObjectData* JSHeapBroker::GetOrCreateData(Object object) { - return GetOrCreateData(handle(object, isolate())); + return GetOrCreateData(CanonicalPersistentHandle(object)); } #define DEFINE_IS_AND_AS(Name) \ @@ -2713,7 +2754,8 @@ ObjectData* JSHeapBroker::GetOrCreateData(Object object) { DCHECK(Is##Name()); \ return Name##Ref(broker(), data()); \ } -HEAP_BROKER_OBJECT_LIST(DEFINE_IS_AND_AS) +HEAP_BROKER_SERIALIZED_OBJECT_LIST(DEFINE_IS_AND_AS) +HEAP_BROKER_NEVER_SERIALIZED_OBJECT_LIST(DEFINE_IS_AND_AS) #undef DEFINE_IS_AND_AS bool ObjectRef::IsSmi() const { return data()->is_smi(); } @@ -2726,13 +2768,12 @@ int ObjectRef::AsSmi() const { base::Optional JSObjectRef::GetObjectCreateMap() const { if (data_->should_access_heap()) { - DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject); - AllowHandleAllocationIf allow_handle_allocation(data()->kind(), - broker()->mode()); - AllowHandleDereferenceIf allow_handle_dereference(data()->kind(), + AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(), + broker()->mode()); + AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(), + broker()->mode()); + AllowHeapAllocationIfNeeded allow_heap_allocation(data()->kind(), broker()->mode()); - AllowHeapAllocationIf allow_heap_allocation(data()->kind(), - broker()->mode()); Handle instance_map; if (Map::TryGetObjectCreateMap(broker()->isolate(), object()) .ToHandle(&instance_map)) { @@ -2758,17 +2799,17 @@ INSTANCE_TYPE_CHECKERS(DEF_TESTER) base::Optional MapRef::AsElementsKind(ElementsKind kind) const { if (data_->should_access_heap()) { - AllowHandleAllocationIf allow_handle_allocation(data()->kind(), - broker()->mode()); - AllowHeapAllocationIf allow_heap_allocation(data()->kind(), - broker()->mode()); - AllowHandleDereferenceIf allow_handle_dereference(data()->kind(), + AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(), + broker()->mode()); + AllowHeapAllocationIfNeeded allow_heap_allocation(data()->kind(), broker()->mode()); + AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(), + broker()->mode()); return MapRef(broker(), Map::AsElementsKind(broker()->isolate(), object(), kind)); } if (kind == elements_kind()) return *this; - const ZoneVector& elements_kind_generalizations = + const ZoneVector& elements_kind_generalizations = data()->AsMap()->elements_kind_generalizations(); for (auto data : elements_kind_generalizations) { MapRef map(broker(), data); @@ -2778,14 +2819,14 @@ base::Optional MapRef::AsElementsKind(ElementsKind kind) const { } void MapRef::SerializeForElementLoad() { + if (data()->should_access_heap()) return; CHECK_EQ(broker()->mode(), JSHeapBroker::kSerializing); - if (data()->kind() == ObjectDataKind::kUnserializedReadOnlyHeapObject) return; data()->AsMap()->SerializeForElementLoad(broker()); } void MapRef::SerializeForElementStore() { + if (data()->should_access_heap()) return; CHECK_EQ(broker()->mode(), JSHeapBroker::kSerializing); - if (data()->kind() == ObjectDataKind::kUnserializedReadOnlyHeapObject) return; data()->AsMap()->SerializeForElementStore(broker()); } @@ -2843,10 +2884,10 @@ bool MapRef::HasOnlyStablePrototypesWithFastElements( bool MapRef::supports_fast_array_iteration() const { if (data_->should_access_heap()) { - AllowHandleDereferenceIf allow_handle_dereference(data()->kind(), - broker()->mode()); - AllowHandleAllocationIf allow_handle_allocation(data()->kind(), - broker()->mode()); + AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(), + broker()->mode()); + AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(), + broker()->mode()); return SupportsFastArrayIteration(broker()->isolate(), object()); } return data()->AsMap()->supports_fast_array_iteration(); @@ -2854,10 +2895,10 @@ bool MapRef::supports_fast_array_iteration() const { bool MapRef::supports_fast_array_resize() const { if (data_->should_access_heap()) { - AllowHandleDereferenceIf allow_handle_dereference(data()->kind(), - broker()->mode()); - AllowHandleAllocationIf allow_handle_allocation(data()->kind(), - broker()->mode()); + AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(), + broker()->mode()); + AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(), + broker()->mode()); return SupportsFastArrayResize(broker()->isolate(), object()); } return data()->AsMap()->supports_fast_array_resize(); @@ -2865,11 +2906,10 @@ bool MapRef::supports_fast_array_resize() const { int JSFunctionRef::InitialMapInstanceSizeWithMinSlack() const { if (data_->should_access_heap()) { - DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject); - AllowHandleDereferenceIf allow_handle_dereference(data()->kind(), - broker()->mode()); - AllowHandleAllocationIf allow_handle_allocation(data()->kind(), - broker()->mode()); + AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(), + broker()->mode()); + AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(), + broker()->mode()); return object()->ComputeInstanceSizeWithMinSlack(broker()->isolate()); } return data()->AsJSFunction()->initial_map_instance_size_with_min_slack(); @@ -2904,11 +2944,10 @@ OddballType MapRef::oddball_type() const { FeedbackCellRef FeedbackVectorRef::GetClosureFeedbackCell(int index) const { if (data_->should_access_heap()) { - DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject); - AllowHandleAllocationIf allow_handle_allocation(data()->kind(), - broker()->mode()); - AllowHandleDereferenceIf allow_handle_dereference(data()->kind(), - broker()->mode()); + AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(), + broker()->mode()); + AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(), + broker()->mode()); return FeedbackCellRef(broker(), object()->GetClosureFeedbackCell(index)); } @@ -2919,9 +2958,8 @@ FeedbackCellRef FeedbackVectorRef::GetClosureFeedbackCell(int index) const { double JSObjectRef::RawFastDoublePropertyAt(FieldIndex index) const { if (data_->should_access_heap()) { - DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject); - AllowHandleDereferenceIf allow_handle_dereference(data()->kind(), - broker()->mode()); + AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(), + broker()->mode()); return object()->RawFastDoublePropertyAt(index); } JSObjectData* object_data = data()->AsJSObject(); @@ -2931,9 +2969,8 @@ double JSObjectRef::RawFastDoublePropertyAt(FieldIndex index) const { uint64_t JSObjectRef::RawFastDoublePropertyAsBitsAt(FieldIndex index) const { if (data_->should_access_heap()) { - DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject); - AllowHandleDereferenceIf allow_handle_dereference(data()->kind(), - broker()->mode()); + AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(), + broker()->mode()); return object()->RawFastDoublePropertyAsBitsAt(index); } JSObjectData* object_data = data()->AsJSObject(); @@ -2943,13 +2980,12 @@ uint64_t JSObjectRef::RawFastDoublePropertyAsBitsAt(FieldIndex index) const { ObjectRef JSObjectRef::RawFastPropertyAt(FieldIndex index) const { if (data_->should_access_heap()) { - DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject); - AllowHandleAllocationIf allow_handle_allocation(data()->kind(), - broker()->mode()); - AllowHandleDereferenceIf allow_handle_dereference(data()->kind(), - broker()->mode()); - return ObjectRef(broker(), handle(object()->RawFastPropertyAt(index), - broker()->isolate())); + AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(), + broker()->mode()); + AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(), + broker()->mode()); + return ObjectRef(broker(), broker()->CanonicalPersistentHandle( + object()->RawFastPropertyAt(index))); } JSObjectData* object_data = data()->AsJSObject(); CHECK(index.is_inobject()); @@ -2960,13 +2996,13 @@ ObjectRef JSObjectRef::RawFastPropertyAt(FieldIndex index) const { bool AllocationSiteRef::IsFastLiteral() const { if (data_->should_access_heap()) { - DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject); - AllowHeapAllocationIf allow_heap_allocation( + CHECK_NE(data_->kind(), ObjectDataKind::kNeverSerializedHeapObject); + AllowHeapAllocationIfNeeded allow_heap_allocation( data()->kind(), broker()->mode()); // For TryMigrateInstance. - AllowHandleAllocationIf allow_handle_allocation(data()->kind(), - broker()->mode()); - AllowHandleDereferenceIf allow_handle_dereference(data()->kind(), - broker()->mode()); + AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(), + broker()->mode()); + AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(), + broker()->mode()); return IsInlinableFastLiteral( handle(object()->boilerplate(), broker()->isolate())); } @@ -2974,24 +3010,25 @@ bool AllocationSiteRef::IsFastLiteral() const { } void AllocationSiteRef::SerializeBoilerplate() { + if (data_->should_access_heap()) return; CHECK_EQ(broker()->mode(), JSHeapBroker::kSerializing); data()->AsAllocationSite()->SerializeBoilerplate(broker()); } void JSObjectRef::SerializeElements() { + if (data_->should_access_heap()) return; CHECK_EQ(broker()->mode(), JSHeapBroker::kSerializing); data()->AsJSObject()->SerializeElements(broker()); } void JSObjectRef::EnsureElementsTenured() { if (data_->should_access_heap()) { - DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject); - AllowHandleAllocationIf allow_handle_allocation(data()->kind(), - broker()->mode()); - AllowHandleDereferenceIf allow_handle_dereference(data()->kind(), + AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(), + broker()->mode()); + AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(), + broker()->mode()); + AllowHeapAllocationIfNeeded allow_heap_allocation(data()->kind(), broker()->mode()); - AllowHeapAllocationIf allow_heap_allocation(data()->kind(), - broker()->mode()); Handle object_elements = elements().object(); if (ObjectInYoungGeneration(*object_elements)) { @@ -3010,8 +3047,8 @@ void JSObjectRef::EnsureElementsTenured() { FieldIndex MapRef::GetFieldIndexFor(InternalIndex descriptor_index) const { if (data_->should_access_heap()) { - AllowHandleDereferenceIf allow_handle_dereference(data()->kind(), - broker()->mode()); + AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(), + broker()->mode()); return FieldIndex::ForDescriptor(*object(), descriptor_index); } DescriptorArrayData* descriptors = data()->AsMap()->instance_descriptors(); @@ -3020,8 +3057,8 @@ FieldIndex MapRef::GetFieldIndexFor(InternalIndex descriptor_index) const { int MapRef::GetInObjectPropertyOffset(int i) const { if (data_->should_access_heap()) { - AllowHandleDereferenceIf allow_handle_dereference(data()->kind(), - broker()->mode()); + AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(), + broker()->mode()); return object()->GetInObjectPropertyOffset(i); } return (GetInObjectPropertiesStartInWords() + i) * kTaggedSize; @@ -3030,8 +3067,8 @@ int MapRef::GetInObjectPropertyOffset(int i) const { PropertyDetails MapRef::GetPropertyDetails( InternalIndex descriptor_index) const { if (data_->should_access_heap()) { - AllowHandleDereferenceIf allow_handle_dereference(data()->kind(), - broker()->mode()); + AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(), + broker()->mode()); return object()->instance_descriptors().GetDetails(descriptor_index); } DescriptorArrayData* descriptors = data()->AsMap()->instance_descriptors(); @@ -3040,14 +3077,14 @@ PropertyDetails MapRef::GetPropertyDetails( NameRef MapRef::GetPropertyKey(InternalIndex descriptor_index) const { if (data_->should_access_heap()) { - AllowHandleAllocationIf allow_handle_allocation(data()->kind(), - broker()->mode()); - AllowHandleDereferenceIf allow_handle_dereference(data()->kind(), - broker()->mode()); + AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(), + broker()->mode()); + AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(), + broker()->mode()); return NameRef( broker(), - handle(object()->instance_descriptors().GetKey(descriptor_index), - broker()->isolate())); + broker()->CanonicalPersistentHandle( + object()->instance_descriptors().GetKey(descriptor_index))); } DescriptorArrayData* descriptors = data()->AsMap()->instance_descriptors(); return NameRef(broker(), @@ -3066,10 +3103,10 @@ bool MapRef::IsPrimitiveMap() const { MapRef MapRef::FindFieldOwner(InternalIndex descriptor_index) const { if (data_->should_access_heap()) { - AllowHandleAllocationIf allow_handle_allocation(data()->kind(), - broker()->mode()); - AllowHandleDereferenceIf allow_handle_dereference(data()->kind(), - broker()->mode()); + AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(), + broker()->mode()); + AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(), + broker()->mode()); Handle owner( object()->FindFieldOwner(broker()->isolate(), descriptor_index), broker()->isolate()); @@ -3083,10 +3120,10 @@ MapRef MapRef::FindFieldOwner(InternalIndex descriptor_index) const { ObjectRef MapRef::GetFieldType(InternalIndex descriptor_index) const { if (data_->should_access_heap()) { - AllowHandleAllocationIf allow_handle_allocation(data()->kind(), - broker()->mode()); - AllowHandleDereferenceIf allow_handle_dereference(data()->kind(), - broker()->mode()); + AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(), + broker()->mode()); + AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(), + broker()->mode()); Handle field_type( object()->instance_descriptors().GetFieldType(descriptor_index), broker()->isolate()); @@ -3100,8 +3137,8 @@ ObjectRef MapRef::GetFieldType(InternalIndex descriptor_index) const { bool MapRef::IsUnboxedDoubleField(InternalIndex descriptor_index) const { if (data_->should_access_heap()) { - AllowHandleDereferenceIf allow_handle_dereference(data()->kind(), - broker()->mode()); + AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(), + broker()->mode()); return object()->IsUnboxedDoubleField( FieldIndex::ForDescriptor(*object(), descriptor_index)); } @@ -3113,8 +3150,8 @@ bool MapRef::IsUnboxedDoubleField(InternalIndex descriptor_index) const { uint16_t StringRef::GetFirstChar() { if (data_->should_access_heap()) { - AllowHandleDereferenceIf allow_handle_dereference(data()->kind(), - broker()->mode()); + AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(), + broker()->mode()); return object()->Get(0); } return data()->AsString()->first_char(); @@ -3122,12 +3159,12 @@ uint16_t StringRef::GetFirstChar() { base::Optional StringRef::ToNumber() { if (data_->should_access_heap()) { - AllowHandleDereferenceIf allow_handle_dereference(data()->kind(), + AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(), + broker()->mode()); + AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(), + broker()->mode()); + AllowHeapAllocationIfNeeded allow_heap_allocation(data()->kind(), broker()->mode()); - AllowHandleAllocationIf allow_handle_allocation(data()->kind(), - broker()->mode()); - AllowHeapAllocationIf allow_heap_allocation(data()->kind(), - broker()->mode()); int flags = ALLOW_HEX | ALLOW_OCTAL | ALLOW_BINARY; return StringToDouble(broker()->isolate(), object(), flags); } @@ -3136,50 +3173,33 @@ base::Optional StringRef::ToNumber() { int ArrayBoilerplateDescriptionRef::constants_elements_length() const { if (data_->should_access_heap()) { - AllowHandleDereferenceIf allow_handle_dereference(data()->kind(), - broker()->mode()); + AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(), + broker()->mode()); return object()->constant_elements().length(); } return data()->AsArrayBoilerplateDescription()->constants_elements_length(); } -int ObjectBoilerplateDescriptionRef::size() const { - if (data_->should_access_heap()) { - AllowHandleDereferenceIf allow_handle_dereference(data()->kind(), - broker()->mode()); - return object()->size(); - } - return data()->AsObjectBoilerplateDescription()->size(); -} - ObjectRef FixedArrayRef::get(int i) const { if (data_->should_access_heap()) { - AllowHandleAllocationIf allow_handle_allocation(data()->kind(), - broker()->mode()); - AllowHandleDereferenceIf allow_handle_dereference(data()->kind(), - broker()->mode()); - return ObjectRef(broker(), handle(object()->get(i), broker()->isolate())); + AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(), + broker()->mode()); + AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(), + broker()->mode()); + return ObjectRef(broker(), + broker()->CanonicalPersistentHandle(object()->get(i))); } return ObjectRef(broker(), data()->AsFixedArray()->Get(i)); } -bool FixedDoubleArrayRef::is_the_hole(int i) const { - if (data_->should_access_heap()) { - AllowHandleDereferenceIf allow_handle_dereference(data()->kind(), - broker()->mode()); - return object()->is_the_hole(i); - } - return data()->AsFixedDoubleArray()->Get(i).is_hole_nan(); -} - -double FixedDoubleArrayRef::get_scalar(int i) const { +Float64 FixedDoubleArrayRef::get(int i) const { if (data_->should_access_heap()) { - AllowHandleDereferenceIf allow_handle_dereference(data()->kind(), - broker()->mode()); - return object()->get_scalar(i); + AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(), + broker()->mode()); + return Float64::FromBits(object()->get_representation(i)); + } else { + return data()->AsFixedDoubleArray()->Get(i); } - CHECK(!data()->AsFixedDoubleArray()->Get(i).is_hole_nan()); - return data()->AsFixedDoubleArray()->Get(i).get_scalar(); } uint8_t BytecodeArrayRef::get(int index) const { return object()->get(index); } @@ -3190,12 +3210,12 @@ Address BytecodeArrayRef::GetFirstBytecodeAddress() const { Handle BytecodeArrayRef::GetConstantAtIndex(int index) const { if (data_->should_access_heap()) { - DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject); - AllowHandleAllocationIf allow_handle_allocation(data()->kind(), - broker()->mode()); - AllowHandleDereferenceIf allow_handle_dereference(data()->kind(), - broker()->mode()); - return handle(object()->constant_pool().get(index), broker()->isolate()); + AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(), + broker()->mode()); + AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(), + broker()->mode()); + return broker()->CanonicalPersistentHandle( + object()->constant_pool().get(index)); } return data()->AsBytecodeArray()->GetConstantAtIndex(index, broker()->isolate()); @@ -3203,11 +3223,10 @@ Handle BytecodeArrayRef::GetConstantAtIndex(int index) const { bool BytecodeArrayRef::IsConstantAtIndexSmi(int index) const { if (data_->should_access_heap()) { - DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject); - AllowHandleAllocationIf allow_handle_allocation(data()->kind(), - broker()->mode()); - AllowHandleDereferenceIf allow_handle_dereference(data()->kind(), - broker()->mode()); + AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(), + broker()->mode()); + AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(), + broker()->mode()); return object()->constant_pool().get(index).IsSmi(); } return data()->AsBytecodeArray()->IsConstantAtIndexSmi(index); @@ -3215,25 +3234,22 @@ bool BytecodeArrayRef::IsConstantAtIndexSmi(int index) const { Smi BytecodeArrayRef::GetConstantAtIndexAsSmi(int index) const { if (data_->should_access_heap()) { - DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject); - AllowHandleAllocationIf allow_handle_allocation(data()->kind(), - broker()->mode()); - AllowHandleDereferenceIf allow_handle_dereference(data()->kind(), - broker()->mode()); + AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(), + broker()->mode()); + AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(), + broker()->mode()); return Smi::cast(object()->constant_pool().get(index)); } return data()->AsBytecodeArray()->GetConstantAtIndexAsSmi(index); } void BytecodeArrayRef::SerializeForCompilation() { - DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject); if (data_->should_access_heap()) return; data()->AsBytecodeArray()->SerializeForCompilation(broker()); } -Handle BytecodeArrayRef::source_positions() const { - return broker()->CanonicalPersistentHandle( - object()->SourcePositionTableIfCollected()); +Handle BytecodeArrayRef::SourcePositionTable() const { + return broker()->CanonicalPersistentHandle(object()->SourcePositionTable()); } Address BytecodeArrayRef::handler_table_address() const { @@ -3245,86 +3261,87 @@ int BytecodeArrayRef::handler_table_size() const { return object()->handler_table().length(); } -Handle JSHeapBroker::GetRootHandle(Object object) { - RootIndex root_index; - CHECK(root_index_map().Lookup(object.ptr(), &root_index)); - return Handle(isolate()->root_handle(root_index).location()); -} - -// Accessors for direct heap reads. -#define DIRECT_HEAP_ACCESSOR_C(holder, result, name) \ - result holder##Ref::name() const { return object()->name(); } +#define IF_ACCESS_FROM_HEAP_C(name) \ + if (data_->should_access_heap()) { \ + AllowHandleAllocationIfNeeded handle_allocation(data_->kind(), \ + broker()->mode()); \ + AllowHandleDereferenceIfNeeded allow_handle_dereference(data_->kind(), \ + broker()->mode()); \ + return object()->name(); \ + } -#define IF_ACCESS_FROM_HEAP_C(holder, name) \ - if (data_->should_access_heap()) { \ - CHECK(broker()->mode() == JSHeapBroker::kDisabled || \ - ReadOnlyHeap::Contains(HeapObject::cast(*object()))); \ - AllowHandleAllocationIf handle_allocation(data_->kind(), \ - broker()->mode()); \ - AllowHandleDereferenceIf allow_handle_dereference(data_->kind(), \ - broker()->mode()); \ - return object()->name(); \ +#define IF_ACCESS_FROM_HEAP(result, name) \ + if (data_->should_access_heap()) { \ + AllowHandleAllocationIfNeeded handle_allocation(data_->kind(), \ + broker()->mode()); \ + AllowHandleDereferenceIfNeeded handle_dereference(data_->kind(), \ + broker()->mode()); \ + return result##Ref(broker(), \ + broker()->CanonicalPersistentHandle(object()->name())); \ } -#define IF_ACCESS_FROM_HEAP(holder, result, name) \ - if (data_->kind() == ObjectDataKind::kUnserializedHeapObject) { \ - AllowHandleAllocationIf handle_allocation(data_->kind(), \ - broker()->mode()); \ - AllowHandleDereferenceIf handle_dereference(data_->kind(), \ - broker()->mode()); \ - return result##Ref(broker(), \ - handle(object()->name(), broker()->isolate())); \ - } else if (data_->kind() == \ - ObjectDataKind::kUnserializedReadOnlyHeapObject) { \ - AllowHandleDereferenceIf handle_dereference(data_->kind(), \ - broker()->mode()); \ - return result##Ref(broker(), broker()->GetRootHandle(object()->name())); \ - } - -// Macros for definining a const getter that, depending on the broker mode, -// either looks into the handle or into the serialized data. -#define BIMODAL_ACCESSOR(holder, result, name) \ - result##Ref holder##Ref::name() const { \ - IF_ACCESS_FROM_HEAP(holder, result, name); \ - ObjectData* data = ObjectRef::data()->As##holder()->name(); \ - if (data->kind() == ObjectDataKind::kUnserializedHeapObject) { \ - return result##Ref(broker(), data->object()); \ - } else { \ - return result##Ref(broker(), ObjectRef::data()->As##holder()->name()); \ - } \ +// Macros for definining a const getter that, depending on the data kind, +// either looks into the heap or into the serialized data. +#define BIMODAL_ACCESSOR(holder, result, name) \ + result##Ref holder##Ref::name() const { \ + IF_ACCESS_FROM_HEAP(result, name); \ + return result##Ref(broker(), ObjectRef::data()->As##holder()->name()); \ } // Like above except that the result type is not an XYZRef. #define BIMODAL_ACCESSOR_C(holder, result, name) \ result holder##Ref::name() const { \ - IF_ACCESS_FROM_HEAP_C(holder, name); \ + IF_ACCESS_FROM_HEAP_C(name); \ return ObjectRef::data()->As##holder()->name(); \ } // Like above but for BitFields. #define BIMODAL_ACCESSOR_B(holder, field, name, BitField) \ typename BitField::FieldType holder##Ref::name() const { \ - IF_ACCESS_FROM_HEAP_C(holder, name); \ + IF_ACCESS_FROM_HEAP_C(name); \ return BitField::decode(ObjectRef::data()->As##holder()->field()); \ } +// Like IF_ACCESS_FROM_HEAP_C but we also allow direct heap access for +// kSerialized only for methods that we identified to be safe. +#define IF_ACCESS_FROM_HEAP_WITH_FLAG_C(name) \ + if (data_->should_access_heap() || FLAG_turbo_direct_heap_access) { \ + AllowHandleAllocationIfNeeded handle_allocation( \ + data_->kind(), broker()->mode(), FLAG_turbo_direct_heap_access); \ + AllowHandleDereferenceIfNeeded allow_handle_dereference( \ + data_->kind(), broker()->mode(), FLAG_turbo_direct_heap_access); \ + return object()->name(); \ + } + +// Like BIMODAL_ACCESSOR_C except that we force a direct heap access if +// FLAG_turbo_direct_heap_access is true (even for kSerialized). This is because +// we identified the method to be safe to use direct heap access, but the +// holder##Data class still needs to be serialized. +#define BIMODAL_ACCESSOR_WITH_FLAG_C(holder, result, name) \ + result holder##Ref::name() const { \ + IF_ACCESS_FROM_HEAP_WITH_FLAG_C(name); \ + return ObjectRef::data()->As##holder()->name(); \ + } + BIMODAL_ACCESSOR(AllocationSite, Object, nested_site) BIMODAL_ACCESSOR_C(AllocationSite, bool, CanInlineCall) BIMODAL_ACCESSOR_C(AllocationSite, bool, PointsToLiteral) BIMODAL_ACCESSOR_C(AllocationSite, ElementsKind, GetElementsKind) BIMODAL_ACCESSOR_C(AllocationSite, AllocationType, GetAllocationType) -DIRECT_HEAP_ACCESSOR_C(BytecodeArray, int, register_count) -DIRECT_HEAP_ACCESSOR_C(BytecodeArray, int, parameter_count) -DIRECT_HEAP_ACCESSOR_C(BytecodeArray, interpreter::Register, - incoming_new_target_or_generator_register) +BIMODAL_ACCESSOR_C(BigInt, uint64_t, AsUint64) -BIMODAL_ACCESSOR(Cell, Object, value) +BIMODAL_ACCESSOR_C(BytecodeArray, int, register_count) +BIMODAL_ACCESSOR_C(BytecodeArray, int, parameter_count) +BIMODAL_ACCESSOR_C(BytecodeArray, interpreter::Register, + incoming_new_target_or_generator_register) BIMODAL_ACCESSOR_C(FeedbackVector, double, invocation_count) BIMODAL_ACCESSOR(HeapObject, Map, map) +BIMODAL_ACCESSOR_C(HeapNumber, double, value) + BIMODAL_ACCESSOR(JSArray, Object, length) BIMODAL_ACCESSOR(JSBoundFunction, JSReceiver, bound_target_function) @@ -3332,7 +3349,6 @@ BIMODAL_ACCESSOR(JSBoundFunction, Object, bound_this) BIMODAL_ACCESSOR(JSBoundFunction, FixedArray, bound_arguments) BIMODAL_ACCESSOR_C(JSDataView, size_t, byte_length) -BIMODAL_ACCESSOR_C(JSDataView, size_t, byte_offset) BIMODAL_ACCESSOR_C(JSFunction, bool, has_feedback_vector) BIMODAL_ACCESSOR_C(JSFunction, bool, has_initial_map) @@ -3388,28 +3404,27 @@ BIMODAL_ACCESSOR_C(Code, unsigned, inlined_bytecode_size) BROKER_NATIVE_CONTEXT_FIELDS(DEF_NATIVE_CONTEXT_ACCESSOR) #undef DEF_NATIVE_CONTEXT_ACCESSOR +BIMODAL_ACCESSOR_C(ObjectBoilerplateDescription, int, size) + BIMODAL_ACCESSOR(PropertyCell, Object, value) BIMODAL_ACCESSOR_C(PropertyCell, PropertyDetails, property_details) base::Optional FunctionTemplateInfoRef::call_code() const { if (data_->should_access_heap()) { - DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject); return CallHandlerInfoRef( - broker(), handle(object()->call_code(), broker()->isolate())); + broker(), broker()->CanonicalPersistentHandle(object()->call_code())); } - CallHandlerInfoData* call_code = - data()->AsFunctionTemplateInfo()->call_code(); + ObjectData* call_code = data()->AsFunctionTemplateInfo()->call_code(); if (!call_code) return base::nullopt; return CallHandlerInfoRef(broker(), call_code); } bool FunctionTemplateInfoRef::is_signature_undefined() const { if (data_->should_access_heap()) { - DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject); - AllowHandleDereferenceIf allow_handle_dereference(data()->kind(), - broker()->mode()); - AllowHandleAllocationIf allow_handle_allocation(data()->kind(), - broker()->mode()); + AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(), + broker()->mode()); + AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(), + broker()->mode()); return object()->signature().IsUndefined(broker()->isolate()); } @@ -3418,11 +3433,10 @@ bool FunctionTemplateInfoRef::is_signature_undefined() const { bool FunctionTemplateInfoRef::has_call_code() const { if (data_->should_access_heap()) { - DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject); - AllowHandleDereferenceIf allow_handle_dereference(data()->kind(), - broker()->mode()); - AllowHandleAllocationIf allow_handle_allocation(data()->kind(), - broker()->mode()); + AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(), + broker()->mode()); + AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(), + broker()->mode()); CallOptimization call_optimization(broker()->isolate(), object()); return call_optimization.is_simple_api_call(); @@ -3437,11 +3451,10 @@ HolderLookupResult FunctionTemplateInfoRef::LookupHolderOfExpectedType( const HolderLookupResult not_found; if (data_->should_access_heap()) { - DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject); - AllowHandleDereferenceIf allow_handle_dereference(data()->kind(), - broker()->mode()); - AllowHandleAllocationIf allow_handle_allocation(data()->kind(), - broker()->mode()); + AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(), + broker()->mode()); + AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(), + broker()->mode()); CallOptimization call_optimization(broker()->isolate(), object()); Handle receiver_map_ref(receiver_map.object()); @@ -3468,7 +3481,7 @@ HolderLookupResult FunctionTemplateInfoRef::LookupHolderOfExpectedType( FunctionTemplateInfoData* fti_data = data()->AsFunctionTemplateInfo(); KnownReceiversMap::iterator lookup_it = - fti_data->known_receivers().find(receiver_map.data()->AsMap()); + fti_data->known_receivers().find(receiver_map.data()); if (lookup_it != fti_data->known_receivers().cend()) { return lookup_it->second; } @@ -3479,8 +3492,7 @@ HolderLookupResult FunctionTemplateInfoRef::LookupHolderOfExpectedType( } if (!receiver_map.IsJSReceiverMap() || (receiver_map.is_access_check_needed() && !accept_any_receiver())) { - fti_data->known_receivers().insert( - {receiver_map.data()->AsMap(), not_found}); + fti_data->known_receivers().insert({receiver_map.data(), not_found}); return not_found; } @@ -3492,14 +3504,12 @@ HolderLookupResult FunctionTemplateInfoRef::LookupHolderOfExpectedType( switch (result.lookup) { case CallOptimization::kHolderFound: { result.holder = JSObjectRef(broker(), holder); - fti_data->known_receivers().insert( - {receiver_map.data()->AsMap(), result}); + fti_data->known_receivers().insert({receiver_map.data(), result}); break; } default: { DCHECK_EQ(result.holder, base::nullopt); - fti_data->known_receivers().insert( - {receiver_map.data()->AsMap(), result}); + fti_data->known_receivers().insert({receiver_map.data(), result}); } } return result; @@ -3521,13 +3531,13 @@ BIMODAL_ACCESSOR(FeedbackCell, HeapObject, value) base::Optional MapRef::GetStrongValue( InternalIndex descriptor_index) const { if (data_->should_access_heap()) { - AllowHandleDereferenceIf allow_handle_dereference(data()->kind(), - broker()->mode()); + AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(), + broker()->mode()); MaybeObject value = object()->instance_descriptors().GetValue(descriptor_index); HeapObject object; if (value.GetHeapObjectIfStrong(&object)) { - return ObjectRef(broker(), handle(object, broker()->isolate())); + return ObjectRef(broker(), broker()->CanonicalPersistentHandle((object))); } return base::nullopt; } @@ -3545,19 +3555,14 @@ void MapRef::SerializeRootMap() { } base::Optional MapRef::FindRootMap() const { - if (data_->kind() == ObjectDataKind::kUnserializedHeapObject) { - AllowHandleDereferenceIf allow_handle_dereference(data()->kind(), - broker()->mode()); - return MapRef(broker(), handle(object()->FindRootMap(broker()->isolate()), - broker()->isolate())); - } else if (data_->kind() == ObjectDataKind::kUnserializedReadOnlyHeapObject) { - AllowHandleDereferenceIf allow_handle_dereference(data()->kind(), - broker()->mode()); - return MapRef(broker(), broker()->GetRootHandle( + if (data_->should_access_heap()) { + AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(), + broker()->mode()); + return MapRef(broker(), broker()->CanonicalPersistentHandle( object()->FindRootMap(broker()->isolate()))); } - MapData* map_data = data()->AsMap()->FindRootMap(); - if (map_data) { + ObjectData* map_data = data()->AsMap()->FindRootMap(); + if (map_data != nullptr) { return MapRef(broker(), map_data); } TRACE_BROKER_MISSING(broker(), "root map for object " << *this); @@ -3566,58 +3571,58 @@ base::Optional MapRef::FindRootMap() const { void* JSTypedArrayRef::data_ptr() const { if (data_->should_access_heap()) { - AllowHandleDereferenceIf allow_handle_dereference(data()->kind(), - broker()->mode()); + AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(), + broker()->mode()); return object()->DataPtr(); } return data()->AsJSTypedArray()->data_ptr(); } bool MapRef::IsInobjectSlackTrackingInProgress() const { - IF_ACCESS_FROM_HEAP_C(Map, IsInobjectSlackTrackingInProgress); + IF_ACCESS_FROM_HEAP_C(IsInobjectSlackTrackingInProgress); return Map::Bits3::ConstructionCounterBits::decode( data()->AsMap()->bit_field3()) != Map::kNoSlackTracking; } int MapRef::constructor_function_index() const { - IF_ACCESS_FROM_HEAP_C(Map, GetConstructorFunctionIndex); + IF_ACCESS_FROM_HEAP_C(GetConstructorFunctionIndex); CHECK(IsPrimitiveMap()); return data()->AsMap()->constructor_function_index(); } bool MapRef::is_stable() const { - IF_ACCESS_FROM_HEAP_C(Map, is_stable); + IF_ACCESS_FROM_HEAP_C(is_stable); return !Map::Bits3::IsUnstableBit::decode(data()->AsMap()->bit_field3()); } bool MapRef::CanBeDeprecated() const { - IF_ACCESS_FROM_HEAP_C(Map, CanBeDeprecated); + IF_ACCESS_FROM_HEAP_C(CanBeDeprecated); CHECK_GT(NumberOfOwnDescriptors(), 0); return data()->AsMap()->can_be_deprecated(); } bool MapRef::CanTransition() const { - IF_ACCESS_FROM_HEAP_C(Map, CanTransition); + IF_ACCESS_FROM_HEAP_C(CanTransition); return data()->AsMap()->can_transition(); } int MapRef::GetInObjectPropertiesStartInWords() const { - IF_ACCESS_FROM_HEAP_C(Map, GetInObjectPropertiesStartInWords); + IF_ACCESS_FROM_HEAP_C(GetInObjectPropertiesStartInWords); return data()->AsMap()->in_object_properties_start_in_words(); } int MapRef::GetInObjectProperties() const { - IF_ACCESS_FROM_HEAP_C(Map, GetInObjectProperties); + IF_ACCESS_FROM_HEAP_C(GetInObjectProperties); return data()->AsMap()->in_object_properties(); } int ScopeInfoRef::ContextLength() const { - IF_ACCESS_FROM_HEAP_C(ScopeInfo, ContextLength); + IF_ACCESS_FROM_HEAP_C(ContextLength); return data()->AsScopeInfo()->context_length(); } int ScopeInfoRef::Flags() const { - IF_ACCESS_FROM_HEAP_C(ScopeInfo, Flags); + IF_ACCESS_FROM_HEAP_C(Flags); return data()->AsScopeInfo()->flags(); } @@ -3626,30 +3631,30 @@ bool ScopeInfoRef::HasContextExtension() const { } bool ScopeInfoRef::HasOuterScopeInfo() const { - IF_ACCESS_FROM_HEAP_C(ScopeInfo, HasOuterScopeInfo); + IF_ACCESS_FROM_HEAP_C(HasOuterScopeInfo); return data()->AsScopeInfo()->has_outer_scope_info(); } ScopeInfoRef ScopeInfoRef::OuterScopeInfo() const { if (data_->should_access_heap()) { - DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject); - AllowHandleAllocationIf allow_handle_allocation(data()->kind(), - broker()->mode()); - AllowHandleDereferenceIf allow_handle_dereference(data()->kind(), - broker()->mode()); - return ScopeInfoRef( - broker(), handle(object()->OuterScopeInfo(), broker()->isolate())); + AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(), + broker()->mode()); + AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(), + broker()->mode()); + return ScopeInfoRef(broker(), broker()->CanonicalPersistentHandle( + object()->OuterScopeInfo())); } return ScopeInfoRef(broker(), data()->AsScopeInfo()->outer_scope_info()); } void ScopeInfoRef::SerializeScopeInfoChain() { + if (data_->should_access_heap()) return; CHECK_EQ(broker()->mode(), JSHeapBroker::kSerializing); data()->AsScopeInfo()->SerializeScopeInfoChain(broker()); } bool StringRef::IsExternalString() const { - IF_ACCESS_FROM_HEAP_C(String, IsExternalString); + IF_ACCESS_FROM_HEAP_C(IsExternalString); return data()->AsString()->is_external_string(); } @@ -3661,47 +3666,45 @@ Address CallHandlerInfoRef::callback() const { } Address FunctionTemplateInfoRef::c_function() const { - if (broker()->mode() == JSHeapBroker::kDisabled) { + if (data_->should_access_heap()) { return v8::ToCData
(object()->GetCFunction()); } return HeapObjectRef::data()->AsFunctionTemplateInfo()->c_function(); } const CFunctionInfo* FunctionTemplateInfoRef::c_signature() const { - if (broker()->mode() == JSHeapBroker::kDisabled) { + if (data_->should_access_heap()) { return v8::ToCData(object()->GetCSignature()); } return HeapObjectRef::data()->AsFunctionTemplateInfo()->c_signature(); } bool StringRef::IsSeqString() const { - IF_ACCESS_FROM_HEAP_C(String, IsSeqString); + IF_ACCESS_FROM_HEAP_C(IsSeqString); return data()->AsString()->is_seq_string(); } ScopeInfoRef NativeContextRef::scope_info() const { if (data_->should_access_heap()) { - DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject); - AllowHandleAllocationIf allow_handle_allocation(data()->kind(), - broker()->mode()); - AllowHandleDereferenceIf allow_handle_dereference(data()->kind(), - broker()->mode()); - return ScopeInfoRef(broker(), - handle(object()->scope_info(), broker()->isolate())); + AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(), + broker()->mode()); + AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(), + broker()->mode()); + return ScopeInfoRef( + broker(), broker()->CanonicalPersistentHandle(object()->scope_info())); } return ScopeInfoRef(broker(), data()->AsNativeContext()->scope_info()); } SharedFunctionInfoRef FeedbackVectorRef::shared_function_info() const { if (data_->should_access_heap()) { - DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject); - AllowHandleAllocationIf allow_handle_allocation(data()->kind(), - broker()->mode()); - AllowHandleDereferenceIf allow_handle_dereference(data()->kind(), - broker()->mode()); + AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(), + broker()->mode()); + AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(), + broker()->mode()); return SharedFunctionInfoRef( broker(), - handle(object()->shared_function_info(), broker()->isolate())); + broker()->CanonicalPersistentHandle(object()->shared_function_info())); } return SharedFunctionInfoRef( @@ -3771,8 +3774,8 @@ bool ObjectRef::IsTheHole() const { bool ObjectRef::BooleanValue() const { if (data_->should_access_heap()) { - AllowHandleDereferenceIf allow_handle_dereference(data()->kind(), - broker()->mode()); + AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(), + broker()->mode()); return object()->BooleanValue(broker()->isolate()); } return IsSmi() ? (AsSmi() != 0) : data()->AsHeapObject()->boolean_value(); @@ -3805,18 +3808,22 @@ Maybe ObjectRef::OddballToNumber() const { base::Optional ObjectRef::GetOwnConstantElement( uint32_t index, SerializationPolicy policy) const { - if (data_->kind() == ObjectDataKind::kUnserializedHeapObject) { - return (IsJSObject() || IsString()) - ? GetOwnElementFromHeap(broker(), object(), index, true) - : base::nullopt; - } else if (data_->kind() == ObjectDataKind::kUnserializedReadOnlyHeapObject) { - DCHECK(!IsJSObject()); - // TODO(mythria): For ReadOnly strings, currently we cannot access data from - // heap without creating handles since we use LookupIterator. We should have - // a custom implementation for read only strings that doesn't create - // handles. Till then it is OK to disable this optimization since this only - // impacts keyed accesses on read only strings. - return base::nullopt; + if (!(IsJSObject() || IsString())) return base::nullopt; + if (data_->should_access_heap()) { + // TODO(neis): Once the CHECK_NE below is eliminated, i.e. once we can + // safely read from the background thread, the special branch for read-only + // objects can be removed as well. + if (data_->kind() == ObjectDataKind::kUnserializedReadOnlyHeapObject) { + DCHECK(IsString()); + // TODO(mythria): For ReadOnly strings, currently we cannot access data + // from heap without creating handles since we use LookupIterator. We + // should have a custom implementation for read only strings that doesn't + // create handles. Till then it is OK to disable this optimization since + // this only impacts keyed accesses on read only strings. + return base::nullopt; + } + CHECK_NE(data_->kind(), ObjectDataKind::kNeverSerializedHeapObject); + return GetOwnElementFromHeap(broker(), object(), index, true); } ObjectData* element = nullptr; if (IsJSObject()) { @@ -3833,7 +3840,6 @@ base::Optional JSObjectRef::GetOwnDataProperty( Representation field_representation, FieldIndex index, SerializationPolicy policy) const { if (data_->should_access_heap()) { - DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject); return GetOwnDataPropertyFromHeap(broker(), Handle::cast(object()), field_representation, index); @@ -3865,40 +3871,29 @@ base::Optional JSArrayRef::GetOwnCowElement( return ObjectRef(broker(), element); } -double HeapNumberRef::value() const { - IF_ACCESS_FROM_HEAP_C(HeapNumber, value); - return data()->AsHeapNumber()->value(); -} - -uint64_t BigIntRef::AsUint64() const { - IF_ACCESS_FROM_HEAP_C(BigInt, AsUint64); - return data()->AsBigInt()->AsUint64(); -} - base::Optional SourceTextModuleRef::GetCell(int cell_index) const { - if (data_->should_access_heap()) { - DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject); - AllowHandleAllocationIf allow_handle_allocation(data()->kind(), - broker()->mode()); - AllowHandleDereferenceIf allow_handle_dereference(data()->kind(), - broker()->mode()); - return CellRef(broker(), - handle(object()->GetCell(cell_index), broker()->isolate())); - } - CellData* cell = data()->AsSourceTextModule()->GetCell(broker(), cell_index); + if (data_->should_access_heap() || FLAG_turbo_direct_heap_access) { + AllowHandleAllocationIfNeeded allow_handle_allocation( + data()->kind(), broker()->mode(), FLAG_turbo_direct_heap_access); + AllowHandleDereferenceIfNeeded allow_handle_dereference( + data()->kind(), broker()->mode(), FLAG_turbo_direct_heap_access); + return CellRef(broker(), broker()->CanonicalPersistentHandle( + object()->GetCell(cell_index))); + } + ObjectData* cell = + data()->AsSourceTextModule()->GetCell(broker(), cell_index); if (cell == nullptr) return base::nullopt; return CellRef(broker(), cell); } ObjectRef SourceTextModuleRef::import_meta() const { if (data_->should_access_heap()) { - DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject); - AllowHandleAllocationIf allow_handle_allocation(data()->kind(), - broker()->mode()); - AllowHandleDereferenceIf allow_handle_dereference(data()->kind(), - broker()->mode()); - return ObjectRef(broker(), - handle(object()->import_meta(), broker()->isolate())); + AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(), + broker()->mode()); + AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(), + broker()->mode()); + return ObjectRef( + broker(), broker()->CanonicalPersistentHandle(object()->import_meta())); } return ObjectRef(broker(), data()->AsSourceTextModule()->GetImportMeta(broker())); @@ -3919,7 +3914,7 @@ ObjectRef::ObjectRef(JSHeapBroker* broker, Handle object, RefsMap::Entry* entry = broker->refs_->LookupOrInsert(object.address()); ObjectData** storage = &(entry->value); if (*storage == nullptr) { - AllowHandleDereferenceIf allow_handle_dereference( + AllowHandleDereferenceIfNeeded allow_handle_dereference( kUnserializedHeapObject, broker->mode()); entry->value = broker->zone()->New( broker, storage, object, @@ -3932,8 +3927,8 @@ ObjectRef::ObjectRef(JSHeapBroker* broker, Handle object, UNREACHABLE(); } if (!data_) { // TODO(mslekova): Remove once we're on the background thread. - AllowHandleDereferenceIf allow_handle_dereference(data_->kind(), - broker->mode()); + AllowHandleDereferenceIfNeeded allow_handle_dereference(data_->kind(), + broker->mode()); object->Print(); } CHECK_WITH_MSG(data_ != nullptr, "Object is not known to the heap broker"); @@ -3969,8 +3964,8 @@ OddballType GetOddballType(Isolate* isolate, Map map) { HeapObjectType HeapObjectRef::GetHeapObjectType() const { if (data_->should_access_heap()) { - AllowHandleDereferenceIf allow_handle_dereference(data()->kind(), - broker()->mode()); + AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(), + broker()->mode()); Map map = Handle::cast(object())->map(); HeapObjectType::Flags flags(0); if (map.is_undetectable()) flags |= HeapObjectType::kUndetectable; @@ -3985,15 +3980,14 @@ HeapObjectType HeapObjectRef::GetHeapObjectType() const { } base::Optional AllocationSiteRef::boilerplate() const { if (data_->should_access_heap()) { - DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject); - AllowHandleAllocationIf allow_handle_allocation(data()->kind(), - broker()->mode()); - AllowHandleDereferenceIf allow_handle_dereference(data()->kind(), - broker()->mode()); - return JSObjectRef(broker(), - handle(object()->boilerplate(), broker()->isolate())); - } - JSObjectData* boilerplate = data()->AsAllocationSite()->boilerplate(); + AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(), + broker()->mode()); + AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(), + broker()->mode()); + return JSObjectRef( + broker(), broker()->CanonicalPersistentHandle(object()->boilerplate())); + } + ObjectData* boilerplate = data()->AsAllocationSite()->boilerplate(); if (boilerplate) { return JSObjectRef(broker(), boilerplate); } else { @@ -4007,24 +4001,18 @@ ElementsKind JSObjectRef::GetElementsKind() const { FixedArrayBaseRef JSObjectRef::elements() const { if (data_->should_access_heap()) { - DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject); - AllowHandleAllocationIf allow_handle_allocation(data()->kind(), - broker()->mode()); - AllowHandleDereferenceIf allow_handle_dereference(data()->kind(), - broker()->mode()); - return FixedArrayBaseRef(broker(), - handle(object()->elements(), broker()->isolate())); + AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(), + broker()->mode()); + AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(), + broker()->mode()); + return FixedArrayBaseRef( + broker(), broker()->CanonicalPersistentHandle(object()->elements())); } - ObjectData* elements_data = data()->AsJSObject()->elements(); - if (elements_data->kind() == - ObjectDataKind::kUnserializedReadOnlyHeapObject) { - return FixedArrayBaseRef(broker(), elements_data->object()); - } - return FixedArrayBaseRef(broker(), elements_data->AsFixedArrayBase()); + return FixedArrayBaseRef(broker(), data()->AsJSObject()->elements()); } int FixedArrayBaseRef::length() const { - IF_ACCESS_FROM_HEAP_C(FixedArrayBase, length); + IF_ACCESS_FROM_HEAP_C(length); return data()->AsFixedArrayBase()->length(); } @@ -4051,11 +4039,12 @@ base::Optional FeedbackCellRef::shared_function_info() } void FeedbackVectorRef::Serialize() { + if (data_->should_access_heap()) return; + CHECK_EQ(broker()->mode(), JSHeapBroker::kSerializing); data()->AsFeedbackVector()->Serialize(broker()); } bool FeedbackVectorRef::serialized() const { - DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject); if (data_->should_access_heap()) return true; return data()->AsFeedbackVector()->serialized(); } @@ -4066,32 +4055,33 @@ bool NameRef::IsUniqueName() const { } ObjectRef JSRegExpRef::data() const { - IF_ACCESS_FROM_HEAP(JSRegExp, Object, data); + IF_ACCESS_FROM_HEAP(Object, data); return ObjectRef(broker(), ObjectRef::data()->AsJSRegExp()->data()); } ObjectRef JSRegExpRef::flags() const { - IF_ACCESS_FROM_HEAP(JSRegExp, Object, flags); + IF_ACCESS_FROM_HEAP(Object, flags); return ObjectRef(broker(), ObjectRef::data()->AsJSRegExp()->flags()); } ObjectRef JSRegExpRef::last_index() const { - IF_ACCESS_FROM_HEAP(JSRegExp, Object, last_index); + IF_ACCESS_FROM_HEAP(Object, last_index); return ObjectRef(broker(), ObjectRef::data()->AsJSRegExp()->last_index()); } ObjectRef JSRegExpRef::raw_properties_or_hash() const { - IF_ACCESS_FROM_HEAP(JSRegExp, Object, raw_properties_or_hash); + IF_ACCESS_FROM_HEAP(Object, raw_properties_or_hash); return ObjectRef(broker(), ObjectRef::data()->AsJSRegExp()->raw_properties_or_hash()); } ObjectRef JSRegExpRef::source() const { - IF_ACCESS_FROM_HEAP(JSRegExp, Object, source); + IF_ACCESS_FROM_HEAP(Object, source); return ObjectRef(broker(), ObjectRef::data()->AsJSRegExp()->source()); } void JSRegExpRef::SerializeAsRegExpBoilerplate() { + if (data_->should_access_heap()) return; CHECK_EQ(broker()->mode(), JSHeapBroker::kSerializing); JSObjectRef::data()->AsJSRegExp()->SerializeAsRegExpBoilerplate(broker()); } @@ -4122,7 +4112,8 @@ Handle ObjectRef::object() const { } #endif // DEBUG -HEAP_BROKER_OBJECT_LIST(DEF_OBJECT_GETTER) +HEAP_BROKER_SERIALIZED_OBJECT_LIST(DEF_OBJECT_GETTER) +HEAP_BROKER_NEVER_SERIALIZED_OBJECT_LIST(DEF_OBJECT_GETTER) #undef DEF_OBJECT_GETTER JSHeapBroker* ObjectRef::broker() const { return broker_; } @@ -4163,13 +4154,15 @@ void NativeContextData::Serialize(JSHeapBroker* broker) { TraceScope tracer(broker, this, "NativeContextData::Serialize"); Handle context = Handle::cast(object()); -#define SERIALIZE_MEMBER(type, name) \ - DCHECK_NULL(name##_); \ - name##_ = broker->GetOrCreateData(context->name())->As##type(); \ - if (name##_->IsJSFunction()) name##_->AsJSFunction()->Serialize(broker); \ - if (name##_->IsMap() && \ - !InstanceTypeChecker::IsContext(name##_->AsMap()->instance_type())) { \ - name##_->AsMap()->SerializeConstructor(broker); \ +#define SERIALIZE_MEMBER(type, name) \ + DCHECK_NULL(name##_); \ + name##_ = broker->GetOrCreateData(context->name()); \ + if (!name##_->should_access_heap()) { \ + if (name##_->IsJSFunction()) name##_->AsJSFunction()->Serialize(broker); \ + if (name##_->IsMap() && \ + !InstanceTypeChecker::IsContext(name##_->AsMap()->instance_type())) { \ + name##_->AsMap()->SerializeConstructor(broker); \ + } \ } BROKER_COMPULSORY_NATIVE_CONTEXT_FIELDS(SERIALIZE_MEMBER) if (!broker->isolate()->bootstrapper()->IsActive()) { @@ -4177,35 +4170,37 @@ void NativeContextData::Serialize(JSHeapBroker* broker) { } #undef SERIALIZE_MEMBER - bound_function_with_constructor_map_->SerializePrototype(broker); - bound_function_without_constructor_map_->SerializePrototype(broker); + if (!bound_function_with_constructor_map_->should_access_heap()) { + bound_function_with_constructor_map_->AsMap()->SerializePrototype(broker); + } + if (!bound_function_without_constructor_map_->should_access_heap()) { + bound_function_without_constructor_map_->AsMap()->SerializePrototype( + broker); + } DCHECK(function_maps_.empty()); int const first = Context::FIRST_FUNCTION_MAP_INDEX; int const last = Context::LAST_FUNCTION_MAP_INDEX; function_maps_.reserve(last + 1 - first); for (int i = first; i <= last; ++i) { - function_maps_.push_back(broker->GetOrCreateData(context->get(i))->AsMap()); + function_maps_.push_back(broker->GetOrCreateData(context->get(i))); } - scope_info_ = broker->GetOrCreateData(context->scope_info())->AsScopeInfo(); + scope_info_ = broker->GetOrCreateData(context->scope_info()); } void JSFunctionRef::Serialize() { - DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject); if (data_->should_access_heap()) return; CHECK_EQ(broker()->mode(), JSHeapBroker::kSerializing); data()->AsJSFunction()->Serialize(broker()); } bool JSBoundFunctionRef::serialized() const { - DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject); if (data_->should_access_heap()) return true; return data()->AsJSBoundFunction()->serialized(); } bool JSFunctionRef::serialized() const { - DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject); if (data_->should_access_heap()) return true; return data()->AsJSFunction()->serialized(); } @@ -4225,11 +4220,10 @@ JSArrayRef SharedFunctionInfoRef::GetTemplateObject( } if (data_->should_access_heap()) { - DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject); - AllowHandleAllocationIf allow_handle_allocation(data()->kind(), - broker()->mode()); - AllowHandleDereferenceIf allow_handle_dereference(data()->kind(), - broker()->mode()); + AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(), + broker()->mode()); + AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(), + broker()->mode()); Handle template_object = TemplateObjectDescription::GetTemplateObject( isolate(), broker()->target_native_context().object(), @@ -4237,28 +4231,30 @@ JSArrayRef SharedFunctionInfoRef::GetTemplateObject( return JSArrayRef(broker(), template_object); } - JSArrayData* array = + ObjectData* array = data()->AsSharedFunctionInfo()->GetTemplateObject(source.slot); if (array != nullptr) return JSArrayRef(broker(), array); CHECK_EQ(policy, SerializationPolicy::kSerializeIfNeeded); - CHECK(broker()->SerializingAllowed()); + CHECK_EQ(broker()->mode(), JSHeapBroker::kSerializing); Handle template_object = TemplateObjectDescription::GetTemplateObject( broker()->isolate(), broker()->target_native_context().object(), description.object(), object(), source.slot.ToInt()); - array = broker()->GetOrCreateData(template_object)->AsJSArray(); + array = broker()->GetOrCreateData(template_object); data()->AsSharedFunctionInfo()->SetTemplateObject(source.slot, array); return JSArrayRef(broker(), array); } void SharedFunctionInfoRef::SerializeFunctionTemplateInfo() { + if (data_->should_access_heap()) return; CHECK_EQ(broker()->mode(), JSHeapBroker::kSerializing); data()->AsSharedFunctionInfo()->SerializeFunctionTemplateInfo(broker()); } void SharedFunctionInfoRef::SerializeScopeInfoChain() { + if (data_->should_access_heap()) return; CHECK_EQ(broker()->mode(), JSHeapBroker::kSerializing); data()->AsSharedFunctionInfo()->SerializeScopeInfoChain(broker()); } @@ -4266,39 +4262,37 @@ void SharedFunctionInfoRef::SerializeScopeInfoChain() { base::Optional SharedFunctionInfoRef::function_template_info() const { if (data_->should_access_heap()) { - DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject); if (object()->IsApiFunction()) { return FunctionTemplateInfoRef( - broker(), handle(object()->function_data(), broker()->isolate())); + broker(), + broker()->CanonicalPersistentHandle(object()->function_data())); } return base::nullopt; } - FunctionTemplateInfoData* function_template_info = + ObjectData* function_template_info = data()->AsSharedFunctionInfo()->function_template_info(); if (!function_template_info) return base::nullopt; return FunctionTemplateInfoRef(broker(), function_template_info); } int SharedFunctionInfoRef::context_header_size() const { - IF_ACCESS_FROM_HEAP_C(SharedFunctionInfo, scope_info().ContextHeaderLength); + IF_ACCESS_FROM_HEAP_C(scope_info().ContextHeaderLength); return data()->AsSharedFunctionInfo()->context_header_size(); } ScopeInfoRef SharedFunctionInfoRef::scope_info() const { if (data_->should_access_heap()) { - DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject); - AllowHandleAllocationIf allow_handle_allocation(data()->kind(), - broker()->mode()); - AllowHandleDereferenceIf allow_handle_dereference(data()->kind(), - broker()->mode()); - return ScopeInfoRef(broker(), - handle(object()->scope_info(), broker()->isolate())); + AllowHandleAllocationIfNeeded allow_handle_allocation(data()->kind(), + broker()->mode()); + AllowHandleDereferenceIfNeeded allow_handle_dereference(data()->kind(), + broker()->mode()); + return ScopeInfoRef( + broker(), broker()->CanonicalPersistentHandle(object()->scope_info())); } return ScopeInfoRef(broker(), data()->AsSharedFunctionInfo()->scope_info()); } void JSObjectRef::SerializeObjectCreateMap() { - DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject); if (data_->should_access_heap()) return; CHECK_EQ(broker()->mode(), JSHeapBroker::kSerializing); data()->AsJSObject()->SerializeObjectCreateMap(broker()); @@ -4345,14 +4339,12 @@ bool MapRef::serialized_prototype() const { } void SourceTextModuleRef::Serialize() { - DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject); if (data_->should_access_heap()) return; CHECK_EQ(broker()->mode(), JSHeapBroker::kSerializing); data()->AsSourceTextModule()->Serialize(broker()); } void NativeContextRef::Serialize() { - DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject); if (data_->should_access_heap()) return; CHECK_EQ(broker()->mode(), JSHeapBroker::kSerializing); data()->AsNativeContext()->Serialize(broker()); @@ -4370,21 +4362,18 @@ bool JSTypedArrayRef::serialized() const { } void JSBoundFunctionRef::Serialize() { - DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject); if (data_->should_access_heap()) return; CHECK_EQ(broker()->mode(), JSHeapBroker::kSerializing); data()->AsJSBoundFunction()->Serialize(broker()); } void PropertyCellRef::Serialize() { - DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject); if (data_->should_access_heap()) return; CHECK_EQ(broker()->mode(), JSHeapBroker::kSerializing); data()->AsPropertyCell()->Serialize(broker()); } void FunctionTemplateInfoRef::SerializeCallCode() { - DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject); if (data_->should_access_heap()) return; CHECK_EQ(broker()->mode(), JSHeapBroker::kSerializing); data()->AsFunctionTemplateInfo()->SerializeCallCode(broker()); @@ -4393,12 +4382,10 @@ void FunctionTemplateInfoRef::SerializeCallCode() { base::Optional JSGlobalObjectRef::GetPropertyCell( NameRef const& name, SerializationPolicy policy) const { if (data_->should_access_heap()) { - DCHECK(data_->kind() != ObjectDataKind::kUnserializedReadOnlyHeapObject); return GetPropertyCellFromHeap(broker(), name.object()); } - PropertyCellData* property_cell_data = - data()->AsJSGlobalObject()->GetPropertyCell( - broker(), name.data()->AsName(), policy); + ObjectData* property_cell_data = data()->AsJSGlobalObject()->GetPropertyCell( + broker(), name.data(), policy); if (property_cell_data == nullptr) return base::nullopt; return PropertyCellRef(broker(), property_cell_data); } @@ -4479,7 +4466,6 @@ GlobalAccessFeedback::GlobalAccessFeedback(PropertyCellRef cell, GlobalAccessFeedback::GlobalAccessFeedback(FeedbackSlotKind slot_kind) : ProcessedFeedback(kGlobalAccess, slot_kind), - cell_or_context_(base::nullopt), index_and_immutable_(0 /* doesn't matter */) { DCHECK(IsGlobalICKind(slot_kind)); } @@ -4611,12 +4597,12 @@ bool ElementAccessFeedback::HasOnlyStringMaps(JSHeapBroker* broker) const { } MinimorphicLoadPropertyAccessFeedback::MinimorphicLoadPropertyAccessFeedback( - NameRef const& name, FeedbackSlotKind slot_kind, bool is_monomorphic, - Handle handler, bool has_migration_target_maps) + NameRef const& name, FeedbackSlotKind slot_kind, Handle handler, + MaybeHandle maybe_map, bool has_migration_target_maps) : ProcessedFeedback(kMinimorphicPropertyAccess, slot_kind), name_(name), - is_monomorphic_(is_monomorphic), handler_(handler), + maybe_map_(maybe_map), has_migration_target_maps_(has_migration_target_maps) { DCHECK(IsLoadICKind(slot_kind)); } @@ -4690,11 +4676,22 @@ void FilterRelevantReceiverMaps(Isolate* isolate, MapHandles* maps) { } MaybeObjectHandle TryGetMinimorphicHandler( - std::vector const& maps_and_handlers, - FeedbackSlotKind kind) { + std::vector const& maps_and_handlers, FeedbackSlotKind kind, + Handle native_context) { if (!FLAG_dynamic_map_checks || !IsLoadICKind(kind)) return MaybeObjectHandle(); + // Don't use dynamic map checks when loading properties from Array.prototype. + // Using dynamic map checks prevents constant folding and hence does not + // inline the array builtins. We only care about monomorphic cases here. For + // polymorphic loads currently we don't inline the builtins even without + // dynamic map checks. + if (maps_and_handlers.size() == 1 && + *maps_and_handlers[0].first == + native_context->initial_array_prototype().map()) { + return MaybeObjectHandle(); + } + MaybeObjectHandle initial_handler; for (MapAndHandler map_and_handler : maps_and_handlers) { auto map = map_and_handler.first; @@ -4752,11 +4749,16 @@ ProcessedFeedback const& JSHeapBroker::ReadFeedbackForPropertyAccess( base::Optional name = static_name.has_value() ? static_name : GetNameFeedback(nexus); - MaybeObjectHandle handler = TryGetMinimorphicHandler(maps_and_handlers, kind); + MaybeObjectHandle handler = TryGetMinimorphicHandler( + maps_and_handlers, kind, target_native_context().object()); if (!handler.is_null()) { + MaybeHandle maybe_map; + if (nexus.ic_state() == MONOMORPHIC) { + DCHECK_EQ(maps.size(), 1); + maybe_map = maps[0]; + } return *zone()->New( - *name, kind, nexus.ic_state() == MONOMORPHIC, handler.object(), - HasMigrationTargets(maps)); + *name, kind, handler.object(), maybe_map, HasMigrationTargets(maps)); } FilterRelevantReceiverMaps(isolate(), &maps); @@ -5169,15 +5171,13 @@ void ElementAccessFeedback::AddGroup(TransitionGroup&& group) { } std::ostream& operator<<(std::ostream& os, const ObjectRef& ref) { - if (ref.data_->kind() == ObjectDataKind::kUnserializedHeapObject || - !FLAG_concurrent_recompilation) { + if (!FLAG_concurrent_recompilation) { // We cannot be in a background thread so it's safe to read the heap. AllowHandleDereference allow_handle_dereference; return os << ref.data() << " {" << ref.object() << "}"; - } else if (ref.data_->kind() == - ObjectDataKind::kUnserializedReadOnlyHeapObject) { - AllowHandleDereferenceIf allow_handle_dereference(ref.data()->kind(), - ref.broker()->mode()); + } else if (ref.data_->should_access_heap()) { + AllowHandleDereferenceIfNeeded allow_handle_dereference( + ref.data()->kind(), ref.broker()->mode()); return os << ref.data() << " {" << ref.object() << "}"; } else { return os << ref.data(); @@ -5210,7 +5210,7 @@ PropertyAccessInfo JSHeapBroker::GetPropertyAccessInfo( PropertyAccessInfo access_info = factory.ComputePropertyAccessInfo( map.object(), name.object(), access_mode); if (is_concurrent_inlining_) { - CHECK(SerializingAllowed()); + CHECK_EQ(mode(), kSerializing); TRACE(this, "Storing PropertyAccessInfo for " << access_mode << " of property " << name << " on map " << map); @@ -5222,12 +5222,13 @@ PropertyAccessInfo JSHeapBroker::GetPropertyAccessInfo( MinimorphicLoadPropertyAccessInfo JSHeapBroker::GetPropertyAccessInfo( MinimorphicLoadPropertyAccessFeedback const& feedback, FeedbackSource const& source, SerializationPolicy policy) { - auto it = minimorphic_property_access_infos_.find(source.index()); + auto it = minimorphic_property_access_infos_.find(source); if (it != minimorphic_property_access_infos_.end()) return it->second; if (policy == SerializationPolicy::kAssumeSerialized) { - TRACE_BROKER_MISSING( - this, "MinimorphicLoadPropertyAccessInfo for slot " << source.index()); + TRACE_BROKER_MISSING(this, "MinimorphicLoadPropertyAccessInfo for slot " + << source.index() << " " + << ObjectRef(this, source.vector)); return MinimorphicLoadPropertyAccessInfo::Invalid(); } @@ -5235,9 +5236,10 @@ MinimorphicLoadPropertyAccessInfo JSHeapBroker::GetPropertyAccessInfo( MinimorphicLoadPropertyAccessInfo access_info = factory.ComputePropertyAccessInfo(feedback); if (is_concurrent_inlining_) { - TRACE(this, - "Storing MinimorphicLoadPropertyAccessInfo for " << source.index()); - minimorphic_property_access_infos_.insert({source.index(), access_info}); + TRACE(this, "Storing MinimorphicLoadPropertyAccessInfo for " + << source.index() << " " + << ObjectRef(this, source.vector)); + minimorphic_property_access_infos_.insert({source, access_info}); } return access_info; } diff --git a/deps/v8/src/compiler/js-heap-broker.h b/deps/v8/src/compiler/js-heap-broker.h index fdac46b9fd98ac..d2bfbace260e72 100644 --- a/deps/v8/src/compiler/js-heap-broker.h +++ b/deps/v8/src/compiler/js-heap-broker.h @@ -10,6 +10,7 @@ #include "src/common/globals.h" #include "src/compiler/access-info.h" #include "src/compiler/feedback-source.h" +#include "src/compiler/globals.h" #include "src/compiler/processed-feedback.h" #include "src/compiler/refs-map.h" #include "src/compiler/serializer-hints.h" @@ -103,6 +104,12 @@ class V8_EXPORT_PRIVATE JSHeapBroker { bool is_native_context_independent() const { return is_native_context_independent_; } + bool generate_full_feedback_collection() const { + // NCI code currently collects full feedback. + DCHECK_IMPLIES(is_native_context_independent(), + CollectFeedbackInGenericLowering()); + return is_native_context_independent(); + } enum BrokerMode { kDisabled, kSerializing, kSerialized, kRetired }; BrokerMode mode() const { return mode_; } @@ -363,7 +370,8 @@ class V8_EXPORT_PRIVATE JSHeapBroker { ZoneUnorderedMap property_access_infos_; - ZoneUnorderedMap + ZoneUnorderedMap minimorphic_property_access_infos_; ZoneVector typed_array_string_tags_; @@ -441,6 +449,27 @@ class OffHeapBytecodeArray final : public interpreter::AbstractBytecodeArray { BytecodeArrayRef array_; }; +// Scope that unparks the LocalHeap, if: +// a) We have a JSHeapBroker, +// b) Said JSHeapBroker has a LocalHeap, and +// c) Said LocalHeap has been parked. +// Used, for example, when printing the graph with --trace-turbo with a +// previously parked LocalHeap. +class UnparkedScopeIfNeeded { + public: + explicit UnparkedScopeIfNeeded(JSHeapBroker* broker) { + if (broker != nullptr) { + LocalHeap* local_heap = broker->local_heap(); + if (local_heap != nullptr && local_heap->IsParked()) { + unparked_scope.emplace(local_heap); + } + } + } + + private: + base::Optional unparked_scope; +}; + } // namespace compiler } // namespace internal } // namespace v8 diff --git a/deps/v8/src/compiler/js-heap-copy-reducer.cc b/deps/v8/src/compiler/js-heap-copy-reducer.cc index 069d42bc345f50..837369ec559cdc 100644 --- a/deps/v8/src/compiler/js-heap-copy-reducer.cc +++ b/deps/v8/src/compiler/js-heap-copy-reducer.cc @@ -171,6 +171,13 @@ Reduction JSHeapCopyReducer::Reduce(Node* node) { } break; } + case IrOpcode::kJSLoadNamedFromSuper: { + // TODO(marja, v8:9237): Process feedback once it's added to the byte + // code. + NamedAccess const& p = NamedAccessOf(node->op()); + NameRef name(broker(), p.name()); + break; + } case IrOpcode::kJSStoreNamed: { NamedAccess const& p = NamedAccessOf(node->op()); NameRef name(broker(), p.name()); diff --git a/deps/v8/src/compiler/js-inlining.cc b/deps/v8/src/compiler/js-inlining.cc index 66e7820d65c6da..74e9d2c012e94f 100644 --- a/deps/v8/src/compiler/js-inlining.cc +++ b/deps/v8/src/compiler/js-inlining.cc @@ -470,8 +470,8 @@ Reduction JSInliner::ReduceJSCall(Node* node) { CallFrequency frequency = call.frequency(); BuildGraphFromBytecode(broker(), zone(), *shared_info, feedback_vector, BailoutId::None(), jsgraph(), frequency, - source_positions_, inlining_id, flags, - &info_->tick_counter()); + source_positions_, inlining_id, info_->code_kind(), + flags, &info_->tick_counter()); } // Extract the inlinee start/end nodes. diff --git a/deps/v8/src/compiler/js-intrinsic-lowering.cc b/deps/v8/src/compiler/js-intrinsic-lowering.cc index c5fda401dd7ca1..03ac064c4e940c 100644 --- a/deps/v8/src/compiler/js-intrinsic-lowering.cc +++ b/deps/v8/src/compiler/js-intrinsic-lowering.cc @@ -82,7 +82,7 @@ Reduction JSIntrinsicLowering::Reduce(Node* node) { return ReduceToLength(node); case Runtime::kInlineToObject: return ReduceToObject(node); - case Runtime::kInlineToStringRT: + case Runtime::kInlineToString: return ReduceToString(node); case Runtime::kInlineCall: return ReduceCall(node); diff --git a/deps/v8/src/compiler/js-native-context-specialization.cc b/deps/v8/src/compiler/js-native-context-specialization.cc index 2fd99244d112c3..2a4524f38698a7 100644 --- a/deps/v8/src/compiler/js-native-context-specialization.cc +++ b/deps/v8/src/compiler/js-native-context-specialization.cc @@ -1071,13 +1071,10 @@ Reduction JSNativeContextSpecialization::ReduceMinimorphicPropertyAccess( if (feedback.has_migration_target_maps()) { flags |= CheckMapsFlag::kTryMigrateInstance; } - effect = graph()->NewNode( - simplified()->DynamicCheckMaps( - flags, feedback.handler(), source, - feedback.is_monomorphic() - ? DynamicCheckMapsParameters::ICState::kMonomorphic - : DynamicCheckMapsParameters::ICState::kPolymorphic), - receiver, effect, control); + effect = + graph()->NewNode(simplified()->DynamicCheckMaps(flags, feedback.handler(), + feedback.map(), source), + receiver, effect, control); value = access_builder.BuildMinimorphicLoadDataField( feedback.name(), access_info, receiver, &effect, &control); diff --git a/deps/v8/src/compiler/js-operator.cc b/deps/v8/src/compiler/js-operator.cc index f905505e2a8f4a..dccc9558b54cef 100644 --- a/deps/v8/src/compiler/js-operator.cc +++ b/deps/v8/src/compiler/js-operator.cc @@ -287,6 +287,7 @@ std::ostream& operator<<(std::ostream& os, NamedAccess const& p) { NamedAccess const& NamedAccessOf(const Operator* op) { DCHECK(op->opcode() == IrOpcode::kJSLoadNamed || + op->opcode() == IrOpcode::kJSLoadNamedFromSuper || op->opcode() == IrOpcode::kJSStoreNamed); return OpParameter(op); } @@ -918,6 +919,19 @@ const Operator* JSOperatorBuilder::LoadNamed(Handle name, access); // parameter } +const Operator* JSOperatorBuilder::LoadNamedFromSuper(Handle name) { + static constexpr int kReceiver = 1; + static constexpr int kHomeObject = 1; + static constexpr int kArity = kReceiver + kHomeObject; + // TODO(marja, v8:9237): Use real feedback. + NamedAccess access(LanguageMode::kSloppy, name, FeedbackSource()); + return zone()->New>( // -- + IrOpcode::kJSLoadNamedFromSuper, Operator::kNoProperties, // opcode + "JSLoadNamedFromSuper", // name + kArity, 1, 1, 1, 1, 2, // counts + access); // parameter +} + const Operator* JSOperatorBuilder::LoadProperty( FeedbackSource const& feedback) { PropertyAccess access(LanguageMode::kSloppy, feedback); diff --git a/deps/v8/src/compiler/js-operator.h b/deps/v8/src/compiler/js-operator.h index 1df5326ae4d13e..4043969000c4dc 100644 --- a/deps/v8/src/compiler/js-operator.h +++ b/deps/v8/src/compiler/js-operator.h @@ -921,6 +921,7 @@ class V8_EXPORT_PRIVATE JSOperatorBuilder final const Operator* LoadProperty(FeedbackSource const& feedback); const Operator* LoadNamed(Handle name, FeedbackSource const& feedback); + const Operator* LoadNamedFromSuper(Handle name); const Operator* StoreProperty(LanguageMode language_mode, FeedbackSource const& feedback); @@ -1389,6 +1390,22 @@ class JSLoadNamedNode final : public JSNodeWrapperBase { #undef INPUTS }; +class JSLoadNamedFromSuperNode final : public JSNodeWrapperBase { + public: + explicit constexpr JSLoadNamedFromSuperNode(Node* node) + : JSNodeWrapperBase(node) { + CONSTEXPR_DCHECK(node->opcode() == IrOpcode::kJSLoadNamedFromSuper); + } + + const NamedAccess& Parameters() const { return NamedAccessOf(node()->op()); } + +#define INPUTS(V) \ + V(Receiver, receiver, 0, Object) \ + V(Object, home_object, 1, Object) + INPUTS(DEFINE_INPUT_ACCESSORS) +#undef INPUTS +}; + class JSStoreNamedNode final : public JSNodeWrapperBase { public: explicit constexpr JSStoreNamedNode(Node* node) : JSNodeWrapperBase(node) { diff --git a/deps/v8/src/compiler/js-typed-lowering.cc b/deps/v8/src/compiler/js-typed-lowering.cc index 499af9442cacf1..46018225a37e6b 100644 --- a/deps/v8/src/compiler/js-typed-lowering.cc +++ b/deps/v8/src/compiler/js-typed-lowering.cc @@ -1589,11 +1589,13 @@ void ReduceBuiltin(JSGraph* jsgraph, Node* node, int builtin_index, int arity, NodeProperties::ChangeOp(node, jsgraph->common()->Call(call_descriptor)); } +#ifndef V8_NO_ARGUMENTS_ADAPTOR bool NeedsArgumentAdaptorFrame(SharedFunctionInfoRef shared, int arity) { static const int sentinel = kDontAdaptArgumentsSentinel; const int num_decl_parms = shared.internal_formal_parameter_count(); return (num_decl_parms != arity && num_decl_parms != sentinel); } +#endif } // namespace @@ -1779,6 +1781,26 @@ Reduction JSTypedLowering::ReduceJSCall(Node* node) { CallDescriptor::Flags flags = CallDescriptor::kNeedsFrameState; Node* new_target = jsgraph()->UndefinedConstant(); +#ifdef V8_NO_ARGUMENTS_ADAPTOR + int formal_count = shared->internal_formal_parameter_count(); + if (formal_count != kDontAdaptArgumentsSentinel && formal_count > arity) { + node->RemoveInput(n.FeedbackVectorIndex()); + // Underapplication. Massage the arguments to match the expected number of + // arguments. + for (int i = arity; i < formal_count; i++) { + node->InsertInput(graph()->zone(), arity + 2, + jsgraph()->UndefinedConstant()); + } + + // Patch {node} to a direct call. + node->InsertInput(graph()->zone(), formal_count + 2, new_target); + node->InsertInput(graph()->zone(), formal_count + 3, + jsgraph()->Constant(arity)); + NodeProperties::ChangeOp(node, + common()->Call(Linkage::GetJSCallDescriptor( + graph()->zone(), false, 1 + formal_count, + flags | CallDescriptor::kCanUseRoots))); +#else if (NeedsArgumentAdaptorFrame(*shared, arity)) { node->RemoveInput(n.FeedbackVectorIndex()); @@ -1826,6 +1848,7 @@ Reduction JSTypedLowering::ReduceJSCall(Node* node) { common()->Call(Linkage::GetStubCallDescriptor( graph()->zone(), callable.descriptor(), 1 + arity, flags))); } +#endif } else if (shared->HasBuiltinId() && Builtins::IsCpp(shared->builtin_id())) { // Patch {node} to a direct CEntry call. @@ -2406,7 +2429,16 @@ Reduction JSTypedLowering::ReduceJSResolvePromise(Node* node) { Reduction JSTypedLowering::Reduce(Node* node) { DisallowHeapAccess no_heap_access; - switch (node->opcode()) { + const IrOpcode::Value opcode = node->opcode(); + if (broker()->generate_full_feedback_collection() && + IrOpcode::IsFeedbackCollectingOpcode(opcode)) { + // In NCI code, it is not valid to reduce feedback-collecting JS opcodes + // into non-feedback-collecting lower-level opcodes; missed feedback would + // result in soft deopts. + return NoChange(); + } + + switch (opcode) { case IrOpcode::kJSEqual: return ReduceJSEqual(node); case IrOpcode::kJSStrictEqual: diff --git a/deps/v8/src/compiler/linkage.cc b/deps/v8/src/compiler/linkage.cc index b8c14db5396e58..cde4b96c870f81 100644 --- a/deps/v8/src/compiler/linkage.cc +++ b/deps/v8/src/compiler/linkage.cc @@ -94,6 +94,12 @@ int CallDescriptor::GetFirstUnusedStackSlot() const { int CallDescriptor::GetStackParameterDelta( CallDescriptor const* tail_caller) const { + // In the IsTailCallForTierUp case, the callee has + // identical linkage and runtime arguments to the caller, thus the stack + // parameter delta is 0. We don't explicitly pass the runtime arguments as + // inputs to the TailCall node, since they already exist on the stack. + if (IsTailCallForTierUp()) return 0; + int callee_slots_above_sp = GetFirstUnusedStackSlot(); int tail_caller_slots_above_sp = tail_caller->GetFirstUnusedStackSlot(); int stack_param_delta = callee_slots_above_sp - tail_caller_slots_above_sp; @@ -103,6 +109,7 @@ int CallDescriptor::GetStackParameterDelta( // of padding. ++stack_param_delta; } else { + DCHECK_NE(tail_caller_slots_above_sp % 2, 0); // The delta is odd because of the caller. We already have one slot of // padding that we can reuse for arguments, so we will need one fewer // slot. @@ -147,9 +154,7 @@ bool CallDescriptor::CanTailCall(const CallDescriptor* callee) const { int CallDescriptor::CalculateFixedFrameSize(CodeKind code_kind) const { switch (kind_) { case kCallJSFunction: - return PushArgumentCount() - ? OptimizedBuiltinFrameConstants::kFixedSlotCount - : StandardFrameConstants::kFixedSlotCount; + return StandardFrameConstants::kFixedSlotCount; case kCallAddress: if (code_kind == CodeKind::C_WASM_ENTRY) { return CWasmEntryFrameConstants::kFixedSlotCount; diff --git a/deps/v8/src/compiler/linkage.h b/deps/v8/src/compiler/linkage.h index e14f9cd8a40295..d96b049d9292d7 100644 --- a/deps/v8/src/compiler/linkage.h +++ b/deps/v8/src/compiler/linkage.h @@ -205,6 +205,9 @@ class V8_EXPORT_PRIVATE CallDescriptor final kCallBuiltinPointer, // target is a builtin pointer }; + // NOTE: The lowest 10 bits of the Flags field are encoded in InstructionCode + // (for use in the code generator). All higher bits are lost. + static constexpr int kFlagsBitsEncodedInInstructionCode = 10; enum Flag { kNoFlags = 0u, kNeedsFrameState = 1u << 0, @@ -214,17 +217,36 @@ class V8_EXPORT_PRIVATE CallDescriptor final kInitializeRootRegister = 1u << 3, // Does not ever try to allocate space on our heap. kNoAllocate = 1u << 4, - // Push argument count as part of function prologue. - kPushArgumentCount = 1u << 5, // Use retpoline for this call if indirect. - kRetpoline = 1u << 6, + kRetpoline = 1u << 5, // Use the kJavaScriptCallCodeStartRegister (fixed) register for the // indirect target address when calling. - kFixedTargetRegister = 1u << 7, - kCallerSavedRegisters = 1u << 8, + kFixedTargetRegister = 1u << 6, + kCallerSavedRegisters = 1u << 7, // The kCallerSavedFPRegisters only matters (and set) when the more general // flag for kCallerSavedRegisters above is also set. - kCallerSavedFPRegisters = 1u << 9, + kCallerSavedFPRegisters = 1u << 8, + // Tail calls for tier up are special (in fact they are different enough + // from normal tail calls to warrant a dedicated opcode; but they also have + // enough similar aspects that reusing the TailCall opcode is pragmatic). + // Specifically: + // + // 1. Caller and callee are both JS-linkage Code objects. + // 2. JS runtime arguments are passed unchanged from caller to callee. + // 3. JS runtime arguments are not attached as inputs to the TailCall node. + // 4. Prior to the tail call, frame and register state is torn down to just + // before the caller frame was constructed. + // 5. Unlike normal tail calls, arguments adaptor frames (if present) are + // *not* torn down. + // + // In other words, behavior is identical to a jmp instruction prior caller + // frame construction. + kIsTailCallForTierUp = 1u << 9, + + // Flags past here are *not* encoded in InstructionCode and are thus not + // accessible from the code generator. See also + // kFlagsBitsEncodedInInstructionCode. + // AIX has a function descriptor by default but it can be disabled for a // certain CFunction call (only used for Kind::kCallAddress). kNoFunctionDescriptor = 1u << 10, @@ -317,7 +339,6 @@ class V8_EXPORT_PRIVATE CallDescriptor final Flags flags() const { return flags_; } bool NeedsFrameState() const { return flags() & kNeedsFrameState; } - bool PushArgumentCount() const { return flags() & kPushArgumentCount; } bool InitializeRootRegister() const { return flags() & kInitializeRootRegister; } @@ -327,6 +348,7 @@ class V8_EXPORT_PRIVATE CallDescriptor final bool NeedsCallerSavedFPRegisters() const { return flags() & kCallerSavedFPRegisters; } + bool IsTailCallForTierUp() const { return flags() & kIsTailCallForTierUp; } bool NoFunctionDescriptor() const { return flags() & kNoFunctionDescriptor; } LinkageLocation GetReturnLocation(size_t index) const { @@ -511,22 +533,22 @@ class V8_EXPORT_PRIVATE Linkage : public NON_EXPORTED_BASE(ZoneObject) { } // A special {Parameter} index for JSCalls that represents the new target. - static int GetJSCallNewTargetParamIndex(int parameter_count) { + static constexpr int GetJSCallNewTargetParamIndex(int parameter_count) { return parameter_count + 0; // Parameter (arity + 0) is special. } // A special {Parameter} index for JSCalls that represents the argument count. - static int GetJSCallArgCountParamIndex(int parameter_count) { + static constexpr int GetJSCallArgCountParamIndex(int parameter_count) { return parameter_count + 1; // Parameter (arity + 1) is special. } // A special {Parameter} index for JSCalls that represents the context. - static int GetJSCallContextParamIndex(int parameter_count) { + static constexpr int GetJSCallContextParamIndex(int parameter_count) { return parameter_count + 2; // Parameter (arity + 2) is special. } // A special {Parameter} index for JSCalls that represents the closure. - static const int kJSCallClosureParamIndex = -1; + static constexpr int kJSCallClosureParamIndex = -1; // A special {OsrValue} index to indicate the context spill slot. static const int kOsrContextSpillSlotIndex = -1; diff --git a/deps/v8/src/compiler/machine-operator-reducer.cc b/deps/v8/src/compiler/machine-operator-reducer.cc index 740a4f293c952f..55f39d76e80e0f 100644 --- a/deps/v8/src/compiler/machine-operator-reducer.cc +++ b/deps/v8/src/compiler/machine-operator-reducer.cc @@ -1659,7 +1659,7 @@ struct BitfieldCheck { Uint32BinopMatcher eq(node); if (eq.left().IsWord32And()) { Uint32BinopMatcher mand(eq.left().node()); - if (mand.right().HasValue()) { + if (mand.right().HasValue() && eq.right().HasValue()) { BitfieldCheck result{mand.left().node(), mand.right().Value(), eq.right().Value(), false}; if (mand.left().IsTruncateInt64ToInt32()) { diff --git a/deps/v8/src/compiler/machine-operator.cc b/deps/v8/src/compiler/machine-operator.cc index 644c445b941d48..98befab0600f86 100644 --- a/deps/v8/src/compiler/machine-operator.cc +++ b/deps/v8/src/compiler/machine-operator.cc @@ -495,7 +495,7 @@ ShiftKind ShiftKindOf(Operator const* op) { V(V16x8AllTrue, Operator::kNoProperties, 1, 0, 1) \ V(V8x16AnyTrue, Operator::kNoProperties, 1, 0, 1) \ V(V8x16AllTrue, Operator::kNoProperties, 1, 0, 1) \ - V(S8x16Swizzle, Operator::kNoProperties, 2, 0, 1) + V(I8x16Swizzle, Operator::kNoProperties, 2, 0, 1) // The format is: // V(Name, properties, value_input_count, control_input_count, output_count) @@ -1575,7 +1575,7 @@ std::ostream& operator<<(std::ostream& os, S128ImmediateParameter const& p) { } S128ImmediateParameter const& S128ImmediateParameterOf(Operator const* op) { - DCHECK(IrOpcode::kS8x16Shuffle == op->opcode() || + DCHECK(IrOpcode::kI8x16Shuffle == op->opcode() || IrOpcode::kS128Const == op->opcode()); return OpParameter(op); } @@ -1586,10 +1586,10 @@ const Operator* MachineOperatorBuilder::S128Const(const uint8_t value[16]) { S128ImmediateParameter(value)); } -const Operator* MachineOperatorBuilder::S8x16Shuffle( +const Operator* MachineOperatorBuilder::I8x16Shuffle( const uint8_t shuffle[16]) { return zone_->New>( - IrOpcode::kS8x16Shuffle, Operator::kPure, "Shuffle", 2, 0, 0, 1, 0, 0, + IrOpcode::kI8x16Shuffle, Operator::kPure, "Shuffle", 2, 0, 0, 1, 0, 0, S128ImmediateParameter(shuffle)); } diff --git a/deps/v8/src/compiler/machine-operator.h b/deps/v8/src/compiler/machine-operator.h index 5f7c900466d79b..702c05022373a1 100644 --- a/deps/v8/src/compiler/machine-operator.h +++ b/deps/v8/src/compiler/machine-operator.h @@ -197,8 +197,6 @@ ShiftKind ShiftKindOf(Operator const*) V8_WARN_UNUSED_RESULT; // makes it easier to detect an overflow. This parameter is ignored on platforms // like x64 and ia32 where a range overflow does not result in INT_MAX. enum class TruncateKind { kArchitectureDefault, kSetOverflowToMin }; -std::ostream& operator<<(std::ostream& os, TruncateKind kind); -size_t hash_value(TruncateKind kind); // Interface for building machine-level operators. These operators are // machine-level but machine-independent and thus define a language suitable @@ -767,8 +765,8 @@ class V8_EXPORT_PRIVATE MachineOperatorBuilder final const Operator* S128Select(); const Operator* S128AndNot(); - const Operator* S8x16Swizzle(); - const Operator* S8x16Shuffle(const uint8_t shuffle[16]); + const Operator* I8x16Swizzle(); + const Operator* I8x16Shuffle(const uint8_t shuffle[16]); const Operator* V64x2AnyTrue(); const Operator* V64x2AllTrue(); diff --git a/deps/v8/src/compiler/opcodes.h b/deps/v8/src/compiler/opcodes.h index 0aba619ffe0199..f1faeec93675d4 100644 --- a/deps/v8/src/compiler/opcodes.h +++ b/deps/v8/src/compiler/opcodes.h @@ -170,6 +170,7 @@ JS_CREATE_OP_LIST(V) \ V(JSLoadProperty) \ V(JSLoadNamed) \ + V(JSLoadNamedFromSuper) \ V(JSLoadGlobal) \ V(JSStoreProperty) \ V(JSStoreNamed) \ @@ -482,6 +483,7 @@ V(StringToLowerCaseIntl) \ V(StringToNumber) \ V(StringToUpperCaseIntl) \ + V(TierUpCheck) \ V(ToBoolean) \ V(TransitionAndStoreElement) \ V(TransitionAndStoreNonNumberElement) \ @@ -950,8 +952,8 @@ V(S128Xor) \ V(S128Select) \ V(S128AndNot) \ - V(S8x16Swizzle) \ - V(S8x16Shuffle) \ + V(I8x16Swizzle) \ + V(I8x16Shuffle) \ V(V64x2AnyTrue) \ V(V64x2AllTrue) \ V(V32x4AnyTrue) \ @@ -1068,6 +1070,55 @@ class V8_EXPORT_PRIVATE IrOpcode { static bool IsContextChainExtendingOpcode(Value value) { return kJSCreateFunctionContext <= value && value <= kJSCreateBlockContext; } + + // These opcode take the feedback vector as an input, and implement + // feedback-collecting logic in generic lowering. + static bool IsFeedbackCollectingOpcode(Value value) { +#define CASE(Name, ...) \ + case k##Name: \ + return true; + switch (value) { + JS_ARITH_BINOP_LIST(CASE) + JS_ARITH_UNOP_LIST(CASE) + JS_BITWISE_BINOP_LIST(CASE) + JS_BITWISE_UNOP_LIST(CASE) + JS_COMPARE_BINOP_LIST(CASE) + case kJSCall: + case kJSCallWithArrayLike: + case kJSCallWithSpread: + case kJSCloneObject: + case kJSConstruct: + case kJSConstructWithArrayLike: + case kJSConstructWithSpread: + case kJSCreateEmptyLiteralArray: + case kJSCreateLiteralArray: + case kJSCreateLiteralObject: + case kJSCreateLiteralRegExp: + case kJSGetIterator: + case kJSGetTemplateObject: + case kJSHasProperty: + case kJSInstanceOf: + case kJSLoadGlobal: + case kJSLoadNamed: + case kJSLoadProperty: + case kJSStoreDataPropertyInLiteral: + case kJSStoreGlobal: + case kJSStoreInArrayLiteral: + case kJSStoreNamed: + case kJSStoreNamedOwn: + case kJSStoreProperty: + return true; + default: + return false; + } +#undef CASE + UNREACHABLE(); + } + + static bool IsFeedbackCollectingOpcode(int16_t value) { + DCHECK(0 <= value && value <= kLast); + return IsFeedbackCollectingOpcode(static_cast(value)); + } }; V8_EXPORT_PRIVATE std::ostream& operator<<(std::ostream&, IrOpcode::Value); diff --git a/deps/v8/src/compiler/operator-properties.cc b/deps/v8/src/compiler/operator-properties.cc index c7851dd2636de1..c77249f6216a8d 100644 --- a/deps/v8/src/compiler/operator-properties.cc +++ b/deps/v8/src/compiler/operator-properties.cc @@ -80,6 +80,7 @@ bool OperatorProperties::NeedsExactContext(const Operator* op) { case IrOpcode::kJSLoadContext: case IrOpcode::kJSLoadModule: case IrOpcode::kJSLoadNamed: + case IrOpcode::kJSLoadNamedFromSuper: case IrOpcode::kJSLoadProperty: case IrOpcode::kJSStoreContext: case IrOpcode::kJSStoreDataPropertyInLiteral: @@ -193,6 +194,7 @@ bool OperatorProperties::HasFrameStateInput(const Operator* op) { // Property access operations case IrOpcode::kJSLoadNamed: + case IrOpcode::kJSLoadNamedFromSuper: case IrOpcode::kJSStoreNamed: case IrOpcode::kJSLoadProperty: case IrOpcode::kJSStoreProperty: diff --git a/deps/v8/src/compiler/pipeline.cc b/deps/v8/src/compiler/pipeline.cc index 8a1c86ee49d7d8..7b99d07b6b6c93 100644 --- a/deps/v8/src/compiler/pipeline.cc +++ b/deps/v8/src/compiler/pipeline.cc @@ -22,7 +22,6 @@ #include "src/compiler/backend/instruction-selector.h" #include "src/compiler/backend/instruction.h" #include "src/compiler/backend/jump-threading.h" -#include "src/compiler/backend/live-range-separator.h" #include "src/compiler/backend/mid-tier-register-allocator.h" #include "src/compiler/backend/move-optimizer.h" #include "src/compiler/backend/register-allocator-verifier.h" @@ -784,27 +783,6 @@ class LocalHeapScope { OptimizedCompilationInfo* info_; }; -// Scope that unparks the LocalHeap, if: -// a) We have a JSHeapBroker, -// b) Said JSHeapBroker has a LocalHeap, and -// c) Said LocalHeap has been parked. -// Used, for example, when printing the graph with --trace-turbo with a -// previously parked LocalHeap. -class UnparkedScopeIfNeeded { - public: - explicit UnparkedScopeIfNeeded(JSHeapBroker* broker) { - if (broker != nullptr) { - LocalHeap* local_heap = broker->local_heap(); - if (local_heap != nullptr && local_heap->IsParked()) { - unparked_scope.emplace(local_heap); - } - } - } - - private: - base::Optional unparked_scope; -}; - void PrintFunctionSource(OptimizedCompilationInfo* info, Isolate* isolate, int source_id, Handle shared) { if (!shared->script().IsUndefined(isolate)) { @@ -881,7 +859,8 @@ void PrintCode(Isolate* isolate, Handle code, const bool print_code = FLAG_print_code || (info->IsOptimizing() && FLAG_print_opt_code && - info->shared_info()->PassesFilter(FLAG_print_opt_code_filter)); + info->shared_info()->PassesFilter(FLAG_print_opt_code_filter)) || + (info->IsNativeContextIndependent() && FLAG_print_nci_code); if (print_code) { std::unique_ptr debug_name = info->GetDebugName(); CodeTracer::StreamScope tracing_scope(isolate->GetCodeTracer()); @@ -1422,17 +1401,14 @@ struct GraphBuilderPhase { if (data->info()->bailout_on_uninitialized()) { flags |= BytecodeGraphBuilderFlag::kBailoutOnUninitialized; } - if (data->info()->IsNativeContextIndependent()) { - flags |= BytecodeGraphBuilderFlag::kNativeContextIndependent; - } JSFunctionRef closure(data->broker(), data->info()->closure()); CallFrequency frequency(1.0f); BuildGraphFromBytecode( data->broker(), temp_zone, closure.shared(), closure.feedback_vector(), data->info()->osr_offset(), data->jsgraph(), frequency, - data->source_positions(), SourcePosition::kNotInlined, flags, - &data->info()->tick_counter()); + data->source_positions(), SourcePosition::kNotInlined, + data->info()->code_kind(), flags, &data->info()->tick_counter()); } }; @@ -1442,7 +1418,7 @@ struct InliningPhase { void Run(PipelineData* data, Zone* temp_zone) { OptimizedCompilationInfo* info = data->info(); GraphReducer graph_reducer(temp_zone, data->graph(), &info->tick_counter(), - data->jsgraph()->Dead()); + data->broker(), data->jsgraph()->Dead()); DeadCodeElimination dead_code_elimination(&graph_reducer, data->graph(), data->common(), temp_zone); CheckpointElimination checkpoint_elimination(&graph_reducer); @@ -1511,6 +1487,9 @@ struct TyperPhase { LoopVariableOptimizer induction_vars(data->jsgraph()->graph(), data->common(), temp_zone); if (FLAG_turbo_loop_variable) induction_vars.Run(); + + // The typer inspects heap objects, so we need to unpark the local heap. + UnparkedScopeIfNeeded scope(data->broker()); typer->Run(roots, &induction_vars); } }; @@ -1538,7 +1517,7 @@ struct UntyperPhase { } GraphReducer graph_reducer(temp_zone, data->graph(), - &data->info()->tick_counter(), + &data->info()->tick_counter(), data->broker(), data->jsgraph()->Dead()); RemoveTypeReducer remove_type_reducer; AddReducer(data, &graph_reducer, &remove_type_reducer); @@ -1559,7 +1538,7 @@ struct CopyMetadataForConcurrentCompilePhase { void Run(PipelineData* data, Zone* temp_zone) { GraphReducer graph_reducer(temp_zone, data->graph(), - &data->info()->tick_counter(), + &data->info()->tick_counter(), data->broker(), data->jsgraph()->Dead()); JSHeapCopyReducer heap_copy_reducer(data->broker()); AddReducer(data, &graph_reducer, &heap_copy_reducer); @@ -1605,7 +1584,7 @@ struct TypedLoweringPhase { void Run(PipelineData* data, Zone* temp_zone) { GraphReducer graph_reducer(temp_zone, data->graph(), - &data->info()->tick_counter(), + &data->info()->tick_counter(), data->broker(), data->jsgraph()->Dead()); DeadCodeElimination dead_code_elimination(&graph_reducer, data->graph(), data->common(), temp_zone); @@ -1625,6 +1604,7 @@ struct TypedLoweringPhase { data->broker(), data->common(), data->machine(), temp_zone); AddReducer(data, &graph_reducer, &dead_code_elimination); + if (!data->info()->IsNativeContextIndependent()) { AddReducer(data, &graph_reducer, &create_lowering); } @@ -1634,8 +1614,11 @@ struct TypedLoweringPhase { AddReducer(data, &graph_reducer, &simple_reducer); AddReducer(data, &graph_reducer, &checkpoint_elimination); AddReducer(data, &graph_reducer, &common_reducer); - // JSCreateLowering accesses the heap and therefore we need to unpark it. + + // ConstantFoldingReducer, JSCreateLowering, JSTypedLowering, and + // TypedOptimization access the heap. UnparkedScopeIfNeeded scope(data->broker()); + graph_reducer.ReduceGraph(); } }; @@ -1648,13 +1631,19 @@ struct EscapeAnalysisPhase { EscapeAnalysis escape_analysis(data->jsgraph(), &data->info()->tick_counter(), temp_zone); escape_analysis.ReduceGraph(); + GraphReducer reducer(temp_zone, data->graph(), - &data->info()->tick_counter(), + &data->info()->tick_counter(), data->broker(), data->jsgraph()->Dead()); EscapeAnalysisReducer escape_reducer(&reducer, data->jsgraph(), escape_analysis.analysis_result(), temp_zone); + AddReducer(data, &reducer, &escape_reducer); + + // EscapeAnalysisReducer accesses the heap. + UnparkedScopeIfNeeded scope(data->broker()); + reducer.ReduceGraph(); // TODO(tebbi): Turn this into a debug mode check once we have confidence. escape_reducer.VerifyReplacement(); @@ -1666,7 +1655,7 @@ struct TypeAssertionsPhase { void Run(PipelineData* data, Zone* temp_zone) { GraphReducer graph_reducer(temp_zone, data->graph(), - &data->info()->tick_counter(), + &data->info()->tick_counter(), data->broker(), data->jsgraph()->Dead()); AddTypeAssertionsReducer type_assertions(&graph_reducer, data->jsgraph(), temp_zone); @@ -1683,6 +1672,10 @@ struct SimplifiedLoweringPhase { data->source_positions(), data->node_origins(), data->info()->GetPoisoningMitigationLevel(), &data->info()->tick_counter()); + + // RepresentationChanger accesses the heap. + UnparkedScopeIfNeeded scope(data->broker()); + lowering.LowerAllNodes(); } }; @@ -1717,7 +1710,7 @@ struct GenericLoweringPhase { void Run(PipelineData* data, Zone* temp_zone) { GraphReducer graph_reducer(temp_zone, data->graph(), - &data->info()->tick_counter(), + &data->info()->tick_counter(), data->broker(), data->jsgraph()->Dead()); JSGenericLowering generic_lowering(data->jsgraph(), &graph_reducer, data->broker()); @@ -1731,7 +1724,7 @@ struct EarlyOptimizationPhase { void Run(PipelineData* data, Zone* temp_zone) { GraphReducer graph_reducer(temp_zone, data->graph(), - &data->info()->tick_counter(), + &data->info()->tick_counter(), data->broker(), data->jsgraph()->Dead()); DeadCodeElimination dead_code_elimination(&graph_reducer, data->graph(), data->common(), temp_zone); @@ -1808,7 +1801,7 @@ struct EffectControlLinearizationPhase { // doing a common operator reducer and dead code elimination just before // it, to eliminate conditional deopts with a constant condition. GraphReducer graph_reducer(temp_zone, data->graph(), - &data->info()->tick_counter(), + &data->info()->tick_counter(), data->broker(), data->jsgraph()->Dead()); DeadCodeElimination dead_code_elimination(&graph_reducer, data->graph(), data->common(), temp_zone); @@ -1841,7 +1834,7 @@ struct LoadEliminationPhase { void Run(PipelineData* data, Zone* temp_zone) { GraphReducer graph_reducer(temp_zone, data->graph(), - &data->info()->tick_counter(), + &data->info()->tick_counter(), data->broker(), data->jsgraph()->Dead()); BranchElimination branch_condition_elimination(&graph_reducer, data->jsgraph(), temp_zone, @@ -1862,6 +1855,7 @@ struct LoadEliminationPhase { &graph_reducer, data->jsgraph(), data->broker()); TypeNarrowingReducer type_narrowing_reducer(&graph_reducer, data->jsgraph(), data->broker()); + AddReducer(data, &graph_reducer, &branch_condition_elimination); AddReducer(data, &graph_reducer, &dead_code_elimination); AddReducer(data, &graph_reducer, &redundancy_elimination); @@ -1872,6 +1866,10 @@ struct LoadEliminationPhase { AddReducer(data, &graph_reducer, &checkpoint_elimination); AddReducer(data, &graph_reducer, &common_reducer); AddReducer(data, &graph_reducer, &value_numbering); + + // ConstantFoldingReducer and TypedOptimization access the heap. + UnparkedScopeIfNeeded scope(data->broker()); + graph_reducer.ReduceGraph(); } }; @@ -1902,7 +1900,7 @@ struct LateOptimizationPhase { void Run(PipelineData* data, Zone* temp_zone) { GraphReducer graph_reducer(temp_zone, data->graph(), - &data->info()->tick_counter(), + &data->info()->tick_counter(), data->broker(), data->jsgraph()->Dead()); BranchElimination branch_condition_elimination(&graph_reducer, data->jsgraph(), temp_zone); @@ -1930,7 +1928,7 @@ struct MachineOperatorOptimizationPhase { void Run(PipelineData* data, Zone* temp_zone) { GraphReducer graph_reducer(temp_zone, data->graph(), - &data->info()->tick_counter(), + &data->info()->tick_counter(), data->broker(), data->jsgraph()->Dead()); ValueNumberingReducer value_numbering(temp_zone, data->graph()->zone()); MachineOperatorReducer machine_reducer(&graph_reducer, data->jsgraph()); @@ -2001,7 +1999,7 @@ struct CsaEarlyOptimizationPhase { void Run(PipelineData* data, Zone* temp_zone) { GraphReducer graph_reducer(temp_zone, data->graph(), - &data->info()->tick_counter(), + &data->info()->tick_counter(), data->broker(), data->jsgraph()->Dead()); MachineOperatorReducer machine_reducer(&graph_reducer, data->jsgraph()); BranchElimination branch_condition_elimination(&graph_reducer, @@ -2029,7 +2027,7 @@ struct CsaOptimizationPhase { void Run(PipelineData* data, Zone* temp_zone) { GraphReducer graph_reducer(temp_zone, data->graph(), - &data->info()->tick_counter(), + &data->info()->tick_counter(), data->broker(), data->jsgraph()->Dead()); BranchElimination branch_condition_elimination(&graph_reducer, data->jsgraph(), temp_zone); @@ -2200,17 +2198,6 @@ struct BuildBundlesPhase { } }; -struct SplinterLiveRangesPhase { - DECL_PIPELINE_PHASE_CONSTANTS(SplinterLiveRanges) - - void Run(PipelineData* data, Zone* temp_zone) { - LiveRangeSeparator live_range_splinterer( - data->top_tier_register_allocation_data(), temp_zone); - live_range_splinterer.Splinter(); - } -}; - - template struct AllocateGeneralRegistersPhase { DECL_PIPELINE_PHASE_CONSTANTS(AllocateGeneralRegisters) @@ -2233,18 +2220,6 @@ struct AllocateFPRegistersPhase { } }; - -struct MergeSplintersPhase { - DECL_PIPELINE_PHASE_CONSTANTS(MergeSplinteredRanges) - - void Run(PipelineData* pipeline_data, Zone* temp_zone) { - TopTierRegisterAllocationData* data = - pipeline_data->top_tier_register_allocation_data(); - LiveRangeMerger live_range_merger(data, temp_zone); - live_range_merger.Merge(); - } -}; - struct DecideSpillingModePhase { DECL_PIPELINE_PHASE_CONSTANTS(DecideSpillingMode) @@ -2888,15 +2863,12 @@ MaybeHandle Pipeline::GenerateCodeForCodeStub( info.profiler_data()->SetHash(graph_hash_before_scheduling); } - Handle code; if (jump_opt.is_optimizable()) { jump_opt.set_optimizing(); - code = pipeline.GenerateCode(call_descriptor).ToHandleChecked(); + return pipeline.GenerateCode(call_descriptor); } else { - code = second_pipeline.FinalizeCode().ToHandleChecked(); + return second_pipeline.FinalizeCode(); } - - return code; } struct BlockStartsAsJSON { @@ -3164,7 +3136,7 @@ void Pipeline::GenerateCodeForWasmFunction( PipelineRunScope scope(&data, "V8.WasmFullOptimization", RuntimeCallCounterId::kOptimizeWasmFullOptimization); GraphReducer graph_reducer(scope.zone(), data.graph(), - &data.info()->tick_counter(), + &data.info()->tick_counter(), data.broker(), data.mcgraph()->Dead()); DeadCodeElimination dead_code_elimination(&graph_reducer, data.graph(), data.common(), scope.zone()); @@ -3184,7 +3156,7 @@ void Pipeline::GenerateCodeForWasmFunction( PipelineRunScope scope(&data, "V8.OptimizeWasmBaseOptimization", RuntimeCallCounterId::kOptimizeWasmBaseOptimization); GraphReducer graph_reducer(scope.zone(), data.graph(), - &data.info()->tick_counter(), + &data.info()->tick_counter(), data.broker(), data.mcgraph()->Dead()); ValueNumberingReducer value_numbering(scope.zone(), data.graph()->zone()); AddReducer(&data, &graph_reducer, &value_numbering); @@ -3630,12 +3602,6 @@ void PipelineImpl::AllocateRegistersForTopTier( #endif RegisterAllocationFlags flags; - if (data->info()->turbo_control_flow_aware_allocation()) { - flags |= RegisterAllocationFlag::kTurboControlFlowAwareAllocation; - } - if (data->info()->turbo_preprocess_ranges()) { - flags |= RegisterAllocationFlag::kTurboPreprocessRanges; - } if (data->info()->trace_turbo_allocation()) { flags |= RegisterAllocationFlag::kTraceAllocation; } @@ -3661,25 +3627,12 @@ void PipelineImpl::AllocateRegistersForTopTier( "PreAllocation", data->top_tier_register_allocation_data()); } - if (info()->turbo_preprocess_ranges()) { - Run(); - if (info()->trace_turbo_json() && !data->MayHaveUnverifiableGraph()) { - TurboCfgFile tcf(isolate()); - tcf << AsC1VRegisterAllocationData( - "PostSplinter", data->top_tier_register_allocation_data()); - } - } - Run>(); if (data->sequence()->HasFPVirtualRegisters()) { Run>(); } - if (info()->turbo_preprocess_ranges()) { - Run(); - } - Run(); Run(); Run(); diff --git a/deps/v8/src/compiler/processed-feedback.h b/deps/v8/src/compiler/processed-feedback.h index cd916f9b474ab8..282923e0c36438 100644 --- a/deps/v8/src/compiler/processed-feedback.h +++ b/deps/v8/src/compiler/processed-feedback.h @@ -177,19 +177,20 @@ class MinimorphicLoadPropertyAccessFeedback : public ProcessedFeedback { public: MinimorphicLoadPropertyAccessFeedback(NameRef const& name, FeedbackSlotKind slot_kind, - bool is_monomorphic, Handle handler, + MaybeHandle maybe_map, bool has_migration_target_maps); NameRef const& name() const { return name_; } - bool is_monomorphic() const { return is_monomorphic_; } + bool is_monomorphic() const { return !maybe_map_.is_null(); } Handle handler() const { return handler_; } + MaybeHandle map() const { return maybe_map_; } bool has_migration_target_maps() const { return has_migration_target_maps_; } private: NameRef const name_; - bool const is_monomorphic_; Handle const handler_; + MaybeHandle const maybe_map_; bool const has_migration_target_maps_; }; diff --git a/deps/v8/src/compiler/property-access-builder.cc b/deps/v8/src/compiler/property-access-builder.cc index dc25326735c21c..4235160037e6a5 100644 --- a/deps/v8/src/compiler/property-access-builder.cc +++ b/deps/v8/src/compiler/property-access-builder.cc @@ -199,17 +199,49 @@ Node* PropertyAccessBuilder::BuildLoadDataField(NameRef const& name, MachineRepresentation::kFloat64) { bool const is_heapnumber = !is_inobject || !FLAG_unbox_double_fields; if (is_heapnumber) { - FieldAccess const storage_access = {kTaggedBase, - field_access.offset, - name.object(), - MaybeHandle(), - Type::OtherInternal(), - MachineType::TaggedPointer(), - kPointerWriteBarrier, - LoadSensitivity::kCritical, - field_access.const_field_info}; - storage = *effect = graph()->NewNode( - simplified()->LoadField(storage_access), storage, *effect, *control); + if (dependencies() == nullptr) { + FieldAccess const storage_access = {kTaggedBase, + field_access.offset, + name.object(), + MaybeHandle(), + Type::Any(), + MachineType::AnyTagged(), + kPointerWriteBarrier, + LoadSensitivity::kCritical, + field_access.const_field_info}; + storage = *effect = + graph()->NewNode(simplified()->LoadField(storage_access), storage, + *effect, *control); + // We expect the loaded value to be a heap number here. With + // in-place field representation changes it is possible this is a + // no longer a heap number without map transitions. If we haven't taken + // a dependency on field representation, we should verify the loaded + // value is a heap number. + storage = *effect = graph()->NewNode(simplified()->CheckHeapObject(), + storage, *effect, *control); + Node* map = *effect = + graph()->NewNode(simplified()->LoadField(AccessBuilder::ForMap()), + storage, *effect, *control); + Node* is_heap_number = + graph()->NewNode(simplified()->ReferenceEqual(), map, + jsgraph()->HeapNumberMapConstant()); + *effect = graph()->NewNode( + simplified()->CheckIf(DeoptimizeReason::kNotAHeapNumber), + is_heap_number, *effect, *control); + } else { + FieldAccess const storage_access = {kTaggedBase, + field_access.offset, + name.object(), + MaybeHandle(), + Type::OtherInternal(), + MachineType::TaggedPointer(), + kPointerWriteBarrier, + LoadSensitivity::kCritical, + field_access.const_field_info}; + storage = *effect = + graph()->NewNode(simplified()->LoadField(storage_access), storage, + *effect, *control); + } field_access.offset = HeapNumber::kValueOffset; field_access.name = MaybeHandle(); } diff --git a/deps/v8/src/compiler/scheduled-machine-lowering.cc b/deps/v8/src/compiler/scheduled-machine-lowering.cc index 9395c83e57c5d7..903052be1dcc02 100644 --- a/deps/v8/src/compiler/scheduled-machine-lowering.cc +++ b/deps/v8/src/compiler/scheduled-machine-lowering.cc @@ -19,7 +19,7 @@ ScheduledMachineLowering::ScheduledMachineLowering( SourcePositionTable* source_positions, NodeOriginTable* node_origins, PoisoningMitigationLevel poison_level) : schedule_(schedule), - graph_assembler_(js_graph, temp_zone, schedule), + graph_assembler_(js_graph, temp_zone, base::nullopt, schedule), select_lowering_(&graph_assembler_, js_graph->graph()), memory_lowering_(js_graph, temp_zone, &graph_assembler_, poison_level), reducers_({&select_lowering_, &memory_lowering_}, temp_zone), diff --git a/deps/v8/src/compiler/serializer-for-background-compilation.cc b/deps/v8/src/compiler/serializer-for-background-compilation.cc index a828010ee14c5f..83b88cd3bf6c97 100644 --- a/deps/v8/src/compiler/serializer-for-background-compilation.cc +++ b/deps/v8/src/compiler/serializer-for-background-compilation.cc @@ -198,6 +198,7 @@ namespace compiler { V(LdaLookupSlot) \ V(LdaLookupSlotInsideTypeof) \ V(LdaNamedProperty) \ + V(LdaNamedPropertyFromSuper) \ V(LdaNamedPropertyNoFeedback) \ V(LdaNull) \ V(Ldar) \ @@ -3260,6 +3261,13 @@ void SerializerForBackgroundCompilation::VisitLdaNamedProperty( ProcessNamedPropertyAccess(receiver, name, slot, AccessMode::kLoad); } +void SerializerForBackgroundCompilation::VisitLdaNamedPropertyFromSuper( + BytecodeArrayIterator* iterator) { + NameRef(broker(), + iterator->GetConstantForIndexOperand(1, broker()->isolate())); + // TODO(marja, v8:9237): Process feedback once it's added to the byte code. +} + // TODO(neis): Do feedback-independent serialization also for *NoFeedback // bytecodes. void SerializerForBackgroundCompilation::VisitLdaNamedPropertyNoFeedback( diff --git a/deps/v8/src/compiler/simd-scalar-lowering.cc b/deps/v8/src/compiler/simd-scalar-lowering.cc index a875cfada36a52..f8321079395a71 100644 --- a/deps/v8/src/compiler/simd-scalar-lowering.cc +++ b/deps/v8/src/compiler/simd-scalar-lowering.cc @@ -5,6 +5,7 @@ #include "src/compiler/simd-scalar-lowering.h" #include "src/codegen/machine-type.h" +#include "src/common/globals.h" #include "src/compiler/diamond.h" #include "src/compiler/linkage.h" #include "src/compiler/machine-operator.h" @@ -29,6 +30,7 @@ static const int32_t kShift8 = 24; static const int32_t kShiftMask8 = 0x7; static const int32_t kShiftMask16 = 0xF; static const int32_t kShiftMask32 = 0x1F; +static const int32_t kShiftMask64 = 0x3F; // Shift values are taken modulo lane size. This helper calculates the mask // required for different shift opcodes. @@ -46,6 +48,10 @@ int GetMaskForShift(Node* node) { case IrOpcode::kI32x4ShrS: case IrOpcode::kI32x4ShrU: return kShiftMask32; + case IrOpcode::kI64x2Shl: + case IrOpcode::kI64x2ShrS: + case IrOpcode::kI64x2ShrU: + return kShiftMask64; default: UNIMPLEMENTED(); } @@ -103,7 +109,17 @@ void SimdScalarLowering::LowerGraph() { } } -#define FOREACH_INT64X2_OPCODE(V) V(I64x2Splat) +#define FOREACH_INT64X2_OPCODE(V) \ + V(I64x2Splat) \ + V(I64x2ExtractLane) \ + V(I64x2ReplaceLane) \ + V(I64x2Neg) \ + V(I64x2Shl) \ + V(I64x2ShrS) \ + V(I64x2ShrU) \ + V(I64x2Add) \ + V(I64x2Sub) \ + V(I64x2Mul) #define FOREACH_INT32X4_OPCODE(V) \ V(I32x4Splat) \ @@ -128,15 +144,15 @@ void SimdScalarLowering::LowerGraph() { V(I32x4Eq) \ V(I32x4Ne) \ V(I32x4LtS) \ - V(I32x4LeS) \ + V(I32x4LtU) \ V(I32x4GtS) \ + V(I32x4GtU) \ + V(I32x4LeS) \ + V(I32x4LeU) \ V(I32x4GeS) \ + V(I32x4GeU) \ V(I32x4UConvertI16x8Low) \ V(I32x4UConvertI16x8High) \ - V(I32x4LtU) \ - V(I32x4LeU) \ - V(I32x4GtU) \ - V(I32x4GeU) \ V(I32x4Abs) \ V(S128And) \ V(S128Or) \ @@ -150,7 +166,19 @@ void SimdScalarLowering::LowerGraph() { V(V8x16AllTrue) \ V(I32x4BitMask) -#define FOREACH_FLOAT64X2_OPCODE(V) V(F64x2Splat) +#define FOREACH_FLOAT64X2_OPCODE(V) \ + V(F64x2Splat) \ + V(F64x2ExtractLane) \ + V(F64x2ReplaceLane) \ + V(F64x2Abs) \ + V(F64x2Neg) \ + V(F64x2Sqrt) \ + V(F64x2Add) \ + V(F64x2Sub) \ + V(F64x2Mul) \ + V(F64x2Div) \ + V(F64x2Min) \ + V(F64x2Max) #define FOREACH_FLOAT32X4_OPCODE(V) \ V(F32x4Splat) \ @@ -171,6 +199,12 @@ void SimdScalarLowering::LowerGraph() { V(F32x4Min) \ V(F32x4Max) +#define FOREACH_FLOAT64x2_TO_INT64x2OPCODE(V) \ + V(F64x2Eq) \ + V(F64x2Ne) \ + V(F64x2Lt) \ + V(F64x2Le) + #define FOREACH_FLOAT32X4_TO_INT32X4OPCODE(V) \ V(F32x4Eq) \ V(F32x4Ne) \ @@ -209,9 +243,13 @@ void SimdScalarLowering::LowerGraph() { V(I16x8Eq) \ V(I16x8Ne) \ V(I16x8LtS) \ - V(I16x8LeS) \ V(I16x8LtU) \ + V(I16x8GtS) \ + V(I16x8GtU) \ + V(I16x8LeS) \ V(I16x8LeU) \ + V(I16x8GeS) \ + V(I16x8GeU) \ V(I16x8RoundingAverageU) \ V(I16x8Abs) \ V(I16x8BitMask) @@ -241,11 +279,15 @@ void SimdScalarLowering::LowerGraph() { V(I8x16Eq) \ V(I8x16Ne) \ V(I8x16LtS) \ - V(I8x16LeS) \ V(I8x16LtU) \ + V(I8x16GtS) \ + V(I8x16GtU) \ + V(I8x16LeS) \ V(I8x16LeU) \ - V(S8x16Swizzle) \ - V(S8x16Shuffle) \ + V(I8x16GeS) \ + V(I8x16GeU) \ + V(I8x16Swizzle) \ + V(I8x16Shuffle) \ V(I8x16RoundingAverageU) \ V(I8x16Abs) \ V(I8x16BitMask) @@ -294,6 +336,10 @@ void SimdScalarLowering::SetLoweredType(Node* node, Node* output) { replacements_[node->id()].type = SimdType::kInt32x4; break; } + FOREACH_FLOAT64x2_TO_INT64x2OPCODE(CASE_STMT) { + replacements_[node->id()].type = SimdType::kInt64x2; + break; + } FOREACH_INT16X8_OPCODE(CASE_STMT) { replacements_[node->id()].type = SimdType::kInt16x8; break; @@ -314,6 +360,9 @@ void SimdScalarLowering::SetLoweredType(Node* node, Node* output) { case LoadTransformation::kS32x4LoadSplat: replacements_[node->id()].type = SimdType::kInt32x4; break; + case LoadTransformation::kS64x2LoadSplat: + replacements_[node->id()].type = SimdType::kInt64x2; + break; case LoadTransformation::kI16x8Load8x8S: case LoadTransformation::kI16x8Load8x8U: replacements_[node->id()].type = SimdType::kInt16x8; @@ -322,6 +371,10 @@ void SimdScalarLowering::SetLoweredType(Node* node, Node* output) { case LoadTransformation::kI32x4Load16x4U: replacements_[node->id()].type = SimdType::kInt32x4; break; + case LoadTransformation::kI64x2Load32x2S: + case LoadTransformation::kI64x2Load32x2U: + replacements_[node->id()].type = SimdType::kInt64x2; + break; default: UNIMPLEMENTED(); } @@ -526,9 +579,18 @@ void SimdScalarLowering::LowerLoadTransformOp(Node* node, SimdType type) { load_rep = MachineType::Uint16(); load_type = SimdType::kInt16x8; break; + case LoadTransformation::kI64x2Load32x2S: + load_rep = MachineType::Int32(); + load_type = SimdType::kInt32x4; + break; + case LoadTransformation::kI64x2Load32x2U: + load_rep = MachineType::Uint32(); + load_type = SimdType::kInt32x4; + break; case LoadTransformation::kS8x16LoadSplat: case LoadTransformation::kS16x8LoadSplat: case LoadTransformation::kS32x4LoadSplat: + case LoadTransformation::kS64x2LoadSplat: load_rep = MachineTypeFrom(type); break; default: @@ -569,6 +631,15 @@ void SimdScalarLowering::LowerLoadTransformOp(Node* node, SimdType type) { rep_nodes[i] = graph()->NewNode(load_op, base, indices[i], effect_input, control_input); effect_input = rep_nodes[i]; + + // Load operations are Word32 nodes, change them to Word64. + if (params.transformation == LoadTransformation::kI64x2Load32x2S) { + rep_nodes[i] = + graph()->NewNode(machine()->ChangeInt32ToInt64(), rep_nodes[i]); + } else if (params.transformation == LoadTransformation::kI64x2Load32x2U) { + rep_nodes[i] = + graph()->NewNode(machine()->ChangeUint32ToUint64(), rep_nodes[i]); + } } } else { // Load splat, load from the same index for every lane. @@ -687,15 +758,8 @@ void SimdScalarLowering::LowerCompareOp(Node* node, SimdType input_rep_type, } else { cmp_result = graph()->NewNode(op, rep_left[i], rep_right[i]); } - Diamond d_cmp(graph(), common(), - graph()->NewNode(machine()->Word32Equal(), cmp_result, - mcgraph_->Int32Constant(0))); - MachineRepresentation rep = - (input_rep_type == SimdType::kFloat32x4) - ? MachineRepresentation::kWord32 - : MachineTypeFrom(input_rep_type).representation(); - rep_node[i] = - d_cmp.Phi(rep, mcgraph_->Int32Constant(0), mcgraph_->Int32Constant(-1)); + Diamond d_cmp(graph(), common(), cmp_result); + rep_node[i] = ConstructPhiForComparison(d_cmp, input_rep_type, -1, 0); } ReplaceNode(node, rep_node, num_lanes); } @@ -999,6 +1063,14 @@ void SimdScalarLowering::LowerShiftOp(Node* node, SimdType type) { rep_node[i] = graph()->NewNode(machine()->Word32Shr(), rep_node[i], shift_node); break; + case IrOpcode::kI64x2ShrU: + rep_node[i] = + graph()->NewNode(machine()->Word64Shr(), rep_node[i], shift_node); + break; + case IrOpcode::kI64x2Shl: + rep_node[i] = + graph()->NewNode(machine()->Word64Shl(), rep_node[i], shift_node); + break; case IrOpcode::kI32x4Shl: rep_node[i] = graph()->NewNode(machine()->Word32Shl(), rep_node[i], shift_node); @@ -1013,6 +1085,10 @@ void SimdScalarLowering::LowerShiftOp(Node* node, SimdType type) { graph()->NewNode(machine()->Word32Shl(), rep_node[i], shift_node); rep_node[i] = FixUpperBits(rep_node[i], kShift8); break; + case IrOpcode::kI64x2ShrS: + rep_node[i] = + graph()->NewNode(machine()->Word64Sar(), rep_node[i], shift_node); + break; case IrOpcode::kI32x4ShrS: case IrOpcode::kI16x8ShrS: case IrOpcode::kI8x16ShrS: @@ -1026,6 +1102,26 @@ void SimdScalarLowering::LowerShiftOp(Node* node, SimdType type) { ReplaceNode(node, rep_node, num_lanes); } +Node* SimdScalarLowering::ConstructPhiForComparison(Diamond d, + SimdType rep_type, + int true_value, + int false_value) { + // Close the given Diamond d using a Phi node, taking care of constructing the + // right kind of constants (Int32 or Int64) based on rep_type. + if (rep_type == SimdType::kFloat64x2) { + MachineRepresentation rep = MachineRepresentation::kWord64; + return d.Phi(rep, mcgraph_->Int64Constant(true_value), + mcgraph_->Int64Constant(false_value)); + } else { + MachineRepresentation rep = + (rep_type == SimdType::kFloat32x4) + ? MachineRepresentation::kWord32 + : MachineTypeFrom(rep_type).representation(); + return d.Phi(rep, mcgraph_->Int32Constant(true_value), + mcgraph_->Int32Constant(false_value)); + } +} + void SimdScalarLowering::LowerNotEqual(Node* node, SimdType input_rep_type, const Operator* op) { DCHECK_EQ(2, node->InputCount()); @@ -1036,12 +1132,7 @@ void SimdScalarLowering::LowerNotEqual(Node* node, SimdType input_rep_type, for (int i = 0; i < num_lanes; ++i) { Diamond d(graph(), common(), graph()->NewNode(op, rep_left[i], rep_right[i])); - MachineRepresentation rep = - (input_rep_type == SimdType::kFloat32x4) - ? MachineRepresentation::kWord32 - : MachineTypeFrom(input_rep_type).representation(); - rep_node[i] = - d.Phi(rep, mcgraph_->Int32Constant(0), mcgraph_->Int32Constant(-1)); + rep_node[i] = ConstructPhiForComparison(d, input_rep_type, 0, -1); } ReplaceNode(node, rep_node, num_lanes); } @@ -1084,21 +1175,99 @@ void SimdScalarLowering::LowerBitMaskOp(Node* node, SimdType rep_type, ReplaceNode(node, rep_node, 1); } +void SimdScalarLowering::LowerAllTrueOp(Node* node, SimdType rep_type) { + // AllTrue ops require the input to be of a particular SimdType, but the op + // itself is always replaced by a Int32x4 with 1 node. + int num_lanes = NumLanes(rep_type); + DCHECK_EQ(1, node->InputCount()); + Node** rep = GetReplacementsWithType(node->InputAt(0), rep_type); + + Node** rep_node = zone()->NewArray(num_lanes); + Node* zero = mcgraph_->Int32Constant(0); + Node* tmp_result = mcgraph_->Int32Constant(1); + for (int i = 0; i < num_lanes; ++i) { + Diamond d(graph(), common(), + graph()->NewNode(machine()->Word32Equal(), rep[i], zero)); + tmp_result = d.Phi(MachineRepresentation::kWord32, zero, tmp_result); + } + rep_node[0] = tmp_result; + for (int i = 1; i < num_lanes; ++i) { + rep_node[i] = nullptr; + } + ReplaceNode(node, rep_node, num_lanes); +} + void SimdScalarLowering::LowerNode(Node* node) { SimdType rep_type = ReplacementType(node); int num_lanes = NumLanes(rep_type); switch (node->opcode()) { case IrOpcode::kS128Const: { - // Lower 128.const to 4 Int32Constant. + // We could use GetReplacementsWithType for all this, but it adds a lot of + // nodes, so sign extend the immediates ourselves here. DCHECK_EQ(0, node->InputCount()); - constexpr int kNumLanes = kSimd128Size / sizeof(uint32_t); - uint32_t val[kNumLanes]; - memcpy(val, S128ImmediateParameterOf(node->op()).data(), kSimd128Size); - Node** rep_node = zone()->NewArray(kNumLanes); - for (int i = 0; i < kNumLanes; ++i) { - rep_node[i] = mcgraph_->Int32Constant(val[i]); + Node** rep_node = zone()->NewArray(num_lanes); + S128ImmediateParameter params = S128ImmediateParameterOf(node->op()); + + // For all the small ints below, we have a choice of static_cast or bit + // twiddling, clang seems to be able to optimize either + // (https://godbolt.org/z/9c65o8) so use static_cast for clarity. + switch (rep_type) { + case SimdType::kInt8x16: { + for (int i = 0; i < num_lanes; ++i) { + Address data_address = reinterpret_cast
(params.data() + i); + rep_node[i] = mcgraph_->Int32Constant( + static_cast(static_cast( + base::ReadLittleEndianValue(data_address)))); + } + break; + } + case SimdType::kInt16x8: { + int16_t val[kNumLanes16]; + memcpy(val, params.data(), kSimd128Size); + for (int i = 0; i < num_lanes; ++i) { + rep_node[i] = mcgraph_->Int32Constant(static_cast( + base::ReadLittleEndianValue(&val[i]))); + } + break; + } + case SimdType::kInt32x4: { + uint32_t val[kNumLanes32]; + memcpy(val, params.data(), kSimd128Size); + for (int i = 0; i < num_lanes; ++i) { + rep_node[i] = mcgraph_->Int32Constant( + base::ReadLittleEndianValue(&val[i])); + } + break; + } + case SimdType::kInt64x2: { + uint64_t val[kNumLanes64]; + memcpy(val, params.data(), kSimd128Size); + for (int i = 0; i < num_lanes; ++i) { + rep_node[i] = mcgraph_->Int64Constant( + base::ReadLittleEndianValue(&val[i])); + } + break; + } + case SimdType::kFloat32x4: { + float val[kNumLanes32]; + memcpy(val, params.data(), kSimd128Size); + for (int i = 0; i < num_lanes; ++i) { + rep_node[i] = mcgraph_->Float32Constant( + base::ReadLittleEndianValue(&val[i])); + } + break; + } + case SimdType::kFloat64x2: { + double val[kNumLanes64]; + memcpy(val, params.data(), kSimd128Size); + for (int i = 0; i < num_lanes; ++i) { + rep_node[i] = mcgraph_->Float64Constant( + base::ReadLittleEndianValue(&val[i])); + } + break; + } } - ReplaceNode(node, rep_node, kNumLanes); + ReplaceNode(node, rep_node, num_lanes); break; } case IrOpcode::kStart: { @@ -1152,7 +1321,9 @@ void SimdScalarLowering::LowerNode(Node* node) { } case IrOpcode::kSimd128ReverseBytes: { DCHECK_EQ(1, node->InputCount()); - bool is_float = ReplacementType(node->InputAt(0)) == SimdType::kFloat32x4; + SimdType input_type = ReplacementType(node->InputAt(0)); + bool is_float = input_type == SimdType::kFloat32x4 || + input_type == SimdType::kFloat64x2; replacements_[node->id()].type = is_float ? SimdType::kFloat32x4 : SimdType::kInt32x4; Node** rep = GetReplacementsWithType( @@ -1189,7 +1360,30 @@ void SimdScalarLowering::LowerNode(Node* node) { break; } case IrOpcode::kReturn: { + int old_input_count = node->InputCount(); + int return_arity = static_cast(signature()->return_count()); + for (int i = 0; i < return_arity; i++) { + if (signature()->GetReturn(i) != MachineRepresentation::kSimd128) { + continue; + } + + // Return nodes have a hidden input at value 0. + Node* input = node->InputAt(i + 1); + if (!HasReplacement(0, input)) { + continue; + } + + // V128 return types are lowered to i32x4. + Node** reps = GetReplacementsWithType(input, rep_type); + ReplaceNode(input, reps, NumLanes(rep_type)); + } + DefaultLowering(node); + // Nothing needs to be done here since inputs did not change. + if (old_input_count == node->InputCount()) { + break; + } + int new_return_count = GetReturnCountAfterLoweringSimd128(signature()); if (static_cast(signature()->return_count()) != new_return_count) { NodeProperties::ChangeOp(node, common()->Return(new_return_count)); @@ -1204,6 +1398,16 @@ void SimdScalarLowering::LowerNode(Node* node) { GetReturnCountAfterLoweringSimd128(call_descriptor) != static_cast(call_descriptor->ReturnCount()); + // All call arguments are lowered to i32x4 in the call descriptor, so the + // arguments need to be converted to i32x4 as well. + for (int i = NodeProperties::PastValueIndex(node) - 1; i >= 0; i--) { + Node* input = node->InputAt(i); + if (HasReplacement(0, input)) { + Node** reps = GetReplacementsWithType(input, SimdType::kInt32x4); + ReplaceNode(input, reps, NumLanes(SimdType::kInt32x4)); + } + } + if (DefaultLowering(node) || returns_require_lowering) { // We have to adjust the call descriptor. const Operator* op = common()->Call( @@ -1216,6 +1420,21 @@ void SimdScalarLowering::LowerNode(Node* node) { } size_t return_arity = call_descriptor->ReturnCount(); + + if (return_arity == 1) { + // We access the additional return values through projections. + // Special case for return_arity 1, with multi-returns, we would have + // already built projections for each return value, and will be handled + // by the following code. + Node* rep_node[kNumLanes32]; + for (int i = 0; i < kNumLanes32; ++i) { + rep_node[i] = + graph()->NewNode(common()->Projection(i), node, graph()->start()); + } + ReplaceNode(node, rep_node, kNumLanes32); + break; + } + ZoneVector projections(return_arity, zone()); NodeProperties::CollectValueProjections(node, projections.data(), return_arity); @@ -1261,6 +1480,18 @@ void SimdScalarLowering::LowerNode(Node* node) { } break; } + case IrOpcode::kI64x2Add: { + LowerBinaryOp(node, rep_type, machine()->Int64Add()); + break; + } + case IrOpcode::kI64x2Sub: { + LowerBinaryOp(node, rep_type, machine()->Int64Sub()); + break; + } + case IrOpcode::kI64x2Mul: { + LowerBinaryOp(node, rep_type, machine()->Int64Mul()); + break; + } #define I32X4_BINOP_CASE(opcode, instruction) \ case IrOpcode::opcode: { \ LowerBinaryOp(node, rep_type, machine()->instruction()); \ @@ -1340,6 +1571,18 @@ void SimdScalarLowering::LowerNode(Node* node) { LowerIntMinMax(node, machine()->Uint32LessThan(), false, rep_type); break; } + case IrOpcode::kI64x2Neg: { + DCHECK_EQ(1, node->InputCount()); + Node** rep = GetReplacementsWithType(node->InputAt(0), rep_type); + int num_lanes = NumLanes(rep_type); + Node** rep_node = zone()->NewArray(num_lanes); + Node* zero = graph()->NewNode(common()->Int64Constant(0)); + for (int i = 0; i < num_lanes; ++i) { + rep_node[i] = graph()->NewNode(machine()->Int64Sub(), zero, rep[i]); + } + ReplaceNode(node, rep_node, num_lanes); + break; + } case IrOpcode::kI32x4Neg: case IrOpcode::kI16x8Neg: case IrOpcode::kI8x16Neg: { @@ -1483,12 +1726,15 @@ void SimdScalarLowering::LowerNode(Node* node) { LowerPack(node, SimdType::kInt16x8, SimdType::kInt8x16, false); break; } + case IrOpcode::kI64x2Shl: case IrOpcode::kI32x4Shl: case IrOpcode::kI16x8Shl: case IrOpcode::kI8x16Shl: + case IrOpcode::kI64x2ShrS: case IrOpcode::kI32x4ShrS: case IrOpcode::kI16x8ShrS: case IrOpcode::kI8x16ShrS: + case IrOpcode::kI64x2ShrU: case IrOpcode::kI32x4ShrU: case IrOpcode::kI16x8ShrU: case IrOpcode::kI8x16ShrU: { @@ -1544,6 +1790,42 @@ void SimdScalarLowering::LowerNode(Node* node) { LowerUnaryOp(node, SimdType::kInt32x4, machine()->RoundUint32ToFloat32()); break; } + case IrOpcode::kF64x2Abs: { + LowerUnaryOp(node, rep_type, machine()->Float64Abs()); + break; + } + case IrOpcode::kF64x2Neg: { + LowerUnaryOp(node, rep_type, machine()->Float64Neg()); + break; + } + case IrOpcode::kF64x2Sqrt: { + LowerUnaryOp(node, rep_type, machine()->Float64Sqrt()); + break; + } + case IrOpcode::kF64x2Add: { + LowerBinaryOp(node, rep_type, machine()->Float64Add()); + break; + } + case IrOpcode::kF64x2Sub: { + LowerBinaryOp(node, rep_type, machine()->Float64Sub()); + break; + } + case IrOpcode::kF64x2Mul: { + LowerBinaryOp(node, rep_type, machine()->Float64Mul()); + break; + } + case IrOpcode::kF64x2Div: { + LowerBinaryOp(node, rep_type, machine()->Float64Div()); + break; + } + case IrOpcode::kF64x2Min: { + LowerBinaryOp(node, rep_type, machine()->Float64Min()); + break; + } + case IrOpcode::kF64x2Max: { + LowerBinaryOp(node, rep_type, machine()->Float64Max()); + break; + } case IrOpcode::kF64x2Splat: case IrOpcode::kF32x4Splat: case IrOpcode::kI64x2Splat: @@ -1551,18 +1833,30 @@ void SimdScalarLowering::LowerNode(Node* node) { case IrOpcode::kI16x8Splat: case IrOpcode::kI8x16Splat: { Node** rep_node = zone()->NewArray(num_lanes); + Node* val = (HasReplacement(0, node->InputAt(0))) + ? GetReplacements(node->InputAt(0))[0] + : node->InputAt(0); + + // I16 and I8 are placed in Word32 nodes, we need to mask them + // accordingly, to account for overflows, then sign extend them. + if (node->opcode() == IrOpcode::kI16x8Splat) { + val = graph()->NewNode(machine()->SignExtendWord16ToInt32(), + Mask(val, kMask16)); + } else if (node->opcode() == IrOpcode::kI8x16Splat) { + val = graph()->NewNode(machine()->SignExtendWord8ToInt32(), + Mask(val, kMask8)); + } + for (int i = 0; i < num_lanes; ++i) { - if (HasReplacement(0, node->InputAt(0))) { - rep_node[i] = GetReplacements(node->InputAt(0))[0]; - } else { - rep_node[i] = node->InputAt(0); - } + rep_node[i] = val; } ReplaceNode(node, rep_node, num_lanes); break; } - case IrOpcode::kI32x4ExtractLane: + case IrOpcode::kF64x2ExtractLane: case IrOpcode::kF32x4ExtractLane: + case IrOpcode::kI64x2ExtractLane: + case IrOpcode::kI32x4ExtractLane: case IrOpcode::kI16x8ExtractLaneU: case IrOpcode::kI16x8ExtractLaneS: case IrOpcode::kI8x16ExtractLaneU: @@ -1573,11 +1867,14 @@ void SimdScalarLowering::LowerNode(Node* node) { for (int i = 1; i < num_lanes; ++i) { rep_node[i] = nullptr; } + ReplaceNode(node, rep_node, num_lanes); break; } - case IrOpcode::kI32x4ReplaceLane: + case IrOpcode::kF64x2ReplaceLane: case IrOpcode::kF32x4ReplaceLane: + case IrOpcode::kI64x2ReplaceLane: + case IrOpcode::kI32x4ReplaceLane: case IrOpcode::kI16x8ReplaceLane: case IrOpcode::kI8x16ReplaceLane: { DCHECK_EQ(2, node->InputCount()); @@ -1601,6 +1898,9 @@ void SimdScalarLowering::LowerNode(Node* node) { LowerCompareOp(node, SimdType::k##type, machine()->lowering_op(), invert); \ break; \ } + COMPARISON_CASE(Float64x2, kF64x2Eq, Float64Equal, false) + COMPARISON_CASE(Float64x2, kF64x2Lt, Float64LessThan, false) + COMPARISON_CASE(Float64x2, kF64x2Le, Float64LessThanOrEqual, false) COMPARISON_CASE(Float32x4, kF32x4Eq, Float32Equal, false) COMPARISON_CASE(Float32x4, kF32x4Lt, Float32LessThan, false) COMPARISON_CASE(Float32x4, kF32x4Le, Float32LessThanOrEqual, false) @@ -1634,6 +1934,10 @@ void SimdScalarLowering::LowerNode(Node* node) { COMPARISON_CASE(Int8x16, kI8x16GtU, Uint32LessThan, true) COMPARISON_CASE(Int8x16, kI8x16GeU, Uint32LessThanOrEqual, true) #undef COMPARISON_CASE + case IrOpcode::kF64x2Ne: { + LowerNotEqual(node, SimdType::kFloat64x2, machine()->Float64Equal()); + break; + } case IrOpcode::kF32x4Ne: { LowerNotEqual(node, SimdType::kFloat32x4, machine()->Float32Equal()); break; @@ -1655,7 +1959,8 @@ void SimdScalarLowering::LowerNode(Node* node) { DCHECK(ReplacementType(node->InputAt(0)) == SimdType::kInt32x4 || ReplacementType(node->InputAt(0)) == SimdType::kInt16x8 || ReplacementType(node->InputAt(0)) == SimdType::kInt8x16); - Node** boolean_input = GetReplacements(node->InputAt(0)); + Node** boolean_input = + GetReplacementsWithType(node->InputAt(0), rep_type); Node** rep_left = GetReplacementsWithType(node->InputAt(1), rep_type); Node** rep_right = GetReplacementsWithType(node->InputAt(2), rep_type); Node** rep_node = zone()->NewArray(num_lanes); @@ -1670,7 +1975,7 @@ void SimdScalarLowering::LowerNode(Node* node) { ReplaceNode(node, rep_node, num_lanes); break; } - case IrOpcode::kS8x16Swizzle: { + case IrOpcode::kI8x16Swizzle: { DCHECK_EQ(2, node->InputCount()); Node** rep_left = GetReplacementsWithType(node->InputAt(0), rep_type); Node** indices = GetReplacementsWithType(node->InputAt(1), rep_type); @@ -1709,7 +2014,7 @@ void SimdScalarLowering::LowerNode(Node* node) { ReplaceNode(node, rep_nodes, num_lanes); break; } - case IrOpcode::kS8x16Shuffle: { + case IrOpcode::kI8x16Shuffle: { DCHECK_EQ(2, node->InputCount()); S128ImmediateParameter shuffle = S128ImmediateParameterOf(node->op()); Node** rep_left = GetReplacementsWithType(node->InputAt(0), rep_type); @@ -1723,45 +2028,22 @@ void SimdScalarLowering::LowerNode(Node* node) { break; } case IrOpcode::kV32x4AnyTrue: - case IrOpcode::kV32x4AllTrue: case IrOpcode::kV16x8AnyTrue: - case IrOpcode::kV16x8AllTrue: - case IrOpcode::kV8x16AnyTrue: - case IrOpcode::kV8x16AllTrue: { + case IrOpcode::kV8x16AnyTrue: { DCHECK_EQ(1, node->InputCount()); - SimdType input_rep_type = ReplacementType(node->InputAt(0)); - Node** rep; - // If the input is a SIMD float, bitcast it to a SIMD int of the same - // shape, because the comparisons below use Word32. - if (input_rep_type == SimdType::kFloat32x4) { - // TODO(v8:9418): f64x2 lowering is not implemented yet. - rep = GetReplacementsWithType(node->InputAt(0), SimdType::kInt32x4); - } else { - rep = GetReplacements(node->InputAt(0)); - } - int input_num_lanes = NumLanes(input_rep_type); + // AnyTrue always returns a I32x4, and can work with inputs of any shape, + // but we still need GetReplacementsWithType if input is float. + DCHECK_EQ(ReplacementType(node), SimdType::kInt32x4); + Node** reps = GetReplacementsWithType(node->InputAt(0), rep_type); Node** rep_node = zone()->NewArray(num_lanes); Node* true_node = mcgraph_->Int32Constant(1); - Node* false_node = mcgraph_->Int32Constant(0); - Node* tmp_result = false_node; - if (node->opcode() == IrOpcode::kV32x4AllTrue || - node->opcode() == IrOpcode::kV16x8AllTrue || - node->opcode() == IrOpcode::kV8x16AllTrue) { - tmp_result = true_node; - } - for (int i = 0; i < input_num_lanes; ++i) { - Diamond is_false( - graph(), common(), - graph()->NewNode(machine()->Word32Equal(), rep[i], false_node)); - if (node->opcode() == IrOpcode::kV32x4AllTrue || - node->opcode() == IrOpcode::kV16x8AllTrue || - node->opcode() == IrOpcode::kV8x16AllTrue) { - tmp_result = is_false.Phi(MachineRepresentation::kWord32, false_node, - tmp_result); - } else { - tmp_result = is_false.Phi(MachineRepresentation::kWord32, tmp_result, - true_node); - } + Node* zero = mcgraph_->Int32Constant(0); + Node* tmp_result = zero; + for (int i = 0; i < num_lanes; ++i) { + Diamond d(graph(), common(), + graph()->NewNode(machine()->Word32Equal(), reps[i], zero)); + tmp_result = + d.Phi(MachineRepresentation::kWord32, tmp_result, true_node); } rep_node[0] = tmp_result; for (int i = 1; i < num_lanes; ++i) { @@ -1770,6 +2052,18 @@ void SimdScalarLowering::LowerNode(Node* node) { ReplaceNode(node, rep_node, num_lanes); break; } + case IrOpcode::kV32x4AllTrue: { + LowerAllTrueOp(node, SimdType::kInt32x4); + break; + } + case IrOpcode::kV16x8AllTrue: { + LowerAllTrueOp(node, SimdType::kInt16x8); + break; + } + case IrOpcode::kV8x16AllTrue: { + LowerAllTrueOp(node, SimdType::kInt8x16); + break; + } case IrOpcode::kI8x16BitMask: { LowerBitMaskOp(node, rep_type, 7); break; @@ -1789,11 +2083,18 @@ void SimdScalarLowering::LowerNode(Node* node) { Node** rep_right = GetReplacementsWithType(node->InputAt(1), rep_type); int num_lanes = NumLanes(rep_type); Node** rep_node = zone()->NewArray(num_lanes); + // Nodes are stored signed, so mask away the top bits. // rounding_average(left, right) = (left + right + 1) >> 1 + const int bit_mask = num_lanes == 16 ? kMask8 : kMask16; for (int i = 0; i < num_lanes; ++i) { + Node* mask_left = graph()->NewNode(machine()->Word32And(), rep_left[i], + mcgraph_->Int32Constant(bit_mask)); + Node* mask_right = + graph()->NewNode(machine()->Word32And(), rep_right[i], + mcgraph_->Int32Constant(bit_mask)); Node* left_plus_right_plus_one = graph()->NewNode( machine()->Int32Add(), - graph()->NewNode(machine()->Int32Add(), rep_left[i], rep_right[i]), + graph()->NewNode(machine()->Int32Add(), mask_left, mask_right), mcgraph_->Int32Constant(1)); rep_node[i] = graph()->NewNode(machine()->Word32Shr(), left_plus_right_plus_one, @@ -1862,6 +2163,28 @@ void SimdScalarLowering::Int32ToFloat32(Node** replacements, Node** result) { } } +void SimdScalarLowering::Int64ToFloat64(Node** replacements, Node** result) { + for (int i = 0; i < kNumLanes64; ++i) { + if (replacements[i] != nullptr) { + result[i] = + graph()->NewNode(machine()->BitcastInt64ToFloat64(), replacements[i]); + } else { + result[i] = nullptr; + } + } +} + +void SimdScalarLowering::Float64ToInt64(Node** replacements, Node** result) { + for (int i = 0; i < kNumLanes64; ++i) { + if (replacements[i] != nullptr) { + result[i] = + graph()->NewNode(machine()->BitcastFloat64ToInt64(), replacements[i]); + } else { + result[i] = nullptr; + } + } +} + void SimdScalarLowering::Float32ToInt32(Node** replacements, Node** result) { for (int i = 0; i < kNumLanes32; ++i) { if (replacements[i] != nullptr) { @@ -1873,6 +2196,26 @@ void SimdScalarLowering::Float32ToInt32(Node** replacements, Node** result) { } } +void SimdScalarLowering::Int64ToInt32(Node** replacements, Node** result) { + const int num_ints = sizeof(int64_t) / sizeof(int32_t); + const int bit_size = sizeof(int32_t) * 8; + const Operator* truncate = machine()->TruncateInt64ToInt32(); + + for (int i = 0; i < kNumLanes64; i++) { + if (replacements[i] != nullptr) { + for (int j = 0; j < num_ints; j++) { + result[num_ints * i + j] = graph()->NewNode( + truncate, graph()->NewNode(machine()->Word64Sar(), replacements[i], + mcgraph_->Int32Constant(j * bit_size))); + } + } else { + for (int j = 0; j < num_ints; j++) { + result[num_ints * i + j] = nullptr; + } + } + } +} + template void SimdScalarLowering::Int32ToSmallerInt(Node** replacements, Node** result) { const int num_ints = sizeof(int32_t) / sizeof(T); @@ -1926,6 +2269,20 @@ void SimdScalarLowering::SmallerIntToInt32(Node** replacements, Node** result) { } } +void SimdScalarLowering::Int32ToInt64(Node** replacements, Node** result) { + const int num_ints = sizeof(int64_t) / sizeof(int32_t); + + for (int i = 0; i < kNumLanes64; i++) { + Node* i64 = graph()->NewNode(machine()->ChangeUint32ToUint64(), + replacements[num_ints * i + 1]); + Node* high = graph()->NewNode(machine()->Word64Shl(), i64, + mcgraph_->Int32Constant(32)); + Node* i64_low = graph()->NewNode(machine()->ChangeUint32ToUint64(), + replacements[num_ints * i]); + result[i] = graph()->NewNode(machine()->Word64Or(), high, i64_low); + } +} + Node** SimdScalarLowering::GetReplacementsWithType(Node* node, SimdType type) { Node** replacements = GetReplacements(node); if (ReplacementType(node) == type) { @@ -1933,8 +2290,22 @@ Node** SimdScalarLowering::GetReplacementsWithType(Node* node, SimdType type) { } int num_lanes = NumLanes(type); Node** result = zone()->NewArray(num_lanes); - if (type == SimdType::kInt32x4) { - if (ReplacementType(node) == SimdType::kFloat32x4) { + if (type == SimdType::kInt64x2) { + if (ReplacementType(node) == SimdType::kInt32x4) { + Int32ToInt64(replacements, result); + } else if (ReplacementType(node) == SimdType::kFloat64x2) { + Float64ToInt64(replacements, result); + } else { + UNIMPLEMENTED(); + } + } else if (type == SimdType::kInt32x4) { + if (ReplacementType(node) == SimdType::kInt64x2) { + Int64ToInt32(replacements, result); + } else if (ReplacementType(node) == SimdType::kFloat64x2) { + Node** float64_to_int64 = zone()->NewArray(kNumLanes64); + Float64ToInt64(replacements, float64_to_int64); + Int64ToInt32(float64_to_int64, result); + } else if (ReplacementType(node) == SimdType::kFloat32x4) { Float32ToInt32(replacements, result); } else if (ReplacementType(node) == SimdType::kInt16x8) { SmallerIntToInt32(replacements, result); @@ -1943,8 +2314,24 @@ Node** SimdScalarLowering::GetReplacementsWithType(Node* node, SimdType type) { } else { UNREACHABLE(); } + } else if (type == SimdType::kFloat64x2) { + if (ReplacementType(node) == SimdType::kInt64x2) { + Int64ToFloat64(replacements, result); + } else if (ReplacementType(node) == SimdType::kInt32x4) { + Node** int32_to_int64 = zone()->NewArray(kNumLanes64); + Int32ToInt64(replacements, int32_to_int64); + Int64ToFloat64(int32_to_int64, result); + } else { + UNIMPLEMENTED(); + } } else if (type == SimdType::kFloat32x4) { - if (ReplacementType(node) == SimdType::kInt32x4) { + if (ReplacementType(node) == SimdType::kFloat64x2) { + Node** float64_to_int64 = zone()->NewArray(kNumLanes64); + Node** int64_to_int32 = zone()->NewArray(kNumLanes32); + Float64ToInt64(replacements, float64_to_int64); + Int64ToInt32(float64_to_int64, int64_to_int32); + Int32ToFloat32(int64_to_int32, result); + } else if (ReplacementType(node) == SimdType::kInt32x4) { Int32ToFloat32(replacements, result); } else if (ReplacementType(node) == SimdType::kInt16x8) { UNIMPLEMENTED(); @@ -1958,13 +2345,23 @@ Node** SimdScalarLowering::GetReplacementsWithType(Node* node, SimdType type) { if (ReplacementType(node) == SimdType::kInt32x4) { Int32ToSmallerInt(replacements, result); } else if (ReplacementType(node) == SimdType::kFloat32x4) { - UNIMPLEMENTED(); + Node** float32_to_int32 = zone()->NewArray(kNumLanes32); + Float32ToInt32(replacements, float32_to_int32); + Int32ToSmallerInt(float32_to_int32, result); } else { UNREACHABLE(); } } else if (type == SimdType::kInt8x16) { - if (ReplacementType(node) == SimdType::kInt32x4) { + if (ReplacementType(node) == SimdType::kInt64x2) { + Node** int64_to_int32 = zone()->NewArray(kNumLanes32); + Int64ToInt32(replacements, int64_to_int32); + Int32ToSmallerInt(int64_to_int32, result); + } else if (ReplacementType(node) == SimdType::kInt32x4) { Int32ToSmallerInt(replacements, result); + } else if (ReplacementType(node) == SimdType::kInt16x8) { + Node** int16_to_int32 = zone()->NewArray(kNumLanes32); + SmallerIntToInt32(replacements, int16_to_int32); + Int32ToSmallerInt(int16_to_int32, result); } else { UNIMPLEMENTED(); } diff --git a/deps/v8/src/compiler/simd-scalar-lowering.h b/deps/v8/src/compiler/simd-scalar-lowering.h index a852f94c7c74ec..b86071f0ae854d 100644 --- a/deps/v8/src/compiler/simd-scalar-lowering.h +++ b/deps/v8/src/compiler/simd-scalar-lowering.h @@ -6,6 +6,7 @@ #define V8_COMPILER_SIMD_SCALAR_LOWERING_H_ #include "src/compiler/common-operator.h" +#include "src/compiler/diamond.h" #include "src/compiler/graph.h" #include "src/compiler/machine-graph.h" #include "src/compiler/machine-operator.h" @@ -73,12 +74,16 @@ class SimdScalarLowering { bool HasReplacement(size_t index, Node* node); Node** GetReplacements(Node* node); int ReplacementCount(Node* node); + void Float64ToInt64(Node** replacements, Node** result); void Float32ToInt32(Node** replacements, Node** result); void Int32ToFloat32(Node** replacements, Node** result); + void Int64ToFloat64(Node** replacements, Node** result); + void Int64ToInt32(Node** replacements, Node** result); template void Int32ToSmallerInt(Node** replacements, Node** result); template void SmallerIntToInt32(Node** replacements, Node** result); + void Int32ToInt64(Node** replacements, Node** result); Node** GetReplacementsWithType(Node* node, SimdType type); SimdType ReplacementType(Node* node); void PreparePhiReplacement(Node* phi); @@ -89,6 +94,8 @@ class SimdScalarLowering { void LowerStoreOp(Node* node); void LowerBinaryOp(Node* node, SimdType input_rep_type, const Operator* op, bool not_horizontal = true); + Node* ConstructPhiForComparison(Diamond d, SimdType rep_type, int true_value, + int false_value); void LowerCompareOp(Node* node, SimdType input_rep_type, const Operator* op, bool invert_inputs = false); Node* FixUpperBits(Node* input, int32_t shift); @@ -111,6 +118,7 @@ class SimdScalarLowering { void LowerNotEqual(Node* node, SimdType input_rep_type, const Operator* op); MachineType MachineTypeFrom(SimdType simdType); void LowerBitMaskOp(Node* node, SimdType rep_type, int msb_index); + void LowerAllTrueOp(Node* node, SimdType rep_type); MachineGraph* const mcgraph_; NodeMarker state_; diff --git a/deps/v8/src/compiler/simplified-lowering.cc b/deps/v8/src/compiler/simplified-lowering.cc index 491fe74e39d770..2842259a2eac55 100644 --- a/deps/v8/src/compiler/simplified-lowering.cc +++ b/deps/v8/src/compiler/simplified-lowering.cc @@ -2828,6 +2828,7 @@ class RepresentationSelector { return VisitUnop(node, UseInfo::AnyTagged(), MachineRepresentation::kTaggedPointer); } + case IrOpcode::kTierUpCheck: case IrOpcode::kUpdateInterruptBudget: { ProcessInput(node, 0, UseInfo::AnyTagged()); ProcessRemainingInputs(node, 1); diff --git a/deps/v8/src/compiler/simplified-operator-reducer.cc b/deps/v8/src/compiler/simplified-operator-reducer.cc index e2f87b674e887d..81de95783f0e10 100644 --- a/deps/v8/src/compiler/simplified-operator-reducer.cc +++ b/deps/v8/src/compiler/simplified-operator-reducer.cc @@ -220,6 +220,39 @@ Reduction SimplifiedOperatorReducer::Reduce(Node* node) { if (m.left().node() == m.right().node()) return ReplaceBoolean(true); break; } + case IrOpcode::kCheckedInt32Add: { + // (x + a) + b => x + (a + b) where a and b are constants and have the + // same sign. + Int32BinopMatcher m(node); + if (m.right().HasValue()) { + Node* checked_int32_add = m.left().node(); + if (checked_int32_add->opcode() == IrOpcode::kCheckedInt32Add) { + Int32BinopMatcher n(checked_int32_add); + if (n.right().HasValue() && + (n.right().Value() >= 0) == (m.right().Value() >= 0)) { + int32_t val; + bool overflow = base::bits::SignedAddOverflow32( + n.right().Value(), m.right().Value(), &val); + if (!overflow) { + bool has_no_other_uses = true; + for (Edge edge : checked_int32_add->use_edges()) { + if (!edge.from()->IsDead() && edge.from() != node) { + has_no_other_uses = false; + break; + } + } + if (has_no_other_uses) { + node->ReplaceInput(0, n.left().node()); + node->ReplaceInput(1, jsgraph()->Int32Constant(val)); + RelaxEffectsAndControls(checked_int32_add); + return Changed(node); + } + } + } + } + } + break; + } default: break; } diff --git a/deps/v8/src/compiler/simplified-operator.cc b/deps/v8/src/compiler/simplified-operator.cc index bedfb6acaa8396..33bd71d2211d56 100644 --- a/deps/v8/src/compiler/simplified-operator.cc +++ b/deps/v8/src/compiler/simplified-operator.cc @@ -289,19 +289,26 @@ CheckMapsParameters const& CheckMapsParametersOf(Operator const* op) { bool operator==(DynamicCheckMapsParameters const& lhs, DynamicCheckMapsParameters const& rhs) { - return lhs.handler().address() == rhs.handler().address() && - lhs.feedback() == rhs.feedback() && lhs.state() == rhs.state(); + // FeedbackSource is sufficient as an equality check. FeedbackSource uniquely + // determines all other properties (handler, flags and the monomorphic map + DCHECK_IMPLIES(lhs.feedback() == rhs.feedback(), + lhs.flags() == rhs.flags() && lhs.state() == rhs.state() && + lhs.handler().address() == rhs.handler().address() && + lhs.map().address() == rhs.map().address()); + return lhs.feedback() == rhs.feedback(); } size_t hash_value(DynamicCheckMapsParameters const& p) { FeedbackSource::Hash feedback_hash; - return base::hash_combine(p.handler().address(), feedback_hash(p.feedback()), - p.state()); + // FeedbackSource is sufficient for hashing. FeedbackSource uniquely + // determines all other properties (handler, flags and the monomorphic map + return base::hash_combine(feedback_hash(p.feedback())); } std::ostream& operator<<(std::ostream& os, DynamicCheckMapsParameters const& p) { - return os << p.handler() << ", " << p.feedback() << "," << p.state(); + return os << p.handler() << ", " << p.feedback() << "," << p.state() << "," + << p.flags() << "," << p.map().address(); } DynamicCheckMapsParameters const& DynamicCheckMapsParametersOf( @@ -1315,6 +1322,12 @@ const Operator* SimplifiedOperatorBuilder::UpdateInterruptBudget(int delta) { "UpdateInterruptBudget", 1, 1, 1, 0, 1, 0, delta); } +const Operator* SimplifiedOperatorBuilder::TierUpCheck() { + return zone()->New(IrOpcode::kTierUpCheck, + Operator::kNoThrow | Operator::kNoDeopt, + "TierUpCheck", 1, 1, 1, 0, 1, 0); +} + const Operator* SimplifiedOperatorBuilder::AssertType(Type type) { DCHECK(type.IsRange()); return zone()->New>(IrOpcode::kAssertType, @@ -1474,11 +1487,10 @@ const Operator* SimplifiedOperatorBuilder::CheckMaps( } const Operator* SimplifiedOperatorBuilder::DynamicCheckMaps( - CheckMapsFlags flags, Handle handler, - const FeedbackSource& feedback, - DynamicCheckMapsParameters::ICState ic_state) { - DynamicCheckMapsParameters const parameters(flags, handler, feedback, - ic_state); + CheckMapsFlags flags, Handle handler, MaybeHandle maybe_map, + const FeedbackSource& feedback) { + DynamicCheckMapsParameters const parameters(flags, handler, maybe_map, + feedback); return zone()->New>( // -- IrOpcode::kDynamicCheckMaps, // opcode Operator::kNoThrow | Operator::kNoWrite, // flags diff --git a/deps/v8/src/compiler/simplified-operator.h b/deps/v8/src/compiler/simplified-operator.h index c4b5740c102cb3..eab865fd5969fc 100644 --- a/deps/v8/src/compiler/simplified-operator.h +++ b/deps/v8/src/compiler/simplified-operator.h @@ -432,19 +432,26 @@ class DynamicCheckMapsParameters final { enum ICState { kMonomorphic, kPolymorphic }; DynamicCheckMapsParameters(CheckMapsFlags flags, Handle handler, - const FeedbackSource& feedback, ICState state) - : flags_(flags), handler_(handler), feedback_(feedback), state_(state) {} + MaybeHandle maybe_map, + const FeedbackSource& feedback) + : flags_(flags), + handler_(handler), + maybe_map_(maybe_map), + feedback_(feedback) {} CheckMapsFlags flags() const { return flags_; } Handle handler() const { return handler_; } + MaybeHandle map() const { return maybe_map_; } FeedbackSource const& feedback() const { return feedback_; } - ICState const& state() const { return state_; } + ICState state() const { + return maybe_map_.is_null() ? ICState::kPolymorphic : ICState::kMonomorphic; + } private: CheckMapsFlags const flags_; Handle const handler_; + MaybeHandle const maybe_map_; FeedbackSource const feedback_; - ICState const state_; }; bool operator==(DynamicCheckMapsParameters const&, @@ -803,6 +810,11 @@ class V8_EXPORT_PRIVATE SimplifiedOperatorBuilder final // delta parameter represents the executed bytecodes since the last update. const Operator* UpdateInterruptBudget(int delta); + // Takes the current feedback vector as input 0, and generates a check of the + // vector's marker. Depending on the marker's value, we either do nothing, + // trigger optimized compilation, or install a finished code object. + const Operator* TierUpCheck(); + const Operator* ToBoolean(); const Operator* StringConcat(); @@ -875,10 +887,9 @@ class V8_EXPORT_PRIVATE SimplifiedOperatorBuilder final const Operator* CheckInternalizedString(); const Operator* CheckMaps(CheckMapsFlags, ZoneHandleSet, const FeedbackSource& = FeedbackSource()); - const Operator* DynamicCheckMaps( - CheckMapsFlags flags, Handle handler, - const FeedbackSource& feedback, - DynamicCheckMapsParameters::ICState ic_state); + const Operator* DynamicCheckMaps(CheckMapsFlags flags, Handle handler, + MaybeHandle map, + const FeedbackSource& feedback); const Operator* CheckNotTaggedHole(); const Operator* CheckNumber(const FeedbackSource& feedback); const Operator* CheckReceiver(); @@ -1159,6 +1170,18 @@ class FastApiCallNode final : public SimplifiedNodeWrapperBase { } }; +class TierUpCheckNode final : public SimplifiedNodeWrapperBase { + public: + explicit constexpr TierUpCheckNode(Node* node) + : SimplifiedNodeWrapperBase(node) { + CONSTEXPR_DCHECK(node->opcode() == IrOpcode::kTierUpCheck); + } + +#define INPUTS(V) V(FeedbackVector, feedback_vector, 0, FeedbackVector) + INPUTS(DEFINE_INPUT_ACCESSORS) +#undef INPUTS +}; + class UpdateInterruptBudgetNode final : public SimplifiedNodeWrapperBase { public: explicit constexpr UpdateInterruptBudgetNode(Node* node) diff --git a/deps/v8/src/compiler/store-store-elimination.cc b/deps/v8/src/compiler/store-store-elimination.cc index c89d5d712ad46a..70dadd944174f6 100644 --- a/deps/v8/src/compiler/store-store-elimination.cc +++ b/deps/v8/src/compiler/store-store-elimination.cc @@ -396,7 +396,8 @@ UnobservablesSet RedundantStoreFinder::RecomputeUseIntersection(Node* node) { // Everything is observable after these opcodes; return the empty set. DCHECK_EXTRA( opcode == IrOpcode::kReturn || opcode == IrOpcode::kTerminate || - opcode == IrOpcode::kDeoptimize || opcode == IrOpcode::kThrow, + opcode == IrOpcode::kDeoptimize || opcode == IrOpcode::kThrow || + opcode == IrOpcode::kTailCall, "for #%d:%s", node->id(), node->op()->mnemonic()); USE(opcode); diff --git a/deps/v8/src/compiler/typer.cc b/deps/v8/src/compiler/typer.cc index 9ec3eac5e5ea2b..a4996f3cc22955 100644 --- a/deps/v8/src/compiler/typer.cc +++ b/deps/v8/src/compiler/typer.cc @@ -325,7 +325,7 @@ void Typer::Run(const NodeVector& roots, induction_vars->ChangeToInductionVariablePhis(); } Visitor visitor(this, induction_vars); - GraphReducer graph_reducer(zone(), graph(), tick_counter_); + GraphReducer graph_reducer(zone(), graph(), tick_counter_, broker()); graph_reducer.AddReducer(&visitor); for (Node* const root : roots) graph_reducer.ReduceNode(root); graph_reducer.ReduceGraph(); @@ -1196,6 +1196,7 @@ Type Typer::Visitor::TypeTypeOf(Node* node) { return Type::InternalizedString(); } +Type Typer::Visitor::TypeTierUpCheck(Node* node) { UNREACHABLE(); } Type Typer::Visitor::TypeUpdateInterruptBudget(Node* node) { UNREACHABLE(); } // JS conversion operators. @@ -1307,6 +1308,10 @@ Type Typer::Visitor::TypeJSLoadProperty(Node* node) { Type Typer::Visitor::TypeJSLoadNamed(Node* node) { return Type::NonInternal(); } +Type Typer::Visitor::TypeJSLoadNamedFromSuper(Node* node) { + return Type::NonInternal(); +} + Type Typer::Visitor::TypeJSLoadGlobal(Node* node) { return Type::NonInternal(); } @@ -1821,7 +1826,7 @@ Type Typer::Visitor::TypeJSCallRuntime(Node* node) { return TypeUnaryOp(node, ToNumber); case Runtime::kInlineToObject: return TypeUnaryOp(node, ToObject); - case Runtime::kInlineToStringRT: + case Runtime::kInlineToString: return TypeUnaryOp(node, ToString); case Runtime::kHasInPrototypeChain: return Type::Boolean(); diff --git a/deps/v8/src/compiler/verifier.cc b/deps/v8/src/compiler/verifier.cc index edf085485c8732..302e1212eefbc1 100644 --- a/deps/v8/src/compiler/verifier.cc +++ b/deps/v8/src/compiler/verifier.cc @@ -722,6 +722,9 @@ void Verifier::Visitor::Check(Node* node, const AllNodes& all) { case IrOpcode::kJSLoadNamed: CheckTypeIs(node, Type::Any()); break; + case IrOpcode::kJSLoadNamedFromSuper: + CheckTypeIs(node, Type::Any()); + break; case IrOpcode::kJSLoadGlobal: CheckTypeIs(node, Type::Any()); CHECK(LoadGlobalParametersOf(node->op()).feedback().IsValid()); @@ -760,6 +763,7 @@ void Verifier::Visitor::Check(Node* node, const AllNodes& all) { case IrOpcode::kTypeOf: CheckTypeIs(node, Type::InternalizedString()); break; + case IrOpcode::kTierUpCheck: case IrOpcode::kUpdateInterruptBudget: CheckValueInputIs(node, 0, Type::Any()); CheckNotTyped(node); diff --git a/deps/v8/src/compiler/wasm-compiler.cc b/deps/v8/src/compiler/wasm-compiler.cc index f8f333da2bdf32..91dde088f6ac88 100644 --- a/deps/v8/src/compiler/wasm-compiler.cc +++ b/deps/v8/src/compiler/wasm-compiler.cc @@ -134,15 +134,18 @@ MachineType assert_size(int expected_size, MachineType type) { wasm::ObjectAccess::ElementOffsetInTaggedFixedArray(index), value, \ MachineRepresentation::kTagged, kFullWriteBarrier) -void MergeControlToEnd(MachineGraph* mcgraph, Node* node) { +void EnsureEnd(MachineGraph* mcgraph) { Graph* g = mcgraph->graph(); - if (g->end()) { - NodeProperties::MergeControlToEnd(g, mcgraph->common(), node); - } else { - g->SetEnd(g->NewNode(mcgraph->common()->End(1), node)); + if (g->end() == nullptr) { + g->SetEnd(g->NewNode(mcgraph->common()->End(0))); } } +void MergeControlToEnd(MachineGraph* mcgraph, Node* node) { + EnsureEnd(mcgraph); + NodeProperties::MergeControlToEnd(mcgraph->graph(), mcgraph->common(), node); +} + bool ContainsSimd(const wasm::FunctionSig* sig) { for (auto type : sig->all()) { if (type == wasm::kWasmS128) return true; @@ -3051,15 +3054,6 @@ Node* WasmGraphBuilder::BuildCallRef(uint32_t sig_index, Vector args, { // Function imported to module. - // TODO(9495): Make sure it works with functions imported from other - // modules. Currently, this will never happen: Since functions have to be - // tunneled through JS, and we currently do not have a JS API to pass - // specific function types, we habe to export/import function references - // as funcref. Then, we cannot cast down to the type of the function, - // because we do not have access to the defining module's types. This - // could be fixed either by building a richer JS API, or by implementing - // the type import proposal. That said, this code should work for those - // cases too. gasm_->Bind(&imported_label); Node* imported_instance = gasm_->Load( @@ -3087,8 +3081,9 @@ Node* WasmGraphBuilder::BuildCallRef(uint32_t sig_index, Vector args, // Call to a WasmJSFunction. // The call target is the wasm-to-js wrapper code. gasm_->Bind(&js_label); - // TODO(7748): Implement. - TrapIfTrue(wasm::kTrapUnreachable, gasm_->Int32Constant(1), position); + // TODO(9495): Implement when the interaction with the type reflection + // proposal is clear. + TrapIfTrue(wasm::kTrapWasmJSFunction, gasm_->Int32Constant(1), position); gasm_->Goto(&end_label, args[0], RefNull() /* Dummy value */); } @@ -3675,7 +3670,7 @@ Node* WasmGraphBuilder::CheckBoundsAndAlignment( // bounds-checked index, which is guaranteed to have (the equivalent of) // {uintptr_t} representation. Node* WasmGraphBuilder::BoundsCheckMem(uint8_t access_size, Node* index, - uint32_t offset, + uint64_t offset, wasm::WasmCodePosition position, EnforceBoundsCheck enforce_check) { DCHECK_LE(1, access_size); @@ -3686,13 +3681,17 @@ Node* WasmGraphBuilder::BoundsCheckMem(uint8_t access_size, Node* index, return index; } - if (!base::IsInBounds(offset, access_size, env_->max_memory_size)) { + // If the offset does not fit in a uintptr_t, this can never succeed on this + // machine. + if (offset > std::numeric_limits::max() || + !base::IsInBounds(offset, access_size, + env_->max_memory_size)) { // The access will be out of bounds, even for the largest memory. TrapIfEq32(wasm::kTrapMemOutOfBounds, Int32Constant(0), 0, position); - return mcgraph()->IntPtrConstant(0); + return mcgraph()->UintPtrConstant(0); } - uint64_t end_offset = uint64_t{offset} + access_size - 1u; - Node* end_offset_node = IntPtrConstant(end_offset); + uintptr_t end_offset = offset + access_size - 1u; + Node* end_offset_node = mcgraph_->UintPtrConstant(end_offset); // The accessed memory is [index + offset, index + end_offset]. // Check that the last read byte (at {index + end_offset}) is in bounds. @@ -3996,9 +3995,7 @@ Node* WasmGraphBuilder::LoadTransform(wasm::ValueType type, MachineType memtype, Node* index, uint32_t offset, uint32_t alignment, wasm::WasmCodePosition position) { - if (memtype.representation() == MachineRepresentation::kSimd128) { - has_simd_ = true; - } + has_simd_ = true; Node* load; @@ -4366,15 +4363,17 @@ CallDescriptor* WasmGraphBuilder::GetI64AtomicWaitCallDescriptor() { return i64_atomic_wait_descriptor_; } -void WasmGraphBuilder::LowerInt64(CallOrigin origin) { +void WasmGraphBuilder::LowerInt64(Signature* sig) { if (mcgraph()->machine()->Is64()) return; Int64Lowering r(mcgraph()->graph(), mcgraph()->machine(), mcgraph()->common(), - mcgraph()->zone(), - CreateMachineSignature(mcgraph()->zone(), sig_, origin), - std::move(lowering_special_case_)); + mcgraph()->zone(), sig, std::move(lowering_special_case_)); r.LowerGraph(); } +void WasmGraphBuilder::LowerInt64(CallOrigin origin) { + LowerInt64(CreateMachineSignature(mcgraph()->zone(), sig_, origin)); +} + void WasmGraphBuilder::SimdScalarLoweringForTesting() { SimdScalarLowering(mcgraph(), CreateMachineSignature(mcgraph()->zone(), sig_, kCalledFromWasm)) @@ -4952,8 +4951,8 @@ Node* WasmGraphBuilder::SimdOp(wasm::WasmOpcode opcode, Node* const* inputs) { return graph()->NewNode(mcgraph()->machine()->V8x16AnyTrue(), inputs[0]); case wasm::kExprV8x16AllTrue: return graph()->NewNode(mcgraph()->machine()->V8x16AllTrue(), inputs[0]); - case wasm::kExprS8x16Swizzle: - return graph()->NewNode(mcgraph()->machine()->S8x16Swizzle(), inputs[0], + case wasm::kExprI8x16Swizzle: + return graph()->NewNode(mcgraph()->machine()->I8x16Swizzle(), inputs[0], inputs[1]); default: FATAL_UNSUPPORTED_OPCODE(opcode); @@ -5014,7 +5013,7 @@ Node* WasmGraphBuilder::SimdLaneOp(wasm::WasmOpcode opcode, uint8_t lane, Node* WasmGraphBuilder::Simd8x16ShuffleOp(const uint8_t shuffle[16], Node* const* inputs) { has_simd_ = true; - return graph()->NewNode(mcgraph()->machine()->S8x16Shuffle(shuffle), + return graph()->NewNode(mcgraph()->machine()->I8x16Shuffle(shuffle), inputs[0], inputs[1]); } @@ -5568,13 +5567,13 @@ Node* IsI31(GraphAssembler* gasm, Node* object) { } } -void AssertFalse(GraphAssembler* gasm, Node* condition) { +void AssertFalse(MachineGraph* mcgraph, GraphAssembler* gasm, Node* condition) { #if DEBUG if (FLAG_debug_code) { auto ok = gasm->MakeLabel(); gasm->GotoIfNot(condition, &ok); + EnsureEnd(mcgraph); gasm->Unreachable(); - gasm->Goto(&ok); gasm->Bind(&ok); } #endif @@ -5592,7 +5591,7 @@ Node* WasmGraphBuilder::RefTest(Node* object, Node* rtt, gasm_->GotoIf(IsI31(gasm_.get(), object), &done, gasm_->Int32Constant(0)); need_done_label = true; } else { - AssertFalse(gasm_.get(), IsI31(gasm_.get(), object)); + AssertFalse(mcgraph(), gasm_.get(), IsI31(gasm_.get(), object)); } if (null_check == kWithNullCheck) { gasm_->GotoIf(gasm_->WordEqual(object, RefNull()), &done, @@ -5627,7 +5626,7 @@ Node* WasmGraphBuilder::RefCast(Node* object, Node* rtt, TrapIfTrue(wasm::kTrapIllegalCast, IsI31(gasm_.get(), object), position); } } else { - AssertFalse(gasm_.get(), IsI31(gasm_.get(), object)); + AssertFalse(mcgraph(), gasm_.get(), IsI31(gasm_.get(), object)); } if (null_check == kWithNullCheck) { TrapIfTrue(wasm::kTrapIllegalCast, gasm_->WordEqual(object, RefNull()), @@ -5667,7 +5666,7 @@ Node* WasmGraphBuilder::BrOnCast(Node* object, Node* rtt, merge_effects.emplace_back(effect()); } } else { - AssertFalse(gasm_.get(), is_i31); + AssertFalse(mcgraph(), gasm_.get(), is_i31); } if (null_check == kWithNullCheck) { @@ -5855,9 +5854,11 @@ class WasmWrapperGraphBuilder : public WasmGraphBuilder { public: WasmWrapperGraphBuilder(Zone* zone, MachineGraph* mcgraph, const wasm::FunctionSig* sig, + const wasm::WasmModule* module, compiler::SourcePositionTable* spt, StubCallMode stub_mode, wasm::WasmFeatures features) : WasmGraphBuilder(nullptr, zone, mcgraph, sig, spt), + module_(module), stub_mode_(stub_mode), enabled_features_(features) {} @@ -6063,6 +6064,10 @@ class WasmWrapperGraphBuilder : public WasmGraphBuilder { if (representation == wasm::HeapType::kEq) { return BuildAllocateObjectWrapper(node); } + if (type.has_index() && module_->has_signature(type.ref_index())) { + // Typed function + return node; + } // TODO(7748): Figure out a JS interop story for arrays and structs. // If this is reached, then IsJSCompatibleSignature() is too permissive. UNREACHABLE(); @@ -6148,6 +6153,29 @@ class WasmWrapperGraphBuilder : public WasmGraphBuilder { graph()->NewNode(call, target, input, context, effect(), control())); } + void BuildCheckValidRefValue(Node* input, Node* js_context, + wasm::ValueType type) { + // Make sure ValueType fits in a Smi. + STATIC_ASSERT(wasm::ValueType::kLastUsedBit + 1 <= kSmiValueSize); + Node* inputs[] = { + instance_node_.get(), input, + IntPtrConstant(IntToSmi(static_cast(type.raw_bit_field())))}; + + Node* check = BuildChangeSmiToInt32(SetEffect(BuildCallToRuntimeWithContext( + Runtime::kWasmIsValidRefValue, js_context, inputs, 3))); + + Diamond type_check(graph(), mcgraph()->common(), check, BranchHint::kTrue); + type_check.Chain(control()); + SetControl(type_check.if_false); + + Node* old_effect = effect(); + BuildCallToRuntimeWithContext(Runtime::kWasmThrowTypeError, js_context, + nullptr, 0); + + SetEffectControl(type_check.EffectPhi(old_effect, effect()), + type_check.merge); + } + Node* FromJS(Node* input, Node* js_context, wasm::ValueType type) { switch (type.kind()) { case wasm::ValueType::kRef: @@ -6156,28 +6184,21 @@ class WasmWrapperGraphBuilder : public WasmGraphBuilder { case wasm::HeapType::kExtern: case wasm::HeapType::kExn: return input; - case wasm::HeapType::kFunc: { - Node* check = - BuildChangeSmiToInt32(SetEffect(BuildCallToRuntimeWithContext( - Runtime::kWasmIsValidFuncRefValue, js_context, &input, 1))); - - Diamond type_check(graph(), mcgraph()->common(), check, - BranchHint::kTrue); - type_check.Chain(control()); - SetControl(type_check.if_false); - - Node* old_effect = effect(); - BuildCallToRuntimeWithContext(Runtime::kWasmThrowTypeError, - js_context, nullptr, 0); - - SetEffectControl(type_check.EffectPhi(old_effect, effect()), - type_check.merge); - + case wasm::HeapType::kFunc: + BuildCheckValidRefValue(input, js_context, type); return input; - } case wasm::HeapType::kEq: + BuildCheckValidRefValue(input, js_context, type); return BuildUnpackObjectWrapper(input); + case wasm::HeapType::kI31: + // If this is reached, then IsJSCompatibleSignature() is too + // permissive. + UNREACHABLE(); default: + if (module_->has_signature(type.ref_index())) { + BuildCheckValidRefValue(input, js_context, type); + return input; + } // If this is reached, then IsJSCompatibleSignature() is too // permissive. UNREACHABLE(); @@ -6210,6 +6231,38 @@ class WasmWrapperGraphBuilder : public WasmGraphBuilder { } } + Node* SmiToFloat32(Node* input) { + return graph()->NewNode(mcgraph()->machine()->RoundInt32ToFloat32(), + BuildChangeSmiToInt32(input)); + } + + Node* SmiToFloat64(Node* input) { + return graph()->NewNode(mcgraph()->machine()->ChangeInt32ToFloat64(), + BuildChangeSmiToInt32(input)); + } + + Node* FromJSFast(Node* input, wasm::ValueType type) { + switch (type.kind()) { + case wasm::ValueType::kI32: + return BuildChangeSmiToInt32(input); + case wasm::ValueType::kF32: + return SmiToFloat32(input); + case wasm::ValueType::kF64: + return SmiToFloat64(input); + case wasm::ValueType::kRef: + case wasm::ValueType::kOptRef: + case wasm::ValueType::kI64: + case wasm::ValueType::kRtt: + case wasm::ValueType::kS128: + case wasm::ValueType::kI8: + case wasm::ValueType::kI16: + case wasm::ValueType::kBottom: + case wasm::ValueType::kStmt: + UNREACHABLE(); + break; + } + } + void BuildModifyThreadInWasmFlag(bool new_value) { if (!trap_handler::IsTrapHandlerEnabled()) return; Node* isolate_root = BuildLoadIsolateRoot(); @@ -6280,55 +6333,15 @@ class WasmWrapperGraphBuilder : public WasmGraphBuilder { return SetControl(CALL_BUILTIN(WasmAllocateJSArray, array_length, context)); } - void BuildJSToWasmWrapper(bool is_import) { - const int wasm_count = static_cast(sig_->parameter_count()); - const int rets_count = static_cast(sig_->return_count()); - - // Build the start and the JS parameter nodes. - SetEffectControl(Start(wasm_count + 5)); - - // Create the js_closure and js_context parameters. - Node* js_closure = - graph()->NewNode(mcgraph()->common()->Parameter( - Linkage::kJSCallClosureParamIndex, "%closure"), - graph()->start()); - Node* js_context = graph()->NewNode( - mcgraph()->common()->Parameter( - Linkage::GetJSCallContextParamIndex(wasm_count + 1), "%context"), - graph()->start()); - - // Create the instance_node node to pass as parameter. It is loaded from - // an actual reference to an instance or a placeholder reference, - // called {WasmExportedFunction} via the {WasmExportedFunctionData} - // structure. - Node* function_data = BuildLoadFunctionDataFromExportedFunction(js_closure); - instance_node_.set( - BuildLoadInstanceFromExportedFunctionData(function_data)); - - if (!wasm::IsJSCompatibleSignature(sig_, enabled_features_)) { - // Throw a TypeError. Use the js_context of the calling javascript - // function (passed as a parameter), such that the generated code is - // js_context independent. - BuildCallToRuntimeWithContext(Runtime::kWasmThrowTypeError, js_context, - nullptr, 0); - TerminateThrow(effect(), control()); - return; - } - - const int args_count = wasm_count + 1; // +1 for wasm_code. - base::SmallVector args(args_count); - base::SmallVector rets(rets_count); - - // Convert JS parameters to wasm numbers. - for (int i = 0; i < wasm_count; ++i) { - Node* param = Param(i + 1); - Node* wasm_param = FromJS(param, js_context, sig_->GetParam(i)); - args[i + 1] = wasm_param; - } - + Node* BuildCallAndReturn(bool is_import, Node* js_context, + Node* function_data, + base::SmallVector args) { // Set the ThreadInWasm flag before we do the actual call. BuildModifyThreadInWasmFlag(true); + const int rets_count = static_cast(sig_->return_count()); + base::SmallVector rets(rets_count); + if (is_import) { // Call to an imported function. // Load function index from {WasmExportedFunctionData}. @@ -6373,7 +6386,147 @@ class WasmWrapperGraphBuilder : public WasmGraphBuilder { STORE_FIXED_ARRAY_SLOT_ANY(fixed_array, i, value); } } - Return(jsval); + return jsval; + } + + bool QualifiesForFastTransform(const wasm::FunctionSig*) { + const int wasm_count = static_cast(sig_->parameter_count()); + for (int i = 0; i < wasm_count; ++i) { + wasm::ValueType type = sig_->GetParam(i); + switch (type.kind()) { + case wasm::ValueType::kRef: + case wasm::ValueType::kOptRef: + case wasm::ValueType::kI64: + case wasm::ValueType::kRtt: + case wasm::ValueType::kS128: + case wasm::ValueType::kI8: + case wasm::ValueType::kI16: + case wasm::ValueType::kBottom: + case wasm::ValueType::kStmt: + return false; + case wasm::ValueType::kI32: + case wasm::ValueType::kF32: + case wasm::ValueType::kF64: + break; + } + } + return true; + } + + Node* IsSmi(Node* input) { + return gasm_->Word32Equal( + gasm_->Word32And(BuildTruncateIntPtrToInt32(input), + gasm_->Int32Constant(kSmiTagMask)), + gasm_->Int32Constant(0)); + } + + Node* CanTransformFast(Node* input, wasm::ValueType type) { + switch (type.kind()) { + case wasm::ValueType::kI32: + case wasm::ValueType::kF64: + case wasm::ValueType::kF32: + return IsSmi(input); + case wasm::ValueType::kRef: + case wasm::ValueType::kOptRef: + case wasm::ValueType::kI64: + case wasm::ValueType::kRtt: + case wasm::ValueType::kS128: + case wasm::ValueType::kI8: + case wasm::ValueType::kI16: + case wasm::ValueType::kBottom: + case wasm::ValueType::kStmt: + UNREACHABLE(); + break; + } + } + + void BuildJSToWasmWrapper(bool is_import) { + const int wasm_count = static_cast(sig_->parameter_count()); + + // Build the start and the JS parameter nodes. + SetEffectControl(Start(wasm_count + 5)); + + // Create the js_closure and js_context parameters. + Node* js_closure = + graph()->NewNode(mcgraph()->common()->Parameter( + Linkage::kJSCallClosureParamIndex, "%closure"), + graph()->start()); + Node* js_context = graph()->NewNode( + mcgraph()->common()->Parameter( + Linkage::GetJSCallContextParamIndex(wasm_count + 1), "%context"), + graph()->start()); + + // Create the instance_node node to pass as parameter. It is loaded from + // an actual reference to an instance or a placeholder reference, + // called {WasmExportedFunction} via the {WasmExportedFunctionData} + // structure. + Node* function_data = BuildLoadFunctionDataFromExportedFunction(js_closure); + instance_node_.set( + BuildLoadInstanceFromExportedFunctionData(function_data)); + + if (!wasm::IsJSCompatibleSignature(sig_, module_, enabled_features_)) { + // Throw a TypeError. Use the js_context of the calling javascript + // function (passed as a parameter), such that the generated code is + // js_context independent. + BuildCallToRuntimeWithContext(Runtime::kWasmThrowTypeError, js_context, + nullptr, 0); + TerminateThrow(effect(), control()); + return; + } + + const int args_count = wasm_count + 1; // +1 for wasm_code. + + // Check whether the signature of the function allows for a fast + // transformation (if any params exist that need transformation). + // Create a fast transformation path, only if it does. + bool include_fast_path = wasm_count && QualifiesForFastTransform(sig_); + + // Prepare Param() nodes. Param() nodes can only be created once, + // so we need to use the same nodes along all possible transformation paths. + base::SmallVector params(args_count); + for (int i = 0; i < wasm_count; ++i) params[i + 1] = Param(i + 1); + + auto done = gasm_->MakeLabel(MachineRepresentation::kTagged); + if (include_fast_path) { + auto slow_path = gasm_->MakeDeferredLabel(); + // Check if the params received on runtime can be actually transformed + // using the fast transformation. When a param that cannot be transformed + // fast is encountered, skip checking the rest and fall back to the slow + // path. + for (int i = 0; i < wasm_count; ++i) { + gasm_->GotoIfNot(CanTransformFast(params[i + 1], sig_->GetParam(i)), + &slow_path); + } + // Convert JS parameters to wasm numbers using the fast transformation + // and build the call. + base::SmallVector args(args_count); + for (int i = 0; i < wasm_count; ++i) { + Node* wasm_param = FromJSFast(params[i + 1], sig_->GetParam(i)); + args[i + 1] = wasm_param; + } + Node* jsval = + BuildCallAndReturn(is_import, js_context, function_data, args); + gasm_->Goto(&done, jsval); + gasm_->Bind(&slow_path); + } + // Convert JS parameters to wasm numbers using the default transformation + // and build the call. + base::SmallVector args(args_count); + for (int i = 0; i < wasm_count; ++i) { + Node* wasm_param = FromJS(params[i + 1], js_context, sig_->GetParam(i)); + args[i + 1] = wasm_param; + } + Node* jsval = + BuildCallAndReturn(is_import, js_context, function_data, args); + // If both the default and a fast transformation paths are present, + // get the return value based on the path used. + if (include_fast_path) { + gasm_->Goto(&done, jsval); + gasm_->Bind(&done); + Return(done.PhiAt(0)); + } else { + Return(jsval); + } if (ContainsInt64(sig_)) LowerInt64(kCalledFromJS); } @@ -6743,7 +6896,7 @@ class WasmWrapperGraphBuilder : public WasmGraphBuilder { isolate->factory()->undefined_value())); // Throw a TypeError if the signature is incompatible with JavaScript. - if (!wasm::IsJSCompatibleSignature(sig_, enabled_features_)) { + if (!wasm::IsJSCompatibleSignature(sig_, module_, enabled_features_)) { BuildCallToRuntimeWithContext(Runtime::kWasmThrowTypeError, context, nullptr, 0); TerminateThrow(effect(), control()); @@ -6898,6 +7051,7 @@ class WasmWrapperGraphBuilder : public WasmGraphBuilder { } private: + const wasm::WasmModule* module_; StubCallMode stub_mode_; SetOncePointer undefined_value_node_; SetOncePointer int32_to_heapnumber_operator_; @@ -6914,8 +7068,8 @@ class WasmWrapperGraphBuilder : public WasmGraphBuilder { std::unique_ptr NewJSToWasmCompilationJob( Isolate* isolate, wasm::WasmEngine* wasm_engine, - const wasm::FunctionSig* sig, bool is_import, - const wasm::WasmFeatures& enabled_features) { + const wasm::FunctionSig* sig, const wasm::WasmModule* module, + bool is_import, const wasm::WasmFeatures& enabled_features) { //---------------------------------------------------------------------------- // Create the Graph. //---------------------------------------------------------------------------- @@ -6929,7 +7083,7 @@ std::unique_ptr NewJSToWasmCompilationJob( InstructionSelector::AlignmentRequirements()); MachineGraph* mcgraph = zone->New(graph, common, machine); - WasmWrapperGraphBuilder builder(zone.get(), mcgraph, sig, nullptr, + WasmWrapperGraphBuilder builder(zone.get(), mcgraph, sig, module, nullptr, StubCallMode::kCallBuiltinPointer, enabled_features); builder.BuildJSToWasmWrapper(is_import); @@ -6956,6 +7110,7 @@ std::unique_ptr NewJSToWasmCompilationJob( std::pair> ResolveWasmImportCall( Handle callable, const wasm::FunctionSig* expected_sig, + const wasm::WasmModule* module, const wasm::WasmFeatures& enabled_features) { if (WasmExportedFunction::IsWasmExportedFunction(*callable)) { auto imported_function = Handle::cast(callable); @@ -6985,13 +7140,13 @@ std::pair> ResolveWasmImportCall( } if (WasmCapiFunction::IsWasmCapiFunction(*callable)) { auto capi_function = Handle::cast(callable); - if (!capi_function->IsSignatureEqual(expected_sig)) { + if (!capi_function->MatchesSignature(expected_sig)) { return std::make_pair(WasmImportCallKind::kLinkError, callable); } return std::make_pair(WasmImportCallKind::kWasmToCapi, callable); } // Assuming we are calling to JS, check whether this would be a runtime error. - if (!wasm::IsJSCompatibleSignature(expected_sig, enabled_features)) { + if (!wasm::IsJSCompatibleSignature(expected_sig, module, enabled_features)) { return std::make_pair(WasmImportCallKind::kRuntimeTypeError, callable); } // For JavaScript calls, determine whether the target has an arity match. @@ -7069,10 +7224,14 @@ std::pair> ResolveWasmImportCall( Compiler::Compile(function, Compiler::CLEAR_EXCEPTION, &is_compiled_scope); } +#ifndef V8_REVERSE_JSARGS + // This optimization is disabled when the arguments are reversed. It will be + // subsumed when the argumens adaptor frame is removed. if (shared->is_safe_to_skip_arguments_adaptor()) { return std::make_pair( WasmImportCallKind::kJSFunctionArityMismatchSkipAdaptor, callable); } +#endif return std::make_pair(WasmImportCallKind::kJSFunctionArityMismatch, callable); @@ -7216,9 +7375,9 @@ wasm::WasmCompilationResult CompileWasmImportCallWrapper( SourcePositionTable* source_position_table = source_positions ? zone.New(graph) : nullptr; - WasmWrapperGraphBuilder builder(&zone, mcgraph, sig, source_position_table, - StubCallMode::kCallWasmRuntimeStub, - env->enabled_features); + WasmWrapperGraphBuilder builder( + &zone, mcgraph, sig, env->module, source_position_table, + StubCallMode::kCallWasmRuntimeStub, env->enabled_features); builder.BuildWasmImportCallWrapper(kind, expected_arity); // Build a name in the form "wasm-to-js--". @@ -7261,9 +7420,9 @@ wasm::WasmCode* CompileWasmCapiCallWrapper(wasm::WasmEngine* wasm_engine, InstructionSelector::SupportedMachineOperatorFlags(), InstructionSelector::AlignmentRequirements())); - WasmWrapperGraphBuilder builder(&zone, mcgraph, sig, source_positions, - StubCallMode::kCallWasmRuntimeStub, - native_module->enabled_features()); + WasmWrapperGraphBuilder builder( + &zone, mcgraph, sig, native_module->module(), source_positions, + StubCallMode::kCallWasmRuntimeStub, native_module->enabled_features()); // Set up the graph start. int param_count = static_cast(sig->parameter_count()) + @@ -7297,7 +7456,8 @@ wasm::WasmCode* CompileWasmCapiCallWrapper(wasm::WasmEngine* wasm_engine, } MaybeHandle CompileJSToJSWrapper(Isolate* isolate, - const wasm::FunctionSig* sig) { + const wasm::FunctionSig* sig, + const wasm::WasmModule* module) { std::unique_ptr zone = std::make_unique( isolate->allocator(), ZONE_NAME, kCompressGraphZone); Graph* graph = zone->New(zone.get()); @@ -7308,7 +7468,7 @@ MaybeHandle CompileJSToJSWrapper(Isolate* isolate, InstructionSelector::AlignmentRequirements()); MachineGraph* mcgraph = zone->New(graph, common, machine); - WasmWrapperGraphBuilder builder(zone.get(), mcgraph, sig, nullptr, + WasmWrapperGraphBuilder builder(zone.get(), mcgraph, sig, module, nullptr, StubCallMode::kCallBuiltinPointer, wasm::WasmFeatures::FromIsolate(isolate)); builder.BuildJSToJSWrapper(isolate); @@ -7342,7 +7502,8 @@ MaybeHandle CompileJSToJSWrapper(Isolate* isolate, return code; } -Handle CompileCWasmEntry(Isolate* isolate, const wasm::FunctionSig* sig) { +Handle CompileCWasmEntry(Isolate* isolate, const wasm::FunctionSig* sig, + const wasm::WasmModule* module) { std::unique_ptr zone = std::make_unique( isolate->allocator(), ZONE_NAME, kCompressGraphZone); Graph* graph = zone->New(zone.get()); @@ -7353,7 +7514,7 @@ Handle CompileCWasmEntry(Isolate* isolate, const wasm::FunctionSig* sig) { InstructionSelector::AlignmentRequirements()); MachineGraph* mcgraph = zone->New(graph, common, machine); - WasmWrapperGraphBuilder builder(zone.get(), mcgraph, sig, nullptr, + WasmWrapperGraphBuilder builder(zone.get(), mcgraph, sig, module, nullptr, StubCallMode::kCallBuiltinPointer, wasm::WasmFeatures::FromIsolate(isolate)); builder.BuildCWasmEntry(); @@ -7417,16 +7578,50 @@ bool BuildGraphForWasmFunction(AccountingAllocator* allocator, return false; } - builder.LowerInt64(WasmWrapperGraphBuilder::kCalledFromWasm); - + // Lower SIMD first, i64x2 nodes will be lowered to int64 nodes, then int64 + // lowering will take care of them. + auto sig = CreateMachineSignature(mcgraph->zone(), func_body.sig, + WasmGraphBuilder::kCalledFromWasm); if (builder.has_simd() && (!CpuFeatures::SupportsWasmSimd128() || env->lower_simd)) { - SimdScalarLowering( - mcgraph, CreateMachineSignature(mcgraph->zone(), func_body.sig, - WasmGraphBuilder::kCalledFromWasm)) - .LowerGraph(); + SimdScalarLowering(mcgraph, sig).LowerGraph(); + + // SimdScalarLowering changes all v128 to 4 i32, so update the machine + // signature for the call to LowerInt64. + size_t return_count = 0; + size_t param_count = 0; + for (auto ret : sig->returns()) { + return_count += ret == MachineRepresentation::kSimd128 ? 4 : 1; + } + for (auto param : sig->parameters()) { + param_count += param == MachineRepresentation::kSimd128 ? 4 : 1; + } + + Signature::Builder sig_builder( + mcgraph->zone(), return_count, param_count); + for (auto ret : sig->returns()) { + if (ret == MachineRepresentation::kSimd128) { + for (int i = 0; i < 4; ++i) { + sig_builder.AddReturn(MachineRepresentation::kWord32); + } + } else { + sig_builder.AddReturn(ret); + } + } + for (auto param : sig->parameters()) { + if (param == MachineRepresentation::kSimd128) { + for (int i = 0; i < 4; ++i) { + sig_builder.AddParam(MachineRepresentation::kWord32); + } + } else { + sig_builder.AddParam(param); + } + } + sig = sig_builder.Build(); } + builder.LowerInt64(sig); + if (func_index >= FLAG_trace_wasm_ast_start && func_index < FLAG_trace_wasm_ast_end) { PrintRawWasmCode(allocator, func_body, env->module, wasm::kPrintLocals); diff --git a/deps/v8/src/compiler/wasm-compiler.h b/deps/v8/src/compiler/wasm-compiler.h index c35ca3e844b804..ab42610239e79a 100644 --- a/deps/v8/src/compiler/wasm-compiler.h +++ b/deps/v8/src/compiler/wasm-compiler.h @@ -106,6 +106,7 @@ constexpr WasmImportCallKind kDefaultImportCallKind = // another target, which is why the ultimate target is returned as well. V8_EXPORT_PRIVATE std::pair> ResolveWasmImportCall(Handle callable, const wasm::FunctionSig* sig, + const wasm::WasmModule* module, const wasm::WasmFeatures& enabled_features); // Compiles an import call wrapper, which allows Wasm to call imports. @@ -122,13 +123,14 @@ wasm::WasmCode* CompileWasmCapiCallWrapper(wasm::WasmEngine*, // Returns an OptimizedCompilationJob object for a JS to Wasm wrapper. std::unique_ptr NewJSToWasmCompilationJob( Isolate* isolate, wasm::WasmEngine* wasm_engine, - const wasm::FunctionSig* sig, bool is_import, - const wasm::WasmFeatures& enabled_features); + const wasm::FunctionSig* sig, const wasm::WasmModule* module, + bool is_import, const wasm::WasmFeatures& enabled_features); // Compiles a stub with JS linkage that serves as an adapter for function // objects constructed via {WebAssembly.Function}. It performs a round-trip // simulating a JS-to-Wasm-to-JS coercion of parameter and return values. -MaybeHandle CompileJSToJSWrapper(Isolate*, const wasm::FunctionSig*); +MaybeHandle CompileJSToJSWrapper(Isolate*, const wasm::FunctionSig*, + const wasm::WasmModule* module); enum CWasmEntryParameters { kCodeEntry, @@ -141,8 +143,8 @@ enum CWasmEntryParameters { // Compiles a stub with C++ linkage, to be called from Execution::CallWasm, // which knows how to feed it its parameters. -V8_EXPORT_PRIVATE Handle CompileCWasmEntry(Isolate*, - const wasm::FunctionSig*); +V8_EXPORT_PRIVATE Handle CompileCWasmEntry( + Isolate*, const wasm::FunctionSig*, const wasm::WasmModule* module); // Values from the instance object are cached between Wasm-level function calls. // This struct allows the SSA environment handling this cache to be defined @@ -359,6 +361,9 @@ class WasmGraphBuilder { enum CallOrigin { kCalledFromWasm, kCalledFromJS }; + // Overload for when we want to provide a specific signature, rather than + // build one using sig_, for example after scalar lowering. + V8_EXPORT_PRIVATE void LowerInt64(Signature* sig); V8_EXPORT_PRIVATE void LowerInt64(CallOrigin origin); V8_EXPORT_PRIVATE void SimdScalarLoweringForTesting(); @@ -452,7 +457,7 @@ class WasmGraphBuilder { Node* MemBuffer(uint32_t offset); // BoundsCheckMem receives a uint32 {index} node and returns a ptrsize index. - Node* BoundsCheckMem(uint8_t access_size, Node* index, uint32_t offset, + Node* BoundsCheckMem(uint8_t access_size, Node* index, uint64_t offset, wasm::WasmCodePosition, EnforceBoundsCheck); // Check that the range [start, start + size) is in the range [0, max). // Also updates *size with the valid range. Returns true if the range is diff --git a/deps/v8/src/d8/async-hooks-wrapper.cc b/deps/v8/src/d8/async-hooks-wrapper.cc index 1d160cdb0daabe..fc58db9bd8fbd7 100644 --- a/deps/v8/src/d8/async-hooks-wrapper.cc +++ b/deps/v8/src/d8/async-hooks-wrapper.cc @@ -196,11 +196,9 @@ void AsyncHooks::Initialize() { async_hook_ctor.Get(isolate_)->InstanceTemplate()); async_hooks_templ.Get(isolate_)->SetInternalFieldCount(1); async_hooks_templ.Get(isolate_)->Set( - String::NewFromUtf8Literal(isolate_, "enable"), - FunctionTemplate::New(isolate_, EnableHook)); + isolate_, "enable", FunctionTemplate::New(isolate_, EnableHook)); async_hooks_templ.Get(isolate_)->Set( - String::NewFromUtf8Literal(isolate_, "disable"), - FunctionTemplate::New(isolate_, DisableHook)); + isolate_, "disable", FunctionTemplate::New(isolate_, DisableHook)); async_id_smb.Reset(isolate_, Private::New(isolate_)); trigger_id_smb.Reset(isolate_, Private::New(isolate_)); diff --git a/deps/v8/src/d8/d8-platforms.cc b/deps/v8/src/d8/d8-platforms.cc index a170e39c923b5c..e42ee60a16828a 100644 --- a/deps/v8/src/d8/d8-platforms.cc +++ b/deps/v8/src/d8/d8-platforms.cc @@ -276,8 +276,8 @@ class DelayedTasksPlatform final : public Platform { job_task_->Run(delegate); } - size_t GetMaxConcurrency() const override { - return job_task_->GetMaxConcurrency(); + size_t GetMaxConcurrency(size_t worker_count) const override { + return job_task_->GetMaxConcurrency(worker_count); } private: diff --git a/deps/v8/src/d8/d8-posix.cc b/deps/v8/src/d8/d8-posix.cc index ba6356e4479ddf..c7313b44356d24 100644 --- a/deps/v8/src/d8/d8-posix.cc +++ b/deps/v8/src/d8/d8-posix.cc @@ -677,7 +677,7 @@ char* Shell::ReadCharsFromTcpPort(const char* name, int* size_out) { if (connect(sockfd, reinterpret_cast(&serv_addr), sizeof(serv_addr)) < 0) { fprintf(stderr, "Failed to connect to localhost:%d\n", - Shell::options.read_from_tcp_port); + Shell::options.read_from_tcp_port.get()); close(sockfd); return nullptr; } @@ -705,7 +705,7 @@ char* Shell::ReadCharsFromTcpPort(const char* name, int* size_out) { ssize_t sent_now = send(sockfd, name + sent_len, name_len - sent_len, 0); if (sent_now < 0) { fprintf(stderr, "Failed to send %s to localhost:%d\n", name, - Shell::options.read_from_tcp_port); + Shell::options.read_from_tcp_port.get()); close(sockfd); return nullptr; } @@ -722,7 +722,7 @@ char* Shell::ReadCharsFromTcpPort(const char* name, int* size_out) { // We need those 4 bytes to read off the file length. if (received < 4) { fprintf(stderr, "Failed to receive %s's length from localhost:%d\n", name, - Shell::options.read_from_tcp_port); + Shell::options.read_from_tcp_port.get()); close(sockfd); return nullptr; } @@ -731,7 +731,7 @@ char* Shell::ReadCharsFromTcpPort(const char* name, int* size_out) { if (file_length < 0) { fprintf(stderr, "Received length %d for %s from localhost:%d\n", - file_length, name, Shell::options.read_from_tcp_port); + file_length, name, Shell::options.read_from_tcp_port.get()); close(sockfd); return nullptr; } @@ -746,7 +746,7 @@ char* Shell::ReadCharsFromTcpPort(const char* name, int* size_out) { recv(sockfd, chars + total_received, file_length - total_received, 0); if (received < 0) { fprintf(stderr, "Failed to receive %s from localhost:%d\n", name, - Shell::options.read_from_tcp_port); + Shell::options.read_from_tcp_port.get()); close(sockfd); delete[] chars; return nullptr; diff --git a/deps/v8/src/d8/d8.cc b/deps/v8/src/d8/d8.cc index 26ccb62c681c90..dc17a696976b36 100644 --- a/deps/v8/src/d8/d8.cc +++ b/deps/v8/src/d8/d8.cc @@ -43,6 +43,7 @@ #include "src/init/v8.h" #include "src/interpreter/interpreter.h" #include "src/logging/counters.h" +#include "src/logging/log-utils.h" #include "src/objects/managed.h" #include "src/objects/objects-inl.h" #include "src/objects/objects.h" @@ -100,7 +101,7 @@ namespace { const int kMB = 1024 * 1024; #ifdef V8_FUZZILLI -// REPRL = read-eval-print-loop +// REPRL = read-eval-print-reset-loop // These file descriptors are being opened when Fuzzilli uses fork & execve to // run V8. #define REPRL_CRFD 100 // Control read file decriptor @@ -472,6 +473,7 @@ std::atomic Shell::unhandled_promise_rejections_{0}; Global Shell::evaluation_context_; ArrayBuffer::Allocator* Shell::array_buffer_allocator; +bool check_d8_flag_contradictions = true; ShellOptions Shell::options; base::OnceType Shell::quit_once_ = V8_ONCE_INIT; @@ -712,7 +714,7 @@ std::string ToSTLString(Isolate* isolate, Local v8_str) { bool IsAbsolutePath(const std::string& path) { #if defined(_WIN32) || defined(_WIN64) - // TODO(adamk): This is an incorrect approximation, but should + // This is an incorrect approximation, but should // work for all our test-running cases. return path.find(':') != std::string::npos; #else @@ -723,7 +725,8 @@ bool IsAbsolutePath(const std::string& path) { std::string GetWorkingDirectory() { #if defined(_WIN32) || defined(_WIN64) char system_buffer[MAX_PATH]; - // TODO(adamk): Support Unicode paths. + // Unicode paths are unsupported, which is fine as long as + // the test directory doesn't include any such paths. DWORD len = GetCurrentDirectoryA(MAX_PATH, system_buffer); CHECK_GT(len, 0); return system_buffer; @@ -846,7 +849,7 @@ MaybeLocal Shell::FetchModuleTree(Local context, } } if (source_text.IsEmpty()) { - std::string msg = "Error reading: " + file_name; + std::string msg = "d8: Error reading module from " + file_name; Throw(isolate, msg.c_str()); return MaybeLocal(); } @@ -1140,6 +1143,7 @@ PerIsolateData::PerIsolateData(Isolate* isolate) if (i::FLAG_expose_async_hooks) { async_hooks_wrapper_ = new AsyncHooks(isolate); } + ignore_unhandled_promises_ = false; } PerIsolateData::~PerIsolateData() { @@ -1170,6 +1174,7 @@ MaybeLocal PerIsolateData::GetTimeoutContext() { } void PerIsolateData::RemoveUnhandledPromise(Local promise) { + if (ignore_unhandled_promises_) return; // Remove handled promises from the list DCHECK_EQ(promise->GetIsolate(), isolate_); for (auto it = unhandled_promises_.begin(); it != unhandled_promises_.end(); @@ -1184,28 +1189,28 @@ void PerIsolateData::RemoveUnhandledPromise(Local promise) { void PerIsolateData::AddUnhandledPromise(Local promise, Local message, Local exception) { + if (ignore_unhandled_promises_) return; DCHECK_EQ(promise->GetIsolate(), isolate_); unhandled_promises_.emplace_back(v8::Global(isolate_, promise), v8::Global(isolate_, message), v8::Global(isolate_, exception)); } -size_t PerIsolateData::GetUnhandledPromiseCount() { - return unhandled_promises_.size(); -} - int PerIsolateData::HandleUnhandledPromiseRejections() { + // Avoid recursive calls to HandleUnhandledPromiseRejections. + if (ignore_unhandled_promises_) return 0; + ignore_unhandled_promises_ = true; v8::HandleScope scope(isolate_); // Ignore promises that get added during error reporting. - size_t unhandled_promises_count = unhandled_promises_.size(); - for (size_t i = 0; i < unhandled_promises_count; i++) { + size_t i = 0; + for (; i < unhandled_promises_.size(); i++) { const auto& tuple = unhandled_promises_[i]; Local message = std::get<1>(tuple).Get(isolate_); Local value = std::get<2>(tuple).Get(isolate_); Shell::ReportException(isolate_, message, value); } unhandled_promises_.clear(); - return static_cast(unhandled_promises_count); + return static_cast(i); } PerIsolateData::RealmScope::RealmScope(PerIsolateData* data) : data_(data) { @@ -1503,6 +1508,41 @@ void Shell::RealmSharedSet(Local property, Local value, data->realm_shared_.Reset(isolate, value); } +void Shell::LogGetAndStop(const v8::FunctionCallbackInfo& args) { + Isolate* isolate = args.GetIsolate(); + i::Isolate* i_isolate = reinterpret_cast(isolate); + HandleScope handle_scope(isolate); + + std::string file_name = i_isolate->logger()->file_name(); + if (!i::Log::IsLoggingToTemporaryFile(file_name)) { + Throw(isolate, "Only capturing from temporary files is supported."); + return; + } + if (!i_isolate->logger()->is_logging()) { + Throw(isolate, "Logging not enabled."); + return; + } + + std::string raw_log; + FILE* log_file = i_isolate->logger()->TearDownAndGetLogFile(); + CHECK_NOT_NULL(log_file); + + bool exists = false; + raw_log = i::ReadFile(log_file, &exists, true); + fclose(log_file); + + if (!exists) { + Throw(isolate, "Unable to read log file."); + return; + } + Local result = + String::NewFromUtf8(isolate, raw_log.c_str(), NewStringType::kNormal, + static_cast(raw_log.size())) + .ToLocalChecked(); + + args.GetReturnValue().Set(result); +} + // async_hooks.createHook() registers functions to be called for different // lifetime events of each async operation. void Shell::AsyncHooksCreateHook( @@ -2071,6 +2111,11 @@ Local Shell::Stringify(Isolate* isolate, Local value) { Local Shell::CreateGlobalTemplate(Isolate* isolate) { Local global_template = ObjectTemplate::New(isolate); + global_template->Set(Symbol::GetToStringTag(isolate), + String::NewFromUtf8Literal(isolate, "global")); + global_template->Set(isolate, "version", + FunctionTemplate::New(isolate, Version)); + global_template->Set(isolate, "print", FunctionTemplate::New(isolate, Print)); global_template->Set(isolate, "printErr", FunctionTemplate::New(isolate, PrintErr)); @@ -2089,8 +2134,79 @@ Local Shell::CreateGlobalTemplate(Isolate* isolate) { if (!options.omit_quit) { global_template->Set(isolate, "quit", FunctionTemplate::New(isolate, Quit)); } + global_template->Set(isolate, "testRunner", + Shell::CreateTestRunnerTemplate(isolate)); + global_template->Set(isolate, "Realm", Shell::CreateRealmTemplate(isolate)); + global_template->Set(isolate, "performance", + Shell::CreatePerformanceTemplate(isolate)); + global_template->Set(isolate, "Worker", Shell::CreateWorkerTemplate(isolate)); + global_template->Set(isolate, "os", Shell::CreateOSTemplate(isolate)); + global_template->Set(isolate, "d8", Shell::CreateD8Template(isolate)); + +#ifdef V8_FUZZILLI + global_template->Set( + String::NewFromUtf8(isolate, "fuzzilli", NewStringType::kNormal) + .ToLocalChecked(), + FunctionTemplate::New(isolate, Fuzzilli), PropertyAttribute::DontEnum); +#endif // V8_FUZZILLI + + if (i::FLAG_expose_async_hooks) { + global_template->Set(isolate, "async_hooks", + Shell::CreateAsyncHookTemplate(isolate)); + } + + return global_template; +} + +Local Shell::CreateOSTemplate(Isolate* isolate) { + Local os_template = ObjectTemplate::New(isolate); + AddOSMethods(isolate, os_template); + return os_template; +} + +Local Shell::CreateWorkerTemplate(Isolate* isolate) { + Local worker_fun_template = + FunctionTemplate::New(isolate, WorkerNew); + Local worker_signature = + Signature::New(isolate, worker_fun_template); + worker_fun_template->SetClassName( + String::NewFromUtf8Literal(isolate, "Worker")); + worker_fun_template->ReadOnlyPrototype(); + worker_fun_template->PrototypeTemplate()->Set( + isolate, "terminate", + FunctionTemplate::New(isolate, WorkerTerminate, Local(), + worker_signature)); + worker_fun_template->PrototypeTemplate()->Set( + isolate, "terminateAndWait", + FunctionTemplate::New(isolate, WorkerTerminateAndWait, Local(), + worker_signature)); + worker_fun_template->PrototypeTemplate()->Set( + isolate, "postMessage", + FunctionTemplate::New(isolate, WorkerPostMessage, Local(), + worker_signature)); + worker_fun_template->PrototypeTemplate()->Set( + isolate, "getMessage", + FunctionTemplate::New(isolate, WorkerGetMessage, Local(), + worker_signature)); + worker_fun_template->InstanceTemplate()->SetInternalFieldCount(1); + return worker_fun_template; +} + +Local Shell::CreateAsyncHookTemplate(Isolate* isolate) { + Local async_hooks_templ = ObjectTemplate::New(isolate); + async_hooks_templ->Set(isolate, "createHook", + FunctionTemplate::New(isolate, AsyncHooksCreateHook)); + async_hooks_templ->Set( + isolate, "executionAsyncId", + FunctionTemplate::New(isolate, AsyncHooksExecutionAsyncId)); + async_hooks_templ->Set( + isolate, "triggerAsyncId", + FunctionTemplate::New(isolate, AsyncHooksTriggerAsyncId)); + return async_hooks_templ; +} + +Local Shell::CreateTestRunnerTemplate(Isolate* isolate) { Local test_template = ObjectTemplate::New(isolate); - global_template->Set(isolate, "testRunner", test_template); test_template->Set(isolate, "notifyDone", FunctionTemplate::New(isolate, NotifyDone)); test_template->Set(isolate, "waitUntilDone", @@ -2099,13 +2215,20 @@ Local Shell::CreateGlobalTemplate(Isolate* isolate) { // installed on the global object can be hidden with the --omit-quit flag // (e.g. on asan bots). test_template->Set(isolate, "quit", FunctionTemplate::New(isolate, Quit)); + return test_template; +} - global_template->Set(isolate, "version", - FunctionTemplate::New(isolate, Version)); - global_template->Set(Symbol::GetToStringTag(isolate), - String::NewFromUtf8Literal(isolate, "global")); +Local Shell::CreatePerformanceTemplate(Isolate* isolate) { + Local performance_template = ObjectTemplate::New(isolate); + performance_template->Set(isolate, "now", + FunctionTemplate::New(isolate, PerformanceNow)); + performance_template->Set( + isolate, "measureMemory", + FunctionTemplate::New(isolate, PerformanceMeasureMemory)); + return performance_template; +} - // Bind the Realm object. +Local Shell::CreateRealmTemplate(Isolate* isolate) { Local realm_template = ObjectTemplate::New(isolate); realm_template->Set(isolate, "current", FunctionTemplate::New(isolate, RealmCurrent)); @@ -2130,68 +2253,19 @@ Local Shell::CreateGlobalTemplate(Isolate* isolate) { FunctionTemplate::New(isolate, RealmEval)); realm_template->SetAccessor(String::NewFromUtf8Literal(isolate, "shared"), RealmSharedGet, RealmSharedSet); - global_template->Set(isolate, "Realm", realm_template); - - Local performance_template = ObjectTemplate::New(isolate); - performance_template->Set(isolate, "now", - FunctionTemplate::New(isolate, PerformanceNow)); - performance_template->Set( - isolate, "measureMemory", - FunctionTemplate::New(isolate, PerformanceMeasureMemory)); - global_template->Set(isolate, "performance", performance_template); - - Local worker_fun_template = - FunctionTemplate::New(isolate, WorkerNew); - Local worker_signature = - Signature::New(isolate, worker_fun_template); - worker_fun_template->SetClassName( - String::NewFromUtf8Literal(isolate, "Worker")); - worker_fun_template->ReadOnlyPrototype(); - worker_fun_template->PrototypeTemplate()->Set( - isolate, "terminate", - FunctionTemplate::New(isolate, WorkerTerminate, Local(), - worker_signature)); - worker_fun_template->PrototypeTemplate()->Set( - isolate, "terminateAndWait", - FunctionTemplate::New(isolate, WorkerTerminateAndWait, Local(), - worker_signature)); - worker_fun_template->PrototypeTemplate()->Set( - isolate, "postMessage", - FunctionTemplate::New(isolate, WorkerPostMessage, Local(), - worker_signature)); - worker_fun_template->PrototypeTemplate()->Set( - isolate, "getMessage", - FunctionTemplate::New(isolate, WorkerGetMessage, Local(), - worker_signature)); - worker_fun_template->InstanceTemplate()->SetInternalFieldCount(1); - global_template->Set(isolate, "Worker", worker_fun_template); - - Local os_templ = ObjectTemplate::New(isolate); - AddOSMethods(isolate, os_templ); - global_template->Set(isolate, "os", os_templ); + return realm_template; +} -#ifdef V8_FUZZILLI - global_template->Set( - String::NewFromUtf8(isolate, "fuzzilli", NewStringType::kNormal) - .ToLocalChecked(), - FunctionTemplate::New(isolate, Fuzzilli), PropertyAttribute::DontEnum); -#endif // V8_FUZZILLI +Local Shell::CreateD8Template(Isolate* isolate) { + Local d8_template = ObjectTemplate::New(isolate); + { + Local log_template = ObjectTemplate::New(isolate); + log_template->Set(isolate, "getAndStop", + FunctionTemplate::New(isolate, LogGetAndStop)); - if (i::FLAG_expose_async_hooks) { - Local async_hooks_templ = ObjectTemplate::New(isolate); - async_hooks_templ->Set( - isolate, "createHook", - FunctionTemplate::New(isolate, AsyncHooksCreateHook)); - async_hooks_templ->Set( - isolate, "executionAsyncId", - FunctionTemplate::New(isolate, AsyncHooksExecutionAsyncId)); - async_hooks_templ->Set( - isolate, "triggerAsyncId", - FunctionTemplate::New(isolate, AsyncHooksTriggerAsyncId)); - global_template->Set(isolate, "async_hooks", async_hooks_templ); + d8_template->Set(isolate, "log", log_template); } - - return global_template; + return d8_template; } static void PrintMessageCallback(Local message, Local error) { @@ -2794,33 +2868,35 @@ bool ends_with(const char* input, const char* suffix) { bool SourceGroup::Execute(Isolate* isolate) { bool success = true; #ifdef V8_FUZZILLI - HandleScope handle_scope(isolate); - Local file_name = - String::NewFromUtf8(isolate, "fuzzcode.js", NewStringType::kNormal) - .ToLocalChecked(); + if (fuzzilli_reprl) { + HandleScope handle_scope(isolate); + Local file_name = + String::NewFromUtf8(isolate, "fuzzcode.js", NewStringType::kNormal) + .ToLocalChecked(); - size_t script_size; - CHECK_EQ(read(REPRL_CRFD, &script_size, 8), 8); - char* buffer = new char[script_size + 1]; - char* ptr = buffer; - size_t remaining = script_size; - while (remaining > 0) { - ssize_t rv = read(REPRL_DRFD, ptr, remaining); - CHECK_GE(rv, 0); - remaining -= rv; - ptr += rv; - } - buffer[script_size] = 0; - - Local source = - String::NewFromUtf8(isolate, buffer, NewStringType::kNormal) - .ToLocalChecked(); - delete[] buffer; - Shell::set_script_executed(); - if (!Shell::ExecuteString(isolate, source, file_name, Shell::kNoPrintResult, - Shell::kReportExceptions, - Shell::kNoProcessMessageQueue)) { - return false; + size_t script_size; + CHECK_EQ(read(REPRL_CRFD, &script_size, 8), 8); + char* buffer = new char[script_size + 1]; + char* ptr = buffer; + size_t remaining = script_size; + while (remaining > 0) { + ssize_t rv = read(REPRL_DRFD, ptr, remaining); + CHECK_GE(rv, 0); + remaining -= rv; + ptr += rv; + } + buffer[script_size] = 0; + + Local source = + String::NewFromUtf8(isolate, buffer, NewStringType::kNormal) + .ToLocalChecked(); + delete[] buffer; + Shell::set_script_executed(); + if (!Shell::ExecuteString(isolate, source, file_name, Shell::kNoPrintResult, + Shell::kReportExceptions, + Shell::kNoProcessMessageQueue)) { + return false; + } } #endif // V8_FUZZILLI for (int i = begin_offset_; i < end_offset_; ++i) { @@ -3233,6 +3309,7 @@ void Worker::PostMessageOut(const v8::FunctionCallbackInfo& args) { bool Shell::SetOptions(int argc, char* argv[]) { bool logfile_per_isolate = false; + bool no_always_opt = false; for (int i = 0; i < argc; i++) { if (strcmp(argv[i], "--") == 0) { argv[i] = nullptr; @@ -3253,6 +3330,18 @@ bool Shell::SetOptions(int argc, char* argv[]) { argv[i] = nullptr; } else if (strcmp(argv[i], "--stress-snapshot") == 0) { options.stress_snapshot = true; + // Incremental marking is incompatible with the stress_snapshot mode; + // specifically, serialization may clear bytecode arrays from shared + // function infos which the MarkCompactCollector (running concurrently) + // may still need. See also https://crbug.com/v8/10882. + // + // We thus force the implication + // + // --stress-snapshot ~~> --no-incremental-marking + // + // Note: This is not an issue in production because we don't clear SFI's + // there (that only happens in mksnapshot and in --stress-snapshot mode). + i::FLAG_incremental_marking = false; argv[i] = nullptr; } else if (strcmp(argv[i], "--nostress-snapshot") == 0 || strcmp(argv[i], "--no-stress-snapshot") == 0) { @@ -3260,8 +3349,13 @@ bool Shell::SetOptions(int argc, char* argv[]) { argv[i] = nullptr; } else if (strcmp(argv[i], "--noalways-opt") == 0 || strcmp(argv[i], "--no-always-opt") == 0) { - // No support for stressing if we can't use --always-opt. - options.stress_opt = false; + no_always_opt = true; + } else if (strcmp(argv[i], "--fuzzing") == 0 || + strcmp(argv[i], "--no-abort-on-contradictory-flags") == 0 || + strcmp(argv[i], "--noabort-on-contradictory-flags") == 0) { + check_d8_flag_contradictions = false; + } else if (strcmp(argv[i], "--abort-on-contradictory-flags") == 0) { + check_d8_flag_contradictions = true; } else if (strcmp(argv[i], "--logfile-per-isolate") == 0) { logfile_per_isolate = true; argv[i] = nullptr; @@ -3402,6 +3496,10 @@ bool Shell::SetOptions(int argc, char* argv[]) { } } + if (options.stress_opt && no_always_opt && check_d8_flag_contradictions) { + FATAL("Flag --no-always-opt is incompatible with --stress-opt."); + } + const char* usage = "Synopsis:\n" " shell [options] [--shell] [...]\n" @@ -3410,6 +3508,7 @@ bool Shell::SetOptions(int argc, char* argv[]) { " --shell run an interactive JavaScript shell\n" " --module execute a file as a JavaScript module\n\n"; using HelpOptions = i::FlagList::HelpOptions; + i::FLAG_abort_on_contradictory_flags = true; i::FlagList::SetFlagsFromCommandLine(&argc, argv, true, HelpOptions(HelpOptions::kExit, usage)); options.mock_arraybuffer_allocator = i::FLAG_mock_arraybuffer_allocator; @@ -3870,12 +3969,11 @@ class D8Testing { "--max-inlined-bytecode-size=999999 " "--max-inlined-bytecode-size-cumulative=999999 " "--noalways-opt"; - static const char* kForcedOptimizations = "--always-opt"; - if (run == GetStressRuns() - 1) { - V8::SetFlagsFromString(kForcedOptimizations); - } else { + if (run == 0) { V8::SetFlagsFromString(kLazyOptimizations); + } else if (run == GetStressRuns() - 1) { + i::FLAG_always_opt = true; } } @@ -4117,7 +4215,7 @@ int Shell::Main(int argc, char* argv[]) { options.stress_runs = D8Testing::GetStressRuns(); for (int i = 0; i < options.stress_runs && result == 0; i++) { printf("============ Stress %d/%d ============\n", i + 1, - options.stress_runs); + options.stress_runs.get()); D8Testing::PrepareStressRun(i); bool last_run = i == options.stress_runs - 1; result = RunMain(isolate, last_run); @@ -4128,7 +4226,7 @@ int Shell::Main(int argc, char* argv[]) { options.stress_runs = i::FLAG_stress_runs; for (int i = 0; i < options.stress_runs && result == 0; i++) { printf("============ Run %d/%d ============\n", i + 1, - options.stress_runs); + options.stress_runs.get()); bool last_run = i == options.stress_runs - 1; result = RunMain(isolate, last_run); } @@ -4155,14 +4253,16 @@ int Shell::Main(int argc, char* argv[]) { DCHECK(options.compile_options == v8::ScriptCompiler::kEagerCompile || options.compile_options == v8::ScriptCompiler::kNoCompileOptions); - options.compile_options = v8::ScriptCompiler::kConsumeCodeCache; - options.code_cache_options = - ShellOptions::CodeCacheOptions::kNoProduceCache; + options.compile_options.Overwrite( + v8::ScriptCompiler::kConsumeCodeCache); + options.code_cache_options.Overwrite( + ShellOptions::CodeCacheOptions::kNoProduceCache); printf("============ Run: Consume code cache ============\n"); // Second run to consume the cache in current isolate result = RunMain(isolate, true); - options.compile_options = v8::ScriptCompiler::kNoCompileOptions; + options.compile_options.Overwrite( + v8::ScriptCompiler::kNoCompileOptions); } else { bool last_run = true; result = RunMain(isolate, last_run); @@ -4219,6 +4319,10 @@ int Shell::Main(int argc, char* argv[]) { << bitmap.size() << std::endl; iteration_counter++; } + // In REPRL mode, stdout and stderr can be regular files, so they need + // to be flushed after every execution + fflush(stdout); + fflush(stderr); CHECK_EQ(write(REPRL_CWFD, &status, 4), 4); sanitizer_cov_reset_edgeguards(); if (options.fuzzilli_enable_builtins_coverage) { diff --git a/deps/v8/src/d8/d8.h b/deps/v8/src/d8/d8.h index 6b2c08fd6eac10..11ec47d81500b7 100644 --- a/deps/v8/src/d8/d8.h +++ b/deps/v8/src/d8/d8.h @@ -260,7 +260,6 @@ class PerIsolateData { void AddUnhandledPromise(Local promise, Local message, Local exception); int HandleUnhandledPromiseRejections(); - size_t GetUnhandledPromiseCount(); private: friend class Shell; @@ -273,6 +272,7 @@ class PerIsolateData { Global realm_shared_; std::queue> set_timeout_callbacks_; std::queue> set_timeout_contexts_; + bool ignore_unhandled_promises_; std::vector, Global, Global>> unhandled_promises_; AsyncHooks* async_hooks_wrapper_; @@ -282,6 +282,8 @@ class PerIsolateData { int RealmFind(Local context); }; +extern bool check_d8_flag_contradictions; + class ShellOptions { public: enum CodeCacheOptions { @@ -292,47 +294,97 @@ class ShellOptions { ~ShellOptions() { delete[] isolate_sources; } - bool fuzzilli_coverage_statistics = false; - bool fuzzilli_enable_builtins_coverage = true; - bool send_idle_notification = false; - bool invoke_weak_callbacks = false; - bool omit_quit = false; - bool wait_for_background_tasks = true; - bool stress_opt = false; - int stress_runs = 1; - bool stress_snapshot = false; - bool interactive_shell = false; + // In analogy to Flag::CheckFlagChange() in src/flags/flag.cc, only allow + // repeated flags for identical boolean values. We allow exceptions for flags + // with enum-like arguments since their conflicts can also be specified + // completely. + template ::value> + class DisallowReassignment { + public: + DisallowReassignment(const char* name, T value) + : name_(name), value_(value) {} + + operator T() const { return value_; } // NOLINT + T get() const { return value_; } + DisallowReassignment& operator=(T value) { + if (check_d8_flag_contradictions) { + if (kAllowIdenticalAssignment) { + if (specified_ && value_ != value) { + FATAL("Contradictory values for d8 flag --%s", name_); + } + } else { + if (specified_) { + FATAL("Repeated specification of d8 flag --%s", name_); + } + } + } + value_ = value; + specified_ = true; + return *this; + } + void Overwrite(T value) { value_ = value; } + + private: + const char* name_; + T value_; + bool specified_ = false; + }; + + DisallowReassignment fuzzilli_coverage_statistics = { + "fuzzilli-coverage-statistics", false}; + DisallowReassignment fuzzilli_enable_builtins_coverage = { + "fuzzilli-enable-builtins-coverage", true}; + DisallowReassignment send_idle_notification = {"send-idle-notification", + false}; + DisallowReassignment invoke_weak_callbacks = {"invoke-weak-callbacks", + false}; + DisallowReassignment omit_quit = {"omit-quit", false}; + DisallowReassignment wait_for_background_tasks = { + "wait-for-background-tasks", true}; + DisallowReassignment stress_opt = {"stress-opt", false}; + DisallowReassignment stress_runs = {"stress-runs", 1}; + DisallowReassignment stress_snapshot = {"stress-snapshot", false}; + DisallowReassignment interactive_shell = {"shell", false}; bool test_shell = false; - bool expected_to_throw = false; - bool ignore_unhandled_promises = false; - bool mock_arraybuffer_allocator = false; - size_t mock_arraybuffer_allocator_limit = 0; - bool multi_mapped_mock_allocator = false; - bool enable_inspector = false; + DisallowReassignment expected_to_throw = {"throws", false}; + DisallowReassignment ignore_unhandled_promises = { + "ignore-unhandled-promises", false}; + DisallowReassignment mock_arraybuffer_allocator = { + "mock-arraybuffer-allocator", false}; + DisallowReassignment mock_arraybuffer_allocator_limit = { + "mock-arraybuffer-allocator-limit", 0}; + DisallowReassignment multi_mapped_mock_allocator = { + "multi-mapped-mock-allocator", false}; + DisallowReassignment enable_inspector = {"enable-inspector", false}; int num_isolates = 1; - v8::ScriptCompiler::CompileOptions compile_options = - v8::ScriptCompiler::kNoCompileOptions; - CodeCacheOptions code_cache_options = CodeCacheOptions::kNoProduceCache; - bool streaming_compile = false; - SourceGroup* isolate_sources = nullptr; - const char* icu_data_file = nullptr; - const char* icu_locale = nullptr; - const char* snapshot_blob = nullptr; - bool trace_enabled = false; - const char* trace_path = nullptr; - const char* trace_config = nullptr; - const char* lcov_file = nullptr; - bool disable_in_process_stack_traces = false; - int read_from_tcp_port = -1; - bool enable_os_system = false; - bool quiet_load = false; - int thread_pool_size = 0; - bool stress_delay_tasks = false; + DisallowReassignment + compile_options = {"cache", v8::ScriptCompiler::kNoCompileOptions}; + DisallowReassignment code_cache_options = { + "cache", CodeCacheOptions::kNoProduceCache}; + DisallowReassignment streaming_compile = {"streaming-compile", false}; + DisallowReassignment isolate_sources = {"isolate-sources", + nullptr}; + DisallowReassignment icu_data_file = {"icu-data-file", nullptr}; + DisallowReassignment icu_locale = {"icu-locale", nullptr}; + DisallowReassignment snapshot_blob = {"snapshot_blob", nullptr}; + DisallowReassignment trace_enabled = {"trace-enabled", false}; + DisallowReassignment trace_path = {"trace-path", nullptr}; + DisallowReassignment trace_config = {"trace-config", nullptr}; + DisallowReassignment lcov_file = {"lcov", nullptr}; + DisallowReassignment disable_in_process_stack_traces = { + "disable-in-process-stack-traces", false}; + DisallowReassignment read_from_tcp_port = {"read-from-tcp-port", -1}; + DisallowReassignment enable_os_system = {"enable-os-system", false}; + DisallowReassignment quiet_load = {"quiet-load", false}; + DisallowReassignment thread_pool_size = {"thread-pool-size", 0}; + DisallowReassignment stress_delay_tasks = {"stress-delay-tasks", false}; std::vector arguments; - bool include_arguments = true; - bool cpu_profiler = false; - bool cpu_profiler_print = false; - bool fuzzy_module_file_extensions = true; + DisallowReassignment include_arguments = {"arguments", true}; + DisallowReassignment cpu_profiler = {"cpu-profiler", false}; + DisallowReassignment cpu_profiler_print = {"cpu-profiler-print", false}; + DisallowReassignment fuzzy_module_file_extensions = { + "fuzzy-module-file-extensions", true}; }; class Shell : public i::AllStatic { @@ -401,6 +453,8 @@ class Shell : public i::AllStatic { static void RealmSharedSet(Local property, Local value, const PropertyCallbackInfo& info); + static void LogGetAndStop(const v8::FunctionCallbackInfo& args); + static void AsyncHooksCreateHook( const v8::FunctionCallbackInfo& args); static void AsyncHooksExecutionAsyncId( @@ -539,7 +593,16 @@ class Shell : public i::AllStatic { static Local Stringify(Isolate* isolate, Local value); static void RunShell(Isolate* isolate); static bool SetOptions(int argc, char* argv[]); + static Local CreateGlobalTemplate(Isolate* isolate); + static Local CreateOSTemplate(Isolate* isolate); + static Local CreateWorkerTemplate(Isolate* isolate); + static Local CreateAsyncHookTemplate(Isolate* isolate); + static Local CreateTestRunnerTemplate(Isolate* isolate); + static Local CreatePerformanceTemplate(Isolate* isolate); + static Local CreateRealmTemplate(Isolate* isolate); + static Local CreateD8Template(Isolate* isolate); + static MaybeLocal CreateRealm( const v8::FunctionCallbackInfo& args, int index, v8::MaybeLocal global_object); diff --git a/deps/v8/src/debug/debug-evaluate.cc b/deps/v8/src/debug/debug-evaluate.cc index c0ce638e642967..c7d0a890c498b3 100644 --- a/deps/v8/src/debug/debug-evaluate.cc +++ b/deps/v8/src/debug/debug-evaluate.cc @@ -261,7 +261,7 @@ bool IntrinsicHasNoSideEffect(Runtime::FunctionId id) { V(ToLength) \ V(ToNumber) \ V(ToObject) \ - V(ToStringRT) \ + V(ToString) \ /* Type checks */ \ V(IsArray) \ V(IsFunction) \ diff --git a/deps/v8/src/debug/debug-interface.h b/deps/v8/src/debug/debug-interface.h index 077f96b1ab0b46..9234fe35acb3ad 100644 --- a/deps/v8/src/debug/debug-interface.h +++ b/deps/v8/src/debug/debug-interface.h @@ -10,6 +10,7 @@ #include "include/v8-inspector.h" #include "include/v8-util.h" #include "include/v8.h" +#include "src/base/platform/time.h" #include "src/common/globals.h" #include "src/debug/interface-types.h" #include "src/utils/vector.h" @@ -250,6 +251,7 @@ Local GetBuiltin(Isolate* isolate, Builtin builtin); V8_EXPORT_PRIVATE void SetConsoleDelegate(Isolate* isolate, ConsoleDelegate* delegate); +V8_DEPRECATED("See http://crbug.com/v8/10566.") int GetStackFrameId(v8::Local frame); v8::Local GetDetailedStackTrace(Isolate* isolate, @@ -504,6 +506,11 @@ enum class NativeAccessorType { int64_t GetNextRandomInt64(v8::Isolate* isolate); +using RuntimeCallCounterCallback = + std::function; +void EnumerateRuntimeCallCounters(v8::Isolate* isolate, + RuntimeCallCounterCallback callback); + enum class EvaluateGlobalMode { kDefault, kDisableBreaks, diff --git a/deps/v8/src/debug/debug.cc b/deps/v8/src/debug/debug.cc index 15085b9577e2f8..d86a7ff5b8d688 100644 --- a/deps/v8/src/debug/debug.cc +++ b/deps/v8/src/debug/debug.cc @@ -372,6 +372,18 @@ char* Debug::RestoreDebug(char* storage) { ClearOneShot(); if (thread_local_.last_step_action_ != StepNone) { + int current_frame_count = CurrentFrameCount(); + int target_frame_count = thread_local_.target_frame_count_; + DCHECK(current_frame_count >= target_frame_count); + StackTraceFrameIterator frames_it(isolate_); + while (current_frame_count > target_frame_count) { + current_frame_count -= frames_it.FrameFunctionCount(); + frames_it.Advance(); + } + DCHECK(current_frame_count == target_frame_count); + // Set frame to what it was at Step break + thread_local_.break_frame_id_ = frames_it.frame()->id(); + // Reset the previous step action for this thread. PrepareStep(thread_local_.last_step_action_); } @@ -2040,15 +2052,8 @@ int Debug::CurrentFrameCount() { while (!it.done() && it.frame()->id() != break_frame_id()) it.Advance(); } int counter = 0; - while (!it.done()) { - if (it.frame()->is_optimized()) { - std::vector infos; - OptimizedFrame::cast(it.frame())->GetFunctions(&infos); - counter += infos.size(); - } else { - counter++; - } - it.Advance(); + for (; !it.done(); it.Advance()) { + counter += it.FrameFunctionCount(); } return counter; } diff --git a/deps/v8/src/debug/liveedit.cc b/deps/v8/src/debug/liveedit.cc index 1dc0a803c17789..e62fbab04af7b1 100644 --- a/deps/v8/src/debug/liveedit.cc +++ b/deps/v8/src/debug/liveedit.cc @@ -1025,7 +1025,7 @@ void TranslateSourcePositionTable(Isolate* isolate, Handle code, Handle new_source_position_table( builder.ToSourcePositionTable(isolate)); - code->set_source_position_table(*new_source_position_table); + code->set_synchronized_source_position_table(*new_source_position_table); LOG_CODE_EVENT(isolate, CodeLinePosInfoRecordEvent(code->GetFirstBytecodeAddress(), *new_source_position_table)); diff --git a/deps/v8/src/debug/ppc/OWNERS b/deps/v8/src/debug/ppc/OWNERS index 6d1a8fc472cfe1..6edd45a6ef2e04 100644 --- a/deps/v8/src/debug/ppc/OWNERS +++ b/deps/v8/src/debug/ppc/OWNERS @@ -1,4 +1,4 @@ -jyan@ca.ibm.com +junyan@redhat.com joransiu@ca.ibm.com -michael_dawson@ca.ibm.com -miladfar@ca.ibm.com \ No newline at end of file +midawson@redhat.com +mfarazma@redhat.com diff --git a/deps/v8/src/deoptimizer/arm64/deoptimizer-arm64.cc b/deps/v8/src/deoptimizer/arm64/deoptimizer-arm64.cc index 05dae1e21f61c0..21a75d024d5c51 100644 --- a/deps/v8/src/deoptimizer/arm64/deoptimizer-arm64.cc +++ b/deps/v8/src/deoptimizer/arm64/deoptimizer-arm64.cc @@ -308,14 +308,9 @@ Float32 RegisterValues::GetFloatRegister(unsigned n) const { } void FrameDescription::SetCallerPc(unsigned offset, intptr_t value) { - // TODO(v8:10026): check that the pointer is still in the list of allowed - // builtins. Address new_context = static_cast
(GetTop()) + offset + kPCOnStackSize; - uint64_t old_context = GetTop() + GetFrameSize(); - PointerAuthentication::ReplaceContext(reinterpret_cast(&value), - old_context, new_context); - + value = PointerAuthentication::SignAndCheckPC(value, new_context); SetFrameSlot(offset, value); } @@ -329,9 +324,11 @@ void FrameDescription::SetCallerConstantPool(unsigned offset, intptr_t value) { } void FrameDescription::SetPc(intptr_t pc) { - // TODO(v8:10026): we should only accept a specific list of allowed builtins - // here. - pc_ = PointerAuthentication::SignPCWithSP(pc, GetTop()); + if (ENABLE_CONTROL_FLOW_INTEGRITY_BOOL) { + CHECK( + Deoptimizer::IsValidReturnAddress(PointerAuthentication::StripPAC(pc))); + } + pc_ = pc; } #undef __ diff --git a/deps/v8/src/deoptimizer/deoptimizer-cfi-builtins.cc b/deps/v8/src/deoptimizer/deoptimizer-cfi-builtins.cc new file mode 100644 index 00000000000000..ae00947a1088a3 --- /dev/null +++ b/deps/v8/src/deoptimizer/deoptimizer-cfi-builtins.cc @@ -0,0 +1,47 @@ +// Copyright 2020 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "src/builtins/builtins.h" +#include "src/deoptimizer/deoptimizer.h" + +extern "C" { +void Builtins_InterpreterEnterBytecodeAdvance(); +void Builtins_InterpreterEnterBytecodeDispatch(); +void Builtins_ContinueToCodeStubBuiltinWithResult(); +void Builtins_ContinueToCodeStubBuiltin(); +void Builtins_ContinueToJavaScriptBuiltinWithResult(); +void Builtins_ContinueToJavaScriptBuiltin(); +void arguments_adaptor_deopt_addr(); +void construct_stub_create_deopt_addr(); +void construct_stub_invoke_deopt_addr(); +typedef void (*function_ptr)(); +} + +namespace v8 { +namespace internal { + +// List of allowed builtin addresses that we can return to in the deoptimizer. +constexpr function_ptr builtins[] = { + &Builtins_InterpreterEnterBytecodeAdvance, + &Builtins_InterpreterEnterBytecodeDispatch, + &Builtins_ContinueToCodeStubBuiltinWithResult, + &Builtins_ContinueToCodeStubBuiltin, + &Builtins_ContinueToJavaScriptBuiltinWithResult, + &Builtins_ContinueToJavaScriptBuiltin, + &construct_stub_create_deopt_addr, + &construct_stub_invoke_deopt_addr, + &arguments_adaptor_deopt_addr, +}; + +bool Deoptimizer::IsValidReturnAddress(Address address) { + for (function_ptr builtin : builtins) { + if (address == FUNCTION_ADDR(builtin)) { + return true; + } + } + return false; +} + +} // namespace internal +} // namespace v8 diff --git a/deps/v8/src/deoptimizer/deoptimizer-cfi-empty.cc b/deps/v8/src/deoptimizer/deoptimizer-cfi-empty.cc new file mode 100644 index 00000000000000..60ff43701c8e14 --- /dev/null +++ b/deps/v8/src/deoptimizer/deoptimizer-cfi-empty.cc @@ -0,0 +1,14 @@ +// Copyright 2020 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "src/deoptimizer/deoptimizer.h" + +namespace v8 { +namespace internal { + +// Dummy implementation when building mksnapshot. +bool Deoptimizer::IsValidReturnAddress(Address address) { return false; } + +} // namespace internal +} // namespace v8 diff --git a/deps/v8/src/deoptimizer/deoptimizer.cc b/deps/v8/src/deoptimizer/deoptimizer.cc index 9f7adfa729d95a..c2b4d402eedc41 100644 --- a/deps/v8/src/deoptimizer/deoptimizer.cc +++ b/deps/v8/src/deoptimizer/deoptimizer.cc @@ -12,6 +12,7 @@ #include "src/codegen/callable.h" #include "src/codegen/macro-assembler.h" #include "src/codegen/register-configuration.h" +#include "src/common/assert-scope.h" #include "src/diagnostics/disasm.h" #include "src/execution/frames-inl.h" #include "src/execution/pointer-authentication.h" @@ -26,7 +27,7 @@ #include "src/objects/heap-number-inl.h" #include "src/objects/smi.h" #include "src/tracing/trace-event.h" -#include "torque-generated/exported-class-definitions-tq.h" +#include "torque-generated/exported-class-definitions.h" // Has to be the last include (doesn't have include guards) #include "src/objects/object-macros.h" @@ -62,7 +63,16 @@ class FrameWriter { } } - void PushCallerPc(intptr_t pc) { + // There is no check against the allowed addresses for bottommost frames, as + // the caller's pc could be anything. The caller's pc pushed here should never + // be re-signed. + void PushBottommostCallerPc(intptr_t pc) { + top_offset_ -= kPCOnStackSize; + frame_->SetFrameSlot(top_offset_, pc); + DebugPrintOutputPc(pc, "bottommost caller's pc\n"); + } + + void PushApprovedCallerPc(intptr_t pc) { top_offset_ -= kPCOnStackSize; frame_->SetCallerPc(top_offset_, pc); DebugPrintOutputPc(pc, "caller's pc\n"); @@ -111,6 +121,8 @@ class FrameWriter { unsigned top_offset() const { return top_offset_; } + FrameDescription* frame() { return frame_; } + private: void PushValue(intptr_t value) { CHECK_GE(top_offset_, 0); @@ -163,19 +175,19 @@ class FrameWriter { Deoptimizer* deoptimizer_; FrameDescription* frame_; - CodeTracer::Scope* trace_scope_; + CodeTracer::Scope* const trace_scope_; unsigned top_offset_; }; DeoptimizerData::DeoptimizerData(Heap* heap) : heap_(heap), current_(nullptr) { Code* start = &deopt_entry_code_[0]; Code* end = &deopt_entry_code_[DeoptimizerData::kLastDeoptimizeKind + 1]; - heap_->RegisterStrongRoots(FullObjectSlot(start), FullObjectSlot(end)); + strong_roots_entry_ = + heap_->RegisterStrongRoots(FullObjectSlot(start), FullObjectSlot(end)); } DeoptimizerData::~DeoptimizerData() { - Code* start = &deopt_entry_code_[0]; - heap_->UnregisterStrongRoots(FullObjectSlot(start)); + heap_->UnregisterStrongRoots(strong_roots_entry_); } Code DeoptimizerData::deopt_entry_code(DeoptimizeKind kind) { @@ -304,6 +316,7 @@ class ActivationsFinder : public ThreadVisitor { // Move marked code from the optimized code list to the deoptimized code list, // and replace pc on the stack for codes marked for deoptimization. +// static void Deoptimizer::DeoptimizeMarkedCodeForContext(NativeContext native_context) { DisallowHeapAllocation no_allocation; @@ -321,12 +334,7 @@ void Deoptimizer::DeoptimizeMarkedCodeForContext(NativeContext native_context) { Code code = it.frame()->LookupCode(); JSFunction function = static_cast(it.frame())->function(); - if (FLAG_trace_deopt) { - CodeTracer::Scope scope(isolate->GetCodeTracer()); - PrintF(scope.file(), "[deoptimizer found activation of function: "); - function.PrintName(scope.file()); - PrintF(scope.file(), " / %" V8PRIxPTR "]\n", function.ptr()); - } + TraceFoundActivation(isolate, function); SafepointEntry safepoint = code.GetSafepointEntry(it.frame()->pc()); // Turbofan deopt is checked when we are patching addresses on stack. @@ -401,10 +409,7 @@ void Deoptimizer::DeoptimizeAll(Isolate* isolate) { RuntimeCallCounterId::kDeoptimizeCode); TimerEventScope timer(isolate); TRACE_EVENT0("v8", "V8.DeoptimizeCode"); - if (FLAG_trace_deopt) { - CodeTracer::Scope scope(isolate->GetCodeTracer()); - PrintF(scope.file(), "[deoptimize all code in all contexts]\n"); - } + TraceDeoptAll(isolate); isolate->AbortConcurrentOptimization(BlockingBehavior::kBlock); DisallowHeapAllocation no_allocation; // For all contexts, mark all code, then deoptimize. @@ -423,10 +428,7 @@ void Deoptimizer::DeoptimizeMarkedCode(Isolate* isolate) { RuntimeCallCounterId::kDeoptimizeCode); TimerEventScope timer(isolate); TRACE_EVENT0("v8", "V8.DeoptimizeCode"); - if (FLAG_trace_deopt) { - CodeTracer::Scope scope(isolate->GetCodeTracer()); - PrintF(scope.file(), "[deoptimize marked code in all contexts]\n"); - } + TraceDeoptMarked(isolate); DisallowHeapAllocation no_allocation; // For all contexts, deoptimize code already marked. Object context = isolate->heap()->native_contexts_list(); @@ -530,8 +532,11 @@ Deoptimizer::Deoptimizer(Isolate* isolate, JSFunction function, caller_pc_(0), caller_constant_pool_(0), input_frame_context_(0), + actual_argument_count_(0), stack_fp_(0), - trace_scope_(nullptr) { + trace_scope_(FLAG_trace_deopt + ? new CodeTracer::Scope(isolate->GetCodeTracer()) + : nullptr) { if (isolate->deoptimizer_lazy_throw()) { isolate->set_deoptimizer_lazy_throw(false); deoptimizing_throw_ = true; @@ -542,12 +547,10 @@ Deoptimizer::Deoptimizer(Isolate* isolate, JSFunction function, DCHECK(!compiled_code_.is_null()); DCHECK(function.IsJSFunction()); - trace_scope_ = FLAG_trace_deopt - ? new CodeTracer::Scope(isolate->GetCodeTracer()) - : nullptr; #ifdef DEBUG DCHECK(AllowHeapAllocation::IsAllowed()); - disallow_heap_allocation_ = new DisallowHeapAllocation(); + DCHECK(AllowGarbageCollection::IsAllowed()); + disallow_garbage_collection_ = new DisallowGarbageCollection(); #endif // DEBUG CHECK(CodeKindCanDeoptimize(compiled_code_.kind())); if (!compiled_code_.deopt_already_counted() && @@ -604,14 +607,6 @@ Code Deoptimizer::FindOptimizedCode() { : isolate_->FindCodeObject(from_); } -void Deoptimizer::PrintFunctionName() { - if (function_.IsHeapObject() && function_.IsJSFunction()) { - function_.ShortPrint(trace_scope_->file()); - } else { - PrintF(trace_scope_->file(), "%s", CodeKindToString(compiled_code_.kind())); - } -} - Handle Deoptimizer::function() const { return Handle(function_, isolate()); } @@ -627,8 +622,7 @@ bool Deoptimizer::should_reuse_code() const { Deoptimizer::~Deoptimizer() { DCHECK(input_ == nullptr && output_ == nullptr); - DCHECK_NULL(disallow_heap_allocation_); - delete trace_scope_; + DCHECK_NULL(disallow_garbage_collection_); } void Deoptimizer::DeleteFrameDescriptions() { @@ -640,10 +634,10 @@ void Deoptimizer::DeleteFrameDescriptions() { input_ = nullptr; output_ = nullptr; #ifdef DEBUG - DCHECK(!AllowHeapAllocation::IsAllowed()); - DCHECK_NOT_NULL(disallow_heap_allocation_); - delete disallow_heap_allocation_; - disallow_heap_allocation_ = nullptr; + DCHECK(!AllowGarbageCollection::IsAllowed()); + DCHECK_NOT_NULL(disallow_garbage_collection_); + delete disallow_garbage_collection_; + disallow_garbage_collection_ = nullptr; #endif // DEBUG } @@ -726,6 +720,106 @@ int LookupCatchHandler(TranslatedFrame* translated_frame, int* data_out) { } // namespace +void Deoptimizer::TraceDeoptBegin(int optimization_id, int node_id) { + DCHECK(tracing_enabled()); + FILE* file = trace_scope()->file(); + Deoptimizer::DeoptInfo info = + Deoptimizer::GetDeoptInfo(compiled_code_, from_); + PrintF(file, "[bailout (kind: %s, reason: %s): begin. deoptimizing ", + MessageFor(deopt_kind_, should_reuse_code()), + DeoptimizeReasonToString(info.deopt_reason)); + if (function_.IsJSFunction()) { + function_.ShortPrint(file); + } else { + PrintF(file, "%s", CodeKindToString(compiled_code_.kind())); + } + PrintF(file, + ", opt id %d, node id %d, bailout id %d, FP to SP delta %d, " + "caller SP " V8PRIxPTR_FMT ", pc " V8PRIxPTR_FMT "]\n", + optimization_id, node_id, bailout_id_, fp_to_sp_delta_, + caller_frame_top_, PointerAuthentication::StripPAC(from_)); + if (verbose_tracing_enabled() && deopt_kind_ != DeoptimizeKind::kLazy) { + PrintF(file, " ;;; deoptimize at "); + OFStream outstr(file); + info.position.Print(outstr, compiled_code_); + PrintF(file, "\n"); + } +} + +void Deoptimizer::TraceDeoptEnd(double deopt_duration) { + DCHECK(verbose_tracing_enabled()); + PrintF(trace_scope()->file(), "[bailout end. took %0.3f ms]\n", + deopt_duration); +} + +// static +void Deoptimizer::TraceMarkForDeoptimization(Code code, const char* reason) { + if (!FLAG_trace_deopt_verbose) return; + + DisallowHeapAllocation no_gc; + Isolate* isolate = code.GetIsolate(); + Object maybe_data = code.deoptimization_data(); + if (maybe_data == ReadOnlyRoots(isolate).empty_fixed_array()) return; + + DeoptimizationData deopt_data = DeoptimizationData::cast(maybe_data); + CodeTracer::Scope scope(isolate->GetCodeTracer()); + PrintF(scope.file(), "[marking dependent code " V8PRIxPTR_FMT " ", + code.ptr()); + deopt_data.SharedFunctionInfo().ShortPrint(scope.file()); + PrintF(" (opt id %d) for deoptimization, reason: %s]\n", + deopt_data.OptimizationId().value(), reason); + { + AllowHeapAllocation yes_gc; + HandleScope scope(isolate); + PROFILE( + isolate, + CodeDependencyChangeEvent( + handle(code, isolate), + handle(SharedFunctionInfo::cast(deopt_data.SharedFunctionInfo()), + isolate), + reason)); + } +} + +// static +void Deoptimizer::TraceEvictFromOptimizedCodeCache(SharedFunctionInfo sfi, + const char* reason) { + if (!FLAG_trace_deopt_verbose) return; + + DisallowHeapAllocation no_gc; + CodeTracer::Scope scope(sfi.GetIsolate()->GetCodeTracer()); + PrintF(scope.file(), + "[evicting optimized code marked for deoptimization (%s) for ", + reason); + sfi.ShortPrint(scope.file()); + PrintF(scope.file(), "]\n"); +} + +#ifdef DEBUG +// static +void Deoptimizer::TraceFoundActivation(Isolate* isolate, JSFunction function) { + if (!FLAG_trace_deopt_verbose) return; + CodeTracer::Scope scope(isolate->GetCodeTracer()); + PrintF(scope.file(), "[deoptimizer found activation of function: "); + function.PrintName(scope.file()); + PrintF(scope.file(), " / %" V8PRIxPTR "]\n", function.ptr()); +} +#endif // DEBUG + +// static +void Deoptimizer::TraceDeoptAll(Isolate* isolate) { + if (!FLAG_trace_deopt_verbose) return; + CodeTracer::Scope scope(isolate->GetCodeTracer()); + PrintF(scope.file(), "[deoptimize all code in all contexts]\n"); +} + +// static +void Deoptimizer::TraceDeoptMarked(Isolate* isolate) { + if (!FLAG_trace_deopt_verbose) return; + CodeTracer::Scope scope(isolate->GetCodeTracer()); + PrintF(scope.file(), "[deoptimize marked code in all contexts]\n"); +} + // We rely on this function not causing a GC. It is called from generated code // without having a real stack frame in place. void Deoptimizer::DoComputeOutputFrames() { @@ -755,15 +849,10 @@ void Deoptimizer::DoComputeOutputFrames() { caller_fp_ = Memory(fp_address); caller_pc_ = Memory(fp_address + CommonFrameConstants::kCallerPCOffset); - // Sign caller_pc_ with caller_frame_top_ to be consistent with everything - // else here. - uint64_t sp = stack_fp_ + StandardFrameConstants::kCallerSPOffset; - // TODO(v8:10026): avoid replacing a signed pointer. - PointerAuthentication::ReplaceContext( - reinterpret_cast(&caller_pc_), sp, caller_frame_top_); - input_frame_context_ = Memory( fp_address + CommonFrameConstants::kContextOrFrameTypeOffset); + actual_argument_count_ = static_cast( + Memory(fp_address + StandardFrameConstants::kArgCOffset)); if (FLAG_enable_embedded_constant_pool) { caller_constant_pool_ = Memory( @@ -775,34 +864,25 @@ void Deoptimizer::DoComputeOutputFrames() { CHECK_GT(static_cast(caller_frame_top_), stack_guard->real_jslimit()); - if (trace_scope_ != nullptr) { - timer.Start(); - PrintF(trace_scope_->file(), "[bailout (kind: %s): begin ", - MessageFor(deopt_kind_, should_reuse_code())); - PrintFunctionName(); - PrintF(trace_scope_->file(), - " (opt #%d) @%d, FP to SP delta: %d, caller sp: " V8PRIxPTR_FMT - "]\n", - input_data.OptimizationId().value(), bailout_id_, fp_to_sp_delta_, - caller_frame_top_); - if (deopt_kind_ != DeoptimizeKind::kLazy) { - compiled_code_.PrintDeoptLocation( - trace_scope_->file(), " ;;; deoptimize at ", from_); - } - } - BailoutId node_id = input_data.BytecodeOffset(bailout_id_); ByteArray translations = input_data.TranslationByteArray(); unsigned translation_index = input_data.TranslationIndex(bailout_id_).value(); + if (tracing_enabled()) { + timer.Start(); + TraceDeoptBegin(input_data.OptimizationId().value(), node_id.ToInt()); + } + + FILE* trace_file = + verbose_tracing_enabled() ? trace_scope()->file() : nullptr; TranslationIterator state_iterator(translations, translation_index); translated_state_.Init( - isolate_, input_->GetFramePointerAddress(), &state_iterator, - input_data.LiteralArray(), input_->GetRegisterValues(), - trace_scope_ == nullptr ? nullptr : trace_scope_->file(), + isolate_, input_->GetFramePointerAddress(), stack_fp_, &state_iterator, + input_data.LiteralArray(), input_->GetRegisterValues(), trace_file, function_.IsHeapObject() ? function_.shared().internal_formal_parameter_count() - : 0); + : 0, + actual_argument_count_); // Do the input frame to output frame(s) translation. size_t count = translated_state_.frames().size(); @@ -875,18 +955,8 @@ void Deoptimizer::DoComputeOutputFrames() { isolate()->isolate_root()); // Print some helpful diagnostic information. - if (trace_scope_ != nullptr) { - double ms = timer.Elapsed().InMillisecondsF(); - int index = output_count_ - 1; // Index of the topmost frame. - PrintF(trace_scope_->file(), "[bailout (kind: %s): end ", - MessageFor(deopt_kind_, should_reuse_code())); - PrintFunctionName(); - PrintF(trace_scope_->file(), - " @%d => node=%d, pc=" V8PRIxPTR_FMT - " (unsigned), caller sp=" V8PRIxPTR_FMT ", took %0.3f ms]\n", - bailout_id_, node_id.ToInt(), - PointerAuthentication::StripPAC(output_[index]->GetPc()), - caller_frame_top_, ms); + if (verbose_tracing_enabled()) { + TraceDeoptEnd(timer.Elapsed().InMillisecondsF()); } // The following invariant is fairly tricky to guarantee, since the size of @@ -922,11 +992,11 @@ void Deoptimizer::DoComputeInterpretedFrame(TranslatedFrame* translated_frame, const uint32_t output_frame_size = frame_info.frame_size_in_bytes(); TranslatedFrame::iterator function_iterator = value_iterator++; - if (trace_scope_ != nullptr) { - PrintF(trace_scope_->file(), " translating interpreted frame "); + if (verbose_tracing_enabled()) { + PrintF(trace_scope()->file(), " translating interpreted frame "); std::unique_ptr name = shared.DebugName().ToCString(); - PrintF(trace_scope_->file(), "%s", name.get()); - PrintF(trace_scope_->file(), + PrintF(trace_scope()->file(), "%s", name.get()); + PrintF(trace_scope()->file(), " => bytecode_offset=%d, variable_frame_size=%d, frame_size=%d%s\n", real_bytecode_offset, frame_info.frame_size_in_bytes_without_fixed(), output_frame_size, goto_catch_handler ? " (throw)" : ""); @@ -935,7 +1005,7 @@ void Deoptimizer::DoComputeInterpretedFrame(TranslatedFrame* translated_frame, // Allocate and store the output frame description. FrameDescription* output_frame = new (output_frame_size) FrameDescription(output_frame_size, parameters_count); - FrameWriter frame_writer(this, output_frame, trace_scope_); + FrameWriter frame_writer(this, output_frame, verbose_trace_scope()); CHECK(frame_index >= 0 && frame_index < output_count_); CHECK_NULL(output_[frame_index]); @@ -953,12 +1023,19 @@ void Deoptimizer::DoComputeInterpretedFrame(TranslatedFrame* translated_frame, if (ShouldPadArguments(parameters_count)) { frame_writer.PushRawObject(roots.the_hole_value(), "padding\n"); } + // Note: parameters_count includes the receiver. + if (verbose_tracing_enabled() && is_bottommost && + actual_argument_count_ > parameters_count - 1) { + PrintF(trace_scope_->file(), + " -- %d extra argument(s) already in the stack --\n", + actual_argument_count_ - parameters_count + 1); + } frame_writer.PushStackJSArguments(value_iterator, parameters_count); DCHECK_EQ(output_frame->GetLastArgumentSlotOffset(), frame_writer.top_offset()); - if (trace_scope_ != nullptr) { - PrintF(trace_scope_->file(), " -------------------------\n"); + if (verbose_tracing_enabled()) { + PrintF(trace_scope()->file(), " -------------------------\n"); } // There are no translation commands for the caller's pc and fp, the @@ -970,9 +1047,11 @@ void Deoptimizer::DoComputeInterpretedFrame(TranslatedFrame* translated_frame, // input frame. For all subsequent output frames, it can be read from the // previous one. This frame's pc can be computed from the non-optimized // function code and AST id of the bailout. - const intptr_t caller_pc = - is_bottommost ? caller_pc_ : output_[frame_index - 1]->GetPc(); - frame_writer.PushCallerPc(caller_pc); + if (is_bottommost) { + frame_writer.PushBottommostCallerPc(caller_pc_); + } else { + frame_writer.PushApprovedCallerPc(output_[frame_index - 1]->GetPc()); + } // The caller's frame pointer for the bottommost output frame is the same // as in the input frame. For all subsequent output frames, it can be @@ -1021,6 +1100,19 @@ void Deoptimizer::DoComputeInterpretedFrame(TranslatedFrame* translated_frame, // The function was mentioned explicitly in the BEGIN_FRAME. frame_writer.PushTranslatedValue(function_iterator, "function"); + // Actual argument count. + int argc; + if (is_bottommost) { + argc = actual_argument_count_; + } else { + TranslatedFrame::Kind previous_frame_kind = + (translated_state_.frames()[frame_index - 1]).kind(); + argc = previous_frame_kind == TranslatedFrame::kArgumentsAdaptor + ? output_[frame_index - 1]->parameter_count() + : parameters_count - 1; + } + frame_writer.PushRawValue(argc, "actual argument count\n"); + // Set the bytecode array pointer. Object bytecode_array = shared.HasBreakInfo() ? shared.GetDebugInfo().DebugBytecodeArray() @@ -1033,8 +1125,8 @@ void Deoptimizer::DoComputeInterpretedFrame(TranslatedFrame* translated_frame, Smi smi_bytecode_offset = Smi::FromInt(raw_bytecode_offset); frame_writer.PushRawObject(smi_bytecode_offset, "bytecode offset\n"); - if (trace_scope_ != nullptr) { - PrintF(trace_scope_->file(), " -------------------------\n"); + if (verbose_tracing_enabled()) { + PrintF(trace_scope()->file(), " -------------------------\n"); } // Translate the rest of the interpreter registers in the frame. @@ -1124,8 +1216,17 @@ void Deoptimizer::DoComputeInterpretedFrame(TranslatedFrame* translated_frame, !goto_catch_handler ? builtins->builtin(Builtins::kInterpreterEnterBytecodeAdvance) : builtins->builtin(Builtins::kInterpreterEnterBytecodeDispatch); - output_frame->SetPc( - static_cast(dispatch_builtin.InstructionStart())); + if (is_topmost) { + // Only the pc of the topmost frame needs to be signed since it is + // authenticated at the end of GenerateDeoptimizationEntries. + const intptr_t top_most_pc = PointerAuthentication::SignAndCheckPC( + static_cast(dispatch_builtin.InstructionStart()), + frame_writer.frame()->GetTop()); + output_frame->SetPc(top_most_pc); + } else { + output_frame->SetPc( + static_cast(dispatch_builtin.InstructionStart())); + } // Update constant pool. if (FLAG_enable_embedded_constant_pool) { @@ -1155,6 +1256,64 @@ void Deoptimizer::DoComputeInterpretedFrame(TranslatedFrame* translated_frame, void Deoptimizer::DoComputeArgumentsAdaptorFrame( TranslatedFrame* translated_frame, int frame_index) { + // Arguments adaptor can not be top most, nor the bottom most frames. + CHECK(frame_index < output_count_ - 1); + CHECK_GT(frame_index, 0); + CHECK_NULL(output_[frame_index]); + +#ifdef V8_NO_ARGUMENTS_ADAPTOR + // During execution, V8 does not understand arguments adaptor frames anymore, + // so during deoptimization we only push the extra arguments (arguments with + // index greater than the formal parameter count). Therefore we call this + // TranslatedFrame the fake adaptor frame. For more info, see the design + // document shorturl.at/fKT49. + + TranslatedFrame::iterator value_iterator = translated_frame->begin(); + const int argument_count_without_receiver = translated_frame->height() - 1; + const int formal_parameter_count = + translated_frame->raw_shared_info().internal_formal_parameter_count(); + const int extra_argument_count = + argument_count_without_receiver - formal_parameter_count; + + const int output_frame_size = + std::max(0, extra_argument_count * kSystemPointerSize); + if (verbose_tracing_enabled()) { + PrintF(trace_scope_->file(), + " translating arguments adaptor => variable_size=%d\n", + output_frame_size); + } + + // Allocate and store the output frame description. + FrameDescription* output_frame = new (output_frame_size) + FrameDescription(output_frame_size, argument_count_without_receiver); + // The top address of the frame is computed from the previous frame's top and + // this frame's size. + const intptr_t top_address = + output_[frame_index - 1]->GetTop() - output_frame_size; + output_frame->SetTop(top_address); + // This is not a real frame, we take PC and FP values from the parent frame. + output_frame->SetPc(output_[frame_index - 1]->GetPc()); + output_frame->SetFp(output_[frame_index - 1]->GetFp()); + output_[frame_index] = output_frame; + + if (extra_argument_count > 0) { + FrameWriter frame_writer(this, output_frame, verbose_trace_scope()); + + ReadOnlyRoots roots(isolate()); + if (ShouldPadArguments(extra_argument_count)) { + frame_writer.PushRawObject(roots.the_hole_value(), "padding\n"); + } + + // The receiver and arguments with index below the formal parameter + // count are in the fake adaptor frame, because they are used to create the + // arguments object. We should however not push them, since the interpreter + // frame with do that. + value_iterator++; // Skip function. + value_iterator++; // Skip receiver. + for (int i = 0; i < formal_parameter_count; i++) value_iterator++; + frame_writer.PushStackJSArguments(value_iterator, extra_argument_count); + } +#else TranslatedFrame::iterator value_iterator = translated_frame->begin(); const bool is_bottommost = (0 == frame_index); @@ -1164,8 +1323,8 @@ void Deoptimizer::DoComputeArgumentsAdaptorFrame( const uint32_t output_frame_size = frame_info.frame_size_in_bytes(); TranslatedFrame::iterator function_iterator = value_iterator++; - if (trace_scope_ != nullptr) { - PrintF(trace_scope_->file(), + if (verbose_tracing_enabled()) { + PrintF(trace_scope()->file(), " translating arguments adaptor => variable_frame_size=%d, " "frame_size=%d\n", frame_info.frame_size_in_bytes_without_fixed(), output_frame_size); @@ -1174,7 +1333,7 @@ void Deoptimizer::DoComputeArgumentsAdaptorFrame( // Allocate and store the output frame description. FrameDescription* output_frame = new (output_frame_size) FrameDescription(output_frame_size, parameters_count); - FrameWriter frame_writer(this, output_frame, trace_scope_); + FrameWriter frame_writer(this, output_frame, verbose_trace_scope()); // Arguments adaptor can not be topmost. CHECK(frame_index < output_count_ - 1); @@ -1194,17 +1353,17 @@ void Deoptimizer::DoComputeArgumentsAdaptorFrame( } // Compute the incoming parameter translation. - for (int i = 0; i < parameters_count; ++i, ++value_iterator) { - frame_writer.PushTranslatedValue(value_iterator, "stack parameter"); - } + frame_writer.PushStackJSArguments(value_iterator, parameters_count); DCHECK_EQ(output_frame->GetLastArgumentSlotOffset(), frame_writer.top_offset()); // Read caller's PC from the previous frame. - const intptr_t caller_pc = - is_bottommost ? caller_pc_ : output_[frame_index - 1]->GetPc(); - frame_writer.PushCallerPc(caller_pc); + if (is_bottommost) { + frame_writer.PushBottommostCallerPc(caller_pc_); + } else { + frame_writer.PushApprovedCallerPc(output_[frame_index - 1]->GetPc()); + } // Read caller's FP from the previous frame, and set this frame's FP. const intptr_t caller_fp = @@ -1251,6 +1410,7 @@ void Deoptimizer::DoComputeArgumentsAdaptorFrame( static_cast(adaptor_trampoline.constant_pool()); output_frame->SetConstantPool(constant_pool_value); } +#endif } void Deoptimizer::DoComputeConstructStubFrame(TranslatedFrame* translated_frame, @@ -1272,8 +1432,8 @@ void Deoptimizer::DoComputeConstructStubFrame(TranslatedFrame* translated_frame, const uint32_t output_frame_size = frame_info.frame_size_in_bytes(); TranslatedFrame::iterator function_iterator = value_iterator++; - if (trace_scope_ != nullptr) { - PrintF(trace_scope_->file(), + if (verbose_tracing_enabled()) { + PrintF(trace_scope()->file(), " translating construct stub => bailout_id=%d (%s), " "variable_frame_size=%d, frame_size=%d\n", bailout_id.ToInt(), @@ -1284,7 +1444,7 @@ void Deoptimizer::DoComputeConstructStubFrame(TranslatedFrame* translated_frame, // Allocate and store the output frame description. FrameDescription* output_frame = new (output_frame_size) FrameDescription(output_frame_size, parameters_count); - FrameWriter frame_writer(this, output_frame, trace_scope_); + FrameWriter frame_writer(this, output_frame, verbose_trace_scope()); // Construct stub can not be topmost. DCHECK(frame_index > 0 && frame_index < output_count_); @@ -1315,7 +1475,7 @@ void Deoptimizer::DoComputeConstructStubFrame(TranslatedFrame* translated_frame, // Read caller's PC from the previous frame. const intptr_t caller_pc = output_[frame_index - 1]->GetPc(); - frame_writer.PushCallerPc(caller_pc); + frame_writer.PushApprovedCallerPc(caller_pc); // Read caller's FP from the previous frame, and set this frame's FP. const intptr_t caller_fp = output_[frame_index - 1]->GetFp(); @@ -1383,7 +1543,14 @@ void Deoptimizer::DoComputeConstructStubFrame(TranslatedFrame* translated_frame, ? isolate_->heap()->construct_stub_create_deopt_pc_offset().value() : isolate_->heap()->construct_stub_invoke_deopt_pc_offset().value(); intptr_t pc_value = static_cast(start + pc_offset); - output_frame->SetPc(pc_value); + if (is_topmost) { + // Only the pc of the topmost frame needs to be signed since it is + // authenticated at the end of GenerateDeoptimizationEntries. + output_frame->SetPc(PointerAuthentication::SignAndCheckPC( + pc_value, frame_writer.frame()->GetTop())); + } else { + output_frame->SetPc(pc_value); + } // Update constant pool. if (FLAG_enable_embedded_constant_pool) { @@ -1566,8 +1733,8 @@ void Deoptimizer::DoComputeBuiltinContinuation( } CHECK_EQ(BuiltinContinuationModeIsJavaScript(mode), has_argc); - if (trace_scope_ != nullptr) { - PrintF(trace_scope_->file(), + if (verbose_tracing_enabled()) { + PrintF(trace_scope()->file(), " translating BuiltinContinuation to %s," " => register_param_count=%d," " stack_param_count=%d, frame_size=%d\n", @@ -1578,7 +1745,7 @@ void Deoptimizer::DoComputeBuiltinContinuation( FrameDescription* output_frame = new (output_frame_size) FrameDescription(output_frame_size, frame_info.stack_parameter_count()); output_[frame_index] = output_frame; - FrameWriter frame_writer(this, output_frame, trace_scope_); + FrameWriter frame_writer(this, output_frame, verbose_trace_scope()); // The top address of the frame is computed from the previous frame's top and // this frame's size. @@ -1692,9 +1859,11 @@ void Deoptimizer::DoComputeBuiltinContinuation( output_frame->SetRegister(kContextRegister.code(), value); // Set caller's PC (JSFunction continuation). - const intptr_t caller_pc = - is_bottommost ? caller_pc_ : output_[frame_index - 1]->GetPc(); - frame_writer.PushCallerPc(caller_pc); + if (is_bottommost) { + frame_writer.PushBottommostCallerPc(caller_pc_); + } else { + frame_writer.PushApprovedCallerPc(output_[frame_index - 1]->GetPc()); + } // Read caller's FP from the previous frame, and set this frame's FP. const intptr_t caller_fp = @@ -1744,7 +1913,7 @@ void Deoptimizer::DoComputeBuiltinContinuation( for (int i = 0; i < allocatable_register_count; ++i) { int code = config->GetAllocatableGeneralCode(i); ScopedVector str(128); - if (trace_scope_ != nullptr) { + if (verbose_tracing_enabled()) { if (BuiltinContinuationModeIsJavaScript(mode) && code == kJavaScriptCallArgCountRegister.code()) { SNPrintF( @@ -1757,7 +1926,7 @@ void Deoptimizer::DoComputeBuiltinContinuation( } } frame_writer.PushTranslatedValue( - register_values[code], trace_scope_ != nullptr ? str.begin() : ""); + register_values[code], verbose_tracing_enabled() ? str.begin() : ""); } // Some architectures must pad the stack frame with extra stack slots @@ -1804,8 +1973,17 @@ void Deoptimizer::DoComputeBuiltinContinuation( Code continue_to_builtin = isolate()->builtins()->builtin(TrampolineForBuiltinContinuation( mode, frame_info.frame_has_result_stack_slot())); - output_frame->SetPc( - static_cast(continue_to_builtin.InstructionStart())); + if (is_topmost) { + // Only the pc of the topmost frame needs to be signed since it is + // authenticated at the end of GenerateDeoptimizationEntries. + const intptr_t top_most_pc = PointerAuthentication::SignAndCheckPC( + static_cast(continue_to_builtin.InstructionStart()), + frame_writer.frame()->GetTop()); + output_frame->SetPc(top_most_pc); + } else { + output_frame->SetPc( + static_cast(continue_to_builtin.InstructionStart())); + } Code continuation = isolate()->builtins()->builtin(Builtins::kNotifyDeoptimized); @@ -1824,13 +2002,13 @@ void Deoptimizer::MaterializeHeapObjects() { for (auto& materialization : values_to_materialize_) { Handle value = materialization.value_->GetValue(); - if (trace_scope_ != nullptr) { - PrintF(trace_scope_->file(), + if (verbose_tracing_enabled()) { + PrintF(trace_scope()->file(), "Materialization [" V8PRIxPTR_FMT "] <- " V8PRIxPTR_FMT " ; ", static_cast(materialization.output_slot_address_), value->ptr()); - value->ShortPrint(trace_scope_->file()); - PrintF(trace_scope_->file(), "\n"); + value->ShortPrint(trace_scope()->file()); + PrintF(trace_scope()->file(), "\n"); } *(reinterpret_cast(materialization.output_slot_address_)) = @@ -1840,10 +2018,14 @@ void Deoptimizer::MaterializeHeapObjects() { translated_state_.VerifyMaterializedObjects(); bool feedback_updated = translated_state_.DoUpdateFeedback(); - if (trace_scope_ != nullptr && feedback_updated) { - PrintF(trace_scope_->file(), "Feedback updated"); - compiled_code_.PrintDeoptLocation(trace_scope_->file(), - " from deoptimization at ", from_); + if (verbose_tracing_enabled() && feedback_updated) { + FILE* file = trace_scope()->file(); + Deoptimizer::DeoptInfo info = + Deoptimizer::GetDeoptInfo(compiled_code_, from_); + PrintF(file, "Feedback updated from deoptimization at "); + OFStream outstr(file); + info.position.Print(outstr, compiled_code_); + PrintF(file, ", %s\n", DeoptimizeReasonToString(info.deopt_reason)); } isolate_->materialized_object_store()->Remove( @@ -2969,9 +3151,13 @@ void TranslatedState::CreateArgumentsElementsTranslatedValues( FILE* trace_file) { TranslatedFrame& frame = frames_[frame_index]; +#ifdef V8_NO_ARGUMENTS_ADAPTOR + int arguments_length = actual_argument_count_; +#else int arguments_length; Address arguments_frame = ComputeArgumentsPosition(input_frame_pointer, &arguments_length); +#endif int length = type == CreateArgumentsType::kRestParameter ? std::max(0, arguments_length - formal_parameter_count_) @@ -3014,10 +3200,16 @@ void TranslatedState::CreateArgumentsElementsTranslatedValues( int offset = i + start_index + 1; #else int offset = argc - i - 1; +#endif +#ifdef V8_NO_ARGUMENTS_ADAPTOR + Address arguments_frame = offset > formal_parameter_count_ + ? stack_frame_pointer_ + : input_frame_pointer; #endif Address argument_slot = arguments_frame + CommonFrameConstants::kFixedFrameSizeAboveFp + offset * kSystemPointerSize; + frame.Add(TranslatedValue::NewTagged(this, *FullObjectSlot(argument_slot))); } } @@ -3074,8 +3266,12 @@ int TranslatedState::CreateNextTranslatedValue( } case Translation::ARGUMENTS_LENGTH: { +#ifdef V8_NO_ARGUMENTS_ADAPTOR + int arguments_length = actual_argument_count_; +#else int arguments_length; ComputeArgumentsPosition(fp, &arguments_length); +#endif if (trace_file != nullptr) { PrintF(trace_file, "arguments length field (length = %d)", arguments_length); @@ -3360,18 +3556,28 @@ TranslatedState::TranslatedState(const JavaScriptFrame* frame) { DCHECK(!data.is_null() && deopt_index != Safepoint::kNoDeoptimizationIndex); TranslationIterator it(data.TranslationByteArray(), data.TranslationIndex(deopt_index).value()); - Init(frame->isolate(), frame->fp(), &it, data.LiteralArray(), +#ifdef V8_NO_ARGUMENT_ADAPTOR + int actual_argc = frame->GetActualArgumentCount(); +#else + int actual_argc = 0; +#endif + Init(frame->isolate(), frame->fp(), kNullAddress, &it, data.LiteralArray(), nullptr /* registers */, nullptr /* trace file */, - frame->function().shared().internal_formal_parameter_count()); + frame->function().shared().internal_formal_parameter_count(), + actual_argc); } void TranslatedState::Init(Isolate* isolate, Address input_frame_pointer, + Address stack_frame_pointer, TranslationIterator* iterator, FixedArray literal_array, RegisterValues* registers, - FILE* trace_file, int formal_parameter_count) { + FILE* trace_file, int formal_parameter_count, + int actual_argument_count) { DCHECK(frames_.empty()); + stack_frame_pointer_ = stack_frame_pointer; formal_parameter_count_ = formal_parameter_count; + actual_argument_count_ = actual_argument_count; isolate_ = isolate; // Read out the 'header' translation. diff --git a/deps/v8/src/deoptimizer/deoptimizer.h b/deps/v8/src/deoptimizer/deoptimizer.h index 9bca74c7b2d682..152e5e510e9bb0 100644 --- a/deps/v8/src/deoptimizer/deoptimizer.h +++ b/deps/v8/src/deoptimizer/deoptimizer.h @@ -12,11 +12,13 @@ #include "src/codegen/label.h" #include "src/codegen/register-arch.h" #include "src/codegen/source-position.h" +#include "src/common/assert-scope.h" #include "src/common/globals.h" #include "src/deoptimizer/deoptimize-reason.h" #include "src/diagnostics/code-tracer.h" #include "src/execution/frame-constants.h" #include "src/execution/isolate.h" +#include "src/heap/heap.h" #include "src/objects/feedback-vector.h" #include "src/objects/js-function.h" #include "src/objects/shared-function-info.h" @@ -35,6 +37,7 @@ class TranslatedFrame; class TranslatedState; class RegisterValues; class MacroAssembler; +class StrongRootsEntry; enum class BuiltinContinuationMode; @@ -339,8 +342,9 @@ class TranslatedState { Isolate* isolate() { return isolate_; } void Init(Isolate* isolate, Address input_frame_pointer, - TranslationIterator* iterator, FixedArray literal_array, - RegisterValues* registers, FILE* trace_file, int parameter_count); + Address stack_frame_pointer, TranslationIterator* iterator, + FixedArray literal_array, RegisterValues* registers, + FILE* trace_file, int parameter_count, int actual_argument_count); void VerifyMaterializedObjects(); bool DoUpdateFeedback(); @@ -408,6 +412,7 @@ class TranslatedState { Isolate* isolate_ = nullptr; Address stack_frame_pointer_ = kNullAddress; int formal_parameter_count_; + int actual_argument_count_; struct ObjectPosition { int frame_index_; @@ -482,6 +487,13 @@ class Deoptimizer : public Malloced { // refer to that code. static void DeoptimizeMarkedCode(Isolate* isolate); + // Check the given address against a list of allowed addresses, to prevent a + // potential attacker from using the frame creation process in the + // deoptimizer, in particular the signing process, to gain control over the + // program. + // When building mksnapshot, always return false. + static bool IsValidReturnAddress(Address address); + ~Deoptimizer(); void MaterializeHeapObjects(); @@ -528,6 +540,11 @@ class Deoptimizer : public Malloced { static const int kNonLazyDeoptExitSize; static const int kLazyDeoptExitSize; + // Tracing. + static void TraceMarkForDeoptimization(Code code, const char* reason); + static void TraceEvictFromOptimizedCodeCache(SharedFunctionInfo sfi, + const char* reason); + private: friend class FrameWriter; void QueueValueForMaterialization(Address output_address, Object obj, @@ -536,7 +553,6 @@ class Deoptimizer : public Malloced { Deoptimizer(Isolate* isolate, JSFunction function, DeoptimizeKind kind, unsigned bailout_id, Address from, int fp_to_sp_delta); Code FindOptimizedCode(); - void PrintFunctionName(); void DeleteFrameDescriptions(); static bool IsDeoptimizationEntry(Isolate* isolate, Address addr, @@ -574,6 +590,23 @@ class Deoptimizer : public Malloced { // searching all code objects). Code FindDeoptimizingCode(Address addr); + // Tracing. + bool tracing_enabled() const { return static_cast(trace_scope_); } + bool verbose_tracing_enabled() const { + return FLAG_trace_deopt_verbose && trace_scope_; + } + CodeTracer::Scope* trace_scope() const { return trace_scope_.get(); } + CodeTracer::Scope* verbose_trace_scope() const { + return FLAG_trace_deopt_verbose ? trace_scope() : nullptr; + } + void TraceDeoptBegin(int optimization_id, int node_id); + void TraceDeoptEnd(double deopt_duration); +#ifdef DEBUG + static void TraceFoundActivation(Isolate* isolate, JSFunction function); +#endif + static void TraceDeoptAll(Isolate* isolate); + static void TraceDeoptMarked(Isolate* isolate); + Isolate* isolate_; JSFunction function_; Code compiled_code_; @@ -601,6 +634,9 @@ class Deoptimizer : public Malloced { intptr_t caller_constant_pool_; intptr_t input_frame_context_; + // The argument count of the bottom most frame. + int actual_argument_count_; + // Key for lookup of previously materialized objects intptr_t stack_fp_; @@ -612,10 +648,10 @@ class Deoptimizer : public Malloced { std::vector values_to_materialize_; #ifdef DEBUG - DisallowHeapAllocation* disallow_heap_allocation_; + DisallowGarbageCollection* disallow_garbage_collection_; #endif // DEBUG - CodeTracer::Scope* trace_scope_; + std::unique_ptr trace_scope_; static const int table_entry_size_; @@ -814,6 +850,7 @@ class DeoptimizerData { void set_deopt_entry_code(DeoptimizeKind kind, Code code); Deoptimizer* current_; + StrongRootsEntry* strong_roots_entry_; friend class Deoptimizer; diff --git a/deps/v8/src/diagnostics/basic-block-profiler.cc b/deps/v8/src/diagnostics/basic-block-profiler.cc index ddce03880e89cf..95e2cb8dae6d1a 100644 --- a/deps/v8/src/diagnostics/basic-block-profiler.cc +++ b/deps/v8/src/diagnostics/basic-block-profiler.cc @@ -10,7 +10,7 @@ #include "src/base/lazy-instance.h" #include "src/heap/heap-inl.h" -#include "torque-generated/exported-class-definitions-tq-inl.h" +#include "torque-generated/exported-class-definitions-inl.h" namespace v8 { namespace internal { diff --git a/deps/v8/src/diagnostics/basic-block-profiler.h b/deps/v8/src/diagnostics/basic-block-profiler.h index b0bf3543d99b8c..41d0e65ccb17a4 100644 --- a/deps/v8/src/diagnostics/basic-block-profiler.h +++ b/deps/v8/src/diagnostics/basic-block-profiler.h @@ -14,7 +14,7 @@ #include "src/base/macros.h" #include "src/base/platform/mutex.h" #include "src/common/globals.h" -#include "torque-generated/exported-class-definitions-tq.h" +#include "torque-generated/exported-class-definitions.h" namespace v8 { namespace internal { diff --git a/deps/v8/src/diagnostics/ia32/disasm-ia32.cc b/deps/v8/src/diagnostics/ia32/disasm-ia32.cc index 608b3fac82ca40..80ab5663aa72ff 100644 --- a/deps/v8/src/diagnostics/ia32/disasm-ia32.cc +++ b/deps/v8/src/diagnostics/ia32/disasm-ia32.cc @@ -1074,6 +1074,10 @@ int DisassemblerIA32::AVXInstruction(byte* data) { int mod, regop, rm, vvvv = vex_vreg(); get_modrm(*current, &mod, ®op, &rm); switch (opcode) { + case 0x10: + AppendToBuffer("vmovups %s,", NameOfXMMRegister(regop)); + current += PrintRightXMMOperand(current); + break; case 0x28: AppendToBuffer("vmovaps %s,", NameOfXMMRegister(regop)); current += PrintRightXMMOperand(current); diff --git a/deps/v8/src/diagnostics/objects-debug.cc b/deps/v8/src/diagnostics/objects-debug.cc index 054b9dec175fb2..83a1ac3a9f4a3b 100644 --- a/deps/v8/src/diagnostics/objects-debug.cc +++ b/deps/v8/src/diagnostics/objects-debug.cc @@ -71,9 +71,9 @@ #include "src/regexp/regexp.h" #include "src/utils/ostreams.h" #include "src/wasm/wasm-objects-inl.h" -#include "torque-generated/class-verifiers-tq.h" -#include "torque-generated/exported-class-definitions-tq-inl.h" -#include "torque-generated/internal-class-definitions-tq-inl.h" +#include "torque-generated/class-verifiers.h" +#include "torque-generated/exported-class-definitions-inl.h" +#include "torque-generated/internal-class-definitions-inl.h" namespace v8 { namespace internal { @@ -288,17 +288,19 @@ void BytecodeArray::BytecodeArrayVerify(Isolate* isolate) { // - Jumps must go to new instructions starts. // - No Illegal bytecodes. // - No consecutive sequences of prefix Wide / ExtraWide. - CHECK(IsBytecodeArray()); - CHECK(constant_pool().IsFixedArray()); - VerifyHeapPointer(isolate, constant_pool()); - CHECK(source_position_table().IsUndefined() || - source_position_table().IsException() || - source_position_table().IsByteArray()); - CHECK(handler_table().IsByteArray()); + CHECK(IsBytecodeArray(isolate)); + CHECK(constant_pool(isolate).IsFixedArray(isolate)); + VerifyHeapPointer(isolate, constant_pool(isolate)); + CHECK(synchronized_source_position_table(isolate).IsUndefined(isolate) || + synchronized_source_position_table(isolate).IsException(isolate) || + synchronized_source_position_table(isolate).IsByteArray(isolate)); + CHECK(handler_table(isolate).IsByteArray(isolate)); + for (int i = 0; i < constant_pool(isolate).length(); ++i) { + // No ThinStrings in the constant pool. + CHECK(!constant_pool(isolate).get(isolate, i).IsThinString(isolate)); + } } -USE_TORQUE_VERIFIER(FeedbackVector) - USE_TORQUE_VERIFIER(JSReceiver) bool JSObject::ElementsAreSafeToExamine(const Isolate* isolate) const { @@ -703,12 +705,10 @@ void JSArgumentsObject::JSArgumentsObjectVerify(Isolate* isolate) { void JSAsyncFunctionObject::JSAsyncFunctionObjectVerify(Isolate* isolate) { TorqueGeneratedClassVerifiers::JSAsyncFunctionObjectVerify(*this, isolate); - promise().HeapObjectVerify(isolate); } void JSAsyncGeneratorObject::JSAsyncGeneratorObjectVerify(Isolate* isolate) { TorqueGeneratedClassVerifiers::JSAsyncGeneratorObjectVerify(*this, isolate); - queue().HeapObjectVerify(isolate); } void JSDate::JSDateVerify(Isolate* isolate) { @@ -1225,31 +1225,29 @@ void JSRegExp::JSRegExpVerify(Isolate* isolate) { Object latin1_code = arr.get(JSRegExp::kIrregexpLatin1CodeIndex); Object uc16_code = arr.get(JSRegExp::kIrregexpUC16CodeIndex); - Object experimental_pattern = - arr.get(JSRegExp::kExperimentalPatternIndex); - if (latin1_code.IsCode()) { - // `this` should be a compiled regexp. - CHECK(latin1_code.IsCode()); - CHECK_EQ(Code::cast(latin1_code).builtin_index(), - Builtins::kRegExpExperimentalTrampoline); + Object latin1_bytecode = arr.get(JSRegExp::kIrregexpLatin1BytecodeIndex); + Object uc16_bytecode = arr.get(JSRegExp::kIrregexpUC16BytecodeIndex); - CHECK(uc16_code.IsCode()); - CHECK_EQ(Code::cast(uc16_code).builtin_index(), + bool is_compiled = latin1_code.IsCode(); + if (is_compiled) { + CHECK_EQ(Code::cast(latin1_code).builtin_index(), Builtins::kRegExpExperimentalTrampoline); + CHECK_EQ(uc16_code, latin1_code); - CHECK(experimental_pattern.IsString()); + CHECK(latin1_bytecode.IsByteArray()); + CHECK_EQ(uc16_bytecode, latin1_bytecode); } else { CHECK_EQ(latin1_code, uninitialized); CHECK_EQ(uc16_code, uninitialized); - CHECK_EQ(experimental_pattern, uninitialized); + + CHECK_EQ(latin1_bytecode, uninitialized); + CHECK_EQ(uc16_bytecode, uninitialized); } CHECK_EQ(arr.get(JSRegExp::kIrregexpMaxRegisterCountIndex), uninitialized); - // TODO(mbid,v8:10765): Once the EXPERIMENTAL regexps support captures, - // the capture count should be allowed to be a Smi >= 0. - CHECK_EQ(arr.get(JSRegExp::kIrregexpCaptureCountIndex), Smi::FromInt(0)); - CHECK_EQ(arr.get(JSRegExp::kIrregexpCaptureNameMapIndex), uninitialized); + CHECK(arr.get(JSRegExp::kIrregexpCaptureCountIndex).IsSmi()); + CHECK_GE(Smi::ToInt(arr.get(JSRegExp::kIrregexpCaptureCountIndex)), 0); CHECK_EQ(arr.get(JSRegExp::kIrregexpTicksUntilTierUpIndex), uninitialized); CHECK_EQ(arr.get(JSRegExp::kIrregexpBacktrackLimit), uninitialized); @@ -1286,6 +1284,7 @@ void JSRegExp::JSRegExpVerify(Isolate* isolate) { CHECK_IMPLIES(uc16_data.IsSmi(), uc16_bytecode.IsSmi()); CHECK(arr.get(JSRegExp::kIrregexpCaptureCountIndex).IsSmi()); + CHECK_GE(Smi::ToInt(arr.get(JSRegExp::kIrregexpCaptureCountIndex)), 0); CHECK(arr.get(JSRegExp::kIrregexpMaxRegisterCountIndex).IsSmi()); CHECK(arr.get(JSRegExp::kIrregexpTicksUntilTierUpIndex).IsSmi()); CHECK(arr.get(JSRegExp::kIrregexpBacktrackLimit).IsSmi()); @@ -1344,7 +1343,6 @@ void AsyncGeneratorRequest::AsyncGeneratorRequestVerify(Isolate* isolate) { TorqueGeneratedClassVerifiers::AsyncGeneratorRequestVerify(*this, isolate); CHECK_GE(resume_mode(), JSGeneratorObject::kNext); CHECK_LE(resume_mode(), JSGeneratorObject::kThrow); - next().ObjectVerify(isolate); } void BigIntBase::BigIntBaseVerify(Isolate* isolate) { @@ -1385,12 +1383,19 @@ void SourceTextModule::SourceTextModuleVerify(Isolate* isolate) { } else if (status() == kEvaluating || status() == kEvaluated) { CHECK(code().IsJSGeneratorObject()); } else { - CHECK((status() == kInstantiated && code().IsJSGeneratorObject()) || - (status() == kInstantiating && code().IsJSFunction()) || - (status() == kPreInstantiating && code().IsSharedFunctionInfo()) || - (status() == kUninstantiated && code().IsSharedFunctionInfo())); - CHECK(top_level_capability().IsUndefined() && !AsyncParentModuleCount() && - !pending_async_dependencies() && !async_evaluating()); + if (status() == kInstantiated) { + CHECK(code().IsJSGeneratorObject()); + } else if (status() == kInstantiating) { + CHECK(code().IsJSFunction()); + } else if (status() == kPreInstantiating) { + CHECK(code().IsSharedFunctionInfo()); + } else if (status() == kUninstantiated) { + CHECK(code().IsSharedFunctionInfo()); + } + CHECK(top_level_capability().IsUndefined()); + CHECK(!AsyncParentModuleCount()); + CHECK(!pending_async_dependencies()); + CHECK(!async_evaluating()); } CHECK_EQ(requested_modules().length(), info().module_requests().length()); @@ -1460,6 +1465,10 @@ void ObjectBoilerplateDescription::ObjectBoilerplateDescriptionVerify( CHECK_GE(this->length(), ObjectBoilerplateDescription::kDescriptionStartIndex); this->FixedArrayVerify(isolate); + for (int i = 0; i < length(); ++i) { + // No ThinStrings in the boilerplate. + CHECK(!get(isolate, i).IsThinString(isolate)); + } } USE_TORQUE_VERIFIER(AsmWasmData) @@ -1702,12 +1711,13 @@ bool DescriptorArray::IsSortedNoDuplicates() { uint32_t current = 0; for (int i = 0; i < number_of_descriptors(); i++) { Name key = GetSortedKey(i); + CHECK(key.HasHashCode()); if (key == current_key) { Print(); return false; } current_key = key; - uint32_t hash = GetSortedKey(i).Hash(); + uint32_t hash = key.hash(); if (hash < current) { Print(); return false; @@ -1725,7 +1735,8 @@ bool TransitionArray::IsSortedNoDuplicates() { for (int i = 0; i < number_of_transitions(); i++) { Name key = GetSortedKey(i); - uint32_t hash = key.Hash(); + CHECK(key.HasHashCode()); + uint32_t hash = key.hash(); PropertyKind kind = kData; PropertyAttributes attributes = NONE; if (!TransitionsAccessor::IsSpecialTransition(key.GetReadOnlyRoots(), diff --git a/deps/v8/src/diagnostics/objects-printer.cc b/deps/v8/src/diagnostics/objects-printer.cc index db14898c1346be..9afe8e94455e6d 100644 --- a/deps/v8/src/diagnostics/objects-printer.cc +++ b/deps/v8/src/diagnostics/objects-printer.cc @@ -69,9 +69,9 @@ #include "src/wasm/wasm-code-manager.h" #include "src/wasm/wasm-engine.h" #include "src/wasm/wasm-objects-inl.h" -#include "torque-generated/class-definitions-tq-inl.h" -#include "torque-generated/exported-class-definitions-tq-inl.h" -#include "torque-generated/internal-class-definitions-tq-inl.h" +#include "torque-generated/class-definitions-inl.h" +#include "torque-generated/exported-class-definitions-inl.h" +#include "torque-generated/internal-class-definitions-inl.h" namespace v8 { namespace internal { @@ -874,7 +874,8 @@ void FeedbackCell::FeedbackCellPrint(std::ostream& os) { // NOLINT } else { os << "\n - Invalid FeedbackCell map"; } - os << " - value: " << Brief(value()); + os << "\n - value: " << Brief(value()); + os << "\n - interrupt_budget: " << interrupt_budget(); os << "\n"; } @@ -950,8 +951,9 @@ void FeedbackVector::FeedbackVectorPrint(std::ostream& os) { // NOLINT int entry_size = iter.entry_size(); if (entry_size > 0) os << " {"; for (int i = 0; i < entry_size; i++) { - int index = GetIndex(slot) + i; - os << "\n [" << index << "]: " << Brief(get(index)); + FeedbackSlot slot_with_offset = slot.WithOffset(i); + os << "\n [" << slot_with_offset.ToInt() + << "]: " << Brief(Get(slot_with_offset)); } if (entry_size > 0) os << "\n }"; } @@ -2205,7 +2207,6 @@ void ScopeInfo::ScopeInfoPrint(std::ostream& os) { // NOLINT void StackTraceFrame::StackTraceFramePrint(std::ostream& os) { // NOLINT PrintHeader(os, "StackTraceFrame"); os << "\n - frame_index: " << frame_index(); - os << "\n - id: " << id(); os << "\n - frame_info: " << Brief(frame_info()); os << "\n"; } diff --git a/deps/v8/src/diagnostics/unwinder.cc b/deps/v8/src/diagnostics/unwinder.cc index c08fe20330c807..c4a559c9d9b344 100644 --- a/deps/v8/src/diagnostics/unwinder.cc +++ b/deps/v8/src/diagnostics/unwinder.cc @@ -46,21 +46,6 @@ bool PCIsInCodePages(size_t code_pages_length, const MemoryRange* code_pages, return it->start <= pc && pc < CalculateEnd(it->start, it->length_in_bytes); } -bool IsInJSEntryRange(const UnwindState& unwind_state, void* pc) { - return PCIsInCodeRange(unwind_state.js_entry_stub.code, pc) || - PCIsInCodeRange(unwind_state.js_construct_entry_stub.code, pc) || - PCIsInCodeRange(unwind_state.js_run_microtasks_entry_stub.code, pc); -} - -bool IsInUnsafeJSEntryRange(const UnwindState& unwind_state, void* pc) { - return IsInJSEntryRange(unwind_state, pc); - - // TODO(petermarshall): We can be more precise by checking whether we are - // in JSEntry but after frame setup and before frame teardown, in which case - // we are safe to unwind the stack. For now, we bail out if the PC is anywhere - // within JSEntry. -} - bool IsInJSEntryRange(const JSEntryStubs& entry_stubs, void* pc) { return PCIsInCodeRange(entry_stubs.js_entry_stub.code, pc) || PCIsInCodeRange(entry_stubs.js_construct_entry_stub.code, pc) || @@ -80,23 +65,10 @@ i::Address Load(i::Address address) { return *reinterpret_cast(address); } -void* GetReturnAddressFromFP(void* fp, void* pc, - const v8::UnwindState& unwind_state) { - int caller_pc_offset = i::CommonFrameConstants::kCallerPCOffset; -#ifdef V8_TARGET_ARCH_ARM64 - if (IsInJSEntryRange(unwind_state, pc)) { - caller_pc_offset = i::EntryFrameConstants::kDirectCallerPCOffset; - } -#endif - i::Address ret_addr = - Load(reinterpret_cast(fp) + caller_pc_offset); - return reinterpret_cast(i::PointerAuthentication::StripPAC(ret_addr)); -} - void* GetReturnAddressFromFP(void* fp, void* pc, const JSEntryStubs& entry_stubs) { int caller_pc_offset = i::CommonFrameConstants::kCallerPCOffset; -#ifdef V8_TARGET_ARCH_ARM64 +#if V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_ARM if (IsInJSEntryRange(entry_stubs, pc)) { caller_pc_offset = i::EntryFrameConstants::kDirectCallerPCOffset; } @@ -106,21 +78,9 @@ void* GetReturnAddressFromFP(void* fp, void* pc, return reinterpret_cast(i::PointerAuthentication::StripPAC(ret_addr)); } -void* GetCallerFPFromFP(void* fp, void* pc, - const v8::UnwindState& unwind_state) { - int caller_fp_offset = i::CommonFrameConstants::kCallerFPOffset; -#ifdef V8_TARGET_ARCH_ARM64 - if (IsInJSEntryRange(unwind_state, pc)) { - caller_fp_offset = i::EntryFrameConstants::kDirectCallerFPOffset; - } -#endif - return reinterpret_cast( - Load(reinterpret_cast(fp) + caller_fp_offset)); -} - void* GetCallerFPFromFP(void* fp, void* pc, const JSEntryStubs& entry_stubs) { int caller_fp_offset = i::CommonFrameConstants::kCallerFPOffset; -#ifdef V8_TARGET_ARCH_ARM64 +#if V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_ARM if (IsInJSEntryRange(entry_stubs, pc)) { caller_fp_offset = i::EntryFrameConstants::kDirectCallerFPOffset; } @@ -129,21 +89,9 @@ void* GetCallerFPFromFP(void* fp, void* pc, const JSEntryStubs& entry_stubs) { Load(reinterpret_cast(fp) + caller_fp_offset)); } -void* GetCallerSPFromFP(void* fp, void* pc, - const v8::UnwindState& unwind_state) { - int caller_sp_offset = i::CommonFrameConstants::kCallerSPOffset; -#ifdef V8_TARGET_ARCH_ARM64 - if (IsInJSEntryRange(unwind_state, pc)) { - caller_sp_offset = i::EntryFrameConstants::kDirectCallerSPOffset; - } -#endif - return reinterpret_cast(reinterpret_cast(fp) + - caller_sp_offset); -} - void* GetCallerSPFromFP(void* fp, void* pc, const JSEntryStubs& entry_stubs) { int caller_sp_offset = i::CommonFrameConstants::kCallerSPOffset; -#ifdef V8_TARGET_ARCH_ARM64 +#if V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_ARM if (IsInJSEntryRange(entry_stubs, pc)) { caller_sp_offset = i::EntryFrameConstants::kDirectCallerSPOffset; } @@ -159,46 +107,6 @@ bool AddressIsInStack(const void* address, const void* stack_base, } // namespace -bool Unwinder::TryUnwindV8Frames(const UnwindState& unwind_state, - RegisterState* register_state, - const void* stack_base) { - const void* stack_top = register_state->sp; - - void* pc = register_state->pc; - if (PCIsInV8(unwind_state, pc) && !IsInUnsafeJSEntryRange(unwind_state, pc)) { - void* current_fp = register_state->fp; - if (!AddressIsInStack(current_fp, stack_base, stack_top)) return false; - - // Peek at the return address that the caller pushed. If it's in V8, then we - // assume the caller frame is a JS frame and continue to unwind. - void* next_pc = GetReturnAddressFromFP(current_fp, pc, unwind_state); - while (PCIsInV8(unwind_state, next_pc)) { - current_fp = GetCallerFPFromFP(current_fp, pc, unwind_state); - if (!AddressIsInStack(current_fp, stack_base, stack_top)) return false; - pc = next_pc; - next_pc = GetReturnAddressFromFP(current_fp, pc, unwind_state); - } - - void* final_sp = GetCallerSPFromFP(current_fp, pc, unwind_state); - if (!AddressIsInStack(final_sp, stack_base, stack_top)) return false; - register_state->sp = final_sp; - - // We don't check that the final FP value is within the stack bounds because - // this is just the rbp value that JSEntryStub pushed. On platforms like - // Win64 this is not used as a dedicated FP register, and could contain - // anything. - void* final_fp = GetCallerFPFromFP(current_fp, pc, unwind_state); - register_state->fp = final_fp; - - register_state->pc = next_pc; - - // Link register no longer valid after unwinding. - register_state->lr = nullptr; - return true; - } - return false; -} - bool Unwinder::TryUnwindV8Frames(const JSEntryStubs& entry_stubs, size_t code_pages_length, const MemoryRange* code_pages, @@ -242,11 +150,6 @@ bool Unwinder::TryUnwindV8Frames(const JSEntryStubs& entry_stubs, return false; } -bool Unwinder::PCIsInV8(const UnwindState& unwind_state, void* pc) { - return pc && (PCIsInCodeRange(unwind_state.code_range, pc) || - PCIsInCodeRange(unwind_state.embedded_code_range, pc)); -} - bool Unwinder::PCIsInV8(size_t code_pages_length, const MemoryRange* code_pages, void* pc) { return pc && PCIsInCodePages(code_pages_length, code_pages, pc); diff --git a/deps/v8/src/diagnostics/unwinding-info-win64.cc b/deps/v8/src/diagnostics/unwinding-info-win64.cc index c39adcf7108289..f3b9a753aff231 100644 --- a/deps/v8/src/diagnostics/unwinding-info-win64.cc +++ b/deps/v8/src/diagnostics/unwinding-info-win64.cc @@ -16,37 +16,6 @@ #error "Unsupported OS" #endif // V8_OS_WIN_X64 -// Forward declaration to keep this independent of Win8 -NTSYSAPI -DWORD -NTAPI -RtlAddGrowableFunctionTable( - _Out_ PVOID* DynamicTable, - _In_reads_(MaximumEntryCount) PRUNTIME_FUNCTION FunctionTable, - _In_ DWORD EntryCount, - _In_ DWORD MaximumEntryCount, - _In_ ULONG_PTR RangeBase, - _In_ ULONG_PTR RangeEnd - ); - - -NTSYSAPI -void -NTAPI -RtlGrowFunctionTable( - _Inout_ PVOID DynamicTable, - _In_ DWORD NewEntryCount - ); - - -NTSYSAPI -void -NTAPI -RtlDeleteGrowableFunctionTable( - _In_ PVOID DynamicTable - ); - - namespace v8 { namespace internal { namespace win64_unwindinfo { diff --git a/deps/v8/src/execution/arm/frame-constants-arm.h b/deps/v8/src/execution/arm/frame-constants-arm.h index cd9c4527b34011..e8bee055d26516 100644 --- a/deps/v8/src/execution/arm/frame-constants-arm.h +++ b/deps/v8/src/execution/arm/frame-constants-arm.h @@ -7,21 +7,53 @@ #include "src/base/bits.h" #include "src/base/macros.h" +#include "src/codegen/arm/register-arm.h" #include "src/execution/frame-constants.h" namespace v8 { namespace internal { +// The layout of an EntryFrame is as follows: +// TOP OF THE STACK LOWEST ADDRESS +// +---------------------+----------------------- +// 0 | bad frame pointer | <-- frame ptr +// | (0xFFF.. FF) | +// |- - - - - - - - - - -| +// 1..2 | saved register d8 | +// ... | ... | +// 15..16 | saved register d15 | +// |- - - - - - - - - - -| +// 17 | saved register r4 | +// ... | ... | +// 23 | saved register r10 | +// |- - - - - - - - - - -| +// 24 | saved fp (r11) | +// |- - - - - - - - - - -| +// 25 | saved lr (r14) | +// -----+---------------------+----------------------- +// BOTTOM OF THE STACK HIGHEST ADDRESS class EntryFrameConstants : public AllStatic { public: // This is the offset to where JSEntry pushes the current value of // Isolate::c_entry_fp onto the stack. - static constexpr int kCallerFPOffset = - -(StandardFrameConstants::kFixedFrameSizeFromFp + kPointerSize); + static constexpr int kCallerFPOffset = -3 * kSystemPointerSize; // Stack offsets for arguments passed to JSEntry. static constexpr int kArgcOffset = +0 * kSystemPointerSize; static constexpr int kArgvOffset = +1 * kSystemPointerSize; + + // These offsets refer to the immediate caller (i.e a native frame). + static constexpr int kDirectCallerFPOffset = + /* bad frame pointer (-1) */ + kPointerSize + + /* d8...d15 */ + kNumDoubleCalleeSaved * kDoubleSize + + /* r4...r10 (i.e callee saved without fp) */ + (kNumCalleeSaved - 1) * kPointerSize; + static constexpr int kDirectCallerPCOffset = + kDirectCallerFPOffset + 1 * kSystemPointerSize; + static constexpr int kDirectCallerSPOffset = + kDirectCallerPCOffset + 1 * kSystemPointerSize; }; class WasmCompileLazyFrameConstants : public TypedFrameConstants { diff --git a/deps/v8/src/execution/arm/simulator-arm.cc b/deps/v8/src/execution/arm/simulator-arm.cc index d0031d557a511c..3c6368d8f5c837 100644 --- a/deps/v8/src/execution/arm/simulator-arm.cc +++ b/deps/v8/src/execution/arm/simulator-arm.cc @@ -248,7 +248,7 @@ void ArmDebugger::Debug() { PrintF("\n"); } } - for (int i = 0; i < DwVfpRegister::NumRegisters(); i++) { + for (int i = 0; i < DwVfpRegister::SupportedRegisterCount(); i++) { dvalue = GetVFPDoubleRegisterValue(i); uint64_t as_words = bit_cast(dvalue); PrintF("%3s: %f 0x%08x %08x\n", VFPRegisters::Name(i, true), @@ -753,22 +753,22 @@ void Simulator::set_dw_register(int dreg, const int* dbl) { } void Simulator::get_d_register(int dreg, uint64_t* value) { - DCHECK((dreg >= 0) && (dreg < DwVfpRegister::NumRegisters())); + DCHECK((dreg >= 0) && (dreg < DwVfpRegister::SupportedRegisterCount())); memcpy(value, vfp_registers_ + dreg * 2, sizeof(*value)); } void Simulator::set_d_register(int dreg, const uint64_t* value) { - DCHECK((dreg >= 0) && (dreg < DwVfpRegister::NumRegisters())); + DCHECK((dreg >= 0) && (dreg < DwVfpRegister::SupportedRegisterCount())); memcpy(vfp_registers_ + dreg * 2, value, sizeof(*value)); } void Simulator::get_d_register(int dreg, uint32_t* value) { - DCHECK((dreg >= 0) && (dreg < DwVfpRegister::NumRegisters())); + DCHECK((dreg >= 0) && (dreg < DwVfpRegister::SupportedRegisterCount())); memcpy(value, vfp_registers_ + dreg * 2, sizeof(*value) * 2); } void Simulator::set_d_register(int dreg, const uint32_t* value) { - DCHECK((dreg >= 0) && (dreg < DwVfpRegister::NumRegisters())); + DCHECK((dreg >= 0) && (dreg < DwVfpRegister::SupportedRegisterCount())); memcpy(vfp_registers_ + dreg * 2, value, sizeof(*value) * 2); } @@ -818,7 +818,8 @@ void Simulator::SetVFPRegister(int reg_index, const InputType& value) { DCHECK_EQ(sizeof(InputType), bytes); DCHECK_GE(reg_index, 0); if (register_size == 1) DCHECK(reg_index < num_s_registers); - if (register_size == 2) DCHECK(reg_index < DwVfpRegister::NumRegisters()); + if (register_size == 2) + DCHECK(reg_index < DwVfpRegister::SupportedRegisterCount()); memcpy(&vfp_registers_[reg_index * register_size], &value, bytes); } @@ -829,7 +830,8 @@ ReturnType Simulator::GetFromVFPRegister(int reg_index) { DCHECK_EQ(sizeof(ReturnType), bytes); DCHECK_GE(reg_index, 0); if (register_size == 1) DCHECK(reg_index < num_s_registers); - if (register_size == 2) DCHECK(reg_index < DwVfpRegister::NumRegisters()); + if (register_size == 2) + DCHECK(reg_index < DwVfpRegister::SupportedRegisterCount()); ReturnType value; memcpy(&value, &vfp_registers_[register_size * reg_index], bytes); @@ -4610,9 +4612,13 @@ void Simulator::DecodeSpecialCondition(Instruction* instr) { } else { // vmin/vmax.f32 Qd, Qm, Qn. bool min = instr->Bit(21) == 1; + bool saved = FPSCR_default_NaN_mode_; + FPSCR_default_NaN_mode_ = true; for (int i = 0; i < 4; i++) { - src1[i] = MinMax(src1[i], src2[i], min); + // vmin returns default NaN if any input is NaN. + src1[i] = canonicalizeNaN(MinMax(src1[i], src2[i], min)); } + FPSCR_default_NaN_mode_ = saved; } set_neon_register(Vd, src1); } else { diff --git a/deps/v8/src/execution/arm64/frame-constants-arm64.cc b/deps/v8/src/execution/arm64/frame-constants-arm64.cc index 607081a56206d4..94d12f058f07c6 100644 --- a/deps/v8/src/execution/arm64/frame-constants-arm64.cc +++ b/deps/v8/src/execution/arm64/frame-constants-arm64.cc @@ -20,8 +20,11 @@ Register JavaScriptFrame::context_register() { return cp; } Register JavaScriptFrame::constant_pool_pointer_register() { UNREACHABLE(); } int InterpreterFrameConstants::RegisterStackSlotCount(int register_count) { - // Round up to a multiple of two, to make the frame a multiple of 16 bytes. - return RoundUp(register_count, 2); + STATIC_ASSERT(InterpreterFrameConstants::kFixedFrameSize % 16 == 8); + // Interpreter frame header size is not 16-bytes aligned, so we'll need at + // least one register slot to make the frame a multiple of 16 bytes. The code + // below is equivalent to "RoundUp(register_count - 1, 2) + 1". + return RoundDown(register_count, 2) + 1; } int BuiltinContinuationFrameConstants::PaddingSlotCount(int register_count) { diff --git a/deps/v8/src/execution/arm64/frame-constants-arm64.h b/deps/v8/src/execution/arm64/frame-constants-arm64.h index 4a09e5b911c078..409fcec5048bf3 100644 --- a/deps/v8/src/execution/arm64/frame-constants-arm64.h +++ b/deps/v8/src/execution/arm64/frame-constants-arm64.h @@ -110,7 +110,7 @@ class WasmDebugBreakFrameConstants : public TypedFrameConstants { -RoundUp<16>(TypedFrameConstants::kFixedFrameSizeFromFp) - kSystemPointerSize * kNumPushedGpRegisters; static constexpr int kLastPushedFpRegisterOffset = - kLastPushedGpRegisterOffset - kDoubleSize * kNumPushedFpRegisters; + kLastPushedGpRegisterOffset - kSimd128Size * kNumPushedFpRegisters; // Offsets are fp-relative. static int GetPushedGpRegisterOffset(int reg_code) { @@ -124,7 +124,7 @@ class WasmDebugBreakFrameConstants : public TypedFrameConstants { DCHECK_NE(0, kPushedFpRegs & (1 << reg_code)); uint32_t lower_regs = kPushedFpRegs & ((uint32_t{1} << reg_code) - 1); return kLastPushedFpRegisterOffset + - base::bits::CountPopulation(lower_regs) * kDoubleSize; + base::bits::CountPopulation(lower_regs) * kSimd128Size; } }; diff --git a/deps/v8/src/execution/arm64/pointer-authentication-arm64.h b/deps/v8/src/execution/arm64/pointer-authentication-arm64.h index e4bc476b3d06ee..ec7f8d1850d4b1 100644 --- a/deps/v8/src/execution/arm64/pointer-authentication-arm64.h +++ b/deps/v8/src/execution/arm64/pointer-authentication-arm64.h @@ -60,24 +60,6 @@ V8_INLINE Address PointerAuthentication::StripPAC(Address pc) { #endif } -// Sign {pc} using {sp}. -V8_INLINE Address PointerAuthentication::SignPCWithSP(Address pc, Address sp) { -#ifdef USE_SIMULATOR - return Simulator::AddPAC(pc, sp, Simulator::kPACKeyIB, - Simulator::kInstructionPointer); -#else - asm volatile( - " mov x17, %[pc]\n" - " mov x16, %[sp]\n" - " pacib1716\n" - " mov %[pc], x17\n" - : [pc] "+r"(pc) - : [sp] "r"(sp) - : "x16", "x17"); - return pc; -#endif -} - // Authenticate the address stored in {pc_address} and replace it with // {new_pc}, after signing it. {offset_from_sp} is the offset between // {pc_address} and the pointer used as a context for signing. @@ -113,43 +95,27 @@ V8_INLINE void PointerAuthentication::ReplacePC(Address* pc_address, *pc_address = new_pc; } -// Authenticate the address stored in {pc_address} based on {old_context} and -// replace it with the same address signed with {new_context} instead. -V8_INLINE void PointerAuthentication::ReplaceContext(Address* pc_address, - Address old_context, - Address new_context) { - uint64_t old_signed_pc = static_cast(*pc_address); - uint64_t new_pc; + +// Sign {pc} using {sp}. +V8_INLINE Address PointerAuthentication::SignAndCheckPC(Address pc, + Address sp) { #ifdef USE_SIMULATOR - uint64_t auth_pc = - Simulator::AuthPAC(old_signed_pc, old_context, Simulator::kPACKeyIB, - Simulator::kInstructionPointer); - uint64_t raw_pc = - Simulator::StripPAC(auth_pc, Simulator::kInstructionPointer); - // Verify that the old address is authenticated. - CHECK_EQ(raw_pc, auth_pc); - new_pc = Simulator::AddPAC(raw_pc, new_context, Simulator::kPACKeyIB, - Simulator::kInstructionPointer); + pc = Simulator::AddPAC(pc, sp, Simulator::kPACKeyIB, + Simulator::kInstructionPointer); + CHECK(Deoptimizer::IsValidReturnAddress(PointerAuthentication::StripPAC(pc))); + return pc; #else - // Only store newly signed address after we have verified that the old - // address is authenticated. asm volatile( - " mov x17, %[old_pc]\n" - " mov x16, %[old_ctx]\n" - " autib1716\n" - " mov x16, %[new_ctx]\n" - " pacib1716\n" - " mov %[new_pc], x17\n" - " mov x17, %[old_pc]\n" - " mov x16, %[old_ctx]\n" - " autib1716\n" - " ldr xzr, [x17]\n" - : [new_pc] "=&r"(new_pc) - : [old_pc] "r"(old_signed_pc), [old_ctx] "r"(old_context), - [new_ctx] "r"(new_context) - : "x16", "x17"); + " mov x17, %[pc]\n" + " mov x16, %[sp]\n" + " pacib1716\n" + " mov %[pc], x17\n" + : [pc] "+r"(pc) + : [sp] "r"(sp) + : "x16", "x17"); + CHECK(Deoptimizer::IsValidReturnAddress(PointerAuthentication::StripPAC(pc))); + return pc; #endif - *pc_address = new_pc; } // clang-format on diff --git a/deps/v8/src/execution/frame-constants.h b/deps/v8/src/execution/frame-constants.h index 4809eeca80505e..6c037451a25cca 100644 --- a/deps/v8/src/execution/frame-constants.h +++ b/deps/v8/src/execution/frame-constants.h @@ -76,7 +76,9 @@ class CommonFrameConstants : public AllStatic { // StandardFrames are used for interpreted and optimized JavaScript // frames. They always have a context below the saved fp/constant -// pool and below that the JSFunction of the executing function. +// pool, below that the JSFunction of the executing function and below that an +// integer (not a Smi) containing the actual number of arguments passed to the +// JavaScript code. // // slot JS frame // +-----------------+-------------------------------- @@ -96,11 +98,13 @@ class CommonFrameConstants : public AllStatic { // |- - - - - - - - -| | | // 2+cp | Context | | if a constant pool | // |- - - - - - - - -| | is used, cp = 1, | -// 3+cp | JSFunction | v otherwise, cp = 0 | +// 3+cp | JSFunction | | otherwise, cp = 0 | +// |- - - - - - - - -| | | +// 4+cp | argc | v | // +-----------------+---- | -// 4+cp | | ^ Callee +// 5+cp | expressions or | ^ Callee // |- - - - - - - - -| | frame slots -// ... | | Frame slots (slot >= 0) +// ... | pushed values | Frame slots (slot >= 0) // |- - - - - - - - -| | | // | | v | // -----+-----------------+----- <-- stack ptr ------------- @@ -108,7 +112,7 @@ class CommonFrameConstants : public AllStatic { class StandardFrameConstants : public CommonFrameConstants { public: static constexpr int kFixedFrameSizeFromFp = - 2 * kSystemPointerSize + kCPSlotSize; + 3 * kSystemPointerSize + kCPSlotSize; static constexpr int kFixedFrameSize = kFixedFrameSizeAboveFp + kFixedFrameSizeFromFp; static constexpr int kFixedSlotCountFromFp = @@ -116,53 +120,13 @@ class StandardFrameConstants : public CommonFrameConstants { static constexpr int kFixedSlotCount = kFixedFrameSize / kSystemPointerSize; static constexpr int kContextOffset = kContextOrFrameTypeOffset; static constexpr int kFunctionOffset = -2 * kSystemPointerSize - kCPSlotSize; + static constexpr int kArgCOffset = -3 * kSystemPointerSize - kCPSlotSize; static constexpr int kExpressionsOffset = - -3 * kSystemPointerSize - kCPSlotSize; + -4 * kSystemPointerSize - kCPSlotSize; + static constexpr int kFirstPushedFrameValueOffset = kExpressionsOffset; static constexpr int kLastObjectOffset = kContextOffset; }; -// OptimizedBuiltinFrameConstants are used for TF-generated builtins. They -// always have a context below the saved fp/constant pool and below that the -// JSFunction of the executing function and below that an integer (not a Smi) -// containing the number of arguments passed to the builtin. -// -// slot JS frame -// +-----------------+-------------------------------- -// -n-1 | parameter 0 | ^ -// |- - - - - - - - -| | -// -n | | Caller -// ... | ... | frame slots -// -2 | parameter n-1 | (slot < 0) -// |- - - - - - - - -| | -// -1 | parameter n | v -// -----+-----------------+-------------------------------- -// 0 | return addr | ^ ^ -// |- - - - - - - - -| | | -// 1 | saved frame ptr | Fixed | -// |- - - - - - - - -| Header <-- frame ptr | -// 2 | [Constant Pool] | | | -// |- - - - - - - - -| | | -// 2+cp | Context | | if a constant pool | -// |- - - - - - - - -| | is used, cp = 1, | -// 3+cp | JSFunction | | otherwise, cp = 0 | -// |- - - - - - - - -| | | -// 4+cp | argc | v | -// +-----------------+---- | -// 5+cp | | ^ Callee -// |- - - - - - - - -| | frame slots -// ... | | Frame slots (slot >= 0) -// |- - - - - - - - -| | | -// | | v | -// -----+-----------------+----- <-- stack ptr ------------- -// -class OptimizedBuiltinFrameConstants : public StandardFrameConstants { - public: - static constexpr int kArgCSize = kSystemPointerSize; - static constexpr int kArgCOffset = -3 * kSystemPointerSize - kCPSlotSize; - static constexpr int kFixedFrameSize = kFixedFrameSizeAboveFp - kArgCOffset; - static constexpr int kFixedSlotCount = kFixedFrameSize / kSystemPointerSize; -}; - // TypedFrames have a type maker value below the saved FP/constant pool to // distinguish them from StandardFrames, which have a context in that position // instead. @@ -185,9 +149,9 @@ class OptimizedBuiltinFrameConstants : public StandardFrameConstants { // |- - - - - - - - -| | | // 2+cp |Frame Type Marker| v if a constant pool | // |-----------------+---- is used, cp = 1, | -// 3+cp | | ^ otherwise, cp = 0 | +// 3+cp | pushed value 0 | ^ otherwise, cp = 0 | // |- - - - - - - - -| | | -// 4+cp | | | Callee +// 4+cp | pushed value 1 | | Callee // |- - - - - - - - -| | frame slots // ... | | Frame slots (slot >= 0) // |- - - - - - - - -| | | @@ -208,19 +172,32 @@ class TypedFrameConstants : public CommonFrameConstants { -kFixedFrameSizeFromFp - kSystemPointerSize; }; -#define TYPED_FRAME_PUSHED_VALUE_OFFSET(x) \ - (TypedFrameConstants::kFirstPushedFrameValueOffset - (x)*kSystemPointerSize) -#define TYPED_FRAME_SIZE(count) \ - (TypedFrameConstants::kFixedFrameSize + (count)*kSystemPointerSize) -#define TYPED_FRAME_SIZE_FROM_FP(count) \ - (TypedFrameConstants::kFixedFrameSizeFromFp + (count)*kSystemPointerSize) -#define DEFINE_TYPED_FRAME_SIZES(count) \ - static constexpr int kFixedFrameSize = TYPED_FRAME_SIZE(count); \ +#define FRAME_PUSHED_VALUE_OFFSET(parent, x) \ + (parent::kFirstPushedFrameValueOffset - (x)*kSystemPointerSize) +#define FRAME_SIZE(parent, count) \ + (parent::kFixedFrameSize + (count)*kSystemPointerSize) +#define FRAME_SIZE_FROM_FP(parent, count) \ + (parent::kFixedFrameSizeFromFp + (count)*kSystemPointerSize) +#define DEFINE_FRAME_SIZES(parent, count) \ + static constexpr int kFixedFrameSize = FRAME_SIZE(parent, count); \ static constexpr int kFixedSlotCount = kFixedFrameSize / kSystemPointerSize; \ static constexpr int kFixedFrameSizeFromFp = \ - TYPED_FRAME_SIZE_FROM_FP(count); \ + FRAME_SIZE_FROM_FP(parent, count); \ static constexpr int kFixedSlotCountFromFp = \ - kFixedFrameSizeFromFp / kSystemPointerSize + kFixedFrameSizeFromFp / kSystemPointerSize; \ + static constexpr int kExtraSlotCount = \ + kFixedFrameSize / kSystemPointerSize - \ + parent::kFixedFrameSize / kSystemPointerSize + +#define STANDARD_FRAME_EXTRA_PUSHED_VALUE_OFFSET(x) \ + FRAME_PUSHED_VALUE_OFFSET(StandardFrameConstants, x) +#define DEFINE_STANDARD_FRAME_SIZES(count) \ + DEFINE_FRAME_SIZES(StandardFrameConstants, count) + +#define TYPED_FRAME_PUSHED_VALUE_OFFSET(x) \ + FRAME_PUSHED_VALUE_OFFSET(TypedFrameConstants, x) +#define DEFINE_TYPED_FRAME_SIZES(count) \ + DEFINE_FRAME_SIZES(TypedFrameConstants, count) class ArgumentsAdaptorFrameConstants : public TypedFrameConstants { public: @@ -306,7 +283,7 @@ class ExitFrameConstants : public TypedFrameConstants { }; // Behaves like an exit frame but with target and new target args. -class BuiltinExitFrameConstants : public CommonFrameConstants { +class BuiltinExitFrameConstants : public ExitFrameConstants { public: static constexpr int kNewTargetOffset = kCallerPCOffset + 1 * kSystemPointerSize; @@ -319,15 +296,15 @@ class BuiltinExitFrameConstants : public CommonFrameConstants { static constexpr int kNumExtraArgsWithReceiver = 5; }; -class InterpreterFrameConstants : public AllStatic { +class InterpreterFrameConstants : public StandardFrameConstants { public: - // Fixed frame includes bytecode array and bytecode offset. - static constexpr int kFixedFrameSize = - StandardFrameConstants::kFixedFrameSize + 2 * kSystemPointerSize; - static constexpr int kFixedFrameSizeFromFp = - StandardFrameConstants::kFixedFrameSizeFromFp + 2 * kSystemPointerSize; - // FP-relative. + static constexpr int kBytecodeArrayFromFp = + STANDARD_FRAME_EXTRA_PUSHED_VALUE_OFFSET(0); + static constexpr int kBytecodeOffsetFromFp = + STANDARD_FRAME_EXTRA_PUSHED_VALUE_OFFSET(1); + DEFINE_STANDARD_FRAME_SIZES(2); + #ifdef V8_REVERSE_JSARGS static constexpr int kFirstParamFromFp = StandardFrameConstants::kCallerSPOffset; @@ -335,22 +312,10 @@ class InterpreterFrameConstants : public AllStatic { static constexpr int kLastParamFromFp = StandardFrameConstants::kCallerSPOffset; #endif - static constexpr int kCallerPCOffsetFromFp = - StandardFrameConstants::kCallerPCOffset; - static constexpr int kBytecodeArrayFromFp = - -StandardFrameConstants::kFixedFrameSizeFromFp - 1 * kSystemPointerSize; - static constexpr int kBytecodeOffsetFromFp = - -StandardFrameConstants::kFixedFrameSizeFromFp - 2 * kSystemPointerSize; static constexpr int kRegisterFileFromFp = - -StandardFrameConstants::kFixedFrameSizeFromFp - 3 * kSystemPointerSize; - + -kFixedFrameSizeFromFp - kSystemPointerSize; static constexpr int kExpressionsOffset = kRegisterFileFromFp; - // Number of fixed slots in addition to a {StandardFrame}. - static constexpr int kExtraSlotCount = - InterpreterFrameConstants::kFixedFrameSize / kSystemPointerSize - - StandardFrameConstants::kFixedFrameSize / kSystemPointerSize; - // Expression index for {StandardFrame::GetExpressionAddress}. static constexpr int kBytecodeArrayExpressionIndex = -2; static constexpr int kBytecodeOffsetExpressionIndex = -1; diff --git a/deps/v8/src/execution/frames-inl.h b/deps/v8/src/execution/frames-inl.h index d23249c7f159fc..e56db9ee4aab2c 100644 --- a/deps/v8/src/execution/frames-inl.h +++ b/deps/v8/src/execution/frames-inl.h @@ -202,9 +202,14 @@ inline JavaScriptFrame::JavaScriptFrame(StackFrameIteratorBase* iterator) : StandardFrame(iterator) {} Address JavaScriptFrame::GetParameterSlot(int index) const { - DCHECK(-1 <= index && - (index < ComputeParametersCount() || - ComputeParametersCount() == kDontAdaptArgumentsSentinel)); + DCHECK_LE(-1, index); +#ifdef V8_NO_ARGUMENTS_ADAPTOR + DCHECK_LT(index, + std::max(GetActualArgumentsCount(), ComputeParametersCount())); +#else + DCHECK(index < ComputeParametersCount() || + ComputeParametersCount() == kDontAdaptArgumentsSentinel); +#endif #ifdef V8_REVERSE_JSARGS int parameter_offset = (index + 1) * kSystemPointerSize; #else @@ -335,7 +340,7 @@ inline StackFrame* SafeStackFrameIterator::frame() const { DCHECK(!done()); DCHECK(frame_->is_java_script() || frame_->is_exit() || frame_->is_builtin_exit() || frame_->is_wasm() || - frame_->is_wasm_to_js()); + frame_->is_wasm_to_js() || frame_->is_js_to_wasm()); return frame_; } diff --git a/deps/v8/src/execution/frames.cc b/deps/v8/src/execution/frames.cc index b77e4bcf653dc9..d7aa13c3ecc345 100644 --- a/deps/v8/src/execution/frames.cc +++ b/deps/v8/src/execution/frames.cc @@ -181,6 +181,14 @@ void StackTraceFrameIterator::Advance() { } while (!done() && !IsValidFrame(iterator_.frame())); } +int StackTraceFrameIterator::FrameFunctionCount() const { + DCHECK(!done()); + if (!iterator_.frame()->is_optimized()) return 1; + std::vector infos; + OptimizedFrame::cast(iterator_.frame())->GetFunctions(&infos); + return static_cast(infos.size()); +} + bool StackTraceFrameIterator::IsValidFrame(StackFrame* frame) const { if (frame->is_java_script()) { JavaScriptFrame* js_frame = static_cast(frame); @@ -458,7 +466,7 @@ void SafeStackFrameIterator::Advance() { external_callback_scope_ = external_callback_scope_->previous(); } if (frame_->is_java_script() || frame_->is_wasm() || - frame_->is_wasm_to_js()) { + frame_->is_wasm_to_js() || frame_->is_js_to_wasm()) { break; } if (frame_->is_exit() || frame_->is_builtin_exit()) { @@ -952,7 +960,8 @@ void StandardFrame::IterateCompiledFrame(RootVisitor* v) const { int frame_header_size = StandardFrameConstants::kFixedFrameSizeFromFp; intptr_t marker = Memory(fp() + CommonFrameConstants::kContextOrFrameTypeOffset); - if (StackFrame::IsTypeMarker(marker)) { + bool typed_frame = StackFrame::IsTypeMarker(marker); + if (typed_frame) { StackFrame::Type candidate = StackFrame::MarkerToType(marker); switch (candidate) { case ENTRY: @@ -1062,6 +1071,11 @@ void StandardFrame::IterateCompiledFrame(RootVisitor* v) const { // If this frame has JavaScript ABI, visit the context (in stub and JS // frames) and the function (in JS frames). If it has WebAssembly ABI, visit // the instance object. + if (!typed_frame) { + // JavaScript ABI frames also contain arguments count value which is stored + // untagged, we don't need to visit it. + frame_header_base += 1; + } v->VisitRootPointers(Root::kTop, nullptr, frame_header_base, frame_header_limit); } @@ -1112,7 +1126,7 @@ int OptimizedFrame::ComputeParametersCount() const { Code code = LookupCode(); if (code.kind() == CodeKind::BUILTIN) { return static_cast( - Memory(fp() + OptimizedBuiltinFrameConstants::kArgCOffset)); + Memory(fp() + StandardFrameConstants::kArgCOffset)); } else { return JavaScriptFrame::ComputeParametersCount(); } @@ -1282,6 +1296,13 @@ int JavaScriptFrame::ComputeParametersCount() const { return function().shared().internal_formal_parameter_count(); } +#ifdef V8_NO_ARGUMENTS_ADAPTOR +int JavaScriptFrame::GetActualArgumentCount() const { + return static_cast( + Memory(fp() + StandardFrameConstants::kArgCOffset)); +} +#endif + Handle JavaScriptFrame::GetParameters() const { if (V8_LIKELY(!FLAG_detailed_error_stack_trace)) { return isolate()->factory()->empty_fixed_array(); @@ -1636,7 +1657,7 @@ Object OptimizedFrame::receiver() const { Code code = LookupCode(); if (code.kind() == CodeKind::BUILTIN) { intptr_t argc = static_cast( - Memory(fp() + OptimizedBuiltinFrameConstants::kArgCOffset)); + Memory(fp() + StandardFrameConstants::kArgCOffset)); intptr_t args_size = (StandardFrameConstants::kFixedSlotCountAboveFp + argc) * kSystemPointerSize; @@ -1794,7 +1815,8 @@ void InterpretedFrame::Summarize(std::vector* functions) const { } int ArgumentsAdaptorFrame::ComputeParametersCount() const { - return Smi::ToInt(GetExpression(0)); + const int offset = ArgumentsAdaptorFrameConstants::kLengthOffset; + return Smi::ToInt(Object(base::Memory
(fp() + offset))); } Code ArgumentsAdaptorFrame::unchecked_code() const { @@ -1802,7 +1824,8 @@ Code ArgumentsAdaptorFrame::unchecked_code() const { } int BuiltinFrame::ComputeParametersCount() const { - return Smi::ToInt(GetExpression(0)); + const int offset = BuiltinFrameConstants::kLengthOffset; + return Smi::ToInt(Object(base::Memory
(fp() + offset))); } void BuiltinFrame::PrintFrameKind(StringStream* accumulator) const { @@ -1964,17 +1987,17 @@ void JsToWasmFrame::Iterate(RootVisitor* v) const { // GenericJSToWasmWrapper stack layout // ------+-----------------+---------------------- // | return addr | - // rbp |- - - - - - - - -| <-fp() -------------| - // | rbp | | - // rbp-p |- - - - - - - - -| | + // fp |- - - - - - - - -| -------------------| + // | fp | | + // fp-p |- - - - - - - - -| | // | frame marker | | no GC scan - // rbp-2p | - - - - - - - - | <- spill_slot_limit | - // | signature_type | | - // rbp-3p |- - - - - - - - -| -------------------| - // | .... | | - // | spill slots | | GC scan - // | .... |<- spill_slot_base | - // |- - - - - - - - -| -------------------| + // fp-2p |- - - - - - - - -| | + // | scan_count | | + // fp-3p |- - - - - - - - -| -------------------| + // | .... | <- spill_slot_limit | + // | spill slots | | GC scan scan_count slots + // | .... | <- spill_slot_base--| + // |- - - - - - - - -| | if (code.is_null() || !code.is_builtin() || code.builtin_index() != Builtins::kGenericJSToWasmWrapper) { // If it's not the GenericJSToWasmWrapper, then it's the TurboFan compiled @@ -1982,9 +2005,14 @@ void JsToWasmFrame::Iterate(RootVisitor* v) const { IterateCompiledFrame(v); return; } + // The [fp - 2*kSystemPointerSize] on the stack is a value indicating how + // many values should be scanned from the top. + intptr_t scan_count = + *reinterpret_cast(fp() - 2 * kSystemPointerSize); + FullObjectSlot spill_slot_base(&Memory
(sp())); FullObjectSlot spill_slot_limit( - &Memory
(fp() - 2 * kSystemPointerSize)); + &Memory
(sp() + scan_count * kSystemPointerSize)); v->VisitRootPointers(Root::kTop, nullptr, spill_slot_base, spill_slot_limit); } @@ -2174,10 +2202,21 @@ void EntryFrame::Iterate(RootVisitor* v) const { } void StandardFrame::IterateExpressions(RootVisitor* v) const { - const int offset = StandardFrameConstants::kLastObjectOffset; + const int last_object_offset = StandardFrameConstants::kLastObjectOffset; + intptr_t marker = + Memory(fp() + CommonFrameConstants::kContextOrFrameTypeOffset); FullObjectSlot base(&Memory
(sp())); - FullObjectSlot limit(&Memory
(fp() + offset) + 1); - v->VisitRootPointers(Root::kTop, nullptr, base, limit); + FullObjectSlot limit(&Memory
(fp() + last_object_offset) + 1); + if (StackFrame::IsTypeMarker(marker)) { + v->VisitRootPointers(Root::kTop, nullptr, base, limit); + } else { + // The frame contains the actual argument count (intptr) that should not be + // visited. + FullObjectSlot argc( + &Memory
(fp() + StandardFrameConstants::kArgCOffset)); + v->VisitRootPointers(Root::kTop, nullptr, base, argc); + v->VisitRootPointers(Root::kTop, nullptr, argc + 1, limit); + } } void JavaScriptFrame::Iterate(RootVisitor* v) const { diff --git a/deps/v8/src/execution/frames.h b/deps/v8/src/execution/frames.h index b04d0e01401d91..eb627a158a4437 100644 --- a/deps/v8/src/execution/frames.h +++ b/deps/v8/src/execution/frames.h @@ -205,6 +205,7 @@ class StackFrame { (type == JAVA_SCRIPT_BUILTIN_CONTINUATION_WITH_CATCH); } bool is_wasm_to_js() const { return type() == WASM_TO_JS; } + bool is_js_to_wasm() const { return type() == JS_TO_WASM; } // Accessors. Address sp() const { return state_.sp; } @@ -669,6 +670,9 @@ class JavaScriptFrame : public StandardFrame { inline Address GetParameterSlot(int index) const; Object GetParameter(int index) const override; int ComputeParametersCount() const override; +#ifdef V8_NO_ARGUMENTS_ADAPTOR + int GetActualArgumentCount() const; +#endif Handle GetParameters() const; // Debugger access. @@ -1230,6 +1234,7 @@ class V8_EXPORT_PRIVATE StackTraceFrameIterator { bool done() const { return iterator_.done(); } void Advance(); void AdvanceOneFrame() { iterator_.Advance(); } + int FrameFunctionCount() const; inline StandardFrame* frame() const; diff --git a/deps/v8/src/execution/isolate.cc b/deps/v8/src/execution/isolate.cc index bd357d4bfc9991..c1c3bd1b24a651 100644 --- a/deps/v8/src/execution/isolate.cc +++ b/deps/v8/src/execution/isolate.cc @@ -26,6 +26,7 @@ #include "src/codegen/assembler-inl.h" #include "src/codegen/compilation-cache.h" #include "src/codegen/flush-instruction-cache.h" +#include "src/common/assert-scope.h" #include "src/common/ptr-compr.h" #include "src/compiler-dispatcher/compiler-dispatcher.h" #include "src/compiler-dispatcher/optimizing-compile-dispatcher.h" @@ -99,6 +100,10 @@ #include "src/diagnostics/unwinding-info-win64.h" #endif // V8_OS_WIN64 +#ifdef V8_ENABLE_CONSERVATIVE_STACK_SCANNING +#include "src/heap/conservative-stack-visitor.h" +#endif + extern "C" const uint8_t* v8_Default_embedded_blob_code_; extern "C" uint32_t v8_Default_embedded_blob_code_size_; extern "C" const uint8_t* v8_Default_embedded_blob_metadata_; @@ -505,6 +510,11 @@ void Isolate::Iterate(RootVisitor* v, ThreadLocalTop* thread) { FullObjectSlot(reinterpret_cast
(&(block->message_obj_)))); } +#ifdef V8_ENABLE_CONSERVATIVE_STACK_SCANNING + ConservativeStackVisitor stack_visitor(this, v); + thread_local_top()->stack_.IteratePointers(&stack_visitor); +#endif + // Iterate over pointers on native execution stack. wasm::WasmCodeRefScope wasm_code_ref_scope; for (StackFrameIterator it(this, thread); !it.done(); it.Advance()) { @@ -1588,7 +1598,8 @@ Object Isolate::Throw(Object raw_exception, MessageLocation* location) { // Script::GetLineNumber and Script::GetColumnNumber can allocate on the heap to // initialize the line_ends array, so be careful when calling them. #ifdef DEBUG - if (AllowHeapAllocation::IsAllowed()) { + if (AllowHeapAllocation::IsAllowed() && + AllowGarbageCollection::IsAllowed()) { #else if ((false)) { #endif @@ -3068,7 +3079,8 @@ void Isolate::Deinit() { cancelable_task_manager()->CancelAndWait(); heap_.TearDown(); - logger_->TearDown(); + FILE* logfile = logger_->TearDownAndGetLogFile(); + if (logfile != nullptr) fclose(logfile); if (wasm_engine_) { wasm_engine_->RemoveIsolate(this); @@ -3324,6 +3336,8 @@ void Isolate::CreateAndSetEmbeddedBlob() { PrepareBuiltinSourcePositionMap(); + PrepareBuiltinLabelInfoMap(); + // If a sticky blob has been set, we reuse it. if (StickyEmbeddedBlobCode() != nullptr) { CHECK_EQ(embedded_blob_code(), StickyEmbeddedBlobCode()); @@ -3472,7 +3486,7 @@ bool Isolate::Init(ReadOnlyDeserializer* read_only_deserializer, date_cache_ = new DateCache(); heap_profiler_ = new HeapProfiler(heap()); interpreter_ = new interpreter::Interpreter(this); - string_table_.reset(new StringTable()); + string_table_.reset(new StringTable(this)); compiler_dispatcher_ = new CompilerDispatcher(this, V8::GetCurrentPlatform(), FLAG_stack_size); @@ -4198,6 +4212,15 @@ void Isolate::PrepareBuiltinSourcePositionMap() { } } +void Isolate::PrepareBuiltinLabelInfoMap() { + if (embedded_file_writer_ != nullptr) { + embedded_file_writer_->PrepareBuiltinLabelInfoMap( + heap()->construct_stub_create_deopt_pc_offset().value(), + heap()->construct_stub_invoke_deopt_pc_offset().value(), + heap()->arguments_adaptor_deopt_pc_offset().value()); + } +} + #if defined(V8_OS_WIN64) void Isolate::SetBuiltinUnwindData( int builtin_index, @@ -4362,13 +4385,6 @@ void Isolate::CountUsage(v8::Isolate::UseCounterFeature feature) { int Isolate::GetNextScriptId() { return heap()->NextScriptId(); } -int Isolate::GetNextStackFrameInfoId() { - int id = last_stack_frame_info_id(); - int next_id = id == Smi::kMaxValue ? 0 : (id + 1); - set_last_stack_frame_info_id(next_id); - return next_id; -} - // static std::string Isolate::GetTurboCfgFileName(Isolate* isolate) { if (FLAG_trace_turbo_cfg_file == nullptr) { @@ -4569,11 +4585,33 @@ SaveAndSwitchContext::SaveAndSwitchContext(Isolate* isolate, #ifdef DEBUG AssertNoContextChange::AssertNoContextChange(Isolate* isolate) : isolate_(isolate), context_(isolate->context(), isolate) {} + +namespace { + +bool Overlapping(const MemoryRange& a, const MemoryRange& b) { + uintptr_t a1 = reinterpret_cast(a.start); + uintptr_t a2 = a1 + a.length_in_bytes; + uintptr_t b1 = reinterpret_cast(b.start); + uintptr_t b2 = b1 + b.length_in_bytes; + // Either b1 or b2 are in the [a1, a2) range. + return (a1 <= b1 && b1 < a2) || (a1 <= b2 && b2 < a2); +} + +} // anonymous namespace + #endif // DEBUG void Isolate::AddCodeMemoryRange(MemoryRange range) { std::vector* old_code_pages = GetCodePages(); DCHECK_NOT_NULL(old_code_pages); +#ifdef DEBUG + auto overlapping = [range](const MemoryRange& a) { + return Overlapping(range, a); + }; + DCHECK_EQ(old_code_pages->end(), + std::find_if(old_code_pages->begin(), old_code_pages->end(), + overlapping)); +#endif std::vector* new_code_pages; if (old_code_pages == &code_pages_buffer1_) { @@ -4687,7 +4725,7 @@ void Isolate::RemoveCodeMemoryChunk(MemoryChunk* chunk) { [removed_page_start](const MemoryRange& range) { return range.start == removed_page_start; }); - + DCHECK_EQ(old_code_pages->size(), new_code_pages->size() + 1); // Atomically switch out the pointer SetCodePages(new_code_pages); #endif // !defined(V8_TARGET_ARCH_ARM) diff --git a/deps/v8/src/execution/isolate.h b/deps/v8/src/execution/isolate.h index 8c538ab27de3da..43b7e27dd42979 100644 --- a/deps/v8/src/execution/isolate.h +++ b/deps/v8/src/execution/isolate.h @@ -5,6 +5,7 @@ #ifndef V8_EXECUTION_ISOLATE_H_ #define V8_EXECUTION_ISOLATE_H_ +#include #include #include #include @@ -432,8 +433,6 @@ using DebugObjectCache = std::vector>; V(int, code_and_metadata_size, 0) \ V(int, bytecode_and_metadata_size, 0) \ V(int, external_script_source_size, 0) \ - /* true if being profiled. Causes collection of extra compile info. */ \ - V(bool, is_profiling, false) \ /* Number of CPU profilers running on the isolate. */ \ V(size_t, num_cpu_profilers, 0) \ /* true if a trace is being formatted through Error.prepareStackTrace. */ \ @@ -443,7 +442,6 @@ using DebugObjectCache = std::vector>; /* Current code coverage mode */ \ V(debug::CoverageMode, code_coverage_mode, debug::CoverageMode::kBestEffort) \ V(debug::TypeProfileMode, type_profile_mode, debug::TypeProfileMode::kNone) \ - V(int, last_stack_frame_info_id, 0) \ V(int, last_console_context_id, 0) \ V(v8_inspector::V8Inspector*, inspector, nullptr) \ V(bool, next_v8_call_is_safe_for_termination, false) \ @@ -1074,7 +1072,16 @@ class V8_EXPORT_PRIVATE Isolate final : private HiddenFactory { Debug* debug() { return debug_; } - bool* is_profiling_address() { return &is_profiling_; } + void* is_profiling_address() { return &is_profiling_; } + + bool is_profiling() const { + return is_profiling_.load(std::memory_order_relaxed); + } + + void set_is_profiling(bool enabled) { + is_profiling_.store(enabled, std::memory_order_relaxed); + } + CodeEventDispatcher* code_event_dispatcher() const { return code_event_dispatcher_.get(); } @@ -1311,8 +1318,6 @@ class V8_EXPORT_PRIVATE Isolate final : private HiddenFactory { int GetNextScriptId(); - int GetNextStackFrameInfoId(); - #if V8_SFI_HAS_UNIQUE_ID int GetNextUniqueSharedFunctionInfoId() { int current_id = next_unique_sfi_id_.load(std::memory_order_relaxed); @@ -1466,6 +1471,10 @@ class V8_EXPORT_PRIVATE Isolate final : private HiddenFactory { // annotate the builtin blob with debugging information. void PrepareBuiltinSourcePositionMap(); + // Store the position of the labels that will be used in the list of allowed + // return addresses. + void PrepareBuiltinLabelInfoMap(); + #if defined(V8_OS_WIN64) void SetBuiltinUnwindData( int builtin_index, @@ -1731,6 +1740,9 @@ class V8_EXPORT_PRIVATE Isolate final : private HiddenFactory { #endif // V8_INTL_SUPPORT + // true if being profiled. Causes collection of extra compile info. + std::atomic is_profiling_{false}; + // Whether the isolate has been created for snapshotting. bool serializer_enabled_ = false; diff --git a/deps/v8/src/execution/mips/frame-constants-mips.h b/deps/v8/src/execution/mips/frame-constants-mips.h index 6287203f959a0f..48704cf56a8991 100644 --- a/deps/v8/src/execution/mips/frame-constants-mips.h +++ b/deps/v8/src/execution/mips/frame-constants-mips.h @@ -16,8 +16,7 @@ class EntryFrameConstants : public AllStatic { public: // This is the offset to where JSEntry pushes the current value of // Isolate::c_entry_fp onto the stack. - static constexpr int kCallerFPOffset = - -(StandardFrameConstants::kFixedFrameSizeFromFp + kPointerSize); + static constexpr int kCallerFPOffset = -3 * kSystemPointerSize; // Stack offsets for arguments passed to JSEntry. static constexpr int kArgcOffset = +0 * kSystemPointerSize; @@ -28,9 +27,12 @@ class WasmCompileLazyFrameConstants : public TypedFrameConstants { public: static constexpr int kNumberOfSavedGpParamRegs = 3; static constexpr int kNumberOfSavedFpParamRegs = 7; + static constexpr int kNumberOfSavedAllParamRegs = 10; // FP-relative. - static constexpr int kWasmInstanceOffset = TYPED_FRAME_PUSHED_VALUE_OFFSET(3); + // See Generate_WasmCompileLazy in builtins-mips.cc. + static constexpr int kWasmInstanceOffset = + TYPED_FRAME_PUSHED_VALUE_OFFSET(kNumberOfSavedAllParamRegs); static constexpr int kFixedFrameSizeFromFp = TypedFrameConstants::kFixedFrameSizeFromFp + kNumberOfSavedGpParamRegs * kPointerSize + diff --git a/deps/v8/src/execution/mips64/frame-constants-mips64.h b/deps/v8/src/execution/mips64/frame-constants-mips64.h index 7a49ef6d192fac..0f20f55d76d4ca 100644 --- a/deps/v8/src/execution/mips64/frame-constants-mips64.h +++ b/deps/v8/src/execution/mips64/frame-constants-mips64.h @@ -16,17 +16,19 @@ class EntryFrameConstants : public AllStatic { public: // This is the offset to where JSEntry pushes the current value of // Isolate::c_entry_fp onto the stack. - static constexpr int kCallerFPOffset = - -(StandardFrameConstants::kFixedFrameSizeFromFp + kPointerSize); + static constexpr int kCallerFPOffset = -3 * kSystemPointerSize; }; class WasmCompileLazyFrameConstants : public TypedFrameConstants { public: static constexpr int kNumberOfSavedGpParamRegs = 7; static constexpr int kNumberOfSavedFpParamRegs = 7; + static constexpr int kNumberOfSavedAllParamRegs = 14; // FP-relative. - static constexpr int kWasmInstanceOffset = TYPED_FRAME_PUSHED_VALUE_OFFSET(7); + // See Generate_WasmCompileLazy in builtins-mips64.cc. + static constexpr int kWasmInstanceOffset = + TYPED_FRAME_PUSHED_VALUE_OFFSET(kNumberOfSavedAllParamRegs); static constexpr int kFixedFrameSizeFromFp = TypedFrameConstants::kFixedFrameSizeFromFp + kNumberOfSavedGpParamRegs * kPointerSize + diff --git a/deps/v8/src/execution/pointer-authentication-dummy.h b/deps/v8/src/execution/pointer-authentication-dummy.h index 32a10dc0ddf446..9948d8303dc292 100644 --- a/deps/v8/src/execution/pointer-authentication-dummy.h +++ b/deps/v8/src/execution/pointer-authentication-dummy.h @@ -27,12 +27,6 @@ V8_INLINE Address PointerAuthentication::AuthenticatePC( // Return {pc} unmodified. V8_INLINE Address PointerAuthentication::StripPAC(Address pc) { return pc; } -// Return {pc} unmodified. -V8_INLINE Address PointerAuthentication::SignPCWithSP(Address pc, Address sp) { - USE(sp); - return pc; -} - // Store {new_pc} to {pc_address} without signing. V8_INLINE void PointerAuthentication::ReplacePC(Address* pc_address, Address new_pc, @@ -41,13 +35,11 @@ V8_INLINE void PointerAuthentication::ReplacePC(Address* pc_address, *pc_address = new_pc; } -// Do nothing. -V8_INLINE void PointerAuthentication::ReplaceContext(Address* pc_address, - Address old_context, - Address new_context) { - USE(pc_address); - USE(old_context); - USE(new_context); +// Return {pc} unmodified. +V8_INLINE Address PointerAuthentication::SignAndCheckPC(Address pc, + Address sp) { + USE(sp); + return pc; } } // namespace internal diff --git a/deps/v8/src/execution/pointer-authentication.h b/deps/v8/src/execution/pointer-authentication.h index f2d63773f4ced6..8caf1d0b9dd04d 100644 --- a/deps/v8/src/execution/pointer-authentication.h +++ b/deps/v8/src/execution/pointer-authentication.h @@ -8,6 +8,7 @@ #include "include/v8.h" #include "src/base/macros.h" #include "src/common/globals.h" +#include "src/deoptimizer/deoptimizer.h" namespace v8 { namespace internal { @@ -27,10 +28,6 @@ class PointerAuthentication : public AllStatic { // When CFI is not enabled, return {pc} unmodified. V8_INLINE static Address StripPAC(Address pc); - // When CFI is enabled, sign {pc} using {sp} and return the signed value. - // When CFI is not enabled, return {pc} unmodified. - V8_INLINE static Address SignPCWithSP(Address pc, Address sp); - // When CFI is enabled, authenticate the address stored in {pc_address} and // replace it with {new_pc}, after signing it. {offset_from_sp} is the offset // between {pc_address} and the pointer used as a context for signing. @@ -38,12 +35,10 @@ class PointerAuthentication : public AllStatic { V8_INLINE static void ReplacePC(Address* pc_address, Address new_pc, int offset_from_sp); - // When CFI is enabled, authenticate the address stored in {pc_address} based - // on {old_context} and replace it with the same address signed with - // {new_context} instead. - // When CFI is not enabled, do nothing. - V8_INLINE static void ReplaceContext(Address* pc_address, Address old_context, - Address new_context); + // When CFI is enabled, sign {pc} using {sp}, check the address and return the + // signed value. When CFI is not enabled, return {pc} unmodified. This method + // only applies in the deoptimizer. + V8_INLINE static Address SignAndCheckPC(Address pc, Address sp); }; } // namespace internal diff --git a/deps/v8/src/execution/ppc/frame-constants-ppc.h b/deps/v8/src/execution/ppc/frame-constants-ppc.h index 24ef5850310218..0931ffe1012983 100644 --- a/deps/v8/src/execution/ppc/frame-constants-ppc.h +++ b/deps/v8/src/execution/ppc/frame-constants-ppc.h @@ -14,8 +14,8 @@ namespace internal { class EntryFrameConstants : public AllStatic { public: - static constexpr int kCallerFPOffset = - -(StandardFrameConstants::kFixedFrameSizeFromFp + kSystemPointerSize); + // Need to take constant pool into account. + static constexpr int kCallerFPOffset = -4 * kSystemPointerSize; }; class WasmCompileLazyFrameConstants : public TypedFrameConstants { diff --git a/deps/v8/src/execution/ppc/simulator-ppc.cc b/deps/v8/src/execution/ppc/simulator-ppc.cc index f845739e75ddff..8e7070e5dc8715 100644 --- a/deps/v8/src/execution/ppc/simulator-ppc.cc +++ b/deps/v8/src/execution/ppc/simulator-ppc.cc @@ -2216,7 +2216,9 @@ void Simulator::ExecuteGeneric(Instruction* instr) { int32_t ra_val = (get_register(ra) & 0xFFFFFFFF); int32_t rb_val = (get_register(rb) & 0xFFFFFFFF); int64_t alu_out = (int64_t)ra_val * (int64_t)rb_val; - alu_out >>= 32; + // High 32 bits of the result is undefined, + // Which is simulated here by adding random bits. + alu_out = (alu_out >> 32) | 0x421000000000000; set_register(rt, alu_out); if (instr->Bit(0)) { // RC bit set SetCR0(static_cast(alu_out)); @@ -2230,7 +2232,9 @@ void Simulator::ExecuteGeneric(Instruction* instr) { uint32_t ra_val = (get_register(ra) & 0xFFFFFFFF); uint32_t rb_val = (get_register(rb) & 0xFFFFFFFF); uint64_t alu_out = (uint64_t)ra_val * (uint64_t)rb_val; - alu_out >>= 32; + // High 32 bits of the result is undefined, + // Which is simulated here by adding random bits. + alu_out = (alu_out >> 32) | 0x421000000000000; set_register(rt, alu_out); if (instr->Bit(0)) { // RC bit set SetCR0(static_cast(alu_out)); diff --git a/deps/v8/src/execution/runtime-profiler.cc b/deps/v8/src/execution/runtime-profiler.cc index 8650867117795a..686fa23751c224 100644 --- a/deps/v8/src/execution/runtime-profiler.cc +++ b/deps/v8/src/execution/runtime-profiler.cc @@ -74,24 +74,52 @@ std::ostream& operator<<(std::ostream& os, OptimizationReason reason) { return os << OptimizationReasonToString(reason); } -RuntimeProfiler::RuntimeProfiler(Isolate* isolate) - : isolate_(isolate), any_ic_changed_(false) {} +namespace { + +void TraceInOptimizationQueue(JSFunction function) { + if (FLAG_trace_opt_verbose) { + PrintF("[function "); + function.PrintName(); + PrintF(" is already in optimization queue]\n"); + } +} + +void TraceHeuristicOptimizationDisallowed(JSFunction function) { + if (FLAG_trace_opt_verbose) { + PrintF("[function "); + function.PrintName(); + PrintF(" has been marked manually for optimization]\n"); + } +} -static void TraceRecompile(JSFunction function, const char* reason, - const char* type, Isolate* isolate) { +void TraceRecompile(JSFunction function, OptimizationReason reason, + Isolate* isolate) { if (FLAG_trace_opt) { CodeTracer::Scope scope(isolate->GetCodeTracer()); PrintF(scope.file(), "[marking "); function.ShortPrint(scope.file()); - PrintF(scope.file(), " for %s recompilation, reason: %s", type, reason); + PrintF(scope.file(), " for optimized recompilation, reason: %s", + OptimizationReasonToString(reason)); PrintF(scope.file(), "]\n"); } } +void TraceNCIRecompile(JSFunction function, OptimizationReason reason) { + if (FLAG_trace_turbo_nci) { + StdoutStream os; + os << "NCI tierup mark: " << Brief(function) << ", " + << OptimizationReasonToString(reason) << std::endl; + } +} + +} // namespace + +RuntimeProfiler::RuntimeProfiler(Isolate* isolate) + : isolate_(isolate), any_ic_changed_(false) {} + void RuntimeProfiler::Optimize(JSFunction function, OptimizationReason reason) { DCHECK_NE(reason, OptimizationReason::kDoNotOptimize); - TraceRecompile(function, OptimizationReasonToString(reason), "optimized", - isolate_); + TraceRecompile(function, reason, isolate_); function.MarkForOptimization(ConcurrencyMode::kConcurrent); } @@ -122,28 +150,21 @@ void RuntimeProfiler::AttemptOnStackReplacement(InterpretedFrame* frame, Min(level + loop_nesting_levels, AbstractCode::kMaxLoopNestingMarker)); } -void RuntimeProfiler::MaybeOptimize(JSFunction function, - InterpretedFrame* frame) { +void RuntimeProfiler::MaybeOptimizeInterpretedFrame(JSFunction function, + InterpretedFrame* frame) { if (function.IsInOptimizationQueue()) { - if (FLAG_trace_opt_verbose) { - PrintF("[function "); - function.PrintName(); - PrintF(" is already in optimization queue]\n"); - } + TraceInOptimizationQueue(function); return; } - if (FLAG_testing_d8_test_runner) { - if (!PendingOptimizationTable::IsHeuristicOptimizationAllowed(isolate_, - function)) { - if (FLAG_trace_opt_verbose) { - PrintF("[function "); - function.PrintName(); - PrintF(" has been marked manually for optimization]\n"); - } - return; - } + if (FLAG_testing_d8_test_runner && + !PendingOptimizationTable::IsHeuristicOptimizationAllowed(isolate_, + function)) { + TraceHeuristicOptimizationDisallowed(function); + return; } + if (function.shared().optimization_disabled()) return; + if (FLAG_always_osr) { AttemptOnStackReplacement(frame, AbstractCode::kMaxLoopNestingMarker); // Fall through and do a normal optimized compile as well. @@ -151,12 +172,38 @@ void RuntimeProfiler::MaybeOptimize(JSFunction function, return; } + OptimizationReason reason = + ShouldOptimize(function, function.shared().GetBytecodeArray()); + + if (reason != OptimizationReason::kDoNotOptimize) { + Optimize(function, reason); + } +} + +void RuntimeProfiler::MaybeOptimizeNCIFrame(JSFunction function) { + DCHECK_EQ(function.code().kind(), CodeKind::NATIVE_CONTEXT_INDEPENDENT); + + if (function.IsInOptimizationQueue()) { + TraceInOptimizationQueue(function); + return; + } + if (FLAG_testing_d8_test_runner && + !PendingOptimizationTable::IsHeuristicOptimizationAllowed(isolate_, + function)) { + TraceHeuristicOptimizationDisallowed(function); + return; + } + if (function.shared().optimization_disabled()) return; + // Note: We currently do not trigger OSR compilation from NCI code. + // TODO(jgruber,v8:8888): But we should. + OptimizationReason reason = ShouldOptimize(function, function.shared().GetBytecodeArray()); if (reason != OptimizationReason::kDoNotOptimize) { + TraceNCIRecompile(function, reason); Optimize(function, reason); } } @@ -190,7 +237,7 @@ bool RuntimeProfiler::MaybeOSR(JSFunction function, InterpretedFrame* frame) { OptimizationReason RuntimeProfiler::ShouldOptimize(JSFunction function, BytecodeArray bytecode) { - if (function.HasAvailableOptimizedCode()) { + if (function.ActiveTierIsTurbofan()) { return OptimizationReason::kDoNotOptimize; } int ticks = function.feedback_vector().profiler_ticks(); @@ -219,22 +266,24 @@ OptimizationReason RuntimeProfiler::ShouldOptimize(JSFunction function, return OptimizationReason::kDoNotOptimize; } -void RuntimeProfiler::MarkCandidatesForOptimizationFromBytecode() { - HandleScope scope(isolate_); - - if (!isolate_->use_optimizer()) return; - - DisallowHeapAllocation no_gc; +RuntimeProfiler::MarkCandidatesForOptimizationScope:: + MarkCandidatesForOptimizationScope(RuntimeProfiler* profiler) + : handle_scope_(profiler->isolate_), profiler_(profiler) { TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8.compile"), "V8.MarkCandidatesForOptimization"); +} + +RuntimeProfiler::MarkCandidatesForOptimizationScope:: + ~MarkCandidatesForOptimizationScope() { + profiler_->any_ic_changed_ = false; +} - // Run through the JavaScript frames and collect them. If we already - // have a sample of the function, we mark it for optimizations - // (eagerly or lazily). - int frame_count = 0; - int frame_count_limit = FLAG_frame_count; - for (JavaScriptFrameIterator it(isolate_); - frame_count++ < frame_count_limit && !it.done(); it.Advance()) { +void RuntimeProfiler::MarkCandidatesForOptimizationFromBytecode() { + if (!isolate_->use_optimizer()) return; + MarkCandidatesForOptimizationScope scope(this); + int i = 0; + for (JavaScriptFrameIterator it(isolate_); i < FLAG_frame_count && !it.done(); + i++, it.Advance()) { JavaScriptFrame* frame = it.frame(); if (!frame->is_interpreted()) continue; @@ -244,24 +293,35 @@ void RuntimeProfiler::MarkCandidatesForOptimizationFromBytecode() { if (!function.has_feedback_vector()) continue; - MaybeOptimize(function, InterpretedFrame::cast(frame)); + MaybeOptimizeInterpretedFrame(function, InterpretedFrame::cast(frame)); // TODO(leszeks): Move this increment to before the maybe optimize checks, // and update the tests to assume the increment has already happened. - int ticks = function.feedback_vector().profiler_ticks(); - if (ticks < Smi::kMaxValue) { - function.feedback_vector().set_profiler_ticks(ticks + 1); - } + function.feedback_vector().SaturatingIncrementProfilerTicks(); } - any_ic_changed_ = false; } void RuntimeProfiler::MarkCandidatesForOptimizationFromCode() { - if (FLAG_trace_turbo_nci) { - StdoutStream os; - os << "NCI tier-up: Marking candidates for optimization" << std::endl; + if (!isolate_->use_optimizer()) return; + MarkCandidatesForOptimizationScope scope(this); + int i = 0; + for (JavaScriptFrameIterator it(isolate_); i < FLAG_frame_count && !it.done(); + i++, it.Advance()) { + JavaScriptFrame* frame = it.frame(); + if (!frame->is_optimized()) continue; + + JSFunction function = frame->function(); + if (function.code().kind() != CodeKind::NATIVE_CONTEXT_INDEPENDENT) { + continue; + } + + DCHECK(function.shared().is_compiled()); + DCHECK(function.has_feedback_vector()); + + function.feedback_vector().SaturatingIncrementProfilerTicks(); + + MaybeOptimizeNCIFrame(function); } - // TODO(jgruber,v8:8888): Implement. } } // namespace internal diff --git a/deps/v8/src/execution/runtime-profiler.h b/deps/v8/src/execution/runtime-profiler.h index 0ab1b29ac18653..d7125ef73c1ac4 100644 --- a/deps/v8/src/execution/runtime-profiler.h +++ b/deps/v8/src/execution/runtime-profiler.h @@ -5,6 +5,8 @@ #ifndef V8_EXECUTION_RUNTIME_PROFILER_H_ #define V8_EXECUTION_RUNTIME_PROFILER_H_ +#include "src/common/assert-scope.h" +#include "src/handles/handles.h" #include "src/utils/allocation.h" namespace v8 { @@ -31,7 +33,11 @@ class RuntimeProfiler { int nesting_levels = 1); private: - void MaybeOptimize(JSFunction function, InterpretedFrame* frame); + // Make the decision whether to optimize the given function, and mark it for + // optimization if the decision was 'yes'. + void MaybeOptimizeNCIFrame(JSFunction function); + void MaybeOptimizeInterpretedFrame(JSFunction function, + InterpretedFrame* frame); // Potentially attempts OSR from and returns whether no other // optimization attempts should be made. bool MaybeOSR(JSFunction function, InterpretedFrame* frame); @@ -40,6 +46,17 @@ class RuntimeProfiler { void Optimize(JSFunction function, OptimizationReason reason); void Baseline(JSFunction function, OptimizationReason reason); + class MarkCandidatesForOptimizationScope final { + public: + explicit MarkCandidatesForOptimizationScope(RuntimeProfiler* profiler); + ~MarkCandidatesForOptimizationScope(); + + private: + HandleScope handle_scope_; + RuntimeProfiler* const profiler_; + DisallowHeapAllocation no_gc; + }; + Isolate* isolate_; bool any_ic_changed_; }; diff --git a/deps/v8/src/execution/s390/frame-constants-s390.h b/deps/v8/src/execution/s390/frame-constants-s390.h index 0893fffedf394b..282bd673cd8f38 100644 --- a/deps/v8/src/execution/s390/frame-constants-s390.h +++ b/deps/v8/src/execution/s390/frame-constants-s390.h @@ -14,8 +14,8 @@ namespace internal { class EntryFrameConstants : public AllStatic { public: - static constexpr int kCallerFPOffset = - -(StandardFrameConstants::kFixedFrameSizeFromFp + kSystemPointerSize); + static constexpr int kCallerFPOffset = -3 * kSystemPointerSize; + // Stack offsets for arguments passed to JSEntry. static constexpr int kArgvOffset = 20 * kSystemPointerSize; }; diff --git a/deps/v8/src/execution/s390/simulator-s390.cc b/deps/v8/src/execution/s390/simulator-s390.cc index 9ace63a0094d39..3c30c8758387ac 100644 --- a/deps/v8/src/execution/s390/simulator-s390.cc +++ b/deps/v8/src/execution/s390/simulator-s390.cc @@ -3407,7 +3407,7 @@ template void VectorUnpackHigh(void* dst, void* src) { D value = 0; for (size_t i = 0; i < kSimd128Size / sizeof(D); i++) { - value = *(reinterpret_cast(src) + i + (sizeof(S) / 2)); + value = *(reinterpret_cast(src) + i); memcpy(reinterpret_cast(dst) + i, &value, sizeof(D)); } } @@ -3463,9 +3463,10 @@ EVALUATE(VUPLH) { template void VectorUnpackLow(void* dst, void* src) { D value = 0; - for (size_t i = kSimd128Size / sizeof(D); i > 0; i--) { - value = *(reinterpret_cast(src) + i - 1); - memcpy(reinterpret_cast(dst) + i - 1, &value, sizeof(D)); + size_t count = kSimd128Size / sizeof(D); + for (size_t i = 0; i < count; i++) { + value = *(reinterpret_cast(src) + i + count); + memcpy(reinterpret_cast(dst) + i, &value, sizeof(D)); } } diff --git a/deps/v8/src/execution/thread-local-top.cc b/deps/v8/src/execution/thread-local-top.cc index cb69fb56efb38d..84d3432aec0f48 100644 --- a/deps/v8/src/execution/thread-local-top.cc +++ b/deps/v8/src/execution/thread-local-top.cc @@ -19,6 +19,10 @@ void ThreadLocalTop::Initialize(Isolate* isolate) { thread_id_ = ThreadId::Current(); thread_in_wasm_flag_address_ = reinterpret_cast
( trap_handler::GetThreadInWasmThreadLocalAddress()); + +#ifdef V8_ENABLE_CONSERVATIVE_STACK_SCANNING + stack_ = ::heap::base::Stack(base::Stack::GetStackStart()); +#endif } void ThreadLocalTop::Free() { diff --git a/deps/v8/src/execution/thread-local-top.h b/deps/v8/src/execution/thread-local-top.h index 57166299c566fd..d48371a362db14 100644 --- a/deps/v8/src/execution/thread-local-top.h +++ b/deps/v8/src/execution/thread-local-top.h @@ -10,6 +10,10 @@ #include "src/objects/contexts.h" #include "src/utils/utils.h" +#ifdef V8_ENABLE_CONSERVATIVE_STACK_SCANNING +#include "src/heap/base/stack.h" +#endif + namespace v8 { class TryCatch; @@ -26,7 +30,11 @@ class ThreadLocalTop { // TODO(all): This is not particularly beautiful. We should probably // refactor this to really consist of just Addresses and 32-bit // integer fields. +#ifdef V8_ENABLE_CONSERVATIVE_STACK_SCANNING + static constexpr uint32_t kSizeInBytes = 25 * kSystemPointerSize; +#else static constexpr uint32_t kSizeInBytes = 24 * kSystemPointerSize; +#endif // Does early low-level initialization that does not depend on the // isolate being present. @@ -142,6 +150,10 @@ class ThreadLocalTop { // Address of the thread-local "thread in wasm" flag. Address thread_in_wasm_flag_address_ = kNullAddress; + +#ifdef V8_ENABLE_CONSERVATIVE_STACK_SCANNING + ::heap::base::Stack stack_ = ::heap::base::Stack(nullptr); +#endif }; } // namespace internal diff --git a/deps/v8/src/execution/v8threads.cc b/deps/v8/src/execution/v8threads.cc index e16988b27529c7..a320f427453bd6 100644 --- a/deps/v8/src/execution/v8threads.cc +++ b/deps/v8/src/execution/v8threads.cc @@ -128,8 +128,10 @@ bool ThreadManager::RestoreThread() { from = isolate_->handle_scope_implementer()->RestoreThread(from); from = isolate_->RestoreThread(from); from = Relocatable::RestoreState(isolate_, from); - from = isolate_->debug()->RestoreDebug(from); + // Stack guard should be restored before Debug, etc. since Debug etc. might + // depend on a correct stack guard. from = isolate_->stack_guard()->RestoreStackGuard(from); + from = isolate_->debug()->RestoreDebug(from); from = isolate_->regexp_stack()->RestoreStack(from); from = isolate_->bootstrapper()->RestoreState(from); per_thread->set_thread_state(nullptr); @@ -262,8 +264,8 @@ void ThreadManager::EagerlyArchiveThread() { to = isolate_->handle_scope_implementer()->ArchiveThread(to); to = isolate_->ArchiveThread(to); to = Relocatable::ArchiveState(isolate_, to); - to = isolate_->debug()->ArchiveDebug(to); to = isolate_->stack_guard()->ArchiveStackGuard(to); + to = isolate_->debug()->ArchiveDebug(to); to = isolate_->regexp_stack()->ArchiveStack(to); to = isolate_->bootstrapper()->ArchiveState(to); lazily_archived_thread_ = ThreadId::Invalid(); diff --git a/deps/v8/src/execution/v8threads.h b/deps/v8/src/execution/v8threads.h index c59b5ccee38cb7..ccaa6b1befb85b 100644 --- a/deps/v8/src/execution/v8threads.h +++ b/deps/v8/src/execution/v8threads.h @@ -73,6 +73,9 @@ class ThreadManager { bool IsLockedByCurrentThread() const { return mutex_owner_.load(std::memory_order_relaxed) == ThreadId::Current(); } + bool IsLockedByThread(ThreadId id) const { + return mutex_owner_.load(std::memory_order_relaxed) == id; + } ThreadId CurrentId(); diff --git a/deps/v8/src/flags/flag-definitions.h b/deps/v8/src/flags/flag-definitions.h index 35b055b42d7840..ab689283e970a7 100644 --- a/deps/v8/src/flags/flag-definitions.h +++ b/deps/v8/src/flags/flag-definitions.h @@ -15,6 +15,11 @@ #define DEFINE_IMPLICATION(whenflag, thenflag) \ DEFINE_VALUE_IMPLICATION(whenflag, thenflag, true) +// A weak implication will be overwritten by a normal implication or by an +// explicit flag. +#define DEFINE_WEAK_IMPLICATION(whenflag, thenflag) \ + DEFINE_WEAK_VALUE_IMPLICATION(whenflag, thenflag, true) + #define DEFINE_NEG_IMPLICATION(whenflag, thenflag) \ DEFINE_VALUE_IMPLICATION(whenflag, thenflag, false) @@ -59,14 +64,22 @@ // We produce the code to set flags when it is implied by another flag. #elif defined(FLAG_MODE_DEFINE_IMPLICATIONS) -#define DEFINE_VALUE_IMPLICATION(whenflag, thenflag, value) \ - if (FLAG_##whenflag) FLAG_##thenflag = value; +#define DEFINE_VALUE_IMPLICATION(whenflag, thenflag, value) \ + changed |= TriggerImplication(FLAG_##whenflag, #whenflag, &FLAG_##thenflag, \ + value, false); + +// A weak implication will be overwritten by a normal implication or by an +// explicit flag. +#define DEFINE_WEAK_VALUE_IMPLICATION(whenflag, thenflag, value) \ + changed |= TriggerImplication(FLAG_##whenflag, #whenflag, &FLAG_##thenflag, \ + value, true); #define DEFINE_GENERIC_IMPLICATION(whenflag, statement) \ if (FLAG_##whenflag) statement; -#define DEFINE_NEG_VALUE_IMPLICATION(whenflag, thenflag, value) \ - if (!FLAG_##whenflag) FLAG_##thenflag = value; +#define DEFINE_NEG_VALUE_IMPLICATION(whenflag, thenflag, value) \ + changed |= TriggerImplication(!FLAG_##whenflag, #whenflag, &FLAG_##thenflag, \ + value, false); // We apply a generic macro to the flags. #elif defined(FLAG_MODE_APPLY) @@ -94,6 +107,10 @@ #define DEFINE_VALUE_IMPLICATION(whenflag, thenflag, value) #endif +#ifndef DEFINE_WEAK_VALUE_IMPLICATION +#define DEFINE_WEAK_VALUE_IMPLICATION(whenflag, thenflag, value) +#endif + #ifndef DEFINE_GENERIC_IMPLICATION #define DEFINE_GENERIC_IMPLICATION(whenflag, statement) #endif @@ -203,6 +220,20 @@ struct MaybeBoolFlag { // #define FLAG FLAG_FULL +// ATTENTION: This is set to true by default in d8. But for API compatibility, +// it generally defaults to false. +DEFINE_BOOL(abort_on_contradictory_flags, false, + "Disallow flags or implications overriding each other.") +// This implication is also hard-coded into the flags processing to make sure it +// becomes active before we even process subsequent flags. +DEFINE_NEG_IMPLICATION(fuzzing, abort_on_contradictory_flags) +// This is not really a flag, it affects the interpretation of the next flag but +// doesn't become permanently true when specified. This only works for flags +// defined in this file, but not for d8 flags defined in src/d8/d8.cc. +DEFINE_BOOL(allow_overwriting_for_next_flag, false, + "temporary disable flag contradiction to allow overwriting just " + "the next flag") + // Flags for language modes and experimental language features. DEFINE_BOOL(use_strict, false, "enforce strict mode") @@ -234,16 +265,14 @@ DEFINE_IMPLICATION(harmony_weak_refs_with_cleanup_some, harmony_weak_refs) #endif // Features that are complete (but still behind --harmony/es-staging flag). -#define HARMONY_STAGED_BASE(V) \ - V(harmony_top_level_await, "harmony top level await") \ - V(harmony_atomics_waitasync, "harmony Atomics.waitAsync") +#define HARMONY_STAGED_BASE(V) \ + V(harmony_top_level_await, "harmony top level await") #ifdef V8_INTL_SUPPORT -#define HARMONY_STAGED(V) \ - HARMONY_STAGED_BASE(V) \ - V(harmony_intl_dateformat_day_period, \ - "Add dayPeriod option to DateTimeFormat") \ - V(harmony_intl_segmenter, "Intl.Segmenter") +#define HARMONY_STAGED(V) \ + HARMONY_STAGED_BASE(V) \ + V(harmony_intl_dateformat_day_period, \ + "Add dayPeriod option to DateTimeFormat") #else #define HARMONY_STAGED(V) HARMONY_STAGED_BASE(V) #endif @@ -253,6 +282,7 @@ DEFINE_IMPLICATION(harmony_weak_refs_with_cleanup_some, harmony_weak_refs) V(harmony_namespace_exports, \ "harmony namespace exports (export * as foo from 'bar')") \ V(harmony_sharedarraybuffer, "harmony sharedarraybuffer") \ + V(harmony_atomics, "harmony atomics") \ V(harmony_import_meta, "harmony import.meta property") \ V(harmony_dynamic_import, "harmony dynamic import") \ V(harmony_promise_all_settled, "harmony Promise.allSettled") \ @@ -260,9 +290,16 @@ DEFINE_IMPLICATION(harmony_weak_refs_with_cleanup_some, harmony_weak_refs) V(harmony_private_methods, "harmony private methods in class literals") \ V(harmony_weak_refs, "harmony weak references") \ V(harmony_string_replaceall, "harmony String.prototype.replaceAll") \ - V(harmony_logical_assignment, "harmony logical assignment") + V(harmony_logical_assignment, "harmony logical assignment") \ + V(harmony_atomics_waitasync, "harmony Atomics.waitAsync") +#ifdef V8_INTL_SUPPORT +#define HARMONY_SHIPPING(V) \ + HARMONY_SHIPPING_BASE(V) \ + V(harmony_intl_segmenter, "Intl.Segmenter") +#else #define HARMONY_SHIPPING(V) HARMONY_SHIPPING_BASE(V) +#endif // Once a shipping feature has proved stable in the wild, it will be dropped // from HARMONY_SHIPPING, all occurrences of the FLAG_ variable are removed, @@ -368,6 +405,15 @@ DEFINE_BOOL_READONLY( DEFINE_NEG_IMPLICATION(single_generation, inline_new) DEFINE_NEG_IMPLICATION(single_generation, turbo_allocation_folding) +#ifdef V8_ENABLE_CONSERVATIVE_STACK_SCANNING +#define V8_ENABLE_CONSERVATIVE_STACK_SCANNING_BOOL true +#else +#define V8_ENABLE_CONSERVATIVE_STACK_SCANNING_BOOL false +#endif +DEFINE_BOOL_READONLY(conservative_stack_scanning, + V8_ENABLE_CONSERVATIVE_STACK_SCANNING_BOOL, + "use conservative stack scanning") + #ifdef V8_ENABLE_FUTURE #define FUTURE_BOOL true #else @@ -377,7 +423,28 @@ DEFINE_BOOL(future, FUTURE_BOOL, "Implies all staged features that we want to ship in the " "not-too-far future") -DEFINE_IMPLICATION(future, write_protect_code_memory) +DEFINE_WEAK_IMPLICATION(future, write_protect_code_memory) +DEFINE_WEAK_IMPLICATION(future, finalize_streaming_on_background) + +// Flags for jitless +DEFINE_BOOL(jitless, V8_LITE_BOOL, + "Disable runtime allocation of executable memory.") + +// Jitless V8 has a few implications: +DEFINE_NEG_IMPLICATION(jitless, opt) +// Field representation tracking is only used by TurboFan. +DEFINE_NEG_IMPLICATION(jitless, track_field_types) +DEFINE_NEG_IMPLICATION(jitless, track_heap_object_fields) +// Regexps are interpreted. +DEFINE_IMPLICATION(jitless, regexp_interpret_all) +// asm.js validation is disabled since it triggers wasm code generation. +DEFINE_NEG_IMPLICATION(jitless, validate_asm) +// --jitless also implies --no-expose-wasm, see InitializeOncePerProcessImpl. + +#ifndef V8_TARGET_ARCH_ARM +// Unsupported on arm. See https://crbug.com/v8/8713. +DEFINE_NEG_IMPLICATION(jitless, interpreted_frames_native_stack) +#endif DEFINE_BOOL(assert_types, false, "generate runtime type assertions to test the typer") @@ -430,26 +497,6 @@ DEFINE_BOOL_READONLY(string_slices, true, "use string slices") DEFINE_INT(interrupt_budget, 144 * KB, "interrupt budget which should be used for the profiler counter") -// Flags for jitless -DEFINE_BOOL(jitless, V8_LITE_BOOL, - "Disable runtime allocation of executable memory.") - -// Jitless V8 has a few implications: -DEFINE_NEG_IMPLICATION(jitless, opt) -// Field representation tracking is only used by TurboFan. -DEFINE_NEG_IMPLICATION(jitless, track_field_types) -DEFINE_NEG_IMPLICATION(jitless, track_heap_object_fields) -// Regexps are interpreted. -DEFINE_IMPLICATION(jitless, regexp_interpret_all) -// asm.js validation is disabled since it triggers wasm code generation. -DEFINE_NEG_IMPLICATION(jitless, validate_asm) -// --jitless also implies --no-expose-wasm, see InitializeOncePerProcessImpl. - -#ifndef V8_TARGET_ARCH_ARM -// Unsupported on arm. See https://crbug.com/v8/8713. -DEFINE_NEG_IMPLICATION(jitless, interpreted_frames_native_stack) -#endif - // Flags for inline caching and feedback vectors. DEFINE_BOOL(use_ic, true, "use inline caching") DEFINE_INT(budget_for_feedback_vector_allocation, 1 * KB, @@ -508,6 +555,8 @@ DEFINE_IMPLICATION(turboprop, concurrent_inlining) DEFINE_VALUE_IMPLICATION(turboprop, interrupt_budget, 15 * KB) DEFINE_VALUE_IMPLICATION(turboprop, reuse_opt_code_count, 2) DEFINE_IMPLICATION(turboprop, dynamic_map_checks) +DEFINE_UINT_READONLY(max_minimorphic_map_checks, 4, + "max number of map checks to perform in minimorphic state") // Flags for concurrent recompilation. DEFINE_BOOL(concurrent_recompilation, true, @@ -522,9 +571,12 @@ DEFINE_BOOL(block_concurrent_recompilation, false, "block queued jobs until released") DEFINE_BOOL(concurrent_inlining, false, "run optimizing compiler's inlining phase on a separate thread") +DEFINE_BOOL(turbo_direct_heap_access, false, + "access kNeverSerialized objects directly from the heap") +DEFINE_IMPLICATION(concurrent_inlining, turbo_direct_heap_access) DEFINE_INT(max_serializer_nesting, 25, "maximum levels for nesting child serializers") -DEFINE_IMPLICATION(future, concurrent_inlining) +DEFINE_WEAK_IMPLICATION(future, concurrent_inlining) DEFINE_BOOL(trace_heap_broker_verbose, false, "trace the heap broker verbosely (all reports)") DEFINE_BOOL(trace_heap_broker_memory, false, @@ -544,8 +596,6 @@ DEFINE_BOOL(print_deopt_stress, false, "print number of possible deopt points") DEFINE_BOOL(opt, true, "use adaptive optimizations") DEFINE_BOOL(turbo_sp_frame_access, false, "use stack pointer-relative access to frame wherever possible") -DEFINE_BOOL(turbo_control_flow_aware_allocation, true, - "consider control flow while allocating registers") DEFINE_BOOL( stress_turbo_late_spilling, false, "optimize placement of all spill instructions, not just loop-top phis") @@ -683,9 +733,8 @@ DEFINE_BOOL(turbo_nci, false, // TODO(v8:8888): Temporary until NCI caching is implemented or // feedback collection is made unconditional. DEFINE_IMPLICATION(turbo_nci, turbo_collect_feedback_in_generic_lowering) -DEFINE_BOOL(turbo_nci_as_highest_tier, false, - "replace default TF with NCI code as the highest tier for testing " - "purposes.") +DEFINE_BOOL(turbo_nci_as_midtier, false, + "insert NCI as a midtier compiler for testing purposes.") DEFINE_BOOL(print_nci_code, false, "print native context independent code.") DEFINE_BOOL(trace_turbo_nci, false, "trace native context independent code.") DEFINE_BOOL(turbo_collect_feedback_in_generic_lowering, true, @@ -710,8 +759,6 @@ DEFINE_BOOL(untrusted_code_mitigations, V8_DEFAULT_UNTRUSTED_CODE_MITIGATIONS, DEFINE_BOOL(wasm_generic_wrapper, false, "use generic js-to-wasm wrapper instead of per-signature wrappers") DEFINE_BOOL(expose_wasm, true, "expose wasm interface to JavaScript") -DEFINE_BOOL(assume_asmjs_origin, false, - "force wasm decoder to assume input is internal asm-wasm format") DEFINE_INT(wasm_num_compilation_tasks, 128, "maximum number of parallel compilation tasks for wasm") DEFINE_DEBUG_BOOL(trace_wasm_native_heap, false, @@ -725,9 +772,7 @@ DEFINE_BOOL(wasm_async_compilation, true, DEFINE_BOOL(wasm_test_streaming, false, "use streaming compilation instead of async compilation for tests") DEFINE_UINT(wasm_max_mem_pages, v8::internal::wasm::kSpecMaxMemoryPages, - "maximum initial number of 64KiB memory pages of a wasm instance") -DEFINE_UINT(wasm_max_mem_pages_growth, v8::internal::wasm::kSpecMaxMemoryPages, - "maximum number of 64KiB pages a Wasm memory can grow to") + "maximum number of 64KiB memory pages per wasm memory") DEFINE_UINT(wasm_max_table_size, v8::internal::wasm::kV8MaxWasmTableSize, "maximum table size of a wasm instance") DEFINE_UINT(wasm_max_code_space, v8::internal::kMaxWasmCodeMB, @@ -748,6 +793,8 @@ DEFINE_INT(trace_wasm_ast_start, 0, DEFINE_INT(trace_wasm_ast_end, 0, "end function for wasm AST trace (exclusive)") DEFINE_BOOL(liftoff, true, "enable Liftoff, the baseline compiler for WebAssembly") +DEFINE_BOOL(liftoff_extern_ref, false, + "enable support for externref in Liftoff") // We can't tier up (from Liftoff to TurboFan) in single-threaded mode, hence // disable Liftoff in that configuration for now. The alternative is disabling // TurboFan, which would reduce peak performance considerably. @@ -952,13 +999,18 @@ DEFINE_BOOL(concurrent_marking, V8_CONCURRENT_MARKING_BOOL, "use concurrent marking") DEFINE_BOOL(concurrent_array_buffer_sweeping, true, "concurrently sweep array buffers") -DEFINE_BOOL(concurrent_allocation, false, "concurrently allocate in old space") -DEFINE_BOOL(local_heaps, false, "allow heap access from background tasks") -DEFINE_IMPLICATION(concurrent_inlining, local_heaps) +DEFINE_BOOL(concurrent_allocation, true, "concurrently allocate in old space") DEFINE_BOOL(stress_concurrent_allocation, false, "start background threads that allocate memory") -DEFINE_IMPLICATION(stress_concurrent_allocation, concurrent_allocation) -DEFINE_IMPLICATION(stress_concurrent_allocation, local_heaps) +DEFINE_BOOL(local_heaps, true, "allow heap access from background tasks") +// Since the local_heaps flag is enabled by default, we defined reverse +// implications to simplify disabling the flag. +DEFINE_NEG_NEG_IMPLICATION(local_heaps, turbo_direct_heap_access) +DEFINE_NEG_NEG_IMPLICATION(local_heaps, concurrent_inlining) +DEFINE_NEG_NEG_IMPLICATION(local_heaps, concurrent_allocation) +DEFINE_NEG_NEG_IMPLICATION(concurrent_allocation, + finalize_streaming_on_background) +DEFINE_NEG_NEG_IMPLICATION(concurrent_allocation, stress_concurrent_allocation) DEFINE_BOOL(parallel_marking, V8_CONCURRENT_MARKING_BOOL, "use parallel marking in atomic pause") DEFINE_INT(ephemeron_fixpoint_iterations, 10, @@ -1065,8 +1117,8 @@ DEFINE_INT(stress_marking, 0, DEFINE_INT(stress_scavenge, 0, "force scavenge at random points between 0 and X (inclusive) " "percent of the new space capacity") -DEFINE_IMPLICATION(fuzzer_gc_analysis, stress_marking) -DEFINE_IMPLICATION(fuzzer_gc_analysis, stress_scavenge) +DEFINE_VALUE_IMPLICATION(fuzzer_gc_analysis, stress_marking, 99) +DEFINE_VALUE_IMPLICATION(fuzzer_gc_analysis, stress_scavenge, 99) DEFINE_BOOL( reclaim_unmodified_wrappers, true, "reclaim otherwise unreachable unmodified wrapper objects when possible") @@ -1154,8 +1206,6 @@ DEFINE_BOOL(stress_background_compile, false, DEFINE_BOOL( finalize_streaming_on_background, false, "perform the script streaming finalization on the background thread") -DEFINE_IMPLICATION(finalize_streaming_on_background, concurrent_allocation) -DEFINE_IMPLICATION(finalize_streaming_on_background, local_heaps) DEFINE_BOOL(disable_old_api_accessors, false, "Disable old-style API accessors whose setters trigger through the " "prototype chain") @@ -1201,11 +1251,14 @@ DEFINE_BOOL(trace_wasm, false, "trace wasm function calls") DEFINE_BOOL(lazy, true, "use lazy compilation") DEFINE_BOOL(max_lazy, false, "ignore eager compilation hints") DEFINE_IMPLICATION(max_lazy, lazy) -DEFINE_BOOL(trace_opt, false, "trace lazy optimization") -DEFINE_BOOL(trace_opt_verbose, false, "extra verbose compilation tracing") +DEFINE_BOOL(trace_opt, false, "trace optimized compilation") +DEFINE_BOOL(trace_opt_verbose, false, + "extra verbose optimized compilation tracing") DEFINE_IMPLICATION(trace_opt_verbose, trace_opt) -DEFINE_BOOL(trace_opt_stats, false, "trace lazy optimization statistics") -DEFINE_BOOL(trace_deopt, false, "trace optimize function deoptimization") +DEFINE_BOOL(trace_opt_stats, false, "trace optimized compilation statistics") +DEFINE_BOOL(trace_deopt, false, "trace deoptimization") +DEFINE_BOOL(trace_deopt_verbose, false, "extra verbose deoptimization tracing") +DEFINE_IMPLICATION(trace_deopt_verbose, trace_deopt) DEFINE_BOOL(trace_file_names, false, "include file names in trace-opt/trace-deopt output") DEFINE_BOOL(always_opt, false, "always try to optimize functions") @@ -1292,6 +1345,8 @@ DEFINE_INT(max_valid_polymorphic_map_count, 4, DEFINE_BOOL(native_code_counters, DEBUG_BOOL, "generate extra code for manipulating stats counters") +DEFINE_BOOL(super_ic, false, "use an IC for super property loads") + // objects.cc DEFINE_BOOL(thin_strings, true, "Enable ThinString support") DEFINE_BOOL(trace_prototype_users, false, @@ -1608,6 +1663,11 @@ DEFINE_BOOL(trace_wasm_gdb_remote, false, "trace Webassembly GDB-remote server") #define FLAG FLAG_FULL // log.cc +DEFINE_STRING(logfile, "v8.log", + "Specify the name of the log file, use '-' for console, '+' for " + "a temporary file.") +DEFINE_BOOL(logfile_per_isolate, true, "Separate log files for each isolate.") + DEFINE_BOOL(log, false, "Minimal logging (no API, code, GC, suspect, or handles samples).") DEFINE_BOOL(log_all, false, "Log all events to the log file.") @@ -1620,8 +1680,13 @@ DEFINE_BOOL(log_source_code, false, "Log source code.") DEFINE_BOOL(log_function_events, false, "Log function events " "(parse, compile, execute) separately.") -DEFINE_BOOL(prof, false, - "Log statistical profiling information (implies --log-code).") + +DEFINE_IMPLICATION(log_all, log_api) +DEFINE_IMPLICATION(log_all, log_code) +DEFINE_IMPLICATION(log_all, log_suspect) +DEFINE_IMPLICATION(log_all, log_handles) +DEFINE_IMPLICATION(log_all, log_internal_timer_events) +DEFINE_IMPLICATION(log_all, log_function_events) DEFINE_BOOL(detailed_line_info, false, "Always generate detailed line information for CPU profiling.") @@ -1638,11 +1703,14 @@ DEFINE_INT(prof_sampling_interval, DEFAULT_PROF_SAMPLING_INTERVAL, #undef DEFAULT_PROF_SAMPLING_INTERVAL DEFINE_BOOL(prof_cpp, false, "Like --prof, but ignore generated code.") -DEFINE_IMPLICATION(prof, prof_cpp) DEFINE_BOOL(prof_browser_mode, true, "Used with --prof, turns on browser-compatible mode for profiling.") -DEFINE_STRING(logfile, "v8.log", "Specify the name of the log file.") -DEFINE_BOOL(logfile_per_isolate, true, "Separate log files for each isolate.") + +DEFINE_BOOL(prof, false, + "Log statistical profiling information (implies --log-code).") +DEFINE_IMPLICATION(prof, prof_cpp) +DEFINE_IMPLICATION(prof, log_code) + DEFINE_BOOL(ll_prof, false, "Enable low-level linux profiler.") #if V8_OS_LINUX @@ -1854,9 +1922,11 @@ DEFINE_IMPLICATION(unbox_double_fields, track_double_fields) #undef DEFINE_STRING #undef DEFINE_FLOAT #undef DEFINE_IMPLICATION +#undef DEFINE_WEAK_IMPLICATION #undef DEFINE_NEG_IMPLICATION #undef DEFINE_NEG_VALUE_IMPLICATION #undef DEFINE_VALUE_IMPLICATION +#undef DEFINE_WEAK_VALUE_IMPLICATION #undef DEFINE_GENERIC_IMPLICATION #undef DEFINE_ALIAS_BOOL #undef DEFINE_ALIAS_INT diff --git a/deps/v8/src/flags/flags.cc b/deps/v8/src/flags/flags.cc index a5dfb543d52472..f9f74b009b8851 100644 --- a/deps/v8/src/flags/flags.cc +++ b/deps/v8/src/flags/flags.cc @@ -8,9 +8,11 @@ #include #include #include +#include #include #include "src/base/functional.h" +#include "src/base/logging.h" #include "src/base/platform/platform.h" #include "src/codegen/cpu-features.h" #include "src/logging/counters.h" @@ -33,6 +35,10 @@ namespace internal { namespace { +struct Flag; +Flag* FindFlagByPointer(const void* ptr); +Flag* FindFlagByName(const char* name); + // This structure represents a single entry in the flag system, with a pointer // to the actual flag, default value, comment, etc. This is designed to be POD // initialized as to avoid requiring static constructors. @@ -48,12 +54,16 @@ struct Flag { TYPE_STRING, }; + enum class SetBy { kDefault, kWeakImplication, kImplication, kCommandLine }; + FlagType type_; // What type of flag, bool, int, or string. const char* name_; // Name of the flag, ex "my_flag". void* valptr_; // Pointer to the global flag variable. const void* defptr_; // Pointer to the default value. const char* cmt_; // A comment about the flags purpose. bool owns_ptr_; // Does the flag own its string value? + SetBy set_by_ = SetBy::kDefault; + const char* implied_by_ = nullptr; FlagType type() const { return type_; } @@ -61,39 +71,90 @@ struct Flag { const char* comment() const { return cmt_; } - bool* bool_variable() const { + bool PointsTo(const void* ptr) const { return valptr_ == ptr; } + + bool bool_variable() const { + DCHECK(type_ == TYPE_BOOL); + return *reinterpret_cast(valptr_); + } + + void set_bool_variable(bool value, SetBy set_by) { DCHECK(type_ == TYPE_BOOL); - return reinterpret_cast(valptr_); + bool change_flag = *reinterpret_cast(valptr_) != value; + change_flag = CheckFlagChange(set_by, change_flag); + if (change_flag) *reinterpret_cast(valptr_) = value; } - MaybeBoolFlag* maybe_bool_variable() const { + MaybeBoolFlag maybe_bool_variable() const { DCHECK(type_ == TYPE_MAYBE_BOOL); - return reinterpret_cast(valptr_); + return *reinterpret_cast(valptr_); + } + + void set_maybe_bool_variable(MaybeBoolFlag value, SetBy set_by) { + DCHECK(type_ == TYPE_MAYBE_BOOL); + bool change_flag = *reinterpret_cast(valptr_) != value; + change_flag = CheckFlagChange(set_by, change_flag); + if (change_flag) *reinterpret_cast(valptr_) = value; + } + + int int_variable() const { + DCHECK(type_ == TYPE_INT); + return *reinterpret_cast(valptr_); } - int* int_variable() const { + void set_int_variable(int value, SetBy set_by) { DCHECK(type_ == TYPE_INT); - return reinterpret_cast(valptr_); + bool change_flag = *reinterpret_cast(valptr_) != value; + change_flag = CheckFlagChange(set_by, change_flag); + if (change_flag) *reinterpret_cast(valptr_) = value; + } + + unsigned int uint_variable() const { + DCHECK(type_ == TYPE_UINT); + return *reinterpret_cast(valptr_); } - unsigned int* uint_variable() const { + void set_uint_variable(unsigned int value, SetBy set_by) { DCHECK(type_ == TYPE_UINT); - return reinterpret_cast(valptr_); + bool change_flag = *reinterpret_cast(valptr_) != value; + change_flag = CheckFlagChange(set_by, change_flag); + if (change_flag) *reinterpret_cast(valptr_) = value; } - uint64_t* uint64_variable() const { + uint64_t uint64_variable() const { DCHECK(type_ == TYPE_UINT64); - return reinterpret_cast(valptr_); + return *reinterpret_cast(valptr_); } - double* float_variable() const { + void set_uint64_variable(uint64_t value, SetBy set_by) { + DCHECK(type_ == TYPE_UINT64); + bool change_flag = *reinterpret_cast(valptr_) != value; + change_flag = CheckFlagChange(set_by, change_flag); + if (change_flag) *reinterpret_cast(valptr_) = value; + } + + double float_variable() const { DCHECK(type_ == TYPE_FLOAT); - return reinterpret_cast(valptr_); + return *reinterpret_cast(valptr_); } - size_t* size_t_variable() const { + void set_float_variable(double value, SetBy set_by) { + DCHECK(type_ == TYPE_FLOAT); + bool change_flag = *reinterpret_cast(valptr_) != value; + change_flag = CheckFlagChange(set_by, change_flag); + if (change_flag) *reinterpret_cast(valptr_) = value; + } + + size_t size_t_variable() const { DCHECK(type_ == TYPE_SIZE_T); - return reinterpret_cast(valptr_); + return *reinterpret_cast(valptr_); + } + + void set_size_t_variable(size_t value, SetBy set_by) { + DCHECK(type_ == TYPE_SIZE_T); + bool change_flag = *reinterpret_cast(valptr_) != value; + change_flag = CheckFlagChange(set_by, change_flag); + if (change_flag) *reinterpret_cast(valptr_) = value; } const char* string_value() const { @@ -101,12 +162,19 @@ struct Flag { return *reinterpret_cast(valptr_); } - void set_string_value(const char* value, bool owns_ptr) { + void set_string_value(const char* value, bool owns_ptr, SetBy set_by) { DCHECK(type_ == TYPE_STRING); const char** ptr = reinterpret_cast(valptr_); - if (owns_ptr_ && *ptr != nullptr) DeleteArray(*ptr); - *ptr = value; - owns_ptr_ = owns_ptr; + bool change_flag = (*ptr == nullptr) != (value == nullptr) || + (*ptr && value && std::strcmp(*ptr, value) != 0); + change_flag = CheckFlagChange(set_by, change_flag); + if (change_flag) { + if (owns_ptr_ && *ptr != nullptr) DeleteArray(*ptr); + *ptr = value; + owns_ptr_ = owns_ptr; + } else { + if (owns_ptr && value != nullptr) DeleteArray(value); + } } bool bool_default() const { @@ -144,23 +212,110 @@ struct Flag { return *reinterpret_cast(defptr_); } + static bool ShouldCheckFlagContradictions() { + if (FLAG_allow_overwriting_for_next_flag) { + // Setting the flag manually to false before calling Reset() avoids this + // becoming re-entrant. + FLAG_allow_overwriting_for_next_flag = false; + FindFlagByPointer(&FLAG_allow_overwriting_for_next_flag)->Reset(); + return false; + } + return FLAG_abort_on_contradictory_flags && !FLAG_fuzzing; + } + + // {change_flag} indicates if we're going to change the flag value. + // Returns an updated value for {change_flag}, which is changed to false if a + // weak implication is being ignored beause a flag is already set by a normal + // implication or from the command-line. + bool CheckFlagChange(SetBy new_set_by, bool change_flag, + const char* implied_by = nullptr) { + if (new_set_by == SetBy::kWeakImplication && + (set_by_ == SetBy::kImplication || set_by_ == SetBy::kCommandLine)) { + return false; + } + if (ShouldCheckFlagContradictions()) { + // For bool flags, we only check for a conflict if the value actually + // changes. So specifying the same flag with the same value multiple times + // is allowed. + // For other flags, we disallow specifying them explicitly or in the + // presence of an implication even if the value is the same. + // This is to simplify the rules describing conflicts in variants.py: A + // repeated non-boolean flag is considered an error independently of its + // value. + bool is_bool_flag = type_ == TYPE_MAYBE_BOOL || type_ == TYPE_BOOL; + bool check_implications = change_flag; + bool check_command_line_flags = change_flag || !is_bool_flag; + const char* hint = + "To fix this, it might be necessary to specify additional " + "contradictory flags in tools/testrunner/local/variants.py."; + switch (set_by_) { + case SetBy::kDefault: + break; + case SetBy::kWeakImplication: + if (new_set_by == SetBy::kWeakImplication && check_implications) { + FATAL( + "Contradictory weak flag implications from --%s and --%s for " + "flag %s\n%s", + implied_by_, implied_by, name(), hint); + } + break; + case SetBy::kImplication: + if (new_set_by == SetBy::kImplication && check_implications) { + FATAL( + "Contradictory flag implications from --%s and --%s for flag " + "%s\n%s", + implied_by_, implied_by, name(), hint); + } + break; + case SetBy::kCommandLine: + if (new_set_by == SetBy::kImplication && check_command_line_flags) { + FATAL( + "Flag --%s is implied by --%s but also specified " + "explicitly.\n%s", + name(), implied_by, hint); + } else if (new_set_by == SetBy::kCommandLine && + check_command_line_flags) { + if (is_bool_flag) { + FATAL( + "Command-line provided flag --%s specified as both true and " + "false.\n%s", + name(), hint); + } else { + FATAL( + "Command-line provided flag --%s specified multiple " + "times.\n%s", + name(), hint); + } + } + break; + } + } + set_by_ = new_set_by; + if (new_set_by == SetBy::kImplication || + new_set_by == SetBy::kWeakImplication) { + DCHECK_NOT_NULL(implied_by); + implied_by_ = implied_by; + } + return change_flag; + } + // Compare this flag's current value against the default. bool IsDefault() const { switch (type_) { case TYPE_BOOL: - return *bool_variable() == bool_default(); + return bool_variable() == bool_default(); case TYPE_MAYBE_BOOL: - return maybe_bool_variable()->has_value == false; + return maybe_bool_variable().has_value == false; case TYPE_INT: - return *int_variable() == int_default(); + return int_variable() == int_default(); case TYPE_UINT: - return *uint_variable() == uint_default(); + return uint_variable() == uint_default(); case TYPE_UINT64: - return *uint64_variable() == uint64_default(); + return uint64_variable() == uint64_default(); case TYPE_FLOAT: - return *float_variable() == float_default(); + return float_variable() == float_default(); case TYPE_SIZE_T: - return *size_t_variable() == size_t_default(); + return size_t_variable() == size_t_default(); case TYPE_STRING: { const char* str1 = string_value(); const char* str2 = string_default(); @@ -176,31 +331,34 @@ struct Flag { void Reset() { switch (type_) { case TYPE_BOOL: - *bool_variable() = bool_default(); + set_bool_variable(bool_default(), SetBy::kDefault); break; case TYPE_MAYBE_BOOL: - *maybe_bool_variable() = MaybeBoolFlag::Create(false, false); + set_maybe_bool_variable(MaybeBoolFlag::Create(false, false), + SetBy::kDefault); break; case TYPE_INT: - *int_variable() = int_default(); + set_int_variable(int_default(), SetBy::kDefault); break; case TYPE_UINT: - *uint_variable() = uint_default(); + set_uint_variable(uint_default(), SetBy::kDefault); break; case TYPE_UINT64: - *uint64_variable() = uint64_default(); + set_uint64_variable(uint64_default(), SetBy::kDefault); break; case TYPE_FLOAT: - *float_variable() = float_default(); + set_float_variable(float_default(), SetBy::kDefault); break; case TYPE_SIZE_T: - *size_t_variable() = size_t_default(); + set_size_t_variable(size_t_default(), SetBy::kDefault); break; case TYPE_STRING: - set_string_value(string_default(), false); + set_string_value(string_default(), false, SetBy::kDefault); break; } } + + void AllowOverwriting() { set_by_ = SetBy::kDefault; } }; Flag flags[] = { @@ -210,6 +368,31 @@ Flag flags[] = { const size_t num_flags = sizeof(flags) / sizeof(*flags); +inline char NormalizeChar(char ch) { return ch == '_' ? '-' : ch; } + +bool EqualNames(const char* a, const char* b) { + for (int i = 0; NormalizeChar(a[i]) == NormalizeChar(b[i]); i++) { + if (a[i] == '\0') { + return true; + } + } + return false; +} + +Flag* FindFlagByName(const char* name) { + for (size_t i = 0; i < num_flags; ++i) { + if (EqualNames(name, flags[i].name())) return &flags[i]; + } + return nullptr; +} + +Flag* FindFlagByPointer(const void* ptr) { + for (size_t i = 0; i < num_flags; ++i) { + if (flags[i].PointsTo(ptr)) return &flags[i]; + } + return nullptr; +} + } // namespace static const char* Type2String(Flag::FlagType type) { @@ -237,27 +420,27 @@ static const char* Type2String(Flag::FlagType type) { std::ostream& operator<<(std::ostream& os, const Flag& flag) { // NOLINT switch (flag.type()) { case Flag::TYPE_BOOL: - os << (*flag.bool_variable() ? "true" : "false"); + os << (flag.bool_variable() ? "true" : "false"); break; case Flag::TYPE_MAYBE_BOOL: - os << (flag.maybe_bool_variable()->has_value - ? (flag.maybe_bool_variable()->value ? "true" : "false") + os << (flag.maybe_bool_variable().has_value + ? (flag.maybe_bool_variable().value ? "true" : "false") : "unset"); break; case Flag::TYPE_INT: - os << *flag.int_variable(); + os << flag.int_variable(); break; case Flag::TYPE_UINT: - os << *flag.uint_variable(); + os << flag.uint_variable(); break; case Flag::TYPE_UINT64: - os << *flag.uint64_variable(); + os << flag.uint64_variable(); break; case Flag::TYPE_FLOAT: - os << *flag.float_variable(); + os << flag.float_variable(); break; case Flag::TYPE_SIZE_T: - os << *flag.size_t_variable(); + os << flag.size_t_variable(); break; case Flag::TYPE_STRING: { const char* str = flag.string_value(); @@ -275,7 +458,7 @@ std::vector* FlagList::argv() { Flag* f = &flags[i]; if (!f->IsDefault()) { { - bool disabled = f->type() == Flag::TYPE_BOOL && !*f->bool_variable(); + bool disabled = f->type() == Flag::TYPE_BOOL && !f->bool_variable(); std::ostringstream os; os << (disabled ? "--no" : "--") << f->name(); args->push_back(StrDup(os.str().c_str())); @@ -290,8 +473,6 @@ std::vector* FlagList::argv() { return args; } -inline char NormalizeChar(char ch) { return ch == '_' ? '-' : ch; } - // Helper function to parse flags: Takes an argument arg and splits it into // a flag name and flag value (or nullptr if they are missing). negated is set // if the arg started with "-no" or "--no". The buffer may be used to NUL- @@ -334,22 +515,6 @@ static void SplitArgument(const char* arg, char* buffer, int buffer_size, } } -static bool EqualNames(const char* a, const char* b) { - for (int i = 0; NormalizeChar(a[i]) == NormalizeChar(b[i]); i++) { - if (a[i] == '\0') { - return true; - } - } - return false; -} - -static Flag* FindFlag(const char* name) { - for (size_t i = 0; i < num_flags; ++i) { - if (EqualNames(name, flags[i].name())) return &flags[i]; - } - return nullptr; -} - template bool TryParseUnsigned(Flag* flag, const char* arg, const char* value, char** endp, T* out_val) { @@ -388,7 +553,7 @@ int FlagList::SetFlagsFromCommandLine(int* argc, char** argv, bool remove_flags, if (name != nullptr) { // lookup the flag - Flag* flag = FindFlag(name); + Flag* flag = FindFlagByName(name); if (flag == nullptr) { if (remove_flags) { // We don't recognize this flag but since we're removing @@ -421,37 +586,50 @@ int FlagList::SetFlagsFromCommandLine(int* argc, char** argv, bool remove_flags, char* endp = const_cast(""); // *endp is only read switch (flag->type()) { case Flag::TYPE_BOOL: - *flag->bool_variable() = !negated; + flag->set_bool_variable(!negated, Flag::SetBy::kCommandLine); break; case Flag::TYPE_MAYBE_BOOL: - *flag->maybe_bool_variable() = MaybeBoolFlag::Create(true, !negated); + flag->set_maybe_bool_variable(MaybeBoolFlag::Create(true, !negated), + Flag::SetBy::kCommandLine); break; case Flag::TYPE_INT: - *flag->int_variable() = static_cast(strtol(value, &endp, 10)); + flag->set_int_variable(static_cast(strtol(value, &endp, 10)), + Flag::SetBy::kCommandLine); break; - case Flag::TYPE_UINT: - if (!TryParseUnsigned(flag, arg, value, &endp, - flag->uint_variable())) { + case Flag::TYPE_UINT: { + unsigned int parsed_value; + if (TryParseUnsigned(flag, arg, value, &endp, &parsed_value)) { + flag->set_uint_variable(parsed_value, Flag::SetBy::kCommandLine); + } else { return_code = j; } break; - case Flag::TYPE_UINT64: - if (!TryParseUnsigned(flag, arg, value, &endp, - flag->uint64_variable())) { + } + case Flag::TYPE_UINT64: { + uint64_t parsed_value; + if (TryParseUnsigned(flag, arg, value, &endp, &parsed_value)) { + flag->set_uint64_variable(parsed_value, Flag::SetBy::kCommandLine); + } else { return_code = j; } break; + } case Flag::TYPE_FLOAT: - *flag->float_variable() = strtod(value, &endp); + flag->set_float_variable(strtod(value, &endp), + Flag::SetBy::kCommandLine); break; - case Flag::TYPE_SIZE_T: - if (!TryParseUnsigned(flag, arg, value, &endp, - flag->size_t_variable())) { + case Flag::TYPE_SIZE_T: { + size_t parsed_value; + if (TryParseUnsigned(flag, arg, value, &endp, &parsed_value)) { + flag->set_size_t_variable(parsed_value, Flag::SetBy::kCommandLine); + } else { return_code = j; } break; + } case Flag::TYPE_STRING: - flag->set_string_value(value ? StrDup(value) : nullptr, true); + flag->set_string_value(value ? StrDup(value) : nullptr, true, + Flag::SetBy::kCommandLine); break; } @@ -588,6 +766,8 @@ void FlagList::PrintHelp() { } } +namespace { + static uint32_t flag_hash = 0; void ComputeFlagListHash() { @@ -600,8 +780,7 @@ void ComputeFlagListHash() { } for (size_t i = 0; i < num_flags; ++i) { Flag* current = &flags[i]; - if (current->type() == Flag::TYPE_BOOL && - current->bool_variable() == &FLAG_profile_deserialization) { + if (current->PointsTo(&FLAG_profile_deserialization)) { // We want to be able to flip --profile-deserialization without // causing the code cache to get invalidated by this hash. continue; @@ -616,11 +795,31 @@ void ComputeFlagListHash() { base::hash_range(args.c_str(), args.c_str() + args.length())); } +template +bool TriggerImplication(bool premise, const char* premise_name, + A* conclusion_pointer, B value, bool weak_implication) { + if (!premise) return false; + bool change_flag = *conclusion_pointer != implicit_cast(value); + Flag* conclusion_flag = FindFlagByPointer(conclusion_pointer); + change_flag = conclusion_flag->CheckFlagChange( + weak_implication ? Flag::SetBy::kWeakImplication + : Flag::SetBy::kImplication, + change_flag, premise_name); + if (change_flag) *conclusion_pointer = value; + return change_flag; +} + +} // namespace + // static void FlagList::EnforceFlagImplications() { + bool changed; + do { + changed = false; #define FLAG_MODE_DEFINE_IMPLICATIONS #include "src/flags/flag-definitions.h" // NOLINT(build/include) #undef FLAG_MODE_DEFINE_IMPLICATIONS + } while (changed); ComputeFlagListHash(); } diff --git a/deps/v8/src/handles/handles.cc b/deps/v8/src/handles/handles.cc index a03a6199223b0e..85072a375a376b 100644 --- a/deps/v8/src/handles/handles.cc +++ b/deps/v8/src/handles/handles.cc @@ -43,7 +43,7 @@ bool HandleBase::IsDereferenceAllowed() const { } LocalHeap* local_heap = LocalHeap::Current(); - if (V8_UNLIKELY(local_heap)) { + if (FLAG_local_heaps && local_heap) { // Local heap can't access handles when parked if (!local_heap->IsHandleDereferenceAllowed()) return false; diff --git a/deps/v8/src/handles/handles.h b/deps/v8/src/handles/handles.h index 3512ecbfc79b62..6f45da848370e7 100644 --- a/deps/v8/src/handles/handles.h +++ b/deps/v8/src/handles/handles.h @@ -59,6 +59,8 @@ class HandleBase { V8_INLINE Address address() const { return bit_cast
(location_); } // Returns the address to where the raw pointer is stored. + // TODO(leszeks): This should probably be a const Address*, to encourage using + // PatchValue for modifying the handle's value. V8_INLINE Address* location() const { SLOW_DCHECK(location_ == nullptr || IsDereferenceAllowed()); return location_; @@ -154,6 +156,13 @@ class Handle final : public HandleBase { // Location equality. bool equals(Handle other) const { return address() == other.address(); } + // Patches this Handle's value, in-place, with a new value. All handles with + // the same location will see this update. + void PatchValue(T new_value) { + SLOW_DCHECK(location_ != nullptr && IsDereferenceAllowed()); + *location_ = new_value.ptr(); + } + // Provide function object for location equality comparison. struct equal_to { V8_INLINE bool operator()(Handle lhs, Handle rhs) const { diff --git a/deps/v8/src/heap/base/asm/ppc/push_registers_asm.cc b/deps/v8/src/heap/base/asm/ppc/push_registers_asm.cc index 6936819ba2bd96..c0e6c0bf5304d3 100644 --- a/deps/v8/src/heap/base/asm/ppc/push_registers_asm.cc +++ b/deps/v8/src/heap/base/asm/ppc/push_registers_asm.cc @@ -64,9 +64,9 @@ asm( #if defined(_AIX) // Set up TOC for callee. " ld 2,8(5) \n" - // AIX uses function decorators, which means that + // AIX uses function descriptors, which means that // pointers to functions do not point to code, but - // instead point to metadata about them, hence + // instead point to metadata about them, hence // need to deterrence. " ld 6,0(6) \n" #endif diff --git a/deps/v8/src/heap/base/worklist.cc b/deps/v8/src/heap/base/worklist.cc new file mode 100644 index 00000000000000..bda562ff5b44f6 --- /dev/null +++ b/deps/v8/src/heap/base/worklist.cc @@ -0,0 +1,19 @@ +// Copyright 2020 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "src/heap/base/worklist.h" + +namespace heap { +namespace base { +namespace internal { + +// static +SegmentBase* SegmentBase::GetSentinelSegmentAddress() { +static SegmentBase kSentinelSegment(0); +return &kSentinelSegment; +} + +} // namespace internal +} // namespace base +} // namespace heap diff --git a/deps/v8/src/heap/base/worklist.h b/deps/v8/src/heap/base/worklist.h new file mode 100644 index 00000000000000..be2ecf158bc093 --- /dev/null +++ b/deps/v8/src/heap/base/worklist.h @@ -0,0 +1,451 @@ +// Copyright 2020 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef V8_HEAP_BASE_WORKLIST_H_ +#define V8_HEAP_BASE_WORKLIST_H_ + +#include +#include + +#include "src/base/atomic-utils.h" +#include "src/base/logging.h" +#include "src/base/platform/mutex.h" +#include "testing/gtest/include/gtest/gtest_prod.h" // nogncheck + +namespace heap { +namespace base { + +namespace internal { +class V8_EXPORT_PRIVATE SegmentBase { + public: + static SegmentBase* GetSentinelSegmentAddress(); + + explicit SegmentBase(uint16_t capacity) : capacity_(capacity) {} + + size_t Size() const { return index_; } + bool IsEmpty() const { return index_ == 0; } + bool IsFull() const { return index_ == capacity_; } + void Clear() { index_ = 0; } + + protected: + const uint16_t capacity_; + uint16_t index_ = 0; +}; +} // namespace internal + +// A global marking worklist that is similar the existing Worklist +// but does not reserve space and keep track of the local segments. +// Eventually this will replace Worklist after all its current uses +// are migrated. +template +class Worklist { + public: + static const int kSegmentSize = SegmentSize; + class Segment; + class Local; + + Worklist() = default; + ~Worklist() { CHECK(IsEmpty()); } + + void Push(Segment* segment); + bool Pop(Segment** segment); + + // Returns true if the list of segments is empty. + bool IsEmpty(); + // Returns the number of segments in the list. + size_t Size(); + + // Moves the segments of the given marking worklist into this + // marking worklist. + void Merge(Worklist* other); + + // These functions are not thread-safe. They should be called only + // if all local marking worklists that use the current worklist have + // been published and are empty. + void Clear(); + template + void Update(Callback callback); + template + void Iterate(Callback callback); + + private: + void set_top(Segment* segment) { + v8::base::AsAtomicPtr(&top_)->store(segment, std::memory_order_relaxed); + } + + v8::base::Mutex lock_; + Segment* top_ = nullptr; + std::atomic size_{0}; +}; + +template +void Worklist::Push(Segment* segment) { + DCHECK(!segment->IsEmpty()); + v8::base::MutexGuard guard(&lock_); + segment->set_next(top_); + set_top(segment); + size_.fetch_add(1, std::memory_order_relaxed); +} + +template +bool Worklist::Pop(Segment** segment) { + v8::base::MutexGuard guard(&lock_); + if (top_ == nullptr) return false; + DCHECK_LT(0U, size_); + size_.fetch_sub(1, std::memory_order_relaxed); + *segment = top_; + set_top(top_->next()); + return true; +} + +template +bool Worklist::IsEmpty() { + return v8::base::AsAtomicPtr(&top_)->load(std::memory_order_relaxed) == + nullptr; +} + +template +size_t Worklist::Size() { + // It is safe to read |size_| without a lock since this variable is + // atomic, keeping in mind that threads may not immediately see the new + // value when it is updated. + return size_.load(std::memory_order_relaxed); +} + +template +void Worklist::Clear() { + v8::base::MutexGuard guard(&lock_); + size_.store(0, std::memory_order_relaxed); + Segment* current = top_; + while (current != nullptr) { + Segment* tmp = current; + current = current->next(); + delete tmp; + } + set_top(nullptr); +} + +template +template +void Worklist::Update(Callback callback) { + v8::base::MutexGuard guard(&lock_); + Segment* prev = nullptr; + Segment* current = top_; + size_t num_deleted = 0; + while (current != nullptr) { + current->Update(callback); + if (current->IsEmpty()) { + DCHECK_LT(0U, size_); + ++num_deleted; + if (prev == nullptr) { + top_ = current->next(); + } else { + prev->set_next(current->next()); + } + Segment* tmp = current; + current = current->next(); + delete tmp; + } else { + prev = current; + current = current->next(); + } + } + size_.fetch_sub(num_deleted, std::memory_order_relaxed); +} + +template +template +void Worklist::Iterate(Callback callback) { + v8::base::MutexGuard guard(&lock_); + for (Segment* current = top_; current != nullptr; current = current->next()) { + current->Iterate(callback); + } +} + +template +void Worklist::Merge( + Worklist* other) { + Segment* top = nullptr; + size_t other_size = 0; + { + v8::base::MutexGuard guard(&other->lock_); + if (!other->top_) return; + top = other->top_; + other_size = other->size_.load(std::memory_order_relaxed); + other->size_.store(0, std::memory_order_relaxed); + other->set_top(nullptr); + } + + // It's safe to iterate through these segments because the top was + // extracted from |other|. + Segment* end = top; + while (end->next()) end = end->next(); + + { + v8::base::MutexGuard guard(&lock_); + size_.fetch_add(other_size, std::memory_order_relaxed); + end->set_next(top_); + set_top(top); + } +} + +template +class Worklist::Segment : public internal::SegmentBase { + public: + static const uint16_t kSize = SegmentSize; + + void Push(EntryType entry); + void Pop(EntryType* entry); + + template + void Update(Callback callback); + template + void Iterate(Callback callback) const; + + Segment* next() const { return next_; } + void set_next(Segment* segment) { next_ = segment; } + + private: + Segment() : internal::SegmentBase(kSize) {} + + Segment* next_ = nullptr; + EntryType entries_[kSize]; + + friend class Worklist::Local; + + FRIEND_TEST(CppgcWorkListTest, SegmentCreate); + FRIEND_TEST(CppgcWorkListTest, SegmentPush); + FRIEND_TEST(CppgcWorkListTest, SegmentPushPop); + FRIEND_TEST(CppgcWorkListTest, SegmentIsEmpty); + FRIEND_TEST(CppgcWorkListTest, SegmentIsFull); + FRIEND_TEST(CppgcWorkListTest, SegmentClear); + FRIEND_TEST(CppgcWorkListTest, SegmentUpdateFalse); + FRIEND_TEST(CppgcWorkListTest, SegmentUpdate); +}; + +template +void Worklist::Segment::Push(EntryType entry) { + DCHECK(!IsFull()); + entries_[index_++] = entry; +} + +template +void Worklist::Segment::Pop(EntryType* entry) { + DCHECK(!IsEmpty()); + *entry = entries_[--index_]; +} + +template +template +void Worklist::Segment::Update(Callback callback) { + size_t new_index = 0; + for (size_t i = 0; i < index_; i++) { + if (callback(entries_[i], &entries_[new_index])) { + new_index++; + } + } + index_ = new_index; +} + +template +template +void Worklist::Segment::Iterate( + Callback callback) const { + for (size_t i = 0; i < index_; i++) { + callback(entries_[i]); + } +} + +// A thread-local view of the marking worklist. +template +class Worklist::Local { + public: + using ItemType = EntryType; + + Local() = default; + explicit Local(Worklist* worklist); + ~Local(); + + Local(Local&&) V8_NOEXCEPT; + Local& operator=(Local&&) V8_NOEXCEPT; + + // Disable copying since having multiple copies of the same + // local marking worklist is unsafe. + Local(const Local&) = delete; + Local& operator=(const Local& other) = delete; + + void Push(EntryType entry); + bool Pop(EntryType* entry); + + bool IsLocalAndGlobalEmpty() const; + bool IsLocalEmpty() const; + bool IsGlobalEmpty() const; + + void Publish(); + void Merge(Worklist::Local* other); + + size_t PushSegmentSize() const { return push_segment_->Size(); } + + private: + void PublishPushSegment(); + void PublishPopSegment(); + bool StealPopSegment(); + + Segment* NewSegment() const { + // Bottleneck for filtering in crash dumps. + return new Segment(); + } + void DeleteSegment(internal::SegmentBase* segment) const { + if (segment == internal::SegmentBase::GetSentinelSegmentAddress()) return; + delete static_cast(segment); + } + + inline Segment* push_segment() { + DCHECK_NE(internal::SegmentBase::GetSentinelSegmentAddress(), + push_segment_); + return static_cast(push_segment_); + } + inline const Segment* push_segment() const { + DCHECK_NE(internal::SegmentBase::GetSentinelSegmentAddress(), + push_segment_); + return static_cast(push_segment_); + } + + inline Segment* pop_segment() { + DCHECK_NE(internal::SegmentBase::GetSentinelSegmentAddress(), pop_segment_); + return static_cast(pop_segment_); + } + inline const Segment* pop_segment() const { + DCHECK_NE(internal::SegmentBase::GetSentinelSegmentAddress(), pop_segment_); + return static_cast(pop_segment_); + } + + Worklist* worklist_ = nullptr; + internal::SegmentBase* push_segment_ = nullptr; + internal::SegmentBase* pop_segment_ = nullptr; +}; + +template +Worklist::Local::Local( + Worklist* worklist) + : worklist_(worklist), + push_segment_(internal::SegmentBase::GetSentinelSegmentAddress()), + pop_segment_(internal::SegmentBase::GetSentinelSegmentAddress()) {} + +template +Worklist::Local::~Local() { + CHECK_IMPLIES(push_segment_, push_segment_->IsEmpty()); + CHECK_IMPLIES(pop_segment_, pop_segment_->IsEmpty()); + DeleteSegment(push_segment_); + DeleteSegment(pop_segment_); +} + +template +Worklist::Local::Local( + Worklist::Local&& other) V8_NOEXCEPT { + worklist_ = other.worklist_; + push_segment_ = other.push_segment_; + pop_segment_ = other.pop_segment_; + other.worklist_ = nullptr; + other.push_segment_ = nullptr; + other.pop_segment_ = nullptr; +} + +template +typename Worklist::Local& +Worklist::Local::operator=( + Worklist::Local&& other) V8_NOEXCEPT { + if (this != &other) { + DCHECK_NULL(worklist_); + DCHECK_NULL(push_segment_); + DCHECK_NULL(pop_segment_); + worklist_ = other.worklist_; + push_segment_ = other.push_segment_; + pop_segment_ = other.pop_segment_; + other.worklist_ = nullptr; + other.push_segment_ = nullptr; + other.pop_segment_ = nullptr; + } + return *this; +} + +template +void Worklist::Local::Push(EntryType entry) { + if (V8_UNLIKELY(push_segment_->IsFull())) { + PublishPushSegment(); + } + push_segment()->Push(entry); +} + +template +bool Worklist::Local::Pop(EntryType* entry) { + if (pop_segment_->IsEmpty()) { + if (!push_segment_->IsEmpty()) { + std::swap(push_segment_, pop_segment_); + } else if (!StealPopSegment()) { + return false; + } + } + pop_segment()->Pop(entry); + return true; +} + +template +bool Worklist::Local::IsLocalAndGlobalEmpty() const { + return IsLocalEmpty() && IsGlobalEmpty(); +} + +template +bool Worklist::Local::IsLocalEmpty() const { + return push_segment_->IsEmpty() && pop_segment_->IsEmpty(); +} + +template +bool Worklist::Local::IsGlobalEmpty() const { + return worklist_->IsEmpty(); +} + +template +void Worklist::Local::Publish() { + if (!push_segment_->IsEmpty()) PublishPushSegment(); + if (!pop_segment_->IsEmpty()) PublishPopSegment(); +} + +template +void Worklist::Local::Merge( + Worklist::Local* other) { + other->Publish(); + worklist_->Merge(other->worklist_); +} + +template +void Worklist::Local::PublishPushSegment() { + if (push_segment_ != internal::SegmentBase::GetSentinelSegmentAddress()) + worklist_->Push(push_segment()); + push_segment_ = NewSegment(); +} + +template +void Worklist::Local::PublishPopSegment() { + if (pop_segment_ != internal::SegmentBase::GetSentinelSegmentAddress()) + worklist_->Push(pop_segment()); + pop_segment_ = NewSegment(); +} + +template +bool Worklist::Local::StealPopSegment() { + if (worklist_->IsEmpty()) return false; + Segment* new_segment = nullptr; + if (worklist_->Pop(&new_segment)) { + DeleteSegment(pop_segment_); + pop_segment_ = new_segment; + return true; + } + return false; +} + +} // namespace base +} // namespace heap + +#endif // V8_HEAP_BASE_WORKLIST_H_ diff --git a/deps/v8/src/heap/concurrent-allocator.cc b/deps/v8/src/heap/concurrent-allocator.cc index 184ad88490ad0f..5db9159f14079b 100644 --- a/deps/v8/src/heap/concurrent-allocator.cc +++ b/deps/v8/src/heap/concurrent-allocator.cc @@ -27,6 +27,9 @@ void StressConcurrentAllocatorTask::RunInternal() { MemoryChunkLayout::ObjectStartOffsetInDataPage()); for (int i = 0; i < kNumIterations; i++) { + // Isolate tear down started, stop allocation... + if (heap->gc_state() == Heap::TEAR_DOWN) return; + Address address = local_heap.AllocateRawOrFail( kSmallObjectSize, AllocationType::kOld, AllocationOrigin::kRuntime, AllocationAlignment::kWordAligned); @@ -62,27 +65,6 @@ void StressConcurrentAllocatorTask::Schedule(Isolate* isolate) { kDelayInSeconds); } -Address ConcurrentAllocator::PerformCollectionAndAllocateAgain( - int object_size, AllocationAlignment alignment, AllocationOrigin origin) { - Heap* heap = local_heap_->heap(); - local_heap_->allocation_failed_ = true; - - for (int i = 0; i < 3; i++) { - { - ParkedScope scope(local_heap_); - heap->RequestAndWaitForCollection(); - } - - AllocationResult result = AllocateRaw(object_size, alignment, origin); - if (!result.IsRetry()) { - local_heap_->allocation_failed_ = false; - return result.ToObjectChecked().address(); - } - } - - heap->FatalProcessOutOfMemory("ConcurrentAllocator: allocation failed"); -} - void ConcurrentAllocator::FreeLinearAllocationArea() { lab_.CloseAndMakeIterable(); } diff --git a/deps/v8/src/heap/concurrent-allocator.h b/deps/v8/src/heap/concurrent-allocator.h index bb87425ffcc711..fe6144eb7ef667 100644 --- a/deps/v8/src/heap/concurrent-allocator.h +++ b/deps/v8/src/heap/concurrent-allocator.h @@ -63,9 +63,6 @@ class ConcurrentAllocator { V8_EXPORT_PRIVATE AllocationResult AllocateOutsideLab( int object_size, AllocationAlignment alignment, AllocationOrigin origin); - V8_EXPORT_PRIVATE Address PerformCollectionAndAllocateAgain( - int object_size, AllocationAlignment alignment, AllocationOrigin origin); - LocalHeap* const local_heap_; PagedSpace* const space_; LocalAllocationBuffer lab_; diff --git a/deps/v8/src/heap/conservative-stack-visitor.cc b/deps/v8/src/heap/conservative-stack-visitor.cc new file mode 100644 index 00000000000000..4e112f81ad862a --- /dev/null +++ b/deps/v8/src/heap/conservative-stack-visitor.cc @@ -0,0 +1,78 @@ +// Copyright 2020 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "src/heap/conservative-stack-visitor.h" + +#include "src/execution/isolate-utils-inl.h" +#include "src/heap/large-spaces.h" +#include "src/heap/paged-spaces-inl.h" + +namespace v8 { +namespace internal { + +ConservativeStackVisitor::ConservativeStackVisitor(Isolate* isolate, + RootVisitor* delegate) + : isolate_(isolate), delegate_(delegate) {} + +void ConservativeStackVisitor::VisitPointer(const void* pointer) { + VisitConservativelyIfPointer(pointer); +} + +bool ConservativeStackVisitor::CheckPage(Address address, MemoryChunk* page) { + if (address < page->area_start() || address >= page->area_end()) return false; + + auto base_ptr = page->object_start_bitmap()->FindBasePtr(address); + if (base_ptr == kNullAddress) { + return false; + } + + // At this point, base_ptr *must* refer to the valid object. We check if + // |address| resides inside the object or beyond it in unused memory. + HeapObject obj = HeapObject::FromAddress(base_ptr); + Address obj_end = obj.address() + obj.Size(); + + if (address >= obj_end) { + // |address| points to unused memory. + return false; + } + + // TODO(jakehughes) Pinning is only required for the marking visitor. Other + // visitors (such as verify visitor) could work without pining. This should + // be moved to delegate_ + page->SetFlag(BasicMemoryChunk::Flag::PINNED); + + Object ptr = HeapObject::FromAddress(base_ptr); + FullObjectSlot root = FullObjectSlot(&ptr); + delegate_->VisitRootPointer(Root::kHandleScope, nullptr, root); + DCHECK(root == FullObjectSlot(reinterpret_cast
(&base_ptr))); + return true; +} + +void ConservativeStackVisitor::VisitConservativelyIfPointer( + const void* pointer) { + auto address = reinterpret_cast
(pointer); + if (address > isolate_->heap()->old_space()->top() || + address < isolate_->heap()->old_space()->limit()) { + return; + } + + for (Page* page : *isolate_->heap()->old_space()) { + if (CheckPage(address, page)) { + return; + } + } + + for (LargePage* page : *isolate_->heap()->lo_space()) { + if (address >= page->area_start() && address < page->area_end()) { + Object ptr = page->GetObject(); + FullObjectSlot root = FullObjectSlot(&ptr); + delegate_->VisitRootPointer(Root::kHandleScope, nullptr, root); + DCHECK(root == FullObjectSlot(&ptr)); + return; + } + } +} + +} // namespace internal +} // namespace v8 diff --git a/deps/v8/src/heap/conservative-stack-visitor.h b/deps/v8/src/heap/conservative-stack-visitor.h new file mode 100644 index 00000000000000..649608b4235e67 --- /dev/null +++ b/deps/v8/src/heap/conservative-stack-visitor.h @@ -0,0 +1,32 @@ +// Copyright 2020 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef V8_HEAP_CONSERVATIVE_STACK_VISITOR_H_ +#define V8_HEAP_CONSERVATIVE_STACK_VISITOR_H_ + +#include "src/heap/base/stack.h" +#include "src/heap/memory-chunk.h" + +namespace v8 { +namespace internal { + +class ConservativeStackVisitor : public ::heap::base::StackVisitor { + public: + ConservativeStackVisitor(Isolate* isolate, RootVisitor* delegate); + + void VisitPointer(const void* pointer) final; + + private: + bool CheckPage(Address address, MemoryChunk* page); + + void VisitConservativelyIfPointer(const void* pointer); + + Isolate* isolate_ = nullptr; + RootVisitor* delegate_ = nullptr; +}; + +} // namespace internal +} // namespace v8 + +#endif // V8_HEAP_CONSERVATIVE_STACK_VISITOR_H_ diff --git a/deps/v8/src/heap/cppgc-js/cpp-heap.cc b/deps/v8/src/heap/cppgc-js/cpp-heap.cc index 8243e9e36625ea..6c9f99272ab6f0 100644 --- a/deps/v8/src/heap/cppgc-js/cpp-heap.cc +++ b/deps/v8/src/heap/cppgc-js/cpp-heap.cc @@ -65,7 +65,8 @@ class CppgcPlatformAdapter final : public cppgc::Platform { class UnifiedHeapMarker final : public cppgc::internal::MarkerBase { public: - explicit UnifiedHeapMarker(Heap& v8_heap, cppgc::internal::HeapBase& heap); + UnifiedHeapMarker(Key, Heap& v8_heap, cppgc::internal::HeapBase& cpp_heap, + cppgc::Platform* platform, MarkingConfig config); ~UnifiedHeapMarker() final = default; @@ -86,9 +87,11 @@ class UnifiedHeapMarker final : public cppgc::internal::MarkerBase { cppgc::internal::ConservativeMarkingVisitor conservative_marking_visitor_; }; -UnifiedHeapMarker::UnifiedHeapMarker(Heap& v8_heap, - cppgc::internal::HeapBase& heap) - : cppgc::internal::MarkerBase(heap), +UnifiedHeapMarker::UnifiedHeapMarker(Key key, Heap& v8_heap, + cppgc::internal::HeapBase& heap, + cppgc::Platform* platform, + MarkingConfig config) + : cppgc::internal::MarkerBase(key, heap, platform, config), unified_heap_mutator_marking_state_(v8_heap), marking_visitor_(heap, mutator_marking_state_, unified_heap_mutator_marking_state_), @@ -104,7 +107,9 @@ void UnifiedHeapMarker::AddObject(void* object) { CppHeap::CppHeap(v8::Isolate* isolate, size_t custom_spaces) : cppgc::internal::HeapBase(std::make_shared(isolate), - custom_spaces), + custom_spaces, + cppgc::internal::HeapBase::StackSupport:: + kSupportsConservativeStackScan), isolate_(*reinterpret_cast(isolate)) { CHECK(!FLAG_incremental_marking_wrappers); } @@ -121,17 +126,20 @@ void CppHeap::RegisterV8References( } void CppHeap::TracePrologue(TraceFlags flags) { - marker_.reset(new UnifiedHeapMarker(*isolate_.heap(), AsBase())); const UnifiedHeapMarker::MarkingConfig marking_config{ UnifiedHeapMarker::MarkingConfig::CollectionType::kMajor, cppgc::Heap::StackState::kNoHeapPointers, - UnifiedHeapMarker::MarkingConfig::MarkingType::kAtomic}; - marker_->StartMarking(marking_config); + UnifiedHeapMarker::MarkingConfig::MarkingType::kIncremental}; + marker_ = + cppgc::internal::MarkerFactory::CreateAndStartMarking( + *isolate_.heap(), AsBase(), platform_.get(), marking_config); marking_done_ = false; } bool CppHeap::AdvanceTracing(double deadline_in_ms) { - marking_done_ = marker_->AdvanceMarkingWithDeadline( + // TODO(chromium:1056170): Replace std::numeric_limits::max() with a + // proper deadline when unified heap transitions to bytes-based deadline. + marking_done_ = marker_->AdvanceMarkingWithMaxDuration( v8::base::TimeDelta::FromMillisecondsD(deadline_in_ms)); return marking_done_; } @@ -139,11 +147,7 @@ bool CppHeap::AdvanceTracing(double deadline_in_ms) { bool CppHeap::IsTracingDone() { return marking_done_; } void CppHeap::EnterFinalPause(EmbedderStackState stack_state) { - const UnifiedHeapMarker::MarkingConfig marking_config{ - UnifiedHeapMarker::MarkingConfig::CollectionType::kMajor, - cppgc::Heap::StackState::kNoHeapPointers, - UnifiedHeapMarker::MarkingConfig::MarkingType::kAtomic}; - marker_->EnterAtomicPause(marking_config); + marker_->EnterAtomicPause(cppgc::Heap::StackState::kNoHeapPointers); } void CppHeap::TraceEpilogue(TraceSummary* trace_summary) { diff --git a/deps/v8/src/heap/cppgc-js/cpp-heap.h b/deps/v8/src/heap/cppgc-js/cpp-heap.h index 0105934ac17854..f3bbab8b16e01c 100644 --- a/deps/v8/src/heap/cppgc-js/cpp-heap.h +++ b/deps/v8/src/heap/cppgc-js/cpp-heap.h @@ -33,6 +33,12 @@ class V8_EXPORT_PRIVATE CppHeap final : public cppgc::internal::HeapBase, void EnterFinalPause(EmbedderStackState stack_state) final; private: + void FinalizeIncrementalGarbageCollectionIfNeeded( + cppgc::Heap::StackState) final { + // For unified heap, CppHeap shouldn't finalize independently (i.e. + // finalization is not needed) thus this method is left empty. + } + Isolate& isolate_; bool marking_done_ = false; }; diff --git a/deps/v8/src/heap/cppgc/default-job.h b/deps/v8/src/heap/cppgc/default-job.h new file mode 100644 index 00000000000000..9ef6f3fb586d93 --- /dev/null +++ b/deps/v8/src/heap/cppgc/default-job.h @@ -0,0 +1,186 @@ +// Copyright 2020 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef V8_HEAP_CPPGC_DEFAULT_JOB_H_ +#define V8_HEAP_CPPGC_DEFAULT_JOB_H_ + +#include +#include +#include +#include +#include + +#include "include/cppgc/platform.h" +#include "src/base/logging.h" +#include "src/base/platform/mutex.h" + +namespace cppgc { +namespace internal { + +template +class DefaultJobFactory { + public: + static std::shared_ptr Create(std::unique_ptr job_task) { + std::shared_ptr job = + std::make_shared(typename Job::Key(), std::move(job_task)); + job->NotifyConcurrencyIncrease(); + return job; + } +}; + +template +class DefaultJobImpl { + public: + class JobDelegate; + class JobHandle; + + class Key { + private: + Key() {} + + template + friend class DefaultJobFactory; + }; + + DefaultJobImpl(Key, std::unique_ptr job_task) + : job_task_(std::move(job_task)) {} + + ~DefaultJobImpl() { + Cancel(); + DCHECK_EQ(0, active_threads_.load(std::memory_order_relaxed)); + } + + void NotifyConcurrencyIncrease(); + + void Join() { + for (std::shared_ptr& thread : job_threads_) thread->Join(); + job_threads_.clear(); + can_run_.store(false, std::memory_order_relaxed); + } + + void Cancel() { + can_run_.store(false, std::memory_order_relaxed); + Join(); + } + + bool IsCompleted() const { return !IsRunning(); } + bool IsRunning() const { + uint8_t active_threads = active_threads_.load(std::memory_order_relaxed); + return (active_threads + job_task_->GetMaxConcurrency(active_threads)) > 0; + } + + bool CanRun() const { return can_run_.load(std::memory_order_relaxed); } + + void RunJobTask() { + DCHECK_NOT_NULL(job_task_); + NotifyJobThreadStart(); + JobDelegate delegate(this); + job_task_->Run(&delegate); + NotifyJobThreadEnd(); + } + + protected: + virtual std::shared_ptr CreateThread(DefaultJobImpl*) = 0; + + void NotifyJobThreadStart() { + active_threads_.fetch_add(1, std::memory_order_relaxed); + } + void NotifyJobThreadEnd() { + active_threads_.fetch_sub(1, std::memory_order_relaxed); + } + + void GuaranteeAvailableIds(uint8_t max_threads) { + if (max_threads <= highest_thread_count_) return; + v8::base::MutexGuard guard(&ids_lock_); + while (highest_thread_count_ < max_threads) { + available_ids_.push_back(++highest_thread_count_); + } + } + + std::unique_ptr job_task_; + std::vector> job_threads_; + std::atomic_bool can_run_{true}; + std::atomic active_threads_{0}; + + // Task id management. + v8::base::Mutex ids_lock_; + std::vector available_ids_; + uint8_t highest_thread_count_ = -1; +}; + +template +class DefaultJobImpl::JobDelegate final : public cppgc::JobDelegate { + public: + explicit JobDelegate(DefaultJobImpl* job) : job_(job) {} + ~JobDelegate() { ReleaseTaskId(); } + bool ShouldYield() override { return !job_->CanRun(); } + void NotifyConcurrencyIncrease() override { + job_->NotifyConcurrencyIncrease(); + } + uint8_t GetTaskId() override { + AcquireTaskId(); + return job_thread_id_; + } + + private: + void AcquireTaskId() { + if (job_thread_id_ != kInvalidTaskId) return; + v8::base::MutexGuard guard(&job_->ids_lock_); + job_thread_id_ = job_->available_ids_.back(); + DCHECK_NE(kInvalidTaskId, job_thread_id_); + job_->available_ids_.pop_back(); + } + void ReleaseTaskId() { + if (job_thread_id_ == kInvalidTaskId) return; + v8::base::MutexGuard guard(&job_->ids_lock_); + job_->available_ids_.push_back(job_thread_id_); + } + + DefaultJobImpl* const job_; + static constexpr uint8_t kInvalidTaskId = std::numeric_limits::max(); + uint8_t job_thread_id_ = kInvalidTaskId; +}; + +template +void DefaultJobImpl::NotifyConcurrencyIncrease() { + DCHECK(CanRun()); + static const size_t kMaxThreads = Thread::GetMaxSupportedConcurrency(); + uint8_t current_active_threads = + active_threads_.load(std::memory_order_relaxed); + size_t max_threads = std::min( + kMaxThreads, job_task_->GetMaxConcurrency(current_active_threads)); + if (current_active_threads >= max_threads) return; + DCHECK_LT(max_threads, std::numeric_limits::max()); + GuaranteeAvailableIds(max_threads); + for (uint8_t new_threads = max_threads - current_active_threads; + new_threads > 0; --new_threads) { + std::shared_ptr thread = CreateThread(this); + job_threads_.push_back(thread); + } +} + +template +class DefaultJobImpl::JobHandle final : public cppgc::JobHandle { + public: + explicit JobHandle(std::shared_ptr job) + : job_(std::move(job)) { + DCHECK_NOT_NULL(job_); + } + + void NotifyConcurrencyIncrease() override { + job_->NotifyConcurrencyIncrease(); + } + void Join() override { job_->Join(); } + void Cancel() override { job_->Cancel(); } + bool IsCompleted() override { return job_->IsCompleted(); } + bool IsRunning() override { return job_->IsRunning(); } + + private: + std::shared_ptr job_; +}; + +} // namespace internal +} // namespace cppgc + +#endif // V8_HEAP_CPPGC_DEFAULT_JOB_H_ diff --git a/deps/v8/src/heap/cppgc/default-platform.cc b/deps/v8/src/heap/cppgc/default-platform.cc index 792bf381896a5e..0ac5440f7ee389 100644 --- a/deps/v8/src/heap/cppgc/default-platform.cc +++ b/deps/v8/src/heap/cppgc/default-platform.cc @@ -7,47 +7,63 @@ #include // NOLINT(build/c++11) #include // NOLINT(build/c++11) +#include "src/base/logging.h" #include "src/base/page-allocator.h" +#include "src/base/sys-info.h" +#include "src/heap/cppgc/default-job.h" namespace cppgc { -namespace { +namespace internal { -// Simple implementation of JobTask based on std::thread. -class DefaultJobHandle : public JobHandle { +// Default implementation of Jobs based on std::thread. +namespace { +class DefaultJobThread final : private std::thread { public: - explicit DefaultJobHandle(std::shared_ptr thread) - : thread_(std::move(thread)) {} + template + explicit DefaultJobThread(Function function) + : std::thread(std::move(function)) {} + ~DefaultJobThread() { DCHECK(!joinable()); } - void NotifyConcurrencyIncrease() override {} - void Join() override { - if (thread_->joinable()) thread_->join(); + void Join() { join(); } + + static size_t GetMaxSupportedConcurrency() { + return v8::base::SysInfo::NumberOfProcessors() - 1; } - void Cancel() override { Join(); } - bool IsRunning() override { return thread_->joinable(); } +}; +} // namespace - private: - std::shared_ptr thread_; +class DefaultJob final : public DefaultJobImpl { + public: + DefaultJob(Key key, std::unique_ptr job_task) + : DefaultJobImpl(key, std::move(job_task)) {} + + std::shared_ptr CreateThread(DefaultJobImpl* job) final { + return std::make_shared([job = this] { + DCHECK_NOT_NULL(job); + job->RunJobTask(); + }); + } }; -} // namespace +} // namespace internal void DefaultTaskRunner::PostTask(std::unique_ptr task) { tasks_.push_back(std::move(task)); } -void DefaultTaskRunner::PostNonNestableTask(std::unique_ptr task) { - PostTask(std::move(task)); -} - void DefaultTaskRunner::PostDelayedTask(std::unique_ptr task, double) { PostTask(std::move(task)); } -void DefaultTaskRunner::PostNonNestableDelayedTask( - std::unique_ptr task, double) { - PostTask(std::move(task)); +void DefaultTaskRunner::PostNonNestableTask(std::unique_ptr) { + UNREACHABLE(); +} + +void DefaultTaskRunner::PostNonNestableDelayedTask(std::unique_ptr, + double) { + UNREACHABLE(); } void DefaultTaskRunner::PostIdleTask(std::unique_ptr task) { @@ -106,17 +122,11 @@ std::shared_ptr DefaultPlatform::GetForegroundTaskRunner() { std::unique_ptr DefaultPlatform::PostJob( cppgc::TaskPriority priority, std::unique_ptr job_task) { - auto thread = std::make_shared([task = std::move(job_task)] { - class SimpleDelegate final : public cppgc::JobDelegate { - public: - bool ShouldYield() override { return false; } - void NotifyConcurrencyIncrease() override {} - } delegate; - - if (task) task->Run(&delegate); - }); - job_threads_.push_back(thread); - return std::make_unique(std::move(thread)); + std::shared_ptr job = + internal::DefaultJobFactory::Create( + std::move(job_task)); + jobs_.push_back(job); + return std::make_unique(std::move(job)); } void DefaultPlatform::WaitAllForegroundTasks() { @@ -124,10 +134,10 @@ void DefaultPlatform::WaitAllForegroundTasks() { } void DefaultPlatform::WaitAllBackgroundTasks() { - for (auto& thread : job_threads_) { - thread->join(); + for (auto& job : jobs_) { + job->Join(); } - job_threads_.clear(); + jobs_.clear(); } } // namespace cppgc diff --git a/deps/v8/src/heap/cppgc/garbage-collector.h b/deps/v8/src/heap/cppgc/garbage-collector.h index 6c906fd501af99..1fc7ed925d9745 100644 --- a/deps/v8/src/heap/cppgc/garbage-collector.h +++ b/deps/v8/src/heap/cppgc/garbage-collector.h @@ -31,6 +31,16 @@ class GarbageCollector { MarkingType::kAtomic, SweepingType::kAtomic}; } + static constexpr Config ConservativeIncrementalConfig() { + return {CollectionType::kMajor, StackState::kMayContainHeapPointers, + MarkingType::kIncremental, SweepingType::kAtomic}; + } + + static constexpr Config PreciseIncrementalConfig() { + return {CollectionType::kMajor, StackState::kNoHeapPointers, + MarkingType::kIncremental, SweepingType::kAtomic}; + } + static constexpr Config MinorPreciseAtomicConfig() { return {CollectionType::kMinor, StackState::kNoHeapPointers, MarkingType::kAtomic, SweepingType::kAtomic}; @@ -43,7 +53,8 @@ class GarbageCollector { }; // Executes a garbage collection specified in config. - virtual void CollectGarbage(Config config) = 0; + virtual void CollectGarbage(Config) = 0; + virtual void StartIncrementalGarbageCollection(Config) = 0; // The current epoch that the GC maintains. The epoch is increased on every // GC invocation. diff --git a/deps/v8/src/heap/cppgc/gc-invoker.cc b/deps/v8/src/heap/cppgc/gc-invoker.cc index a1212d80523f91..31ca9780bf42ab 100644 --- a/deps/v8/src/heap/cppgc/gc-invoker.cc +++ b/deps/v8/src/heap/cppgc/gc-invoker.cc @@ -22,6 +22,7 @@ class GCInvoker::GCInvokerImpl final : public GarbageCollector { GCInvokerImpl& operator=(const GCInvokerImpl&) = delete; void CollectGarbage(GarbageCollector::Config) final; + void StartIncrementalGarbageCollection(GarbageCollector::Config) final; size_t epoch() const final { return collector_->epoch(); } private: @@ -37,7 +38,9 @@ class GCInvoker::GCInvokerImpl final : public GarbageCollector { } explicit GCTask(GarbageCollector* collector) - : collector_(collector), saved_epoch_(collector->epoch()) {} + : collector_(collector), + handle_(Handle::NonEmptyTag{}), + saved_epoch_(collector->epoch()) {} private: void Run() final { @@ -88,6 +91,24 @@ void GCInvoker::GCInvokerImpl::CollectGarbage(GarbageCollector::Config config) { } } +void GCInvoker::GCInvokerImpl::StartIncrementalGarbageCollection( + GarbageCollector::Config config) { + if ((stack_support_ != + cppgc::Heap::StackSupport::kSupportsConservativeStackScan) && + (!platform_->GetForegroundTaskRunner() || + !platform_->GetForegroundTaskRunner()->NonNestableTasksEnabled())) { + // In this configuration the GC finalization can only be triggered through + // ForceGarbageCollectionSlow. If incremental GC is started, there is no + // way to know how long it will remain enabled (and the write barrier with + // it). For that reason, we do not support running incremental GCs in this + // configuration. + return; + } + // No need to postpone starting incremental GC since the stack is not scanned + // until GC finalization. + collector_->StartIncrementalGarbageCollection(config); +} + GCInvoker::GCInvoker(GarbageCollector* collector, cppgc::Platform* platform, cppgc::Heap::StackSupport stack_support) : impl_(std::make_unique(collector, platform, @@ -99,6 +120,11 @@ void GCInvoker::CollectGarbage(GarbageCollector::Config config) { impl_->CollectGarbage(config); } +void GCInvoker::StartIncrementalGarbageCollection( + GarbageCollector::Config config) { + impl_->StartIncrementalGarbageCollection(config); +} + size_t GCInvoker::epoch() const { return impl_->epoch(); } } // namespace internal diff --git a/deps/v8/src/heap/cppgc/gc-invoker.h b/deps/v8/src/heap/cppgc/gc-invoker.h index a9e3369b3e98fd..fa5e7e54355915 100644 --- a/deps/v8/src/heap/cppgc/gc-invoker.h +++ b/deps/v8/src/heap/cppgc/gc-invoker.h @@ -34,6 +34,7 @@ class V8_EXPORT_PRIVATE GCInvoker final : public GarbageCollector { GCInvoker& operator=(const GCInvoker&) = delete; void CollectGarbage(GarbageCollector::Config) final; + void StartIncrementalGarbageCollection(GarbageCollector::Config) final; size_t epoch() const final; private: diff --git a/deps/v8/src/heap/cppgc/heap-base.cc b/deps/v8/src/heap/cppgc/heap-base.cc index c3ea0d3d16de84..5a92c4f1594bf4 100644 --- a/deps/v8/src/heap/cppgc/heap-base.cc +++ b/deps/v8/src/heap/cppgc/heap-base.cc @@ -54,7 +54,7 @@ class ObjectSizeCounter : private HeapVisitor { } // namespace HeapBase::HeapBase(std::shared_ptr platform, - size_t custom_spaces) + size_t custom_spaces, StackSupport stack_support) : raw_heap_(this, custom_spaces), platform_(std::move(platform)), #if defined(CPPGC_CAGED_HEAP) @@ -70,7 +70,8 @@ HeapBase::HeapBase(std::shared_ptr platform, prefinalizer_handler_(std::make_unique()), object_allocator_(&raw_heap_, page_backend_.get(), stats_collector_.get()), - sweeper_(&raw_heap_, platform_.get(), stats_collector_.get()) { + sweeper_(&raw_heap_, platform_.get(), stats_collector_.get()), + stack_support_(stack_support) { } HeapBase::~HeapBase() = default; @@ -89,5 +90,9 @@ void HeapBase::VerifyMarking(cppgc::Heap::StackState stack_state) { MarkingVerifier verifier(*this, stack_state); } +void HeapBase::AdvanceIncrementalGarbageCollectionOnAllocationIfNeeded() { + if (marker_) marker_->AdvanceMarkingOnAllocation(); +} + } // namespace internal } // namespace cppgc diff --git a/deps/v8/src/heap/cppgc/heap-base.h b/deps/v8/src/heap/cppgc/heap-base.h index df5646a202de39..efc4dbd40d6d94 100644 --- a/deps/v8/src/heap/cppgc/heap-base.h +++ b/deps/v8/src/heap/cppgc/heap-base.h @@ -12,6 +12,7 @@ #include "include/cppgc/internal/persistent-node.h" #include "include/cppgc/macros.h" #include "src/base/macros.h" +#include "src/heap/cppgc/marker.h" #include "src/heap/cppgc/object-allocator.h" #include "src/heap/cppgc/raw-heap.h" #include "src/heap/cppgc/sweeper.h" @@ -36,7 +37,6 @@ namespace testing { class TestWithHeap; } // namespace testing -class MarkerBase; class PageBackend; class PreFinalizerHandler; class StatsCollector; @@ -44,6 +44,8 @@ class StatsCollector; // Base class for heap implementations. class V8_EXPORT_PRIVATE HeapBase { public: + using StackSupport = cppgc::Heap::StackSupport; + // NoGCScope allows going over limits and avoids triggering garbage // collection triggered through allocations or even explicitly. class V8_EXPORT_PRIVATE NoGCScope final { @@ -60,7 +62,8 @@ class V8_EXPORT_PRIVATE HeapBase { HeapBase& heap_; }; - HeapBase(std::shared_ptr platform, size_t custom_spaces); + HeapBase(std::shared_ptr platform, size_t custom_spaces, + StackSupport stack_support); virtual ~HeapBase(); HeapBase(const HeapBase&) = delete; @@ -116,9 +119,16 @@ class V8_EXPORT_PRIVATE HeapBase { size_t ObjectPayloadSize() const; + StackSupport stack_support() const { return stack_support_; } + + void AdvanceIncrementalGarbageCollectionOnAllocationIfNeeded(); + protected: void VerifyMarking(cppgc::Heap::StackState); + virtual void FinalizeIncrementalGarbageCollectionIfNeeded( + cppgc::Heap::StackState) = 0; + bool in_no_gc_scope() const { return no_gc_scope_ > 0; } RawHeap raw_heap_; @@ -145,6 +155,9 @@ class V8_EXPORT_PRIVATE HeapBase { size_t no_gc_scope_ = 0; + const StackSupport stack_support_; + + friend class MarkerBase::IncrementalMarkingTask; friend class testing::TestWithHeap; }; diff --git a/deps/v8/src/heap/cppgc/heap-growing.cc b/deps/v8/src/heap/cppgc/heap-growing.cc index 751d32b0e6dd25..45c606505fd878 100644 --- a/deps/v8/src/heap/cppgc/heap-growing.cc +++ b/deps/v8/src/heap/cppgc/heap-growing.cc @@ -4,18 +4,29 @@ #include "src/heap/cppgc/heap-growing.h" +#include #include #include "include/cppgc/platform.h" #include "src/base/macros.h" #include "src/heap/cppgc/globals.h" #include "src/heap/cppgc/heap.h" +#include "src/heap/cppgc/incremental-marking-schedule.h" #include "src/heap/cppgc/stats-collector.h" #include "src/heap/cppgc/task-handle.h" namespace cppgc { namespace internal { +namespace { +// Minimum ratio between limit for incremental GC and limit for atomic GC +// (to guarantee that limits are not to close to each other). +constexpr double kMaximumLimitRatioForIncrementalGC = 0.9; +// Minimum ratio between limit for incremental GC and limit for atomic GC +// (to guarantee that limit is not too close to current allocated size). +constexpr double kMinimumLimitRatioForIncrementalGC = 0.5; +} // namespace + class HeapGrowing::HeapGrowingImpl final : public StatsCollector::AllocationObserver { public: @@ -31,7 +42,10 @@ class HeapGrowing::HeapGrowingImpl final void AllocatedObjectSizeDecreased(size_t) final {} void ResetAllocatedObjectSize(size_t) final; - size_t limit() const { return limit_; } + size_t limit_for_atomic_gc() const { return limit_for_atomic_gc_; } + size_t limit_for_incremental_gc() const { return limit_for_incremental_gc_; } + + void DisableForTesting(); private: void ConfigureLimit(size_t allocated_object_size); @@ -40,9 +54,12 @@ class HeapGrowing::HeapGrowingImpl final StatsCollector* stats_collector_; // Allow 1 MB heap by default; size_t initial_heap_size_ = 1 * kMB; - size_t limit_ = 0; // See ConfigureLimit(). + size_t limit_for_atomic_gc_ = 0; // See ConfigureLimit(). + size_t limit_for_incremental_gc_ = 0; // See ConfigureLimit(). SingleThreadedHandle gc_task_handle_; + + bool disabled_for_testing_ = false; }; HeapGrowing::HeapGrowingImpl::HeapGrowingImpl( @@ -64,9 +81,14 @@ HeapGrowing::HeapGrowingImpl::~HeapGrowingImpl() { } void HeapGrowing::HeapGrowingImpl::AllocatedObjectSizeIncreased(size_t) { - if (stats_collector_->allocated_object_size() > limit_) { + if (disabled_for_testing_) return; + size_t allocated_object_size = stats_collector_->allocated_object_size(); + if (allocated_object_size > limit_for_atomic_gc_) { collector_->CollectGarbage( GarbageCollector::Config::ConservativeAtomicConfig()); + } else if (allocated_object_size > limit_for_incremental_gc_) { + collector_->StartIncrementalGarbageCollection( + GarbageCollector::Config::ConservativeIncrementalConfig()); } } @@ -78,8 +100,35 @@ void HeapGrowing::HeapGrowingImpl::ResetAllocatedObjectSize( void HeapGrowing::HeapGrowingImpl::ConfigureLimit( size_t allocated_object_size) { const size_t size = std::max(allocated_object_size, initial_heap_size_); - limit_ = std::max(static_cast(size * kGrowingFactor), - size + kMinLimitIncrease); + limit_for_atomic_gc_ = std::max(static_cast(size * kGrowingFactor), + size + kMinLimitIncrease); + // Estimate when to start incremental GC based on current allocation speed. + // Ideally we start incremental GC such that it is ready to finalize no + // later than when we reach |limit_for_atomic_gc_|. However, we need to cap + // |limit_for_incremental_gc_| within a range to prevent: + // 1) |limit_for_incremental_gc_| being too close to |limit_for_atomic_gc_| + // such that incremental gc gets nothing done before reaching + // |limit_for_atomic_gc_| (in case where the allocation rate is very low). + // 2) |limit_for_incremental_gc_| being too close to |size| such that GC is + // essentially always running and write barriers are always active (in + // case allocation rate is very high). + size_t estimated_bytes_allocated_during_incremental_gc = + std::ceil(IncrementalMarkingSchedule::kEstimatedMarkingTimeMs * + stats_collector_->GetRecentAllocationSpeedInBytesPerMs()); + size_t limit_incremental_gc_based_on_allocation_rate = + limit_for_atomic_gc_ - estimated_bytes_allocated_during_incremental_gc; + size_t maximum_limit_incremental_gc = + size + (limit_for_atomic_gc_ - size) * kMaximumLimitRatioForIncrementalGC; + size_t minimum_limit_incremental_gc = + size + (limit_for_atomic_gc_ - size) * kMinimumLimitRatioForIncrementalGC; + limit_for_incremental_gc_ = + std::max(minimum_limit_incremental_gc, + std::min(maximum_limit_incremental_gc, + limit_incremental_gc_based_on_allocation_rate)); +} + +void HeapGrowing::HeapGrowingImpl::DisableForTesting() { + disabled_for_testing_ = true; } HeapGrowing::HeapGrowing(GarbageCollector* collector, @@ -90,7 +139,14 @@ HeapGrowing::HeapGrowing(GarbageCollector* collector, HeapGrowing::~HeapGrowing() = default; -size_t HeapGrowing::limit() const { return impl_->limit(); } +size_t HeapGrowing::limit_for_atomic_gc() const { + return impl_->limit_for_atomic_gc(); +} +size_t HeapGrowing::limit_for_incremental_gc() const { + return impl_->limit_for_incremental_gc(); +} + +void HeapGrowing::DisableForTesting() { impl_->DisableForTesting(); } // static constexpr double HeapGrowing::kGrowingFactor; diff --git a/deps/v8/src/heap/cppgc/heap-growing.h b/deps/v8/src/heap/cppgc/heap-growing.h index 772fc2db55fe12..4ecedb3e16ab37 100644 --- a/deps/v8/src/heap/cppgc/heap-growing.h +++ b/deps/v8/src/heap/cppgc/heap-growing.h @@ -40,7 +40,10 @@ class V8_EXPORT_PRIVATE HeapGrowing final { HeapGrowing(const HeapGrowing&) = delete; HeapGrowing& operator=(const HeapGrowing&) = delete; - size_t limit() const; + size_t limit_for_atomic_gc() const; + size_t limit_for_incremental_gc() const; + + void DisableForTesting(); private: class HeapGrowingImpl; diff --git a/deps/v8/src/heap/cppgc/heap.cc b/deps/v8/src/heap/cppgc/heap.cc index ad28ead5d23590..0db04fb537c28f 100644 --- a/deps/v8/src/heap/cppgc/heap.cc +++ b/deps/v8/src/heap/cppgc/heap.cc @@ -40,8 +40,9 @@ std::unique_ptr Heap::Create(std::shared_ptr platform, void Heap::ForceGarbageCollectionSlow(const char* source, const char* reason, Heap::StackState stack_state) { internal::Heap::From(this)->CollectGarbage( - {internal::GarbageCollector::Config::CollectionType::kMajor, - stack_state}); + {internal::GarbageCollector::Config::CollectionType::kMajor, stack_state, + internal::GarbageCollector::Config::MarkingType::kAtomic, + internal::GarbageCollector::Config::SweepingType::kAtomic}); } AllocationHandle& Heap::GetAllocationHandle() { @@ -76,7 +77,7 @@ void CheckConfig(Heap::Config config) { Heap::Heap(std::shared_ptr platform, cppgc::Heap::HeapOptions options) - : HeapBase(platform, options.custom_spaces.size()), + : HeapBase(platform, options.custom_spaces.size(), options.stack_support), gc_invoker_(this, platform_.get(), options.stack_support), growing_(&gc_invoker_, stats_collector_.get(), options.resource_constraints) {} @@ -84,14 +85,54 @@ Heap::Heap(std::shared_ptr platform, Heap::~Heap() { NoGCScope no_gc(*this); // Finish already running GC if any, but don't finalize live objects. - sweeper_.Finish(); + sweeper_.FinishIfRunning(); } void Heap::CollectGarbage(Config config) { + DCHECK_EQ(Config::MarkingType::kAtomic, config.marking_type); CheckConfig(config); if (in_no_gc_scope()) return; + config_ = config; + + if (!gc_in_progress_) StartGarbageCollection(config); + + DCHECK(marker_); + + FinalizeGarbageCollection(config.stack_state); +} + +void Heap::StartIncrementalGarbageCollection(Config config) { + DCHECK_NE(Config::MarkingType::kAtomic, config.marking_type); + CheckConfig(config); + + if (gc_in_progress_ || in_no_gc_scope()) return; + + config_ = config; + + StartGarbageCollection(config); +} + +void Heap::FinalizeIncrementalGarbageCollectionIfRunning(Config config) { + if (!gc_in_progress_) return; + + DCHECK(!in_no_gc_scope()); + + DCHECK_NE(Config::MarkingType::kAtomic, config_.marking_type); + config_ = config; + FinalizeGarbageCollection(config.stack_state); +} + +void Heap::StartGarbageCollection(Config config) { + DCHECK(!gc_in_progress_); + + DCHECK(!in_no_gc_scope()); + + // Finish sweeping in case it is still running. + sweeper_.FinishIfRunning(); + + gc_in_progress_ = true; epoch_++; #if defined(CPPGC_YOUNG_GENERATION) @@ -99,13 +140,18 @@ void Heap::CollectGarbage(Config config) { Unmarker unmarker(&raw_heap()); #endif - // "Marking". - marker_ = std::make_unique(AsBase()); const Marker::MarkingConfig marking_config{ config.collection_type, config.stack_state, config.marking_type}; - marker_->StartMarking(marking_config); - marker_->FinishMarking(marking_config); - // "Sweeping and finalization". + marker_ = MarkerFactory::CreateAndStartMarking( + AsBase(), platform_.get(), marking_config); +} + +void Heap::FinalizeGarbageCollection(Config::StackState stack_state) { + DCHECK(gc_in_progress_); + DCHECK(!in_no_gc_scope()); + config_.stack_state = stack_state; + DCHECK(marker_); + marker_->FinishMarking(stack_state); { // Pre finalizers are forbidden from allocating objects. ObjectAllocator::NoAllocationScope no_allocation_scope_(object_allocator_); @@ -115,13 +161,16 @@ void Heap::CollectGarbage(Config config) { marker_.reset(); // TODO(chromium:1056170): replace build flag with dedicated flag. #if DEBUG - VerifyMarking(config.stack_state); + VerifyMarking(stack_state); #endif { NoGCScope no_gc(*this); - sweeper_.Start(config.sweeping_type); + sweeper_.Start(config_.sweeping_type); } + gc_in_progress_ = false; } +void Heap::DisableHeapGrowingForTesting() { growing_.DisableForTesting(); } + } // namespace internal } // namespace cppgc diff --git a/deps/v8/src/heap/cppgc/heap.h b/deps/v8/src/heap/cppgc/heap.h index 2512afd1fd083f..cd4d3d2bfeb5e6 100644 --- a/deps/v8/src/heap/cppgc/heap.h +++ b/deps/v8/src/heap/cppgc/heap.h @@ -32,14 +32,28 @@ class V8_EXPORT_PRIVATE Heap final : public HeapBase, HeapBase& AsBase() { return *this; } const HeapBase& AsBase() const { return *this; } - void CollectGarbage(Config config) final; + void CollectGarbage(Config) final; + void StartIncrementalGarbageCollection(Config) final; + void FinalizeIncrementalGarbageCollectionIfRunning(Config); size_t epoch() const final { return epoch_; } + void DisableHeapGrowingForTesting(); + private: + void StartGarbageCollection(Config); + void FinalizeGarbageCollection(Config::StackState); + + void FinalizeIncrementalGarbageCollectionIfNeeded( + Config::StackState stack_state) final { + FinalizeGarbageCollection(stack_state); + } + + Config config_; GCInvoker gc_invoker_; HeapGrowing growing_; + bool gc_in_progress_ = false; size_t epoch_ = 0; }; diff --git a/deps/v8/src/heap/cppgc/incremental-marking-schedule.cc b/deps/v8/src/heap/cppgc/incremental-marking-schedule.cc new file mode 100644 index 00000000000000..7e1ff951ab7b74 --- /dev/null +++ b/deps/v8/src/heap/cppgc/incremental-marking-schedule.cc @@ -0,0 +1,74 @@ +// Copyright 2020 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "src/heap/cppgc/incremental-marking-schedule.h" + +#include + +#include "src/heap/cppgc/globals.h" + +namespace cppgc { +namespace internal { + +const double IncrementalMarkingSchedule::kEstimatedMarkingTimeMs = 500.0; +const size_t IncrementalMarkingSchedule::kMinimumMarkedBytesPerIncrementalStep = + 64 * kKB; + +void IncrementalMarkingSchedule::NotifyIncrementalMarkingStart() { + DCHECK(incremental_marking_start_time_.IsNull()); + incremental_marking_start_time_ = v8::base::TimeTicks::Now(); +} + +void IncrementalMarkingSchedule::UpdateIncrementalMarkedBytes( + size_t overall_marked_bytes) { + DCHECK(!incremental_marking_start_time_.IsNull()); + incrementally_marked_bytes_ = overall_marked_bytes; +} + +void IncrementalMarkingSchedule::AddConcurrentlyMarkedBytes( + size_t marked_bytes) { + DCHECK(!incremental_marking_start_time_.IsNull()); + concurrently_marked_bytes_.fetch_add(marked_bytes, std::memory_order_relaxed); +} + +size_t IncrementalMarkingSchedule::GetOverallMarkedBytes() { + return incrementally_marked_bytes_ + + concurrently_marked_bytes_.load(std::memory_order_relaxed); +} + +double IncrementalMarkingSchedule::GetElapsedTimeInMs( + v8::base::TimeTicks start_time) { + if (elapsed_time_for_testing_ != kNoSetElapsedTimeForTesting) { + double elapsed_time = elapsed_time_for_testing_; + elapsed_time_for_testing_ = kNoSetElapsedTimeForTesting; + return elapsed_time; + } + return (v8::base::TimeTicks::Now() - start_time).InMillisecondsF(); +} + +size_t IncrementalMarkingSchedule::GetNextIncrementalStepDuration( + size_t estimated_live_bytes) { + DCHECK(!incremental_marking_start_time_.IsNull()); + double elapsed_time_in_ms = + GetElapsedTimeInMs(incremental_marking_start_time_); + size_t actual_marked_bytes = GetOverallMarkedBytes(); + size_t expected_marked_bytes = std::ceil( + estimated_live_bytes * elapsed_time_in_ms / kEstimatedMarkingTimeMs); + if (expected_marked_bytes < actual_marked_bytes) { + // Marking is ahead of schedule, incremental marking should do the minimum. + return kMinimumMarkedBytesPerIncrementalStep; + } + // Assuming marking will take |kEstimatedMarkingTime|, overall there will + // be |estimated_live_bytes| live bytes to mark, and that marking speed is + // constant, after |elapsed_time| the number of marked_bytes should be + // |estimated_live_bytes| * (|elapsed_time| / |kEstimatedMarkingTime|), + // denoted as |expected_marked_bytes|. If |actual_marked_bytes| is less, + // i.e. marking is behind schedule, incremental marking should help "catch + // up" by marking (|expected_marked_bytes| - |actual_marked_bytes|). + return std::max(kMinimumMarkedBytesPerIncrementalStep, + expected_marked_bytes - actual_marked_bytes); +} + +} // namespace internal +} // namespace cppgc diff --git a/deps/v8/src/heap/cppgc/incremental-marking-schedule.h b/deps/v8/src/heap/cppgc/incremental-marking-schedule.h new file mode 100644 index 00000000000000..3c8a9e1a01f238 --- /dev/null +++ b/deps/v8/src/heap/cppgc/incremental-marking-schedule.h @@ -0,0 +1,53 @@ +// Copyright 2020 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef V8_HEAP_CPPGC_INCREMENTAL_MARKING_SCHEDULE_H_ +#define V8_HEAP_CPPGC_INCREMENTAL_MARKING_SCHEDULE_H_ + +#include + +#include "src/base/platform/time.h" + +namespace cppgc { +namespace internal { + +class V8_EXPORT_PRIVATE IncrementalMarkingSchedule { + public: + // Estimated duration of GC cycle in milliseconds. + static const double kEstimatedMarkingTimeMs; + + // Minimum number of bytes that should be marked during an incremental + // marking step. + static const size_t kMinimumMarkedBytesPerIncrementalStep; + + void NotifyIncrementalMarkingStart(); + + void UpdateIncrementalMarkedBytes(size_t); + void AddConcurrentlyMarkedBytes(size_t); + + size_t GetOverallMarkedBytes(); + + size_t GetNextIncrementalStepDuration(size_t); + + void SetElapsedTimeForTesting(double elapsed_time) { + elapsed_time_for_testing_ = elapsed_time; + } + + private: + double GetElapsedTimeInMs(v8::base::TimeTicks); + + v8::base::TimeTicks incremental_marking_start_time_; + + size_t incrementally_marked_bytes_ = 0; + std::atomic_size_t concurrently_marked_bytes_{0}; + + // Using -1 as sentinel to denote + static constexpr double kNoSetElapsedTimeForTesting = -1; + double elapsed_time_for_testing_ = kNoSetElapsedTimeForTesting; +}; + +} // namespace internal +} // namespace cppgc + +#endif // V8_HEAP_CPPGC_INCREMENTAL_MARKING_SCHEDULE_H_ diff --git a/deps/v8/src/heap/cppgc/marker.cc b/deps/v8/src/heap/cppgc/marker.cc index 104d4d2041ee96..0d044588b65c9e 100644 --- a/deps/v8/src/heap/cppgc/marker.cc +++ b/deps/v8/src/heap/cppgc/marker.cc @@ -7,6 +7,7 @@ #include #include "include/cppgc/internal/process-heap.h" +#include "include/cppgc/platform.h" #include "src/heap/cppgc/heap-object-header.h" #include "src/heap/cppgc/heap-page.h" #include "src/heap/cppgc/heap-visitor.h" @@ -25,28 +26,32 @@ namespace internal { namespace { -void EnterIncrementalMarkingIfNeeded(Marker::MarkingConfig config, +bool EnterIncrementalMarkingIfNeeded(Marker::MarkingConfig config, HeapBase& heap) { if (config.marking_type == Marker::MarkingConfig::MarkingType::kIncremental || config.marking_type == Marker::MarkingConfig::MarkingType::kIncrementalAndConcurrent) { ProcessHeap::EnterIncrementalOrConcurrentMarking(); - } #if defined(CPPGC_CAGED_HEAP) - heap.caged_heap().local_data().is_marking_in_progress = true; + heap.caged_heap().local_data().is_marking_in_progress = true; #endif + return true; + } + return false; } -void ExitIncrementalMarkingIfNeeded(Marker::MarkingConfig config, +bool ExitIncrementalMarkingIfNeeded(Marker::MarkingConfig config, HeapBase& heap) { if (config.marking_type == Marker::MarkingConfig::MarkingType::kIncremental || config.marking_type == Marker::MarkingConfig::MarkingType::kIncrementalAndConcurrent) { ProcessHeap::ExitIncrementalOrConcurrentMarking(); - } #if defined(CPPGC_CAGED_HEAP) - heap.caged_heap().local_data().is_marking_in_progress = false; + heap.caged_heap().local_data().is_marking_in_progress = false; #endif + return true; + } + return false; } // Visit remembered set that was recorded in the generational barrier. @@ -78,26 +83,42 @@ void ResetRememberedSet(HeapBase& heap) { #endif } -template -bool DrainWorklistWithDeadline(v8::base::TimeTicks deadline, Worklist* worklist, - Callback callback, int task_id) { - const size_t kDeadlineCheckInterval = 1250; +static constexpr size_t kDefaultDeadlineCheckInterval = 150u; +template +bool DrainWorklistWithDeadline(Predicate should_yield, + WorklistLocal& worklist_local, + Callback callback) { size_t processed_callback_count = 0; - typename Worklist::View view(worklist, task_id); - typename Worklist::EntryType item; - while (view.Pop(&item)) { + typename WorklistLocal::ItemType item; + while (worklist_local.Pop(&item)) { callback(item); - if (++processed_callback_count == kDeadlineCheckInterval) { - if (deadline <= v8::base::TimeTicks::Now()) { + if (processed_callback_count-- == 0) { + if (should_yield()) { return false; } - processed_callback_count = 0; + processed_callback_count = kDeadlineCheckInterval; } } return true; } +template +bool DrainWorklistWithBytesAndTimeDeadline(MarkingState& marking_state, + size_t marked_bytes_deadline, + v8::base::TimeTicks time_deadline, + WorklistLocal& worklist_local, + Callback callback) { + return DrainWorklistWithDeadline( + [&marking_state, marked_bytes_deadline, time_deadline]() { + return (marked_bytes_deadline <= marking_state.marked_bytes()) || + (time_deadline <= v8::base::TimeTicks::Now()); + }, + worklist_local, callback); +} + void TraceMarkedObject(Visitor* visitor, const HeapObjectHeader* header) { DCHECK(header); DCHECK(!header->IsInConstruction()); @@ -107,15 +128,64 @@ void TraceMarkedObject(Visitor* visitor, const HeapObjectHeader* header) { gcinfo.trace(visitor, header->Payload()); } +size_t GetNextIncrementalStepDuration(IncrementalMarkingSchedule& schedule, + HeapBase& heap) { + return schedule.GetNextIncrementalStepDuration( + heap.stats_collector()->allocated_object_size()); +} + } // namespace -MarkerBase::MarkerBase(HeapBase& heap) +constexpr v8::base::TimeDelta MarkerBase::kMaximumIncrementalStepDuration; + +MarkerBase::IncrementalMarkingTask::IncrementalMarkingTask( + MarkerBase* marker, MarkingConfig::StackState stack_state) + : marker_(marker), + stack_state_(stack_state), + handle_(Handle::NonEmptyTag{}) {} + +// static +MarkerBase::IncrementalMarkingTask::Handle +MarkerBase::IncrementalMarkingTask::Post(cppgc::TaskRunner* runner, + MarkerBase* marker) { + // Incremental GC is possible only via the GCInvoker, so getting here + // guarantees that either non-nestable tasks or conservative stack + // scannnig are supported. This is required so that the incremental + // task can safely finalize GC if needed. + DCHECK_IMPLIES(marker->heap().stack_support() != + HeapBase::StackSupport::kSupportsConservativeStackScan, + runner->NonNestableTasksEnabled()); + MarkingConfig::StackState stack_state_for_task = + runner->NonNestableTasksEnabled() + ? MarkingConfig::StackState::kNoHeapPointers + : MarkingConfig::StackState::kMayContainHeapPointers; + auto task = + std::make_unique(marker, stack_state_for_task); + auto handle = task->handle_; + if (runner->NonNestableTasksEnabled()) { + runner->PostNonNestableTask(std::move(task)); + } else { + runner->PostTask(std::move(task)); + } + return handle; +} + +void MarkerBase::IncrementalMarkingTask::Run() { + if (handle_.IsCanceled()) return; + + if (marker_->IncrementalMarkingStep(stack_state_)) { + // Incremental marking is done so should finalize GC. + marker_->heap().FinalizeIncrementalGarbageCollectionIfNeeded(stack_state_); + } +} + +MarkerBase::MarkerBase(Key, HeapBase& heap, cppgc::Platform* platform, + MarkingConfig config) : heap_(heap), - mutator_marking_state_( - heap, marking_worklists_.marking_worklist(), - marking_worklists_.not_fully_constructed_worklist(), - marking_worklists_.weak_callback_worklist(), - MarkingWorklists::kMutatorThreadId) {} + config_(config), + platform_(platform), + foreground_task_runner_(platform_->GetForegroundTaskRunner()), + mutator_marking_state_(heap, marking_worklists_) {} MarkerBase::~MarkerBase() { // The fixed point iteration may have found not-fully-constructed objects. @@ -125,10 +195,9 @@ MarkerBase::~MarkerBase() { #if DEBUG DCHECK_NE(MarkingConfig::StackState::kNoHeapPointers, config_.stack_state); HeapObjectHeader* header; - MarkingWorklists::NotFullyConstructedWorklist::View view( - marking_worklists_.not_fully_constructed_worklist(), - MarkingWorklists::kMutatorThreadId); - while (view.Pop(&header)) { + MarkingWorklists::NotFullyConstructedWorklist::Local& local = + mutator_marking_state_.not_fully_constructed_worklist(); + while (local.Pop(&header)) { DCHECK(header->IsMarked()); } #else @@ -137,37 +206,52 @@ MarkerBase::~MarkerBase() { } } -void MarkerBase::StartMarking(MarkingConfig config) { +void MarkerBase::StartMarking() { heap().stats_collector()->NotifyMarkingStarted(); - config_ = config; - VisitRoots(); - EnterIncrementalMarkingIfNeeded(config, heap()); + is_marking_started_ = true; + if (EnterIncrementalMarkingIfNeeded(config_, heap())) { + // Performing incremental or concurrent marking. + schedule_.NotifyIncrementalMarkingStart(); + // Scanning the stack is expensive so we only do it at the atomic pause. + VisitRoots(MarkingConfig::StackState::kNoHeapPointers); + ScheduleIncrementalMarkingTask(); + } } -void MarkerBase::EnterAtomicPause(MarkingConfig config) { - ExitIncrementalMarkingIfNeeded(config_, heap()); - config_ = config; +void MarkerBase::EnterAtomicPause(MarkingConfig::StackState stack_state) { + if (ExitIncrementalMarkingIfNeeded(config_, heap())) { + // Cancel remaining incremental tasks. + if (incremental_marking_handle_) incremental_marking_handle_.Cancel(); + } + config_.stack_state = stack_state; + config_.marking_type = MarkingConfig::MarkingType::kAtomic; // VisitRoots also resets the LABs. - VisitRoots(); + VisitRoots(config_.stack_state); if (config_.stack_state == MarkingConfig::StackState::kNoHeapPointers) { - marking_worklists_.FlushNotFullyConstructedObjects(); + mutator_marking_state_.FlushNotFullyConstructedObjects(); } else { MarkNotFullyConstructedObjects(); } } void MarkerBase::LeaveAtomicPause() { + DCHECK(!incremental_marking_handle_); ResetRememberedSet(heap()); heap().stats_collector()->NotifyMarkingCompleted( - mutator_marking_state_.marked_bytes()); + // GetOverallMarkedBytes also includes concurrently marked bytes. + schedule_.GetOverallMarkedBytes()); } -void MarkerBase::FinishMarking(MarkingConfig config) { - EnterAtomicPause(config); - AdvanceMarkingWithDeadline(v8::base::TimeDelta::Max()); +void MarkerBase::FinishMarking(MarkingConfig::StackState stack_state) { + DCHECK(is_marking_started_); + EnterAtomicPause(stack_state); + ProcessWorklistsWithDeadline(std::numeric_limits::max(), + v8::base::TimeTicks::Max()); + mutator_marking_state_.Publish(); LeaveAtomicPause(); + is_marking_started_ = false; } void MarkerBase::ProcessWeakness() { @@ -176,23 +260,22 @@ void MarkerBase::ProcessWeakness() { // Call weak callbacks on objects that may now be pointing to dead objects. MarkingWorklists::WeakCallbackItem item; LivenessBroker broker = LivenessBrokerFactory::Create(); - MarkingWorklists::WeakCallbackWorklist::View view( - marking_worklists_.weak_callback_worklist(), - MarkingWorklists::kMutatorThreadId); - while (view.Pop(&item)) { + MarkingWorklists::WeakCallbackWorklist::Local& local = + mutator_marking_state_.weak_callback_worklist(); + while (local.Pop(&item)) { item.callback(broker, item.parameter); } // Weak callbacks should not add any new objects for marking. DCHECK(marking_worklists_.marking_worklist()->IsEmpty()); } -void MarkerBase::VisitRoots() { +void MarkerBase::VisitRoots(MarkingConfig::StackState stack_state) { // Reset LABs before scanning roots. LABs are cleared to allow // ObjectStartBitmap handling without considering LABs. heap().object_allocator().ResetLinearAllocationBuffers(); heap().GetStrongPersistentRegion().Trace(&visitor()); - if (config_.stack_state != MarkingConfig::StackState::kNoHeapPointers) { + if (stack_state != MarkingConfig::StackState::kNoHeapPointers) { heap().stack()->IteratePointers(&stack_visitor()); } if (config_.collection_type == MarkingConfig::CollectionType::kMinor) { @@ -200,25 +283,79 @@ void MarkerBase::VisitRoots() { } } -bool MarkerBase::AdvanceMarkingWithDeadline(v8::base::TimeDelta duration) { - v8::base::TimeTicks deadline = v8::base::TimeTicks::Now() + duration; +void MarkerBase::ScheduleIncrementalMarkingTask() { + if (!platform_ || !foreground_task_runner_ || incremental_marking_handle_) + return; + incremental_marking_handle_ = + IncrementalMarkingTask::Post(foreground_task_runner_.get(), this); +} + +bool MarkerBase::IncrementalMarkingStepForTesting( + MarkingConfig::StackState stack_state) { + return IncrementalMarkingStep(stack_state); +} + +bool MarkerBase::IncrementalMarkingStep(MarkingConfig::StackState stack_state) { + if (stack_state == MarkingConfig::StackState::kNoHeapPointers) { + mutator_marking_state_.FlushNotFullyConstructedObjects(); + } + config_.stack_state = stack_state; + + return AdvanceMarkingWithDeadline(); +} + +bool MarkerBase::AdvanceMarkingOnAllocation() { + bool is_done = AdvanceMarkingWithDeadline(); + if (is_done) { + // Schedule another incremental task for finalizing without a stack. + ScheduleIncrementalMarkingTask(); + } + return is_done; +} + +bool MarkerBase::AdvanceMarkingWithMaxDuration( + v8::base::TimeDelta max_duration) { + return AdvanceMarkingWithDeadline(max_duration); +} + +bool MarkerBase::AdvanceMarkingWithDeadline(v8::base::TimeDelta max_duration) { + bool is_done = false; + if (!incremental_marking_disabled_for_testing_) { + size_t step_size_in_bytes = + GetNextIncrementalStepDuration(schedule_, heap_); + is_done = ProcessWorklistsWithDeadline( + mutator_marking_state_.marked_bytes() + step_size_in_bytes, + v8::base::TimeTicks::Now() + max_duration); + } + schedule_.UpdateIncrementalMarkedBytes(mutator_marking_state_.marked_bytes()); + if (!is_done) { + // If marking is atomic, |is_done| should always be true. + DCHECK_NE(MarkingConfig::MarkingType::kAtomic, config_.marking_type); + ScheduleIncrementalMarkingTask(); + } + mutator_marking_state_.Publish(); + return is_done; +} +bool MarkerBase::ProcessWorklistsWithDeadline( + size_t marked_bytes_deadline, v8::base::TimeTicks time_deadline) { do { // Convert |previously_not_fully_constructed_worklist_| to // |marking_worklist_|. This merely re-adds items with the proper // callbacks. - if (!DrainWorklistWithDeadline( - deadline, - marking_worklists_.previously_not_fully_constructed_worklist(), + if (!DrainWorklistWithBytesAndTimeDeadline( + mutator_marking_state_, marked_bytes_deadline, time_deadline, + mutator_marking_state_.previously_not_fully_constructed_worklist(), [this](HeapObjectHeader* header) { TraceMarkedObject(&visitor(), header); mutator_marking_state_.AccountMarkedBytes(*header); - }, - MarkingWorklists::kMutatorThreadId)) + })) { return false; + } - if (!DrainWorklistWithDeadline( - deadline, marking_worklists_.marking_worklist(), + if (!DrainWorklistWithBytesAndTimeDeadline( + mutator_marking_state_, marked_bytes_deadline, time_deadline, + mutator_marking_state_.marking_worklist(), [this](const MarkingWorklists::MarkingItem& item) { const HeapObjectHeader& header = HeapObjectHeader::FromPayload(item.base_object_payload); @@ -228,30 +365,28 @@ bool MarkerBase::AdvanceMarkingWithDeadline(v8::base::TimeDelta duration) { header.IsMarked()); item.callback(&visitor(), item.base_object_payload); mutator_marking_state_.AccountMarkedBytes(header); - }, - MarkingWorklists::kMutatorThreadId)) + })) { return false; + } - if (!DrainWorklistWithDeadline( - deadline, marking_worklists_.write_barrier_worklist(), + if (!DrainWorklistWithBytesAndTimeDeadline( + mutator_marking_state_, marked_bytes_deadline, time_deadline, + mutator_marking_state_.write_barrier_worklist(), [this](HeapObjectHeader* header) { TraceMarkedObject(&visitor(), header); mutator_marking_state_.AccountMarkedBytes(*header); - }, - MarkingWorklists::kMutatorThreadId)) + })) { return false; - } while (!marking_worklists_.marking_worklist()->IsLocalViewEmpty( - MarkingWorklists::kMutatorThreadId)); - + } + } while (!mutator_marking_state_.marking_worklist().IsLocalAndGlobalEmpty()); return true; } void MarkerBase::MarkNotFullyConstructedObjects() { HeapObjectHeader* header; - MarkingWorklists::NotFullyConstructedWorklist::View view( - marking_worklists_.not_fully_constructed_worklist(), - MarkingWorklists::kMutatorThreadId); - while (view.Pop(&header)) { + MarkingWorklists::NotFullyConstructedWorklist::Local& local = + mutator_marking_state_.not_fully_constructed_worklist(); + while (local.Pop(&header)) { DCHECK(header); DCHECK(header->IsMarked()); // TraceConservativelyIfNeeded will either push to a worklist @@ -264,8 +399,13 @@ void MarkerBase::ClearAllWorklistsForTesting() { marking_worklists_.ClearForTesting(); } -Marker::Marker(HeapBase& heap) - : MarkerBase(heap), +void MarkerBase::DisableIncrementalMarkingForTesting() { + incremental_marking_disabled_for_testing_ = true; +} + +Marker::Marker(Key key, HeapBase& heap, cppgc::Platform* platform, + MarkingConfig config) + : MarkerBase(key, heap, platform, config), marking_visitor_(heap, mutator_marking_state_), conservative_marking_visitor_(heap, mutator_marking_state_, marking_visitor_) {} diff --git a/deps/v8/src/heap/cppgc/marker.h b/deps/v8/src/heap/cppgc/marker.h index 80a056c436ee9c..47ce9998b403a6 100644 --- a/deps/v8/src/heap/cppgc/marker.h +++ b/deps/v8/src/heap/cppgc/marker.h @@ -11,20 +11,24 @@ #include "include/cppgc/visitor.h" #include "src/base/macros.h" #include "src/base/platform/time.h" +#include "src/heap/base/worklist.h" #include "src/heap/cppgc/globals.h" +#include "src/heap/cppgc/incremental-marking-schedule.h" #include "src/heap/cppgc/marking-state.h" #include "src/heap/cppgc/marking-visitor.h" #include "src/heap/cppgc/marking-worklists.h" -#include "src/heap/cppgc/worklist.h" +#include "src/heap/cppgc/task-handle.h" namespace cppgc { namespace internal { class HeapBase; +class MarkerFactory; // Marking algorithm. Example for a valid call sequence creating the marking // phase: -// 1. StartMarking() +// 1. StartMarking() [Called implicitly when creating a Marker using +// MarkerFactory] // 2. AdvanceMarkingWithDeadline() [Optional, depending on environment.] // 3. EnterAtomicPause() // 4. AdvanceMarkingWithDeadline() @@ -47,9 +51,9 @@ class V8_EXPORT_PRIVATE MarkerBase { static constexpr MarkingConfig Default() { return {}; } - CollectionType collection_type = CollectionType::kMajor; + const CollectionType collection_type = CollectionType::kMajor; StackState stack_state = StackState::kMayContainHeapPointers; - MarkingType marking_type = MarkingType::kAtomic; + MarkingType marking_type = MarkingType::kIncremental; }; virtual ~MarkerBase(); @@ -57,18 +61,19 @@ class V8_EXPORT_PRIVATE MarkerBase { MarkerBase(const MarkerBase&) = delete; MarkerBase& operator=(const MarkerBase&) = delete; - // Initialize marking according to the given config. This method will - // trigger incremental/concurrent marking if needed. - void StartMarking(MarkingConfig config); - // Signals entering the atomic marking pause. The method // - stops incremental/concurrent marking; // - flushes back any in-construction worklists if needed; // - Updates the MarkingConfig if the stack state has changed; - void EnterAtomicPause(MarkingConfig config); + void EnterAtomicPause(MarkingConfig::StackState); // Makes marking progress. - virtual bool AdvanceMarkingWithDeadline(v8::base::TimeDelta); + // TODO(chromium:1056170): Remove TimeDelta argument when unified heap no + // longer uses it. + bool AdvanceMarkingWithMaxDuration(v8::base::TimeDelta); + + // Makes marking progress when allocation a new lab. + bool AdvanceMarkingOnAllocation(); // Signals leaving the atomic marking pause. This method expects no more // objects to be marked and merely updates marking states if needed. @@ -78,7 +83,7 @@ class V8_EXPORT_PRIVATE MarkerBase { // - EnterAtomicPause() // - AdvanceMarkingWithDeadline() // - LeaveAtomicPause() - void FinishMarking(MarkingConfig config); + void FinishMarking(MarkingConfig::StackState); void ProcessWeakness(); @@ -92,27 +97,98 @@ class V8_EXPORT_PRIVATE MarkerBase { cppgc::Visitor& VisitorForTesting() { return visitor(); } void ClearAllWorklistsForTesting(); + bool IncrementalMarkingStepForTesting(MarkingConfig::StackState); + + class IncrementalMarkingTask final : public cppgc::Task { + public: + using Handle = SingleThreadedHandle; + + IncrementalMarkingTask(MarkerBase*, MarkingConfig::StackState); + + static Handle Post(cppgc::TaskRunner*, MarkerBase*); + + private: + void Run() final; + + MarkerBase* const marker_; + MarkingConfig::StackState stack_state_; + // TODO(chromium:1056170): Change to CancelableTask. + Handle handle_; + }; + + void DisableIncrementalMarkingForTesting(); + protected: - explicit MarkerBase(HeapBase& heap); + static constexpr v8::base::TimeDelta kMaximumIncrementalStepDuration = + v8::base::TimeDelta::FromMilliseconds(2); + + class Key { + private: + Key() = default; + friend class MarkerFactory; + }; + + MarkerBase(Key, HeapBase&, cppgc::Platform*, MarkingConfig); + + // Initialize marking according to the given config. This method will + // trigger incremental/concurrent marking if needed. + void StartMarking(); virtual cppgc::Visitor& visitor() = 0; virtual ConservativeTracingVisitor& conservative_visitor() = 0; virtual heap::base::StackVisitor& stack_visitor() = 0; - void VisitRoots(); + // Makes marking progress. + // TODO(chromium:1056170): Remove TimeDelta argument when unified heap no + // longer uses it. + bool AdvanceMarkingWithDeadline( + v8::base::TimeDelta = kMaximumIncrementalStepDuration); + + bool ProcessWorklistsWithDeadline(size_t, v8::base::TimeTicks); + + void VisitRoots(MarkingConfig::StackState); void MarkNotFullyConstructedObjects(); + void ScheduleIncrementalMarkingTask(); + + bool IncrementalMarkingStep(MarkingConfig::StackState); + HeapBase& heap_; MarkingConfig config_ = MarkingConfig::Default(); + cppgc::Platform* platform_; + std::shared_ptr foreground_task_runner_; + IncrementalMarkingTask::Handle incremental_marking_handle_; + MarkingWorklists marking_worklists_; MarkingState mutator_marking_state_; + bool is_marking_started_ = false; + + IncrementalMarkingSchedule schedule_; + + bool incremental_marking_disabled_for_testing_{false}; + + friend class MarkerFactory; +}; + +class V8_EXPORT_PRIVATE MarkerFactory { + public: + template + static std::unique_ptr CreateAndStartMarking(Args&&... args) { + static_assert(std::is_base_of::value, + "MarkerFactory can only create subclasses of MarkerBase"); + std::unique_ptr marker = + std::make_unique(MarkerBase::Key(), std::forward(args)...); + marker->StartMarking(); + return marker; + } }; class V8_EXPORT_PRIVATE Marker final : public MarkerBase { public: - explicit Marker(HeapBase&); + Marker(Key, HeapBase&, cppgc::Platform*, + MarkingConfig = MarkingConfig::Default()); protected: cppgc::Visitor& visitor() final { return marking_visitor_; } @@ -129,18 +205,11 @@ class V8_EXPORT_PRIVATE Marker final : public MarkerBase { }; void MarkerBase::WriteBarrierForInConstructionObject(HeapObjectHeader& header) { - MarkingWorklists::NotFullyConstructedWorklist::View - not_fully_constructed_worklist( - marking_worklists_.not_fully_constructed_worklist(), - MarkingWorklists::kMutatorThreadId); - not_fully_constructed_worklist.Push(&header); + mutator_marking_state_.not_fully_constructed_worklist().Push(&header); } void MarkerBase::WriteBarrierForObject(HeapObjectHeader& header) { - MarkingWorklists::WriteBarrierWorklist::View write_barrier_worklist( - marking_worklists_.write_barrier_worklist(), - MarkingWorklists::kMutatorThreadId); - write_barrier_worklist.Push(&header); + mutator_marking_state_.write_barrier_worklist().Push(&header); } } // namespace internal diff --git a/deps/v8/src/heap/cppgc/marking-state.cc b/deps/v8/src/heap/cppgc/marking-state.cc new file mode 100644 index 00000000000000..0cc160bd0dc996 --- /dev/null +++ b/deps/v8/src/heap/cppgc/marking-state.cc @@ -0,0 +1,20 @@ +// Copyright 2020 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "src/heap/cppgc/marking-state.h" + +namespace cppgc { +namespace internal { + +void MarkingState::FlushNotFullyConstructedObjects() { + not_fully_constructed_worklist().Publish(); + if (!not_fully_constructed_worklist_.IsGlobalEmpty()) { + previously_not_fully_constructed_worklist_.Merge( + ¬_fully_constructed_worklist_); + } + DCHECK(not_fully_constructed_worklist_.IsGlobalEmpty()); +} + +} // namespace internal +} // namespace cppgc diff --git a/deps/v8/src/heap/cppgc/marking-state.h b/deps/v8/src/heap/cppgc/marking-state.h index b27956964f1ff2..526633d455eee2 100644 --- a/deps/v8/src/heap/cppgc/marking-state.h +++ b/deps/v8/src/heap/cppgc/marking-state.h @@ -18,9 +18,7 @@ namespace internal { // C++ marking implementation. class MarkingState { public: - inline MarkingState(HeapBase& heap, MarkingWorklists::MarkingWorklist*, - MarkingWorklists::NotFullyConstructedWorklist*, - MarkingWorklists::WeakCallbackWorklist*, int); + inline MarkingState(HeapBase& heap, MarkingWorklists&); MarkingState(const MarkingState&) = delete; MarkingState& operator=(const MarkingState&) = delete; @@ -44,31 +42,64 @@ class MarkingState { inline void AccountMarkedBytes(const HeapObjectHeader&); size_t marked_bytes() const { return marked_bytes_; } + void Publish() { + marking_worklist_.Publish(); + not_fully_constructed_worklist_.Publish(); + previously_not_fully_constructed_worklist_.Publish(); + weak_callback_worklist_.Publish(); + write_barrier_worklist_.Publish(); + } + + // Moves objects in not_fully_constructed_worklist_ to + // previously_not_full_constructed_worklists_. + void FlushNotFullyConstructedObjects(); + + MarkingWorklists::MarkingWorklist::Local& marking_worklist() { + return marking_worklist_; + } + MarkingWorklists::NotFullyConstructedWorklist::Local& + not_fully_constructed_worklist() { + return not_fully_constructed_worklist_; + } + MarkingWorklists::NotFullyConstructedWorklist::Local& + previously_not_fully_constructed_worklist() { + return previously_not_fully_constructed_worklist_; + } + MarkingWorklists::WeakCallbackWorklist::Local& weak_callback_worklist() { + return weak_callback_worklist_; + } + MarkingWorklists::WriteBarrierWorklist::Local& write_barrier_worklist() { + return write_barrier_worklist_; + } + private: #ifdef DEBUG HeapBase& heap_; #endif // DEBUG - MarkingWorklists::MarkingWorklist::View marking_worklist_; - MarkingWorklists::NotFullyConstructedWorklist::View + MarkingWorklists::MarkingWorklist::Local marking_worklist_; + MarkingWorklists::NotFullyConstructedWorklist::Local not_fully_constructed_worklist_; - MarkingWorklists::WeakCallbackWorklist::View weak_callback_worklist_; + MarkingWorklists::NotFullyConstructedWorklist::Local + previously_not_fully_constructed_worklist_; + MarkingWorklists::WeakCallbackWorklist::Local weak_callback_worklist_; + MarkingWorklists::WriteBarrierWorklist::Local write_barrier_worklist_; size_t marked_bytes_ = 0; }; -MarkingState::MarkingState( - HeapBase& heap, MarkingWorklists::MarkingWorklist* marking_worklist, - MarkingWorklists::NotFullyConstructedWorklist* - not_fully_constructed_worklist, - MarkingWorklists::WeakCallbackWorklist* weak_callback_worklist, int task_id) +MarkingState::MarkingState(HeapBase& heap, MarkingWorklists& marking_worklists) : #ifdef DEBUG heap_(heap), #endif // DEBUG - marking_worklist_(marking_worklist, task_id), - not_fully_constructed_worklist_(not_fully_constructed_worklist, task_id), - weak_callback_worklist_(weak_callback_worklist, task_id) { + marking_worklist_(marking_worklists.marking_worklist()), + not_fully_constructed_worklist_( + marking_worklists.not_fully_constructed_worklist()), + previously_not_fully_constructed_worklist_( + marking_worklists.previously_not_fully_constructed_worklist()), + weak_callback_worklist_(marking_worklists.weak_callback_worklist()), + write_barrier_worklist_(marking_worklists.write_barrier_worklist()) { } void MarkingState::MarkAndPush(const void* object, TraceDescriptor desc) { diff --git a/deps/v8/src/heap/cppgc/marking-verifier.cc b/deps/v8/src/heap/cppgc/marking-verifier.cc index 58c1368f994f01..4238709ae15978 100644 --- a/deps/v8/src/heap/cppgc/marking-verifier.cc +++ b/deps/v8/src/heap/cppgc/marking-verifier.cc @@ -16,8 +16,11 @@ MarkingVerifier::MarkingVerifier(HeapBase& heap, : cppgc::Visitor(VisitorFactory::CreateKey()), ConservativeTracingVisitor(heap, *heap.page_backend(), *this) { Traverse(&heap.raw_heap()); - if (stack_state == Heap::Config::StackState::kMayContainHeapPointers) + if (stack_state == Heap::Config::StackState::kMayContainHeapPointers) { + in_construction_objects_ = &in_construction_objects_stack_; heap.stack()->IteratePointers(this); + CHECK_EQ(in_construction_objects_stack_, in_construction_objects_heap_); + } } void MarkingVerifier::Visit(const void* object, TraceDescriptor desc) { @@ -42,6 +45,8 @@ void MarkingVerifier::VerifyChild(const void* base_object_payload) { void MarkingVerifier::VisitConservatively( HeapObjectHeader& header, TraceConservativelyCallback callback) { CHECK(header.IsMarked()); + in_construction_objects_->insert(&header); + callback(this, header); } void MarkingVerifier::VisitPointer(const void* address) { @@ -54,8 +59,14 @@ bool MarkingVerifier::VisitHeapObjectHeader(HeapObjectHeader* header) { DCHECK(!header->IsFree()); - GlobalGCInfoTable::GCInfoFromIndex(header->GetGCInfoIndex()) - .trace(this, header->Payload()); + if (!header->IsInConstruction()) { + GlobalGCInfoTable::GCInfoFromIndex(header->GetGCInfoIndex()) + .trace(this, header->Payload()); + } else { + // Dispatches to conservative tracing implementation. + TraceConservativelyIfNeeded(*header); + } + return true; } diff --git a/deps/v8/src/heap/cppgc/marking-verifier.h b/deps/v8/src/heap/cppgc/marking-verifier.h index 440b198dd5619a..45661bd4654c98 100644 --- a/deps/v8/src/heap/cppgc/marking-verifier.h +++ b/deps/v8/src/heap/cppgc/marking-verifier.h @@ -5,6 +5,8 @@ #ifndef V8_HEAP_CPPGC_MARKING_VERIFIER_H_ #define V8_HEAP_CPPGC_MARKING_VERIFIER_H_ +#include + #include "src/heap/base/stack.h" #include "src/heap/cppgc/heap-visitor.h" #include "src/heap/cppgc/heap.h" @@ -34,6 +36,11 @@ class V8_EXPORT_PRIVATE MarkingVerifier final void VisitPointer(const void*) final; bool VisitHeapObjectHeader(HeapObjectHeader*); + + std::unordered_set in_construction_objects_heap_; + std::unordered_set in_construction_objects_stack_; + std::unordered_set* in_construction_objects_ = + &in_construction_objects_heap_; }; } // namespace internal diff --git a/deps/v8/src/heap/cppgc/marking-visitor.h b/deps/v8/src/heap/cppgc/marking-visitor.h index 0bfc96b7d0648d..408fa2514c4483 100644 --- a/deps/v8/src/heap/cppgc/marking-visitor.h +++ b/deps/v8/src/heap/cppgc/marking-visitor.h @@ -23,7 +23,7 @@ class V8_EXPORT_PRIVATE MarkingVisitor : public VisitorBase { MarkingVisitor(HeapBase&, MarkingState&); ~MarkingVisitor() override = default; - private: + protected: void Visit(const void*, TraceDescriptor) final; void VisitWeak(const void*, TraceDescriptor, WeakCallback, const void*) final; void VisitRoot(const void*, TraceDescriptor) final; diff --git a/deps/v8/src/heap/cppgc/marking-worklists.cc b/deps/v8/src/heap/cppgc/marking-worklists.cc index ecbfe48d82b863..15d78fd4cf68cb 100644 --- a/deps/v8/src/heap/cppgc/marking-worklists.cc +++ b/deps/v8/src/heap/cppgc/marking-worklists.cc @@ -18,15 +18,5 @@ void MarkingWorklists::ClearForTesting() { weak_callback_worklist_.Clear(); } -void MarkingWorklists::FlushNotFullyConstructedObjects() { - if (!not_fully_constructed_worklist_.IsLocalViewEmpty(kMutatorThreadId)) { - not_fully_constructed_worklist_.FlushToGlobal(kMutatorThreadId); - previously_not_fully_constructed_worklist_.MergeGlobalPool( - ¬_fully_constructed_worklist_); - } - DCHECK(not_fully_constructed_worklist_.IsLocalViewEmpty( - MarkingWorklists::kMutatorThreadId)); -} - } // namespace internal } // namespace cppgc diff --git a/deps/v8/src/heap/cppgc/marking-worklists.h b/deps/v8/src/heap/cppgc/marking-worklists.h index b38d77780d2966..96d11eef5383d4 100644 --- a/deps/v8/src/heap/cppgc/marking-worklists.h +++ b/deps/v8/src/heap/cppgc/marking-worklists.h @@ -6,7 +6,7 @@ #define V8_HEAP_CPPGC_MARKING_WORKLISTS_H_ #include "include/cppgc/visitor.h" -#include "src/heap/cppgc/worklist.h" +#include "src/heap/base/worklist.h" namespace cppgc { namespace internal { @@ -14,9 +14,6 @@ namespace internal { class HeapObjectHeader; class MarkingWorklists { - static constexpr int kNumConcurrentMarkers = 0; - static constexpr int kNumMarkers = 1 + kNumConcurrentMarkers; - public: static constexpr int kMutatorThreadId = 0; @@ -29,13 +26,13 @@ class MarkingWorklists { // Segment size of 512 entries necessary to avoid throughput regressions. // Since the work list is currently a temporary object this is not a problem. using MarkingWorklist = - Worklist; + heap::base::Worklist; using NotFullyConstructedWorklist = - Worklist; + heap::base::Worklist; using WeakCallbackWorklist = - Worklist; + heap::base::Worklist; using WriteBarrierWorklist = - Worklist; + heap::base::Worklist; MarkingWorklist* marking_worklist() { return &marking_worklist_; } NotFullyConstructedWorklist* not_fully_constructed_worklist() { @@ -51,10 +48,6 @@ class MarkingWorklists { return &weak_callback_worklist_; } - // Moves objects in not_fully_constructed_worklist_ to - // previously_not_full_constructed_worklists_. - void FlushNotFullyConstructedObjects(); - void ClearForTesting(); private: diff --git a/deps/v8/src/heap/cppgc/object-allocator.cc b/deps/v8/src/heap/cppgc/object-allocator.cc index 131ab604017caa..fdc50d0caba9fc 100644 --- a/deps/v8/src/heap/cppgc/object-allocator.cc +++ b/deps/v8/src/heap/cppgc/object-allocator.cc @@ -110,6 +110,7 @@ void* ObjectAllocator::OutOfLineAllocate(NormalPageSpace* space, size_t size, GCInfoIndex gcinfo) { void* memory = OutOfLineAllocateImpl(space, size, gcinfo); stats_collector_->NotifySafePointForConservativeCollection(); + raw_heap_->heap()->AdvanceIncrementalGarbageCollectionOnAllocationIfNeeded(); return memory; } @@ -136,7 +137,7 @@ void* ObjectAllocator::OutOfLineAllocateImpl(NormalPageSpace* space, // TODO(chromium:1056170): Add lazy sweep. // 4. Complete sweeping. - raw_heap_->heap()->sweeper().Finish(); + raw_heap_->heap()->sweeper().FinishIfRunning(); // 5. Add a new page to this heap. auto* new_page = NormalPage::Create(page_backend_, space); diff --git a/deps/v8/src/heap/cppgc/prefinalizer-handler.cc b/deps/v8/src/heap/cppgc/prefinalizer-handler.cc index 97dca47dac759c..c20b5ec7213b4a 100644 --- a/deps/v8/src/heap/cppgc/prefinalizer-handler.cc +++ b/deps/v8/src/heap/cppgc/prefinalizer-handler.cc @@ -25,7 +25,7 @@ void PreFinalizerRegistrationDispatcher::RegisterPrefinalizer( } bool PreFinalizerRegistrationDispatcher::PreFinalizer::operator==( - const PreFinalizer& other) { + const PreFinalizer& other) const { return (object == other.object) && (callback == other.callback); } diff --git a/deps/v8/src/heap/cppgc/stats-collector.cc b/deps/v8/src/heap/cppgc/stats-collector.cc index a92aba021d7a73..dd6d6788773308 100644 --- a/deps/v8/src/heap/cppgc/stats-collector.cc +++ b/deps/v8/src/heap/cppgc/stats-collector.cc @@ -80,13 +80,25 @@ void StatsCollector::NotifyMarkingCompleted(size_t marked_bytes) { DCHECK_EQ(GarbageCollectionState::kMarking, gc_state_); gc_state_ = GarbageCollectionState::kSweeping; current_.marked_bytes = marked_bytes; - allocated_bytes_since_end_of_marking_ = 0; allocated_bytes_since_safepoint_ = 0; explicitly_freed_bytes_since_safepoint_ = 0; ForAllAllocationObservers([marked_bytes](AllocationObserver* observer) { observer->ResetAllocatedObjectSize(marked_bytes); }); + + // HeapGrowing would use the below fields to estimate allocation rate during + // execution of ResetAllocatedObjectSize. + allocated_bytes_since_end_of_marking_ = 0; + time_of_last_end_of_marking_ = v8::base::TimeTicks::Now(); +} + +double StatsCollector::GetRecentAllocationSpeedInBytesPerMs() const { + v8::base::TimeTicks current_time = v8::base::TimeTicks::Now(); + DCHECK_LE(time_of_last_end_of_marking_, current_time); + if (time_of_last_end_of_marking_ == current_time) return 0; + return allocated_bytes_since_end_of_marking_ / + (current_time - time_of_last_end_of_marking_).InMillisecondsF(); } const StatsCollector::Event& StatsCollector::NotifySweepingCompleted() { diff --git a/deps/v8/src/heap/cppgc/stats-collector.h b/deps/v8/src/heap/cppgc/stats-collector.h index cc122a17dd51d3..795832ba478ab3 100644 --- a/deps/v8/src/heap/cppgc/stats-collector.h +++ b/deps/v8/src/heap/cppgc/stats-collector.h @@ -11,6 +11,7 @@ #include #include "src/base/macros.h" +#include "src/base/platform/time.h" namespace cppgc { namespace internal { @@ -79,6 +80,8 @@ class V8_EXPORT_PRIVATE StatsCollector final { // bytes and the bytes allocated since last marking. size_t allocated_object_size() const; + double GetRecentAllocationSpeedInBytesPerMs() const; + private: enum class GarbageCollectionState : uint8_t { kNotRunning, @@ -97,6 +100,7 @@ class V8_EXPORT_PRIVATE StatsCollector final { // an object was explicitly freed that was marked as live in the previous // cycle. int64_t allocated_bytes_since_end_of_marking_ = 0; + v8::base::TimeTicks time_of_last_end_of_marking_ = v8::base::TimeTicks::Now(); // Counters for allocation and free. The individual values are never negative // but their delta may be because of the same reason the overall // allocated_bytes_since_end_of_marking_ may be negative. Keep integer diff --git a/deps/v8/src/heap/cppgc/sweeper.cc b/deps/v8/src/heap/cppgc/sweeper.cc index 9595ae30cfbc0c..986ea6f4fa006a 100644 --- a/deps/v8/src/heap/cppgc/sweeper.cc +++ b/deps/v8/src/heap/cppgc/sweeper.cc @@ -384,14 +384,14 @@ class MutatorThreadSweeper final : private HeapVisitor { cppgc::Platform* platform_; }; -class ConcurrentSweepTask final : public v8::JobTask, +class ConcurrentSweepTask final : public cppgc::JobTask, private HeapVisitor { friend class HeapVisitor; public: explicit ConcurrentSweepTask(SpaceStates* states) : states_(states) {} - void Run(v8::JobDelegate* delegate) final { + void Run(cppgc::JobDelegate* delegate) final { for (SpaceState& state : *states_) { while (auto page = state.unswept_pages.Pop()) { Traverse(*page); @@ -401,7 +401,7 @@ class ConcurrentSweepTask final : public v8::JobTask, is_completed_.store(true, std::memory_order_relaxed); } - size_t GetMaxConcurrency() const final { + size_t GetMaxConcurrency(size_t /* active_worker_count */) const final { return is_completed_.load(std::memory_order_relaxed) ? 0 : 1; } @@ -499,9 +499,15 @@ class Sweeper::SweeperImpl final { } } - void Finish() { + void FinishIfRunning() { if (!is_in_progress_) return; + Finish(); + } + + void Finish() { + DCHECK(is_in_progress_); + // First, call finalizers on the mutator thread. SweepFinalizer finalizer(platform_); finalizer.FinalizeHeap(&space_states_); @@ -519,14 +525,14 @@ class Sweeper::SweeperImpl final { } private: - class IncrementalSweepTask : public v8::IdleTask { + class IncrementalSweepTask : public cppgc::IdleTask { public: using Handle = SingleThreadedHandle; explicit IncrementalSweepTask(SweeperImpl* sweeper) : sweeper_(sweeper), handle_(Handle::NonEmptyTag{}) {} - static Handle Post(SweeperImpl* sweeper, v8::TaskRunner* runner) { + static Handle Post(SweeperImpl* sweeper, cppgc::TaskRunner* runner) { auto task = std::make_unique(sweeper); auto handle = task->GetHandle(); runner->PostIdleTask(std::move(task)); @@ -567,7 +573,7 @@ class Sweeper::SweeperImpl final { if (!platform_) return; concurrent_sweeper_handle_ = platform_->PostJob( - v8::TaskPriority::kUserVisible, + cppgc::TaskPriority::kUserVisible, std::make_unique(&space_states_)); } @@ -587,9 +593,9 @@ class Sweeper::SweeperImpl final { StatsCollector* stats_collector_; SpaceStates space_states_; cppgc::Platform* platform_; - std::shared_ptr foreground_task_runner_; + std::shared_ptr foreground_task_runner_; IncrementalSweepTask::Handle incremental_sweeper_handle_; - std::unique_ptr concurrent_sweeper_handle_; + std::unique_ptr concurrent_sweeper_handle_; bool is_in_progress_ = false; }; @@ -600,7 +606,7 @@ Sweeper::Sweeper(RawHeap* heap, cppgc::Platform* platform, Sweeper::~Sweeper() = default; void Sweeper::Start(Config config) { impl_->Start(config); } -void Sweeper::Finish() { impl_->Finish(); } +void Sweeper::FinishIfRunning() { impl_->FinishIfRunning(); } } // namespace internal } // namespace cppgc diff --git a/deps/v8/src/heap/cppgc/sweeper.h b/deps/v8/src/heap/cppgc/sweeper.h index 6ce17ea8fc84a4..e94036521ee410 100644 --- a/deps/v8/src/heap/cppgc/sweeper.h +++ b/deps/v8/src/heap/cppgc/sweeper.h @@ -30,7 +30,7 @@ class V8_EXPORT_PRIVATE Sweeper final { // Sweeper::Start assumes the heap holds no linear allocation buffers. void Start(Config); - void Finish(); + void FinishIfRunning(); private: class SweeperImpl; diff --git a/deps/v8/src/heap/cppgc/worklist.h b/deps/v8/src/heap/cppgc/worklist.h deleted file mode 100644 index 5993d6a04e3919..00000000000000 --- a/deps/v8/src/heap/cppgc/worklist.h +++ /dev/null @@ -1,473 +0,0 @@ -// Copyright 2020 the V8 project authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef V8_HEAP_CPPGC_WORKLIST_H_ -#define V8_HEAP_CPPGC_WORKLIST_H_ - -#include -#include - -#include "src/base/atomic-utils.h" -#include "src/base/logging.h" -#include "src/base/platform/mutex.h" -#include "testing/gtest/include/gtest/gtest_prod.h" // nogncheck - -namespace cppgc { -namespace internal { - -// A concurrent worklist based on segments. Each tasks gets private -// push and pop segments. Empty pop segments are swapped with their -// corresponding push segments. Full push segments are published to a global -// pool of segments and replaced with empty segments. -// -// Work stealing is best effort, i.e., there is no way to inform other tasks -// of the need of items. -template -class Worklist { - using WorklistType = Worklist; - - public: - using EntryType = EntryType_; - static constexpr int kMaxNumTasks = max_num_tasks; - static constexpr size_t kSegmentCapacity = SEGMENT_SIZE; - - class View { - public: - View(WorklistType* worklist, int task_id) - : worklist_(worklist), task_id_(task_id) {} - - // Pushes an entry onto the worklist. - bool Push(EntryType entry) { return worklist_->Push(task_id_, entry); } - - // Pops an entry from the worklist. - bool Pop(EntryType* entry) { return worklist_->Pop(task_id_, entry); } - - // Returns true if the local portion of the worklist is empty. - bool IsLocalEmpty() const { return worklist_->IsLocalEmpty(task_id_); } - - // Returns true if the worklist is empty. Can only be used from the main - // thread without concurrent access. - bool IsEmpty() const { return worklist_->IsEmpty(); } - - bool IsGlobalPoolEmpty() const { return worklist_->IsGlobalPoolEmpty(); } - - // Returns true if the local portion and the global pool are empty (i.e. - // whether the current view cannot pop anymore). - bool IsLocalViewEmpty() const { - return worklist_->IsLocalViewEmpty(task_id_); - } - - void FlushToGlobal() { worklist_->FlushToGlobal(task_id_); } - - void* operator new(size_t, void* location) = delete; - void* operator new(size_t) = delete; - - private: - WorklistType* const worklist_; - const int task_id_; - }; - - Worklist() : Worklist(kMaxNumTasks) {} - - explicit Worklist(int num_tasks) : num_tasks_(num_tasks) { - DCHECK_LE(num_tasks_, kMaxNumTasks); - for (int i = 0; i < num_tasks_; i++) { - private_push_segment(i) = NewSegment(); - private_pop_segment(i) = NewSegment(); - } - } - - ~Worklist() { - CHECK(IsEmpty()); - for (int i = 0; i < num_tasks_; i++) { - DCHECK_NOT_NULL(private_push_segment(i)); - DCHECK_NOT_NULL(private_pop_segment(i)); - delete private_push_segment(i); - delete private_pop_segment(i); - } - } - - // Swaps content with the given worklist. Local buffers need to - // be empty, not thread safe. - void Swap(Worklist& other) { - CHECK(AreLocalsEmpty()); - CHECK(other.AreLocalsEmpty()); - - global_pool_.Swap(other.global_pool_); - } - - bool Push(int task_id, EntryType entry) { - DCHECK_LT(task_id, num_tasks_); - DCHECK_NOT_NULL(private_push_segment(task_id)); - if (!private_push_segment(task_id)->Push(entry)) { - PublishPushSegmentToGlobal(task_id); - bool success = private_push_segment(task_id)->Push(entry); - USE(success); - DCHECK(success); - } - return true; - } - - bool Pop(int task_id, EntryType* entry) { - DCHECK_LT(task_id, num_tasks_); - DCHECK_NOT_NULL(private_pop_segment(task_id)); - if (!private_pop_segment(task_id)->Pop(entry)) { - if (!private_push_segment(task_id)->IsEmpty()) { - Segment* tmp = private_pop_segment(task_id); - private_pop_segment(task_id) = private_push_segment(task_id); - private_push_segment(task_id) = tmp; - } else if (!StealPopSegmentFromGlobal(task_id)) { - return false; - } - bool success = private_pop_segment(task_id)->Pop(entry); - USE(success); - DCHECK(success); - } - return true; - } - - size_t LocalPushSegmentSize(int task_id) const { - return private_push_segment(task_id)->Size(); - } - - bool IsLocalEmpty(int task_id) const { - return private_pop_segment(task_id)->IsEmpty() && - private_push_segment(task_id)->IsEmpty(); - } - - bool IsGlobalPoolEmpty() const { return global_pool_.IsEmpty(); } - - bool IsEmpty() const { - if (!AreLocalsEmpty()) return false; - return IsGlobalPoolEmpty(); - } - - bool AreLocalsEmpty() const { - for (int i = 0; i < num_tasks_; i++) { - if (!IsLocalEmpty(i)) return false; - } - return true; - } - - bool IsLocalViewEmpty(int task_id) const { - return IsLocalEmpty(task_id) && IsGlobalPoolEmpty(); - } - - size_t LocalSize(int task_id) const { - return private_pop_segment(task_id)->Size() + - private_push_segment(task_id)->Size(); - } - - // Thread-safe but may return an outdated result. - size_t GlobalPoolSize() const { return global_pool_.Size(); } - - // Clears all segments. Frees the global segment pool. - // - // Assumes that no other tasks are running. - void Clear() { - for (int i = 0; i < num_tasks_; i++) { - private_pop_segment(i)->Clear(); - private_push_segment(i)->Clear(); - } - global_pool_.Clear(); - } - - // Calls the specified callback on each element of the deques and replaces - // the element with the result of the callback. - // The signature of the callback is - // bool Callback(EntryType old, EntryType* new). - // If the callback returns |false| then the element is removed from the - // worklist. Otherwise the |new| entry is updated. - // - // Assumes that no other tasks are running. - template - void Update(Callback callback) { - for (int i = 0; i < num_tasks_; i++) { - private_pop_segment(i)->Update(callback); - private_push_segment(i)->Update(callback); - } - global_pool_.Update(callback); - } - - // Calls the specified callback on each element of the deques. - // The signature of the callback is: - // void Callback(EntryType entry). - // - // Assumes that no other tasks are running. - template - void Iterate(Callback callback) { - for (int i = 0; i < num_tasks_; i++) { - private_pop_segment(i)->Iterate(callback); - private_push_segment(i)->Iterate(callback); - } - global_pool_.Iterate(callback); - } - - template - void IterateGlobalPool(Callback callback) { - global_pool_.Iterate(callback); - } - - void FlushToGlobal(int task_id) { - PublishPushSegmentToGlobal(task_id); - PublishPopSegmentToGlobal(task_id); - } - - void MergeGlobalPool(Worklist* other) { - global_pool_.Merge(&other->global_pool_); - } - - private: - FRIEND_TEST(CppgcWorkListTest, SegmentCreate); - FRIEND_TEST(CppgcWorkListTest, SegmentPush); - FRIEND_TEST(CppgcWorkListTest, SegmentPushPop); - FRIEND_TEST(CppgcWorkListTest, SegmentIsEmpty); - FRIEND_TEST(CppgcWorkListTest, SegmentIsFull); - FRIEND_TEST(CppgcWorkListTest, SegmentClear); - FRIEND_TEST(CppgcWorkListTest, SegmentFullPushFails); - FRIEND_TEST(CppgcWorkListTest, SegmentEmptyPopFails); - FRIEND_TEST(CppgcWorkListTest, SegmentUpdateFalse); - FRIEND_TEST(CppgcWorkListTest, SegmentUpdate); - - class Segment { - public: - static const size_t kCapacity = kSegmentCapacity; - - Segment() : index_(0) {} - - bool Push(EntryType entry) { - if (IsFull()) return false; - entries_[index_++] = entry; - return true; - } - - bool Pop(EntryType* entry) { - if (IsEmpty()) return false; - *entry = entries_[--index_]; - return true; - } - - size_t Size() const { return index_; } - bool IsEmpty() const { return index_ == 0; } - bool IsFull() const { return index_ == kCapacity; } - void Clear() { index_ = 0; } - - template - void Update(Callback callback) { - size_t new_index = 0; - for (size_t i = 0; i < index_; i++) { - if (callback(entries_[i], &entries_[new_index])) { - new_index++; - } - } - index_ = new_index; - } - - template - void Iterate(Callback callback) const { - for (size_t i = 0; i < index_; i++) { - callback(entries_[i]); - } - } - - Segment* next() const { return next_; } - void set_next(Segment* segment) { next_ = segment; } - - private: - Segment* next_; - size_t index_; - EntryType entries_[kCapacity]; - }; - - struct PrivateSegmentHolder { - Segment* private_push_segment; - Segment* private_pop_segment; - char cache_line_padding[64]; - }; - - class GlobalPool { - public: - GlobalPool() : top_(nullptr) {} - - // Swaps contents, not thread safe. - void Swap(GlobalPool& other) { - Segment* temp = top_; - set_top(other.top_); - other.set_top(temp); - size_t other_size = other.size_.exchange( - size_.load(std::memory_order_relaxed), std::memory_order_relaxed); - size_.store(other_size, std::memory_order_relaxed); - } - - V8_INLINE void Push(Segment* segment) { - v8::base::MutexGuard guard(&lock_); - segment->set_next(top_); - set_top(segment); - size_.fetch_add(1, std::memory_order_relaxed); - } - - V8_INLINE bool Pop(Segment** segment) { - v8::base::MutexGuard guard(&lock_); - if (top_) { - DCHECK_LT(0U, size_); - size_.fetch_sub(1, std::memory_order_relaxed); - *segment = top_; - set_top(top_->next()); - return true; - } - return false; - } - - V8_INLINE bool IsEmpty() const { - return v8::base::AsAtomicPtr(&top_)->load(std::memory_order_relaxed) == - nullptr; - } - - V8_INLINE size_t Size() const { - // It is safe to read |size_| without a lock since this variable is - // atomic, keeping in mind that threads may not immediately see the new - // value when it is updated. - return size_.load(std::memory_order_relaxed); - } - - void Clear() { - v8::base::MutexGuard guard(&lock_); - size_.store(0, std::memory_order_relaxed); - Segment* current = top_; - while (current) { - Segment* tmp = current; - current = current->next(); - delete tmp; - } - set_top(nullptr); - } - - // See Worklist::Update. - template - void Update(Callback callback) { - v8::base::MutexGuard guard(&lock_); - Segment* prev = nullptr; - Segment* current = top_; - while (current) { - current->Update(callback); - if (current->IsEmpty()) { - DCHECK_LT(0U, size_); - size_.fetch_sub(1, std::memory_order_relaxed); - if (!prev) { - top_ = current->next(); - } else { - prev->set_next(current->next()); - } - Segment* tmp = current; - current = current->next(); - delete tmp; - } else { - prev = current; - current = current->next(); - } - } - } - - // See Worklist::Iterate. - template - void Iterate(Callback callback) { - v8::base::MutexGuard guard(&lock_); - for (Segment* current = top_; current; current = current->next()) { - current->Iterate(callback); - } - } - - void Merge(GlobalPool* other) { - Segment* top = nullptr; - size_t other_size = 0; - { - v8::base::MutexGuard guard(&other->lock_); - if (!other->top_) return; - top = other->top_; - other_size = other->size_.load(std::memory_order_relaxed); - other->size_.store(0, std::memory_order_relaxed); - other->set_top(nullptr); - } - - // It's safe to iterate through these segments because the top was - // extracted from |other|. - Segment* end = top; - while (end->next()) end = end->next(); - - { - v8::base::MutexGuard guard(&lock_); - size_.fetch_add(other_size, std::memory_order_relaxed); - end->set_next(top_); - set_top(top); - } - } - - void* operator new(size_t, void* location) = delete; - void* operator new(size_t) = delete; - - private: - void set_top(Segment* segment) { - v8::base::AsAtomicPtr(&top_)->store(segment, std::memory_order_relaxed); - } - - v8::base::Mutex lock_; - Segment* top_; - std::atomic size_{0}; - }; - - V8_INLINE Segment*& private_push_segment(int task_id) { - return private_segments_[task_id].private_push_segment; - } - - V8_INLINE Segment* const& private_push_segment(int task_id) const { - return private_segments_[task_id].private_push_segment; - } - - V8_INLINE Segment*& private_pop_segment(int task_id) { - return private_segments_[task_id].private_pop_segment; - } - - V8_INLINE Segment* const& private_pop_segment(int task_id) const { - return private_segments_[task_id].private_pop_segment; - } - - V8_INLINE void PublishPushSegmentToGlobal(int task_id) { - if (!private_push_segment(task_id)->IsEmpty()) { - global_pool_.Push(private_push_segment(task_id)); - private_push_segment(task_id) = NewSegment(); - } - } - - V8_INLINE void PublishPopSegmentToGlobal(int task_id) { - if (!private_pop_segment(task_id)->IsEmpty()) { - global_pool_.Push(private_pop_segment(task_id)); - private_pop_segment(task_id) = NewSegment(); - } - } - - V8_INLINE bool StealPopSegmentFromGlobal(int task_id) { - if (global_pool_.IsEmpty()) return false; - Segment* new_segment = nullptr; - if (global_pool_.Pop(&new_segment)) { - delete private_pop_segment(task_id); - private_pop_segment(task_id) = new_segment; - return true; - } - return false; - } - - V8_INLINE Segment* NewSegment() { - // Bottleneck for filtering in crash dumps. - return new Segment(); - } - - PrivateSegmentHolder private_segments_[kMaxNumTasks]; - GlobalPool global_pool_; - int num_tasks_; -}; - -} // namespace internal -} // namespace cppgc - -#endif // V8_HEAP_CPPGC_WORKLIST_H_ diff --git a/deps/v8/src/heap/factory-base.cc b/deps/v8/src/heap/factory-base.cc index a3c00bb9c67694..51a856809a14e9 100644 --- a/deps/v8/src/heap/factory-base.cc +++ b/deps/v8/src/heap/factory-base.cc @@ -195,7 +195,8 @@ Handle FactoryBase::NewBytecodeArray( instance->set_bytecode_age(BytecodeArray::kNoAgeBytecodeAge); instance->set_constant_pool(*constant_pool); instance->set_handler_table(read_only_roots().empty_byte_array()); - instance->set_source_position_table(read_only_roots().undefined_value()); + instance->set_synchronized_source_position_table( + read_only_roots().undefined_value()); CopyBytes(reinterpret_cast(instance->GetFirstBytecodeAddress()), raw_bytecodes, length); instance->clear_padding(); diff --git a/deps/v8/src/heap/factory.cc b/deps/v8/src/heap/factory.cc index 4d344339f8638a..7e66123681078f 100644 --- a/deps/v8/src/heap/factory.cc +++ b/deps/v8/src/heap/factory.cc @@ -206,7 +206,7 @@ MaybeHandle Factory::CodeBuilder::BuildInternal( isolate_->builtins_constants_table_builder()->PatchSelfReference( self_reference, code); } - *(self_reference.location()) = code->ptr(); + self_reference.PatchValue(*code); } // Likewise, any references to the basic block counters marker need to be @@ -2162,7 +2162,8 @@ Handle Factory::CopyBytecodeArray( bytecode_array->incoming_new_target_or_generator_register()); copy->set_constant_pool(bytecode_array->constant_pool()); copy->set_handler_table(bytecode_array->handler_table()); - copy->set_source_position_table(bytecode_array->source_position_table()); + copy->set_synchronized_source_position_table( + bytecode_array->synchronized_source_position_table()); copy->set_osr_loop_nesting_level(bytecode_array->osr_loop_nesting_level()); copy->set_bytecode_age(bytecode_array->bytecode_age()); bytecode_array->CopyBytecodesTo(*copy); @@ -2793,7 +2794,7 @@ Handle Factory::NewUninitializedJSGlobalProxy(int size) { map->set_may_have_interesting_symbols(true); LOG(isolate(), MapDetails(*map)); Handle proxy = Handle::cast( - NewJSObjectFromMap(map, AllocationType::kYoung)); + NewJSObjectFromMap(map, AllocationType::kOld)); // Create identity hash early in case there is any JS collection containing // a global proxy key and needs to be rehashed after deserialization. proxy->GetOrCreateIdentityHash(isolate()); @@ -3099,7 +3100,6 @@ Handle Factory::NewStackTraceFrame( frame->set_frame_index(index); frame->set_frame_info(*undefined_value()); - frame->set_id(isolate()->GetNextStackFrameInfoId()); return frame; } @@ -3347,7 +3347,6 @@ void Factory::SetRegExpExperimentalData(Handle regexp, store->set(JSRegExp::kIrregexpCaptureNameMapIndex, uninitialized); store->set(JSRegExp::kIrregexpTicksUntilTierUpIndex, uninitialized); store->set(JSRegExp::kIrregexpBacktrackLimit, uninitialized); - store->set(JSRegExp::kExperimentalPatternIndex, uninitialized); regexp->set_data(*store); } diff --git a/deps/v8/src/heap/factory.h b/deps/v8/src/heap/factory.h index 5e5e2c23aefd3b..05f271e3a2b62a 100644 --- a/deps/v8/src/heap/factory.h +++ b/deps/v8/src/heap/factory.h @@ -112,7 +112,7 @@ class V8_EXPORT_PRIVATE Factory : public FactoryBase { return handle(obj, isolate()); } -#include "torque-generated/factory-tq.inc" +#include "torque-generated/factory.inc" Handle NewOddball(Handle map, const char* to_string, Handle to_number, const char* type_of, diff --git a/deps/v8/src/heap/heap-inl.h b/deps/v8/src/heap/heap-inl.h index 34ea80f30fc2b9..d4dc7e2b8cda66 100644 --- a/deps/v8/src/heap/heap-inl.h +++ b/deps/v8/src/heap/heap-inl.h @@ -13,6 +13,7 @@ #include "src/base/atomic-utils.h" #include "src/base/atomicops.h" #include "src/base/platform/platform.h" +#include "src/common/assert-scope.h" #include "src/heap/heap-write-barrier.h" #include "src/heap/heap.h" #include "src/heap/third-party/heap-api.h" @@ -169,6 +170,7 @@ AllocationResult Heap::AllocateRaw(int size_in_bytes, AllocationType type, AllocationAlignment alignment) { DCHECK(AllowHandleAllocation::IsAllowed()); DCHECK(AllowHeapAllocation::IsAllowed()); + DCHECK(AllowGarbageCollection::IsAllowed()); DCHECK_IMPLIES(type == AllocationType::kCode, alignment == AllocationAlignment::kCodeAligned); DCHECK_EQ(gc_state(), NOT_IN_GC); @@ -183,7 +185,12 @@ AllocationResult Heap::AllocateRaw(int size_in_bytes, AllocationType type, IncrementObjectCounters(); #endif - bool large_object = size_in_bytes > kMaxRegularHeapObjectSize; + size_t large_object_threshold = + AllocationType::kCode == type + ? std::min(kMaxRegularHeapObjectSize, code_space()->AreaSize()) + : kMaxRegularHeapObjectSize; + bool large_object = + static_cast(size_in_bytes) > large_object_threshold; HeapObject object; AllocationResult allocation; @@ -216,10 +223,10 @@ AllocationResult Heap::AllocateRaw(int size_in_bytes, AllocationType type, allocation = old_space_->AllocateRaw(size_in_bytes, alignment, origin); } } else if (AllocationType::kCode == type) { - if (size_in_bytes <= code_space()->AreaSize() && !large_object) { - allocation = code_space_->AllocateRawUnaligned(size_in_bytes); - } else { + if (large_object) { allocation = code_lo_space_->AllocateRaw(size_in_bytes); + } else { + allocation = code_space_->AllocateRawUnaligned(size_in_bytes); } } else if (AllocationType::kMap == type) { allocation = map_space_->AllocateRawUnaligned(size_in_bytes); @@ -246,6 +253,15 @@ AllocationResult Heap::AllocateRaw(int size_in_bytes, AllocationType type, ->RegisterNewlyAllocatedCodeObject(object.address()); } } + +#ifdef V8_ENABLE_CONSERVATIVE_STACK_SCANNING + if (AllocationType::kReadOnly != type) { + DCHECK_TAG_ALIGNED(object.address()); + Page::FromHeapObject(object)->object_start_bitmap()->SetBit( + object.address()); + } +#endif + OnAllocationEvent(object, size_in_bytes); } @@ -258,6 +274,7 @@ HeapObject Heap::AllocateRawWith(int size, AllocationType allocation, AllocationAlignment alignment) { DCHECK(AllowHandleAllocation::IsAllowed()); DCHECK(AllowHeapAllocation::IsAllowed()); + DCHECK(AllowGarbageCollection::IsAllowed()); if (V8_ENABLE_THIRD_PARTY_HEAP_BOOL) { AllocationResult result = AllocateRaw(size, allocation, origin, alignment); DCHECK(!result.IsRetry()); diff --git a/deps/v8/src/heap/heap-write-barrier-inl.h b/deps/v8/src/heap/heap-write-barrier-inl.h index cfdbec4f29555a..79265c4db68ec5 100644 --- a/deps/v8/src/heap/heap-write-barrier-inl.h +++ b/deps/v8/src/heap/heap-write-barrier-inl.h @@ -238,11 +238,11 @@ void WriteBarrier::Marking(JSArrayBuffer host, MarkingSlow(*heap, host, extension); } -void WriteBarrier::Marking(Map host, DescriptorArray descriptor_array, +void WriteBarrier::Marking(DescriptorArray descriptor_array, int number_of_own_descriptors) { - auto heap = GetHeapIfMarking(host); + auto heap = GetHeapIfMarking(descriptor_array); if (!heap) return; - MarkingSlow(*heap, host, descriptor_array, number_of_own_descriptors); + MarkingSlow(*heap, descriptor_array, number_of_own_descriptors); } } // namespace internal diff --git a/deps/v8/src/heap/heap-write-barrier.cc b/deps/v8/src/heap/heap-write-barrier.cc index df2e38432ef5d2..e600c9cebbcd44 100644 --- a/deps/v8/src/heap/heap-write-barrier.cc +++ b/deps/v8/src/heap/heap-write-barrier.cc @@ -14,26 +14,50 @@ namespace v8 { namespace internal { +namespace { +thread_local MarkingBarrier* current_marking_barrier = nullptr; +} // namespace + +void WriteBarrier::SetForThread(MarkingBarrier* marking_barrier) { + DCHECK_NULL(current_marking_barrier); + current_marking_barrier = marking_barrier; +} + +void WriteBarrier::ClearForThread(MarkingBarrier* marking_barrier) { + DCHECK_EQ(current_marking_barrier, marking_barrier); + current_marking_barrier = nullptr; +} + void WriteBarrier::MarkingSlow(Heap* heap, HeapObject host, HeapObjectSlot slot, HeapObject value) { - heap->marking_barrier()->Write(host, slot, value); + MarkingBarrier* marking_barrier = current_marking_barrier + ? current_marking_barrier + : heap->marking_barrier(); + marking_barrier->Write(host, slot, value); } void WriteBarrier::MarkingSlow(Heap* heap, Code host, RelocInfo* reloc_info, HeapObject value) { - heap->marking_barrier()->Write(host, reloc_info, value); + MarkingBarrier* marking_barrier = current_marking_barrier + ? current_marking_barrier + : heap->marking_barrier(); + marking_barrier->Write(host, reloc_info, value); } void WriteBarrier::MarkingSlow(Heap* heap, JSArrayBuffer host, ArrayBufferExtension* extension) { - heap->marking_barrier()->Write(host, extension); + MarkingBarrier* marking_barrier = current_marking_barrier + ? current_marking_barrier + : heap->marking_barrier(); + marking_barrier->Write(host, extension); } -void WriteBarrier::MarkingSlow(Heap* heap, Map host, - DescriptorArray descriptor_array, +void WriteBarrier::MarkingSlow(Heap* heap, DescriptorArray descriptor_array, int number_of_own_descriptors) { - heap->marking_barrier()->Write(host, descriptor_array, - number_of_own_descriptors); + MarkingBarrier* marking_barrier = current_marking_barrier + ? current_marking_barrier + : heap->marking_barrier(); + marking_barrier->Write(descriptor_array, number_of_own_descriptors); } int WriteBarrier::MarkingFromCode(Address raw_host, Address raw_slot) { diff --git a/deps/v8/src/heap/heap-write-barrier.h b/deps/v8/src/heap/heap-write-barrier.h index d56757b5385c1e..c510c069fe2ed1 100644 --- a/deps/v8/src/heap/heap-write-barrier.h +++ b/deps/v8/src/heap/heap-write-barrier.h @@ -21,6 +21,7 @@ class Heap; class JSArrayBuffer; class Map; class MarkCompactCollector; +class MarkingBarrier; class RelocInfo; // Note: In general it is preferred to use the macros defined in @@ -50,18 +51,20 @@ class V8_EXPORT_PRIVATE WriteBarrier { MaybeObject value); static inline void Marking(Code host, RelocInfo*, HeapObject value); static inline void Marking(JSArrayBuffer host, ArrayBufferExtension*); - static inline void Marking(Map host, DescriptorArray, - int number_of_own_descriptors); + static inline void Marking(DescriptorArray, int number_of_own_descriptors); // It is invoked from generated code and has to take raw addresses. static int MarkingFromCode(Address raw_host, Address raw_slot); + static void SetForThread(MarkingBarrier*); + static void ClearForThread(MarkingBarrier*); + private: static void MarkingSlow(Heap* heap, HeapObject host, HeapObjectSlot, HeapObject value); static void MarkingSlow(Heap* heap, Code host, RelocInfo*, HeapObject value); static void MarkingSlow(Heap* heap, JSArrayBuffer host, ArrayBufferExtension*); - static void MarkingSlow(Heap* heap, Map host, DescriptorArray, + static void MarkingSlow(Heap* heap, DescriptorArray, int number_of_own_descriptors); static inline base::Optional GetHeapIfMarking(HeapObject object); }; diff --git a/deps/v8/src/heap/heap.cc b/deps/v8/src/heap/heap.cc index 8c3d506dd07e86..4506ed71aae301 100644 --- a/deps/v8/src/heap/heap.cc +++ b/deps/v8/src/heap/heap.cc @@ -20,6 +20,7 @@ #include "src/builtins/accessors.h" #include "src/codegen/assembler-inl.h" #include "src/codegen/compilation-cache.h" +#include "src/common/assert-scope.h" #include "src/common/globals.h" #include "src/debug/debug.h" #include "src/deoptimizer/deoptimizer.h" @@ -31,6 +32,7 @@ #include "src/handles/global-handles.h" #include "src/heap/array-buffer-sweeper.h" #include "src/heap/barrier.h" +#include "src/heap/base/stack.h" #include "src/heap/code-object-registry.h" #include "src/heap/code-stats.h" #include "src/heap/combined-heap.h" @@ -89,6 +91,10 @@ #include "src/utils/utils-inl.h" #include "src/utils/utils.h" +#ifdef V8_ENABLE_CONSERVATIVE_STACK_SCANNING +#include "src/heap/conservative-stack-visitor.h" +#endif + // Has to be the last include (doesn't have include guards): #include "src/objects/object-macros.h" @@ -170,12 +176,6 @@ bool Heap::GCCallbackTuple::operator==( Heap::GCCallbackTuple& Heap::GCCallbackTuple::operator=( const Heap::GCCallbackTuple& other) V8_NOEXCEPT = default; -struct Heap::StrongRootsList { - FullObjectSlot start; - FullObjectSlot end; - StrongRootsList* next; -}; - class ScavengeTaskObserver : public AllocationObserver { public: ScavengeTaskObserver(Heap* heap, intptr_t step_size) @@ -405,7 +405,16 @@ bool Heap::CanExpandOldGeneration(size_t size) { bool Heap::CanExpandOldGenerationBackground(size_t size) { if (force_oom_) return false; - return memory_allocator()->Size() + size <= MaxReserved(); + // When the heap is tearing down, then GC requests from background threads + // are not served and the threads are allowed to expand the heap to avoid OOM. + return gc_state() == TEAR_DOWN || + memory_allocator()->Size() + size <= MaxReserved(); +} + +bool Heap::CanPromoteYoungAndExpandOldGeneration(size_t size) { + // Over-estimate the new space size using capacity to allow some slack. + return CanExpandOldGeneration(size + new_space_->Capacity() + + new_lo_space_->Size()); } bool Heap::HasBeenSetUp() const { @@ -433,9 +442,7 @@ GarbageCollector Heap::SelectGarbageCollector(AllocationSpace space, return MARK_COMPACTOR; } - // Over-estimate the new space size using capacity to allow some slack. - if (!CanExpandOldGeneration(new_space_->TotalCapacity() + - new_lo_space()->Size())) { + if (!CanPromoteYoungAndExpandOldGeneration(0)) { isolate_->counters() ->gc_compactor_caused_by_oldspace_exhaustion() ->Increment(); @@ -1086,7 +1093,11 @@ void Heap::DeoptMarkedAllocationSites() { Deoptimizer::DeoptimizeMarkedCode(isolate_); } -void Heap::GarbageCollectionEpilogueInSafepoint() { +void Heap::GarbageCollectionEpilogueInSafepoint(GarbageCollector collector) { + if (collector == MARK_COMPACTOR) { + memory_pressure_level_ = MemoryPressureLevel::kNone; + } + TRACE_GC(tracer(), GCTracer::Scope::HEAP_EPILOGUE_SAFEPOINT); #define UPDATE_COUNTERS_FOR_SPACE(space) \ @@ -1497,8 +1508,7 @@ bool Heap::CollectGarbage(AllocationSpace space, this, IsYoungGenerationCollector(collector) ? "MinorGC" : "MajorGC", GarbageCollectionReasonToString(gc_reason)); - if (!CanExpandOldGeneration(new_space()->Capacity() + - new_lo_space()->Size())) { + if (!CanPromoteYoungAndExpandOldGeneration(0)) { InvokeNearHeapLimitCallback(); } @@ -1544,7 +1554,9 @@ bool Heap::CollectGarbage(AllocationSpace space, { tracer()->Start(collector, gc_reason, collector_reason); DCHECK(AllowHeapAllocation::IsAllowed()); + DCHECK(AllowGarbageCollection::IsAllowed()); DisallowHeapAllocation no_allocation_during_gc; + DisallowGarbageCollection no_gc_during_gc; GarbageCollectionPrologue(); { @@ -1575,6 +1587,7 @@ bool Heap::CollectGarbage(AllocationSpace space, EmbedderHeapTracer::EmbedderStackState::kMayContainHeapPointers); if (scope.CheckReenter()) { AllowHeapAllocation allow_allocation; + AllowGarbageCollection allow_gc; AllowJavascriptExecution allow_js(isolate()); TRACE_GC(tracer(), GCTracer::Scope::HEAP_EXTERNAL_PROLOGUE); VMState state(isolate_); @@ -1599,6 +1612,7 @@ bool Heap::CollectGarbage(AllocationSpace space, gc_post_processing_depth_++; { AllowHeapAllocation allow_allocation; + AllowGarbageCollection allow_gc; AllowJavascriptExecution allow_js(isolate()); freed_global_handles += isolate_->global_handles()->PostGarbageCollectionProcessing( @@ -1611,6 +1625,7 @@ bool Heap::CollectGarbage(AllocationSpace space, GCCallbacksScope scope(this); if (scope.CheckReenter()) { AllowHeapAllocation allow_allocation; + AllowGarbageCollection allow_gc; AllowJavascriptExecution allow_js(isolate()); TRACE_GC(tracer(), GCTracer::Scope::HEAP_EXTERNAL_EPILOGUE); VMState state(isolate_); @@ -1872,6 +1887,8 @@ bool Heap::ReserveSpace(Reservation* reservations, std::vector
* maps) { for (int space = FIRST_SPACE; space < static_cast(SnapshotSpace::kNumberOfHeapSpaces); space++) { + DCHECK_NE(space, NEW_SPACE); + DCHECK_NE(space, NEW_LO_SPACE); Reservation* reservation = &reservations[space]; DCHECK_LE(1, reservation->size()); if (reservation->at(0).size == 0) { @@ -1932,10 +1949,7 @@ bool Heap::ReserveSpace(Reservation* reservations, std::vector
* maps) { allocation = AllocateRaw(size, type, AllocationOrigin::kRuntime, align); #else - if (space == NEW_SPACE) { - allocation = new_space()->AllocateRaw( - size, AllocationAlignment::kWordAligned); - } else if (space == RO_SPACE) { + if (space == RO_SPACE) { allocation = read_only_space()->AllocateRaw( size, AllocationAlignment::kWordAligned); } else { @@ -1967,16 +1981,11 @@ bool Heap::ReserveSpace(Reservation* reservations, std::vector
* maps) { V8::FatalProcessOutOfMemory( isolate(), "insufficient memory to create an Isolate"); } - if (space == NEW_SPACE) { - CollectGarbage(NEW_SPACE, GarbageCollectionReason::kDeserializer); + if (counter > 1) { + CollectAllGarbage(kReduceMemoryFootprintMask, + GarbageCollectionReason::kDeserializer); } else { - if (counter > 1) { - CollectAllGarbage(kReduceMemoryFootprintMask, - GarbageCollectionReason::kDeserializer); - } else { - CollectAllGarbage(kNoGCFlags, - GarbageCollectionReason::kDeserializer); - } + CollectAllGarbage(kNoGCFlags, GarbageCollectionReason::kDeserializer); } gc_performed = true; break; // Abort for-loop over spaces and retry. @@ -2131,7 +2140,7 @@ size_t Heap::PerformGarbageCollection( RecomputeLimits(collector); - GarbageCollectionEpilogueInSafepoint(); + GarbageCollectionEpilogueInSafepoint(collector); tracer()->StopInSafepoint(); @@ -2336,8 +2345,7 @@ void Heap::EvacuateYoungGeneration() { ConcurrentMarking::PauseScope pause_scope(concurrent_marking()); if (!FLAG_concurrent_marking) { DCHECK(fast_promotion_mode_); - DCHECK( - CanExpandOldGeneration(new_space()->Size() + new_lo_space()->Size())); + DCHECK(CanPromoteYoungAndExpandOldGeneration(0)); } mark_compact_collector()->sweeper()->EnsureIterabilityCompleted(); @@ -2384,8 +2392,7 @@ void Heap::EvacuateYoungGeneration() { } void Heap::Scavenge() { - if ((fast_promotion_mode_ && - CanExpandOldGeneration(new_space()->Size() + new_lo_space()->Size()))) { + if (fast_promotion_mode_ && CanPromoteYoungAndExpandOldGeneration(0)) { tracer()->NotifyYoungGenerationHandling( YoungGenerationHandling::kFastPromotionDuringScavenge); EvacuateYoungGeneration(); @@ -3104,9 +3111,6 @@ void Heap::OnMoveEvent(HeapObject target, HeapObject source, if (target.IsSharedFunctionInfo()) { LOG_CODE_EVENT(isolate_, SharedFunctionInfoMoveEvent(source.address(), target.address())); - } else if (target.IsNativeContext()) { - PROFILE(isolate_, - NativeContextMoveEvent(source.address(), target.address())); } if (FLAG_verify_predictable) { @@ -4541,8 +4545,10 @@ void Heap::IterateRoots(RootVisitor* v, base::EnumSet options) { // Iterate over local handles in handle scopes. FixStaleLeftTrimmedHandlesVisitor left_trim_visitor(this); +#ifndef V8_ENABLE_CONSERVATIVE_STACK_SCANNING isolate_->handle_scope_implementer()->Iterate(&left_trim_visitor); isolate_->handle_scope_implementer()->Iterate(v); +#endif if (FLAG_local_heaps) { safepoint_->Iterate(&left_trim_visitor); @@ -4574,8 +4580,10 @@ void Heap::IterateRoots(RootVisitor* v, base::EnumSet options) { // Iterate over other strong roots (currently only identity maps and // deoptimization entries). - for (StrongRootsList* list = strong_roots_list_; list; list = list->next) { - v->VisitRootPointers(Root::kStrongRoots, nullptr, list->start, list->end); + for (StrongRootsEntry* current = strong_roots_head_; current; + current = current->next) { + v->VisitRootPointers(Root::kStrongRoots, nullptr, current->start, + current->end); } v->Synchronize(VisitorSynchronization::kStrongRoots); @@ -4915,6 +4923,10 @@ bool Heap::ShouldExpandOldGenerationOnSlowAllocation(LocalHeap* local_heap) { if (always_allocate() || OldGenerationSpaceAvailable() > 0) return true; // We reached the old generation allocation limit. + // Background threads need to be allowed to allocate without GC after teardown + // was initiated. + if (gc_state() == TEAR_DOWN) return true; + // Ensure that retry of allocation on background thread succeeds if (IsRetryOfFailedAllocation(local_heap)) return true; @@ -4939,11 +4951,6 @@ bool Heap::IsRetryOfFailedAllocation(LocalHeap* local_heap) { return local_heap->allocation_failed_; } -void Heap::AlwaysAllocateAfterTearDownStarted() { - always_allocate_scope_count_++; - collection_barrier_.ShutdownRequested(); -} - Heap::HeapGrowingMode Heap::CurrentHeapGrowingMode() { if (ShouldReduceMemory() || FLAG_stress_compaction) { return Heap::HeapGrowingMode::kMinimal; @@ -5252,8 +5259,7 @@ void Heap::SetUp() { concurrent_marking_.reset(new ConcurrentMarking(this, nullptr, nullptr)); } - marking_barrier_.reset(new MarkingBarrier(this, mark_compact_collector(), - incremental_marking())); + marking_barrier_.reset(new MarkingBarrier(this)); for (int i = FIRST_SPACE; i <= LAST_SPACE; i++) { space_[i] = nullptr; @@ -5285,7 +5291,11 @@ class StressConcurrentAllocationObserver : public AllocationObserver { void Step(int bytes_allocated, Address, size_t) override { DCHECK(heap_->deserialization_complete()); - StressConcurrentAllocatorTask::Schedule(heap_->isolate()); + if (FLAG_stress_concurrent_allocation) { + // Only schedule task if --stress-concurrent-allocation is enabled. This + // allows tests to disable flag even when Isolate was already initialized. + StressConcurrentAllocatorTask::Schedule(heap_->isolate()); + } heap_->RemoveAllocationObserversFromAllSpaces(this, this); heap_->need_to_remove_stress_concurrent_allocation_observer_ = false; } @@ -5503,7 +5513,7 @@ void Heap::StartTearDown() { // process the event queue anymore. Avoid this deadlock by allowing all // allocations after tear down was requested to make sure all background // threads finish. - AlwaysAllocateAfterTearDownStarted(); + collection_barrier_.ShutdownRequested(); #ifdef VERIFY_HEAP // {StartTearDown} is called fairly early during Isolate teardown, so it's @@ -5606,12 +5616,13 @@ void Heap::TearDown() { memory_allocator()->TearDown(); - StrongRootsList* next = nullptr; - for (StrongRootsList* list = strong_roots_list_; list; list = next) { - next = list->next; - delete list; + StrongRootsEntry* next = nullptr; + for (StrongRootsEntry* current = strong_roots_head_; current; + current = next) { + next = current->next; + delete current; } - strong_roots_list_ = nullptr; + strong_roots_head_ = nullptr; memory_allocator_.reset(); } @@ -5880,9 +5891,9 @@ void Heap::ClearRecordedSlotRange(Address start, Address end) { } PagedSpace* PagedSpaceIterator::Next() { - switch (counter_++) { + int space = counter_++; + switch (space) { case RO_SPACE: - case NEW_SPACE: UNREACHABLE(); case OLD_SPACE: return heap_->old_space(); @@ -5891,6 +5902,7 @@ PagedSpace* PagedSpaceIterator::Next() { case MAP_SPACE: return heap_->map_space(); default: + DCHECK_GT(space, LAST_GROWABLE_PAGED_SPACE); return nullptr; } } @@ -6185,31 +6197,46 @@ size_t Heap::OldArrayBufferBytes() { return array_buffer_sweeper()->OldBytes(); } -void Heap::RegisterStrongRoots(FullObjectSlot start, FullObjectSlot end) { - StrongRootsList* list = new StrongRootsList(); - list->next = strong_roots_list_; - list->start = start; - list->end = end; - strong_roots_list_ = list; +StrongRootsEntry* Heap::RegisterStrongRoots(FullObjectSlot start, + FullObjectSlot end) { + base::MutexGuard guard(&strong_roots_mutex_); + + StrongRootsEntry* entry = new StrongRootsEntry(); + entry->start = start; + entry->end = end; + entry->prev = nullptr; + entry->next = strong_roots_head_; + + if (strong_roots_head_) { + DCHECK_NULL(strong_roots_head_->prev); + strong_roots_head_->prev = entry; + } + strong_roots_head_ = entry; + + return entry; } -void Heap::UnregisterStrongRoots(FullObjectSlot start) { - StrongRootsList* prev = nullptr; - StrongRootsList* list = strong_roots_list_; - while (list != nullptr) { - StrongRootsList* next = list->next; - if (list->start == start) { - if (prev) { - prev->next = next; - } else { - strong_roots_list_ = next; - } - delete list; - } else { - prev = list; - } - list = next; +void Heap::UpdateStrongRoots(StrongRootsEntry* entry, FullObjectSlot start, + FullObjectSlot end) { + entry->start = start; + entry->end = end; +} + +void Heap::UnregisterStrongRoots(StrongRootsEntry* entry) { + base::MutexGuard guard(&strong_roots_mutex_); + + StrongRootsEntry* prev = entry->prev; + StrongRootsEntry* next = entry->next; + + if (prev) prev->next = next; + if (next) next->prev = prev; + + if (strong_roots_head_ == entry) { + DCHECK_NULL(prev); + strong_roots_head_ = next; } + + delete entry; } void Heap::SetBuiltinsConstantsTable(FixedArray cache) { diff --git a/deps/v8/src/heap/heap.h b/deps/v8/src/heap/heap.h index ff89cd6fb59024..b8220dad5eb08c 100644 --- a/deps/v8/src/heap/heap.h +++ b/deps/v8/src/heap/heap.h @@ -177,6 +177,18 @@ enum class SkipRoot { kWeak }; +class StrongRootsEntry { + StrongRootsEntry() = default; + + FullObjectSlot start; + FullObjectSlot end; + + StrongRootsEntry* prev; + StrongRootsEntry* next; + + friend class Heap; +}; + class AllocationResult { public: static inline AllocationResult Retry(AllocationSpace space = NEW_SPACE) { @@ -868,8 +880,11 @@ class Heap { V8_INLINE void SetMessageListeners(TemplateList value); V8_INLINE void SetPendingOptimizeForTestBytecode(Object bytecode); - void RegisterStrongRoots(FullObjectSlot start, FullObjectSlot end); - void UnregisterStrongRoots(FullObjectSlot start); + StrongRootsEntry* RegisterStrongRoots(FullObjectSlot start, + FullObjectSlot end); + void UnregisterStrongRoots(StrongRootsEntry* entry); + void UpdateStrongRoots(StrongRootsEntry* entry, FullObjectSlot start, + FullObjectSlot end); void SetBuiltinsConstantsTable(FixedArray cache); void SetDetachedContexts(WeakArrayList detached_contexts); @@ -1426,8 +1441,10 @@ class Heap { // Heap object allocation tracking. ========================================== // =========================================================================== - void AddHeapObjectAllocationTracker(HeapObjectAllocationTracker* tracker); - void RemoveHeapObjectAllocationTracker(HeapObjectAllocationTracker* tracker); + V8_EXPORT_PRIVATE void AddHeapObjectAllocationTracker( + HeapObjectAllocationTracker* tracker); + V8_EXPORT_PRIVATE void RemoveHeapObjectAllocationTracker( + HeapObjectAllocationTracker* tracker); bool has_heap_object_allocation_tracker() const { return !allocation_trackers_.empty(); } @@ -1573,8 +1590,6 @@ class Heap { void Wait(); }; - struct StrongRootsList; - struct StringTypeTable { InstanceType type; int size; @@ -1800,7 +1815,7 @@ class Heap { void GarbageCollectionPrologue(); void GarbageCollectionPrologueInSafepoint(); void GarbageCollectionEpilogue(); - void GarbageCollectionEpilogueInSafepoint(); + void GarbageCollectionEpilogueInSafepoint(GarbageCollector collector); // Performs a major collection in the whole heap. void MarkCompact(); @@ -1887,13 +1902,12 @@ class Heap { V8_EXPORT_PRIVATE bool CanExpandOldGeneration(size_t size); V8_EXPORT_PRIVATE bool CanExpandOldGenerationBackground(size_t size); + V8_EXPORT_PRIVATE bool CanPromoteYoungAndExpandOldGeneration(size_t size); bool ShouldExpandOldGenerationOnSlowAllocation( LocalHeap* local_heap = nullptr); bool IsRetryOfFailedAllocation(LocalHeap* local_heap); - void AlwaysAllocateAfterTearDownStarted(); - HeapGrowingMode CurrentHeapGrowingMode(); double PercentToOldGenerationLimit(); @@ -2201,7 +2215,9 @@ class Heap { std::unique_ptr stress_concurrent_allocation_observer_; std::unique_ptr local_embedder_heap_tracer_; std::unique_ptr marking_barrier_; - StrongRootsList* strong_roots_list_ = nullptr; + + StrongRootsEntry* strong_roots_head_ = nullptr; + base::Mutex strong_roots_mutex_; bool need_to_remove_stress_concurrent_allocation_observer_ = false; @@ -2488,7 +2504,8 @@ class VerifySmisVisitor : public RootVisitor { // is done. class V8_EXPORT_PRIVATE PagedSpaceIterator { public: - explicit PagedSpaceIterator(Heap* heap) : heap_(heap), counter_(OLD_SPACE) {} + explicit PagedSpaceIterator(Heap* heap) + : heap_(heap), counter_(FIRST_GROWABLE_PAGED_SPACE) {} PagedSpace* Next(); private: diff --git a/deps/v8/src/heap/incremental-marking.cc b/deps/v8/src/heap/incremental-marking.cc index 4cde2c6b9e07a1..c5206adf8169ce 100644 --- a/deps/v8/src/heap/incremental-marking.cc +++ b/deps/v8/src/heap/incremental-marking.cc @@ -237,7 +237,7 @@ void IncrementalMarking::StartMarking() { SetState(MARKING); - heap_->marking_barrier()->Activate(is_compacting_); + MarkingBarrier::ActivateAll(heap(), is_compacting_); heap_->isolate()->compilation_cache()->MarkCompactPrologue(); @@ -412,6 +412,8 @@ void IncrementalMarking::FinalizeIncrementally() { // so we can do it only once at the beginning of the finalization. RetainMaps(); + MarkingBarrier::PublishAll(heap()); + finalize_marking_completed_ = true; if (FLAG_trace_incremental_marking) { @@ -433,6 +435,7 @@ void IncrementalMarking::UpdateMarkingWorklistAfterScavenge() { #endif // ENABLE_MINOR_MC collector_->local_marking_worklists()->Publish(); + MarkingBarrier::PublishAll(heap()); collector_->marking_worklists()->Update( [ #ifdef DEBUG @@ -1080,6 +1083,9 @@ StepResult IncrementalMarking::Step(double max_step_size_in_ms, embedder_deadline = Min(max_step_size_in_ms, static_cast(bytes_to_process) / marking_speed); + // TODO(chromium:1056170): Replace embedder_deadline with bytes_to_process + // after migrating blink to the cppgc library and after v8 can directly + // push objects to Oilpan. embedder_result = EmbedderStep(embedder_deadline, &embedder_duration); } bytes_marked_ += v8_bytes_processed; diff --git a/deps/v8/src/heap/incremental-marking.h b/deps/v8/src/heap/incremental-marking.h index 342a82c02d2e6b..29df137711ecb3 100644 --- a/deps/v8/src/heap/incremental-marking.h +++ b/deps/v8/src/heap/incremental-marking.h @@ -251,6 +251,8 @@ class V8_EXPORT_PRIVATE IncrementalMarking final { // increase chances of reusing of map transition tree in future. void RetainMaps(); + void PublishWriteBarrierWorklists(); + // Updates scheduled_bytes_to_mark_ to ensure marking progress based on // time. void ScheduleBytesToMarkBasedOnTime(double time_ms); diff --git a/deps/v8/src/heap/index-generator.cc b/deps/v8/src/heap/index-generator.cc new file mode 100644 index 00000000000000..150e3fa1597c77 --- /dev/null +++ b/deps/v8/src/heap/index-generator.cc @@ -0,0 +1,48 @@ +// Copyright 2020 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "src/heap/index-generator.h" + +namespace v8 { +namespace internal { + +IndexGenerator::IndexGenerator(size_t size) : size_(size) { + if (size == 0) return; + base::MutexGuard guard(&lock_); + pending_indices_.push(0); + ranges_to_split_.push({0, size_}); +} + +base::Optional IndexGenerator::GetNext() { + base::MutexGuard guard(&lock_); + if (!pending_indices_.empty()) { + // Return any pending index first. + auto index = pending_indices_.top(); + pending_indices_.pop(); + return index; + } + if (ranges_to_split_.empty()) return base::nullopt; + + // Split the oldest running range in 2 and return the middle index as + // starting point. + auto range = ranges_to_split_.front(); + ranges_to_split_.pop(); + size_t size = range.second - range.first; + size_t mid = range.first + size / 2; + // Both sides of the range are added to |ranges_to_split_| so they may be + // further split if possible. + if (mid - range.first > 1) ranges_to_split_.push({range.first, mid}); + if (range.second - mid > 1) ranges_to_split_.push({mid, range.second}); + return mid; +} + +void IndexGenerator::GiveBack(size_t index) { + base::MutexGuard guard(&lock_); + // Add |index| to pending indices so GetNext() may return it before anything + // else. + pending_indices_.push(index); +} + +} // namespace internal +} // namespace v8 diff --git a/deps/v8/src/heap/index-generator.h b/deps/v8/src/heap/index-generator.h new file mode 100644 index 00000000000000..0e4df1714edae3 --- /dev/null +++ b/deps/v8/src/heap/index-generator.h @@ -0,0 +1,43 @@ +// Copyright 2020 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef V8_HEAP_INDEX_GENERATOR_H_ +#define V8_HEAP_INDEX_GENERATOR_H_ + +#include +#include +#include + +#include "src/base/macros.h" +#include "src/base/optional.h" +#include "src/base/platform/mutex.h" + +namespace v8 { +namespace internal { + +// A thread-safe data structure that generates heuristic starting points in a +// range to process items in parallel. +class V8_EXPORT_PRIVATE IndexGenerator { + public: + explicit IndexGenerator(size_t size); + IndexGenerator(const IndexGenerator&) = delete; + IndexGenerator& operator=(const IndexGenerator&) = delete; + + base::Optional GetNext(); + void GiveBack(size_t index); + + private: + base::Mutex lock_; + // Pending indices that are ready to be handed out, prioritized over + // |pending_ranges_| when non-empty. + std::stack pending_indices_; + // Pending [start, end] (exclusive) ranges to split and hand out indices from. + std::queue> ranges_to_split_; + const size_t size_; +}; + +} // namespace internal +} // namespace v8 + +#endif // V8_HEAP_INDEX_GENERATOR_H_ diff --git a/deps/v8/src/heap/local-heap-inl.h b/deps/v8/src/heap/local-heap-inl.h index 69eb86de1e5184..770e1cb8e9f133 100644 --- a/deps/v8/src/heap/local-heap-inl.h +++ b/deps/v8/src/heap/local-heap-inl.h @@ -15,13 +15,16 @@ namespace internal { AllocationResult LocalHeap::AllocateRaw(int size_in_bytes, AllocationType type, AllocationOrigin origin, AllocationAlignment alignment) { +#if DEBUG DCHECK_EQ(LocalHeap::Current(), this); DCHECK(AllowHandleAllocation::IsAllowed()); DCHECK(AllowHeapAllocation::IsAllowed()); + DCHECK(AllowGarbageCollection::IsAllowed()); DCHECK_IMPLIES(type == AllocationType::kCode, alignment == AllocationAlignment::kCodeAligned); - DCHECK(heap()->gc_state() == Heap::TEAR_DOWN || - heap()->gc_state() == Heap::NOT_IN_GC); + Heap::HeapState state = heap()->gc_state(); + DCHECK(state == Heap::TEAR_DOWN || state == Heap::NOT_IN_GC); +#endif bool large_object = size_in_bytes > kMaxRegularHeapObjectSize; CHECK_EQ(type, AllocationType::kOld); diff --git a/deps/v8/src/heap/local-heap.cc b/deps/v8/src/heap/local-heap.cc index b17243c680be49..a17c22a6d25a5a 100644 --- a/deps/v8/src/heap/local-heap.cc +++ b/deps/v8/src/heap/local-heap.cc @@ -10,7 +10,9 @@ #include "src/common/globals.h" #include "src/handles/local-handles.h" #include "src/heap/heap-inl.h" +#include "src/heap/heap-write-barrier.h" #include "src/heap/local-heap-inl.h" +#include "src/heap/marking-barrier.h" #include "src/heap/safepoint.h" namespace v8 { @@ -32,6 +34,7 @@ LocalHeap::LocalHeap(Heap* heap, next_(nullptr), handles_(new LocalHandles), persistent_handles_(std::move(persistent_handles)), + marking_barrier_(new MarkingBarrier(this)), old_space_allocator_(this, heap->old_space()) { heap_->safepoint()->AddLocalHeap(this); if (persistent_handles_) { @@ -39,9 +42,21 @@ LocalHeap::LocalHeap(Heap* heap, } DCHECK_NULL(current_local_heap); current_local_heap = this; + // TODO(ulan): Ensure that LocalHeap cannot be created without --local-heaps. + if (FLAG_local_heaps) { + WriteBarrier::SetForThread(marking_barrier_.get()); + if (heap_->incremental_marking()->IsMarking()) { + marking_barrier_->Activate(heap_->incremental_marking()->IsCompacting()); + } + } } LocalHeap::~LocalHeap() { + // TODO(ulan): Ensure that LocalHeap cannot be created without --local-heaps. + if (FLAG_local_heaps) { + marking_barrier_->Publish(); + WriteBarrier::ClearForThread(marking_barrier_.get()); + } // Give up LAB before parking thread old_space_allocator_.FreeLinearAllocationArea(); diff --git a/deps/v8/src/heap/local-heap.h b/deps/v8/src/heap/local-heap.h index 4789eaf0651d40..f6244aaefe30fc 100644 --- a/deps/v8/src/heap/local-heap.h +++ b/deps/v8/src/heap/local-heap.h @@ -10,6 +10,7 @@ #include "src/base/platform/condition-variable.h" #include "src/base/platform/mutex.h" +#include "src/common/assert-scope.h" #include "src/execution/isolate.h" #include "src/handles/persistent-handles.h" #include "src/heap/concurrent-allocator.h" @@ -35,6 +36,10 @@ class V8_EXPORT_PRIVATE LocalHeap { // Frequently invoked by local thread to check whether safepoint was requested // from the main thread. void Safepoint() { + // In case garbage collection is disabled, the thread isn't even allowed to + // invoke Safepoint(). Otherwise a GC might happen here. + DCHECK(AllowGarbageCollection::IsAllowed()); + if (IsSafepointRequested()) { ClearSafepointRequested(); EnterSafepoint(); @@ -76,6 +81,7 @@ class V8_EXPORT_PRIVATE LocalHeap { Heap* heap() { return heap_; } + MarkingBarrier* marking_barrier() { return marking_barrier_.get(); } ConcurrentAllocator* old_space_allocator() { return &old_space_allocator_; } // Mark/Unmark linear allocation areas black. Used for black allocation. @@ -155,6 +161,7 @@ class V8_EXPORT_PRIVATE LocalHeap { std::unique_ptr handles_; std::unique_ptr persistent_handles_; + std::unique_ptr marking_barrier_; ConcurrentAllocator old_space_allocator_; diff --git a/deps/v8/src/heap/mark-compact-inl.h b/deps/v8/src/heap/mark-compact-inl.h index 5580b888d75821..c49bad62cca544 100644 --- a/deps/v8/src/heap/mark-compact-inl.h +++ b/deps/v8/src/heap/mark-compact-inl.h @@ -126,12 +126,11 @@ void MainMarkingVisitor::RecordRelocSlot(Code host, template void MainMarkingVisitor::MarkDescriptorArrayFromWriteBarrier( - HeapObject host, DescriptorArray descriptors, - int number_of_own_descriptors) { + DescriptorArray descriptors, int number_of_own_descriptors) { // This is necessary because the Scavenger records slots only for the // promoted black objects and the marking visitor of DescriptorArray skips // the descriptors marked by the visitor.VisitDescriptors() below. - this->MarkDescriptorArrayBlack(host, descriptors); + this->MarkDescriptorArrayBlack(descriptors); this->VisitDescriptors(descriptors, number_of_own_descriptors); } diff --git a/deps/v8/src/heap/mark-compact.cc b/deps/v8/src/heap/mark-compact.cc index 2f56649692864d..6e00912e613ac2 100644 --- a/deps/v8/src/heap/mark-compact.cc +++ b/deps/v8/src/heap/mark-compact.cc @@ -395,7 +395,7 @@ int MarkCompactCollectorBase::NumberOfParallelCompactionTasks(int pages) { int tasks = FLAG_parallel_compaction ? Min(NumberOfAvailableCores(), pages / (MB / Page::kPageSize) + 1) : 1; - if (!heap_->CanExpandOldGeneration( + if (!heap_->CanPromoteYoungAndExpandOldGeneration( static_cast(tasks * Page::kPageSize))) { // Optimize for memory usage near the heap limit. tasks = 1; @@ -456,6 +456,8 @@ void MarkCompactCollector::TearDown() { AbortWeakObjects(); if (heap()->incremental_marking()->IsMarking()) { local_marking_worklists()->Publish(); + heap()->marking_barrier()->Publish(); + // Marking barriers of LocalHeaps will be published in their destructors. marking_worklists()->Clear(); } } @@ -508,9 +510,6 @@ bool MarkCompactCollector::StartCompaction() { } void MarkCompactCollector::StartMarking() { - if (FLAG_concurrent_marking || FLAG_parallel_marking) { - heap_->new_lo_space()->ResetPendingObject(); - } std::vector
contexts = heap()->memory_measurement()->StartProcessing(); if (FLAG_stress_per_context_marking_worklist) { @@ -747,6 +746,11 @@ void MarkCompactCollector::CollectEvacuationCandidates(PagedSpace* space) { } else { pages.push_back(std::make_pair(p->allocated_bytes(), p)); } + + // Unpin pages for the next GC + if (p->IsFlagSet(MemoryChunk::PINNED)) { + p->ClearFlag(MemoryChunk::PINNED); + } } int candidate_count = 0; @@ -895,6 +899,11 @@ void MarkCompactCollector::Prepare() { heap_->safepoint()->IterateLocalHeaps( [](LocalHeap* local_heap) { local_heap->FreeLinearAllocationArea(); }); } + + // All objects are guaranteed to be initialized in atomic pause + heap()->new_lo_space()->ResetPendingObject(); + DCHECK_EQ(heap()->new_space()->top(), + heap()->new_space()->original_top_acquire()); } void MarkCompactCollector::FinishConcurrentMarking( @@ -1627,10 +1636,9 @@ void MarkCompactCollector::RevisitObject(HeapObject obj) { } void MarkCompactCollector::MarkDescriptorArrayFromWriteBarrier( - HeapObject host, DescriptorArray descriptors, - int number_of_own_descriptors) { + DescriptorArray descriptors, int number_of_own_descriptors) { marking_visitor_->MarkDescriptorArrayFromWriteBarrier( - host, descriptors, number_of_own_descriptors); + descriptors, number_of_own_descriptors); } void MarkCompactCollector::ProcessEphemeronsUntilFixpoint() { @@ -1953,6 +1961,7 @@ void MarkCompactCollector::MarkLiveObjects() { IncrementalMarking* incremental_marking = heap_->incremental_marking(); if (was_marked_incrementally_) { incremental_marking->Finalize(); + MarkingBarrier::PublishAll(heap()); } else { CHECK(incremental_marking->IsStopped()); } @@ -2056,9 +2065,8 @@ void MarkCompactCollector::MarkLiveObjects() { &IsUnmarkedHeapObject); } } - if (was_marked_incrementally_) { - heap()->marking_barrier()->Deactivate(); + MarkingBarrier::DeactivateAll(heap()); } epoch_++; @@ -3210,11 +3218,8 @@ void MarkCompactCollector::EvacuatePagesInParallel() { &page_parallel_job_semaphore_); intptr_t live_bytes = 0; - for (Page* page : old_space_evacuation_pages_) { - live_bytes += non_atomic_marking_state()->live_bytes(page); - evacuation_job.AddItem(new EvacuationItem(page)); - } - + // Evacuation of new space pages cannot be aborted, so it needs to run + // before old space evacuation. for (Page* page : new_space_evacuation_pages_) { intptr_t live_bytes_on_page = non_atomic_marking_state()->live_bytes(page); if (live_bytes_on_page == 0) continue; @@ -3236,6 +3241,11 @@ void MarkCompactCollector::EvacuatePagesInParallel() { evacuation_job.AddItem(new EvacuationItem(page)); } + for (Page* page : old_space_evacuation_pages_) { + live_bytes += non_atomic_marking_state()->live_bytes(page); + evacuation_job.AddItem(new EvacuationItem(page)); + } + // Promote young generation large objects. IncrementalMarking::NonAtomicMarkingState* marking_state = heap()->incremental_marking()->non_atomic_marking_state(); diff --git a/deps/v8/src/heap/mark-compact.h b/deps/v8/src/heap/mark-compact.h index d823ea7c1dcc5f..d369ac0183995b 100644 --- a/deps/v8/src/heap/mark-compact.h +++ b/deps/v8/src/heap/mark-compact.h @@ -395,8 +395,7 @@ class MainMarkingVisitor final V8_UNLIKELY(revisiting_object_); } - void MarkDescriptorArrayFromWriteBarrier(HeapObject host, - DescriptorArray descriptors, + void MarkDescriptorArrayFromWriteBarrier(DescriptorArray descriptors, int number_of_own_descriptors); private: @@ -583,8 +582,7 @@ class MarkCompactCollector final : public MarkCompactCollectorBase { void RevisitObject(HeapObject obj); // Ensures that all descriptors int range [0, number_of_own_descripts) // are visited. - void MarkDescriptorArrayFromWriteBarrier(HeapObject host, - DescriptorArray array, + void MarkDescriptorArrayFromWriteBarrier(DescriptorArray array, int number_of_own_descriptors); // Drains the main thread marking worklist until the specified number of diff --git a/deps/v8/src/heap/marking-barrier-inl.h b/deps/v8/src/heap/marking-barrier-inl.h index 716a181073cf77..28ac8ba3aa214a 100644 --- a/deps/v8/src/heap/marking-barrier-inl.h +++ b/deps/v8/src/heap/marking-barrier-inl.h @@ -22,12 +22,12 @@ bool MarkingBarrier::MarkValue(HeapObject host, HeapObject value) { // filler map. DCHECK(!marking_state_.IsImpossible(host) || value == ReadOnlyRoots(heap_->isolate()).one_pointer_filler_map()); - if (!V8_CONCURRENT_MARKING_BOOL && marking_state_.IsBlack(host)) { + if (!V8_CONCURRENT_MARKING_BOOL && !marking_state_.IsBlack(host)) { // The value will be marked and the slot will be recorded when the marker // visits the host object. return false; } - if (WhiteToGreyAndPush(value)) { + if (WhiteToGreyAndPush(value) && is_main_thread_barrier_) { incremental_marking_->RestartIfNotMarking(); } return true; @@ -35,7 +35,7 @@ bool MarkingBarrier::MarkValue(HeapObject host, HeapObject value) { bool MarkingBarrier::WhiteToGreyAndPush(HeapObject obj) { if (marking_state_.WhiteToGrey(obj)) { - collector_->local_marking_worklists()->Push(obj); + worklist_.Push(obj); return true; } return false; diff --git a/deps/v8/src/heap/marking-barrier.cc b/deps/v8/src/heap/marking-barrier.cc index 3b3873f9f34b5c..8e73518d97e0b0 100644 --- a/deps/v8/src/heap/marking-barrier.cc +++ b/deps/v8/src/heap/marking-barrier.cc @@ -11,16 +11,29 @@ #include "src/heap/mark-compact-inl.h" #include "src/heap/mark-compact.h" #include "src/heap/marking-barrier-inl.h" +#include "src/heap/marking-worklist-inl.h" +#include "src/heap/marking-worklist.h" +#include "src/heap/safepoint.h" #include "src/objects/js-array-buffer.h" namespace v8 { namespace internal { -MarkingBarrier::MarkingBarrier(Heap* heap, MarkCompactCollector* collector, - IncrementalMarking* incremental_marking) +MarkingBarrier::MarkingBarrier(Heap* heap) : heap_(heap), - collector_(collector), - incremental_marking_(incremental_marking) {} + collector_(heap_->mark_compact_collector()), + incremental_marking_(heap_->incremental_marking()), + worklist_(collector_->marking_worklists()->shared()), + is_main_thread_barrier_(true) {} + +MarkingBarrier::MarkingBarrier(LocalHeap* local_heap) + : heap_(local_heap->heap()), + collector_(heap_->mark_compact_collector()), + incremental_marking_(nullptr), + worklist_(collector_->marking_worklists()->shared()), + is_main_thread_barrier_(false) {} + +MarkingBarrier::~MarkingBarrier() { DCHECK(worklist_.IsLocalEmpty()); } void MarkingBarrier::Write(HeapObject host, HeapObjectSlot slot, HeapObject value) { @@ -34,68 +47,142 @@ void MarkingBarrier::Write(HeapObject host, HeapObjectSlot slot, void MarkingBarrier::Write(Code host, RelocInfo* reloc_info, HeapObject value) { if (MarkValue(host, value)) { if (is_compacting_) { - collector_->RecordRelocSlot(host, reloc_info, value); + if (is_main_thread_barrier_) { + // An optimization to avoid allocating additional typed slots for the + // main thread. + collector_->RecordRelocSlot(host, reloc_info, value); + } else { + RecordRelocSlot(host, reloc_info, value); + } } } } void MarkingBarrier::Write(JSArrayBuffer host, ArrayBufferExtension* extension) { - if (!V8_CONCURRENT_MARKING_BOOL && marking_state_.IsBlack(host)) { + if (!V8_CONCURRENT_MARKING_BOOL && !marking_state_.IsBlack(host)) { // The extension will be marked when the marker visits the host object. return; } extension->Mark(); } -void MarkingBarrier::Write(Map host, DescriptorArray descriptor_array, +void MarkingBarrier::Write(DescriptorArray descriptor_array, int number_of_own_descriptors) { + DCHECK(is_main_thread_barrier_); int16_t raw_marked = descriptor_array.raw_number_of_marked_descriptors(); if (NumberOfMarkedDescriptors::decode(collector_->epoch(), raw_marked) < number_of_own_descriptors) { - collector_->MarkDescriptorArrayFromWriteBarrier(host, descriptor_array, + collector_->MarkDescriptorArrayFromWriteBarrier(descriptor_array, number_of_own_descriptors); } } -void MarkingBarrier::Deactivate(PagedSpace* space) { +void MarkingBarrier::RecordRelocSlot(Code host, RelocInfo* rinfo, + HeapObject target) { + MarkCompactCollector::RecordRelocSlotInfo info = + MarkCompactCollector::PrepareRecordRelocSlot(host, rinfo, target); + if (info.should_record) { + auto& typed_slots = typed_slots_map_[info.memory_chunk]; + if (!typed_slots) { + typed_slots.reset(new TypedSlots()); + } + typed_slots->Insert(info.slot_type, info.offset); + } +} + +// static +void MarkingBarrier::ActivateAll(Heap* heap, bool is_compacting) { + heap->marking_barrier()->Activate(is_compacting); + if (FLAG_local_heaps) { + heap->safepoint()->IterateLocalHeaps( + [is_compacting](LocalHeap* local_heap) { + local_heap->marking_barrier()->Activate(is_compacting); + }); + } +} + +// static +void MarkingBarrier::DeactivateAll(Heap* heap) { + heap->marking_barrier()->Deactivate(); + if (FLAG_local_heaps) { + heap->safepoint()->IterateLocalHeaps([](LocalHeap* local_heap) { + local_heap->marking_barrier()->Deactivate(); + }); + } +} + +// static +void MarkingBarrier::PublishAll(Heap* heap) { + heap->marking_barrier()->Publish(); + if (FLAG_local_heaps) { + heap->safepoint()->IterateLocalHeaps([](LocalHeap* local_heap) { + local_heap->marking_barrier()->Publish(); + }); + } +} + +void MarkingBarrier::Publish() { + DCHECK_IMPLIES(!is_main_thread_barrier_, FLAG_local_heaps); + if (is_activated_) { + worklist_.Publish(); + for (auto& it : typed_slots_map_) { + MemoryChunk* memory_chunk = it.first; + std::unique_ptr& typed_slots = it.second; + RememberedSet::MergeTyped(memory_chunk, + std::move(typed_slots)); + } + typed_slots_map_.clear(); + } +} + +void MarkingBarrier::DeactivateSpace(PagedSpace* space) { + DCHECK(is_main_thread_barrier_); for (Page* p : *space) { p->SetOldGenerationPageFlags(false); } } -void MarkingBarrier::Deactivate(NewSpace* space) { +void MarkingBarrier::DeactivateSpace(NewSpace* space) { + DCHECK(is_main_thread_barrier_); for (Page* p : *space) { p->SetYoungGenerationPageFlags(false); } } void MarkingBarrier::Deactivate() { - Deactivate(heap_->old_space()); - Deactivate(heap_->map_space()); - Deactivate(heap_->code_space()); - Deactivate(heap_->new_space()); - for (LargePage* p : *heap_->new_lo_space()) { - p->SetYoungGenerationPageFlags(false); - DCHECK(p->IsLargePage()); - } - for (LargePage* p : *heap_->lo_space()) { - p->SetOldGenerationPageFlags(false); - } - for (LargePage* p : *heap_->code_lo_space()) { - p->SetOldGenerationPageFlags(false); - } is_activated_ = false; is_compacting_ = false; + DCHECK_IMPLIES(!is_main_thread_barrier_, FLAG_local_heaps); + if (is_main_thread_barrier_) { + DeactivateSpace(heap_->old_space()); + DeactivateSpace(heap_->map_space()); + DeactivateSpace(heap_->code_space()); + DeactivateSpace(heap_->new_space()); + for (LargePage* p : *heap_->new_lo_space()) { + p->SetYoungGenerationPageFlags(false); + DCHECK(p->IsLargePage()); + } + for (LargePage* p : *heap_->lo_space()) { + p->SetOldGenerationPageFlags(false); + } + for (LargePage* p : *heap_->code_lo_space()) { + p->SetOldGenerationPageFlags(false); + } + } + DCHECK(typed_slots_map_.empty()); + DCHECK(worklist_.IsLocalEmpty()); } -void MarkingBarrier::Activate(PagedSpace* space) { +void MarkingBarrier::ActivateSpace(PagedSpace* space) { + DCHECK(is_main_thread_barrier_); for (Page* p : *space) { p->SetOldGenerationPageFlags(true); } } -void MarkingBarrier::Activate(NewSpace* space) { +void MarkingBarrier::ActivateSpace(NewSpace* space) { + DCHECK(is_main_thread_barrier_); for (Page* p : *space) { p->SetYoungGenerationPageFlags(true); } @@ -103,24 +190,28 @@ void MarkingBarrier::Activate(NewSpace* space) { void MarkingBarrier::Activate(bool is_compacting) { DCHECK(!is_activated_); + DCHECK(worklist_.IsLocalEmpty()); + DCHECK_IMPLIES(!is_main_thread_barrier_, FLAG_local_heaps); is_compacting_ = is_compacting; is_activated_ = true; - Activate(heap_->old_space()); - Activate(heap_->map_space()); - Activate(heap_->code_space()); - Activate(heap_->new_space()); - - for (LargePage* p : *heap_->new_lo_space()) { - p->SetYoungGenerationPageFlags(true); - DCHECK(p->IsLargePage()); - } + if (is_main_thread_barrier_) { + ActivateSpace(heap_->old_space()); + ActivateSpace(heap_->map_space()); + ActivateSpace(heap_->code_space()); + ActivateSpace(heap_->new_space()); + + for (LargePage* p : *heap_->new_lo_space()) { + p->SetYoungGenerationPageFlags(true); + DCHECK(p->IsLargePage()); + } - for (LargePage* p : *heap_->lo_space()) { - p->SetOldGenerationPageFlags(true); - } + for (LargePage* p : *heap_->lo_space()) { + p->SetOldGenerationPageFlags(true); + } - for (LargePage* p : *heap_->code_lo_space()) { - p->SetOldGenerationPageFlags(true); + for (LargePage* p : *heap_->code_lo_space()) { + p->SetOldGenerationPageFlags(true); + } } } diff --git a/deps/v8/src/heap/marking-barrier.h b/deps/v8/src/heap/marking-barrier.h index 761231b93dc31c..df34bbddfe9306 100644 --- a/deps/v8/src/heap/marking-barrier.h +++ b/deps/v8/src/heap/marking-barrier.h @@ -14,19 +14,28 @@ namespace internal { class Heap; class IncrementalMarking; +class LocalHeap; class PagedSpace; class NewSpace; class MarkingBarrier { public: - MarkingBarrier(Heap*, MarkCompactCollector*, IncrementalMarking*); + explicit MarkingBarrier(Heap*); + explicit MarkingBarrier(LocalHeap*); + ~MarkingBarrier(); + void Activate(bool is_compacting); void Deactivate(); + void Publish(); + + static void ActivateAll(Heap* heap, bool is_compacting); + static void DeactivateAll(Heap* heap); + static void PublishAll(Heap* heap); void Write(HeapObject host, HeapObjectSlot, HeapObject value); void Write(Code host, RelocInfo*, HeapObject value); void Write(JSArrayBuffer host, ArrayBufferExtension*); - void Write(Map host, DescriptorArray, int number_of_own_descriptors); + void Write(DescriptorArray, int number_of_own_descriptors); // Returns true if the slot needs to be recorded. inline bool MarkValue(HeapObject host, HeapObject value); @@ -36,18 +45,25 @@ class MarkingBarrier { inline bool WhiteToGreyAndPush(HeapObject value); - void Activate(PagedSpace*); - void Activate(NewSpace*); + void RecordRelocSlot(Code host, RelocInfo* rinfo, HeapObject target); - void Deactivate(PagedSpace*); - void Deactivate(NewSpace*); + void ActivateSpace(PagedSpace*); + void ActivateSpace(NewSpace*); + + void DeactivateSpace(PagedSpace*); + void DeactivateSpace(NewSpace*); - MarkingState marking_state_; Heap* heap_; MarkCompactCollector* collector_; IncrementalMarking* incremental_marking_; + MarkingWorklist::Local worklist_; + MarkingState marking_state_; + std::unordered_map, + MemoryChunk::Hasher> + typed_slots_map_; bool is_compacting_ = false; bool is_activated_ = false; + bool is_main_thread_barrier_; }; } // namespace internal diff --git a/deps/v8/src/heap/marking-visitor-inl.h b/deps/v8/src/heap/marking-visitor-inl.h index e4d495b86fa986..532e1c9fd5e57f 100644 --- a/deps/v8/src/heap/marking-visitor-inl.h +++ b/deps/v8/src/heap/marking-visitor-inl.h @@ -351,7 +351,7 @@ int MarkingVisitorBase::VisitWeakCell( template size_t MarkingVisitorBase::MarkDescriptorArrayBlack( - HeapObject host, DescriptorArray descriptors) { + DescriptorArray descriptors) { concrete_visitor()->marking_state()->WhiteToGrey(descriptors); if (concrete_visitor()->marking_state()->GreyToBlack(descriptors)) { VisitPointer(descriptors, descriptors.map_slot()); @@ -402,7 +402,7 @@ int MarkingVisitorBase::VisitMap(Map meta_map, // slot holding the descriptor array will be implicitly recorded when the // pointer fields of this map are visited. DescriptorArray descriptors = map.synchronized_instance_descriptors(); - size += MarkDescriptorArrayBlack(map, descriptors); + size += MarkDescriptorArrayBlack(descriptors); int number_of_own_descriptors = map.NumberOfOwnDescriptors(); if (number_of_own_descriptors) { // It is possible that the concurrent marker observes the diff --git a/deps/v8/src/heap/marking-visitor.h b/deps/v8/src/heap/marking-visitor.h index f09f87530a4030..3707fc6031843c 100644 --- a/deps/v8/src/heap/marking-visitor.h +++ b/deps/v8/src/heap/marking-visitor.h @@ -227,8 +227,7 @@ class MarkingVisitorBase : public HeapVisitor { // Marks the descriptor array black without pushing it on the marking work // list and visits its header. Returns the size of the descriptor array // if it was successully marked as black. - V8_INLINE size_t MarkDescriptorArrayBlack(HeapObject host, - DescriptorArray descriptors); + V8_INLINE size_t MarkDescriptorArrayBlack(DescriptorArray descriptors); // Marks the object grey and pushes it on the marking work list. V8_INLINE void MarkObject(HeapObject host, HeapObject obj); diff --git a/deps/v8/src/heap/marking-worklist-inl.h b/deps/v8/src/heap/marking-worklist-inl.h index 25e83562bf5f8a..7e4c49667f5723 100644 --- a/deps/v8/src/heap/marking-worklist-inl.h +++ b/deps/v8/src/heap/marking-worklist-inl.h @@ -12,275 +12,6 @@ namespace v8 { namespace internal { -template -void MarkingWorklistImpl::Push(Segment* segment) { - base::MutexGuard guard(&lock_); - segment->set_next(top_); - set_top(segment); - size_.fetch_add(1, std::memory_order_relaxed); -} - -template -bool MarkingWorklistImpl::Pop(Segment** segment) { - base::MutexGuard guard(&lock_); - if (top_ != nullptr) { - DCHECK_LT(0U, size_); - size_.fetch_sub(1, std::memory_order_relaxed); - *segment = top_; - set_top(top_->next()); - return true; - } - return false; -} - -template -bool MarkingWorklistImpl::IsEmpty() { - return base::AsAtomicPointer::Relaxed_Load(&top_) == nullptr; -} - -template -size_t MarkingWorklistImpl::Size() { - // It is safe to read |size_| without a lock since this variable is - // atomic, keeping in mind that threads may not immediately see the new - // value when it is updated. - return size_.load(std::memory_order_relaxed); -} - -template -void MarkingWorklistImpl::Clear() { - base::MutexGuard guard(&lock_); - size_.store(0, std::memory_order_relaxed); - Segment* current = top_; - while (current != nullptr) { - Segment* tmp = current; - current = current->next(); - delete tmp; - } - set_top(nullptr); -} - -template -template -void MarkingWorklistImpl::Update(Callback callback) { - base::MutexGuard guard(&lock_); - Segment* prev = nullptr; - Segment* current = top_; - size_t num_deleted = 0; - while (current != nullptr) { - current->Update(callback); - if (current->IsEmpty()) { - DCHECK_LT(0U, size_); - ++num_deleted; - if (prev == nullptr) { - top_ = current->next(); - } else { - prev->set_next(current->next()); - } - Segment* tmp = current; - current = current->next(); - delete tmp; - } else { - prev = current; - current = current->next(); - } - } - size_.fetch_sub(num_deleted, std::memory_order_relaxed); -} - -template -template -void MarkingWorklistImpl::Iterate(Callback callback) { - base::MutexGuard guard(&lock_); - for (Segment* current = top_; current != nullptr; current = current->next()) { - current->Iterate(callback); - } -} - -template -void MarkingWorklistImpl::Merge( - MarkingWorklistImpl* other) { - Segment* top = nullptr; - size_t other_size = 0; - { - base::MutexGuard guard(&other->lock_); - if (!other->top_) return; - top = other->top_; - other_size = other->size_.load(std::memory_order_relaxed); - other->size_.store(0, std::memory_order_relaxed); - other->set_top(nullptr); - } - - // It's safe to iterate through these segments because the top was - // extracted from |other|. - Segment* end = top; - while (end->next()) end = end->next(); - - { - base::MutexGuard guard(&lock_); - size_.fetch_add(other_size, std::memory_order_relaxed); - end->set_next(top_); - set_top(top); - } -} - -template -bool MarkingWorklistImpl::Segment::Push( - EntryType entry) { - if (IsFull()) return false; - entries_[index_++] = entry; - return true; -} - -template -bool MarkingWorklistImpl::Segment::Pop( - EntryType* entry) { - if (IsEmpty()) return false; - *entry = entries_[--index_]; - return true; -} - -template -template -void MarkingWorklistImpl::Segment::Update( - Callback callback) { - size_t new_index = 0; - for (size_t i = 0; i < index_; i++) { - if (callback(entries_[i], &entries_[new_index])) { - new_index++; - } - } - index_ = new_index; -} - -template -template -void MarkingWorklistImpl::Segment::Iterate( - Callback callback) const { - for (size_t i = 0; i < index_; i++) { - callback(entries_[i]); - } -} - -template -MarkingWorklistImpl::Local::Local( - MarkingWorklistImpl* worklist) - : worklist_(worklist), - push_segment_(NewSegment()), - pop_segment_(NewSegment()) {} - -template -MarkingWorklistImpl::Local::~Local() { - CHECK_IMPLIES(push_segment_, push_segment_->IsEmpty()); - CHECK_IMPLIES(pop_segment_, pop_segment_->IsEmpty()); - delete push_segment_; - delete pop_segment_; -} - -template -MarkingWorklistImpl::Local::Local( - MarkingWorklistImpl::Local&& other) V8_NOEXCEPT { - worklist_ = other.worklist_; - push_segment_ = other.push_segment_; - pop_segment_ = other.pop_segment_; - other.worklist_ = nullptr; - other.push_segment_ = nullptr; - other.pop_segment_ = nullptr; -} - -template -typename MarkingWorklistImpl::Local& -MarkingWorklistImpl::Local::operator=( - MarkingWorklistImpl::Local&& other) V8_NOEXCEPT { - if (this != &other) { - DCHECK_NULL(worklist_); - DCHECK_NULL(push_segment_); - DCHECK_NULL(pop_segment_); - worklist_ = other.worklist_; - push_segment_ = other.push_segment_; - pop_segment_ = other.pop_segment_; - other.worklist_ = nullptr; - other.push_segment_ = nullptr; - other.pop_segment_ = nullptr; - } - return *this; -} - -template -void MarkingWorklistImpl::Local::Push(EntryType entry) { - if (V8_UNLIKELY(!push_segment_->Push(entry))) { - PublishPushSegment(); - bool success = push_segment_->Push(entry); - USE(success); - DCHECK(success); - } -} - -template -bool MarkingWorklistImpl::Local::Pop(EntryType* entry) { - if (!pop_segment_->Pop(entry)) { - if (!push_segment_->IsEmpty()) { - std::swap(push_segment_, pop_segment_); - } else if (!StealPopSegment()) { - return false; - } - bool success = pop_segment_->Pop(entry); - USE(success); - DCHECK(success); - } - return true; -} - -template -bool MarkingWorklistImpl::Local::IsLocalEmpty() const { - return push_segment_->IsEmpty() && pop_segment_->IsEmpty(); -} - -template -bool MarkingWorklistImpl::Local::IsGlobalEmpty() const { - return worklist_->IsEmpty(); -} - -template -void MarkingWorklistImpl::Local::Publish() { - if (!push_segment_->IsEmpty()) { - PublishPushSegment(); - } - if (!pop_segment_->IsEmpty()) { - PublishPopSegment(); - } -} - -template -void MarkingWorklistImpl::Local::Merge( - MarkingWorklistImpl::Local* other) { - other->Publish(); - worklist_->Merge(other->worklist_); -} - -template -void MarkingWorklistImpl::Local::PublishPushSegment() { - worklist_->Push(push_segment_); - push_segment_ = NewSegment(); -} - -template -void MarkingWorklistImpl::Local::PublishPopSegment() { - worklist_->Push(pop_segment_); - pop_segment_ = NewSegment(); -} - -template -bool MarkingWorklistImpl::Local::StealPopSegment() { - if (worklist_->IsEmpty()) return false; - Segment* new_segment = nullptr; - if (worklist_->Pop(&new_segment)) { - delete pop_segment_; - pop_segment_ = new_segment; - return true; - } - return false; -} - template void MarkingWorklists::Update(Callback callback) { shared_.Update(callback); diff --git a/deps/v8/src/heap/marking-worklist.h b/deps/v8/src/heap/marking-worklist.h index 9ed8d9de63edb8..2be050c7e55801 100644 --- a/deps/v8/src/heap/marking-worklist.h +++ b/deps/v8/src/heap/marking-worklist.h @@ -8,6 +8,7 @@ #include #include +#include "src/heap/base/worklist.h" #include "src/heap/marking.h" #include "src/objects/heap-object.h" @@ -17,120 +18,8 @@ namespace internal { // The index of the main thread task used by concurrent/parallel GC. const int kMainThreadTask = 0; -// A global marking worklist that is similar the existing Worklist -// but does not reserve space and keep track of the local segments. -// Eventually this will replace Worklist after all its current uses -// are migrated. -template -class MarkingWorklistImpl { - public: - static const int kSegmentSize = SegmentSize; - class Segment; - class Local; - - MarkingWorklistImpl() = default; - ~MarkingWorklistImpl() { CHECK(IsEmpty()); } - - void Push(Segment* segment); - bool Pop(Segment** segment); - - // Returns true if the list of segments is empty. - bool IsEmpty(); - // Returns the number of segments in the list. - size_t Size(); - - // Moves the segments of the given marking worklist into this - // marking worklist. - void Merge(MarkingWorklistImpl* other); - - // These functions are not thread-safe. They should be called only - // if all local marking worklists that use the current worklist have - // been published and are empty. - void Clear(); - template - void Update(Callback callback); - template - void Iterate(Callback callback); - - private: - void set_top(Segment* segment) { - base::AsAtomicPointer::Relaxed_Store(&top_, segment); - } - base::Mutex lock_; - Segment* top_ = nullptr; - std::atomic size_{0}; -}; - -template -class MarkingWorklistImpl::Segment { - public: - static const size_t kSize = SegmentSize; - - Segment() = default; - bool Push(EntryType entry); - bool Pop(EntryType* entry); - - size_t Size() const { return index_; } - bool IsEmpty() const { return index_ == 0; } - bool IsFull() const { return index_ == kSize; } - void Clear() { index_ = 0; } - - template - void Update(Callback callback); - template - void Iterate(Callback callback) const; - - Segment* next() const { return next_; } - void set_next(Segment* segment) { next_ = segment; } - - private: - Segment* next_; - size_t index_; - EntryType entries_[kSize]; -}; - -// A thread-local view of the marking worklist. -template -class MarkingWorklistImpl::Local { - public: - Local() = default; - explicit Local(MarkingWorklistImpl* worklist); - ~Local(); - - Local(Local&&) V8_NOEXCEPT; - Local& operator=(Local&&) V8_NOEXCEPT; - - // Disable copying since having multiple copies of the same - // local marking worklist is unsafe. - Local(const Local&) = delete; - Local& operator=(const Local& other) = delete; - - void Push(EntryType entry); - bool Pop(EntryType* entry); - - bool IsLocalEmpty() const; - bool IsGlobalEmpty() const; - - void Publish(); - void Merge(MarkingWorklistImpl::Local* other); - - size_t PushSegmentSize() const { return push_segment_->Size(); } - - private: - void PublishPushSegment(); - void PublishPopSegment(); - bool StealPopSegment(); - Segment* NewSegment() const { - // Bottleneck for filtering in crash dumps. - return new Segment(); - } - MarkingWorklistImpl* worklist_ = nullptr; - Segment* push_segment_ = nullptr; - Segment* pop_segment_ = nullptr; -}; - -using MarkingWorklist = MarkingWorklistImpl; -using EmbedderTracingWorklist = MarkingWorklistImpl; +using MarkingWorklist = ::heap::base::Worklist; +using EmbedderTracingWorklist = ::heap::base::Worklist; // We piggyback on marking to compute object sizes per native context that is // needed for the new memory measurement API. The algorithm works as follows: diff --git a/deps/v8/src/heap/marking.h b/deps/v8/src/heap/marking.h index fc87041d4eb502..5ce2f6cd251a96 100644 --- a/deps/v8/src/heap/marking.h +++ b/deps/v8/src/heap/marking.h @@ -58,8 +58,9 @@ class MarkBit { template <> inline bool MarkBit::Set() { CellType old_value = *cell_; + if ((old_value & mask_) == mask_) return false; *cell_ = old_value | mask_; - return (old_value & mask_) == 0; + return true; } template <> diff --git a/deps/v8/src/heap/memory-chunk-layout.h b/deps/v8/src/heap/memory-chunk-layout.h index aaf0334acb8208..0a95c709896d5d 100644 --- a/deps/v8/src/heap/memory-chunk-layout.h +++ b/deps/v8/src/heap/memory-chunk-layout.h @@ -9,6 +9,10 @@ #include "src/heap/list.h" #include "src/heap/slot-set.h" +#ifdef V8_ENABLE_CONSERVATIVE_STACK_SCANNING +#include "src/heap/object-start-bitmap.h" +#endif + namespace v8 { namespace internal { @@ -61,6 +65,9 @@ class V8_EXPORT_PRIVATE MemoryChunkLayout { FIELD(Bitmap*, YoungGenerationBitmap), FIELD(CodeObjectRegistry*, CodeObjectRegistry), FIELD(PossiblyEmptyBuckets, PossiblyEmptyBuckets), +#ifdef V8_ENABLE_CONSERVATIVE_STACK_SCANNING + FIELD(ObjectStartBitmap, ObjectStartBitmap), +#endif kMarkingBitmapOffset, kMemoryChunkHeaderSize = kMarkingBitmapOffset, kMemoryChunkHeaderStart = kSlotSetOffset, diff --git a/deps/v8/src/heap/memory-chunk.cc b/deps/v8/src/heap/memory-chunk.cc index 96b50939e9cc7c..9ff4d23557ddf6 100644 --- a/deps/v8/src/heap/memory-chunk.cc +++ b/deps/v8/src/heap/memory-chunk.cc @@ -155,6 +155,10 @@ MemoryChunk* MemoryChunk::Initialize(BasicMemoryChunk* basic_chunk, Heap* heap, chunk->possibly_empty_buckets_.Initialize(); +#ifdef V8_ENABLE_CONSERVATIVE_STACK_SCANNING + chunk->object_start_bitmap_ = ObjectStartBitmap(chunk->area_start()); +#endif + #ifdef DEBUG ValidateOffsets(chunk); #endif diff --git a/deps/v8/src/heap/memory-chunk.h b/deps/v8/src/heap/memory-chunk.h index cd74c61def6d27..ba6c06d026a436 100644 --- a/deps/v8/src/heap/memory-chunk.h +++ b/deps/v8/src/heap/memory-chunk.h @@ -227,6 +227,10 @@ class MemoryChunk : public BasicMemoryChunk { // read-only space chunks. void ReleaseAllocatedMemoryNeededForWritableChunk(); +#ifdef V8_ENABLE_CONSERVATIVE_STACK_SCANNING + ObjectStartBitmap* object_start_bitmap() { return &object_start_bitmap_; } +#endif + protected: static MemoryChunk* Initialize(BasicMemoryChunk* basic_chunk, Heap* heap, Executability executable); @@ -301,6 +305,10 @@ class MemoryChunk : public BasicMemoryChunk { PossiblyEmptyBuckets possibly_empty_buckets_; +#ifdef V8_ENABLE_CONSERVATIVE_STACK_SCANNING + ObjectStartBitmap object_start_bitmap_; +#endif + private: friend class ConcurrentMarkingState; friend class MajorMarkingState; diff --git a/deps/v8/src/heap/new-spaces.cc b/deps/v8/src/heap/new-spaces.cc index 6aa715da5f5144..98a8c715f405c1 100644 --- a/deps/v8/src/heap/new-spaces.cc +++ b/deps/v8/src/heap/new-spaces.cc @@ -10,6 +10,7 @@ #include "src/heap/mark-compact.h" #include "src/heap/memory-allocator.h" #include "src/heap/paged-spaces.h" +#include "src/heap/safepoint.h" #include "src/heap/spaces-inl.h" #include "src/heap/spaces.h" @@ -417,6 +418,7 @@ void NewSpace::TearDown() { void NewSpace::Flip() { SemiSpace::Swap(&from_space_, &to_space_); } void NewSpace::Grow() { + DCHECK(heap()->safepoint()->IsActive()); // Double the semispace size but only up to maximum capacity. DCHECK(TotalCapacity() < MaximumCapacity()); size_t new_capacity = diff --git a/deps/v8/src/heap/object-start-bitmap.h b/deps/v8/src/heap/object-start-bitmap.h new file mode 100644 index 00000000000000..75051d9a585246 --- /dev/null +++ b/deps/v8/src/heap/object-start-bitmap.h @@ -0,0 +1,188 @@ +// Copyright 2020 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef V8_HEAP_OBJECT_START_BITMAP_H_ +#define V8_HEAP_OBJECT_START_BITMAP_H_ + +#include +#include + +#include + +#include "include/v8-internal.h" +#include "src/base/bits.h" +#include "src/base/macros.h" +#include "src/common/globals.h" + +namespace v8 { +namespace internal { + +static constexpr size_t kAllocationGranularity = kTaggedSize; +static constexpr size_t kAllocationMask = kAllocationGranularity - 1; +static const int kPageSize = 1 << kPageSizeBits; + +// A bitmap for recording object starts. Objects have to be allocated at +// minimum granularity of kGranularity. +// +// Depends on internals such as: +// - kPageSize +// - kAllocationGranularity +// +// ObjectStartBitmap does not support concurrent access and is used only by the +// main thread. +class V8_EXPORT_PRIVATE ObjectStartBitmap { + public: + // Granularity of addresses added to the bitmap. + static constexpr size_t Granularity() { return kAllocationGranularity; } + + // Maximum number of entries in the bitmap. + static constexpr size_t MaxEntries() { + return kReservedForBitmap * kBitsPerCell; + } + + explicit inline ObjectStartBitmap(size_t offset = 0); + + // Finds an object header based on a maybe_inner_ptr. Will search for an + // object start in decreasing address order. + // + // This must only be used when there exists at least one entry in the bitmap. + inline Address FindBasePtr(Address maybe_inner_ptr) const; + + inline void SetBit(Address); + inline void ClearBit(Address); + inline bool CheckBit(Address) const; + + // Iterates all object starts recorded in the bitmap. + // + // The callback is of type + // void(Address) + // and is passed the object start address as parameter. + template + inline void Iterate(Callback) const; + + // Clear the object start bitmap. + inline void Clear(); + + private: + inline void store(size_t cell_index, uint32_t value); + inline uint32_t load(size_t cell_index) const; + + inline Address offset() const; + + static constexpr size_t kBitsPerCell = sizeof(uint32_t) * CHAR_BIT; + static constexpr size_t kCellMask = kBitsPerCell - 1; + static constexpr size_t kBitmapSize = + (kPageSize + ((kBitsPerCell * kAllocationGranularity) - 1)) / + (kBitsPerCell * kAllocationGranularity); + static constexpr size_t kReservedForBitmap = + ((kBitmapSize + kAllocationMask) & ~kAllocationMask); + + inline void ObjectStartIndexAndBit(Address, size_t*, size_t*) const; + + inline Address StartIndexToAddress(size_t object_start_index) const; + + size_t offset_; + + std::array object_start_bit_map_; +}; + +ObjectStartBitmap::ObjectStartBitmap(size_t offset) : offset_(offset) { + Clear(); +} + +Address ObjectStartBitmap::FindBasePtr(Address maybe_inner_ptr) const { + DCHECK_LE(offset(), maybe_inner_ptr); + size_t object_offset = maybe_inner_ptr - offset(); + size_t object_start_number = object_offset / kAllocationGranularity; + size_t cell_index = object_start_number / kBitsPerCell; + DCHECK_GT(object_start_bit_map_.size(), cell_index); + const size_t bit = object_start_number & kCellMask; + // check if maybe_inner_ptr is the base pointer + uint32_t byte = load(cell_index) & ((1 << (bit + 1)) - 1); + while (!byte && cell_index) { + DCHECK_LT(0u, cell_index); + byte = load(--cell_index); + } + const int leading_zeroes = v8::base::bits::CountLeadingZeros(byte); + if (leading_zeroes == kBitsPerCell) { + return kNullAddress; + } + + object_start_number = + (cell_index * kBitsPerCell) + (kBitsPerCell - 1) - leading_zeroes; + Address base_ptr = StartIndexToAddress(object_start_number); + return base_ptr; +} + +void ObjectStartBitmap::SetBit(Address base_ptr) { + size_t cell_index, object_bit; + ObjectStartIndexAndBit(base_ptr, &cell_index, &object_bit); + store(cell_index, + static_cast(load(cell_index) | (1 << object_bit))); +} + +void ObjectStartBitmap::ClearBit(Address base_ptr) { + size_t cell_index, object_bit; + ObjectStartIndexAndBit(base_ptr, &cell_index, &object_bit); + store(cell_index, + static_cast(load(cell_index) & ~(1 << object_bit))); +} + +bool ObjectStartBitmap::CheckBit(Address base_ptr) const { + size_t cell_index, object_bit; + ObjectStartIndexAndBit(base_ptr, &cell_index, &object_bit); + return load(cell_index) & (1 << object_bit); +} + +void ObjectStartBitmap::store(size_t cell_index, uint32_t value) { + object_start_bit_map_[cell_index] = value; + return; +} + +uint32_t ObjectStartBitmap::load(size_t cell_index) const { + return object_start_bit_map_[cell_index]; +} + +Address ObjectStartBitmap::offset() const { return offset_; } + +void ObjectStartBitmap::ObjectStartIndexAndBit(Address base_ptr, + size_t* cell_index, + size_t* bit) const { + const size_t object_offset = base_ptr - offset(); + DCHECK(!(object_offset & kAllocationMask)); + const size_t object_start_number = object_offset / kAllocationGranularity; + *cell_index = object_start_number / kBitsPerCell; + DCHECK_GT(kBitmapSize, *cell_index); + *bit = object_start_number & kCellMask; +} + +Address ObjectStartBitmap::StartIndexToAddress( + size_t object_start_index) const { + return offset() + (kAllocationGranularity * object_start_index); +} + +template +inline void ObjectStartBitmap::Iterate(Callback callback) const { + for (size_t cell_index = 0; cell_index < kReservedForBitmap; cell_index++) { + uint32_t value = object_start_bit_map_[cell_index]; + while (value) { + const int trailing_zeroes = v8::base::bits::CountTrailingZeros(value); + const size_t object_start_number = + (cell_index * kBitsPerCell) + trailing_zeroes; + const Address object_address = StartIndexToAddress(object_start_number); + callback(object_address); + // Clear current object bit in temporary value to advance iteration. + value &= ~(1 << (object_start_number & kCellMask)); + } + } +} + +void ObjectStartBitmap::Clear() { + std::fill(object_start_bit_map_.begin(), object_start_bit_map_.end(), 0); +} + +} // namespace internal +} // namespace v8 + +#endif // V8_HEAP_OBJECT_START_BITMAP_H_ diff --git a/deps/v8/src/heap/object-stats.cc b/deps/v8/src/heap/object-stats.cc index 1db380b882fa00..b84ae26c908463 100644 --- a/deps/v8/src/heap/object-stats.cc +++ b/deps/v8/src/heap/object-stats.cc @@ -723,7 +723,7 @@ void ObjectStatsCollectorImpl::RecordVirtualFeedbackVectorDetails( // Log the monomorphic/polymorphic helper objects that this slot owns. for (int i = 0; i < it.entry_size(); i++) { - MaybeObject raw_object = vector.get(slot.ToInt() + i); + MaybeObject raw_object = vector.Get(slot.WithOffset(i)); HeapObject object; if (raw_object->GetHeapObject(&object)) { if (object.IsCell() || object.IsWeakFixedArray()) { diff --git a/deps/v8/src/heap/objects-visiting.h b/deps/v8/src/heap/objects-visiting.h index 7fbe91c6655044..7ecb66bceece7b 100644 --- a/deps/v8/src/heap/objects-visiting.h +++ b/deps/v8/src/heap/objects-visiting.h @@ -9,7 +9,7 @@ #include "src/objects/map.h" #include "src/objects/objects.h" #include "src/objects/visitors.h" -#include "torque-generated/field-offsets-tq.h" +#include "torque-generated/field-offsets.h" namespace v8 { namespace internal { @@ -30,7 +30,6 @@ namespace internal { V(EphemeronHashTable) \ V(FeedbackCell) \ V(FeedbackMetadata) \ - V(FeedbackVector) \ V(FixedDoubleArray) \ V(JSArrayBuffer) \ V(JSDataView) \ diff --git a/deps/v8/src/heap/paged-spaces.cc b/deps/v8/src/heap/paged-spaces.cc index 176071651616d5..5ab30e3aa8151e 100644 --- a/deps/v8/src/heap/paged-spaces.cc +++ b/deps/v8/src/heap/paged-spaces.cc @@ -137,13 +137,14 @@ void PagedSpace::RefillFreeList() { owner->RefineAllocatedBytesAfterSweeping(p); owner->RemovePage(p); added += AddPage(p); + added += p->wasted_memory(); } else { base::MutexGuard guard(mutex()); DCHECK_EQ(this, p->owner()); RefineAllocatedBytesAfterSweeping(p); added += RelinkFreeListCategories(p); + added += p->wasted_memory(); } - added += p->wasted_memory(); if (is_compaction_space() && (added > kCompactionMemoryWanted)) break; } } @@ -180,7 +181,6 @@ void PagedSpace::MergeLocalSpace(LocalSpace* other) { // Relinking requires the category to be unlinked. other->RemovePage(p); AddPage(p); - heap()->NotifyOldGenerationExpansion(identity(), p); DCHECK_IMPLIES( !p->IsFlagSet(Page::NEVER_ALLOCATE_ON_PAGE), p->AvailableInFreeList() == p->AvailableInFreeListFromAllocatedBytes()); @@ -192,6 +192,9 @@ void PagedSpace::MergeLocalSpace(LocalSpace* other) { // We'll have to come up with a better solution for allocation stepping // before shipping, which will likely be using LocalHeap. } + for (auto p : other->GetNewPages()) { + heap()->NotifyOldGenerationExpansion(identity(), p); + } DCHECK_EQ(0u, other->Size()); DCHECK_EQ(0u, other->Capacity()); @@ -200,6 +203,7 @@ void PagedSpace::MergeLocalSpace(LocalSpace* other) { size_t PagedSpace::CommittedPhysicalMemory() { if (!base::OS::HasLazyCommits()) return CommittedMemory(); BasicMemoryChunk::UpdateHighWaterMark(allocation_info_.top()); + base::MutexGuard guard(mutex()); size_t size = 0; for (Page* page : *this) { size += page->CommittedPhysicalMemory(); @@ -451,7 +455,9 @@ void PagedSpace::ReleasePage(Page* page) { SetTopAndLimit(kNullAddress, kNullAddress); } - heap()->isolate()->RemoveCodeMemoryChunk(page); + if (identity() == CODE_SPACE) { + heap()->isolate()->RemoveCodeMemoryChunk(page); + } AccountUncommitted(page->size()); accounting_stats_.DecreaseCapacity(page->area_size()); @@ -827,6 +833,12 @@ bool PagedSpace::RefillLabMain(int size_in_bytes, AllocationOrigin origin) { return RawRefillLabMain(size_in_bytes, origin); } +Page* LocalSpace::Expand() { + Page* page = PagedSpace::Expand(); + new_pages_.push_back(page); + return page; +} + bool CompactionSpace::RefillLabMain(int size_in_bytes, AllocationOrigin origin) { return RawRefillLabMain(size_in_bytes, origin); diff --git a/deps/v8/src/heap/paged-spaces.h b/deps/v8/src/heap/paged-spaces.h index 4af1b3013c014f..198f12e103cba4 100644 --- a/deps/v8/src/heap/paged-spaces.h +++ b/deps/v8/src/heap/paged-spaces.h @@ -341,7 +341,7 @@ class V8_EXPORT_PRIVATE PagedSpace // Expands the space by allocating a fixed number of pages. Returns false if // it cannot allocate requested number of pages from OS, or if the hard heap // size limit has been hit. - Page* Expand(); + virtual Page* Expand(); Page* ExpandBackground(LocalHeap* local_heap); Page* AllocatePage(); @@ -417,9 +417,15 @@ class V8_EXPORT_PRIVATE LocalSpace : public PagedSpace { DCHECK_NE(local_space_kind, LocalSpaceKind::kNone); } + const std::vector& GetNewPages() { return new_pages_; } + protected: + Page* Expand() override; // The space is temporary and not included in any snapshots. bool snapshotable() override { return false; } + // Pages that were allocated in this local space and need to be merged + // to the main space. + std::vector new_pages_; }; // ----------------------------------------------------------------------------- diff --git a/deps/v8/src/heap/safepoint.cc b/deps/v8/src/heap/safepoint.cc index 8f20bde75ece74..a306fbde0806c1 100644 --- a/deps/v8/src/heap/safepoint.cc +++ b/deps/v8/src/heap/safepoint.cc @@ -16,10 +16,6 @@ namespace internal { GlobalSafepoint::GlobalSafepoint(Heap* heap) : heap_(heap), local_heaps_head_(nullptr), active_safepoint_scopes_(0) {} -void GlobalSafepoint::Start() { EnterSafepointScope(); } - -void GlobalSafepoint::End() { LeaveSafepointScope(); } - void GlobalSafepoint::EnterSafepointScope() { if (!FLAG_local_heaps) return; diff --git a/deps/v8/src/heap/safepoint.h b/deps/v8/src/heap/safepoint.h index e36e37fd710b0f..efe499ea13e503 100644 --- a/deps/v8/src/heap/safepoint.h +++ b/deps/v8/src/heap/safepoint.h @@ -43,10 +43,6 @@ class GlobalSafepoint { } } - // Use these methods now instead of the more intrusive SafepointScope - void Start(); - void End(); - bool IsActive() { return active_safepoint_scopes_ > 0; } private: diff --git a/deps/v8/src/heap/scavenger.cc b/deps/v8/src/heap/scavenger.cc index 2861198327b58e..f51a38508515a8 100644 --- a/deps/v8/src/heap/scavenger.cc +++ b/deps/v8/src/heap/scavenger.cc @@ -486,7 +486,7 @@ int ScavengerCollector::NumberOfScavengeTasks() { static int num_cores = V8::GetCurrentPlatform()->NumberOfWorkerThreads() + 1; int tasks = Max(1, Min(Min(num_scavenge_tasks, kMaxScavengerTasks), num_cores)); - if (!heap_->CanExpandOldGeneration( + if (!heap_->CanPromoteYoungAndExpandOldGeneration( static_cast(tasks * Page::kPageSize))) { // Optimize for memory usage near the heap limit. tasks = 1; diff --git a/deps/v8/src/heap/setup-heap-internal.cc b/deps/v8/src/heap/setup-heap-internal.cc index b255d4858de05b..b1844256e8ffb8 100644 --- a/deps/v8/src/heap/setup-heap-internal.cc +++ b/deps/v8/src/heap/setup-heap-internal.cc @@ -44,9 +44,9 @@ #include "src/objects/template-objects-inl.h" #include "src/regexp/regexp.h" #include "src/wasm/wasm-objects.h" -#include "torque-generated/class-definitions-tq.h" -#include "torque-generated/exported-class-definitions-tq-inl.h" -#include "torque-generated/internal-class-definitions-tq-inl.h" +#include "torque-generated/class-definitions.h" +#include "torque-generated/exported-class-definitions-inl.h" +#include "torque-generated/internal-class-definitions-inl.h" namespace v8 { namespace internal { diff --git a/deps/v8/src/heap/sweeper.cc b/deps/v8/src/heap/sweeper.cc index b335e232778c40..cdb1058edb0b40 100644 --- a/deps/v8/src/heap/sweeper.cc +++ b/deps/v8/src/heap/sweeper.cc @@ -386,6 +386,10 @@ int Sweeper::RawSweep( // The free ranges map is used for filtering typed slots. FreeRangesMap free_ranges_map; +#ifdef V8_ENABLE_CONSERVATIVE_STACK_SCANNING + p->object_start_bitmap()->Clear(); +#endif + // Iterate over the page using the live objects and free the memory before // the given live object. Address free_start = p->area_start(); @@ -410,6 +414,10 @@ int Sweeper::RawSweep( int size = object.SizeFromMap(map); live_bytes += size; free_start = free_end + size; + +#ifdef V8_ENABLE_CONSERVATIVE_STACK_SCANNING + p->object_start_bitmap()->SetBit(object.address()); +#endif } // If there is free memory after the last live object also free that. diff --git a/deps/v8/src/ic/accessor-assembler.cc b/deps/v8/src/ic/accessor-assembler.cc index 40e8a5de72d1c5..40728edf90c26e 100644 --- a/deps/v8/src/ic/accessor-assembler.cc +++ b/deps/v8/src/ic/accessor-assembler.cc @@ -6,6 +6,7 @@ #include "src/ast/ast.h" #include "src/base/optional.h" +#include "src/builtins/builtins-constructor-gen.h" #include "src/codegen/code-factory.h" #include "src/ic/handler-configuration.h" #include "src/ic/ic.h" @@ -65,14 +66,15 @@ TNode AccessorAssembler::LoadHandlerDataField( TNode AccessorAssembler::TryMonomorphicCase( TNode slot, TNode vector, - TNode receiver_map, Label* if_handler, + TNode lookup_start_object_map, Label* if_handler, TVariable* var_handler, Label* if_miss) { Comment("TryMonomorphicCase"); DCHECK_EQ(MachineRepresentation::kTagged, var_handler->rep()); // TODO(ishell): add helper class that hides offset computations for a series // of loads. - int32_t header_size = FeedbackVector::kFeedbackSlotsOffset - kHeapObjectTag; + int32_t header_size = + FeedbackVector::kRawFeedbackSlotsOffset - kHeapObjectTag; // Adding |header_size| with a separate IntPtrAdd rather than passing it // into ElementOffsetFromIndex() allows it to be folded into a single // [base, index, offset] indirect memory access on x64. @@ -83,7 +85,7 @@ TNode AccessorAssembler::TryMonomorphicCase( // Try to quickly handle the monomorphic case without knowing for sure // if we have a weak reference in feedback. - GotoIfNot(IsWeakReferenceTo(feedback, receiver_map), if_miss); + GotoIfNot(IsWeakReferenceTo(feedback, lookup_start_object_map), if_miss); TNode handler = UncheckedCast( Load(MachineType::AnyTagged(), vector, @@ -95,8 +97,8 @@ TNode AccessorAssembler::TryMonomorphicCase( } void AccessorAssembler::HandlePolymorphicCase( - TNode receiver_map, TNode feedback, Label* if_handler, - TVariable* var_handler, Label* if_miss) { + TNode lookup_start_object_map, TNode feedback, + Label* if_handler, TVariable* var_handler, Label* if_miss) { Comment("HandlePolymorphicCase"); DCHECK_EQ(MachineRepresentation::kTagged, var_handler->rep()); @@ -118,7 +120,8 @@ void AccessorAssembler::HandlePolymorphicCase( TNode maybe_cached_map = LoadWeakFixedArrayElement(feedback, var_index.value()); CSA_ASSERT(this, IsWeakOrCleared(maybe_cached_map)); - GotoIfNot(IsWeakReferenceTo(maybe_cached_map, receiver_map), &loop_next); + GotoIfNot(IsWeakReferenceTo(maybe_cached_map, lookup_start_object_map), + &loop_next); // Found, now call handler. TNode handler = @@ -140,7 +143,7 @@ void AccessorAssembler::HandleLoadICHandlerCase( ElementSupport support_elements, LoadAccessMode access_mode) { Comment("have_handler"); - TVARIABLE(Object, var_holder, p->holder()); + TVARIABLE(Object, var_holder, p->lookup_start_object()); TVARIABLE(Object, var_smi_handler, handler); Label if_smi_handler(this, {&var_holder, &var_smi_handler}); @@ -197,7 +200,8 @@ void AccessorAssembler::HandleLoadAccessor( // Context is stored either in data2 or data3 field depending on whether // the access check is enabled for this handler or not. TNode maybe_context = Select( - IsSetWord(handler_word), + IsSetWord( + handler_word), [=] { return LoadHandlerDataField(handler, 3); }, [=] { return LoadHandlerDataField(handler, 2); }); @@ -212,7 +216,7 @@ void AccessorAssembler::HandleLoadAccessor( TNode data = LoadObjectField(call_handler_info, CallHandlerInfo::kDataOffset); - TVARIABLE(HeapObject, api_holder, CAST(p->receiver())); + TVARIABLE(HeapObject, api_holder, CAST(p->lookup_start_object())); Label load(this); GotoIf(WordEqual(handler_kind, IntPtrConstant(LoadHandler::kApiGetter)), &load); @@ -222,7 +226,7 @@ void AccessorAssembler::HandleLoadAccessor( WordEqual(handler_kind, IntPtrConstant(LoadHandler::kApiGetterHolderIsPrototype))); - api_holder = LoadMapPrototype(LoadMap(CAST(p->receiver()))); + api_holder = LoadMapPrototype(LoadMap(CAST(p->lookup_start_object()))); Goto(&load); BIND(&load); @@ -546,9 +550,9 @@ void AccessorAssembler::HandleLoadICSmiHandlerLoadNamedCase( TVARIABLE(Object, var_value); LoadPropertyFromNameDictionary(properties, var_name_index.value(), &var_details, &var_value); - TNode value = - CallGetterIfAccessor(var_value.value(), var_details.value(), - p->context(), p->receiver(), miss); + TNode value = CallGetterIfAccessor( + var_value.value(), CAST(holder), var_details.value(), p->context(), + p->receiver(), miss); exit_point->Return(value); } } @@ -631,8 +635,8 @@ void AccessorAssembler::HandleLoadICSmiHandlerLoadNamedCase( CAST(holder), PropertyCell::kPropertyDetailsRawOffset)); GotoIf(IsTheHole(value), miss); - exit_point->Return(CallGetterIfAccessor(value, details, p->context(), - p->receiver(), miss)); + exit_point->Return(CallGetterIfAccessor(value, CAST(holder), details, + p->context(), p->receiver(), miss)); } BIND(&interceptor); @@ -650,8 +654,8 @@ void AccessorAssembler::HandleLoadICSmiHandlerLoadNamedCase( p->name(), p->slot(), p->vector()); } else { - exit_point->ReturnCallRuntime(Runtime::kGetProperty, p->context(), - p->receiver(), p->name()); + exit_point->ReturnCallRuntime(Runtime::kGetProperty, p->context(), holder, + p->name(), p->receiver()); } } @@ -787,12 +791,14 @@ void AccessorAssembler::HandleLoadICSmiHandlerHasNamedCase( // generate a code that handles Code handlers. // If |on_code_handler| is not provided, then only smi sub handler are // expected. -// 3. Does access check on receiver if ICHandler::DoAccessCheckOnReceiverBits -// bit is set in the smi handler. -// 4. Does dictionary lookup on receiver if ICHandler::LookupOnReceiverBits bit -// is set in the smi handler. If |on_found_on_receiver| is provided then -// it calls it to generate a code that handles the "found on receiver case" -// or just misses if the |on_found_on_receiver| is not provided. +// 3. Does access check on lookup start object if +// ICHandler::DoAccessCheckOnLookupStartObjectBits bit is set in the smi +// handler. +// 4. Does dictionary lookup on receiver if +// ICHandler::LookupOnLookupStartObjectBits bit is set in the smi handler. If +// |on_found_on_lookup_start_object| is provided then it calls it to +// generate a code that handles the "found on receiver case" or just misses +// if the |on_found_on_lookup_start_object| is not provided. // 5. Falls through in a case of a smi handler which is returned from this // function (tagged!). // TODO(ishell): Remove templatezation once we move common bits from @@ -801,8 +807,8 @@ template TNode AccessorAssembler::HandleProtoHandler( const ICParameters* p, TNode handler, const OnCodeHandler& on_code_handler, - const OnFoundOnReceiver& on_found_on_receiver, Label* miss, - ICMode ic_mode) { + const OnFoundOnLookupStartObject& on_found_on_lookup_start_object, + Label* miss, ICMode ic_mode) { // // Check prototype validity cell. // @@ -832,21 +838,24 @@ TNode AccessorAssembler::HandleProtoHandler( // because in the former case the validity cell check guards modifications // of the global object and the latter is not applicable to the global // object. - int mask = ICHandler::LookupOnReceiverBits::kMask | - ICHandler::DoAccessCheckOnReceiverBits::kMask; + int mask = ICHandler::LookupOnLookupStartObjectBits::kMask | + ICHandler::DoAccessCheckOnLookupStartObjectBits::kMask; if (ic_mode == ICMode::kGlobalIC) { CSA_ASSERT(this, IsClearWord(handler_flags, mask)); } else { DCHECK_EQ(ICMode::kNonGlobalIC, ic_mode); - Label done(this), if_do_access_check(this), if_lookup_on_receiver(this); + Label done(this), if_do_access_check(this), + if_lookup_on_lookup_start_object(this); GotoIf(IsClearWord(handler_flags, mask), &done); // Only one of the bits can be set at a time. CSA_ASSERT(this, WordNotEqual(WordAnd(handler_flags, IntPtrConstant(mask)), IntPtrConstant(mask))); - Branch(IsSetWord(handler_flags), - &if_do_access_check, &if_lookup_on_receiver); + Branch( + IsSetWord( + handler_flags), + &if_do_access_check, &if_lookup_on_lookup_start_object); BIND(&if_do_access_check); { @@ -854,29 +863,31 @@ TNode AccessorAssembler::HandleProtoHandler( CSA_ASSERT(this, IsWeakOrCleared(data2)); TNode expected_native_context = CAST(GetHeapObjectAssumeWeak(data2, miss)); - EmitAccessCheck(expected_native_context, p->context(), p->receiver(), - &done, miss); + EmitAccessCheck(expected_native_context, p->context(), + p->lookup_start_object(), &done, miss); } - // Dictionary lookup on receiver is not necessary for Load/StoreGlobalIC - // because prototype validity cell check already guards modifications of - // the global object. - BIND(&if_lookup_on_receiver); + BIND(&if_lookup_on_lookup_start_object); { - DCHECK_EQ(ICMode::kNonGlobalIC, ic_mode); - CSA_ASSERT(this, Word32BinaryNot(HasInstanceType( - CAST(p->receiver()), JS_GLOBAL_OBJECT_TYPE))); + // Dictionary lookup on lookup start object is not necessary for + // Load/StoreGlobalIC (which is the only case when the + // lookup_start_object can be a JSGlobalObject) because prototype + // validity cell check already guards modifications of the global + // object. + CSA_ASSERT(this, + Word32BinaryNot(HasInstanceType( + CAST(p->lookup_start_object()), JS_GLOBAL_OBJECT_TYPE))); TNode properties = - CAST(LoadSlowProperties(CAST(p->receiver()))); + CAST(LoadSlowProperties(CAST(p->lookup_start_object()))); TVARIABLE(IntPtrT, var_name_index); Label found(this, &var_name_index); NameDictionaryLookup(properties, CAST(p->name()), &found, &var_name_index, &done); BIND(&found); { - if (on_found_on_receiver) { - on_found_on_receiver(properties, var_name_index.value()); + if (on_found_on_lookup_start_object) { + on_found_on_lookup_start_object(properties, var_name_index.value()); } else { Goto(miss); } @@ -898,7 +909,7 @@ void AccessorAssembler::HandleLoadICProtoHandler( p, handler, // Code sub-handlers are not expected in LoadICs, so no |on_code_handler|. nullptr, - // on_found_on_receiver + // on_found_on_lookup_start_object [=](TNode properties, TNode name_index) { if (access_mode == LoadAccessMode::kHas) { exit_point->Return(TrueConstant()); @@ -907,9 +918,9 @@ void AccessorAssembler::HandleLoadICProtoHandler( TVARIABLE(Object, var_value); LoadPropertyFromNameDictionary(properties, name_index, &var_details, &var_value); - TNode value = - CallGetterIfAccessor(var_value.value(), var_details.value(), - p->context(), p->receiver(), miss); + TNode value = CallGetterIfAccessor( + var_value.value(), CAST(var_holder->value()), var_details.value(), + p->context(), p->receiver(), miss); exit_point->Return(value); } }, @@ -1539,7 +1550,7 @@ void AccessorAssembler::HandleStoreICProtoHandler( TNode smi_handler = HandleProtoHandler( p, handler, on_code_handler, - // on_found_on_receiver + // on_found_on_lookup_start_object [=](TNode properties, TNode name_index) { TNode details = LoadDetailsByKeyIndex(properties, name_index); // Check that the property is a writable data property (no accessor). @@ -1614,8 +1625,8 @@ void AccessorAssembler::HandleStoreICProtoHandler( BIND(&if_add_normal); { // This is a case of "transitioning store" to a dictionary mode object - // when the property is still does not exist. The "existing property" - // case is covered above by LookupOnReceiver bit handling of the smi + // when the property does not exist. The "existing property" case is + // covered above by LookupOnLookupStartObject bit handling of the smi // handler. Label slow(this); TNode receiver_map = LoadMap(CAST(p->receiver())); @@ -1646,7 +1657,8 @@ void AccessorAssembler::HandleStoreICProtoHandler( // Context is stored either in data2 or data3 field depending on whether // the access check is enabled for this handler or not. TNode maybe_context = Select( - IsSetWord32(handler_word), + IsSetWord32( + handler_word), [=] { return LoadHandlerDataField(handler, 3); }, [=] { return LoadHandlerDataField(handler, 2); }); @@ -2281,10 +2293,10 @@ void AccessorAssembler::InvalidateValidityCellIfPrototype( BIND(&cont); } -void AccessorAssembler::GenericElementLoad(TNode receiver, - TNode receiver_map, - TNode instance_type, - TNode index, Label* slow) { +void AccessorAssembler::GenericElementLoad( + TNode lookup_start_object, TNode lookup_start_object_map, + TNode lookup_start_object_instance_type, TNode index, + Label* slow) { Comment("integer index"); ExitPoint direct_exit(this); @@ -2293,18 +2305,22 @@ void AccessorAssembler::GenericElementLoad(TNode receiver, Label return_undefined(this); // Receivers requiring non-standard element accesses (interceptors, access // checks, strings and string wrappers, proxies) are handled in the runtime. - GotoIf(IsCustomElementsReceiverInstanceType(instance_type), &if_custom); - TNode elements_kind = LoadMapElementsKind(receiver_map); - TNode is_jsarray_condition = IsJSArrayInstanceType(instance_type); + GotoIf( + IsCustomElementsReceiverInstanceType(lookup_start_object_instance_type), + &if_custom); + TNode elements_kind = LoadMapElementsKind(lookup_start_object_map); + TNode is_jsarray_condition = + IsJSArrayInstanceType(lookup_start_object_instance_type); TVARIABLE(Float64T, var_double_value); Label rebox_double(this, &var_double_value); // Unimplemented elements kinds fall back to a runtime call. Label* unimplemented_elements_kind = slow; IncrementCounter(isolate()->counters()->ic_keyed_load_generic_smi(), 1); - EmitElementLoad(receiver, elements_kind, index, is_jsarray_condition, - &if_element_hole, &rebox_double, &var_double_value, - unimplemented_elements_kind, &if_oob, slow, &direct_exit); + EmitElementLoad(lookup_start_object, elements_kind, index, + is_jsarray_condition, &if_element_hole, &rebox_double, + &var_double_value, unimplemented_elements_kind, &if_oob, slow, + &direct_exit); BIND(&rebox_double); Return(AllocateHeapNumberWithValue(var_double_value.value())); @@ -2314,7 +2330,8 @@ void AccessorAssembler::GenericElementLoad(TNode receiver, Comment("out of bounds"); // On TypedArrays, all OOB loads (positive and negative) return undefined // without ever checking the prototype chain. - GotoIf(IsJSTypedArrayInstanceType(instance_type), &return_undefined); + GotoIf(IsJSTypedArrayInstanceType(lookup_start_object_instance_type), + &return_undefined); // Positive OOB indices within JSArray index range are effectively the same // as hole loads. Larger keys and negative keys are named loads. if (Is64()) { @@ -2329,35 +2346,35 @@ void AccessorAssembler::GenericElementLoad(TNode receiver, BIND(&if_element_hole); { Comment("found the hole"); - BranchIfPrototypesHaveNoElements(receiver_map, &return_undefined, slow); + BranchIfPrototypesHaveNoElements(lookup_start_object_map, &return_undefined, + slow); } BIND(&if_custom); { Comment("check if string"); - GotoIfNot(IsStringInstanceType(instance_type), slow); + GotoIfNot(IsStringInstanceType(lookup_start_object_instance_type), slow); Comment("load string character"); - TNode length = LoadStringLengthAsWord(CAST(receiver)); + TNode length = LoadStringLengthAsWord(CAST(lookup_start_object)); GotoIfNot(UintPtrLessThan(index, length), slow); IncrementCounter(isolate()->counters()->ic_keyed_load_generic_smi(), 1); - TailCallBuiltin(Builtins::kStringCharAt, NoContextConstant(), receiver, - index); + TailCallBuiltin(Builtins::kStringCharAt, NoContextConstant(), + lookup_start_object, index); } BIND(&return_undefined); Return(UndefinedConstant()); } -void AccessorAssembler::GenericPropertyLoad(TNode receiver, - TNode receiver_map, - TNode instance_type, - const LoadICParameters* p, - Label* slow, - UseStubCache use_stub_cache) { +void AccessorAssembler::GenericPropertyLoad( + TNode lookup_start_object, TNode lookup_start_object_map, + TNode lookup_start_object_instance_type, const LoadICParameters* p, + Label* slow, UseStubCache use_stub_cache) { + DCHECK_EQ(lookup_start_object, p->lookup_start_object()); ExitPoint direct_exit(this); Comment("key is unique name"); - Label if_found_on_receiver(this), if_property_dictionary(this), + Label if_found_on_lookup_start_object(this), if_property_dictionary(this), lookup_prototype_chain(this), special_receiver(this); TVARIABLE(Uint32T, var_details); TVARIABLE(Object, var_value); @@ -2366,16 +2383,18 @@ void AccessorAssembler::GenericPropertyLoad(TNode receiver, // Receivers requiring non-standard accesses (interceptors, access // checks, strings and string wrappers) are handled in the runtime. - GotoIf(IsSpecialReceiverInstanceType(instance_type), &special_receiver); + GotoIf(IsSpecialReceiverInstanceType(lookup_start_object_instance_type), + &special_receiver); - // Check if the receiver has fast or slow properties. - TNode bitfield3 = LoadMapBitField3(receiver_map); + // Check if the lookup_start_object has fast or slow properties. + TNode bitfield3 = LoadMapBitField3(lookup_start_object_map); GotoIf(IsSetWord32(bitfield3), &if_property_dictionary); - // Try looking up the property on the receiver; if unsuccessful, look - // for a handler in the stub cache. - TNode descriptors = LoadMapDescriptors(receiver_map); + // Try looking up the property on the lookup_start_object; if unsuccessful, + // look for a handler in the stub cache. + TNode descriptors = + LoadMapDescriptors(lookup_start_object_map); Label if_descriptor_found(this), try_stub_cache(this); TVARIABLE(IntPtrT, var_name_index); @@ -2386,13 +2405,14 @@ void AccessorAssembler::GenericPropertyLoad(TNode receiver, BIND(&if_descriptor_found); { - LoadPropertyFromFastObject(receiver, receiver_map, descriptors, - var_name_index.value(), &var_details, - &var_value); - Goto(&if_found_on_receiver); + LoadPropertyFromFastObject(lookup_start_object, lookup_start_object_map, + descriptors, var_name_index.value(), + &var_details, &var_value); + Goto(&if_found_on_lookup_start_object); } if (use_stub_cache == kUseStubCache) { + DCHECK_EQ(lookup_start_object, p->receiver_and_lookup_start_object()); Label stub_cache(this); BIND(&try_stub_cache); // When there is no feedback vector don't use stub cache. @@ -2404,7 +2424,7 @@ void AccessorAssembler::GenericPropertyLoad(TNode receiver, Comment("stub cache probe for fast property load"); TVARIABLE(MaybeObject, var_handler); Label found_handler(this, &var_handler), stub_cache_miss(this); - TryProbeStubCache(isolate()->load_stub_cache(), receiver, name, + TryProbeStubCache(isolate()->load_stub_cache(), lookup_start_object, name, &found_handler, &var_handler, &stub_cache_miss); BIND(&found_handler); { @@ -2418,8 +2438,9 @@ void AccessorAssembler::GenericPropertyLoad(TNode receiver, // TODO(jkummerow): Check if the property exists on the prototype // chain. If it doesn't, then there's no point in missing. Comment("KeyedLoadGeneric_miss"); - TailCallRuntime(Runtime::kKeyedLoadIC_Miss, p->context(), p->receiver(), - name, p->slot(), p->vector()); + TailCallRuntime(Runtime::kKeyedLoadIC_Miss, p->context(), + p->receiver_and_lookup_start_object(), name, p->slot(), + p->vector()); } } @@ -2431,7 +2452,8 @@ void AccessorAssembler::GenericPropertyLoad(TNode receiver, TVARIABLE(IntPtrT, var_name_index); Label dictionary_found(this, &var_name_index); - TNode properties = CAST(LoadSlowProperties(CAST(receiver))); + TNode properties = + CAST(LoadSlowProperties(CAST(lookup_start_object))); NameDictionaryLookup(properties, name, &dictionary_found, &var_name_index, &lookup_prototype_chain); @@ -2439,14 +2461,15 @@ void AccessorAssembler::GenericPropertyLoad(TNode receiver, { LoadPropertyFromNameDictionary(properties, var_name_index.value(), &var_details, &var_value); - Goto(&if_found_on_receiver); + Goto(&if_found_on_lookup_start_object); } } - BIND(&if_found_on_receiver); + BIND(&if_found_on_lookup_start_object); { TNode value = CallGetterIfAccessor( - var_value.value(), var_details.value(), p->context(), receiver, slow); + var_value.value(), lookup_start_object, var_details.value(), + p->context(), p->receiver(), slow); IncrementCounter(isolate()->counters()->ic_keyed_load_generic_symbol(), 1); Return(value); } @@ -2458,8 +2481,8 @@ void AccessorAssembler::GenericPropertyLoad(TNode receiver, Label return_undefined(this), is_private_symbol(this); Label loop(this, {&var_holder_map, &var_holder_instance_type}); - var_holder_map = receiver_map; - var_holder_instance_type = instance_type; + var_holder_map = lookup_start_object_map; + var_holder_instance_type = lookup_start_object_instance_type; GotoIf(IsPrivateSymbol(name), &is_private_symbol); Goto(&loop); @@ -2476,9 +2499,9 @@ void AccessorAssembler::GenericPropertyLoad(TNode receiver, var_holder_map = proto_map; var_holder_instance_type = proto_instance_type; Label next_proto(this), return_value(this, &var_value), goto_slow(this); - TryGetOwnProperty(p->context(), receiver, CAST(proto), proto_map, - proto_instance_type, name, &return_value, &var_value, - &next_proto, &goto_slow); + TryGetOwnProperty(p->context(), CAST(p->receiver()), CAST(proto), + proto_map, proto_instance_type, name, &return_value, + &var_value, &next_proto, &goto_slow); // This trampoline and the next are required to appease Turbofan's // variable merging. @@ -2509,15 +2532,17 @@ void AccessorAssembler::GenericPropertyLoad(TNode receiver, BIND(&special_receiver); { // TODO(jkummerow): Consider supporting JSModuleNamespace. - GotoIfNot(InstanceTypeEqual(instance_type, JS_PROXY_TYPE), slow); + GotoIfNot( + InstanceTypeEqual(lookup_start_object_instance_type, JS_PROXY_TYPE), + slow); // Private field/symbol lookup is not supported. GotoIf(IsPrivateSymbol(name), slow); direct_exit.ReturnCallStub( Builtins::CallableFor(isolate(), Builtins::kProxyGetProperty), - p->context(), receiver /*holder is the same as receiver*/, name, - receiver, SmiConstant(OnNonExistent::kReturnUndefined)); + p->context(), lookup_start_object, name, p->receiver(), + SmiConstant(OnNonExistent::kReturnUndefined)); } } @@ -2605,7 +2630,7 @@ void AccessorAssembler::TryProbeStubCacheTable( } void AccessorAssembler::TryProbeStubCache(StubCache* stub_cache, - TNode receiver, + TNode lookup_start_object, TNode name, Label* if_handler, TVariable* var_handler, Label* if_miss) { @@ -2614,15 +2639,17 @@ void AccessorAssembler::TryProbeStubCache(StubCache* stub_cache, Counters* counters = isolate()->counters(); IncrementCounter(counters->megamorphic_stub_cache_probes(), 1); - // Check that the {receiver} isn't a smi. - GotoIf(TaggedIsSmi(receiver), &miss); + // Check that the {lookup_start_object} isn't a smi. + GotoIf(TaggedIsSmi(lookup_start_object), &miss); - TNode receiver_map = LoadMap(CAST(receiver)); + TNode lookup_start_object_map = LoadMap(CAST(lookup_start_object)); // Probe the primary table. - TNode primary_offset = StubCachePrimaryOffset(name, receiver_map); + TNode primary_offset = + StubCachePrimaryOffset(name, lookup_start_object_map); TryProbeStubCacheTable(stub_cache, kPrimary, primary_offset, name, - receiver_map, if_handler, var_handler, &try_secondary); + lookup_start_object_map, if_handler, var_handler, + &try_secondary); BIND(&try_secondary); { @@ -2630,7 +2657,8 @@ void AccessorAssembler::TryProbeStubCache(StubCache* stub_cache, TNode secondary_offset = StubCacheSecondaryOffset(name, primary_offset); TryProbeStubCacheTable(stub_cache, kSecondary, secondary_offset, name, - receiver_map, if_handler, var_handler, &miss); + lookup_start_object_map, if_handler, var_handler, + &miss); } BIND(&miss); @@ -2658,8 +2686,9 @@ void AccessorAssembler::LoadIC_BytecodeHandler(const LazyLoadICParameters* p, GotoIf(IsUndefined(p->vector()), &no_feedback); - TNode recv_map = LoadReceiverMap(p->receiver()); - GotoIf(IsDeprecatedMap(recv_map), &miss); + TNode lookup_start_object_map = + LoadReceiverMap(p->receiver_and_lookup_start_object()); + GotoIf(IsDeprecatedMap(lookup_start_object_map), &miss); // Inlined fast path. { @@ -2668,9 +2697,9 @@ void AccessorAssembler::LoadIC_BytecodeHandler(const LazyLoadICParameters* p, TVARIABLE(MaybeObject, var_handler); Label try_polymorphic(this), if_handler(this, &var_handler); - TNode feedback = - TryMonomorphicCase(p->slot(), CAST(p->vector()), recv_map, &if_handler, - &var_handler, &try_polymorphic); + TNode feedback = TryMonomorphicCase( + p->slot(), CAST(p->vector()), lookup_start_object_map, &if_handler, + &var_handler, &try_polymorphic); BIND(&if_handler); HandleLoadICHandlerCase(p, CAST(var_handler.value()), &miss, exit_point); @@ -2680,8 +2709,8 @@ void AccessorAssembler::LoadIC_BytecodeHandler(const LazyLoadICParameters* p, TNode strong_feedback = GetHeapObjectIfStrong(feedback, &miss); GotoIfNot(IsWeakFixedArrayMap(LoadMap(strong_feedback)), &stub_call); - HandlePolymorphicCase(recv_map, CAST(strong_feedback), &if_handler, - &var_handler, &miss); + HandlePolymorphicCase(lookup_start_object_map, CAST(strong_feedback), + &if_handler, &var_handler, &miss); } } @@ -2694,8 +2723,8 @@ void AccessorAssembler::LoadIC_BytecodeHandler(const LazyLoadICParameters* p, Builtins::CallableFor(isolate(), Builtins::kLoadIC_Noninlined); TNode code_target = HeapConstant(ic.code()); exit_point->ReturnCallStub(ic.descriptor(), code_target, p->context(), - p->receiver(), p->name(), p->slot(), - p->vector()); + p->receiver_and_lookup_start_object(), p->name(), + p->slot(), p->vector()); } BIND(&no_feedback); @@ -2727,12 +2756,13 @@ void AccessorAssembler::LoadIC(const LoadICParameters* p) { Label if_handler(this, &var_handler), non_inlined(this, Label::kDeferred), try_polymorphic(this), miss(this, Label::kDeferred); - TNode receiver_map = LoadReceiverMap(p->receiver()); - GotoIf(IsDeprecatedMap(receiver_map), &miss); + TNode lookup_start_object_map = + LoadReceiverMap(p->receiver_and_lookup_start_object()); + GotoIf(IsDeprecatedMap(lookup_start_object_map), &miss); // Check monomorphic case. TNode feedback = - TryMonomorphicCase(p->slot(), CAST(p->vector()), receiver_map, + TryMonomorphicCase(p->slot(), CAST(p->vector()), lookup_start_object_map, &if_handler, &var_handler, &try_polymorphic); BIND(&if_handler); { @@ -2747,32 +2777,85 @@ void AccessorAssembler::LoadIC(const LoadICParameters* p) { // Check polymorphic case. Comment("LoadIC_try_polymorphic"); GotoIfNot(IsWeakFixedArrayMap(LoadMap(strong_feedback)), &non_inlined); - HandlePolymorphicCase(receiver_map, CAST(strong_feedback), &if_handler, - &var_handler, &miss); + HandlePolymorphicCase(lookup_start_object_map, CAST(strong_feedback), + &if_handler, &var_handler, &miss); } BIND(&non_inlined); { - LoadIC_Noninlined(p, receiver_map, strong_feedback, &var_handler, + LoadIC_Noninlined(p, lookup_start_object_map, strong_feedback, &var_handler, &if_handler, &miss, &direct_exit); } BIND(&miss); direct_exit.ReturnCallRuntime(Runtime::kLoadIC_Miss, p->context(), - p->receiver(), p->name(), p->slot(), - p->vector()); + p->receiver_and_lookup_start_object(), + p->name(), p->slot(), p->vector()); +} + +void AccessorAssembler::LoadSuperIC(const LoadICParameters* p) { + ExitPoint direct_exit(this); + + TVARIABLE(MaybeObject, var_handler); + Label if_handler(this, &var_handler), no_feedback(this), + non_inlined(this, Label::kDeferred), try_polymorphic(this), + miss(this, Label::kDeferred); + + GotoIf(IsUndefined(p->vector()), &no_feedback); + + // The lookup start object cannot be a SMI, since it's the home object's + // prototype, and it's not possible to set SMIs as prototypes. + TNode lookup_start_object_map = + LoadReceiverMap(p->lookup_start_object()); + GotoIf(IsDeprecatedMap(lookup_start_object_map), &miss); + + TNode feedback = + TryMonomorphicCase(p->slot(), CAST(p->vector()), lookup_start_object_map, + &if_handler, &var_handler, &try_polymorphic); + + BIND(&if_handler); + { + LazyLoadICParameters lazy_p(p); + HandleLoadICHandlerCase(&lazy_p, CAST(var_handler.value()), &miss, + &direct_exit); + } + + BIND(&no_feedback); + { LoadSuperIC_NoFeedback(p); } + + BIND(&try_polymorphic); + TNode strong_feedback = GetHeapObjectIfStrong(feedback, &miss); + { + Comment("LoadSuperIC_try_polymorphic"); + GotoIfNot(IsWeakFixedArrayMap(LoadMap(strong_feedback)), &non_inlined); + HandlePolymorphicCase(lookup_start_object_map, CAST(strong_feedback), + &if_handler, &var_handler, &miss); + } + + BIND(&non_inlined); + { + // LoadIC_Noninlined can be used here, since it handles the + // lookup_start_object != receiver case gracefully. + LoadIC_Noninlined(p, lookup_start_object_map, strong_feedback, &var_handler, + &if_handler, &miss, &direct_exit); + } + + BIND(&miss); + direct_exit.ReturnCallRuntime(Runtime::kLoadWithReceiverIC_Miss, p->context(), + p->receiver(), p->lookup_start_object(), + p->name(), p->slot(), p->vector()); } void AccessorAssembler::LoadIC_Noninlined(const LoadICParameters* p, - TNode receiver_map, + TNode lookup_start_object_map, TNode feedback, TVariable* var_handler, Label* if_handler, Label* miss, ExitPoint* exit_point) { // Neither deprecated map nor monomorphic. These cases are handled in the // bytecode handler. - CSA_ASSERT(this, Word32BinaryNot(IsDeprecatedMap(receiver_map))); - CSA_ASSERT(this, TaggedNotEqual(receiver_map, feedback)); + CSA_ASSERT(this, Word32BinaryNot(IsDeprecatedMap(lookup_start_object_map))); + CSA_ASSERT(this, TaggedNotEqual(lookup_start_object_map, feedback)); CSA_ASSERT(this, Word32BinaryNot(IsWeakFixedArrayMap(LoadMap(feedback)))); DCHECK_EQ(MachineRepresentation::kTagged, var_handler->rep()); @@ -2780,7 +2863,7 @@ void AccessorAssembler::LoadIC_Noninlined(const LoadICParameters* p, // Check megamorphic case. GotoIfNot(TaggedEqual(feedback, MegamorphicSymbolConstant()), miss); - TryProbeStubCache(isolate()->load_stub_cache(), p->receiver(), + TryProbeStubCache(isolate()->load_stub_cache(), p->lookup_start_object(), CAST(p->name()), if_handler, var_handler, miss); } } @@ -2788,12 +2871,12 @@ void AccessorAssembler::LoadIC_Noninlined(const LoadICParameters* p, void AccessorAssembler::LoadIC_NoFeedback(const LoadICParameters* p, TNode ic_kind) { Label miss(this, Label::kDeferred); - TNode receiver = p->receiver(); - GotoIf(TaggedIsSmi(receiver), &miss); - TNode receiver_map = LoadMap(CAST(receiver)); - GotoIf(IsDeprecatedMap(receiver_map), &miss); + TNode lookup_start_object = p->receiver_and_lookup_start_object(); + GotoIf(TaggedIsSmi(lookup_start_object), &miss); + TNode lookup_start_object_map = LoadMap(CAST(lookup_start_object)); + GotoIf(IsDeprecatedMap(lookup_start_object_map), &miss); - TNode instance_type = LoadMapInstanceType(receiver_map); + TNode instance_type = LoadMapInstanceType(lookup_start_object_map); { // Special case for Function.prototype load, because it's very common @@ -2803,14 +2886,15 @@ void AccessorAssembler::LoadIC_NoFeedback(const LoadICParameters* p, ¬_function_prototype); GotoIfNot(IsPrototypeString(p->name()), ¬_function_prototype); - GotoIfPrototypeRequiresRuntimeLookup(CAST(receiver), receiver_map, + GotoIfPrototypeRequiresRuntimeLookup(CAST(lookup_start_object), + lookup_start_object_map, ¬_function_prototype); - Return(LoadJSFunctionPrototype(CAST(receiver), &miss)); + Return(LoadJSFunctionPrototype(CAST(lookup_start_object), &miss)); BIND(¬_function_prototype); } - GenericPropertyLoad(CAST(receiver), receiver_map, instance_type, p, &miss, - kDontUseStubCache); + GenericPropertyLoad(CAST(lookup_start_object), lookup_start_object_map, + instance_type, p, &miss, kDontUseStubCache); BIND(&miss); { @@ -2819,6 +2903,27 @@ void AccessorAssembler::LoadIC_NoFeedback(const LoadICParameters* p, } } +void AccessorAssembler::LoadSuperIC_NoFeedback(const LoadICParameters* p) { + Label miss(this, Label::kDeferred); + TNode lookup_start_object = p->lookup_start_object(); + + // The lookup start object cannot be a SMI, since it's the home object's + // prototype, and it's not possible to set SMIs as prototypes. + TNode lookup_start_object_map = LoadMap(CAST(lookup_start_object)); + GotoIf(IsDeprecatedMap(lookup_start_object_map), &miss); + + TNode instance_type = LoadMapInstanceType(lookup_start_object_map); + + GenericPropertyLoad(CAST(lookup_start_object), lookup_start_object_map, + instance_type, p, &miss, kDontUseStubCache); + + BIND(&miss); + { + TailCallRuntime(Runtime::kLoadWithReceiverNoFeedbackIC_Miss, p->context(), + p->receiver(), p->lookup_start_object(), p->name()); + } +} + void AccessorAssembler::LoadGlobalIC(TNode maybe_feedback_vector, const LazyNode& lazy_slot, const LazyNode& lazy_context, @@ -2923,11 +3028,11 @@ void AccessorAssembler::LoadGlobalIC_TryHandlerCase( TNode native_context = LoadNativeContext(context); TNode receiver = CAST(LoadContextElement(native_context, Context::GLOBAL_PROXY_INDEX)); - TNode holder = + TNode global = LoadContextElement(native_context, Context::EXTENSION_INDEX); LazyLoadICParameters p([=] { return context; }, receiver, lazy_name, - [=] { return slot; }, vector, holder); + [=] { return slot; }, vector, global); HandleLoadICHandlerCase(&p, handler, miss, exit_point, ICMode::kGlobalIC, on_nonexistent); @@ -3019,14 +3124,15 @@ void AccessorAssembler::KeyedLoadIC(const LoadICParameters* p, try_polymorphic_name(this, Label::kDeferred), miss(this, Label::kDeferred), generic(this, Label::kDeferred); - TNode receiver_map = LoadReceiverMap(p->receiver()); - GotoIf(IsDeprecatedMap(receiver_map), &miss); + TNode lookup_start_object_map = + LoadReceiverMap(p->receiver_and_lookup_start_object()); + GotoIf(IsDeprecatedMap(lookup_start_object_map), &miss); GotoIf(IsUndefined(p->vector()), &generic); // Check monomorphic case. TNode feedback = - TryMonomorphicCase(p->slot(), CAST(p->vector()), receiver_map, + TryMonomorphicCase(p->slot(), CAST(p->vector()), lookup_start_object_map, &if_handler, &var_handler, &try_polymorphic); BIND(&if_handler); { @@ -3043,8 +3149,8 @@ void AccessorAssembler::KeyedLoadIC(const LoadICParameters* p, // Check polymorphic case. Comment("KeyedLoadIC_try_polymorphic"); GotoIfNot(IsWeakFixedArrayMap(LoadMap(strong_feedback)), &try_megamorphic); - HandlePolymorphicCase(receiver_map, CAST(strong_feedback), &if_handler, - &var_handler, &miss); + HandlePolymorphicCase(lookup_start_object_map, CAST(strong_feedback), + &if_handler, &var_handler, &miss); } BIND(&try_megamorphic); @@ -3136,9 +3242,9 @@ void AccessorAssembler::KeyedLoadICGeneric(const LoadICParameters* p) { TVARIABLE(Object, var_name, p->name()); Label if_runtime(this, Label::kDeferred); - TNode receiver = p->receiver(); - GotoIf(TaggedIsSmi(receiver), &if_runtime); - GotoIf(IsNullOrUndefined(receiver), &if_runtime); + TNode lookup_start_object = p->lookup_start_object(); + GotoIf(TaggedIsSmi(lookup_start_object), &if_runtime); + GotoIf(IsNullOrUndefined(lookup_start_object), &if_runtime); { TVARIABLE(IntPtrT, var_index); @@ -3152,9 +3258,9 @@ void AccessorAssembler::KeyedLoadICGeneric(const LoadICParameters* p) { BIND(&if_unique_name); { LoadICParameters pp(p, var_unique.value()); - TNode receiver_map = LoadMap(CAST(receiver)); - TNode instance_type = LoadMapInstanceType(receiver_map); - GenericPropertyLoad(CAST(receiver), receiver_map, instance_type, &pp, + TNode lookup_start_object_map = LoadMap(CAST(lookup_start_object)); + GenericPropertyLoad(CAST(lookup_start_object), lookup_start_object_map, + LoadMapInstanceType(lookup_start_object_map), &pp, &if_runtime); } @@ -3185,9 +3291,11 @@ void AccessorAssembler::KeyedLoadICGeneric(const LoadICParameters* p) { // experiments with this have shown that it causes too much traffic // on the stub cache. We may want to re-evaluate that in the future. LoadICParameters pp(p, var_unique.value()); - TNode receiver_map = LoadMap(CAST(receiver)); - TNode instance_type = LoadMapInstanceType(receiver_map); - GenericPropertyLoad(CAST(receiver), receiver_map, instance_type, &pp, + TNode lookup_start_object_map = + LoadMap(CAST(lookup_start_object)); + GenericPropertyLoad(CAST(lookup_start_object), + lookup_start_object_map, + LoadMapInstanceType(lookup_start_object_map), &pp, &if_runtime, kDontUseStubCache); } } else { @@ -3197,9 +3305,9 @@ void AccessorAssembler::KeyedLoadICGeneric(const LoadICParameters* p) { BIND(&if_index); { - TNode receiver_map = LoadMap(CAST(receiver)); - TNode instance_type = LoadMapInstanceType(receiver_map); - GenericElementLoad(CAST(receiver), receiver_map, instance_type, + TNode lookup_start_object_map = LoadMap(CAST(lookup_start_object)); + GenericElementLoad(CAST(lookup_start_object), lookup_start_object_map, + LoadMapInstanceType(lookup_start_object_map), var_index.value(), &if_runtime); } } @@ -3209,8 +3317,8 @@ void AccessorAssembler::KeyedLoadICGeneric(const LoadICParameters* p) { Comment("KeyedLoadGeneric_slow"); IncrementCounter(isolate()->counters()->ic_keyed_load_generic_slow(), 1); // TODO(jkummerow): Should we use the GetProperty TF stub instead? - TailCallRuntime(Runtime::kGetProperty, p->context(), p->receiver(), - var_name.value()); + TailCallRuntime(Runtime::kGetProperty, p->context(), + p->receiver_and_lookup_start_object(), var_name.value()); } } @@ -3219,8 +3327,8 @@ void AccessorAssembler::KeyedLoadICPolymorphicName(const LoadICParameters* p, TVARIABLE(MaybeObject, var_handler); Label if_handler(this, &var_handler), miss(this, Label::kDeferred); - TNode receiver = p->receiver(); - TNode receiver_map = LoadReceiverMap(receiver); + TNode lookup_start_object = p->lookup_start_object(); + TNode lookup_start_object_map = LoadReceiverMap(lookup_start_object); TNode name = CAST(p->name()); TNode vector = CAST(p->vector()); TNode slot = p->slot(); @@ -3229,15 +3337,16 @@ void AccessorAssembler::KeyedLoadICPolymorphicName(const LoadICParameters* p, // When we get here, we know that the {name} matches the recorded // feedback name in the {vector} and can safely be used for the // LoadIC handler logic below. - CSA_ASSERT(this, Word32BinaryNot(IsDeprecatedMap(receiver_map))); + CSA_ASSERT(this, Word32BinaryNot(IsDeprecatedMap(lookup_start_object_map))); CSA_ASSERT(this, TaggedEqual(name, LoadFeedbackVectorSlot(vector, slot)), name, vector); - // Check if we have a matching handler for the {receiver_map}. + // Check if we have a matching handler for the {lookup_start_object_map}. TNode feedback_element = LoadFeedbackVectorSlot(vector, slot, kTaggedSize); TNode array = CAST(feedback_element); - HandlePolymorphicCase(receiver_map, array, &if_handler, &var_handler, &miss); + HandlePolymorphicCase(lookup_start_object_map, array, &if_handler, + &var_handler, &miss); BIND(&if_handler); { @@ -3252,10 +3361,10 @@ void AccessorAssembler::KeyedLoadICPolymorphicName(const LoadICParameters* p, BIND(&miss); { Comment("KeyedLoadIC_miss"); - TailCallRuntime(access_mode == LoadAccessMode::kLoad - ? Runtime::kKeyedLoadIC_Miss - : Runtime::kKeyedHasIC_Miss, - context, receiver, name, slot, vector); + TailCallRuntime( + access_mode == LoadAccessMode::kLoad ? Runtime::kKeyedLoadIC_Miss + : Runtime::kKeyedHasIC_Miss, + context, p->receiver_and_lookup_start_object(), name, slot, vector); } } @@ -3679,13 +3788,13 @@ void AccessorAssembler::GenerateLoadIC_Noninlined() { TVARIABLE(MaybeObject, var_handler); Label if_handler(this, &var_handler), miss(this, Label::kDeferred); - TNode receiver_map = LoadReceiverMap(receiver); TNode feedback_element = LoadFeedbackVectorSlot(vector, slot); TNode feedback = CAST(feedback_element); LoadICParameters p(context, receiver, name, slot, vector); - LoadIC_Noninlined(&p, receiver_map, feedback, &var_handler, &if_handler, - &miss, &direct_exit); + TNode lookup_start_object_map = LoadReceiverMap(p.lookup_start_object()); + LoadIC_Noninlined(&p, lookup_start_object_map, feedback, &var_handler, + &if_handler, &miss, &direct_exit); BIND(&if_handler); { @@ -3738,6 +3847,22 @@ void AccessorAssembler::GenerateLoadICTrampoline_Megamorphic() { vector); } +void AccessorAssembler::GenerateLoadSuperIC() { + using Descriptor = LoadWithReceiverAndVectorDescriptor; + + TNode receiver = CAST(Parameter(Descriptor::kReceiver)); + TNode lookup_start_object = + CAST(Parameter(Descriptor::kLookupStartObject)); + TNode name = CAST(Parameter(Descriptor::kName)); + TNode slot = CAST(Parameter(Descriptor::kSlot)); + TNode vector = CAST(Parameter(Descriptor::kVector)); + TNode context = CAST(Parameter(Descriptor::kContext)); + + LoadICParameters p(context, receiver, name, slot, vector, + lookup_start_object); + LoadSuperIC(&p); +} + void AccessorAssembler::GenerateLoadGlobalIC_NoFeedback() { using Descriptor = LoadGlobalNoFeedbackDescriptor; @@ -3951,12 +4076,7 @@ void AccessorAssembler::GenerateCloneObjectIC_Slow() { // used. TNode native_context = LoadNativeContext(context); - TNode object_fn = - CAST(LoadContextElement(native_context, Context::OBJECT_FUNCTION_INDEX)); - TNode initial_map = CAST( - LoadObjectField(object_fn, JSFunction::kPrototypeOrInitialMapOffset)); - CSA_ASSERT(this, IsMap(initial_map)); - + TNode initial_map = LoadObjectFunctionInitialMap(native_context); TNode result = AllocateJSObjectFromMap(initial_map); { @@ -4097,25 +4217,11 @@ void AccessorAssembler::GenerateCloneObjectIC() { // ensure that the GC (and heap verifier) always sees properly initialized // objects, i.e. never hits undefined values in double fields. if (!FLAG_unbox_double_fields) { - BuildFastLoop( - source_start, source_size, - [=](TNode field_index) { - TNode result_offset = IntPtrAdd( - TimesTaggedSize(field_index), field_offset_difference); - TNode field = LoadObjectField(object, result_offset); - Label if_done(this), if_mutableheapnumber(this, Label::kDeferred); - GotoIf(TaggedIsSmi(field), &if_done); - Branch(IsHeapNumber(CAST(field)), &if_mutableheapnumber, &if_done); - BIND(&if_mutableheapnumber); - { - TNode value = AllocateHeapNumberWithValue( - LoadHeapNumberValue(UncheckedCast(field))); - StoreObjectField(object, result_offset, value); - Goto(&if_done); - } - BIND(&if_done); - }, - 1, IndexAdvanceMode::kPost); + TNode start_offset = TimesTaggedSize(result_start); + TNode end_offset = + IntPtrAdd(TimesTaggedSize(source_size), field_offset_difference); + ConstructorBuiltinsAssembler(state()).CopyMutableHeapNumbersInObject( + object, start_offset, end_offset); } Return(object); diff --git a/deps/v8/src/ic/accessor-assembler.h b/deps/v8/src/ic/accessor-assembler.h index ec5758ec355c85..bf506da4784672 100644 --- a/deps/v8/src/ic/accessor-assembler.h +++ b/deps/v8/src/ic/accessor-assembler.h @@ -32,6 +32,7 @@ class V8_EXPORT_PRIVATE AccessorAssembler : public CodeStubAssembler { void GenerateLoadGlobalIC_NoFeedback(); void GenerateLoadICTrampoline(); void GenerateLoadICTrampoline_Megamorphic(); + void GenerateLoadSuperIC(); void GenerateKeyedLoadIC(); void GenerateKeyedLoadIC_Megamorphic(); void GenerateKeyedLoadIC_PolymorphicName(); @@ -55,9 +56,10 @@ class V8_EXPORT_PRIVATE AccessorAssembler : public CodeStubAssembler { void GenerateStoreInArrayLiteralIC(); - void TryProbeStubCache(StubCache* stub_cache, TNode receiver, - TNode name, Label* if_handler, - TVariable* var_handler, Label* if_miss); + void TryProbeStubCache(StubCache* stub_cache, + TNode lookup_start_object, TNode name, + Label* if_handler, TVariable* var_handler, + Label* if_miss); TNode StubCachePrimaryOffsetForTesting(TNode name, TNode map) { @@ -69,16 +71,17 @@ class V8_EXPORT_PRIVATE AccessorAssembler : public CodeStubAssembler { } struct LoadICParameters { - LoadICParameters(TNode context, - base::Optional> receiver, TNode name, - TNode slot, TNode vector, - base::Optional> holder = base::nullopt) + LoadICParameters( + TNode context, TNode receiver, TNode name, + TNode slot, TNode vector, + base::Optional> lookup_start_object = base::nullopt) : context_(context), receiver_(receiver), name_(name), slot_(slot), vector_(vector), - holder_(holder ? holder.value() : receiver) {} + lookup_start_object_(lookup_start_object ? lookup_start_object.value() + : receiver) {} LoadICParameters(const LoadICParameters* p, TNode unique_name) : context_(p->context_), @@ -86,41 +89,52 @@ class V8_EXPORT_PRIVATE AccessorAssembler : public CodeStubAssembler { name_(unique_name), slot_(p->slot_), vector_(p->vector_), - holder_(p->holder_) {} + lookup_start_object_(p->lookup_start_object_) {} TNode context() const { return context_; } - TNode receiver() const { return receiver_.value(); } + TNode receiver() const { return receiver_; } TNode name() const { return name_; } TNode slot() const { return slot_; } TNode vector() const { return vector_; } - TNode holder() const { return holder_.value(); } - bool receiver_is_null() const { return !receiver_.has_value(); } + TNode lookup_start_object() const { + return lookup_start_object_.value(); + } + + // Usable in cases where the receiver and the lookup start object are + // expected to be the same, i.e., when "receiver != lookup_start_object" + // case is not supported or not expected by the surrounding code. + TNode receiver_and_lookup_start_object() const { + DCHECK_EQ(receiver_, lookup_start_object_); + return receiver_; + } private: TNode context_; - base::Optional> receiver_; + TNode receiver_; TNode name_; TNode slot_; TNode vector_; - base::Optional> holder_; + base::Optional> lookup_start_object_; }; struct LazyLoadICParameters { - LazyLoadICParameters(LazyNode context, TNode receiver, - LazyNode name, LazyNode slot, - TNode vector, - base::Optional> holder = base::nullopt) + LazyLoadICParameters( + LazyNode context, TNode receiver, + LazyNode name, LazyNode slot, + TNode vector, + base::Optional> lookup_start_object = base::nullopt) : context_(context), receiver_(receiver), name_(name), slot_(slot), vector_(vector), - holder_(holder ? holder.value() : receiver) {} + lookup_start_object_(lookup_start_object ? lookup_start_object.value() + : receiver) {} explicit LazyLoadICParameters(const LoadICParameters* p) : receiver_(p->receiver()), vector_(p->vector()), - holder_(p->holder()) { + lookup_start_object_(p->lookup_start_object()) { slot_ = [=] { return p->slot(); }; context_ = [=] { return p->context(); }; name_ = [=] { return p->name(); }; @@ -131,7 +145,15 @@ class V8_EXPORT_PRIVATE AccessorAssembler : public CodeStubAssembler { TNode name() const { return name_(); } TNode slot() const { return slot_(); } TNode vector() const { return vector_; } - TNode holder() const { return holder_; } + TNode lookup_start_object() const { return lookup_start_object_; } + + // Usable in cases where the receiver and the lookup start object are + // expected to be the same, i.e., when "receiver != lookup_start_object" + // case is not supported or not expected by the surrounding code. + TNode receiver_and_lookup_start_object() const { + DCHECK_EQ(receiver_, lookup_start_object_); + return receiver_; + } private: LazyNode context_; @@ -139,7 +161,7 @@ class V8_EXPORT_PRIVATE AccessorAssembler : public CodeStubAssembler { LazyNode name_; LazyNode slot_; TNode vector_; - TNode holder_; + TNode lookup_start_object_; }; void LoadGlobalIC(TNode maybe_feedback_vector, @@ -158,18 +180,36 @@ class V8_EXPORT_PRIVATE AccessorAssembler : public CodeStubAssembler { int data_index); protected: - struct StoreICParameters : public LoadICParameters { + struct StoreICParameters { StoreICParameters(TNode context, base::Optional> receiver, TNode name, TNode value, TNode slot, TNode vector) - : LoadICParameters(context, receiver, name, slot, vector), - value_(value) {} + : context_(context), + receiver_(receiver), + name_(name), + value_(value), + slot_(slot), + vector_(vector) {} + TNode context() const { return context_; } + TNode receiver() const { return receiver_.value(); } + TNode name() const { return name_; } TNode value() const { return value_; } + TNode slot() const { return slot_; } + TNode vector() const { return vector_; } + + TNode lookup_start_object() const { return receiver(); } + + bool receiver_is_null() const { return !receiver_.has_value(); } private: + TNode context_; + base::Optional> receiver_; + TNode name_; TNode value_; + TNode slot_; + TNode vector_; }; enum class LoadAccessMode { kLoad, kHas }; @@ -213,17 +253,23 @@ class V8_EXPORT_PRIVATE AccessorAssembler : public CodeStubAssembler { // LoadIC contains the full LoadIC logic, while LoadIC_Noninlined contains // logic not inlined into Ignition bytecode handlers. void LoadIC(const LoadICParameters* p); - void LoadIC_Noninlined(const LoadICParameters* p, TNode receiver_map, + + // Can be used in the receiver != lookup_start_object case. + void LoadIC_Noninlined(const LoadICParameters* p, + TNode lookup_start_object_map, TNode feedback, TVariable* var_handler, Label* if_handler, Label* miss, ExitPoint* exit_point); + void LoadSuperIC(const LoadICParameters* p); + TNode LoadDescriptorValue(TNode map, TNode descriptor_entry); TNode LoadDescriptorValueOrFieldType( TNode map, TNode descriptor_entry); void LoadIC_NoFeedback(const LoadICParameters* p, TNode smi_typeof_mode); + void LoadSuperIC_NoFeedback(const LoadICParameters* p); void LoadGlobalIC_NoFeedback(TNode context, TNode name, TNode smi_typeof_mode); @@ -244,11 +290,11 @@ class V8_EXPORT_PRIVATE AccessorAssembler : public CodeStubAssembler { // Checks monomorphic case. Returns {feedback} entry of the vector. TNode TryMonomorphicCase(TNode slot, TNode vector, - TNode receiver_map, + TNode lookup_start_object_map, Label* if_handler, TVariable* var_handler, Label* if_miss); - void HandlePolymorphicCase(TNode receiver_map, + void HandlePolymorphicCase(TNode lookup_start_object_map, TNode feedback, Label* if_handler, TVariable* var_handler, Label* if_miss); @@ -356,28 +402,30 @@ class V8_EXPORT_PRIVATE AccessorAssembler : public CodeStubAssembler { // KeyedLoadIC_Generic implementation. - void GenericElementLoad(TNode receiver, TNode receiver_map, - TNode instance_type, TNode index, - Label* slow); + void GenericElementLoad(TNode lookup_start_object, + TNode lookup_start_object_map, + TNode lookup_start_object_instance_type, + TNode index, Label* slow); enum UseStubCache { kUseStubCache, kDontUseStubCache }; - void GenericPropertyLoad(TNode receiver, TNode receiver_map, - TNode instance_type, + void GenericPropertyLoad(TNode lookup_start_object, + TNode lookup_start_object_map, + TNode lookup_start_object_instance_type, const LoadICParameters* p, Label* slow, UseStubCache use_stub_cache = kUseStubCache); // Low-level helpers. using OnCodeHandler = std::function code_handler)>; - using OnFoundOnReceiver = std::function properties, - TNode name_index)>; + using OnFoundOnLookupStartObject = std::function properties, TNode name_index)>; template TNode HandleProtoHandler( const ICParameters* p, TNode handler, const OnCodeHandler& on_code_handler, - const OnFoundOnReceiver& on_found_on_receiver, Label* miss, - ICMode ic_mode); + const OnFoundOnLookupStartObject& on_found_on_lookup_start_object, + Label* miss, ICMode ic_mode); void CheckHeapObjectTypeMatchesDescriptor(TNode handler_word, TNode holder, diff --git a/deps/v8/src/ic/handler-configuration.cc b/deps/v8/src/ic/handler-configuration.cc index a9bae12482660a..73cd228001c662 100644 --- a/deps/v8/src/ic/handler-configuration.cc +++ b/deps/v8/src/ic/handler-configuration.cc @@ -27,16 +27,20 @@ Handle SetBitFieldValue(Isolate* isolate, Handle smi_handler, // Load/StoreHandler to the base class. template int InitPrototypeChecksImpl(Isolate* isolate, Handle handler, - Handle* smi_handler, Handle receiver_map, - Handle holder, MaybeObjectHandle data1, + Handle* smi_handler, + Handle lookup_start_object_map, + MaybeObjectHandle data1, MaybeObjectHandle maybe_data2) { int data_size = 1; // Holder-is-receiver case itself does not add entries unless there is an // optional data2 value provided. - if (receiver_map->IsPrimitiveMap() || - receiver_map->is_access_check_needed()) { - DCHECK(!receiver_map->IsJSGlobalObjectMap()); + DCHECK_IMPLIES(lookup_start_object_map->IsJSGlobalObjectMap(), + lookup_start_object_map->is_prototype_map()); + + if (lookup_start_object_map->IsPrimitiveMap() || + lookup_start_object_map->is_access_check_needed()) { + DCHECK(!lookup_start_object_map->IsJSGlobalObjectMap()); // The validity cell check for primitive and global proxy receivers does // not guarantee that certain native context ever had access to other // native context. However, a handler created for one native context could @@ -47,17 +51,19 @@ int InitPrototypeChecksImpl(Isolate* isolate, Handle handler, Handle native_context = isolate->native_context(); handler->set_data2(HeapObjectReference::Weak(*native_context)); } else { - // Enable access checks on receiver. - using Bit = typename ICHandler::DoAccessCheckOnReceiverBits; - *smi_handler = SetBitFieldValue(isolate, *smi_handler, true); + // Enable access checks on the lookup start object. + *smi_handler = SetBitFieldValue< + typename ICHandler::DoAccessCheckOnLookupStartObjectBits>( + isolate, *smi_handler, true); } data_size++; - } else if (receiver_map->is_dictionary_map() && - !receiver_map->IsJSGlobalObjectMap()) { + } else if (lookup_start_object_map->is_dictionary_map() && + !lookup_start_object_map->IsJSGlobalObjectMap()) { if (!fill_handler) { - // Enable lookup on receiver. - using Bit = typename ICHandler::LookupOnReceiverBits; - *smi_handler = SetBitFieldValue(isolate, *smi_handler, true); + // Enable lookup on lookup start object. + *smi_handler = + SetBitFieldValue( + isolate, *smi_handler, true); } } if (fill_handler) { @@ -80,40 +86,36 @@ int InitPrototypeChecksImpl(Isolate* isolate, Handle handler, } // Returns 0 if the validity cell check is enough to ensure that the -// prototype chain from |receiver_map| till |holder| did not change. +// prototype chain from |lookup_start_object_map| till |holder| did not change. // If the |holder| is an empty handle then the full prototype chain is // checked. -// Returns -1 if the handler has to be compiled or the number of prototype -// checks otherwise. template int GetHandlerDataSize(Isolate* isolate, Handle* smi_handler, - Handle receiver_map, Handle holder, + Handle lookup_start_object_map, MaybeObjectHandle data1, MaybeObjectHandle maybe_data2 = MaybeObjectHandle()) { DCHECK_NOT_NULL(smi_handler); - return InitPrototypeChecksImpl(isolate, Handle(), - smi_handler, receiver_map, - holder, data1, maybe_data2); + return InitPrototypeChecksImpl( + isolate, Handle(), smi_handler, lookup_start_object_map, data1, + maybe_data2); } template void InitPrototypeChecks(Isolate* isolate, Handle handler, - Handle receiver_map, Handle holder, + Handle lookup_start_object_map, MaybeObjectHandle data1, MaybeObjectHandle maybe_data2 = MaybeObjectHandle()) { InitPrototypeChecksImpl( - isolate, handler, nullptr, receiver_map, holder, data1, maybe_data2); + isolate, handler, nullptr, lookup_start_object_map, data1, maybe_data2); } } // namespace // static -Handle LoadHandler::LoadFromPrototype(Isolate* isolate, - Handle receiver_map, - Handle holder, - Handle smi_handler, - MaybeObjectHandle maybe_data1, - MaybeObjectHandle maybe_data2) { +Handle LoadHandler::LoadFromPrototype( + Isolate* isolate, Handle lookup_start_object_map, + Handle holder, Handle smi_handler, + MaybeObjectHandle maybe_data1, MaybeObjectHandle maybe_data2) { MaybeObjectHandle data1; if (maybe_data1.is_null()) { data1 = MaybeObjectHandle::Weak(holder); @@ -122,43 +124,45 @@ Handle LoadHandler::LoadFromPrototype(Isolate* isolate, } int data_size = GetHandlerDataSize( - isolate, &smi_handler, receiver_map, holder, data1, maybe_data2); + isolate, &smi_handler, lookup_start_object_map, data1, maybe_data2); - Handle validity_cell = - Map::GetOrCreatePrototypeChainValidityCell(receiver_map, isolate); + Handle validity_cell = Map::GetOrCreatePrototypeChainValidityCell( + lookup_start_object_map, isolate); Handle handler = isolate->factory()->NewLoadHandler(data_size); handler->set_smi_handler(*smi_handler); handler->set_validity_cell(*validity_cell); - InitPrototypeChecks(isolate, handler, receiver_map, holder, data1, + InitPrototypeChecks(isolate, handler, lookup_start_object_map, data1, maybe_data2); return handler; } // static Handle LoadHandler::LoadFullChain(Isolate* isolate, - Handle receiver_map, + Handle lookup_start_object_map, const MaybeObjectHandle& holder, Handle smi_handler) { - Handle end; // null handle, means full prototype chain lookup. MaybeObjectHandle data1 = holder; - int data_size = GetHandlerDataSize(isolate, &smi_handler, - receiver_map, end, data1); + int data_size = GetHandlerDataSize( + isolate, &smi_handler, lookup_start_object_map, data1); - Handle validity_cell = - Map::GetOrCreatePrototypeChainValidityCell(receiver_map, isolate); + Handle validity_cell = Map::GetOrCreatePrototypeChainValidityCell( + lookup_start_object_map, isolate); if (validity_cell->IsSmi()) { DCHECK_EQ(1, data_size); - // Lookup on receiver isn't supported in case of a simple smi handler. - if (!LookupOnReceiverBits::decode(smi_handler->value())) return smi_handler; + // Lookup on lookup start object isn't supported in case of a simple smi + // handler. + if (!LookupOnLookupStartObjectBits::decode(smi_handler->value())) { + return smi_handler; + } } Handle handler = isolate->factory()->NewLoadHandler(data_size); handler->set_smi_handler(*smi_handler); handler->set_validity_cell(*validity_cell); - InitPrototypeChecks(isolate, handler, receiver_map, end, data1); + InitPrototypeChecks(isolate, handler, lookup_start_object_map, data1); return handler; } @@ -247,7 +251,8 @@ MaybeObjectHandle StoreHandler::StoreTransition(Isolate* isolate, DCHECK(!transition_map->IsJSGlobalObjectMap()); Handle handler = isolate->factory()->NewStoreHandler(0); // Store normal with enabled lookup on receiver. - int config = KindBits::encode(kNormal) | LookupOnReceiverBits::encode(true); + int config = + KindBits::encode(kNormal) | LookupOnLookupStartObjectBits::encode(true); handler->set_smi_handler(Smi::FromInt(config)); handler->set_validity_cell(*validity_cell); return MaybeObjectHandle(handler); @@ -274,7 +279,7 @@ Handle StoreHandler::StoreThroughPrototype( } int data_size = GetHandlerDataSize( - isolate, &smi_handler, receiver_map, holder, data1, maybe_data2); + isolate, &smi_handler, receiver_map, data1, maybe_data2); Handle validity_cell = Map::GetOrCreatePrototypeChainValidityCell(receiver_map, isolate); @@ -283,8 +288,7 @@ Handle StoreHandler::StoreThroughPrototype( handler->set_smi_handler(*smi_handler); handler->set_validity_cell(*validity_cell); - InitPrototypeChecks(isolate, handler, receiver_map, holder, data1, - maybe_data2); + InitPrototypeChecks(isolate, handler, receiver_map, data1, maybe_data2); return handler; } @@ -304,5 +308,233 @@ Handle StoreHandler::StoreProxy(Isolate* isolate, MaybeObjectHandle::Weak(proxy)); } +#if defined(OBJECT_PRINT) +namespace { +void PrintSmiLoadHandler(int raw_handler, std::ostream& os) { + LoadHandler::Kind kind = LoadHandler::KindBits::decode(raw_handler); + os << "kind = "; + switch (kind) { + case LoadHandler::Kind::kElement: + os << "kElement, allow out of bounds = " + << LoadHandler::AllowOutOfBoundsBits::decode(raw_handler) + << ", is JSArray = " << LoadHandler::IsJsArrayBits::decode(raw_handler) + << ", convert hole = " + << LoadHandler::ConvertHoleBits::decode(raw_handler) + << ", elements kind = " + << ElementsKindToString( + LoadHandler::ElementsKindBits::decode(raw_handler)); + break; + case LoadHandler::Kind::kIndexedString: + os << "kIndexedString, allow out of bounds = " + << LoadHandler::AllowOutOfBoundsBits::decode(raw_handler); + break; + case LoadHandler::Kind::kNormal: + os << "kNormal"; + break; + case LoadHandler::Kind::kGlobal: + os << "kGlobal"; + break; + case LoadHandler::Kind::kField: { + CompactElementsKind compact_elements_kind = + LoadHandler::CompactElementsKindBits::decode(raw_handler); + os << "kField, is in object = " + << LoadHandler::IsInobjectBits::decode(raw_handler) + << ", is double = " << LoadHandler::IsDoubleBits::decode(raw_handler) + << ", field index = " + << LoadHandler::FieldIndexBits::decode(raw_handler) + << ", elements kind = " + << CompactElementsKindToString(compact_elements_kind); + break; + } + case LoadHandler::Kind::kConstantFromPrototype: { + CompactElementsKind compact_elements_kind = + LoadHandler::CompactElementsKindBits::decode(raw_handler); + os << "kConstantFromPrototype, elements kind = " + << CompactElementsKindToString(compact_elements_kind); + break; + } + case LoadHandler::Kind::kAccessor: + os << "kAccessor, descriptor = " + << LoadHandler::DescriptorBits::decode(raw_handler); + break; + case LoadHandler::Kind::kNativeDataProperty: + os << "kNativeDataProperty, descriptor = " + << LoadHandler::DescriptorBits::decode(raw_handler); + break; + case LoadHandler::Kind::kApiGetter: + os << "kApiGetter"; + break; + case LoadHandler::Kind::kApiGetterHolderIsPrototype: + os << "kApiGetterHolderIsPrototype"; + break; + case LoadHandler::Kind::kInterceptor: + os << "kInterceptor"; + break; + case LoadHandler::Kind::kSlow: + os << "kSlow"; + break; + case LoadHandler::Kind::kProxy: + os << "kProxy"; + break; + case LoadHandler::Kind::kNonExistent: + os << "kNonExistent"; + break; + case LoadHandler::Kind::kModuleExport: + os << "kModuleExport, exports index = " + << LoadHandler::ExportsIndexBits::decode(raw_handler); + break; + default: + UNREACHABLE(); + } +} + +const char* KeyedAccessStoreModeToString(KeyedAccessStoreMode mode) { + switch (mode) { + case STANDARD_STORE: + return "STANDARD_STORE"; + case STORE_AND_GROW_HANDLE_COW: + return "STORE_AND_GROW_HANDLE_COW"; + case STORE_IGNORE_OUT_OF_BOUNDS: + return "STORE_IGNORE_OUT_OF_BOUNDS"; + case STORE_HANDLE_COW: + return "STORE_HANDLE_COW"; + } + UNREACHABLE(); +} + +void PrintSmiStoreHandler(int raw_handler, std::ostream& os) { + StoreHandler::Kind kind = StoreHandler::KindBits::decode(raw_handler); + os << "kind = "; + switch (kind) { + case StoreHandler::Kind::kField: + case StoreHandler::Kind::kConstField: { + os << "k"; + if (kind == StoreHandler::Kind::kConstField) { + os << "Const"; + } + Representation representation = Representation::FromKind( + StoreHandler::RepresentationBits::decode(raw_handler)); + os << "Field, descriptor = " + << StoreHandler::DescriptorBits::decode(raw_handler) + << ", is in object = " + << StoreHandler::IsInobjectBits::decode(raw_handler) + << ", representation = " << representation.Mnemonic() + << ", field index = " + << StoreHandler::FieldIndexBits::decode(raw_handler); + break; + } + case StoreHandler::Kind::kAccessor: + os << "kAccessor, descriptor = " + << StoreHandler::DescriptorBits::decode(raw_handler); + break; + case StoreHandler::Kind::kNativeDataProperty: + os << "kNativeDataProperty, descriptor = " + << StoreHandler::DescriptorBits::decode(raw_handler); + break; + case StoreHandler::Kind::kApiSetter: + os << "kApiSetter"; + break; + case StoreHandler::Kind::kApiSetterHolderIsPrototype: + os << "kApiSetterHolderIsPrototype"; + break; + case StoreHandler::Kind::kGlobalProxy: + os << "kGlobalProxy"; + break; + case StoreHandler::Kind::kNormal: + os << "kNormal"; + break; + case StoreHandler::Kind::kInterceptor: + os << "kInterceptor"; + break; + case StoreHandler::Kind::kSlow: { + KeyedAccessStoreMode keyed_access_store_mode = + StoreHandler::KeyedAccessStoreModeBits::decode(raw_handler); + os << "kSlow, keyed access store mode = " + << KeyedAccessStoreModeToString(keyed_access_store_mode); + break; + } + case StoreHandler::Kind::kProxy: + os << "kProxy"; + break; + default: + UNREACHABLE(); + } +} + +} // namespace + +// static +void LoadHandler::PrintHandler(Object handler, std::ostream& os) { + DisallowHeapAllocation no_gc; + if (handler.IsSmi()) { + int raw_handler = handler.ToSmi().value(); + os << "LoadHandler(Smi)("; + PrintSmiLoadHandler(raw_handler, os); + os << ")" << std::endl; + } else { + LoadHandler load_handler = LoadHandler::cast(handler); + int raw_handler = load_handler.smi_handler().ToSmi().value(); + os << "LoadHandler(do access check on lookup start object = " + << DoAccessCheckOnLookupStartObjectBits::decode(raw_handler) + << ", lookup on lookup start object = " + << LookupOnLookupStartObjectBits::decode(raw_handler) << ", "; + PrintSmiLoadHandler(raw_handler, os); + DCHECK_GE(load_handler.data_field_count(), 1); + os << ", data1 = "; + load_handler.data1().ShortPrint(os); + if (load_handler.data_field_count() >= 2) { + os << ", data2 = "; + load_handler.data2().ShortPrint(os); + } + if (load_handler.data_field_count() >= 3) { + os << ", data3 = "; + load_handler.data3().ShortPrint(os); + } + os << ", validity cell = "; + load_handler.validity_cell().ShortPrint(os); + os << ")" << std::endl; + } +} + +void StoreHandler::PrintHandler(Object handler, std::ostream& os) { + DisallowHeapAllocation no_gc; + if (handler.IsSmi()) { + int raw_handler = handler.ToSmi().value(); + os << "StoreHandler(Smi)("; + PrintSmiStoreHandler(raw_handler, os); + os << ")" << std::endl; + } else { + os << "StoreHandler("; + StoreHandler store_handler = StoreHandler::cast(handler); + if (store_handler.smi_handler().IsCode()) { + Code code = Code::cast(store_handler.smi_handler()); + os << "builtin = "; + code.ShortPrint(os); + } else { + int raw_handler = store_handler.smi_handler().ToSmi().value(); + os << "do access check on lookup start object = " + << DoAccessCheckOnLookupStartObjectBits::decode(raw_handler) + << ", lookup on lookup start object = " + << LookupOnLookupStartObjectBits::decode(raw_handler) << ", "; + PrintSmiStoreHandler(raw_handler, os); + } + DCHECK_GE(store_handler.data_field_count(), 1); + os << ", data1 = "; + store_handler.data1().ShortPrint(os); + if (store_handler.data_field_count() >= 2) { + os << ", data2 = "; + store_handler.data2().ShortPrint(os); + } + if (store_handler.data_field_count() >= 3) { + os << ", data3 = "; + store_handler.data3().ShortPrint(os); + } + os << ", validity cell = "; + store_handler.validity_cell().ShortPrint(os); + os << ")" << std::endl; + } +} +#endif // defined(OBJECT_PRINT) + } // namespace internal } // namespace v8 diff --git a/deps/v8/src/ic/handler-configuration.h b/deps/v8/src/ic/handler-configuration.h index 4f3d12597eb0d8..aaa2ac551fbdb4 100644 --- a/deps/v8/src/ic/handler-configuration.h +++ b/deps/v8/src/ic/handler-configuration.h @@ -50,30 +50,32 @@ class LoadHandler final : public DataHandler { }; using KindBits = base::BitField; - // Defines whether access rights check should be done on receiver object. + // Defines whether access rights check should be done on lookup start object. // Applicable to named property kinds only when loading value from prototype - // chain. Ignored when loading from holder. - using DoAccessCheckOnReceiverBits = KindBits::Next; + // chain. Ignored when loading from lookup start object. + using DoAccessCheckOnLookupStartObjectBits = KindBits::Next; - // Defines whether a lookup should be done on receiver object before + // Defines whether a lookup should be done on lookup start object before // proceeding to the prototype chain. Applicable to named property kinds only - // when loading value from prototype chain. Ignored when loading from holder. - using LookupOnReceiverBits = DoAccessCheckOnReceiverBits::Next; + // when loading value from prototype chain. Ignored when loading from lookup + // start object. + using LookupOnLookupStartObjectBits = + DoAccessCheckOnLookupStartObjectBits::Next; // - // Encoding when KindBits contains kForConstants. + // Encoding when KindBits contains kAccessor or kNativeDataProperty. // // Index of a value entry in the descriptor array. using DescriptorBits = - LookupOnReceiverBits::Next; + LookupOnLookupStartObjectBits::Next; // Make sure we don't overflow the smi. STATIC_ASSERT(DescriptorBits::kLastUsedBit < kSmiValueSize); // // Encoding when KindBits contains kField. // - using IsInobjectBits = LookupOnReceiverBits::Next; + using IsInobjectBits = LookupOnLookupStartObjectBits::Next; using IsDoubleBits = IsInobjectBits::Next; // +1 here is to cover all possible JSObject header sizes. using FieldIndexBits = @@ -85,7 +87,7 @@ class LoadHandler final : public DataHandler { // // Encoding when KindBits contains kElement or kIndexedString. // - using AllowOutOfBoundsBits = LookupOnReceiverBits::Next; + using AllowOutOfBoundsBits = LookupOnLookupStartObjectBits::Next; // // Encoding when KindBits contains kElement. @@ -99,8 +101,9 @@ class LoadHandler final : public DataHandler { // // Encoding when KindBits contains kModuleExport. // - using ExportsIndexBits = LookupOnReceiverBits::Next< - unsigned, kSmiValueSize - LookupOnReceiverBits::kLastUsedBit - 1>; + using ExportsIndexBits = LookupOnLookupStartObjectBits::Next< + unsigned, + kSmiValueSize - LookupOnLookupStartObjectBits::kLastUsedBit - 1>; // Decodes kind from Smi-handler. static inline Kind GetHandlerKind(Smi smi_handler); @@ -156,7 +159,6 @@ class LoadHandler final : public DataHandler { // Creates a data handler that represents a prototype chain check followed // by given Smi-handler that encoded a load from the holder. - // Can be used only if GetPrototypeCheckCount() returns non negative value. static Handle LoadFromPrototype( Isolate* isolate, Handle receiver_map, Handle holder, Handle smi_handler, @@ -181,6 +183,10 @@ class LoadHandler final : public DataHandler { // Decodes the KeyedAccessLoadMode from a {handler}. static KeyedAccessLoadMode GetKeyedAccessLoadMode(MaybeObject handler); +#if defined(OBJECT_PRINT) + static void PrintHandler(Object handler, std::ostream& os); +#endif // defined(OBJECT_PRINT) + OBJECT_CONSTRUCTORS(LoadHandler, DataHandler); }; @@ -195,7 +201,6 @@ class StoreHandler final : public DataHandler { DECL_VERIFIER(StoreHandler) enum Kind { - kElement, kField, kConstField, kAccessor, @@ -213,36 +218,29 @@ class StoreHandler final : public DataHandler { // Applicable to kGlobalProxy, kProxy kinds. - // Defines whether access rights check should be done on receiver object. - using DoAccessCheckOnReceiverBits = KindBits::Next; + // Defines whether access rights check should be done on lookup start object. + using DoAccessCheckOnLookupStartObjectBits = KindBits::Next; - // Defines whether a lookup should be done on receiver object before + // Defines whether a lookup should be done on lookup start object before // proceeding to the prototype chain. Applicable to named property kinds only // when storing through prototype chain. Ignored when storing to holder. - using LookupOnReceiverBits = DoAccessCheckOnReceiverBits::Next; + using LookupOnLookupStartObjectBits = + DoAccessCheckOnLookupStartObjectBits::Next; - // Applicable to kField, kTransitionToField and kTransitionToConstant - // kinds. + // Applicable to kField, kAccessor and kNativeDataProperty. // Index of a value entry in the descriptor array. using DescriptorBits = - LookupOnReceiverBits::Next; + LookupOnLookupStartObjectBits::Next; // - // Encodes the bits when StoreSlow contains KeyedAccessStoreMode. + // Encoding when KindBits contains kStoreSlow. // using KeyedAccessStoreModeBits = - DescriptorBits::Next; - - // - // Encoding when KindBits contains kTransitionToConstant. - // - - // Make sure we don't overflow the smi. - STATIC_ASSERT(DescriptorBits::kLastUsedBit < kSmiValueSize); + LookupOnLookupStartObjectBits::Next; // - // Encoding when KindBits contains kField or kTransitionToField. + // Encoding when KindBits contains kField. // using IsInobjectBits = DescriptorBits::Next; using RepresentationBits = IsInobjectBits::Next; @@ -310,6 +308,10 @@ class StoreHandler final : public DataHandler { // Decodes the KeyedAccessStoreMode from a {handler}. static KeyedAccessStoreMode GetKeyedAccessStoreMode(MaybeObject handler); +#if defined(OBJECT_PRINT) + static void PrintHandler(Object handler, std::ostream& os); +#endif // defined(OBJECT_PRINT) + private: static inline Handle StoreField(Isolate* isolate, Kind kind, int descriptor, FieldIndex field_index, diff --git a/deps/v8/src/ic/ic-inl.h b/deps/v8/src/ic/ic-inl.h index 29373d85d8d178..35218f7df5a170 100644 --- a/deps/v8/src/ic/ic-inl.h +++ b/deps/v8/src/ic/ic-inl.h @@ -16,11 +16,12 @@ namespace v8 { namespace internal { -void IC::update_receiver_map(Handle receiver) { - if (receiver->IsSmi()) { - receiver_map_ = isolate_->factory()->heap_number_map(); +void IC::update_lookup_start_object_map(Handle object) { + if (object->IsSmi()) { + lookup_start_object_map_ = isolate_->factory()->heap_number_map(); } else { - receiver_map_ = handle(HeapObject::cast(*receiver).map(), isolate_); + lookup_start_object_map_ = + handle(HeapObject::cast(*object).map(), isolate_); } } diff --git a/deps/v8/src/ic/ic.cc b/deps/v8/src/ic/ic.cc index 1a414626bfbd43..d8e25f3c749dd8 100644 --- a/deps/v8/src/ic/ic.cc +++ b/deps/v8/src/ic/ic.cc @@ -11,6 +11,7 @@ #include "src/base/logging.h" #include "src/builtins/accessors.h" #include "src/codegen/code-factory.h" +#include "src/common/assert-scope.h" #include "src/execution/arguments-inl.h" #include "src/execution/execution.h" #include "src/execution/frames-inl.h" @@ -96,7 +97,7 @@ void IC::TraceIC(const char* type, Handle name, State old_state, State new_state) { if (V8_LIKELY(!TracingFlags::is_ic_stats_enabled())) return; - Handle map = receiver_map(); // Might be empty. + Handle map = lookup_start_object_map(); // Might be empty. const char* modifier = ""; if (state() == NO_FEEDBACK) { @@ -216,7 +217,8 @@ bool IC::ShouldRecomputeHandler(Handle name) { // monomorphic. if (IsGlobalIC()) return true; - MaybeObjectHandle maybe_handler = nexus()->FindHandlerForMap(receiver_map()); + MaybeObjectHandle maybe_handler = + nexus()->FindHandlerForMap(lookup_start_object_map()); // The current map wasn't handled yet. There's no reason to stay monomorphic, // *unless* we're moving from a deprecated map to its replacement, or @@ -224,13 +226,13 @@ bool IC::ShouldRecomputeHandler(Handle name) { // TODO(verwaest): Check if the current map is actually what the old map // would transition to. if (maybe_handler.is_null()) { - if (!receiver_map()->IsJSObjectMap()) return false; + if (!lookup_start_object_map()->IsJSObjectMap()) return false; Map first_map = FirstTargetMap(); if (first_map.is_null()) return false; Handle old_map(first_map, isolate()); if (old_map->is_deprecated()) return true; - return IsMoreGeneralElementsKindTransition(old_map->elements_kind(), - receiver_map()->elements_kind()); + return IsMoreGeneralElementsKindTransition( + old_map->elements_kind(), lookup_start_object_map()->elements_kind()); } return true; @@ -247,12 +249,12 @@ bool IC::RecomputeHandlerForName(Handle name) { return true; } -void IC::UpdateState(Handle receiver, Handle name) { +void IC::UpdateState(Handle lookup_start_object, Handle name) { if (state() == NO_FEEDBACK) return; - update_receiver_map(receiver); + update_lookup_start_object_map(lookup_start_object); if (!name->IsString()) return; if (state() != MONOMORPHIC && state() != POLYMORPHIC) return; - if (receiver->IsNullOrUndefined(isolate())) return; + if (lookup_start_object->IsNullOrUndefined(isolate())) return; // Remove the target from the code cache if it became invalid // because of changes in the prototype chain to avoid hitting it @@ -383,9 +385,14 @@ void IC::ConfigureVectorState( } MaybeHandle LoadIC::Load(Handle object, Handle name, - bool update_feedback) { + bool update_feedback, + Handle receiver) { bool use_ic = (state() != NO_FEEDBACK) && FLAG_use_ic && update_feedback; + if (receiver.is_null()) { + receiver = object; + } + // If the object is undefined or null it's illegal to try to get any // of its properties; throw a TypeError in that case. if (IsAnyHas() ? !object->IsJSReceiver() @@ -393,7 +400,7 @@ MaybeHandle LoadIC::Load(Handle object, Handle name, if (use_ic) { // Ensure the IC state progresses. TRACE_HANDLER_STATS(isolate(), LoadIC_NonReceiver); - update_receiver_map(object); + update_lookup_start_object_map(object); SetCache(name, LoadHandler::LoadSlow(isolate())); TraceIC("LoadIC", name); } @@ -415,10 +422,10 @@ MaybeHandle LoadIC::Load(Handle object, Handle name, if (MigrateDeprecated(isolate(), object)) use_ic = false; JSObject::MakePrototypesFast(object, kStartAtReceiver, isolate()); - update_receiver_map(object); + update_lookup_start_object_map(object); LookupIterator::Key key(isolate(), name); - LookupIterator it(isolate(), object, key); + LookupIterator it = LookupIterator(isolate(), receiver, key, object); // Named lookup in the object. LookupForRead(&it, IsAnyHas()); @@ -563,40 +570,67 @@ bool IC::UpdatePolymorphicIC(Handle name, if (is_keyed() && state() != RECOMPUTE_HANDLER) { if (nexus()->GetName() != *name) return false; } - Handle map = receiver_map(); + Handle map = lookup_start_object_map(); std::vector maps_and_handlers; - nexus()->ExtractMapsAndHandlers(&maps_and_handlers); - int number_of_maps = static_cast(maps_and_handlers.size()); - int deprecated_maps = 0; + maps_and_handlers.reserve(FLAG_max_valid_polymorphic_map_count); + std::vector deprecated_maps_and_handlers; int handler_to_overwrite = -1; - for (int i = 0; i < number_of_maps; i++) { - Handle current_map = maps_and_handlers.at(i).first; - MaybeObjectHandle current_handler = maps_and_handlers.at(i).second; - if (current_map->is_deprecated()) { - // Filter out deprecated maps to ensure their instances get migrated. - ++deprecated_maps; - } else if (map.is_identical_to(current_map)) { - // If both map and handler stayed the same (and the name is also the - // same as checked above, for keyed accesses), we're not progressing - // in the lattice and need to go MEGAMORPHIC instead. There's one - // exception to this rule, which is when we're in RECOMPUTE_HANDLER - // state, there we allow to migrate to a new handler. - if (handler.is_identical_to(current_handler) && - state() != RECOMPUTE_HANDLER) { - return false; + { + DisallowHeapAllocation no_gc; + int i = 0; + for (FeedbackIterator it(nexus()); !it.done(); it.Advance()) { + if (it.handler()->IsCleared()) continue; + MaybeObjectHandle existing_handler = handle(it.handler(), isolate()); + Handle existing_map = handle(it.map(), isolate()); + + if (existing_map->is_deprecated()) { + // Filter out deprecated maps to ensure their instances get migrated. + deprecated_maps_and_handlers.push_back( + MapAndHandler(existing_map, existing_handler)); + continue; + } + + maps_and_handlers.push_back( + MapAndHandler(existing_map, existing_handler)); + + if (map.is_identical_to(existing_map)) { + // If both map and handler stayed the same (and the name is also the + // same as checked above, for keyed accesses), we're not progressing + // in the lattice and need to go MEGAMORPHIC instead. There's one + // exception to this rule, which is when we're in RECOMPUTE_HANDLER + // state, there we allow to migrate to a new handler. + if (handler.is_identical_to(existing_handler) && + state() != RECOMPUTE_HANDLER) { + return false; + } + + // If the receiver type is already in the polymorphic IC, this indicates + // there was a prototoype chain failure. In that case, just overwrite + // the handler. + handler_to_overwrite = i; + } else if (handler_to_overwrite == -1 && + IsTransitionOfMonomorphicTarget(*existing_map, *map)) { + handler_to_overwrite = i; } - // If the receiver type is already in the polymorphic IC, this indicates - // there was a prototoype chain failure. In that case, just overwrite the - // handler. - handler_to_overwrite = i; - } else if (handler_to_overwrite == -1 && - IsTransitionOfMonomorphicTarget(*current_map, *map)) { - handler_to_overwrite = i; + + i++; } + DCHECK_LE(i, maps_and_handlers.size()); + } + + // Reorder the deprecated maps to be at the end, so that + // minimorphic ICs have the best chance of succeeding as they only + // check the first FLAG_max_minimorphic_map_checks maps. + if (deprecated_maps_and_handlers.size() > 0) { + maps_and_handlers.insert(maps_and_handlers.end(), + deprecated_maps_and_handlers.begin(), + deprecated_maps_and_handlers.end()); } + int number_of_maps = static_cast(maps_and_handlers.size()); + int deprecated_maps = static_cast(deprecated_maps_and_handlers.size()); int number_of_valid_maps = number_of_maps - deprecated_maps - (handler_to_overwrite != -1); @@ -608,7 +642,7 @@ bool IC::UpdatePolymorphicIC(Handle name, number_of_valid_maps++; if (number_of_valid_maps == 1) { - ConfigureVectorState(name, receiver_map(), handler); + ConfigureVectorState(name, lookup_start_object_map(), handler); } else { if (is_keyed() && nexus()->GetName() != *name) return false; if (handler_to_overwrite >= 0) { @@ -630,7 +664,7 @@ bool IC::UpdatePolymorphicIC(Handle name, void IC::UpdateMonomorphicIC(const MaybeObjectHandle& handler, Handle name) { DCHECK(IsHandler(*handler)); - ConfigureVectorState(name, receiver_map(), handler); + ConfigureVectorState(name, lookup_start_object_map(), handler); } void IC::CopyICToMegamorphicCache(Handle name) { @@ -687,7 +721,7 @@ void IC::SetCache(Handle name, const MaybeObjectHandle& handler) { ConfigureVectorState(MEGAMORPHIC, name); V8_FALLTHROUGH; case MEGAMORPHIC: - UpdateMegamorphicCache(receiver_map(), name, handler); + UpdateMegamorphicCache(lookup_start_object_map(), name, handler); // Indicate that we've handled this case. vector_set_ = true; break; @@ -704,7 +738,7 @@ void LoadIC::UpdateCaches(LookupIterator* lookup) { TRACE_HANDLER_STATS(isolate(), LoadIC_LoadNonexistentDH); Handle smi_handler = LoadHandler::LoadNonExistent(isolate()); code = LoadHandler::LoadFullChain( - isolate(), receiver_map(), + isolate(), lookup_start_object_map(), MaybeObjectHandle(isolate()->factory()->null_value()), smi_handler); } else if (IsLoadGlobalIC() && lookup->state() == LookupIterator::JSPROXY) { // If there is proxy just install the slow stub since we need to call the @@ -712,8 +746,8 @@ void LoadIC::UpdateCaches(LookupIterator* lookup) { // handle this case. Handle slow_handler = LoadHandler::LoadSlow(isolate()); Handle holder = lookup->GetHolder(); - code = LoadHandler::LoadFromPrototype(isolate(), receiver_map(), holder, - slow_handler); + code = LoadHandler::LoadFromPrototype(isolate(), lookup_start_object_map(), + holder, slow_handler); } else { if (IsLoadGlobalIC()) { if (lookup->TryLookupCachedProperty()) { @@ -782,12 +816,13 @@ Handle LoadIC::ComputeHandler(LookupIterator* lookup) { } } - Handle map = receiver_map(); + Handle map = lookup_start_object_map(); Handle holder; - bool receiver_is_holder; + bool holder_is_lookup_start_object; if (lookup->state() != LookupIterator::JSPROXY) { holder = lookup->GetHolder(); - receiver_is_holder = receiver.is_identical_to(holder); + holder_is_lookup_start_object = + lookup->lookup_start_object().is_identical_to(holder); } switch (lookup->state()) { @@ -796,7 +831,7 @@ Handle LoadIC::ComputeHandler(LookupIterator* lookup) { if (holder->GetNamedInterceptor().non_masking()) { MaybeObjectHandle holder_ref(isolate()->factory()->null_value()); - if (!receiver_is_holder || IsLoadGlobalIC()) { + if (!holder_is_lookup_start_object || IsLoadGlobalIC()) { holder_ref = MaybeObjectHandle::Weak(holder); } TRACE_HANDLER_STATS(isolate(), LoadIC_LoadNonMaskingInterceptorDH); @@ -804,7 +839,7 @@ Handle LoadIC::ComputeHandler(LookupIterator* lookup) { smi_handler); } - if (receiver_is_holder) { + if (holder_is_lookup_start_object) { DCHECK(map->has_named_interceptor()); TRACE_HANDLER_STATS(isolate(), LoadIC_LoadInterceptorDH); return smi_handler; @@ -818,7 +853,7 @@ Handle LoadIC::ComputeHandler(LookupIterator* lookup) { case LookupIterator::ACCESSOR: { // Use simple field loads for some well-known callback properties. // The method will only return true for absolute truths based on the - // receiver maps. + // lookup start object maps. FieldIndex index; if (Accessors::IsJSObjectFieldAccessor(isolate(), map, lookup->name(), &index)) { @@ -892,7 +927,7 @@ Handle LoadIC::ComputeHandler(LookupIterator* lookup) { LoadHandler::LoadAccessor(isolate(), lookup->GetAccessorIndex()); TRACE_HANDLER_STATS(isolate(), LoadIC_LoadAccessorDH); - if (receiver_is_holder) return smi_handler; + if (holder_is_lookup_start_object) return smi_handler; TRACE_HANDLER_STATS(isolate(), LoadIC_LoadAccessorFromPrototypeDH); } else if (holder->IsJSGlobalObject()) { TRACE_HANDLER_STATS(isolate(), LoadIC_LoadGlobalFromPrototypeDH); @@ -904,7 +939,7 @@ Handle LoadIC::ComputeHandler(LookupIterator* lookup) { smi_handler = LoadHandler::LoadNormal(isolate()); TRACE_HANDLER_STATS(isolate(), LoadIC_LoadNormalDH); - if (receiver_is_holder) return smi_handler; + if (holder_is_lookup_start_object) return smi_handler; TRACE_HANDLER_STATS(isolate(), LoadIC_LoadNormalFromPrototypeDH); } @@ -925,7 +960,7 @@ Handle LoadIC::ComputeHandler(LookupIterator* lookup) { Handle smi_handler = LoadHandler::LoadNativeDataProperty( isolate(), lookup->GetAccessorIndex()); TRACE_HANDLER_STATS(isolate(), LoadIC_LoadNativeDataPropertyDH); - if (receiver_is_holder) return smi_handler; + if (holder_is_lookup_start_object) return smi_handler; TRACE_HANDLER_STATS(isolate(), LoadIC_LoadNativeDataPropertyFromPrototypeDH); return LoadHandler::LoadFromPrototype(isolate(), map, holder, @@ -948,7 +983,7 @@ Handle LoadIC::ComputeHandler(LookupIterator* lookup) { smi_handler = LoadHandler::LoadNormal(isolate()); TRACE_HANDLER_STATS(isolate(), LoadIC_LoadNormalDH); - if (receiver_is_holder) return smi_handler; + if (holder_is_lookup_start_object) return smi_handler; TRACE_HANDLER_STATS(isolate(), LoadIC_LoadNormalFromPrototypeDH); } else if (lookup->IsElement(*holder)) { TRACE_HANDLER_STATS(isolate(), LoadIC_SlowStub); @@ -959,11 +994,11 @@ Handle LoadIC::ComputeHandler(LookupIterator* lookup) { smi_handler = LoadHandler::LoadField(isolate(), field, map->elements_kind()); TRACE_HANDLER_STATS(isolate(), LoadIC_LoadFieldDH); - if (receiver_is_holder) return smi_handler; + if (holder_is_lookup_start_object) return smi_handler; TRACE_HANDLER_STATS(isolate(), LoadIC_LoadFieldFromPrototypeDH); } if (lookup->constness() == PropertyConstness::kConst && - !receiver_is_holder) { + !holder_is_lookup_start_object) { DCHECK(!lookup->is_dictionary_holder()); Handle value = lookup->GetDataValue(); @@ -998,9 +1033,10 @@ Handle LoadIC::ComputeHandler(LookupIterator* lookup) { return LoadHandler::LoadNonExistent(isolate()); case LookupIterator::JSPROXY: { Handle holder_proxy = lookup->GetHolder(); - bool receiver_is_holder_proxy = receiver.is_identical_to(holder_proxy); + bool holder_proxy_is_lookup_start_object = + lookup->lookup_start_object().is_identical_to(holder_proxy); Handle smi_handler = LoadHandler::LoadProxy(isolate()); - if (receiver_is_holder_proxy) { + if (holder_proxy_is_lookup_start_object) { return smi_handler; } return LoadHandler::LoadFromPrototype(isolate(), map, holder_proxy, @@ -1408,7 +1444,7 @@ bool StoreIC::LookupForWrite(LookupIterator* it, Handle value, it->PrepareForDataProperty(value); // The previous receiver map might just have been deprecated, // so reload it. - update_receiver_map(receiver); + update_lookup_start_object_map(receiver); return true; } @@ -1531,7 +1567,7 @@ MaybeHandle StoreIC::Store(Handle object, Handle name, if (use_ic) { // Ensure the IC state progresses. TRACE_HANDLER_STATS(isolate(), StoreIC_NonReceiver); - update_receiver_map(object); + update_lookup_start_object_map(object); SetCache(name, StoreHandler::StoreSlow(isolate())); TraceIC("StoreIC", name); } @@ -1601,7 +1637,7 @@ MaybeObjectHandle StoreIC::ComputeHandler(LookupIterator* lookup) { if (store_target->IsJSGlobalObject()) { TRACE_HANDLER_STATS(isolate(), StoreIC_StoreGlobalTransitionDH); - if (receiver_map()->IsJSGlobalObject()) { + if (lookup_start_object_map()->IsJSGlobalObject()) { DCHECK(IsStoreGlobalIC()); #ifdef DEBUG Handle holder = lookup->GetHolder(); @@ -1613,13 +1649,13 @@ MaybeObjectHandle StoreIC::ComputeHandler(LookupIterator* lookup) { Handle smi_handler = StoreHandler::StoreGlobalProxy(isolate()); Handle handler = StoreHandler::StoreThroughPrototype( - isolate(), receiver_map(), store_target, smi_handler, + isolate(), lookup_start_object_map(), store_target, smi_handler, MaybeObjectHandle::Weak(lookup->transition_cell())); return MaybeObjectHandle(handler); } // Dictionary-to-fast transitions are not expected and not supported. DCHECK_IMPLIES(!lookup->transition_map()->is_dictionary_map(), - !receiver_map()->is_dictionary_map()); + !lookup_start_object_map()->is_dictionary_map()); DCHECK(lookup->IsCacheableTransition()); @@ -1646,7 +1682,7 @@ MaybeObjectHandle StoreIC::ComputeHandler(LookupIterator* lookup) { DCHECK(!info.getter().IsUndefined(isolate()) || !info.query().IsUndefined(isolate())); Handle handler = StoreHandler::StoreThroughPrototype( - isolate(), receiver_map(), holder, + isolate(), lookup_start_object_map(), holder, StoreHandler::StoreSlow(isolate())); return MaybeObjectHandle(handler); } @@ -1678,7 +1714,8 @@ MaybeObjectHandle StoreIC::ComputeHandler(LookupIterator* lookup) { TRACE_HANDLER_STATS(isolate(), StoreIC_SlowStub); return MaybeObjectHandle(StoreHandler::StoreSlow(isolate())); } - if (!AccessorInfo::IsCompatibleReceiverMap(info, receiver_map())) { + if (!AccessorInfo::IsCompatibleReceiverMap(info, + lookup_start_object_map())) { set_slow_stub_reason("incompatible receiver type"); TRACE_HANDLER_STATS(isolate(), StoreIC_SlowStub); return MaybeObjectHandle(StoreHandler::StoreSlow(isolate())); @@ -1693,7 +1730,7 @@ MaybeObjectHandle StoreIC::ComputeHandler(LookupIterator* lookup) { TRACE_HANDLER_STATS(isolate(), StoreIC_StoreNativeDataPropertyOnPrototypeDH); return MaybeObjectHandle(StoreHandler::StoreThroughPrototype( - isolate(), receiver_map(), holder, smi_handler)); + isolate(), lookup_start_object_map(), holder, smi_handler)); } else if (accessors->IsAccessorPair()) { Handle setter(Handle::cast(accessors)->setter(), @@ -1717,8 +1754,8 @@ MaybeObjectHandle StoreIC::ComputeHandler(LookupIterator* lookup) { if (call_optimization.is_simple_api_call()) { if (call_optimization.IsCompatibleReceiver(receiver, holder)) { CallOptimization::HolderLookup holder_lookup; - call_optimization.LookupHolderOfExpectedType(receiver_map(), - &holder_lookup); + call_optimization.LookupHolderOfExpectedType( + lookup_start_object_map(), &holder_lookup); Handle smi_handler = StoreHandler::StoreApiSetter( isolate(), @@ -1728,7 +1765,7 @@ MaybeObjectHandle StoreIC::ComputeHandler(LookupIterator* lookup) { call_optimization.GetAccessorContext(holder->map()), isolate()); TRACE_HANDLER_STATS(isolate(), StoreIC_StoreApiSetterOnPrototypeDH); return MaybeObjectHandle(StoreHandler::StoreThroughPrototype( - isolate(), receiver_map(), holder, smi_handler, + isolate(), lookup_start_object_map(), holder, smi_handler, MaybeObjectHandle::Weak(call_optimization.api_call_info()), MaybeObjectHandle::Weak(context))); } @@ -1751,7 +1788,7 @@ MaybeObjectHandle StoreIC::ComputeHandler(LookupIterator* lookup) { TRACE_HANDLER_STATS(isolate(), StoreIC_StoreAccessorOnPrototypeDH); return MaybeObjectHandle(StoreHandler::StoreThroughPrototype( - isolate(), receiver_map(), holder, smi_handler)); + isolate(), lookup_start_object_map(), holder, smi_handler)); } TRACE_HANDLER_STATS(isolate(), StoreIC_SlowStub); return MaybeObjectHandle(StoreHandler::StoreSlow(isolate())); @@ -1810,7 +1847,7 @@ MaybeObjectHandle StoreIC::ComputeHandler(LookupIterator* lookup) { Handle::cast(lookup->GetReceiver()); Handle holder = lookup->GetHolder(); return MaybeObjectHandle(StoreHandler::StoreProxy( - isolate(), receiver_map(), holder, receiver)); + isolate(), lookup_start_object_map(), holder, receiver)); } case LookupIterator::INTEGER_INDEXED_EXOTIC: @@ -2338,6 +2375,21 @@ RUNTIME_FUNCTION(Runtime_LoadNoFeedbackIC_Miss) { RETURN_RESULT_OR_FAILURE(isolate, ic.Load(receiver, key)); } +RUNTIME_FUNCTION(Runtime_LoadWithReceiverNoFeedbackIC_Miss) { + HandleScope scope(isolate); + DCHECK_EQ(3, args.length()); + // Runtime functions don't follow the IC's calling convention. + Handle receiver = args.at(0); + Handle object = args.at(1); + Handle key = args.at(2); + + Handle vector = Handle(); + FeedbackSlot vector_slot = FeedbackSlot::Invalid(); + LoadIC ic(isolate, vector, vector_slot, FeedbackSlotKind::kLoadProperty); + ic.UpdateState(object, key); + RETURN_RESULT_OR_FAILURE(isolate, ic.Load(object, key, true, receiver)); +} + RUNTIME_FUNCTION(Runtime_LoadGlobalIC_Miss) { HandleScope scope(isolate); DCHECK_EQ(4, args.length()); @@ -2383,6 +2435,23 @@ RUNTIME_FUNCTION(Runtime_LoadGlobalIC_Slow) { return *result; } +RUNTIME_FUNCTION(Runtime_LoadWithReceiverIC_Miss) { + HandleScope scope(isolate); + DCHECK_EQ(5, args.length()); + // Runtime functions don't follow the IC's calling convention. + Handle receiver = args.at(0); + Handle object = args.at(1); + Handle key = args.at(2); + Handle slot = args.at(3); + Handle vector = args.at(4); + FeedbackSlot vector_slot = FeedbackVector::ToSlot(slot->value()); + + DCHECK(IsLoadICKind(vector->GetKind(vector_slot))); + LoadIC ic(isolate, vector, vector_slot, FeedbackSlotKind::kLoadProperty); + ic.UpdateState(object, key); + RETURN_RESULT_OR_FAILURE(isolate, ic.Load(object, key, true, receiver)); +} + RUNTIME_FUNCTION(Runtime_KeyedLoadIC_Miss) { HandleScope scope(isolate); DCHECK_EQ(4, args.length()); diff --git a/deps/v8/src/ic/ic.h b/deps/v8/src/ic/ic.h index da4b22a2c27df6..170ee609cb4d85 100644 --- a/deps/v8/src/ic/ic.h +++ b/deps/v8/src/ic/ic.h @@ -37,8 +37,9 @@ class IC { State state() const { return state_; } - // Compute the current IC state based on the target stub, receiver and name. - void UpdateState(Handle receiver, Handle name); + // Compute the current IC state based on the target stub, lookup_start_object + // and name. + void UpdateState(Handle lookup_start_object, Handle name); bool RecomputeHandlerForName(Handle name); void MarkRecomputeHandler(Handle name) { @@ -121,8 +122,8 @@ class IC { } bool ShouldRecomputeHandler(Handle name); - Handle receiver_map() { return receiver_map_; } - inline void update_receiver_map(Handle receiver); + Handle lookup_start_object_map() { return lookup_start_object_map_; } + inline void update_lookup_start_object_map(Handle object); void TargetMaps(MapHandles* list) { FindTargetMaps(); @@ -136,10 +137,6 @@ class IC { return !target_maps_.empty() ? *target_maps_[0] : Map(); } - State saved_state() const { - return state() == RECOMPUTE_HANDLER ? old_state_ : state(); - } - const FeedbackNexus* nexus() const { return &nexus_; } FeedbackNexus* nexus() { return &nexus_; } @@ -156,7 +153,7 @@ class IC { State old_state_; // For saving if we marked as prototype failure. State state_; FeedbackSlotKind kind_; - Handle receiver_map_; + Handle lookup_start_object_map_; MapHandles target_maps_; bool target_maps_set_; @@ -184,9 +181,10 @@ class LoadIC : public IC { return ShouldThrowReferenceError(kind()); } - V8_WARN_UNUSED_RESULT MaybeHandle Load(Handle object, - Handle name, - bool update_feedback = true); + // If receiver is empty, use object as the receiver. + V8_WARN_UNUSED_RESULT MaybeHandle Load( + Handle object, Handle name, bool update_feedback = true, + Handle receiver = Handle()); protected: // Update the inline cache and the global stub cache based on the diff --git a/deps/v8/src/init/bootstrapper.cc b/deps/v8/src/init/bootstrapper.cc index 996b8728787085..c5cfceb0696874 100644 --- a/deps/v8/src/init/bootstrapper.cc +++ b/deps/v8/src/init/bootstrapper.cc @@ -4151,6 +4151,12 @@ void Genesis::InitializeGlobal_harmony_sharedarraybuffer() { JSObject::AddProperty(isolate_, global, "SharedArrayBuffer", isolate()->shared_array_buffer_fun(), DONT_ENUM); +} + +void Genesis::InitializeGlobal_harmony_atomics() { + if (!FLAG_harmony_atomics) return; + + Handle global(native_context()->global_object(), isolate()); JSObject::AddProperty(isolate_, global, "Atomics", isolate()->atomics_object(), DONT_ENUM); @@ -4219,7 +4225,7 @@ void Genesis::InitializeGlobal_harmony_weak_refs() { factory->WeakRef_string()); SimpleInstallFunction(isolate(), weak_ref_prototype, "deref", - Builtins::kWeakRefDeref, 0, false); + Builtins::kWeakRefDeref, 0, true); } } diff --git a/deps/v8/src/inspector/DEPS b/deps/v8/src/inspector/DEPS index f72271a55cc670..55d8e7a51e54e2 100644 --- a/deps/v8/src/inspector/DEPS +++ b/deps/v8/src/inspector/DEPS @@ -13,6 +13,7 @@ include_rules = [ "+src/base/safe_conversions.h", "+src/base/template-utils.h", "+src/base/v8-fallthrough.h", + "+src/logging/tracing-flags.h", "+src/numbers/conversions.h", "+src/inspector", "+src/tracing", diff --git a/deps/v8/src/inspector/string-16.cc b/deps/v8/src/inspector/string-16.cc index 15344ee2b8388c..466852fa36c0c2 100644 --- a/deps/v8/src/inspector/string-16.cc +++ b/deps/v8/src/inspector/string-16.cc @@ -196,6 +196,14 @@ void String16Builder::appendUnsignedAsHex(uint32_t number) { m_buffer.insert(m_buffer.end(), buffer, buffer + chars); } +void String16Builder::appendUnsignedAsHex(uint8_t number) { + constexpr int kBufferSize = 3; + char buffer[kBufferSize]; + int chars = v8::base::OS::SNPrintF(buffer, kBufferSize, "%02" PRIx8, number); + DCHECK_LE(0, chars); + m_buffer.insert(m_buffer.end(), buffer, buffer + chars); +} + String16 String16Builder::toString() { return String16(m_buffer.data(), m_buffer.size()); } diff --git a/deps/v8/src/inspector/string-16.h b/deps/v8/src/inspector/string-16.h index 014c5f4c7ea16e..4143f6c311f223 100644 --- a/deps/v8/src/inspector/string-16.h +++ b/deps/v8/src/inspector/string-16.h @@ -128,6 +128,7 @@ class String16Builder { void appendNumber(size_t); void appendUnsignedAsHex(uint64_t); void appendUnsignedAsHex(uint32_t); + void appendUnsignedAsHex(uint8_t); String16 toString(); void reserveCapacity(size_t); diff --git a/deps/v8/src/inspector/v8-profiler-agent-impl.cc b/deps/v8/src/inspector/v8-profiler-agent-impl.cc index 873add9a190490..47be9448799271 100644 --- a/deps/v8/src/inspector/v8-profiler-agent-impl.cc +++ b/deps/v8/src/inspector/v8-profiler-agent-impl.cc @@ -6,6 +6,7 @@ #include +#include "include/v8-profiler.h" #include "src/base/atomicops.h" #include "src/base/platform/time.h" #include "src/debug/debug-interface.h" @@ -15,8 +16,7 @@ #include "src/inspector/v8-inspector-impl.h" #include "src/inspector/v8-inspector-session-impl.h" #include "src/inspector/v8-stack-trace-impl.h" - -#include "include/v8-profiler.h" +#include "src/logging/tracing-flags.h" namespace v8_inspector { @@ -30,6 +30,8 @@ static const char preciseCoverageDetailed[] = "preciseCoverageDetailed"; static const char preciseCoverageAllowTriggeredUpdates[] = "preciseCoverageAllowTriggeredUpdates"; static const char typeProfileStarted[] = "typeProfileStarted"; +static const char countersEnabled[] = "countersEnabled"; +static const char runtimeCallStatsEnabled[] = "runtimeCallStatsEnabled"; } // namespace ProfilerAgentState namespace { @@ -220,22 +222,36 @@ void V8ProfilerAgentImpl::consoleProfileEnd(const String16& title) { } Response V8ProfilerAgentImpl::enable() { - if (m_enabled) return Response::Success(); - m_enabled = true; - m_state->setBoolean(ProfilerAgentState::profilerEnabled, true); + if (!m_enabled) { + m_enabled = true; + m_state->setBoolean(ProfilerAgentState::profilerEnabled, true); + } + return Response::Success(); } Response V8ProfilerAgentImpl::disable() { - if (!m_enabled) return Response::Success(); - for (size_t i = m_startedProfiles.size(); i > 0; --i) - stopProfiling(m_startedProfiles[i - 1].m_id, false); - m_startedProfiles.clear(); - stop(nullptr); - stopPreciseCoverage(); - DCHECK(!m_profiler); - m_enabled = false; - m_state->setBoolean(ProfilerAgentState::profilerEnabled, false); + if (m_enabled) { + for (size_t i = m_startedProfiles.size(); i > 0; --i) + stopProfiling(m_startedProfiles[i - 1].m_id, false); + m_startedProfiles.clear(); + stop(nullptr); + stopPreciseCoverage(); + DCHECK(!m_profiler); + m_enabled = false; + m_state->setBoolean(ProfilerAgentState::profilerEnabled, false); + } + + if (m_counters) { + disableCounters(); + m_state->setBoolean(ProfilerAgentState::countersEnabled, false); + } + + if (m_runtime_call_stats_enabled) { + disableRuntimeCallStats(); + m_state->setBoolean(ProfilerAgentState::runtimeCallStatsEnabled, false); + } + return Response::Success(); } @@ -250,25 +266,34 @@ Response V8ProfilerAgentImpl::setSamplingInterval(int interval) { void V8ProfilerAgentImpl::restore() { DCHECK(!m_enabled); - if (!m_state->booleanProperty(ProfilerAgentState::profilerEnabled, false)) - return; - m_enabled = true; - DCHECK(!m_profiler); - if (m_state->booleanProperty(ProfilerAgentState::userInitiatedProfiling, - false)) { - start(); + if (m_state->booleanProperty(ProfilerAgentState::profilerEnabled, false)) { + m_enabled = true; + DCHECK(!m_profiler); + if (m_state->booleanProperty(ProfilerAgentState::userInitiatedProfiling, + false)) { + start(); + } + if (m_state->booleanProperty(ProfilerAgentState::preciseCoverageStarted, + false)) { + bool callCount = m_state->booleanProperty( + ProfilerAgentState::preciseCoverageCallCount, false); + bool detailed = m_state->booleanProperty( + ProfilerAgentState::preciseCoverageDetailed, false); + bool updatesAllowed = m_state->booleanProperty( + ProfilerAgentState::preciseCoverageAllowTriggeredUpdates, false); + double timestamp; + startPreciseCoverage(Maybe(callCount), Maybe(detailed), + Maybe(updatesAllowed), ×tamp); + } } - if (m_state->booleanProperty(ProfilerAgentState::preciseCoverageStarted, + + if (m_state->booleanProperty(ProfilerAgentState::countersEnabled, false)) { + enableCounters(); + } + + if (m_state->booleanProperty(ProfilerAgentState::runtimeCallStatsEnabled, false)) { - bool callCount = m_state->booleanProperty( - ProfilerAgentState::preciseCoverageCallCount, false); - bool detailed = m_state->booleanProperty( - ProfilerAgentState::preciseCoverageDetailed, false); - bool updatesAllowed = m_state->booleanProperty( - ProfilerAgentState::preciseCoverageAllowTriggeredUpdates, false); - double timestamp; - startPreciseCoverage(Maybe(callCount), Maybe(detailed), - Maybe(updatesAllowed), ×tamp); + enableRuntimeCallStats(); } } @@ -525,10 +550,9 @@ Response V8ProfilerAgentImpl::takeTypeProfile( return Response::Success(); } -Response V8ProfilerAgentImpl::enableRuntimeCallStats() { +Response V8ProfilerAgentImpl::enableCounters() { if (m_counters) - return Response::ServerError( - "RuntimeCallStats collection already enabled."); + return Response::ServerError("Counters collection already enabled."); if (V8Inspector* inspector = v8::debug::GetInspector(m_isolate)) m_counters = inspector->enableCounters(); @@ -538,16 +562,16 @@ Response V8ProfilerAgentImpl::enableRuntimeCallStats() { return Response::Success(); } -Response V8ProfilerAgentImpl::disableRuntimeCallStats() { +Response V8ProfilerAgentImpl::disableCounters() { if (m_counters) m_counters.reset(); return Response::Success(); } -Response V8ProfilerAgentImpl::getRuntimeCallStats( +Response V8ProfilerAgentImpl::getCounters( std::unique_ptr>* out_result) { if (!m_counters) - return Response::ServerError("RuntimeCallStats collection is not enabled."); + return Response::ServerError("Counters collection is not enabled."); *out_result = std::make_unique>(); @@ -564,6 +588,66 @@ Response V8ProfilerAgentImpl::getRuntimeCallStats( return Response::Success(); } +Response V8ProfilerAgentImpl::enableRuntimeCallStats() { + if (v8::internal::TracingFlags::runtime_stats.load()) { + return Response::ServerError( + "Runtime Call Stats collection is already enabled."); + } + + v8::internal::TracingFlags::runtime_stats.store(true); + m_runtime_call_stats_enabled = true; + + return Response::Success(); +} + +Response V8ProfilerAgentImpl::disableRuntimeCallStats() { + if (!v8::internal::TracingFlags::runtime_stats.load()) { + return Response::ServerError( + "Runtime Call Stats collection is not enabled."); + } + + if (!m_runtime_call_stats_enabled) { + return Response::ServerError( + "Runtime Call Stats collection was not enabled by this session."); + } + + v8::internal::TracingFlags::runtime_stats.store(false); + m_runtime_call_stats_enabled = false; + + return Response::Success(); +} + +Response V8ProfilerAgentImpl::getRuntimeCallStats( + std::unique_ptr< + protocol::Array>* + out_result) { + if (!m_runtime_call_stats_enabled) { + return Response::ServerError( + "Runtime Call Stats collection is not enabled."); + } + + if (!v8::internal::TracingFlags::runtime_stats.load()) { + return Response::ServerError( + "Runtime Call Stats collection was disabled outside of this session."); + } + + *out_result = std::make_unique< + protocol::Array>(); + + v8::debug::EnumerateRuntimeCallCounters( + m_isolate, + [&](const char* name, int64_t count, v8::base::TimeDelta time) { + (*out_result) + ->emplace_back(protocol::Profiler::RuntimeCallCounterInfo::create() + .setName(String16(name)) + .setValue(static_cast(count)) + .setTime(time.InSecondsF()) + .build()); + }); + + return Response::Success(); +} + String16 V8ProfilerAgentImpl::nextProfileId() { return String16::fromInteger( v8::base::Relaxed_AtomicIncrement(&s_lastProfileId, 1)); diff --git a/deps/v8/src/inspector/v8-profiler-agent-impl.h b/deps/v8/src/inspector/v8-profiler-agent-impl.h index 0beb2788453e81..79016727b6ddf1 100644 --- a/deps/v8/src/inspector/v8-profiler-agent-impl.h +++ b/deps/v8/src/inspector/v8-profiler-agent-impl.h @@ -57,10 +57,17 @@ class V8ProfilerAgentImpl : public protocol::Profiler::Backend { std::unique_ptr>* out_result) override; + Response enableCounters() override; + Response disableCounters() override; + Response getCounters( + std::unique_ptr>* + out_result) override; + Response enableRuntimeCallStats() override; Response disableRuntimeCallStats() override; Response getRuntimeCallStats( - std::unique_ptr>* + std::unique_ptr< + protocol::Array>* out_result) override; void consoleProfile(const String16& title); @@ -87,6 +94,7 @@ class V8ProfilerAgentImpl : public protocol::Profiler::Backend { String16 m_frontendInitiatedProfileId; int m_startedProfilesCount = 0; std::shared_ptr m_counters; + bool m_runtime_call_stats_enabled = false; DISALLOW_COPY_AND_ASSIGN(V8ProfilerAgentImpl); }; diff --git a/deps/v8/src/inspector/value-mirror.cc b/deps/v8/src/inspector/value-mirror.cc index 2d830026114c7d..6bfb3dc3e4ffca 100644 --- a/deps/v8/src/inspector/value-mirror.cc +++ b/deps/v8/src/inspector/value-mirror.cc @@ -54,6 +54,15 @@ ResultType unpackWasmValue(v8::Local context, return result; } +String16 descriptionForWasmS128(std::array arr) { + String16Builder builder; + for (int i = 0; i < 16; i++) { + builder.appendUnsignedAsHex(arr.at(i)); + builder.append(" "); + } + return builder.toString(); +} + // Partial list of Wasm's ValueType, copied here to avoid including internal // header. Using an unscoped enumeration here to allow implicit conversions from // int. Keep in sync with ValueType::Kind in wasm/value-type.h. @@ -176,6 +185,14 @@ Response toProtocolValue(v8::Local context, unpackWasmValue(context, wasmValue->bytes())); break; } + case kS128: { + auto bytes = wasmValue->bytes(); + DCHECK_EQ(16, bytes->Length()); + auto s128 = unpackWasmValue>(context, bytes); + String16 desc = descriptionForWasmS128(s128); + *result = protocol::StringValue::create(desc); + break; + } case kExternRef: { std::unique_ptr externrefValue; Response response = toProtocolValue(context, wasmValue->ref(), maxDepth, @@ -525,6 +542,8 @@ class WasmValueMirror final : public ValueMirror { return RemoteObject::SubtypeEnum::F32; case kF64: return RemoteObject::SubtypeEnum::F64; + case kS128: + return RemoteObject::SubtypeEnum::V128; case kExternRef: return RemoteObject::SubtypeEnum::Externref; default: @@ -553,6 +572,13 @@ class WasmValueMirror final : public ValueMirror { return String16::fromDouble( unpackWasmValue(context, m_value->bytes())); } + case kS128: { + *serializable = false; + auto bytes = m_value->bytes(); + DCHECK_EQ(16, bytes->Length()); + auto s128 = unpackWasmValue>(context, bytes); + return descriptionForWasmS128(s128); + } case kExternRef: { return descriptionForObject(context->GetIsolate(), m_value->ref().As()); diff --git a/deps/v8/src/interpreter/OWNERS b/deps/v8/src/interpreter/OWNERS index cd7c1db6d01f75..f013999565d17c 100644 --- a/deps/v8/src/interpreter/OWNERS +++ b/deps/v8/src/interpreter/OWNERS @@ -1,4 +1,3 @@ -bmeurer@chromium.org leszeks@chromium.org mythria@chromium.org rmcilroy@chromium.org diff --git a/deps/v8/src/interpreter/bytecode-array-builder.cc b/deps/v8/src/interpreter/bytecode-array-builder.cc index 4cd43d3c991ebe..74c2065355e148 100644 --- a/deps/v8/src/interpreter/bytecode-array-builder.cc +++ b/deps/v8/src/interpreter/bytecode-array-builder.cc @@ -13,7 +13,7 @@ #include "src/interpreter/bytecode-register-optimizer.h" #include "src/interpreter/bytecode-source-info.h" #include "src/interpreter/interpreter-intrinsics.h" -#include "src/objects/objects-inl.h" +#include "src/objects/feedback-vector-inl.h" #include "src/objects/smi.h" namespace v8 { @@ -830,6 +830,13 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::LoadNamedProperty( return *this; } +BytecodeArrayBuilder& BytecodeArrayBuilder::LoadNamedPropertyFromSuper( + Register object, const AstRawString* name, int feedback_slot) { + size_t name_index = GetConstantPoolEntry(name); + OutputLdaNamedPropertyFromSuper(object, name_index, feedback_slot); + return *this; +} + BytecodeArrayBuilder& BytecodeArrayBuilder::LoadNamedPropertyNoFeedback( Register object, const AstRawString* name) { size_t name_index = GetConstantPoolEntry(name); diff --git a/deps/v8/src/interpreter/bytecode-array-builder.h b/deps/v8/src/interpreter/bytecode-array-builder.h index cad4f473a28ea3..ff7e9cb21f169b 100644 --- a/deps/v8/src/interpreter/bytecode-array-builder.h +++ b/deps/v8/src/interpreter/bytecode-array-builder.h @@ -136,6 +136,10 @@ class V8_EXPORT_PRIVATE BytecodeArrayBuilder final { BytecodeArrayBuilder& LoadNamedPropertyNoFeedback(Register object, const AstRawString* name); + BytecodeArrayBuilder& LoadNamedPropertyFromSuper(Register object, + const AstRawString* name, + int feedback_slot); + // Keyed load property. The key should be in the accumulator. BytecodeArrayBuilder& LoadKeyedProperty(Register object, int feedback_slot); diff --git a/deps/v8/src/interpreter/bytecode-generator.cc b/deps/v8/src/interpreter/bytecode-generator.cc index 87c537879c5f68..6b29add333e31e 100644 --- a/deps/v8/src/interpreter/bytecode-generator.cc +++ b/deps/v8/src/interpreter/bytecode-generator.cc @@ -860,6 +860,7 @@ class BytecodeGenerator::FeedbackSlotCache : public ZoneObject { kStoreNamedStrict, kStoreNamedSloppy, kLoadProperty, + kLoadSuperProperty, kLoadGlobalNotInsideTypeof, kLoadGlobalInsideTypeof, kClosureFeedbackCell @@ -877,6 +878,9 @@ class BytecodeGenerator::FeedbackSlotCache : public ZoneObject { int slot_index) { PutImpl(slot_kind, variable_index, name, slot_index); } + void Put(SlotKind slot_kind, const AstRawString* name, int slot_index) { + PutImpl(slot_kind, 0, name, slot_index); + } int Get(SlotKind slot_kind, Variable* variable) const { return GetImpl(slot_kind, 0, variable); @@ -888,6 +892,9 @@ class BytecodeGenerator::FeedbackSlotCache : public ZoneObject { const AstRawString* name) const { return GetImpl(slot_kind, variable_index, name); } + int Get(SlotKind slot_kind, const AstRawString* name) const { + return GetImpl(slot_kind, 0, name); + } private: using Key = std::tuple; @@ -2921,6 +2928,7 @@ void BytecodeGenerator::BuildCreateArrayLiteral( // If we have a leading spread, use CreateArrayFromIterable to create // an array from it and then add the remaining components to that array. VisitForAccumulatorValue(*current); + builder()->SetExpressionPosition((*current)->AsSpread()->expression()); builder()->CreateArrayFromIterable().StoreAccumulatorInRegister(array); if (++current != end) { @@ -3021,6 +3029,7 @@ void BytecodeGenerator::BuildCreateArrayLiteral( builder()->SetExpressionAsStatementPosition( subexpr->AsSpread()->expression()); VisitForAccumulatorValue(subexpr->AsSpread()->expression()); + builder()->SetExpressionPosition(subexpr->AsSpread()->expression()); IteratorRecord iterator = BuildGetIteratorRecord(IteratorType::kNormal); Register value = register_allocator()->NewRegister(); @@ -3784,6 +3793,7 @@ void BytecodeGenerator::BuildDestructuringArrayAssignment( if (spread) { RegisterAllocationScope scope(this); + BytecodeLabel is_done; // A spread is turned into a loop over the remainer of the iterator. Expression* target = spread->expression(); @@ -3800,6 +3810,10 @@ void BytecodeGenerator::BuildDestructuringArrayAssignment( feedback_index(feedback_spec()->AddLiteralSlot())); builder()->StoreAccumulatorInRegister(array); + // If done, jump to assigning empty array + builder()->LoadAccumulatorWithRegister(done); + builder()->JumpIfTrue(ToBooleanMode::kConvertToBoolean, &is_done); + // var index = 0; Register index = register_allocator()->NewRegister(); builder()->LoadLiteral(Smi::zero()); @@ -3817,6 +3831,7 @@ void BytecodeGenerator::BuildDestructuringArrayAssignment( next_value_load_slot, next_done_load_slot, index_slot, element_slot); + builder()->Bind(&is_done); // Assign the array to the LHS. builder()->LoadAccumulatorWithRegister(array); BuildAssignment(lhs_data, op, lookup_hoisting_mode); @@ -4718,19 +4733,33 @@ void BytecodeGenerator::VisitNamedSuperPropertyLoad(Property* property, RegisterAllocationScope register_scope(this); SuperPropertyReference* super_property = property->obj()->AsSuperPropertyReference(); - RegisterList args = register_allocator()->NewRegisterList(3); - BuildThisVariableLoad(); - builder()->StoreAccumulatorInRegister(args[0]); - VisitForRegisterValue(super_property->home_object(), args[1]); + if (FLAG_super_ic) { + Register receiver = register_allocator()->NewRegister(); + BuildThisVariableLoad(); + builder()->StoreAccumulatorInRegister(receiver); + VisitForAccumulatorValue(super_property->home_object()); + builder()->SetExpressionPosition(property); + auto name = property->key()->AsLiteral()->AsRawPropertyName(); + FeedbackSlot slot = GetCachedLoadSuperICSlot(name); + builder()->LoadNamedPropertyFromSuper(receiver, name, feedback_index(slot)); + if (opt_receiver_out.is_valid()) { + builder()->MoveRegister(receiver, opt_receiver_out); + } + } else { + RegisterList args = register_allocator()->NewRegisterList(3); + BuildThisVariableLoad(); + builder()->StoreAccumulatorInRegister(args[0]); + VisitForRegisterValue(super_property->home_object(), args[1]); - builder()->SetExpressionPosition(property); - builder() - ->LoadLiteral(property->key()->AsLiteral()->AsRawPropertyName()) - .StoreAccumulatorInRegister(args[2]) - .CallRuntime(Runtime::kLoadFromSuper, args); + builder()->SetExpressionPosition(property); + builder() + ->LoadLiteral(property->key()->AsLiteral()->AsRawPropertyName()) + .StoreAccumulatorInRegister(args[2]) + .CallRuntime(Runtime::kLoadFromSuper, args); - if (opt_receiver_out.is_valid()) { - builder()->MoveRegister(args[0], opt_receiver_out); + if (opt_receiver_out.is_valid()) { + builder()->MoveRegister(args[0], opt_receiver_out); + } } } @@ -6553,6 +6582,7 @@ FeedbackSlot BytecodeGenerator::GetCachedStoreGlobalICSlot( FeedbackSlot BytecodeGenerator::GetCachedLoadICSlot(const Expression* expr, const AstRawString* name) { + DCHECK(!expr->IsSuperPropertyReference()); if (!FLAG_ignition_share_named_property_feedback) { return feedback_spec()->AddLoadICSlot(); } @@ -6573,6 +6603,23 @@ FeedbackSlot BytecodeGenerator::GetCachedLoadICSlot(const Expression* expr, return slot; } +FeedbackSlot BytecodeGenerator::GetCachedLoadSuperICSlot( + const AstRawString* name) { + if (!FLAG_ignition_share_named_property_feedback) { + return feedback_spec()->AddLoadICSlot(); + } + FeedbackSlotCache::SlotKind slot_kind = + FeedbackSlotCache::SlotKind::kLoadSuperProperty; + + FeedbackSlot slot(feedback_slot_cache()->Get(slot_kind, name)); + if (!slot.IsInvalid()) { + return slot; + } + slot = feedback_spec()->AddLoadICSlot(); + feedback_slot_cache()->Put(slot_kind, name, feedback_index(slot)); + return slot; +} + FeedbackSlot BytecodeGenerator::GetCachedStoreICSlot(const Expression* expr, const AstRawString* name) { if (!FLAG_ignition_share_named_property_feedback) { diff --git a/deps/v8/src/interpreter/bytecode-generator.h b/deps/v8/src/interpreter/bytecode-generator.h index 2b11e721fac1a3..93c422dcb7580b 100644 --- a/deps/v8/src/interpreter/bytecode-generator.h +++ b/deps/v8/src/interpreter/bytecode-generator.h @@ -422,6 +422,7 @@ class BytecodeGenerator final : public AstVisitor { Variable* variable); FeedbackSlot GetCachedLoadICSlot(const Expression* expr, const AstRawString* name); + FeedbackSlot GetCachedLoadSuperICSlot(const AstRawString* name); FeedbackSlot GetCachedStoreICSlot(const Expression* expr, const AstRawString* name); FeedbackSlot GetDummyCompareICSlot(); diff --git a/deps/v8/src/interpreter/bytecode-register.cc b/deps/v8/src/interpreter/bytecode-register.cc index 4e56c3b411c534..13d831e8b75450 100644 --- a/deps/v8/src/interpreter/bytecode-register.cc +++ b/deps/v8/src/interpreter/bytecode-register.cc @@ -37,7 +37,7 @@ static const int kBytecodeOffsetRegisterIndex = kSystemPointerSize; static const int kCallerPCOffsetRegisterIndex = (InterpreterFrameConstants::kRegisterFileFromFp - - InterpreterFrameConstants::kCallerPCOffsetFromFp) / + InterpreterFrameConstants::kCallerPCOffset) / kSystemPointerSize; Register Register::FromParameterIndex(int index, int parameter_count) { diff --git a/deps/v8/src/interpreter/bytecodes.h b/deps/v8/src/interpreter/bytecodes.h index 0b638418d13d07..fe22559f181406 100644 --- a/deps/v8/src/interpreter/bytecodes.h +++ b/deps/v8/src/interpreter/bytecodes.h @@ -100,6 +100,8 @@ namespace interpreter { OperandType::kIdx, OperandType::kIdx) \ V(LdaNamedPropertyNoFeedback, AccumulatorUse::kWrite, OperandType::kReg, \ OperandType::kIdx) \ + V(LdaNamedPropertyFromSuper, AccumulatorUse::kReadWrite, OperandType::kReg, \ + OperandType::kIdx, OperandType::kIdx) \ V(LdaKeyedProperty, AccumulatorUse::kReadWrite, OperandType::kReg, \ OperandType::kIdx) \ \ diff --git a/deps/v8/src/interpreter/interpreter-generator.cc b/deps/v8/src/interpreter/interpreter-generator.cc index c4ca458a8855cb..b3ca4a1b9c868a 100644 --- a/deps/v8/src/interpreter/interpreter-generator.cc +++ b/deps/v8/src/interpreter/interpreter-generator.cc @@ -27,7 +27,7 @@ #include "src/objects/shared-function-info.h" #include "src/objects/source-text-module.h" #include "src/utils/ostreams.h" -#include "torque-generated/exported-macros-assembler-tq.h" +#include "torque-generated/exported-macros-assembler.h" namespace v8 { namespace internal { @@ -539,9 +539,10 @@ IGNITION_HANDLER(LdaNamedProperty, InterpreterAssembler) { } } -// LdaPropertyNofeedback +// LdaNamedPropertyNoFeedback // -// Calls the GetProperty builtin for and the key in the accumulator. +// Calls the GetProperty builtin for and the name at +// constant pool entry . IGNITION_HANDLER(LdaNamedPropertyNoFeedback, InterpreterAssembler) { TNode object = LoadRegisterAtOperandIndex(0); TNode name = CAST(LoadConstantPoolEntryAtOperandIndex(1)); @@ -552,7 +553,28 @@ IGNITION_HANDLER(LdaNamedPropertyNoFeedback, InterpreterAssembler) { Dispatch(); } -// KeyedLoadIC +// LdaNamedPropertyFromSuper +// +// Calls the LoadSuperIC at FeedBackVector slot for , home +// object's prototype (home object in the accumulator) and the name at constant +// pool entry . +IGNITION_HANDLER(LdaNamedPropertyFromSuper, InterpreterAssembler) { + TNode receiver = LoadRegisterAtOperandIndex(0); + TNode home_object = CAST(GetAccumulator()); + TNode home_object_prototype = LoadMapPrototype(LoadMap(home_object)); + TNode name = LoadConstantPoolEntryAtOperandIndex(1); + TNode slot = BytecodeOperandIdxTaggedIndex(2); + TNode feedback_vector = LoadFeedbackVector(); + TNode context = GetContext(); + + TNode result = + CallBuiltin(Builtins::kLoadSuperIC, context, receiver, + home_object_prototype, name, slot, feedback_vector); + SetAccumulator(result); + Dispatch(); +} + +// LdaKeyedProperty // // Calls the KeyedLoadIC at FeedBackVector slot for and the key // in the accumulator. @@ -684,7 +706,7 @@ IGNITION_HANDLER(StaInArrayLiteral, InterpreterAssembler) { Dispatch(); } -// StaDataPropertyInLiteral +// StaDataPropertyInLiteral // // Define a property with value from the accumulator in . // Property attributes and whether set_function_name are stored in diff --git a/deps/v8/src/interpreter/interpreter-intrinsics-generator.cc b/deps/v8/src/interpreter/interpreter-intrinsics-generator.cc index f67e78b3b267db..03ca61de527675 100644 --- a/deps/v8/src/interpreter/interpreter-intrinsics-generator.cc +++ b/deps/v8/src/interpreter/interpreter-intrinsics-generator.cc @@ -213,7 +213,7 @@ TNode IntrinsicsGenerator::HasProperty( args, context, Builtins::CallableFor(isolate(), Builtins::kHasProperty)); } -TNode IntrinsicsGenerator::ToStringRT( +TNode IntrinsicsGenerator::ToString( const InterpreterAssembler::RegListNodePair& args, TNode context) { return IntrinsicAsStubCall( args, context, Builtins::CallableFor(isolate(), Builtins::kToString)); diff --git a/deps/v8/src/interpreter/interpreter-intrinsics.h b/deps/v8/src/interpreter/interpreter-intrinsics.h index 6cb24835334c7a..07c60270c2af10 100644 --- a/deps/v8/src/interpreter/interpreter-intrinsics.h +++ b/deps/v8/src/interpreter/interpreter-intrinsics.h @@ -36,7 +36,7 @@ namespace interpreter { V(IsArray, is_array, 1) \ V(IsJSReceiver, is_js_receiver, 1) \ V(IsSmi, is_smi, 1) \ - V(ToStringRT, to_string, 1) \ + V(ToString, to_string, 1) \ V(ToLength, to_length, 1) \ V(ToObject, to_object, 1) diff --git a/deps/v8/src/interpreter/interpreter.cc b/deps/v8/src/interpreter/interpreter.cc index 9707ef60ce45b0..28dd10a576d5f7 100644 --- a/deps/v8/src/interpreter/interpreter.cc +++ b/deps/v8/src/interpreter/interpreter.cc @@ -250,7 +250,7 @@ InterpreterCompilationJob::Status InterpreterCompilationJob::DoFinalizeJobImpl( SourcePositionTableBuilder::RecordingMode::RECORD_SOURCE_POSITIONS) { Handle source_position_table = generator()->FinalizeSourcePositionTable(isolate); - bytecodes->set_source_position_table(*source_position_table); + bytecodes->set_synchronized_source_position_table(*source_position_table); } if (ShouldPrintBytecode(shared_info)) { @@ -286,7 +286,7 @@ Interpreter::NewSourcePositionCollectionJob( auto job = std::make_unique(parse_info, literal, allocator, nullptr); job->compilation_info()->SetBytecodeArray(existing_bytecode); - return std::unique_ptr { static_cast(job.release()) }; + return job; } void Interpreter::ForEachBytecode( diff --git a/deps/v8/src/libplatform/OWNERS b/deps/v8/src/libplatform/OWNERS index 8c766ab2827cf3..7ec6602147c088 100644 --- a/deps/v8/src/libplatform/OWNERS +++ b/deps/v8/src/libplatform/OWNERS @@ -1,3 +1,4 @@ mlippautz@chromium.org +ulan@chromium.org # COMPONENT: Blink>JavaScript>API diff --git a/deps/v8/src/libplatform/default-job.cc b/deps/v8/src/libplatform/default-job.cc index 7f750f185f6961..728c1f5b28cd23 100644 --- a/deps/v8/src/libplatform/default-job.cc +++ b/deps/v8/src/libplatform/default-job.cc @@ -4,8 +4,38 @@ #include "src/libplatform/default-job.h" +#include "src/base/bits.h" +#include "src/base/macros.h" + namespace v8 { namespace platform { +namespace { + +// Capped to allow assigning task_ids from a bitfield. +constexpr size_t kMaxWorkersPerJob = 32; + +} // namespace + +DefaultJobState::JobDelegate::~JobDelegate() { + static_assert(kInvalidTaskId >= kMaxWorkersPerJob, + "kInvalidTaskId must be outside of the range of valid task_ids " + "[0, kMaxWorkersPerJob)"); + if (task_id_ != kInvalidTaskId) outer_->ReleaseTaskId(task_id_); +} + +uint8_t DefaultJobState::JobDelegate::GetTaskId() { + if (task_id_ == kInvalidTaskId) task_id_ = outer_->AcquireTaskId(); + return task_id_; +} + +DefaultJobState::DefaultJobState(Platform* platform, + std::unique_ptr job_task, + TaskPriority priority, + size_t num_worker_threads) + : platform_(platform), + job_task_(std::move(job_task)), + priority_(priority), + num_worker_threads_(std::min(num_worker_threads, kMaxWorkersPerJob)) {} DefaultJobState::~DefaultJobState() { DCHECK_EQ(0U, active_workers_); } @@ -13,22 +43,55 @@ void DefaultJobState::NotifyConcurrencyIncrease() { if (is_canceled_.load(std::memory_order_relaxed)) return; size_t num_tasks_to_post = 0; + TaskPriority priority; { base::MutexGuard guard(&mutex_); - const size_t max_concurrency = CappedMaxConcurrency(); + const size_t max_concurrency = CappedMaxConcurrency(active_workers_); // Consider |pending_tasks_| to avoid posting too many tasks. if (max_concurrency > (active_workers_ + pending_tasks_)) { num_tasks_to_post = max_concurrency - active_workers_ - pending_tasks_; pending_tasks_ += num_tasks_to_post; } + priority = priority_; } // Post additional worker tasks to reach |max_concurrency|. for (size_t i = 0; i < num_tasks_to_post; ++i) { - CallOnWorkerThread(std::make_unique(shared_from_this(), - job_task_.get())); + CallOnWorkerThread(priority, std::make_unique( + shared_from_this(), job_task_.get())); } } +uint8_t DefaultJobState::AcquireTaskId() { + static_assert(kMaxWorkersPerJob <= sizeof(assigned_task_ids_) * 8, + "TaskId bitfield isn't big enough to fit kMaxWorkersPerJob."); + uint32_t assigned_task_ids = + assigned_task_ids_.load(std::memory_order_relaxed); + DCHECK_LE(v8::base::bits::CountPopulation(assigned_task_ids) + 1, + kMaxWorkersPerJob); + uint32_t new_assigned_task_ids = 0; + uint8_t task_id = 0; + // memory_order_acquire on success, matched with memory_order_release in + // ReleaseTaskId() so that operations done by previous threads that had + // the same task_id become visible to the current thread. + do { + // Count trailing one bits. This is the id of the right-most 0-bit in + // |assigned_task_ids|. + task_id = v8::base::bits::CountTrailingZeros32(~assigned_task_ids); + new_assigned_task_ids = assigned_task_ids | (uint32_t(1) << task_id); + } while (!assigned_task_ids_.compare_exchange_weak( + assigned_task_ids, new_assigned_task_ids, std::memory_order_acquire, + std::memory_order_relaxed)); + return task_id; +} + +void DefaultJobState::ReleaseTaskId(uint8_t task_id) { + // memory_order_release to match AcquireTaskId(). + uint32_t previous_task_ids = assigned_task_ids_.fetch_and( + ~(uint32_t(1) << task_id), std::memory_order_release); + DCHECK(previous_task_ids & (uint32_t(1) << task_id)); + USE(previous_task_ids); +} + void DefaultJobState::Join() { bool can_run = false; { @@ -41,8 +104,9 @@ void DefaultJobState::Join() { ++active_workers_; can_run = WaitForParticipationOpportunityLockRequired(); } + DefaultJobState::JobDelegate delegate(this, true); while (can_run) { - job_task_->Run(this); + job_task_->Run(&delegate); base::MutexGuard guard(&mutex_); can_run = WaitForParticipationOpportunityLockRequired(); } @@ -58,12 +122,18 @@ void DefaultJobState::CancelAndWait() { } } +bool DefaultJobState::IsCompleted() { + base::MutexGuard guard(&mutex_); + return job_task_->GetMaxConcurrency(active_workers_) == 0 && + active_workers_ == 0; +} + bool DefaultJobState::CanRunFirstTask() { base::MutexGuard guard(&mutex_); --pending_tasks_; if (is_canceled_.load(std::memory_order_relaxed)) return false; - if (active_workers_ >= - std::min(job_task_->GetMaxConcurrency(), num_worker_threads_)) { + if (active_workers_ >= std::min(job_task_->GetMaxConcurrency(active_workers_), + num_worker_threads_)) { return false; } // Acquire current worker. @@ -73,9 +143,10 @@ bool DefaultJobState::CanRunFirstTask() { bool DefaultJobState::DidRunTask() { size_t num_tasks_to_post = 0; + TaskPriority priority; { base::MutexGuard guard(&mutex_); - const size_t max_concurrency = CappedMaxConcurrency(); + const size_t max_concurrency = CappedMaxConcurrency(active_workers_ - 1); if (is_canceled_.load(std::memory_order_relaxed) || active_workers_ > max_concurrency) { // Release current worker and notify. @@ -88,6 +159,7 @@ bool DefaultJobState::DidRunTask() { num_tasks_to_post = max_concurrency - active_workers_ - pending_tasks_; pending_tasks_ += num_tasks_to_post; } + priority = priority_; } // Post additional worker tasks to reach |max_concurrency| in the case that // max concurrency increased. This is not strictly necessary, since @@ -95,17 +167,17 @@ bool DefaultJobState::DidRunTask() { // users of PostJob() batch work and tend to call NotifyConcurrencyIncrease() // late. Posting here allows us to spawn new workers sooner. for (size_t i = 0; i < num_tasks_to_post; ++i) { - CallOnWorkerThread(std::make_unique(shared_from_this(), - job_task_.get())); + CallOnWorkerThread(priority, std::make_unique( + shared_from_this(), job_task_.get())); } return true; } bool DefaultJobState::WaitForParticipationOpportunityLockRequired() { - size_t max_concurrency = CappedMaxConcurrency(); + size_t max_concurrency = CappedMaxConcurrency(active_workers_ - 1); while (active_workers_ > max_concurrency && active_workers_ > 1) { worker_released_condition_.Wait(&mutex_); - max_concurrency = CappedMaxConcurrency(); + max_concurrency = CappedMaxConcurrency(active_workers_ - 1); } if (active_workers_ <= max_concurrency) return true; DCHECK_EQ(1U, active_workers_); @@ -115,12 +187,14 @@ bool DefaultJobState::WaitForParticipationOpportunityLockRequired() { return false; } -size_t DefaultJobState::CappedMaxConcurrency() const { - return std::min(job_task_->GetMaxConcurrency(), num_worker_threads_); +size_t DefaultJobState::CappedMaxConcurrency(size_t worker_count) const { + return std::min(job_task_->GetMaxConcurrency(worker_count), + num_worker_threads_); } -void DefaultJobState::CallOnWorkerThread(std::unique_ptr task) { - switch (priority_) { +void DefaultJobState::CallOnWorkerThread(TaskPriority priority, + std::unique_ptr task) { + switch (priority) { case TaskPriority::kBestEffort: return platform_->CallLowPriorityTaskOnWorkerThread(std::move(task)); case TaskPriority::kUserVisible: @@ -146,5 +220,7 @@ void DefaultJobHandle::Cancel() { state_ = nullptr; } +bool DefaultJobHandle::IsCompleted() { return state_->IsCompleted(); } + } // namespace platform } // namespace v8 diff --git a/deps/v8/src/libplatform/default-job.h b/deps/v8/src/libplatform/default-job.h index 2eb00cbd7485ff..15517f49ac35d2 100644 --- a/deps/v8/src/libplatform/default-job.h +++ b/deps/v8/src/libplatform/default-job.h @@ -17,25 +17,44 @@ namespace v8 { namespace platform { class V8_PLATFORM_EXPORT DefaultJobState - : NON_EXPORTED_BASE(public JobDelegate), - public std::enable_shared_from_this { + : public std::enable_shared_from_this { public: + class JobDelegate : public v8::JobDelegate { + public: + explicit JobDelegate(DefaultJobState* outer, bool is_joining_thread = false) + : outer_(outer), is_joining_thread_(is_joining_thread) {} + ~JobDelegate(); + + void NotifyConcurrencyIncrease() override { + outer_->NotifyConcurrencyIncrease(); + } + bool ShouldYield() override { + // Thread-safe but may return an outdated result. + return outer_->is_canceled_.load(std::memory_order_relaxed); + } + uint8_t GetTaskId() override; + bool IsJoiningThread() const override { return is_joining_thread_; } + + private: + static constexpr uint8_t kInvalidTaskId = + std::numeric_limits::max(); + + DefaultJobState* outer_; + uint8_t task_id_ = kInvalidTaskId; + bool is_joining_thread_; + }; + DefaultJobState(Platform* platform, std::unique_ptr job_task, - TaskPriority priority, size_t num_worker_threads) - : platform_(platform), - job_task_(std::move(job_task)), - priority_(priority), - num_worker_threads_(num_worker_threads) {} + TaskPriority priority, size_t num_worker_threads); virtual ~DefaultJobState(); - void NotifyConcurrencyIncrease() override; - bool ShouldYield() override { - // Thread-safe but may return an outdated result. - return is_canceled_.load(std::memory_order_relaxed); - } + void NotifyConcurrencyIncrease(); + uint8_t AcquireTaskId(); + void ReleaseTaskId(uint8_t task_id); void Join(); void CancelAndWait(); + bool IsCompleted(); // Must be called before running |job_task_| for the first time. If it returns // true, then the worker thread must contribute and must call DidRunTask(), or @@ -55,9 +74,9 @@ class V8_PLATFORM_EXPORT DefaultJobState // Returns GetMaxConcurrency() capped by the number of threads used by this // job. - size_t CappedMaxConcurrency() const; + size_t CappedMaxConcurrency(size_t worker_count) const; - void CallOnWorkerThread(std::unique_ptr task); + void CallOnWorkerThread(TaskPriority priority, std::unique_ptr task); Platform* const platform_; std::unique_ptr job_task_; @@ -75,6 +94,8 @@ class V8_PLATFORM_EXPORT DefaultJobState size_t num_worker_threads_; // Signaled when a worker returns. base::ConditionVariable worker_released_condition_; + + std::atomic assigned_task_ids_{0}; }; class V8_PLATFORM_EXPORT DefaultJobHandle : public JobHandle { @@ -88,6 +109,7 @@ class V8_PLATFORM_EXPORT DefaultJobHandle : public JobHandle { void Join() override; void Cancel() override; + bool IsCompleted() override; bool IsRunning() override { return state_ != nullptr; } private: @@ -105,9 +127,10 @@ class DefaultJobWorker : public Task { void Run() override { auto shared_state = state_.lock(); if (!shared_state) return; + DefaultJobState::JobDelegate delegate(shared_state.get()); if (!shared_state->CanRunFirstTask()) return; do { - job_task_->Run(shared_state.get()); + job_task_->Run(&delegate); } while (shared_state->DidRunTask()); } diff --git a/deps/v8/src/libsampler/sampler.cc b/deps/v8/src/libsampler/sampler.cc index 0443657d1e7e92..9631d2f478a378 100644 --- a/deps/v8/src/libsampler/sampler.cc +++ b/deps/v8/src/libsampler/sampler.cc @@ -227,6 +227,7 @@ void SamplerManager::RemoveSampler(Sampler* sampler) { void SamplerManager::DoSample(const v8::RegisterState& state) { AtomicGuard atomic_guard(&samplers_access_counter_, false); + // TODO(petermarshall): Add stat counters for the bailouts here. if (!atomic_guard.is_success()) return; pthread_t thread_id = pthread_self(); auto it = sampler_map_.find(thread_id); @@ -238,7 +239,6 @@ void SamplerManager::DoSample(const v8::RegisterState& state) { Isolate* isolate = sampler->isolate(); // We require a fully initialized and entered isolate. if (isolate == nullptr || !isolate->IsInUse()) continue; - if (v8::Locker::IsActive() && !Locker::IsLocked(isolate)) continue; sampler->SampleStack(state); } } diff --git a/deps/v8/src/logging/code-events.h b/deps/v8/src/logging/code-events.h index f27b0d16e53422..b3fb96005277ff 100644 --- a/deps/v8/src/logging/code-events.h +++ b/deps/v8/src/logging/code-events.h @@ -94,7 +94,6 @@ class CodeEventListener { // Not handlified as this happens during GC. No allocation allowed. virtual void CodeMoveEvent(AbstractCode from, AbstractCode to) = 0; virtual void SharedFunctionInfoMoveEvent(Address from, Address to) = 0; - virtual void NativeContextMoveEvent(Address from, Address to) = 0; virtual void CodeMovingGCEvent() = 0; virtual void CodeDisableOptEvent(Handle code, Handle shared) = 0; @@ -205,11 +204,6 @@ class CodeEventDispatcher : public CodeEventListener { listener->SharedFunctionInfoMoveEvent(from, to); }); } - void NativeContextMoveEvent(Address from, Address to) override { - DispatchEventToListeners([=](CodeEventListener* listener) { - listener->NativeContextMoveEvent(from, to); - }); - } void CodeMovingGCEvent() override { DispatchEventToListeners( [](CodeEventListener* listener) { listener->CodeMovingGCEvent(); }); diff --git a/deps/v8/src/logging/counters.cc b/deps/v8/src/logging/counters.cc index 386bb8a75a102d..986848361ebfa5 100644 --- a/deps/v8/src/logging/counters.cc +++ b/deps/v8/src/logging/counters.cc @@ -557,6 +557,17 @@ void RuntimeCallStats::Print(std::ostream& os) { entries.Print(os); } +void RuntimeCallStats::EnumerateCounters( + debug::RuntimeCallCounterCallback callback) { + if (current_timer_.Value() != nullptr) { + current_timer_.Value()->Snapshot(); + } + for (int i = 0; i < kNumberOfCounters; i++) { + RuntimeCallCounter* counter = GetCounter(i); + callback(counter->name(), counter->count(), counter->time()); + } +} + void RuntimeCallStats::Reset() { if (V8_LIKELY(!TracingFlags::is_runtime_stats_enabled())) return; diff --git a/deps/v8/src/logging/counters.h b/deps/v8/src/logging/counters.h index de583dde82f50c..b1b61aca0a56d1 100644 --- a/deps/v8/src/logging/counters.h +++ b/deps/v8/src/logging/counters.h @@ -13,6 +13,7 @@ #include "src/base/platform/elapsed-timer.h" #include "src/base/platform/time.h" #include "src/common/globals.h" +#include "src/debug/debug-interface.h" #include "src/execution/isolate.h" #include "src/init/heap-symbols.h" #include "src/logging/counters-definitions.h" @@ -926,7 +927,6 @@ class RuntimeCallTimer final { ADD_THREAD_SPECIFIC_COUNTER(V, Optimize, MachineOperatorOptimization) \ ADD_THREAD_SPECIFIC_COUNTER(V, Optimize, MeetRegisterConstraints) \ ADD_THREAD_SPECIFIC_COUNTER(V, Optimize, MemoryOptimization) \ - ADD_THREAD_SPECIFIC_COUNTER(V, Optimize, MergeSplinteredRanges) \ ADD_THREAD_SPECIFIC_COUNTER(V, Optimize, OptimizeMoves) \ ADD_THREAD_SPECIFIC_COUNTER(V, Optimize, PopulatePointerMaps) \ ADD_THREAD_SPECIFIC_COUNTER(V, Optimize, PrintGraph) \ @@ -938,7 +938,6 @@ class RuntimeCallTimer final { ADD_THREAD_SPECIFIC_COUNTER(V, Optimize, Scheduling) \ ADD_THREAD_SPECIFIC_COUNTER(V, Optimize, SelectInstructions) \ ADD_THREAD_SPECIFIC_COUNTER(V, Optimize, SimplifiedLowering) \ - ADD_THREAD_SPECIFIC_COUNTER(V, Optimize, SplinterLiveRanges) \ ADD_THREAD_SPECIFIC_COUNTER(V, Optimize, StoreStoreElimination) \ ADD_THREAD_SPECIFIC_COUNTER(V, Optimize, TypeAssertions) \ ADD_THREAD_SPECIFIC_COUNTER(V, Optimize, TypedLowering) \ @@ -1146,6 +1145,9 @@ class RuntimeCallStats final { V8_EXPORT_PRIVATE void Print(); V8_NOINLINE void Dump(v8::tracing::TracedValue* value); + V8_EXPORT_PRIVATE void EnumerateCounters( + debug::RuntimeCallCounterCallback callback); + ThreadId thread_id() const { return thread_id_; } RuntimeCallTimer* current_timer() { return current_timer_.Value(); } RuntimeCallCounter* current_counter() { return current_counter_.Value(); } diff --git a/deps/v8/src/logging/log-utils.cc b/deps/v8/src/logging/log-utils.cc index 8d21d5f32975a3..aaf7a3761834a4 100644 --- a/deps/v8/src/logging/log-utils.cc +++ b/deps/v8/src/logging/log-utils.cc @@ -4,6 +4,10 @@ #include "src/logging/log-utils.h" +#include +#include + +#include "src/base/platform/mutex.h" #include "src/base/platform/platform.h" #include "src/common/assert-scope.h" #include "src/objects/objects-inl.h" @@ -15,43 +19,43 @@ namespace v8 { namespace internal { -const char* const Log::kLogToTemporaryFile = "&"; +const char* const Log::kLogToTemporaryFile = "+"; const char* const Log::kLogToConsole = "-"; // static -FILE* Log::CreateOutputHandle(const char* file_name) { +FILE* Log::CreateOutputHandle(std::string file_name) { // If we're logging anything, we need to open the log file. if (!Log::InitLogAtStart()) { return nullptr; - } else if (strcmp(file_name, kLogToConsole) == 0) { + } else if (Log::IsLoggingToConsole(file_name)) { return stdout; - } else if (strcmp(file_name, kLogToTemporaryFile) == 0) { + } else if (Log::IsLoggingToTemporaryFile(file_name)) { return base::OS::OpenTemporaryFile(); } else { - return base::OS::FOpen(file_name, base::OS::LogFileOpenMode); + return base::OS::FOpen(file_name.c_str(), base::OS::LogFileOpenMode); } } -Log::Log(Logger* logger, const char* file_name) - : is_stopped_(false), +// static +bool Log::IsLoggingToConsole(std::string file_name) { + return file_name.compare(Log::kLogToConsole) == 0; +} + +// static +bool Log::IsLoggingToTemporaryFile(std::string file_name) { + return file_name.compare(Log::kLogToTemporaryFile) == 0; +} + +Log::Log(Logger* logger, std::string file_name) + : logger_(logger), + file_name_(file_name), output_handle_(Log::CreateOutputHandle(file_name)), os_(output_handle_ == nullptr ? stdout : output_handle_), - format_buffer_(NewArray(kMessageBufferSize)), - logger_(logger) { - // --log-all enables all the log flags. - if (FLAG_log_all) { - FLAG_log_api = true; - FLAG_log_code = true; - FLAG_log_suspect = true; - FLAG_log_handles = true; - FLAG_log_internal_timer_events = true; - FLAG_log_function_events = true; - } - - // --prof implies --log-code. - if (FLAG_prof) FLAG_log_code = true; + format_buffer_(NewArray(kMessageBufferSize)) { + if (output_handle_) WriteLogHeader(); +} - if (output_handle_ == nullptr) return; +void Log::WriteLogHeader() { Log::MessageBuilder msg(this); LogSeparator kNext = LogSeparator::kSeparator; msg << "v8-version" << kNext << Version::GetMajor() << kNext @@ -64,26 +68,37 @@ Log::Log(Logger* logger, const char* file_name) msg.WriteToLogFile(); } +std::unique_ptr Log::NewMessageBuilder() { + // Fast check of is_logging() without taking the lock. Bail out immediately if + // logging isn't enabled. + if (!logger_->is_logging()) return {}; + + std::unique_ptr result(new Log::MessageBuilder(this)); + + // The first invocation of is_logging() might still read an old value. It is + // fine if a background thread starts logging a bit later, but we want to + // avoid background threads continue logging after logging was already closed. + if (!logger_->is_logging()) return {}; + DCHECK_NOT_NULL(format_buffer_.get()); + + return result; +} + FILE* Log::Close() { FILE* result = nullptr; if (output_handle_ != nullptr) { - if (strcmp(FLAG_logfile, kLogToTemporaryFile) != 0) { - fclose(output_handle_); - } else { - result = output_handle_; - } + fflush(output_handle_); + result = output_handle_; } output_handle_ = nullptr; - format_buffer_.reset(); - - is_stopped_ = false; return result; } +std::string Log::file_name() const { return file_name_; } + Log::MessageBuilder::MessageBuilder(Log* log) : log_(log), lock_guard_(&log_->mutex_) { - DCHECK_NOT_NULL(log_->format_buffer_.get()); } void Log::MessageBuilder::AppendString(String str, @@ -113,12 +128,19 @@ void Log::MessageBuilder::AppendString(const char* str) { AppendString(str, strlen(str)); } -void Log::MessageBuilder::AppendString(const char* str, size_t length) { +void Log::MessageBuilder::AppendString(const char* str, size_t length, + bool is_one_byte) { if (str == nullptr) return; - - for (size_t i = 0; i < length; i++) { - DCHECK_NE(str[i], '\0'); - AppendCharacter(str[i]); + if (is_one_byte) { + for (size_t i = 0; i < length; i++) { + DCHECK_IMPLIES(is_one_byte, str[i] != '\0'); + AppendCharacter(str[i]); + } + } else { + DCHECK_EQ(length % 2, 0); + for (size_t i = 0; i + 1 < length; i += 2) { + AppendTwoByteCharacter(str[i], str[i + 1]); + } } } @@ -133,6 +155,14 @@ void Log::MessageBuilder::AppendFormatString(const char* format, ...) { } } +void Log::MessageBuilder::AppendTwoByteCharacter(char c1, char c2) { + if (c2 == 0) { + AppendCharacter(c1); + } else { + // Escape non-printable characters. + AppendRawFormatString("\\u%02x%02x", c1 & 0xFF, c2 & 0xFF); + } +} void Log::MessageBuilder::AppendCharacter(char c) { if (c >= 32 && c <= 126) { if (c == ',') { @@ -206,7 +236,9 @@ void Log::MessageBuilder::AppendRawFormatString(const char* format, ...) { void Log::MessageBuilder::AppendRawCharacter(char c) { log_->os_ << c; } -void Log::MessageBuilder::WriteToLogFile() { log_->os_ << std::endl; } +void Log::MessageBuilder::WriteToLogFile() { + log_->os_ << std::endl; +} template <> Log::MessageBuilder& Log::MessageBuilder::operator<<( diff --git a/deps/v8/src/logging/log-utils.h b/deps/v8/src/logging/log-utils.h index 14395de84e04e1..47abf927f1d200 100644 --- a/deps/v8/src/logging/log-utils.h +++ b/deps/v8/src/logging/log-utils.h @@ -7,7 +7,9 @@ #include +#include #include +#include #include "src/base/compiler-specific.h" #include "src/base/optional.h" @@ -28,26 +30,26 @@ enum class LogSeparator { kSeparator }; // Functions and data for performing output of log messages. class Log { public: - Log(Logger* log, const char* log_file_name); - // Disables logging, but preserves acquired resources. - void stop() { is_stopped_ = true; } + explicit Log(Logger* logger, std::string log_file_name); static bool InitLogAtStart() { - return FLAG_log || FLAG_log_api || FLAG_log_code || FLAG_log_handles || - FLAG_log_suspect || FLAG_ll_prof || FLAG_perf_basic_prof || - FLAG_perf_prof || FLAG_log_source_code || FLAG_gdbjit || - FLAG_log_internal_timer_events || FLAG_prof_cpp || FLAG_trace_ic || - FLAG_log_function_events || FLAG_trace_zone_stats || + return FLAG_log || FLAG_log_all || FLAG_log_api || FLAG_log_code || + FLAG_log_handles || FLAG_log_suspect || FLAG_ll_prof || + FLAG_perf_basic_prof || FLAG_perf_prof || FLAG_log_source_code || + FLAG_gdbjit || FLAG_log_internal_timer_events || FLAG_prof_cpp || + FLAG_trace_ic || FLAG_log_function_events || FLAG_trace_zone_stats || FLAG_turbo_profiling_log_builtins; } + V8_EXPORT_PRIVATE static bool IsLoggingToConsole(std::string file_name); + V8_EXPORT_PRIVATE static bool IsLoggingToTemporaryFile(std::string file_name); + // Frees all resources acquired in Initialize and Open... functions. // When a temporary file is used for the log, returns its stream descriptor, // leaving the file open. FILE* Close(); - // Returns whether logging is enabled. - bool IsEnabled() { return !is_stopped_ && output_handle_ != nullptr; } + std::string file_name() const; // Size of buffer used for formatting log messages. static const int kMessageBufferSize = 2048; @@ -61,18 +63,16 @@ class Log { // and then appends them to the static buffer in Log. class MessageBuilder { public: - // Create a message builder starting from position 0. - // This acquires the mutex in the log as well. - explicit MessageBuilder(Log* log); ~MessageBuilder() = default; void AppendString(String str, base::Optional length_limit = base::nullopt); void AppendString(Vector str); void AppendString(const char* str); - void AppendString(const char* str, size_t length); + void AppendString(const char* str, size_t length, bool is_one_byte = true); void PRINTF_FORMAT(2, 3) AppendFormatString(const char* format, ...); void AppendCharacter(char c); + void AppendTwoByteCharacter(char c1, char c2); void AppendSymbolName(Symbol symbol); // Delegate insertion to the underlying {log_}. @@ -87,6 +87,10 @@ class Log { void WriteToLogFile(); private: + // Create a message builder starting from position 0. + // This acquires the mutex in the log as well. + explicit MessageBuilder(Log* log); + // Prints the format string into |log_->format_buffer_|. Returns the length // of the result, or kMessageBufferSize if it was truncated. int PRINTF_FORMAT(2, 0) @@ -99,25 +103,28 @@ class Log { Log* log_; base::MutexGuard lock_guard_; + + friend class Log; }; + // Use this method to create an instance of Log::MessageBuilder. This method + // will return null if logging is disabled. + std::unique_ptr NewMessageBuilder(); + private: - static FILE* CreateOutputHandle(const char* file_name); - - // Implementation of writing to a log file. - int WriteToFile(const char* msg, int length) { - DCHECK_NOT_NULL(output_handle_); - os_.write(msg, length); - DCHECK(!os_.bad()); - return length; - } + static FILE* CreateOutputHandle(std::string file_name); + base::Mutex* mutex() { return &mutex_; } + + void WriteLogHeader(); + + Logger* logger_; - // Whether logging is stopped (e.g. due to insufficient resources). - bool is_stopped_; + std::string file_name_; // When logging is active output_handle_ is used to store a pointer to log // destination. mutex_ should be acquired before using output_handle_. FILE* output_handle_; + OFStream os_; // mutex_ is a Mutex used for enforcing exclusive @@ -128,8 +135,6 @@ class Log { // mutex_ should be acquired before using it. std::unique_ptr format_buffer_; - Logger* logger_; - friend class Logger; }; diff --git a/deps/v8/src/logging/log.cc b/deps/v8/src/logging/log.cc index 4f4e31ffb4dd07..efd7c2b5f30336 100644 --- a/deps/v8/src/logging/log.cc +++ b/deps/v8/src/logging/log.cc @@ -4,11 +4,13 @@ #include "src/logging/log.h" +#include #include #include #include #include "src/api/api-inl.h" +#include "src/base/platform/mutex.h" #include "src/base/platform/platform.h" #include "src/builtins/profile-data-reader.h" #include "src/codegen/bailout-reason.h" @@ -18,6 +20,7 @@ #include "src/diagnostics/perf-jit.h" #include "src/execution/isolate.h" #include "src/execution/runtime-profiler.h" +#include "src/execution/v8threads.h" #include "src/execution/vm-state-inl.h" #include "src/handles/global-handles.h" #include "src/heap/combined-heap.h" @@ -881,7 +884,8 @@ class Ticker : public sampler::Sampler { Ticker(Isolate* isolate, int interval_microseconds) : sampler::Sampler(reinterpret_cast(isolate)), sampling_thread_( - std::make_unique(this, interval_microseconds)) {} + std::make_unique(this, interval_microseconds)), + threadId_(ThreadId::Current()) {} ~Ticker() override { if (IsActive()) Stop(); @@ -903,6 +907,9 @@ class Ticker : public sampler::Sampler { void SampleStack(const v8::RegisterState& state) override { if (!profiler_) return; Isolate* isolate = reinterpret_cast(this->isolate()); + if (v8::Locker::IsActive() && + !isolate->thread_manager()->IsLockedByThread(threadId_)) + return; TickSample sample; sample.Init(isolate, state, TickSample::kIncludeCEntryFrame, true); profiler_->Insert(&sample); @@ -911,6 +918,7 @@ class Ticker : public sampler::Sampler { private: Profiler* profiler_ = nullptr; std::unique_ptr sampling_thread_; + ThreadId threadId_; }; // @@ -993,8 +1001,9 @@ void Logger::RemoveCodeEventListener(CodeEventListener* listener) { } void Logger::ProfilerBeginEvent() { - if (!log_->IsEnabled()) return; - Log::MessageBuilder msg(log_.get()); + std::unique_ptr msg_ptr = log_->NewMessageBuilder(); + if (!msg_ptr) return; + Log::MessageBuilder& msg = *msg_ptr.get(); msg << "profiler" << kNext << "begin" << kNext << FLAG_prof_sampling_interval; msg.WriteToLogFile(); } @@ -1004,8 +1013,9 @@ void Logger::StringEvent(const char* name, const char* value) { } void Logger::UncheckedStringEvent(const char* name, const char* value) { - if (!log_->IsEnabled()) return; - Log::MessageBuilder msg(log_.get()); + std::unique_ptr msg_ptr = log_->NewMessageBuilder(); + if (!msg_ptr) return; + Log::MessageBuilder& msg = *msg_ptr.get(); msg << name << kNext << value; msg.WriteToLogFile(); } @@ -1015,23 +1025,28 @@ void Logger::IntPtrTEvent(const char* name, intptr_t value) { } void Logger::UncheckedIntPtrTEvent(const char* name, intptr_t value) { - if (!log_->IsEnabled()) return; - Log::MessageBuilder msg(log_.get()); + std::unique_ptr msg_ptr = log_->NewMessageBuilder(); + if (!msg_ptr) return; + Log::MessageBuilder& msg = *msg_ptr.get(); msg << name << kNext; msg.AppendFormatString("%" V8PRIdPTR, value); msg.WriteToLogFile(); } void Logger::HandleEvent(const char* name, Address* location) { - if (!log_->IsEnabled() || !FLAG_log_handles) return; - Log::MessageBuilder msg(log_.get()); + if (!FLAG_log_handles) return; + std::unique_ptr msg_ptr = log_->NewMessageBuilder(); + if (!msg_ptr) return; + Log::MessageBuilder& msg = *msg_ptr.get(); msg << name << kNext << reinterpret_cast(location); msg.WriteToLogFile(); } void Logger::ApiSecurityCheck() { - if (!log_->IsEnabled() || !FLAG_log_api) return; - Log::MessageBuilder msg(log_.get()); + if (!FLAG_log_api) return; + std::unique_ptr msg_ptr = log_->NewMessageBuilder(); + if (!msg_ptr) return; + Log::MessageBuilder& msg = *msg_ptr.get(); msg << "api" << kNext << "check-security"; msg.WriteToLogFile(); } @@ -1039,8 +1054,10 @@ void Logger::ApiSecurityCheck() { void Logger::SharedLibraryEvent(const std::string& library_path, uintptr_t start, uintptr_t end, intptr_t aslr_slide) { - if (!log_->IsEnabled() || !FLAG_prof_cpp) return; - Log::MessageBuilder msg(log_.get()); + if (!FLAG_prof_cpp) return; + std::unique_ptr msg_ptr = log_->NewMessageBuilder(); + if (!msg_ptr) return; + Log::MessageBuilder& msg = *msg_ptr.get(); msg << "shared-library" << kNext << library_path.c_str() << kNext << reinterpret_cast(start) << kNext << reinterpret_cast(end) << kNext << aslr_slide; @@ -1048,16 +1065,18 @@ void Logger::SharedLibraryEvent(const std::string& library_path, } void Logger::CurrentTimeEvent() { - if (!log_->IsEnabled()) return; DCHECK(FLAG_log_internal_timer_events); - Log::MessageBuilder msg(log_.get()); + std::unique_ptr msg_ptr = log_->NewMessageBuilder(); + if (!msg_ptr) return; + Log::MessageBuilder& msg = *msg_ptr.get(); msg << "current-time" << kNext << timer_.Elapsed().InMicroseconds(); msg.WriteToLogFile(); } void Logger::TimerEvent(Logger::StartEnd se, const char* name) { - if (!log_->IsEnabled()) return; - Log::MessageBuilder msg(log_.get()); + std::unique_ptr msg_ptr = log_->NewMessageBuilder(); + if (!msg_ptr) return; + Log::MessageBuilder& msg = *msg_ptr.get(); switch (se) { case START: msg << "timer-event-start"; @@ -1074,16 +1093,20 @@ void Logger::TimerEvent(Logger::StartEnd se, const char* name) { void Logger::BasicBlockCounterEvent(const char* name, int block_id, uint32_t count) { - if (!log_->IsEnabled() || !FLAG_turbo_profiling_log_builtins) return; - Log::MessageBuilder msg(log_.get()); + if (!FLAG_turbo_profiling_log_builtins) return; + std::unique_ptr msg_ptr = log_->NewMessageBuilder(); + if (!msg_ptr) return; + Log::MessageBuilder& msg = *msg_ptr.get(); msg << ProfileDataFromFileConstants::kBlockCounterMarker << kNext << name << kNext << block_id << kNext << count; msg.WriteToLogFile(); } void Logger::BuiltinHashEvent(const char* name, int hash) { - if (!log_->IsEnabled() || !FLAG_turbo_profiling_log_builtins) return; - Log::MessageBuilder msg(log_.get()); + if (!FLAG_turbo_profiling_log_builtins) return; + std::unique_ptr msg_ptr = log_->NewMessageBuilder(); + if (!msg_ptr) return; + Log::MessageBuilder& msg = *msg_ptr.get(); msg << ProfileDataFromFileConstants::kBuiltinHashMarker << kNext << name << kNext << hash; msg.WriteToLogFile(); @@ -1092,7 +1115,7 @@ void Logger::BuiltinHashEvent(const char* name, int hash) { bool Logger::is_logging() { // Disable logging while the CPU profiler is running. if (isolate_->is_profiling()) return false; - return is_logging_; + return is_logging_.load(std::memory_order_relaxed); } // Instantiate template methods. @@ -1105,8 +1128,10 @@ TIMER_EVENTS_LIST(V) void Logger::ApiNamedPropertyAccess(const char* tag, JSObject holder, Object property_name) { DCHECK(property_name.IsName()); - if (!log_->IsEnabled() || !FLAG_log_api) return; - Log::MessageBuilder msg(log_.get()); + if (!FLAG_log_api) return; + std::unique_ptr msg_ptr = log_->NewMessageBuilder(); + if (!msg_ptr) return; + Log::MessageBuilder& msg = *msg_ptr.get(); msg << "api" << kNext << tag << kNext << holder.class_name() << kNext << Name::cast(property_name); msg.WriteToLogFile(); @@ -1114,38 +1139,48 @@ void Logger::ApiNamedPropertyAccess(const char* tag, JSObject holder, void Logger::ApiIndexedPropertyAccess(const char* tag, JSObject holder, uint32_t index) { - if (!log_->IsEnabled() || !FLAG_log_api) return; - Log::MessageBuilder msg(log_.get()); + if (!FLAG_log_api) return; + std::unique_ptr msg_ptr = log_->NewMessageBuilder(); + if (!msg_ptr) return; + Log::MessageBuilder& msg = *msg_ptr.get(); msg << "api" << kNext << tag << kNext << holder.class_name() << kNext << index; msg.WriteToLogFile(); } void Logger::ApiObjectAccess(const char* tag, JSObject object) { - if (!log_->IsEnabled() || !FLAG_log_api) return; - Log::MessageBuilder msg(log_.get()); + if (!FLAG_log_api) return; + std::unique_ptr msg_ptr = log_->NewMessageBuilder(); + if (!msg_ptr) return; + Log::MessageBuilder& msg = *msg_ptr.get(); msg << "api" << kNext << tag << kNext << object.class_name(); msg.WriteToLogFile(); } void Logger::ApiEntryCall(const char* name) { - if (!log_->IsEnabled() || !FLAG_log_api) return; - Log::MessageBuilder msg(log_.get()); + if (!FLAG_log_api) return; + std::unique_ptr msg_ptr = log_->NewMessageBuilder(); + if (!msg_ptr) return; + Log::MessageBuilder& msg = *msg_ptr.get(); msg << "api" << kNext << name; msg.WriteToLogFile(); } void Logger::NewEvent(const char* name, void* object, size_t size) { - if (!log_->IsEnabled() || !FLAG_log) return; - Log::MessageBuilder msg(log_.get()); + if (!FLAG_log) return; + std::unique_ptr msg_ptr = log_->NewMessageBuilder(); + if (!msg_ptr) return; + Log::MessageBuilder& msg = *msg_ptr.get(); msg << "new" << kNext << name << kNext << object << kNext << static_cast(size); msg.WriteToLogFile(); } void Logger::DeleteEvent(const char* name, void* object) { - if (!log_->IsEnabled() || !FLAG_log) return; - Log::MessageBuilder msg(log_.get()); + if (!FLAG_log) return; + std::unique_ptr msg_ptr = log_->NewMessageBuilder(); + if (!msg_ptr) return; + Log::MessageBuilder& msg = *msg_ptr.get(); msg << "delete" << kNext << name << kNext << object; msg.WriteToLogFile(); } @@ -1178,8 +1213,10 @@ void AppendCodeCreateHeader( void Logger::CodeCreateEvent(LogEventsAndTags tag, Handle code, const char* name) { if (!is_listening_to_code_events()) return; - if (!FLAG_log_code || !log_->IsEnabled()) return; - Log::MessageBuilder msg(log_.get()); + if (!FLAG_log_code) return; + std::unique_ptr msg_ptr = log_->NewMessageBuilder(); + if (!msg_ptr) return; + Log::MessageBuilder& msg = *msg_ptr.get(); AppendCodeCreateHeader(msg, tag, *code, &timer_); msg << name; msg.WriteToLogFile(); @@ -1188,8 +1225,10 @@ void Logger::CodeCreateEvent(LogEventsAndTags tag, Handle code, void Logger::CodeCreateEvent(LogEventsAndTags tag, Handle code, Handle name) { if (!is_listening_to_code_events()) return; - if (!FLAG_log_code || !log_->IsEnabled()) return; - Log::MessageBuilder msg(log_.get()); + if (!FLAG_log_code) return; + std::unique_ptr msg_ptr = log_->NewMessageBuilder(); + if (!msg_ptr) return; + Log::MessageBuilder& msg = *msg_ptr.get(); AppendCodeCreateHeader(msg, tag, *code, &timer_); msg << *name; msg.WriteToLogFile(); @@ -1199,13 +1238,15 @@ void Logger::CodeCreateEvent(LogEventsAndTags tag, Handle code, Handle shared, Handle script_name) { if (!is_listening_to_code_events()) return; - if (!FLAG_log_code || !log_->IsEnabled()) return; + if (!FLAG_log_code) return; if (*code == AbstractCode::cast( isolate_->builtins()->builtin(Builtins::kCompileLazy))) { return; } - Log::MessageBuilder msg(log_.get()); + std::unique_ptr msg_ptr = log_->NewMessageBuilder(); + if (!msg_ptr) return; + Log::MessageBuilder& msg = *msg_ptr.get(); AppendCodeCreateHeader(msg, tag, *code, &timer_); msg << *script_name << kNext << reinterpret_cast(shared->address()) << kNext << ComputeMarker(*shared, *code); @@ -1219,9 +1260,11 @@ void Logger::CodeCreateEvent(LogEventsAndTags tag, Handle code, Handle shared, Handle script_name, int line, int column) { if (!is_listening_to_code_events()) return; - if (!FLAG_log_code || !log_->IsEnabled()) return; + if (!FLAG_log_code) return; { - Log::MessageBuilder msg(log_.get()); + std::unique_ptr msg_ptr = log_->NewMessageBuilder(); + if (!msg_ptr) return; + Log::MessageBuilder& msg = *msg_ptr.get(); AppendCodeCreateHeader(msg, tag, *code, &timer_); msg << shared->DebugName() << " " << *script_name << ":" << line << ":" << column << kNext << reinterpret_cast(shared->address()) @@ -1256,7 +1299,9 @@ void Logger::CodeCreateEvent(LogEventsAndTags tag, Handle code, // is an index into the function table // is the function table encoded as a sequence of strings // S - Log::MessageBuilder msg(log_.get()); + std::unique_ptr msg_ptr = log_->NewMessageBuilder(); + if (!msg_ptr) return; + Log::MessageBuilder& msg = *msg_ptr.get(); msg << "code-source-info" << kNext << reinterpret_cast(code->InstructionStart()) << kNext << script.id() << kNext << shared->StartPosition() << kNext @@ -1314,8 +1359,10 @@ void Logger::CodeCreateEvent(LogEventsAndTags tag, Handle code, void Logger::CodeCreateEvent(LogEventsAndTags tag, const wasm::WasmCode* code, wasm::WasmName name) { if (!is_listening_to_code_events()) return; - if (!FLAG_log_code || !log_->IsEnabled()) return; - Log::MessageBuilder msg(log_.get()); + if (!FLAG_log_code) return; + std::unique_ptr msg_ptr = log_->NewMessageBuilder(); + if (!msg_ptr) return; + Log::MessageBuilder& msg = *msg_ptr.get(); AppendCodeCreateHeader(msg, tag, CodeKind::WASM_FUNCTION, code->instructions().begin(), code->instructions().length(), &timer_); @@ -1335,8 +1382,10 @@ void Logger::CodeCreateEvent(LogEventsAndTags tag, const wasm::WasmCode* code, void Logger::CallbackEventInternal(const char* prefix, Handle name, Address entry_point) { - if (!FLAG_log_code || !log_->IsEnabled()) return; - Log::MessageBuilder msg(log_.get()); + if (!FLAG_log_code) return; + std::unique_ptr msg_ptr = log_->NewMessageBuilder(); + if (!msg_ptr) return; + Log::MessageBuilder& msg = *msg_ptr.get(); msg << kLogEventsNames[CodeEventListener::CODE_CREATION_EVENT] << kNext << kLogEventsNames[CodeEventListener::CALLBACK_TAG] << kNext << -2 << kNext << timer_.Elapsed().InMicroseconds() << kNext @@ -1360,8 +1409,10 @@ void Logger::SetterCallbackEvent(Handle name, Address entry_point) { void Logger::RegExpCodeCreateEvent(Handle code, Handle source) { if (!is_listening_to_code_events()) return; - if (!FLAG_log_code || !log_->IsEnabled()) return; - Log::MessageBuilder msg(log_.get()); + if (!FLAG_log_code) return; + std::unique_ptr msg_ptr = log_->NewMessageBuilder(); + if (!msg_ptr) return; + Log::MessageBuilder& msg = *msg_ptr.get(); AppendCodeCreateHeader(msg, CodeEventListener::REG_EXP_TAG, *code, &timer_); msg << *source; msg.WriteToLogFile(); @@ -1380,15 +1431,17 @@ void Logger::SharedFunctionInfoMoveEvent(Address from, Address to) { void Logger::CodeMovingGCEvent() { if (!is_listening_to_code_events()) return; - if (!log_->IsEnabled() || !FLAG_ll_prof) return; + if (!FLAG_ll_prof) return; base::OS::SignalCodeMovingGC(); } void Logger::CodeDisableOptEvent(Handle code, Handle shared) { if (!is_listening_to_code_events()) return; - if (!FLAG_log_code || !log_->IsEnabled()) return; - Log::MessageBuilder msg(log_.get()); + if (!FLAG_log_code) return; + std::unique_ptr msg_ptr = log_->NewMessageBuilder(); + if (!msg_ptr) return; + Log::MessageBuilder& msg = *msg_ptr.get(); msg << kLogEventsNames[CodeEventListener::CODE_DISABLE_OPT_EVENT] << kNext << shared->DebugName() << kNext << GetBailoutReason(shared->disable_optimization_reason()); @@ -1397,7 +1450,9 @@ void Logger::CodeDisableOptEvent(Handle code, void Logger::ProcessDeoptEvent(Handle code, SourcePosition position, const char* kind, const char* reason) { - Log::MessageBuilder msg(log_.get()); + std::unique_ptr msg_ptr = log_->NewMessageBuilder(); + if (!msg_ptr) return; + Log::MessageBuilder& msg = *msg_ptr.get(); msg << "code-deopt" << kNext << timer_.Elapsed().InMicroseconds() << kNext << code->CodeSize() << kNext << reinterpret_cast(code->InstructionStart()); @@ -1420,7 +1475,7 @@ void Logger::ProcessDeoptEvent(Handle code, SourcePosition position, void Logger::CodeDeoptEvent(Handle code, DeoptimizeKind kind, Address pc, int fp_to_sp_delta, bool reuse_code) { - if (!log_->IsEnabled()) return; + if (!is_logging()) return; Deoptimizer::DeoptInfo info = Deoptimizer::GetDeoptInfo(*code, pc); ProcessDeoptEvent(code, info.position, Deoptimizer::MessageFor(kind, reuse_code), @@ -1430,7 +1485,7 @@ void Logger::CodeDeoptEvent(Handle code, DeoptimizeKind kind, Address pc, void Logger::CodeDependencyChangeEvent(Handle code, Handle sfi, const char* reason) { - if (!log_->IsEnabled()) return; + if (!is_logging()) return; SourcePosition position(sfi->StartPosition(), -1); ProcessDeoptEvent(code, position, "dependency-change", reason); } @@ -1473,7 +1528,9 @@ void Logger::CodeLinePosInfoRecordEvent( void Logger::CodeNameEvent(Address addr, int pos, const char* code_name) { if (code_name == nullptr) return; // Not a code object. - Log::MessageBuilder msg(log_.get()); + std::unique_ptr msg_ptr = log_->NewMessageBuilder(); + if (!msg_ptr) return; + Log::MessageBuilder& msg = *msg_ptr.get(); msg << kLogEventsNames[CodeEventListener::SNAPSHOT_CODE_NAME_EVENT] << kNext << pos << kNext << code_name; msg.WriteToLogFile(); @@ -1481,16 +1538,20 @@ void Logger::CodeNameEvent(Address addr, int pos, const char* code_name) { void Logger::MoveEventInternal(LogEventsAndTags event, Address from, Address to) { - if (!FLAG_log_code || !log_->IsEnabled()) return; - Log::MessageBuilder msg(log_.get()); + if (!FLAG_log_code) return; + std::unique_ptr msg_ptr = log_->NewMessageBuilder(); + if (!msg_ptr) return; + Log::MessageBuilder& msg = *msg_ptr.get(); msg << kLogEventsNames[event] << kNext << reinterpret_cast(from) << kNext << reinterpret_cast(to); msg.WriteToLogFile(); } void Logger::ResourceEvent(const char* name, const char* tag) { - if (!log_->IsEnabled() || !FLAG_log) return; - Log::MessageBuilder msg(log_.get()); + if (!FLAG_log) return; + std::unique_ptr msg_ptr = log_->NewMessageBuilder(); + if (!msg_ptr) return; + Log::MessageBuilder& msg = *msg_ptr.get(); msg << name << kNext << tag << kNext; uint32_t sec, usec; @@ -1503,8 +1564,10 @@ void Logger::ResourceEvent(const char* name, const char* tag) { } void Logger::SuspectReadEvent(Name name, Object obj) { - if (!log_->IsEnabled() || !FLAG_log_suspect) return; - Log::MessageBuilder msg(log_.get()); + if (!FLAG_log_suspect) return; + std::unique_ptr msg_ptr = log_->NewMessageBuilder(); + if (!msg_ptr) return; + Log::MessageBuilder& msg = *msg_ptr.get(); String class_name = obj.IsJSObject() ? JSObject::cast(obj).class_name() : ReadOnlyRoots(isolate_).empty_string(); msg << "suspect-read" << kNext << class_name << kNext << name; @@ -1526,8 +1589,10 @@ void AppendFunctionMessage( void Logger::FunctionEvent(const char* reason, int script_id, double time_delta, int start_position, int end_position, String function_name) { - if (!log_->IsEnabled() || !FLAG_log_function_events) return; - Log::MessageBuilder msg(log_.get()); + if (!FLAG_log_function_events) return; + std::unique_ptr msg_ptr = log_->NewMessageBuilder(); + if (!msg_ptr) return; + Log::MessageBuilder& msg = *msg_ptr.get(); AppendFunctionMessage(msg, reason, script_id, time_delta, start_position, end_position, &timer_); if (!function_name.is_null()) msg << function_name; @@ -1537,21 +1602,25 @@ void Logger::FunctionEvent(const char* reason, int script_id, double time_delta, void Logger::FunctionEvent(const char* reason, int script_id, double time_delta, int start_position, int end_position, const char* function_name, - size_t function_name_length) { - if (!log_->IsEnabled() || !FLAG_log_function_events) return; - Log::MessageBuilder msg(log_.get()); + size_t function_name_length, bool is_one_byte) { + if (!FLAG_log_function_events) return; + std::unique_ptr msg_ptr = log_->NewMessageBuilder(); + if (!msg_ptr) return; + Log::MessageBuilder& msg = *msg_ptr.get(); AppendFunctionMessage(msg, reason, script_id, time_delta, start_position, end_position, &timer_); if (function_name_length > 0) { - msg.AppendString(function_name, function_name_length); + msg.AppendString(function_name, function_name_length, is_one_byte); } msg.WriteToLogFile(); } void Logger::CompilationCacheEvent(const char* action, const char* cache_type, SharedFunctionInfo sfi) { - if (!log_->IsEnabled() || !FLAG_log_function_events) return; - Log::MessageBuilder msg(log_.get()); + if (!FLAG_log_function_events) return; + std::unique_ptr msg_ptr = log_->NewMessageBuilder(); + if (!msg_ptr) return; + Log::MessageBuilder& msg = *msg_ptr.get(); int script_id = -1; if (sfi.script().IsScript()) { script_id = Script::cast(sfi.script()).id(); @@ -1564,8 +1633,10 @@ void Logger::CompilationCacheEvent(const char* action, const char* cache_type, } void Logger::ScriptEvent(ScriptEventType type, int script_id) { - if (!log_->IsEnabled() || !FLAG_log_function_events) return; - Log::MessageBuilder msg(log_.get()); + if (!FLAG_log_function_events) return; + std::unique_ptr msg_ptr = log_->NewMessageBuilder(); + if (!msg_ptr) return; + Log::MessageBuilder& msg = *msg_ptr.get(); msg << "script" << Logger::kNext; switch (type) { case ScriptEventType::kReserveId: @@ -1590,9 +1661,11 @@ void Logger::ScriptEvent(ScriptEventType type, int script_id) { } void Logger::ScriptDetails(Script script) { - if (!log_->IsEnabled() || !FLAG_log_function_events) return; + if (!FLAG_log_function_events) return; { - Log::MessageBuilder msg(log_.get()); + std::unique_ptr msg_ptr = log_->NewMessageBuilder(); + if (!msg_ptr) return; + Log::MessageBuilder& msg = *msg_ptr.get(); msg << "script-details" << Logger::kNext << script.id() << Logger::kNext; if (script.name().IsString()) { msg << String::cast(script.name()); @@ -1608,8 +1681,9 @@ void Logger::ScriptDetails(Script script) { } bool Logger::EnsureLogScriptSource(Script script) { - if (!log_->IsEnabled()) return false; - Log::MessageBuilder msg(log_.get()); + std::unique_ptr msg_ptr = log_->NewMessageBuilder(); + if (!msg_ptr) return false; + Log::MessageBuilder& msg = *msg_ptr.get(); // Make sure the script is written to the log file. int script_id = script.id(); if (logged_source_code_.find(script_id) != logged_source_code_.end()) { @@ -1639,18 +1713,22 @@ void Logger::RuntimeCallTimerEvent() { RuntimeCallStats* stats = isolate_->counters()->runtime_call_stats(); RuntimeCallCounter* counter = stats->current_counter(); if (counter == nullptr) return; - Log::MessageBuilder msg(log_.get()); + std::unique_ptr msg_ptr = log_->NewMessageBuilder(); + if (!msg_ptr) return; + Log::MessageBuilder& msg = *msg_ptr.get(); msg << "active-runtime-timer" << kNext << counter->name(); msg.WriteToLogFile(); } void Logger::TickEvent(TickSample* sample, bool overflow) { - if (!log_->IsEnabled() || !FLAG_prof_cpp) return; + if (!FLAG_prof_cpp) return; if (V8_UNLIKELY(TracingFlags::runtime_stats.load(std::memory_order_relaxed) == v8::tracing::TracingCategoryObserver::ENABLED_BY_NATIVE)) { RuntimeCallTimerEvent(); } - Log::MessageBuilder msg(log_.get()); + std::unique_ptr msg_ptr = log_->NewMessageBuilder(); + if (!msg_ptr) return; + Log::MessageBuilder& msg = *msg_ptr.get(); msg << kLogEventsNames[CodeEventListener::TICK_EVENT] << kNext << reinterpret_cast(sample->pc) << kNext << timer_.Elapsed().InMicroseconds(); @@ -1671,8 +1749,10 @@ void Logger::TickEvent(TickSample* sample, bool overflow) { void Logger::ICEvent(const char* type, bool keyed, Handle map, Handle key, char old_state, char new_state, const char* modifier, const char* slow_stub_reason) { - if (!log_->IsEnabled() || !FLAG_trace_ic) return; - Log::MessageBuilder msg(log_.get()); + if (!FLAG_trace_ic) return; + std::unique_ptr msg_ptr = log_->NewMessageBuilder(); + if (!msg_ptr) return; + Log::MessageBuilder& msg = *msg_ptr.get(); if (keyed) msg << "Keyed"; int line; int column; @@ -1697,7 +1777,7 @@ void Logger::ICEvent(const char* type, bool keyed, Handle map, void Logger::MapEvent(const char* type, Handle from, Handle to, const char* reason, Handle name_or_sfi) { - if (!log_->IsEnabled() || !FLAG_trace_maps) return; + if (!FLAG_trace_maps) return; if (!to.is_null()) MapDetails(*to); int line = -1; int column = -1; @@ -1706,7 +1786,9 @@ void Logger::MapEvent(const char* type, Handle from, Handle to, if (!isolate_->bootstrapper()->IsActive()) { pc = isolate_->GetAbstractPC(&line, &column); } - Log::MessageBuilder msg(log_.get()); + std::unique_ptr msg_ptr = log_->NewMessageBuilder(); + if (!msg_ptr) return; + Log::MessageBuilder& msg = *msg_ptr.get(); msg << "map" << kNext << type << kNext << timer_.Elapsed().InMicroseconds() << kNext << AsHex::Address(from.is_null() ? kNullAddress : from->ptr()) << kNext << AsHex::Address(to.is_null() ? kNullAddress : to->ptr()) @@ -1728,18 +1810,22 @@ void Logger::MapEvent(const char* type, Handle from, Handle to, } void Logger::MapCreate(Map map) { - if (!log_->IsEnabled() || !FLAG_trace_maps) return; + if (!FLAG_trace_maps) return; DisallowHeapAllocation no_gc; - Log::MessageBuilder msg(log_.get()); + std::unique_ptr msg_ptr = log_->NewMessageBuilder(); + if (!msg_ptr) return; + Log::MessageBuilder& msg = *msg_ptr.get(); msg << "map-create" << kNext << timer_.Elapsed().InMicroseconds() << kNext << AsHex::Address(map.ptr()); msg.WriteToLogFile(); } void Logger::MapDetails(Map map) { - if (!log_->IsEnabled() || !FLAG_trace_maps) return; + if (!FLAG_trace_maps) return; DisallowHeapAllocation no_gc; - Log::MessageBuilder msg(log_.get()); + std::unique_ptr msg_ptr = log_->NewMessageBuilder(); + if (!msg_ptr) return; + Log::MessageBuilder& msg = *msg_ptr.get(); msg << "map-details" << kNext << timer_.Elapsed().InMicroseconds() << kNext << AsHex::Address(map.ptr()) << kNext; if (FLAG_trace_maps_details) { @@ -1890,16 +1976,13 @@ void Logger::LogAllMaps() { } } -static void AddIsolateIdIfNeeded(std::ostream& os, // NOLINT - Isolate* isolate) { - if (FLAG_logfile_per_isolate) { - os << "isolate-" << isolate << "-" << base::OS::GetCurrentProcessId() - << "-"; - } +static void AddIsolateIdIfNeeded(std::ostream& os, Isolate* isolate) { + if (!FLAG_logfile_per_isolate) return; + os << "isolate-" << isolate << "-" << base::OS::GetCurrentProcessId() << "-"; } -static void PrepareLogFileName(std::ostream& os, // NOLINT - Isolate* isolate, const char* file_name) { +static void PrepareLogFileName(std::ostream& os, Isolate* isolate, + const char* file_name) { int dir_separator_count = 0; for (const char* p = file_name; *p; p++) { if (base::OS::isDirectorySeparator(*p)) dir_separator_count++; @@ -1948,9 +2031,8 @@ bool Logger::SetUp(Isolate* isolate) { is_initialized_ = true; std::ostringstream log_file_name; - std::ostringstream source_log_file_name; PrepareLogFileName(log_file_name, isolate, FLAG_logfile); - log_ = std::make_unique(this, log_file_name.str().c_str()); + log_ = std::make_unique(this, log_file_name.str()); #if V8_OS_LINUX if (FLAG_perf_basic_prof) { @@ -1979,20 +2061,21 @@ bool Logger::SetUp(Isolate* isolate) { ticker_ = std::make_unique(isolate, FLAG_prof_sampling_interval); - if (Log::InitLogAtStart()) { - is_logging_ = true; - } + bool activate_logging = false; + + if (Log::InitLogAtStart()) activate_logging = true; timer_.Start(); if (FLAG_prof_cpp) { profiler_ = std::make_unique(isolate); - is_logging_ = true; + activate_logging = true; profiler_->Engage(); } - if (is_logging_) { + if (activate_logging) { AddCodeEventListener(this); + UpdateIsLogging(true); } return true; @@ -2020,6 +2103,7 @@ void Logger::SetCodeEventHandler(uint32_t options, } sampler::Sampler* Logger::sampler() { return ticker_.get(); } +std::string Logger::file_name() const { return log_.get()->file_name(); } void Logger::StopProfilerThread() { if (profiler_ != nullptr) { @@ -2028,14 +2112,16 @@ void Logger::StopProfilerThread() { } } -FILE* Logger::TearDown() { +FILE* Logger::TearDownAndGetLogFile() { if (!is_initialized_) return nullptr; is_initialized_ = false; + UpdateIsLogging(false); // Stop the profiler thread before closing the file. StopProfilerThread(); ticker_.reset(); + timer_.Stop(); #if V8_OS_LINUX if (perf_basic_logger_) { @@ -2062,6 +2148,13 @@ FILE* Logger::TearDown() { return log_->Close(); } +void Logger::UpdateIsLogging(bool value) { + base::MutexGuard guard(log_->mutex()); + // Relaxed atomic to avoid locking the mutex for the most common case: when + // logging is disabled. + is_logging_.store(value, std::memory_order_relaxed); +} + void ExistingCodeLogger::LogCodeObject(Object object) { HandleScope scope(isolate_); Handle abstract_code(AbstractCode::cast(object), isolate_); diff --git a/deps/v8/src/logging/log.h b/deps/v8/src/logging/log.h index c5c4217d0a74d7..aa9b0c42371e9c 100644 --- a/deps/v8/src/logging/log.h +++ b/deps/v8/src/logging/log.h @@ -5,6 +5,7 @@ #ifndef V8_LOGGING_LOG_H_ #define V8_LOGGING_LOG_H_ +#include #include #include #include @@ -126,18 +127,19 @@ class Logger : public CodeEventListener { // Acquires resources for logging if the right flags are set. bool SetUp(Isolate* isolate); + // Frees resources acquired in SetUp. + // When a temporary file is used for the log, returns its stream descriptor, + // leaving the file open. + V8_EXPORT_PRIVATE FILE* TearDownAndGetLogFile(); + // Sets the current code event handler. void SetCodeEventHandler(uint32_t options, JitCodeEventHandler event_handler); sampler::Sampler* sampler(); + V8_EXPORT_PRIVATE std::string file_name() const; V8_EXPORT_PRIVATE void StopProfilerThread(); - // Frees resources acquired in SetUp. - // When a temporary file is used for the log, returns its stream descriptor, - // leaving the file open. - V8_EXPORT_PRIVATE FILE* TearDown(); - // Emits an event with a string value -> (name, value). V8_EXPORT_PRIVATE void StringEvent(const char* name, const char* value); @@ -168,7 +170,7 @@ class Logger : public CodeEventListener { void FunctionEvent(const char* reason, int script_id, double time_delta_ms, int start_position, int end_position, const char* function_name = nullptr, - size_t function_name_length = 0); + size_t function_name_length = 0, bool is_one_byte = true); void CompilationCacheEvent(const char* action, const char* cache_type, SharedFunctionInfo sfi); @@ -208,7 +210,6 @@ class Logger : public CodeEventListener { Handle source) override; void CodeMoveEvent(AbstractCode from, AbstractCode to) override; void SharedFunctionInfoMoveEvent(Address from, Address to) override; - void NativeContextMoveEvent(Address from, Address to) override {} void CodeMovingGCEvent() override; void CodeDisableOptEvent(Handle code, Handle shared) override; @@ -283,6 +284,8 @@ class Logger : public CodeEventListener { void LogCodeObject(Object code_object); private: + void UpdateIsLogging(bool value); + // Emits the profiler's first message. void ProfilerBeginEvent(); @@ -324,7 +327,7 @@ class Logger : public CodeEventListener { // Internal implementation classes with access to private members. friend class Profiler; - bool is_logging_; + std::atomic is_logging_; std::unique_ptr log_; #if V8_OS_LINUX std::unique_ptr perf_basic_logger_; @@ -405,7 +408,6 @@ class V8_EXPORT_PRIVATE CodeEventLogger : public CodeEventListener { void GetterCallbackEvent(Handle name, Address entry_point) override {} void SetterCallbackEvent(Handle name, Address entry_point) override {} void SharedFunctionInfoMoveEvent(Address from, Address to) override {} - void NativeContextMoveEvent(Address from, Address to) override {} void CodeMovingGCEvent() override {} void CodeDeoptEvent(Handle code, DeoptimizeKind kind, Address pc, int fp_to_sp_delta, bool reuse_code) override {} @@ -465,7 +467,6 @@ class ExternalCodeEventListener : public CodeEventListener { void GetterCallbackEvent(Handle name, Address entry_point) override {} void SetterCallbackEvent(Handle name, Address entry_point) override {} void SharedFunctionInfoMoveEvent(Address from, Address to) override {} - void NativeContextMoveEvent(Address from, Address to) override {} void CodeMoveEvent(AbstractCode from, AbstractCode to) override; void CodeDisableOptEvent(Handle code, Handle shared) override {} diff --git a/deps/v8/src/numbers/conversions.cc b/deps/v8/src/numbers/conversions.cc index 70d914e6dfbd1c..1423bd6fcdc250 100644 --- a/deps/v8/src/numbers/conversions.cc +++ b/deps/v8/src/numbers/conversions.cc @@ -209,6 +209,7 @@ class StringToIntHelper { void ParseInt(); // Subclasses may override this. + virtual bool CheckTermination() { return false; } virtual void HandleSpecialCases() {} // Subclass constructors should call these for configuration before calling @@ -249,7 +250,7 @@ class StringToIntHelper { template void DetectRadixInternal(Char current, int length); template - void ParseInternal(Char start); + bool ParseChunkInternal(Char start); LocalIsolate* isolate_; Handle subject_; @@ -280,18 +281,31 @@ void StringToIntHelper::ParseInt() { AllocateResult(); HandleSpecialCases(); if (state_ != State::kRunning) return; - { - DisallowHeapAllocation no_gc; - if (IsOneByte()) { - Vector vector = GetOneByteVector(); - DCHECK_EQ(length_, vector.length()); - ParseInternal(vector.begin()); - } else { - Vector vector = GetTwoByteVector(); - DCHECK_EQ(length_, vector.length()); - ParseInternal(vector.begin()); + do { + { + DisallowHeapAllocation no_gc; + if (IsOneByte()) { + Vector vector = GetOneByteVector(); + DCHECK_EQ(length_, vector.length()); + if (ParseChunkInternal(vector.begin())) { + break; + } + } else { + Vector vector = GetTwoByteVector(); + DCHECK_EQ(length_, vector.length()); + if (ParseChunkInternal(vector.begin())) { + break; + } + } } - } + + // The flat vector handle is temporarily released after parsing 10kb + // in order to invoke interrupts which may in turn invoke GC. + if (CheckTermination()) { + set_state(State::kError); + break; + } + } while (true); DCHECK_NE(state_, State::kRunning); } @@ -377,9 +391,11 @@ void StringToIntHelper::DetectRadixInternal(Char current, template template -void StringToIntHelper::ParseInternal(Char start) { +bool StringToIntHelper::ParseChunkInternal(Char start) { + const int kChunkSize = 10240; Char current = start + cursor_; Char end = start + length_; + Char break_pos = current + kChunkSize; // The following code causes accumulating rounding error for numbers greater // than ~2^56. It's explicitly allowed in the spec: "if R is not 2, 4, 8, 10, @@ -433,13 +449,20 @@ void StringToIntHelper::ParseInternal(Char start) { // Update the value and skip the part in the string. ResultMultiplyAdd(multiplier, part); - } while (!done); - if (!allow_trailing_junk_ && AdvanceToNonspace(¤t, end)) { - return set_state(State::kJunk); - } + // Set final state + if (done) { + if (!allow_trailing_junk_ && AdvanceToNonspace(¤t, end)) { + set_state(State::kJunk); + } else { + set_state(State::kDone); + } + return true; + } + } while (current < break_pos); - return set_state(State::kDone); + cursor_ = static_cast(current - start); + return false; } class NumberParseIntHelper : public StringToIntHelper { @@ -904,6 +927,8 @@ class StringToBigIntHelper : public StringToIntHelper { static_cast(part)); } + bool CheckTermination() override; + AllocationType allocation_type() { // For literals, we pretenure the allocated BigInt, since it's about // to be stored in the interpreter's constants array. @@ -916,6 +941,18 @@ class StringToBigIntHelper : public StringToIntHelper { Behavior behavior_; }; +template +bool StringToBigIntHelper::CheckTermination() { + return false; +} + +template <> +bool StringToBigIntHelper::CheckTermination() { + StackLimitCheck interrupt_check(isolate()); + return interrupt_check.InterruptRequested() && + isolate()->stack_guard()->HandleInterrupts().IsException(isolate()); +} + MaybeHandle StringToBigInt(Isolate* isolate, Handle string) { string = String::Flatten(isolate, string); StringToBigIntHelper helper(isolate, string); diff --git a/deps/v8/src/numbers/hash-seed-inl.h b/deps/v8/src/numbers/hash-seed-inl.h index dad8db01c7c668..51ee906be2de7e 100644 --- a/deps/v8/src/numbers/hash-seed-inl.h +++ b/deps/v8/src/numbers/hash-seed-inl.h @@ -19,7 +19,6 @@ namespace internal { class Isolate; class ReadOnlyRoots; -// TODO(v8:7464): Remove the Isolate version of this. inline uint64_t HashSeed(Isolate* isolate); inline uint64_t HashSeed(ReadOnlyRoots roots); diff --git a/deps/v8/src/objects/allocation-site-scopes.h b/deps/v8/src/objects/allocation-site-scopes.h index 8f5fb42986f7cc..9617b76b5e221d 100644 --- a/deps/v8/src/objects/allocation-site-scopes.h +++ b/deps/v8/src/objects/allocation-site-scopes.h @@ -27,9 +27,7 @@ class AllocationSiteContext { Isolate* isolate() { return isolate_; } protected: - void update_current_site(AllocationSite site) { - *(current_.location()) = site.ptr(); - } + void update_current_site(AllocationSite site) { current_.PatchValue(site); } inline void InitializeTraversal(Handle site); diff --git a/deps/v8/src/objects/api-callbacks-inl.h b/deps/v8/src/objects/api-callbacks-inl.h index 93d2bcd7f458cb..8fa0f40c73b410 100644 --- a/deps/v8/src/objects/api-callbacks-inl.h +++ b/deps/v8/src/objects/api-callbacks-inl.h @@ -13,7 +13,7 @@ #include "src/objects/js-objects-inl.h" #include "src/objects/name.h" #include "src/objects/templates.h" -#include "torque-generated/class-definitions-tq-inl.h" +#include "torque-generated/class-definitions-inl.h" // Has to be the last include (doesn't have include guards): #include "src/objects/object-macros.h" diff --git a/deps/v8/src/objects/api-callbacks.h b/deps/v8/src/objects/api-callbacks.h index 969adb9fca3fea..ffd9e9f02e4eaf 100644 --- a/deps/v8/src/objects/api-callbacks.h +++ b/deps/v8/src/objects/api-callbacks.h @@ -6,8 +6,8 @@ #define V8_OBJECTS_API_CALLBACKS_H_ #include "src/objects/struct.h" -#include "torque-generated/bit-fields-tq.h" -#include "torque-generated/class-definitions-tq.h" +#include "torque-generated/bit-fields.h" +#include "torque-generated/class-definitions.h" // Has to be the last include (doesn't have include guards): #include "src/objects/object-macros.h" diff --git a/deps/v8/src/objects/arguments.h b/deps/v8/src/objects/arguments.h index 41eaaed1a17136..d8cbdbae50f601 100644 --- a/deps/v8/src/objects/arguments.h +++ b/deps/v8/src/objects/arguments.h @@ -8,7 +8,7 @@ #include "src/objects/fixed-array.h" #include "src/objects/js-objects.h" #include "src/objects/struct.h" -#include "torque-generated/field-offsets-tq.h" +#include "torque-generated/field-offsets.h" // Has to be the last include (doesn't have include guards): #include "src/objects/object-macros.h" diff --git a/deps/v8/src/objects/arguments.tq b/deps/v8/src/objects/arguments.tq index 0699034851bc92..2fc9dfc53a9448 100644 --- a/deps/v8/src/objects/arguments.tq +++ b/deps/v8/src/objects/arguments.tq @@ -53,7 +53,7 @@ extern shape JSStrictArgumentsObject extends JSArgumentsObject { // entry has been deleted fron the arguments object, and value is looked up in // the unmapped arguments array, as described above. Otherwise, t is a Smi // index into the context array specified at elements.context, and the return -// value is elements.context. +// value is elements.context[t]. // // A graphic representation of a SloppyArgumentsElements object and a // corresponding unmapped arguments FixedArray: @@ -79,7 +79,7 @@ extern shape JSStrictArgumentsObject extends JSArgumentsObject { @export class SloppyArgumentsElements extends FixedArrayBase { context: Context; - arguments: FixedArray; + arguments: FixedArray|NumberDictionary; mapped_entries[length]: Smi|TheHole; } @@ -316,3 +316,58 @@ builtin NewRestArgumentsElements( return arguments::NewRestArgumentsElements( frame, formalParameterCount, Convert(argumentCount)); } + +macro +AccessSloppyArgumentsCommon( + receiver: JSObject, keyObject: Object): &Object labels Bailout { + const key = Cast(keyObject) otherwise Bailout; + const elements = + Cast(receiver.elements) otherwise Bailout; + + try { + if (OutOfBounds(key, elements.length)) goto Unmapped; + const mappedIndex = elements.mapped_entries[key]; + typeswitch (mappedIndex) { + case (contextIndex: Smi): { + return &(elements.context.elements[contextIndex]); + } + case (TheHole): { + goto Unmapped; + } + } + } label Unmapped { + typeswitch (elements.arguments) { + case (NumberDictionary): { + goto Bailout; + } + case (arguments: FixedArray): { + if (OutOfBounds(key, arguments.length)) goto Bailout; + if (arguments.objects[key] == TheHole) goto Bailout; + return &(arguments.objects[key]); + } + } + } +} + +@export +macro SloppyArgumentsLoad(receiver: JSObject, keyObject: Object): + JSAny labels Bailout { + return UnsafeCast( + *AccessSloppyArgumentsCommon(receiver, keyObject) otherwise Bailout); +} + +@export +macro SloppyArgumentsHas(receiver: JSObject, keyObject: Object): + JSAny labels Bailout { + AccessSloppyArgumentsCommon(receiver, keyObject) otherwise Bailout; + return True; +} + +@export +macro SloppyArgumentsStore(receiver: JSObject, keyObject: Object, value: JSAny): + JSAny labels Bailout { + let destination = + AccessSloppyArgumentsCommon(receiver, keyObject) otherwise Bailout; + *destination = value; + return value; +} diff --git a/deps/v8/src/objects/backing-store.cc b/deps/v8/src/objects/backing-store.cc index e81b854fcee980..c67fff0fa9b5e2 100644 --- a/deps/v8/src/objects/backing-store.cc +++ b/deps/v8/src/objects/backing-store.cc @@ -276,9 +276,9 @@ std::unique_ptr BackingStore::Allocate( } // Trying to allocate 4 GiB on a 32-bit platform is guaranteed to fail. -// We don't lower the official max_maximum_mem_pages() limit because that -// would be observable upon instantiation; this way the effective limit -// on 32-bit platforms is defined by the allocator. +// We don't lower the official max_mem_pages() limit because that would be +// observable upon instantiation; this way the effective limit on 32-bit +// platforms is defined by the allocator. constexpr size_t kPlatformMaxPages = std::numeric_limits::max() / wasm::kWasmPageSize; @@ -325,7 +325,7 @@ std::unique_ptr BackingStore::TryAllocateWasmMemory( // Compute size of reserved memory. - size_t engine_max_pages = wasm::max_maximum_mem_pages(); + size_t engine_max_pages = wasm::max_mem_pages(); maximum_pages = std::min(engine_max_pages, maximum_pages); // If the platform doesn't support so many pages, attempting to allocate // is guaranteed to fail, so we don't even try. diff --git a/deps/v8/src/objects/bigint.cc b/deps/v8/src/objects/bigint.cc index 76b6e417ab0cfc..fbbfbeb69d9c1b 100644 --- a/deps/v8/src/objects/bigint.cc +++ b/deps/v8/src/objects/bigint.cc @@ -822,32 +822,39 @@ MaybeHandle BigInt::Decrement(Isolate* isolate, Handle x) { return MutableBigInt::MakeImmutable(result); } -ComparisonResult BigInt::CompareToString(Isolate* isolate, Handle x, - Handle y) { +Maybe BigInt::CompareToString(Isolate* isolate, + Handle x, + Handle y) { // a. Let ny be StringToBigInt(y); MaybeHandle maybe_ny = StringToBigInt(isolate, y); // b. If ny is NaN, return undefined. Handle ny; if (!maybe_ny.ToHandle(&ny)) { - DCHECK(!isolate->has_pending_exception()); - return ComparisonResult::kUndefined; + if (isolate->has_pending_exception()) { + return Nothing(); + } else { + return Just(ComparisonResult::kUndefined); + } } // c. Return BigInt::lessThan(x, ny). - return CompareToBigInt(x, ny); + return Just(CompareToBigInt(x, ny)); } -bool BigInt::EqualToString(Isolate* isolate, Handle x, - Handle y) { +Maybe BigInt::EqualToString(Isolate* isolate, Handle x, + Handle y) { // a. Let n be StringToBigInt(y). MaybeHandle maybe_n = StringToBigInt(isolate, y); // b. If n is NaN, return false. Handle n; if (!maybe_n.ToHandle(&n)) { - DCHECK(!isolate->has_pending_exception()); - return false; + if (isolate->has_pending_exception()) { + return Nothing(); + } else { + return Just(false); + } } // c. Return the result of x == n. - return EqualToBigInt(*x, *n); + return Just(EqualToBigInt(*x, *n)); } bool BigInt::EqualToNumber(Handle x, Handle y) { @@ -1047,9 +1054,13 @@ MaybeHandle BigInt::FromObject(Isolate* isolate, Handle obj) { if (obj->IsString()) { Handle n; if (!StringToBigInt(isolate, Handle::cast(obj)).ToHandle(&n)) { - THROW_NEW_ERROR(isolate, - NewSyntaxError(MessageTemplate::kBigIntFromObject, obj), - BigInt); + if (isolate->has_pending_exception()) { + return MaybeHandle(); + } else { + THROW_NEW_ERROR(isolate, + NewSyntaxError(MessageTemplate::kBigIntFromObject, obj), + BigInt); + } } return n; } diff --git a/deps/v8/src/objects/bigint.h b/deps/v8/src/objects/bigint.h index ccdbf33f617eaa..4fdd9b1501faf8 100644 --- a/deps/v8/src/objects/bigint.h +++ b/deps/v8/src/objects/bigint.h @@ -189,11 +189,12 @@ class BigInt : public BigIntBase { bool IsNegative() const { return sign(); } - static bool EqualToString(Isolate* isolate, Handle x, - Handle y); + static Maybe EqualToString(Isolate* isolate, Handle x, + Handle y); static bool EqualToNumber(Handle x, Handle y); - static ComparisonResult CompareToString(Isolate* isolate, Handle x, - Handle y); + static Maybe CompareToString(Isolate* isolate, + Handle x, + Handle y); static ComparisonResult CompareToNumber(Handle x, Handle y); // Exposed for tests, do not call directly. Use CompareToNumber() instead. V8_EXPORT_PRIVATE static ComparisonResult CompareToDouble(Handle x, @@ -203,12 +204,13 @@ class BigInt : public BigIntBase { static MaybeHandle AsUintN(Isolate* isolate, uint64_t n, Handle x); - static Handle FromInt64(Isolate* isolate, int64_t n); + V8_EXPORT_PRIVATE static Handle FromInt64(Isolate* isolate, + int64_t n); static Handle FromUint64(Isolate* isolate, uint64_t n); static MaybeHandle FromWords64(Isolate* isolate, int sign_bit, int words64_count, const uint64_t* words); - int64_t AsInt64(bool* lossless = nullptr); + V8_EXPORT_PRIVATE int64_t AsInt64(bool* lossless = nullptr); uint64_t AsUint64(bool* lossless = nullptr); int Words64Count(); void ToWordsArray64(int* sign_bit, int* words64_count, uint64_t* words); diff --git a/deps/v8/src/objects/cell.h b/deps/v8/src/objects/cell.h index f26feae4218eea..de4389735044fa 100644 --- a/deps/v8/src/objects/cell.h +++ b/deps/v8/src/objects/cell.h @@ -6,7 +6,7 @@ #define V8_OBJECTS_CELL_H_ #include "src/objects/heap-object.h" -#include "torque-generated/class-definitions-tq.h" +#include "torque-generated/class-definitions.h" // Has to be the last include (doesn't have include guards): #include "src/objects/object-macros.h" diff --git a/deps/v8/src/objects/class-definitions-tq-deps-inl.h b/deps/v8/src/objects/class-definitions-tq-deps-inl.h index ccfd8c3aa188a2..ad046cbf8b902f 100644 --- a/deps/v8/src/objects/class-definitions-tq-deps-inl.h +++ b/deps/v8/src/objects/class-definitions-tq-deps-inl.h @@ -6,7 +6,7 @@ #define V8_OBJECTS_CLASS_DEFINITIONS_TQ_DEPS_INL_H_ // This is a collection of -inl.h files required by the generated file -// class-definitions-tq.cc. Generally, classes using @generateCppClass need an +// class-definitions.cc. Generally, classes using @generateCppClass need an // entry here. #include "src/objects/allocation-site-inl.h" #include "src/objects/arguments-inl.h" diff --git a/deps/v8/src/objects/code-inl.h b/deps/v8/src/objects/code-inl.h index c5a41878222ee3..3c772f855ae65b 100644 --- a/deps/v8/src/objects/code-inl.h +++ b/deps/v8/src/objects/code-inl.h @@ -208,21 +208,12 @@ void Code::clear_padding() { CodeSize() - (data_end - address())); } -ByteArray Code::SourcePositionTableIfCollected() const { - ReadOnlyRoots roots = GetReadOnlyRoots(); - Object maybe_table = source_position_table(); - if (maybe_table.IsUndefined(roots) || maybe_table.IsException(roots)) { - return roots.empty_byte_array(); - } - DCHECK(maybe_table.IsByteArray()); - return ByteArray::cast(maybe_table); -} - ByteArray Code::SourcePositionTable() const { Object maybe_table = source_position_table(); - DCHECK(!maybe_table.IsUndefined() && !maybe_table.IsException()); - DCHECK(maybe_table.IsByteArray()); - return ByteArray::cast(maybe_table); + if (maybe_table.IsByteArray()) return ByteArray::cast(maybe_table); + ReadOnlyRoots roots = GetReadOnlyRoots(); + DCHECK(maybe_table.IsUndefined(roots) || maybe_table.IsException(roots)); + return roots.empty_byte_array(); } Object Code::next_code_link() const { @@ -376,7 +367,8 @@ inline bool Code::is_interpreter_trampoline_builtin() const { inline bool Code::checks_optimization_marker() const { bool checks_marker = (builtin_index() == Builtins::kCompileLazy || - builtin_index() == Builtins::kInterpreterEntryTrampoline); + builtin_index() == Builtins::kInterpreterEntryTrampoline || + CodeKindChecksOptimizationMarker(kind())); return checks_marker || (CodeKindCanDeoptimize(kind()) && marked_for_deoptimization()); } @@ -709,8 +701,8 @@ int32_t BytecodeArray::parameter_count() const { ACCESSORS(BytecodeArray, constant_pool, FixedArray, kConstantPoolOffset) ACCESSORS(BytecodeArray, handler_table, ByteArray, kHandlerTableOffset) -ACCESSORS(BytecodeArray, source_position_table, Object, - kSourcePositionTableOffset) +SYNCHRONIZED_ACCESSORS(BytecodeArray, synchronized_source_position_table, + Object, kSourcePositionTableOffset) void BytecodeArray::clear_padding() { int data_size = kHeaderSize + length(); @@ -723,40 +715,37 @@ Address BytecodeArray::GetFirstBytecodeAddress() { } bool BytecodeArray::HasSourcePositionTable() const { - Object maybe_table = source_position_table(); + Object maybe_table = synchronized_source_position_table(); return !(maybe_table.IsUndefined() || DidSourcePositionGenerationFail()); } bool BytecodeArray::DidSourcePositionGenerationFail() const { - return source_position_table().IsException(); + return synchronized_source_position_table().IsException(); } void BytecodeArray::SetSourcePositionsFailedToCollect() { - set_source_position_table(GetReadOnlyRoots().exception()); + set_synchronized_source_position_table(GetReadOnlyRoots().exception()); } ByteArray BytecodeArray::SourcePositionTable() const { - Object maybe_table = source_position_table(); + // WARNING: This function may be called from a background thread, hence + // changes to how it accesses the heap can easily lead to bugs. + Object maybe_table = synchronized_source_position_table(); if (maybe_table.IsByteArray()) return ByteArray::cast(maybe_table); ReadOnlyRoots roots = GetReadOnlyRoots(); - DCHECK(maybe_table.IsException(roots)); + DCHECK(maybe_table.IsUndefined(roots) || maybe_table.IsException(roots)); return roots.empty_byte_array(); } -ByteArray BytecodeArray::SourcePositionTableIfCollected() const { - if (!HasSourcePositionTable()) return GetReadOnlyRoots().empty_byte_array(); - - return SourcePositionTable(); -} - int BytecodeArray::BytecodeArraySize() { return SizeFor(this->length()); } int BytecodeArray::SizeIncludingMetadata() { int size = BytecodeArraySize(); size += constant_pool().Size(); size += handler_table().Size(); - if (HasSourcePositionTable()) { - size += SourcePositionTable().Size(); + ByteArray table = SourcePositionTable(); + if (table.length() != 0) { + size += table.Size(); } return size; } diff --git a/deps/v8/src/objects/code-kind.h b/deps/v8/src/objects/code-kind.h index 13baf0a1f51e6b..a1f9b43900c4e0 100644 --- a/deps/v8/src/objects/code-kind.h +++ b/deps/v8/src/objects/code-kind.h @@ -72,11 +72,21 @@ inline constexpr bool CodeKindCanDeoptimize(CodeKind kind) { return CodeKindIsOptimizedJSFunction(kind); } -inline CodeKind CodeKindForTopTier() { - return FLAG_turbo_nci_as_highest_tier ? CodeKind::NATIVE_CONTEXT_INDEPENDENT - : CodeKind::OPTIMIZED_FUNCTION; +inline constexpr bool CodeKindChecksOptimizationMarker(CodeKind kind) { + return kind == CodeKind::INTERPRETED_FUNCTION || + kind == CodeKind::NATIVE_CONTEXT_INDEPENDENT; } +// The optimization marker field on the feedback vector has a dual purpose of +// controlling the tier-up workflow, and caching the produced code object for +// access from multiple closures. The marker is not used for all code kinds +// though, in particular it is not used when generating NCI code. +inline constexpr bool CodeKindIsStoredInOptimizedCodeCache(CodeKind kind) { + return kind == CodeKind::OPTIMIZED_FUNCTION; +} + +inline CodeKind CodeKindForTopTier() { return CodeKind::OPTIMIZED_FUNCTION; } + // The dedicated CodeKindFlag enum represents all code kinds in a format // suitable for bit sets. enum class CodeKindFlag { diff --git a/deps/v8/src/objects/code.cc b/deps/v8/src/objects/code.cc index 26f84c21c4662d..c796904718d030 100644 --- a/deps/v8/src/objects/code.cc +++ b/deps/v8/src/objects/code.cc @@ -201,17 +201,6 @@ int AbstractCode::SourceStatementPosition(int offset) { return statement_position; } -void Code::PrintDeoptLocation(FILE* out, const char* str, Address pc) { - Deoptimizer::DeoptInfo info = Deoptimizer::GetDeoptInfo(*this, pc); - class SourcePosition pos = info.position; - if (info.deopt_reason != DeoptimizeReason::kUnknown || pos.IsKnown()) { - PrintF(out, "%s", str); - OFStream outstr(out); - pos.Print(outstr, *this); - PrintF(out, ", %s\n", DeoptimizeReasonToString(info.deopt_reason)); - } -} - bool Code::CanDeoptAt(Address pc) { DeoptimizationData deopt_data = DeoptimizationData::cast(deoptimization_data()); @@ -712,8 +701,7 @@ void Code::Disassemble(const char* name, std::ostream& os, Isolate* isolate, { SourcePositionTableIterator it( - SourcePositionTableIfCollected(), - SourcePositionTableIterator::kJavaScriptOnly); + SourcePositionTable(), SourcePositionTableIterator::kJavaScriptOnly); if (!it.done()) { os << "Source positions:\n pc offset position\n"; for (; !it.done(); it.Advance()) { @@ -726,7 +714,7 @@ void Code::Disassemble(const char* name, std::ostream& os, Isolate* isolate, } { - SourcePositionTableIterator it(SourcePositionTableIfCollected(), + SourcePositionTableIterator it(SourcePositionTable(), SourcePositionTableIterator::kExternalOnly); if (!it.done()) { os << "External Source positions:\n pc offset fileid line\n"; @@ -808,8 +796,7 @@ void BytecodeArray::Disassemble(std::ostream& os) { os << "Frame size " << frame_size() << "\n"; Address base_address = GetFirstBytecodeAddress(); - SourcePositionTableIterator source_positions( - SourcePositionTableIfCollected()); + SourcePositionTableIterator source_positions(SourcePositionTable()); // Storage for backing the handle passed to the iterator. This handle won't be // updated by the gc, but that's ok because we've disallowed GCs anyway. @@ -868,11 +855,12 @@ void BytecodeArray::Disassemble(std::ostream& os) { } #endif - os << "Source Position Table (size = " - << SourcePositionTableIfCollected().length() << ")\n"; + ByteArray source_position_table = SourcePositionTable(); + os << "Source Position Table (size = " << source_position_table.length() + << ")\n"; #ifdef OBJECT_PRINT - if (SourcePositionTableIfCollected().length() > 0) { - os << Brief(SourcePositionTableIfCollected()) << std::endl; + if (source_position_table.length() > 0) { + os << Brief(source_position_table) << std::endl; } #endif } @@ -1058,27 +1046,7 @@ void DependentCode::DeoptimizeDependentCodeGroup( void Code::SetMarkedForDeoptimization(const char* reason) { set_marked_for_deoptimization(true); - if (FLAG_trace_deopt && - (deoptimization_data() != GetReadOnlyRoots().empty_fixed_array())) { - DeoptimizationData deopt_data = - DeoptimizationData::cast(deoptimization_data()); - auto isolate = GetIsolate(); - CodeTracer::Scope scope(isolate->GetCodeTracer()); - PrintF(scope.file(), "[marking dependent code " V8PRIxPTR_FMT " ", ptr()); - deopt_data.SharedFunctionInfo().ShortPrint(scope.file()); - PrintF(" (opt #%d) for deoptimization, reason: %s]\n", - deopt_data.OptimizationId().value(), reason); - { - HandleScope scope(isolate); - PROFILE( - isolate, - CodeDependencyChangeEvent( - handle(*this, isolate), - handle(SharedFunctionInfo::cast(deopt_data.SharedFunctionInfo()), - isolate), - reason)); - } - } + Deoptimizer::TraceMarkForDeoptimization(*this, reason); } const char* DependentCode::DependencyGroupName(DependencyGroup group) { diff --git a/deps/v8/src/objects/code.h b/deps/v8/src/objects/code.h index af6af90c0d9334..d71a0b1132a253 100644 --- a/deps/v8/src/objects/code.h +++ b/deps/v8/src/objects/code.h @@ -109,8 +109,10 @@ class Code : public HeapObject { // [source_position_table]: ByteArray for the source positions table. DECL_ACCESSORS(source_position_table, Object) + + // If source positions have not been collected or an exception has been thrown + // this will return empty_byte_array. inline ByteArray SourcePositionTable() const; - inline ByteArray SourcePositionTableIfCollected() const; // [code_data_container]: A container indirection for all mutable fields. DECL_ACCESSORS(code_data_container, CodeDataContainer) @@ -387,7 +389,6 @@ class Code : public HeapObject { DECL_PRINTER(Code) DECL_VERIFIER(Code) - void PrintDeoptLocation(FILE* out, const char* str, Address pc); bool CanDeoptAt(Address pc); void SetMarkedForDeoptimization(const char* reason); @@ -773,18 +774,15 @@ class BytecodeArray : public FixedArrayBase { // * ByteArray (when source positions have been collected for the bytecode) // * exception (when an error occurred while explicitly collecting source // positions for pre-existing bytecode). - DECL_ACCESSORS(source_position_table, Object) + DECL_SYNCHRONIZED_ACCESSORS(source_position_table, Object) - // This must only be called if source position collection has already been - // attempted. (If it failed because of an exception then it will return - // empty_byte_array). - inline ByteArray SourcePositionTable() const; - // If source positions have not been collected or an exception has been thrown - // this will return empty_byte_array. - inline ByteArray SourcePositionTableIfCollected() const; inline bool HasSourcePositionTable() const; inline bool DidSourcePositionGenerationFail() const; + // If source positions have not been collected or an exception has been thrown + // this will return empty_byte_array. + inline ByteArray SourcePositionTable() const; + // Indicates that an attempt was made to collect source positions, but that it // failed most likely due to stack exhaustion. When in this state // |SourcePositionTable| will return an empty byte array rather than crashing diff --git a/deps/v8/src/objects/compressed-slots-inl.h b/deps/v8/src/objects/compressed-slots-inl.h index 72a2420ed2254f..81eff427e49ec8 100644 --- a/deps/v8/src/objects/compressed-slots-inl.h +++ b/deps/v8/src/objects/compressed-slots-inl.h @@ -164,11 +164,21 @@ Object OffHeapCompressedObjectSlot::Relaxed_Load(const Isolate* isolate) const { return Object(DecompressTaggedAny(isolate, value)); } +Object OffHeapCompressedObjectSlot::Acquire_Load(const Isolate* isolate) const { + AtomicTagged_t value = AsAtomicTagged::Acquire_Load(location()); + return Object(DecompressTaggedAny(isolate, value)); +} + void OffHeapCompressedObjectSlot::Relaxed_Store(Object value) const { Tagged_t ptr = CompressTagged(value.ptr()); AsAtomicTagged::Relaxed_Store(location(), ptr); } +void OffHeapCompressedObjectSlot::Release_Store(Object value) const { + Tagged_t ptr = CompressTagged(value.ptr()); + AsAtomicTagged::Release_Store(location(), ptr); +} + void OffHeapCompressedObjectSlot::Release_CompareAndSwap(Object old, Object target) const { Tagged_t old_ptr = CompressTagged(old.ptr()); diff --git a/deps/v8/src/objects/compressed-slots.h b/deps/v8/src/objects/compressed-slots.h index d234b9d1b70ae1..b8f387238430f4 100644 --- a/deps/v8/src/objects/compressed-slots.h +++ b/deps/v8/src/objects/compressed-slots.h @@ -135,7 +135,9 @@ class OffHeapCompressedObjectSlot inline void store(Object value) const; inline Object Relaxed_Load(const Isolate* isolate) const; + inline Object Acquire_Load(const Isolate* isolate) const; inline void Relaxed_Store(Object value) const; + inline void Release_Store(Object value) const; inline void Release_CompareAndSwap(Object old, Object target) const; }; diff --git a/deps/v8/src/objects/contexts-inl.h b/deps/v8/src/objects/contexts-inl.h index aeff21427dc4ec..9bd30530c93fc7 100644 --- a/deps/v8/src/objects/contexts-inl.h +++ b/deps/v8/src/objects/contexts-inl.h @@ -9,6 +9,7 @@ #include "src/objects/contexts.h" #include "src/objects/dictionary-inl.h" #include "src/objects/fixed-array-inl.h" +#include "src/objects/js-function-inl.h" #include "src/objects/js-objects-inl.h" #include "src/objects/map-inl.h" #include "src/objects/objects-inl.h" diff --git a/deps/v8/src/objects/contexts.h b/deps/v8/src/objects/contexts.h index ec032a6be4a705..e63ed580f41f74 100644 --- a/deps/v8/src/objects/contexts.h +++ b/deps/v8/src/objects/contexts.h @@ -9,7 +9,7 @@ #include "src/objects/function-kind.h" #include "src/objects/ordered-hash-table.h" #include "src/objects/osr-optimized-code-cache.h" -#include "torque-generated/field-offsets-tq.h" +#include "torque-generated/field-offsets.h" // Has to be the last include (doesn't have include guards): #include "src/objects/object-macros.h" diff --git a/deps/v8/src/objects/debug-objects.h b/deps/v8/src/objects/debug-objects.h index 22eea25481ba2b..b9012fd9c1801d 100644 --- a/deps/v8/src/objects/debug-objects.h +++ b/deps/v8/src/objects/debug-objects.h @@ -11,7 +11,7 @@ #include "src/objects/fixed-array.h" #include "src/objects/objects.h" #include "src/objects/struct.h" -#include "torque-generated/bit-fields-tq.h" +#include "torque-generated/bit-fields.h" // Has to be the last include (doesn't have include guards): #include "src/objects/object-macros.h" diff --git a/deps/v8/src/objects/descriptor-array-inl.h b/deps/v8/src/objects/descriptor-array-inl.h index d9e3408dd96aed..a7c6443a05fa7d 100644 --- a/deps/v8/src/objects/descriptor-array-inl.h +++ b/deps/v8/src/objects/descriptor-array-inl.h @@ -228,7 +228,7 @@ void DescriptorArray::Append(Descriptor* desc) { for (insertion = descriptor_number; insertion > 0; --insertion) { Name key = GetSortedKey(insertion - 1); - if (key.Hash() <= hash) break; + if (key.hash() <= hash) break; SetSortedKey(insertion, GetSortedKeyIndex(insertion - 1)); } diff --git a/deps/v8/src/objects/descriptor-array.h b/deps/v8/src/objects/descriptor-array.h index f68948192900d9..890863d5a01268 100644 --- a/deps/v8/src/objects/descriptor-array.h +++ b/deps/v8/src/objects/descriptor-array.h @@ -113,7 +113,7 @@ class DescriptorArray int slack = 0); // Sort the instance descriptors by the hash codes of their keys. - void Sort(); + V8_EXPORT_PRIVATE void Sort(); // Search the instance descriptors for given name. {concurrent_search} signals // if we are doing the search on a background thread. If so, we will sacrifice diff --git a/deps/v8/src/objects/elements-kind.cc b/deps/v8/src/objects/elements-kind.cc index 78670f25bd0af2..15528244e6954b 100644 --- a/deps/v8/src/objects/elements-kind.cc +++ b/deps/v8/src/objects/elements-kind.cc @@ -115,6 +115,13 @@ const char* ElementsKindToString(ElementsKind kind) { } } +const char* CompactElementsKindToString(CompactElementsKind kind) { + if (kind == CompactElementsKind::NON_COMPACT_ELEMENTS_KIND) { + return "NON_COMPACT_ELEMENTS_KIND"; + } + return ElementsKindToString(static_cast(kind)); +} + const ElementsKind kFastElementsKindSequence[kFastElementsKindCount] = { PACKED_SMI_ELEMENTS, // 0 HOLEY_SMI_ELEMENTS, // 1 diff --git a/deps/v8/src/objects/elements-kind.h b/deps/v8/src/objects/elements-kind.h index a5da057aab5fc0..4bd5672b444cea 100644 --- a/deps/v8/src/objects/elements-kind.h +++ b/deps/v8/src/objects/elements-kind.h @@ -364,13 +364,15 @@ enum class CompactElementsKind : uint8_t { }; inline CompactElementsKind ToCompactElementsKind(ElementsKind kind) { - if (base::IsInRange(kind, PACKED_ELEMENTS, HOLEY_DOUBLE_ELEMENTS)) { + if (base::IsInRange(kind, PACKED_SMI_ELEMENTS, HOLEY_DOUBLE_ELEMENTS)) { return static_cast(kind); } return CompactElementsKind::NON_COMPACT_ELEMENTS_KIND; } +const char* CompactElementsKindToString(CompactElementsKind kind); + } // namespace internal } // namespace v8 diff --git a/deps/v8/src/objects/elements.cc b/deps/v8/src/objects/elements.cc index 3057a9ee5a5976..32bd891a74fd57 100644 --- a/deps/v8/src/objects/elements.cc +++ b/deps/v8/src/objects/elements.cc @@ -22,8 +22,8 @@ #include "src/objects/slots-atomic-inl.h" #include "src/objects/slots.h" #include "src/utils/utils.h" -#include "torque-generated/exported-class-definitions-tq-inl.h" -#include "torque-generated/exported-class-definitions-tq.h" +#include "torque-generated/exported-class-definitions-inl.h" +#include "torque-generated/exported-class-definitions.h" // Each concrete ElementsAccessor can handle exactly one ElementsKind, // several abstract ElementsAccessor classes are used to allow sharing @@ -3627,12 +3627,12 @@ class TypedElementsAccessor Handle destination_ta = Handle::cast(destination); DCHECK_LE(offset + length, destination_ta->length()); - CHECK(!destination_ta->WasDetached()); if (length == 0) return *isolate->factory()->undefined_value(); // All conversions from TypedArrays can be done without allocation. if (source->IsJSTypedArray()) { + CHECK(!destination_ta->WasDetached()); Handle source_ta = Handle::cast(source); ElementsKind source_kind = source_ta->GetElementsKind(); bool source_is_bigint = @@ -3647,6 +3647,7 @@ class TypedElementsAccessor return *isolate->factory()->undefined_value(); } } else if (source->IsJSArray()) { + CHECK(!destination_ta->WasDetached()); // Fast cases for packed numbers kinds where we don't need to allocate. Handle source_js_array = Handle::cast(source); size_t current_length; diff --git a/deps/v8/src/objects/embedder-data-array.h b/deps/v8/src/objects/embedder-data-array.h index 4fdf64bfc8536c..728c3cf86aac14 100644 --- a/deps/v8/src/objects/embedder-data-array.h +++ b/deps/v8/src/objects/embedder-data-array.h @@ -8,7 +8,7 @@ #include "src/common/globals.h" #include "src/handles/maybe-handles.h" #include "src/objects/heap-object.h" -#include "torque-generated/class-definitions-tq.h" +#include "torque-generated/class-definitions.h" // Has to be the last include (doesn't have include guards): #include "src/objects/object-macros.h" diff --git a/deps/v8/src/objects/embedder-data-slot-inl.h b/deps/v8/src/objects/embedder-data-slot-inl.h index 3e5276166daf76..2ede262f808141 100644 --- a/deps/v8/src/objects/embedder-data-slot-inl.h +++ b/deps/v8/src/objects/embedder-data-slot-inl.h @@ -99,7 +99,7 @@ bool EmbedderDataSlot::store_aligned_pointer(Isolate* isolate, void* ptr) { } EmbedderDataSlot::RawData EmbedderDataSlot::load_raw( - Isolate* isolate, const DisallowHeapAllocation& no_gc) const { + Isolate* isolate, const DisallowGarbageCollection& no_gc) const { // We don't care about atomicity of access here because embedder slots // are accessed this way only by serializer from the main thread when // GC is not active (concurrent marker may still look at the tagged part @@ -120,7 +120,7 @@ EmbedderDataSlot::RawData EmbedderDataSlot::load_raw( void EmbedderDataSlot::store_raw(Isolate* isolate, EmbedderDataSlot::RawData data, - const DisallowHeapAllocation& no_gc) { + const DisallowGarbageCollection& no_gc) { // We currently have to treat zero as nullptr in embedder slots. if (data) data = EncodeExternalPointer(isolate, data); gc_safe_store(data); diff --git a/deps/v8/src/objects/embedder-data-slot.h b/deps/v8/src/objects/embedder-data-slot.h index 2881ca03b32125..68d71c0177f334 100644 --- a/deps/v8/src/objects/embedder-data-slot.h +++ b/deps/v8/src/objects/embedder-data-slot.h @@ -75,9 +75,9 @@ class EmbedderDataSlot void* ptr); V8_INLINE RawData load_raw(Isolate* isolate, - const DisallowHeapAllocation& no_gc) const; + const DisallowGarbageCollection& no_gc) const; V8_INLINE void store_raw(Isolate* isolate, RawData data, - const DisallowHeapAllocation& no_gc); + const DisallowGarbageCollection& no_gc); private: // Stores given value to the embedder data slot in a concurrent-marker diff --git a/deps/v8/src/objects/feedback-vector-inl.h b/deps/v8/src/objects/feedback-vector-inl.h index 5979e3969fb544..6db9230ebb0fda 100644 --- a/deps/v8/src/objects/feedback-vector-inl.h +++ b/deps/v8/src/objects/feedback-vector-inl.h @@ -21,14 +21,13 @@ namespace v8 { namespace internal { -OBJECT_CONSTRUCTORS_IMPL(FeedbackVector, HeapObject) +TQ_OBJECT_CONSTRUCTORS_IMPL(FeedbackVector) OBJECT_CONSTRUCTORS_IMPL(FeedbackMetadata, HeapObject) OBJECT_CONSTRUCTORS_IMPL(ClosureFeedbackCellArray, FixedArray) NEVER_READ_ONLY_SPACE_IMPL(FeedbackVector) NEVER_READ_ONLY_SPACE_IMPL(ClosureFeedbackCellArray) -CAST_ACCESSOR(FeedbackVector) CAST_ACCESSOR(FeedbackMetadata) CAST_ACCESSOR(ClosureFeedbackCellArray) @@ -99,22 +98,7 @@ Handle ClosureFeedbackCellArray::GetFeedbackCell(int index) { return handle(FeedbackCell::cast(get(index)), GetIsolate()); } -ACCESSORS(FeedbackVector, shared_function_info, SharedFunctionInfo, - kSharedFunctionInfoOffset) -WEAK_ACCESSORS(FeedbackVector, optimized_code_weak_or_smi, - kOptimizedCodeWeakOrSmiOffset) -ACCESSORS(FeedbackVector, closure_feedback_cell_array, ClosureFeedbackCellArray, - kClosureFeedbackCellArrayOffset) -INT32_ACCESSORS(FeedbackVector, length, kLengthOffset) -INT32_ACCESSORS(FeedbackVector, invocation_count, kInvocationCountOffset) -INT32_ACCESSORS(FeedbackVector, profiler_ticks, kProfilerTicksOffset) - -void FeedbackVector::clear_padding() { - if (FIELD_SIZE(kPaddingOffset) == 0) return; - DCHECK_EQ(4, FIELD_SIZE(kPaddingOffset)); - memset(reinterpret_cast(address() + kPaddingOffset), 0, - FIELD_SIZE(kPaddingOffset)); -} +void FeedbackVector::clear_padding() { set_padding(0); } bool FeedbackVector::is_empty() const { return length() == 0; } @@ -156,24 +140,12 @@ FeedbackSlot FeedbackVector::ToSlot(intptr_t index) { } MaybeObject FeedbackVector::Get(FeedbackSlot slot) const { - const Isolate* isolate = GetIsolateForPtrCompr(*this); - return Get(isolate, slot); + return raw_feedback_slots(GetIndex(slot)); } MaybeObject FeedbackVector::Get(const Isolate* isolate, FeedbackSlot slot) const { - return get(isolate, GetIndex(slot)); -} - -MaybeObject FeedbackVector::get(int index) const { - const Isolate* isolate = GetIsolateForPtrCompr(*this); - return get(isolate, index); -} - -MaybeObject FeedbackVector::get(const Isolate* isolate, int index) const { - DCHECK_LT(static_cast(index), static_cast(length())); - int offset = OffsetOfElementAt(index); - return RELAXED_READ_WEAK_FIELD(*this, offset); + return raw_feedback_slots(isolate, GetIndex(slot)); } Handle FeedbackVector::GetClosureFeedbackCell(int index) const { @@ -185,28 +157,16 @@ Handle FeedbackVector::GetClosureFeedbackCell(int index) const { void FeedbackVector::Set(FeedbackSlot slot, MaybeObject value, WriteBarrierMode mode) { - set(GetIndex(slot), value, mode); -} - -void FeedbackVector::set(int index, MaybeObject value, WriteBarrierMode mode) { - DCHECK_GE(index, 0); - DCHECK_LT(index, this->length()); - int offset = OffsetOfElementAt(index); - RELAXED_WRITE_WEAK_FIELD(*this, offset, value); - CONDITIONAL_WEAK_WRITE_BARRIER(*this, offset, value, mode); + set_raw_feedback_slots(GetIndex(slot), value, mode); } void FeedbackVector::Set(FeedbackSlot slot, Object value, WriteBarrierMode mode) { - set(GetIndex(slot), MaybeObject::FromObject(value), mode); -} - -void FeedbackVector::set(int index, Object value, WriteBarrierMode mode) { - set(index, MaybeObject::FromObject(value), mode); + set_raw_feedback_slots(GetIndex(slot), MaybeObject::FromObject(value), mode); } inline MaybeObjectSlot FeedbackVector::slots_start() { - return RawMaybeWeakField(kFeedbackSlotsOffset); + return RawMaybeWeakField(OffsetOfElementAt(0)); } // Helper function to transform the feedback to BinaryOperationHint. @@ -334,8 +294,7 @@ MaybeObject FeedbackNexus::GetFeedbackExtra() const { FeedbackSlotKind kind = vector().GetKind(slot()); DCHECK_LT(1, FeedbackMetadata::GetSlotSize(kind)); #endif - int extra_index = vector().GetIndex(slot()) + 1; - return vector().get(extra_index); + return vector().Get(slot().WithOffset(1)); } void FeedbackNexus::SetFeedback(Object feedback, WriteBarrierMode mode) { @@ -354,8 +313,8 @@ void FeedbackNexus::SetFeedbackExtra(Object feedback_extra, DCHECK_LT(1, FeedbackMetadata::GetSlotSize(kind)); FeedbackVector::AssertNoLegacyTypes(MaybeObject::FromObject(feedback_extra)); #endif - int index = vector().GetIndex(slot()) + 1; - vector().set(index, MaybeObject::FromObject(feedback_extra), mode); + vector().Set(slot().WithOffset(1), MaybeObject::FromObject(feedback_extra), + mode); } void FeedbackNexus::SetFeedbackExtra(MaybeObject feedback_extra, @@ -363,8 +322,7 @@ void FeedbackNexus::SetFeedbackExtra(MaybeObject feedback_extra, #ifdef DEBUG FeedbackVector::AssertNoLegacyTypes(feedback_extra); #endif - int index = vector().GetIndex(slot()) + 1; - vector().set(index, feedback_extra, mode); + vector().Set(slot().WithOffset(1), feedback_extra, mode); } Isolate* FeedbackNexus::GetIsolate() const { return vector().GetIsolate(); } diff --git a/deps/v8/src/objects/feedback-vector.cc b/deps/v8/src/objects/feedback-vector.cc index cf1712b0f054d7..d48cd7eb282736 100644 --- a/deps/v8/src/objects/feedback-vector.cc +++ b/deps/v8/src/objects/feedback-vector.cc @@ -266,7 +266,6 @@ Handle FeedbackVector::New( for (int i = 0; i < slot_count;) { FeedbackSlot slot(i); FeedbackSlotKind kind = feedback_metadata->GetKind(slot); - int index = FeedbackVector::GetIndex(slot); int entry_size = FeedbackMetadata::GetSlotSize(kind); Object extra_value = *uninitialized_sentinel; @@ -275,19 +274,19 @@ Handle FeedbackVector::New( case FeedbackSlotKind::kLoadGlobalNotInsideTypeof: case FeedbackSlotKind::kStoreGlobalSloppy: case FeedbackSlotKind::kStoreGlobalStrict: - vector->set(index, HeapObjectReference::ClearedValue(isolate), + vector->Set(slot, HeapObjectReference::ClearedValue(isolate), SKIP_WRITE_BARRIER); break; case FeedbackSlotKind::kForIn: case FeedbackSlotKind::kCompareOp: case FeedbackSlotKind::kBinaryOp: - vector->set(index, Smi::zero(), SKIP_WRITE_BARRIER); + vector->Set(slot, Smi::zero(), SKIP_WRITE_BARRIER); break; case FeedbackSlotKind::kLiteral: - vector->set(index, Smi::zero(), SKIP_WRITE_BARRIER); + vector->Set(slot, Smi::zero(), SKIP_WRITE_BARRIER); break; case FeedbackSlotKind::kCall: - vector->set(index, *uninitialized_sentinel, SKIP_WRITE_BARRIER); + vector->Set(slot, *uninitialized_sentinel, SKIP_WRITE_BARRIER); extra_value = Smi::zero(); break; case FeedbackSlotKind::kCloneObject: @@ -303,7 +302,7 @@ Handle FeedbackVector::New( case FeedbackSlotKind::kStoreDataPropertyInLiteral: case FeedbackSlotKind::kTypeProfile: case FeedbackSlotKind::kInstanceOf: - vector->set(index, *uninitialized_sentinel, SKIP_WRITE_BARRIER); + vector->Set(slot, *uninitialized_sentinel, SKIP_WRITE_BARRIER); break; case FeedbackSlotKind::kInvalid: @@ -312,7 +311,7 @@ Handle FeedbackVector::New( break; } for (int j = 1; j < entry_size; j++) { - vector->set(index + j, extra_value, SKIP_WRITE_BARRIER); + vector->Set(slot.WithOffset(j), extra_value, SKIP_WRITE_BARRIER); } i += entry_size; } @@ -374,6 +373,11 @@ void FeedbackVector::AddToVectorsForProfilingTools( isolate->SetFeedbackVectorsForProfilingTools(*list); } +void FeedbackVector::SaturatingIncrementProfilerTicks() { + int ticks = profiler_ticks(); + if (ticks < Smi::kMaxValue) set_profiler_ticks(ticks + 1); +} + // static void FeedbackVector::SetOptimizedCode(Handle vector, Handle code) { @@ -409,14 +413,7 @@ void FeedbackVector::EvictOptimizedCodeMarkedForDeoptimization( Code code = Code::cast(slot->GetHeapObject()); if (code.marked_for_deoptimization()) { - if (FLAG_trace_deopt) { - CodeTracer::Scope scope(GetIsolate()->GetCodeTracer()); - PrintF(scope.file(), - "[evicting optimized code marked for deoptimization (%s) for ", - reason); - shared.ShortPrint(scope.file()); - PrintF(scope.file(), "]\n"); - } + Deoptimizer::TraceEvictFromOptimizedCodeCache(shared, reason); if (!code.deopt_already_counted()) { code.set_deopt_already_counted(true); } diff --git a/deps/v8/src/objects/feedback-vector.h b/deps/v8/src/objects/feedback-vector.h index f84a33c598a674..677ec2245700e1 100644 --- a/deps/v8/src/objects/feedback-vector.h +++ b/deps/v8/src/objects/feedback-vector.h @@ -17,6 +17,7 @@ #include "src/objects/name.h" #include "src/objects/type-hints.h" #include "src/zone/zone-containers.h" +#include "torque-generated/class-definitions.h" // Has to be the last include (doesn't have include guards): #include "src/objects/object-macros.h" @@ -180,38 +181,17 @@ class ClosureFeedbackCellArray : public FixedArray { // - optimized code cell (weak cell or Smi marker) // followed by an array of feedback slots, of length determined by the feedback // metadata. -class FeedbackVector : public HeapObject { +class FeedbackVector + : public TorqueGeneratedFeedbackVector { public: NEVER_READ_ONLY_SPACE - DECL_CAST(FeedbackVector) - inline bool is_empty() const; inline FeedbackMetadata metadata() const; - // [shared_function_info]: The shared function info for the function with this - // feedback vector. - DECL_ACCESSORS(shared_function_info, SharedFunctionInfo) - - // [optimized_code_weak_or_smi]: weak reference to optimized code or a Smi - // marker defining optimization behaviour. - DECL_ACCESSORS(optimized_code_weak_or_smi, MaybeObject) - - // [feedback_cell_array]: The FixedArray to hold the feedback cells for any - // closures created by this function. - DECL_ACCESSORS(closure_feedback_cell_array, ClosureFeedbackCellArray) - - // [length]: The length of the feedback vector (not including the header, i.e. - // the number of feedback slots). - DECL_INT32_ACCESSORS(length) - - // [invocation_count]: The number of times this function has been invoked. - DECL_INT32_ACCESSORS(invocation_count) - - // [profiler_ticks]: The number of times this function has been seen by the - // runtime profiler. - DECL_INT32_ACCESSORS(profiler_ticks) + // Increment profiler ticks, saturating at the maximal value. + void SaturatingIncrementProfilerTicks(); // Initialize the padding if necessary. inline void clear_padding(); @@ -239,16 +219,10 @@ class FeedbackVector : public HeapObject { static inline FeedbackSlot ToSlot(intptr_t index); inline MaybeObject Get(FeedbackSlot slot) const; inline MaybeObject Get(const Isolate* isolate, FeedbackSlot slot) const; - inline MaybeObject get(int index) const; - inline MaybeObject get(const Isolate* isolate, int index) const; inline void Set(FeedbackSlot slot, MaybeObject value, WriteBarrierMode mode = UPDATE_WRITE_BARRIER); - inline void set(int index, MaybeObject value, - WriteBarrierMode mode = UPDATE_WRITE_BARRIER); inline void Set(FeedbackSlot slot, Object value, WriteBarrierMode mode = UPDATE_WRITE_BARRIER); - inline void set(int index, Object value, - WriteBarrierMode mode = UPDATE_WRITE_BARRIER); // Returns the feedback cell at |index| that is used to create the // closure. @@ -300,7 +274,6 @@ class FeedbackVector : public HeapObject { V8_EXPORT_PRIVATE static void AssertNoLegacyTypes(MaybeObject object); DECL_PRINTER(FeedbackVector) - DECL_VERIFIER(FeedbackVector) void FeedbackSlotPrint(std::ostream& os, FeedbackSlot slot); // NOLINT @@ -320,28 +293,23 @@ class FeedbackVector : public HeapObject { // garbage collection (e.g., for patching the cache). static inline Symbol RawUninitializedSentinel(Isolate* isolate); - // Layout description. - DEFINE_FIELD_OFFSET_CONSTANTS(HeapObject::kHeaderSize, - TORQUE_GENERATED_FEEDBACK_VECTOR_FIELDS) - - static_assert(kSize % kObjectAlignment == 0, + static_assert(kHeaderSize % kObjectAlignment == 0, "Header must be padded for alignment"); - static const int kFeedbackSlotsOffset = kHeaderSize; class BodyDescriptor; static constexpr int OffsetOfElementAt(int index) { - return kFeedbackSlotsOffset + index * kTaggedSize; + return kRawFeedbackSlotsOffset + index * kTaggedSize; } - // Garbage collection support. - static constexpr int SizeFor(int length) { return OffsetOfElementAt(length); } + TQ_OBJECT_CONSTRUCTORS(FeedbackVector) private: static void AddToVectorsForProfilingTools(Isolate* isolate, Handle vector); - OBJECT_CONSTRUCTORS(FeedbackVector, HeapObject); + // Don't expose the raw feedback slot getter/setter. + using TorqueGeneratedFeedbackVector::raw_feedback_slots; }; class V8_EXPORT_PRIVATE FeedbackVectorSpec { @@ -789,12 +757,27 @@ class V8_EXPORT_PRIVATE FeedbackIterator final { Map map() { return map_; } MaybeObject handler() { return handler_; } + static int SizeFor(int number_of_entries) { + CHECK_GT(number_of_entries, 0); + return number_of_entries * kEntrySize; + } + + static int MapIndexForEntry(int entry) { + CHECK_GE(entry, 0); + return entry * kEntrySize; + } + + static int HandlerIndexForEntry(int entry) { + CHECK_GE(entry, 0); + return (entry * kEntrySize) + kHandlerOffset; + } + private: void AdvancePolymorphic(); enum State { kMonomorphic, kPolymorphic, kOther }; + static constexpr int kEntrySize = 2; static constexpr int kHandlerOffset = 1; - Handle polymorphic_feedback_; Map map_; MaybeObject handler_; diff --git a/deps/v8/src/objects/feedback-vector.tq b/deps/v8/src/objects/feedback-vector.tq index 8ede5579d5476d..794a159ca911b2 100644 --- a/deps/v8/src/objects/feedback-vector.tq +++ b/deps/v8/src/objects/feedback-vector.tq @@ -2,10 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +@generateBodyDescriptor +@generateCppClass extern class FeedbackVector extends HeapObject { - shared_function_info: SharedFunctionInfo; - optimized_code_weak_or_smi: Weak|Smi; - closure_feedback_cell_array: FixedArray; const length: int32; invocation_count: int32; profiler_ticks: int32; @@ -13,8 +12,10 @@ extern class FeedbackVector extends HeapObject { // tagged pointers, we should make it conditional; however, platform-specific // interacts badly with GCMole, so we need to address that first. padding: uint32; - // TODO(tebbi): The variable-length feedback_slots field should be declared - // here once it is possible to declare tagged slots after untagged slots. + shared_function_info: SharedFunctionInfo; + optimized_code_weak_or_smi: Weak|Smi; + closure_feedback_cell_array: ClosureFeedbackCellArray; + raw_feedback_slots[length]: MaybeObject; } extern class FeedbackMetadata extends HeapObject; diff --git a/deps/v8/src/objects/fixed-array-inl.h b/deps/v8/src/objects/fixed-array-inl.h index 7c0013e3b2e00a..e60224315826c7 100644 --- a/deps/v8/src/objects/fixed-array-inl.h +++ b/deps/v8/src/objects/fixed-array-inl.h @@ -20,8 +20,7 @@ #include "src/objects/slots.h" #include "src/roots/roots-inl.h" #include "src/sanitizer/tsan.h" - -#include "torque-generated/class-definitions-tq-inl.h" +#include "torque-generated/class-definitions-inl.h" // Has to be the last include (doesn't have include guards): #include "src/objects/object-macros.h" @@ -88,7 +87,6 @@ bool FixedArray::is_the_hole(Isolate* isolate, int index) { return get(isolate, index).IsTheHole(isolate); } -#if !defined(_WIN32) || defined(_WIN64) void FixedArray::set(int index, Smi value) { DCHECK_NE(map(), GetReadOnlyRoots().fixed_cow_array_map()); DCHECK_LT(static_cast(index), static_cast(length())); @@ -96,7 +94,6 @@ void FixedArray::set(int index, Smi value) { int offset = OffsetOfElementAt(index); RELAXED_WRITE_FIELD(*this, offset, value); } -#endif void FixedArray::set(int index, Object value) { DCHECK_NE(GetReadOnlyRoots().fixed_cow_array_map(), map()); @@ -236,7 +233,7 @@ int BinarySearch(T* array, Name name, int valid_entries, // index). After doing the binary search and getting the correct internal // index we check to have the index lower than valid_entries, if needed. int high = array->number_of_entries() - 1; - uint32_t hash = name.hash_field(); + uint32_t hash = name.hash(); int limit = high; DCHECK(low <= high); @@ -244,7 +241,7 @@ int BinarySearch(T* array, Name name, int valid_entries, while (low != high) { int mid = low + (high - low) / 2; Name mid_name = array->GetSortedKey(mid); - uint32_t mid_hash = mid_name.hash_field(); + uint32_t mid_hash = mid_name.hash(); if (mid_hash >= hash) { high = mid; @@ -256,7 +253,7 @@ int BinarySearch(T* array, Name name, int valid_entries, for (; low <= limit; ++low) { int sort_index = array->GetSortedKeyIndex(low); Name entry = array->GetKey(InternalIndex(sort_index)); - uint32_t current_hash = entry.hash_field(); + uint32_t current_hash = entry.hash(); if (current_hash != hash) { // 'search_mode == ALL_ENTRIES' here and below is not needed since // 'out_insertion_index != nullptr' implies 'search_mode == ALL_ENTRIES'. @@ -288,12 +285,12 @@ template int LinearSearch(T* array, Name name, int valid_entries, int* out_insertion_index) { if (search_mode == ALL_ENTRIES && out_insertion_index != nullptr) { - uint32_t hash = name.hash_field(); + uint32_t hash = name.hash(); int len = array->number_of_entries(); for (int number = 0; number < len; number++) { int sorted_index = array->GetSortedKeyIndex(number); Name entry = array->GetKey(InternalIndex(sorted_index)); - uint32_t current_hash = entry.hash_field(); + uint32_t current_hash = entry.hash(); if (current_hash > hash) { *out_insertion_index = sorted_index; return T::kNotFound; diff --git a/deps/v8/src/objects/fixed-array.h b/deps/v8/src/objects/fixed-array.h index 9ec197ca1f6115..5054f16b4105ce 100644 --- a/deps/v8/src/objects/fixed-array.h +++ b/deps/v8/src/objects/fixed-array.h @@ -9,7 +9,7 @@ #include "src/objects/instance-type.h" #include "src/objects/objects.h" #include "src/objects/smi.h" -#include "torque-generated/class-definitions-tq.h" +#include "torque-generated/class-definitions.h" // Has to be the last include (doesn't have include guards): #include "src/objects/object-macros.h" @@ -122,18 +122,7 @@ class FixedArray inline bool is_the_hole(Isolate* isolate, int index); // Setter that doesn't need write barrier. -#if defined(_WIN32) && !defined(_WIN64) - inline void set(int index, Smi value) { - DCHECK_NE(map(), GetReadOnlyRoots().fixed_cow_array_map()); - DCHECK_LT(static_cast(index), static_cast(length())); - DCHECK(Object(value).IsSmi()); - int offset = OffsetOfElementAt(index); - RELAXED_WRITE_FIELD(*this, offset, value); - } -#else inline void set(int index, Smi value); -#endif - // Setter with explicit barrier mode. inline void set(int index, Object value, WriteBarrierMode mode); @@ -307,7 +296,6 @@ class WeakFixedArray int AllocatedSize(); - protected: static int OffsetOfElementAt(int index) { STATIC_ASSERT(kObjectsOffset == SizeFor(0)); return SizeFor(index); diff --git a/deps/v8/src/objects/fixed-array.tq b/deps/v8/src/objects/fixed-array.tq index 39428ab36c1168..86ebea5db81b4e 100644 --- a/deps/v8/src/objects/fixed-array.tq +++ b/deps/v8/src/objects/fixed-array.tq @@ -91,7 +91,7 @@ extern macro StoreFixedArrayElement( FixedArray, intptr, Smi, constexpr WriteBarrierMode): void; extern operator '.floats[]=' macro StoreFixedDoubleArrayElement( FixedDoubleArray, intptr, float64): void; -extern operator '.floats[]=' macro StoreFixedDoubleArrayElementSmi( +extern operator '.floats[]=' macro StoreFixedDoubleArrayElement( FixedDoubleArray, Smi, float64): void; extern operator '.floats[]' macro LoadFixedDoubleArrayElement( FixedDoubleArray, intptr): float64; diff --git a/deps/v8/src/objects/foreign.h b/deps/v8/src/objects/foreign.h index 9d28109a1235b5..2dd869d5ace727 100644 --- a/deps/v8/src/objects/foreign.h +++ b/deps/v8/src/objects/foreign.h @@ -6,7 +6,7 @@ #define V8_OBJECTS_FOREIGN_H_ #include "src/objects/heap-object.h" -#include "torque-generated/class-definitions-tq.h" +#include "torque-generated/class-definitions.h" // Has to be the last include (doesn't have include guards): #include "src/objects/object-macros.h" diff --git a/deps/v8/src/objects/free-space.h b/deps/v8/src/objects/free-space.h index ad5ffa075cf59d..7bed4a1a7cc1a4 100644 --- a/deps/v8/src/objects/free-space.h +++ b/deps/v8/src/objects/free-space.h @@ -6,7 +6,7 @@ #define V8_OBJECTS_FREE_SPACE_H_ #include "src/objects/heap-object.h" -#include "torque-generated/class-definitions-tq.h" +#include "torque-generated/class-definitions.h" // Has to be the last include (doesn't have include guards): #include "src/objects/object-macros.h" diff --git a/deps/v8/src/objects/heap-object.h b/deps/v8/src/objects/heap-object.h index 37abc61c11bd2d..2f16236e025072 100644 --- a/deps/v8/src/objects/heap-object.h +++ b/deps/v8/src/objects/heap-object.h @@ -62,9 +62,7 @@ class HeapObject : public Object { DECL_GETTER(synchronized_map_word, MapWord) inline void synchronized_set_map_word(MapWord map_word); - // TODO(v8:7464): Once RO_SPACE is shared between isolates, this method can be - // removed as ReadOnlyRoots will be accessible from a global variable. For now - // this method exists to help remove GetIsolate/GetHeap from HeapObject, in a + // This method exists to help remove GetIsolate/GetHeap from HeapObject, in a // way that doesn't require passing Isolate/Heap down huge call chains or to // places where it might not be safe to access it. inline ReadOnlyRoots GetReadOnlyRoots() const; diff --git a/deps/v8/src/objects/instance-type.h b/deps/v8/src/objects/instance-type.h index 3a324e4b1fdcdf..2b230224e36e04 100644 --- a/deps/v8/src/objects/instance-type.h +++ b/deps/v8/src/objects/instance-type.h @@ -10,8 +10,7 @@ // Has to be the last include (doesn't have include guards): #include "src/objects/object-macros.h" - -#include "torque-generated/instance-types-tq.h" +#include "torque-generated/instance-types.h" namespace v8 { namespace internal { diff --git a/deps/v8/src/objects/internal-index.h b/deps/v8/src/objects/internal-index.h index 7cc9fa67387235..130d4d18688405 100644 --- a/deps/v8/src/objects/internal-index.h +++ b/deps/v8/src/objects/internal-index.h @@ -40,7 +40,8 @@ class InternalIndex { return static_cast(entry_); } constexpr int as_int() const { - CONSTEXPR_DCHECK(entry_ <= std::numeric_limits::max()); + CONSTEXPR_DCHECK(entry_ <= + static_cast(std::numeric_limits::max())); return static_cast(entry_); } diff --git a/deps/v8/src/objects/intl-objects.tq b/deps/v8/src/objects/intl-objects.tq index cbfcc360bb9acc..88714f2bee5c97 100644 --- a/deps/v8/src/objects/intl-objects.tq +++ b/deps/v8/src/objects/intl-objects.tq @@ -134,6 +134,7 @@ bitfield struct JSSegmentIteratorFlags extends uint31 { @generateCppClass extern class JSSegmentIterator extends JSObject { icu_break_iterator: Foreign; // Managed + unicode_string: Foreign; // Managed flags: SmiTagged; } @@ -153,4 +154,5 @@ extern class JSV8BreakIterator extends JSObject { extern class JSCollator extends JSObject { icu_collator: Foreign; // Managed bound_compare: Undefined|JSFunction; + locale: String; } diff --git a/deps/v8/src/objects/js-array-buffer.h b/deps/v8/src/objects/js-array-buffer.h index 3d6b293e2dfdd7..543cbc1a34ac31 100644 --- a/deps/v8/src/objects/js-array-buffer.h +++ b/deps/v8/src/objects/js-array-buffer.h @@ -7,7 +7,7 @@ #include "src/objects/backing-store.h" #include "src/objects/js-objects.h" -#include "torque-generated/bit-fields-tq.h" +#include "torque-generated/bit-fields.h" // Has to be the last include (doesn't have include guards): #include "src/objects/object-macros.h" diff --git a/deps/v8/src/objects/js-array.h b/deps/v8/src/objects/js-array.h index 6cf54df896fde9..cd1d2d800d10f3 100644 --- a/deps/v8/src/objects/js-array.h +++ b/deps/v8/src/objects/js-array.h @@ -8,7 +8,7 @@ #include "src/objects/allocation-site.h" #include "src/objects/fixed-array.h" #include "src/objects/js-objects.h" -#include "torque-generated/field-offsets-tq.h" +#include "torque-generated/field-offsets.h" // Has to be the last include (doesn't have include guards): #include "src/objects/object-macros.h" diff --git a/deps/v8/src/objects/js-break-iterator.h b/deps/v8/src/objects/js-break-iterator.h index 20c177a5f6078c..e06b7b42b0b25f 100644 --- a/deps/v8/src/objects/js-break-iterator.h +++ b/deps/v8/src/objects/js-break-iterator.h @@ -15,7 +15,7 @@ #include "src/objects/intl-objects.h" #include "src/objects/managed.h" #include "src/objects/objects.h" -#include "torque-generated/field-offsets-tq.h" +#include "torque-generated/field-offsets.h" // Has to be the last include (doesn't have include guards): #include "src/objects/object-macros.h" diff --git a/deps/v8/src/objects/js-collator.cc b/deps/v8/src/objects/js-collator.cc index b3b3c8fb55ae79..8d5dd0c56a4f52 100644 --- a/deps/v8/src/objects/js-collator.cc +++ b/deps/v8/src/objects/js-collator.cc @@ -196,8 +196,26 @@ Handle JSCollator::ResolvedOptions(Isolate* isolate, // [[Collation]] "collation" // [[Numeric]] "numeric" kn // [[CaseFirst]] "caseFirst" kf - CreateDataPropertyForOptions( - isolate, options, isolate->factory()->locale_string(), locale.c_str()); + + // If the collator return the locale differ from what got requested, we stored + // it in the collator->locale. Otherwise, we just use the one from the + // collator. + if (collator->locale().length() != 0) { + // Get the locale from collator->locale() since we know in some cases + // collator won't be able to return the requested one, such as zh_CN. + Handle locale_from_collator(collator->locale(), isolate); + Maybe maybe = JSReceiver::CreateDataProperty( + isolate, options, isolate->factory()->locale_string(), + locale_from_collator, Just(kDontThrow)); + DCHECK(maybe.FromJust()); + USE(maybe); + } else { + // Just return from the collator for most of the cases that we can recover + // from the collator. + CreateDataPropertyForOptions( + isolate, options, isolate->factory()->locale_string(), locale.c_str()); + } + CreateDataPropertyForOptions(isolate, options, isolate->factory()->usage_string(), usage); CreateDataPropertyForOptions( @@ -424,6 +442,9 @@ MaybeHandle JSCollator::New(Isolate* isolate, Handle map, } DCHECK(U_SUCCESS(status)); + icu::Locale collator_locale( + icu_collator->getLocale(ULOC_VALID_LOCALE, status)); + // 22. If relevantExtensionKeys contains "kn", then // a. Set collator.[[Numeric]] to ! SameValue(r.[[kn]], "true"). // @@ -521,11 +542,15 @@ MaybeHandle JSCollator::New(Isolate* isolate, Handle map, Managed::FromUniquePtr(isolate, 0, std::move(icu_collator)); + // We only need to do so if it is different from the collator would return. + Handle locale_str = isolate->factory()->NewStringFromAsciiChecked( + (collator_locale != icu_locale) ? r.locale.c_str() : ""); // Now all properties are ready, so we can allocate the result object. Handle collator = Handle::cast( isolate->factory()->NewFastOrSlowJSObjectFromMap(map)); DisallowHeapAllocation no_gc; collator->set_icu_collator(*managed_collator); + collator->set_locale(*locale_str); // 29. Return collator. return collator; diff --git a/deps/v8/src/objects/js-date-time-format.cc b/deps/v8/src/objects/js-date-time-format.cc index c5181ecb9ec5b1..3e9cff0df8261c 100644 --- a/deps/v8/src/objects/js-date-time-format.cc +++ b/deps/v8/src/objects/js-date-time-format.cc @@ -432,8 +432,10 @@ std::string CanonicalizeTimeZoneID(const std::string& input) { } } else if (memcmp(upper.c_str(), "US/", 3) == 0) { std::string title = ToTitleCaseTimezoneLocation(input); - // Change "Us/" to "US/" - title[1] = 'S'; + if (title.length() >= 2) { + // Change "Us/" to "US/" + title[1] = 'S'; + } return title; } else if (memcmp(upper.c_str(), "SYSTEMV/", 8) == 0) { upper.replace(0, 8, "SystemV/"); @@ -568,8 +570,8 @@ MaybeHandle JSDateTimeFormat::ResolvedOptions( // [[Hour]] "hour" // [[Minute]] "minute" // [[Second]] "second" - // [[TimeZoneName]] "timeZoneName" // [[FractionalSecondDigits]] "fractionalSecondDigits" + // [[TimeZoneName]] "timeZoneName" Maybe maybe_create_locale = JSReceiver::CreateDataProperty( isolate, options, factory->locale_string(), locale, Just(kDontThrow)); DCHECK(maybe_create_locale.FromJust()); @@ -636,6 +638,18 @@ MaybeHandle JSDateTimeFormat::ResolvedOptions( if (date_time_format->date_style() == DateTimeStyle::kUndefined && date_time_format->time_style() == DateTimeStyle::kUndefined) { for (const auto& item : GetPatternItems()) { + // fractionalSecondsDigits need to be added before timeZoneName + if (item.property == "timeZoneName") { + int fsd = FractionalSecondDigitsFromPattern(pattern); + if (fsd > 0) { + Maybe maybe_create_fractional_seconds_digits = + JSReceiver::CreateDataProperty( + isolate, options, factory->fractionalSecondDigits_string(), + factory->NewNumberFromInt(fsd), Just(kDontThrow)); + DCHECK(maybe_create_fractional_seconds_digits.FromJust()); + USE(maybe_create_fractional_seconds_digits); + } + } for (const auto& pair : item.pairs) { if (pattern.find(pair.pattern) != std::string::npos) { Maybe maybe_create_property = JSReceiver::CreateDataProperty( @@ -649,15 +663,6 @@ MaybeHandle JSDateTimeFormat::ResolvedOptions( } } } - int fsd = FractionalSecondDigitsFromPattern(pattern); - if (fsd > 0) { - Maybe maybe_create_fractional_seconds_digits = - JSReceiver::CreateDataProperty( - isolate, options, factory->fractionalSecondDigits_string(), - factory->NewNumberFromInt(fsd), Just(kDontThrow)); - DCHECK(maybe_create_fractional_seconds_digits.FromJust()); - USE(maybe_create_fractional_seconds_digits); - } } // dateStyle @@ -1653,6 +1658,19 @@ MaybeHandle JSDateTimeFormat::New( bool has_hour_option = false; std::string skeleton; for (const PatternData& item : GetPatternData(hc)) { + // Need to read fractionalSecondDigits before reading the timeZoneName + if (item.property == "timeZoneName") { + // Let _value_ be ? GetNumberOption(options, "fractionalSecondDigits", 1, + // 3, *undefined*). The *undefined* is represented by value 0 here. + Maybe maybe_fsd = Intl::GetNumberOption( + isolate, options, factory->fractionalSecondDigits_string(), 1, 3, 0); + MAYBE_RETURN(maybe_fsd, MaybeHandle()); + // Convert fractionalSecondDigits to skeleton. + int fsd = maybe_fsd.FromJust(); + for (int i = 0; i < fsd; i++) { + skeleton += "S"; + } + } std::unique_ptr input; // i. Let prop be the name given in the Property column of the row. // ii. Let value be ? GetOption(options, prop, "string", « the strings @@ -1670,16 +1688,6 @@ MaybeHandle JSDateTimeFormat::New( skeleton += item.map.find(input.get())->second; } } - // Let _value_ be ? GetNumberOption(options, "fractionalSecondDigits", 1, 3, - // *undefined*). The *undefined* is represented by value 0 here. - Maybe maybe_fsd = Intl::GetNumberOption( - isolate, options, factory->fractionalSecondDigits_string(), 1, 3, 0); - MAYBE_RETURN(maybe_fsd, MaybeHandle()); - // Convert fractionalSecondDigits to skeleton. - int fsd = maybe_fsd.FromJust(); - for (int i = 0; i < fsd; i++) { - skeleton += "S"; - } // 29. Let matcher be ? GetOption(options, "formatMatcher", "string", « // "basic", "best fit" », "best fit"). @@ -1738,13 +1746,32 @@ MaybeHandle JSDateTimeFormat::New( // iii. If p is not undefined, then // 1. Throw a TypeError exception. if (skeleton.length() > 0) { - THROW_NEW_ERROR(isolate, - NewTypeError(MessageTemplate::kInvalid, - factory->NewStringFromStaticChars("option"), - date_style != DateTimeStyle::kUndefined - ? factory->dateStyle_string() - : factory->timeStyle_string()), - JSDateTimeFormat); + std::string prop; + for (const auto& item : GetPatternItems()) { + for (const auto& pair : item.pairs) { + if (skeleton.find(pair.pattern) != std::string::npos) { + prop.assign(item.property); + break; + } + } + if (!prop.empty()) { + break; + } + } + if (prop.empty() && skeleton.find("S") != std::string::npos) { + prop.assign("fractionalSecondDigits"); + } + if (!prop.empty()) { + THROW_NEW_ERROR( + isolate, + NewTypeError(MessageTemplate::kCantSetOptionXWhenYIsUsed, + factory->NewStringFromAsciiChecked(prop.c_str()), + date_style != DateTimeStyle::kUndefined + ? factory->dateStyle_string() + : factory->timeStyle_string()), + JSDateTimeFormat); + } + UNREACHABLE(); } // b. Let pattern be DateTimeStylePattern(dateStyle, timeStyle, // dataLocaleData, hc). diff --git a/deps/v8/src/objects/js-date-time-format.h b/deps/v8/src/objects/js-date-time-format.h index 1e5720760e6677..64c89eeaeb6fee 100644 --- a/deps/v8/src/objects/js-date-time-format.h +++ b/deps/v8/src/objects/js-date-time-format.h @@ -16,7 +16,7 @@ #include "src/execution/isolate.h" #include "src/objects/intl-objects.h" #include "src/objects/managed.h" -#include "torque-generated/field-offsets-tq.h" +#include "torque-generated/field-offsets.h" #include "unicode/uversion.h" // Has to be the last include (doesn't have include guards): diff --git a/deps/v8/src/objects/js-function-inl.h b/deps/v8/src/objects/js-function-inl.h new file mode 100644 index 00000000000000..606deb290ae727 --- /dev/null +++ b/deps/v8/src/objects/js-function-inl.h @@ -0,0 +1,304 @@ +// Copyright 2020 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef V8_OBJECTS_JS_FUNCTION_INL_H_ +#define V8_OBJECTS_JS_FUNCTION_INL_H_ + +#include "src/codegen/compiler.h" +#include "src/diagnostics/code-tracer.h" +#include "src/heap/heap-inl.h" +#include "src/ic/ic.h" +#include "src/init/bootstrapper.h" +#include "src/objects/feedback-cell-inl.h" +#include "src/objects/js-function.h" +#include "src/strings/string-builder-inl.h" + +// Has to be the last include (doesn't have include guards): +#include "src/objects/object-macros.h" + +namespace v8 { +namespace internal { + +TQ_OBJECT_CONSTRUCTORS_IMPL(JSFunctionOrBoundFunction) +TQ_OBJECT_CONSTRUCTORS_IMPL(JSBoundFunction) +OBJECT_CONSTRUCTORS_IMPL(JSFunction, JSFunctionOrBoundFunction) + +CAST_ACCESSOR(JSFunction) + +ACCESSORS(JSFunction, raw_feedback_cell, FeedbackCell, kFeedbackCellOffset) + +FeedbackVector JSFunction::feedback_vector() const { + DCHECK(has_feedback_vector()); + return FeedbackVector::cast(raw_feedback_cell().value()); +} + +ClosureFeedbackCellArray JSFunction::closure_feedback_cell_array() const { + DCHECK(has_closure_feedback_cell_array()); + return ClosureFeedbackCellArray::cast(raw_feedback_cell().value()); +} + +bool JSFunction::HasOptimizationMarker() { + return has_feedback_vector() && feedback_vector().has_optimization_marker(); +} + +void JSFunction::ClearOptimizationMarker() { + DCHECK(has_feedback_vector()); + feedback_vector().ClearOptimizationMarker(); +} + +bool JSFunction::ChecksOptimizationMarker() { + return code().checks_optimization_marker(); +} + +bool JSFunction::IsMarkedForOptimization() { + return has_feedback_vector() && feedback_vector().optimization_marker() == + OptimizationMarker::kCompileOptimized; +} + +bool JSFunction::IsMarkedForConcurrentOptimization() { + return has_feedback_vector() && + feedback_vector().optimization_marker() == + OptimizationMarker::kCompileOptimizedConcurrent; +} + +void JSFunction::MarkForOptimization(ConcurrencyMode mode) { + Isolate* isolate = GetIsolate(); + if (!isolate->concurrent_recompilation_enabled() || + isolate->bootstrapper()->IsActive()) { + mode = ConcurrencyMode::kNotConcurrent; + } + + DCHECK(!is_compiled() || ActiveTierIsIgnition() || ActiveTierIsNCI()); + DCHECK(!ActiveTierIsTurbofan()); + DCHECK(shared().IsInterpreted()); + DCHECK(shared().allows_lazy_compilation() || + !shared().optimization_disabled()); + + if (mode == ConcurrencyMode::kConcurrent) { + if (IsInOptimizationQueue()) { + if (FLAG_trace_concurrent_recompilation) { + PrintF(" ** Not marking "); + ShortPrint(); + PrintF(" -- already in optimization queue.\n"); + } + return; + } + if (FLAG_trace_concurrent_recompilation) { + PrintF(" ** Marking "); + ShortPrint(); + PrintF(" for concurrent recompilation.\n"); + } + } + + SetOptimizationMarker(mode == ConcurrencyMode::kConcurrent + ? OptimizationMarker::kCompileOptimizedConcurrent + : OptimizationMarker::kCompileOptimized); +} + +bool JSFunction::IsInOptimizationQueue() { + return has_feedback_vector() && feedback_vector().optimization_marker() == + OptimizationMarker::kInOptimizationQueue; +} + +void JSFunction::CompleteInobjectSlackTrackingIfActive() { + if (!has_prototype_slot()) return; + if (has_initial_map() && initial_map().IsInobjectSlackTrackingInProgress()) { + initial_map().CompleteInobjectSlackTracking(GetIsolate()); + } +} + +AbstractCode JSFunction::abstract_code() { + if (ActiveTierIsIgnition()) { + return AbstractCode::cast(shared().GetBytecodeArray()); + } else { + return AbstractCode::cast(code()); + } +} + +int JSFunction::length() { return shared().length(); } + +Code JSFunction::code() const { + return Code::cast(RELAXED_READ_FIELD(*this, kCodeOffset)); +} + +void JSFunction::set_code(Code value) { + DCHECK(!ObjectInYoungGeneration(value)); + RELAXED_WRITE_FIELD(*this, kCodeOffset, value); +#ifndef V8_DISABLE_WRITE_BARRIERS + WriteBarrier::Marking(*this, RawField(kCodeOffset), value); +#endif +} + +void JSFunction::set_code_no_write_barrier(Code value) { + DCHECK(!ObjectInYoungGeneration(value)); + RELAXED_WRITE_FIELD(*this, kCodeOffset, value); +} + +// TODO(ishell): Why relaxed read but release store? +DEF_GETTER(JSFunction, shared, SharedFunctionInfo) { + return SharedFunctionInfo::cast( + RELAXED_READ_FIELD(*this, kSharedFunctionInfoOffset)); +} + +void JSFunction::set_shared(SharedFunctionInfo value, WriteBarrierMode mode) { + // Release semantics to support acquire read in NeedsResetDueToFlushedBytecode + RELEASE_WRITE_FIELD(*this, kSharedFunctionInfoOffset, value); + CONDITIONAL_WRITE_BARRIER(*this, kSharedFunctionInfoOffset, value, mode); +} + +void JSFunction::ClearOptimizedCodeSlot(const char* reason) { + if (has_feedback_vector() && feedback_vector().has_optimized_code()) { + if (FLAG_trace_opt) { + CodeTracer::Scope scope(GetIsolate()->GetCodeTracer()); + PrintF(scope.file(), + "[evicting entry from optimizing code feedback slot (%s) for ", + reason); + ShortPrint(scope.file()); + PrintF(scope.file(), "]\n"); + } + feedback_vector().ClearOptimizedCode(); + } +} + +void JSFunction::SetOptimizationMarker(OptimizationMarker marker) { + DCHECK(has_feedback_vector()); + DCHECK(ChecksOptimizationMarker()); + DCHECK(!ActiveTierIsTurbofan()); + + feedback_vector().SetOptimizationMarker(marker); +} + +bool JSFunction::has_feedback_vector() const { + return shared().is_compiled() && + raw_feedback_cell().value().IsFeedbackVector(); +} + +bool JSFunction::has_closure_feedback_cell_array() const { + return shared().is_compiled() && + raw_feedback_cell().value().IsClosureFeedbackCellArray(); +} + +Context JSFunction::context() { + return TaggedField::load(*this); +} + +bool JSFunction::has_context() const { + return TaggedField::load(*this).IsContext(); +} + +JSGlobalProxy JSFunction::global_proxy() { return context().global_proxy(); } + +NativeContext JSFunction::native_context() { + return context().native_context(); +} + +void JSFunction::set_context(HeapObject value) { + DCHECK(value.IsUndefined() || value.IsContext()); + WRITE_FIELD(*this, kContextOffset, value); + WRITE_BARRIER(*this, kContextOffset, value); +} + +ACCESSORS_CHECKED(JSFunction, prototype_or_initial_map, HeapObject, + kPrototypeOrInitialMapOffset, map().has_prototype_slot()) + +DEF_GETTER(JSFunction, has_prototype_slot, bool) { + return map(isolate).has_prototype_slot(); +} + +DEF_GETTER(JSFunction, initial_map, Map) { + return Map::cast(prototype_or_initial_map(isolate)); +} + +DEF_GETTER(JSFunction, has_initial_map, bool) { + DCHECK(has_prototype_slot(isolate)); + return prototype_or_initial_map(isolate).IsMap(isolate); +} + +DEF_GETTER(JSFunction, has_instance_prototype, bool) { + DCHECK(has_prototype_slot(isolate)); + // Can't use ReadOnlyRoots(isolate) as this isolate could be produced by + // i::GetIsolateForPtrCompr(HeapObject). + return has_initial_map(isolate) || + !prototype_or_initial_map(isolate).IsTheHole( + GetReadOnlyRoots(isolate)); +} + +DEF_GETTER(JSFunction, has_prototype, bool) { + DCHECK(has_prototype_slot(isolate)); + return map(isolate).has_non_instance_prototype() || + has_instance_prototype(isolate); +} + +DEF_GETTER(JSFunction, has_prototype_property, bool) { + return (has_prototype_slot(isolate) && IsConstructor(isolate)) || + IsGeneratorFunction(shared(isolate).kind()); +} + +DEF_GETTER(JSFunction, PrototypeRequiresRuntimeLookup, bool) { + return !has_prototype_property(isolate) || + map(isolate).has_non_instance_prototype(); +} + +DEF_GETTER(JSFunction, instance_prototype, HeapObject) { + DCHECK(has_instance_prototype(isolate)); + if (has_initial_map(isolate)) return initial_map(isolate).prototype(isolate); + // When there is no initial map and the prototype is a JSReceiver, the + // initial map field is used for the prototype field. + return HeapObject::cast(prototype_or_initial_map(isolate)); +} + +DEF_GETTER(JSFunction, prototype, Object) { + DCHECK(has_prototype(isolate)); + // If the function's prototype property has been set to a non-JSReceiver + // value, that value is stored in the constructor field of the map. + if (map(isolate).has_non_instance_prototype()) { + Object prototype = map(isolate).GetConstructor(isolate); + // The map must have a prototype in that field, not a back pointer. + DCHECK(!prototype.IsMap(isolate)); + DCHECK(!prototype.IsFunctionTemplateInfo(isolate)); + return prototype; + } + return instance_prototype(isolate); +} + +bool JSFunction::is_compiled() const { + return code().builtin_index() != Builtins::kCompileLazy && + shared().is_compiled(); +} + +bool JSFunction::NeedsResetDueToFlushedBytecode() { + // Do a raw read for shared and code fields here since this function may be + // called on a concurrent thread and the JSFunction might not be fully + // initialized yet. + Object maybe_shared = ACQUIRE_READ_FIELD(*this, kSharedFunctionInfoOffset); + Object maybe_code = RELAXED_READ_FIELD(*this, kCodeOffset); + + if (!maybe_shared.IsSharedFunctionInfo() || !maybe_code.IsCode()) { + return false; + } + + SharedFunctionInfo shared = SharedFunctionInfo::cast(maybe_shared); + Code code = Code::cast(maybe_code); + return !shared.is_compiled() && + code.builtin_index() != Builtins::kCompileLazy; +} + +void JSFunction::ResetIfBytecodeFlushed( + base::Optional> + gc_notify_updated_slot) { + if (FLAG_flush_bytecode && NeedsResetDueToFlushedBytecode()) { + // Bytecode was flushed and function is now uncompiled, reset JSFunction + // by setting code to CompileLazy and clearing the feedback vector. + set_code(GetIsolate()->builtins()->builtin(i::Builtins::kCompileLazy)); + raw_feedback_cell().reset_feedback_vector(gc_notify_updated_slot); + } +} + +} // namespace internal +} // namespace v8 + +#include "src/objects/object-macros-undef.h" + +#endif // V8_OBJECTS_JS_FUNCTION_INL_H_ diff --git a/deps/v8/src/objects/js-function.cc b/deps/v8/src/objects/js-function.cc index c85d76c4e2f6f0..6e83273e8fdaa2 100644 --- a/deps/v8/src/objects/js-function.cc +++ b/deps/v8/src/objects/js-function.cc @@ -18,24 +18,6 @@ namespace v8 { namespace internal { -TQ_OBJECT_CONSTRUCTORS_IMPL_NONINLINE(JSFunctionOrBoundFunction) -TQ_OBJECT_CONSTRUCTORS_IMPL_NONINLINE(JSBoundFunction) -OBJECT_CONSTRUCTORS_IMPL_NONINLINE(JSFunction, JSFunctionOrBoundFunction) - -CAST_ACCESSOR(JSFunction) - -ACCESSORS(JSFunction, raw_feedback_cell, FeedbackCell, kFeedbackCellOffset) - -FeedbackVector JSFunction::feedback_vector() const { - DCHECK(has_feedback_vector()); - return FeedbackVector::cast(raw_feedback_cell().value()); -} - -ClosureFeedbackCellArray JSFunction::closure_feedback_cell_array() const { - DCHECK(has_closure_feedback_cell_array()); - return ClosureFeedbackCellArray::cast(raw_feedback_cell().value()); -} - CodeKinds JSFunction::GetAttachedCodeKinds() const { CodeKinds result; @@ -94,6 +76,11 @@ bool JSFunction::HasAvailableOptimizedCode() const { return (result & kOptimizedJSFunctionCodeKindsMask) != 0; } +bool JSFunction::HasAvailableCodeKind(CodeKind kind) const { + CodeKinds result = GetAvailableCodeKinds(); + return (result & CodeKindToCodeKindFlag(kind)) != 0; +} + namespace { // Returns false if no highest tier exists (i.e. the function is not compiled), @@ -132,17 +119,19 @@ bool JSFunction::ActiveTierIsIgnition() const { bool JSFunction::ActiveTierIsTurbofan() const { CodeKind highest_tier; if (!HighestTierOf(GetAvailableCodeKinds(), &highest_tier)) return false; - bool result = highest_tier == CodeKind::OPTIMIZED_FUNCTION; - DCHECK_IMPLIES(result, !code().marked_for_deoptimization()); - return result; + return highest_tier == CodeKind::OPTIMIZED_FUNCTION; } bool JSFunction::ActiveTierIsNCI() const { CodeKind highest_tier; if (!HighestTierOf(GetAvailableCodeKinds(), &highest_tier)) return false; - bool result = highest_tier == CodeKind::NATIVE_CONTEXT_INDEPENDENT; - DCHECK_IMPLIES(result, !code().marked_for_deoptimization()); - return result; + return highest_tier == CodeKind::NATIVE_CONTEXT_INDEPENDENT; +} + +CodeKind JSFunction::NextTier() const { + return (FLAG_turbo_nci_as_midtier && ActiveTierIsIgnition()) + ? CodeKind::NATIVE_CONTEXT_INDEPENDENT + : CodeKind::OPTIMIZED_FUNCTION; } bool JSFunction::CanDiscardCompiled() const { @@ -160,230 +149,6 @@ bool JSFunction::CanDiscardCompiled() const { return (result & kJSFunctionCodeKindsMask) != 0; } -bool JSFunction::HasOptimizationMarker() { - return has_feedback_vector() && feedback_vector().has_optimization_marker(); -} - -void JSFunction::ClearOptimizationMarker() { - DCHECK(has_feedback_vector()); - feedback_vector().ClearOptimizationMarker(); -} - -bool JSFunction::ChecksOptimizationMarker() { - return code().checks_optimization_marker(); -} - -bool JSFunction::IsMarkedForOptimization() { - return has_feedback_vector() && feedback_vector().optimization_marker() == - OptimizationMarker::kCompileOptimized; -} - -bool JSFunction::IsMarkedForConcurrentOptimization() { - return has_feedback_vector() && - feedback_vector().optimization_marker() == - OptimizationMarker::kCompileOptimizedConcurrent; -} - -bool JSFunction::IsInOptimizationQueue() { - return has_feedback_vector() && feedback_vector().optimization_marker() == - OptimizationMarker::kInOptimizationQueue; -} - -void JSFunction::CompleteInobjectSlackTrackingIfActive() { - if (!has_prototype_slot()) return; - if (has_initial_map() && initial_map().IsInobjectSlackTrackingInProgress()) { - initial_map().CompleteInobjectSlackTracking(GetIsolate()); - } -} - -AbstractCode JSFunction::abstract_code() { - if (ActiveTierIsIgnition()) { - return AbstractCode::cast(shared().GetBytecodeArray()); - } else { - return AbstractCode::cast(code()); - } -} - -int JSFunction::length() { return shared().length(); } - -Code JSFunction::code() const { - return Code::cast(RELAXED_READ_FIELD(*this, kCodeOffset)); -} - -void JSFunction::set_code(Code value) { - DCHECK(!ObjectInYoungGeneration(value)); - RELAXED_WRITE_FIELD(*this, kCodeOffset, value); -#ifndef V8_DISABLE_WRITE_BARRIERS - WriteBarrier::Marking(*this, RawField(kCodeOffset), value); -#endif -} - -void JSFunction::set_code_no_write_barrier(Code value) { - DCHECK(!ObjectInYoungGeneration(value)); - RELAXED_WRITE_FIELD(*this, kCodeOffset, value); -} - -// TODO(ishell): Why relaxed read but release store? -DEF_GETTER(JSFunction, shared, SharedFunctionInfo) { - return SharedFunctionInfo::cast( - RELAXED_READ_FIELD(*this, kSharedFunctionInfoOffset)); -} - -void JSFunction::set_shared(SharedFunctionInfo value, WriteBarrierMode mode) { - // Release semantics to support acquire read in NeedsResetDueToFlushedBytecode - RELEASE_WRITE_FIELD(*this, kSharedFunctionInfoOffset, value); - CONDITIONAL_WRITE_BARRIER(*this, kSharedFunctionInfoOffset, value, mode); -} - -void JSFunction::ClearOptimizedCodeSlot(const char* reason) { - if (has_feedback_vector() && feedback_vector().has_optimized_code()) { - if (FLAG_trace_opt) { - CodeTracer::Scope scope(GetIsolate()->GetCodeTracer()); - PrintF(scope.file(), - "[evicting entry from optimizing code feedback slot (%s) for ", - reason); - ShortPrint(scope.file()); - PrintF(scope.file(), "]\n"); - } - feedback_vector().ClearOptimizedCode(); - } -} - -void JSFunction::SetOptimizationMarker(OptimizationMarker marker) { - DCHECK(has_feedback_vector()); - DCHECK(ChecksOptimizationMarker()); - DCHECK(!HasAvailableOptimizedCode()); - - feedback_vector().SetOptimizationMarker(marker); -} - -bool JSFunction::has_feedback_vector() const { - return shared().is_compiled() && - raw_feedback_cell().value().IsFeedbackVector(); -} - -bool JSFunction::has_closure_feedback_cell_array() const { - return shared().is_compiled() && - raw_feedback_cell().value().IsClosureFeedbackCellArray(); -} - -Context JSFunction::context() { - return TaggedField::load(*this); -} - -bool JSFunction::has_context() const { - return TaggedField::load(*this).IsContext(); -} - -JSGlobalProxy JSFunction::global_proxy() { return context().global_proxy(); } - -NativeContext JSFunction::native_context() { - return context().native_context(); -} - -void JSFunction::set_context(HeapObject value) { - DCHECK(value.IsUndefined() || value.IsContext()); - WRITE_FIELD(*this, kContextOffset, value); - WRITE_BARRIER(*this, kContextOffset, value); -} - -ACCESSORS_CHECKED(JSFunction, prototype_or_initial_map, HeapObject, - kPrototypeOrInitialMapOffset, map().has_prototype_slot()) - -DEF_GETTER(JSFunction, has_prototype_slot, bool) { - return map(isolate).has_prototype_slot(); -} - -DEF_GETTER(JSFunction, initial_map, Map) { - return Map::cast(prototype_or_initial_map(isolate)); -} - -DEF_GETTER(JSFunction, has_initial_map, bool) { - DCHECK(has_prototype_slot(isolate)); - return prototype_or_initial_map(isolate).IsMap(isolate); -} - -DEF_GETTER(JSFunction, has_instance_prototype, bool) { - DCHECK(has_prototype_slot(isolate)); - // Can't use ReadOnlyRoots(isolate) as this isolate could be produced by - // i::GetIsolateForPtrCompr(HeapObject). - return has_initial_map(isolate) || - !prototype_or_initial_map(isolate).IsTheHole( - GetReadOnlyRoots(isolate)); -} - -DEF_GETTER(JSFunction, has_prototype, bool) { - DCHECK(has_prototype_slot(isolate)); - return map(isolate).has_non_instance_prototype() || - has_instance_prototype(isolate); -} - -DEF_GETTER(JSFunction, has_prototype_property, bool) { - return (has_prototype_slot(isolate) && IsConstructor(isolate)) || - IsGeneratorFunction(shared(isolate).kind()); -} - -DEF_GETTER(JSFunction, PrototypeRequiresRuntimeLookup, bool) { - return !has_prototype_property(isolate) || - map(isolate).has_non_instance_prototype(); -} - -DEF_GETTER(JSFunction, instance_prototype, HeapObject) { - DCHECK(has_instance_prototype(isolate)); - if (has_initial_map(isolate)) return initial_map(isolate).prototype(isolate); - // When there is no initial map and the prototype is a JSReceiver, the - // initial map field is used for the prototype field. - return HeapObject::cast(prototype_or_initial_map(isolate)); -} - -DEF_GETTER(JSFunction, prototype, Object) { - DCHECK(has_prototype(isolate)); - // If the function's prototype property has been set to a non-JSReceiver - // value, that value is stored in the constructor field of the map. - if (map(isolate).has_non_instance_prototype()) { - Object prototype = map(isolate).GetConstructor(isolate); - // The map must have a prototype in that field, not a back pointer. - DCHECK(!prototype.IsMap(isolate)); - DCHECK(!prototype.IsFunctionTemplateInfo(isolate)); - return prototype; - } - return instance_prototype(isolate); -} - -bool JSFunction::is_compiled() const { - return code().builtin_index() != Builtins::kCompileLazy && - shared().is_compiled(); -} - -bool JSFunction::NeedsResetDueToFlushedBytecode() { - // Do a raw read for shared and code fields here since this function may be - // called on a concurrent thread and the JSFunction might not be fully - // initialized yet. - Object maybe_shared = ACQUIRE_READ_FIELD(*this, kSharedFunctionInfoOffset); - Object maybe_code = RELAXED_READ_FIELD(*this, kCodeOffset); - - if (!maybe_shared.IsSharedFunctionInfo() || !maybe_code.IsCode()) { - return false; - } - - SharedFunctionInfo shared = SharedFunctionInfo::cast(maybe_shared); - Code code = Code::cast(maybe_code); - return !shared.is_compiled() && - code.builtin_index() != Builtins::kCompileLazy; -} - -void JSFunction::ResetIfBytecodeFlushed( - base::Optional> - gc_notify_updated_slot) { - if (FLAG_flush_bytecode && NeedsResetDueToFlushedBytecode()) { - // Bytecode was flushed and function is now uncompiled, reset JSFunction - // by setting code to CompileLazy and clearing the feedback vector. - set_code(GetIsolate()->builtins()->builtin(i::Builtins::kCompileLazy)); - raw_feedback_cell().reset_feedback_vector(gc_notify_updated_slot); - } -} - // static MaybeHandle JSBoundFunction::GetFunctionRealm( Handle function) { @@ -466,40 +231,6 @@ Handle JSFunction::GetFunctionRealm( return handle(function->context().native_context(), function->GetIsolate()); } -void JSFunction::MarkForOptimization(ConcurrencyMode mode) { - Isolate* isolate = GetIsolate(); - if (!isolate->concurrent_recompilation_enabled() || - isolate->bootstrapper()->IsActive()) { - mode = ConcurrencyMode::kNotConcurrent; - } - - DCHECK(!is_compiled() || ActiveTierIsIgnition()); - DCHECK(shared().IsInterpreted()); - DCHECK(!HasAvailableOptimizedCode()); - DCHECK(shared().allows_lazy_compilation() || - !shared().optimization_disabled()); - - if (mode == ConcurrencyMode::kConcurrent) { - if (IsInOptimizationQueue()) { - if (FLAG_trace_concurrent_recompilation) { - PrintF(" ** Not marking "); - ShortPrint(); - PrintF(" -- already in optimization queue.\n"); - } - return; - } - if (FLAG_trace_concurrent_recompilation) { - PrintF(" ** Marking "); - ShortPrint(); - PrintF(" for concurrent recompilation.\n"); - } - } - - SetOptimizationMarker(mode == ConcurrencyMode::kConcurrent - ? OptimizationMarker::kCompileOptimizedConcurrent - : OptimizationMarker::kCompileOptimized); -} - // static void JSFunction::EnsureClosureFeedbackCellArray(Handle function) { Isolate* const isolate = function->GetIsolate(); diff --git a/deps/v8/src/objects/js-function.h b/deps/v8/src/objects/js-function.h index 06d6a2cd60550f..e7f2c0caf330be 100644 --- a/deps/v8/src/objects/js-function.h +++ b/deps/v8/src/objects/js-function.h @@ -7,8 +7,8 @@ #include "src/objects/code-kind.h" #include "src/objects/js-objects.h" -#include "torque-generated/class-definitions-tq.h" -#include "torque-generated/field-offsets-tq.h" +#include "torque-generated/class-definitions.h" +#include "torque-generated/field-offsets.h" // Has to be the last include (doesn't have include guards): #include "src/objects/object-macros.h" @@ -24,7 +24,7 @@ class JSFunctionOrBoundFunction JSObject> { public: STATIC_ASSERT(kHeaderSize == JSObject::kHeaderSize); - TQ_OBJECT_CONSTRUCTORS_NONINLINE(JSFunctionOrBoundFunction) + TQ_OBJECT_CONSTRUCTORS(JSFunctionOrBoundFunction) }; // JSBoundFunction describes a bound function exotic object. @@ -47,18 +47,18 @@ class JSBoundFunction // to ES6 section 19.2.3.5 Function.prototype.toString ( ). static Handle ToString(Handle function); - TQ_OBJECT_CONSTRUCTORS_NONINLINE(JSBoundFunction) + TQ_OBJECT_CONSTRUCTORS(JSBoundFunction) }; // JSFunction describes JavaScript functions. class JSFunction : public JSFunctionOrBoundFunction { public: // [prototype_or_initial_map]: - DECL_ACCESSORS_NONINLINE(prototype_or_initial_map, HeapObject) + DECL_ACCESSORS(prototype_or_initial_map, HeapObject) // [shared]: The information about the function that // can be shared by instances. - DECL_ACCESSORS_NONINLINE(shared, SharedFunctionInfo) + DECL_ACCESSORS(shared, SharedFunctionInfo) static const int kLengthDescriptorIndex = 0; static const int kNameDescriptorIndex = 1; @@ -68,12 +68,12 @@ class JSFunction : public JSFunctionOrBoundFunction { static const int kMinDescriptorsForFastBind = 2; // [context]: The context for this function. - V8_EXPORT_PRIVATE Context context(); - bool has_context() const; - void set_context(HeapObject context); - JSGlobalProxy global_proxy(); - V8_EXPORT_PRIVATE NativeContext native_context(); - int length(); + inline Context context(); + inline bool has_context() const; + inline void set_context(HeapObject context); + inline JSGlobalProxy global_proxy(); + inline NativeContext native_context(); + inline int length(); static Handle GetName(Isolate* isolate, Handle function); static Handle GetFunctionRealm(Handle function); @@ -82,13 +82,13 @@ class JSFunction : public JSFunctionOrBoundFunction { // when the function is invoked, e.g. foo() or new foo(). See // [[Call]] and [[Construct]] description in ECMA-262, section // 8.6.2, page 27. - V8_EXPORT_PRIVATE Code code() const; - V8_EXPORT_PRIVATE void set_code(Code code); - void set_code_no_write_barrier(Code code); + inline Code code() const; + inline void set_code(Code code); + inline void set_code_no_write_barrier(Code code); // Get the abstract code associated with the function, which will either be // a Code object or a BytecodeArray. - V8_EXPORT_PRIVATE AbstractCode abstract_code(); + inline AbstractCode abstract_code(); // The predicates for querying code kinds related to this function have // specific terminology: @@ -110,10 +110,14 @@ class JSFunction : public JSFunctionOrBoundFunction { V8_EXPORT_PRIVATE bool HasAttachedOptimizedCode() const; bool HasAvailableOptimizedCode() const; + bool HasAvailableCodeKind(CodeKind kind) const; + V8_EXPORT_PRIVATE bool ActiveTierIsIgnition() const; bool ActiveTierIsTurbofan() const; bool ActiveTierIsNCI() const; + CodeKind NextTier() const; + // Similar to SharedFunctionInfo::CanDiscardCompiled. Returns true, if the // attached code can be recreated at a later point by replacing it with // CompileLazy. @@ -121,30 +125,30 @@ class JSFunction : public JSFunctionOrBoundFunction { // Tells whether or not this function checks its optimization marker in its // feedback vector. - bool ChecksOptimizationMarker(); + inline bool ChecksOptimizationMarker(); // Tells whether or not this function has a (non-zero) optimization marker. - bool HasOptimizationMarker(); + inline bool HasOptimizationMarker(); // Mark this function for lazy recompilation. The function will be recompiled // the next time it is executed. - void MarkForOptimization(ConcurrencyMode mode); + inline void MarkForOptimization(ConcurrencyMode mode); // Tells whether or not the function is already marked for lazy recompilation. - bool IsMarkedForOptimization(); - bool IsMarkedForConcurrentOptimization(); + inline bool IsMarkedForOptimization(); + inline bool IsMarkedForConcurrentOptimization(); // Tells whether or not the function is on the concurrent recompilation queue. - bool IsInOptimizationQueue(); + inline bool IsInOptimizationQueue(); // Clears the optimized code slot in the function's feedback vector. - void ClearOptimizedCodeSlot(const char* reason); + inline void ClearOptimizedCodeSlot(const char* reason); // Sets the optimization marker in the function's feedback vector. - void SetOptimizationMarker(OptimizationMarker marker); + inline void SetOptimizationMarker(OptimizationMarker marker); // Clears the optimization marker in the function's feedback vector. - void ClearOptimizationMarker(); + inline void ClearOptimizationMarker(); // If slack tracking is active, it computes instance size of the initial map // with minimum permissible object slack. If it is not active, it simply @@ -152,28 +156,28 @@ class JSFunction : public JSFunctionOrBoundFunction { int ComputeInstanceSizeWithMinSlack(Isolate* isolate); // Completes inobject slack tracking on initial map if it is active. - void CompleteInobjectSlackTrackingIfActive(); + inline void CompleteInobjectSlackTrackingIfActive(); // [raw_feedback_cell]: Gives raw access to the FeedbackCell used to hold the /// FeedbackVector eventually. Generally this shouldn't be used to get the // feedback_vector, instead use feedback_vector() which correctly deals with // the JSFunction's bytecode being flushed. - DECL_ACCESSORS_NONINLINE(raw_feedback_cell, FeedbackCell) + DECL_ACCESSORS(raw_feedback_cell, FeedbackCell) // Functions related to feedback vector. feedback_vector() can be used once // the function has feedback vectors allocated. feedback vectors may not be // available after compile when lazily allocating feedback vectors. - V8_EXPORT_PRIVATE FeedbackVector feedback_vector() const; - V8_EXPORT_PRIVATE bool has_feedback_vector() const; + inline FeedbackVector feedback_vector() const; + inline bool has_feedback_vector() const; V8_EXPORT_PRIVATE static void EnsureFeedbackVector( Handle function, IsCompiledScope* compiled_scope); - // Functions related to clousre feedback cell array that holds feedback cells + // Functions related to closure feedback cell array that holds feedback cells // used to create closures from this function. We allocate closure feedback // cell arrays after compile, when we want to allocate feedback vectors // lazily. - V8_EXPORT_PRIVATE bool has_closure_feedback_cell_array() const; - ClosureFeedbackCellArray closure_feedback_cell_array() const; + inline bool has_closure_feedback_cell_array() const; + inline ClosureFeedbackCellArray closure_feedback_cell_array() const; static void EnsureClosureFeedbackCellArray(Handle function); // Initializes the feedback cell of |function|. In lite mode, this would be @@ -187,20 +191,20 @@ class JSFunction : public JSFunctionOrBoundFunction { void ClearTypeFeedbackInfo(); // Resets function to clear compiled data after bytecode has been flushed. - bool NeedsResetDueToFlushedBytecode(); - void ResetIfBytecodeFlushed( + inline bool NeedsResetDueToFlushedBytecode(); + inline void ResetIfBytecodeFlushed( base::Optional> gc_notify_updated_slot = base::nullopt); - DECL_GETTER_NONINLINE(has_prototype_slot, bool) + DECL_GETTER(has_prototype_slot, bool) // The initial map for an object created by this constructor. - DECL_GETTER_NONINLINE(initial_map, Map) + DECL_GETTER(initial_map, Map) static void SetInitialMap(Handle function, Handle map, Handle prototype); - DECL_GETTER_NONINLINE(has_initial_map, bool) + DECL_GETTER(has_initial_map, bool) V8_EXPORT_PRIVATE static void EnsureHasInitialMap( Handle function); @@ -215,16 +219,16 @@ class JSFunction : public JSFunctionOrBoundFunction { // function has an initial map the prototype is set on the initial // map. Otherwise, the prototype is put in the initial map field // until an initial map is needed. - DECL_GETTER_NONINLINE(has_prototype, bool) - DECL_GETTER_NONINLINE(has_instance_prototype, bool) - DECL_GETTER_NONINLINE(prototype, Object) - DECL_GETTER_NONINLINE(instance_prototype, HeapObject) - DECL_GETTER_NONINLINE(has_prototype_property, bool) - DECL_GETTER_NONINLINE(PrototypeRequiresRuntimeLookup, bool) + DECL_GETTER(has_prototype, bool) + DECL_GETTER(has_instance_prototype, bool) + DECL_GETTER(prototype, Object) + DECL_GETTER(instance_prototype, HeapObject) + DECL_GETTER(has_prototype_property, bool) + DECL_GETTER(PrototypeRequiresRuntimeLookup, bool) static void SetPrototype(Handle function, Handle value); // Returns if this function has been compiled to native code yet. - V8_EXPORT_PRIVATE bool is_compiled() const; + inline bool is_compiled() const; static int GetHeaderSize(bool function_has_prototype_slot) { return function_has_prototype_slot ? JSFunction::kSizeWithPrototype @@ -234,7 +238,7 @@ class JSFunction : public JSFunctionOrBoundFunction { // Prints the name of the function using PrintF. void PrintName(FILE* out = stdout); - DECL_CAST_NONINLINE(JSFunction) + DECL_CAST(JSFunction) // Calculate the instance size and in-object properties count. // {CalculateExpectedNofProperties} can trigger compilation. @@ -307,7 +311,7 @@ class JSFunction : public JSFunctionOrBoundFunction { static constexpr int kSizeWithoutPrototype = kPrototypeOrInitialMapOffset; static constexpr int kSizeWithPrototype = FieldOffsets::kHeaderSize; - OBJECT_CONSTRUCTORS_NONINLINE(JSFunction, JSFunctionOrBoundFunction); + OBJECT_CONSTRUCTORS(JSFunction, JSFunctionOrBoundFunction); }; } // namespace internal diff --git a/deps/v8/src/objects/js-objects.cc b/deps/v8/src/objects/js-objects.cc index 7f5378e6c1f773..2d095d1743b2ff 100644 --- a/deps/v8/src/objects/js-objects.cc +++ b/deps/v8/src/objects/js-objects.cc @@ -70,8 +70,8 @@ #include "src/strings/string-stream.h" #include "src/utils/ostreams.h" #include "src/wasm/wasm-objects.h" -#include "torque-generated/exported-class-definitions-tq-inl.h" -#include "torque-generated/exported-class-definitions-tq.h" +#include "torque-generated/exported-class-definitions-inl.h" +#include "torque-generated/exported-class-definitions.h" namespace v8 { namespace internal { @@ -252,7 +252,7 @@ V8_WARN_UNUSED_RESULT Maybe FastAssign( ASSIGN_RETURN_ON_EXCEPTION_VALUE( isolate, prop_value, Object::GetProperty(&it), Nothing()); stable = from->map() == *map; - *descriptors.location() = map->instance_descriptors().ptr(); + descriptors.PatchValue(map->instance_descriptors()); } } else { // If the map did change, do a slower lookup. We are still guaranteed that @@ -278,7 +278,7 @@ V8_WARN_UNUSED_RESULT Maybe FastAssign( if (result.IsNothing()) return result; if (stable) { stable = from->map() == *map; - *descriptors.location() = map->instance_descriptors().ptr(); + descriptors.PatchValue(map->instance_descriptors()); } } else { if (excluded_properties != nullptr && @@ -309,6 +309,7 @@ Maybe JSReceiver::SetOrCopyDataProperties( if (fast_assign.FromJust()) return Just(true); Handle from = Object::ToObject(isolate, source).ToHandleChecked(); + // 3b. Let keys be ? from.[[OwnPropertyKeys]](). Handle keys; ASSIGN_RETURN_ON_EXCEPTION_VALUE( @@ -317,9 +318,25 @@ Maybe JSReceiver::SetOrCopyDataProperties( GetKeysConversion::kKeepNumbers), Nothing()); + if (!from->HasFastProperties() && target->HasFastProperties()) { + // Convert to slow properties if we're guaranteed to overflow the number of + // descriptors. + int source_length = + from->IsJSGlobalObject() + ? JSGlobalObject::cast(*from) + .global_dictionary() + .NumberOfEnumerableProperties() + : from->property_dictionary().NumberOfEnumerableProperties(); + if (source_length > kMaxNumberOfDescriptors) { + JSObject::NormalizeProperties(isolate, Handle::cast(target), + CLEAR_INOBJECT_PROPERTIES, source_length, + "Copying data properties"); + } + } + // 4. Repeat for each element nextKey of keys in List order, - for (int j = 0; j < keys->length(); ++j) { - Handle next_key(keys->get(j), isolate); + for (int i = 0; i < keys->length(); ++i) { + Handle next_key(keys->get(i), isolate); // 4a i. Let desc be ? from.[[GetOwnProperty]](nextKey). PropertyDescriptor desc; Maybe found = @@ -1866,7 +1883,7 @@ V8_WARN_UNUSED_RESULT Maybe FastGetOwnValuesOrEntries( // side-effects. bool stable = *map == object->map(); if (stable) { - *descriptors.location() = map->instance_descriptors().ptr(); + descriptors.PatchValue(map->instance_descriptors()); } for (InternalIndex index : InternalIndex::Range(number_of_own_descriptors)) { @@ -1900,7 +1917,7 @@ V8_WARN_UNUSED_RESULT Maybe FastGetOwnValuesOrEntries( ASSIGN_RETURN_ON_EXCEPTION_VALUE( isolate, prop_value, Object::GetProperty(&it), Nothing()); stable = object->map() == *map; - *descriptors.location() = map->instance_descriptors().ptr(); + descriptors.PatchValue(map->instance_descriptors()); } } else { // If the map did change, do a slower lookup. We are still guaranteed that diff --git a/deps/v8/src/objects/js-objects.h b/deps/v8/src/objects/js-objects.h index e33df30ac892f3..11e8273fcb0dd0 100644 --- a/deps/v8/src/objects/js-objects.h +++ b/deps/v8/src/objects/js-objects.h @@ -10,8 +10,8 @@ #include "src/objects/internal-index.h" #include "src/objects/objects.h" #include "src/objects/property-array.h" -#include "torque-generated/class-definitions-tq.h" -#include "torque-generated/field-offsets-tq.h" +#include "torque-generated/class-definitions.h" +#include "torque-generated/field-offsets.h" // Has to be the last include (doesn't have include guards): #include "src/objects/object-macros.h" diff --git a/deps/v8/src/objects/js-promise.h b/deps/v8/src/objects/js-promise.h index cd54f9349eb2ff..2028bc3f8b7817 100644 --- a/deps/v8/src/objects/js-promise.h +++ b/deps/v8/src/objects/js-promise.h @@ -7,7 +7,7 @@ #include "src/objects/js-objects.h" #include "src/objects/promise.h" -#include "torque-generated/bit-fields-tq.h" +#include "torque-generated/bit-fields.h" // Has to be the last include (doesn't have include guards): #include "src/objects/object-macros.h" diff --git a/deps/v8/src/objects/js-proxy.h b/deps/v8/src/objects/js-proxy.h index c6bb844fe57eaf..1161f714869f11 100644 --- a/deps/v8/src/objects/js-proxy.h +++ b/deps/v8/src/objects/js-proxy.h @@ -6,7 +6,7 @@ #define V8_OBJECTS_JS_PROXY_H_ #include "src/objects/js-objects.h" -#include "torque-generated/builtin-definitions-tq.h" +#include "torque-generated/builtin-definitions.h" // Has to be the last include (doesn't have include guards): #include "src/objects/object-macros.h" diff --git a/deps/v8/src/objects/js-regexp-inl.h b/deps/v8/src/objects/js-regexp-inl.h index 8a731008e10ca3..48fe911ff59bbd 100644 --- a/deps/v8/src/objects/js-regexp-inl.h +++ b/deps/v8/src/objects/js-regexp-inl.h @@ -67,7 +67,7 @@ String JSRegExp::Pattern() { Object JSRegExp::CaptureNameMap() { DCHECK(this->data().IsFixedArray()); - DCHECK_EQ(TypeTag(), IRREGEXP); + DCHECK(TypeSupportsCaptures(TypeTag())); Object value = DataAt(kIrregexpCaptureNameMapIndex); DCHECK_NE(value, Smi::FromInt(JSRegExp::kUninitializedValue)); return value; @@ -85,6 +85,14 @@ void JSRegExp::SetDataAt(int index, Object value) { FixedArray::cast(data()).set(index, value); } +void JSRegExp::SetCaptureNameMap(Handle capture_name_map) { + if (capture_name_map.is_null()) { + SetDataAt(JSRegExp::kIrregexpCaptureNameMapIndex, Smi::zero()); + } else { + SetDataAt(JSRegExp::kIrregexpCaptureNameMapIndex, *capture_name_map); + } +} + bool JSRegExp::HasCompiledCode() const { if (TypeTag() != IRREGEXP) return false; Smi uninitialized = Smi::FromInt(kUninitializedValue); diff --git a/deps/v8/src/objects/js-regexp-string-iterator.h b/deps/v8/src/objects/js-regexp-string-iterator.h index 1fdd5030725063..c5f2e334217a15 100644 --- a/deps/v8/src/objects/js-regexp-string-iterator.h +++ b/deps/v8/src/objects/js-regexp-string-iterator.h @@ -6,7 +6,7 @@ #define V8_OBJECTS_JS_REGEXP_STRING_ITERATOR_H_ #include "src/objects/js-objects.h" -#include "torque-generated/bit-fields-tq.h" +#include "torque-generated/bit-fields.h" // Has to be the last include (doesn't have include guards): #include "src/objects/object-macros.h" diff --git a/deps/v8/src/objects/js-regexp.h b/deps/v8/src/objects/js-regexp.h index 4751966e70d737..f9618e5266b7fa 100644 --- a/deps/v8/src/objects/js-regexp.h +++ b/deps/v8/src/objects/js-regexp.h @@ -6,7 +6,7 @@ #define V8_OBJECTS_JS_REGEXP_H_ #include "src/objects/js-array.h" -#include "torque-generated/bit-fields-tq.h" +#include "torque-generated/bit-fields.h" // Has to be the last include (doesn't have include guards): #include "src/objects/object-macros.h" @@ -89,6 +89,9 @@ class JSRegExp : public TorqueGeneratedJSRegExp { void MarkTierUpForNextExec(); inline Type TypeTag() const; + static bool TypeSupportsCaptures(Type t) { + return t == IRREGEXP || t == EXPERIMENTAL; + } // Maximum number of captures allowed. static constexpr int kMaxCaptures = 1 << 16; @@ -105,6 +108,7 @@ class JSRegExp : public TorqueGeneratedJSRegExp { inline Object DataAt(int index) const; // Set implementation data after the object has been prepared. inline void SetDataAt(int index, Object value); + inline void SetCaptureNameMap(Handle capture_name_map); static constexpr int code_index(bool is_latin1) { return is_latin1 ? kIrregexpLatin1CodeIndex : kIrregexpUC16CodeIndex; @@ -189,18 +193,14 @@ class JSRegExp : public TorqueGeneratedJSRegExp { static const int kIrregexpBacktrackLimit = kDataIndex + 8; static const int kIrregexpDataSize = kDataIndex + 9; - // TODO(mbid,v8:10765): At the moment the EXPERIMENTAL data array is an - // extension of IRREGEXP data, with most fields set to some + // TODO(mbid,v8:10765): At the moment the EXPERIMENTAL data array conforms + // to the format of an IRREGEXP data array, with most fields set to some // default/uninitialized value. This is because EXPERIMENTAL and IRREGEXP - // regexps take the same code path in - // `RegExpBuiltinsAssembler::RegExpExecInternal`, which reads off various - // fields from the `store` array. `RegExpExecInternal` should probably + // regexps take the same code path in `RegExpExecInternal`, which reads off + // various fields from the data array. `RegExpExecInternal` should probably // distinguish between EXPERIMENTAL and IRREGEXP, and then we can get rid of // all the IRREGEXP only fields. - - // The same as kAtomPatternIndex for atom regexps. - static constexpr int kExperimentalPatternIndex = kIrregexpDataSize; - static constexpr int kExperimentalDataSize = kIrregexpDataSize + 1; + static constexpr int kExperimentalDataSize = kIrregexpDataSize; // In-object fields. static const int kLastIndexFieldIndex = 0; diff --git a/deps/v8/src/objects/js-segment-iterator-inl.h b/deps/v8/src/objects/js-segment-iterator-inl.h index 5a010a186fc626..e6a1c4a53d5755 100644 --- a/deps/v8/src/objects/js-segment-iterator-inl.h +++ b/deps/v8/src/objects/js-segment-iterator-inl.h @@ -22,6 +22,8 @@ TQ_OBJECT_CONSTRUCTORS_IMPL(JSSegmentIterator) // Base segment iterator accessors. ACCESSORS(JSSegmentIterator, icu_break_iterator, Managed, kIcuBreakIteratorOffset) +ACCESSORS(JSSegmentIterator, unicode_string, Managed, + kUnicodeStringOffset) inline void JSSegmentIterator::set_granularity( JSSegmenter::Granularity granularity) { diff --git a/deps/v8/src/objects/js-segment-iterator.cc b/deps/v8/src/objects/js-segment-iterator.cc index f520185b49f02b..23758e34560c5e 100644 --- a/deps/v8/src/objects/js-segment-iterator.cc +++ b/deps/v8/src/objects/js-segment-iterator.cc @@ -46,6 +46,13 @@ MaybeHandle JSSegmentIterator::Create( Handle> managed_break_iterator = Managed::FromRawPtr(isolate, 0, break_iterator); + icu::UnicodeString* string = new icu::UnicodeString(); + break_iterator->getText().getText(*string); + Handle> unicode_string = + Managed::FromRawPtr(isolate, 0, string); + + break_iterator->setText(*string); + // Now all properties are ready, so we can allocate the result object. Handle result = isolate->factory()->NewJSObjectFromMap(map); DisallowHeapAllocation no_gc; @@ -55,6 +62,7 @@ MaybeHandle JSSegmentIterator::Create( segment_iterator->set_flags(0); segment_iterator->set_granularity(granularity); segment_iterator->set_icu_break_iterator(*managed_break_iterator); + segment_iterator->set_unicode_string(*unicode_string); return segment_iterator; } diff --git a/deps/v8/src/objects/js-segment-iterator.h b/deps/v8/src/objects/js-segment-iterator.h index 1e70298797342c..45e03c06fab7f9 100644 --- a/deps/v8/src/objects/js-segment-iterator.h +++ b/deps/v8/src/objects/js-segment-iterator.h @@ -43,6 +43,7 @@ class JSSegmentIterator // SegmentIterator accessors. DECL_ACCESSORS(icu_break_iterator, Managed) + DECL_ACCESSORS(unicode_string, Managed) DECL_PRINTER(JSSegmentIterator) diff --git a/deps/v8/src/objects/js-segments.cc b/deps/v8/src/objects/js-segments.cc index f0a7a4789632ca..ec3f8f6a2c7c22 100644 --- a/deps/v8/src/objects/js-segments.cc +++ b/deps/v8/src/objects/js-segments.cc @@ -60,15 +60,16 @@ MaybeHandle JSSegments::Create(Isolate* isolate, // ecma402 #sec-%segmentsprototype%.containing MaybeHandle JSSegments::Containing(Isolate* isolate, Handle segments, - int32_t n) { + double n_double) { // 5. Let len be the length of string. int32_t len = segments->unicode_string().raw()->length(); // 7. If n < 0 or n ≥ len, return undefined. - if (n < 0 || n >= len) { + if (n_double < 0 || n_double >= len) { return isolate->factory()->undefined_value(); } + int32_t n = static_cast(n_double); // n may point to the surrogate tail- adjust it back to the lead. n = segments->unicode_string().raw()->getChar32Start(n); diff --git a/deps/v8/src/objects/js-segments.h b/deps/v8/src/objects/js-segments.h index ad6dd967b349c6..b33323d6f9dff7 100644 --- a/deps/v8/src/objects/js-segments.h +++ b/deps/v8/src/objects/js-segments.h @@ -35,7 +35,7 @@ class JSSegments : public TorqueGeneratedJSSegments { // ecma402 #sec-%segmentsprototype%.containing V8_WARN_UNUSED_RESULT static MaybeHandle Containing( - Isolate* isolate, Handle segments_holder, int32_t index); + Isolate* isolate, Handle segments_holder, double n); // ecma402 #sec-createsegmentdataobject V8_WARN_UNUSED_RESULT static MaybeHandle CreateSegmentDataObject( diff --git a/deps/v8/src/objects/js-weak-refs.h b/deps/v8/src/objects/js-weak-refs.h index 048285e5f8edf1..2aa0a4ff2db271 100644 --- a/deps/v8/src/objects/js-weak-refs.h +++ b/deps/v8/src/objects/js-weak-refs.h @@ -6,7 +6,7 @@ #define V8_OBJECTS_JS_WEAK_REFS_H_ #include "src/objects/js-objects.h" -#include "torque-generated/bit-fields-tq.h" +#include "torque-generated/bit-fields.h" // Has to be the last include (doesn't have include guards): #include "src/objects/object-macros.h" diff --git a/deps/v8/src/objects/literal-objects.cc b/deps/v8/src/objects/literal-objects.cc index 61e581a3d25a13..b5cdfd2795a9c5 100644 --- a/deps/v8/src/objects/literal-objects.cc +++ b/deps/v8/src/objects/literal-objects.cc @@ -347,7 +347,7 @@ class ObjectDescriptor { AddToDictionaryTemplate(isolate, properties_dictionary_template_, name, value_index, value_kind, value); } else { - *temp_handle_.location() = value.ptr(); + temp_handle_.PatchValue(value); AddToDescriptorArrayTemplate(isolate, descriptor_array_template_, name, value_kind, temp_handle_); } diff --git a/deps/v8/src/objects/lookup-inl.h b/deps/v8/src/objects/lookup-inl.h index 1fdfde6a05be8a..2339606a45a9e3 100644 --- a/deps/v8/src/objects/lookup-inl.h +++ b/deps/v8/src/objects/lookup-inl.h @@ -20,58 +20,60 @@ namespace internal { LookupIterator::LookupIterator(Isolate* isolate, Handle receiver, Handle name, Configuration configuration) - : LookupIterator(isolate, receiver, name, kInvalidIndex, - GetRoot(isolate, receiver, kInvalidIndex), configuration) { -} + : LookupIterator(isolate, receiver, name, kInvalidIndex, receiver, + configuration) {} LookupIterator::LookupIterator(Isolate* isolate, Handle receiver, - Handle name, Handle holder, + Handle name, + Handle lookup_start_object, Configuration configuration) - : LookupIterator(isolate, receiver, name, kInvalidIndex, holder, - configuration) {} + : LookupIterator(isolate, receiver, name, kInvalidIndex, + lookup_start_object, configuration) {} LookupIterator::LookupIterator(Isolate* isolate, Handle receiver, size_t index, Configuration configuration) - : LookupIterator(isolate, receiver, Handle(), index, - GetRoot(isolate, receiver, index), configuration) { + : LookupIterator(isolate, receiver, Handle(), index, receiver, + configuration) { DCHECK_NE(index, kInvalidIndex); } LookupIterator::LookupIterator(Isolate* isolate, Handle receiver, - size_t index, Handle holder, + size_t index, Handle lookup_start_object, Configuration configuration) - : LookupIterator(isolate, receiver, Handle(), index, holder, - configuration) { + : LookupIterator(isolate, receiver, Handle(), index, + lookup_start_object, configuration) { DCHECK_NE(index, kInvalidIndex); } LookupIterator::LookupIterator(Isolate* isolate, Handle receiver, const Key& key, Configuration configuration) - : LookupIterator(isolate, receiver, key.name(), key.index(), - GetRoot(isolate, receiver, key.index()), configuration) {} + : LookupIterator(isolate, receiver, key.name(), key.index(), receiver, + configuration) {} LookupIterator::LookupIterator(Isolate* isolate, Handle receiver, - const Key& key, Handle holder, + const Key& key, + Handle lookup_start_object, Configuration configuration) - : LookupIterator(isolate, receiver, key.name(), key.index(), holder, - configuration) {} + : LookupIterator(isolate, receiver, key.name(), key.index(), + lookup_start_object, configuration) {} // This private constructor is the central bottleneck that all the other // constructors use. LookupIterator::LookupIterator(Isolate* isolate, Handle receiver, Handle name, size_t index, - Handle holder, + Handle lookup_start_object, Configuration configuration) : configuration_(ComputeConfiguration(isolate, configuration, name)), isolate_(isolate), name_(name), receiver_(receiver), - initial_holder_(holder), + lookup_start_object_(lookup_start_object), index_(index) { if (IsElement()) { // If we're not looking at a TypedArray, we will need the key represented // as an internalized string. - if (index_ > JSArray::kMaxArrayIndex && !holder->IsJSTypedArray()) { + if (index_ > JSArray::kMaxArrayIndex && + !lookup_start_object->IsJSTypedArray()) { if (name_.is_null()) { name_ = isolate->factory()->SizeToString(index_); } @@ -85,10 +87,10 @@ LookupIterator::LookupIterator(Isolate* isolate, Handle receiver, name_ = isolate->factory()->InternalizeName(name_); #ifdef DEBUG // Assert that the name is not an index. - // If we're not looking at the prototype chain and the initial holder is - // not a typed array, then this means "array index", otherwise we need to + // If we're not looking at the prototype chain and the lookup start object + // is not a typed array, then this means "array index", otherwise we need to // ensure the full generality so that typed arrays are handled correctly. - if (!check_prototype_chain() && !holder->IsJSTypedArray()) { + if (!check_prototype_chain() && !lookup_start_object->IsJSTypedArray()) { uint32_t index; DCHECK(!name_->AsArrayIndex(&index)); } else { @@ -242,12 +244,12 @@ LookupIterator::Configuration LookupIterator::ComputeConfiguration( // static Handle LookupIterator::GetRoot(Isolate* isolate, - Handle receiver, + Handle lookup_start_object, size_t index) { - if (receiver->IsJSReceiver(isolate)) { - return Handle::cast(receiver); + if (lookup_start_object->IsJSReceiver(isolate)) { + return Handle::cast(lookup_start_object); } - return GetRootForNonJSReceiver(isolate, receiver, index); + return GetRootForNonJSReceiver(isolate, lookup_start_object, index); } template diff --git a/deps/v8/src/objects/lookup.cc b/deps/v8/src/objects/lookup.cc index b7086fc06f70dc..25f2d254dfbd56 100644 --- a/deps/v8/src/objects/lookup.cc +++ b/deps/v8/src/objects/lookup.cc @@ -14,8 +14,8 @@ #include "src/objects/hash-table-inl.h" #include "src/objects/heap-number-inl.h" #include "src/objects/struct-inl.h" -#include "torque-generated/exported-class-definitions-tq-inl.h" -#include "torque-generated/exported-class-definitions-tq.h" +#include "torque-generated/exported-class-definitions-inl.h" +#include "torque-generated/exported-class-definitions.h" namespace v8 { namespace internal { @@ -49,26 +49,30 @@ LookupIterator::LookupIterator(Isolate* isolate, Handle receiver, name_(name), transition_(transition_map), receiver_(receiver), - initial_holder_(GetRoot(isolate, receiver)), + lookup_start_object_(receiver), index_(kInvalidIndex) { - holder_ = initial_holder_; + holder_ = GetRoot(isolate, lookup_start_object_); } template void LookupIterator::Start() { - DisallowHeapAllocation no_gc; + // GetRoot might allocate if lookup_start_object_ is a string. + holder_ = GetRoot(isolate_, lookup_start_object_, index_); - has_property_ = false; - state_ = NOT_FOUND; - holder_ = initial_holder_; + { + DisallowHeapAllocation no_gc; - JSReceiver holder = *holder_; - Map map = holder.map(isolate_); + has_property_ = false; + state_ = NOT_FOUND; - state_ = LookupInHolder(map, holder); - if (IsFound()) return; + JSReceiver holder = *holder_; + Map map = holder.map(isolate_); - NextInternal(map, holder); + state_ = LookupInHolder(map, holder); + if (IsFound()) return; + + NextInternal(map, holder); + } } template void LookupIterator::Start(); @@ -127,22 +131,25 @@ template void LookupIterator::RestartInternal(InterceptorState); // static Handle LookupIterator::GetRootForNonJSReceiver( - Isolate* isolate, Handle receiver, size_t index) { + Isolate* isolate, Handle lookup_start_object, size_t index) { // Strings are the only objects with properties (only elements) directly on // the wrapper. Hence we can skip generating the wrapper for all other cases. - if (receiver->IsString(isolate) && - index < static_cast(String::cast(*receiver).length())) { + if (lookup_start_object->IsString(isolate) && + index < + static_cast(String::cast(*lookup_start_object).length())) { // TODO(verwaest): Speed this up. Perhaps use a cached wrapper on the native // context, ensuring that we don't leak it into JS? Handle constructor = isolate->string_function(); Handle result = isolate->factory()->NewJSObject(constructor); - Handle::cast(result)->set_value(*receiver); + Handle::cast(result)->set_value(*lookup_start_object); return result; } Handle root( - receiver->GetPrototypeChainRootMap(isolate).prototype(isolate), isolate); + lookup_start_object->GetPrototypeChainRootMap(isolate).prototype(isolate), + isolate); if (root->IsNull(isolate)) { - isolate->PushStackTraceAndDie(reinterpret_cast(receiver->ptr())); + isolate->PushStackTraceAndDie( + reinterpret_cast(lookup_start_object->ptr())); } return Handle::cast(root); } diff --git a/deps/v8/src/objects/lookup.h b/deps/v8/src/objects/lookup.h index 8ae05f073b36eb..28a6bd8336e1bf 100644 --- a/deps/v8/src/objects/lookup.h +++ b/deps/v8/src/objects/lookup.h @@ -70,19 +70,19 @@ class V8_EXPORT_PRIVATE LookupIterator final { Handle name, Configuration configuration = DEFAULT); inline LookupIterator(Isolate* isolate, Handle receiver, - Handle name, Handle holder, + Handle name, Handle lookup_start_object, Configuration configuration = DEFAULT); inline LookupIterator(Isolate* isolate, Handle receiver, size_t index, Configuration configuration = DEFAULT); inline LookupIterator(Isolate* isolate, Handle receiver, size_t index, - Handle holder, + Handle lookup_start_object, Configuration configuration = DEFAULT); inline LookupIterator(Isolate* isolate, Handle receiver, const Key& key, Configuration configuration = DEFAULT); inline LookupIterator(Isolate* isolate, Handle receiver, - const Key& key, Handle holder, + const Key& key, Handle lookup_start_object, Configuration configuration = DEFAULT); void Restart() { @@ -128,6 +128,8 @@ class V8_EXPORT_PRIVATE LookupIterator final { template inline Handle GetHolder() const; + Handle lookup_start_object() const { return lookup_start_object_; } + bool HolderIsReceiver() const; bool HolderIsReceiverOrHiddenPrototype() const; @@ -196,7 +198,8 @@ class V8_EXPORT_PRIVATE LookupIterator final { inline LookupIterator(Isolate* isolate, Handle receiver, Handle name, size_t index, - Handle holder, Configuration configuration); + Handle lookup_start_object, + Configuration configuration); // For |ForTransitionHandler|. LookupIterator(Isolate* isolate, Handle receiver, Handle name, @@ -261,9 +264,10 @@ class V8_EXPORT_PRIVATE LookupIterator final { Handle name); static Handle GetRootForNonJSReceiver( - Isolate* isolate, Handle receiver, size_t index = kInvalidIndex); + Isolate* isolate, Handle lookup_start_object, + size_t index = kInvalidIndex); static inline Handle GetRoot(Isolate* isolate, - Handle receiver, + Handle lookup_start_object, size_t index = kInvalidIndex); State NotFound(JSReceiver const holder) const; @@ -280,7 +284,7 @@ class V8_EXPORT_PRIVATE LookupIterator final { Handle transition_; const Handle receiver_; Handle holder_; - const Handle initial_holder_; + const Handle lookup_start_object_; const size_t index_; InternalIndex number_ = InternalIndex::NotFound(); }; diff --git a/deps/v8/src/objects/map-inl.h b/deps/v8/src/objects/map-inl.h index 0e0adc20928bd7..01beb506521ee6 100644 --- a/deps/v8/src/objects/map-inl.h +++ b/deps/v8/src/objects/map-inl.h @@ -11,6 +11,7 @@ #include "src/objects/descriptor-array-inl.h" #include "src/objects/field-type.h" #include "src/objects/instance-type-inl.h" +#include "src/objects/js-function-inl.h" #include "src/objects/layout-descriptor-inl.h" #include "src/objects/map.h" #include "src/objects/objects-inl.h" @@ -697,7 +698,7 @@ void Map::AppendDescriptor(Isolate* isolate, Descriptor* desc) { descriptors.Append(desc); SetNumberOfOwnDescriptors(number_of_own_descriptors + 1); #ifndef V8_DISABLE_WRITE_BARRIERS - WriteBarrier::Marking(*this, descriptors, number_of_own_descriptors + 1); + WriteBarrier::Marking(descriptors, number_of_own_descriptors + 1); #endif } // Properly mark the map if the {desc} is an "interesting symbol". diff --git a/deps/v8/src/objects/map-updater.cc b/deps/v8/src/objects/map-updater.cc index e51bcfc76010a8..b4b158749381ef 100644 --- a/deps/v8/src/objects/map-updater.cc +++ b/deps/v8/src/objects/map-updater.cc @@ -232,10 +232,7 @@ MapUpdater::State MapUpdater::TryReconfigureToDataFieldInplace() { handle(old_descriptors_->GetFieldType(modified_descriptor_), isolate_), MaybeHandle(), new_field_type_, MaybeHandle()); } - Handle field_owner( - old_map_->FindFieldOwner(isolate_, modified_descriptor_), isolate_); - - GeneralizeField(field_owner, modified_descriptor_, new_constness_, + GeneralizeField(old_map_, modified_descriptor_, new_constness_, new_representation_, new_field_type_); // Check that the descriptor array was updated. DCHECK(old_descriptors_->GetDetails(modified_descriptor_) @@ -401,7 +398,13 @@ MapUpdater::State MapUpdater::FindTargetMap() { } Representation tmp_representation = tmp_details.representation(); if (!old_details.representation().fits_into(tmp_representation)) { - break; + // Try updating the field in-place to a generalized type. + Representation generalized = + tmp_representation.generalize(old_details.representation()); + if (!tmp_representation.CanBeInPlaceChangedTo(generalized)) { + break; + } + tmp_representation = generalized; } if (tmp_details.location() == kField) { diff --git a/deps/v8/src/objects/map.cc b/deps/v8/src/objects/map.cc index 5f310819efc1e3..d1370aeaf4f3eb 100644 --- a/deps/v8/src/objects/map.cc +++ b/deps/v8/src/objects/map.cc @@ -25,9 +25,9 @@ #include "src/roots/roots.h" #include "src/utils/ostreams.h" #include "src/zone/zone-containers.h" -#include "torque-generated/exported-class-definitions-tq-inl.h" -#include "torque-generated/exported-class-definitions-tq.h" -#include "torque-generated/field-offsets-tq.h" +#include "torque-generated/exported-class-definitions-inl.h" +#include "torque-generated/exported-class-definitions.h" +#include "torque-generated/field-offsets.h" namespace v8 { namespace internal { @@ -188,9 +188,6 @@ VisitorId Map::GetVisitorId(Map map) { case FEEDBACK_METADATA_TYPE: return kVisitFeedbackMetadata; - case FEEDBACK_VECTOR_TYPE: - return kVisitFeedbackVector; - case ODDBALL_TYPE: return kVisitOddball; @@ -613,6 +610,7 @@ void Map::DeprecateTransitionTree(Isolate* isolate) { transitions.GetTarget(i).DeprecateTransitionTree(isolate); } DCHECK(!constructor_or_backpointer().IsFunctionTemplateInfo()); + DCHECK(CanBeDeprecated()); set_is_deprecated(true); if (FLAG_trace_maps) { LOG(isolate, MapEvent("Deprecate", handle(*this, isolate), Handle())); @@ -638,8 +636,7 @@ void Map::ReplaceDescriptors(Isolate* isolate, DescriptorArray new_descriptors, // all its elements. Map current = *this; #ifndef V8_DISABLE_WRITE_BARRIERS - WriteBarrier::Marking(current, to_replace, - to_replace.number_of_descriptors()); + WriteBarrier::Marking(to_replace, to_replace.number_of_descriptors()); #endif while (current.instance_descriptors(isolate) == to_replace) { Object next = current.GetBackPointer(isolate); @@ -1136,8 +1133,7 @@ void Map::EnsureDescriptorSlack(Isolate* isolate, Handle map, int slack) { // descriptors will not be trimmed in the mark-compactor, we need to mark // all its elements. #ifndef V8_DISABLE_WRITE_BARRIERS - WriteBarrier::Marking(*map, *descriptors, - descriptors->number_of_descriptors()); + WriteBarrier::Marking(*descriptors, descriptors->number_of_descriptors()); #endif Map current = *map; @@ -2580,7 +2576,7 @@ void Map::SetInstanceDescriptors(Isolate* isolate, DescriptorArray descriptors, set_synchronized_instance_descriptors(descriptors); SetNumberOfOwnDescriptors(number_of_own_descriptors); #ifndef V8_DISABLE_WRITE_BARRIERS - WriteBarrier::Marking(*this, descriptors, number_of_own_descriptors); + WriteBarrier::Marking(descriptors, number_of_own_descriptors); #endif } diff --git a/deps/v8/src/objects/map.h b/deps/v8/src/objects/map.h index 74ef9c8fcfa7b8..007dd77d6ed18d 100644 --- a/deps/v8/src/objects/map.h +++ b/deps/v8/src/objects/map.h @@ -11,8 +11,8 @@ #include "src/objects/heap-object.h" #include "src/objects/internal-index.h" #include "src/objects/objects.h" -#include "torque-generated/bit-fields-tq.h" -#include "torque-generated/field-offsets-tq.h" +#include "torque-generated/bit-fields.h" +#include "torque-generated/field-offsets.h" // Has to be the last include (doesn't have include guards): #include "src/objects/object-macros.h" @@ -42,7 +42,6 @@ enum InstanceType : uint16_t; V(EmbedderDataArray) \ V(EphemeronHashTable) \ V(FeedbackCell) \ - V(FeedbackVector) \ V(FreeSpace) \ V(JSApiObject) \ V(JSArrayBuffer) \ diff --git a/deps/v8/src/objects/maybe-object-inl.h b/deps/v8/src/objects/maybe-object-inl.h index 36da46fa176e76..afb3a93123fe06 100644 --- a/deps/v8/src/objects/maybe-object-inl.h +++ b/deps/v8/src/objects/maybe-object-inl.h @@ -55,6 +55,19 @@ HeapObjectReference HeapObjectReference::Weak(Object object) { return HeapObjectReference(object.ptr() | kWeakHeapObjectMask); } +// static +HeapObjectReference HeapObjectReference::From(Object object, + HeapObjectReferenceType type) { + DCHECK(!object.IsSmi()); + DCHECK(!HasWeakHeapObjectTag(object)); + switch (type) { + case HeapObjectReferenceType::STRONG: + return HeapObjectReference::Strong(object); + case HeapObjectReferenceType::WEAK: + return HeapObjectReference::Weak(object); + } +} + // static HeapObjectReference HeapObjectReference::ClearedValue(const Isolate* isolate) { // Construct cleared weak ref value. diff --git a/deps/v8/src/objects/maybe-object.h b/deps/v8/src/objects/maybe-object.h index 7074d1ae95dc92..fd1363498e35dd 100644 --- a/deps/v8/src/objects/maybe-object.h +++ b/deps/v8/src/objects/maybe-object.h @@ -47,6 +47,9 @@ class HeapObjectReference : public MaybeObject { V8_INLINE static HeapObjectReference Weak(Object object); + V8_INLINE static HeapObjectReference From(Object object, + HeapObjectReferenceType type); + V8_INLINE static HeapObjectReference ClearedValue(const Isolate* isolate); template diff --git a/deps/v8/src/objects/module.cc b/deps/v8/src/objects/module.cc index 2101589f602861..e35870e953d7d9 100644 --- a/deps/v8/src/objects/module.cc +++ b/deps/v8/src/objects/module.cc @@ -21,57 +21,74 @@ namespace v8 { namespace internal { +namespace { #ifdef DEBUG -void Module::PrintStatusTransition(Status new_status) { - if (FLAG_trace_module_status) { - StdoutStream os; - os << "Changing module status from " << status() << " to " << new_status - << " for "; - if (this->IsSourceTextModule()) { - Handle - - - - - - - - - + - - - - - - - - - + - - - - - - - - - - - +

BEHOLD, THIS IS PARSEROR!

Usage

diff --git a/deps/v8/tools/parse-processor.js b/deps/v8/tools/parse-processor.mjs similarity index 99% rename from deps/v8/tools/parse-processor.js rename to deps/v8/tools/parse-processor.mjs index b829cf29d5be80..ed010d55a4e277 100644 --- a/deps/v8/tools/parse-processor.js +++ b/deps/v8/tools/parse-processor.mjs @@ -3,11 +3,13 @@ // found in the LICENSE file. "use strict"; +import { LogReader, parseString } from "./logreader.mjs"; +import { BaseArgumentsProcessor } from "./arguments.mjs"; /** * A thin wrapper around shell's 'read' function showing a file name on error. */ -function readFile(fileName) { +export function readFile(fileName) { try { return read(fileName); } catch (e) { @@ -730,8 +732,8 @@ class Funktion extends CompilationUnit { // =========================================================================== -const kTimestampFactor = 1000; -const kSecondsToMillis = 1000; +export const kTimestampFactor = 1000; +export const kSecondsToMillis = 1000; function toTimestamp(microseconds) { return microseconds / kTimestampFactor @@ -744,7 +746,7 @@ function startOf(timestamp, time) { } -class ParseProcessor extends LogReader { +export class ParseProcessor extends LogReader { constructor() { super(); this.dispatchTable_ = { @@ -1130,7 +1132,7 @@ class ParseProcessor extends LogReader { } -class ArgumentsProcessor extends BaseArgumentsProcessor { +export class ArgumentsProcessor extends BaseArgumentsProcessor { getArgsDispatch() { return {}; } diff --git a/deps/v8/tools/plot-timer-events b/deps/v8/tools/plot-timer-events deleted file mode 100755 index 02176320a5cce9..00000000000000 --- a/deps/v8/tools/plot-timer-events +++ /dev/null @@ -1,93 +0,0 @@ -#!/bin/sh - -# find the name of the log file to process, it must not start with a dash. -log_file="v8.log" -for arg in "$@" -do - if ! expr "X${arg}" : "^X-" > /dev/null; then - log_file=${arg} - fi -done - -tools_path=`cd $(dirname "$0");pwd` -if test ! "$D8_PATH"; then - d8_public=`which d8` - if test -x "$d8_public"; then D8_PATH=$(dirname "$d8_public"); fi -fi - -if test ! -n "$D8_PATH"; then - D8_PATH=$tools_path/.. -fi - -d8_exec=$D8_PATH/d8 - -if test ! -x "$d8_exec"; then - D8_PATH=`pwd`/out/native - d8_exec=$D8_PATH/d8 -fi - -if test ! -x "$d8_exec"; then - d8_exec=`grep -m 1 -o '".*/d8"' $log_file | sed 's/"//g'` -fi - -if test ! -x "$d8_exec"; then - echo "d8 shell not found in $D8_PATH" - echo "Please provide path to d8 as env var in D8_PATH" - exit 1 -fi - - -contains=0; -for arg in "$@"; do - `echo "$arg" | grep -q "^--distortion"` - if test $? -eq 0; then - contains=1 - break - fi -done - -if test "$contains" -eq 0; then - # Try to find out how much the instrumentation overhead is. - calibration_log=calibration.log - calibration_script="for (var i = 0; i < 1000000; i++) print();" - - $d8_exec --noopt --prof --logfile $calibration_log \ - --log-timer-events -e "$calibration_script" > /dev/null - t_1_start=`grep "timer-event-start,\"V8.Execute\"" $calibration_log \ - | tail -n1 | awk -F, '{print $3}'` - t_1_end=`grep "timer-event-end,\"V8.Execute\"" $calibration_log \ - | tail -n1 | awk -F, '{print $3}'` - n_1=`grep "timer-event\|tick" $calibration_log | wc -l` - - $d8_exec --noopt --prof --logfile $calibration_log \ - --log-internal-timer-events -e "$calibration_script" > /dev/null - t_2_start=`grep "timer-event-start,\"V8.Execute\"" $calibration_log \ - | tail -n1 | awk -F, '{print $3}'` - t_2_end=`grep "timer-event-end,\"V8.Execute\"" $calibration_log \ - | tail -n1 | awk -F, '{print $3}'` - n_2=`grep "timer-event\|tick" $calibration_log | wc -l` - - rm $calibration_log - - # Overhead in picoseconds. - distortion=`echo "1000*(($t_1_end - $t_1_start) - ($t_2_end - $t_2_start)) \ - / ($n_1 - $n_2)" | bc` - options="--distortion=$distortion" -fi - -cat $log_file | - $d8_exec $tools_path/csvparser.js $tools_path/splaytree.js \ - $tools_path/codemap.js $tools_path/profile.js $tools_path/profile_view.js \ - $tools_path/logreader.js $tools_path/arguments.js \ - $tools_path/tickprocessor.js$tools_path/profviz/composer.js \ - $tools_path/profviz/stdio.js \ - -- $@ $options 2>/dev/null > timer-events.plot - -success=$? -if test $success -ne 0; then - cat timer-events.plot -else - cat timer-events.plot | gnuplot > timer-events.png -fi - -rm -f timer-events.plot diff --git a/deps/v8/tools/profile.js b/deps/v8/tools/profile.js index f8829679db0dba..50076825ad3fbc 100644 --- a/deps/v8/tools/profile.js +++ b/deps/v8/tools/profile.js @@ -25,6 +25,52 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// TODO: move to separate modules +class SourcePosition { + constructor(script, line, column) { + this.script = script; + this.line = line; + this.column = column; + this.entries = []; + } + addEntry(entry) { + this.entries.push(entry); + } +} + +class Script { + + constructor(id, name, source) { + this.id = id; + this.name = name; + this.source = source; + this.sourcePositions = []; + // Map> + this.lineToColumn = new Map(); + } + + addSourcePosition(line, column, entry) { + let sourcePosition = this.lineToColumn.get(line)?.get(column); + if (sourcePosition === undefined) { + sourcePosition = new SourcePosition(this, line, column, ) + this.#addSourcePosition(line, column, sourcePosition); + } + sourcePosition.addEntry(entry); + return sourcePosition; + } + + #addSourcePosition(line, column, sourcePosition) { + let columnToSourcePosition; + if (this.lineToColumn.has(line)) { + columnToSourcePosition = this.lineToColumn.get(line); + } else { + columnToSourcePosition = new Map(); + this.lineToColumn.set(line, columnToSourcePosition); + } + this.sourcePositions.push(sourcePosition); + columnToSourcePosition.set(column, sourcePosition); + } +} /** * Creates a profile object for processing profiling-related events @@ -38,6 +84,8 @@ function Profile() { this.bottomUpTree_ = new CallTree(); this.c_entries_ = {}; this.ticks_ = []; + this.scripts_ = []; + this.urlToScript_ = new Map(); }; @@ -47,7 +95,7 @@ function Profile() { * * @param {string} name Function name. */ -Profile.prototype.skipThisFunction = function(name) { +Profile.prototype.skipThisFunction = function (name) { return false; }; @@ -89,8 +137,8 @@ Profile.CodeState = { * during stack strace processing, specifies a position of the frame * containing the address. */ -Profile.prototype.handleUnknownCode = function( - operation, addr, opt_stackPos) { +Profile.prototype.handleUnknownCode = function ( + operation, addr, opt_stackPos) { }; @@ -101,10 +149,10 @@ Profile.prototype.handleUnknownCode = function( * @param {number} startAddr Starting address. * @param {number} endAddr Ending address. */ -Profile.prototype.addLibrary = function( - name, startAddr, endAddr) { +Profile.prototype.addLibrary = function ( + name, startAddr, endAddr) { var entry = new CodeMap.CodeEntry( - endAddr - startAddr, name, 'SHARED_LIB'); + endAddr - startAddr, name, 'SHARED_LIB'); this.codeMap_.addLibrary(startAddr, entry); return entry; }; @@ -117,10 +165,10 @@ Profile.prototype.addLibrary = function( * @param {number} startAddr Starting address. * @param {number} endAddr Ending address. */ -Profile.prototype.addStaticCode = function( - name, startAddr, endAddr) { +Profile.prototype.addStaticCode = function ( + name, startAddr, endAddr) { var entry = new CodeMap.CodeEntry( - endAddr - startAddr, name, 'CPP'); + endAddr - startAddr, name, 'CPP'); this.codeMap_.addStaticCode(startAddr, entry); return entry; }; @@ -134,8 +182,8 @@ Profile.prototype.addStaticCode = function( * @param {number} start Starting address. * @param {number} size Code entry size. */ -Profile.prototype.addCode = function( - type, name, timestamp, start, size) { +Profile.prototype.addCode = function ( + type, name, timestamp, start, size) { var entry = new Profile.DynamicCodeEntry(size, type, name); this.codeMap_.addCode(start, entry); return entry; @@ -152,8 +200,8 @@ Profile.prototype.addCode = function( * @param {number} funcAddr Shared function object address. * @param {Profile.CodeState} state Optimization state. */ -Profile.prototype.addFuncCode = function( - type, name, timestamp, start, size, funcAddr, state) { +Profile.prototype.addFuncCode = function ( + type, name, timestamp, start, size, funcAddr, state) { // As code and functions are in the same address space, // it is safe to put them in a single code map. var func = this.codeMap_.findDynamicEntryByStartAddress(funcAddr); @@ -188,7 +236,7 @@ Profile.prototype.addFuncCode = function( * @param {number} from Current code entry address. * @param {number} to New code entry address. */ -Profile.prototype.moveCode = function(from, to) { +Profile.prototype.moveCode = function (from, to) { try { this.codeMap_.moveCode(from, to); } catch (e) { @@ -196,9 +244,9 @@ Profile.prototype.moveCode = function(from, to) { } }; -Profile.prototype.deoptCode = function( - timestamp, code, inliningId, scriptOffset, bailoutType, - sourcePositionText, deoptReasonText) { +Profile.prototype.deoptCode = function ( + timestamp, code, inliningId, scriptOffset, bailoutType, + sourcePositionText, deoptReasonText) { }; /** @@ -206,7 +254,7 @@ Profile.prototype.deoptCode = function( * * @param {number} start Starting address. */ -Profile.prototype.deleteCode = function(start) { +Profile.prototype.deleteCode = function (start) { try { this.codeMap_.deleteCode(start); } catch (e) { @@ -217,17 +265,27 @@ Profile.prototype.deleteCode = function(start) { /** * Adds source positions for given code. */ -Profile.prototype.addSourcePositions = function( - start, script, startPos, endPos, sourcePositions, inliningPositions, - inlinedFunctions) { +Profile.prototype.addSourcePositions = function ( + start, script, startPos, endPos, sourcePositions, inliningPositions, + inlinedFunctions) { // CLI does not need source code => ignore. }; /** * Adds script source code. */ -Profile.prototype.addScriptSource = function(script, source) { - // CLI does not need source code => ignore. +Profile.prototype.addScriptSource = function (id, url, source) { + const script = new Script(id, url, source); + this.scripts_[id] = script; + this.urlToScript_.set(url, script); +}; + + +/** + * Adds script source code. + */ +Profile.prototype.getScript = function (url) { + return this.urlToScript_.get(url); }; /** @@ -236,7 +294,7 @@ Profile.prototype.addScriptSource = function(script, source) { * @param {number} from Current code entry address. * @param {number} to New code entry address. */ -Profile.prototype.moveFunc = function(from, to) { +Profile.prototype.moveFunc = function (from, to) { if (this.codeMap_.findDynamicEntryByStartAddress(from)) { this.codeMap_.moveCode(from, to); } @@ -248,7 +306,7 @@ Profile.prototype.moveFunc = function(from, to) { * * @param {number} addr Entry address. */ -Profile.prototype.findEntry = function(addr) { +Profile.prototype.findEntry = function (addr) { return this.codeMap_.findEntry(addr); }; @@ -259,7 +317,7 @@ Profile.prototype.findEntry = function(addr) { * * @param {Array} stack Stack sample. */ -Profile.prototype.recordTick = function(time_ns, vmState, stack) { +Profile.prototype.recordTick = function (time_ns, vmState, stack) { var processedStack = this.resolveAndFilterFuncs_(stack); this.bottomUpTree_.addPath(processedStack); processedStack.reverse(); @@ -273,7 +331,7 @@ Profile.prototype.recordTick = function(time_ns, vmState, stack) { * * @param {Array} stack Stack sample. */ -Profile.prototype.resolveAndFilterFuncs_ = function(stack) { +Profile.prototype.resolveAndFilterFuncs_ = function (stack) { var result = []; var last_seen_c_function = ''; var look_for_first_c_function = false; @@ -295,9 +353,9 @@ Profile.prototype.resolveAndFilterFuncs_ = function(stack) { if (i === 0) result.push("UNKNOWN"); } if (look_for_first_c_function && - i > 0 && - (!entry || entry.type !== 'CPP') && - last_seen_c_function !== '') { + i > 0 && + (!entry || entry.type !== 'CPP') && + last_seen_c_function !== '') { if (this.c_entries_[last_seen_c_function] === undefined) { this.c_entries_[last_seen_c_function] = 0; } @@ -314,7 +372,7 @@ Profile.prototype.resolveAndFilterFuncs_ = function(stack) { * * @param {function(CallTree.Node)} f Visitor function. */ -Profile.prototype.traverseTopDownTree = function(f) { +Profile.prototype.traverseTopDownTree = function (f) { this.topDownTree_.traverse(f); }; @@ -324,7 +382,7 @@ Profile.prototype.traverseTopDownTree = function(f) { * * @param {function(CallTree.Node)} f Visitor function. */ -Profile.prototype.traverseBottomUpTree = function(f) { +Profile.prototype.traverseBottomUpTree = function (f) { this.bottomUpTree_.traverse(f); }; @@ -335,7 +393,7 @@ Profile.prototype.traverseBottomUpTree = function(f) { * * @param {string} opt_label Node label. */ -Profile.prototype.getTopDownProfile = function(opt_label) { +Profile.prototype.getTopDownProfile = function (opt_label) { return this.getTreeProfile_(this.topDownTree_, opt_label); }; @@ -346,7 +404,7 @@ Profile.prototype.getTopDownProfile = function(opt_label) { * * @param {string} opt_label Node label. */ -Profile.prototype.getBottomUpProfile = function(opt_label) { +Profile.prototype.getBottomUpProfile = function (opt_label) { return this.getTreeProfile_(this.bottomUpTree_, opt_label); }; @@ -357,7 +415,7 @@ Profile.prototype.getBottomUpProfile = function(opt_label) { * @param {Profile.CallTree} tree Call tree. * @param {string} opt_label Node label. */ -Profile.prototype.getTreeProfile_ = function(tree, opt_label) { +Profile.prototype.getTreeProfile_ = function (tree, opt_label) { if (!opt_label) { tree.computeTotalWeights(); return tree; @@ -375,7 +433,7 @@ Profile.prototype.getTreeProfile_ = function(tree, opt_label) { * * @param {string} opt_label Starting node label. */ -Profile.prototype.getFlatProfile = function(opt_label) { +Profile.prototype.getFlatProfile = function (opt_label) { var counters = new CallTree(); var rootLabel = opt_label || CallTree.ROOT_NODE_LABEL; var precs = {}; @@ -424,13 +482,13 @@ Profile.prototype.getFlatProfile = function(opt_label) { }; -Profile.CEntryNode = function(name, ticks) { +Profile.CEntryNode = function (name, ticks) { this.name = name; this.ticks = ticks; } -Profile.prototype.getCEntryProfile = function() { +Profile.prototype.getCEntryProfile = function () { var result = [new Profile.CEntryNode("TOTAL", 0)]; var total_ticks = 0; for (var f in this.c_entries_) { @@ -439,7 +497,7 @@ Profile.prototype.getCEntryProfile = function() { result.push(new Profile.CEntryNode(f, ticks)); } result[0].ticks = total_ticks; // Sorting will keep this at index 0. - result.sort(function(n1, n2) { + result.sort(function (n1, n2) { return n2.ticks - n1.ticks || (n2.name < n1.name ? -1 : 1) }); return result; @@ -449,7 +507,7 @@ Profile.prototype.getCEntryProfile = function() { /** * Cleans up function entries that are not referenced by code entries. */ -Profile.prototype.cleanUpFuncEntries = function() { +Profile.prototype.cleanUpFuncEntries = function () { var referencedFuncEntries = []; var entries = this.codeMap_.getAllDynamicEntriesWithAddresses(); for (var i = 0, l = entries.length; i < l; ++i) { @@ -464,7 +522,7 @@ Profile.prototype.cleanUpFuncEntries = function() { } for (var i = 0, l = entries.length; i < l; ++i) { if (entries[i][1].constructor === Profile.FunctionEntry && - !entries[i][1].used) { + !entries[i][1].used) { this.codeMap_.deleteCode(entries[i][0]); } } @@ -479,7 +537,7 @@ Profile.prototype.cleanUpFuncEntries = function() { * @param {string} name Function name. * @constructor */ -Profile.DynamicCodeEntry = function(size, type, name) { +Profile.DynamicCodeEntry = function (size, type, name) { CodeMap.CodeEntry.call(this, size, name, type); }; @@ -487,7 +545,7 @@ Profile.DynamicCodeEntry = function(size, type, name) { /** * Returns node name. */ -Profile.DynamicCodeEntry.prototype.getName = function() { +Profile.DynamicCodeEntry.prototype.getName = function () { return this.type + ': ' + this.name; }; @@ -495,17 +553,17 @@ Profile.DynamicCodeEntry.prototype.getName = function() { /** * Returns raw node name (without type decoration). */ -Profile.DynamicCodeEntry.prototype.getRawName = function() { +Profile.DynamicCodeEntry.prototype.getRawName = function () { return this.name; }; -Profile.DynamicCodeEntry.prototype.isJSFunction = function() { +Profile.DynamicCodeEntry.prototype.isJSFunction = function () { return false; }; -Profile.DynamicCodeEntry.prototype.toString = function() { +Profile.DynamicCodeEntry.prototype.toString = function () { return this.getName() + ': ' + this.size.toString(16); }; @@ -519,7 +577,7 @@ Profile.DynamicCodeEntry.prototype.toString = function() { * @param {Profile.CodeState} state Code optimization state. * @constructor */ -Profile.DynamicFuncCodeEntry = function(size, type, func, state) { +Profile.DynamicFuncCodeEntry = function (size, type, func, state) { CodeMap.CodeEntry.call(this, size, '', type); this.func = func; this.state = state; @@ -530,14 +588,14 @@ Profile.DynamicFuncCodeEntry.STATE_PREFIX = ["", "~", "*"]; /** * Returns state. */ -Profile.DynamicFuncCodeEntry.prototype.getState = function() { +Profile.DynamicFuncCodeEntry.prototype.getState = function () { return Profile.DynamicFuncCodeEntry.STATE_PREFIX[this.state]; }; /** * Returns node name. */ -Profile.DynamicFuncCodeEntry.prototype.getName = function() { +Profile.DynamicFuncCodeEntry.prototype.getName = function () { var name = this.func.getName(); return this.type + ': ' + this.getState() + name; }; @@ -546,17 +604,17 @@ Profile.DynamicFuncCodeEntry.prototype.getName = function() { /** * Returns raw node name (without type decoration). */ -Profile.DynamicFuncCodeEntry.prototype.getRawName = function() { +Profile.DynamicFuncCodeEntry.prototype.getRawName = function () { return this.func.getName(); }; -Profile.DynamicFuncCodeEntry.prototype.isJSFunction = function() { +Profile.DynamicFuncCodeEntry.prototype.isJSFunction = function () { return true; }; -Profile.DynamicFuncCodeEntry.prototype.toString = function() { +Profile.DynamicFuncCodeEntry.prototype.toString = function () { return this.getName() + ': ' + this.size.toString(16); }; @@ -567,7 +625,7 @@ Profile.DynamicFuncCodeEntry.prototype.toString = function() { * @param {string} name Function name. * @constructor */ -Profile.FunctionEntry = function(name) { +Profile.FunctionEntry = function (name) { CodeMap.CodeEntry.call(this, 0, name); }; @@ -575,7 +633,7 @@ Profile.FunctionEntry = function(name) { /** * Returns node name. */ -Profile.FunctionEntry.prototype.getName = function() { +Profile.FunctionEntry.prototype.getName = function () { var name = this.name; if (name.length == 0) { name = ''; @@ -595,7 +653,7 @@ Profile.FunctionEntry.prototype.toString = CodeMap.CodeEntry.prototype.toString; */ function CallTree() { this.root_ = new CallTree.Node( - CallTree.ROOT_NODE_LABEL); + CallTree.ROOT_NODE_LABEL); }; @@ -614,7 +672,7 @@ CallTree.prototype.totalsComputed_ = false; /** * Returns the tree root. */ -CallTree.prototype.getRoot = function() { +CallTree.prototype.getRoot = function () { return this.root_; }; @@ -624,7 +682,7 @@ CallTree.prototype.getRoot = function() { * * @param {Array} path Call path. */ -CallTree.prototype.addPath = function(path) { +CallTree.prototype.addPath = function (path) { if (path.length == 0) { return; } @@ -644,7 +702,7 @@ CallTree.prototype.addPath = function(path) { * * @param {string} label Child node label. */ -CallTree.prototype.findOrAddChild = function(label) { +CallTree.prototype.findOrAddChild = function (label) { return this.root_.findOrAddChild(label); }; @@ -665,9 +723,9 @@ CallTree.prototype.findOrAddChild = function(label) { * * @param {string} label The label of the new root node. */ -CallTree.prototype.cloneSubtree = function(label) { +CallTree.prototype.cloneSubtree = function (label) { var subTree = new CallTree(); - this.traverse(function(node, parent) { + this.traverse(function (node, parent) { if (!parent && node.label != label) { return null; } @@ -682,7 +740,7 @@ CallTree.prototype.cloneSubtree = function(label) { /** * Computes total weights in the call graph. */ -CallTree.prototype.computeTotalWeights = function() { +CallTree.prototype.computeTotalWeights = function () { if (this.totalsComputed_) { return; } @@ -706,16 +764,17 @@ CallTree.prototype.computeTotalWeights = function() { * @param {function(CallTree.Node, *)} f Visitor function. * The second parameter is the result of calling 'f' on the parent node. */ -CallTree.prototype.traverse = function(f) { +CallTree.prototype.traverse = function (f) { var pairsToProcess = new ConsArray(); - pairsToProcess.concat([{node: this.root_, param: null}]); + pairsToProcess.concat([{ node: this.root_, param: null }]); while (!pairsToProcess.atEnd()) { var pair = pairsToProcess.next(); var node = pair.node; var newParam = f(node, pair.param); var morePairsToProcess = []; node.forEachChild(function (child) { - morePairsToProcess.push({node: child, param: newParam}); }); + morePairsToProcess.push({ node: child, param: newParam }); + }); pairsToProcess.concat(morePairsToProcess); } }; @@ -729,7 +788,7 @@ CallTree.prototype.traverse = function(f) { * @param {function(CallTree.Node)} exit A function called * after visiting node's children. */ -CallTree.prototype.traverseInDepth = function(enter, exit) { +CallTree.prototype.traverseInDepth = function (enter, exit) { function traverse(node) { enter(node); node.forEachChild(traverse); @@ -745,7 +804,7 @@ CallTree.prototype.traverseInDepth = function(enter, exit) { * @param {string} label Node label. * @param {CallTree.Node} opt_parent Node parent. */ -CallTree.Node = function(label, opt_parent) { +CallTree.Node = function (label, opt_parent) { this.label = label; this.parent = opt_parent; this.children = {}; @@ -772,7 +831,7 @@ CallTree.Node.prototype.totalWeight = 0; * * @param {string} label Child node label. */ -CallTree.Node.prototype.addChild = function(label) { +CallTree.Node.prototype.addChild = function (label) { var child = new CallTree.Node(label, this); this.children[label] = child; return child; @@ -783,18 +842,19 @@ CallTree.Node.prototype.addChild = function(label) { * Computes node's total weight. */ CallTree.Node.prototype.computeTotalWeight = - function() { - var totalWeight = this.selfWeight; - this.forEachChild(function(child) { - totalWeight += child.computeTotalWeight(); }); - return this.totalWeight = totalWeight; -}; + function () { + var totalWeight = this.selfWeight; + this.forEachChild(function (child) { + totalWeight += child.computeTotalWeight(); + }); + return this.totalWeight = totalWeight; + }; /** * Returns all node's children as an array. */ -CallTree.Node.prototype.exportChildren = function() { +CallTree.Node.prototype.exportChildren = function () { var result = []; this.forEachChild(function (node) { result.push(node); }); return result; @@ -806,7 +866,7 @@ CallTree.Node.prototype.exportChildren = function() { * * @param {string} label Child node label. */ -CallTree.Node.prototype.findChild = function(label) { +CallTree.Node.prototype.findChild = function (label) { return this.children[label] || null; }; @@ -817,7 +877,7 @@ CallTree.Node.prototype.findChild = function(label) { * * @param {string} label Child node label. */ -CallTree.Node.prototype.findOrAddChild = function(label) { +CallTree.Node.prototype.findOrAddChild = function (label) { return this.findChild(label) || this.addChild(label); }; @@ -827,7 +887,7 @@ CallTree.Node.prototype.findOrAddChild = function(label) { * * @param {function(CallTree.Node)} f Visitor function. */ -CallTree.Node.prototype.forEachChild = function(f) { +CallTree.Node.prototype.forEachChild = function (f) { for (var c in this.children) { f(this.children[c]); } @@ -839,7 +899,7 @@ CallTree.Node.prototype.forEachChild = function(f) { * * @param {function(CallTree.Node)} f Visitor function. */ -CallTree.Node.prototype.walkUpToRoot = function(f) { +CallTree.Node.prototype.walkUpToRoot = function (f) { for (var curr = this; curr != null; curr = curr.parent) { f(curr); } @@ -852,8 +912,8 @@ CallTree.Node.prototype.walkUpToRoot = function(f) { * @param {Array} labels The path. * @param {function(CallTree.Node)} opt_f Visitor function. */ -CallTree.Node.prototype.descendToChild = function( - labels, opt_f) { +CallTree.Node.prototype.descendToChild = function ( + labels, opt_f) { for (var pos = 0, curr = this; pos < labels.length && curr != null; pos++) { var child = curr.findChild(labels[pos]); if (opt_f) { @@ -872,30 +932,30 @@ function JsonProfile() { this.scripts_ = []; } -JsonProfile.prototype.addLibrary = function( - name, startAddr, endAddr) { +JsonProfile.prototype.addLibrary = function ( + name, startAddr, endAddr) { var entry = new CodeMap.CodeEntry( - endAddr - startAddr, name, 'SHARED_LIB'); + endAddr - startAddr, name, 'SHARED_LIB'); this.codeMap_.addLibrary(startAddr, entry); entry.codeId = this.codeEntries_.length; - this.codeEntries_.push({name : entry.name, type : entry.type}); + this.codeEntries_.push({ name: entry.name, type: entry.type }); return entry; }; -JsonProfile.prototype.addStaticCode = function( - name, startAddr, endAddr) { +JsonProfile.prototype.addStaticCode = function ( + name, startAddr, endAddr) { var entry = new CodeMap.CodeEntry( - endAddr - startAddr, name, 'CPP'); + endAddr - startAddr, name, 'CPP'); this.codeMap_.addStaticCode(startAddr, entry); entry.codeId = this.codeEntries_.length; - this.codeEntries_.push({name : entry.name, type : entry.type}); + this.codeEntries_.push({ name: entry.name, type: entry.type }); return entry; }; -JsonProfile.prototype.addCode = function( - kind, name, timestamp, start, size) { +JsonProfile.prototype.addCode = function ( + kind, name, timestamp, start, size) { let codeId = this.codeEntries_.length; // Find out if we have a static code entry for the code. If yes, we will // make sure it is written to the JSON file just once. @@ -909,17 +969,17 @@ JsonProfile.prototype.addCode = function( entry.codeId = codeId; this.codeEntries_[codeId] = { - name : entry.name, + name: entry.name, timestamp: timestamp, - type : entry.type, - kind : kind + type: entry.type, + kind: kind }; return entry; }; -JsonProfile.prototype.addFuncCode = function( - kind, name, timestamp, start, size, funcAddr, state) { +JsonProfile.prototype.addFuncCode = function ( + kind, name, timestamp, start, size, funcAddr, state) { // As code and functions are in the same address space, // it is safe to put them in a single code map. var func = this.codeMap_.findDynamicEntryByStartAddress(funcAddr); @@ -928,13 +988,13 @@ JsonProfile.prototype.addFuncCode = function( this.codeMap_.addCode(funcAddr, func); func.funcId = this.functionEntries_.length; - this.functionEntries_.push({name : name, codes : []}); + this.functionEntries_.push({ name: name, codes: [] }); } else if (func.name !== name) { // Function object has been overwritten with a new one. func.name = name; func.funcId = this.functionEntries_.length; - this.functionEntries_.push({name : name, codes : []}); + this.functionEntries_.push({ name: name, codes: [] }); } // TODO(jarin): Insert the code object into the SFI's code list. var entry = this.codeMap_.findDynamicEntryByStartAddress(start); @@ -964,17 +1024,17 @@ JsonProfile.prototype.addFuncCode = function( } this.codeEntries_.push({ - name : entry.name, - type : entry.type, - kind : kind, - func : func.funcId, - tm : timestamp + name: entry.name, + type: entry.type, + kind: kind, + func: func.funcId, + tm: timestamp }); } return entry; }; -JsonProfile.prototype.moveCode = function(from, to) { +JsonProfile.prototype.moveCode = function (from, to) { try { this.codeMap_.moveCode(from, to); } catch (e) { @@ -982,9 +1042,9 @@ JsonProfile.prototype.moveCode = function(from, to) { } }; -JsonProfile.prototype.addSourcePositions = function( - start, script, startPos, endPos, sourcePositions, inliningPositions, - inlinedFunctions) { +JsonProfile.prototype.addSourcePositions = function ( + start, script, startPos, endPos, sourcePositions, inliningPositions, + inlinedFunctions) { var entry = this.codeMap_.findDynamicEntryByStartAddress(start); if (!entry) return; var codeId = entry.codeId; @@ -1007,26 +1067,23 @@ JsonProfile.prototype.addSourcePositions = function( } this.codeEntries_[entry.codeId].source = { - script : script, - start : startPos, - end : endPos, - positions : sourcePositions, - inlined : inliningPositions, - fns : inlinedFunctions + script: script, + start: startPos, + end: endPos, + positions: sourcePositions, + inlined: inliningPositions, + fns: inlinedFunctions }; }; -JsonProfile.prototype.addScriptSource = function(script, url, source) { - this.scripts_[script] = { - name : url, - source : source - }; +JsonProfile.prototype.addScriptSource = function (id, url, source) { + this.scripts_[id] = new Script(id, url, source); }; -JsonProfile.prototype.deoptCode = function( - timestamp, code, inliningId, scriptOffset, bailoutType, - sourcePositionText, deoptReasonText) { +JsonProfile.prototype.deoptCode = function ( + timestamp, code, inliningId, scriptOffset, bailoutType, + sourcePositionText, deoptReasonText) { let entry = this.codeMap_.findDynamicEntryByStartAddress(code); if (entry) { let codeId = entry.codeId; @@ -1035,18 +1092,18 @@ JsonProfile.prototype.deoptCode = function( // The subsequent deoptimizations should be lazy deopts for // other on-stack activations. this.codeEntries_[codeId].deopt = { - tm : timestamp, - inliningId : inliningId, - scriptOffset : scriptOffset, - posText : sourcePositionText, - reason : deoptReasonText, - bailoutType : bailoutType + tm: timestamp, + inliningId: inliningId, + scriptOffset: scriptOffset, + posText: sourcePositionText, + reason: deoptReasonText, + bailoutType: bailoutType }; } } }; -JsonProfile.prototype.deleteCode = function(start) { +JsonProfile.prototype.deleteCode = function (start) { try { this.codeMap_.deleteCode(start); } catch (e) { @@ -1054,17 +1111,17 @@ JsonProfile.prototype.deleteCode = function(start) { } }; -JsonProfile.prototype.moveFunc = function(from, to) { +JsonProfile.prototype.moveFunc = function (from, to) { if (this.codeMap_.findDynamicEntryByStartAddress(from)) { this.codeMap_.moveCode(from, to); } }; -JsonProfile.prototype.findEntry = function(addr) { +JsonProfile.prototype.findEntry = function (addr) { return this.codeMap_.findEntry(addr); }; -JsonProfile.prototype.recordTick = function(time_ns, vmState, stack) { +JsonProfile.prototype.recordTick = function (time_ns, vmState, stack) { // TODO(jarin) Resolve the frame-less case (when top of stack is // known code). var processedStack = []; @@ -1076,14 +1133,14 @@ JsonProfile.prototype.recordTick = function(time_ns, vmState, stack) { processedStack.push(-1, stack[i]); } } - this.ticks_.push({ tm : time_ns, vm : vmState, s : processedStack }); + this.ticks_.push({ tm: time_ns, vm: vmState, s: processedStack }); }; function writeJson(s) { write(JSON.stringify(s, null, 2)); } -JsonProfile.prototype.writeJson = function() { +JsonProfile.prototype.writeJson = function () { // Write out the JSON in a partially manual way to avoid creating too-large // strings in one JSON.stringify call when there are a lot of ticks. write('{\n') diff --git a/deps/v8/tools/profile.mjs b/deps/v8/tools/profile.mjs new file mode 100644 index 00000000000000..50864dce0f912d --- /dev/null +++ b/deps/v8/tools/profile.mjs @@ -0,0 +1,1175 @@ +// Copyright 2009 the V8 project authors. 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. + +import { CodeMap } from "./codemap.mjs"; +import { ConsArray } from "./consarray.mjs"; + +// TODO: move to separate modules +export class SourcePosition { + constructor(script, line, column) { + this.script = script; + this.line = line; + this.column = column; + this.entries = []; + } + addEntry(entry) { + this.entries.push(entry); + } +} + +export class Script { + + constructor(id, name, source) { + this.id = id; + this.name = name; + this.source = source; + this.sourcePositions = []; + // Map> + this.lineToColumn = new Map(); + } + + addSourcePosition(line, column, entry) { + let sourcePosition = this.lineToColumn.get(line)?.get(column); + if (sourcePosition === undefined) { + sourcePosition = new SourcePosition(this, line, column, ) + this.#addSourcePosition(line, column, sourcePosition); + } + sourcePosition.addEntry(entry); + return sourcePosition; + } + + #addSourcePosition(line, column, sourcePosition) { + let columnToSourcePosition; + if (this.lineToColumn.has(line)) { + columnToSourcePosition = this.lineToColumn.get(line); + } else { + columnToSourcePosition = new Map(); + this.lineToColumn.set(line, columnToSourcePosition); + } + this.sourcePositions.push(sourcePosition); + columnToSourcePosition.set(column, sourcePosition); + } +} + +/** + * Creates a profile object for processing profiling-related events + * and calculating function execution times. + * + * @constructor + */ +export function Profile() { + this.codeMap_ = new CodeMap(); + this.topDownTree_ = new CallTree(); + this.bottomUpTree_ = new CallTree(); + this.c_entries_ = {}; + this.ticks_ = []; + this.scripts_ = []; + this.urlToScript_ = new Map(); +}; + + +/** + * Returns whether a function with the specified name must be skipped. + * Should be overriden by subclasses. + * + * @param {string} name Function name. + */ +Profile.prototype.skipThisFunction = function (name) { + return false; +}; + + +/** + * Enum for profiler operations that involve looking up existing + * code entries. + * + * @enum {number} + */ +Profile.Operation = { + MOVE: 0, + DELETE: 1, + TICK: 2 +}; + + +/** + * Enum for code state regarding its dynamic optimization. + * + * @enum {number} + */ +Profile.CodeState = { + COMPILED: 0, + OPTIMIZABLE: 1, + OPTIMIZED: 2 +}; + + +/** + * Called whenever the specified operation has failed finding a function + * containing the specified address. Should be overriden by subclasses. + * See the Profile.Operation enum for the list of + * possible operations. + * + * @param {number} operation Operation. + * @param {number} addr Address of the unknown code. + * @param {number} opt_stackPos If an unknown address is encountered + * during stack strace processing, specifies a position of the frame + * containing the address. + */ +Profile.prototype.handleUnknownCode = function ( + operation, addr, opt_stackPos) { +}; + + +/** + * Registers a library. + * + * @param {string} name Code entry name. + * @param {number} startAddr Starting address. + * @param {number} endAddr Ending address. + */ +Profile.prototype.addLibrary = function ( + name, startAddr, endAddr) { + var entry = new CodeMap.CodeEntry( + endAddr - startAddr, name, 'SHARED_LIB'); + this.codeMap_.addLibrary(startAddr, entry); + return entry; +}; + + +/** + * Registers statically compiled code entry. + * + * @param {string} name Code entry name. + * @param {number} startAddr Starting address. + * @param {number} endAddr Ending address. + */ +Profile.prototype.addStaticCode = function ( + name, startAddr, endAddr) { + var entry = new CodeMap.CodeEntry( + endAddr - startAddr, name, 'CPP'); + this.codeMap_.addStaticCode(startAddr, entry); + return entry; +}; + + +/** + * Registers dynamic (JIT-compiled) code entry. + * + * @param {string} type Code entry type. + * @param {string} name Code entry name. + * @param {number} start Starting address. + * @param {number} size Code entry size. + */ +Profile.prototype.addCode = function ( + type, name, timestamp, start, size) { + var entry = new Profile.DynamicCodeEntry(size, type, name); + this.codeMap_.addCode(start, entry); + return entry; +}; + + +/** + * Registers dynamic (JIT-compiled) code entry. + * + * @param {string} type Code entry type. + * @param {string} name Code entry name. + * @param {number} start Starting address. + * @param {number} size Code entry size. + * @param {number} funcAddr Shared function object address. + * @param {Profile.CodeState} state Optimization state. + */ +Profile.prototype.addFuncCode = function ( + type, name, timestamp, start, size, funcAddr, state) { + // As code and functions are in the same address space, + // it is safe to put them in a single code map. + var func = this.codeMap_.findDynamicEntryByStartAddress(funcAddr); + if (!func) { + func = new Profile.FunctionEntry(name); + this.codeMap_.addCode(funcAddr, func); + } else if (func.name !== name) { + // Function object has been overwritten with a new one. + func.name = name; + } + var entry = this.codeMap_.findDynamicEntryByStartAddress(start); + if (entry) { + if (entry.size === size && entry.func === func) { + // Entry state has changed. + entry.state = state; + } else { + this.codeMap_.deleteCode(start); + entry = null; + } + } + if (!entry) { + entry = new Profile.DynamicFuncCodeEntry(size, type, func, state); + this.codeMap_.addCode(start, entry); + } + return entry; +}; + + +/** + * Reports about moving of a dynamic code entry. + * + * @param {number} from Current code entry address. + * @param {number} to New code entry address. + */ +Profile.prototype.moveCode = function (from, to) { + try { + this.codeMap_.moveCode(from, to); + } catch (e) { + this.handleUnknownCode(Profile.Operation.MOVE, from); + } +}; + +Profile.prototype.deoptCode = function ( + timestamp, code, inliningId, scriptOffset, bailoutType, + sourcePositionText, deoptReasonText) { +}; + +/** + * Reports about deletion of a dynamic code entry. + * + * @param {number} start Starting address. + */ +Profile.prototype.deleteCode = function (start) { + try { + this.codeMap_.deleteCode(start); + } catch (e) { + this.handleUnknownCode(Profile.Operation.DELETE, start); + } +}; + +/** + * Adds source positions for given code. + */ +Profile.prototype.addSourcePositions = function ( + start, script, startPos, endPos, sourcePositions, inliningPositions, + inlinedFunctions) { + // CLI does not need source code => ignore. +}; + +/** + * Adds script source code. + */ +Profile.prototype.addScriptSource = function (id, url, source) { + const script = new Script(id, url, source); + this.scripts_[id] = script; + this.urlToScript_.set(url, script); +}; + + +/** + * Adds script source code. + */ +Profile.prototype.getScript = function (url) { + return this.urlToScript_.get(url); +}; + +/** + * Reports about moving of a dynamic code entry. + * + * @param {number} from Current code entry address. + * @param {number} to New code entry address. + */ +Profile.prototype.moveFunc = function (from, to) { + if (this.codeMap_.findDynamicEntryByStartAddress(from)) { + this.codeMap_.moveCode(from, to); + } +}; + + +/** + * Retrieves a code entry by an address. + * + * @param {number} addr Entry address. + */ +Profile.prototype.findEntry = function (addr) { + return this.codeMap_.findEntry(addr); +}; + + +/** + * Records a tick event. Stack must contain a sequence of + * addresses starting with the program counter value. + * + * @param {Array} stack Stack sample. + */ +Profile.prototype.recordTick = function (time_ns, vmState, stack) { + var processedStack = this.resolveAndFilterFuncs_(stack); + this.bottomUpTree_.addPath(processedStack); + processedStack.reverse(); + this.topDownTree_.addPath(processedStack); +}; + + +/** + * Translates addresses into function names and filters unneeded + * functions. + * + * @param {Array} stack Stack sample. + */ +Profile.prototype.resolveAndFilterFuncs_ = function (stack) { + var result = []; + var last_seen_c_function = ''; + var look_for_first_c_function = false; + for (var i = 0; i < stack.length; ++i) { + var entry = this.codeMap_.findEntry(stack[i]); + if (entry) { + var name = entry.getName(); + if (i === 0 && (entry.type === 'CPP' || entry.type === 'SHARED_LIB')) { + look_for_first_c_function = true; + } + if (look_for_first_c_function && entry.type === 'CPP') { + last_seen_c_function = name; + } + if (!this.skipThisFunction(name)) { + result.push(name); + } + } else { + this.handleUnknownCode(Profile.Operation.TICK, stack[i], i); + if (i === 0) result.push("UNKNOWN"); + } + if (look_for_first_c_function && + i > 0 && + (!entry || entry.type !== 'CPP') && + last_seen_c_function !== '') { + if (this.c_entries_[last_seen_c_function] === undefined) { + this.c_entries_[last_seen_c_function] = 0; + } + this.c_entries_[last_seen_c_function]++; + look_for_first_c_function = false; // Found it, we're done. + } + } + return result; +}; + + +/** + * Performs a BF traversal of the top down call graph. + * + * @param {function(CallTree.Node)} f Visitor function. + */ +Profile.prototype.traverseTopDownTree = function (f) { + this.topDownTree_.traverse(f); +}; + + +/** + * Performs a BF traversal of the bottom up call graph. + * + * @param {function(CallTree.Node)} f Visitor function. + */ +Profile.prototype.traverseBottomUpTree = function (f) { + this.bottomUpTree_.traverse(f); +}; + + +/** + * Calculates a top down profile for a node with the specified label. + * If no name specified, returns the whole top down calls tree. + * + * @param {string} opt_label Node label. + */ +Profile.prototype.getTopDownProfile = function (opt_label) { + return this.getTreeProfile_(this.topDownTree_, opt_label); +}; + + +/** + * Calculates a bottom up profile for a node with the specified label. + * If no name specified, returns the whole bottom up calls tree. + * + * @param {string} opt_label Node label. + */ +Profile.prototype.getBottomUpProfile = function (opt_label) { + return this.getTreeProfile_(this.bottomUpTree_, opt_label); +}; + + +/** + * Helper function for calculating a tree profile. + * + * @param {Profile.CallTree} tree Call tree. + * @param {string} opt_label Node label. + */ +Profile.prototype.getTreeProfile_ = function (tree, opt_label) { + if (!opt_label) { + tree.computeTotalWeights(); + return tree; + } else { + var subTree = tree.cloneSubtree(opt_label); + subTree.computeTotalWeights(); + return subTree; + } +}; + + +/** + * Calculates a flat profile of callees starting from a node with + * the specified label. If no name specified, starts from the root. + * + * @param {string} opt_label Starting node label. + */ +Profile.prototype.getFlatProfile = function (opt_label) { + var counters = new CallTree(); + var rootLabel = opt_label || CallTree.ROOT_NODE_LABEL; + var precs = {}; + precs[rootLabel] = 0; + var root = counters.findOrAddChild(rootLabel); + + this.topDownTree_.computeTotalWeights(); + this.topDownTree_.traverseInDepth( + function onEnter(node) { + if (!(node.label in precs)) { + precs[node.label] = 0; + } + var nodeLabelIsRootLabel = node.label == rootLabel; + if (nodeLabelIsRootLabel || precs[rootLabel] > 0) { + if (precs[rootLabel] == 0) { + root.selfWeight += node.selfWeight; + root.totalWeight += node.totalWeight; + } else { + var rec = root.findOrAddChild(node.label); + rec.selfWeight += node.selfWeight; + if (nodeLabelIsRootLabel || precs[node.label] == 0) { + rec.totalWeight += node.totalWeight; + } + } + precs[node.label]++; + } + }, + function onExit(node) { + if (node.label == rootLabel || precs[rootLabel] > 0) { + precs[node.label]--; + } + }, + null); + + if (!opt_label) { + // If we have created a flat profile for the whole program, we don't + // need an explicit root in it. Thus, replace the counters tree + // root with the node corresponding to the whole program. + counters.root_ = root; + } else { + // Propagate weights so percents can be calculated correctly. + counters.getRoot().selfWeight = root.selfWeight; + counters.getRoot().totalWeight = root.totalWeight; + } + return counters; +}; + + +Profile.CEntryNode = function (name, ticks) { + this.name = name; + this.ticks = ticks; +} + + +Profile.prototype.getCEntryProfile = function () { + var result = [new Profile.CEntryNode("TOTAL", 0)]; + var total_ticks = 0; + for (var f in this.c_entries_) { + var ticks = this.c_entries_[f]; + total_ticks += ticks; + result.push(new Profile.CEntryNode(f, ticks)); + } + result[0].ticks = total_ticks; // Sorting will keep this at index 0. + result.sort(function (n1, n2) { + return n2.ticks - n1.ticks || (n2.name < n1.name ? -1 : 1) + }); + return result; +} + + +/** + * Cleans up function entries that are not referenced by code entries. + */ +Profile.prototype.cleanUpFuncEntries = function () { + var referencedFuncEntries = []; + var entries = this.codeMap_.getAllDynamicEntriesWithAddresses(); + for (var i = 0, l = entries.length; i < l; ++i) { + if (entries[i][1].constructor === Profile.FunctionEntry) { + entries[i][1].used = false; + } + } + for (var i = 0, l = entries.length; i < l; ++i) { + if ("func" in entries[i][1]) { + entries[i][1].func.used = true; + } + } + for (var i = 0, l = entries.length; i < l; ++i) { + if (entries[i][1].constructor === Profile.FunctionEntry && + !entries[i][1].used) { + this.codeMap_.deleteCode(entries[i][0]); + } + } +}; + + +/** + * Creates a dynamic code entry. + * + * @param {number} size Code size. + * @param {string} type Code type. + * @param {string} name Function name. + * @constructor + */ +Profile.DynamicCodeEntry = function (size, type, name) { + CodeMap.CodeEntry.call(this, size, name, type); +}; + + +/** + * Returns node name. + */ +Profile.DynamicCodeEntry.prototype.getName = function () { + return this.type + ': ' + this.name; +}; + + +/** + * Returns raw node name (without type decoration). + */ +Profile.DynamicCodeEntry.prototype.getRawName = function () { + return this.name; +}; + + +Profile.DynamicCodeEntry.prototype.isJSFunction = function () { + return false; +}; + + +Profile.DynamicCodeEntry.prototype.toString = function () { + return this.getName() + ': ' + this.size.toString(16); +}; + + +/** + * Creates a dynamic code entry. + * + * @param {number} size Code size. + * @param {string} type Code type. + * @param {Profile.FunctionEntry} func Shared function entry. + * @param {Profile.CodeState} state Code optimization state. + * @constructor + */ +Profile.DynamicFuncCodeEntry = function (size, type, func, state) { + CodeMap.CodeEntry.call(this, size, '', type); + this.func = func; + this.state = state; +}; + +Profile.DynamicFuncCodeEntry.STATE_PREFIX = ["", "~", "*"]; + +/** + * Returns state. + */ +Profile.DynamicFuncCodeEntry.prototype.getState = function () { + return Profile.DynamicFuncCodeEntry.STATE_PREFIX[this.state]; +}; + +/** + * Returns node name. + */ +Profile.DynamicFuncCodeEntry.prototype.getName = function () { + var name = this.func.getName(); + return this.type + ': ' + this.getState() + name; +}; + + +/** + * Returns raw node name (without type decoration). + */ +Profile.DynamicFuncCodeEntry.prototype.getRawName = function () { + return this.func.getName(); +}; + + +Profile.DynamicFuncCodeEntry.prototype.isJSFunction = function () { + return true; +}; + + +Profile.DynamicFuncCodeEntry.prototype.toString = function () { + return this.getName() + ': ' + this.size.toString(16); +}; + + +/** + * Creates a shared function object entry. + * + * @param {string} name Function name. + * @constructor + */ +Profile.FunctionEntry = function (name) { + CodeMap.CodeEntry.call(this, 0, name); +}; + + +/** + * Returns node name. + */ +Profile.FunctionEntry.prototype.getName = function () { + var name = this.name; + if (name.length == 0) { + name = ''; + } else if (name.charAt(0) == ' ') { + // An anonymous function with location: " aaa.js:10". + name = '' + name; + } + return name; +}; + +Profile.FunctionEntry.prototype.toString = CodeMap.CodeEntry.prototype.toString; + +/** + * Constructs a call graph. + * + * @constructor + */ +function CallTree() { + this.root_ = new CallTree.Node( + CallTree.ROOT_NODE_LABEL); +}; + + +/** + * The label of the root node. + */ +CallTree.ROOT_NODE_LABEL = ''; + + +/** + * @private + */ +CallTree.prototype.totalsComputed_ = false; + + +/** + * Returns the tree root. + */ +CallTree.prototype.getRoot = function () { + return this.root_; +}; + + +/** + * Adds the specified call path, constructing nodes as necessary. + * + * @param {Array} path Call path. + */ +CallTree.prototype.addPath = function (path) { + if (path.length == 0) { + return; + } + var curr = this.root_; + for (var i = 0; i < path.length; ++i) { + curr = curr.findOrAddChild(path[i]); + } + curr.selfWeight++; + this.totalsComputed_ = false; +}; + + +/** + * Finds an immediate child of the specified parent with the specified + * label, creates a child node if necessary. If a parent node isn't + * specified, uses tree root. + * + * @param {string} label Child node label. + */ +CallTree.prototype.findOrAddChild = function (label) { + return this.root_.findOrAddChild(label); +}; + + +/** + * Creates a subtree by cloning and merging all subtrees rooted at nodes + * with a given label. E.g. cloning the following call tree on label 'A' + * will give the following result: + * + * -- + * / / + * == clone on 'A' ==> -- + * \ \ + * ---- + * + * And 's selfWeight will be the sum of selfWeights of 's from the + * source call tree. + * + * @param {string} label The label of the new root node. + */ +CallTree.prototype.cloneSubtree = function (label) { + var subTree = new CallTree(); + this.traverse(function (node, parent) { + if (!parent && node.label != label) { + return null; + } + var child = (parent ? parent : subTree).findOrAddChild(node.label); + child.selfWeight += node.selfWeight; + return child; + }); + return subTree; +}; + + +/** + * Computes total weights in the call graph. + */ +CallTree.prototype.computeTotalWeights = function () { + if (this.totalsComputed_) { + return; + } + this.root_.computeTotalWeight(); + this.totalsComputed_ = true; +}; + + +/** + * Traverses the call graph in preorder. This function can be used for + * building optionally modified tree clones. This is the boilerplate code + * for this scenario: + * + * callTree.traverse(function(node, parentClone) { + * var nodeClone = cloneNode(node); + * if (parentClone) + * parentClone.addChild(nodeClone); + * return nodeClone; + * }); + * + * @param {function(CallTree.Node, *)} f Visitor function. + * The second parameter is the result of calling 'f' on the parent node. + */ +CallTree.prototype.traverse = function (f) { + var pairsToProcess = new ConsArray(); + pairsToProcess.concat([{ node: this.root_, param: null }]); + while (!pairsToProcess.atEnd()) { + var pair = pairsToProcess.next(); + var node = pair.node; + var newParam = f(node, pair.param); + var morePairsToProcess = []; + node.forEachChild(function (child) { + morePairsToProcess.push({ node: child, param: newParam }); + }); + pairsToProcess.concat(morePairsToProcess); + } +}; + + +/** + * Performs an indepth call graph traversal. + * + * @param {function(CallTree.Node)} enter A function called + * prior to visiting node's children. + * @param {function(CallTree.Node)} exit A function called + * after visiting node's children. + */ +CallTree.prototype.traverseInDepth = function (enter, exit) { + function traverse(node) { + enter(node); + node.forEachChild(traverse); + exit(node); + } + traverse(this.root_); +}; + + +/** + * Constructs a call graph node. + * + * @param {string} label Node label. + * @param {CallTree.Node} opt_parent Node parent. + */ +CallTree.Node = function (label, opt_parent) { + this.label = label; + this.parent = opt_parent; + this.children = {}; +}; + + +/** + * Node self weight (how many times this node was the last node in + * a call path). + * @type {number} + */ +CallTree.Node.prototype.selfWeight = 0; + + +/** + * Node total weight (includes weights of all children). + * @type {number} + */ +CallTree.Node.prototype.totalWeight = 0; + + +/** + * Adds a child node. + * + * @param {string} label Child node label. + */ +CallTree.Node.prototype.addChild = function (label) { + var child = new CallTree.Node(label, this); + this.children[label] = child; + return child; +}; + + +/** + * Computes node's total weight. + */ +CallTree.Node.prototype.computeTotalWeight = + function () { + var totalWeight = this.selfWeight; + this.forEachChild(function (child) { + totalWeight += child.computeTotalWeight(); + }); + return this.totalWeight = totalWeight; + }; + + +/** + * Returns all node's children as an array. + */ +CallTree.Node.prototype.exportChildren = function () { + var result = []; + this.forEachChild(function (node) { result.push(node); }); + return result; +}; + + +/** + * Finds an immediate child with the specified label. + * + * @param {string} label Child node label. + */ +CallTree.Node.prototype.findChild = function (label) { + return this.children[label] || null; +}; + + +/** + * Finds an immediate child with the specified label, creates a child + * node if necessary. + * + * @param {string} label Child node label. + */ +CallTree.Node.prototype.findOrAddChild = function (label) { + return this.findChild(label) || this.addChild(label); +}; + + +/** + * Calls the specified function for every child. + * + * @param {function(CallTree.Node)} f Visitor function. + */ +CallTree.Node.prototype.forEachChild = function (f) { + for (var c in this.children) { + f(this.children[c]); + } +}; + + +/** + * Walks up from the current node up to the call tree root. + * + * @param {function(CallTree.Node)} f Visitor function. + */ +CallTree.Node.prototype.walkUpToRoot = function (f) { + for (var curr = this; curr != null; curr = curr.parent) { + f(curr); + } +}; + + +/** + * Tries to find a node with the specified path. + * + * @param {Array} labels The path. + * @param {function(CallTree.Node)} opt_f Visitor function. + */ +CallTree.Node.prototype.descendToChild = function ( + labels, opt_f) { + for (var pos = 0, curr = this; pos < labels.length && curr != null; pos++) { + var child = curr.findChild(labels[pos]); + if (opt_f) { + opt_f(child, pos); + } + curr = child; + } + return curr; +}; + +export function JsonProfile() { + this.codeMap_ = new CodeMap(); + this.codeEntries_ = []; + this.functionEntries_ = []; + this.ticks_ = []; + this.scripts_ = []; +} + +JsonProfile.prototype.addLibrary = function ( + name, startAddr, endAddr) { + var entry = new CodeMap.CodeEntry( + endAddr - startAddr, name, 'SHARED_LIB'); + this.codeMap_.addLibrary(startAddr, entry); + + entry.codeId = this.codeEntries_.length; + this.codeEntries_.push({ name: entry.name, type: entry.type }); + return entry; +}; + +JsonProfile.prototype.addStaticCode = function ( + name, startAddr, endAddr) { + var entry = new CodeMap.CodeEntry( + endAddr - startAddr, name, 'CPP'); + this.codeMap_.addStaticCode(startAddr, entry); + + entry.codeId = this.codeEntries_.length; + this.codeEntries_.push({ name: entry.name, type: entry.type }); + return entry; +}; + +JsonProfile.prototype.addCode = function ( + kind, name, timestamp, start, size) { + let codeId = this.codeEntries_.length; + // Find out if we have a static code entry for the code. If yes, we will + // make sure it is written to the JSON file just once. + let staticEntry = this.codeMap_.findAddress(start); + if (staticEntry && staticEntry.entry.type === 'CPP') { + codeId = staticEntry.entry.codeId; + } + + var entry = new CodeMap.CodeEntry(size, name, 'CODE'); + this.codeMap_.addCode(start, entry); + + entry.codeId = codeId; + this.codeEntries_[codeId] = { + name: entry.name, + timestamp: timestamp, + type: entry.type, + kind: kind + }; + + return entry; +}; + +JsonProfile.prototype.addFuncCode = function ( + kind, name, timestamp, start, size, funcAddr, state) { + // As code and functions are in the same address space, + // it is safe to put them in a single code map. + var func = this.codeMap_.findDynamicEntryByStartAddress(funcAddr); + if (!func) { + var func = new CodeMap.CodeEntry(0, name, 'SFI'); + this.codeMap_.addCode(funcAddr, func); + + func.funcId = this.functionEntries_.length; + this.functionEntries_.push({ name: name, codes: [] }); + } else if (func.name !== name) { + // Function object has been overwritten with a new one. + func.name = name; + + func.funcId = this.functionEntries_.length; + this.functionEntries_.push({ name: name, codes: [] }); + } + // TODO(jarin): Insert the code object into the SFI's code list. + var entry = this.codeMap_.findDynamicEntryByStartAddress(start); + if (entry) { + if (entry.size === size && entry.func === func) { + // Entry state has changed. + entry.state = state; + } else { + this.codeMap_.deleteCode(start); + entry = null; + } + } + if (!entry) { + entry = new CodeMap.CodeEntry(size, name, 'JS'); + this.codeMap_.addCode(start, entry); + + entry.codeId = this.codeEntries_.length; + + this.functionEntries_[func.funcId].codes.push(entry.codeId); + + if (state === 0) { + kind = "Builtin"; + } else if (state === 1) { + kind = "Unopt"; + } else if (state === 2) { + kind = "Opt"; + } + + this.codeEntries_.push({ + name: entry.name, + type: entry.type, + kind: kind, + func: func.funcId, + tm: timestamp + }); + } + return entry; +}; + +JsonProfile.prototype.moveCode = function (from, to) { + try { + this.codeMap_.moveCode(from, to); + } catch (e) { + printErr("Move: unknown source " + from); + } +}; + +JsonProfile.prototype.addSourcePositions = function ( + start, script, startPos, endPos, sourcePositions, inliningPositions, + inlinedFunctions) { + var entry = this.codeMap_.findDynamicEntryByStartAddress(start); + if (!entry) return; + var codeId = entry.codeId; + + // Resolve the inlined functions list. + if (inlinedFunctions.length > 0) { + inlinedFunctions = inlinedFunctions.substring(1).split("S"); + for (var i = 0; i < inlinedFunctions.length; i++) { + var funcAddr = parseInt(inlinedFunctions[i]); + var func = this.codeMap_.findDynamicEntryByStartAddress(funcAddr); + if (!func || func.funcId === undefined) { + printErr("Could not find function " + inlinedFunctions[i]); + inlinedFunctions[i] = null; + } else { + inlinedFunctions[i] = func.funcId; + } + } + } else { + inlinedFunctions = []; + } + + this.codeEntries_[entry.codeId].source = { + script: script, + start: startPos, + end: endPos, + positions: sourcePositions, + inlined: inliningPositions, + fns: inlinedFunctions + }; +}; + +JsonProfile.prototype.addScriptSource = function (id, url, source) { + this.scripts_[id] = new Script(id, url, source); +}; + + +JsonProfile.prototype.deoptCode = function ( + timestamp, code, inliningId, scriptOffset, bailoutType, + sourcePositionText, deoptReasonText) { + let entry = this.codeMap_.findDynamicEntryByStartAddress(code); + if (entry) { + let codeId = entry.codeId; + if (!this.codeEntries_[codeId].deopt) { + // Only add the deopt if there was no deopt before. + // The subsequent deoptimizations should be lazy deopts for + // other on-stack activations. + this.codeEntries_[codeId].deopt = { + tm: timestamp, + inliningId: inliningId, + scriptOffset: scriptOffset, + posText: sourcePositionText, + reason: deoptReasonText, + bailoutType: bailoutType + }; + } + } +}; + +JsonProfile.prototype.deleteCode = function (start) { + try { + this.codeMap_.deleteCode(start); + } catch (e) { + printErr("Delete: unknown address " + start); + } +}; + +JsonProfile.prototype.moveFunc = function (from, to) { + if (this.codeMap_.findDynamicEntryByStartAddress(from)) { + this.codeMap_.moveCode(from, to); + } +}; + +JsonProfile.prototype.findEntry = function (addr) { + return this.codeMap_.findEntry(addr); +}; + +JsonProfile.prototype.recordTick = function (time_ns, vmState, stack) { + // TODO(jarin) Resolve the frame-less case (when top of stack is + // known code). + var processedStack = []; + for (var i = 0; i < stack.length; i++) { + var resolved = this.codeMap_.findAddress(stack[i]); + if (resolved) { + processedStack.push(resolved.entry.codeId, resolved.offset); + } else { + processedStack.push(-1, stack[i]); + } + } + this.ticks_.push({ tm: time_ns, vm: vmState, s: processedStack }); +}; + +function writeJson(s) { + write(JSON.stringify(s, null, 2)); +} + +JsonProfile.prototype.writeJson = function () { + // Write out the JSON in a partially manual way to avoid creating too-large + // strings in one JSON.stringify call when there are a lot of ticks. + write('{\n') + + write(' "code": '); + writeJson(this.codeEntries_); + write(',\n'); + + write(' "functions": '); + writeJson(this.functionEntries_); + write(',\n'); + + write(' "ticks": [\n'); + for (var i = 0; i < this.ticks_.length; i++) { + write(' '); + writeJson(this.ticks_[i]); + if (i < this.ticks_.length - 1) { + write(',\n'); + } else { + write('\n'); + } + } + write(' ],\n'); + + write(' "scripts": '); + writeJson(this.scripts_); + + write('}\n'); +}; diff --git a/deps/v8/tools/profile_view.mjs b/deps/v8/tools/profile_view.mjs new file mode 100644 index 00000000000000..9349cc6a7a98b1 --- /dev/null +++ b/deps/v8/tools/profile_view.mjs @@ -0,0 +1,202 @@ +// Copyright 2009 the V8 project authors. 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. + +import { ConsArray } from "./consarray.mjs"; + +/** + * Creates a Profile View builder object. + * + * @param {number} samplingRate Number of ms between profiler ticks. + * @constructor + */ +export function ViewBuilder(samplingRate) { + this.samplingRate = samplingRate; +}; + + +/** + * Builds a profile view for the specified call tree. + * + * @param {CallTree} callTree A call tree. + * @param {boolean} opt_bottomUpViewWeights Whether remapping + * of self weights for a bottom up view is needed. + */ +ViewBuilder.prototype.buildView = function( + callTree, opt_bottomUpViewWeights) { + var head; + var samplingRate = this.samplingRate; + var createViewNode = this.createViewNode; + callTree.traverse(function(node, viewParent) { + var totalWeight = node.totalWeight * samplingRate; + var selfWeight = node.selfWeight * samplingRate; + if (opt_bottomUpViewWeights === true) { + if (viewParent === head) { + selfWeight = totalWeight; + } else { + selfWeight = 0; + } + } + var viewNode = createViewNode(node.label, totalWeight, selfWeight, head); + if (viewParent) { + viewParent.addChild(viewNode); + } else { + head = viewNode; + } + return viewNode; + }); + var view = this.createView(head); + return view; +}; + + +/** + * Factory method for a profile view. + * + * @param {ProfileView.Node} head View head node. + * @return {ProfileView} Profile view. + */ +ViewBuilder.prototype.createView = function(head) { + return new ProfileView(head); +}; + + +/** + * Factory method for a profile view node. + * + * @param {string} internalFuncName A fully qualified function name. + * @param {number} totalTime Amount of time that application spent in the + * corresponding function and its descendants (not that depending on + * profile they can be either callees or callers.) + * @param {number} selfTime Amount of time that application spent in the + * corresponding function only. + * @param {ProfileView.Node} head Profile view head. + * @return {ProfileView.Node} Profile view node. + */ +ViewBuilder.prototype.createViewNode = function( + funcName, totalTime, selfTime, head) { + return new ProfileView.Node( + funcName, totalTime, selfTime, head); +}; + + +/** + * Creates a Profile View object. It allows to perform sorting + * and filtering actions on the profile. + * + * @param {ProfileView.Node} head Head (root) node. + * @constructor + */ +export function ProfileView(head) { + this.head = head; +}; + + +/** + * Sorts the profile view using the specified sort function. + * + * @param {function(ProfileView.Node, + * ProfileView.Node):number} sortFunc A sorting + * functions. Must comply with Array.sort sorting function requirements. + */ +ProfileView.prototype.sort = function(sortFunc) { + this.traverse(function (node) { + node.sortChildren(sortFunc); + }); +}; + + +/** + * Traverses profile view nodes in preorder. + * + * @param {function(ProfileView.Node)} f Visitor function. + */ +ProfileView.prototype.traverse = function(f) { + var nodesToTraverse = new ConsArray(); + nodesToTraverse.concat([this.head]); + while (!nodesToTraverse.atEnd()) { + var node = nodesToTraverse.next(); + f(node); + nodesToTraverse.concat(node.children); + } +}; + + +/** + * Constructs a Profile View node object. Each node object corresponds to + * a function call. + * + * @param {string} internalFuncName A fully qualified function name. + * @param {number} totalTime Amount of time that application spent in the + * corresponding function and its descendants (not that depending on + * profile they can be either callees or callers.) + * @param {number} selfTime Amount of time that application spent in the + * corresponding function only. + * @param {ProfileView.Node} head Profile view head. + * @constructor + */ +ProfileView.Node = function( + internalFuncName, totalTime, selfTime, head) { + this.internalFuncName = internalFuncName; + this.totalTime = totalTime; + this.selfTime = selfTime; + this.head = head; + this.parent = null; + this.children = []; +}; + + +/** + * Returns a share of the function's total time in its parent's total time. + */ +ProfileView.Node.prototype.__defineGetter__( + 'parentTotalPercent', + function() { return this.totalTime / + (this.parent ? this.parent.totalTime : this.totalTime) * 100.0; }); + + +/** + * Adds a child to the node. + * + * @param {ProfileView.Node} node Child node. + */ +ProfileView.Node.prototype.addChild = function(node) { + node.parent = this; + this.children.push(node); +}; + + +/** + * Sorts all the node's children recursively. + * + * @param {function(ProfileView.Node, + * ProfileView.Node):number} sortFunc A sorting + * functions. Must comply with Array.sort sorting function requirements. + */ +ProfileView.Node.prototype.sortChildren = function( + sortFunc) { + this.children.sort(sortFunc); +}; diff --git a/deps/v8/tools/profviz/composer.js b/deps/v8/tools/profviz/composer.js deleted file mode 100644 index 411a7248ebd8f9..00000000000000 --- a/deps/v8/tools/profviz/composer.js +++ /dev/null @@ -1,557 +0,0 @@ -// Copyright 2013 the V8 project authors. 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. - -Array.prototype.top = function() { - if (this.length == 0) return undefined; - return this[this.length - 1]; -} - - -function PlotScriptComposer(kResX, kResY, error_output) { - // Constants. - var kV8BinarySuffixes = ["/d8", "/libv8.so"]; - var kStackFrames = 8; // Stack frames to display in the plot. - - var kTimerEventWidth = 0.33; // Width of each timeline. - var kExecutionFrameWidth = 0.2; // Width of the top stack frame line. - var kStackFrameWidth = 0.1; // Width of the lower stack frame lines. - var kGapWidth = 0.05; // Gap between stack frame lines. - - var kY1Offset = 11; // Offset for stack frame vs. event lines. - var kDeoptRow = 7; // Row displaying deopts. - var kGetTimeHeight = 0.5; // Height of marker displaying timed part. - var kMaxDeoptLength = 4; // Draw size of the largest deopt. - var kPauseLabelPadding = 5; // Padding for pause time labels. - var kNumPauseLabels = 7; // Number of biggest pauses to label. - var kCodeKindLabelPadding = 100; // Padding for code kind labels. - - var kTickHalfDuration = 0.5; // Duration of half a tick in ms. - var kMinRangeLength = 0.0005; // Minimum length for an event in ms. - - var kNumThreads = 2; // Number of threads. - var kExecutionThreadId = 0; // ID of main thread. - - // Init values. - var num_timer_event = kY1Offset + 0.5; - - // Data structures. - function TimerEvent(label, color, pause, thread_id) { - assert(thread_id >= 0 && thread_id < kNumThreads, "invalid thread id"); - this.label = label; - this.color = color; - this.pause = pause; - this.ranges = []; - this.thread_id = thread_id; - this.index = ++num_timer_event; - } - - function CodeKind(color, kinds) { - this.color = color; - this.in_execution = []; - this.stack_frames = []; - for (var i = 0; i < kStackFrames; i++) this.stack_frames.push([]); - this.kinds = kinds; - } - - function Range(start, end) { - this.start = start; // In milliseconds. - this.end = end; // In milliseconds. - } - - function Deopt(time, size) { - this.time = time; // In milliseconds. - this.size = size; // In bytes. - } - - Range.prototype.duration = function() { return this.end - this.start; } - - function Tick(tick) { - this.tick = tick; - } - - var TimerEvents = { - 'V8.Execute': - new TimerEvent("execution", "#000000", false, 0), - 'V8.External': - new TimerEvent("external", "#3399FF", false, 0), - 'V8.CompileFullCode': - new TimerEvent("compile unopt", "#CC0000", true, 0), - 'V8.RecompileSynchronous': - new TimerEvent("recompile sync", "#CC0044", true, 0), - 'V8.RecompileConcurrent': - new TimerEvent("recompile async", "#CC4499", false, 1), - 'V8.CompileEvalMicroSeconds': - new TimerEvent("compile eval", "#CC4400", true, 0), - 'V8.ParseMicroSeconds': - new TimerEvent("parse", "#00CC00", true, 0), - 'V8.PreParseMicroSeconds': - new TimerEvent("preparse", "#44CC00", true, 0), - 'V8.ParseLazyMicroSeconds': - new TimerEvent("lazy parse", "#00CC44", true, 0), - 'V8.GCScavenger': - new TimerEvent("gc scavenge", "#0044CC", true, 0), - 'V8.GCCompactor': - new TimerEvent("gc compaction", "#4444CC", true, 0), - 'V8.GCContext': - new TimerEvent("gc context", "#4400CC", true, 0), - }; - - var CodeKinds = { - 'external ': new CodeKind("#3399FF", [-2]), - 'runtime ': new CodeKind("#000000", [-1]), - 'full code': new CodeKind("#DD0000", [0]), - 'opt code ': new CodeKind("#00EE00", [1]), - 'code stub': new CodeKind("#FF00FF", [2]), - 'built-in ': new CodeKind("#AA00AA", [3]), - 'inl.cache': new CodeKind("#4444AA", - [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]), - 'reg.exp. ': new CodeKind("#0000FF", [15]), - }; - - var code_map = new CodeMap(); - var execution_pauses = []; - var deopts = []; - var gettime = []; - var event_stack = []; - var last_time_stamp = []; - for (var i = 0; i < kNumThreads; i++) { - event_stack[i] = []; - last_time_stamp[i] = -1; - } - - var range_start = undefined; - var range_end = undefined; - var obj_index = 0; - var pause_tolerance = 0.005; // Milliseconds. - var distortion = 0; - - // Utility functions. - function assert(something, message) { - if (!something) { - var error = new Error(message); - error_output(error.stack); - } - } - - function FindCodeKind(kind) { - for (name in CodeKinds) { - if (CodeKinds[name].kinds.indexOf(kind) >= 0) { - return CodeKinds[name]; - } - } - } - - function TicksToRanges(ticks) { - var ranges = []; - for (var i = 0; i < ticks.length; i++) { - var tick = ticks[i].tick; - ranges.push( - new Range(tick - kTickHalfDuration, tick + kTickHalfDuration)); - } - return ranges; - } - - function MergeRanges(ranges) { - ranges.sort(function(a, b) { - return (a.start == b.start) ? a.end - b.end : a.start - b.start; - }); - var result = []; - var j = 0; - for (var i = 0; i < ranges.length; i = j) { - var merge_start = ranges[i].start; - if (merge_start > range_end) break; // Out of plot range. - var merge_end = ranges[i].end; - for (j = i + 1; j < ranges.length; j++) { - var next_range = ranges[j]; - // Don't merge ranges if there is no overlap (incl. merge tolerance). - if (next_range.start > merge_end + pause_tolerance) break; - // Merge ranges. - if (next_range.end > merge_end) { // Extend range end. - merge_end = next_range.end; - } - } - if (merge_end < range_start) continue; // Out of plot range. - if (merge_end < merge_start) continue; // Not an actual range. - result.push(new Range(merge_start, merge_end)); - } - return result; - } - - function RestrictRangesTo(ranges, start, end) { - var result = []; - for (var i = 0; i < ranges.length; i++) { - if (ranges[i].start <= end && ranges[i].end >= start) { - result.push(new Range(Math.max(ranges[i].start, start), - Math.min(ranges[i].end, end))); - } - } - return result; - } - - // Public methods. - this.collectData = function(input, distortion_per_entry) { - - var last_timestamp = 0; - - // Parse functions. - var parseTimeStamp = function(timestamp) { - int_timestamp = parseInt(timestamp); - assert(int_timestamp >= last_timestamp, "Inconsistent timestamps."); - last_timestamp = int_timestamp; - distortion += distortion_per_entry; - return int_timestamp / 1000 - distortion; - } - - var processTimerEventStart = function(name, start) { - // Find out the thread id. - var new_event = TimerEvents[name]; - if (new_event === undefined) return; - var thread_id = new_event.thread_id; - - start = Math.max(last_time_stamp[thread_id] + kMinRangeLength, start); - - // Last event on this thread is done with the start of this event. - var last_event = event_stack[thread_id].top(); - if (last_event !== undefined) { - var new_range = new Range(last_time_stamp[thread_id], start); - last_event.ranges.push(new_range); - } - event_stack[thread_id].push(new_event); - last_time_stamp[thread_id] = start; - }; - - var processTimerEventEnd = function(name, end) { - // Find out about the thread_id. - var finished_event = TimerEvents[name]; - var thread_id = finished_event.thread_id; - assert(finished_event === event_stack[thread_id].pop(), - "inconsistent event stack"); - - end = Math.max(last_time_stamp[thread_id] + kMinRangeLength, end); - - var new_range = new Range(last_time_stamp[thread_id], end); - finished_event.ranges.push(new_range); - last_time_stamp[thread_id] = end; - }; - - var processCodeCreateEvent = function(type, kind, address, size, name) { - var code_entry = new CodeMap.CodeEntry(size, name); - code_entry.kind = kind; - code_map.addCode(address, code_entry); - }; - - var processCodeMoveEvent = function(from, to) { - code_map.moveCode(from, to); - }; - - var processCodeDeleteEvent = function(address) { - code_map.deleteCode(address); - }; - - var processCodeDeoptEvent = function(time, size) { - deopts.push(new Deopt(time, size)); - } - - var processCurrentTimeEvent = function(time) { - gettime.push(time); - } - - var processSharedLibrary = function(name, start, end) { - var code_entry = new CodeMap.CodeEntry(end - start, name); - code_entry.kind = -3; // External code kind. - for (var i = 0; i < kV8BinarySuffixes.length; i++) { - var suffix = kV8BinarySuffixes[i]; - if (name.indexOf(suffix, name.length - suffix.length) >= 0) { - code_entry.kind = -1; // V8 runtime code kind. - break; - } - } - code_map.addLibrary(start, code_entry); - }; - - var processTickEvent = function( - pc, timer, unused_x, unused_y, vmstate, stack) { - var tick = new Tick(timer); - - var entry = code_map.findEntry(pc); - if (entry) FindCodeKind(entry.kind).in_execution.push(tick); - - for (var i = 0; i < kStackFrames; i++) { - if (!stack[i]) break; - var entry = code_map.findEntry(stack[i]); - if (entry) FindCodeKind(entry.kind).stack_frames[i].push(tick); - } - }; - // Collect data from log. - var logreader = new LogReader( - { 'timer-event-start': { parsers: [parseString, parseTimeStamp], - processor: processTimerEventStart }, - 'timer-event-end': { parsers: [parseString, parseTimeStamp], - processor: processTimerEventEnd }, - 'shared-library': { parsers: [parseString, parseInt, parseInt], - processor: processSharedLibrary }, - 'code-creation': { parsers: [parseString, parseInt, parseInt, - parseInt, parseString], - processor: processCodeCreateEvent }, - 'code-move': { parsers: [parseInt, parseInt], - processor: processCodeMoveEvent }, - 'code-delete': { parsers: [parseInt], - processor: processCodeDeleteEvent }, - 'code-deopt': { parsers: [parseTimeStamp, parseInt], - processor: processCodeDeoptEvent }, - 'current-time': { parsers: [parseTimeStamp], - processor: processCurrentTimeEvent }, - 'tick': { parsers: [parseInt, parseTimeStamp, parseString, - parseString, parseInt, parseVarArgs], - processor: processTickEvent } - }); - - var line; - while (line = input()) { - for (var s of line.split("\n")) logreader.processLogLine(s); - } - - // Collect execution pauses. - for (name in TimerEvents) { - var event = TimerEvents[name]; - if (!event.pause) continue; - var ranges = event.ranges; - for (var j = 0; j < ranges.length; j++) execution_pauses.push(ranges[j]); - } - execution_pauses = MergeRanges(execution_pauses); - }; - - - this.findPlotRange = function( - range_start_override, range_end_override, result_callback) { - var start_found = (range_start_override || range_start_override == 0); - var end_found = (range_end_override || range_end_override == 0); - range_start = start_found ? range_start_override : Infinity; - range_end = end_found ? range_end_override : -Infinity; - - if (!start_found || !end_found) { - for (name in TimerEvents) { - var ranges = TimerEvents[name].ranges; - for (var i = 0; i < ranges.length; i++) { - if (ranges[i].start < range_start && !start_found) { - range_start = ranges[i].start; - } - if (ranges[i].end > range_end && !end_found) { - range_end = ranges[i].end; - } - } - } - - for (codekind in CodeKinds) { - var ticks = CodeKinds[codekind].in_execution; - for (var i = 0; i < ticks.length; i++) { - if (ticks[i].tick < range_start && !start_found) { - range_start = ticks[i].tick; - } - if (ticks[i].tick > range_end && !end_found) { - range_end = ticks[i].tick; - } - } - } - } - // Set pause tolerance to something appropriate for the plot resolution - // to make it easier for gnuplot. - pause_tolerance = (range_end - range_start) / kResX / 10; - - if (typeof result_callback === 'function') { - result_callback(range_start, range_end); - } - }; - - - this.assembleOutput = function(output) { - output("set yrange [0:" + (num_timer_event + 1) + "]"); - output("set xlabel \"execution time in ms\""); - output("set xrange [" + range_start + ":" + range_end + "]"); - output("set style fill pattern 2 bo 1"); - output("set style rect fs solid 1 noborder"); - output("set style line 1 lt 1 lw 1 lc rgb \"#000000\""); - output("set border 15 lw 0.2"); // Draw thin border box. - output("set style line 2 lt 1 lw 1 lc rgb \"#9944CC\""); - output("set xtics out nomirror"); - output("unset key"); - - function DrawBarBase(color, start, end, top, bottom, transparency) { - obj_index++; - command = "set object " + obj_index + " rect"; - command += " from " + start + ", " + top; - command += " to " + end + ", " + bottom; - command += " fc rgb \"" + color + "\""; - if (transparency) { - command += " fs transparent solid " + transparency; - } - output(command); - } - - function DrawBar(row, color, start, end, width) { - DrawBarBase(color, start, end, row + width, row - width); - } - - function DrawHalfBar(row, color, start, end, width) { - DrawBarBase(color, start, end, row, row - width); - } - - var percentages = {}; - var total = 0; - for (var name in TimerEvents) { - var event = TimerEvents[name]; - var ranges = RestrictRangesTo(event.ranges, range_start, range_end); - var sum = - ranges.map(function(range) { return range.duration(); }) - .reduce(function(a, b) { return a + b; }, 0); - percentages[name] = (sum / (range_end - range_start) * 100).toFixed(1); - } - - // Plot deopts. - deopts.sort(function(a, b) { return b.size - a.size; }); - var max_deopt_size = deopts.length > 0 ? deopts[0].size : Infinity; - - for (var i = 0; i < deopts.length; i++) { - var deopt = deopts[i]; - DrawHalfBar(kDeoptRow, "#9944CC", deopt.time, - deopt.time + 10 * pause_tolerance, - deopt.size / max_deopt_size * kMaxDeoptLength); - } - - // Plot current time polls. - if (gettime.length > 1) { - var start = gettime[0]; - var end = gettime.pop(); - DrawBarBase("#0000BB", start, end, kGetTimeHeight, 0, 0.2); - } - - // Name Y-axis. - var ytics = []; - for (name in TimerEvents) { - var index = TimerEvents[name].index; - var label = TimerEvents[name].label; - ytics.push('"' + label + ' (' + percentages[name] + '%%)" ' + index); - } - ytics.push('"code kind color coding" ' + kY1Offset); - ytics.push('"code kind in execution" ' + (kY1Offset - 1)); - ytics.push('"top ' + kStackFrames + ' js stack frames"' + ' ' + - (kY1Offset - 2)); - ytics.push('"pause times" 0'); - ytics.push('"max deopt size: ' + (max_deopt_size / 1024).toFixed(1) + - ' kB" ' + kDeoptRow); - output("set ytics out nomirror (" + ytics.join(', ') + ")"); - - // Plot timeline. - for (var name in TimerEvents) { - var event = TimerEvents[name]; - var ranges = MergeRanges(event.ranges); - for (var i = 0; i < ranges.length; i++) { - DrawBar(event.index, event.color, - ranges[i].start, ranges[i].end, - kTimerEventWidth); - } - } - - // Plot code kind gathered from ticks. - for (var name in CodeKinds) { - var code_kind = CodeKinds[name]; - var offset = kY1Offset - 1; - // Top most frame. - var row = MergeRanges(TicksToRanges(code_kind.in_execution)); - for (var j = 0; j < row.length; j++) { - DrawBar(offset, code_kind.color, - row[j].start, row[j].end, kExecutionFrameWidth); - } - offset = offset - 2 * kExecutionFrameWidth - kGapWidth; - // Javascript frames. - for (var i = 0; i < kStackFrames; i++) { - offset = offset - 2 * kStackFrameWidth - kGapWidth; - row = MergeRanges(TicksToRanges(code_kind.stack_frames[i])); - for (var j = 0; j < row.length; j++) { - DrawBar(offset, code_kind.color, - row[j].start, row[j].end, kStackFrameWidth); - } - } - } - - // Add labels as legend for code kind colors. - var padding = kCodeKindLabelPadding * (range_end - range_start) / kResX; - var label_x = range_start; - var label_y = kY1Offset; - for (var name in CodeKinds) { - label_x += padding; - output("set label \"" + name + "\" at " + label_x + "," + label_y + - " textcolor rgb \"" + CodeKinds[name].color + "\"" + - " font \"Helvetica,9'\""); - obj_index++; - } - - if (execution_pauses.length == 0) { - // Force plot and return without plotting execution pause impulses. - output("plot 1/0"); - return; - } - - // Label the longest pauses. - execution_pauses = - RestrictRangesTo(execution_pauses, range_start, range_end); - execution_pauses.sort(function(a, b) { - if (a.duration() == b.duration() && b.end == a.end) - return b.start - a.start; - - return (a.duration() == b.duration()) - ? b.end - a.end : b.duration() - a.duration(); - }); - - var max_pause_time = execution_pauses.length > 0 - ? execution_pauses[0].duration() : 0; - padding = kPauseLabelPadding * (range_end - range_start) / kResX; - var y_scale = kY1Offset / max_pause_time / 2; - for (var i = 0; i < execution_pauses.length && i < kNumPauseLabels; i++) { - var pause = execution_pauses[i]; - var label_content = (pause.duration() | 0) + " ms"; - var label_x = pause.end + padding; - var label_y = Math.max(1, (pause.duration() * y_scale)); - output("set label \"" + label_content + "\" at " + - label_x + "," + label_y + " font \"Helvetica,7'\""); - obj_index++; - } - - // Scale second Y-axis appropriately. - var y2range = max_pause_time * num_timer_event / kY1Offset * 2; - output("set y2range [0:" + y2range + "]"); - // Plot graph with impulses as data set. - output("plot '-' using 1:2 axes x1y2 with impulses ls 1"); - for (var i = 0; i < execution_pauses.length; i++) { - var pause = execution_pauses[i]; - output(pause.end + " " + pause.duration()); - obj_index++; - } - output("e"); - return obj_index; - }; -} diff --git a/deps/v8/tools/profviz/gnuplot-4.6.3-emscripten.js b/deps/v8/tools/profviz/gnuplot-4.6.3-emscripten.js deleted file mode 100644 index 99a986eb803671..00000000000000 --- a/deps/v8/tools/profviz/gnuplot-4.6.3-emscripten.js +++ /dev/null @@ -1,4658 +0,0 @@ -// Copyright 1986 - 1993, 1998, 2004 Thomas Williams, Colin Kelley -// -// Permission to use, copy, and distribute this software and its -// documentation for any purpose with or without fee is hereby granted, -// provided that the above copyright notice appear in all copies and -// that both that copyright notice and this permission notice appear -// in supporting documentation. -// -// Permission to modify the software is granted, but not the right to -// distribute the complete modified source code. Modifications are to -// be distributed as patches to the released version. Permission to -// distribute binaries produced by compiling modified sources is granted, -// provided you -// 1. distribute the corresponding source modifications from the -// released version in the form of a patch file along with the binaries, -// 2. add special version identification to distinguish your version -// in addition to the base release version number, -// 3. provide your name and address as the primary contact for the -// support of your modified version, and -// 4. retain our contact information in regard to use of the base -// software. -// Permission to distribute the released version of the source code along -// with corresponding source modifications in the form of a patch file is -// granted with same provisions 2 through 4 for binary distributions. -// -// This software is provided "as is" without express or implied warranty -// to the extent permitted by applicable law. - -// This Javascript port of gnuplot 4.6.3 [1] has been generated using -// Emscripten [2]. This port has been made possible by Christian Huettig [3], -// whose changes to gnuplot's source files can be found below [4] in -// accordance to gnuplot's copyright. -// -// [1] http://www.gnuplot.info/ -// [2] https://github.com/kripken/emscripten/ -// [3] https://github.com/chhu/gnuplot-JS -// [4] Patch to gnuplot 4.6.3 -// --- gnuplot-4.6.3/src/axis.c 2012-11-08 18:13:08.000000000 +0100 -// +++ gnuplot-4.6.3_mod/src/axis.c 2013-05-11 11:08:08.791587160 +0200 -// @@ -467,8 +467,9 @@ copy_or_invent_formatstring(AXIS_INDEX a -// int precision = (ceil(-log10(fabs(axmax-axmin)))); -// if ((axmin*axmax > 0) && precision > 4) -// sprintf(ticfmt[axis],"%%.%df", (precision>14) ? 14 : precision); -// + else -// + strcpy(ticfmt[axis], "%g"); -// } -// - -// return ticfmt[axis]; -// } - -var Module = { - 'noInitialRun': true, - print: function(text) { - self.postMessage({'transaction': -1, 'content': text}); - }, - printErr: function(text) { - self.postMessage({'transaction': -2, 'content': text}); - }, -}; -function gnuplot_create() { -// Note: For maximum-speed code, see "Optimizing Code" on the Emscripten wiki, https://github.com/kripken/emscripten/wiki/Optimizing-Code -// Note: Some Emscripten settings may limit the speed of the generated code. -try { - this['Module'] = Module; - Module.test; -} catch(e) { - this['Module'] = Module = {}; -} -// The environment setup code below is customized to use Module. -// *** Environment setup code *** -var ENVIRONMENT_IS_NODE = typeof process === 'object' && typeof require === 'function'; -var ENVIRONMENT_IS_WEB = typeof window === 'object'; -var ENVIRONMENT_IS_WORKER = typeof importScripts === 'function'; -var ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; -if (typeof module === "object") { - module.exports = Module; -} -if (ENVIRONMENT_IS_NODE) { - // Expose functionality in the same simple way that the shells work - // Note that we pollute the global namespace here, otherwise we break in node - Module['print'] = function(x) { - process['stdout'].write(x + '\n'); - }; - Module['printErr'] = function(x) { - process['stderr'].write(x + '\n'); - }; - var nodeFS = require('fs'); - var nodePath = require('path'); - Module['read'] = function(filename, binary) { - filename = nodePath['normalize'](filename); - var ret = nodeFS['readFileSync'](filename); - // The path is absolute if the normalized version is the same as the resolved. - if (!ret && filename != nodePath['resolve'](filename)) { - filename = path.join(__dirname, '..', 'src', filename); - ret = nodeFS['readFileSync'](filename); - } - if (ret && !binary) ret = ret.toString(); - return ret; - }; - Module['readBinary'] = function(filename) { return Module['read'](filename, true) }; - Module['load'] = function(f) { - globalEval(read(f)); - }; - if (!Module['arguments']) { - Module['arguments'] = process['argv'].slice(2); - } -} -if (ENVIRONMENT_IS_SHELL) { - Module['print'] = print; - if (typeof printErr != 'undefined') Module['printErr'] = printErr; // not present in v8 or older sm - Module['read'] = read; - Module['readBinary'] = function(f) { - return read(f, 'binary'); - }; - if (!Module['arguments']) { - if (typeof scriptArgs != 'undefined') { - Module['arguments'] = scriptArgs; - } else if (typeof arguments != 'undefined') { - Module['arguments'] = arguments; - } - } -} -if (ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_WORKER) { - if (!Module['print']) { - Module['print'] = function(x) { - console.log(x); - }; - } - if (!Module['printErr']) { - Module['printErr'] = function(x) { - console.log(x); - }; - } -} -if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { - Module['read'] = function(url) { - var xhr = new XMLHttpRequest(); - xhr.open('GET', url, false); - xhr.send(null); - return xhr.responseText; - }; - if (!Module['arguments']) { - if (typeof arguments != 'undefined') { - Module['arguments'] = arguments; - } - } -} -if (ENVIRONMENT_IS_WORKER) { - // We can do very little here... - var TRY_USE_DUMP = false; - if (!Module['print']) { - Module['print'] = (TRY_USE_DUMP && (typeof(dump) !== "undefined") ? (function(x) { - dump(x); - }) : (function(x) { - // self.postMessage(x); // enable this if you want stdout to be sent as messages - })); - } - Module['load'] = importScripts; -} -if (!ENVIRONMENT_IS_WORKER && !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_SHELL) { - // Unreachable because SHELL is dependent on the others - throw 'Unknown runtime environment. Where are we?'; -} -function globalEval(x) { - eval.call(null, x); -} -if (!Module['load'] == 'undefined' && Module['read']) { - Module['load'] = function(f) { - globalEval(Module['read'](f)); - }; -} -if (!Module['print']) { - Module['print'] = function(){}; -} -if (!Module['printErr']) { - Module['printErr'] = Module['print']; -} -if (!Module['arguments']) { - Module['arguments'] = []; -} -// *** Environment setup code *** -// Closure helpers -Module.print = Module['print']; -Module.printErr = Module['printErr']; -// Callbacks -if (!Module['preRun']) Module['preRun'] = []; -if (!Module['postRun']) Module['postRun'] = []; -// === Auto-generated preamble library stuff === -//======================================== -// Runtime code shared with compiler -//======================================== -var Runtime = { - stackSave: function () { - return STACKTOP; - }, - stackRestore: function (stackTop) { - STACKTOP = stackTop; - }, - forceAlign: function (target, quantum) { - quantum = quantum || 4; - if (quantum == 1) return target; - if (isNumber(target) && isNumber(quantum)) { - return Math.ceil(target/quantum)*quantum; - } else if (isNumber(quantum) && isPowerOfTwo(quantum)) { - var logg = log2(quantum); - return '((((' +target + ')+' + (quantum-1) + ')>>' + logg + ')<<' + logg + ')'; - } - return 'Math.ceil((' + target + ')/' + quantum + ')*' + quantum; - }, - isNumberType: function (type) { - return type in Runtime.INT_TYPES || type in Runtime.FLOAT_TYPES; - }, - isPointerType: function isPointerType(type) { - return type[type.length-1] == '*'; -}, - isStructType: function isStructType(type) { - if (isPointerType(type)) return false; - if (isArrayType(type)) return true; - if (/?/.test(type)) return true; // { i32, i8 } etc. - anonymous struct types - // See comment in isStructPointerType() - return type[0] == '%'; -}, - INT_TYPES: {"i1":0,"i8":0,"i16":0,"i32":0,"i64":0}, - FLOAT_TYPES: {"float":0,"double":0}, - or64: function (x, y) { - var l = (x | 0) | (y | 0); - var h = (Math.round(x / 4294967296) | Math.round(y / 4294967296)) * 4294967296; - return l + h; - }, - and64: function (x, y) { - var l = (x | 0) & (y | 0); - var h = (Math.round(x / 4294967296) & Math.round(y / 4294967296)) * 4294967296; - return l + h; - }, - xor64: function (x, y) { - var l = (x | 0) ^ (y | 0); - var h = (Math.round(x / 4294967296) ^ Math.round(y / 4294967296)) * 4294967296; - return l + h; - }, - getNativeTypeSize: function (type, quantumSize) { - if (Runtime.QUANTUM_SIZE == 1) return 1; - var size = { - '%i1': 1, - '%i8': 1, - '%i16': 2, - '%i32': 4, - '%i64': 8, - "%float": 4, - "%double": 8 - }['%'+type]; // add '%' since float and double confuse Closure compiler as keys, and also spidermonkey as a compiler will remove 's from '_i8' etc - if (!size) { - if (type.charAt(type.length-1) == '*') { - size = Runtime.QUANTUM_SIZE; // A pointer - } else if (type[0] == 'i') { - var bits = parseInt(type.substr(1)); - assert(bits % 8 == 0); - size = bits/8; - } - } - return size; - }, - getNativeFieldSize: function (type) { - return Math.max(Runtime.getNativeTypeSize(type), Runtime.QUANTUM_SIZE); - }, - dedup: function dedup(items, ident) { - var seen = {}; - if (ident) { - return items.filter(function(item) { - if (seen[item[ident]]) return false; - seen[item[ident]] = true; - return true; - }); - } else { - return items.filter(function(item) { - if (seen[item]) return false; - seen[item] = true; - return true; - }); - } -}, - set: function set() { - var args = typeof arguments[0] === 'object' ? arguments[0] : arguments; - var ret = {}; - for (var i = 0; i < args.length; i++) { - ret[args[i]] = 0; - } - return ret; -}, - STACK_ALIGN: 8, - getAlignSize: function (type, size, vararg) { - // we align i64s and doubles on 64-bit boundaries, unlike x86 - if (type == 'i64' || type == 'double' || vararg) return 8; - if (!type) return Math.min(size, 8); // align structures internally to 64 bits - return Math.min(size || (type ? Runtime.getNativeFieldSize(type) : 0), Runtime.QUANTUM_SIZE); - }, - calculateStructAlignment: function calculateStructAlignment(type) { - type.flatSize = 0; - type.alignSize = 0; - var diffs = []; - var prev = -1; - type.flatIndexes = type.fields.map(function(field) { - var size, alignSize; - if (Runtime.isNumberType(field) || Runtime.isPointerType(field)) { - size = Runtime.getNativeTypeSize(field); // pack char; char; in structs, also char[X]s. - alignSize = Runtime.getAlignSize(field, size); - } else if (Runtime.isStructType(field)) { - size = Types.types[field].flatSize; - alignSize = Runtime.getAlignSize(null, Types.types[field].alignSize); - } else if (field[0] == 'b') { - // bN, large number field, like a [N x i8] - size = field.substr(1)|0; - alignSize = 1; - } else { - throw 'Unclear type in struct: ' + field + ', in ' + type.name_ + ' :: ' + dump(Types.types[type.name_]); - } - if (type.packed) alignSize = 1; - type.alignSize = Math.max(type.alignSize, alignSize); - var curr = Runtime.alignMemory(type.flatSize, alignSize); // if necessary, place this on aligned memory - type.flatSize = curr + size; - if (prev >= 0) { - diffs.push(curr-prev); - } - prev = curr; - return curr; - }); - type.flatSize = Runtime.alignMemory(type.flatSize, type.alignSize); - if (diffs.length == 0) { - type.flatFactor = type.flatSize; - } else if (Runtime.dedup(diffs).length == 1) { - type.flatFactor = diffs[0]; - } - type.needsFlattening = (type.flatFactor != 1); - return type.flatIndexes; - }, - generateStructInfo: function (struct, typeName, offset) { - var type, alignment; - if (typeName) { - offset = offset || 0; - type = (typeof Types === 'undefined' ? Runtime.typeInfo : Types.types)[typeName]; - if (!type) return null; - if (type.fields.length != struct.length) { - printErr('Number of named fields must match the type for ' + typeName + ': possibly duplicate struct names. Cannot return structInfo'); - return null; - } - alignment = type.flatIndexes; - } else { - var type = { fields: struct.map(function(item) { return item[0] }) }; - alignment = Runtime.calculateStructAlignment(type); - } - var ret = { - __size__: type.flatSize - }; - if (typeName) { - struct.forEach(function(item, i) { - if (typeof item === 'string') { - ret[item] = alignment[i] + offset; - } else { - // embedded struct - var key; - for (var k in item) key = k; - ret[key] = Runtime.generateStructInfo(item[key], type.fields[i], alignment[i]); - } - }); - } else { - struct.forEach(function(item, i) { - ret[item[1]] = alignment[i]; - }); - } - return ret; - }, - dynCall: function (sig, ptr, args) { - if (args && args.length) { - if (!args.splice) args = Array.prototype.slice.call(args); - args.splice(0, 0, ptr); - return Module['dynCall_' + sig].apply(null, args); - } else { - return Module['dynCall_' + sig].call(null, ptr); - } - }, - functionPointers: [], - addFunction: function (func) { - for (var i = 0; i < Runtime.functionPointers.length; i++) { - if (!Runtime.functionPointers[i]) { - Runtime.functionPointers[i] = func; - return 2 + 2*i; - } - } - throw 'Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.'; - }, - removeFunction: function (index) { - Runtime.functionPointers[(index-2)/2] = null; - }, - warnOnce: function (text) { - if (!Runtime.warnOnce.shown) Runtime.warnOnce.shown = {}; - if (!Runtime.warnOnce.shown[text]) { - Runtime.warnOnce.shown[text] = 1; - Module.printErr(text); - } - }, - funcWrappers: {}, - getFuncWrapper: function (func, sig) { - assert(sig); - if (!Runtime.funcWrappers[func]) { - Runtime.funcWrappers[func] = function() { - return Runtime.dynCall(sig, func, arguments); - }; - } - return Runtime.funcWrappers[func]; - }, - UTF8Processor: function () { - var buffer = []; - var needed = 0; - this.processCChar = function (code) { - code = code & 0xff; - if (needed) { - buffer.push(code); - needed--; - } - if (buffer.length == 0) { - if (code < 128) return String.fromCharCode(code); - buffer.push(code); - if (code > 191 && code < 224) { - needed = 1; - } else { - needed = 2; - } - return ''; - } - if (needed > 0) return ''; - var c1 = buffer[0]; - var c2 = buffer[1]; - var c3 = buffer[2]; - var ret; - if (c1 > 191 && c1 < 224) { - ret = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63)); - } else { - ret = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); - } - buffer.length = 0; - return ret; - } - this.processJSString = function(string) { - string = unescape(encodeURIComponent(string)); - var ret = []; - for (var i = 0; i < string.length; i++) { - ret.push(string.charCodeAt(i)); - } - return ret; - } - }, - stackAlloc: function (size) { var ret = STACKTOP;STACKTOP = (STACKTOP + size)|0;STACKTOP = ((((STACKTOP)+7)>>3)<<3); return ret; }, - staticAlloc: function (size) { var ret = STATICTOP;STATICTOP = (STATICTOP + size)|0;STATICTOP = ((((STATICTOP)+7)>>3)<<3); return ret; }, - dynamicAlloc: function (size) { var ret = DYNAMICTOP;DYNAMICTOP = (DYNAMICTOP + size)|0;DYNAMICTOP = ((((DYNAMICTOP)+7)>>3)<<3); if (DYNAMICTOP >= TOTAL_MEMORY) enlargeMemory();; return ret; }, - alignMemory: function (size,quantum) { var ret = size = Math.ceil((size)/(quantum ? quantum : 8))*(quantum ? quantum : 8); return ret; }, - makeBigInt: function (low,high,unsigned) { var ret = (unsigned ? ((+(((low)>>>(0))))+((+(((high)>>>(0))))*(+(4294967296)))) : ((+(((low)>>>(0))))+((+(((high)|(0))))*(+(4294967296))))); return ret; }, - GLOBAL_BASE: 8, - QUANTUM_SIZE: 4, - __dummy__: 0 -} -//======================================== -// Runtime essentials -//======================================== -var __THREW__ = 0; // Used in checking for thrown exceptions. -var ABORT = false; // whether we are quitting the application. no code should run after this. set in exit() and abort() -var undef = 0; -// tempInt is used for 32-bit signed values or smaller. tempBigInt is used -// for 32-bit unsigned values or more than 32 bits. TODO: audit all uses of tempInt -var tempValue, tempInt, tempBigInt, tempInt2, tempBigInt2, tempPair, tempBigIntI, tempBigIntR, tempBigIntS, tempBigIntP, tempBigIntD; -var tempI64, tempI64b; -var tempRet0, tempRet1, tempRet2, tempRet3, tempRet4, tempRet5, tempRet6, tempRet7, tempRet8, tempRet9; -function abort(text) { - Module.print(text + ':\n' + (new Error).stack); - ABORT = true; - throw "Assertion: " + text; -} -function assert(condition, text) { - if (!condition) { - abort('Assertion failed: ' + text); - } -} -var globalScope = this; -// C calling interface. A convenient way to call C functions (in C files, or -// defined with extern "C"). -// -// Note: LLVM optimizations can inline and remove functions, after which you will not be -// able to call them. Closure can also do so. To avoid that, add your function to -// the exports using something like -// -// -s EXPORTED_FUNCTIONS='["_main", "_myfunc"]' -// -// @param ident The name of the C function (note that C++ functions will be name-mangled - use extern "C") -// @param returnType The return type of the function, one of the JS types 'number', 'string' or 'array' (use 'number' for any C pointer, and -// 'array' for JavaScript arrays and typed arrays). -// @param argTypes An array of the types of arguments for the function (if there are no arguments, this can be omitted). Types are as in returnType, -// except that 'array' is not possible (there is no way for us to know the length of the array) -// @param args An array of the arguments to the function, as native JS values (as in returnType) -// Note that string arguments will be stored on the stack (the JS string will become a C string on the stack). -// @return The return value, as a native JS value (as in returnType) -function ccall(ident, returnType, argTypes, args) { - return ccallFunc(getCFunc(ident), returnType, argTypes, args); -} -Module["ccall"] = ccall; -// Returns the C function with a specified identifier (for C++, you need to do manual name mangling) -function getCFunc(ident) { - try { - var func = globalScope['Module']['_' + ident]; // closure exported function - if (!func) func = eval('_' + ident); // explicit lookup - } catch(e) { - } - assert(func, 'Cannot call unknown function ' + ident + ' (perhaps LLVM optimizations or closure removed it?)'); - return func; -} -// Internal function that does a C call using a function, not an identifier -function ccallFunc(func, returnType, argTypes, args) { - var stack = 0; - function toC(value, type) { - if (type == 'string') { - if (value === null || value === undefined || value === 0) return 0; // null string - if (!stack) stack = Runtime.stackSave(); - var ret = Runtime.stackAlloc(value.length+1); - writeStringToMemory(value, ret); - return ret; - } else if (type == 'array') { - if (!stack) stack = Runtime.stackSave(); - var ret = Runtime.stackAlloc(value.length); - writeArrayToMemory(value, ret); - return ret; - } - return value; - } - function fromC(value, type) { - if (type == 'string') { - return Pointer_stringify(value); - } - assert(type != 'array'); - return value; - } - var i = 0; - var cArgs = args ? args.map(function(arg) { - return toC(arg, argTypes[i++]); - }) : []; - var ret = fromC(func.apply(null, cArgs), returnType); - if (stack) Runtime.stackRestore(stack); - return ret; -} -// Returns a native JS wrapper for a C function. This is similar to ccall, but -// returns a function you can call repeatedly in a normal way. For example: -// -// var my_function = cwrap('my_c_function', 'number', ['number', 'number']); -// alert(my_function(5, 22)); -// alert(my_function(99, 12)); -// -function cwrap(ident, returnType, argTypes) { - var func = getCFunc(ident); - return function() { - return ccallFunc(func, returnType, argTypes, Array.prototype.slice.call(arguments)); - } -} -Module["cwrap"] = cwrap; -// Sets a value in memory in a dynamic way at run-time. Uses the -// type data. This is the same as makeSetValue, except that -// makeSetValue is done at compile-time and generates the needed -// code then, whereas this function picks the right code at -// run-time. -// Note that setValue and getValue only do *aligned* writes and reads! -// Note that ccall uses JS types as for defining types, while setValue and -// getValue need LLVM types ('i8', 'i32') - this is a lower-level operation -function setValue(ptr, value, type, noSafe) { - type = type || 'i8'; - if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit - switch(type) { - case 'i1': HEAP8[(ptr)]=value; break; - case 'i8': HEAP8[(ptr)]=value; break; - case 'i16': HEAP16[((ptr)>>1)]=value; break; - case 'i32': HEAP32[((ptr)>>2)]=value; break; - case 'i64': (tempI64 = [value>>>0,Math.min(Math.floor((value)/(+(4294967296))), (+(4294967295)))>>>0],HEAP32[((ptr)>>2)]=tempI64[0],HEAP32[(((ptr)+(4))>>2)]=tempI64[1]); break; - case 'float': HEAPF32[((ptr)>>2)]=value; break; - case 'double': HEAPF64[((ptr)>>3)]=value; break; - default: abort('invalid type for setValue: ' + type); - } -} -Module['setValue'] = setValue; -// Parallel to setValue. -function getValue(ptr, type, noSafe) { - type = type || 'i8'; - if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit - switch(type) { - case 'i1': return HEAP8[(ptr)]; - case 'i8': return HEAP8[(ptr)]; - case 'i16': return HEAP16[((ptr)>>1)]; - case 'i32': return HEAP32[((ptr)>>2)]; - case 'i64': return HEAP32[((ptr)>>2)]; - case 'float': return HEAPF32[((ptr)>>2)]; - case 'double': return HEAPF64[((ptr)>>3)]; - default: abort('invalid type for setValue: ' + type); - } - return null; -} -Module['getValue'] = getValue; -var ALLOC_NORMAL = 0; // Tries to use _malloc() -var ALLOC_STACK = 1; // Lives for the duration of the current function call -var ALLOC_STATIC = 2; // Cannot be freed -var ALLOC_DYNAMIC = 3; // Cannot be freed except through sbrk -var ALLOC_NONE = 4; // Do not allocate -Module['ALLOC_NORMAL'] = ALLOC_NORMAL; -Module['ALLOC_STACK'] = ALLOC_STACK; -Module['ALLOC_STATIC'] = ALLOC_STATIC; -Module['ALLOC_DYNAMIC'] = ALLOC_DYNAMIC; -Module['ALLOC_NONE'] = ALLOC_NONE; -// allocate(): This is for internal use. You can use it yourself as well, but the interface -// is a little tricky (see docs right below). The reason is that it is optimized -// for multiple syntaxes to save space in generated code. So you should -// normally not use allocate(), and instead allocate memory using _malloc(), -// initialize it with setValue(), and so forth. -// @slab: An array of data, or a number. If a number, then the size of the block to allocate, -// in *bytes* (note that this is sometimes confusing: the next parameter does not -// affect this!) -// @types: Either an array of types, one for each byte (or 0 if no type at that position), -// or a single type which is used for the entire block. This only matters if there -// is initial data - if @slab is a number, then this does not matter at all and is -// ignored. -// @allocator: How to allocate memory, see ALLOC_* -function allocate(slab, types, allocator, ptr) { - var zeroinit, size; - if (typeof slab === 'number') { - zeroinit = true; - size = slab; - } else { - zeroinit = false; - size = slab.length; - } - var singleType = typeof types === 'string' ? types : null; - var ret; - if (allocator == ALLOC_NONE) { - ret = ptr; - } else { - ret = [_malloc, Runtime.stackAlloc, Runtime.staticAlloc, Runtime.dynamicAlloc][allocator === undefined ? ALLOC_STATIC : allocator](Math.max(size, singleType ? 1 : types.length)); - } - if (zeroinit) { - var ptr = ret, stop; - assert((ret & 3) == 0); - stop = ret + (size & ~3); - for (; ptr < stop; ptr += 4) { - HEAP32[((ptr)>>2)]=0; - } - stop = ret + size; - while (ptr < stop) { - HEAP8[((ptr++)|0)]=0; - } - return ret; - } - if (singleType === 'i8') { - if (slab.subarray || slab.slice) { - HEAPU8.set(slab, ret); - } else { - HEAPU8.set(new Uint8Array(slab), ret); - } - return ret; - } - var i = 0, type, typeSize, previousType; - while (i < size) { - var curr = slab[i]; - if (typeof curr === 'function') { - curr = Runtime.getFunctionIndex(curr); - } - type = singleType || types[i]; - if (type === 0) { - i++; - continue; - } - if (type == 'i64') type = 'i32'; // special case: we have one i32 here, and one i32 later - setValue(ret+i, curr, type); - // no need to look up size unless type changes, so cache it - if (previousType !== type) { - typeSize = Runtime.getNativeTypeSize(type); - previousType = type; - } - i += typeSize; - } - return ret; -} -Module['allocate'] = allocate; -function Pointer_stringify(ptr, /* optional */ length) { - // Find the length, and check for UTF while doing so - var hasUtf = false; - var t; - var i = 0; - while (1) { - t = HEAPU8[(((ptr)+(i))|0)]; - if (t >= 128) hasUtf = true; - else if (t == 0 && !length) break; - i++; - if (length && i == length) break; - } - if (!length) length = i; - var ret = ''; - if (!hasUtf) { - var MAX_CHUNK = 1024; // split up into chunks, because .apply on a huge string can overflow the stack - var curr; - while (length > 0) { - curr = String.fromCharCode.apply(String, HEAPU8.subarray(ptr, ptr + Math.min(length, MAX_CHUNK))); - ret = ret ? ret + curr : curr; - ptr += MAX_CHUNK; - length -= MAX_CHUNK; - } - return ret; - } - var utf8 = new Runtime.UTF8Processor(); - for (i = 0; i < length; i++) { - t = HEAPU8[(((ptr)+(i))|0)]; - ret += utf8.processCChar(t); - } - return ret; -} -Module['Pointer_stringify'] = Pointer_stringify; -// Memory management -var PAGE_SIZE = 4096; -function alignMemoryPage(x) { - return ((x+4095)>>12)<<12; -} -var HEAP; -var HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64; -var STATIC_BASE = 0, STATICTOP = 0, staticSealed = false; // static area -var STACK_BASE = 0, STACKTOP = 0, STACK_MAX = 0; // stack area -var DYNAMIC_BASE = 0, DYNAMICTOP = 0; // dynamic area handled by sbrk -function enlargeMemory() { - abort('Cannot enlarge memory arrays in asm.js. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value, or (2) set Module.TOTAL_MEMORY before the program runs.'); -} -var TOTAL_STACK = Module['TOTAL_STACK'] || 5242880; -var TOTAL_MEMORY = Module['TOTAL_MEMORY'] || 16777216; -var FAST_MEMORY = Module['FAST_MEMORY'] || 2097152; -// Initialize the runtime's memory -// check for full engine support (use string 'subarray' to avoid closure compiler confusion) -assert(!!Int32Array && !!Float64Array && !!(new Int32Array(1)['subarray']) && !!(new Int32Array(1)['set']), - 'Cannot fallback to non-typed array case: Code is too specialized'); -var buffer = new ArrayBuffer(TOTAL_MEMORY); -HEAP8 = new Int8Array(buffer); -HEAP16 = new Int16Array(buffer); -HEAP32 = new Int32Array(buffer); -HEAPU8 = new Uint8Array(buffer); -HEAPU16 = new Uint16Array(buffer); -HEAPU32 = new Uint32Array(buffer); -HEAPF32 = new Float32Array(buffer); -HEAPF64 = new Float64Array(buffer); -// Endianness check (note: assumes compiler arch was little-endian) -HEAP32[0] = 255; -assert(HEAPU8[0] === 255 && HEAPU8[3] === 0, 'Typed arrays 2 must be run on a little-endian system'); -Module['HEAP'] = HEAP; -Module['HEAP8'] = HEAP8; -Module['HEAP16'] = HEAP16; -Module['HEAP32'] = HEAP32; -Module['HEAPU8'] = HEAPU8; -Module['HEAPU16'] = HEAPU16; -Module['HEAPU32'] = HEAPU32; -Module['HEAPF32'] = HEAPF32; -Module['HEAPF64'] = HEAPF64; -function callRuntimeCallbacks(callbacks) { - while(callbacks.length > 0) { - var callback = callbacks.shift(); - if (typeof callback == 'function') { - callback(); - continue; - } - var func = callback.func; - if (typeof func === 'number') { - if (callback.arg === undefined) { - Runtime.dynCall('v', func); - } else { - Runtime.dynCall('vi', func, [callback.arg]); - } - } else { - func(callback.arg === undefined ? null : callback.arg); - } - } -} -var __ATINIT__ = []; // functions called during startup -var __ATMAIN__ = []; // functions called when main() is to be run -var __ATEXIT__ = []; // functions called during shutdown -var runtimeInitialized = false; -function ensureInitRuntime() { - if (runtimeInitialized) return; - runtimeInitialized = true; - callRuntimeCallbacks(__ATINIT__); -} -function preMain() { - callRuntimeCallbacks(__ATMAIN__); -} -function exitRuntime() { - callRuntimeCallbacks(__ATEXIT__); -} -// Tools -// This processes a JS string into a C-line array of numbers, 0-terminated. -// For LLVM-originating strings, see parser.js:parseLLVMString function -function intArrayFromString(stringy, dontAddNull, length /* optional */) { - var ret = (new Runtime.UTF8Processor()).processJSString(stringy); - if (length) { - ret.length = length; - } - if (!dontAddNull) { - ret.push(0); - } - return ret; -} -Module['intArrayFromString'] = intArrayFromString; -function intArrayToString(array) { - var ret = []; - for (var i = 0; i < array.length; i++) { - var chr = array[i]; - if (chr > 0xFF) { - chr &= 0xFF; - } - ret.push(String.fromCharCode(chr)); - } - return ret.join(''); -} -Module['intArrayToString'] = intArrayToString; -// Write a Javascript array to somewhere in the heap -function writeStringToMemory(string, buffer, dontAddNull) { - var array = intArrayFromString(string, dontAddNull); - var i = 0; - while (i < array.length) { - var chr = array[i]; - HEAP8[(((buffer)+(i))|0)]=chr - i = i + 1; - } -} -Module['writeStringToMemory'] = writeStringToMemory; -function writeArrayToMemory(array, buffer) { - for (var i = 0; i < array.length; i++) { - HEAP8[(((buffer)+(i))|0)]=array[i]; - } -} -Module['writeArrayToMemory'] = writeArrayToMemory; -function unSign(value, bits, ignore, sig) { - if (value >= 0) { - return value; - } - return bits <= 32 ? 2*Math.abs(1 << (bits-1)) + value // Need some trickery, since if bits == 32, we are right at the limit of the bits JS uses in bitshifts - : Math.pow(2, bits) + value; -} -function reSign(value, bits, ignore, sig) { - if (value <= 0) { - return value; - } - var half = bits <= 32 ? Math.abs(1 << (bits-1)) // abs is needed if bits == 32 - : Math.pow(2, bits-1); - if (value >= half && (bits <= 32 || value > half)) { // for huge values, we can hit the precision limit and always get true here. so don't do that - // but, in general there is no perfect solution here. With 64-bit ints, we get rounding and errors - // TODO: In i64 mode 1, resign the two parts separately and safely - value = -2*half + value; // Cannot bitshift half, as it may be at the limit of the bits JS uses in bitshifts - } - return value; -} -if (!Math['imul']) Math['imul'] = function(a, b) { - var ah = a >>> 16; - var al = a & 0xffff; - var bh = b >>> 16; - var bl = b & 0xffff; - return (al*bl + ((ah*bl + al*bh) << 16))|0; -}; -// A counter of dependencies for calling run(). If we need to -// do asynchronous work before running, increment this and -// decrement it. Incrementing must happen in a place like -// PRE_RUN_ADDITIONS (used by emcc to add file preloading). -// Note that you can add dependencies in preRun, even though -// it happens right before run - run will be postponed until -// the dependencies are met. -var runDependencies = 0; -var runDependencyTracking = {}; -var calledInit = false, calledRun = false; -var runDependencyWatcher = null; -function addRunDependency(id) { - runDependencies++; - if (Module['monitorRunDependencies']) { - Module['monitorRunDependencies'](runDependencies); - } - if (id) { - assert(!runDependencyTracking[id]); - runDependencyTracking[id] = 1; - } else { - Module.printErr('warning: run dependency added without ID'); - } -} -Module['addRunDependency'] = addRunDependency; -function removeRunDependency(id) { - runDependencies--; - if (Module['monitorRunDependencies']) { - Module['monitorRunDependencies'](runDependencies); - } - if (id) { - assert(runDependencyTracking[id]); - delete runDependencyTracking[id]; - } else { - Module.printErr('warning: run dependency removed without ID'); - } - if (runDependencies == 0) { - if (runDependencyWatcher !== null) { - clearInterval(runDependencyWatcher); - runDependencyWatcher = null; - } - // If run has never been called, and we should call run (INVOKE_RUN is true, and Module.noInitialRun is not false) - if (!calledRun && shouldRunNow) run(); - } -} -Module['removeRunDependency'] = removeRunDependency; -Module["preloadedImages"] = {}; // maps url to image data -Module["preloadedAudios"] = {}; // maps url to audio data -function addPreRun(func) { - if (!Module['preRun']) Module['preRun'] = []; - else if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']]; - Module['preRun'].push(func); -} -var awaitingMemoryInitializer = false; -function loadMemoryInitializer(filename) { - function applyData(data) { - HEAPU8.set(data, STATIC_BASE); - runPostSets(); - } - // always do this asynchronously, to keep shell and web as similar as possible - addPreRun(function() { - if (ENVIRONMENT_IS_NODE || ENVIRONMENT_IS_SHELL) { - applyData(Module['readBinary'](filename)); - } else { - Browser.asyncLoad(filename, function(data) { - applyData(data); - }, function(data) { - throw 'could not load memory initializer ' + filename; - }); - } - }); - awaitingMemoryInitializer = false; -} -// === Body === -STATIC_BASE = 8; -STATICTOP = STATIC_BASE + 243440; -var _stdout; -var _stdin; -var _stderr; -var _stdout = _stdout=allocate([0,0,0,0,0,0,0,0], "i8", ALLOC_STATIC); -var _stdin = _stdin=allocate([0,0,0,0,0,0,0,0], "i8", ALLOC_STATIC); -var _stderr = _stderr=allocate([0,0,0,0,0,0,0,0], "i8", ALLOC_STATIC); -/* memory initializer */ allocate([0,0,128,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,90,71,110,117,112,108,111,116,80,0,0,0,0,0,0,0,90,71,110,117,112,108,111,116,68,0,0,0,0,0,0,0,90,71,110,117,112,108,111,116,0,0,0,0,0,0,0,0,58,140,48,226,142,121,69,62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,144,139,1,0,240,84,3,0,80,126,1,0,0,0,0,0,80,131,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,160,134,1,0,248,132,1,0,232,123,1,0,0,0,0,0,224,128,1,0,0,0,0,0,0,85,1,0,8,0,0,0,208,80,1,0,9,0,0,0,192,76,1,0,10,0,0,0,64,73,1,0,13,0,0,0,240,70,1,0,27,0,0,0,40,67,1,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,88,244,1,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,1,0,0,0,1,0,0,0,100,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,252,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,252,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,3,0,0,0,1,0,0,0,100,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,252,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,252,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,154,153,153,153,153,153,169,63,184,30,133,235,81,184,158,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,2,0,0,0,1,0,0,0,100,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,252,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,252,255,255,255,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,20,174,71,225,122,148,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,118,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,193,1,0,16,189,1,0,16,220,1,0,192,222,1,0,0,0,0,0,96,133,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,184,253,1,0,0,0,0,0,160,149,1,0,32,148,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,4,0,0,0,5,0,0,0,6,0,0,0,7,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,5,0,0,0,1,0,0,0,20,0,0,0,26,0,0,0,21,0,0,0,27,0,0,0,14,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,26,1,0,0,0,0,0,0,2,0,0,0,94,1,0,0,1,0,0,0,2,0,0,0,88,0,0,0,0,0,0,0,2,0,0,0,26,0,0,0,1,0,0,0,2,0,0,0,58,0,0,0,0,0,0,0,2,0,0,0,48,1,0,0,1,0,0,0,1,0,0,0,96,0,0,0,1,0,0,0,2,0,0,0,96,0,0,0,1,0,0,0,3,0,0,0,96,0,0,0,3,0,0,0,1,0,0,0,96,0,0,0,3,0,0,0,2,0,0,0,96,0,0,0,3,0,0,0,3,0,0,0,96,0,0,0,3,0,0,0,2,0,0,0,26,1,0,0,3,0,0,0,2,0,0,0,88,0,0,0,3,0,0,0,2,0,0,0,58,0,0,0,1,0,0,0,2,0,0,0,134,1,0,0,3,0,0,0,2,0,0,0,134,1,0,0,1,0,0,0,2,0,0,0,140,1,0,0,1,0,0,0,2,0,0,0,8,0,0,0,1,0,0,0,2,0,0,0,38,1,0,0,1,0,0,0,2,0,0,0,54,1,0,0,1,0,0,0,2,0,0,0,94,0,0,0,1,0,0,0,2,0,0,0,182,0,0,0,3,0,0,0,2,0,0,0,140,1,0,0,1,0,0,0,2,0,0,0,14,0,0,0,1,0,0,0,2,0,0,0,16,0,0,0,1,0,0,0,2,0,0,0,24,1,0,0,1,0,0,0,2,0,0,0,132,0,0,0,1,0,0,0,2,0,0,0,118,1,0,0,1,0,0,0,2,0,0,0,108,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,1,0,0,0,1,0,0,0,3,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,2,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,1,0,0,0,2,0,0,0,1,0,0,0,1,0,0,0,3,0,0,0,2,0,0,0,1,0,0,0,3,0,0,0,3,0,0,0,1,0,0,0,3,0,0,0,1,0,0,0,1,0,0,0,4,0,0,0,2,0,0,0,1,0,0,0,4,0,0,0,3,0,0,0,1,0,0,0,4,0,0,0,1,0,0,0,2,0,0,0,1,0,0,0,2,0,0,0,2,0,0,0,1,0,0,0,3,0,0,0,2,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,3,0,0,0,2,0,0,0,2,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,2,0,0,0,2,0,0,0,3,0,0,0,3,0,0,0,2,0,0,0,3,0,0,0,1,0,0,0,2,0,0,0,4,0,0,0,2,0,0,0,2,0,0,0,4,0,0,0,3,0,0,0,2,0,0,0,4,0,0,0,1,0,0,0,3,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,1,0,0,0,3,0,0,0,3,0,0,0,1,0,0,0,1,0,0,0,3,0,0,0,2,0,0,0,2,0,0,0,3,0,0,0,2,0,0,0,3,0,0,0,3,0,0,0,2,0,0,0,1,0,0,0,3,0,0,0,3,0,0,0,2,0,0,0,3,0,0,0,3,0,0,0,3,0,0,0,3,0,0,0,3,0,0,0,1,0,0,0,3,0,0,0,4,0,0,0,2,0,0,0,3,0,0,0,4,0,0,0,3,0,0,0,3,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,154,153,153,153,153,153,185,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,240,191,0,0,0,0,0,0,240,191,0,0,0,0,0,0,240,191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,93,1,0,8,93,1,0,248,92,1,0,240,92,1,0,208,92,1,0,200,92,1,0,184,92,1,0,160,92,1,0,0,0,0,0,0,0,0,0,119,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,42,2,0,1,0,0,0,176,34,3,0,2,0,0,0,32,42,2,0,3,0,0,0,0,0,0,0,0,0,0,0,117,110,115,32,112,109,51,100,59,115,101,32,108,109,97,114,103,32,115,99,114,101,32,48,46,48,53,59,115,101,32,114,109,97,114,103,32,115,99,114,101,32,48,46,57,55,53,59,32,115,101,32,98,109,97,114,103,32,115,99,114,101,32,48,46,50,50,59,32,115,101,32,116,109,97,114,103,32,115,99,114,101,32,48,46,56,54,59,115,101,32,103,114,105,100,59,115,101,32,116,105,99,115,32,115,99,97,108,101,32,48,59,32,115,101,32,120,116,105,99,115,32,48,44,48,46,49,59,115,101,32,121,116,105,99,115,32,48,44,48,46,49,59,115,101,32,107,101,121,32,116,111,112,32,114,105,103,104,116,32,97,116,32,115,99,114,101,32,48,46,57,55,53,44,48,46,57,55,53,32,104,111,114,105,122,111,110,116,97,108,32,116,105,116,108,101,32,39,82,44,71,44,66,32,112,114,111,102,105,108,101,115,32,111,102,32,116,104,101,32,99,117,114,114,101,110,116,32,99,111,108,111,114,32,112,97,108,101,116,116,101,39,59,0,0,0,0,0,115,112,108,111,116,32,49,47,48,59,10,10,10,0,0,0,114,101,115,101,116,59,115,101,116,32,109,117,108,116,105,59,117,110,115,32,98,111,114,100,101,114,59,117,110,115,32,107,101,121,59,115,101,116,32,116,105,99,32,105,110,59,117,110,115,32,120,116,105,99,115,59,117,110,115,32,121,116,105,99,115,59,115,101,32,99,98,116,105,99,32,48,44,48,46,49,44,49,32,109,105,114,114,32,102,111,114,109,97,116,32,39,39,59,115,101,32,120,114,91,48,58,49,93,59,115,101,32,121,114,91,48,58,49,93,59,115,101,32,122,114,91,48,58,49,93,59,115,101,32,99,98,114,91,48,58,49,93,59,115,101,32,112,109,51,100,32,109,97,112,59,115,101,116,32,99,111,108,111,114,98,111,120,32,104,111,114,32,117,115,101,114,32,111,114,105,103,32,48,46,48,53,44,48,46,48,50,32,115,105,122,101,32,48,46,57,50,53,44,48,46,49,50,59,0,0,0,0,0,0,0,0,10,10,10,117,110,115,32,109,117,108,116,105,59,10,0,0,248,110,3,0,56,16,3,0,100,0,0,0,100,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,48,1,0,0,190,0,0,0,190,0,0,0,190,0,0,0,2,0,0,0,190,0,0,0,126,0,0,0,126,0,0,0,90,0,0,0,88,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,80,13,3,0,128,10,3,0,220,5,0,0,132,3,0,0,45,0,0,0,22,0,0,0,20,0,0,0,20,0,0,0,20,0,0,0,142,1,0,0,158,1,0,0,18,1,0,0,2,0,0,0,120,0,0,0,82,0,0,0,34,0,0,0,174,0,0,0,40,0,0,0,62,0,0,0,158,0,0,0,54,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,9,3,0,176,7,3,0,32,3,0,0,184,1,0,0,20,0,0,0,9,0,0,0,8,0,0,0,6,0,0,0,102,0,0,0,48,0,0,0,218,0,0,0,98,0,0,0,2,0,0,0,12,1,0,0,50,0,0,0,96,0,0,0,158,0,0,0,42,0,0,0,164,0,0,0,124,0,0,0,54,0,0,0,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,144,6,3,0,176,4,3,0,255,15,0,0,59,12,0,0,71,0,0,0,51,0,0,0,36,0,0,0,36,0,0,0,48,1,0,0,8,0,0,0,104,1,0,0,100,0,0,0,2,0,0,0,52,0,0,0,102,0,0,0,86,0,0,0,38,0,0,0,80,0,0,0,160,0,0,0,124,0,0,0,72,0,0,0,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200,2,3,0,96,0,3,0,0,4,0,0,12,3,0,0,25,0,0,0,14,0,0,0,11,0,0,0,11,0,0,0,48,1,0,0,20,1,0,0,40,1,0,0,170,0,0,0,2,0,0,0,172,0,0,0,128,0,0,0,60,0,0,0,106,1,0,0,78,0,0,0,12,0,0,0,124,0,0,0,54,0,0,0,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,253,2,0,160,251,2,0,0,4,0,0,12,3,0,0,25,0,0,0,14,0,0,0,11,0,0,0,11,0,0,0,48,1,0,0,234,0,0,0,50,0,0,0,170,0,0,0,2,0,0,0,172,0,0,0,136,0,0,0,42,0,0,0,40,0,0,0,62,0,0,0,12,0,0,0,124,0,0,0,54,0,0,0,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,245,2,0,64,243,2,0,0,4,0,0,12,3,0,0,25,0,0,0,14,0,0,0,11,0,0,0,11,0,0,0,48,1,0,0,20,1,0,0,40,1,0,0,66,0,0,0,2,0,0,0,6,0,0,0,136,0,0,0,42,0,0,0,40,0,0,0,62,0,0,0,12,0,0,0,124,0,0,0,54,0,0,0,48,0,0,0,152,0,0,0,0,0,0,0,65,0,0,0,66,0,0,0,80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200,234,2,0,192,220,2,0,112,23,0,0,160,15,0,0,100,0,0,0,80,0,0,0,100,0,0,0,100,0,0,0,206,0,0,0,148,0,0,0,222,0,0,0,116,1,0,0,2,0,0,0,180,1,0,0,100,0,0,0,130,0,0,0,140,0,0,0,118,0,0,0,34,0,0,0,20,0,0,0,70,0,0,0,48,0,0,0,60,0,0,0,30,0,0,0,1,11,0,0,0,0,0,0,0,0,0,0,52,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,136,0,0,0,0,0,0,0,56,0,0,0,98,0,0,0,0,0,0,0,4,0,0,0,120,1,0,0,102,0,0,0,24,0,0,0,130,0,0,0,0,0,0,0,0,0,0,0,128,218,2,0,160,216,2,0,73,127,0,0,182,91,0,0,12,3,0,0,177,1,0,0,153,1,0,0,153,1,0,0,106,0,0,0,150,0,0,0,168,0,0,0,2,0,0,0,2,0,0,0,176,1,0,0,40,0,0,0,106,0,0,0,230,0,0,0,28,0,0,0,96,0,0,0,50,0,0,0,58,0,0,0,48,0,0,0,106,0,0,0,40,0,0,0,4,9,0,0,0,0,0,0,0,0,0,0,50,0,0,0,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,42,1,0,0,150,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,56,214,2,0,120,212,2,0,72,23,0,0,32,28,0,0,220,0,0,0,132,0,0,0,90,0,0,0,90,0,0,0,24,0,0,0,28,1,0,0,62,0,0,0,56,1,0,0,2,0,0,0,46,1,0,0,144,0,0,0,54,0,0,0,28,0,0,0,38,0,0,0,138,0,0,0,146,0,0,0,60,0,0,0,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,210,2,0,248,208,2,0,79,0,0,0,24,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,196,0,0,0,40,0,0,0,242,0,0,0,34,1,0,0,2,0,0,0,86,0,0,0,108,0,0,0,18,0,0,0,146,0,0,0,104,0,0,0,12,0,0,0,124,0,0,0,110,0,0,0,42,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,28,0,0,0,102,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,216,207,2,0,0,206,2,0,32,28,0,0,192,18,0,0,124,0,0,0,100,0,0,0,120,0,0,0,120,0,0,0,48,1,0,0,126,1,0,0,254,0,0,0,182,0,0,0,2,0,0,0,90,0,0,0,104,0,0,0,124,0,0,0,70,1,0,0,64,0,0,0,8,0,0,0,194,0,0,0,60,0,0,0,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,160,204,2,0,144,202,2,0,122,105,0,0,28,79,0,0,38,2,0,0,254,0,0,0,168,0,0,0,168,0,0,0,50,1,0,0,246,0,0,0,148,1,0,0,32,0,0,0,2,0,0,0,74,1,0,0,28,0,0,0,48,0,0,0,220,0,0,0,102,0,0,0,36,0,0,0,184,0,0,0,50,0,0,0,48,0,0,0,180,0,0,0,20,0,0,0,4,25,0,0,0,0,0,0,0,0,0,0,32,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,54,0,0,0,136,0,0,0,54,0,0,0,64,0,0,0,0,0,0,0,8,0,0,0,238,0,0,0,102,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,199,2,0,232,194,2,0,112,23,0,0,16,14,0,0,125,0,0,0,75,0,0,0,75,0,0,0,75,0,0,0,78,0,0,0,6,1,0,0,178,1,0,0,66,1,0,0,2,0,0,0,56,0,0,0,122,0,0,0,10,0,0,0,128,1,0,0,94,0,0,0,82,0,0,0,94,0,0,0,112,0,0,0,46,0,0,0,0,0,0,0,24,0,0,0,4,1,0,0,0,0,0,0,0,0,0,0,38,0,0,0,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,98,0,0,0,0,0,0,0,108,1,0,0,148,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,184,193,2,0,232,191,2,0,0,2,0,0,134,1,0,0,10,0,0,0,7,0,0,0,5,0,0,0,5,0,0,0,48,1,0,0,192,0,0,0,72,0,0,0,86,1,0,0,2,0,0,0,220,0,0,0,22,0,0,0,16,0,0,0,132,1,0,0,98,0,0,0,118,0,0,0,124,0,0,0,44,0,0,0,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,190,2,0,224,188,2,0,208,2,0,0,104,1,0,0,12,0,0,0,7,0,0,0,8,0,0,0,8,0,0,0,48,1,0,0,250,0,0,0,216,0,0,0,88,1,0,0,2,0,0,0,134,0,0,0,38,0,0,0,46,0,0,0,156,0,0,0,52,0,0,0,28,0,0,0,124,0,0,0,54,0,0,0,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,187,2,0,16,185,2,0,16,39,0,0,76,29,0,0,60,0,0,0,30,0,0,0,107,0,0,0,107,0,0,0,104,0,0,0,8,1,0,0,4,1,0,0,16,1,0,0,2,0,0,0,178,0,0,0,26,0,0,0,4,0,0,0,84,1,0,0,108,0,0,0,22,0,0,0,124,0,0,0,60,0,0,0,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,183,2,0,120,182,2,0,21,177,0,0,148,132,0,0,169,0,0,0,112,0,0,0,106,0,0,0,106,0,0,0,204,0,0,0,110,1,0,0,58,0,0,0,30,1,0,0,2,0,0,0,154,1,0,0,152,0,0,0,92,0,0,0,120,0,0,0,18,0,0,0,2,0,0,0,84,0,0,0,32,0,0,0,48,0,0,0,142,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,80,181,2,0,88,179,2,0,228,12,0,0,36,9,0,0,60,0,0,0,30,0,0,0,20,0,0,0,20,0,0,0,68,0,0,0,80,1,0,0,88,0,0,0,12,0,0,0,2,0,0,0,70,0,0,0,52,0,0,0,68,0,0,0,168,0,0,0,22,0,0,0,76,0,0,0,168,0,0,0,54,0,0,0,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,178,2,0,168,175,2,0,152,58,0,0,16,39,0,0,66,1,0,0,157,0,0,0,66,0,0,0,66,0,0,0,24,1,0,0,210,0,0,0,64,1,0,0,0,1,0,0,2,0,0,0,198,0,0,0,12,0,0,0,84,0,0,0,18,1,0,0,4,0,0,0,16,0,0,0,80,0,0,0,120,0,0,0,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,56,174,2,0,152,172,2,0,32,28,0,0,176,19,0,0,140,0,0,0,84,0,0,0,63,0,0,0,63,0,0,0,122,1,0,0,42,0,0,0,42,1,0,0,146,0,0,0,2,0,0,0,162,0,0,0,20,0,0,0,118,0,0,0,242,0,0,0,116,0,0,0,26,0,0,0,154,0,0,0,114,0,0,0,54,0,0,0,90,0,0,0,6,0,0,0,148,29,0,0,0,0,0,0,0,0,0,0,6,0,0,0,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,16,0,0,0,30,1,0,0,8,0,0,0,34,0,0,0,10,0,0,0,132,0,0,0,136,1,0,0,0,1,0,0,86,0,0,0,0,0,0,0,0,0,36,64,248,170,2,0,192,169,2,0,40,35,0,0,112,23,0,0,120,0,0,0,70,0,0,0,70,0,0,0,70,0,0,0,48,1,0,0,228,0,0,0,118,1,0,0,70,1,0,0,2,0,0,0,62,1,0,0,30,0,0,0,56,0,0,0,18,0,0,0,24,0,0,0,12,0,0,0,124,0,0,0,54,0,0,0,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0].concat([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29,3,0,64,168,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,172,1,0,0,34,0,0,0,4,0,0,0,156,0,0,0,2,0,0,0,212,0,0,0,74,0,0,0,62,0,0,0,20,0,0,0,68,0,0,0,132,0,0,0,110,0,0,0,122,0,0,0,48,0,0,0,144,0,0,0,10,0,0,0,5,11,0,0,0,0,0,0,0,0,0,0,28,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,0,0,0,180,0,0,0,4,1,0,0,14,0,0,0,0,0,0,0,6,0,0,0,82,0,0,0,194,0,0,0,228,0,0,0,102,1,0,0,0,0,0,0,0,0,36,64,208,165,2,0,48,164,2,0,182,3,0,0,122,2,0,0,18,0,0,0,10,0,0,0,7,0,0,0,7,0,0,0,200,0,0,0,248,0,0,0,18,0,0,0,140,1,0,0,2,0,0,0,152,0,0,0,94,0,0,0,142,0,0,0,180,0,0,0,30,0,0,0,176,0,0,0,148,0,0,0,26,0,0,0,10,0,0,0,204,0,0,0,2,0,0,0,1,9,0,0,0,0,0,0,0,0,0,0,24,0,0,0,42,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,166,0,0,0,82,1,0,0,138,0,0,0,76,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,162,2,0,72,161,2,0,232,3,0,0,232,3,0,0,25,0,0,0,16,0,0,0,18,0,0,0,18,0,0,0,230,0,0,0,100,1,0,0,244,0,0,0,76,0,0,0,2,0,0,0,130,0,0,0,32,0,0,0,154,0,0,0,236,0,0,0,96,0,0,0,12,0,0,0,6,0,0,0,60,0,0,0,48,0,0,0,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,80,160,2,0,208,158,2,0,220,5,0,0,132,3,0,0,45,0,0,0,22,0,0,0,20,0,0,0,20,0,0,0,188,0,0,0,106,1,0,0,182,1,0,0,174,1,0,0,2,0,0,0,26,1,0,0,134,0,0,0,132,0,0,0,160,0,0,0,90,0,0,0,114,0,0,0,30,0,0,0,56,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,176,157,2,0,72,156,2,0,220,5,0,0,132,3,0,0,45,0,0,0,22,0,0,0,20,0,0,0,20,0,0,0,188,0,0,0,14,1,0,0,158,0,0,0,146,1,0,0,2,0,0,0,26,1,0,0,134,0,0,0,132,0,0,0,160,0,0,0,90,0,0,0,114,0,0,0,30,0,0,0,56,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,154,2,0,248,152,2,0,32,28,0,0,176,19,0,0,110,0,0,0,66,0,0,0,63,0,0,0,63,0,0,0,122,1,0,0,42,0,0,0,186,0,0,0,146,0,0,0,2,0,0,0,162,0,0,0,20,0,0,0,118,0,0,0,34,1,0,0,16,0,0,0,26,0,0,0,154,0,0,0,114,0,0,0,48,0,0,0,90,0,0,0,6,0,0,0,148,32,0,0,0,0,0,0,0,0,0,0,6,0,0,0,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,16,0,0,0,32,0,0,0,8,0,0,0,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0,0,86,0,0,0,0,0,0,0,0,0,0,0,0,152,2,0,216,149,2,0,32,28,0,0,176,19,0,0,100,0,0,0,60,0,0,0,63,0,0,0,63,0,0,0,122,1,0,0,42,0,0,0,186,0,0,0,14,0,0,0,2,0,0,0,162,0,0,0,20,0,0,0,118,0,0,0,242,0,0,0,12,0,0,0,26,0,0,0,154,0,0,0,114,0,0,0,54,0,0,0,0,0,0,0,6,0,0,0,128,32,0,0,0,0,0,0,0,0,0,0,6,0,0,0,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,16,0,0,0,30,1,0,0,8,0,0,0,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,86,0,0,0,0,0,0,0,0,0,0,0,232,147,2,0,88,146,2,0,32,28,0,0,176,19,0,0,100,0,0,0,60,0,0,0,63,0,0,0,63,0,0,0,122,1,0,0,42,0,0,0,186,0,0,0,14,0,0,0,2,0,0,0,162,0,0,0,20,0,0,0,118,0,0,0,242,0,0,0,12,0,0,0,26,0,0,0,154,0,0,0,114,0,0,0,54,0,0,0,0,0,0,0,6,0,0,0,128,32,0,0,0,0,0,0,0,0,0,0,6,0,0,0,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,16,0,0,0,30,1,0,0,8,0,0,0,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,86,0,0,0,0,0,0,0,0,0,0,0,240,144,2,0,176,142,2,0,184,11,0,0,8,7,0,0,83,0,0,0,41,0,0,0,41,0,0,0,41,0,0,0,46,0,0,0,84,0,0,0,164,0,0,0,52,1,0,0,2,0,0,0,124,1,0,0,116,0,0,0,44,0,0,0,62,0,0,0,20,0,0,0,64,0,0,0,128,0,0,0,36,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,141,2,0,152,139,2,0,136,19,0,0,184,11,0,0,152,0,0,0,73,0,0,0,69,0,0,0,69,0,0,0,10,1,0,0,152,1,0,0,160,0,0,0,224,0,0,0,2,0,0,0,154,0,0,0,6,0,0,0,72,0,0,0,48,0,0,0,100,0,0,0,88,0,0,0,190,0,0,0,82,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,80,138,2,0,168,136,2,0,16,39,0,0,16,39,0,0,164,1,0,0,160,0,0,0,200,0,0,0,150,0,0,0,138,1,0,0,92,1,0,0,68,1,0,0,102,1,0,0,2,0,0,0,44,1,0,0,90,0,0,0,66,0,0,0,34,0,0,0,66,0,0,0,116,0,0,0,186,0,0,0,14,0,0,0,40,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,0,0,0,0,0,0,0,148,0,0,0,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248,134,2,0,8,133,2,0,220,5,0,0,132,3,0,0,45,0,0,0,22,0,0,0,20,0,0,0,20,0,0,0,48,1,0,0,226,0,0,0,54,1,0,0,122,0,0,0,2,0,0,0,176,0,0,0,146,0,0,0,110,0,0,0,142,0,0,0,126,0,0,0,130,0,0,0,170,0,0,0,84,0,0,0,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,131,2,0,0,130,2,0,220,5,0,0,132,3,0,0,45,0,0,0,22,0,0,0,20,0,0,0,20,0,0,0,48,1,0,0,114,0,0,0,130,1,0,0,90,1,0,0,2,0,0,0,94,0,0,0,138,0,0,0,140,0,0,0,120,1,0,0,106,0,0,0,70,0,0,0,198,0,0,0,54,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,128,2,0,136,125,2,0,224,46,0,0,32,28,0,0,110,1,0,0,176,0,0,0,166,0,0,0,166,0,0,0,136,1,0,0,60,1,0,0,126,0,0,0,134,1,0,0,2,0,0,0,252,0,0,0,112,0,0,0,58,0,0,0,204,0,0,0,10,0,0,0,72,0,0,0,200,0,0,0,34,0,0,0,22,0,0,0,68,0,0,0,12,0,0,0,132,1,0,0,0,0,0,0,0,0,0,0,26,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,0,0,0,156,1,0,0,212,0,0,0,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200,123,2,0,208,120,2,0,156,49,0,0,196,29,0,0,165,1,0,0,206,0,0,0,123,0,0,0,123,0,0,0,116,0,0,0,74,0,0,0,58,1,0,0,110,0,0,0,2,0,0,0,54,0,0,0,70,0,0,0,2,0,0,0,46,0,0,0,48,0,0,0,188,0,0,0,112,0,0,0,92,0,0,0,30,0,0,0,38,0,0,0,28,0,0,0,0,59,0,0,0,0,0,0,0,0,0,0,2,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,0,0,0,0,0,0,0,178,0,0,0,114,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,63,0,0,0,0,0,0,128,63,0,0,0,0,0,0,240,65,0,0,0,0,0,0,112,66,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,93,0,0,0,0,0,0,9,46,46,46,105,116,32,105,115,78,101,119,76,101,118,101,108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,115,0,0,0,0,0,0,0,97,65,101,69,102,70,103,71,0,0,0,0,0,0,0,0,99,100,105,111,117,120,88,0,104,108,76,113,106,122,90,116,67,83,112,110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,21,3,0,160,0,3,0,176,212,2,0,32,192,2,0,224,175,2,0,120,160,2,0,32,145,2,0,136,128,2,0,8,184,2,0,64,79,2,0,120,129,2,0,96,64,2,0,40,56,2,0,168,48,2,0,208,42,2,0,48,36,2,0,152,28,2,0,80,22,2,0,184,14,2,0,232,8,2,0,120,3,2,0,80,254,1,0,56,250,1,0,64,245,1,0,8,240,1,0,200,235,1,0]) -.concat([240,230,1,0,40,226,1,0,224,220,1,0,48,214,1,0,40,209,1,0,160,197,1,0,56,194,1,0,128,190,1,0,192,177,1,0,216,165,1,0,16,162,1,0,184,158,1,0,48,154,1,0,224,151,1,0,240,149,1,0,128,148,1,0,224,139,1,0,240,137,1,0,8,135,1,0,88,133,1,0,144,131,1,0,152,129,1,0,8,127,1,0,96,124,1,0,32,122,1,0,72,120,1,0,200,118,1,0,192,116,1,0,8,115,1,0,56,112,1,0,216,109,1,0,160,107,1,0,184,103,1,0,8,101,1,0,136,98,1,0,232,96,1,0,88,94,1,0,104,92,1,0,80,89,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,136,199,1,0,1,0,0,0,88,199,1,0,2,0,0,0,224,198,1,0,3,0,0,0,40,43,1,0,4,0,0,0,136,198,1,0,4,0,0,0,176,111,1,0,5,0,0,0,88,198,1,0,9,0,0,0,232,197,1,0,10,0,0,0,152,197,1,0,6,0,0,0,8,197,1,0,7,0,0,0,112,196,1,0,8,0,0,0,248,195,1,0,11,0,0,0,0,0,0,0,0,0,0,0,248,60,1,0,56,55,1,0,88,52,1,0,48,50,1,0,200,48,1,0,0,0,0,0,16,241,1,0,152,240,1,0,88,52,1,0,48,50,1,0,200,48,1,0,0,0,0,0,16,241,1,0,152,240,1,0,88,52,1,0,48,50,1,0,104,249,1,0,0,0,0,0,0,0,0,0,0,0,0,0,37,115,115,99,97,108,101,32,109,117,115,116,32,98,101,32,62,32,48,59,32,118,105,101,119,32,117,110,99,104,97,110,103,101,100,0,0,0,0,0,114,111,116,95,37,99,32,109,117,115,116,32,98,101,32,105,110,32,91,48,58,37,100,93,32,100,101,103,114,101,101,115,32,114,97,110,103,101,59,32,118,105,101,119,32,117,110,99,104,97,110,103,101,100,0,0,232,119,1,0,2,0,0,0,16,118,1,0,1,0,0,0,48,116,1,0,1,0,0,0,96,114,1,0,3,0,0,0,176,111,1,0,4,0,0,0,56,109,1,0,5,0,0,0,248,105,1,0,6,0,0,0,8,199,1,0,7,0,0,0,40,100,1,0,8,0,0,0,232,97,1,0,9,0,0,0,248,95,1,0,10,0,0,0,32,93,1,0,11,0,0,0,56,91,1,0,12,0,0,0,0,89,1,0,13,0,0,0,0,84,1,0,14,0,0,0,224,79,1,0,15,0,0,0,16,75,1,0,17,0,0,0,232,72,1,0,18,0,0,0,160,69,1,0,19,0,0,0,16,66,1,0,20,0,0,0,80,60,1,0,21,0,0,0,248,54,1,0,22,0,0,0,24,52,1,0,23,0,0,0,248,49,1,0,16,0,0,0,96,48,1,0,16,0,0,0,0,46,1,0,24,0,0,0,184,43,1,0,25,0,0,0,96,41,1,0,26,0,0,0,24,39,1,0,27,0,0,0,104,37,1,0,28,0,0,0,104,35,1,0,29,0,0,0,200,33,1,0,30,0,0,0,96,32,1,0,31,0,0,0,208,30,1,0,32,0,0,0,112,28,1,0,31,0,0,0,32,111,3,0,32,0,0,0,80,109,3,0,33,0,0,0,80,105,3,0,34,0,0,0,240,102,3,0,35,0,0,0,64,101,3,0,36,0,0,0,32,98,3,0,37,0,0,0,56,96,3,0,37,0,0,0,136,93,3,0,38,0,0,0,0,87,3,0,39,0,0,0,48,85,3,0,40,0,0,0,192,82,3,0,41,0,0,0,128,80,3,0,42,0,0,0,240,77,3,0,44,0,0,0,32,76,3,0,45,0,0,0,56,74,3,0,48,0,0,0,56,72,3,0,49,0,0,0,32,70,3,0,46,0,0,0,128,67,3,0,47,0,0,0,120,65,3,0,52,0,0,0,80,63,3,0,53,0,0,0,208,60,3,0,50,0,0,0,168,58,3,0,51,0,0,0,48,57,3,0,54,0,0,0,56,55,3,0,55,0,0,0,104,52,3,0,68,0,0,0,176,49,3,0,69,0,0,0,88,48,3,0,56,0,0,0,16,46,3,0,57,0,0,0,200,43,3,0,58,0,0,0,136,40,3,0,59,0,0,0,0,38,3,0,61,0,0,0,176,34,3,0,60,0,0,0,64,32,3,0,62,0,0,0,32,31,3,0,63,0,0,0,56,30,3,0,63,0,0,0,16,189,2,0,76,0,0,0,16,29,3,0,77,0,0,0,24,28,3,0,78,0,0,0,56,27,3,0,79,0,0,0,248,172,2,0,80,0,0,0,72,26,3,0,81,0,0,0,24,25,3,0,75,0,0,0,0,24,3,0,82,0,0,0,120,97,1,0,83,0,0,0,152,19,3,0,85,0,0,0,184,16,3,0,84,0,0,0,128,13,3,0,86,0,0,0,176,123,1,0,87,0,0,0,200,10,3,0,88,0,0,0,112,9,3,0,89,0,0,0,216,7,3,0,90,0,0,0,168,6,3,0,91,0,0,0,248,4,3,0,92,0,0,0,224,2,3,0,93,0,0,0,152,0,3,0,94,0,0,0,128,121,1,0,97,0,0,0,24,254,2,0,98,0,0,0,0,252,2,0,99,0,0,0,88,245,2,0,119,0,0,0,120,243,2,0,110,0,0,0,144,235,2,0,101,0,0,0,32,221,2,0,129,0,0,0,216,218,2,0,120,0,0,0,224,216,2,0,138,0,0,0,112,214,2,0,70,0,0,0,168,212,2,0,113,0,0,0,184,210,2,0,104,0,0,0,48,209,2,0,132,0,0,0,232,207,2,0,123,0,0,0,64,206,2,0,141,0,0,0,208,204,2,0,64,0,0,0,232,202,2,0,117,0,0,0,96,200,2,0,118,0,0,0,40,195,2,0,108,0,0,0,200,193,2,0,109,0,0,0,24,192,2,0,136,0,0,0,120,190,2,0,137,0,0,0,8,189,2,0,127,0,0,0,192,187,2,0,128,0,0,0,96,185,2,0,145,0,0,0,160,183,2,0,146,0,0,0,200,182,2,0,147,0,0,0,96,181,2,0,148,0,0,0,120,179,2,0,66,0,0,0,48,178,2,0,67,0,0,0,216,175,2,0,111,0,0,0,80,174,2,0,112,0,0,0,232,172,2,0,102,0,0,0,16,171,2,0,103,0,0,0,0,170,2,0,130,0,0,0,160,168,2,0,131,0,0,0,24,166,2,0,121,0,0,0,112,164,2,0,122,0,0,0,8,163,2,0,139,0,0,0,136,161,2,0,140,0,0,0,104,160,2,0,71,0,0,0,0,159,2,0,72,0,0,0,200,157,2,0,114,0,0,0,120,156,2,0,115,0,0,0,200,154,2,0,105,0,0,0,56,153,2,0,106,0,0,0,16,152,2,0,133,0,0,0,40,150,2,0,134,0,0,0,248,147,2,0,124,0,0,0,152,146,2,0,125,0,0,0,24,145,2,0,142,0,0,0,232,142,2,0,143,0,0,0,64,141,2,0,73,0,0,0,232,139,2,0,74,0,0,0,120,138,2,0,116,0,0,0,232,136,2,0,107,0,0,0,16,135,2,0,135,0,0,0,88,133,2,0,126,0,0,0,224,131,2,0,144,0,0,0,56,130,2,0,65,0,0,0,80,128,2,0,149,0,0,0,192,125,2,0,95,0,0,0,224,123,2,0,96,0,0,0,88,121,2,0,100,0,0,0,192,111,2,0,153,0,0,0,24,109,2,0,154,0,0,0,80,107,2,0,155,0,0,0,240,104,2,0,156,0,0,0,168,96,2,0,157,0,0,0,80,93,2,0,152,0,0,0,248,91,2,0,150,0,0,0,216,90,2,0,151,0,0,0,0,0,0,0,0,0,0,0,48,116,1,0,1,0,0,0,24,20,2,0,2,0,0,0,128,19,2,0,3,0,0,0,136,18,2,0,4,0,0,0,240,17,2,0,5,0,0,0,120,17,2,0,6,0,0,0,160,16,2,0,7,0,0,0,32,16,2,0,8,0,0,0,144,15,2,0,9,0,0,0,168,14,2,0,10,0,0,0,24,14,2,0,11,0,0,0,152,13,2,0,12,0,0,0,40,13,2,0,13,0,0,0,136,12,2,0,14,0,0,0,232,247,1,0,15,0,0,0,48,11,2,0,16,0,0,0,168,10,2,0,17,0,0,0,16,10,2,0,18,0,0,0,144,9,2,0,19,0,0,0,216,8,2,0,20,0,0,0,168,7,2,0,21,0,0,0,240,6,2,0,22,0,0,0,96,6,2,0,23,0,0,0,0,0,0,0,0,0,0,0,240,34,2,0,1,0,0,0,40,34,2,0,2,0,0,0,8,93,1,0,3,0,0,0,128,32,2,0,3,0,0,0,208,250,1,0,4,0,0,0,248,30,2,0,5,0,0,0,88,30,2,0,9,0,0,0,104,29,2,0,10,0,0,0,136,28,2,0,11,0,0,0,112,27,2,0,12,0,0,0,192,26,2,0,6,0,0,0,56,26,2,0,7,0,0,0,168,25,2,0,8,0,0,0,64,25,2,0,13,0,0,0,128,24,2,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,154,153,153,153,153,153,169,63,154,153,153,153,153,153,169,63,154,153,153,153,153,153,201,63,154,153,153,153,153,153,185,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,208,63,102,102,102,102,102,102,230,63,51,51,51,51,51,51,235,63,205,204,204,204,204,204,236,63,154,153,153,153,153,153,217,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,102,102,102,102,102,102,230,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,205,204,204,204,204,204,236,63,51,51,51,51,51,51,227,63,51,51,51,51,51,51,227,63,51,51,51,51,51,51,227,63,0,0,0,0,0,0,240,63,102,102,102,102,102,102,238,63,102,102,102,102,102,102,238,63,102,102,102,102,102,102,238,63,232,211,1,0,0,0,0,0,128,82,2,0,1,0,0,0,112,82,2,0,2,0,0,0,96,82,2,0,4,0,0,0,80,82,2,0,5,0,0,0,8,82,2,0,3,0,0,0,0,82,2,0,6,0,0,0,128,234,1,0,7,0,0,0,0,0,0,0,8,0,0,0,136,208,2,0,39,0,0,0,104,75,2,0,40,0,0,0,192,74,2,0,41,0,0,0,32,74,2,0,1,0,0,0,88,73,2,0,2,0,0,0,192,72,2,0,3,0,0,0,64,72,2,0,4,0,0,0,56,71,2,0,5,0,0,0,8,70,2,0,6,0,0,0,104,69,2,0,7,0,0,0,216,68,2,0,8,0,0,0,232,67,2,0,13,0,0,0,168,67,2,0,9,0,0,0,192,66,2,0,14,0,0,0,48,116,1,0,10,0,0,0,32,66,2,0,11,0,0,0,88,65,2,0,12,0,0,0,80,64,2,0,15,0,0,0,72,63,2,0,16,0,0,0,64,62,2,0,17,0,0,0,48,61,2,0,18,0,0,0,136,60,2,0,19,0,0,0,200,59,2,0,20,0,0,0,32,59,2,0,21,0,0,0,120,58,2,0,22,0,0,0,232,57,2,0,23,0,0,0,200,56,2,0,24,0,0,0,0,224,1,0,25,0,0,0,192,218,1,0,26,0,0,0,240,53,2,0,27,0,0,0,16,53,2,0,28,0,0,0,40,52,2,0,29,0,0,0,72,51,2,0,30,0,0,0,184,50,2,0,31,0,0,0,64,50,2,0,32,0,0,0,248,49,2,0,37,0,0,0,96,49,2,0,38,0,0,0,128,234,1,0,33,0,0,0,0,48,2,0,34,0,0,0,192,229,1,0,35,0,0,0,192,46,2,0,36,0,0,0,8,46,2,0,36,0,0,0,72,45,2,0,42,0,0,0,200,44,2,0,42,0,0,0,40,44,2,0,43,0,0,0,176,43,2,0,44,0,0,0,88,43,2,0,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,89,2,0,1,0,0,0,0,82,2,0,2,0,0,0,40,86,2,0,3,0,0,0,112,84,2,0,4,0,0,0,0,83,2,0,5,0,0,0,192,81,2,0,6,0,0,0,200,80,2,0,7,0,0,0,32,80,2,0,8,0,0,0,48,79,2,0,9,0,0,0,8,78,2,0,10,0,0,0,72,77,2,0,11,0,0,0,176,76,2,0,12,0,0,0,0,0,0,0,0,0,0,0,136,208,2,0,0,0,0,0,88,188,2,0,15,0,0,0,24,172,2,0,1,0,0,0,176,73,2,0,2,0,0,0,152,4,2,0,3,0,0,0,160,209,1,0,4,0,0,0,88,157,2,0,5,0,0,0,144,122,1,0,6,0,0,0,184,98,1,0,7,0,0,0,184,67,1,0,8,0,0,0,24,38,1,0,9,0,0,0,40,102,3,0,10,0,0,0,56,75,3,0,11,0,0,0,152,140,2,0,12,0,0,0,112,122,2,0,13,0,0,0,152,88,2,0,14,0,0,0,0,0,0,0,16,0,0,0,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,194,176,0,0,0,0,0,0,160,41,2,0,1,0,0,0,216,40,2,0,2,0,0,0,136,208,2,0,3,0,0,0,32,40,2,0,4,0,0,0,48,116,1,0,4,0,0,0,80,39,2,0,5,0,0,0,184,38,2,0,6,0,0,0,56,38,2,0,7,0,0,0,184,37,2,0,8,0,0,0,56,86,3,0,9,0,0,0,40,36,2,0,10,0,0,0,120,35,2,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,112,128,1,0,1,0,0,0,16,126,1,0,3,0,0,0,176,123,1,0,2,0,0,0,128,121,1,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,160,141,2,0,40,140,2,0,160,138,2,0,56,137,2,0,96,135,2,0,0,0,0,0,100,0,0,0,0,0,0,0,100,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,72,101,108,118,101,116,105,99,97,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,101,108,118,101,116,105,99,97,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,240,191,0,0,0,0,0,0,240,191,0,0,0,0,0,0,240,191,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,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,205,204,204,204,204,204,236,63,205,204,204,204,204,204,236,63,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,16,64,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,253,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,37,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,128,63,0,0,128,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,63,0,1,0,0,208,7,0,0,250,126,106,188,116,147,104,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,191,0,0,0,0,0,0,240,191,0,0,0,0,0,0,240,191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,128,63,0,0,128,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,63,0,1,0,0,208,7,0,0,250,126,106,188,116,147,104,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,191,0,0,0,0,0,0,240,191,0,0,0,0,0,0,240,191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,128,63,0,0,128,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,63,0,1,0,0,208,7,0,0,250,126,106,188,116,147,104,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,191,0,0,0,0,0,0,240,191,0,0,0,0,0,0,240,191,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,128,63,0,0,128,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,63,0,1,0,0,208,7,0,0,250,126,106,188,116,147,104,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,191,0,0,0,0,0,0,240,191,0,0,0,0,0,0,240,191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,118,0,0,0,0,0,0,0,0,0,0,0,0,0,0,208,243,1,0,24,150,1,0,104,136,1,0,8,116,1,0,128,90,1,0,48,153,2,0,80,32,1,0,112,22,3,0,64,67,3,0,192,45,3,0,248,26,3,0,168,7,3,0,120,220,2,0,112,202,2,0,96,182,2,0,152,165,2,0,232,151,2,0,216,134,2,0,0,107,2,0,144,82,2,0,144,74,2,0,120,67,2,0,224,58,2,0,128,50,2,0,152,44,2,0,152,38,2,0,112,31,2,0,96,24,2,0,16,17,2,0,8,11,2,0,16,5,2,0,72,0,2,0,240,251,1,0,136,246,1,0,248,241,1,0,8,237,1,0,24,232,1,0,248,227,1,0,136,222,1,0,144,216,1,0,16,210,1,0,152,198,1,0,32,195,1,0,200,191,1,0,184,186,1,0,72,167,1,0,104,163,1,0,0,160,1,0,40,155,1,0,104,152,1,0,80,150,1,0,208,148,1,0,184,140,1,0,152,138,1,0,176,135,1,0,184,133,1,0,56,132,1,0,168,130,1,0,176,127,1,0,32,125,1,0,232,122,1,0,168,120,1,0,48,119,1,0,40,117,1,0,80,115,1,0,152,112,1,0,64,110,1,0,72,108,1,0,168,104,1,0,144,101,1,0,208,98,1,0,72,97,1,0,48,95,1,0,192,92,1,0,152,190,2,0,152,190,2,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,93,1,0,72,93,1,0,248,92,1,0,208,92,1,0,240,92,1,0,184,92,1,0,160,92,1,0,48,55,1,0,232,54,1,0,200,54,1,0,72,93,1,0,192,54,1,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,255,255,0,255,0,255,255,255,255,0,143,188,143,255,105,180,0,0,0,255,127,80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,255,255,255,255,255,255,255,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,64,0,0,0,0,0,0,89,64,0,0,0,0,0,136,195,64,0,0,0,0,132,215,151,65,0,128,224,55,121,195,65,67,23,110,5,181,181,184,147,70,245,249,63,233,3,79,56,77,50,29,48,249,72,119,130,90,60,191,115,127,221,79,21,117,3,0,0,0,50,0,0,0,50,0,0,0,2,0,0,0,0,0,0,0,0,0,128,63,0,0,128,63,0,0,0,0,0,0,0,0,72,101,108,118,101,116,105,99,97,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,65,0,0,128,63,0,0,0,0,208,7,0,0,250,126,106,188,116,147,104,63,0,1,0,0,0,0,0,0,0,0,0,0,0,0,240,191,0,0,0,0,0,0,240,191,0,0,0,0,0,0,240,191,3,0,0,0,50,0,0,0,50,0,0,0,2,0,0,0,0,0,0,0,0,0,128,63,0,0,128,63,0,0,0,0,0,0,0,0,72,101,108,118,101,116,105,99,97,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,65,0,0,128,63,0,0,0,0,208,7,0,0,250,126,106,188,116,147,104,63,0,1,0,0,0,0,0,0,0,0,0,0,0,0,240,191,0,0,0,0,0,0,240,191,0,0,0,0,0,0,240,191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,255,255,255,255,0,0,0,0,48,0,0,0,0,0,0,0,128,194,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,115,0,0,0,0,0,0,98,0,97,52,0,0,0,0,0,0,0,0,0,4,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,224,198,1,0,1,0,0,0,184,195,1,0,33,0,0,0,232,52,2,0,18,0,0,0,48,195,1,0,51,0,0,0,240,194,1,0,51,0,0,0,192,194,1,0,64,0,0,0,104,194,1,0,39,1,0,0]) -.concat([40,194,1,0,39,1,0,0,88,193,1,0,23,1,0,0,240,192,1,0,55,1,0,0,168,192,1,0,102,0,0,0,104,192,1,0,102,0,0,0,16,192,1,0,86,0,0,0,224,191,1,0,118,0,0,0,168,191,1,0,153,0,0,0,112,191,1,0,136,1,0,0,32,191,1,0,89,1,0,0,112,190,1,0,169,0,0,0,88,189,1,0,137,0,0,0,192,188,1,0,177,0,0,0,96,188,1,0,184,0,0,0,40,188,1,0,193,0,0,0,120,187,1,0,209,0,0,0,216,186,1,0,225,0,0,0,104,186,1,0,1,1,0,0,88,185,1,0,252,0,0,0,248,195,1,0,218,1,0,0,0,38,3,0,96,1,0,0,80,184,1,0,112,1,0,0,184,177,1,0,144,1,0,0,248,175,1,0,160,1,0,0,128,172,1,0,176,1,0,0,216,170,1,0,201,1,0,0,176,168,1,0,233,1,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,128,196,1,0,1,0,0,0,0,193,1,0,2,0,0,0,200,188,1,0,3,0,0,0,144,172,1,0,4,0,0,0,216,164,1,0,5,0,0,0,8,161,1,0,6,0,0,0,48,157,1,0,7,0,0,0,16,153,1,0,8,0,0,0,200,150,1,0,9,0,0,0,0,0,0,0,0,0,0,0,67,97,110,32,115,112,101,99,105,102,121,32,96,111,114,105,103,105,110,96,32,111,114,32,96,99,101,110,116,101,114,96,44,32,98,117,116,32,110,111,116,32,98,111,116,104,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,224,1,0,0,0,0,0,216,219,1,0,1,0,0,0,64,212,1,0,2,0,0,0,232,199,1,0,3,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,1,0,0,0,100,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,252,255,255,255,0,0,0,0,0,0,0,0,154,153,153,153,153,153,201,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,252,255,255,255,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,20,174,71,225,122,148,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,118,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,4,0,0,0,1,0,0,0,100,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,46,0,0,0,0,0,0,0,10,215,163,59,56,0,0,0,71,0,0,0,111,18,3,59,49,8,172,61,40,0,0,0,59,0,0,0,111,18,3,59,49,8,172,61,40,0,0,0,110,0,0,0,111,18,3,59,49,8,172,61,40,0,0,0,53,0,0,0,111,18,3,59,49,8,172,61,40,0,0,0,115,0,0,0,111,18,3,59,182,243,125,61,40,0,0,0,75,0,0,0,10,215,163,59,154,153,153,61,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0,1,0,0,0,44,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,132,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,32,35,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,0,0,0,28,0,0,0,31,0,0,0,30,0,0,0,31,0,0,0,30,0,0,0,31,0,0,0,31,0,0,0,30,0,0,0,31,0,0,0,30,0,0,0,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,2,0,0,0,3,0,0,0,4,0,0,0,8,0,0,0,12,0,0,0,13,0,0,0,5,0,0,0,9,0,0,0,10,0,0,0,11,0,0,0,12,0,0,0,13,0,0,0,14,0,0,0,15,0,0,0,0,0,0,0,231,251,31,65,160,134,0,0,160,134,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,12,0,0,0,3,0,0,0,0,0,0,0,9,0,0,0,8,0,0,0,14,0,0,0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,208,43,3,0,136,43,3,0,0,43,3,0,168,42,3,0,120,42,3,0,64,42,3,0,216,41,3,0,128,41,3,0,64,41,3,0,240,40,3,0,152,40,3,0,120,40,3,0,32,40,3,0,0,40,3,0,192,39,3,0,128,39,3,0,64,39,3,0,0,39,3,0,176,38,3,0,160,38,3,0,8,38,3,0,184,37,3,0,48,37,3,0,248,36,3,0,176,36,3,0,80,36,3,0,40,36,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,136,200,1,0,240,196,1,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,240,191,0,0,0,0,0,0,240,191,0,0,0,0,0,0,240,191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,150,1,0,48,153,2,0,240,152,2,0,224,156,0,0,232,152,2,0,224,152,2,0,112,169,2,0,0,0,0,0,128,152,2,0,120,152,2,0,96,152,2,0,24,152,2,0,8,152,2,0,248,151,2,0,224,151,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,127,0,0,0,0,255,255,255,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,64,0,0,0,0,0,0,36,64,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,205,204,204,204,204,204,236,63,205,204,204,204,204,204,236,63,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,16,64,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,253,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,216,117,1,0,32,235,1,0,80,230,1,0,192,224,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,236,175,203,174,131,28,212,63,5,131,82,81,72,84,238,63,69,54,70,161,27,144,249,63,152,255,235,55,110,60,2,64,78,179,64,187,67,42,8,64,182,126,159,22,40,30,15,64,4,60,105,225,178,74,246,63,1,185,171,244,102,150,205,63,22,140,132,149,142,226,195,191,74,181,106,247,109,120,121,63,254,41,194,141,220,23,24,63,203,225,243,45,104,14,165,190,132,27,223,205,9,48,240,63,248,153,229,120,38,16,232,191,53,126,55,150,221,183,137,63,17,80,205,36,107,134,132,63,156,200,73,125,117,186,47,191,218,83,12,136,64,206,160,62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,15,0,0,14,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,56,15,0,14,53,15,0,14,59,15,0,14,58,15,0,14,60,15,0,15,124,15,0,14,61,15,0,14,43,15,0,0,0,0,0,14,121,15,0,14,123,15,0,0,0,0,0,0,0,0,0,0,0,0,0,14,48,15,0,14,122,15,0,14,126,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,122,15,0,14,125,15,0,14,119,15,0,14,120,15,0,0,0,0,0,14,57,15,0,14,33,15,0,14,96,15,0,14,34,15,0,14,97,15,0,14,88,15,0,14,80,15,0,14,83,15,0,14,52,15,0,14,35,15,0,14,92,15,0,14,36,15,0,14,37,15,0,14,102,15,0,14,101,15,0,14,38,15,0,14,39,15,0,14,99,15,0,14,54,15,0,14,104,15,0,14,103,15,0,14,95,15,0,14,105,15,0,14,90,15,0,0,0,0,0,14,82,15,0,14,45,15,0,14,109,15,0,14,46,15,0,14,91,15,0,0,0,0,0,14,112,15,0,14,94,15,0,14,72,15,0,14,68,15,0,14,64,15,0,14,98,15,0,14,76,15,0,14,84,15,0,14,87,15,0,14,53,15,0,14,73,15,0,14,69,15,0,14,65,15,0,14,77,15,0,14,89,15,0,14,85,15,0,14,81,15,0,14,93,15,0,14,100,15,0,14,55,15,0,14,74,15,0,14,70,15,0,14,66,15,0,14,106,15,0,14,78,15,0,0,0,0,0,14,86,15,0,14,75,15,0,14,71,15,0,14,67,15,0,14,79,15,0,0,0,0,0,14,113,15,0,14,111,15,0,14,52,15,0,14,79,15,0,14,69,15,0,14,64,15,0,14,76,15,0,14,72,15,0,14,84,15,0,14,53,15,0,14,65,15,0,14,77,15,0,14,73,15,0,14,93,15,0,14,81,15,0,14,89,15,0,14,88,15,0,14,80,15,0,14,92,15,0,14,87,15,0,14,83,15,0,14,66,15,0,14,78,15,0,14,74,15,0,14,67,15,0,14,75,15,0,14,111,15,0,14,90,15,0,14,91,15,0,14,86,15,0,14,59,15,0,14,82,15,0,0,0,0,0,14,62,15,0,14,68,15,0,14,85,15,0,14,70,15,0,14,71,15,0,14,55,15,0,14,54,15,0,14,121,15,0,14,122,15,0,14,57,15,0,0,0,0,0,0,0,0,0,14,120,15,0,14,119,15,0,14,56,15,0,14,123,15,0,14,125,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,96,15,0,14,34,15,0,14,33,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,63,15,0,14,60,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,98,15,0,14,97,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,58,15,0,14,100,15,0,14,99,15,0,14,36,15,0,14,37,15,0,14,35,15,0,0,0,0,0,14,101,15,0,14,38,15,0,14,39,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,102,15,0,0,0,0,0,14,103,15,0,14,94,15,0,14,95,15,0,14,104,15,0,14,106,15,0,14,105,15,0,0,0,0,0,14,113,15,0,14,112,15,0,14,109,15,0,14,46,15,0,14,45,15,0,0,0,0,0,0,0,0,0,14,48,15,0,14,40,15,0,14,118,15,0,14,126,15,0,0,0,0,0,0,0,0,0,0,0,0,0,14,61,15,0,0,0,0,0,0,0,0,0,14,122,15,0,14,43,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,251,255,255,255,251,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,46,54,0,0,0,0,0,51,0,0,0,0,0,0,0,50,48,49,51,45,48,52,45,49,50,32,0,0,0,0,0,67,111,112,121,114,105,103,104,116,32,40,67,41,32,49,57,56,54,45,49,57,57,51,44,32,49,57,57,56,44,32,50,48,48,52,44,32,50,48,48,55,45,50,48,49,51,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,74,97,110,117,97,114,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,101,98,114,117,97,114,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,77,97,114,99,104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65,112,114,105,108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,77,97,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,74,117,110,101,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,74,117,108,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65,117,103,117,115,116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,83,101,112,116,101,109,98,101,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,79,99,116,111,98,101,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,78,111,118,101,109,98,101,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,101,99,101,109,98,101,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,83,117,110,100,97,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]) -.concat([77,111,110,100,97,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,84,117,101,115,100,97,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,87,101,100,110,101,115,100,97,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,84,104,117,114,115,100,97,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,114,105,100,97,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,83,97,116,117,114,100,97,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,88,78,3,0,116,1,0,0,72,75,2,0,32,1,0,0,112,5,2,0,64,1,0,0,64,210,1,0,62,1,0,0,96,150,1,0,36,1,0,0,152,76,3,0,10,1,0,0,248,109,3,0,188,0,0,0,72,68,1,0,128,0,0,0,216,150,1,0,100,0,0,0,104,102,3,0,170,0,0,0,136,75,3,0,210,0,0,0,88,54,3,0,80,1,0,0,224,30,3,0,72,1,0,0,120,15,3,0,222,0,0,0,136,250,2,0,78,1,0,0,176,208,2,0,28,1,0,0,120,188,2,0,232,0,0,0,168,42,2,0,56,1,0,0,24,36,2,0,252,0,0,0,184,140,2,0,172,0,0,0,32,111,3,0,68,0,0,0,168,88,2,0,74,0,0,0,40,77,2,0,124,0,0,0,184,69,2,0,206,0,0,0,0,62,2,0,192,0,0,0,136,53,2,0,166,0,0,0,224,46,2,0,72,0,0,0,80,41,2,0,246,0,0,0,88,34,2,0,96,1,0,0,152,26,2,0,216,0,0,0,192,19,2,0,214,0,0,0,112,13,2,0,74,1,0,0,160,6,2,0,2,0,0,0,208,1,2,0,84,0,0,0,64,253,1,0,208,0,0,0,16,248,1,0,114,1,0,0,184,243,1,0,82,1,0,0,184,238,1,0,104,0,0,0,112,234,1,0,234,0,0,0,176,229,1,0,6,1,0,0,208,223,1,0,30,0,0,0,152,190,2,0,0,0,0,0,72,158,1,0,240,0,0,0,144,199,1,0,104,1,0,0,0,196,1,0,104,1,0,0,144,42,2,0,116,0,0,0,112,188,1,0,176,0,0,0,240,170,1,0,2,1,0,0,120,164,1,0,98,1,0,0,184,160,1,0,12,0,0,0,248,156,1,0,152,0,0,0,216,152,1,0,112,1,0,0,168,150,1,0,110,0,0,0,72,149,1,0,250,0,0,0,120,145,1,0,184,0,0,0,0,139,1,0,130,1,0,0,96,136,1,0,126,0,0,0,80,134,1,0,134,0,0,0,144,132,1,0,20,1,0,0,240,130,1,0,60,0,0,0,64,128,1,0,66,0,0,0,208,125,1,0,70,0,0,0,112,123,1,0,90,1,0,0,88,121,1,0,76,1,0,0,184,119,1,0,76,0,0,0,216,117,1,0,110,1,0,0,0,116,1,0,68,1,0,0,224,113,1,0,36,0,0,0,96,182,2,0,196,0,0,0,0,137,1,0,122,0,0,0,208,105,1,0,106,0,0,0,136,102,1,0,6,0,0,0,224,99,1,0,224,0,0,0,192,97,1,0,226,0,0,0,208,95,1,0,46,1,0,0,0,93,1,0,44,1,0,0,120,90,1,0,82,0,0,0,160,87,1,0,202,0,0,0,168,83,1,0,154,0,0,0,168,79,1,0,164,0,0,0,144,74,1,0,186,0,0,0,184,72,1,0,218,0,0,0,104,69,1,0,44,0,0,0,136,65,1,0,12,1,0,0,184,59,1,0,112,0,0,0,208,54,1,0,8,1,0,0,248,51,1,0,58,1,0,0,208,49,1,0,122,1,0,0,0,48,1,0,78,0,0,0,216,45,1,0,66,1,0,0,120,43,1,0,118,0,0,0,48,41,1,0,52,1,0,0,208,38,1,0,126,1,0,0,48,37,1,0,244,0,0,0,72,35,1,0,64,0,0,0,152,33,1,0,14,1,0,0,72,32,1,0,88,1,0,0,144,30,1,0,254,0,0,0,72,28,1,0,124,1,0,0,240,110,3,0,190,0,0,0,192,108,3,0,50,1,0,0,56,105,3,0,50,0,0,0,208,102,3,0,86,1,0,0,192,165,1,0,60,1,0,0,200,97,3,0,42,0,0,0,32,96,3,0,40,1,0,0,48,93,3,0,198,0,0,0,144,86,3,0,114,1,0,0,240,84,3,0,238,0,0,0,240,161,1,0,238,0,0,0,24,80,3,0,248,0,0,0,192,77,3,0,22,1,0,0,32,42,2,0,10,0,0,0,8,74,3,0,92,1,0,0,0,72,3,0,162,0,0,0,208,69,3,0,162,0,0,0,56,67,3,0,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248,25,2,0,232,18,2,0,200,12,2,0,48,6,2,0,128,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,121,1,0,0,0,0,0,8,120,1,0,0,0,0,0,192,172,1,0,240,164,1,0,102,105,116,46,108,111,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,8,0,0,0,9,0,0,0,10,0,0,0,0,0,0,0,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,121,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,117,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,118,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,160,167,1,0,0,0,0,0,96,167,1,0,1,0,0,0,8,167,1,0,2,0,0,0,176,166,1,0,3,0,0,0,88,166,1,0,4,0,0,0,160,76,2,0,9,0,0,0,96,244,2,0,10,0,0,0,208,164,1,0,11,0,0,0,112,164,1,0,12,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,144,80,3,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,50,0,0,0,50,0,0,0,0,0,0,0,0,0,1,0,0,0,128,63,0,0,128,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,65,0,0,128,63,1,0,0,0,208,7,0,0,250,126,106,188,116,147,104,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,191,0,0,0,0,0,0,240,191,0,0,0,0,0,0,240,191,2,0,0,0,50,0,0,0,50,0,0,0,0,0,0,0,0,0,1,0,0,0,128,63,0,0,128,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,65,0,0,128,63,1,0,0,0,208,7,0,0,250,126,106,188,116,147,104,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,191,0,0,0,0,0,0,240,191,0,0,0,0,0,0,240,191,0,0,0,0,0,0,0,0,241,104,227,136,181,248,228,62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,236,1,0,96,25,3,0,176,73,2,0,152,4,2,0,160,209,1,0,32,150,1,0,144,122,1,0,184,98,1,0,184,67,1,0,24,38,1,0,40,102,3,0,56,75,3,0,0,54,3,0,176,30,3,0,240,14,3,0,48,246,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,251,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,65,0,0,0,0,0,0,0,0,0,0,240,63,65,114,105,97,108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,65,0,0,0,0,65,114,105,97,108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,64,0,0,0,0,0,0,160,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,7,0,0,0,8,0,0,0,0,0,0,0,12,0,0,0,10,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,121,1,0,24,121,1,0,216,120,1,0,152,120,1,0,128,120,1,0,104,120,1,0,88,120,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,112,57,2,0,1,0,0,0,0,0,1,0,184,49,2,0,0,0,0,0,1,0,1,0,56,49,2,0,3,0,0,0,0,0,2,0,48,43,2,0,2,0,0,0,1,0,2,0,168,36,2,0,5,0,0,0,0,0,4,0,232,28,2,0,4,0,0,0,1,0,4,0,192,22,2,0,7,0,0,0,0,0,8,0,248,14,2,0,6,0,0,0,1,0,8,0,16,9,2,0,8,0,0,0,2,0,4,0,152,3,2,0,9,0,0,0,2,0,8,0,160,254,1,0,8,0,0,0,2,0,4,0,160,250,1,0,9,0,0,0,2,0,8,0,0,0,0,0,255,255,255,255,255,255,255,255,0,0,0,0,32,73,2,0,0,0,0,0,0,66,2,0,3,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,79,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,0,0,0,0,0,0,0,101,120,101,99,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,10,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,104,149,1,0,1,0,0,0,72,147,1,0,2,0,0,0,88,139,1,0,3,0,0,0,0,137,1,0,4,0,0,0,120,134,1,0,5,0,0,0,192,132,1,0,6,0,0,0,24,131,1,0,7,0,0,0,0,0,0,0,8,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,129,2,0,88,59,3,0,16,92,2,0,8,161,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,2,3,1,0,1,2,2,1,0,1,3,2,1,0,152,187,0,0,10,0,0,0,248,186,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,152,219,0,0,2,0,0,0,0,0,0,0,1,0,0,0,248,7,0,0,2,0,0,0,1,0,0,0,1,0,0,0,72,3,0,0,2,0,0,0,2,0,0,0,2,0,0,0,168,3,0,0,2,0,0,0,3,0,0,0,2,0,0,0,88,3,0,0,1,0,0,0,6,0,0,0,4,0,0,0,184,3,0,0,1,0,0,0,7,0,0,0,4,0,0,0,80,3,0,0,1,0,0,0,10,0,0,0,8,0,0,0,176,3,0,0,1,0,0,0,11,0,0,0,8,0,0,0,0,165,0,0,1,0,0,0,8,0,0,0,4,0,0,0,8,165,0,0,1,0,0,0,9,0,0,0,8,0,0,0,168,211,0,0,3,0,0,0,0,0,0,0,1,0,0,0,240,7,0,0,1,0,0,0,1,0,0,0,1,0,0,0,88,85,0,0,1,0,0,0,2,0,0,0,2,0,0,0,112,4,0,0,1,0,0,0,3,0,0,0,2,0,0,0,64,146,0,0,4,0,0,0,4,0,0,0,4,0,0,0,184,7,0,0,2,0,0,0,5,0,0,0,4,0,0,0,64,137,0,0,2,0,0,0,6,0,0,0,4,0,0,0,176,7,0,0,2,0,0,0,7,0,0,0,4,0,0,0,16,165,0,0,2,0,0,0,8,0,0,0,4,0,0,0,96,201,0,0,2,0,0,0,9,0,0,0,8,0,0,0,72,55,1,0,253,255,255,255,252,255,255,255,251,255,255,255,200,125,2,0,252,255,255,255,251,255,255,255,253,255,255,255,224,90,2,0,251,255,255,255,253,255,255,255,252,255,255,255,0,78,2,0,252,255,255,255,253,255,255,255,251,255,255,255,48,71,2,0,253,255,255,255,251,255,255,255,252,255,255,255,64,63,2,0,251,255,255,255,252,255,255,255,253,255,255,255,32,55,2,0,253,255,255,255,252,255,255,255,251,255,255,255,248,47,2,0,252,255,255,255,251,255,255,255,253,255,255,255,24,42,2,0,251,255,255,255,253,255,255,255,252,255,255,255,112,35,2,0,252,255,255,255,253,255,255,255,251,255,255,255,88,27,2,0,253,255,255,255,251,255,255,255,252,255,255,255,224,20,2,0,251,255,255,255,252,255,255,255,253,255,255,255,160,76,2,0,253,255,255,255,252,255,255,255,251,255,255,255,64,69,2,0,252,255,255,255,253,255,255,255,251,255,255,255,96,174,2,0,253,255,255,255,252,255,255,255,251,255,255,255,16,159,2,0,252,255,255,255,253,255,255,255,251,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,253,255,255,255,252,255,255,255,251,255,255,255,0,0,0,0,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,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,220,1,0,202,0,0,0,240,153,1,0,174,0,0,0,224,126,1,0,164,1,0,0,80,103,1,0,164,1,0,0,80,87,3,0,142,0,0,0,24,42,1,0,124,0,0,0,232,105,3,0,2,1,0,0,80,78,3,0,2,1,0,0,128,57,3,0,144,0,0,0,160,32,3,0,174,0,0,0,224,109,1,0,174,0,0,0,40,17,3,0,64,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,194,176,0,0,0,0,0,0,1,0,0,0,1,0,1,0,18,0,0,0,1,0,1,0,33,0,0,0,1,0,1,0,51,0,0,0,1,0,1,0,64,0,0,0,1,0,1,0,86,0,0,0,2,0,1,0,102,0,0,0,2,0,1,0,118,0,0,0,3,0,1,0,137,0,0,0,3,0,1,0,153,0,0,0,1,0,1,0,169,0,0,0,3,0,1,0,177,0,0,0,1,0,1,0,193,0,0,0,1,0,1,0,184,0,0,0,1,0,1,0,209,0,0,0,1,0,1,0,225,0,0,0,2,0,2,0,252,0,0,0,4,0,1,0,1,1,0,0,4,0,1,0,218,1,0,0,2,0,1,0,23,1,0,0,2,0,1,0,39,1,0,0,2,0,1,0,55,1,0,0,3,0,1,0,89,1,0,0,1,0,1,0,96,1,0,0,1,0,2,0,112,1,0,0,2,0,1,0,136,1,0,0,1,0,0,0,144,1,0,0,1,0,2,0,160,1,0,0,3,0,2,0,176,1,0,0,4,0,2,0,201,1,0,0,2,0,1,0,233,1,0,0,2,0,3,0,0,0,0,0,255,255,255,255,0,0,0,0,1,0,0,0,1,0,0,0,100,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,252,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,252,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,3,0,0,0,1,0,0,0,100,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,252,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,252,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,154,153,153,153,153,153,169,63,184,30,133,235,81,184,158,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,152,73,1,0,255,255,255,0,72,93,1,0,0,0,0,0,48,5,2,0,160,160,160,0,248,92,1,0,0,0,255,0,32,4,2,0,0,192,0,0,208,3,2,0,255,128,0,0,104,3,2,0,255,0,192,0,136,2,2,0,238,238,0,0,8,2,2,0,0,64,192,0,184,1,2,0,0,200,200,0,96,1,2,0,225,105,65,0,184,0,2,0,32,192,255,0,120,0,2,0,64,128,0,0,0,0,2,0,255,128,192,0,104,255,1,0,128,96,48,0,208,254,1,0,0,0,139,0,64,254,1,0,0,128,64,0,200,253,1,0,255,128,255,0,104,253,1,0,212,255,127,0,200,92,1,0,42,42,165,0,48,55,1,0,0,255,255,0,160,252,1,0,208,224,64,0,16,252,1,0,0,0,0,0,208,251,1,0,26,26,26,0,88,251,1,0,51,51,51,0,216,250,1,0,77,77,77,0,48,250,1,0,102,102,102,0,128,249,1,0,127,127,127,0,88,248,1,0,153,153,153,0,240,247,1,0,179,179,179,0,128,32,2,0,192,192,192,0,144,247,1,0,204,204,204,0,24,247,1,0,229,229,229,0,168,246,1,0,255,255,255,0,64,246,1,0,50,50,240,0,232,245,1,0,144,238,144,0,160,245,1,0,230,216,173,0,48,245,1,0,240,85,240,0,112,244,1,0,255,255,224,0,232,243,1,0,130,221,238,0,144,243,1,0,193,182,255,0,8,243,1,0,238,238,175,0,120,242,1,0,0,215,255,0,208,92,1,0,0,255,0,0,200,241,1,0,0,100,0,0,0,241,1,0,127,255,0,0,136,240,1,0,34,139,34,0,248,239,1,0,87,139,46,0,240,92,1,0,255,0,0,0,248,238,1,0,139,0,0,0,104,238,1,0,112,25,25,0,232,237,1,0,128,0,0,0,104,237,1,0,205,0,0,0,48,237,1,0,235,206,135,0,160,92,1,0,255,255,0,0,184,92,1,0,255,0,255,0,32,236,1,0,209,206,0,0,184,235,1,0,147,20,255,0,192,54,1,0,80,127,255,0,160,234,1,0,128,128,240,0,72,234,1,0,0,69,255,0,216,233,1,0,114,128,250,0,128,233,1,0,122,150,233,0,168,232,1,0,140,230,240,0,240,231,1,0,107,183,189,0,144,231,1,0,11,134,184,0,64,231,1,0,220,245,245,0,232,230,1,0,32,128,160,0,128,230,1,0,0,165,255,0,232,229,1,0,238,130,238,0,136,229,1,0,211,0,148,0,32,229,1,0,221,160,221,0,160,228,1,0,64,80,144,0,56,228,1,0,47,107,85,0,176,227,1,0,0,20,128,0,104,227,1,0,20,20,128,0,176,226,1,0,20,64,128,0,32,226,1,0,128,64,128,0,224,224,1,0,192,96,128,0,56,224,1,0,255,96,128,0,184,223,1,0,0,128,128,0,120,223,1,0,64,128,255,0,40,223,1,0,64,160,255,0,176,222,1,0,96,160,255,0,64,222,1,0,112,160,255,0,216,221,1,0,192,192,255,0,72,221,1,0,128,255,255,0,208,220,1,0,192,255,255,0,56,220,1,0,158,183,205,0,200,219,1,0,240,255,240,0,168,218,1,0,205,182,160,0,96,218,1,0,193,255,193,0,24,218,1,0,176,192,205,0,80,217,1,0,64,255,124,0,112,216,1,0,32,255,160,0,8,93,1,0,190,190,190,0,24,216,1,0,211,211,211,0,120,215,1,0,211,211,211,0,32,214,1,0,160,160,160,0,152,213,1,0,205,182,160,0,56,212,1,0,0,0,0,0,192,211,1,0,26,26,26,0,56,211,1,0,51,51,51,0,248,210,1,0,77,77,77,0,56,210,1,0,102,102,102,0,232,209,1,0,127,127,127,0,152,209,1,0,153,153,153,0,112,209,1,0,179,179,179,0,32,209,1,0,204,204,204,0,152,200,1,0,229,229,229,0,224,199,1,0,255,255,255,0,0,0,0,0,255,255,255,255,100,118,1,0,254,255,255,255,1,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,205,204,204,204,204,204,236,63,154,153,153,153,153,153,201,63,0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,154,153,153,153,153,153,169,63,51,51,51,51,51,51,227,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,2,0,0,0,1,0,0,0,100,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,252,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,252,255,255,255,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,20,174,71,225,122,148,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,118,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,253,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]) -.concat([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,88,161,1,0,120,157,1,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,28,0,0,0,0,0,0,72,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,65,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,83,119,105,116,122,101,114,108,97,110,100,76,105,103,104,116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,85,3,0,88,83,3,0,72,89,1,0,40,81,3,0,96,78,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,56,46,51,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,112,9,2,0,10,0,0,0,152,31,3,0,160,1,0,0,168,77,2,0,96,0,0,0,80,7,2,0,72,1,0,0,96,212,1,0,30,0,0,0,224,150,1,0,76,1,0,0,208,123,1,0,60,0,0,0,64,100,1,0,214,0,0,0,184,69,1,0,166,1,0,0,64,39,1,0,140,0,0,0,224,194,2,0,98,1,0,0,104,76,3,0,98,1,0,0,96,55,3,0,236,0,0,0,48,31,3,0,166,0,0,0,200,16,3,0,132,1,0,0,8,252,2,0,94,1,0,0,80,209,2,0,36,0,0,0,16,189,2,0,240,0,0,0,248,172,2,0,150,1,0,0,208,157,2,0,112,0,0,0,80,141,2,0,166,1,0,0,232,123,2,0,170,1,0,0,88,89,2,0,208,0,0,0,80,77,2,0,22,1,0,0,24,70,2,0,138,0,0,0,80,62,2,0,128,0,0,0,248,53,2,0,114,1,0,0,144,47,2,0,38,1,0,0,176,41,2,0,184,0,0,0,0,35,2,0,38,0,0,0,208,26,2,0,22,0,0,0,40,20,2,0,108,1,0,0,160,13,2,0,26,0,0,0,0,7,2,0,32,1,0,0,24,2,2,0,232,0,0,0,120,253,1,0,194,0,0,0,96,248,1,0,84,1,0,0,248,243,1,0,144,1,0,0,8,239,1,0,96,1,0,0,176,234,1,0,36,1,0,0,240,148,1,0,118,0,0,0,0,0,0,0,112,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,157,255,255,255,0,0,0,0,24,24,2,0,114,0,0,0,216,23,2,0,104,0,0,0,88,23,2,0,99,0,0,0,72,22,2,0,121,0,0,0,240,20,2,0,120,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,8,124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,13,2,0,144,7,2,0,72,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,191,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,176,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,254,255,255,255,0,0,0,0,254,255,255,255,254,255,255,255,254,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,112,213,0,0,0,0,0,0,72,101,108,118,101,116,105,99,97,32,66,111,108,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,191,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,216,97,1,0,0,0,0,0,57,180,200,118,190,159,240,63,224,95,1,0,0,0,0,0,47,221,36,6,129,149,241,63,16,93,1,0,0,0,0,0,135,22,217,206,247,83,241,63,32,91,1,0,0,0,0,0,147,24,4,86,14,45,240,63,104,134,1,0,0,0,0,0,49,8,172,28,90,100,239,63,8,131,1,0,0,0,0,0,133,235,81,184,30,133,239,63,176,132,1,0,0,0,0,0,227,165,155,196,32,176,238,63,88,128,1,0,0,0,0,0,0,0,0,0,0,0,240,63,48,109,1,0,0,0,0,0,8,172,28,90,100,59,245,63,176,102,1,0,0,0,0,0,8,172,28,90,100,59,245,63,232,105,1,0,0,0,0,0,176,114,104,145,237,124,243,63,16,100,1,0,0,0,0,0,219,249,126,106,188,116,245,63,224,45,1,0,0,0,0,0,78,98,16,88,57,180,236,63,168,141,2,0,0,0,0,0,155,85,159,171,173,216,243,63,88,141,2,0,0,0,0,0,210,111,95,7,206,25,237,63,40,141,2,0,0,0,0,0,39,194,134,167,87,202,243,63,8,141,2,0,0,0,0,0,188,150,144,15,122,54,237,63,240,140,2,0,0,0,0,0,84,82,39,160,137,176,246,63,216,140,2,0,0,0,0,0,215,163,112,61,10,215,241,63,192,140,2,0,0,0,0,0,233,72,46,255,33,253,236,63,160,140,2,0,0,0,0,0,28,124,97,50,85,48,246,63,120,140,2,0,0,0,0,0,224,190,14,156,51,162,246,63,88,140,2,0,0,0,0,0,238,235,192,57,35,74,243,63,48,140,2,0,0,0,0,0,208,213,86,236,47,187,242,63,248,139,2,0,0,0,0,0,201,118,190,159,26,47,245,63,208,139,2,0,0,0,0,0,178,157,239,167,198,75,245,63,128,139,2,0,0,0,0,0,238,235,192,57,35,74,243,63,104,139,2,0,0,0,0,0,121,88,168,53,205,59,243,63,64,139,2,0,0,0,0,0,121,88,168,53,205,59,243,63,16,139,2,0,0,0,0,0,233,72,46,255,33,253,236,63,248,138,2,0,0,0,0,0,233,72,46,255,33,253,236,63,216,138,2,0,0,0,0,0,233,72,46,255,33,253,236,63,200,138,2,0,0,0,0,0,135,22,217,206,247,83,249,63,168,138,2,0,0,0,0,0,211,77,98,16,88,57,242,63,128,138,2,0,0,0,0,0,211,77,98,16,88,57,242,63,96,138,2,0,0,0,0,0,47,221,36,6,129,149,241,63,56,138,2,0,0,0,0,0,147,24,4,86,14,45,240,63,40,138,2,0,0,0,0,0,176,114,104,145,237,124,243,63,16,138,2,0,0,0,0,0,219,249,126,106,188,116,245,63,0,138,2,0,0,0,0,0,227,165,155,196,32,176,238,63,232,137,2,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,160,15,0,0,0,0,0,0,255,255,255,255,0,0,0,0,112,23,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,251,255,255,255,0,0,0,0,152,190,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,36,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,153,1,0,40,151,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,240,191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248,63,1,0,0,0,6,0,0,0,252,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,1,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,240,191,0,0,0,0,0,0,240,191,0,0,0,0,0,0,240,191,2,0,0,0,0,0,0,0,0,0,0,0,0,56,143,192,0,0,0,0,0,56,143,192,0,0,0,0,0,56,143,192,0,0,0,0,0,56,143,192,0,0,0,0,0,56,143,192,0,0,0,0,0,56,143,192,0,0,0,0,0,56,143,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,37,45,49,55,115,32,32,37,115,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,1,0,0,0,0,0,0,0,0,0,0,0,252,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,252,255,255,255,0,0,0,0,0,0,0,0,1,0,0,0,252,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,104,46,1,0,0,0,0,0,224,61,3,0,1,0,0,0,112,22,3,0,2,0,0,0,96,89,1,0,3,0,0,0,96,231,1,0,4,0,0,0,88,166,1,0,5,0,0,0,176,166,1,0,6,0,0,0,96,244,2,0,7,0,0,0,208,174,2,0,8,0,0,0,192,222,1,0,9,0,0,0,8,112,3,0,10,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,122,0,0,0,1,0,0,0,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,121,0,0,0,5,0,0,0,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,120,0,0,0,5,0,0,0,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,99,98,0,0,5,0,0,0,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,122,50,0,0,0,0,0,0,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,121,50,0,0,0,0,0,0,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,120,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,64,114,0,0,0,2,0,0,0,0,0,0,0,0,0,20,192,0,0,0,0,0,0,20,64,116,0,0,0,0,0,0,0,0,0,0,0,0,0,20,192,0,0,0,0,0,0,20,64,117,0,0,0,0,0,0,0,0,0,0,0,0,0,20,192,0,0,0,0,0,0,20,64,118,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]) -.concat([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,37,32,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,100,47,37,109,47,37,121,44,37,72,58,37,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,36,64,0,0,0,0,0,0,240,63,0,0,0,0,0,0,224,63,1,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,253,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,37,32,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,100,47,37,109,47,37,121,44,37,72,58,37,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,36,64,0,0,0,0,0,0,240,63,0,0,0,0,0,0,224,63,1,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,253,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,37,32,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,100,47,37,109,47,37,121,44,37,72,58,37,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,36,64,0,0,0,0,0,0,240,63,0,0,0,0,0,0,224,63,1,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,253,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,37,32,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,100,47,37,109,47,37,121,44,37,72,58,37,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,36,64,0,0,0,0,0,0,240,63,0,0,0,0,0,0,224,63,1,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,253,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,37,32,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,100,47,37,109,47,37,121,44,37,72,58,37,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,36,64,0,0,0,0,0,0,240,63,0,0,0,0,0,0,224,63,1,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,253,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,37,32,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,100,47,37,109,47,37,121,44,37,72,58,37,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,36,64,0,0,0,0,0,0,240,63,0,0,0,0,0,0,224,63,1,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,253,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,37,32,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,100,47,37,109,47,37,121,44,37,72,58,37,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,36,64,0,0,0,0,0,0,240,63,0,0,0,0,0,0,224,63,1,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,253,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,37,32,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,100,47,37,109,47,37,121,44,37,72,58,37,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,36,64,0,0,0,0,0,0,240,63,0,0,0,0,0,0,224,63,1,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,253,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,37,32,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,100,47,37,109,47,37,121,44,37,72,58,37,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,36,64,0,0,0,0,0,0,240,63,0,0,0,0,0,0,224,63,1,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,253,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,37,32,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,100,47,37,109,47,37,121,44,37,72,58,37,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,36,64,0,0,0,0,0,0,240,63,0,0,0,0,0,0,224,63,1,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,253,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,36,192,0,0,0,0,0,0,36,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]) -.concat([0,0,0,0,1,37,32,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,100,47,37,109,47,37,121,44,37,72,58,37,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,36,64,0,0,0,0,0,0,240,63,0,0,0,0,0,0,224,63,1,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,253,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,77,2,0,176,69,2,0,240,61,2,0,128,53,2,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,74,97,110,0,0,0,0,0,70,101,98,0,0,0,0,0,77,97,114,0,0,0,0,0,65,112,114,0,0,0,0,0,77,97,121,0,0,0,0,0,74,117,110,0,0,0,0,0,74,117,108,0,0,0,0,0,65,117,103,0,0,0,0,0,83,101,112,0,0,0,0,0,79,99,116,0,0,0,0,0,78,111,118,0,0,0,0,0,68,101,99,0,0,0,0,0,83,117,110,0,0,0,0,0,77,111,110,0,0,0,0,0,84,117,101,0,0,0,0,0,87,101,100,0,0,0,0,0,84,104,117,0,0,0,0,0,70,114,105,0,0,0,0,0,83,97,116,0,0,0,0,0,0,0,0,0,0,0,0,0,112,108,111,116,95,97,120,105,115,95,120,109,97,120,0,0,71,80,86,65,76,95,88,95,77,65,88,0,0,0,0,0,103,110,117,112,108,111,116,95,115,118,103,46,37,115,32,61,32,37,103,59,10,0,0,0,87,105,108,108,32,110,111,116,32,99,104,101,99,107,32,102,111,114,32,117,110,100,101,102,105,110,101,100,32,100,97,116,97,112,111,105,110,116,115,32,40,109,97,121,32,99,97,117,115,101,32,99,114,97,115,104,101,115,41,46,10,0,0,0,117,110,100,101,102,105,110,101,100,32,118,97,114,105,97,98,108,101,58,32,37,115,0,0,101,120,101,99,117,116,105,110,103,58,32,37,115,0,0,0,112,108,111,116,95,97,120,105,115,95,120,109,105,110,0,0,65,109,98,105,103,117,111,117,115,32,114,101,113,117,101,115,116,32,39,37,46,42,115,39,59,32,112,111,115,115,105,98,108,101,32,109,97,116,99,104,101,115,58,10,0,0,0,0,103,110,117,112,108,111,116,95,115,118,103,46,37,115,32,61,32,37,100,59,10,0,0,0,116,109,95,109,100,97,121,0,97,108,108,95,116,101,114,109,95,110,97,109,101,115,50,0,71,80,86,65,76,95,88,95,77,73,78,0,0,0,0,0,108,115,0,0,0,0,0,0,105,110,100,101,120,95,109,105,110,0,0,0,0,0,0,0,110,111,32,99,111,108,117,109,110,32,119,105,116,104,32,104,101,97,100,101,114,32,34,37,115,34,0,0,0,0,0,0,103,110,117,112,108,111,116,95,115,118,103,46,112,108,111,116,95,104,101,105,103,104,116,32,61,32,37,46,49,102,59,10,0,0,0,0,0,0,0,0,10,9,85,115,101,114,32,97,110,100,32,100,101,102,97,117,108,116,32,118,97,114,105,97,98,108,101,115,58,10,0,0,114,101,108,36,97,116,105,118,101,0,0,0,0,0,0,0,103,110,117,112,108,111,116,95,115,118,103,46,112,108,111,116,95,119,105,100,116,104,32,61,32,37,46,49,102,59,10,0,99,104,97,110,103,101,32,118,105,101,119,32,40,115,99,97,108,105,110,103,41,46,32,85,115,101,32,60,99,116,114,108,62,32,116,111,32,115,99,97,108,101,32,116,104,101,32,97,120,101,115,32,111,110,108,121,46,0,0,0,0,0,0,0,103,110,117,112,108,111,116,95,115,118,103,46,112,108,111,116,95,121,116,111,112,32,61,32,37,46,49,102,59,10,0,0,103,110,117,112,108,111,116,95,115,118,103,46,112,108,111,116,95,121,98,111,116,32,61,32,37,46,49,102,59,10,0,0,103,110,117,112,108,111,116,95,115,118,103,46,112,108,111,116,95,120,109,97,120,32,61,32,37,46,49,102,59,10,0,0,101,108,108,105,112,115,101,0,103,110,117,112,108,111,116,95,115,118,103,46,112,108,111,116,95,120,109,105,110,32,61,32,37,46,49,102,59,10,0,0,103,110,117,112,108,111,116,95,115,118,103,46,112,108,111,116,95,116,101,114,109,95,121,109,97,120,32,61,32,37,100,59,10,0,0,0,0,0,0,0,67,111,110,116,105,110,117,101,46,0,0,0,0,0,0,0,103,110,117,112,108,111,116,95,115,118,103,46,112,108,111,116,95,116,101,114,109,95,120,109,97,120,32,61,32,37,100,59,10,0,0,0,0,0,0,0,122,116,105,99,115,0,0,0,47,47,32,112,108,111,116,32,98,111,117,110,100,97,114,105,101,115,32,97,110,100,32,97,120,105,115,32,115,99,97,108,105,110,103,32,105,110,102,111,114,109,97,116,105,111,110,32,102,111,114,32,109,111,117,115,105,110,103,32,10,0,0,0,116,109,95,104,111,117,114,0,37,115,32,0,0,0,0,0,10,60,115,99,114,105,112,116,32,116,121,112,101,61,34,116,101,120,116,47,106,97,118,97,115,99,114,105,112,116,34,62,60,33,91,67,68,65,84,65,91,10,0,0,0,0,0,0,108,105,110,101,116,121,112,101,36,115,0,0,0,0,0,0,115,117,109,115,113,0,0,0,115,116,114,105,110,103,99,111,108,117,109,110,40,41,32,99,97,108,108,101,100,32,102,114,111,109,32,105,110,118,97,108,105,100,32,99,111,110,116,101,120,116,0,0,0,0,0,0,32,57,44,52,44,49,44,52,44,49,44,52,0,0,0,0,10,9,86,97,114,105,97,98,108,101,115,32,98,101,103,105,110,110,105,110,103,32,119,105,116,104,32,37,115,58,10,0,32,56,44,52,44,50,44,52,0,0,0,0,0,0,0,0,116,105,109,101,32,102,111,114,109,97,116,32,115,116,114,105,110,103,32,101,120,112,101,99,116,101,100,0,0,0,0,0,10,37,115,111,98,106,101,99,116,32,37,50,100,32,0,0,68,105,109,95,49,0,0,0,60,66,50,45,77,111,116,105,111,110,62,0,0,0,0,0,104,101,97,100,32,115,105,122,101,32,101,120,112,101,99,116,101,100,0,0,0,0,0,0,32,50,44,52,0,0,0,0,32,53,44,56,0,0,0,0,83,117,98,116,111,112,105,99,32,111,102,32,0,0,0,0,32,100,61,39,0,0,0,0,99,108,97,115,115,61,34,103,114,105,100,108,105,110,101,34,32,0,0,0,0,0,0,0,115,116,114,111,107,101,45,100,97,115,104,97,114,114,97,121,61,39,37,115,39,32,0,0,83,116,111,112,46,0,0,0,115,116,114,111,107,101,61,39,37,115,39,32,0,0,0,0,115,116,114,111,107,101,61,39,114,103,98,40,37,51,100,44,32,37,51,100,44,32,37,51,100,41,39,32,0,0,0,0,116,109,95,109,105,110,0,0,32,0,0,0,0,0,0,0,9,60,112,97,116,104,32,0,108,105,110,101,115,36,116,121,108,101,0,0,0,0,0,0,77,37,46,49,102,44,37,46,49,102,32,0,0,0,0,0,10,9,65,108,108,32,97,118,97,105,108,97,98,108,101,32,118,97,114,105,97,98,108,101,115,58,10,0,0,0,0,0,10,9,9,9,32,32,32,32,116,111,32,0,0,0,0,0,10,9,9,0,0,0,0,0,76,37,46,49,102,44,37,46,49,102,32,0,0,0,0,0,99,104,97,110,103,101,32,118,105,101,119,32,40,114,111,116,97,116,105,111,110,41,46,32,85,115,101,32,60,99,116,114,108,62,32,116,111,32,114,111,116,97,116,101,32,116,104,101,32,97,120,101,115,32,111,110,108,121,46,0,0,0,0,0,60,47,116,101,120,116,62,10,9,60,47,103,62,10,0,0,38,97,109,112,59,0,0,0,38,108,116,59,0,0,0,0,9,9,60,116,101,120,116,62,0,0,0,0,0,0,0,0,10,10,40,83,41,116,111,112,32,102,105,116,44,32,40,67,41,111,110,116,105,110,117,101,44,32,40,69,41,120,101,99,117,116,101,32,70,73,84,95,83,67,82,73,80,84,58,32,32,0,0,0,0,0,0,0,9,9,60,116,101,120,116,32,120,109,108,58,115,112,97,99,101,61,34,112,114,101,115,101,114,118,101,34,62,0,0,0,32,32,0,0,0,0,0,0,116,109,95,115,101,99,0,0,97,108,108,95,116,101,114,109,95,110,97,109,101,115,0,0,32,116,101,120,116,45,97,110,99,104,111,114,58,37,115,34,62,10,0,0,0,0,0,0,108,97,36,98,101,108,0,0,99,114,101,97,116,101,95,97,110,100,95,115,101,116,95,118,97,114,0,0,0,0,0,0,99,111,108,117,109,110,40,41,32,99,97,108,108,101,100,32,102,114,111,109,32,105,110,118,97,108,105,100,32,99,111,110,116,101,120,116,0,0,0,0,32,102,111,110,116,45,115,116,121,108,101,58,37,115,59,0,97,108,108,0,0,0,0,0,32,102,111,110,116,45,119,101,105,103,104,116,58,37,115,59,0,0,0,0,0,0,0,0,37,97,32,37,98,32,37,100,32,37,72,58,37,77,58,37,83,32,37,89,0,0,0,0,37,115,111,98,106,101,99,116,32,37,50,100,32,112,111,108,121,103,111,110,32,0,0,0,60,66,49,45,77,111,116,105,111,110,62,0,0,0,0,0,110,111,102,105,108,108,36,101,100,0,0,0,0,0,0,0,59,32,102,111,110,116,45,102,97,109,105,108,121,58,37,115,59,32,102,111,110,116,45,115,105,122,101,58,37,46,50,102,112,116,59,0,0,0,0,0,114,103,98,40,37,100,44,37,100,44,37,100,41,0,0,0,104,101,108,112,32,112,114,111,109,112,116,0,0,0,0,0,34,32,115,116,121,108,101,61,34,115,116,114,111,107,101,58,110,111,110,101,59,32,102,105,108,108,58,0,0,0,0,0,32,114,111,116,97,116,101,40,37,105,41,0,0,0,0,0,9,60,103,32,116,114,97,110,115,102,111,114,109,61,34,116,114,97,110,115,108,97,116,101,40,37,46,49,102,44,37,46,49,102,41,0,0,0,0,0,37,115,95,101,114,114,0,0,101,110,100,0,0,0,0,0,109,105,100,100,108,101,0,0,101,120,112,105,110,116,0,0,32,32,37,49,53,115,32,32,37,115,10,0,0,0,0,0,115,116,97,114,116,0,0,0,107,101,121,116,36,105,116,108,101,0,0,0,0,0,0,0,112,111,115,95,109,97,120,95,121,0,0,0,0,0,0,0,68,97,116,97,32,102,105,108,101,32,105,115,32,101,109,112,116,121,0,0,0,0,0,0,9,60,117,115,101,32,120,108,105,110,107,58,104,114,101,102,61,39,35,103,112,80,116,37,117,39,32,116,114,97,110,115,102,111,114,109,61,39,116,114,97,110,115,108,97,116,101,40,37,46,49,102,44,37,46,49,102,41,32,115,99,97,108,101,40,37,46,50,102,41,39,37,115,47,62,10,0,0,0,0,108,105,110,101,115,116,121,108,101,32,110,111,116,32,102,111,117,110,100,0,0,0,0,0,9,60,117,115,101,32,120,108,105,110,107,58,104,114,101,102,61,39,35,103,112,68,111,116,39,32,120,61,39,37,46,49,102,39,32,121,61,39,37,46,49,102,39,37,115,47,62,10,0,0,0,0,0,0,0,0,109,97,114,107,32,122,111,111,109,32,114,101,103,105,111,110,32,40,111,110,108,121,32,102,111,114,32,50,100,45,112,108,111,116,115,32,97,110,100,32,109,97,112,115,41,46,0,0,32,99,111,108,111,114,61,39,37,115,39,0,0,0,0,0,32,99,111,108,111,114,61,39,114,103,98,40,37,51,100,44,32,37,51,100,44,32,37,51,100,41,39,0,0,0,0,0,104,101,108,112,32,98,117,102,102,101,114,0,0,0,0,0,98,111,108,100,0,0,0,0,105,116,97,108,105,99,0,0,47,117,115,114,47,108,111,99,97,108,47,115,104,97,114,101,47,103,110,117,112,108,111,116,47,52,46,54,0,0,0,0,32,73,116,97,108,105,99,0,37,46,48,102,0,0,0,0,32,105,116,97,108,105,99,0,101,120,112,101,99,116,101,100,32,111,112,116,105,111,110,97,108,32,97,120,105,115,32,110,97,109,101,0,0,0,0,0,37,109,47,37,100,47,37,121,0,0,0,0,0,0,0,0,32,66,111,108,100,0,0,0,97,105,114,121,0,0,0,0,10,65,118,97,105,108,97,98,108,101,32,116,101,114,109,105,110,97,108,32,116,121,112,101,115,58,10,0,0,0,0,0,32,98,111,108,100,0,0,0,34,62,10,0,0,0,0,0,107,36,101,121,0,0,0,0,112,111,115,95,109,105,110,95,121,0,0,0,0,0,0,0,68,97,116,97,32,102,105,108,101,32,114,101,97,100,32,101,114,114,111,114,0,0,0,0,80,65,71,69,82,0,0,0,9,108,105,110,101,115,116,121,108,101,32,37,100,44,32,0,109,105,116,101,114,0,0,0,60,66,51,62,0,0,0,0,102,105,108,108,36,101,100,0,59,32,115,116,114,111,107,101,45,119,105,100,116,104,58,37,46,50,102,59,32,115,116,114,111,107,101,45,108,105,110,101,99,97,112,58,37,115,59,32,115,116,114,111,107,101,45,108,105,110,101,106,111,105,110,58,37,115,0,0,0,0,0,0,99,117,114,114,101,110,116,67,111,108,111,114,0,0,0,0,99,112,49,50,53,48,0,0,32,111,112,101,110,32,121,108,111,119,32,121,104,105,103,104,32,121,99,108,111,115,101,32,119,105,100,116,104,0,0,0,114,103,98,40,37,51,100,44,32,37,51,100,44,32,37,51,100,41,0,0,0,0,0,0,60,103,32,115,116,121,108,101,61,34,102,105,108,108,58,110,111,110,101,59,32,99,111,108,111,114,58,37,115,59,32,115,116,114,111,107,101,58,0,0,37,54,46,51,102,32,0,0,9,9,60,47,112,97,116,116,101,114,110,62,10,9,60,47,100,101,102,115,62,10,0,0,9,9,9,60,112,97,116,104,32,115,116,121,108,101,32,61,32,39,37,115,32,37,115,58,99,117,114,114,101,110,116,67,111,108,111,114,39,32,100,61,39,37,115,39,47,62,10,0,108,97,109,98,101,114,116,119,0,0,0,0,0,0,0,0,108,105,115,116,95,116,101,114,109,115,0,0,0,0,0,0,9,9,9,60,112,97,116,104,32,115,116,121,108,101,32,61,32,39,37,115,32,37,115,58,37,115,39,32,100,61,32,39,37,115,39,47,62,10,0,0,105,115,36,111,115,97,109,112,108,101,115,0,0,0,0,0,32,32,68,97,116,97,32,66,108,111,99,107,115,58,32,32,37,42,108,100,10,0,0,0,102,36,105,116,0,0,0,0,9,9,9,60,112,97,116,104,32,115,116,121,108,101,61,39,37,115,32,37,115,58,114,103,98,40,37,100,44,37,100,44,37,100,41,39,32,100,61,39,37,115,39,47,62,10,0,0,108,105,110,101,116,121,112,101,32,110,111,116,32,102,111,117,110,100,0,0,0,0,0,0,83,116,97,116,115,32,99,111,109,109,97,110,100,32,110,111,116,32,97,118,97,105,108,97,98,108,101,32,105,110,32,112,111,108,97,114,32,109,111,100,101,0,0,0,0,0,0,0,115,116,114,111,107,101,58,110,111,110,101,59,0,0,0,0,114,101,109,111,118,101,32,108,97,98,101,108,32,99,108,111,115,101,32,116,111,32,112,111,105,110,116,101,114,32,105,102,32,96,115,101,116,32,109,111,117,115,101,32,108,97,98,101,108,115,96,32,105,115,32,111,110,0,0,0,0,0,0,0,102,105,108,108,58,110,111,110,101,59,0,0,0,0,0,0,10,37,115,32,0,0,0,0,77,45,50,44,48,32,76,52,44,49,50,32,77,48,44,45,52,32,76,56,44,49,50,32,77,52,44,45,52,32,76,49,48,44,56,0,0,0,0,0,77,45,50,44,56,32,76,52,44,45,52,32,77,48,44,49,50,32,76,56,44,45,52,32,77,52,44,49,50,32,76,49,48,44,48,0,0,0,0,0,77,45,52,44,56,32,76,56,44,45,52,32,77,48,44,49,50,32,76,49,50,44,48,0,77,45,52,44,48,32,76,56,44,49,50,32,77,48,44,45,52,32,76,49,50,44,56,0,37,45,49,53,46,49,53,115,0,0,0,0,0,0,0,0,85,110,114,101,99,111,103,110,105,122,101,100,32,111,112,116,105,111,110,46,32,83,101,101,32,39,104,101,108,112,32,115,104,111,119,39,46,0,0,0,77,48,44,48,32,76,48,44,56,32,76,56,44,56,32,76,56,44,48,32,76,48,44,48,0,0,0,0,0,0,0,0,77,48,44,48,32,76,56,44,56,32,77,48,44,56,32,76,56,44,48,32,77,48,44,52,32,76,52,44,56,32,76,56,44,52,32,76,52,44,48,32,76,48,44,52,0,0,0,0,97,116,97,110,104,0,0,0,90,97,112,102,32,68,105,110,103,98,97,116,115,0,0,0,77,48,44,48,32,76,56,44,56,32,77,48,44,56,32,76,56,44,48,0,0,0,0,0,104,105,115,36,116,111,114,121,115,105,122,101,0,0,0,0,32,32,66,108,97,110,107,58,32,32,32,32,32,32,32,32,37,42,108,100,10,0,0,0,46,46,46,0,0,0,0,0,9,60,100,101,102,115,62,10,9,9,60,112,97,116,116,101,114,110,32,105,100,61,39,103,112,80,97,116,37,100,39,32,112,97,116,116,101,114,110,85,110,105,116,115,61,39,117,115,101,114,83,112,97,99,101,79,110,85,115,101,39,32,120,61,39,48,39,32,121,61,39,48,39,32,119,105,100,116,104,61,39,56,39,32,104,101,105,103,104,116,61,39,56,39,62,10,0,0,0,0,0,0,0,0,9,108,105,110,101,116,121,112,101,32,37,100,44,32,0,0,110,111,102,111,114,116,36,114,97,110,0,0,0,0,0,0,103,112,98,105,110,0,0,0,32,117,110,105,116,115,32,0,115,116,114,111,107,101,0,0,60,67,116,114,108,45,66,50,62,0,0,0,0,0,0,0,9,60,103,32,115,116,121,108,101,32,61,32,39,115,116,114,111,107,101,58,110,111,110,101,59,32,115,104,97,112,101,45,114,101,110,100,101,114,105,110,103,58,99,114,105,115,112,69,100,103,101,115,39,62,10,0,103,101,110,95,111,110,101,95,99,111,110,116,111,117,114,58,32,110,111,32,99,111,110,116,111,117,114,32,102,111,117,110,100,10,0,0,0,0,0,0,37,115,32,61,32,39,99,117,114,114,101,110,116,67,111,108,111,114,39,0,0,0,0,0,32,60,32,0,0,0,0,0,37,115,32,61,32,39,37,115,39,0,0,0,0,0,0,0,99,97,110,110,111,116,32,98,101,32,104,101,114,101,0,0,78,101,101,100,32,102,117,108,108,32,117,115,105,110,103,32,115,112,101,99,32,102,111,114,32,121,32,116,105,109,101,32,100,97,116,97,0,0,0,0,37,115,32,61,32,39,114,103,98,40,37,51,100,44,32,37,51,100,44,32,37,51,100,41,39,0,0,0,0,0,0,0,102,105,108,108,0,0,0,0,45,45,100,101,102,97,117,108,116,45,115,101,116,116,105,110,103,115,0,0,0,0,0,0,37,45,54,46,54,115,32,0,39,47,62,10,0,0,0,0,117,115,101,114,32,102,117,110,99,0,0,0,0,0,0,0,37,46,49,102,44,37,46,49,102,37,115,0,0,0,0,0,97,99,111,115,104,0,0,0,90,97,112,102,32,67,104,97,110,99,101,114,121,32,77,101,100,105,117,109,32,73,116,97,108,105,99,0,0,0,0,0,32,112,111,105,110,116,115,32,61,32,39,0,0,0,0,0,109,111,114,101,62,32,0,0,104,105,100,36,100,101,110,51,100,0,0,0,0,0,0,0,32,32,73,110,118,97,108,105,100,58,32,32,32,32,32,32,37,42,108,100,10,0,0,0,96,98,117,105,108,116,105,110,45,116,111,103,103,108,101,45,114,117,108,101,114,96,0,0,37,46,55,55,115,37,115,10,37,115,58,37,100,58,0,0,32,102,105,108,108,32,61,32,39,117,114,108,40,35,103,112,80,97,116,37,100,41,39,0,9,76,105,110,101,116,121,112,101,115,32,114,101,112,101,97,116,32,101,118,101,114,121,32,37,100,32,117,110,108,101,115,115,32,101,120,112,108,105,99,105,116,108,121,32,100,101,102,105,110,101,100,10,0,0,0,32,32,97,110,103,108,101,32,37,103,0,0,0,0,0,0,32,102,105,108,108,45,111,112,97,99,105,116,121,32,61,32,39,37,102,39,0,0,0,0,47,121,115,116,101,112,32,49,32,105,109,97,120,32,100,105,118,32,100,101,102,32,47,121,48,32,48,32,100,101,102,32,47,105,105,32,48,32,100,101,102,10,0,0,0,0,0,0,67,97,110,110,111,116,32,111,112,101,110,32,37,115,32,102,105,108,101,32,39,37,115,39,0,0,0,0,0,0,0,0,99,117,114,118,101,0,0,0,120,32,112,111,115,0,0,0,111,114,32,100,114,97,119,32,108,97,98,101,108,115,32,105,102,32,96,115,101,116,32,109,111,117,115,101,32,108,97,98,101,108,115,32,105,115,32,111,110,96,0,0,0,0,0,0,32,102,105,108,108,32,61,32,39,37,115,39,0,0,0,0,105,110,116,101,114,110,97,108,32,101,114,114,111,114,32,58,32,116,121,112,101,32,110,101,105,116,104,101,114,32,73,78,84,32,111,114,32,67,77,80,76,88,0,0,0,0,0,0,9,9,60,112,111,108,121,103,111,110,32,0,0,0,0,0,99,97,110,110,111,116,32,115,101,116,32,114,97,110,103,101,32,119,105,116,104,32,114,101,112,108,111,116,0,0,0,0,32,120,109,108,58,115,112,97,99,101,61,34,112,114,101,115,101,114,118,101,34,0,0,0,32,102,105,108,108,61,34,110,111,110,101,34,0,0,0,0,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,0,32,100,121,61,34,37,46,50,102,112,116,34,0,0,0,0,32,100,120,61,34,37,46,50,102,101,109,34,0,0,0,0,97,115,105,110,104,0,0,0,83,121,109,98,111,108,0,0,32,102,111,110,116,45,115,116,121,108,101,61,34,37,115,34,32,0,0,0,0,0,0,0,103,36,114,105,100,0,0,0,32,32,79,117,116,32,111,102,32,114,97,110,103,101,58,32,37,42,108,100,10,0,0,0,82,101,119,105,110,100,105,110,103,32,102,100,32,37,100,10,0,0,0,0,0,0,0,0,32,102,111,110,116,45,119,101,105,103,104,116,61,34,37,115,34,32,0,0,0,0,0,0,40,37,115,37,103,44,32,37,115,37,103,44,32,37,115,37,103,41,0,0,0,0,0,0,122,0,0,0,0,0,0,0,44,32,37,115,37,103,0,0,110,111,114,109,97,108,0,0,73,110,32,108,111,103,32,109,111,100,101,32,114,114,97,110,103,101,32,109,117,115,116,32,110,111,116,32,105,110,99,108,117,100,101,32,48,0,0,0,97,110,110,111,116,97,116,101,32,116,104,101,32,103,114,97,112,104,32,117,115,105,110,103,32,96,109,111,117,115,101,102,111,114,109,97,116,96,32,40,115,101,101,32,107,101,121,115,32,39,49,39,44,32,39,50,39,41,0,0,0,0,0,0,32,102,111,110,116,45,115,105,122,101,61,34,37,46,49,102,112,116,34,0,0,0,0,0,32,115,116,121,108,101,61,34,102,111,110,116,45,102,97,109,105,108,121,58,37,115,34,32,0,0,0,0,0,0,0,0,60,116,115,112,97,110,0,0,60,116,115,112,97,110,32,100,120,61,34,45,37,46,49,102,101,109,34,32,100,121,61,34,37,46,49,102,112,116,34,62,0,0,0,0,0,0,0,0,79,110,108,121,32,117,110,100,101,102,105,110,101,100,32,100,97,116,97,112,111,105,110,116,115,32,97,114,101,32,111,109,105,116,116,101,100,32,102,114,111,109,32,116,104,101,32,115,117,114,102,97,99,101,46,10,0,0,0,0,0,0,0,0,37,115,60,47,116,115,112,97,110,62,0,0,0,0,0,0,10,10,99,111,114,114,101,108,97,116,105,111,110,32,109,97,116,114,105,120,32,111,102,32,116,104,101,32,102,105,116,32,112,97,114,97,109,101,116,101,114,115,58,10,10,0,0,0,60,47,103,62,10,0,0,0,10,72,101,108,112,32,116,111,112,105,99,115,32,97,118,97,105,108,97,98,108,101,58,10,0,0,0,0,0,0,0,0,62,10,0,0,0,0,0,0,105,110,118,110,111,114,109,0,80,97,108,97,116,105,110,111,32,66,111,108,100,32,73,116,97,108,105,99,0,0,0,0,111,110,99,108,105,99,107,61,34,103,110,117,112,108,111,116,95,115,118,103,46,116,111,103,103,108,101,86,105,115,105,98,105,108,105,116,121,40,101,118,116,44,39,37,115,95,112,108,111,116,95,37,100,37,115,39,41,34,0,0,0,0,0,0,102,117,36,110,99,116,105,111,110,115,0,0,0,0,0,0,32,32,82,101,99,111,114,100,115,58,32,32,32,32,32,32,37,42,108,100,10,0,0,0,83,107,105,112,112,105,110,103,32,117,110,114,101,97,100,97,98,108,101,32,102,105,108,101,32,34,37,115,34,0,0,0,9,60,103,32,118,105,115,105,98,105,108,105,116,121,61,34,118,105,115,105,98,108,101,34,32,0,0,0,0,0,0,0,40,99,104,97,114,97,99,116,101,114,32,117,110,105,116,115,41,32,0,0,0,0,0,0,37,115,111,98,106,101,99,116,32,37,50,100,32,101,108,108,105,112,115,101,32,0,0,0,62,60,116,105,116,108,101,62,37,115,95,112,108,111,116,95,37,100,37,115,60,47,116,105,116,108,101,62,10,0,0,0,84,104,105,115,32,112,108,111,116,32,115,116,121,108,101,32,100,111,101,115,32,110,111,116,32,119,111,114,107,32,119,105,116,104,32,54,32,99,111,108,115,46,32,83,101,116,116,105,110,103,32,116,111,32,120,121,101,114,114,111,114,98,97,114,115,0,0,0,0,0,0,0,60,66,50,62,0,0,0,0,9,60,103,32,105,100,61,34,37,115,95,112,108,111,116,95,37,100,37,115,34,32,0,0,103,110,117,112,108,111,116,0,105,110,118,97,108,105,100,32,99,111,109,109,97,110,100,0,9,60,47,103,62,10,0,0,32,104,48,46,48,49,39,47,62,0,0,0,0,0,0,0,90,32,0,0,0,0,0,0,43,47,45,0,0,0,0,0,100,36,97,115,104,101,100,0,91,0,0,0,0,0,0,0,105,110,118,101,114,102,0,0,80,97,108,97,116,105,110,111,32,66,111,108,100,0,0,0,108,36,97,110,100,115,99,97,112,101,0,0,0,0,0,0,102,117,36,110,99,116,105,111,110,0,0,0,0,0,0,0,42,32,70,73,76,69,58,32,10,0,0,0,0,0,0,0,114,98,0,0,0,0,0,0,112,36,111,114,116,114,97,105,116,0,0,0,0,0,0,0,40,115,99,114,101,101,110,32,117,110,105,116,115,41,32,0,32,97,114,99,32,91,37,103,58,37,103,93,32,0,0,0,32,37,115,32,102,111,110,116,32,34,37,115,44,37,117,34,0,0,0,0,0,0,0,0,85,110,114,101,99,111,103,110,105,122,101,100,32,53,32,99,111,108,117,109,110,32,112,108,111,116,32,115,116,121,108,101,59,32,114,101,115,101,116,116,105,110,103,32,116,111,32,98,111,120,101,114,114,111,114,98,97,114,115,0,0,0,0,0,32,108,105,110,101,119,105,100,116,104,32,37,102,0,0,0,112,114,105,110,116,32,99,111,111,114,100,105,110,97,116,101,115,32,116,111,32,99,108,105,112,98,111,97,114,100,32,117,115,105,110,103,32,96,99,108,105,112,98,111,97,114,100,102,111,114,109,97,116,96,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,40,115,101,101,32,107,101,121,115,32,39,51,39,44,32,39,52,39,41,0,0,97,114,114,111,119,115,36,116,121,108,101,0,0,0,0,0,69,68,70,95,66,105,110,97,114,121,70,105,108,101,80,111,115,105,116,105,111,110,0,0,32,109,111,110,111,99,104,114,111,109,101,0,0,0,0,0,78,101,119,32,112,97,114,97,109,101,116,101,114,32,102,105,108,101,110,97,109,101,32,101,120,112,101,99,116,101,100,0,108,97,110,100,115,99,97,112,101,0,0,0,0,0,0,0,112,111,114,116,114,97,105,116,0,0,0,0,0,0,0,0,37,115,32,91,37,117,44,37,117,93,0,0,0,0,0,0,37,45,49,53,46,49,53,115,32,61,32,37,45,49,53,103,32,32,37,45,51,46,51,115,32,37,45,49,50,46,52,103,32,40,37,46,52,103,37,37,41,10,0,0,0,0,0,0,69,120,112,101,99,116,105,110,103,32,102,111,110,116,32,110,97,109,101,32,0,0,0,0,101,120,112,101,99,116,105,110,103,32,39,93,39,0,0,0,110,111,114,109,0,0,0,0,80,97,108,97,116,105,110,111,32,73,116,97,108,105,99,0,93,0,0,0,0,0,0,0,102,111,36,114,109,97,116,0,111,117,116,111,102,114,97,110,103,101,0,0,0,0,0,0,34,37,115,34,32,105,115,32,97,32,100,105,114,101,99,116,111,114,121,0,0,0,0,0,39,44,39,32,101,120,112,101,99,116,101,100,0,0,0,0,40,103,114,97,112,104,32,117,110,105,116,115,41,32,0,0,110,111,101,113,117,97,108,36,95,97,120,101,115,0,0,0,37,115,37,103,0,0,0,0,110,111,46,32,119,105,110,100,111,119,115,58,32,91,104,111,114,105,122,111,110,116,97,108,44,118,101,114,116,105,99,97,108,93,32,101,120,112,101,99,116,101,100,0,0,0,0,0,84,104,105,115,32,112,108,111,116,32,115,116,121,108,101,32,100,111,101,115,32,110,111,116,32,119,111,114,107,32,119,105,116,104,32,52,32,99,111,108,115,46,32,83,101,116,116,105,110,103,32,116,111,32,121,101,114,114,111,114,98,97,114,115,0,0,0,0,0,0,0,0,108,105,110,101,119,105,100,116,104,58,32,111,117,116,32,111,102,32,114,97,110,103,101,0,50,120,60,66,49,62,0,0,97,114,114,111,119,115,116,121,108,101,32,37,100,32,110,111,116,32,102,111,117,110,100,0,108,105,110,101,119,105,100,116,104,58,32,119,105,100,116,104,32,105,115,32,110,111,116,32,115,112,101,99,105,102,105,101,100,46,0,0,0,0,0,0,80,97,114,97,109,101,116,101,114,32,102,105,108,101,110,97,109,101,32,101,120,112,101,99,116,101,100,0,0,0,0,0,37,37,84,71,73,70,32,50,46,49,53,45,112,55,10,115,116,97,116,101,40,37,100,44,51,48,44,37,117,44,48,44,48,44,37,117,44,49,54,44,49,44,57,44,49,44,49,44,48,44,48,44,48,44,48,44,49,44,48,44,39,37,115,39,44,48,44,37,117,44,48,44,48,44,49,44,49,48,44,48,44,48,44,49,44,49,44,48,44,49,54,44,48,44,48,44,49,44,49,44,49,41,46,10,37,37,10,37,37,32,64,40,35,41,67,114,101,97,116,111,114,58,32,103,110,117,112,108,111,116,32,37,115,32,112,97,116,99,104,108,101,118,101,108,32,37,115,10,37,37,32,37,37,87,37,37,10,37,37,10,112,97,103,101,40,49,44,34,34,41,46,10,0,0,0,0,119,97,114,110,105,110,103,58,32,117,115,105,110,103,32,115,116,97,110,100,97,114,100,32,109,117,108,116,105,112,108,111,116,10,0,0,0,0,0,0,101,114,114,111,114,58,32,110,117,109,98,101,114,32,111,102,32,112,108,111,116,115,32,62,32,112,108,111,116,115,32,112,101,114,32,112,97,103,101,10,0,0,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,32,32,32,32,32,32,32,32,32,32,32,32,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,10,10,0,99,111,114,97,108,0,0,0,72,111,116,80,105,110,107,0,99,101,105,108,0,0,0,0,80,97,108,97,116,105,110,111,32,82,111,109,97,110,0,0,68,97,114,107,83,101,97,71,114,101,101,110,0,0,0,0,102,111,110,116,36,112,97,116,104,0,0,0,0,0,0,0,98,108,111,99,107,115,0,0,99,97,110,110,111,116,32,99,114,101,97,116,101,32,112,105,112,101,32,102,111,114,32,100,97,116,97,0,0,0,0,0,121,101,108,108,111,119,0,0,40,115,101,99,111,110,100,32,97,120,101,115,41,32,0,0,120,121,122,0,0,0,0,0,37,115,111,98,106,101,99,116,32,37,50,100,32,99,105,114,99,108,101,32,0,0,0,0,116,101,120,116,40,39,37,115,39,44,37,117,44,37,117,44,39,37,115,39,44,48,44,37,117,44,49,44,37,117,44,37,117,44,49,44,53,53,44,49,49,57,44,37,117,44,48,44,49,53,44,52,44,48,44,48,44,48,44,48,44,91,10,9,34,37,115,34,93,41,46,10,0,0,0,0,0,0,0,0,84,104,105,115,32,112,108,111,116,32,115,116,121,108,101,32,100,111,101,115,32,110,111,116,32,119,111,114,107,32,119,105,116,104,32,51,32,99,111,108,115,46,32,83,101,116,116,105,110,103,32,116,111,32,121,101,114,114,111,114,98,97,114,115,0,0,0,0,0,0,0,0,117,110,114,101,99,111,103,110,105,122,101,100,32,99,111,108,111,114,32,110,97,109,101,32,97,110,100,32,110,111,116,32,97,32,115,116,114,105,110,103,32,34,35,65,65,82,82,71,71,66,66,34,0,0,0,0,112,111,108,121,103,111,110,40,39,37,115,39,44,55,44,91,10,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,93,44,49,44,49,44,49,44,48,44,37,117,44,48,44,48,44,48,44,48,44,48,44,91,10,93,41,46,10,0,0,0,0,0,97,114,99,40,39,37,115,39,44,49,44,49,44,49,44,48,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,48,44,37,46,49,102,44,37,46,49,102,44,53,55,54,48,44,49,55,50,56,48,44,37,117,44,48,44,48,44,56,44,51,44,48,44,91,10,93,41,46,10,0,0,0,0,0,111,110,108,121,32,107,101,121,119,111,114,100,115,32,97,114,101,32,39,116,101,114,109,105,110,97,108,39,32,97,110,100,32,39,112,97,108,101,116,116,101,39,0,0,0,0,0,0,97,114,99,40,39,37,115,39,44,49,44,49,44,49,44,48,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,48,44,37,46,49,102,44,37,46,49,102,44,49,49,53,50,48,44,49,55,50,56,48,44,37,117,44,48,44,48,44,56,44,51,44,48,44,91,10,93,41,46,10,0,0,0,0,97,114,99,40,39,37,115,39,44,49,44,49,44,49,44,48,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,48,44,37,46,49,102,44,37,46,49,102,44,49,49,53,50,48,44,49,49,53,50,48,44,37,117,44,48,44,48,44,56,44,51,44,48,44,91,10,93,41,46,10,0,0,0,0,115,121,110,116,97,120,32,101,114,114,111,114,32,105,110,32,112,97,114,97,109,101,116,101,114,32,102,105,108,101,32,37,115,0,0,0,0,0,0,0,97,114,99,40,39,37,115,39,44,49,44,49,44,49,44,48,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,48,44,37,46,49,102,44,37,46,49,102,44,49,55,50,56,48,44,49,55,50,56,48,44,37,117,44,48,44,48,44,56,44,51,44,48,44,91,10,93,41,46,10,0,0,0,0,70,105,110,97,108,32,115,101,116,32,111,102,32,112,97,114,97,109,101,116,101,114,115,32,32,32,32,32,32,32,32,32,32,32,32,65,115,121,109,112,116,111,116,105,99,32,83,116,97,110,100,97,114,100,32,69,114,114,111,114,10,0,0,0,97,114,99,40,39,37,115,39,44,49,44,49,44,49,44,48,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,48,44,37,46,49,102,44,37,46,49,102,44,49,55,50,56,48,44,49,49,53,50,48,44,37,117,44,48,44,48,44,56,44,51,44,48,44,91,10,93,41,46,10,0,0,0,0,97,114,99,40,39,37,115,39,44,49,44,49,44,49,44,48,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,48,44,37,46,49,102,44,37,46,49,102,44,49,55,50,56,48,44,53,55,54,48,44,37,117,44,48,44,48,44,56,44,51,44,48,44,91,10,93,41,46,10,0,0,0,0,0,102,108,111,111,114,0,0,0,78,101,119,32,67,101,110,116,117,114,121,32,83,99,104,111,111,108,98,111,111,107,32,66,111,108,100,32,73,116,97,108,105,99,0,0,0,0,0,0,97,114,99,40,39,37,115,39,44,49,44,49,44,49,44,48,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,48,44,37,46,49,102,44,37,46,49,102,44,48,44,49,55,50,56,48,44,37,117,44,48,44,48,44,56,44,51,44,48,44,91,10,93,41,46,10,0,0,0,0,0,0,0,0,102,105,116,0,0,0,0,0,98,108,97,110,107,115,0,0,99,97,110,110,111,116,32,111,112,101,110,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,32,102,111,114,32,114,101,97,100,105,110,103,32,100,97,116,97,0,0,0,0,97,114,99,40,39,37,115,39,44,49,44,49,44,49,44,48,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,48,44,37,46,49,102,44,37,46,49,102,44,53,55,54,48,44,49,49,53,50,48,44,37,117,44,48,44,48,44,56,44,51,44,48,44,91,10,93,41,46,10,0,0,0,0,0,40,102,105,114,115,116,32,97,120,101,115,41,32,0,0,0,97,114,99,40,39,37,115,39,44,49,44,49,44,49,44,48,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,48,44,37,46,49,102,44,37,46,49,102,44,49,49,53,50,48,44,53,55,54,48,44,37,117,44,48,44,48,44,56,44,51,44,48,44,91,10,93,41,46,10,0,0,0,0,0,84,104,105,115,32,112,108,111,116,32,115,116,121,108,101,32,100,111,101,115,32,110,111,116,32,119,111,114,107,32,119,105,116,104,32,49,32,111,114,32,50,32,99,111,108,115,46,32,83,101,116,116,105,110,103,32,116,111,32,112,111,105,110,116,115,0,0,0,0,0,0,0,98,105,110,100,95,97,112,112,101,110,100,45,62,110,101,119,0,0,0,0,0,0,0,0,35,37,108,120,0,0,0,0,97,114,99,40,39,37,115,39,44,49,44,49,44,49,44,48,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,48,44,37,46,49,102,44,37,46,49,102,44,48,44,49,49,53,50,48,44,37,117,44,48,44,48,44,56,44,51,44,48,44,91,10,93,41,46,10,0,0,0,0,0,0,0,0,97,114,99,40,39,37,115,39,44,49,44,49,44,49,44,48,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,48,44,37,46,49,102,44,37,46,49,102,44,53,55,54,48,44,53,55,54,48,44,37,117,44,48,44,48,44,56,44,51,44,48,44,91,10,93,41,46,10,0,0,0,0,0,0,115,99,114,101,101,110,100,117,109,112,32,110,111,116,32,105,109,112,108,101,109,101,110,116,101,100,10,0,0,0,0,0,97,114,99,40,39,37,115,39,44,49,44,49,44,49,44,48,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,48,44,37,46,49,102,44,37,46,49,102,44,48,44,53,55,54,48,44,37,117,44,48,44,48,44,56,44,51,44,48,44,91,10,93,41,46,10,0,97,114,99,40,39,37,115,39,44,49,44,49,44,49,44,48,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,48,44,37,46,49,102,44,37,46,49,102,44,52,52,56,48,44,50,53,54,48,44,37,117,44,48,44,48,44,56,44,51,44,48,44,91,10,93,41,46,10,0,0,0,0,0,0,9,103,110,117,112,108,111,116,114,99,32,105,115,32,114,101,97,100,32,102,114,111,109,32,37,115,10,0,0,0,0,0,112,111,108,121,103,111,110,40,39,37,115,39,44,54,44,91,10,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,93,44,49,44,49,44,49,44,48,44,37,117]) -.concat([44,48,44,48,44,48,44,48,44,48,44,91,10,93,41,46,10,0,0,0,0,0,0,0,67,97,108,99,117,108,97,116,105,111,110,32,101,114,114,111,114,58,32,110,111,110,45,112,111,115,105,116,105,118,101,32,100,105,97,103,111,110,97,108,32,101,108,101,109,101,110,116,32,105,110,32,99,111,118,97,114,46,32,109,97,116,114,105,120,0,0,0,0,0,0,0,70,111,114,109,97,116,32,99,104,97,114,97,99,116,101,114,32,109,105,115,109,97,116,99,104,58,32,37,37,76,32,105,115,32,111,110,108,121,32,118,97,108,105,100,32,119,105,116,104,32,37,37,108,0,0,0,112,111,108,121,103,111,110,40,39,37,115,39,44,54,44,91,10,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,93,44,48,44,49,44,49,44,48,44,37,117,44,48,44,48,44,48,44,48,44,48,44,91,10,93,41,46,10,0,0,0,0,0,0,0,37,100,47,37,109,47,37,121,44,37,72,58,37,77,0,0,37,42,100,0,0,0,0,0,112,111,108,121,103,111,110,40,39,37,115,39,44,53,44,91,10,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,93,44,49,44,49,44,49,44,48,44,37,117,44,48,44,48,44,48,44,48,44,48,44,91,10,93,41,46,10,0,114,97,110,100,0,0,0,0,112,111,108,121,103,111,110,40,39,37,115,39,44,53,44,91,10,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,93,44,48,44,49,44,49,44,48,44,37,117,44,48,44,48,44,48,44,48,44,48,44,91,10,93,41,46,10,0,78,101,119,32,67,101,110,116,117,114,121,32,83,99,104,111,111,108,98,111,111,107,32,66,111,108,100,0,0,0,0,0,100,101,99,36,105,109,97,108,115,105,103,110,0,0,0,0,105,110,118,97,108,105,100,0,112,111,108,121,103,111,110,40,39,37,115,39,44,52,44,91,10,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,93,44,49,44,49,44,49,44,48,44,37,117,44,48,44,48,44,48,44,48,44,48,44,91,10,93,41,46,10,0,0,0,9,32,32,102,111,110,116,32,34,37,115,34,10,0,0,0,101,113,117,97,108,36,95,97,120,101,115,0,0,0,0,0,102,114,111,109,32,0,0,0,112,111,108,121,103,111,110,40,39,37,115,39,44,52,44,91,10,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,93,44,48,44,49,44,49,44,48,44,37,117,44,48,44,48,44,48,44,48,44,48,44,91,10,93,41,46,10,0,0,0,84,111,111,32,109,97,110,121,32,99,111,108,117,109,110,115,32,105,110,32,117,115,105,110,103,32,115,112,101,99,105,102,105,99,97,116,105,111,110,0,68,101,108,101,116,101,0,0,111,118,97,108,40,39,37,115,39,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,49,44,49,44,49,44,37,117,44,48,44,48,44,48,44,91,10,93,41,46,10,0,0,0,0,0,111,118,97,108,40,39,37,115,39,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,50,44,49,44,49,44,37,117,44,48,44,48,44,48,44,91,10,93,41,46,10,0,0,0,0,0,67,97,110,110,111,116,32,111,112,101,110,32,115,97,118,101,32,102,105,108,101,0,0,0,99,112,57,53,48,0,0,0,98,111,120,40,39,37,115,39,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,49,44,49,44,49,44,37,117,44,48,44,48,44,48,44,91,10,93,41,46,10,0,0,0,0,0,0,32,111,112,101,110,32,121,108,111,119,32,121,104,105,103,104,32,121,99,108,111,115,101,0,98,111,120,40,39,37,115,39,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,50,44,49,44,49,44,37,117,44,48,44,48,44,48,44,91,10,93,41,46,10,0,0,0,0,0,0,99,97,108,108,110,0,0,0,112,111,108,121,40,39,37,115,39,44,50,44,91,10,9,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,93,44,48,44,50,44,49,44,37,117,44,48,44,48,44,48,44,48,44,56,44,51,44,48,44,91,10,93,41,46,10,0,0,0,0,0,0,0,70,73,84,95,87,83,83,82,0,0,0,0,0,0,0,0,112,111,108,121,40,39,37,115,39,44,50,44,91,10,9,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,93,44,48,44,50,44,49,44,37,117,44,48,44,48,44,48,44,48,44,56,44,51,44,48,44,91,10,93,41,10,0,0,0,0,0,0,0,0,112,111,108,121,40,39,37,115,39,44,50,44,91,10,9,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,93,44,48,44,50,44,49,44,37,117,44,48,44,48,44,48,44,48,44,56,44,51,44,48,44,91,10,93,41,44,10,0,0,0,0,0,0,0,67,97,110,110,111,116,32,115,112,108,111,116,32,105,110,32,112,111,108,97,114,32,99,111,111,114,100,105,110,97,116,101,32,115,121,115,116,101,109,46,0,0,0,0,0,0,0,0,105,103,97,109,109,97,0,0,103,114,111,117,112,40,91,10,0,0,0,0,0,0,0,0,78,101,119,32,67,101,110,116,117,114,121,32,83,99,104,111,111,108,98,111,111,107,32,73,116,97,108,105,99,0,0,0,101,110,99,36,111,100,105,110,103,0,0,0,0,0,0,0,114,101,99,111,114,100,115,0,101,120,36,105,116,0,0,0,99,97,110,110,111,116,32,112,108,111,116,32,102,114,111,109,32,115,116,100,105,110,47,115,116,100,111,117,116,47,115,116,100,101,114,114,0,0,0,0,103,114,111,117,112,40,91,10,112,111,108,121,40,39,37,115,39,44,50,44,91,10,9,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,93,44,48,44,50,44,49,44,37,117,44,48,44,48,44,48,44,48,44,56,44,51,44,48,44,91,10,93,41,46,10,112,111,108,121,40,39,37,115,39,44,50,44,91,10,9,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,93,44,48,44,50,44,49,44,37,117,44,48,44,48,44,48,44,48,44,56,44,51,44,48,44,91,10,93,41,46,10,0,0,0,0,0,0,83,116,97,116,115,32,99,111,109,109,97,110,100,32,110,111,116,32,97,118,97,105,108,97,98,108,101,32,105,110,32,116,105,109,101,100,97,116,97,32,109,111,100,101,0,0,0,0,32,115,105,122,101,32,0,0,93,44,10,37,117,44,48,44,91,10,93,41,46,10,0,0,78,111,116,32,101,110,111,117,103,104,32,99,111,108,117,109,110,115,32,105,110,32,117,115,105,110,103,32,115,112,101,99,105,102,105,99,97,116,105,111,110,0,0,0,0,0,0,0,69,115,99,97,112,101,0,0,99,111,108,111,114,115,112,101,99,32,111,112,116,105,111,110,32,110,111,116,32,114,101,99,111,103,110,105,122,101,100,0,103,114,111,117,112,40,91,10,112,111,108,121,40,39,37,115,39,44,50,44,91,10,9,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,93,44,48,44,50,44,49,44,37,117,44,48,44,48,44,48,44,48,44,56,44,51,44,48,44,91,10,93,41,44,10,112,111,108,121,40,39,37,115,39,44,50,44,91,10,9,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,93,44,48,44,50,44,49,44,37,117,44,48,44,48,44,48,44,48,44,56,44,51,44,48,44,91,10,93,41,10,0,0,0,0,0,0,0,112,111,108,121,40,39,37,115,39,44,50,44,91,10,9,37,46,49,102,44,37,46,49,102,44,37,46,49,102,44,37,46,49,102,93,44,48,44,49,44,49,44,37,117,44,48,44,48,44,48,44,48,44,56,44,51,44,48,44,91,10,93,41,46,10,0,0,0,0,0,0,0,112,111,108,121,40,39,37,115,39,44,37,100,44,91,10,9,37,117,44,37,117,44,37,117,44,37,117,93,44,49,44,37,117,44,49,44,37,117,44,48,44,48,44,37,117,44,48,44,56,44,51,44,48,44,91,10,93,41,46,10,0,0,0,0,37,117,44,37,117,93,44,48,44,37,117,44,49,44,37,117,44,48,44,48,44,37,117,44,48,44,56,44,51,44,48,44,91,10,93,41,46,10,0,0,112,111,108,121,40,39,37,115,39,44,37,100,44,91,10,9,0,0,0,0,0,0,0,0,91,110,111,110,101,93,0,0,70,73,84,95,83,84,68,70,73,84,0,0,0,0,0,0,35,37,46,50,120,37,46,50,120,37,46,50,120,0,0,0,93,44,37,100,44,49,44,48,44,48,44,37,117,44,48,44,48,44,48,44,48,44,91,10,93,41,46,10,0,0,0,0,118,111,105,103,116,0,0,0,37,117,44,37,117,0,0,0,78,101,119,32,67,101,110,116,117,114,121,32,83,99,104,111,111,108,98,111,111,107,32,82,111,109,97,110,0,0,0,0,100,117,36,109,109,121,0,0,37,115,9,37,108,100,10,0,105,110,118,97,108,105,100,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,32,105,110,116,101,103,101,114,0,10,9,0,0,0,0,0,0,9,32,0,0,0,0,0,0,116,36,105,109,101,0,0,0,99,101,110,116,101,114,32,0,37,117,44,37,117,44,0,0,82,101,116,117,114,110,0,0,112,97,108,101,116,116,101,32,102,114,97,99,116,105,111,110,32,111,117,116,32,111,102,32,114,97,110,103,101,0,0,0,112,111,108,121,103,111,110,40,39,37,115,39,44,37,100,44,91,10,9,0,0,0,0,0,99,111,110,116,111,117,114,32,116,114,105,100,105,97,103,32,109,0,0,0,0,0,0,0,119,104,105,116,101,0,0,0,110,111,32,112,114,101,118,105,111,117,115,32,112,108,111,116,0,0,0,0,0,0,0,0,105,36,110,116,101,114,97,99,116,105,118,101,0,0,0,0,98,108,45,105,110,116,101,114,112,32,98,101,116,119,101,101,110,32,115,99,97,110,0,0,78,101,101,100,32,102,117,108,108,32,117,115,105,110,103,32,115,112,101,99,32,102,111,114,32,120,32,116,105,109,101,32,100,97,116,97,0,0,0,0,85,110,100,101,102,105,110,101,100,32,118,97,108,117,101,32,116,104,105,114,100,32,99,111,108,111,114,32,100,117,114,105,110,103,32,102,117,110,99,116,105,111,110,32,101,118,97,108,117,97,116,105,111,110,0,0,112,36,101,114,108,116,107,0,108,97,98,101,108,112,111,105,110,116,32,108,97,98,101,108,0,0,0,0,0,0,0,0,105,110,116,101,114,97,99,116,105,118,101,0,0,0,0,0,45,100,0,0,0,0,0,0,70,73,84,95,78,68,70,0,112,101,114,108,116,107,0,0,37,115,32,37,115,0,0,0,105,98,101,116,97,0,0,0,105,102,32,123,91,115,116,114,105,110,103,32,108,101,110,103,116,104,32,36,121,50,109,93,62,48,125,32,123,112,117,116,115,32,34,32,36,121,50,109,34,125,32,101,108,115,101,32,123,112,117,116,115,32,34,32,91,101,120,112,114,32,48,46,53,42,40,36,121,50,115,43,36,121,50,101,41,93,34,125,10,0,0,0,0,0,0,0,72,101,108,118,101,116,105,99,97,32,78,97,114,114,111,119,32,66,111,108,100,32,79,98,108,105,113,117,101,0,0,0,100,103,36,114,105,100,51,100,0,0,0,0,0,0,0,0,32,32,77,101,100,105,97,110,58,32,32,32,37,115,32,10,0,0,0,0,0,0,0,0,116,117,114,110,105,110,103,32,114,117,108,101,114,32,111,102,102,46,10,0,0,0,0,0,100,97,116,97,102,105,108,101,32,108,105,110,101,32,98,117,102,102,101,114,0,0,0,0,105,102,32,123,91,115,116,114,105,110,103,32,108,101,110,103,116,104,32,36,120,50,109,93,62,48,125,32,123,112,117,116,115,32,45,110,111,110,101,119,108,105,110,101,32,34,32,36,120,50,109,34,125,32,101,108,115,101,32,123,112,117,116,115,32,45,110,111,110,101,119,108,105,110,101,32,34,32,91,101,120,112,114,32,48,46,53,42,40,36,120,50,115,43,36,120,50,101,41,93,34,125,10,0,41,10,0,0,0,0,0,0,110,111,119,114,105,36,116,101,98,97,99,107,0,0,0,0,105,102,32,123,91,115,116,114,105,110,103,32,108,101,110,103,116,104,32,36,121,49,109,93,62,48,125,32,123,112,117,116,115,32,45,110,111,110,101,119,108,105,110,101,32,34,32,36,121,49,109,34,125,32,101,108,115,101,32,123,112,117,116,115,32,45,110,111,110,101,119,108,105,110,101,32,34,32,91,101,120,112,114,32,48,46,53,42,40,36,121,49,115,43,36,121,49,101,41,93,34,125,10,0,115,101,116,32,0,0,0,0,73,110,118,97,108,105,100,32,115,117,98,115,116,105,116,117,116,105,111,110,32,36,37,99,0,0,0,0,0,0,0,0,37,105,32,37,105,32,116,114,97,110,115,108,97,116,101,32,37,105,32,37,105,32,115,99,97,108,101,32,48,32,115,101,116,108,105,110,101,119,105,100,116,104,10,0,0,0,0,0,115,112,108,105,110,101,32,104,101,108,112,32,118,101,99,116,111,114,0,0,0,0,0,0,75,80,95,69,110,116,101,114,0,0,0,0,0,0,0,0,101,120,112,101,99,116,101,100,32,112,97,108,101,116,116,101,32,102,114,97,99,116,105,111,110,0,0,0,0,0,0,0,105,102,32,123,91,115,116,114,105,110,103,32,108,101,110,103,116,104,32,36,120,49,109,93,62,48,125,32,123,112,117,116,115,32,45,110,111,110,101,119,108,105,110,101,32,34,32,36,120,49,109,34,125,32,101,108,115,101,32,123,112,117,116,115,32,45,110,111,110,101,119,108,105,110,101,32,34,32,91,101,120,112,114,32,48,46,53,42,40,36,120,49,115,43,36,120,49,101,41,93,34,125,10,0,105,110,116,101,114,110,97,108,32,101,114,114,111,114,58,32,102,95,115,117,109,32,99,111,117,108,100,32,110,111,116,32,97,99,99,101,115,115,32,115,117,109,109,97,116,105,111,110,32,99,111,101,102,102,105,99,105,101,110,116,32,102,117,110,99,116,105,111,110,0,0,0,117,115,101,114,95,103,110,117,112,108,111,116,95,99,111,111,114,100,105,110,97,116,101,115,32,36,119,105,110,32,36,105,100,32,36,120,49,115,32,36,121,49,115,32,36,120,50,115,32,36,121,50,115,32,36,120,49,101,32,36,121,49,101,32,36,120,50,101,32,36,121,50,101,32,36,120,49,109,32,36,121,49,109,32,36,120,50,109,32,36,121,50,109,10,0,0,73,110,116,101,114,110,97,108,32,101,114,114,111,114,32,45,32,114,101,102,114,101,115,104,32,111,102,32,117,110,107,110,111,119,110,32,112,108,111,116,32,116,121,112,101,0,0,0,115,101,116,32,105,100,32,91,36,119,105,110,32,102,105,110,100,32,119,105,116,104,116,97,103,32,99,117,114,114,101,110,116,93,10,0,0,0,0,0,85,110,100,101,102,105,110,101,100,32,118,97,108,117,101,32,115,101,99,111,110,100,32,99,111,108,111,114,32,100,117,114,105,110,103,32,102,117,110,99,116,105,111,110,32,101,118,97,108,117,97,116,105,111,110,0,105,102,32,123,40,91,108,108,101,110,103,116,104,32,91,105,110,102,111,32,99,111,109,109,97,110,100,115,32,117,115,101,114,95,103,110,117,112,108,111,116,95,99,111,111,114,100,105,110,97,116,101,115,93,93,41,125,32,123,10,0,0,0,0,112,114,111,99,32,103,110,117,112,108,111,116,95,120,121,32,123,119,105,110,32,120,49,115,32,121,49,115,32,120,50,115,32,121,50,115,32,120,49,101,32,121,49,101,32,120,50,101,32,121,50,101,32,120,49,109,32,121,49,109,32,120,50,109,32,121,50,109,125,32,123,10,0,0,0,0,0,0,0,0,118,97,114,105,97,110,99,101,32,111,102,32,114,101,115,105,100,117,97,108,115,32,40,114,101,100,117,99,101,100,32,99,104,105,115,113,117,97,114,101,41,32,61,32,87,83,83,82,47,110,100,102,32,32,32,58,32,37,103,10,10,0,0,0,114,101,116,117,114,110,32,123,37,102,32,37,102,32,37,102,32,37,102,32,37,102,32,37,102,32,37,102,32,37,102,125,10,0,0,0,0,0,0,0,112,114,111,99,32,103,110,117,112,108,111,116,95,97,120,105,115,114,97,110,103,101,115,32,123,125,32,123,10,0,0,0,108,103,97,109,109,97,0,0,114,101,116,117,114,110,32,123,37,100,32,37,100,32,37,100,32,37,100,125,10,0,0,0,72,101,108,118,101,116,105,99,97,32,78,97,114,114,111,119,32,66,111,108,100,0,0,0,100,97,116,97,36,102,105,108,101,0,0,0,0,0,0,0,32,32,81,117,97,114,116,105,108,101,58,32,37,115,32,10,0,0,0,0,0,0,0,0,112,114,111,99,32,103,110,117,112,108,111,116,95,112,108,111,116,97,114,101,97,32,123,125,32,123,10,0,0,0,0,0,100,117,112,108,105,99,97,116,101,100,32,111,114,32,99,111,110,116,114,97,100,105,99,116,105,110,103,32,97,114,103,117,109,101,110,116,115,32,105,110,32,100,97,116,97,102,105,108,101,32,111,112,116,105,111,110,115,0,0,0,0,0,0,0,44,32,0,0,0,0,0,0,119,114,36,105,116,101,98,97,99,107,0,0,0,0,0,0,125,10,0,0,0,0,0,0,9,0,0,0,0,0,0,0,105,110,116,101,114,110,97,108,32,101,114,114,111,114,32,58,32,100,102,95,114,101,97,100,108,105,110,101,32,114,101,116,117,114,110,101,100,32,37,100,32,58,32,100,97,116,97,102,105,108,101,32,108,105,110,101,32,37,100,0,0,0,0,0,84,97,98,0,0,0,0,0,112,114,105,110,116,32,34,92,110,34,10,0,0,0,0,0,105,102,32,40,108,101,110,103,116,104,40,36,121,50,109,41,62,48,41,32,123,112,114,105,110,116,32,34,32,36,121,50,109,34,59,125,32,101,108,115,101,32,123,112,114,105,110,116,32,34,32,34,44,32,48,46,53,42,40,36,121,50,115,43,36,121,50,101,41,59,125,10,0,0,0,0,0,0,0,0,99,97,110,110,111,116,32,114,101,102,114,101,115,104,32,102,114,111,109,32,116,104,105,115,32,115,116,97,116,101,46,32,116,114,121,105,110,103,32,102,117,108,108,32,114,101,112,108,111,116,0,0,0,0,0,0,105,102,32,40,108,101,110,103,116,104,40,36,120,50,109,41,62,48,41,32,123,112,114,105,110,116,32,34,32,36,120,50,109,34,59,125,32,101,108,115,101,32,123,112,114,105,110,116,32,34,32,34,44,32,48,46,53,42,40,36,120,50,115,43,36,120,50,101,41,59,125,10,0,0,0,0,0,0,0,0,85,110,100,101,102,105,110,101,100,32,118,97,108,117,101,32,102,105,114,115,116,32,99,111,108,111,114,32,100,117,114,105,110,103,32,102,117,110,99,116,105,111,110,32,101,118,97,108,117,97,116,105,111,110,0,0,105,102,32,40,108,101,110,103,116,104,40,36,121,49,109,41,62,48,41,32,123,112,114,105,110,116,32,34,32,36,121,49,109,34,59,125,32,101,108,115,101,32,123,112,114,105,110,116,32,34,32,34,44,32,48,46,53,42,40,36,121,49,115,43,36,121,49,101,41,59,125,10,0,0,0,0,0,0,0,0,105,102,32,40,108,101,110,103,116,104,40,36,120,49,109,41,62,48,41,32,123,112,114,105,110,116,32,34,32,36,120,49,109,34,59,125,32,101,108,115,101,32,123,112,114,105,110,116,32,34,32,34,44,32,48,46,53,42,40,36,120,49,115,43,36,120,49,101,41,59,125,10,0,0,0,0,0,0,0,0,79,117,116,114,97,110,103,101,100,32,97,110,100,32,117,110,100,101,102,105,110,101,100,32,100,97,116,97,112,111,105,110,116,115,32,97,114,101,32,111,109,105,116,116,101,100,32,102,114,111,109,32,116,104,101,32,115,117,114,102,97,99,101,46,10,0,0,0,0,0,0,0,114,109,115,32,111,102,32,114,101,115,105,100,117,97,108,115,32,32,32,32,32,32,40,70,73,84,95,83,84,68,70,73,84,41,32,61,32,115,113,114,116,40,87,83,83,82,47,110,100,102,41,32,32,32,32,58,32,37,103,10,0,0,0,0,125,32,101,108,115,101,32,123,10,0,0,0,0,0,0,0,58,10,0,0,0,0,0,0,117,115,101,114,95,103,110,117,112,108,111,116,95,99,111,111,114,100,105,110,97,116,101,115,32,36,119,105,110,44,32,36,105,100,44,32,36,120,49,115,44,32,36,121,49,115,44,32,36,120,50,115,44,32,36,121,50,115,44,32,36,120,49,101,44,32,36,121,49,101,44,32,36,120,50,101,44,32,36,121,50,101,44,32,36,120,49,109,44,32,36,121,49,109,44,32,36,120,50,109,44,32,36,121,50,109,10,0,0,0,0,0,103,97,109,109,97,0,0,0,109,121,32,36,105,100,32,61,32,36,119,105,110,45,62,102,105,110,100,40,39,119,105,116,104,116,97,103,39,44,32,39,99,117,114,114,101,110,116,39,41,59,10,0,0,0,0,0,72,101,108,118,101,116,105,99,97,32,78,97,114,114,111,119,32,79,98,108,105,113,117,101,0,0,0,0,0,0,0,0,100,97,36,116,97,0,0,0,32,32,77,97,120,105,109,117,109,58,32,32,37,115,32,91,37,42,108,100,93,10,0,0,105,102,32,40,100,101,102,105,110,101,100,32,38,117,115,101,114,95,103,110,117,112,108,111,116,95,99,111,111,114,100,105,110,97,116,101,115,41,32,123,10,0,0,0,0,0,0,0,110,111,97,117,116,111,36,115,99,97,108,101,0,0,0,0,109,121,32,40,36,119,105,110,44,32,36,120,49,115,44,32,36,121,49,115,44,32,36,120,50,115,44,32,36,121,50,115,44,32,36,120,49,101,44,32,36,121,49,101,44,32,36,120,50,101,44,32,36,121,50,101,44,32,36,120,49,109,44,32,36,121,49,109,44,32,36,120,50,109,44,32,36,121,50,109,41,32,61,32,64,95,59,10,0,0,0,0,0,0,0,0,37,115,111,98,106,101,99,116,32,37,50,100,32,114,101,99,116,32,0,0,0,0,0,0,78,111,116,32,101,110,111,117,103,104,32,99,111,108,117,109,110,115,32,102,111,114,32,118,97,114,105,97,98,108,101,32,99,111,108,111,114,0,0,0,66,97,99,107,83,112,97,99,101,0,0,0,0,0,0,0,101,120,112,101,99,116,101,100,32,99,98,32,118,97,108,117,101,0,0,0,0,0,0,0,115,117,98,32,103,110,117,112,108,111,116,95,120,121,32,123,10,0,0,0,0,0,0,0,114,101,116,117,114,110,32,40,37,102,44,32,37,102,44,32,37,102,44,32,37,102,44,32,37,102,44,32,37,102,44,32,37,102,44,32,37,102,41,59,10,0,0,0,0,0,0,0,110,111,32,97,99,116,105,118,101,32,112,108,111,116,59,32,99,97,110,110,111,116,32,114,101,102,114,101,115,104,0,0,115,117,98,32,103,110,117,112,108,111,116,95,97,120,105,115,114,97,110,103,101,115,32,123,10,0,0,0,0,0,0,0,105,110,32,108,97,98,101,108,95,119,105,100,116,104,0,0,37,115,58,37,100,32,111,111,111,112,115,58,32,85,110,107,110,111,119,110,32,99,111,108,111,114,77,111,100,101,32,39,37,99,39,46,10,0,0,0,114,101,116,117,114,110,32,40,37,100,44,32,37,100,44,32,37,100,44,32,37,100,41,59,10,0,0,0,0,0,0,0,115,117,98,32,103,110,117,112,108,111,116,95,112,108,111,116,97,114,101,97,32,123,10,0,100,101,103,114,101,101,115,32,111,102,32,102,114,101,101,100,111,109,32,32,32,32,40,70,73,84,95,78,68,70,41,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,58,32,37,100,10,0,0,0,0,125,59,10,0,0,0,0,0,112,114,111,99,32,103,110,117,112,108,111,116,32,99,97,110,32,123,10,36,99,97,110,32,100,101,108,101,116,101,32,97,108,108,10,115,101,116,32,99,109,120,32,91,101,120,112,114,32,91,119,105,110,102,111,32,119,105,100,116,104,32,36,99,97,110,93,45,50,42,91,36,99,97,110,32,99,103,101,116,32,45,98,111,114,100,101,114,93,45,50,42,91,36,99,97,110,32,99,103,101,116,32,45,104,105,103,104,108,105,103,104,116,116,104,105,99,107,110,101,115,115,93,93,10,105,102,32,123,36,99,109,120,32,60,61,32,49,125,32,123,115,101,116,32,99,109,120,32,91,36,99,97,110,32,99,103,101,116,32,45,119,105,100,116,104,93,125,10,115,101,116,32,99,109,121,32,91,101,120,112,114,32,91,119,105,110,102,111,32,104,101,105,103,104,116,32,36,99,97,110,93,45,50,42,91,36,99,97,110,32,99,103,101,116,32,45,98,111,114,100,101,114,93,45,50,42,91,36,99,97,110,32,99,103,101,116,32,45,104,105,103,104,108,105,103,104,116,116,104,105,99,107,110,101,115,115,93,93,10,105,102,32,123,36,99,109,121,32,60,61,32,49,125,32,123,115,101,116,32,99,109,121,32,91,36,99,97,110,32,99,103,101,116,32,45,104,101,105,103,104,116,93,125,10,0,0,0,0,0,0,0,101,114,102,99,0,0,0,0,115,117,98,32,123,10,109,121,40,36,99,97,110,41,32,61,32,64,95,59,10,36,99,97,110,45,62,100,101,108,101,116,101,40,39,97,108,108,39,41,59,10,109,121,32,36,99,109,120,32,61,32,36,99,97,110,45,62,119,105,100,116,104,32,45,32,50,32,42,32,36,99,97,110,45,62,99,103,101,116,40,45,98,111,114,100,101,114,41,32,45,32,50,32,42,32,36,99,97,110,45,62,99,103,101,116,40,45,104,105,103,104,108,105,103,104,116,116,104,105,99,107,110,101,115,115,41,59,10,105,102,32,40,36,99,109,120,32,60,61,32,49,41,32,123,10,36,99,109,120,32,61,32,40,36,99,97,110,45,62,99,103,101,116,40,45,119,105,100,116,104,41,41,59,10,125,10,109,121,32,36,99,109,121,32,61,32,36,99,97,110,45,62,104,101,105,103,104,116,32,45,32,50,32,42,32,36,99,97,110,45,62,99,103,101,116,40,45,98,111,114,100,101,114,41,32,45,32,50,32,42,32,36,99,97,110,45,62,99,103,101,116,40,45,104,105,103,104,108,105,103,104,116,116,104,105,99,107,110,101,115,115,41,59,10,105,102,32,40,36,99,109,121,32,60,61,32,49,41,32,123,10,36,99,109,121,32,61,32,40,36,99,97,110,45,62,99,103,101,116,40,45,104,101,105,103,104,116,41,41,59,10,125,10,0,0,0,0,0,0,72,101,108,118,101,116,105,99,97,32,78,97,114,114,111,119,0,0,0,0,0,0,0,0,99,111,36,110,116,111,117,114,115,0,0,0,0,0,0,0,32,32,77,105,110,105,109,117,109,58,32,32,37,115,32,91,37,42,108,100,93,10,0,0,34,10,0,0,0,0,0,0,118,111,108,97,116,105,108,101,0,0,0,0,0,0,0,0,32,123,125,0,0,0,0,0,103,114,97,112,104,32,0,0,71,80,95,76,65,83,84,95,75,69,89,0,0,0,0,0,99,98,0,0,0,0,0,0,93,32,60,66,117,116,116,111,110,62,32,34,103,110,117,112,108,111,116,95,120,121,32,37,37,87,32,37,102,32,37,102,32,37,102,32,37,102,32,37,102,32,37,102,32,37,102,32,37,102,0,0,0,0,0,0,93,41,59,10,0,0,0,0,100,97,116,97,102,105,108,101,32,110,97,109,101,0,0,0,112,114,105,110,116,32,99,117,114,114,101,110,116,32,100,105,114,0,0,0,0,0,0,0,32,34,34,0,0,0,0,0,32,37,102,0,0,0,0,0,32,34,34,44,0,0,0,0,10,72,109,109,109,109,46,46,46,46,32,83,117,109,32,111,102,32,115,113,117,97,114,101,100,32,114,101,115,105,100,117,97,108,115,32,105,115,32,122,101,114,111,46,32,67,97,110,39,116,32,99,111,109,112,117,116,101,32,101,114,114,111,114,115,46,10,10,0,0,0,0,32,37,102,44,0,0,0,0,44,32,39,60,66,117,116,116,111,110,62,39,32,61,62,32,91,92,38,103,110,117,112,108,111,116,95,120,121,44,32,37,102,44,32,37,102,44,32,37,102,44,32,37,102,44,32,37,102,44,32,37,102,44,32,37,102,44,32,37,102,44,0,0,101,114,102,0,0,0,0,0,112,111,112,32,49,0,0,0,36,99,97,110,32,99,114,101,97,116,101,32,108,105,110,101,32,91,101,120,112,114,32,36,99,109,120,32,42,32,37,100,32,47,49,48,48,48,93,32,91,101,120,112,114,32,36,99,109,121,32,42,32,37,100,32,47,49,48,48,48,93,32,91,101,120,112,114,32,36,99,109,120,32,42,32,37,100,32,47,49,48,48,48,93,32,91,101,120,112,114,32,36,99,109,121,32,42,32,37,100,32,47,49,48,48,48,93,32,45,102,105,108,108,32,37,115,32,45,119,105,100,116,104,32,37,102,32,45,99,97,112,115,116,121,108,101,32,114,111,117,110,100,10,0,0,0,0,0,0,0,0,72,101,108,118,101,116,105,99,97,32,66,111,108,100,32,79,98,108,105,113,117,101,0,0,99,110,36,116,114,112,97,114,97,109,0,0,0,0,0,0,32,32,67,79,71,58,32,32,32,32,32,32,37,115,32,37,115,10,0,0,0,0,0,0,36,99,97,110,45,62,99,114,101,97,116,101,76,105,110,101,40,36,99,109,120,32,42,32,37,100,32,47,32,49,48,48,48,44,32,36,99,109,121,32,42,32,37,100,32,47,32,49,48,48,48,44,32,36,99,109,120,32,42,32,37,100,32,47,32,49,48,48,48,44,32,36,99,109,121,32,42,32,37,100,32,47,32,49,48,48,48,44,32,45,102,105,108,108,32,61,62,32,113,123,37,115,125,44,32,45,119,105,100,116,104,32,61,62,32,37,102,44,32,45,99,97,112,115,116,121,108,101,32,61,62,32,113,123,114,111,117,110,100,125,41,0,0,0,117,36,115,105,110,103,0,0,9,32,32,101,120,112,108,105,99,105,116,32,108,105,115,116,32,40,0,0,0,0,0,0,36,99,97,110,32,98,105,110,100,32,91,10,0,0,0,0,37,115,32,37,115,37,103,44,32,37,115,37,103,44,32,37,115,37,103,44,32,37,115,37,103,10,0,0,0,0,0,0,78,111,116,32,101,110,111,117,103,104,32,99,111,108,117,109,110,115,32,102,111,114,32,116,104,105,115,32,115,116,121,108,101,0,0,0,0,0,0,0,66,117,116,116,111,110,49,0,112,97,108,101,116,116,101,32,122,32,110,111,116,32,112,111,115,115,105,98,108,101,32,104,101,114,101,0,0,0,0,0,36,99,97,110,45,62,98,105,110,100,40,0,0,0,0,0,99,121,97,110,0,0,0,0,60,115,116,100,101,114,114,62,0,0,0,0,0,0,0,0,109,97,103,101,110,116,97,0,50,42,120,32,45,32,49,0,98,114,111,119,110,0,0,0,103,114,101,101,110,0,0,0,37,45,49,53,46,49,53,115,32,61,32,37,45,49,53,103,10,0,0,0,0,0,0,0,98,108,117,101,0,0,0,0,114,101,100,0,0,0,0,0,98,101,115,121,49,0,0,0,103,114,97,121,0,0,0,0,72,101,108,118,101,116,105,99,97,32,66,111,108,100,0,0,99,36,108,105,112,0,0,0,32,32,77,97,120,105,109,117,109,58,32,32,37,115,32,91,37,42,108,100,32,37,108,100,32,93,10,0,0,0,0,0,98,108,97,99,107,0,0,0,116,104,114,117,36,0,0,0,117,110,107,110,111,119,110,32,116,105,99,100,101,102,32,116,121,112,101,32,105,110,32,115,104,111,119,95,116,105,99,100,101,102,40,41,0,0,0,0,101,118,97,108,32,36,99,97,110,32,99,114,101,97,116,101,32,116,101,120,116,32,91,101,120,112,114,32,36,99,109,120,32,42,32,37,100,32,47,49,48,48,48,93,32,91,101,120,112,114,32,36,99,109,121,32,42,32,37,100,32,47,49,48,48,48,93,32,45,116,101,120,116,32,92,123,37,115,92,125,32,45,102,105,108,108,32,37,115,32,45,97,110,99,104,111,114,32,37,115,32,91,101,120,112,114,32,91,105,110,102,111,32,101,120,105,115,116,115,32,102,111,110,116,93,63,34,45,102,111,110,116,32,92,36,102,111,110,116,34,58,123,125,93,10,0,0,0,0,0,0,0,32,112,111,105,110,116,105,110,116,101,114,118,97,108,32,37,100,0,0,0,0,0,0,0,84,111,111,32,109,97,110,121,32,117,115,105,110,103,32,115,112,101,99,115,32,102,111,114,32,116,104,105,115,32,115,116,121,108,101,0,0,0,0,0,67,108,111,115,101,0,0,0,84,75,95,112,117,116,95,116,101,120,116,58,32,113,117,111,116,101,100,32,115,116,114,105,110,103,0,0,0,0,0,0,36,99,97,110,45,62,99,114,101,97,116,101,84,101,120,116,40,36,99,109,120,32,42,32,37,100,32,47,32,49,48,48,48,44,32,36,99,109,121,32,42,32,37,100,32,47,32,49,48,48,48,44,32,45,116,101,120,116,32,61,62,32,113,123,37,115,125,44,32,45,102,105,108,108,32,61,62,32,113,123,37,115,125,44,32,45,97,110,99,104,111,114,32,61,62,32,39,37,115,39,44,32,40,100,101,102,105,110,101,100,32,36,102,111,110,116,32,63,32,40,45,102,111,110,116,32,61,62,32,36,102,111,110,116,41,32,58,32,40,41,41,41,59,10,0,0,0,0,0,0,0,0,60,115,116,100,111,117,116,62,0,0,0,0,0,0,0,0,99,101,110,116,101,114,0,0,50,32,109,117,108,32,49,32,115,117,98,0,0,0,0,0,110,101,119,32,112,97,114,97,109,101,116,101,114,32,102,105,108,101,32,37,115,32,99,111,117,108,100,32,110,111,116,32,98,101,32,99,114,101,97,116,101,100,0,0,0,0,0,0,93,10,0,0,0,0,0,0,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,32,10,10,0,0,0,0,0,0,32,45,115,105,122,101,32,37,100,0,0,0,0,0,0,0,115,101,116,32,102,111,110,116,32,91,102,111,110,116,32,99,114,101,97,116,101,32,45,102,97,109,105,108,121,32,37,115,0,0,0,0,0,0,0,0,98,101,115,121,48,0,0,0,41,59,10,125,10,0,0,0,72,101,108,118,101,116,105,99,97,32,79,98,108,105,113,117,101,0,0,0,0,0,0,0,99,108,36,97,98,101,108,0,32,32,77,105,110,105,109,117,109,58,32,32,37,115,32,91,37,42,108,100,32,37,108,100,32,93,10,0,0,0,0,0,44,32,45,115,105,122,101,32,61,62,32,37,100,0,0,0,101,118,36,101,114,121,0,0,32,32,110,111,32,97,117,116,111,45,103,101,110,101,114,97,116,101,100,32,116,105,99,115,10,0,0,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,39,91,39,32,111,114,32,39,114,101,115,116,111,114,101,39,0,0,0,0,0,0,105,102,32,40,36,99,97,110,45,62,99,97,110,40,39,102,111,110,116,67,114,101,97,116,101,39,41,41,32,123,10,36,102,111,110,116,32,61,32,36,99,97,110,45,62,102,111,110,116,67,114,101,97,116,101,40,45,102,97,109,105,108,121,32,61,62,32,113,123,37,115,125,0,0,0,0,0,0,0,0,32,112,111,105,110,116,115,105,122,101,32,37,46,51,102,0,118,97,114,99,111,108,111,114,32,97,114,114,97,121,0,0,70,49,50,0,0,0,0,0,111,110,108,121,32,116,99,32,108,116,32,60,110,62,32,112,111,115,115,105,98,108,101,32,104,101,114,101,0,0,0,0,99,97,116,99,104,32,123,117,110,115,101,116,32,36,102,111,110,116,125,10,0,0,0,0,117,110,100,101,102,32,36,102,111,110,116,59,10,0,0,0,110,111,36,114,111,116,97,116,101,0,0,0,0,0,0,0,50,42,120,32,45,32,48,46,53,0,0,0,0,0,0,0,114,111,116,36,97,116,101,0,9,108,111,97,100,112,97,116,104,32,105,115,32,101,109,112,116,121,10,0,0,0,0,0,115,105,36,122,101,0,0,0,70,105,110,97,108,32,115,101,116,32,111,102,32,112,97,114,97,109,101,116,101,114,115,32,10,0,0,0,0,0,0,0,114,36,111,109,97,110,0,0,37,48,42,100,0,0,0,0,99,36,111,117,114,105,101,114,0,0,0,0,0,0,0,0,98,101,115,106,49,0,0,0,32,110,111,114,111,116,97,116,101,0,0,0,0,0,0,0,72,101,108,118,101,116,105,99,97,0,0,0,0,0,0,0,98,111,120,36,119,105,100,116,104,0,0,0,0,0,0,0,32,32,83,117,109,32,83,113,46,58,32,32,37,115,10,0,115,105,122,101,32,37,46,50,102,105,110,44,32,37,46,50,102,105,110,32,0,0,0,0,105,36,110,100,101,120,0,0,32,117,110,116,105,108,32,0,115,105,122,101,32,37,46,50,102,99,109,44,32,37,46,50,102,99,109,32,0,0,0,0,32,112,111,105,110,116,115,105,122,101,32,100,101,102,97,117,108,116,0,0,0,0,0,0,65,108,108,32,112,111,105,110,116,115,32,105,110,32,104,105,115,116,111,103,114,97,109,32,85,78,68,69,70,73,78,69,68,0,0,0,0,0,0,0,70,49,49,0,0,0,0,0,105,108,108,101,103,97,108,32,108,105,110,101,116,121,112,101,0,0,0,0,0,0,0,0,114,111,109,97,110,0,0,0,99,111,117,114,105,101,114,0,99,112,56,53,50,0,0,0,37,115,32,37,100,0,0,0,49,32,121,50,0,0,0,0,50,32,109,117,108,32,48,46,53,32,115,117,98,0,0,0,40,100,111,99,117,109,101,110,116,32,115,112,101,99,105,102,105,99,32,102,111,110,116,41,0,0,0,0,0,0,0,0,73,110,32,116,104,105,115,32,100,101,103,101,110,101,114,97,116,101,32,99,97,115,101,44,32,97,108,108,32,101,114,114,111,114,115,32,97,114,101,32,122,101,114,111,32,98,121,32,100,101,102,105,110,105,116,105,111,110,46,10,10,0,0,0,99,109,116,116,0,0,0,0,37,37,32,71,78,85,80,76,79,84,58,32,76,97,84,101,88,32,112,105,99,116,117,114,101,10,92,115,101,116,108,101,110,103,116,104,123,92,117,110,105,116,108,101,110,103,116,104,125,123,37,102,112,116,125,10,92,105,102,120,92,112,108,111,116,112,111,105,110,116,92,117,110,100,101,102,105,110,101,100,92,110,101,119,115,97,118,101,98,111,120,123,92,112,108,111,116,112,111,105,110,116,125,92,102,105,10,0,0,0,0,0,37,115,58,37,100,32,111,111,111,112,115,58,32,85,110,107,110,111,119,110,32,99,111,108,111,114,32,109,111,100,101,108,32,39,37,99,39,10,0,0,98,101,115,106,48,0,0,0,92,102,111,110,116,92,103,110,117,112,108,111,116,61,37,115,49,48,32,97,116,32,37,100,112,116,10,92,103,110,117,112,108,111,116,10,0,0,0,0,67,111,117,114,105,101,114,32,66,111,108,100,32,79,98,108,105,113,117,101,0,0,0,0,98,111,114,36,100,101,114,0,32,32,83,117,109,58,32,32,32,32,32,32,37,115,10,0,101,118,97,108,36,117,97,116,101,0,0,0,0,0,0,0,100,111,99,0,0,0,0,0,110,111,110,117,110,105,36,102,111,114,109,0,0,0,0,0,32,115,101,99,115,0,0,0,114,101,36,115,116,111,114,101,0,0,0,0,0,0,0,0,83,116,97,116,115,32,99,111,109,109,97,110,100,32,110,111,116,32,97,118,97,105,108,97,98,108,101,32,119,105,116,104,32,108,111,103,115,99,97,108,101,32,97,99,116,105,118,101,0,0,0,0,0,0,0,0,92,98,101,103,105,110,123,112,105,99,116,117,114,101,125,40,37,100,44,37,100,41,40,48,44,48,41,10,0,0,0,0,32,112,111,105,110,116,115,105,122,101,32,118,97,114,105,97,98,108,101,0,0,0,0,0,115,116,97,99,107,104,101,105,103,104,116,32,97,114,114,97,121,0,0,0,0,0,0,0,70,49,48,0,0,0,0,0,101,120,112,101,99,116,101,100,32,108,105,110,101,116,121,112,101,0,0,0,0,0,0,0,92,109,117,108,116,105,112,117,116,40,37,117,44,37,117,41,40,37,46,51,102,44,37,46,51,102,41,123,37,117,125,123,37,115,125,10,0,0,0,0,92,112,117,116,40,37,46,50,102,44,37,46,50,102,41,123,37,115,125,10,0,0,0,0,92,115,112,101,99,105,97,108,123,101,109,58,108,105,110,101,119,105,100,116,104,32,37,46,49,102,112,116,125,37,37,10,0,0,0,0,0,0,0,0,50,42,120,0,0,0,0,0,92,115,98,111,120,123,92,112,108,111,116,112,111,105,110,116,125,123,92,114,117,108,101,91,37,46,51,102,112,116,93,123,37,46,51,102,112,116,125,123,37,46,51,102,112,116,125,125,37,37,10,0,0,0,0,0,123,92,114,111,116,97,116,101,98,111,120,123,37,100,125,0,84,101,114,109,105,110,97,108,32,111,112,116,105,111,110,115,32,97,114,101,32,39,37,115,39,10,0,0,0,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,115,112,97,100,101,115,117,105,116,36,125,0,0,0,0,0,10,69,120,97,99,116,108,121,32,97,115,32,109,97,110,121,32,100,97,116,97,32,112,111,105,110,116,115,32,97,115,32,116,104,101,114,101,32,97,114,101,32,112,97,114,97,109,101,116,101,114,115,46,10,0,0,103,101,116,95,111,102,102,115,101,116,115,0,0,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,104,101,97,114,116,115,117,105,116,36,125,0,0,0,0,0,108,111,103,0,0,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,98,108,97,99,107,108,111,122,101,110,103,101,36,125,0,0,67,111,117,114,105,101,114,32,66,111,108,100,0,0,0,0,32,32,83,116,100,32,68,101,118,58,32,32,37,115,10,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,108,111,122,101,110,103,101,36,125,0,0,0,0,0,0,0,32,98,121,32,37,103,37,115,0,0,0,0,0,0,0,0,105,110,116,101,103,101,114,32,111,118,101,114,102,108,111,119,59,32,99,104,97,110,103,105,110,103,32,116,111,32,102,108,111,97,116,105,110,103,32,112,111,105,110,116,0,0,0,0,101,120,112,101,99,116,105,110,103,32,114,105,103,104,116,32,112,97,114,101,110,116,104,101,115,105,115,32,41,0,0,0,101,104,102,0,0,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,98,108,97,99,107,116,114,105,97,110,103,108,101,100,111,119,110,36,125,0,0,0,0,0,32,112,111,105,110,116,116,121,112,101,32,37,100,0,0,0,98,111,120,112,108,111,116,32,104,97,115,32,117,110,100,101,102,105,110,101,100,32,120,32,99,111,111,114,100,105,110,97,116,101,0,0,0,0,0,0,70,57,0,0,0,0,0,0,101,120,112,101,99,116,101,100,32,99,111,108,111,114,115,112,101,99,0,0,0,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,116,114,105,97,110,103,108,101,100,111,119,110,36,125,0,0,99,111,110,116,111,117,114,32,100,50,121,0,0,0,0,0]) -.concat([92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,98,108,97,99,107,116,114,105,97,110,103,108,101,36,125,0,115,101,116,32,37,115,114,97,110,103,101,32,91,32,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,98,117,108,108,101,116,36,125,0,0,0,0,0,0,0,0,98,108,45,105,110,116,101,114,112,32,97,108,111,110,103,32,115,99,97,110,0,0,0,0,112,114,101,118,105,111,117,115,32,112,97,114,97,109,101,116,114,105,99,32,102,117,110,99,116,105,111,110,32,110,111,116,32,102,117,108,108,121,32,115,112,101,99,105,102,105,101,100,0,0,0,0,0,0,0,0,50,32,109,117,108,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,99,105,114,99,36,125,0,0,116,101,120,116,95,108,97,98,101,108,32,108,105,115,116,32,119,97,115,32,110,111,116,32,105,110,105,116,105,97,108,105,122,101,100,0,0,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,98,108,97,99,107,115,113,117,97,114,101,36,125,0,0,0,45,45,112,101,114,115,105,115,116,0,0,0,0,0,0,0,97,98,115,46,32,99,104,97,110,103,101,32,100,117,114,105,110,103,32,108,97,115,116,32,105,116,101,114,97,116,105,111,110,32,58,32,37,103,10,10,0,0,0,0,0,0,0,0,92,114,97,105,115,101,98,111,120,123,45,46,56,112,116,125,123,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,66,111,120,36,125,125,0,87,97,114,110,105,110,103,32,58,32,117,100,102,32,115,104,97,100,111,119,101,100,32,98,121,32,98,117,105,108,116,45,105,110,32,102,117,110,99,116,105,111,110,32,111,102,32,116,104,101,32,115,97,109,101,32,110,97,109,101,0,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,97,115,116,36,125,0,0,0,108,111,103,49,48,0,0,0,92,114,117,108,101,123,49,112,116,125,123,49,112,116,125,0,67,111,117,114,105,101,114,32,79,98,108,105,113,117,101,0,98,36,97,114,115,0,0,0,32,32,77,101,97,110,58,32,32,32,32,32,37,115,10,0,77,79,85,83,69,95,82,85,76,69,82,95,89,0,0,0,92,112,117,116,40,37,100,44,37,100,41,123,92,114,117,108,101,123,37,103,112,116,125,123,37,103,112,116,125,125,10,0,37,35,103,0,0,0,0,0,105,110,99,114,101,109,101,110,116,32,109,117,115,116,32,98,101,32,110,101,103,97,116,105,118,101,0,0,0,0,0,0,37,37,32,71,78,85,80,76,79,84,58,32,76,97,84,101,88,32,112,105,99,116,117,114,101,32,119,105,116,104,32,101,109,116,101,120,32,115,112,101,99,105,97,108,115,10,92,115,101,116,108,101,110,103,116,104,123,92,117,110,105,116,108,101,110,103,116,104,125,123,37,102,112,116,125,10,92,105,102,120,92,112,108,111,116,112,111,105,110,116,92,117,110,100,101,102,105,110,101,100,92,110,101,119,115,97,118,101,98,111,120,123,92,112,108,111,116,112,111,105,110,116,125,92,102,105,10,0,32,108,105,110,101,119,105,100,116,104,32,37,46,51,102,0,98,111,120,112,108,111,116,32,112,101,114,109,117,116,97,116,105,111,110,115,32,97,114,114,97,121,0,0,0,0,0,0,115,116,114,111,107,101,32,103,115,97,118,101,9,37,37,32,100,114,97,119,32,103,114,97,121,32,115,99,97,108,101,32,115,109,111,111,116,104,32,98,111,120,10,109,97,120,99,111,108,111,114,115,32,48,32,103,116,32,123,47,105,109,97,120,32,109,97,120,99,111,108,111,114,115,32,100,101,102,125,32,123,47,105,109,97,120,32,49,48,50,52,32,100,101,102,125,32,105,102,101,108,115,101,10,0,0,0,0,0,0,0,0,115,112,108,105,110,101,32,115,111,108,117,116,105,111,110,32,118,101,99,116,111,114,0,0,70,56,0,0,0,0,0,0,92,101,110,100,71,78,85,80,76,79,84,112,105,99,116,117,114,101,10,92,101,110,100,103,114,111,117,112,10,92,101,110,100,105,110,112,117,116,10,0,105,110,116,101,114,110,97,108,32,101,114,114,111,114,58,32,102,95,115,117,109,32,99,111,117,108,100,32,110,111,116,32,97,99,99,101,115,115,32,105,116,101,114,97,116,105,111,110,32,118,97,114,105,97,98,108,101,46,0,0,0,0,0,0,92,101,110,100,123,112,105,99,116,117,114,101,125,37,10,92,101,110,100,103,114,111,117,112,10,92,101,110,100,105,110,112,117,116,10,0,0,0,0,0,92,101,110,100,123,100,111,99,117,109,101,110,116,125,10,0,124,50,42,120,32,45,32,48,46,53,124,0,0,0,0,0,32,32,32,32,92,103,112,108,98,97,99,107,116,101,120,116,10,32,32,32,32,92,112,117,116,40,48,44,48,41,123,92,105,110,99,108,117,100,101,103,114,97,112,104,105,99,115,123,37,115,125,125,37,37,10,32,32,32,32,92,103,112,108,102,114,111,110,116,116,101,120,116,10,32,32,92,101,110,100,123,112,105,99,116,117,114,101,125,37,37,10,92,101,110,100,103,114,111,117,112,10,0,0,0,114,101,108,46,32,99,104,97,110,103,101,32,100,117,114,105,110,103,32,108,97,115,116,32,105,116,101,114,97,116,105,111,110,32,58,32,37,103,10,10,0,0,0,0,0,0,0,0,92,114,111,116,97,116,101,98,111,120,123,37,100,125,123,0,32,32,32,32,32,32,92,112,117,116,40,37,100,44,37,100,41,123,0,0,0,0,0,0,32,32,32,32,32,32,92,99,111,108,111,114,103,114,97,121,123,37,115,125,37,37,10,0,67,111,117,114,105,101,114,0,97,117,36,116,111,115,99,97,108,101,0,0,0,0,0,0,42,32,67,79,76,85,77,78,58,32,10,0,0,0,0,0,32,32,32,32,32,32,92,99,111,108,111,114,123,119,104,105,116,101,125,37,37,10,0,0,32,102,114,111,109,32,0,0,105,110,99,114,101,109,101,110,116,32,109,117,115,116,32,98,101,32,112,111,115,105,116,105,118,101,0,0,0,0,0,0,32,32,32,32,32,32,92,99,111,108,111,114,123,98,108,97,99,107,125,37,37,10,0,0,32,118,97,114,105,97,98,108,101,0,0,0,0,0,0,0,98,111,120,112,108,111,116,32,108,97,98,101,108,115,32,97,114,114,97,121,0,0,0,0,70,55,0,0,0,0,0,0,114,103,98,0,0,0,0,0,119,98,97,48,49,50,51,52,53,54,55,56,0,0,0,0,32,32,32,32,32,32,92,99,115,110,97,109,101,32,76,84,37,99,92,101,110,100,99,115,110,97,109,101,37,37,10,0,32,32,32,32,32,32,92,99,111,108,111,114,114,103,98,123,37,51,46,50,102,44,37,51,46,50,102,44,37,51,46,50,102,125,37,37,10,0,0,0,50,32,109,117,108,32,48,46,53,32,115,117,98,32,97,98,115,0,0,0,0,0,0,0,37,37,112,109,51,100,95,109,97,112,95,101,110,100,10,0,37,37,112,109,51,100,95,109,97,112,95,98,101,103,105,110,10,0,0,0,0,0,0,0,9,32,32,66,97,99,107,32,115,105,100,101,32,111,102,32,115,117,114,102,97,99,101,115,32,104,97,115,32,108,105,110,101,115,116,121,108,101,32,111,102,102,115,101,116,32,111,102,32,37,100,10,9,32,32,66,105,116,45,77,97,115,107,32,111,102,32,76,105,110,101,115,32,116,111,32,100,114,97,119,32,105,110,32,101,97,99,104,32,116,114,105,97,110,103,108,101,32,105,115,32,37,108,100,10,9,32,32,37,100,58,32,0,0,0,0,0,0,0,0,102,105,110,97,108,32,115,117,109,32,111,102,32,115,113,117,97,114,101,115,32,111,102,32,114,101,115,105,100,117,97,108,115,32,58,32,37,103,10,0,32,32,32,32,92,103,112,108,103,97,100,100,116,111,109,97,99,114,111,92,103,112,108,102,114,111,110,116,116,101,120,116,123,37,10,0,0,0,0,0,32,32,32,32,92,103,112,108,103,97,100,100,116,111,109,97,99,114,111,92,103,112,108,98,97,99,107,116,101,120,116,123,37,10,0,0,0,0,0,0,10,83,117,98,116,111,112,105,99,115,32,97,118,97,105,108,97,98,108,101,32,102,111,114,32,0,0,0,0,0,0,0,32,32,32,32,125,37,10,0,66,111,111,107,109,97,110,32,68,101,109,105,32,73,116,97,108,105,99,0,0,0,0,0,97,114,36,114,111,119,0,0,42,32,77,65,84,82,73,88,58,32,91,37,100,32,88,32,37,100,93,32,10,0,0,0,125,37,10,0,0,0,0,0,78,111,32,112,114,101,118,105,111,117,115,32,102,105,108,101,110,97,109,101,0,0,0,0,32,32,115,101,114,105,101,115,0,0,0,0,0,0,0,0,37,10,32,32,92,115,112,101,99,105,97,108,123,112,115,58,32,99,117,114,114,101,110,116,112,111,105,110,116,32,103,114,101,115,116,111,114,101,32,109,111,118,101,116,111,125,37,10,32,32,0,0,0,0,0,0,70,54,0,0,0,0,0,0,92,114,106,117,115,116,123,92,115,116,114,117,116,123,125,37,115,125,0,0,0,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,91,114,93,123,92,115,116,114,117,116,123,125,37,115,125,0,0,0,0,92,99,106,117,115,116,123,92,115,116,114,117,116,123,125,37,115,125,0,0,0,0,0,0,121,116,105,99,115,0,0,0,52,120,59,49,59,45,50,120,43,49,46,56,52,59,120,47,48,46,48,56,45,49,49,46,53,0,0,0,0,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,92,115,116,114,117,116,123,125,37,115,125,0,0,0,0,0,0,0,92,108,106,117,115,116,123,92,115,116,114,117,116,123,125,37,115,125,0,0,0,0,0,0,10,65,102,116,101,114,32,37,100,32,105,116,101,114,97,116,105,111,110,115,32,116,104,101,32,102,105,116,32,99,111,110,118,101,114,103,101,100,46,10,0,0,0,0,0,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,91,108,93,123,92,115,116,114,117,116,123,125,37,115,125,0,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,37,115,0,32,32,87,97,114,110,105,110,103,58,32,83,105,110,103,108,101,32,105,115,111,108,105,110,101,32,40,115,99,97,110,41,32,105,115,32,110,111,116,32,101,110,111,117,103,104,32,102,111,114,32,97,32,112,109,51,100,32,112,108,111,116,46,10,9,32,32,32,72,105,110,116,58,32,77,105,115,115,105,110,103,32,98,108,97,110,107,32,108,105,110,101,115,32,105,110,32,116,104,101,32,100,97,116,97,32,102,105,108,101,63,32,83,101,101,32,39,104,101,108,112,32,112,109,51,100,39,32,97,110,100,32,70,65,81,46,10,0,0,0,0,0,0,0,115,103,110,0,0,0,0,0,37,37,10,32,32,92,115,112,101,99,105,97,108,123,112,115,58,32,103,115,97,118,101,32,99,117,114,114,101,110,116,112,111,105,110,116,32,99,117,114,114,101,110,116,112,111,105,110,116,32,116,114,97,110,115,108,97,116,101,10,37,100,32,114,111,116,97,116,101,32,110,101,103,32,101,120,99,104,32,110,101,103,32,101,120,99,104,32,116,114,97,110,115,108,97,116,101,125,37,37,10,32,32,0,66,111,111,107,109,97,110,32,68,101,109,105,0,0,0,0,97,110,36,103,108,101,115,0,109,97,120,95,105,110,100,101,120,0,0,0,0,0,0,0,32,32,92,112,117,116,40,37,100,44,37,100,41,123,0,0,32,32,68,97,121,115,32,99,111,109,112,117,116,101,100,32,97,117,116,111,109,97,116,105,99,97,108,108,121,10,0,0,92,102,111,110,116,115,105,122,101,123,37,103,125,123,92,98,97,115,101,108,105,110,101,115,107,105,112,125,92,115,101,108,101,99,116,102,111,110,116,10,0,0,0,0,0,0,0,0,32,108,105,110,101,99,111,108,111,114,0,0,0,0,0,0,120,112,45,62,112,95,99,111,117,110,116,32,61,61,32,121,112,45,62,112,95,99,111,117,110,116,0,0,0,0,0,0,70,53,0,0,0,0,0,0,32,32,125,125,37,10,0,0,32,115,105,122,101,32,37,46,50,102,105,110,44,32,37,46,50,102,105,110,32,0,0,0,32,115,105,122,101,32,37,46,50,102,99,109,44,32,37,46,50,102,99,109,32,0,0,0,32,59,10,0,0,0,0,0,100,117,112,32,48,46,52,50,32,108,101,32,123,52,32,109,117,108,125,32,123,100,117,112,32,48,46,57,50,32,108,101,32,123,45,50,32,109,117,108,32,49,46,56,52,32,97,100,100,125,32,123,48,46,48,56,32,100,105,118,32,49,49,46,53,32,115,117,98,125,32,105,102,101,108,115,101,125,32,105,102,101,108,115,101,0,0,0,32,37,100,0,0,0,0,0,32,116,105,110,121,0,0,0,10,84,104,101,32,102,105,116,32,119,97,115,32,115,116,111,112,112,101,100,32,98,121,32,116,104,101,32,117,115,101,114,32,97,102,116,101,114,32,37,100,32,105,116,101,114,97,116,105,111,110,115,46,10,0,0,32,115,109,97,108,108,0,0,32,114,111,116,97,116,101,0,97,98,115,0,0,0,0,0,48,46,53,0,0,0,0,0,32,100,97,115,104,101,100,0,66,111,111,107,109,97,110,32,76,105,103,104,116,32,73,116,97,108,105,99,0,0,0,0,97,116,0,0,0,0,0,0,109,105,110,95,105,110,100,101,120,0,0,0,0,0,0,0,32,99,111,108,111,114,0,0,109,97,120,95,117,115,105,110,103,32,60,61,32,77,65,88,68,65,84,65,67,79,76,83,0,0,0,0,0,0,0,0,32,32,77,111,110,116,104,115,32,99,111,109,112,117,116,101,100,32,97,117,116,111,109,97,116,105,99,97,108,108,121,10,0,0,0,0,0,0,0,0,100,36,116,105,99,115,0,0,37,115,37,115,37,115,37,115,0,0,0,0,0,0,0,0,32,108,105,110,101,116,121,112,101,32,37,100,0,0,0,0,70,52,0,0,0,0,0,0,112,36,97,116,116,101,114,110,0,0,0,0,0,0,0,0,117,110,114,101,99,111,103,110,105,122,101,100,32,111,112,116,105,111,110,0,0,0,0,0,102,111,110,116,32,115,105,122,101,32,111,117,116,32,111,102,32,98,111,117,110,100,115,32,91,49,46,46,49,48,48,93,0,0,0,0,0,0,0,0,116,36,105,110,121,0,0,0,115,36,109,97,108,108,0,0,50,42,120,45,48,46,56,52,0,0,0,0,0,0,0,0,114,36,111,116,97,116,101,0,10,77,97,120,105,109,117,109,32,105,116,101,114,97,116,105,111,110,32,99,111,117,110,116,32,40,37,100,41,32,114,101,97,99,104,101,100,46,32,70,105,116,32,115,116,111,112,112,101,100,46,10,0,0,0,0,37,37,32,71,78,85,80,76,79,84,58,32,76,97,84,101,88,32,112,105,99,116,117,114,101,32,117,115,105,110,103,32,69,69,80,73,67,32,109,97,99,114,111,115,10,92,115,101,116,108,101,110,103,116,104,123,92,117,110,105,116,108,101,110,103,116,104,125,123,37,102,112,116,125,10,0,0,0,0,0,92,102,111,111,116,110,111,116,101,115,105,122,101,10,0,0,105,110,116,0,0,0,0,0,92,102,111,110,116,115,105,122,101,123,37,100,125,123,37,103,125,92,115,101,108,101,99,116,102,111,110,116,10,0,0,0,66,111,111,107,109,97,110,32,76,105,103,104,116,0,0,0,97,99,36,116,105,111,110,95,116,97,98,108,101,0,0,0,99,111,103,95,121,0,0,0,92,98,101,103,105,110,123,112,105,99,116,117,114,101,125,40,37,100,44,37,100,41,40,37,100,44,37,100,41,10,0,0,32,32,105,110,116,101,114,118,97,108,115,32,99,111,109,112,117,116,101,100,32,97,117,116,111,109,97,116,105,99,97,108,108,121,10,0,0,0,0,0,109,36,116,105,99,115,0,0,92,116,104,105,110,108,105,110,101,115,32,92,100,111,116,116,101,100,108,105,110,101,123,50,48,125,0,0,0,0,0,0,45,45,45,101,114,114,111,114,33,45,45,45,10,0,0,0,117,115,101,115,95,97,120,105,115,91,83,69,67,79,78,68,95,89,95,65,88,73,83,93,0,0,0,0,0,0,0,0,70,51,0,0,0,0,0,0,92,116,104,105,110,108,105,110,101,115,32,92,100,97,115,104,108,105,110,101,91,54,48,93,123,50,48,125,0,0,0,0,92,116,104,105,110,108,105,110,101,115,32,92,100,111,116,116,101,100,108,105,110,101,123,49,48,125,0,0,0,0,0,0,92,116,104,105,110,108,105,110,101,115,32,92,100,97,115,104,108,105,110,101,91,57,48,93,123,49,48,125,0,0,0,0,50,32,109,117,108,32,48,46,56,52,32,115,117,98,0,0,92,84,104,105,99,107,108,105,110,101,115,32,92,112,97,116,104,0,0,0,0,0,0,0,92,116,104,105,110,108,105,110,101,115,32,92,112,97,116,104,0,0,0,0,0,0,0,0,70,73,84,95,67,79,78,86,69,82,71,69,68,0,0,0,92,116,104,105,110,108,105,110,101,115,32,92,100,114,97,119,108,105,110,101,91,45,53,48,93,0,0,0,0,0,0,0,92,116,104,105,99,107,108,105,110,101,115,32,92,112,97,116,104,0,0,0,0,0,0,0,69,108,108,105,112,116,105,99,80,105,0,0,0,0,0,0,40,37,117,44,37,117,41,0,65,118,97,110,116,71,97,114,100,101,32,68,101,109,105,32,79,98,108,105,113,117,101,0,97,36,108,108,0,0,0,0,99,111,103,95,120,0,0,0,10,37,115,40,37,117,44,37,117,41,0,0,0,0,0,0,102,108,111,97,116,54,52,0,37,115,40,37,117,44,37,117,41,0,0,0,0,0,0,0,101,108,108,105,112,115,101,115,10,0,0,0,0,0,0,0,117,115,101,115,95,97,120,105,115,91,70,73,82,83,84,95,89,95,65,88,73,83,93,0,70,50,0,0,0,0,0,0,101,36,109,112,116,121,0,0,92,99,111,108,111,114,123,121,101,108,108,111,119,125,10,0,92,99,111,108,111,114,123,99,121,97,110,125,10,0,0,0,112,97,117,115,101,100,0,0,92,99,111,108,111,114,123,109,97,103,101,110,116,97,125,10,0,0,0,0,0,0,0,0,92,99,111,108,111,114,123,103,114,101,101,110,125,10,0,0,120,47,48,46,51,50,45,48,46,55,56,49,50,53,0,0,9,108,111,97,100,112,97,116,104,32,102,114,111,109,32,71,78,85,80,76,79,84,95,76,73,66,32,105,115,32,0,0,92,99,111,108,111,114,123,98,108,117,101,125,10,0,0,0,103,112,95,115,116,114,97,100,100,0,0,0,0,0,0,0,70,73,84,58,32,101,114,114,111,114,32,111,99,99,117,114,114,101,100,32,100,117,114,105,110,103,32,102,105,116,0,0,92,99,111,108,111,114,123,114,101,100,125,10,0,0,0,0,37,56,46,51,103,0,0,0,116,105,109,101,32,118,97,108,117,101,32,111,117,116,32,111,102,32,114,97,110,103,101,0,92,99,111,108,111,114,123,98,108,97,99,107,125,10,0,0,69,108,108,105,112,116,105,99,69,0,0,0,0,0,0,0,125,125,125,10,0,0,0,0,65,118,97,110,116,71,97,114,100,101,32,68,101,109,105,0,118,36,97,114,105,97,98,108,101,115,0,0,0,0,0,0,105,110,100,101,120,95,109,97,120,95,121,0,0,0,0,0,37,99,92,92,0,0,0,0,102,108,111,97,116,51,50,0,32,32,32,32,111,102,102,115,101,116,32,0,0,0,0,0,97,117,36,116,111,102,114,101,113,0,0,0,0,0,0,0,123,92,109,97,107,101,98,111,120,40,48,44,48,41,91,108,116,93,123,92,115,104,111,114,116,115,116,97,99,107,123,0,99,105,114,99,108,101,115,10,0,0,0,0,0,0,0,0,97,108,108,32,112,111,105,110,116,115,32,121,50,32,118,97,108,117,101,32,117,110,100,101,102,105,110,101,100,33,0,0,70,49,0,0,0,0,0,0,116,114,97,110,115,36,112,97,114,101,110,116,0,0,0,0,123,92,109,97,107,101,98,111,120,40,48,44,48,41,91,108,93,123,92,115,104,111,114,116,115,116,97,99,107,123,0,0,123,92,109,97,107,101,98,111,120,40,48,44,48,41,91,108,98,93,123,92,115,104,111,114,116,115,116,97,99,107,123,0,77,111,117,115,105,110,103,32,110,111,116,32,97,99,116,105,118,101,0,0,0,0,0,0,99,112,56,53,48,0,0,0,37,115,125,125,125,10,0,0,32,120,108,111,119,32,120,104,105,103,104,32,121,108,111,119,32,121,104,105,103,104,0,0,123,92,109,97,107,101,98,111,120,40,48,44,48,41,91,108,116,93,123,92,114,111,116,97,116,101,98,111,120,91,111,114,105,103,105,110,61,99,93,123,57,48,125,123,0,0,0,0,48,46,51,50,32,100,105,118,32,48,46,55,56,49,50,53,32,115,117,98,0,0,0,0,123,92,109,97,107,101,98,111,120,40,48,44,48,41,91,108,93,123,92,114,111,116,97,116,101,98,111,120,91,111,114,105,103,105,110,61,99,93,123,57,48,125,123,0,0,0,0,0,108,111,103,102,105,108,101,0,123,92,109,97,107,101,98,111,120,40,48,44,48,41,91,108,98,93,123,92,114,111,116,97,116,101,98,111,120,91,111,114,105,103,105,110,61,99,93,123,57,48,125,123,0,0,0,0,37,115,125,125,10,0,0,0,69,108,108,105,112,116,105,99,75,0,0,0,0,0,0,0,123,92,109,97,107,101,98,111,120,40,48,44,48,41,91,114,93,123,0,0,0,0,0,0,65,118,97,110,116,71,97,114,100,101,32,66,111,111,107,32,79,98,108,105,113,117,101,0,116,36,101,114,109,105,110,97,108,0,0,0,0,0,0,0,105,110,100,101,120,95,109,97,120,95,120,0,0,0,0,0,100,111,0,0,0,0,0,0,123,92,109,97,107,101,98,111,120,40,48,44,48,41,123,0,117,105,110,116,54,52,0,0,32,97,110,100,32,97,114,101,32,110,111,116,32,114,111,116,97,116,101,100,44,10,9,0,101,120,112,101,99,116,101,100,32,102,111,114,109,97,116,0,123,92,109,97,107,101,98,111,120,40,48,44,48,41,91,108,93,123,0,0,0,0,0,0,114,103,98,105,109,97,103,101,10,0,0,0,0,0,0,0,97,108,108,32,112,111,105,110,116,115,32,121,32,118,97,108,117,101,32,117,110,100,101,102,105,110,101,100,33,0,0,0,75,80,95,57,0,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,115,99,114,105,112,116,115,99,114,105,112,116,115,116,121,108,101,92,115,116,97,114,36,125,0,0,0,0,0,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,115,99,114,105,112,116,115,99,114,105,112,116,115,116,121,108,101,92,116,114,105,97,110,103,108,101,36,125,0,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,115,99,114,105,112,116,115,99,114,105,112,116,115,116,121,108,101,92,116,105,109,101,115,36,125,0,0,0,0,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,115,99,114,105,112,116,115,99,114,105,112,116,115,116,121,108,101,92,66,111,120,36,125,0,124,40,51,120,45,50,41,47,50,124,0,0,0,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,115,99,114,105,112,116,115,99,114,105,112,116,115,116,121,108,101,32,43,36,125,0,0,0,78,111,32,102,105,116,116,97,98,108,101,32,112,97,114,97,109,101,116,101,114,115,33,10,0,0,0,0,0,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,115,99,114,105,112,116,115,99,114,105,112,116,115,116,121,108,101,92,68,105,97,109,111,110,100,36,125,0,0,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,115,99,114,105,112,116,115,116,121,108,101,92,115,116,97,114,36,125,0,0,0,0,0,0,116,97,110,104,0,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,115,99,114,105,112,116,115,116,121,108,101,92,116,114,105,97,110,103,108,101,36,125,0,0,65,118,97,110,116,71,97,114,100,101,32,66,111,111,107,0,115,36,101,116,0,0,0,0,105,110,100,101,120,95,109,105,110,95,121,0,0,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,115,99,114,105,112,116,115,116,121,108,101,92,116,105,109,101,115,36,125,0,0,0,0,0,105,110,116,54,52,0,0,0,32,105,110,32,50,68,32,109,111,100,101,44,32,116,101,114,109,105,110,97,108,32,112,101,114,109,105,116,116,105,110,103,44,10,9,0,0,0,0,0,99,111,109,36,109,101,110,116,115,99,104,97,114,115,0,0,101,120,112,101,99,116,105,110,103,32,101,120,112,111,110,101,110,116,0,0,0,0,0,0,102,111,114,109,97,116,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,115,99,114,105,112,116,115,116,121,108,101,92,66,111,120,36,125,0,0,0,0,0,0,0,105,109,97,103,101,10,0,0,101,100,102,0,0,0,0,0,117,115,101,115,95,97,120,105,115,91,83,69,67,79,78,68,95,88,95,65,88,73,83,93,0,0,0,0,0,0,0,0,75,80,95,56,0,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,115,99,114,105,112,116,115,116,121,108,101,32,43,36,125,0,99,111,110,116,111,117,114,32,100,50,120,0,0,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,115,99,114,105,112,116,115,116,121,108,101,92,68,105,97,109,111,110,100,36,125,0,0,0,35,32,115,101,116,32,111,117,116,112,117,116,10,0,0,0,92,99,105,114,99,108,101,42,123,50,52,125,0,0,0,0,112,109,51,100,95,112,108,111,116,45,62,113,117,97,100,114,97,110,103,108,101,115,0,0,92,99,105,114,99,108,101,42,123,49,56,125,0,0,0,0,49,46,53,32,109,117,108,32,49,32,115,117,98,32,97,98,115,0,0,0,0,0,0,0,92,99,105,114,99,108,101,42,123,49,50,125,0,0,0,0,45,112,101,114,115,105,115,116,0,0,0,0,0,0,0,0,78,117,109,98,101,114,32,111,102,32,100,97,116,97,32,112,111,105,110,116,115,32,115,109,97,108,108,101,114,32,116,104,97,110,32,110,117,109,98,101,114,32,111,102,32,112,97,114,97,109,101,116,101,114,115,0,92,99,105,114,99,108,101,123,50,52,125,0,0,0,0,0,92,99,105,114,99,108,101,123,49,56,125,0,0,0,0,0,99,111,115,104,0,0,0,0,92,99,105,114,99,108,101,123,49,50,125,0,0,0,0,0,84,105,109,101,115,32,66,111,108,100,32,73,116,97,108,105,99,0,0,0,0,0,0,0,102,36,117,110,99,116,105,111,110,115,0,0,0,0,0,0,105,110,100,101,120,95,109,105,110,95,120,0,0,0,0,0,84,111,111,32,109,97,110,121,32,108,101,118,101,108,115,32,111,102,32,110,101,115,116,101,100,32,109,97,99,114,111,115,0,0,0,0,0,0,0,0,77,79,85,83,69,95,82,85,76,69,82,95,88,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,115,116,97,114,36,125,0,0,117,105,110,116,51,50,0,0,32,98,121,32,37,100,0,0,101,120,112,101,99,116,101,100,32,102,111,110,116,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,116,114,105,97,110,103,108,101,36,125,0,0,0,0,0,0,108,97,98,101,108,115,10,0,99,108,111,115,101,0,0,0,37,105,0,0,0,0,0,0,117,115,101,115,95,97,120,105,115,91,70,73,82,83,84,95,88,95,65,88,73,83,93,0,83,105,110,103,117,108,97,114,32,109,97,116,114,105,120,32,105,110,32,76,85,45,68,69,67,79,77,80,0,0,0,0,115,109,111,111,116,104,95,98,111,120,0,0,0,0,0,0,115,112,108,105,110,101,32,114,105,103,104,116,32,115,105,100,101,0,0,0,0,0,0,0,75,80,95,55,0,0,0,0,100,117,112,108,105,99,97,116,101,100,32,97,114,103,117,109,101,110,116,115,32,105,110,32,115,116,121,108,101,32,115,112,101,99,105,102,105,99,97,116,105,111,110,0,0,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,116,105,109,101,115,36,125,0,105,110,116,101,114,110,97,108,32,101,114,114,111,114,58,32,102,95,115,117,109,32,101,120,112,101,99,116,115,32,97,114,103,117,109,101,110,116,32,40,118,97,114,110,97,109,101,41,32,111,102,32,116,121,112,101,32,115,116,114,105,110,103,46,0,0,0,0,0,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,66,111,120,36,125,0,0,0,37,115,32,97,120,105,115,32,114,97,110,103,101,32,117,110,100,101,102,105,110,101,100,32,111,114,32,111,118,101,114,102,108,111,119,0,0,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,43,36,125,0,0,0,0,0,0,92,109,97,107,101,98,111,120,40,48,44,48,41,123,36,92,68,105,97,109,111,110,100,36,125,0,0,0,0,0,0,0,124,40,51,120,45,49,41,47,50,124,0,0,0,0,0,0,92,112,117,116,40,37,100,44,37,100,41,123,37,115,125,10,0,0,0,0,0,0,0,0,37,100,32,37,100,32,37,102,0,0,0,0,0,0,0,0,92,101,110,100,123,112,105,99,116,117,114,101,125,10,0,0,115,105,110,104,0,0,0,0,92,102,111,111,116,110,111,116,101,115,105,122,101,37,10,0,84,105,109,101,115,32,66,111,108,100,0,0,0,0,0,0,104,97,110,110,0,0,0,0,37,115,37,115,9,37,108,100,10,0,0,0,0,0,0,0,116,114,105,109,32,116,111,112,32,38,32,98,111,116,116,111,109,32,109,97,114,103,105,110,115,0,0,0,0,0,0,0,105,110,116,51,50,0,0,0,32,114,111,116,97,116,101,100,0,0,0,0,0,0,0,0,116,114,105,109,32,98,111,116,116,111,109,32,109,97,114,103,105,110,0,0,0,0,0,0,112,109,51,100,10,0,0,0,98,117,116,116,111,110,51,0,75,80,95,54,0,0,0,0,78,111,32,112,111,105,110,116,105,110,116,101,114,118,97,108,32,115,112,101,99,105,102,105,101,114,32,97,108,108,111,119,101,100,44,32,104,101,114,101,0,0,0,0,0,0,0,0,116,114,105,109,32,116,111,112,32,109,97,114,103,105,110,0,116,114,105,109,32,108,101,102,116,32,38,32,114,105,103,104,116,32,109,97,114,103,105,110,115,0,0,0,0,0,0,0,99,104,97,114,36,97,99,116,101,114,0,0,0,0,0,0,116,114,105,109,32,114,105,103,104,116,32,109,97,114,103,105,110,0,0,0,0,0,0,0,116,114,105,109,32,108,101,102,116,32,109,97,114,103,105,110,0,0,0,0,0,0,0,0,49,46,53,32,109,117,108,32,46,53,32,115,117,98,32,97,98,115,0,0,0,0,0,0,37,37,32,0,0,0,0,0,110,111,32,112,97,114,97,109,101,116,101,114,32,115,112,101,99,105,102,105,101,100,0,0,37,10,0,0,0,0,0,0,92,115,112,101,99,105,97,108,123,100,116,32,37,102,125,37,37,10,0,0,0,0,0,0,97,116,97,110,50,0,0,0,92,115,112,101,99,105,97,108,123,100,97,32,37,102,125,37,37,10,0,0,0,0,0,0,84,105,109,101,115,32,73,116,97,108,105,99,0,0,0,0,98,111,120,0,0,0,0,0,109,97,120,0,0,0,0,0,123,92,109,97,107,101,98,111,120,40,48,44,48,41,37,115,123,92,115,104,111,114,116,115,116,97,99,107,123,37,115,125,125,125,10,0,0,0,0,0,117,119,111,114,100,0,0,0,102,111,114,109,97,116,32,34,37,115,34,0,0,0,0,0,110,111,114,97,110,103,101,36,108,105,109,105,116,101,100,0,91,108,116,93,0,0,0,0,98,111,120,112,108,111,116,10,0,0,0,0,0,0,0,0,98,117,116,116,111,110,50,0,97,108,108,32,112,111,105,110,116,115,32,117,110,100,101,102,105,110,101,100,33,0,0,0,75,80,95,53,0,0,0,0,112,105,0,0,0,0,0,0,91,108,98,93,0,0,0,0,123,92,109,97,107,101,98,111,120,40,48,44,48,41,37,115,123,37,115,125,125,10,0,0,123,92,109,97,107,101,98,111,120,40,48,44,48,41,37,115,125,10,0,0,0,0,0,0,120,116,105,99,115,0,0,0,92,112,117,116,40,37,100,44,37,100,41,0,0,0,0,0,40,51,120,45,50,41,47,50,0,0,0,0,0,0,0,0,92,115,112,101,99,105,97,108,123,112,97,32,37,100,32,37,100,125,0,0,0,0,0,0,102,105,116,116,101,100,32,112,97,114,97,109,101,116,101,114,115,32,105,110,105,116,105,97,108,105,122,101,100,32,119,105,116,104,32,99,117,114,114,101,110,116,32,118,97,114,105,97,98,108,101,32,118,97,108,117,101,115,10,10,0,0,0,0,92,115,112,101,99,105,97,108,123,102,112,125,37,10,0,0,92,115,112,101,99,105,97,108,123,97,114,32,48,32,48,32,37,100,32,37,100,32,48,32,55,125,0,0,0,0,0,0,97,116,97,110,0,0,0,0,92,115,112,101,99,105,97,108,123,112,110,32,37,100,125,0,84,105,109,101,115,32,82,111,109,97,110,0,0,0,0,0,99,97,117,99,104,121,0,0,117,112,95,113,117,97,114,116,105,108,101,0,0,0,0,0,92,115,112,101,99,105,97,108,123,115,104,32,37,102,125,0,117,105,110,116,49,54,0,0,106,117,115,116,105,102,105,101,100,32,97,117,116,111,109,97,116,105,99,97,108,108,121,44,32,0,0,0,0,0,0,0,114,97,110,103,101,36,108,105,109,105,116,101,100,0,0,0,125,37,37,10,0,0,0,0,99,97,110,100,108,101,115,116,105,99,107,115,10,0,0,0,98,117,116,116,111,110,49,0,78,111,32,100,97,116,97,32,105,110,32,112,108,111,116,0,75,80,95,52,0,0,0,0,112,111,105,110,116,105,36,110,116,101,114,118,97,108,0,0,92,114,117,108,101,123,46,49,112,116,125,123,46,49,112,116,125,0,0,0,0,0,0,0,92,112,117,116,40,37,100,44,37,100,41,123,0,0,0,0,92,112,117,116,40,37,100,44,37,100,41,123,92,115,112,101,99,105,97,108,123,101,109,58,108,105,110,101,116,111,125,125,10,0,0,0,0,0,0,0,92,112,117,116,40,37,100,44,37,100,41,123,92,115,112,101,99,105,97,108,123,101,109,58,109,111,118,101,116,111,125,125,10,0,0,0,0,0,0,0,69,68,70,95,66,105,110,97,114,121,70,105,108,101,78,97,109,101,0,0,0,0,0,0,49,46,53,32,109,117,108,32,49,32,115,117,98,0,0,0,92,112,117,116,40,37,46,49,102,44,37,46,49,102,41,123,92,114,117,108,101,91,37,46,51,102,112,116,93,123,37,46,51,102,112,116,125,123,37,46,51,102,112,116,125,125,10,0,79,117,116,32,111,102,32,109,101,109,111,114,121,32,105,110,32,102,105,116,58,32,116,111,111,32,109,97,110,121,32,112,97,114,97,109,101,116,101,114,115,63,0,0,0,0,0,0,92,112,117,116,40,37,46,49,102,44,37,46,49,102,41,123,37,115,125,10,0,0,0,0,92,112,117,116,40,37,46,50,102,44,37,117,41,123,92,114,117,108,101,123,37,46,51,102,112,116,125,123,37,46,51,102,112,116,125,125,10,0,0,0,97,99,111,115,0,0,0,0,112,111,112,32,48,46,53,0,92,109,117,108,116,105,112,117,116,40,37,46,50,102,44,37,46,50,102,41,40,37,46,51,102,44,37,46,51,102,41,123,50,125,123,92,114,117,108,101,123,37,46,51,102,112,116,125,123,37,46,51,102,112,116,125,125,10,0,0,0,0,0,0,77,117,115,116,32,115,101,116,32,111,117,116,112,117,116,32,116,111,32,97,32,102,105,108,101,32,111,114,32,112,117,116,32,97,108,108,32,109,117,108,116,105,112,108,111,116,32,99,111,109,109,97,110,100,115,32,111,110,32,111,110,101,32,105,110,112,117,116,32,108,105,110,101,0,0,0,0,0,0,0,101,120,112,0,0,0,0,0,109,101,100,105,97,110,0,0,92,109,117,108,116,105,112,117,116,40,37,46,50,102,44,37,46,50,102,41,40,37,46,51,102,44,37,46,51,102,41,123,37,117,125,123,92,114,117,108,101,123,37,46,51,102,112,116,125,123,37,46,51,102,112,116,125,125,10,0,0,0,0,0,99,101,110,116,101,114,32,106,117,115,116,105,102,105,101,100,44,32,0,0,0,0,0,0,97,117,116,111,106,36,117,115,116,105,102,121,0,0,0,0,92,112,117,116,40,37,117,44,37,46,50,102,41,123,92,114,117,108,101,123,37,46,51,102,112,116,125,123,37,46,51,102,112,116,125,125,10,0,0,0,102,105,110,97,110,99,101,98,97,114,115,10,0,0,0,0,97,110,121,0,0,0,0,0,69,120,112,101,99,116,105,110,103,32,39,115,117,109,32,91,60,118,97,114,62,32,61,32,60,115,116,97,114,116,62,58,60,101,110,100,62,93,32,60,101,120,112,114,101,115,115,105,111,110,62,39,10,0,0,0,75,80,95,51,0,0,0,0,78,111,32,112,111,105,110,116,115,105,122,101,32,115,112,101,99,105,102,105,101,114,32,97,108,108,111,119,101,100,44,32,104,101,114,101,0,0,0,0,92,117,115,101,98,111,120,123,92,112,108,111,116,112,111,105,110,116,125,0,0,0,0,0,92,112,117,116,40,37,117,44,37,117,41,123,37,115,125,10,0,0,0,0,0,0,0,0,115,101,99,36,111,110,100,0,92,112,117,116,40,37,100,44,37,100,41,123,92,118,101,99,116,111,114,40,37,100,44,37,100,41,123,48,125,125,10,0,92,112,117,116,40,37,100,44,37,100,41,123,92,37,115,40,37,100,44,37,100,41,123,37,100,125,125,10,0,0,0,0,40,51,120,45,49,41,47,50,0,0,0,0,0,0,0,0,92,112,117,116,40,37,100,44,37,100,41,123,92,37,115,40,37,100,44,48,41,123,37,100,125,125,10,0,0,0,0,0,102,105,116,32,112,97,114,97,109,32,114,101,115,105,122,101,0,0,0,0,0,0,0,0,108,105,110,101,0,0,0,0,118,101,99,116,111,114,0,0,32,32,32,32,32,32,32,32,32,0,0,0,0,0,0,0,97,115,105,110,0,0,0,0,92,112,117,116,40,37,100,44,37,100,41,123,92,37,115,40,48,44,37,100,41,123,37,100,125,125,10,0,0,0,0,0,84,104,105,115,32,116,101,114,109,105,110,97,108,32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,109,117,108,116,105,112,108,111,116,0,0,0,0,0,0,0,0,103,97,117,115,115,0,0,0,108,111,95,113,117,97,114,116,105,108,101,0,0,0,0,0,117,36,110,105,116,0,0,0,114,105,103,104,116,32,106,117,115,116,105,102,105,101,100,44,32,0,0,0,0,0,0,0,105,110,116,49,54,0,0,0,114,105,36,103,104,116,0,0,110,111,36,104,97,99,107,116,101,120,116,0,0,0,0,0,118,101,99,116,111,114,10,0,115,117,114,102,97,99,101,0,107,101,121,36,112,114,101,115,115,0,0,0,0,0,0,0,39,93,39,32,101,120,112,101,99,116,101,100,0,0,0,0,75,80,95,50,0,0,0,0,37,32,71,78,85,80,76,79,84,58,32,76,97,84,101,88,32,112,105,99,116,117,114,101,32,117,115,105,110,103,32,80,83,84,82,73,67,75,83,32,109,97,99,114,111,115,10,0,92,99,97,116,99,111,100,101,96,64,61,49,50,10,92,102,105,10,92,101,110,100,112,115,112,105,99,116,117,114,101,10,0,0,0,0,0,0,0,0,102,105,114,36,115,116,0,0,92,112,115,112,105,99,116,117,114,101,40,37,102,44,37,102,41,40,37,102,44,37,102,41,10,92,105,102,120,92,110,111,102,105,103,115,92,117,110,100,101,102,105,110,101,100,10,92,99,97,116,99,111,100,101,96,64,61,49,49,10,10,0,0,92,112,115,115,101,116,123,117,110,105,116,61,53,46,48,105,110,44,120,117,110,105,116,61,53,46,48,105,110,44,121,117,110,105,116,61,51,46,48,105,110,125,10,0,0,0,0,0,49,46,53,32,109,117,108,32,46,53,32,115,117,98,0,0,112,97,114,97,109,101,116,101,114,32,102,105,108,101,32,37,115,32,99,111,117,108,100,32,110,111,116,32,98,101,32,114,101,97,100,0,0,0,0,0,92,110,101,119,112,115,111,98,106,101,99,116,123,80,83,84,64,65,114,114,111,119,125,123,112,115,108,105,110,101,125,123,108,105,110,101,119,105,100,116,104,61,46,48,48,49,44,108,105,110,101,115,116,121,108,101,61,115,111,108,105,100,125,10,92,99,97,116,99,111,100,101,96,64,61,49,50,10,10,92,102,105,10,0,0,0,0,0,115,121,110,116,97,120,32,101,114,114,111,114,32,105,110,32,112,97,114,97,109,101,116,101,114,32,102,105,108,101,0,0,92,110,101,119,112,115,111,98,106,101,99,116,123,80,83,84,64,80,108,117,115,125,123,112,115,100,111,116,115,125,123,108,105,110,101,119,105,100,116,104,61,46,48,48,49,44,108,105,110,101,115,116,121,108,101,61,115,111,108,105,100,44,100,111,116,115,116,121,108,101,61,43,125,10,92,110,101,119,112,115,111,98,106,101,99,116,123,80,83,84,64,83,113,117,97,114,101,125,123,112,115,100,111,116,115,125,123,108,105,110,101,119,105,100,116,104,61,46,48,48,49,44,108,105,110,101,115,116,121,108,101,61,115,111,108,105,100,44,100,111,116,115,116,121,108,101,61,115,113,117,97,114,101,125,10,92,110,101,119,112,115,111,98,106,101,99,116,123,80,83,84,64,67,105,114,99,108,101,125,123,112,115,100,111,116,115,125,123,108,105,110,101,119,105,100,116,104,61,46,48,48,49,44,108,105,110,101,115,116,121,108,101,61,115,111,108,105,100,44,100,111,116,115,116,121,108,101,61,111,125,10,92,110,101,119,112,115,111,98,106,101,99,116,123,80,83,84,64,84,114,105,97,110,103,108,101,125,123,112,115,100,111,116,115,125,123,108,105,110,101,119,105,100,116,104,61,46,48,48,49,44,108,105,110,101,115,116,121,108,101,61,115,111,108,105,100,44,100,111,116,115,116,121,108,101,61,116,114,105,97,110,103,108,101,125,10,92,110,101,119,112,115,111,98,106,101,99,116,123,80,83,84,64,80,101,110,116,97,103,111,110,125,123,112,115,100,111,116,115,125,123,108,105,110,101,119,105,100,116,104,61,46,48,48,49,44,108,105,110,101,115,116,121,108,101,61,115,111,108,105,100,44,100,111,116,115,116,121,108,101,61,112,101,110,116,97,103,111,110,125,10,92,110,101,119,112,115,111,98,106,101,99,116,123,80,83,84,64,70,105,108,108,115,113,117,97,114,101,125,123,112,115,100,111,116,115,125,123,108,105,110,101,119,105,100,116,104,61,46,48,48,49,44,108,105,110,101,115,116,121,108,101,61,115,111,108,105,100,44,100,111,116,115,116,121,108,101,61,115,113,117,97,114,101,42,125,10,92,110,101,119,112,115,111,98,106,101,99,116,123,80,83,84,64,70,105,108,108,99,105,114,99,108,101,125,123,112,115,100,111,116,115,125,123,108,105,110,101,119,105,100,116,104,61,46,48,48,49,44,108,105,110,101,115,116,121,108,101,61,115,111,108,105,100,44,100,111,116,115,116,121,108,101,61,42,125,10,92,110,101,119,112,115,111,98,106,101,99,116,123,80,83,84,64,70,105,108,108,116,114,105,97,110,103,108,101,125,123,112,115,100,111,116,115,125,123,108,105,110,101,119,105,100,116,104,61,46,48,48,49,44,108,105,110,101,115,116,121,108,101,61,115,111,108,105,100,44,100,111,116,115,116,121,108,101,61,116,114,105,97,110,103,108,101,42,125,10,92,110,101,119,112,115,111,98,106,101,99,116,123,80,83]) -.concat([84,64,70,105,108,108,112,101,110,116,97,103,111,110,125,123,112,115,100,111,116,115,125,123,108,105,110,101,119,105,100,116,104,61,46,48,48,49,44,108,105,110,101,115,116,121,108,101,61,115,111,108,105,100,44,100,111,116,115,116,121,108,101,61,112,101,110,116,97,103,111,110,42,125,10,0,0,0,0,0,92,110,101,119,112,115,111,98,106,101,99,116,123,80,83,84,64,68,105,97,109,111,110,100,125,123,112,115,100,111,116,115,125,123,108,105,110,101,119,105,100,116,104,61,46,48,48,49,44,108,105,110,101,115,116,121,108,101,61,115,111,108,105,100,44,100,111,116,115,116,121,108,101,61,115,113,117,97,114,101,44,100,111,116,97,110,103,108,101,61,52,53,125,10,92,110,101,119,112,115,111,98,106,101,99,116,123,80,83,84,64,70,105,108,108,100,105,97,109,111,110,100,125,123,112,115,100,111,116,115,125,123,108,105,110,101,119,105,100,116,104,61,46,48,48,49,44,108,105,110,101,115,116,121,108,101,61,115,111,108,105,100,44,100,111,116,115,116,121,108,101,61,115,113,117,97,114,101,42,44,100,111,116,97,110,103,108,101,61,52,53,125,10,92,110,101,119,112,115,111,98,106,101,99,116,123,80,83,84,64,67,114,111,115,115,125,123,112,115,100,111,116,115,125,123,108,105,110,101,119,105,100,116,104,61,46,48,48,49,44,108,105,110,101,115,116,121,108,101,61,115,111,108,105,100,44,100,111,116,115,116,121,108,101,61,43,44,100,111,116,97,110,103,108,101,61,52,53,125,10,0,0,0,0,0,0,0,0,116,97,110,0,0,0,0,0,92,110,101,119,112,115,111,98,106,101,99,116,123,80,83,84,64,66,111,114,100,101,114,125,123,112,115,108,105,110,101,125,123,108,105,110,101,119,105,100,116,104,61,46,48,48,49,53,44,108,105,110,101,115,116,121,108,101,61,115,111,108,105,100,125,10,92,110,101,119,112,115,111,98,106,101,99,116,123,80,83,84,64,65,120,101,115,125,123,112,115,108,105,110,101,125,123,108,105,110,101,119,105,100,116,104,61,46,48,48,49,53,44,108,105,110,101,115,116,121,108,101,61,100,111,116,116,101,100,44,100,111,116,115,101,112,61,46,48,48,52,125,10,92,110,101,119,112,115,111,98,106,101,99,116,123,80,83,84,64,83,111,108,105,100,125,123,112,115,108,105,110,101,125,123,108,105,110,101,119,105,100,116,104,61,46,48,48,49,53,44,108,105,110,101,115,116,121,108,101,61,115,111,108,105,100,125,10,92,110,101,119,112,115,111,98,106,101,99,116,123,80,83,84,64,68,97,115,104,101,100,125,123,112,115,108,105,110,101,125,123,108,105,110,101,119,105,100,116,104,61,46,48,48,49,53,44,108,105,110,101,115,116,121,108,101,61,100,97,115,104,101,100,44,100,97,115,104,61,46,48,49,32,46,48,49,125,10,92,110,101,119,112,115,111,98,106,101,99,116,123,80,83,84,64,68,111,116,116,101,100,125,123,112,115,108,105,110,101,125,123,108,105,110,101,119,105,100,116,104,61,46,48,48,50,53,44,108,105,110,101,115,116,121,108,101,61,100,111,116,116,101,100,44,100,111,116,115,101,112,61,46,48,48,56,125,10,92,110,101,119,112,115,111,98,106,101,99,116,123,80,83,84,64,76,111,110,103,68,97,115,104,125,123,112,115,108,105,110,101,125,123,108,105,110,101,119,105,100,116,104,61,46,48,48,49,53,44,108,105,110,101,115,116,121,108,101,61,100,97,115,104,101,100,44,100,97,115,104,61,46,48,50,32,46,48,49,125,10,0,0,0,0,0,0,0,115,112,108,105,110,101,36,115,0,0,0,0,0,0,0,0,109,105,110,0,0,0,0,0,37,32,68,101,102,105,110,101,32,110,101,119,32,80,83,84,32,111,98,106,101,99,116,115,44,32,105,102,32,110,111,116,32,97,108,114,101,97,100,121,32,100,101,102,105,110,101,100,10,92,105,102,120,92,80,83,84,108,111,97,100,101,100,92,117,110,100,101,102,105,110,101,100,10,92,100,101,102,92,80,83,84,108,111,97,100,101,100,123,116,125,10,92,112,115,115,101,116,123,97,114,114,111,119,115,105,122,101,61,46,48,49,32,51,46,50,32,49,46,52,32,46,51,125,10,92,112,115,115,101,116,123,100,111,116,115,105,122,101,61,46,48,49,125,10,92,99,97,116,99,111,100,101,96,64,61,49,49,10,10,0,0,0,0,0,0,0,0,108,101,102,116,32,106,117,115,116,105,102,105,101,100,44,32,0,0,0,0,0,0,0,0,117,98,121,116,101,0,0,0,92,80,83,84,64,76,111,110,103,68,97,115,104,0,0,0,104,105,115,116,101,112,115,10,0,0,0,0,0,0,0,0,105,110,100,101,120,101,115,32,108,117,0,0,0,0,0,0,120,50,32,114,97,110,103,101,32,105,115,32,105,110,118,97,108,105,100,0,0,0,0,0,39,58,39,32,101,120,112,101,99,116,101,100,0,0,0,0,75,80,95,49,0,0,0,0,112,115,0,0,0,0,0,0,92,80,83,84,64,68,111,116,116,101,100,0,0,0,0,0,92,80,83,84,64,68,97,115,104,101,100,0,0,0,0,0,92,80,83,84,64,83,111,108,105,100,0,0,0,0,0,0,92,80,83,84,64,65,120,101,115,0,0,0,0,0,0,0,124,51,120,45,50,124,0,0,34,37,115,34,32,0,0,0,92,80,83,84,64,66,111,114,100,101,114,0,0,0,0,0,59,0,0,0,0,0,0,0,70,73,88,69,68,58,32,32,37,115,10,0,0,0,0,0,40,37,46,52,102,44,37,46,52,102,41,10,0,0,0,0,105,108,108,101,103,97,108,32,100,97,121,32,111,102,32,109,111,110,116,104,0,0,0,0,36,37,102,32,92,116,105,109,101,115,32,49,48,94,123,37,100,125,36,0,0,0,0,0,99,111,115,0,0,0,0,0,36,37,102,36,0,0,0,0,109,112,32,116,105,116,108,101,0,0,0,0,0,0,0,0,113,110,111,114,109,0,0,0,115,117,109,95,115,113,0,0,36,37,100,32,92,116,105,109,101,115,32,49,48,94,123,37,100,125,36,0,0,0,0,0,10,9,32,32,108,97,98,101,108,115,32,97,114,101,32,0,117,105,110,116,56,0,0,0,36,37,100,36,0,0,0,0,102,115,116,101,112,115,10,0,109,97,116,114,105,120,32,58,32,116,104,105,110,32,112,108,97,116,101,32,115,112,108,105,110,101,115,32,50,100,0,0,117,110,101,120,112,101,99,116,101,100,32,125,0,0,0,0,42,42,0,0,0,0,0,0,75,80,95,48,0,0,0,0,112,111,105,110,116,115,36,105,122,101,0,0,0,0,0,0,36,49,48,94,123,37,100,125,36,0,0,0,0,0,0,0,48,0,0,0,0,0,0,0,99,112,52,51,55,0,0,0,123,37,115,125,10,0,0,0,32,121,108,111,119,32,121,104,105,103,104,0,0,0,0,0,40,37,46,52,102,44,37,46,52,102,41,0,0,0,0,0,51,32,109,117,108,32,50,32,115,117,98,32,97,98,115,0,112,117,115,104,100,0,0,0,123,76,125,0,0,0,0,0,99,111,117,108,100,32,110,111,116,32,114,101,97,100,32,112,97,114,97,109,101,116,101,114,45,102,105,108,101,32,34,37,115,34,0,0,0,0,0,0,91,114,93,0,0,0,0,0,91,108,93,0,0,0,0,0,115,105,110,0,0,0,0,0,92,114,112,117,116,0,0,0,71,80,86,65,76,95,77,85,76,84,73,80,76,79,84,0,99,110,36,111,114,109,97,108,0,0,0,0,0,0,0,0,115,117,109,0,0,0,0,0,99,108,36,101,97,114,0,0,92,80,83,84,64,70,105,108,108,112,101,110,116,97,103,111,110,0,0,0,0,0,0,0,10,9,32,32,116,105,99,115,32,97,114,101,32,108,105,109,105,116,101,100,32,116,111,32,100,97,116,97,32,114,97,110,103,101,0,0,0,0,0,0,98,121,116,101,0,0,0,0,110,111,114,111,36,116,97,116,101,0,0,0,0,0,0,0,78,101,101,100,32,48,32,116,111,32,50,32,117,115,105,110,103,32,115,112,101,99,115,32,102,111,114,32,115,116,97,116,115,32,99,111,109,109,97,110,100,0,0,0,0,0,0,0,92,80,83,84,64,70,105,108,108,99,105,114,99,108,101,0,115,116,101,112,115,10,0,0,116,104,105,110,32,112,108,97,116,101,32,115,112,108,105,110,101,115,32,105,110,32,100,103,114,105,100,51,100,0,0,0,101,120,112,101,99,116,105,110,103,32,123,119,104,105,108,101,45,99,108,97,117,115,101,125,0,0,0,0,0,0,0,0,105,110,118,97,108,105,100,32,101,120,112,114,101,115,115,105,111,110,32,0,0,0,0,0,75,80,95,68,105,118,105,100,101,0,0,0,0,0,0,0,78,111,32,112,111,105,110,116,116,121,112,101,32,115,112,101,99,105,102,105,101,114,32,97,108,108,111,119,101,100,44,32,104,101,114,101,0,0,0,0,92,80,83,84,64,70,105,108,108,116,114,105,97,110,103,108,101,0,0,0,0,0,0,0,92,80,83,84,64,70,105,108,108,115,113,117,97,114,101,0,92,80,83,84,64,70,105,108,108,100,105,97,109,111,110,100,0,0,0,0,0,0,0,0,92,80,83,84,64,80,101,110,116,97,103,111,110,0,0,0,124,51,120,45,49,124,0,0,92,80,83,84,64,84,114,105,97,110,103,108,101,0,0,0,102,105,116,116,101,100,32,112,97,114,97,109,101,116,101,114,115,32,97,110,100,32,105,110,105,116,105,97,108,32,118,97,108,117,101,115,32,102,114,111,109,32,102,105,108,101,58,32,37,115,10,10,0,0,0,0,92,80,83,84,64,67,105,114,99,108,101,0,0,0,0,0,92,80,83,84,64,67,114,111,115,115,0,0,0,0,0,0,99,111,110,106,103,0,0,0,92,80,83,84,64,83,113,117,97,114,101,0,0,0,0,0,105,110,118,97,108,105,100,32,111,114,32,100,117,112,108,105,99,97,116,101,32,111,112,116,105,111,110,0,0,0,0,0,107,36,100,101,110,115,105,116,121,0,0,0,0,0,0,0,115,116,100,100,101,118,0,0,92,80,83,84,64,80,108,117,115,0,0,0,0,0,0,0,32,97,110,100,32,109,105,114,114,111,114,101,100,32,111,110,32,111,112,112,111,115,105,116,101,32,98,111,114,100,101,114,0,0,0,0,0,0,0,0,105,110,116,56,0,0,0,0,92,80,83,84,64,68,105,97,109,111,110,100,0,0,0,0,105,110,112,117,116,32,108,105,110,101,32,99,111,112,121,0,114,111,36,116,97,116,101,0,32,37,100,10,0,0,0,0,98,111,120,120,121,101,114,114,111,114,98,97,114,115,10,0,71,114,105,100,100,105,110,103,32,111,102,32,116,104,101,32,99,111,108,111,114,32,99,111,108,117,109,110,32,105,115,32,110,111,116,32,105,109,112,108,101,109,101,110,116,101,100,0,101,120,112,101,99,116,105,110,103,32,123,100,111,45,99,108,97,117,115,101,125,0,0,0,98,105,110,0,0,0,0,0,83,107,105,112,112,105,110,103,32,100,97,116,97,32,102,105,108,101,32,119,105,116,104,32,110,111,32,118,97,108,105,100,32,112,111,105,110,116,115,0,37,115,40,37,46,52,102,44,37,46,52,102,41,10,0,0,75,80,95,68,101,99,105,109,97,108,0,0,0,0,0,0,32,43,37,100,10,0,0,0,92,113,100,105,115,107,40,37,46,52,102,44,37,46,52,102,41,123,37,46,52,102,125,10,0,0,0,0,0,0,0,0,99,111,110,116,111,117,114,32,100,101,108,116,97,95,116,0,32,40,117,110,100,101,102,105,110,101,100,41,10,0,0,0,97,100,100,95,116,105,99,95,117,115,101,114,58,32,108,105,115,116,32,115,111,114,116,32,101,114,114,111,114,0,0,0,123,45,62,125,0,0,0,0,35,32,115,101,116,32,111,117,116,112,117,116,32,39,37,115,39,10,0,0,0,0,0,0,32,37,99,32,100,117,109,109,121,10,0,0,0,0,0,0,92,80,83,84,64,65,114,114,111,119,37,115,40,37,46,52,102,44,37,46,52,102,41,40,37,46,52,102,44,37,46,52,102,41,10,0,0,0,0,0,102,117,110,99,116,105,111,110,32,116,111,32,112,108,111,116,32,101,120,112,101,99,116,101,100,0,0,0,0,0,0,0,32,37,115,10,0,0,0,0,51,32,109,117,108,32,49,32,115,117,98,32,97,98,115,0,92,100,101,102,92,112,111,108,121,112,109,73,73,73,100,35,49,123,92,112,115,112,111,108,121,103,111,110,91,108,105,110,101,115,116,121,108,101,61,110,111,110,101,44,102,105,108,108,115,116,121,108,101,61,115,111,108,105,100,44,102,105,108,108,99,111,108,111,114,61,80,83,84,64,67,79,76,79,82,35,49,93,125,10,10,0,0,0,10,9,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,0,0,0,0,0,0,0,85,115,97,103,101,58,32,103,110,117,112,108,111,116,32,91,79,80,84,73,79,78,93,46,46,46,32,91,70,73,76,69,93,10,32,32,45,86,44,32,45,45,118,101,114,115,105,111,110,10,32,32,45,104,44,32,45,45,104,101,108,112,10,32,32,45,112,32,32,45,45,112,101,114,115,105,115,116,10,32,32,45,100,32,32,45,45,100,101,102,97,117,108,116,45,115,101,116,116,105,110,103,115,10,32,32,45,101,32,32,34,99,111,109,109,97,110,100,49,59,32,99,111,109,109,97,110,100,50,59,32,46,46,46,34,10,103,110,117,112,108,111,116,32,37,115,32,112,97,116,99,104,108,101,118,101,108,32,37,115,10,0,0,0,0,0,0,0,92,110,101,119,114,103,98,99,111,108,111,114,123,80,83,84,64,67,79,76,79,82,37,100,125,123,37,103,32,37,103,32,37,103,125,10,0,0,0,0,102,105,116,32,112,97,114,97,109,0,0,0,0,0,0,0,32,40,102,105,120,109,97,120,41,0,0,0,0,0,0,0,112,101,114,109,95,97,116,0,92,110,101,119,103,114,97,121,123,80,83,84,64,67,79,76,79,82,37,100,125,123,37,103,125,10,0,0,0,0,0,0,32,40,102,105,120,109,105,110,41,0,0,0,0,0,0,0,112,115,116,114,105,99,107,115,58,32,80,97,108,101,116,116,101,32,117,115,101,100,32,98,101,102,111,114,101,32,115,101,116,33,10,0,0,0,0,0,97,114,103,0,0,0,0,0,32,40,109,97,120,41,0,0,101,120,112,101,99,116,105,110,103,32,60,121,111,102,102,115,101,116,62,0,0,0,0,0,40,37,46,52,103,44,37,46,52,103,41,0,0,0,0,0,99,117,109,36,117,108,97,116,105,118,101,0,0,0,0,0,109,101,97,110,0,0,0,0,109,111,117,115,101,46,99,0,103,110,117,112,108,111,116,62,32,0,0,0,0,0,0,0,32,40,109,105,110,41,0,0,111,110,32,98,111,114,100,101,114,0,0,0,0,0,0,0,108,102,0,0,0,0,0,0,92,112,111,108,121,112,109,73,73,73,100,123,37,100,125,0,9,37,115,58,32,37,115,37,115,37,115,37,115,37,115,44,32,0,0,0,0,0,0,0,98,111,120,101,114,114,111,114,98,97,114,115,10,0,0,0,78,111,32,117,115,97,98,108,101,32,100,97,116,97,32,105,110,32,116,104,105,115,32,112,108,111,116,32,116,111,32,97,117,116,111,45,115,99,97,108,101,32,97,120,105,115,32,114,97,110,103,101,0,0,0,0,99,97,108,108,95,97,114,103,99,32,62,61,32,48,32,38,38,32,99,97,108,108,95,97,114,103,99,32,60,61,32,57,0,0,0,0,0,0,0,0,101,108,115,101,32,119,105,116,104,111,117,116,32,105,102,0,78,101,101,100,32,117,115,105,110,103,32,115,112,101,99,32,102,111,114,32,121,32,116,105,109,101,32,100,97,116,97,0,99,111,108,117,109,110,0,0,83,105,110,103,117,108,97,114,32,109,97,116,114,105,120,32,105,110,32,73,110,118,101,114,116,95,82,116,82,0,0,0,99,98,111,120,0,0,0,0,115,112,108,105,110,101,32,104,101,108,112,32,109,97,116,114,105,120,0,0,0,0,0,0,37,37,32,71,78,85,80,76,79,84,58,32,76,97,84,101,88,32,117,115,105,110,103,32,84,69,88,68,82,65,87,32,109,97,99,114,111,115,10,0,75,80,95,83,117,98,116,114,97,99,116,0,0,0,0,0,115,112,114,105,110,116,102,95,115,112,101,99,105,102,105,101,114,58,32,110,111,32,102,111,114,109,97,116,32,115,112,101,99,105,102,105,101,114,10,0,9,97,117,116,111,115,99,97,108,105,110,103,32,105,115,32,0,0,0,0,0,0,0,0,92,101,110,100,123,116,101,120,100,114,97,119,125,10,0,0,114,97,110,103,101,32,115,112,101,99,105,102,105,101,114,115,32,111,102,32,115,117,109,32,109,117,115,116,32,104,97,118,101,32,105,110,116,101,103,101,114,32,118,97,108,117,101,115,0,0,0,0,0,0,0,0,9,101,114,114,111,114,115,32,97,114,101,32,112,108,111,116,116,101,100,32,119,105,116,104,111,117,116,32,98,97,114,115,10,0,0,0,0,0,0,0,40,37,100,32,37,100,41,0,9,101,114,114,111,114,98,97,114,115,32,97,114,101,32,112,108,111,116,116,101,100,32,105,110,32,37,115,32,119,105,116,104,32,98,97,114,115,32,111,102,32,115,105,122,101,32,37,102,10,0,0,0,0,0,0,10,92,99,112,97,116,104,32,0,0,0,0,0,0,0,0,9,98,111,114,100,101,114,32,37,100,32,105,115,32,100,114,97,119,110,32,105,110,32,37,115,32,111,102,32,116,104,101,32,112,108,111,116,32,101,108,101,109,101,110,116,115,32,119,105,116,104,10,9,32,0,0,51,120,45,50,0,0,0,0,92,112,97,116,104,32,40,37,100,32,37,100,41,0,0,0,9,98,111,114,100,101,114,32,105,115,32,110,111,116,32,100,114,97,119,110,10,0,0,0,92,108,105,110,101,119,100,32,37,100,10,0,0,0,0,0,78,101,101,100,32,118,105,97,32,97,110,100,32,101,105,116,104,101,114,32,112,97,114,97,109,101,116,101,114,32,108,105,115,116,32,111,114,32,102,105,108,101,0,0,0,0,0,0,114,101,108,97,116,105,118,101,0,0,0,0,0,0,0,0,92,37,99,116,101,120,116,123,37,115,125,10,0,0,0,0,97,98,115,111,108,117,116,101,0,0,0,0,0,0,0,0,92,116,101,120,116,114,101,102,32,104,58,82,32,118,58,67,32,0,0,0,0,0,0,0,105,109,97,103,0,0,0,0,9,98,111,120,119,105,100,116,104,32,105,115,32,37,103,32,37,115,10,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,60,121,115,99,97,108,101,62,0,0,0,0,0,0,92,116,101,120,116,114,101,102,32,104,58,76,32,118,58,67,32,0,0,0,0,0,0,0,102,36,114,101,113,117,101,110,99,121,0,0,0,0,0,0,37,115,37,115,9,37,102,10,0,0,0,0,0,0,0,0,9,98,111,120,119,105,100,116,104,32,105,115,32,97,117,116,111,10,0,0,0,0,0,0,32,97,110,100,32,109,105,114,114,111,114,101,100,32,37,115,0,0,0,0,0,0,0,0,100,111,117,98,108,101,0,0,92,109,111,118,101,32,40,37,100,32,37,100,41,0,0,0,115,99,36,97,108,101,0,0,9,110,111,116,32,100,114,97,119,105,110,103,32,108,105,110,101,115,32,98,101,116,119,101,101,110,32,116,119,111,32,111,117,116,114,97,110,103,101,32,112,111,105,110,116,115,10,0,87,114,111,110,103,32,110,117,109,98,101,114,32,111,102,32,99,111,108,117,109,110,115,32,105,110,32,105,110,112,117,116,32,100,97,116,97,32,45,32,108,105,110,101,32,37,100,0,73,110,118,97,108,105,100,32,123,101,108,115,101,45,99,108,97,117,115,101,125,0,0,0,119,111,114,100,115,0,0,0,92,102,99,105,114,32,102,58,48,46,57,32,114,58,49,54,0,0,0,0,0,0,0,0,75,80,95,83,101,112,97,114,97,116,111,114,0,0,0,0,115,112,114,105,110,116,102,95,115,112,101,99,105,102,105,101,114,58,32,117,115,101,100,32,119,105,116,104,32,105,110,118,97,108,105,100,32,102,111,114,109,97,116,32,115,112,101,99,105,102,105,101,114,10,0,0,9,100,114,97,119,105,110,103,32,97,110,100,32,99,108,105,112,112,105,110,103,32,108,105,110,101,115,32,98,101,116,119,101,101,110,32,116,119,111,32,111,117,116,114,97,110,103,101,32,112,111,105,110,116,115,10,0,0,0,0,0,0,0,0,92,102,99,105,114,32,102,58,48,46,57,32,114,58,49,50,0,0,0,0,0,0,0,0,9,110,111,116,32,100,114,97,119,105,110,103,32,108,105,110,101,115,32,98,101,116,119,101,101,110,32,105,110,114,97,110,103,101,32,97,110,100,32,111,117,116,114,97,110,103,101,32,112,111,105,110,116,115,10,0,92,102,99,105,114,32,102,58,48,46,57,32,114,58,57,0,9,100,114,97,119,105,110,103,32,97,110,100,32,99,108,105,112,112,105,110,103,32,108,105,110,101,115,32,98,101,116,119,101,101,110,32,105,110,114,97,110,103,101,32,97,110,100,32,111,117,116,114,97,110,103,101,32,112,111,105,110,116,115,10,0,0,0,0,0,0,0,0,92,108,99,105,114,32,114,58,49,54,0,0,0,0,0,0,9,112,111,105,110,116,32,99,108,105,112,32,105,115,32,37,115,10,0,0,0,0,0,0,51,32,109,117,108,32,50,32,115,117,98,0,0,0,0,0,92,108,99,105,114,32,114,58,49,50,0,0,0,0,0,0,9,99,111,110,116,111,117,114,32,108,105,110,101,32,116,121,112,101,115,32,97,114,101,32,97,108,108,32,116,104,101,32,115,97,109,101,10,0,0,0,92,108,99,105,114,32,114,58,57,0,0,0,0,0,0,0,118,105,97,0,0,0,0,0,9,99,111,110,116,111,117,114,32,108,105,110,101,32,116,121,112,101,115,32,97,114,101,32,118,97,114,105,101,100,32,38,32,108,97,98,101,108,101,100,32,119,105,116,104,32,102,111,114,109,97,116,32,39,37,115,39,10,0,0,0,0,0,0,92,104,116,101,120,116,123,36,92,115,116,97,114,36,125,0,9,9,37,100,32,105,110,99,114,101,109,101,110,116,97,108,32,108,101,118,101,108,115,32,115,116,97,114,116,105,110,103,32,97,116,32,37,103,44,32,115,116,101,112,32,37,103,44,32,101,110,100,32,37,103,10,0,0,0,0,0,0,0,0,92,104,116,101,120,116,123,36,92,116,114,105,97,110,103,108,101,36,125,0,0,0,0,0,98,101,108,111,119,0,0,0,114,101,97,108,0,0,0,0,44,37,103,32,0,0,0,0,111,110,108,121,32,118,97,108,105,100,32,97,115,32,112,97,114,116,32,111,102,32,97,110,32,97,117,116,111,45,108,97,121,111,117,116,32,99,111,109,109,97,110,100,0,0,0,0,92,104,116,101,120,116,123,36,92,116,105,109,101,115,36,125,0,0,0,0,0,0,0,0,97,98,111,118,101,0,0,0,117,36,110,105,113,117,101,0,37,49,49,46,53,101,0,0,111,110,32,97,120,105,115,0,102,0,0,0,0,0,0,0,92,114,109,111,118,101,40,48,32,52,41,92,104,116,101,120,116,123,36,92,66,111,120,36,125,0,0,0,0,0,0,0,111,117,116,36,119,97,114,100,115,0,0,0,0,0,0,0,9,9,37,100,32,100,105,115,99,114,101,116,101,32,108,101,118,101,108,115,32,97,116,32,0,0,0,0,0,0,0,0,100,97,116,97,0,0,0,0,73,110,116,101,114,110,97,108,32,101,114,114,111,114,58,32,85,110,107,110,111,119,110,32,109,97,112,112,105,110,103,32,116,121,112,101,0,0,0,0,79,108,100,45,115,116,121,108,101,32,105,102,47,101,108,115,101,32,115,116,97,116,101,109,101,110,116,32,101,110,99,111,117,110,116,101,114,101,100,32,105,110,115,105,100,101,32,98,114,97,99,107,101,116,115,0,78,101,119,32,104,105,115,116,111,103,114,97,109,0,0,0,115,112,114,105,110,116,102,0,92,104,116,101,120,116,123,36,43,36,125,0,0,0,0,0,75,80,95,65,100,100,0,0,105,110,116,101,114,110,97,108,32,101,114,114,111,114,58,32,115,112,114,105,110,116,102,95,115,112,101,99,105,102,105,101,114,32,99,97,108,108,101,100,32,119,105,116,104,111,117,116,32,39,37,39,10,0,0,0,9,9,97,112,112,114,111,120,46,32,37,100,32,97,117,116,111,109,97,116,105,99,32,108,101,118,101,108,115,10,0,0,92,114,109,111,118,101,40,48,32,52,41,92,104,116,101,120,116,123,36,92,68,105,97,109,111,110,100,36,125,0,0,0,121,50,0,0,0,0,0,0,9,9,97,115,32,98,115,112,108,105,110,101,32,97,112,112,114,111,120,105,109,97,116,105,111,110,32,115,101,103,109,101,110,116,115,32,111,102,32,111,114,100,101,114,32,37,100,32,119,105,116,104,32,37,100,32,112,116,115,10,0,0,0,0,92,104,116,101,120,116,123,36,92,99,100,111,116,36,125,0,120,50,0,0,0,0,0,0,9,9,97,115,32,99,117,98,105,99,32,115,112,108,105,110,101,32,105,110,116,101,114,112,111,108,97,116,105,111,110,32,115,101,103,109,101,110,116,115,32,119,105,116,104,32,37,100,32,112,116,115,10,0,0,0,92,116,101,120,116,114,101,102,32,104,58,67,32,118,58,67,32,0,0,0,0,0,0,0,121,49,0,0,0,0,0,0,9,9,97,115,32,108,105,110,101,97,114,32,115,101,103,109,101,110,116,115,10,0,0,0,67,97,110,39,116,32,117,115,101,32,112,109,51,100,32,102,111,114,32,50,100,32,112,108,111,116,115,0,0,0,0,0,51,120,45,49,0,0,0,0,92,109,111,118,101,32,40,37,100,32,37,100,41,10,0,0,120,49,0,0,0,0,0,0,103,114,105,100,32,98,97,115,101,32,97,110,100,32,115,117,114,102,97,99,101,10,0,0,92,109,111,118,101,32,40,37,100,32,37,100,41,92,37,99,118,101,99,32,40,37,100,32,37,100,41,0,0,0,0,0,99,36,108,111,115,101,100,0,102,117,110,99,116,105,111,110,32,117,115,101,100,32,102,111,114,32,102,105,116,116,105,110,103,58,32,37,115,10,0,0,115,117,114,102,97,99,101,10,0,0,0,0,0,0,0,0,10,10,102,111,110,116,95,105,100,101,110,116,105,102,105,101,114,58,61,34,71,78,85,80,76,79,84,34,59,10,102,111,110,116,95,115,105,122,101,32,55,50,112,116,35,59,10,116,104,35,61,48,46,52,112,116,35,59,32,100,101,102,105,110,101,95,119,104,111,108,101,95,112,105,120,101,108,115,40,116,104,41,59,10,10,112,97,116,104,32,97,114,114,111,119,104,101,97,100,59,10,97,114,114,111,119,104,101,97,100,32,61,32,40,45,55,112,116,44,45,50,112,116,41,123,100,105,114,51,48,125,46,46,40,45,54,112,116,44,48,112,116,41,46,46,123,100,105,114,49,53,48,125,40,45,55,112,116,44,50,112,116,41,32,38,10,32,32,40,45,55,112,116,44,50,112,116,41,45,45,40,48,112,116,44,48,112,116,41,45,45,40,45,55,112,116,44,45,50,112,116,41,32,38,32,99,121,99,108,101,59,10,0,0,0,0,101,108,108,36,105,112,115,101,115,0,0,0,0,0,0,0,103,114,105,100,32,98,97,115,101,10,0,0,0,0,0,0,10,100,101,102,32,101,110,100,99,104,97,114,32,61,10,32,32,37,32,78,101,120,116,32,108,105,110,101,32,115,104,111,117,108,100,32,112,114,111,98,97,98,108,121,32,98,101,32,114,101,109,111,118,101,100,32,105,102,32,67,77,32,98,97,115,101,32,105,115,32,117,115,101,100,10,32,32,108,58,61,48,59,32,114,58,61,119,59,10,32,32,37,73,110,99,108,117,100,101,32,116,104,101,32,110,101,120,116,32,116,119,111,32,108,105,110,101,115,32,105,102,32,121,111,117,32,119,97,110,116,32,116,111,10,32,32,37,114,111,116,97,116,101,32,116,104,101,32,112,105,99,116,117,114,101,32,57,48,32,100,101,103,46,40,80,111,114,116,114,97,105,116,32,116,111,32,76,97,110,100,115,99,97,112,101,41,10,32,32,37,99,117,114,114,101,110,116,112,105,99,116,117,114,101,58,61,99,117,114,114,101,110,116,112,105,99,116,117,114,101,32,114,111,116,97,116,101,100,32,57,48,32,115,104,105,102,116,101,100,32,40,104,44,48,41,59,10,32,32,37,116,109,112,58,61,99,104,97,114,104,116,59,32,99,104,97,114,104,116,58,61,99,104,97,114,119,100,59,32,99,104,97,114,119,100,58,61,116,109,112,59,10,32,32,115,99,97,110,116,111,107,101,110,115,32,101,120,116,114,97,95,101,110,100,99,104,97,114,59,10,32,32,105,102,32,112,114,111,111,102,105,110,103,62,48,58,32,109,97,107,101,98,111,120,40,112,114,111,111,102,114,117,108,101,41,59,32,102,105,10,32,32,99,104,97,114,100,120,58,61,119,59,10,32,32,115,104,105,112,105,116,59,10,32,32,105,102,32,100,105,115,112,108,97,121,105,110,103,62,48,58,32,109,97,107,101,98,111,120,40,115,99,114,101,101,110,114,117,108,101,41,59,32,115,104,111,119,105,116,59,32,102,105,10,32,32,101,110,100,103,114,111,117,112,32,10,101,110,100,100,101,102,59,10,108,101,116,32,101,110,100,99,104,97,114,95,32,61,32,101,110,100,99,104,97,114,59,10,108,101,116,32,103,101,110,101,114,97,116,101,32,61,32,105,110,112,117,116,59,10,108,101,116,32,114,111,109,97,110,32,61,32,114,111,109,97,110,59,10,0,99,105,114,36,99,108,101,115,0,0,0,0,0,0,0,0,51,100,112,108,111,116,0,0,116,105,109,101,99,111,108,117,109,110,0,0,0,0,0,0,32,105,110,32,37,100,32,108,101,118,101,108,115,32,111,110,32,0,0,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,60,110,117,109,95,99,111,108,115,62,0,0,0,0,10,99,109,99,104,97,114,32,34,80,101,114,105,111,100,34,59,10,32,32,110,117,109,101,114,105,99,32,100,111,116,95,100,105,97,109,35,59,32,100,111,116,95,100,105,97,109,35,58,61,105,102,32,109,111,110,111,115,112,97,99,101,58,32,53,47,52,32,102,105,92,32,100,111,116,95,115,105,122,101,35,59,10,32,32,100,101,102,105,110,101,95,119,104,111,108,101,95,98,108,97,99,107,101,114,95,112,105,120,101,108,115,40,100,111,116,95,100,105,97,109,41,59,10,32,32,98,101,103,105,110,99,104,97,114,40,34,46,34,44,53,117,35,44,100,111,116,95,100,105,97,109,35,44,48,41,59,10,32,32,97,100,106,117,115,116,95,102,105,116,40,48,44,48,41,59,32,112,105,99,107,117,112,32,102,105,110,101,46,110,105,98,59,10,32,32,112,111,115,49,40,100,111,116,95,100,105,97,109,44,48,41,59,32,112,111,115,50,40,100,111,116,95,100,105,97,109,44,57,48,41,59,10,32,32,108,102,116,32,120,49,108,61,104,114,111,117,110,100,40,46,53,119,45,46,53,100,111,116,95,100,105,97,109,41,59,32,98,111,116,32,121,50,108,61,48,59,32,122,49,61,122,50,59,32,100,111,116,40,49,44,50,41,59,9,37,32,100,111,116,10,32,32,112,101,110,108,97,98,101,108,115,40,49,44,50,41,59,10,101,110,100,99,104,97,114,59,10,0,0,0,0,0,0,0,0,114,103,98,97,36,108,112,104,97,0,0,0,0,0,0,0,115,36,98,101,122,105,101,114,0,0,0,0,0,0,0,0,37,49,49,46,52,102,0,0,110,111,116,32,100,114,97,119,110,10,0,0,0,0,0,0,79,70,70,10,0,0,0,0,102,108,111,97,116,0,0,0,105,110,112,117,116,32,99,109,114,49,48,46,109,102,10,105,102,32,108,105,103,115,62,49,58,32,102,111,110,116,95,99,111,100,105,110,103,95,115,99,104,101,109,101,58,61,34,84,101,88,32,116,101,120,116,34,59,10,32,32,115,112,97,110,105,115,104,95,115,104,114,105,101,107,61,111,99,116,34,48,55,52,34,59,32,115,112,97,110,105,115,104,95,113,117,101,114,121,61,111,99,116,34,48,55,54,34,59,10,101,108,115,101,58,32,102,111,110,116,95,99,111,100,105,110,103,95,115,99,104,101,109,101,58,61,10,32,32,105,102,32,108,105,103,115,61,48,58,32,34,84,101,88,32,116,121,112,101,119,114,105,116,101,114,32,116,101,120,116,34,10,32,32,101,108,115,101,58,32,34,84,101,88,32,116,101,120,116,32,119,105,116,104,111,117,116,32,102,45,108,105,103,97,116,117,114,101,115,34,32,102,105,59,10,32,32,115,112,97,110,105,115,104,95,115,104,114,105,101,107,61,111,99,116,34,48,49,54,34,59,32,115,112,97,110,105,115,104,95,113,117,101,114,121,61,111,99,116,34,48,49,55,34,59,32,102,105,10,102,111,110,116,95,115,101,116,117,112,59,10,105,110,112,117,116,32,114,111,109,97,110,117,46,109,102,32,37,82,111,109,97,110,32,117,112,112,101,114,99,97,115,101,46,10,105,110,112,117,116,32,114,111,109,97,110,108,46,109,102,32,37,82,111,109,97,110,32,108,111,119,101,114,99,97,115,101,46,10,105,110,112,117,116,32,103,114,101,101,107,117,46,109,102,32,37,71,114,101,101,107,32,117,112,112,101,114,99,97,115,101,46,10,105,110,112,117,116,32,114,111,109,97,110,100,46,109,102,32,37,78,117,109,101,114,97,108,115,46,10,105,110,112,117,116,32,114,111,109,97,110,112,46,109,102,32,37,65,109,112,101,114,115,97,110,100,44,32,113,117,101,115,116,105,111,110,32,109,97,114,107,115,44,32,99,117,114,114,101,110,99,121,32,115,105,103,110,46,10,105,110,112,117,116,32,114,111,109,115,112,108,46,109,102,32,37,76,111,119,101,114,99,97,115,101,32,115,112,101,99,105,97,108,115,32,40,100,111,116,108,101,115,115,32,92,105,44,32,108,105,103,97,116,117,114,101,32,92,97,101,44,32,101,116,99,46,41,10,105,110,112,117,116,32,114,111,109,115,112,117,46,109,102,32,37,85,112,112,101,114,99,97,115,101,32,115,112,101,99,105,97,108,115,32,40,92,65,69,44,32,92,79,69,44,32,92,79,41,10,105,110,112,117,116,32,112,117,110,99,116,46,109,102,32,37,80,117,110,99,116,117,97,116,105,111,110,32,115,121,109,98,111,108,115,46,10,10,109,105,110,117,115,61,65,83,67,73,73,34,45,34,59,32,99,109,99,104,97,114,32,34,77,105,110,117,115,32,115,105,103,110,34,59,10,32,98,101,103,105,110,97,114,105,116,104,99,104,97,114,40,109,105,110,117,115,41,59,32,10,32,32,112,105,99,107,117,112,32,114,117,108,101,46,110,105,98,59,10,32,32,108,102,116,32,120,49,61,104,114,111,117,110,100,32,49,46,53,117,45,101,112,115,59,10,32,32,120,50,61,119,45,120,49,59,32,121,49,61,121,50,61,109,97,116,104,95,97,120,105,115,59,10,32,32,100,114,97,119,32,122,49,45,45,122,50,59,9,32,37,32,98,97,114,10,32,32,108,97,98,101,108,115,40,49,44,50,41,59,32,10,101,110,100,99,104,97,114,59,10,0,0,0,0,0,0,0,0,114,103,98,105,109,97,36,103,101,0,0,0,0,0,0,0,105,110,36,119,97,114,100,115,0,0,0,0,0,0,0,0,9,99,111,110,116,111,117,114,32,102,111,114,32,115,117,114,102,97,99,101,115,32,97,114,101,32,37,115,0,0,0,0,102,105,108,108,101,100,99,117,114,118,101,115,32,0,0,0,78,101,101,100,32,50,32,111,114,32,51,32,99,111,108,117,109,110,115,0,0,0,0,0,99,108,97,117,115,101,0,0,76,111,103,32,115,99,97,108,101,32,111,110,32,89,32,105,115,32,105,110,99,111,109,112,97,116,105,98,108,101,32,119,105,116,104,32,115,116,97,99,107,101,100,32,104,105,115,116,111,103,114,97,109,32,112,108,111,116,10,0,0,0,0,0,80,111,115,105,116,105,118,101,32,105,110,116,101,103,101,114,32,101,120,112,101,99,116,101,100,0,0,0,0,0,0,0,10,100,101,102,32,101,110,100,99,104,97,114,32,61,10,32,32,114,91,99,104,97,114,99,111,100,101,93,58,61,99,117,114,114,101,110,116,112,105,99,116,117,114,101,59,10,32,32,119,100,91,99,104,97,114,99,111,100,101,93,58,61,119,59,104,116,91,99,104,97,114,99,111,100,101,93,58,61,104,59,100,112,91,99,104,97,114,99,111,100,101,93,58,61,100,59,10,32,32,109,101,115,115,97,103,101,32,34,80,105,99,116,117,114,101,32,111,102,32,99,104,97,114,99,111,100,101,32,110,111,46,34,32,38,32,100,101,99,105,109,97,108,32,99,104,97,114,99,111,100,101,59,10,32,32,101,110,100,103,114,111,117,112,59,10,101,110,100,100,101,102,59,10,108,101,116,32,101,110,100,99,104,97,114,95,32,61,32,101,110,100,99,104,97,114,59,10,108,101,116,32,103,101,110,101,114,97,116,101,32,61,32,114,101,108,97,120,59,10,108,101,116,32,114,111,109,97,110,32,61,32,114,101,108,97,120,59,10,0,0,105,109,97,36,103,101,0,0,75,80,95,77,117,108,116,105,112,108,121,0,0,0,0,0,118,97,114,36,105,97,98,108,101,0,0,0,0,0,0,0,97,116,116,101,109,112,116,32,116,111,32,97,115,115,105,103,110,32,116,111,32,115,111,109,101,116,104,105,110,103,32,111,116,104,101,114,32,116,104,97,110,32,97,32,110,97,109,101,100,32,118,97,114,105,97,98,108,101,0,0,0,0,0,0,9,100,97,116,97,32,103,114,105,100,51,100,32,105,115,32,100,105,115,97,98,108,101,100,10,0,0,0,0,0,0,0,10,100,101,102,32,112,117,116,95,116,101,120,116,40,101,120,112,114,32,116,115,44,120,115,116,97,114,116,44,121,115,116,97,114,116,44,114,111,116,44,106,117,115,116,105,102,105,99,97,116,105,111,110,41,32,61,10,32,32,98,101,103,105,110,103,114,111,117,112,10,32,32,32,32,116,101,120,116,95,119,105,100,116,104,58,61,48,59,116,101,120,116,95,104,101,105,103,104,116,58,61,48,59,116,101,120,116,95,100,101,112,116,104,58,61,48,59,10,32,32,32,32,102,111,114,32,105,110,100,58,61,48,32,115,116,101,112,32,49,32,117,110,116,105,108,32,108,101,110,103,116,104,40,116,115,41,45,49,58,10,32,32,32,32,32,32,100,101,99,95,110,117,109,58,61,65,83,67,73,73,32,115,117,98,115,116,114,105,110,103,32,40,105,110,100,44,105,110,100,43,49,41,32,111,102,32,116,115,59,10,32,32,32,32,32,32,105,102,32,117,110,107,110,111,119,110,32,114,91,100,101,99,95,110,117,109,93,58,32,100,101,99,95,110,117,109,58,61,51,50,59,32,102,105,10,32,32,32,32,32,32,105,102,32,100,101,99,95,110,117,109,61,51,50,58,32,10,32,32,32,32,32,32,32,32,116,101,120,116,95,119,105,100,116,104,58,61,116,101,120,116,95,119,105,100,116,104,43,119,100,91,54,53,93,59,10,32,32,32,32,32,32,32,32,116,101,120,116,95,104,101,105,103,104,116,58,61,109,97,120,40,116,101,120,116,95,104,101,105,103,104,116,44,104,116,91,54,53,93,41,59,10,32,32,32,32,32,32,32,32,116,101,120,116,95,100,101,112,116,104,58,61,109,97,120,40,116,101,120,116,95,100,101,112,116,104,44,100,112,91,54,53,93,41,59,10,32,32,32,32,32,32,101,108,115,101,105,102,32,100,101,99,95,110,117,109,62,61,48,58,32,10,32,32,32,32,32,32,32,32,116,101,120,116,95,119,105,100,116,104,58,61,116,101,120,116,95,119,105,100,116,104,43,119,100,91,100,101,99,95,110,117,109,93,59,10,32,32,32,32,32,32,32,32,116,101,120,116,95,104,101,105,103,104,116,58,61,109,97,120,40,116,101,120,116,95,104,101,105,103,104,116,44,104,116,91,100,101,99,95,110,117,109,93,41,59,10,32,32,32,32,32,32,32,32,116,101,120,116,95,100,101,112,116,104,58,61,109,97,120,40,116,101,120,116,95,100,101,112,116,104,44,100,112,91,100,101,99,95,110,117,109,93,41,59,10,32,32,32,32,32,32,102,105,10,32,32,32,32,101,110,100,102,111,114,10,32,32,32,32,105,102,32,114,111,116,61,57,48,58,10,32,32,32,32,32,32,105,102,32,106,117,115,116,105,102,105,99,97,116,105,111,110,61,49,58,32,121,110,101,120,116,58,61,121,115,116,97,114,116,59,10,32,32,32,32,32,32,101,108,115,101,105,102,32,106,117,115,116,105,102,105,99,97,116,105,111,110,61,50,58,32,121,110,101,120,116,58,61,114,111,117,110,100,40,121,115,116,97,114,116,45,116,101,120,116,95,119,105,100,116,104,47,50,41,59,10,32,32,32,32,32,32,101,108,115,101,58,32,121,110,101,120,116,58,61,114,111,117,110,100,40,121,115,116,97,114,116,45,116,101,120,116,95,119,105,100,116,104,41,59,10,32,32,32,32,32,32,102,105,10,32,32,32,32,32,32,120,110,101,120,116,58,61,120,115,116,97,114,116,43,40,116,101,120,116,95,104,101,105,103,104,116,45,116,101,120,116,95,100,101,112,116,104,41,47,50,59,10,32,32,32,32,101,108,115,101,58,10,32,32,32,32,32,32,105,102,32,106,117,115,116,105,102,105,99,97,116,105,111,110,61,49,58,32,120,110,101,120,116,58,61,120,115,116,97,114,116,59,10,32,32,32,32,32,32,101,108,115,101,105,102,32,106,117,115,116,105,102,105,99,97,116,105,111,110,61,50,58,32,120,110,101,120,116,58,61,114,111,117,110,100,40,120,115,116,97,114,116,45,116,101,120,116,95,119,105,100,116,104,47,50,41,59,10,32,32,32,32,32,32,101,108,115,101,58,32,120,110,101,120,116,58,61,114,111,117,110,100,40,120,115,116,97,114,116,45,116,101,120,116,95,119,105,100,116,104,41,59,10,32,32,32,32,32,32,102,105,10,32,32,32,32,32,32,121,110,101,120,116,58,61,121,115,116,97,114,116,45,40,116,101,120,116,95,104,101,105,103,104,116,45,116,101,120,116,95,100,101,112,116,104,41,47,50,59,10,32,32,32,32,102,105,10,32,32,32,32,102,111,114,32,105,110,100,58,61,48,32,115,116,101,112,32,49,32,117,110,116,105,108,32,108,101,110,103,116,104,40,116,115,41,45,49,58,10,32,32,32,32,32,32,100,101,99,95,110,117,109,58,61,65,83,67,73,73,32,115,117,98,115,116,114,105,110,103,32,40,105,110,100,44,105,110,100,43,49,41,32,111,102,32,116,115,59,10,32,32,32,32,32,32,105,102,32,117,110,107,110,111,119,110,32,114,91,100,101,99,95,110,117,109,93,58,32,100,101,99,95,110,117,109,58,61,51,50,59,32,102,105,10,32,32,32,32,32,32,105,102,32,100,101,99,95,110,117,109,61,51,50,58,32,10,32,32,32,32,32,32,32,32,120,110,101,120,116,58,61,120,110,101,120,116,43,119,100,91,54,53,93,42,99,111,115,100,32,114,111,116,59,10,32,32,32,32,32,32,32,32,121,110,101,120,116,58,61,121,110,101,120,116,43,119,100,91,54,53,93,42,115,105,110,100,32,114,111,116,59,10,32,32,32,32,32,32,101,108,115,101,105,102,32,100,101,99,95,110,117,109,62,61,48,58,32,10,32,32,32,32,32,32,32,32,99,117,114,114,101,110,116,112,105,99,116,117,114,101,58,61,99,117,114,114,101,110,116,112,105,99,116,117,114,101,43,114,91,100,101,99,95,110,117,109,93,32,115,104,105,102,116,101,100,40,120,110,101,120,116,44,121,110,101,120,116,41,10,32,32,32,32,32,32,32,32,32,32,114,111,116,97,116,101,100,97,114,111,117,110,100,32,40,40,120,110,101,120,116,44,121,110,101,120,116,41,44,114,111,116,41,59,32,10,32,32,32,32,32,32,32,32,120,110,101,120,116,58,61,120,110,101,120,116,43,119,100,91,100,101,99,95,110,117,109,93,42,99,111,115,100,32,114,111,116,59,10,32,32,32,32,32,32,32,32,121,110,101,120,116,58,61]) -.concat([121,110,101,120,116,43,119,100,91,100,101,99,95,110,117,109,93,42,115,105,110,100,32,114,111,116,59,10,32,32,32,32,32,32,102,105,10,32,32,32,32,101,110,100,102,111,114,10,32,32,101,110,100,103,114,111,117,112,32,10,101,110,100,100,101,102,59,10,0,0,0,0,108,97,98,101,108,115,0,0,44,32,107,100,101,110,115,105,116,121,50,100,32,109,111,100,101,0,0,0,0,0,0,0,99,111,108,111,114,32,97,120,105,115,0,0,0,0,0,0,10,37,73,110,99,108,117,100,101,32,110,101,120,116,32,101,105,103,104,116,32,108,105,110,101,115,32,105,102,32,121,111,117,32,104,97,118,101,32,112,114,111,98,108,101,109,115,32,119,105,116,104,32,116,104,101,32,109,111,100,101,32,111,110,32,121,111,117,114,32,115,121,115,116,101,109,46,46,10,37,112,114,111,111,102,105,110,103,58,61,48,59,10,37,102,111,110,116,109,97,107,105,110,103,58,61,49,59,10,37,116,114,97,99,105,110,103,116,105,116,108,101,115,58,61,48,59,10,37,112,105,120,101,108,115,95,112,101,114,95,105,110,99,104,58,61,51,48,48,59,10,37,98,108,97,99,107,101,114,58,61,48,59,10,37,102,105,108,108,105,110,58,61,46,50,59,10,37,111,95,99,111,114,114,101,99,116,105,111,110,58,61,46,54,59,10,37,102,105,120,95,117,110,105,116,115,59,10,0,0,0,0,0,0,0,0,99,97,110,36,100,108,101,115,116,105,99,107,115,0,0,0,9,100,97,116,97,32,103,114,105,100,51,100,32,105,115,32,101,110,97,98,108,101,100,32,102,111,114,32,109,101,115,104,32,111,102,32,115,105,122,101,32,37,100,120,37,100,44,32,107,101,114,110,101,108,61,37,115,44,10,9,115,99,97,108,101,32,102,97,99,116,111,114,115,32,120,61,37,102,44,32,121,61,37,102,37,115,10,0,105,102,32,117,110,107,110,111,119,110,32,99,109,98,97,115,101,58,32,105,110,112,117,116,32,99,109,98,97,115,101,32,102,105,10,10,116,114,97,99,105,110,103,115,116,97,116,115,58,61,49,59,10,112,105,99,116,117,114,101,32,114,91,93,59,10,10,100,101,102,32,111,112,101,110,105,116,32,61,32,111,112,101,110,119,105,110,100,111,119,32,99,117,114,114,101,110,116,119,105,110,100,111,119,10,32,32,102,114,111,109,32,40,48,44,48,41,32,116,111,32,40,52,48,48,44,56,48,48,41,32,97,116,32,40,45,53,48,44,53,48,48,41,32,101,110,100,100,101,102,59,10,10,109,111,100,101,95,115,101,116,117,112,59,10,0,0,0,102,105,110,36,97,110,99,101,98,97,114,115,0,0,0,0,9,100,97,116,97,32,103,114,105,100,51,100,32,105,115,32,101,110,97,98,108,101,100,32,102,111,114,32,109,101,115,104,32,111,102,32,115,105,122,101,32,37,100,120,37,100,44,32,115,112,108,105,110,101,115,10,0,0,0,0,0,0,0,0,51,32,109,117,108,32,49,32,115,117,98,0,0,0,0,0,101,110,100,99,104,97,114,59,10,0,0,0,0,0,0,0,118,101,99,36,116,111,114,115,0,0,0,0,0,0,0,0,9,100,97,116,97,32,103,114,105,100,51,100,32,105,115,32,101,110,97,98,108,101,100,32,102,111,114,32,109,101,115,104,32,111,102,32,115,105,122,101,32,37,100,120,37,100,44,32,110,111,114,109,61,37,100,10,0,0,0,0,0,0,0,0,68,97,109,97,103,101,100,32,69,68,70,32,104,101,97,100,101,114,32,111,102,32,37,115,58,32,110,111,116,32,109,117,108,116,105,112,108,101,32,111,102,32,53,49,50,32,66,46,10,0,0,0,0,0,0,0,97,58,61,119,47,37,100,59,98,58,61,104,47,37,100,59,10,0,0,0,0,0,0,0,104,105,115,36,116,101,112,115,0,0,0,0,0,0,0,0,32,32,32,32,32,32,32,32,114,101,115,105,100,117,97,108,115,32,97,114,101,32,119,101,105,103,104,116,101,100,32,101,113,117,97,108,108,121,32,40,117,110,105,116,32,119,101,105,103,104,116,41,10,10,0,0,9,99,111,109,109,97,110,100,32,108,105,110,101,32,109,97,99,114,111,115,32,119,105,108,108,32,37,115,98,101,32,101,120,112,97,110,100,101,100,10,0,0,0,0,0,0,0,0,65,115,115,101,114,116,105,111,110,32,102,97,105,108,101,100,58,32,37,115,0,0,0,0,10,10,98,101,103,105,110,99,104,97,114,40,37,100,44,37,103,105,110,35,44,37,103,105,110,35,44,48,41,59,10,0,102,115,36,116,101,112,115,0,99,121,108,105,110,100,114,105,99,97,108,10,0,0,0,0,100,114,97,119,32,40,37,100,97,44,37,100,98,41,45,45,40,37,100,97,44,37,100,98,41,59,10,0,0,0,0,0,102,105,108,108,115,116,36,101,112,115,0,0,0,0,0,0,118,97,108,105,100,0,0,0,115,112,104,101,114,105,99,97,108,10,0,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,39,44,32,60,110,117,109,95,99,111,108,115,62,39,0,0,0,0,0,0,0,0,100,114,97,119,100,111,116,32,40,37,100,97,44,37,100,98,41,59,10,0,0,0,0,0,115,116,36,101,112,115,0,0,99,36,115,112,108,105,110,101,115,0,0,0,0,0,0,0,32,32,83,117,109,32,120,121,58,32,32,32,32,32,32,32,37,46,52,103,10,0,0,0,99,97,114,116,101,115,105,97,110,10,0,0,0,0,0,0,9,37,115,45,97,120,105,115,32,116,105,99,115,58,9,0,108,117,0,0,0,0,0,0,101,114,114,111,114,32,105,110,32,101,100,103,101,51,100,95,105,110,116,101,114,115,101,99,116,0,0,0,0,0,0,0,112,105,99,107,117,112,32,112,101,110,99,105,114,99,108,101,32,115,99,97,108,101,100,32,37,103,116,104,59,10,0,0,98,111,120,120,36,121,101,114,114,111,114,98,97,114,115,0,110,111,109,105,36,114,114,111,114,0,0,0,0,0,0,0,9,109,97,112,112,105,110,103,32,102,111,114,32,51,45,100,32,100,97,116,97,32,105,115,32,0,0,0,0,0,0,0,104,105,115,116,111,103,114,97,109,115,10,0,0,0,0,0,50,32,99,111,108,117,109,110,115,32,111,110,108,121,32,112,111,115,115,105,98,108,101,32,119,105,116,104,32,101,120,112,108,105,99,105,116,32,112,109,51,100,32,115,116,121,108,101,32,40,108,105,110,101,32,37,100,41,0,0,0,0,0,0,76,111,103,32,115,99,97,108,101,32,111,110,32,88,32,105,115,32,105,110,99,111,109,112,97,116,105,98,108,101,32,119,105,116,104,32,104,105,115,116,111,103,114,97,109,32,112,108,111,116,115,10,0,0,0,0,101,120,112,101,99,116,101,100,32,123,101,108,115,101,45,99,108,97,117,115,101,125,0,0,67,111,108,117,109,110,32,110,117,109,98,101,114,32,101,120,112,101,99,116,101,100,0,0,112,117,116,95,116,101,120,116,40,34,37,115,34,44,37,100,97,44,37,100,98,44,37,100,44,37,100,41,59,10,0,0,98,111,120,101,114,36,114,111,114,98,97,114,115,0,0,0,75,80,95,69,113,117,97,108,0,0,0,0,0,0,0,0,65,116,116,101,109,112,116,32,116,111,32,97,115,115,105,103,110,32,116,111,32,97,32,114,101,97,100,45,111,110,108,121,32,118,97,114,105,97,98,108,101,0,0,0,0,0,0,0,9,100,117,109,109,121,32,118,97,114,105,97,98,108,101,115,32,97,114,101,32,34,37,115,34,32,97,110,100,32,34,37,115,34,10,0,0,0,0,0,102,105,108,108,32,97,114,114,111,119,104,101,97,100,32,114,111,116,97,116,101,100,32,97,110,103,108,101,40,37,100,44,37,100,41,32,115,104,105,102,116,101,100,32,40,37,100,97,44,37,100,98,41,59,10,0,102,105,108,108,101,100,99,36,117,114,118,101,115,0,0,0,9,32,32,37,115,45,97,120,105,115,58,32,34,37,115,34,10,0,0,0,0,0,0,0,39,58,39,32,111,114,32,107,101,121,119,111,114,100,32,39,116,111,39,32,101,120,112,101,99,116,101,100,0,0,0,0,102,111,36,110,116,0,0,0,104,105,115,116,36,111,103,114,97,109,115,0,0,0,0,0,9,116,105,99,32,102,111,114,109,97,116,32,105,115,58,10,0,0,0,0,0,0,0,0,109,97,36,103,110,105,102,105,99,97,116,105,111,110,0,0,98,111,120,101,115,0,0,0,9,37,115,32,97,114,101,32,112,108,111,116,116,101,100,32,119,105,116,104,32,0,0,0,51,120,0,0,0,0,0,0,110,111,112,114,111,36,108,111,103,117,101,115,0,0,0,0,120,121,101,36,114,114,111,114,98,97,114,115,0,0,0,0,32,119,105,116,104,32,98,111,114,100,101,114,32,0,0,0,112,114,111,36,108,111,103,117,101,115,0,0,0,0,0,0,120,101,36,114,114,111,114,98,97,114,115,0,0,0,0,0,32,119,105,116,104,32,110,111,32,98,111,114,100,101,114,10,0,0,0,0,0,0,0,0,32,32,32,32,32,32,32,32,35,100,97,116,97,112,111,105,110,116,115,32,61,32,37,100,10,0,0,0,0,0,0,0,110,111,112,115,36,110,102,115,115,0,0,0,0,0,0,0,101,36,114,114,111,114,98,97,114,115,0,0,0,0,0,0,9,70,105,108,108,32,115,116,121,108,101,32,105,115,32,101,109,112,116,121,0,0,0,0,112,115,110,102,115,115,45,118,36,101,114,115,105,111,110,55,0,0,0,0,0,0,0,0,121,101,36,114,114,111,114,98,97,114,115,0,0,0,0,0,9,70,105,108,108,32,115,116,121,108,101,32,117,115,101,115,32,37,115,32,112,97,116,116,101,114,110,115,32,115,116,97,114,116,105,110,103,32,97,116,32,37,100,0,0,0,0,0,112,115,36,110,102,115,115,0,120,121,101,114,114,111,114,108,36,105,110,101,115,0,0,0,98,36,101,122,105,101,114,0,32,32,67,111,114,114,101,108,97,116,105,111,110,58,32,32,114,32,61,32,37,46,52,103,10,0,0,0,0,0,0,0,116,114,97,110,115,112,97,114,101,110,116,0,0,0,0,0,61,0,0,0,0,0,0,0,79,85,84,0,0,0,0,0,117,108,111,110,103,0,0,0,97,109,36,115,116,101,120,0,120,101,114,114,111,114,108,36,105,110,101,115,0,0,0,0,109,105,36,114,114,111,114,0,9,70,105,108,108,32,115,116,121,108,101,32,117,115,101,115,32,37,115,32,115,111,108,105,100,32,99,111,108,111,117,114,32,119,105,116,104,32,100,101,110,115,105,116,121,32,37,46,51,102,0,0,0,0,0,0,98,111,120,101,115,10,0,0,103,101,116,95,100,97,116,97,58,32,107,101,121,32,116,105,116,108,101,32,110,111,116,32,102,111,117,110,100,32,105,110,32,114,101,113,117,101,115,116,101,100,32,99,111,108,117,109,110,10,0,0,0,0,0,0,84,104,105,115,32,112,108,111,116,32,115,116,121,108,101,32,105,115,32,110,111,116,32,97,118,97,105,108,97,98,108,101,32,105,110,32,112,111,108,97,114,32,109,111,100,101,0,0,97,52,36,112,97,112,101,114,0,0,0,0,0,0,0,0,101,114,114,111,114,108,36,105,110,101,115,0,0,0,0,0,75,80,95,68,101,108,101,116,101,0,0,0,0,0,0,0,100,101,102,97,117,108,116,32,108,105,110,101,116,121,112,101,115,10,0,0,0,0,0,0,108,97,36,116,101,120,0,0,121,101,114,114,111,114,108,36,105,110,101,115,0,0,0,0,117,115,101,114,45,100,101,102,105,110,101,100,32,108,105,110,101,32,115,116,121,108,101,115,32,114,97,116,104,101,114,32,116,104,97,110,32,100,101,102,97,117,108,116,32,108,105,110,101,32,116,121,112,101,115,10,0,0,0,0,0,0,0,0,116,36,101,120,0,0,0,0,100,36,111,116,115,0,0,0,9,80,108,111,116,32,108,105,110,101,115,32,105,110,99,114,101,109,101,110,116,32,111,118,101,114,32,0,0,0,0,0,110,36,111,116,101,120,0,0,108,112,0,0,0,0,0,0,102,111,114,116,36,114,97,110,0,0,0,0,0,0,0,0,32,116,101,120,116,99,111,108,111,114,32,108,116,32,37,100,0,0,0,0,0,0,0,0,51,32,109,117,108,0,0,0,115,36,111,108,105,100,0,0,108,105,110,101,115,112,36,111,105,110,116,115,0,0,0,0,32,116,105,116,108,101,32,111,102,102,115,101,116,32,0,0,99,36,111,108,111,117,114,0,78,111,32,100,97,116,97,32,116,111,32,102,105,116,32,0,9,72,105,115,116,111,103,114,97,109,32,115,116,121,108,101,32,105,115,32,99,111,108,117,109,110,115,116,97,99,107,101,100,32,0,0,0,0,0,0,99,36,111,108,111,114,0,0,66,97,100,32,97,98,98,114,101,118,105,97,116,101,100,32,109,111,110,116,104,32,110,97,109,101,0,0,0,0,0,0,105,36,109,112,117,108,115,101,115,0,0,0,0,0,0,0,9,72,105,115,116,111,103,114,97,109,32,115,116,121,108,101,32,105,115,32,114,111,119,115,116,97,99,107,101,100,32,0,109,111,36,110,111,99,104,114,111,109,101,0,0,0,0,0,98,111,120,112,108,111,116,0,115,116,114,99,111,108,0,0,9,72,105,115,116,111,103,114,97,109,32,115,116,121,108,101,32,105,115,32,101,114,114,111,114,98,97,114,115,32,119,105,116,104,32,103,97,112,32,37,100,32,108,119,32,37,103,32,0,0,0,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,39,60,110,117,109,95,99,111,108,115,62,44,60,110,117,109,95,114,111,119,115,62,39,0,0,0,0,0,0,0,112,115,110,115,102,115,115,0,114,101,99,116,36,97,110,103,108,101,0,0,0,0,0,0,97,36,99,115,112,108,105,110,101,115,0,0,0,0,0,0,32,32,76,105,110,101,97,114,32,77,111,100,101,108,58,32,121,32,61,32,37,46,52,103,32,120,32,43,32,37,46,52,103,10,0,0,0,0,0,0,9,72,105,115,116,111,103,114,97,109,32,115,116,121,108,101,32,105,115,32,99,108,117,115,116,101,114,101,100,32,119,105,116,104,32,103,97,112,32,37,100,32,0,0,0,0,0,0,73,78,0,0,0,0,0,0,108,100,0,0,0,0,0,0,112,115,110,115,102,115,115,40,118,55,41,0,0,0,0,0,101,108,108,36,105,112,115,101,0,0,0,0,0,0,0,0,97,114,114,111,119,115,116,121,108,101,32,110,111,116,32,102,111,117,110,100,0,0,0,0,120,121,101,114,114,111,114,98,97,114,115,10,0,0,0,0,101,120,112,101,99,116,105,110,103,32,40,101,120,112,114,101,115,115,105,111,110,41,0,0,39,41,39,32,101,120,112,101,99,116,101,100,0,0,0,0,37,115,32,37,115,32,37,115,116,101,120,37,115,37,115,32,109,97,103,32,37,46,51,102,32,37,115,32,37,115,112,114,111,108,111,103,117,101,115,40,37,100,41,0,0,0,0,0,99,105,114,99,36,108,101,0,75,80,95,80,97,103,101,85,112,0,0,0,0,0,0,0,108,105,110,101,99,36,111,108,111,114,0,0,0,0,0,0,32,40,100,101,102,97,117,108,116,32,108,101,110,103,116,104,32,97,110,100,32,97,110,103,108,101,115,41,10,0,0,0,32,97,109,115,116,101,120,0,104,105,115,116,36,111,103,114,97,109,0,0,0,0,0,0,32,108,101,110,103,116,104,32,37,115,37,103,44,32,97,110,103,108,101,32,37,103,32,100,101,103,0,0,0,0,0,0,115,116,97,114,116,105,110,103,32,114,97,110,103,101,32,118,97,108,117,101,32,111,114,32,39,58,39,32,111,114,32,39,116,111,39,32,101,120,112,101,99,116,101,100,0,0,0,0,32,97,52,112,97,112,101,114,0,0,0,0,0,0,0,0,105,110,99,114,36,101,109,101,110,116,0,0,0,0,0,0,9,32,32,97,114,114,111,119,32,104,101,97,100,115,58,32,37,115,44,32,0,0,0,0,108,97,0,0,0,0,0,0,102,115,0,0,0,0,0,0,32,110,111,104,101,97,100,0,124,99,111,115,40,55,50,48,120,41,124,0,0,0,0,0,9,108,111,97,100,112,97,116,104,32,105,115,32,0,0,0,109,111,110,111,99,104,114,111,109,101,0,0,0,0,0,0,32,111,110,101,32,104,101,97,100,32,0,0,0,0,0,0,99,111,108,111,114,0,0,0,108,36,105,110,101,115,0,0,115,116,114,105,110,103,0,0,37,103,93,10,0,0,0,0,32,98,111,116,104,32,104,101,97,100,115,32,0,0,0,0,98,105,110,100,0,0,0,0,105,108,108,101,103,97,108,32,109,111,110,116,104,0,0,0,37,115,32,37,115,32,37,115,116,101,120,37,115,37,115,32,109,97,103,32,37,46,51,102,32,102,111,110,116,32,34,37,115,44,37,46,50,102,34,32,37,115,112,114,111,108,111,103,117,101,115,40,37,100,41,0,102,36,117,110,99,116,105,111,110,0,0,0,0,0,0,0,9,32,37,115,32,37,115,0,101,120,112,101,99,116,105,110,103,32,102,111,110,116,32,110,97,109,101,0,0,0,0,0,100,36,97,116,97,0,0,0,115,116,114,105,110,103,99,111,108,117,109,110,0,0,0,0,9,97,114,114,111,119,115,116,121,108,101,32,37,100,44,32,0,0,0,0,0,0,0,0,116,111,111,32,109,97,110,121,32,108,97,121,111,117,116,32,99,111,109,109,97,110,100,115,0,0,0,0,0,0,0,0,112,99,114,114,56,114,0,0,103,114,97,121,49,48,48,0,120,50,121,49,0,0,0,0,32,32,76,105,110,101,97,114,32,77,111,100,101,108,58,32,121,32,61,32,37,46,52,103,32,120,32,45,32,37,46,52,103,10,0,0,0,0,0,0,97,112,112,101,97,114,32,105,110,32,116,104,101,32,111,114,100,101,114,32,116,104,101,121,32,119,101,114,101,32,102,111,117,110,100,0,0,0,0,0,9,37,115,45,97,120,105,115,32,116,105,99,115,32,97,114,101,32,37,115,44,32,9,109,97,106,111,114,32,116,105,99,115,99,97,108,101,32,105,115,32,37,103,32,97,110,100,32,109,105,110,111,114,32,116,105,99,115,99,97,108,101,32,105,115,32,37,103,10,0,0,0,108,111,110,103,0,0,0,0,99,109,114,49,48,0,0,0,103,114,97,121,57,48,0,0,97,120,36,105,115,0,0,0,98,101,32,115,111,114,116,101,100,32,97,108,112,104,97,98,101,116,105,99,97,108,108,121,0,0,0,0,0,0,0,0,120,101,114,114,111,114,98,97,114,115,10,0,0,0,0,0,66,97,100,32,100,97,116,97,32,111,110,32,108,105,110,101,32,37,100,32,111,102,32,102,105,108,101,32,37,115,0,0,89,111,117,32,104,97,118,101,32,116,111,32,99,111,109,112,105,108,101,32,103,110,117,112,108,111,116,32,119,105,116,104,32,98,117,105,108,116,105,110,32,114,101,97,100,108,105,110,101,32,111,114,32,71,78,85,32,114,101,97,100,108,105,110,101,32,111,114,32,66,83,68,32,101,100,105,116,108,105,110,101,32,116,111,32,101,110,97,98,108,101,32,104,105,115,116,111,114,121,32,115,117,112,112,111,114,116,46,0,0,0,0,10,100,101,102,32,95,119,99,32,61,32,119,105,116,104,112,101,110,32,99,117,114,114,101,110,116,112,101,110,32,119,105,116,104,99,111,108,111,114,32,99,117,114,114,101,110,116,99,111,108,111,114,32,101,110,100,100,101,102,59,10,100,101,102,32,95,97,99,32,61,32,97,100,100,116,111,32,99,117,114,114,101,110,116,112,105,99,116,117,114,101,32,101,110,100,100,101,102,59,10,100,101,102,32,95,115,109,115,32,61,32,115,99,97,108,101,100,32,109,112,116,32,115,104,105,102,116,101,100,32,101,110,100,100,101,102,59,10,37,32,100,114,97,119,105,110,103,32,112,111,105,110,116,45,116,121,112,101,115,10,100,101,102,32,103,112,100,114,97,119,32,40,101,120,112,114,32,110,44,32,120,44,32,121,41,32,61,10,32,32,105,102,32,110,60,48,58,32,95,97,99,32,99,111,110,116,111,117,114,32,102,117,108,108,99,105,114,99,108,101,32,95,115,109,115,32,40,120,44,121,41,10,32,32,101,108,115,101,105,102,32,40,110,61,49,41,32,111,114,32,40,110,61,51,41,58,10,32,32,32,32,95,97,99,32,100,111,117,98,108,101,112,97,116,104,32,112,116,112,97,116,104,91,110,93,32,95,115,109,115,32,40,120,44,121,41,32,95,119,99,59,10,32,32,32,32,95,97,99,32,100,111,117,98,108,101,112,97,116,104,32,112,116,112,97,116,104,91,110,93,32,114,111,116,97,116,101,100,32,57,48,32,95,115,109,115,32,40,120,44,121,41,32,95,119,99,10,32,32,101,108,115,101,105,102,32,110,60,54,58,32,95,97,99,32,100,111,117,98,108,101,112,97,116,104,32,112,116,112,97,116,104,91,110,93,32,95,115,109,115,32,40,120,44,121,41,32,95,119,99,10,32,32,101,108,115,101,58,32,95,97,99,32,99,111,110,116,111,117,114,32,112,116,112,97,116,104,91,110,93,32,95,115,109,115,32,40,120,44,121,41,32,95,119,99,10,32,32,102,105,10,101,110,100,100,101,102,59,10,10,37,32,116,104,101,32,112,111,105,110,116,32,115,104,97,112,101,115,10,112,97,116,104,32,112,116,112,97,116,104,91,93,59,10,37,100,105,97,109,111,110,100,10,112,116,112,97,116,104,48,32,61,32,112,116,112,97,116,104,54,32,61,32,40,45,49,47,50,44,48,41,45,45,40,48,44,45,49,47,50,41,45,45,40,49,47,50,44,48,41,45,45,40,48,44,49,47,50,41,45,45,99,121,99,108,101,59,10,37,32,112,108,117,115,32,115,105,103,110,10,112,116,112,97,116,104,49,32,61,32,40,45,49,47,50,44,48,41,45,45,40,49,47,50,44,48,41,59,10,37,32,115,113,117,97,114,101,10,112,116,112,97,116,104,50,32,61,32,112,116,112,97,116,104,55,32,61,32,40,45,49,47,50,44,45,49,47,50,41,45,45,40,49,47,50,44,45,49,47,50,41,45,45,40,49,47,50,44,49,47,50,41,45,45,40,45,49,47,50,44,49,47,50,41,45,45,99,121,99,108,101,59,10,37,32,99,114,111,115,115,10,112,116,112,97,116,104,51,32,58,61,32,40,45,49,47,50,44,45,49,47,50,41,45,45,40,49,47,50,44,49,47,50,41,59,10,37,32,99,105,114,99,108,101,58,10,112,116,112,97,116,104,52,32,61,32,112,116,112,97,116,104,56,58,61,32,102,117,108,108,99,105,114,99,108,101,59,10,37,32,116,114,105,97,110,103,108,101,10,112,116,112,97,116,104,53,32,61,32,112,116,112,97,116,104,57,32,58,61,32,40,48,44,49,47,50,41,45,45,40,45,49,47,50,44,45,49,47,50,41,45,45,40,49,47,50,44,45,49,47,50,41,45,45,99,121,99,108,101,59,10,10,100,101,102,32,108,105,110,101,116,121,112,101,32,101,120,112,114,32,110,32,61,10,32,32,99,117,114,114,101,110,116,99,111,108,111,114,58,61,32,105,102,32,99,111,108,111,114,108,105,110,101,115,32,58,32,99,111,108,91,110,93,32,101,108,115,101,58,32,98,108,97,99,107,32,102,105,59,10,32,32,105,102,32,110,32,61,32,45,49,32,58,10,32,32,32,32,32,32,100,114,97,119,111,112,116,105,111,110,115,40,119,105,116,104,99,111,108,111,114,32,99,117,114,114,101,110,116,99,111,108,111,114,32,119,105,116,104,112,101,110,32,40,99,117,114,114,101,110,116,112,101,110,32,115,99,97,108,101,100,32,46,53,41,41,59,10,32,32,101,108,115,101,105,102,32,110,32,60,32,49,32,58,10,32,32,32,32,100,114,97,119,111,112,116,105,111,110,115,40,95,119,99,41,59,10,32,32,101,108,115,101,32,58,10,32,32,32,32,100,114,97,119,111,112,116,105,111,110,115,40,32,105,102,32,100,97,115,104,101,100,108,105,110,101,115,58,32,100,97,115,104,101,100,32,108,116,91,110,93,32,102,105,32,95,119,99,41,59,10,32,32,102,105,10,101,110,100,100,101,102,59,10,10,37,32,100,97,115,104,32,112,97,116,116,101,114,110,115,10,112,105,99,116,117,114,101,32,108,116,91,93,59,10,108,116,49,61,100,97,115,104,112,97,116,116,101,114,110,40,111,110,32,50,32,111,102,102,32,50,41,59,32,37,32,100,97,115,104,101,115,10,108,116,50,61,100,97,115,104,112,97,116,116,101,114,110,40,111,110,32,50,32,111,102,102,32,50,32,111,110,32,48,46,50,32,111,102,102,32,50,41,59,32,37,100,97,115,104,45,100,111,116,10,108,116,51,61,108,116,49,32,115,99,97,108,101,100,32,49,46,52,49,52,59,10,108,116,52,61,108,116,50,32,115,99,97,108,101,100,32,49,46,52,49,52,59,10,108,116,53,61,108,116,49,32,115,99,97,108,101,100,32,50,59,10,108,116,54,58,61,108,116,50,32,115,99,97,108,101,100,32,50,59,10,108,116,55,61,100,97,115,104,112,97,116,116,101,114,110,40,111,110,32,48,46,50,32,111,102,102,32,50,41,59,32,37,100,111,116,115,10,10,99,111,108,111,114,32,99,111,108,91,93,44,99,121,97,110,44,32,109,97,103,101,110,116,97,44,32,121,101,108,108,111,119,59,10,99,121,97,110,61,98,108,117,101,43,103,114,101,101,110,59,32,109,97,103,101,110,116,97,61,114,101,100,43,98,108,117,101,59,121,101,108,108,111,119,61,103,114,101,101,110,43,114,101,100,59,10,99,111,108,91,45,50,93,58,61,99,111,108,91,45,49,93,58,61,99,111,108,48,58,61,98,108,97,99,107,59,10,99,111,108,49,58,61,114,101,100,59,10,99,111,108,50,58,61,40,46,50,44,46,50,44,49,41,59,32,37,98,108,117,101,10,99,111,108,51,58,61,40,49,44,46,54,54,44,48,41,59,32,37,111,114,97,110,103,101,10,99,111,108,52,58,61,46,56,53,42,103,114,101,101,110,59,10,99,111,108,53,58,61,46,57,42,109,97,103,101,110,116,97,59,10,99,111,108,54,58,61,48,46,56,53,42,99,121,97,110,59,10,99,111,108,55,58,61,46,56,53,42,121,101,108,108,111,119,59,10,10,37,112,108,97,99,105,110,103,32,116,101,120,116,10,112,105,99,116,117,114,101,32,71,80,116,101,120,116,59,10,100,101,102,32,112,117,116,95,116,101,120,116,40,101,120,112,114,32,112,105,99,44,32,120,44,32,121,44,32,114,44,32,106,41,32,61,10,32,32,71,80,116,101,120,116,58,61,109,97,107,101,112,105,99,40,112,105,99,41,59,10,32,32,71,80,116,101,120,116,58,61,71,80,116,101,120,116,32,115,104,105,102,116,101,100,10,32,32,32,32,105,102,32,106,32,61,32,49,58,32,40,45,40,117,108,99,111,114,110,101,114,32,71,80,116,101,120,116,32,43,32,108,108,99,111,114,110,101,114,32,71,80,116,101,120,116,41,47,50,41,10,32,32,32,32,101,108,115,101,105,102,32,106,32,61,32,50,58,32,40,45,99,101,110,116,101,114,32,71,80,116,101,120,116,41,10,32,32,32,32,101,108,115,101,58,32,40,45,40,117,114,99,111,114,110,101,114,32,71,80,116,101,120,116,32,43,32,108,114,99,111,114,110,101,114,32,71,80,116,101,120,116,41,47,50,41,10,32,32,32,32,102,105,10,32,32,32,32,114,111,116,97,116,101,100,32,114,59,10,32,32,97,100,100,116,111,32,99,117,114,114,101,110,116,112,105,99,116,117,114,101,32,97,108,115,111,32,71,80,116,101,120,116,32,115,104,105,102,116,101,100,32,40,120,44,121,41,10,101,110,100,100,101,102,59,10,0,0,0,0,0,0,0,0,103,114,97,121,56,48,0,0,75,80,95,85,112,0,0,0,108,99,0,0,0,0,0,0,69,82,82,78,79,0,0,0,9,102,97,99,116,111,114,32,108,97,98,101,108,115,32,119,105,108,108,32,37,115,10,0,100,97,115,104,101,100,108,105,110,101,115,58,61,116,114,117,101,59,10,0,0,0,0,0,103,114,97,121,55,48,0,0,97,114,101,32,111,102,102,0,100,97,115,104,101,100,108,105,110,101,115,58,61,102,97,108,115,101,59,10,0,0,0,0,103,114,97,121,54,48,0,0,105,115,111,95,56,56,53,57,95,49,53,0,0,0,0,0,97,114,101,32,97,117,116,111,109,97,116,105,99,0,0,0,32,120,108,111,119,32,120,104,105,103,104,0,0,0,0,0,99,111,108,111,114,108,105,110,101,115,58,61,102,97,108,115,101,59,10,0,0,0,0,0,103,114,97,121,53,48,0,0,119,105,108,108,32,98,101,32,112,117,116,32,111,110,32,116,104,101,32,120,50,32,97,120,105,115,0,0,0,0,0,0,55,50,48,32,109,117,108,32,99,111,115,32,97,98,115,0,99,111,108,111,114,108,105,110,101,115,58,61,116,114,117,101,59,10,0,0,0,0,0,0,103,114,97,121,52,48,0,0,112,117,115,104,100,50,0,0,119,105,108,108,32,98,101,32,112,117,116,32,111,110,32,116,104,101,32,120,32,97,120,105,115,0,0,0,0,0,0,0,100,114,111,112,108,97,115,116,95,100,121,110,97,114,114,97,121,58,32,100,121,110,97,114,114,97,121,32,119,97,115,110,39,116,32,105,110,105,116,105,97,108,105,122,101,100,33,0,10,99,111,108,111,114,32,99,117,114,114,101,110,116,99,111,108,111,114,59,32,99,117,114,114,101,110,116,99,111,108,111,114,58,61,98,108,97,99,107,59,10,99,111,108,111,114,32,102,105,108,108,99,111,108,111,114,59,10,98,111,111,108,101,97,110,32,99,111,108,111,114,108,105,110,101,115,44,100,97,115,104,101,100,108,105,110,101,115,59,10,0,0,0,0,0,103,114,97,121,51,48,0,0,9,102,97,99,116,111,114,32,108,97,98,101,108,115,32,37,115,10,0,0,0,0,0,0,92,115,101,116,102,111,110,116,123,37,115,125,123,37,53,46,50,102,125,10,101,116,101,120,10,0,0,0,0,0,0,0,103,114,97,121,50,48,0,0,9,115,101,112,97,114,97,116,105,111,110,32,98,101,116,119,101,101,110,32,98,111,120,112,108,111,116,115,32,105,115,32,37,103,10,0,0,0,0,0,10,37,102,111,110,116,32,99,104,97,110,103,101,115,10,118,101,114,98,97,116,105,109,116,101,120,10,92,100,101,102,92,115,101,116,102,111,110,116,35,49,35,50,123,37,46,10,32,32,92,102,111,110,116,92,103,112,102,111,110,116,61,35,49,32,97,116,32,35,50,112,116,10,92,103,112,102,111,110,116,125,10,0,0,0,0,0,0,103,114,97,121,49,48,0,0,9,111,117,116,108,105,101,114,115,32,119,105,108,108,32,110,111,116,32,98,101,32,100,114,97,119,110,10,0,0,0,0,108,97,121,36,111,117,116,0,10,100,101,102,97,117,108,116,102,111,110,116,58,61,32,34,37,115,34,59,10,100,101,102,97,117,108,116,115,99,97,108,101,32,58,61,32,37,54,46,51,102,47,102,111,110,116,115,105,122,101,32,100,101,102,97,117,108,116,102,111,110,116,59,10,0,0,0,0,0,0,0,103,114,97,121,48,0,0,0,120,49,121,50,0,0,0,0,32,32,77,101,100,105,97,110,58,32,32,32,37,115,32,37,115,32,37,115,10,0,0,0,99,100,0,0,0,0,0,0,9,111,117,116,108,105,101,114,115,32,119,105,108,108,32,98,101,32,100,114,97,119,110,32,117,115,105,110,103,32,112,111,105,110,116,32,116,121,112,101,32,37,100,10,0,0,0,0,46,48,0,0,0,0,0,0,118,97,114,100,101,102,32,109,97,107,101,112,105,99,40,101,120,112,114,32,115,116,114,41,32,61,10,32,32,105,102,32,112,105,99,116,117,114,101,32,115,116,114,32,58,32,115,116,114,32,115,99,97,108,101,100,32,116,101,120,116,109,97,103,10,32,32,37,32,111,116,104,101,114,119,105,115,101,32,97,32,115,116,114,105,110,103,10,32,32,101,108,115,101,58,32,115,116,114,32,105,110,102,111,110,116,32,100,101,102,97,117,108,116,102,111,110,116,32,115,99,97,108,101,100,32,40,100,101,102,97,117,108,116,115,99,97,108,101,42,116,101,120,116,109,97,103,41,10,32,32,102,105,10,101,110,100,100,101,102,59,10,10,100,101,102,32,105,110,102,111,110,116,115,105,122,101,40,101,120,112,114,32,115,116,114,44,32,115,105,122,101,41,32,61,10,32,32,105,110,102,111,110,116,32,115,116,114,32,115,99,97,108,101,100,32,40,115,105,122,101,32,47,32,102,111,110,116,115,105,122,101,32,115,116,114,41,10,101,110,100,100,101,102,59,10,0,0,115,108,97,116,101,103,114,97,121,0,0,0,0,0,0,0,116,36,105,99,115,0,0,0,67,97,110,39,116,32,114,101,97,100,32,100,97,116,97,32,102,105,108,101,0,0,0,0,32,32,98,111,120,32,98,121,32,37,53,46,50,102,32,111,102,32,116,104,101,32,105,110,116,101,114,113,117,97,114,116,105,108,101,32,100,105,115,116,97,110,99,101,10,0,0,0,121,101,114,114,111,114,98,97,114,115,10,0,0,0,0,0,10,116,101,120,116,109,97,103,58,61,37,54,46,51,102,59,10,0,0,0,0,0,0,0,100,97,114,107,45,103,114,97,121,0,0,0,0,0,0,0,75,80,95,72,111,109,101,0,98,103,110,100,0,0,0,0,110,111,110,45,115,116,114,105,110,103,32,97,114,103,117,109,101,110,116,32,116,111,32,115,121,115,116,101,109,40,41,0,32,32,109,101,100,105,97,110,32,116,111,32,105,110,99,108,117,100,101,32,37,53,46,50,102,32,111,102,32,116,104,101,32,112,111,105,110,116,115,10,0,0,0,0,0,0,0,0,10,119,97,114,110,105,110,103,99,104,101,99,107,58,61,48,59,10,100,101,102,97,117,108,116,109,112,116,58,61,109,112,116,58,61,52,59,10,116,104,58,61,46,54,59,10,37,37,32,72,97,118,101,32,110,105,99,101,32,115,104,97,114,112,32,106,111,105,110,115,32,111,110,32,111,117,114,32,108,105,110,101,115,10,108,105,110,101,99,97,112,58,61,98,117,116,116,59,10,108,105,110,101,106,111,105,110,58,61,109,105,116,101,114,101,100,59,10,10,100,101,102,32,115,99,97,108,101,112,101,110,32,101,120,112,114,32,110,32,61,32,112,105,99,107,117,112,32,112,101,110,99,105,114,99,108,101,32,115,99,97,108,101,100,32,40,110,42,116,104,41,32,101,110,100,100,101,102,59,10,100,101,102,32,112,116,115,105,122,101,32,101,120,112,114,32,110,32,61,32,109,112,116,58,61,110,42,100,101,102,97,117,108,116,109,112,116,32,101,110,100,100,101,102,59,10,10,0,0,0,0,0,108,105,103,104,116,45,103,114,101,121,0,0,0,0,0,0,9,98,111,120,112,108,111,116,32,114,97,110,103,101,32,101,120,116,101,110,100,115,32,102,114,111,109,32,116,104,101,32,0,0,0,0,0,0,0,0,85,112,112,101,114,32,98,111,117,110,100,32,111,102,32,99,111,110,115,116,114,97,105,110,116,32,60,32,108,111,119,101,114,32,98,111,117,110,100,58,32,32,84,117,114,110,105,110,103,32,111,102,32,99,111,110,115,116,114,97,105,110,116,115,46,0,0,0,0,0,0,0,92,98,101,103,105,110,123,100,111,99,117,109,101,110,116,125,10,101,116,101,120,10,37,32,69,78,68,80,82,69,10,0,108,105,103,104,116,45,103,114,97,121,0,0,0,0,0,0,98,111,120,32,97,110,100,32,119,104,105,115,107,101,114,0,92,117,115,101,112,97,99,107,97,103,101,91,105,110,116,108,105,109,105,116,115,93,123,97,109,115,109,97,116,104,125,10,92,117,115,101,112,97,99,107,97,103,101,123,97,109,115,102,111,110,116,115,125,10,0,0,103,114,101,101,110,121,101,108,108,111,119,0,0,0,0,0,102,105,110,97,110,99,101,32,98,97,114,0,0,0,0,0,124,115,105,110,40,55,50,48,120,41,124,0,0,0,0,0,92,117,115,101,112,97,99,107,97,103,101,91,108,97,116,105,110,49,93,123,105,110,112,117,116,101,110,99,125,10,92,117,115,101,112,97,99,107,97,103,101,91,84,49,93,123,102,111,110,116,101,110,99,125,10,92,117,115,101,112,97,99,107,97,103,101,123,116,101,120,116,99,111,109,112,125,10,92,117,115,101,112,97,99,107,97,103,101,123,109,97,116,104,112,116,109,120,125,10,92,117,115,101,112,97,99,107,97,103,101,91,115,99,97,108,101,100,61,46,57,50,93,123,104,101,108,118,101,116,125,10,92,117,115,101,112,97,99,107,97,103,101,123,99,111,117,114,105,101,114,125,10,92,117,115,101,112,97,99,107,97,103,101,123,108,97,116,101,120,115,121,109,125,10,0,0,99,104,97,114,116,114,101,117,115,101,0,0,0,0,0,0,9,98,111,120,112,108,111,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,115,32,37,115,10,0,0,109,117,108,116,105,112,108,111,116,32,109,111,100,101,32,105,115,32,37,115,10,0,0,0,92,117,115,101,112,97,99,107,97,103,101,91,108,97,116,105,110,49,93,123,105,110,112,117,116,101,110,99,125,10,92,117,115,101,112,97,99,107,97,103,101,91,84,49,93,123,102,111,110,116,101,110,99,125,10,92,117,115,101,112,97,99,107,97,103,101,123,116,105,109,101,115,44,109,97,116,104,112,116,109,120,125,10,92,117,115,101,112,97,99,107,97,103,101,123,104,101,108,118,101,116,125,10,92,117,115,101,112,97,99,107,97,103,101,123,99,111,117,114,105,101,114,125,10,0,0,0,0,97,110,116,105,113,117,101,119,104,105,116,101,0,0,0,0,37,103,58,0,0,0,0,0,44,32,102,105,108,108,115,116,121,108,101,0,0,0,0,0,92,100,111,99,117,109,101,110,116,99,108,97,115,115,123,97,114,116,105,99,108,101,125,10,0,0,0,0,0,0,0,0,115,101,97,103,114,101,101,110,0,0,0,0,0,0,0,0,44,32,108,119,32,37,46,49,102,32,0,0,0,0,0,0,92,100,111,99,117,109,101,110,116,99,108,97,115,115,91,97,52,112,97,112,101,114,93,123,97,114,116,105,99,108,101,125,10,0,0,0,0,0,0,0,115,108,97,116,101,103,114,101,121,0,0,0,0,0,0,0,108,116,32,37,100,0,0,0,110,111,101,110,104,36,97,110,99,101,100,0,0,0,0,0,10,37,37,32,65,100,100,32,92,100,111,99,117,109,101,110,116,99,108,97,115,115,32,97,110,100,32,92,98,101,103,105,110,123,100,99,111,117,109,101,110,116,125,32,102,111,114,32,108,97,116,101,120,10,37,37,32,78,66,32,121,111,117,32,115,104,111,117,108,100,32,115,101,116,32,116,104,101,32,101,110,118,105,114,111,110,109,101,110,116,32,118,97,114,105,97,98,108,101,32,84,69,88,32,116,111,32,116,104,101,32,110,97,109,101,32,111,102,32,121,111,117,114,10,37,37,32,108,97,116,101,120,32,101,120,101,99,117,116,97,98,108,101,32,40,110,111,114,109,97,108,108,121,32,108,97,116,101,120,41,32,105,110,111,114,100,101,114,32,102,111,114,32,109,101,116,97,112,111,115,116,32,116,111,32,119,111,114,107,10,37,37,32,111,114,32,114,117,110,10,37,37,32,109,112,111,115,116,32,45,45,116,101,120,61,108,97,116,101,120,32,46,46,46,10,10,37,32,66,69,71,80,82,69,10,118,101,114,98,97,116,105,109,116,101,120,10,0,104,111,110,101,121,100,101,119,0,0,0,0,0,0,0,0,120,50,121,50,0,0,0,0,32,32,81,117,97,114,116,105,108,101,58,32,37,115,32,37,115,32,37,115,10,0,0,0,98,97,99,107,103,114,111,117,110,100,0,0,0,0,0,0,37,46,49,53,103,0,0,0,117,105,110,116,0,0,0,0,112,114,111,108,111,103,117,101,115,58,61,37,100,59,10,0,99,111,109,109,97,110,100,32,115,116,114,105,110,103,0,0,98,105,115,113,117,101,0,0,98,101,104,105,110,100,0,0,120,121,101,114,114,111,114,108,105,110,101,115,10,0,0,0,78,101,101,100,32,50,32,111,114,32,51,32,99,111,108,117,109,110,115,32,102,111,114,32,112,111,108,97,114,32,100,97,116,97,0,0,0,0,0,0,102,105,108,108,36,115,116,121,108,101,0,0,0,0,0,0,69,120,112,101,99,116,101,100,32,99,111,109,109,97,110,100,32,115,116,114,105,110,103,0,97,118,115,0,0,0,0,0,37,37,71,78,85,80,76,79,84,32,77,101,116,97,112,111,115,116,32,111,117,116,112,117,116,58,32,37,115,10,0,0,108,101,109,111,110,99,104,105,102,102,111,110,0,0,0,0,75,80,95,82,105,103,104,116,0,0,0,0,0,0,0,0,105,110,116,101,114,110,97,108,32,101,114,114,111,114,58,32,105,110,118,97,108,105,100,32,97,114,103,117,109,101,110,116,32,116,121,112,101,0,0,0,9,82,101,99,116,97,110,103,108,101,32,115,116,121,108,101,32,105,115,32,37,115,44,32,102,105,108,108,32,99,111,108,111,114,32,0,0,0,0,0,101,110,100,46,10,0,0,0,107,104,97,107,105,49,0,0,9,67,105,114,99,108,101,32,115,116,121,108,101,32,104,97,115,32,100,101,102,97,117,108,116,32,114,97,100,105,117,115,32,0,0,0,0,0,0,0,110,111,32,117,112,112,101,114,32,98,111,117,110,100,32,99,111,110,115,116,114,97,105,110,116,32,97,108,108,111,119,101,100,32,105,102,32,110,111,116,32,97,117,116,111,115,99,97,108,105,110,103,0,0,0,0,99,111,110,116,111,117,114,32,98,95,115,112,108,105,110,101,0,0,0,0,0,0,0,0,37,32,69,78,68,80,79,83,84,10,0,0,0,0,0,0,112,105,110,107,0,0,0,0,115,101,116,32,116,101,114,109,105,110,97,108,32,117,110,107,110,111,119,110,10,0,0,0,44,32,98,111,116,104,32,100,105,97,109,101,116,101,114,115,32,97,114,101,32,105,110,32,116,104,101,32,115,97,109,101,32,117,110,105,116,115,32,97,115,32,116,104,101,32,121,32,97,120,105,115,10,0,0,0,60,110,111,62,0,0,0,0,101,116,101,120,10,0,0,0,108,105,103,104,116,45,115,97,108,109,111,110,0,0,0,0,44,32,98,111,116,104,32,100,105,97,109,101,116,101,114,115,32,97,114,101,32,105,110,32,116,104,101,32,115,97,109,101,32,117,110,105,116,115,32,97,115,32,116,104,101,32,120,32,97,120,105,115,10,0,0,0,55,50,48,32,109,117,108,32,115,105,110,32,97,98,115,0,32,92,101,110,100,123,100,111,99,117,109,101,110,116,125,10,0,0,0,0,0,0,0,0,115,97,110,100,121,98,114,111,119,110,0,0,0,0,0,0,117,0,0,0,0,0,0,0,44,32,100,105,97,109,101,116,101,114,115,32,97,114,101,32,105,110,32,100,105,102,102,101,114,101,110,116,32,117,110,105,116,115,32,40,109,97,106,111,114,58,32,120,32,97,120,105,115,44,32,109,105,110,111,114,58,32,121,32,97,120,105,115,41,10,0,0,0,0,0,0,45,45,104,101,108,112,0,0,118,101,114,98,97,116,105,109,116,101,120,10,0,0,0,0,116,97,110,49,0,0,0,0,42,58,0,0,0,0,0,0,44,32,100,101,102,97,117,108,116,32,97,110,103,108,101,32,105,115,32,37,46,49,102,32,100,101,103,114,101,101,115,0,97,99,116,105,111,110,32,116,97,98,108,101,0,0,0,0,37,32,66,69,71,80,79,83,84,10,0,0,0,0,0,0,115,105,101,110,110,97,49,0,9,69,108,108,105,112,115,101,32,115,116,121,108,101,32,104,97,115,32,100,101,102,97,117,108,116,32,115,105,122,101,32,0,0,0,0,0,0,0,0,101,110,100,102,105,103,59,10,0,0,0,0,0,0,0,0,121,101,108,108,111,119,52,0,70,117,110,99,116,105,111,110,115,0,0,0,0,0,0,0,106,116,101,114,110,0,0,0,101,120,112,101,99,116,105,110,103,32,39,114,97,100,105,97,110,115,39,32,111,114,32,39,100,101,103,114,101,101,115,39,0,0,0,0,0,0,0,0,101,110,104,36,97,110,99,101]) -.concat([100,0,0,0,0,0,0,0,115,99,97,108,101,112,101,110,32,49,59,32,112,116,115,105,122,101,32,37,46,51,102,59,108,105,110,101,116,121,112,101,32,45,50,59,10,0,0,0,115,108,97,116,101,98,108,117,101,49,0,0,0,0,0,0,120,49,121,49,0,0,0,0,68,97,116,97,0,0,0,0,32,32,77,97,120,105,109,117,109,58,32,32,37,115,32,91,37,42,108,100,93,32,32,32,37,115,32,91,37,42,108,100,93,10,0,0,0,0,0,0,37,115,58,37,100,32,112,114,111,116,111,99,111,108,32,101,114,114,111,114,10,0,0,0,100,36,101,103,114,101,101,115,0,0,0,0,0,0,0,0,109,117,108,116,105,112,108,111,116,62,32,0,0,0,0,0,37,48,51,111,0,0,0,0,100,0,0,0,0,0,0,0,97,58,61,119,47,37,46,49,102,59,98,58,61,104,47,37,46,49,102,59,10,0,0,0,109,101,100,105,117,109,112,117,114,112,108,101,51,0,0,0,9,37,115,32,105,115,32,117,110,100,101,102,105,110,101,100,10,0,0,0,0,0,0,0,115,116,121,108,101,32,108,105,110,101,0,0,0,0,0,0,114,36,97,100,105,97,110,115,0,0,0,0,0,0,0,0,120,101,114,114,111,114,108,105,110,101,115,10,0,0,0,0,78,101,101,100,32,49,32,111,114,32,51,32,99,111,108,117,109,110,115,32,102,111,114,32,99,97,114,116,101,115,105,97,110,32,100,97,116,97,0,0,67,97,110,39,116,32,99,104,97,110,103,101,32,116,111,32,116,104,105,115,32,100,105,114,101,99,116,111,114,121,0,0,126,0,0,0,0,0,0,0,83,105,110,103,117,108,97,114,32,109,97,116,114,105,120,32,105,110,32,71,105,118,101,110,115,40,41,0,0,0,0,0,67,97,110,39,116,32,99,97,108,99,117,108,97,116,101,32,97,112,112,114,111,120,105,109,97,116,105,111,110,32,115,112,108,105,110,101,115,44,32,97,108,108,32,119,101,105,103,104,116,115,32,104,97,118,101,32,116,111,32,98,101,32,62,32,48,0,0,0,0,0,0,0,10,98,101,103,105,110,102,105,103,40,37,100,41,59,10,119,58,61,37,46,51,102,105,110,59,104,58,61,37,46,51,102,105,110,59,10,0,0,0,0,99,98,116,105,99,115,0,0,111,114,99,104,105,100,52,0,75,80,95,66,101,103,105,110,0,0,0,0,0,0,0,0,9,37,115,10,0,0,0,0,114,103,98,36,99,111,108,111,114,0,0,0,0,0,0,0,73,110,116,101,114,110,97,108,32,101,114,114,111,114,58,32,115,116,114,105,110,103,32,110,111,116,32,97,108,108,111,99,97,116,101,100,0,0,0,0,100,117,112,108,105,99,97,116,101,32,111,114,32,99,111,110,116,114,97,100,105,99,116,111,114,121,32,97,114,103,117,109,101,110,116,115,0,0,0,0,45,45,40,37,46,49,102,97,44,37,46,49,102,98,41,0,115,105,101,110,110,97,52,0,10,9,85,115,101,114,45,68,101,102,105,110,101,100,32,70,117,110,99,116,105,111,110,115,58,10,0,0,0,0,0,0,102,117,110,99,116,105,111,110,32,37,115,32,114,101,113,117,105,114,101,115,32,37,100,32,118,97,114,105,97,98,108,101,37,99,0,0,0,0,0,0,119,114,111,110,103,32,97,114,103,117,109,101,110,116,32,105,110,32,115,101,116,32,97,114,114,111,119,0,0,0,0,0,109,97,108,102,111,114,109,101,100,32,114,97,110,103,101,32,119,105,116,104,32,99,111,110,115,116,114,97,105,110,116,32,40,117,115,101,32,39,60,39,32,111,110,108,121,41,0,0,100,114,97,119,32,40,37,46,49,102,97,44,37,46,49,102,98,41,0,0,0,0,0,0,98,114,111,119,110,52,0,0,100,101,102,97,117,108,116,32,108,97,121,101,114,0,0,0,101,110,100,32,99,111,111,114,100,105,110,97,116,101,115,32,101,120,112,101,99,116,101,100,0,0,0,0,0,0,0,0,108,105,110,101,116,121,112,101,32,37,100,59,10,0,0,0,111,114,97,110,103,101,114,101,100,52,0,0,0,0,0,0,9,71,114,105,100,32,100,114,97,119,110,32,97,116,32,37,115,10,0,0,0,0,0,0,115,116,97,114,116,32,99,111,111,114,100,105,110,97,116,101,115,32,101,120,112,101,99,116,101,100,0,0,0,0,0,0,124,99,111,115,40,51,54,48,120,41,124,0,0,0,0,0,112,117,116,95,116,101,120,116,40,32,98,116,101,120,32,37,115,32,101,116,101,120,44,32,37,46,49,102,97,44,32,37,46,49,102,98,44,32,37,100,44,32,37,100,41,59,10,0,100,97,114,107,45,111,108,105,118,101,103,114,101,101,110,0,100,101,103,114,101,101,115,0,97,114,114,111,119,0,0,0,112,117,116,95,116,101,120,116,40,32,98,116,101,120,32,92,115,101,116,102,111,110,116,123,37,115,125,123,37,53,46,50,102,125,32,37,115,32,101,116,101,120,44,32,37,46,49,102,97,44,32,37,46,49,102,98,44,32,37,100,44,32,37,100,41,59,10,0,0,0,0,0,100,97,114,107,45,112,108,117,109,0,0,0,0,0,0,0,114,97,100,105,97,110,115,0,32,32,32,32,32,32,32,32,32,83,107,105,112,112,101,100,32,37,100,32,112,111,105,110,116,115,32,111,117,116,115,105,100,101,32,114,97,110,103,101,32,91,37,115,61,0,0,0,116,97,103,32,109,117,115,116,32,98,101,32,62,32,48,0,112,117,116,95,116,101,120,116,40,34,37,115,34,44,32,37,46,49,102,97,44,32,37,46,49,102,98,44,32,37,100,44,32,37,100,41,59,10,0,0,112,108,117,109,0,0,0,0,9,71,114,105,100,32,114,97,100,105,105,32,100,114,97,119,110,32,101,118,101,114,121,32,37,102,32,37,115,10,0,0,112,117,116,95,116,101,120,116,40,34,37,115,34,32,105,110,102,111,110,116,115,105,122,101,40,34,37,115,34,44,37,53,46,50,102,41,44,32,37,46,49,102,97,44,32,37,46,49,102,98,44,32,37,100,44,32,37,100,41,59,10,0,0,0,100,97,114,107,45,118,105,111,108,101,116,0,0,0,0,0,10,9,77,105,110,111,114,32,103,114,105,100,32,100,114,97,119,110,32,119,105,116,104,0,106,117,109,112,110,122,0,0,104,101,97,100,36,115,0,0,102,111,110,116,0,0,0,0,103,112,100,114,97,119,40,37,100,44,37,46,49,102,97,44,37,46,49,102,98,41,59,10,0,0,0,0,0,0,0,0,118,105,111,108,101,116,0,0,9,77,97,106,111,114,32,103,114,105,100,32,100,114,97,119,110,32,119,105,116,104,0,0,32,32,77,105,110,105,109,117,109,58,32,32,37,115,32,91,37,42,108,100,93,32,32,32,37,115,32,91,37,42,108,100,93,10,0,0,0,0,0,0,97,115,0,0,0,0,0,0,99,111,110,118,95,116,101,120,116,32,98,117,102,102,101,114,0,0,0,0,0,0,0,0,105,0,0,0,0,0,0,0,100,114,97,119,32,40,37,46,49,102,97,44,37,46,49,102,98,41,45,45,40,37,46,49,102,97,44,37,46,49,102,98,41,59,10,0,0,0,0,0,111,114,97,110,103,101,0,0,32,116,105,99,115,10,0,0,108,105,110,101,116,121,112,101,0,0,0,0,0,0,0,0,121,101,114,114,111,114,108,105,110,101,115,10,0,0,0,0,101,120,112,101,99,116,105,110,103,32,100,105,114,101,99,116,111,114,121,32,110,97,109,101,0,0,0,0,0,0,0,0,33,0,0,0,0,0,0,0,100,114,97,119,100,98,108,97,114,114,111,119,0,0,0,0,111,108,105,118,101,0,0,0,75,80,95,76,101,102,116,0,32,109,37,115,0,0,0,0,66,111,116,104,32,112,97,114,97,109,101,116,101,114,115,32,116,111,32,115,116,114,112,116,105,109,101,32,109,117,115,116,32,98,101,32,115,116,114,105,110,103,115,0,0,0,0,0,100,114,97,119,97,114,114,111,119,0,0,0,0,0,0,0,98,101,105,103,101,0,0,0,32,37,115,0,0,0,0,0,98,97,99,107,36,104,101,97,100,0,0,0,0,0,0,0,122,50,0,0,0,0,0,0,37,115,32,40,37,46,49,102,97,44,37,46,49,102,98,41,45,45,40,37,46,49,102,97,44,37,46,49,102,98,41,59,10,0,0,0,0,0,0,0,100,97,114,107,45,103,111,108,100,101,110,114,111,100,0,0,82,101,99,116,97,110,103,117,108,97,114,0,0,0,0,0,121,95,109,105,110,32,115,104,111,117,108,100,32,110,111,116,32,101,113,117,97,108,32,121,95,109,97,120,33,0,0,0,73,110,118,97,108,105,100,32,114,97,110,103,101,0,0,0,112,116,115,105,122,101,32,37,46,51,102,59,10,0,0,0,100,97,114,107,45,107,104,97,107,105,0,0,0,0,0,0,80,111,108,97,114,0,0,0,37,115,102,105,120,109,97,36,120,0,0,0,0,0,0,0,51,54,48,32,109,117,108,32,99,111,115,32,97,98,115,0,102,105,108,108,32,40,37,46,49,102,97,44,37,46,49,102,98,41,45,45,40,37,46,49,102,97,44,37,46,49,102,98,41,45,45,40,37,46,49,102,97,44,37,46,49,102,98,41,45,45,40,37,46,49,102,97,44,37,46,49,102,98,41,45,45,99,121,99,108,101,32,119,105,116,104,112,101,110,32,40,112,101,110,99,105,114,99,108,101,32,115,99,97,108,101,100,32,48,112,116,41,32,119,105,116,104,99,111,108,111,114,32,102,105,108,108,99,111,108,111,114,59,10,0,0,0,0,0,107,104,97,107,105,0,0,0,9,37,115,32,103,114,105,100,32,100,114,97,119,110,32,97,116,0,0,0,0,0,0,0,37,115,102,105,120,109,105,36,110,0,0,0,0,0,0,0,9,32,32,72,105,100,100,101,110,51,100,32,101,108,101,109,101,110,116,115,32,119,105,108,108,32,98,101,32,100,114,97,119,110,32,105,110,32,37,115,32,111,102,32,110,111,110,45,104,105,100,100,101,110,51,100,32,101,108,101,109,101,110,116,115,10,0,0,0,0,0,0,102,105,108,108,32,40,37,46,49,102,97,44,37,46,49,102,98,41,45,45,40,37,46,49,102,97,44,37,46,49,102,98,41,45,45,40,37,46,49,102,97,44,37,46,49,102,98,41,45,45,40,37,46,49,102,97,44,37,46,49,102,98,41,45,45,99,121,99,108,101,32,119,105,116,104,99,111,108,111,114,32,98,97,99,107,103,114,111,117,110,100,59,10,0,0,0,100,97,114,107,45,115,97,108,109,111,110,0,0,0,0,0,9,103,114,105,100,32,105,115,32,79,70,70,10,0,0,0,32,32,32,32,32,32,32,32,32,82,101,97,100,32,37,100,32,112,111,105,110,116,115,10,0,0,0,0,0,0,0,0,37,115,102,105,120,0,0,0,115,99,97,108,101,112,101,110,32,37,46,51,102,59,10,0,115,97,108,109,111,110,0,0,114,97,120,105,115,32,105,115,32,37,115,100,114,97,119,110,10,0,0,0,0,0,0,0,37,115,109,97,36,120,0,0,80,114,101,115,115,32,114,101,116,117,114,110,32,102,111,114,32,109,111,114,101,58,32,0,99,117,114,114,101,110,116,99,111,108,111,114,58,61,37,46,52,103,42,114,101,100,43,37,46,52,103,42,103,114,101,101,110,43,37,46,52,103,42,98,108,117,101,59,10,0,0,0,111,114,97,110,103,101,45,114,101,100,0,0,0,0,0,0,9,37,115,122,101,114,111,97,120,105,115,32,105,115,32,79,70,70,10,0,0,0,0,0,106,117,109,112,122,0,0,0,37,115,109,105,36,110,0,0,116,105,36,116,108,101,0,0,99,117,114,114,101,110,116,99,111,108,111,114,58,61,99,111,108,37,100,59,10,0,0,0,108,105,103,104,116,45,99,111,114,97,108,0,0,0,0,0,125,0,0,0,0,0,0,0,9,37,115,122,101,114,111,97,120,105,115,32,105,115,32,100,114,97,119,110,32,119,105,116,104,0,0,0,0,0,0,0,32,32,83,117,109,32,83,113,46,58,32,32,37,115,32,37,115,32,37,115,10,0,0,0,107,101,36,101,112,102,105,120,0,0,0,0,0,0,0,0,117,110,107,110,111,119,110,32,116,121,112,101,32,105,110,32,100,105,115,112,95,118,97,108,117,101,40,41,0,0,0,0,115,105,110,116,0,0,0,0,99,117,114,114,101,110,116,99,111,108,111,114,58,61,98,108,97,99,107,59,10,0,0,0,108,97,98,101,108,32,110,111,116,32,102,111,117,110,100,0,69,120,116,114,97,110,101,111,117,115,32,97,114,103,117,109,101,110,116,115,32,116,111,32,115,101,116,32,37,115,0,0,102,105,120,0,0,0,0,0,100,111,116,115,10,0,0,0,120,112,45,62,110,101,120,116,95,115,112,32,61,61,32,121,112,0,0,0,0,0,0,0,99,117,114,114,101,110,116,99,111,108,111,114,58,61,37,46,51,103,119,104,105,116,101,59,10,0,0,0,0,0,0,0,100,97,114,107,45,112,105,110,107,0,0,0,0,0,0,0,75,80,95,80,97,103,101,68,111,119,110,0,0,0,0,0,32,112,111,105,110,116,32,119,105,116,104,32,99,111,108,111,114,32,111,102,0,0,0,0,98,117,102,102,101,114,91,108,101,110,103,116,104,45,49,93,32,61,61,32,39,32,39,0,102,117,108,108,36,119,105,100,116,104,0,0,0,0,0,0,59,10,0,0,0,0,0,0,100,97,114,107,45,116,117,114,113,117,111,105,115,101,0,0,32,110,111,112,111,105,110,116,0,0,0,0,0,0,0,0,108,36,97,114,103,101,0,0,100,101,102,97,117,108,116,0,37,115,32,61,32,0,0,0,109,97,108,102,111,114,109,101,100,32,114,97,110,103,101,32,119,105,116,104,32,99,111,110,115,116,97,114,105,110,116,0,99,121,99,108,101,32,119,105,116,104,99,111,108,111,114,32,102,105,108,108,99,111,108,111,114,59,10,0,0,0,0,0,32,102,111,110,116,32,34,37,115,34,0,0,0,0,0,0,120,95,109,105,110,32,115,104,111,117,108,100,32,110,111,116,32,101,113,117,97,108,32,120,95,109,97,120,33,0,0,0,45,45,0,0,0,0,0,0,32,37,115,32,0,0,0,0,101,120,112,101,99,116,105,110,103,32,39,97,98,115,111,108,117,116,101,39,32,111,114,32,39,114,101,108,97,116,105,118,101,39,32,0,0,0,0,0,77,79,85,83,69,95,0,0,124,115,105,110,40,51,54,48,120,41,124,0,0,0,0,0,10,45,45,0,0,0,0,0,116,105,109,101,108,97,98,101,108,46,116,101,120,116,0,0,115,107,121,98,108,117,101,0,32,110,111,116,32,114,111,116,97,116,101,100,0,0,0,0,114,36,101,108,97,116,105,118,101,0,0,0,0,0,0,0,40,37,46,49,102,97,44,37,46,49,102,98,41,37,115,0,109,101,100,105,117,109,45,98,108,117,101,0,0,0,0,0,32,114,111,116,97,116,101,100,32,98,121,32,37,100,32,100,101,103,114,101,101,115,32,40,105,102,32,112,111,115,115,105,98,108,101,41,0,0,0,0,97,36,98,115,111,108,117,116,101,0,0,0,0,0,0,0,98,97,100,32,100,97,116,97,32,111,110,32,108,105,110,101,32,37,100,32,111,102,32,100,97,116,97,102,105,108,101,0,115,101,116,32,37,115,122,101,114,111,97,120,105,115,0,0,102,105,108,108,32,0,0,0,110,97,118,121,0,0,0,0,32,99,101,110,116,114,101,0,112,114,105,110,116,95,116,97,98,108,101,58,32,111,117,116,112,117,116,32,98,117,102,102,101,114,0,0,0,0,0,0,73,110,116,101,114,110,97,108,32,101,114,114,111,114,32,105,110,32,115,99,105,101,110,116,105,102,105,99,32,110,117,109,98,101,114,32,102,111,114,109,97,116,116,105,110,103,0,0,102,105,108,108,99,111,108,111,114,58,61,99,117,114,114,101,110,116,99,111,108,111,114,59,10,0,0,0,0,0,0,0,109,105,100,110,105,103,104,116,45,98,108,117,101,0,0,0,9,108,97,98,101,108,32,37,100,32,34,37,115,34,32,97,116,32,0,0,0,0,0,0,122,95,109,105,110,51,100,32,115,104,111,117,108,100,32,110,111,116,32,101,113,117,97,108,32,122,95,109,97,120,51,100,33,0,0,0,0,0,0,0,106,117,109,112,0,0,0,0,32,40,0,0,0,0,0,0,102,105,108,108,99,111,108,111,114,58,61,99,117,114,114,101,110,116,99,111,108,111,114,42,37,46,50,102,43,98,97,99,107,103,114,111,117,110,100,42,37,46,50,102,59,10,0,0,100,97,114,107,45,98,108,117,101,0,0,0,0,0,0,0,123,0,0,0,0,0,0,0,32,32,83,117,109,58,32,32,32,32,32,32,37,115,32,37,115,32,37,115,10,0,0,0,34,37,115,34,0,0,0,0,102,105,108,108,99,111,108,111,114,58,61,98,97,99,107,103,114,111,117,110,100,59,10,0,44,32,98,97,99,107,97,110,103,108,101,32,37,103,32,100,101,103,0,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,39,108,105,110,101,97,114,39,44,32,39,99,117,98,105,99,115,112,108,105,110,101,39,44,32,39,98,115,112,108,105,110,101,39,44,32,39,112,111,105,110,116,115,39,44,32,39,108,101,118,101,108,115,39,32,111,114,32,39,111,114,100,101,114,39,0,0,0,0,0,115,101,116,32,37,115,116,105,99,115,32,37,115,32,0,0,108,105,110,101,115,112,111,105,110,116,115,10,0,0,0,0,71,80,86,65,76,95,76,65,83,84,95,80,76,79,84,0,47,0,0,0,0,0,0,0,100,101,102,97,117,108,116,102,111,110,116,0,0,0,0,0,115,101,97,45,103,114,101,101,110,0,0,0,0,0,0,0,75,80,95,68,111,119,110,0,10,9,32,32,97,114,114,111,119,32,104,101,97,100,58,32,108,101,110,103,116,104,32,37,115,37,103,44,32,97,110,103,108,101,32,37,103,32,100,101,103,0,0,0,0,0,0,0,98,115,112,108,105,110,101,32,111,114,100,101,114,32,109,117,115,116,32,98,101,32,105,110,32,91,50,46,46,49,48,93,32,114,97,110,103,101,46,0,32,110,111,114,97,110,103,101,108,105,109,105,116,0,0,0,101,120,116,101,114,110,97,108,36,105,109,97,103,101,115,0,102,111,114,101,115,116,45,103,114,101,101,110,0,0,0,0,40,115,101,99,111,110,100,32,120,32,97,120,105,115,41,32,0,0,0,0,0,0,0,0,111,36,114,100,101,114,0,0,32,114,97,110,103,101,108,105,109,105,116,0,0,0,0,0,117,110,102,105,110,105,115,104,101,100,32,114,97,110,103,101,32,119,105,116,104,32,99,111,110,115,116,114,97,105,110,116,0,0,0,0,0,0,0,0,105,110,108,105,110,101,36,105,109,97,103,101,115,0,0,0,115,112,114,105,110,103,45,103,114,101,101,110,0,0,0,0,40,102,105,114,115,116,32,120,32,97,120,105,115,41,32,0,76,101,118,101,108,115,32,116,121,112,101,32,105,115,32,100,105,115,99,114,101,116,101,44,32,105,103,110,111,114,105,110,103,32,110,101,119,32,110,117,109,98,101,114,32,111,102,32,99,111,110,116,111,117,114,32,108,101,118,101,108,115,0,0,84,101,114,109,105,110,97,108,32,99,97,110,118,97,115,32,97,114,101,97,32,116,111,111,32,115,109,97,108,108,32,116,111,32,104,111,108,100,32,112,108,111,116,46,10,9,32,32,32,32,67,104,101,99,107,32,112,108,111,116,32,98,111,117,110,100,97,114,121,32,97,110,100,32,102,111,110,116,32,115,105,122,101,115,46,0,0,0,112,111,105,110,116,115,119,105,116,104,116,101,120,0,0,0,100,97,114,107,45,103,114,101,101,110,0,0,0,0,0,0,32,116,111,32,0,0,0,0,97,117,36,116,111,0,0,0,10,115,101,116,32,37,115,100,116,105,99,115,0,0,0,0,51,54,48,32,109,117,108,32,115,105,110,32,97,98,115,0,112,111,105,110,116,115,119,105,116,104,109,101,116,97,112,111,115,116,0,0,0,0,0,0,32,114,116,111,32,0,0,0,101,120,112,101,99,116,105,110,103,32,99,111,109,109,97,32,116,111,32,115,101,112,97,114,97,116,101,32,105,110,99,114,44,115,116,111,112,32,108,101,118,101,108,115,0,0,0,0,10,115,101,116,32,37,115,109,116,105,99,115,0,0,0,0,112,111,105,110,116,115,119,105,116,104,109,112,0,0,0,0,103,111,108,100,0,0,0,0,10,9,32,32,102,114,111,109,32,0,0,0,0,0,0,0,105,110,99,114,101,109,101,110,116,32,99,97,110,110,111,116,32,98,101,32,48,0,0,0,97,117,116,111,102,114,101,113,32,0,0,0,0,0,0,0,77,97,120,46,32,110,117,109,98,101,114,32,111,102,32,100,97,116,97,32,112,111,105,110,116,115,32,115,99,97,108,101,100,32,117,112,32,116,111,58,32,37,100,10,0,0,0,0,69,68,70,32,104,101,97,100,101,114,0,0,0,0,0,0,116,101,120,36,112,111,105,110,116,115,0,0,0,0,0,0,108,105,103,104,116,45,116,117,114,113,117,111,105,115,101,0,110,111,102,105,108,108,101,100,0,0,0,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,99,111,109,109,97,32,116,111,32,115,101,112,97,114,97,116,101,32,115,116,97,114,116,44,105,110,99,114,32,108,101,118,101,108,115,0,0,0,10,115,101,116,32,37,115,116,105,99,115,32,0,0,0,0,108,111,103,49,48,95,98,97,115,101,32,61,61,32,49,46,48,0,0,0,0,0,0,0,109,112,36,112,111,105,110,116,115,0,0,0,0,0,0,0,108,105,103,104,116,45,112,105,110,107,0,0,0,0,0,0,101,109,112,116,121,0,0,0,105,110,36,99,114,101,109,101,110,116,97,108,0,0,0,0,97,115,115,105,103,110,0,0,32,97,117,116,111,106,117,115,116,105,102,121,0,0,0,0,112,111,112,32,48,0,0,0,116,101,120,116,115,99,97,108,101,0,0,0,0,0,0,0,108,105,103,104,116,45,103,111,108,100,101,110,114,111,100,0,119,104,105,108,101,0,0,0,102,105,108,108,101,100,0,0,101,120,112,101,99,116,105,110,103,32,99,111,109,109,97,32,116,111,32,115,101,112,97,114,97,116,101,32,100,105,115,99,114,101,116,101,32,108,101,118,101,108,115,0,0,0,0,0,32,32,83,116,100,32,68,101,118,58,32,32,37,115,32,37,115,32,37,115,10,0,0,0,98,121,32,37,100,32,0,0,117,115,104,111,114,116,0,0,102,111,110,116,115,99,97,108,101,0,0,0,0,0,0,0,108,105,103,104,116,45,99,121,97,110,0,0,0,0,0,0,9,97,114,114,111,119,32,37,100,44,32,37,115,32,37,115,32,37,115,0,0,0,0,0,108,105,110,101,115,116,121,108,101,0,0,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,100,105,115,99,114,101,116,101,32,108,101,118,101,108,0,0,0,0,0,0,0,0,105,109,112,117,108,115,101,115,10,0,0,0,0,0,0,0,67,97,110,110,111,116,32,99,111,110,116,111,117,114,32,110,111,110,32,103,114,105,100,32,100,97,116,97,46,32,80,108,101,97,115,101,32,117,115,101,32,34,115,101,116,32,100,103,114,105,100,51,100,34,46,0,98,105,110,100,95,99,111,109,109,97,110,100,45,62,114,104,115,0,0,0,0,0,0,0,108,119,0,0,0,0,0,0,108,105,103,104,116,45,109,97,103,101,110,116,97,0,0,0,75,80,95,69,110,100,0,0,9,107,101,121,32,116,105,116,108,101,32,105,115,32,34,37,115,34,10,0,0,0,0,0,100,105,36,115,99,114,101,116,101,0,0,0,0,0,0,0,82,101,115,117,108,116,105,110,103,32,115,116,114,105,110,103,32,105,115,32,116,111,111,32,108,111,110,103,0,0,0,0,108,105,110,101,119,36,105,100,116,104,0,0,0,0,0,0,108,105,103,104,116,45,98,108,117,101,0,0,0,0,0,0,37,100,32,102,111,114,32,118,101,114,116,105,99,97,108,32,97,108,105,103,110,109,101,110,116,10,0,0,0,0,0,0,108,101,36,118,101,108,115,0,111,117,116,0,0,0,0,0,100,108,0,0,0,0,0,0,108,105,103,104,116,45,103,114,101,101,110,0,0,0,0,0,9,109,97,120,105,109,117,109,32,110,117,109,98,101,114,32,111,102,32,114,111,119,115,32,105,115,32,0,0,0,0,0,98,36,115,112,108,105,110,101,0,0,0,0,0,0,0,0,107,101,121,0,0,0,0,0,100,97,115,104,108,36,101,110,103,116,104,0,0,0,0,0,108,105,103,104,116,45,114,101,100,0,0,0,0,0,0,0,99,97,108,99,117,108,97,116,101,100,32,97,117,116,111,109,97,116,105,99,97,108,108,121,10,0,0,0,0,0,0,0,99,36,117,98,105,99,115,112,108,105,110,101,0,0,0,0,97,120,105,115,0,0,0,0,99,111,115,40,51,54,48,120,41,0,0,0,0,0,0,0,115,113,117,97,114,101,36,100,0,0,0,0,0,0,0,0,103,114,101,121,49,48,48,0,37,100,32,102,111,114,32,104,111,114,105,122,111,110,116,97,108,32,97,108,105,103,110,109,101,110,116,10,0,0,0,0,108,105,36,110,101,97,114,0,115,101,116,32,37,115,116,105,99,115,32,37,115,32,37,115,32,115,99,97,108,101,32,37,103,44,37,103,32,37,115,109,105,114,114,111,114,32,37,115,32,0,0,0,0,0,0,0,98,101,118,101,108,36,101,100,0,0,0,0,0,0,0,0,103,114,101,121,57,48,0,0,9,109,97,120,105,109,117,109,32,110,117,109,98,101,114,32,111,102,32,99,111,108,117,109,110,115,32,105,115,32,0,0,115,101,116,32,110,111,37,115,116,105,99,115,10,0,0,0,79,117,116,32,111,102,32,109,101,109,111,114,121,32,105,110,32,102,105,116,58,32,116,111,111,32,109,97,110,121,32,100,97,116,97,112,111,105,110,116,115,32,40,37,100,41,63,0,109,105,116,101,114,36,101,100,0,0,0,0,0,0,0,0,103,114,101,121,56,48,0,0,119,105,116,104,32,99,111,108,117,109,110,32,104,101,97,100,101,114,0,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,39,98,97,115,101,39,44,32,39,115,117,114,102,97,99,101,39,44,32,111,114,32,39,98,111,116,104,39,0,0,32,108,111,103,102,105,108,101,32,39,37,115,39,0,0,0,115,111,36,108,105,100,0,0,103,114,101,121,55,48,0,0,119,105,116,104,32,102,105,108,101,110,97,109,101,0,0,0,98,111,36,116,104,0,0,0,91,93,0,0,0,0,0,0,115,101,116,32,102,105,116,32,37,115,101,114,114,111,114,118,97,114,105,97,98,108,101,115,0,0,0,0,0,0,0,0,116,101,109,112,32,102,105,108,101,32,115,116,114,105,110,103,0,0,0,0,0,0,0,0,100,97,36,115,104,101,100,0,103,114,101,121,54,48,0,0,117,112,36,100,97,116,101,0,9,115,97,109,112,108,101,32,108,101,110,103,116,104,32,105,115,32,37,103,32,99,104,97,114,97,99,116,101,114,115,10,9,118,101,114,116,105,99,97,108,32,115,112,97,99,105,110,103,32,105,115,32,37,103,32,99,104,97,114,97,99,116,101,114,115,10,9,119,105,100,116,104,32,97,100,106,117,115,116,109,101,110,116,32,105,115,32,37,103,32,99,104,97,114,97,99,116,101,114,115,10,9,104,101,105,103,104,116,32,97,100,106,117,115,116,109,101,110,116,32,105,115,32,37,103,32,99,104,97,114,97,99,116,101,114,115,10,9,99,117,114,118,101,115,32,97,114,101,37,115,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,116,105,116,108,101,100,32,37,115,10,0,0,0,0,0,0,0,0,115,36,117,114,102,97,99,101,0,0,0,0,0,0,0,0,32,32,77,101,97,110,58,32,32,32,32,32,37,115,32,37,115,32,37,115,10,0,0,0,115,101,116,32,112,115,100,105,114,10,0,0,0,0,0,0,123,37,115,44,32,37,115,125,0,0,0,0,0,0,0,0,115,104,111,114,116,0,0,0,109,111,110,111,36,99,104,114,111,109,101,0,0,0,0,0,103,114,101,121,53,48,0,0,9,107,101,121,32,98,111,120,32,105,115,32,111,112,97,113,117,101,32,97,110,100,32,100,114,97,119,110,32,105,110,32,102,114,111,110,116,32,111,102,32,116,104,101,32,103,114,97,112,104,10,0,0,0,0,0,98,97,36,115,101,0,0,0,115,101,116,32,112,115,100,105,114,32,34,37,115,34,10,0,112,111,105,110,116,115,10,0,65,108,108,32,112,111,105,110,116,115,32,111,102,32,99,111,108,111,114,98,111,120,32,118,97,108,117,101,32,117,110,100,101,102,105,110,101,100,0,0,98,105,110,100,95,99,111,109,109,97,110,100,45,62,108,104,115,0,0,0,0,0,0,0,43,0,0,0,0,0,0,0,99,111,108,36,111,117,114,0,103,114,101,121,52,48,0,0,75,80,95,73,110,115,101,114,116,0,0,0,0,0,0,0,110,111,116,32,98,111,120,101,100,10,0,0,0,0,0,0,83,99,97,108,101,32,102,97,99,116,111,114,115,32,109,117,115,116,32,98,101,32,103,114,101,97,116,101,114,32,116,104,97,110,32,122,101,114,111,32,45,32,110,111,116,32,99,104,97,110,103,101,100,33,0,0,115,101,116,32,102,111,110,116,112,97,116,104,32,0,0,0,68,111,117,98,108,101,0,0,102,95,115,116,114,102,116,105,109,101,58,32,98,117,102,102,101,114,0,0,0,0,0,0,105,110,105,116,32,100,121,110,97,114,114,97,121,0,0,0,99,111,108,36,111,114,0,0,103,114,101,121,51,48,0,0,98,111,120,101,100,10,9,119,105,116,104,32,0,0,0,0,78,117,109,98,101,114,32,111,102,32,103,114,105,100,32,112,111,105,110,116,115,32,109,117,115,116,32,98,101,32,105,110,32,91,50,58,49,48,48,48,93,32,45,32,110,111,116,32,99,104,97,110,103,101,100,33,0,0,0,0,0,0,0,0,117,110,102,105,110,105,115,104,101,100,32,114,97,110,103,101,0,0,0,0,0,0,0,0,110,111,104,101,97,100,101,114,0,0,0,0,0,0,0,0,103,114,101,121,50,48,0,0,114,105,103,104,116,0,0,0,85,110,114,101,99,111,103,110,105,122,101,32,107,101,121,119,111,114,100,32,111,114,32,117,110,101,120,112,101,99,116,101,100,32,118,97,108,117,101,0,100,105,102,102,105,99,117,108,116,121,32,109,97,107,105,110,103,32,114,111,111,109,32,102,111,114,32,120,116,105,99,32,108,97,98,101,108,115,0,0,115,101,116,32,108,111,97,100,112,97,116,104,32,0,0,0,104,101,97,100,101,114,0,0,103,114,101,121,49,48,0,0,108,101,102,116,0,0,0,0,107,100,101,110,115,36,105,116,121,50,100,0,0,0,0,0,51,54,48,32,109,117,108,32,99,111,115,0,0,0,0,0,110,111,116,105,109,101,36,115,116,97,109,112,0,0,0,0,103,114,101,121,48,0,0,0,9,107,101,121,32,105,115,32,37,115,32,106,117,115,116,105,102,105,101,100,44,32,37,115,114,101,118,101,114,115,101,100,44,32,37,115,105,110,118,101,114,116,101,100,44,32,37,115,101,110,104,97,110,99,101,100,32,97,110,100,32,0,0,0,100,101,99,105,109,97,108,95,115,105,103,110,32,105,110,32,108,111,99,97,108,101,32,105,115,32,37,115,10,0,0,0,101,114,114,111,114,32,100,117,114,105,110,103,32,102,105,116,0,0,0,0,0,0,0,0,116,105,109,101,36,115,116,97,109,112,0,0,0,0,0,0,116,117,114,113,117,111,105,115,101,0,0,0,0,0,0,0,9,107,101,121,32,105,115,32,97,116,32,0,0,0,0,0,67,111,117,108,100,32,110,111,116,32,102,105,110,100,32,114,101,113,117,101,115,116,101,100,32,108,111,99,97,108,101,0,115,116,97,110,100,36,97,108,111,110,101,0,0,0,0,0,32,114,109,97,114,103,105,110,0,0,0,0,0,0,0,0,76,65,78,71,0,0,0,0,85,83,69,82,78,65,77,69,0,0,0,0,0,0,0,0,105,110,112,36,117,116,0,0,32,108,109,97,114,103,105,110,0,0,0,0,0,0,0,0,76,67,95,78,85,77,69,82,73,67,0,0,0,0,0,0,110,101,115,0,0,0,0,0,67,108,111,115,105,110,103,32,37,115,10,0,0,0,0,0,100,101,102,97,117,108,116,115,105,122,101,0,0,0,0,0,97,113,117,97,109,97,114,105,110,101,0,0,0,0,0,0,117,110,115,36,101,116,0,0,32,98,109,97,114,103,105,110,0,0,0,0,0,0,0,0,76,67,95,65,76,76,0,0,42,32,67,79,76,85,77,78,83,58,10,0,0,0,0,0,102,114,97,99,116,105,111,110,0,0,0,0,0,0,0,0,117,99,104,97,114,0,0,0,115,105,122,101,0,0,0,0,111,114,99,104,105,100,0,0,32,116,109,97,114,103,105,110,0,0,0,0,0,0,0,0,99,97,110,100,108,101,115,0,108,105,110,101,115,10,0,0,65,108,108,32,112,111,105,110,116,115,32,122,32,118,97,108,117,101,32,117,110,100,101,102,105,110,101,100,0,0,0,0,119,104,105,115,107,101,114,36,98,97,114,115,0,0,0,0,99,111,109,109,97,110,100,46,99,0,0,0,0,0,0,0,100,36,101,102,97,117,108,116,0,0,0,0,0,0,0,0,100,97,114,107,45,99,104,97,114,116,114,101,117,115,101,0,75,80,95,70,52,0,0,0,32,111,117,116,115,105,100,101,0,0,0,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,115,101,99,111,110,100,32,100,117,109,109,121,32,118,97,114,105,97,98,108,101,32,110,97,109,101,0,0,0,0,120,121,61,37,103,44,37,103,0,0,0,0,0,0,0,0,70,108,111,97,116,0,0,0,102,105,110,97,110,99,101,98,97,114,115,0,0,0,0,0,115,105,122,101,58,32,111,117,116,32,111,102,32,114,97,110,103,101,0,0,0,0,0,0,100,97,114,107,45,114,101,100,0,0,0,0,0,0,0,0,32,105,110,115,105,100,101,0,101,120,112,101,99,116,105,110,103,32,100,117,109,109,121,32,118,97,114,105,97,98,108,101,32,110,97,109,101,0,0,0,115,101,116,32,115,116,121,108,101,32,98,111,120,112,108,111,116,32,37,115,32,37,115,32,37,53,46,50,102,32,37,115,111,117,116,108,105,101,114,115,32,112,116,32,37,100,32,115,101,112,97,114,97,116,105,111,110,32,37,103,32,108,97,98,101,108,115,32,37,115,32,37,115,115,111,114,116,101,100,10,0,0,0,0,0,0,0,0,105,110,36,99,104,101,115,0,115,116,101,101,108,98,108,117,101,0,0,0,0,0,0,0,32,104,111,114,105,122,111,110,116,97,108,0,0,0,0,0,105,99,111,110,118,32,102,97,105,108,101,100,32,116,111,32,99,111,110,118,101,114,116,32,100,101,103,114,101,101,32,115,105,103,110,0,0,0,0,0,120,116,105,99,0,0,0,0,10,117,110,115,101,116,32,99,111,108,111,114,98,111,120,10,0,0,0,0,0,0,0,0,115,105,122,101,32,114,101,113,117,105,114,101,115,32,116,119,111,32,110,117,109,98,101,114,115,58,32,32,120,115,105,122,101,44,32,121,115,105,122,101,0,0,0,0,0,0,0,0,112,117,114,112,108,101,0,0,32,118,101,114,116,105,99,97,108,0,0,0,0,0,0,0,105,99,111,110,118,95,111,112,101,110,32,102,97,105,108,101,100,32,102,111,114,32,37,115,0,0,0,0,0,0,0,0,98,111,114,100,101,114,32,37,100,0,0,0,0,0,0,0,115,105,110,40,51,54,48,120,41,0,0,0,0,0,0,0,101,120,112,97,110,100,32,108,111,97,100,112,97,116,104,0,102,111,110,116,32,34,37,115,44,37,103,34,0,0,0,0,100,97,114,107,45,115,112,114,105,110,103,45,103,114,101,101,110,0,0,0,0,0,0,0,32,99,101,110,116,101,114,0,98,100,101,102,97,117,108,116,0,0,0,0,0,0,0,0,109,112,112,111,105,110,116,115,32,0,0,0,0,0,0,0,103,111,108,100,101,110,114,111,100,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,32,114,105,103,104,116,0,0,117,110,114,101,99,111,103,110,105,122,101,100,32,101,110,99,111,100,105,110,103,32,115,112,101,99,105,102,105,99,97,116,105,111,110,59,32,115,101,101,32,39,104,101,108,112,32,101,110,99,111,100,105,110,103,39,46,0,0,0,0,0,0,0,110,111,98,111,114,100,101,114,0,0,0,0,0,0,0,0,101,114,114,36,111,114,115,116,97,116,101,0,0,0,0,0,73,108,108,101,103,97,108,32,100,97,121,32,111,102,32,121,101,97,114,0,0,0,0,0,116,101,120,112,111,105,110,116,115,32,0,0,0,0,0,0,114,111,121,97,108,98,108,117,101,0,0,0,0,0,0,0,32,108,101,102,116,0,0,0,57,51,50,0,0,0,0,0,47,117,115,114,47,108,111,99,97,108,47,115,104,97,114,101,47,103,104,111,115,116,115,99,114,105,112,116,47,102,111,110,116,115,0,0,0,0,0,0,85,83,69,82,0,0,0,0,115,111,108,105,100,0,0,0,100,97,114,107,45,121,101,108,108,111,119,0,0,0,0,0,83,74,73,83,0,0,0,0,101,113,115,0,0,0,0,0,104,111,114,105,122,111,110,116,0,0,0,0,0,0,0,0,78,111,32,116,101,114,109,105,110,97,108,32,100,101,102,105,110,101,100,0,0,0,0,0,100,97,115,104,101,100,0,0,100,97,114,107,45,111,114,97,110,103,101,0,0,0,0,0,117,110,100,36,101,102,105,110,101,0,0,0,0,0,0,0,9,107,101,121,32,105,115,32,79,78,44,32,112,111,115,105,116,105,111,110,58,32,0,0,118,101,114,116,105,99,0,0,99,0,0,0,0,0,0,0,32,37,115,32,100,97,115,104,108,101,110,103,116,104,32,37,103,32,108,105,110,101,119,105,100,116,104,32,37,103,32,102,111,110,116,115,99,97,108,101,32,37,103,32,92,10,32,32,32,0,0,0,0,0,0,0,100,97,114,107,45,99,121,97,110,0,0,0,0,0,0,0,9,107,101,121,32,105,115,32,79,70,70,10,0,0,0,0,85,84,70,0,0,0,0,0,115,101,116,32,99,111,108,111,114,98,111,120,32,37,115,97,108,32,111,114,105,103,105,110,32,0,0,0,0,0,0,0,32,114,103,98,32,34,35,37,54,46,54,120,34,32,0,0,65,108,108,32,112,111,105,110,116,115,32,121,32,118,97,108,117,101,32,117,110,100,101,102,105,110,101,100,0,0,0,0,84,104,105,115,32,112,108,111,116,32,115,116,121,108,101,32,105,115,32,111,110,108,121,32,102,111,114,32,100,97,116,97,102,105,108,101,115,44,32,114,101,118,101,114,116,105,110,103,32,116,111,32,34,112,111,105,110,116,115,34,0,0,0,0,40,98,105,110,100,95,99,111,109,109,97,110,100,41,32,37,115,58,37,100,10,0,0,0,60,61,0,0,0,0,0,0,114,111,117,110,100,0,0,0,100,97,114,107,45,109,97,103,101,110,116,97,0,0,0,0,75,80,95,70,51,0,0,0,32,111,110,108,121,10,0,0,117,116,102,0,0,0,0,0,37,115,61,37,103,0,0,0,68,111,117,98,108,101,86,97,108,117,101,0,0,0,0,0,102,95,115,116,114,102,116,105,109,101,58,32,102,109,116,0,117,115,101,114,0,0,0,0,98,101,118,101,108,101,100,32,0,0,0,0,0,0,0,0,119,101,98,45,98,108,117,101,0,0,0,0,0,0,0,0,9,110,111,32,108,111,103,115,99,97,108,105,110,103,10,0,108,111,99,97,108,101,0,0,115,101,116,32,99,111,108,111,114,98,111,120,32,37,115,10,0,0,0,0,0,0,0,0,114,111,117,110,100,101,100,32,0,0,0,0,0,0,0,0,119,101,98,45,103,114,101,101,110,0,0,0,0,0,0,0,32,97,110,100,0,0,0,0,117,110,107,110,111,119,110,32,45,45,45,32,101,120,112,101,99,116,101,100,32,39,108,111,103,102,105,108,101,39,32,111,114,32,91,110,111,93,101,114,114,111,114,118,97,114,105,97,98,108,101,115,0,0,0,0,65,108,108,32,112,111,105,110,116,115,32,111,102,32,99,111,108,111,114,32,97,120,105,115,32,117,110,100,101,102,105,110,101,100,46,0,0,0,0,0,105,115,111,95,56,56,53,57,95,57,0,0,0,0,0,0,10,35,32,120,32,121,0,0,109,105,116,101,114,101,100,32,0,0,0,0,0,0,0,0,9,108,111,103,115,99,97,108,105,110,103,0,0,0,0,0,110,111,113,117,105,101,116,0,99,117,98,101,104,101,108,105,120,32,115,116,97,114,116,32,37,46,50,103,32,99,121,99,108,101,115,32,37,46,50,103,32,115,97,116,117,114,97,116,105,111,110,32,37,46,50,103,10,0,0,0,0,0,0,0,51,54,48,32,109,117,108,32,115,105,110,0,0,0,0,0,109,111,110,111,99,104,114,111,109,101,32,0,0,0,0,0,100,97,114,107,45,103,114,101,121,0,0,0,0,0,0,0,37,115,32,37,115,32,40,98,97,115,101,32,37,103,41,0,113,117,105,101,116,0,0,0,102,117,110,99,116,105,111,110,115,32,37,115,44,32,37,115,44,32,37,115,10,0,0,0,112,117,115,104,100,49,0,0,99,111,108,111,114,32,0,0,110,101,120,116,102,114,111,109,95,100,121,110,97,114,114,97,121,58,32,100,121,110,97,114,114,97,121,32,119,97,110,39,116,32,105,110,105,116,105,97,108,105,122,101,100,33,0,0,9,111,102,102,115,101,116,115,32,97,114,101,0,0,0,0,110,111,101,114,114,36,111,114,118,97,114,105,97,98,108,101,115,0,0,0,0,0,0,0,32,41,10,0,0,0,0,0,122,58,115,10,0,0,0,0,34,32,92,10,32,32,32,0,9,116,109,97,114,103,105,110,32,105,115,32,99,111,109,112,117,116,101,100,32,97,117,116,111,109,97,116,105,99,97,108,108,121,10,0,0,0,0,0,101,114,114,36,111,114,118,97,114,105,97,98,108,101,115,0,92,10,32,32,32,32,0,0,47,117,115,114,47,115,104,97,114,101,47,103,104,111,115,116,115,99,114,105,112,116,47,102,111,110,116,115,0,0,0,0,37,51,111,37,110,0,0,0,34,0,0,0,0,0,0,0,99,111,114,110,101,114,115,50,99,36,111,108,111,114,0,0,9,116,109,97,114,103,105,110,32,105,115,32,115,101,116,32,116,111,32,37,103,10,0,0,101,120,112,101,99,116,105,110,103,32,115,116,114,105,110,103,0,0,0,0,0,0,0,0,99,111,110,99,97,116,101,110,97,116,101,0,0,0,0,0,99,97,110,110,111,116,32,111,112,101,110,32,102,105,108,101,59,32,111,117,116,112,117,116,32,110,111,116,32,99,104,97,110,103,101,100,0,0,0,0,37,115,0,0,0,0,0,0,92,10,32,32,32,104,101,97,100,101,114,32,0,0,0,0,101,36,120,112,108,105,99,105,116,0,0,0,0,0,0,0,116,101,115,116,0,0,0,0,9,116,109,97,114,103,105,110,32,105,115,32,115,101,116,32,116,111,32,115,99,114,101,101,110,32,37,103,10,0,0,0,108,111,103,36,102,105,108,101,0,0,0,0,0,0,0,0,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,0,0,0,0,0,0,0,99,97,36,108,108,0,0,0,32,37,46,52,103,32,37,46,52,103,32,37,46,52,103,32,37,46,52,103,0,0,0,0,72,69,76,80,70,73,76,69,32,32,32,32,32,32,32,32,32,32,32,61,32,34,37,115,34,10,0,0,0,0,0,0,115,99,104,97,114,0,0,0,110,111,104,101,97,100,101,114,32,92,10,32,32,32,0,0,110,111,105,36,109,112,108,105,99,105,116,0,0,0,0,0,9,114,109,97,114,103,105,110,32,105,115,32,99,111,109,112,117,116,101,100,32,97,117,116,111,109,97,116,105,99,97,108,108,121,10,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,102,111,114,109,97,116,32,115,116,114,105,110,103,0,100,101,102,105,110,101,100,32,40,0,0,0,0,0,0,0]) -.concat([79,117,116,32,111,102,32,109,101,109,111,114,121,32,105,110,32,115,116,97,116,115,58,32,116,111,111,32,109,97,110,121,32,100,97,116,97,112,111,105,110,116,115,32,40,37,100,41,63,0,0,0,0,0,0,0,32,114,103,98,32,34,37,115,34,32,0,0,0,0,0,0,65,108,108,32,112,111,105,110,116,115,32,120,32,118,97,108,117,101,32,117,110,100,101,102,105,110,101,100,0,0,0,0,34,119,105,116,104,34,32,97,108,108,111,119,101,100,32,111,110,108,121,32,97,102,116,101,114,32,112,97,114,97,109,101,116,114,105,99,32,102,117,110,99,116,105,111,110,32,102,117,108,108,121,32,115,112,101,99,105,102,105,101,100,0,0,0,97,108,108,36,119,105,110,100,111,119,115,0,0,0,0,0,62,61,0,0,0,0,0,0,110,111,116,105,109,101,115,116,97,109,112,0,0,0,0,0,110,111,101,36,120,112,108,105,99,105,116,0,0,0,0,0,75,80,95,70,50,0,0,0,9,114,109,97,114,103,105,110,32,105,115,32,115,101,116,32,116,111,32,37,103,10,0,0,99,108,111,115,101,100,0,0,70,108,111,97,116,86,97,108,117,101,0,0,0,0,0,0,70,105,114,115,116,32,112,97,114,97,109,101,116,101,114,32,116,111,32,115,116,114,102,116,105,109,101,32,109,117,115,116,32,98,101,32,97,32,102,111,114,109,97,116,32,115,116,114,105,110,103,0,0,0,0,0,114,103,98,102,111,114,109,117,108,97,101,32,37,100,44,32,37,100,44,32,37,100,10,0,114,97,36,105,115,101,0,0,100,111,109,97,105,110,0,0,116,105,109,101,115,116,97,109,112,0,0,0,0,0,0,0,105,36,109,112,108,105,99,105,116,0,0,0,0,0,0,0,9,114,109,97,114,103,105,110,32,105,115,32,115,101,116,32,116,111,32,115,99,114,101,101,110,32,37,103,10,0,0,0,78,97,78,0,0,0,0,0,10,115,101,116,32,112,97,108,101,116,116,101,32,0,0,0,119,104,105,99,104,61,61,65,85,84,79,83,67,65,76,69,95,77,73,78,32,124,124,32,119,104,105,99,104,61,61,65,85,84,79,83,67,65,76,69,95,77,65,88,0,0,0,0,105,110,112,117,116,0,0,0,116,114,36,97,110,115,112,97,114,101,110,116,0,0,0,0,9,98,109,97,114,103,105,110,32,105,115,32,99,111,109,112,117,116,101,100,32,97,117,116,111,109,97,116,105,99,97,108,108,121,10,0,0,0,0,0,108,97,121,101,114,100,36,101,102,97,117,108,116,0,0,0,87,97,114,110,105,110,103,32,45,32,100,105,102,102,105,99,117,108,116,121,32,102,105,116,116,105,110,103,32,112,108,111,116,32,116,105,116,108,101,115,32,105,110,116,111,32,107,101,121,0,0,0,0,0,0,0,115,97,118,101,46,99,0,0,115,116,97,110,100,97,108,111,110,101,0,0,0,0,0,0,110,111,115,111,36,108,105,100,0,0,0,0,0,0,0,0,9,98,109,97,114,103,105,110,32,105,115,32,115,101,116,32,116,111,32,37,103,10,0,0,110,111,112,111,36,108,97,114,0,0,0,0,0,0,0,0,37,115,58,37,100,32,111,111,111,112,115,58,32,85,110,107,110,111,119,110,32,99,111,108,111,114,32,109,111,100,101,108,32,39,37,99,39,46,10,0,124,99,111,115,40,49,56,48,120,41,124,0,0,0,0,0,115,105,122,101,32,37,103,37,115,44,37,103,37,115,32,37,115,32,37,115,32,37,115,0,110,111,116,114,36,97,110,115,112,97,114,101,110,116,0,0,9,98,109,97,114,103,105,110,32,105,115,32,115,101,116,32,116,111,32,115,99,114,101,101,110,32,37,103,10,0,0,0,112,111,36,108,97,114,0,0,88,89,90,32,0,0,0,0,107,101,121,119,111,114,100,32,39,100,97,116,97,39,32,100,101,112,114,101,99,97,116,101,100,44,32,117,115,101,32,39,115,104,111,119,32,115,116,121,108,101,32,100,97,116,97,39,0,0,0,0,0,0,0,0,101,120,116,114,97,110,101,111,117,115,32,97,114,103,117,109,101,110,116,32,105,110,32,115,101,116,32,116,101,114,109,105,110,97,108,32,37,115,0,0,9,108,109,97,114,103,105,110,32,105,115,32,99,111,109,112,117,116,101,100,32,97,117,116,111,109,97,116,105,99,97,108,108,121,10,0,0,0,0,0,110,111,114,36,116,105,99,115,0,0,0,0,0,0,0,0,89,73,81,32,0,0,0,0,122,10,0,0,0,0,0,0,71,110,117,112,108,111,116,32,119,97,115,32,98,117,105,108,116,32,119,105,116,104,111,117,116,32,115,117,112,112,111,114,116,32,102,111,114,32,80,78,71,32,105,109,97,103,101,115,46,32,89,111,117,32,99,97,110,110,111,116,32,117,115,101,32,116,104,105,115,32,111,112,116,105,111,110,32,117,110,108,101,115,115,32,121,111,117,32,114,101,98,117,105,108,100,32,103,110,117,112,108,111,116,46,0,0,0,0,0,0,0,0,110,111,104,105,36,100,100,101,110,51,100,0,0,0,0,0,9,108,109,97,114,103,105,110,32,105,115,32,115,101,116,32,116,111,32,37,103,10,0,0,110,111,109,99,98,36,116,105,99,115,0,0,0,0,0,0,67,77,89,32,0,0,0,0,47,117,115,114,47,108,105,98,47,88,49,49,47,102,111,110,116,115,33,0,0,0,0,0,37,52,111,37,110,0,0,0,97,114,114,111,119,32,110,111,116,32,102,111,117,110,100,0,83,116,114,105,110,103,32,99,111,110,116,97,105,110,105,110,103,32,104,101,97,100,101,114,32,105,110,102,111,114,109,97,116,105,111,110,32,101,120,112,101,99,116,101,100,0,0,0,104,105,36,100,100,101,110,51,100,0,0,0,0,0,0,0,9,108,109,97,114,103,105,110,32,105,115,32,115,101,116,32,116,111,32,115,99,114,101,101,110,32,37,103,10,0,0,0,110,111,99,98,36,116,105,99,115,0,0,0,0,0,0,0,72,83,86,32,0,0,0,0,100,111,108,108,97,114,115,0,119,98,0,0,0,0,0,0,101,110,108,0,0,0,0,0,10,92,115,116,97,114,116,116,101,120,116,10,10,0,0,0,109,97,112,0,0,0,0,0,115,121,36,115,116,101,109,0,9,111,117,116,112,117,116,32,105,115,32,115,101,110,116,32,116,111,32,83,84,68,79,85,84,10,0,0,0,0,0,0,110,111,109,121,50,36,116,105,99,115,0,0,0,0,0,0,115,117,109,120,121,0,0,0,82,71,66,32,0,0,0,0,99,104,97,114,0,0,0,0,101,120,116,101,114,110,97,108,0,0,0,0,0,0,0,0,105,110,118,97,108,105,100,32,99,104,97,114,97,99,116,101,114,32,37,99,0,0,0,0,99,108,105,112,52,36,105,110,0,0,0,0,0,0,0,0,9,111,117,116,112,117,116,32,105,115,32,115,101,110,116,32,116,111,32,39,37,115,39,10,0,0,0,0,0,0,0,0,110,111,109,120,50,36,116,105,99,115,0,0,0,0,0,0,99,111,108,111,114,32,109,111,100,101,108,32,0,0,0,0,32,114,103,98,32,118,97,114,105,97,98,108,101,32,0,0,110,111,32,102,117,110,99,116,105,111,110,115,32,111,114,32,100,97,116,97,32,116,111,32,112,108,111,116,0,0,0,0,42,0,0,0,0,0,0,0,105,110,108,105,110,101,0,0,99,108,105,112,49,36,105,110,0,0,0,0,0,0,0,0,75,80,95,70,49,0,0,0,9,112,114,105,110,116,32,111,117,116,112,117,116,32,105,115,32,115,101,110,116,32,116,111,32,39,37,115,39,10,0,0,110,111,109,122,36,116,105,99,115,0,0,0,0,0,0,0,98,101,108,111,119,32,0,0,83,105,103,110,101,100,76,111,110,103,0,0,0,0,0,0,102,95,103,112,114,105,110,116,102,0,0,0,0,0,0,0,103,114,97,121,10,0,0,0,32,32,32,32,105,109,97,103,101,115,61,37,115,93,32,37,37,32,42,105,110,108,105,110,101,42,32,124,32,101,120,116,101,114,110,97,108,32,40,105,110,108,105,110,101,32,111,110,108,121,32,119,111,114,107,115,32,105,110,32,77,75,73,86,44,32,101,120,116,101,114,110,97,108,32,114,101,113,117,105,114,101,115,32,112,110,103,32,115,117,112,112,111,114,116,32,105,110,32,103,110,117,112,108,111,116,41,10,0,0,0,0,110,111,102,116,114,36,105,97,110,103,108,101,115,0,0,0,9,100,101,102,97,117,108,116,32,115,121,115,116,101,109,32,100,105,114,101,99,116,111,114,121,32,34,37,115,34,10,0,110,111,109,121,36,116,105,99,115,0,0,0,0,0,0,0,103,97,109,109,97,32,37,103,32,0,0,0,0,0,0,0,99,111,110,116,111,117,114,32,99,111,111,114,100,115,0,0,73,110,116,101,114,110,97,108,32,101,114,114,111,114,58,32,111,117,116,32,111,102,32,109,101,109,111,114,121,32,105,110,32,115,116,97,116,115,0,0,116,101,120,0,0,0,0,0,102,116,114,36,105,97,110,103,108,101,115,0,0,0,0,0,110,111,109,120,36,116,105,99,115,0,0,0,0,0,0,0,115,101,116,32,116,101,114,109,105,110,97,108,32,37,115,32,37,115,10,0,0,0,0,0,98,111,117,110,100,97,114,121,0,0,0,0,0,0,0,0,35,32,67,111,110,116,111,117,114,58,32,112,111,105,110,116,115,32,37,105,44,32,122,32,37,103,44,32,108,97,98,101,108,58,32,37,115,10,0,0,109,101,116,97,112,111,115,116,0,0,0,0,0,0,0,0,102,108,36,117,115,104,0,0,9,101,110,118,105,114,111,110,109,101,110,116,32,118,97,114,105,97,98,108,101,32,71,78,85,80,76,79,84,95,80,83,95,68,73,82,58,32,0,0,110,111,121,50,36,116,105,99,115,0,0,0,0,0,0,0,117,115,101,32,39,115,101,116,32,116,101,114,109,39,32,116,111,32,115,101,116,32,116,101,114,109,105,110,97,108,32,116,121,112,101,32,102,105,114,115,116,0,0,0,0,0,0,0,49,56,48,32,109,117,108,32,99,111,115,32,97,98,115,0,32,32,32,32,112,111,105,110,116,115,61,37,115,44,32,37,37,32,42,109,101,116,97,112,111,115,116,42,32,124,32,116,101,120,32,40,83,104,111,117,108,100,32,112,111,105,110,116,115,32,98,101,32,100,114,97,119,110,32,119,105,116,104,32,77,101,116,97,80,111,115,116,32,111,114,32,84,101,88,63,41,10,0,0,0,0,0,0,100,101,112,36,116,104,111,114,100,101,114,0,0,0,0,0,110,111,110,101,0,0,0,0,110,111,120,50,36,116,105,99,115,0,0,0,0,0,0,0,110,101,103,97,116,105,118,101,0,0,0,0,0,0,0,0,45,104,0,0,0,0,0,0,32,32,32,32,37,37,102,111,110,116,115,99,97,108,101,61,37,103,44,32,37,37,32,115,99,97,108,105,110,103,32,102,97,99,116,111,114,32,102,111,114,32,116,101,120,116,32,108,97,98,101,108,115,10,0,0,115,99,97,110,115,97,117,116,111,36,109,97,116,105,99,0,110,111,122,36,116,105,99,115,0,0,0,0,0,0,0,0,112,111,115,105,116,105,118,101,0,0,0,0,0,0,0,0,37,115,58,0,0,0,0,0,101,120,112,114,101,115,115,105,111,110,32,101,120,112,101,99,116,101,100,0,0,0,0,0,32,32,32,32,108,105,110,101,119,105,100,116,104,61,37,103,44,32,37,37,32,115,99,97,108,105,110,103,32,102,97,99,116,111,114,32,102,111,114,32,108,105,110,101,32,119,105,100,116,104,115,32,40,49,46,48,32,109,101,97,110,115,32,48,46,53,98,112,41,10,0,0,115,99,97,110,115,98,97,99,107,36,119,97,114,100,0,0,9,100,105,114,101,99,116,111,114,121,32,102,114,111,109,32,39,115,101,116,32,112,115,100,105,114,39,58,32,0,0,0,110,111,121,36,116,105,99,115,0,0,0,0,0,0,0,0,115,101,116,32,112,97,108,101,116,116,101,32,37,115,32,37,115,32,109,97,120,99,111,108,111,114,115,32,37,100,32,0,47,117,115,114,47,88,49,49,82,54,47,108,105,98,47,88,49,49,47,102,111,110,116,115,47,116,114,117,101,116,121,112,101,0,0,0,0,0,0,0,119,97,114,110,105,110,103,58,32,0,0,0,0,0,0,0,101,120,116,114,97,110,101,111,117,115,32,97,114,103,117,109,101,110,116,115,32,116,111,32,117,110,115,101,116,32,97,114,114,111,119,0,0,0,0,0,32,32,32,32,100,97,115,104,108,101,110,103,116,104,61,37,103,44,32,37,37,32,115,99,97,108,105,110,103,32,102,97,99,116,111,114,32,102,111,114,32,100,97,115,104,32,108,101,110,103,116,104,115,10,0,0,115,99,97,110,115,102,111,114,36,119,97,114,100,0,0,0,9,112,97,114,97,109,101,116,114,105,99,32,105,115,32,37,115,10,0,0,0,0,0,0,110,111,120,36,116,105,99,115,0,0,0,0,0,0,0,0,99,37,105,0,0,0,0,0,98,111,111,108,0,0,0,0,99,97,110,110,111,116,32,99,114,101,97,116,101,32,112,105,112,101,59,32,111,117,116,112,117,116,32,110,111,116,32,99,104,97,110,103,101,100,0,0,10,35,32,67,111,110,116,111,117,114,32,37,100,44,32,108,97,98,101,108,58,32,37,115,10,0,0,0,0,0,0,0,110,111,0,0,0,0,0,0,105,110,116,101,114,112,36,111,108,97,116,101,0,0,0,0,115,116,36,97,116,115,0,0,35,37,48,50,120,37,48,50,120,37,48,50,120,32,61,32,37,51,105,32,37,51,105,32,37,51,105,0,0,0,0,0,105,103,110,111,114,105,110,103,32,108,101,102,116,47,99,101,110,116,101,114,47,114,105,103,104,116,59,32,105,110,99,111,109,112,97,116,105,98,108,101,32,119,105,116,104,32,108,109,97,114,103,105,110,47,116,109,97,114,103,105,110,46,0,0,99,111,114,114,101,108,97,116,105,111,110,0,0,0,0,0,114,101,112,108,111,116,0,0,101,120,116,101,110,100,32,116,111,107,101,110,32,116,97,98,108,101,0,0,0,0,0,0,71,78,85,80,76,79,84,95,80,83,95,68,73,82,32,32,32,32,32,61,32,34,37,115,34,10,0,0,0,0,0,0,122,114,116,0,0,0,0,0,121,101,115,0,0,0,0,0,88,89,90,0,0,0,0,0,10,32,32,37,45,49,56,115,32,0,0,0,0,0,0,0,111,102,36,102,115,101,116,0,105,103,110,111,114,105,110,103,32,116,111,112,47,99,101,110,116,101,114,47,98,111,116,116,111,109,59,32,105,110,99,111,109,112,97,116,105,98,108,101,32,119,105,116,104,32,116,109,97,114,103,105,110,47,98,109,97,114,103,105,110,46,0,0,32,112,97,108,101,116,116,101,32,102,114,97,99,116,105,111,110,32,37,52,46,50,102,0,105,103,110,111,114,105,110,103,32,116,114,97,105,108,105,110,103,32,99,111,109,109,97,32,105,110,32,112,108,111,116,32,99,111,109,109,97,110,100,0,46,103,110,117,112,108,111,116,0,0,0,0,0,0,0,0,60,0,0,0,0,0,0,0,117,115,97,103,101,58,32,114,97,105,115,101,32,123,112,108,111,116,95,105,100,125,0,0,119,32,61,32,48,32,105,110,32,71,105,118,101,110,115,40,41,59,32,32,67,106,106,32,61,32,37,103,44,32,32,67,105,106,32,61,32,37,103,0,67,97,110,39,116,32,99,97,108,99,117,108,97,116,101,32,97,112,112,114,111,120,105,109,97,116,105,111,110,32,115,112,108,105,110,101,115,44,32,110,101,101,100,32,97,116,32,108,101,97,115,116,32,52,32,112,111,105,110,116,115,0,0,0,32,32,32,32,100,97,115,104,101,100,61,37,115,44,32,37,37,32,42,121,101,115,42,32,124,32,110,111,10,0,0,0,89,73,81,0,0,0,0,0,75,80,95,84,97,98,0,0,102,105,108,108,101,100,95,112,111,108,121,103,111,110,95,122,102,105,120,32,99,111,114,110,101,114,115,0,0,0,0,0,9,84,104,101,114,101,32,97,114,101,32,37,100,32,112,114,101,100,101,102,105,110,101,100,32,99,111,108,111,114,32,110,97,109,101,115,58,0,0,0,117,110,107,110,111,119,110,32,107,101,121,32,111,112,116,105,111,110,0,0,0,0,0,0,97,98,111,118,101,32,0,0,85,110,115,105,103,110,101,100,76,111,110,103,0,0,0,0,70,105,114,115,116,32,112,97,114,97,109,101,116,101,114,32,116,111,32,103,112,114,105,110,116,102,32,109,117,115,116,32,98,101,32,97,32,102,111,114,109,97,116,32,115,116,114,105,110,103,0,0,0,0,0,0,99,97,110,32,111,110,108,121,32,100,111,32,101,108,108,105,112,116,105,99,32,105,110,116,101,103,114,97,108,115,32,111,102,32,114,101,97,108,115,0,44,32,37,37,32,42,98,117,116,116,42,32,124,32,114,111,117,110,100,101,100,32,124,32,115,113,117,97,114,101,100,10,0,0,0,0,0,0,0,0,67,77,89,0,0,0,0,0,37,105,9,37,105,9,37,105,10,0,0,0,0,0,0,0,97,36,117,116,111,109,97,116,105,99,0,0,0,0,0,0,114,101,99,117,114,115,105,111,110,32,100,101,112,116,104,32,108,105,109,105,116,32,101,120,99,101,101,100,101,100,0,0,116,105,99,107,32,105,110,116,101,114,118,97,108,32,116,111,111,32,115,109,97,108,108,32,102,111,114,32,109,97,99,104,105,110,101,32,112,114,101,99,105,115,105,111,110,0,0,0,115,113,117,97,114,101,100,0,72,83,86,0,0,0,0,0,37,48,46,52,102,9,37,48,46,52,102,9,37,48,46,52,102,10,0,0,0,0,0,0,99,111,108,36,117,109,110,104,101,97,100,101,114,0,0,0,95,94,0,0,0,0,0,0,98,117,116,116,0,0,0,0,82,71,66,0,0,0,0,0,46,10,0,0,0,0,0,0,77,117,108,116,105,112,108,101,32,115,116,97,99,107,32,100,105,114,101,99,116,105,111,110,32,115,101,116,116,105,110,103,115,0,0,0,0,0,0,0,32,99,111,114,110,101,114,115,50,99,111,108,111,114,32,0,115,105,110,40,49,56,48,120,41,0,0,0,0,0,0,0,32,32,32,32,108,105,110,101,99,97,112,61,0,0,0,0,99,117,98,101,104,101,108,105,120,0,0,0,0,0,0,0,32,115,97,118,101,100,32,116,111,32,34,37,115,34,46,0,77,117,108,116,105,112,108,101,32,108,111,99,97,116,105,111,110,32,114,101,103,105,111,110,32,115,101,116,116,105,110,103,115,0,0,0,0,0,0,0,32,110,111,104,105,100,100,101,110,51,100,0,0,0,0,0,105,110,118,101,114,115,101,95,101,114,114,111,114,95,102,117,110,99,58,32,84,104,101,32,118,97,108,117,101,32,111,117,116,32,111,102,32,116,104,101,32,114,97,110,103,101,32,111,102,32,116,104,101,32,102,117,110,99,116,105,111,110,0,0,44,32,37,37,32,42,109,105,116,101,114,101,100,42,32,124,32,114,111,117,110,100,101,100,32,124,32,98,101,118,101,108,101,100,10,0,0,0,0,0,103,97,109,36,109,97,0,0,67,111,108,111,114,0,0,0,77,117,108,116,105,112,108,101,32,104,111,114,105,122,111,110,116,97,108,32,112,111,115,105,116,105,111,110,32,115,101,116,116,105,110,103,115,0,0,0,32,104,105,100,100,101,110,51,100,0,0,0,0,0,0,0,32,32,32,32,32,32,32,32,102,111,114,109,97,116,32,61,32,0,0,0,0,0,0,0,98,101,118,101,108,101,100,0,109,97,120,99,36,111,108,111,114,115,0,0,0,0,0,0,71,114,97,121,0,0,0,0,77,117,108,116,105,112,108,101,32,118,101,114,116,105,99,97,108,32,112,111,115,105,116,105,111,110,32,115,101,116,116,105,110,103,115,0,0,0,0,0,32,104,105,100,100,101,110,51,100,32,37,100,0,0,0,0,47,117,115,114,47,88,49,49,82,54,47,108,105,98,47,88,49,49,47,102,111,110,116,115,47,84,121,112,101,49,0,0,71,80,86,65,76,95,69,82,82,77,83,71,0,0,0,0,116,121,120,0,0,0,0,0,114,111,117,110,100,101,100,0,112,115,95,97,108,108,99,70,0,0,0,0,0,0,0,0,37,115,32,112,97,108,101,116,116,101,32,119,105,116,104,32,37,105,32,100,105,115,99,114,101,116,101,32,99,111,108,111,114,115,0,0,0,0,0,0,102,105,108,108,95,110,117,109,98,101,114,115,32,99,108,111,115,105,110,103,0,0,0,0,102,116,114,105,97,110,103,108,101,115,0,0,0,0,0,0,102,97,99,116,111,114,105,97,108,0,0,0,0,0,0,0,119,0,0,0,0,0,0,0,37,99,10,0,0,0,0,0,109,105,116,101,114,101,100,0,110,111,112,115,95,97,108,108,99,70,0,0,0,0,0,0,115,112,36,108,111,116,0,0,101,120,112,101,99,116,105,110,103,32,110,111,32,111,112,116,105,111,110,32,111,114,32,105,110,116,32,111,114,32,102,108,111,97,116,0,0,0,0,0,115,116,114,105,110,103,32,101,120,112,101,99,116,101,100,0,105,110,116,101,114,99,101,112,116,0,0,0,0,0,0,0,32,110,111,0,0,0,0,0,47,117,115,114,47,108,111,99,97,108,47,115,104,97,114,101,47,103,110,117,112,108,111,116,47,52,46,54,47,103,110,117,112,108,111,116,46,103,105,104,0,0,0,0,0,0,0,0,116,122,114,0,0,0,0,0,108,105,110,101,106,111,105,110,61,0,0,0,0,0,0,0,109,111,36,100,101,108,0,0,105,36,110,116,0,0,0,0,110,111,112,111,36,105,110,116,0,0,0,0,0,0,0,0,102,105,108,108,95,110,117,109,98,101,114,115,32,114,101,115,105,122,101,32,112,97,116,116,101,114,110,0,0,0,0,0,67,111,110,102,108,105,99,116,32,98,101,116,119,101,101,110,32,115,111,109,101,32,109,97,116,114,105,120,32,98,105,110,97,114,121,32,97,110,100,32,103,101,110,101,114,97,108,32,98,105,110,97,114,121,32,107,101,121,119,111,114,100,115,0,32,112,97,108,101,116,116,101,32,99,98,32,37,103,0,0,115,97,109,112,108,101,115,32,111,114,32,105,115,111,95,115,97,109,112,108,101,115,32,60,32,50,46,32,77,117,115,116,32,98,101,32,97,116,32,108,101,97,115,116,32,50,46,0,103,110,117,112,108,111,116,114,99,0,0,0,0,0,0,0,62,0,0,0,0,0,0,0,117,115,97,103,101,58,32,108,111,119,101,114,32,123,112,108,111,116,95,105,100,125,0,0,92,115,101,116,117,112,71,78,85,80,76,79,84,116,101,114,109,105,110,97,108,10,32,32,32,91,99,111,110,116,101,120,116,93,10,32,32,32,91,0,102,117,110,99,36,116,105,111,110,115,0,0,0,0,0,0,75,80,95,83,112,97,99,101,0,0,0,0,0,0,0,0,102,36,108,111,97,116,0,0,102,105,108,108,95,110,117,109,98,101,114,115,32,110,101,120,116,32,110,117,109,98,101,114,0,0,0,0,0,0,0,0,115,121,110,116,97,120,32,105,115,32,120,121,61,60,120,62,44,60,121,62,0,0,0,0,83,105,103,110,101,100,73,110,116,101,103,101,114,0,0,0,105,110,116,101,114,110,97,108,32,101,114,114,111,114,58,32,105,110,118,97,108,105,100,32,115,112,101,99,95,116,121,112,101,0,0,0,0,0,0,0,76,97,115,116,32,108,105,110,101,32,109,117,115,116,32,110,111,116,32,98,101,32,98,101,102,111,114,101,32,102,105,114,115,116,32,108,105,110,101,0,92,115,101,116,117,112,98,111,100,121,102,111,110,116,10,32,32,32,91,37,115,37,115,37,103,112,116,93,10,0,0,0,102,105,108,101,0,0,0,0,112,97,108,101,116,116,101,32,115,105,122,101,32,114,101,113,117,105,114,101,100,0,0,0,99,111,110,115,116,97,110,116,32,101,120,112,114,101,115,115,105,111,110,32,101,120,112,101,99,116,101,100,0,0,0,0,98,101,103,105,110,0,0,0,76,97,115,116,32,112,111,105,110,116,32,109,117,115,116,32,110,111,116,32,98,101,32,98,101,102,111,114,101,32,102,105,114,115,116,32,112,111,105,110,116,0,0,0,0,0,0,0,84,111,111,32,109,97,110,121,32,97,120,105,115,32,116,105,99,107,115,32,114,101,113,117,101,115,116,101,100,32,40,62,37,46,48,103,41,0,0,0,102,117,110,99,116,105,111,110,32,37,115,32,114,101,113,117,105,114,101,115,32,37,100,32,118,97,114,105,97,98,108,101,115,0,0,0,0,0,0,0,92,100,101,102,105,110,101,98,111,100,121,102,111,110,116,101,110,118,105,114,111,110,109,101,110,116,10,32,32,32,91,37,103,112,116,93,10,0,0,0,100,101,102,36,105,110,101,100,0,0,0,0,0,0,0,0,37,51,105,46,32,103,114,97,121,61,37,48,46,52,102,44,32,40,114,44,103,44,98,41,61,40,37,48,46,52,102,44,37,48,46,52,102,44,37,48,46,52,102,41,44,32,35,37,48,50,120,37,48,50,120,37,48,50,120,32,61,32,37,51,105,32,37,51,105,32,37,51,105,10,0,0,0,0,0,0,102,105,108,108,95,110,117,109,98,101,114,115,32,111,117,116,112,117,116,32,98,117,102,102,101,114,0,0,0,0,0,0,69,120,112,101,99,116,101,100,32,110,111,110,45,110,101,103,97,116,105,118,101,32,105,110,116,101,103,101,114,0,0,0,114,103,98,36,102,111,114,109,117,108,97,101,0,0,0,0,9,99,111,108,111,114,32,109,97,112,112,105,110,103,32,42,110,111,116,42,32,100,111,110,101,32,98,121,32,100,101,102,105,110,101,100,32,103,114,97,100,105,101,110,116,46,10,0,112,111,105,110,116,116,36,121,112,101,0,0,0,0,0,0,32,102,108,117,115,104,32,0,69,120,112,101,99,116,101,100,32,112,111,115,105,116,105,118,101,32,105,110,116,101,103,101,114,0,0,0,0,0,0,0,49,56,48,32,109,117,108,32,115,105,110,0,0,0,0,0,92,115,101,116,117,112,99,111,108,111,114,115,10,32,32,32,91,115,116,97,116,101,61,115,116,97,114,116,93,10,0,0,9,32,32,42,32,116,104,117,115,32,116,104,101,32,114,97,110,103,101,115,32,105,110,32,96,115,101,116,32,112,109,51,100,32,114,103,98,102,111,114,109,117,108,97,101,39,32,97,114,101,32,45,37,105,46,46,37,105,10,0,0,0,0,0,108,105,110,101,116,36,121,112,101,0,0,0,0,0,0,0,115,101,116,32,112,109,51,100,32,105,110,116,101,114,112,111,108,97,116,101,32,37,100,44,37,100,0,0,0,0,0,0,73,110,100,101,120,32,115,116,101,112,32,109,117,115,116,32,98,101,32,112,111,115,105,116,105,118,101,0,0,0,0,0,92,117,115,101,109,111,100,117,108,101,10,32,32,32,91,103,110,117,112,108,111,116,93,10,0,0,0,0,0,0,0,0,78,111,32,115,117,99,104,32,111,112,116,105,111,110,32,116,111,32,104,105,100,100,101,110,51,100,32,40,111,114,32,119,114,111,110,103,32,111,114,100,101,114,41,0,0,0,0,0,103,114,101,121,0,0,0,0,9,32,32,42,32,110,101,103,97,116,105,118,101,32,110,117,109,98,101,114,115,32,109,101,97,110,32,105,110,118,101,114,116,101,100,61,110,101,103,97,116,105,118,101,32,99,111,108,111,117,114,32,99,111,109,112,111,110,101,110,116,10,0,0,100,101,112,116,104,111,114,100,101,114,10,0,0,0,0,0,85,112,112,101,114,32,105,110,100,101,120,32,115,104,111,117,108,100,32,98,101,32,98,105,103,103,101,114,32,116,104,97,110,32,108,111,119,101,114,32,105,110,100,101,120,0,0,0,70,73,84,58,32,32,32,32,100,97,116,97,32,114,101,97,100,32,102,114,111,109,32,37,115,10,0,0,0,0,0,0,92,101,110,97,98,108,101,114,101,103,105,109,101,10,32,32,32,91,117,116,102,45,56,93,10,0,0,0,0,0,0,0,37,50,105,58,32,37,45,49,53,115,0,0,0,0,0,0,115,99,97,110,115,98,97,99,107,119,97,114,100,10,0,0,66,105,110,97,114,121,32,109,97,116,114,105,120,32,102,105,108,101,32,102,111,114,109,97,116,32,100,111,101,115,32,110,111,116,32,97,108,108,111,119,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,115,117,114,102,97,99,101,32,112,101,114,32,102,105,108,101,0,67,0,0,0,0,0,0,0,10,10,0,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,39,112,111,105,110,116,115,39,44,32,39,111,110,101,39,44,32,111,114,32,39,116,119,111,39,0,0,0,0,0,76,73,78,69,83,0,0,0,37,37,32,83,101,101,32,97,108,115,111,32,104,116,116,112,58,47,47,119,105,107,105,46,99,111,110,116,101,120,116,103,97,114,100,101,110,46,110,101,116,47,71,110,117,112,108,111,116,10,37,37,10,0,0,0,110,101,103,36,97,116,105,118,101,0,0,0,0,0,0,0,10,9,32,32,32,32,0,0,99,101,110,116,114,101,0,0,115,99,97,110,115,102,111,114,119,97,114,100,10,0,0,0,112,111,119,101,114,0,0,0,73,110,32,109,117,108,116,105,112,108,111,116,32,109,111,100,101,32,121,111,117,32,99,97,110,39,116,32,99,104,97,110,103,101,32,116,104,101,32,111,117,116,112,117,116,10,0,0,32,100,101,108,116,97,95,120,32,100,101,108,116,97,95,121,32,100,101,108,116,97,95,122,0,0,0,0,0,0,0,0,37,37,32,71,78,85,80,76,79,84,32,118,101,114,115,105,111,110,58,32,37,115,46,37,115,44,32,116,101,114,109,105,110,97,108,32,118,101,114,115,105,111,110,58,32,37,115,46,37,115,32,40,37,115,41,10,0,0,0,0,0,0,0,0,112,111,115,36,105,116,105,118,101,0,0,0,0,0,0,0,115,104,36,111,119,0,0,0,9,32,32,42,32,116,104,101,114,101,32,97,114,101,32,37,105,32,97,118,97,105,108,97,98,108,101,32,114,103,98,32,99,111,108,111,114,32,109,97,112,112,105,110,103,32,102,111,114,109,117,108,97,101,58,0,115,108,111,112,101,0,0,0,115,99,97,110,115,97,117,116,111,109,97,116,105,99,10,0,102,70,101,69,103,71,0,0,71,78,85,72,69,76,80,0,10,0,0,0,0,0,0,0,114,116,122,0,0,0,0,0,98,97,36,99,107,0,0,0,9,84,104,101,32,98,101,115,116,32,109,97,116,99,104,32,111,102,32,116,104,101,32,99,117,114,114,101,110,116,32,112,97,108,101,116,116,101,32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,10,9,32,32,32,32,115,101,116,32,112,97,108,101,116,116,101,32,114,103,98,102,111,114,109,117,108,97,101,32,37,105,44,37,105,44,37,105,10,0,0,0,0,112,111,36,105,110,116,0,0,32,97,116,32,37,115,10,0,43,45,35,48,49,50,51,52,53,54,55,56,57,46,0,0,32,112,97,108,101,116,116,101,32,122,0,0,0,0,0,0,121,32,114,97,110,103,101,0,110,101,0,0,0,0,0,0,32,111,110,58,32,37,115,0,102,114,36,111,110,116,0,0,66,101,103,105,110,0,0,0,102,111,114,109,117,108,97,101,32,112,116,115,0,0,0,0,116,109,112,32,108,111,97,100,112,97,116,104,0,0,0,0,101,120,112,108,105,99,105,116,0,0,0,0,0,0,0,0,102,95,115,112,114,105,110,116,102,58,32,97,116,116,101,109,112,116,32,116,111,32,112,114,105,110,116,32,115,116,114,105,110,103,32,118,97,108,117,101,32,119,105,116,104,32,110,117,109,101,114,105,99,32,102,111,114,109,97,116,0,0,0,0,85,110,115,105,103,110,101,100,73,110,116,101,103,101,114,0,116,105,99,108,97,98,101,108,115,32,109,117,115,116,32,99,111,109,101,32,102,114,111,109,32,97,32,114,101,97,108,32,99,111,108,117,109,110,0,0,37,89,45,37,109,45,37,100,32,37,72,58,37,77,32,37,90,0,0,0,0,0,0,0,102,111,114,109,117,108,97,101,0,0,0,0,0,0,0,0,116,109,112,32,102,111,110,116,112,97,116,104,0,0,0,0,105,109,112,108,105,99,105,116,0,0,0,0,0,0,0,0,102,111,114,109,97,116,32,109,117,115,116,32,104,97,118,101,32,49,45,55,32,99,111,110,118,101,114,115,105,111,110,115,32,111,102,32,116,121,112,101,32,100,111,117,98,108,101,32,40,37,37,108,102,41,0,0,73,110,116,101,114,110,97,108,32,101,114,114,111,114,32,58,32,117,110,107,110,111,119,110,32,116,105,99,32,116,121,112,101,0,0,0,0,0,0,0,37,37,32,87,114,105,116,116,101,110,32,98,121,32,67,111,110,84,101,88,116,32,116,101,114,109,105,110,97,108,32,102,111,114,32,71,78,85,80,76,79,84,0,0,0,0,0,0,111,36,114,105,103,105,110,0,102,111,114,109,117,108,97,101,83,101,113,0,0,0,0,0,101,120,112,101,99,116,101,100,32,115,116,114,105,110,103,0,115,101,116,32,112,109,51,100,32,0,0,0,0,0,0,0,99,111,114,110,101,114,115,32,102,111,114,32,102,105,108,108,101,100,99,117,114,118,101,115,0,0,0,0,0,0,0,0,67,111,108,117,109,110,32,109,117,115,116,32,98,101,32,62,61,32,45,50,0,0,0,0,92,101,110,100,105,110,112,117,116,10,0,0,0,0,0,0,110,111,98,111,36,114,100,101,114,0,0,0,0,0,0,0,82,71,66,32,112,116,115,0,108,111,103,32,98,97,115,101,32,109,117,115,116,32,98,101,32,62,32,49,46,48,59,32,108,111,103,115,99,97,108,101,32,117,110,99,104,97,110,103,101,100,0,0,0,0,0,0,115,101,116,32,108,111,99,97,108,101,32,34,37,115,34,10,0,0,0,0,0,0,0,0,40,50,120,45,49,41,94,50,0,0,0,0,0,0,0,0,92,115,116,111,112,116,101,120,116,10,0,0,0,0,0,0,98,100,36,101,102,97,117,108,116,0,0,0,0,0,0,0,100,111,112,108,111,116,0,0,9,67,117,114,114,101,110,116,32,112,97,108,101,116,116,101,32,105,115,10,9,32,32,32,32,115,101,116,32,112,97,108,101,116,116,101,32,114,103,98,102,111,114,109,117,108,97,101,32,37,105,44,37,105,44,37,105,10,0,0,0,0,0,0,115,101,116,32,116,109,97,114,103,105,110,32,37,115,32,37,103,10,0,0,0,0,0,0,99,98,116,105,99,36,108,97,98,101,108,115,0,0,0,0,92,115,116,111,112,71,78,85,80,76,79,84,103,114,97,112,104,105,99,10,0,0,0,0,98,111,36,114,100,101,114,0,69,120,112,101,99,116,105,110,103,32,39,103,114,97,100,105,101,110,116,39,32,111,114,32,39,112,97,108,101,116,116,101,32,60,110,62,39,32,111,114,32,39,114,103,98,102,111,114,109,117,108,97,101,39,32,111,114,32,39,99,111,108,111,114,110,97,109,101,115,39,0,0,101,120,112,101,99,116,105,110,103,32,39,99,97,114,116,101,115,105,97,110,39,44,32,39,115,112,104,101,114,105,99,97,108,39,44,32,111,114,32,39,99,121,108,105,110,100,114,105,99,97,108,39,0,0,0,0,115,101,116,32,114,109,97,114,103,105,110,32,37,115,32,37,103,10,0,0,0,0,0,0,122,116,105,99,36,108,97,98,101,108,115,0,0,0,0,0,37,115,10,10,0,0,0,0,92,115,116,111,112,71,78,85,80,76,79,84,112,97,103,101,10,0,0,0,0,0,0,0,117,36,115,101,114,0,0,0,102,105,116,50,114,103,98,36,102,111,114,109,117,108,97,101,0,0,0,0,0,0,0,0,99,121,36,108,105,110,100,114,105,99,97,108,0,0,0,0,115,101,116,32,98,109,97,114,103,105,110,32,37,115,32,37,103,10,0,0,0,0,0,0,121,50,116,105,99,36,108,97,98,101,108,115,0,0,0,0,9,103,110,117,112,108,111,116,32,76,67,95,78,85,77,69,82,73,67,32,37,115,10,0,37,46,49,50,48,115,0,0,116,36,119,111,0,0,0,0,115,101,116,98,111,117,110,100,115,32,99,117,114,114,101,110,116,112,105,99,116,117,114,101,32,116,111,32,117,110,105,116,115,113,117,97,114,101,32,120,121,115,99,97,108,101,100,32,40,119,44,104,41,59,10,0,104,36,111,114,105,122,111,110,116,97,108,0,0,0,0,0,99,111,108,111,114,36,110,97,109,101,115,0,0,0,0,0,115,36,112,104,101,114,105,99,97,108,0,0,0,0,0,0,97,116,32,115,99,114,101,101,110,0,0,0,0,0,0,0,121,95,109,105,110,51,100,32,115,104,111,117,108,100,32,110,111,116,32,101,113,117,97,108,32,121,95,109,97,120,51,100,33,0,0,0,0,0,0,0,121,116,105,99,36,108,97,98,101,108,115,0,0,0,0,0,109,111,100,0,0,0,0,0,100,101,115,116,32,61,61,32,78,85,76,76,32,124,124,32,100,101,115,116,32,33,61,32,111,117,116,115,116,114,0,0,10,35,32,73,115,111,67,117,114,118,101,32,37,100,44,32,37,100,32,112,111,105,110,116,115,10,35,32,120,32,121,32,122,0,0,0,0,0,0,0,118,36,101,114,116,105,99,97,108,0,0,0,0,0,0,0,115,104,101,36,108,108,0,0,99,97,36,114,116,101,115,105,97,110,0,0,0,0,0,0,37,115,9,37,102,10,0,0,115,101,116,32,108,109,97,114,103,105,110,32,37,115,32,37,103,10,0,0,0,0,0,0,120,50,116,105,99,36,108,97,98,101,108,115,0,0,0,0,67,111,109,112,105,108,101,32,111,112,116,105,111,110,115,58,10,37,115,10,0,0,0,0,37,46,52,103,0,0,0,0,114,122,116,0,0,0,0,0,116,105,109,101,0,0,0,0,114,103,98,102,111,114,36,109,117,108,97,101,0,0,0,0,101,120,112,101,99,116,105,110,103,32,39,115,99,114,101,101,110,32,60,102,114,97,99,116,105,111,110,62,39,0,0,0,115,101,116,32,122,101,114,111,32,37,103,10,0,0,0,0,120,116,105,99,36,108,97,98,101,108,115,0,0,0,0,0,32,108,105,110,101,115,116,121,108,101,32,37,100,0,0,0,120,32,114,97,110,103,101,0,99,111,108,117,109,110,104,101,97,100,0,0,0,0,0,0,114,99,102,105,108,101,0,0,101,113,0,0,0,0,0,0,41,59,112,111,115,105,116,105,111,110,115,40,0,0,0,0,116,101,114,109,36,105,110,97,108,0,0,0,0,0,0,0,69,110,100,0,0,0,0,0,103,114,97,36,100,105,101,110,116,0,0,0,0,0,0,0,115,99,36,114,101,101,110,0,102,95,115,112,114,105,110,116,102,58,32,97,116,116,101,109,112,116,32,116,111,32,112,114,105,110,116,32,110,117,109,101,114,105,99,32,118,97,108,117,101,32,119,105,116,104,32,115,116,114,105,110,103,32,102,111,114,109,97,116,0,0,0,0,83,105,103,110,101,100,83,104,111,114,116,0,0,0,0,0,40,37,46,51,103,44,37,46,51,103,44,37,46,51,103,41,0,0,0,0,0,0,0,0,110,111,111,112,97,113,117,101,0,0,0,0,0,0,0,0,101,120,116,114,97,32,99,104,97,114,115,32,97,102,116,101,114,32,60,115,101,112,97,114,97,116,105,111,110,95,99,104,97,114,62,0,0,0,0,0,107,101,121,32,101,110,116,114,121,0,0,0,0,0,0,0,10,37,72,58,37,77,0,0,99,111,108,111,114,115,40,0,111,112,97,113,117,101,0,0,9,103,97,109,109,97,32,105,115,32,37,46,52,103,10,0,39,92,116,39,0,0,0,0,104,105,115,116,101,112,115,32,118,97,108,105,100,32,112,111,105,110,116,32,109,97,112,112,105,110,103,0,0,0,0,0,116,101,109,112,32,115,116,114,105,110,103,32,102,111,114,32,108,97,98,101,108,32,104,97,99,107,0,0,0,0,0,0,99,111,108,111,114,95,109,111,100,101,40,103,114,97,100,105,101,110,116,41,59,0,0,0,109,97,120,114,111,119,36,115,0,0,0,0,0,0,0,0,37,115,58,37,100,32,111,111,111,112,115,58,32,85,110,107,110,111,119,110,32,99,111,108,111,114,32,109,111,100,101,32,39,37,99,39,46,10,0,0,34,92,116,34,0,0,0,0,105,110,116,101,114,110,97,108,32,101,114,114,111,114,58,32,99,111,108,117,109,110,32,60,61,32,48,32,105,110,32,100,97,116,97,102,105,108,101,46,99,0,0,0,0,0,0,0,50,32,109,117,108,32,49,32,115,117,98,32,100,117,112,32,109,117,108,0,0,0,0,0,99,111,108,111,114,95,109,111,100,101,40,102,117,110,99,116,105,111,110,115,41,0,0,0,109,97,120,99,111,108,117,36,109,110,115,0,0,0,0,0,88,89,90,10,0,0,0,0,101,120,112,101,99,116,101,100,32,34,60,115,101,112,97,114,97,116,111,114,95,99,104,97,114,62,34,0,0,0,0,0,115,101,116,32,116,105,109,101,115,116,97,109,112,32,37,115,32,10,0,0,0,0,0,0,37,49,54,46,51,102,0,0,99,111,108,111,114,95,109,111,100,101,40,114,103,98,41,59,102,111,114,109,117,108,97,101,40,37,100,44,37,100,44,37,100,41,0,0,0,0,0,0,109,97,120,99,111,108,36,115,0,0,0,0,0,0,0,0,89,73,81,10,0,0,0,0,119,104,105,116,101,36,115,112,97,99,101,0,0,0,0,0,32,114,111,116,97,116,101,32,112,97,114,97,108,108,101,108,0,0,0,0,0,0,0,0,116,105,109,101,115,116,114,105,110,103,0,0,0,0,0,0,10,10,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,10,0,0,0,0,0,0,99,111,108,111,114,95,109,111,100,101,40,103,114,97,121,41,0,0,0,0,0,0,0,0,116,101,120,116,36,99,111,108,111,114,0,0,0,0,0,0,84,105,99,32,108,97,98,101,108,32,100,111,101,115,32,110,111,116,32,101,118,97,108,117,97,116,101,32,97,115,32,115,116,114,105,110,103,33,10,0,67,77,89,10,0,0,0,0,101,120,112,101,99,116,101,100,32,115,116,114,105,110,103,32,119,105,116,104,32,99,111,109,109,101,110,116,115,32,99,104,97,114,115,0,0,0,0,0,10,115,101,116,32,37,115,37,115,32,0,0,0,0,0,0,9,103,110,117,112,108,111,116,32,76,67,95,84,73,77,69,32,32,32,32,37,115,10,0,117,116,105,108,46,99,0,0,111,36,110,101,0,0,0,0,103,112,95,109,97,107,101,95,112,97,108,101,116,116,101,40,0,0,0,0,0,0,0,0,116,99,0,0,0,0,0,0,72,83,86,10,0,0,0,0,109,97,120,95,108,105,110,101,95,108,101,110,0,0,0,0,100,105,118,0,0,0,0,0,84,97,98,117,108,97,114,32,111,117,116,112,117,116,32,111,102,32,116,104,105,115,32,51,68,32,112,108,111,116,32,115,116,121,108,101,32,110,111,116,32,105,109,112,108,101,109,101,110,116,101,100,10,0,0,0,70,97,116,97,108,58,32,117,110,100,101,102,105,110,101,100,32,99,111,108,111,114,32,102,111,114,109,117,108,97,32,40,99,97,110,32,98,101,32,48,45,45,37,105,41,10,0,0,37,37,32,102,111,114,32,97,100,100,105,116,105,111,110,97,108,32,117,115,101,114,45,100,101,102,105,110,101,100,32,115,101,116,116,105,110,103,115,10,103,112,95,115,101,116,117,112,95,97,102,116,101,114,59,10,0,0,0,0,0,0,0,0,115,101,36,116,0,0,0,0,82,71,66,10,0,0,0,0,101,120,112,101,99,116,101,100,32,109,105,115,115,105,110,103,45,118,97,108,117,101,32,115,116,114,105,110,103,0,0,0,95,121,0,0,0,0,0,0,115,101,116,32,37,115,37,115,32,34,37,115,34,32,0,0,108,36,111,110,103,0,0,0,103,112,95,115,101,116,95,108,105,110,101,119,105,100,116,104,40,37,103,41,59,10,0,0,122,116,114,0,0,0,0,0,110,111,116,105,36,116,108,101]) -.concat([0,0,0,0,0,0,0,0,9,67,111,108,111,114,45,77,111,100,101,108,58,32,0,0,119,114,111,110,103,32,111,112,116,105,111,110,0,0,0,0,115,101,116,32,109,37,115,116,105,99,115,32,37,102,10,0,37,103,32,37,103,0,0,0,32,108,116,32,37,100,0,0,121,32,114,97,110,103,101,32,105,115,32,105,110,118,97,108,105,100,0,0,0,0,0,0,33,61,0,0,0,0,0,0,37,37,32,108,105,110,101,119,105,100,116,104,32,115,99,97,108,105,110,103,32,102,97,99,116,111,114,32,102,111,114,32,105,110,100,105,118,105,100,117,97,108,32,108,105,110,101,115,10,0,0,0,0,0,0,0,80,97,103,101,68,111,119,110,0,0,0,0,0,0,0,0,32,99,111,108,111,114,32,112,111,115,105,116,105,111,110,115,32,102,111,114,32,100,105,115,99,114,101,116,101,32,112,97,108,101,116,116,101,32,116,101,114,109,105,110,97,108,115,10,0,0,0,0,0,0,0,0,114,117,108,101,114,32,97,116,0,0,0,0,0,0,0,0,115,101,116,32,109,37,115,116,105,99,115,32,100,101,102,97,117,108,116,10,0,0,0,0,117,110,114,101,99,111,103,110,105,122,101,100,32,112,108,111,116,32,116,121,112,101,0,0,37,37,0,0,0,0,0,0,85,110,115,105,103,110,101,100,83,104,111,114,116,0,0,0,103,112,95,115,101,116,95,112,111,105,110,116,115,105,122,101,40,37,103,41,59,10,0,0,110,111,97,36,117,116,111,116,105,116,108,101,115,0,0,0,65,76,76,32,114,101,109,97,105,110,105,110,103,0,0,0,101,120,112,101,99,116,105,110,103,32,114,117,108,101,114,32,99,111,111,114,100,105,110,97,116,101,115,0,0,0,0,0,115,101,116,32,109,37,115,116,105,99,115,10,0,0,0,0,37,100,47,37,109,0,0,0,83,105,103,110,101,100,66,121,116,101,0,0,0,0,0,0,112,118,101,114,116,32,62,61,32,48,0,0,0,0,0,0,37,37,32,112,111,105,110,116,115,105,122,101,32,115,99,97,108,105,110,103,32,102,97,99,116,111,114,10,0,0,0,0,97,36,117,116,111,116,105,116,108,101,115,0,0,0,0,0,77,65,88,32,37,105,0,0,114,117,36,108,101,114,0,0,115,101,116,32,110,111,109,37,115,116,105,99,115,10,0,0,103,112,95,115,99,97,108,101,95,116,101,120,116,32,58,61,32,37,103,59,10,0,0,0,104,36,101,105,103,104,116,0,9,97,108,108,111,99,97,116,105,110,103,32,0,0,0,0,110,111,114,117,36,108,101,114,0,0,0,0,0,0,0,0,115,101,116,32,116,105,99,115,108,101,118,101,108,32,37,103,10,0,0,0,0,0,0,0,124,120,45,48,46,53,124,0,37,37,32,116,101,120,116,32,115,99,97,108,105,110,103,32,102,97,99,116,111,114,32,102,111,114,32,116,104,101,32,119,104,111,108,101,32,102,105,103,117,114,101,10,0,0,0,0,119,36,105,100,116,104,0,0,32,78,79,84,0,0,0,0,115,104,111,117,108,100,32,98,101,58,32,37,100,32,60,61,32,109,111,117,115,101,102,111,114,109,97,116,32,60,61,32,37,100,10,0,0,0,0,0,115,101,116,32,120,121,112,108,97,110,101,32,97,116,32,37,103,10,0,0,0,0,0,0,37,37,32,102,111,114,32,97,100,100,105,116,105,111,110,97,108,32,117,115,101,114,45,100,101,102,105,110,101,100,32,115,101,116,116,105,110,103,115,10,103,112,95,115,101,116,117,112,95,98,101,102,111,114,101,59,10,0,0,0,0,0,0,0,115,112,36,97,99,105,110,103,0,0,0,0,0,0,0,0,9,97,108,108,32,99,111,108,111,114,32,102,111,114,109,117,108,97,101,32,65,82,69,37,115,32,119,114,105,116,116,101,110,32,105,110,116,111,32,111,117,116,112,117,116,32,112,111,115,116,115,99,114,105,112,116,32,102,105,108,101,10,0,0,112,108,101,97,115,101,32,39,115,101,116,32,109,111,117,115,101,32,109,111,117,115,101,102,111,114,109,97,116,32,60,102,109,116,62,39,32,102,105,114,115,116,46,10,0,0,0,0,102,117,110,99,116,105,111,110,0,0,0,0,0,0,0,0,44,32,116,97,110,103,101,110,116,61,37,115,41,0,0,0,99,111,117,108,100,32,110,111,116,32,111,112,101,110,32,108,111,103,45,102,105,108,101,32,37,115,0,0,0,0,0,0,37,37,32,68,105,102,102,101,114,101,110,116,32,105,110,105,116,105,97,108,105,115,97,116,105,111,110,115,10,0,0,0,115,97,36,109,112,108,101,110,0,0,0,0,0,0,0,0,78,69,71,65,84,73,86,69,0,0,0,0,0,0,0,0,109,111,36,117,115,101,102,111,114,109,97,116,0,0,0,0,115,101,116,32,115,116,121,108,101,32,102,117,110,99,116,105,111,110,32,0,0,0,0,0,44,32,37,32,35,46,52,103,100,101,103,41,0,0,0,0,80,115,101,117,100,111,100,97,116,97,32,110,111,116,32,121,101,116,32,105,109,112,108,101,109,101,110,116,101,100,32,102,111,114,32,112,111,108,97,114,32,111,114,32,112,97,114,97,109,101,116,114,105,99,32,103,114,97,112,104,115,0,0,0,9,103,110,117,112,108,111,116,32,101,110,99,111,100,105,110,103,32,32,32,37,115,10,0,108,105,110,101,32,37,100,58,32,0,0,0,0,0,0,0,112,36,111,105,110,116,115,0,37,37,32,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,10,0,0,0,110,111,98,36,111,120,0,0,105,110,112,117,116,32,100,97,116,97,32,40,39,101,39,32,101,110,100,115,41,32,62,32,0,0,0,0,0,0,0,0,80,79,83,73,84,73,86,69,0,0,0,0,0,0,0,0,115,104,111,117,108,100,32,98,101,58,32,37,100,32,60,61,32,99,108,105,112,98,111,97,114,100,102,111,114,109,97,116,32,60,61,32,37,100,10,0,115,101,116,32,115,116,121,108,101,32,100,97,116,97,32,0,104,101,97,100,115,0,0,0,109,117,108,116,0,0,0,0,10,35,32,83,117,114,102,97,99,101,32,37,100,32,111,102,32,37,100,32,115,117,114,102,97,99,101,115,10,0,0,0,37,37,32,116,101,109,112,111,114,97,114,121,32,118,97,114,105,97,98,108,101,32,102,111,114,32,115,116,111,114,105,110,103,32,116,104,101,32,112,97,116,104,10,115,97,118,101,32,112,59,32,112,97,116,104,32,112,59,10,0,0,0,0,0,98,36,111,120,0,0,0,0,115,99,114,36,101,101,110,100,117,109,112,0,0,0,0,0,9,102,105,103,117,114,101,32,105,115,32,37,115,10,0,0,95,120,0,0,0,0,0,0,115,101,116,32,99,110,116,114,112,97,114,97,109,32,112,111,105,110,116,115,32,37,100,10,115,101,116,32,115,105,122,101,32,114,97,116,105,111,32,37,103,32,37,103,44,37,103,10,115,101,116,32,111,114,105,103,105,110,32,37,103,44,37,103,10,0,0,0,0,0,0,0,93,32,32,100,105,115,116,97,110,99,101,58,32,0,0,0,109,97,116,114,105,120,32,99,111,110,116,97,105,110,115,32,109,105,115,115,105,110,103,32,111,114,32,117,110,100,101,102,105,110,101,100,32,118,97,108,117,101,115,0,0,0,0,0,71,32,78,32,85,32,80,32,76,32,79,32,84,0,0,0,37,37,32,116,101,109,112,111,114,97,114,121,32,118,97,114,105,97,98,108,101,32,102,111,114,32,115,116,111,114,105,110,103,32,116,104,101,32,112,97,116,104,32,97,110,100,32,105,109,97,103,101,115,10,115,97,118,101,32,112,44,32,105,109,103,44,32,105,109,97,59,32,112,97,116,104,32,112,59,32,115,116,114,105,110,103,32,105,109,103,44,32,105,109,97,59,10,0,0,0,0,0,0,0,116,114,122,0,0,0,0,0,115,104,111,119,46,99,0,0,39,102,111,110,116,110,97,109,101,44,102,111,110,116,115,105,122,101,39,32,101,120,112,101,99,116,101,100,0,0,0,0,99,108,36,105,112,98,111,97,114,100,102,111,114,109,97,116,0,0,0,0,0,0,0,0,100,121,50,61,0,0,0,0,100,102,95,109,97,116,114,105,120,0,0,0,0,0,0,0,32,116,101,120,116,99,111,108,111,114,0,0,0,0,0,0,120,32,114,97,110,103,101,32,105,115,32,105,110,118,97,108,105,100,0,0,0,0,0,0,80,105,112,101,115,32,97,110,100,32,115,104,101,108,108,32,99,111,109,109,97,110,100,115,32,110,111,116,32,112,101,114,109,105,116,116,101,100,32,100,117,114,105,110,103,32,105,110,105,116,105,97,108,105,122,97,116,105,111,110,0,0,0,0,61,61,0,0,0,0,0,0,67,97,110,110,111,116,32,115,101,116,32,105,110,116,101,114,110,97,108,32,118,97,114,105,97,98,108,101,115,32,71,80,86,65,76,95,32,97,110,100,32,77,79,85,83,69,95,0,99,109,0,0,0,0,0,0,80,97,103,101,85,112,0,0,37,115,58,37,100,32,111,111,112,115,58,32,85,110,107,110,111,119,110,32,99,111,108,111,114,32,109,111,100,101,32,39,37,99,39,46,10,0,0,0,100,105,115,99,114,101,116,101,32,37,103,0,0,0,0,0,78,111,32,116,101,114,109,105,110,97,108,32,104,97,115,32,98,101,101,110,32,112,117,115,104,101,100,32,121,101,116,10,0,0,0,0,0,0,0,0,100,120,50,61,0,0,0,0,77,97,116,114,105,120,32,100,111,101,115,32,110,111,116,32,114,101,112,114,101,115,101,110,116,32,97,32,103,114,105,100,0,0,0,0,0,0,0,0,105,110,0,0,0,0,0,0,110,111,105,110,118,36,101,114,116,0,0,0,0,0,0,0,9,67,117,98,101,104,101,108,105,120,32,99,111,108,111,114,32,112,97,108,101,116,116,101,58,32,115,116,97,114,116,32,37,103,32,99,121,99,108,101,115,32,37,103,32,115,97,116,117,114,97,116,105,111,110,32,37,103,10,0,0,0,0,0,110,111,122,111,111,109,106,117,36,109,112,0,0,0,0,0,105,110,99,114,101,109,101,110,116,97,108,32,37,103,44,37,103,44,37,103,10,0,0,0,70,105,108,101,32,100,111,101,115,110,39,116,32,102,97,99,116,111,114,105,122,101,32,105,110,116,111,32,102,117,108,108,32,109,97,116,114,105,120,0,37,109,47,37,100,0,0,0,85,110,115,105,103,110,101,100,66,121,116,101,0,0,0,0,37,37,32,115,99,97,108,105,110,103,32,102,97,99,116,111,114,44,32,119,105,100,116,104,32,97,110,100,32,104,101,105,103,104,116,32,111,102,32,116,104,101,32,102,105,103,117,114,101,10,97,32,58,61,32,49,99,109,59,32,119,32,58,61,32,37,46,51,102,97,59,32,104,32,58,61,32,37,46,51,102,97,59,32,37,37,32,40,37,103,37,115,44,32,37,103,37,115,41,10,0,0,0,0,105,110,118,36,101,114,116,0,9,32,32,67,45,102,111,114,109,117,108,97,58,32,37,115,10,0,0,0,0,0,0,0,122,111,111,109,106,117,36,109,112,0,0,0,0,0,0,0,97,117,116,111,32,37,100,10,0,0,0,0,0,0,0,0,82,101,97,100,32,103,114,105,100,32,119,105,100,116,104,32,116,111,111,32,108,97,114,103,101,0,0,0,0,0,0,0,115,116,114,105,110,103,32,116,101,114,109,118,101,114,115,105,111,110,59,32,32,32,32,116,101,114,109,118,101,114,115,105,111,110,32,32,32,32,58,61,32,34,37,115,34,59,10,0,110,111,114,101,118,36,101,114,115,101,0,0,0,0,0,0,9,32,32,66,45,102,111,114,109,117,108,97,58,32,37,115,10,0,0,0,0,0,0,0,110,111,118,101,36,114,98,111,115,101,0,0,0,0,0,0,115,101,116,32,99,110,116,114,112,97,114,97,109,32,108,101,118,101,108,115,32,0,0,0,82,101,97,100,32,103,114,105,100,32,111,102,32,122,101,114,111,32,119,105,100,116,104,0,48,46,53,32,115,117,98,32,97,98,115,0,0,0,0,0,115,116,114,105,110,103,32,103,110,117,112,108,111,116,118,101,114,115,105,111,110,59,32,103,110,117,112,108,111,116,118,101,114,115,105,111,110,32,58,61,32,34,37,115,34,59,10,0,114,101,118,36,101,114,115,101,0,0,0,0,0,0,0,0,9,32,32,65,45,102,111,114,109,117,108,97,58,32,37,115,10,0,0,0,0,0,0,0,118,101,36,114,98,111,115,101,0,0,0,0,0,0,0,0,98,115,112,108,105,110,101,10,0,0,0,0,0,0,0,0,67,97,110,39,116,32,114,101,97,100,32,115,101,99,111,110,100,32,100,105,109,101,110,115,105,111,110,32,105,110,32,100,97,116,97,32,102,105,108,101,32,34,37,115,34,0,0,0,66,82,69,65,75,58,32,37,115,0,0,0,0,0,0,0,92,115,116,97,114,116,71,78,85,80,76,79,84,103,114,97,112,104,105,99,91,37,100,93,10,0,0,0,0,0,0,0,82,36,105,103,104,116,0,0,9,99,111,108,111,114,32,109,97,112,112,105,110,103,32,105,115,32,100,111,110,101,32,98,121,32,117,115,101,114,32,100,101,102,105,110,101,100,32,102,117,110,99,116,105,111,110,115,10,0,0,0,0,0,0,0,110,111,108,97,36,98,101,108,115,0,0,0,0,0,0,0,99,117,98,105,99,115,112,108,105,110,101,10,0,0,0,0,121,61,0,0,0,0,0,0,67,97,110,39,116,32,114,101,97,100,32,102,105,114,115,116,32,100,105,109,101,110,115,105,111,110,32,105,110,32,100,97,116,97,32,102,105,108,101,32,34,37,115,34,0,0,0,0,92,115,116,97,114,116,71,78,85,80,76,79,84,112,97,103,101,32,37,37,32,71,114,97,112,104,105,99,32,78,114,46,32,37,100,10,0,0,0,0,76,36,101,102,116,0,0,0,9,99,111,108,111,114,32,109,97,112,112,105,110,103,32,98,121,32,100,101,102,105,110,101,100,32,103,114,97,100,105,101,110,116,10,0,0,0,0,0,108,97,98,101,108,36,115,0,108,105,110,101,97,114,10,0,120,61,0,0,0,0,0,0,67,97,110,39,116,32,111,112,101,110,32,100,97,116,97,32,102,105,108,101,32,34,37,115,34,0,0,0,0,0,0,0,9,103,110,117,112,108,111,116,32,76,67,95,67,84,89,80,69,32,32,32,37,115,10,0,34,37,115,34,44,32,108,105,110,101,32,37,100,58,32,0,112,32,58,61,32,40,37,46,51,102,97,44,37,46,51,102,97,41,0,0,0,0,0,0,114,109,36,97,114,103,105,110,0,0,0,0,0,0,0,0,9,114,103,98,32,99,111,108,111,114,32,109,97,112,112,105,110,103,32,98,121,32,114,103,98,102,111,114,109,117,108,97,101,32,97,114,101,32,37,105,44,37,105,44,37,105,10,0,110,111,112,111,36,108,97,114,100,105,115,116,97,110,99,101,0,0,0,0,0,0,0,0,115,101,116,32,99,110,116,114,112,97,114,97,109,32,0,0,32,32,32,115,99,97,108,101,58,32,0,0,0,0,0,0,84,111,111,32,109,97,110,121,32,99,111,108,117,109,110,115,32,105,110,32,117,115,105,110,103,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,97,110,100,32,105,109,112,108,105,101,100,32,115,97,109,112,108,105,110,103,32,97,114,114,97,121,0,0,0,0,0,0,98,97,99,107,104,101,97,100,0,0,0,0,0,0,0,0,109,105,110,117,115,0,0,0,112,114,105,110,116,95,51,100,116,97,98,108,101,32,111,117,116,112,117,116,32,98,117,102,102,101,114,0,0,0,0,0,103,112,95,115,101,116,95,108,105,110,101,116,121,112,101,40,37,100,41,59,10,0,0,0,108,109,36,97,114,103,105,110,0,0,0,0,0,0,0,0,115,97,36,118,101,0,0,0,67,79,76,79,82,0,0,0,112,111,108,97,114,100,105,115,116,97,110,99,101,116,36,97,110,0,0,0,0,0,0,0,115,101,116,32,99,110,116,114,112,97,114,97,109,32,111,114,100,101,114,32,37,100,10,0,118,105,101,119,58,32,0,0,80,108,111,116,32,115,116,121,108,101,32,114,101,113,117,105,114,101,115,32,104,105,103,104,101,114,32,116,104,97,110,32,111,110,101,45,100,105,109,101,110,115,105,111,110,97,108,32,115,97,109,112,108,105,110,103,32,97,114,114,97,121,0,0,37,115,9,102,97,113,44,32,98,117,103,115,44,32,101,116,99,58,32,32,32,116,121,112,101,32,34,104,101,108,112,32,70,65,81,34,10,37,115,9,105,109,109,101,100,105,97,116,101,32,104,101,108,112,58,32,32,32,116,121,112,101,32,34,104,101,108,112,34,32,32,40,112,108,111,116,32,119,105,110,100,111,119,58,32,104,105,116,32,39,104,39,41,10,0,0,123,37,115,125,41,59,10,0,122,121,120,0,0,0,0,0,98,109,36,97,114,103,105,110,0,0,0,0,0,0,0,0,71,82,65,89,0,0,0,0,112,111,36,108,97,114,100,105,115,116,97,110,99,101,100,101,103,0,0,0,0,0,0,0,115,101,116,32,100,97,116,97,102,105,108,101,32,110,111,102,112,101,95,116,114,97,112,10,0,0,0,0,0,0,0,0,122,111,111,109,105,110,103,32,99,97,110,99,101,108,108,101,100,46,10,0,0,0,0,0,80,108,111,116,32,115,116,121,108,101,32,114,101,113,117,105,114,101,115,32,104,105,103,104,101,114,32,116,104,97,110,32,116,119,111,45,100,105,109,101,110,115,105,111,110,97,108,32,115,97,109,112,108,105,110,103,32,97,114,114,97,121,0,0,112,97,114,97,109,101,116,114,105,99,32,102,117,110,99,116,105,111,110,32,110,111,116,32,102,117,108,108,121,32,115,112,101,99,105,102,105,101,100,0,72,79,77,69,32,110,111,116,32,115,101,116,32,45,32,99,97,110,110,111,116,32,101,120,112,97,110,100,32,116,105,108,100,101,0,0,0,0,0,0,38,0,0,0,0,0,0,0,91,37,115,93,0,0,0,0,116,109,36,97,114,103,105,110,0,0,0,0,0,0,0,0,68,111,119,110,0,0,0,0,9,112,97,108,101,116,116,101,32,105,115,32,37,115,10,0,110,111,122,111,111,109,99,111,36,111,114,100,105,110,97,116,101,115,0,0,0,0,0,0,115,101,116,32,100,97,116,97,102,105,108,101,32,102,111,114,116,114,97,110,10,0,0,0,32,32,32,114,101,115,116,111,114,101,100,32,116,101,114,109,105,110,97,108,32,105,115,32,37,115,32,37,115,10,0,0,96,98,117,105,108,116,105,110,45,99,97,110,99,101,108,45,122,111,111,109,96,32,99,97,110,99,101,108,32,122,111,111,109,32,114,101,103,105,111,110,0,0,0,0,0,0,0,0,80,108,111,116,32,115,116,121,108,101,32,100,111,101,115,32,110,111,116,32,99,111,110,102,111,114,109,32,116,111,32,116,104,114,101,101,32,99,111,108,117,109,110,32,100,97,116,97,32,105,110,32,116,104,105,115,32,103,114,97,112,104,32,109,111,100,101,0,0,0,0,0,97,108,105,103,110,40,37,115,41,44,32,92,115,111,109,101,116,120,116,91,103,112,93,0,111,36,117,116,115,105,100,101,0,0,0,0,0,0,0,0,72,79,82,73,90,79,78,84,65,76,0,0,0,0,0,0,122,111,111,109,99,111,36,111,114,100,105,110,97,116,101,115,0,0,0,0,0,0,0,0,115,101,116,32,100,97,116,97,102,105,108,101,32,99,111,109,109,101,110,116,115,99,104,97,114,115,32,39,37,115,39,10,0,0,0,0,0,0,0,0,77,79,85,83,69,95,75,69,89,95,87,73,78,68,79,87,0,0,0,0,0,0,0,0,110,111,95,99,111,108,115,32,60,61,32,77,65,88,68,65,84,65,67,79,76,83,0,0,104,105,100,100,101,110,32,116,104,101,115,101,95,101,100,103,101,115,0,0,0,0,0,0,72,105,103,104,66,121,116,101,70,105,114,115,116,0,0,0,97,110,103,108,101,40,37,100,41,44,32,0,0,0,0,0,105,110,115,36,105,100,101,0,86,69,82,84,73,67,65,76,0,0,0,0,0,0,0,0,110,111,100,111,36,117,98,108,101,99,108,105,99,107,0,0,71,80,86,65,76,95,86,73,69,87,95,90,83,67,65,76,69,0,0,0,0,0,0,0,101,108,108,105,112,115,101,32,112,108,111,116,0,0,0,0,67,97,110,110,111,116,32,103,101,110,101,114,97,116,101,32,99,111,111,114,100,115,32,102,111,114,32,116,104,97,116,32,112,108,111,116,32,115,116,121,108,101,0,0,0,0,0,0,103,112,95,112,117,116,95,116,101,120,116,40,40,37,46,51,102,97,44,32,37,46,51,102,97,41,44,32,0,0,0,0,98,101,36,108,111,119,0,0,9,99,111,108,111,114,32,103,114,97,100,105,101,110,116,32,105,115,32,37,115,32,105,110,32,116,104,101,32,99,111,108,111,114,32,98,111,120,10,0,100,111,36,117,98,108,101,99,108,105,99,107,0,0,0,0,115,101,116,32,100,97,116,97,102,105,108,101,32,115,101,112,97,114,97,116,111,114,32,119,104,105,116,101,115,112,97,99,101,10,0,0,0,0,0,0,71,80,86,65,76,95,86,73,69,87,95,83,67,65,76,69,0,0,0,0,0,0,0,0,77,97,116,114,105,120,32,100,97,116,97,32,99,111,110,116,97,105,110,115,32,111,110,108,121,32,116,104,114,101,101,32,99,111,108,117,109,110,115,0,71,78,85,80,76,79,84,95,76,73,66,0,0,0,0,0,99,111,115,40,57,48,120,41,0,0,0,0,0,0,0,0,103,112,95,112,111,105,110,116,40,37,46,51,102,97,44,37,46,51,102,97,44,37,100,41,59,10,0,0,0,0,0,0,117,36,110,100,101,114,0,0,65,114,103,104,33,0,0,0,103,114,36,97,112,104,0,0,115,101,116,32,100,97,116,97,102,105,108,101,32,115,101,112,97,114,97,116,111,114,32,34,37,99,34,10,0,0,0,0,37,108,102,0,0,0,0,0,97,98,36,111,118,101,0,0,44,0,0,0,0,0,0,0,10,9,32,32,32,32,32,32,32,32,32,32,115,105,122,101,58,32,0,0,0,0,0,0,115,101,116,32,100,97,116,97,102,105,108,101,32,109,105,115,115,105,110,103,32,39,37,115,39,10,0,0,0,0,0,0,78,111,32,100,101,102,97,117,108,116,32,99,111,108,117,109,110,115,32,107,110,111,119,110,32,102,111,114,32,116,104,97,116,32,112,108,111,116,32,115,116,121,108,101,0,0,0,0,76,97,109,98,100,97,32,115,99,97,108,105,110,103,32,102,97,99,116,111,114,115,32,114,101,115,101,116,58,32,32,37,103,10,0,0,0,0,0,0,85,110,114,101,99,111,103,110,105,122,101,100,32,111,112,116,105,111,110,46,32,32,83,101,101,32,39,104,101,108,112,32,117,110,115,101,116,39,46,0,66,97,100,32,116,105,109,101,32,102,111,114,109,97,116,32,105,110,32,115,116,114,105,110,103,0,0,0,0,0,0,0,44,37,103,112,116,0,0,0,111,118,36,101,114,0,0,0,97,116,32,85,83,69,82,32,111,114,105,103,105,110,58,32,0,0,0,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,107,101,121,119,111,114,100,32,39,97,112,112,101,110,100,39,0,0,0,0,0,0,116,117,112,108,101,32,115,121,110,116,97,120,32,101,114,114,111,114,0,0,0,0,0,0,37,98,0,0,0,0,0,0,94,10,0,0,0,0,0,0,121,120,0,0,0,0,0,0,103,112,95,115,101,116,95,112,111,105,110,116,115,105,122,101,40,37,46,51,102,41,59,10,0,0,0,0,0,0,0,0,104,111,114,36,105,122,111,110,116,97,108,0,0,0,0,0,97,116,32,68,69,70,65,85,76,84,32,112,111,115,105,116,105,111,110,10,0,0,0,0,97,112,112,101,110,100,0,0,69,120,112,101,99,116,105,110,103,32,39,44,39,32,111,114,32,39,41,39,0,0,0,0,104,101,97,100,0,0,0,0,112,108,117,115,0,0,0,0,32,37,99,10,0,0,0,0,112,32,58,61,32,117,110,105,116,115,113,117,97,114,101,32,120,121,115,99,97,108,101,100,32,40,37,46,51,102,97,44,37,46,51,102,97,41,32,115,104,105,102,116,101,100,32,40,37,46,51,102,97,44,37,46,51,102,97,41,59,10,0,0,118,101,114,36,116,105,99,97,108,0,0,0,0,0,0,0,114,101,115,36,101,116,0,0,78,79,84,32,100,114,97,119,110,10,0,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,102,105,108,101,110,97,109,101,0,0,0,0,0,0,112,114,101,102,105,120,0,0,37,115,10,37,115,9,37,115,10,37,115,9,86,101,114,115,105,111,110,32,37,115,32,112,97,116,99,104,108,101,118,101,108,32,37,115,32,32,32,32,108,97,115,116,32,109,111,100,105,102,105,101,100,32,37,115,10,37,115,9,66,117,105,108,100,32,83,121,115,116,101,109,58,32,37,115,32,37,115,10,37,115,10,37,115,9,37,115,10,37,115,9,84,104,111,109,97,115,32,87,105,108,108,105,97,109,115,44,32,67,111,108,105,110,32,75,101,108,108,101,121,32,97,110,100,32,109,97,110,121,32,111,116,104,101,114,115,10,37,115,10,37,115,9,103,110,117,112,108,111,116,32,104,111,109,101,58,32,32,32,32,32,104,116,116,112,58,47,47,119,119,119,46,103,110,117,112,108,111,116,46,105,110,102,111,10,0,0,0,0,0,0,103,112,95,115,101,116,95,108,105,110,101,119,105,100,116,104,40,37,46,51,102,41,59,10,0,0,0,0,0,0,0,0,120,122,121,0,0,0,0,0,99,36,101,110,116,101,114,0,100,114,97,119,110,32,98,97,99,107,10,9,0,0,0,0,110,111,114,111,116,36,97,116,101,0,0,0,0,0,0,0,10,9,100,117,109,109,121,32,118,97,114,105,97,98,108,101,32,105,115,32,116,32,102,111,114,32,99,117,114,118,101,115,44,32,117,47,118,32,102,111,114,32,115,117,114,102,97,99,101,115,10,0,0,0,0,0,115,101,116,32,109,97,112,112,105,110,103,32,0,0,0,0,98,111,114,100,101,114,0,0,116,104,105,115,95,112,108,111,116,32,33,61,32,78,85,76,76,0,0,0,0,0,0,0,97,120,101,115,32,109,117,115,116,32,98,101,32,120,49,121,49,44,32,120,49,121,50,44,32,120,50,121,49,32,111,114,32,120,50,121,50,0,0,0,116,105,108,100,101,32,101,120,112,97,110,115,105,111,110,0,94,0,0,0,0,0,0,0,99,111,110,116,101,120,116,46,116,114,109,32,115,101,116,95,99,111,108,111,114,32,117,110,107,110,111,119,110,32,99,111,108,111,114,115,112,101,99,45,62,116,121,112,101,32,37,105,0,0,0,0,0,0,0,0,114,36,105,103,104,116,0,0,100,114,97,119,110,32,102,114,111,110,116,10,9,0,0,0,115,101,116,32,109,97,99,114,111,115,10,0,0,0,0,0,115,101,116,32,116,101,114,109,32,37,115,32,37,115,0,0,102,95,115,112,114,105,110,116,102,0,0,0,0,0,0,0,77,111,114,101,32,116,104,97,110,32,37,100,32,101,108,101,109,101,110,116,115,0,0,0,37,37,103,112,95,115,101,116,95,99,111,108,111,114,40,102,114,97,99,40,37,46,52,102,41,41,59,10,0,0,0,0,108,36,101,102,116,0,0,0,9,99,111,108,111,114,32,98,111,120,32,119,105,116,104,111,117,116,32,98,111,114,100,101,114,32,105,115,32,0,0,0,69,120,112,101,99,116,101,100,32,99,111,109,109,97,46,0,117,110,115,101,116,32,99,108,97,98,101,108,10,0,0,0,104,105,100,100,101,110,32,110,111,114,116,104,95,101,100,103,101,115,0,0,0,0,0,0,76,111,119,66,121,116,101,70,105,114,115,116,0,0,0,0,103,112,95,115,101,116,95,99,111,108,111,114,40,114,103,98,40,37,51,46,50,102,44,37,51,46,50,102,44,37,51,46,50,102,41,41,59,10,0,0,98,36,111,116,116,111,109,0,68,69,70,65,85,76,84,32,108,105,110,101,32,116,121,112,101,32,105,115,32,0,0,0,86,97,108,117,101,32,111,117,116,32,111,102,32,114,97,110,103,101,32,91,48,44,49,93,46,0,0,0,0,0,0,0,115,101,116,32,99,108,97,98,101,108,32,39,37,115,39,10,0,0,0,0,0,0,0,0,105,115,111,95,56,56,53,57,95,50,0,0,0,0,0,0,104,105,115,116,111,103,114,97,109,0,0,0,0,0,0,0,73,110,118,97,108,105,100,32,110,117,109,101,114,105,99,32,111,114,32,116,117,112,108,101,32,102,111,114,109,0,0,0,10,35,32,67,117,114,118,101,32,116,105,116,108,101,58,32,34,37,115,34,0,0,0,0,103,112,95,115,101,116,95,99,111,108,111,114,40,108,116,40,37,100,41,41,59,10,0,0,116,36,111,112,0,0,0,0,108,105,110,101,32,116,121,112,101,32,37,100,32,105,115,32,0,0,0,0,0,0,0,0,85,110,107,110,111,119,110,32,99,111,108,111,114,32,110,97,109,101,46,0,0,0,0,0,32,98,111,116,104,10,0,0,73,110,116,101,114,110,97,108,32,101,114,114,111,114,58,32,73,110,118,97,108,105,100,32,99,111,109,109,97,32,115,101,112,97,114,97,116,101,100,32,116,121,112,101,0,0,0,0,57,48,32,109,117,108,32,99,111,115,0,0,0,0,0,0,45,45,40,37,46,51,102,97,44,37,46,51,102,97,41,59,10,103,112,95,100,114,97,119,40,112,41,59,10,0,0,0,111,102,102,0,0,0,0,0,9,99,111,108,111,114,32,98,111,120,32,119,105,116,104,32,98,111,114,100,101,114,44,32,0,0,0,0,0,0,0,0,85,110,107,110,111,119,110,32,99,111,108,111,114,32,115,112,101,99,105,102,105,101,114,46,32,85,115,101,32,39,35,114,114,103,103,98,98,39,46,0,32,115,117,114,102,97,99,101,10,0,0,0,0,0,0,0,80,101,114,112,101,110,100,105,99,117,108,97,114,32,118,101,99,116,111,114,32,99,97,110,110,111,116,32,98,101,32,122,101,114,111,0,0,0,0,0,112,117,115,104,99,0,0,0,45,45,99,121,99,108,101,59,10,103,112,95,100,114,97,119,40,112,41,59,10,0,0,0,111,110,0,0,0,0,0,0,101,120,116,101,110,100,32,100,121,110,97,114,114,97,121,0,99,111,114,110,101,114,32,37,105,10,0,0,0,0,0,0,35,37,50,120,37,50,120,37,50,120,0,0,0,0,0,0,32,98,97,115,101,10,0,0,84,104,114,101,101,45,100,105,109,101,110,115,105,111,110,97,108,32,116,117,112,108,101,32,114,101,113,117,105,114,101,100,0,0,0,0,0,0,0,0,76,97,109,98,100,97,32,83,116,97,114,116,32,118,97,108,117,101,32,115,101,116,58,32,37,103,10,0,0,0,0,0,103,112,95,100,111,116,40,37,46,51,102,97,44,37,46,51,102,97,41,59,10,0,0,0,109,97,120,105,109,117,109,32,111,102,32,52,32,99,111,114,110,101,114,115,10,0,0,0,69,120,112,101,99,116,101,100,32,40,32,116,111,32,115,116,97,114,116,32,103,114,97,100,105,101,110,116,32,100,101,102,105,110,105,116,105,111,110,46,0,0,0,0,0,0,0,0,10,115,101,116,32,115,97,109,112,108,101,115,32,37,100,44,32,37,100,10,115,101,116,32,105,115,111,115,97,109,112,108,101,115,32,37,100,44,32,37,100,10,37,115,115,101,116,32,115,117,114,102,97,99,101,10,37,115,115,101,116,32,99,111,110,116,111,117,114,0,0,0,37,66,0,0,0,0,0,0,120,121,0,0,0,0,0,0,41,59,10,0,0,0,0,0,98,97,99,107,0,0,0,0,109,105,110,105,109,117,109,32,111,102,32,52,32,99,111,114,110,101,114,115,10,0,0,0,71,114,97,121,32,115,99,97,108,101,32,110,111,116,32,115,111,114,116,101,100,32,105,110,32,103,114,97,100,105,101,110,116,46,0,0,0,0,0,0,101,113,117,97,108,32,120,121,122,0,0,0,0,0,0,0,37,100,46,32,37,100,46,32,37,48,52,100,32,37,100,58,37,48,50,100,0,0,0,0,110,111,104,101,97,100,0,0,108,101,0,0,0,0,0,0,48,120,37,48,54,120,0,0,44,100,101,110,115,105,116,121,40,48,41,0,0,0,0,0,102,114,111,110,116,0,0,0,114,101,36,114,101,97,100,0,109,101,100,105,97,110,32,111,102,32,52,32,99,111,114,110,101,114,115,10,0,0,0,0,78,111,32,118,97,108,105,100,32,112,97,108,101,116,116,101,32,102,111,117,110,100,0,0,83,84,65,84,83,95,0,0,101,113,117,97,108,32,120,121,0,0,0,0,0,0,0,0,37,100,58,37,48,50,100,0,98,105,36,110,100,0,0,0,73,110,116,101,114,110,97,108,32,101,114,114,111,114,32,40,100,97,116,97,102,105,108,101,46,99,41,58,32,85,110,107,110,111,119,110,32,112,108,111,116,32,109,111,100,101,0,0,47,117,115,114,47,108,111,99,97,108,47,98,105,110,0,0,44,112,97,116,116,101,114,110,40,37,100,41,0,0,0,0,121,120,122,0,0,0,0,0,110,111,98,101,110,116,36,111,118,101,114,0,0,0,0,0,103,101,111,109,101,116,114,105,99,97,108,32,109,101,97,110,32,111,102,32,52,32,99,111,114,110,101,114,115,10,0,0,105,110,118,97,108,105,100,32,111,112,116,105,111,110,0,0,66,97,100,32,100,97,116,97,32,111,110,32,108,105,110,101,32,37,100,0,0,0,0,0,10,115,101,116,32,118,105,101,119,32,32,37,115,0,0,0,37,100,46,32,37,100,46,32,37,48,52,100,0,0,0,0,84,104,114,101,101,45,100,105,109,101,110,115,105,111,110,97,108,32,116,117,112,108,101,32,114,101,113,117,105,114,101,100,32,102,111,114,32,115,101,116,116,105,110,103,32,98,105,110,97,114,121,32,112,97,114,97,109,101,116,101,114,115,0,0,109,97,116,36,114,105,120,0,110,111,98,111,114,100,101,114,10,0,0,0,0,0,0,0,116,104,105,115,95,112,108,111,116,32,61,61,32,42,116,112,95,51,100,95,112,116,114,0,67,97,110,110,111,116,32,101,120,112,97,110,100,32,101,109,112,116,121,32,112,97,116,104,0,0,0,0,0,0,0,0,124,0,0,0,0,0,0,0,71,80,70,85,78,95,0,0,44,100,101,110,115,105,116,121,40,37,46,50,102,41,0,0,98,101,110,116,36,111,118,101,114,0,0,0,0,0,0,0,85,112,0,0,0,0,0,0,97,118,101,114,97,103,101,100,32,52,32,99,111,114,110,101,114,115,10,0,0,0,0,0,112,109,51,100,32,103,114,97,100,105,101,110,116,0,0,0,37,103,44,32,37,103,44,32,37,103,44,32,37,103,0,0,99,97,110,32,111,110,108,121,32,100,111,32,98,101,115,115,101,108,32,102,117,110,99,116,105,111,110,115,32,111,102,32,114,101,97,108,115,0,0,0,70,105,114,115,116,32,112,97,114,97,109,101,116,101,114,32,116,111,32,115,112,114,105,110,116,102,32,109,117,115,116,32,98,101,32,97,32,102,111,114,109,97,116,32,115,116,114,105,110,103,0,0,0,0,0,0,84,104,114,101,101,45,100,105,109,101,110,115,105,111,110,97,108,32,116,117,112,108,101,32,114,101,113,117,105,114,101,100,32,102,111,114,32,51,68,32,112,108,111,116,0,0,0,0,44,116,114,97,110,115,112,97,114,101,110,116,0,0,0,0,110,111,97,108,116,36,100,105,97,103,111,110,97,108,0,0,9,113,117,97,100,114,97,110,103,108,101,32,99,111,108,111,114,32,97,99,99,111,114,100,105,110,103,32,116,111,32,0,103,114,97,100,105,101,110,116,0,0,0,0,0,0,0,0,84,119,111,45,100,105,109,101,110,115,105,111,110,97,108,32,116,117,112,108,101,32,114,101,113,117,105,114,101,100,32,102,111,114,32,50,68,32,112,108,111,116,0,0,0,0,0,0,104,105,100,100,101,110,32,116,104,101,115,101,95,112,111,108,121,115,0,0,0,0,0,0,88,114,105,103,104,116,89,117,112,0,0,0,0,0,0,0,103,112,95,102,105,108,108,40,112,0,0,0,0,0,0,0,97,108,116,36,100,105,97,103,111,110,97,108,0,0,0,0,9,115,116,101,112,115,32,102,111,114,32,98,105,108,105,110,101,97,114,32,105,110,116,101,114,112,111,108,97,116,105,111,110,58,32,37,100,44,37,100,10,0,0,0,0,0,0,0,76,101,115,115,32,116,104,97,110,32,51,32,117,115,105,110,103,32,115,112,101,99,115,32,102,111,114,32,112,97,108,101,116,116,101,0,0,0,0,0,115,101,116,32,118,105,101,119,32,0,0,0,0,0,0,0,44,32,40,117,110,100,101,102,105,110,101,100,41,47,0,0,99,117,116,101,32,108,105,116,116,108,101,32,101,108,108,105,112,115,101,32,102,111,114,32,116,104,101,32,107,101,121,32,115,97,109,112,108,101,0,0,78,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,116,111,32,115,107,105,112,32,109,117,115,116,32,98,101,32,112,111,115,105,116,105,118,101,32,105,110,116,101,103,101,114,0,0,0,0,0,0,0,0,45,45,99,121,99,108,101,59,10,0,0,0,0,0,0,0,110,111,117,110,100,36,101,102,105,110,101,100,0,0,0,0,9,112,109,51,100,45,104,105,100,100,101,110,51,100,32,105,115,32,37,115,10,0,0,0,117,110,115,101,116,32,100,101,99,105,109,97,108,115,105,103,110,10,0,0,0,0,0,0,111,102,102,36,115,101,116,0,115,99,97,36,108,101,0,0,73,109,112,114,111,112,101,114,32,115,99,97,110,110,105,110,103,32,115,116,114,105,110,103,46,32,84,114,121,32,50,32,99,104,97,114,97,99,116,101,114,32,115,116,114,105,110,103,32,102,111,114,32,50,68,32,100,97,116,97,0,0,0,0,117,112,36,119,97,114,100,115,0,0,0,0,0,0,0,0,100,111,119,110,36,119,97,114,100,115,0,0,0,0,0,0,114,111,119,36,115,102,105,114,115,116,0,0,0,0,0,0,99,111,108,36,117,109,110,115,102,105,114,115,116,0,0,0,115,105,110,40,57,48,120,41,0,0,0,0,0,0,0,0,79,114,105,103,105,110,32,105,115,32,97,116,32,40,37,102,44,37,102,41,0,0,0,0,45,45,40,37,46,51,102,97,44,37,46,51,102,97,41,0,46,92,34,71,78,85,80,76,79,84,58,32,71,82,79,70,70,32,112,105,99,116,117,114,101,32,117,115,105,110,103,32,116,104,101,32,103,112,105,99,32,112,114,101,112,114,111,99,101,115,115,111,114,10,0,0,117,110,100,101,102,36,105,110,101,100,0,0,0,0,0,0,46,80,69,10,0,0,0,0,9,112,109,51,100,45,104,105,100,100,101,110,51,100,32,105,115,32,111,110,32,97,110,100,32,119,105,108,108,32,117,115,101,32,108,105,110,101,115,116,121,108,101,32,37,100,10,0,69,120,112,101,99,116,101,100,32,99,111,109,109,97,0,0,115,101,116,32,100,101,99,105,109,97,108,115,105,103,110,32,39,37,115,39,10,0,0,0,120,61,37,102,59,32,121,61,37,102,10,0,0,0,0,0,47,40,117,110,100,101,102,105,110,101,100,41,0,0,0,0,46,80,83,32,37,102,32,37,102,10,0,0,0,0,0,0,109,111,118,101,32,116,111,32,40,120,43,37,102,44,121,43,37,102,41,10,0,0,0,0,73,109,112,114,111,112,101,114,32,115,99,97,110,110,105,110,103,32,115,116,114,105,110,103,46,32,84,114,121,32,51,32,99,104,97,114,97,99,116,101,114,32,115,116,114,105,110,103,32,102,111,114,32,51,68,32,100,97,116,97,0,0,0,0,100,97,115,104,101,100,32,48,46,48,55,53,0,0,0,0,100,97,115,104,101,100,32,48,46,48,53,0,0,0,0,0,100,111,116,116,101,100,0,0,116,104,105,99,107,110,101,115,115,32,49,46,48,0,0,0,32,92,10,32,32,32,116,104,101,110,32,116,111,32,40,120,43,37,102,44,121,43,37,102,41,0,0,0,0,0,0,0,10,32,32,0,0,0,0,0,108,105,110,101,32,37,115,32,116,111,32,40,120,43,37,102,44,121,43,37,102,41,0,0,116,114,105,36,97,110,103,108,101,112,97,116,116,101,114,110,0,0,0,0,0,0,0,0,97,116,32,120,43,37,102,44,121,43,37,102,10,0,0,0,97,108,108,32,52,32,112,111,105,110,116,115,32,111,102,32,116,104,101,32,113,117,97,100,114,97,110,103,108,101,32,105,110,32,120,44,121,32,114,97,110,103,101,115,10,0,0,0,110,111,116,32,101,110,111,117,103,104,32,109,101,109,111,114,121,32,102,111,114,32,102,117,110,99,116,105,111,110,0,0,115,101,116,32,100,101,99,105,109,97,108,115,105,103,110,32,108,111,99,97,108,101,32,34,37,115,34,10,0,0,0,0,114,106,117,115,116,32,0,0,108,106,117,115,116,32,0,0,67,97,110,110,111,116,32,97,108,116,101,114,32,115,99,97,110,110,105,110,103,32,109,101,116,104,111,100,32,102,111,114,32,111,110,101,45,100,105,109,101,110,115,105,111,110,97,108,32,100,97,116,97,0,0,0,59,32,114,101,115,101,116,32,108,105,110,101,119,105,100,10,0,0,0,0,0,0,0,0,84,111,111,32,109,97,110,121,32,114,97,110,103,101,45,115,112,101,99,115,32,102,111,114,32,97,32,37,100,45,118,97,114,105,97,98,108,101,32,102,105,116,0,0,0,0,0,0,108,105,110,101,32,102,114,111,109,32,120,43,37,102,44,121,43,37,102,32,116,111,32,120,43,37,102,44,121,43,37,102,10,0,0,0,0,0,0,0,97,114,114,111,119,104,101,97,100,61,55,59,32,97,114,114,111,119,32,102,114,111,109,32,120,43,37,102,44,121,43,37,102,32,116,111,32,120,43,37,102,44,121,43,37,102,10,0,49,54,0,0,0,0,0,0,27,91,114,27,91,50,52,59,49,72,0,0,0,0,0,0,40,37,46,51,102,97,44,37,46,51,102,97,41,0,0,0,27,91,50,74,27,91,50,52,59,49,72,0,0,0,0,0,110,111,111,102,102,36,115,101,116,0,0,0,0,0,0,0,27,92,27,91,50,52,59,49,72,0,0,0,0,0,0,0,97,116,32,108,101,97,115,116,32,49,32,112,111,105,110,116,32,111,102,32,116,104,101,32,113,117,97,100,114,97,110,103,108,101,32,105,110,32,120,44,121,32,114,97,110,103,101,115,10,0,0,0,0,0,0,0,115,101,116,32,112,111,105,110,116,115,105,122,101,32,37,103,10,115,101,116,32,112,111,105,110,116,105,110,116,101,114,118,97,108,98,111,120,32,37,103,10,115,101,116,32,101,110,99,111,100,105,110,103,32,37,115,10,37,115,115,101,116,32,112,111,108,97,114,10,37,115,115,101,116,32,112,97,114,97,109,101,116,114,105,99,10,0,0,27,91,50,74,27,80,49,112,83,40,67,48,41,83,40,69,41,84,40,65,48,41,10,0,80,91,37,100,44,37,100,93,10,0,0,0,0,0,0,0,118,91,93,118,91,37,100,44,37,100,93,10,0,0,0,0,122,90,0,0,0,0,0,0,87,40,80,37,100,41,10,0,87,40,73,37,100,41,10,0,37,97,0,0,0,0,0,0,84,40,68,48,44,83,49,41,10,0,0,0,0,0,0,0,10,37,115,37,115,10,0,0,84,40,68,57,48,44,83,49,41,10,0,0,0,0,0,0,67,111,109,109,97,110,100,32,39,117,110,115,101,116,32,104,105,115,116,111,114,121,115,105,122,101,39,32,114,101,113,117,105,114,101,115,32,104,105,115,116,111,114,121,32,115,117,112,112,111,114,116,46,0,0,0,100,101,112,114,101,99,97,116,101,100,32,115,121,110,116,97,120,44,32,117,115,101,32,34,117,110,115,101,116,34,0,0,27,77,71,49,27,82,75,33,27,83,75,33,27,76,90,27,37,37,33,49,0,0,0,0,112,32,58,61,32,0,0,0,27,37,37,33,48,27,77,78,48,27,77,67,66,55,67,59,27,77,81,49,27,77,84,49,0,0,0,0,0,0,0,0,27,37,37,33,48,27,76,90,27,37,37,33,49,0,0,0,9,99,108,105,112,112,105,110]) -.concat([103,58,32,0,0,0,0,0,78,97,109,101,100,32,99,111,108,111,114,115,32,119,105,108,108,32,112,114,111,100,117,99,101,32,115,116,114,97,110,103,101,32,114,101,115,117,108,116,115,32,105,102,32,110,111,116,32,105,110,32,99,111,108,111,114,32,109,111,100,101,32,82,71,66,46,0,0,0,0,0,115,101,116,32,111,102,102,115,101,116,115,0,0,0,0,0,27,76,86,49,27,37,37,33,49,0,0,0,0,0,0,0,27,37,37,33,48,27,12,27,76,86,48,0,0,0,0,0,27,76,70,0,0,0,0,0,121,89,0,0,0,0,0,0,115,106,36,105,115,0,0,0,27,76,71,0,0,0,0,0,103,101,0,0,0,0,0,0,37,52,100,32,0,0,0,0,27,77,86,0,0,0,0,0,27,77,76,0,0,0,0,0,27,77,76,63,0,0,0,0,37,108,102,32,44,32,37,108,102,32,37,99,0,0,0,0,27,77,76,53,0,0,0,0,32,32,99,108,105,112,32,99,117,114,114,101,110,116,112,105,99,116,117,114,101,32,116,111,32,117,110,105,116,115,113,117,97,114,101,32,120,121,115,99,97,108,101,100,32,40,37,46,51,102,97,44,37,46,51,102,97,41,32,115,104,105,102,116,101,100,32,40,37,46,51,102,97,44,37,46,51,102,97,41,59,41,59,10,0,0,0,0,27,76,84,0,0,0,0,0,100,101,102,36,97,117,108,116,115,0,0,0,0,0,0,0,114,101,112,36,108,111,116,0,27,77,82,69,58,48,0,0,9,102,108,117,115,104,105,110,103,32,116,114,105,97,110,103,108,101,115,32,97,114,101,32,37,115,100,114,97,119,110,10,0,0,0,0,0,0,0,0,105,110,118,97,108,105,100,32,112,97,108,101,116,116,101,32,111,112,116,105,111,110,0,0,69,120,112,101,99,116,105,110,103,32,91,110,111,93,111,117,116,112,117,116,32,111,114,32,112,114,101,102,105,120,0,0,115,101,116,32,108,111,103,115,99,97,108,101,32,37,115,32,37,103,10,0,0,0,0,0,27,77,82,48,48,0,0,0,27,76,72,0,0,0,0,0,27,77,77,0,0,0,0,0,120,88,0,0,0,0,0,0,31,37,115,10,0,0,0,0,27,91,63,51,56,108,0,0,35,33,37,115,47,103,110,117,112,108,111,116,10,35,10,0,96,97,96,97,98,99,100,104,105,106,107,108,0,0,0,0,31,27,3,0,0,0,0,0,67,111,109,109,97,110,100,32,39,115,101,116,32,104,105,115,116,111,114,121,115,105,122,101,39,32,114,101,113,117,105,114,101,115,32,104,105,115,116,111,114,121,32,115,117,112,112,111,114,116,46,0,0,0,0,0,100,114,97,119,32,98,105,116,109,97,112,105,109,97,103,101,32,40,37,117,44,37,117,44,105,109,103,41,32,120,121,115,99,97,108,101,100,32,40,37,46,51,102,97,44,37,46,51,102,97,41,32,115,104,105,102,116,101,100,32,40,37,46,51,102,97,44,37,46,51,102,97,41,59,10,0,0,0,0,0,27,12,0,0,0,0,0,0,110,111,32,109,97,116,99,104,105,110,103,32,39,125,39,0,122,36,101,114,111,0,0,0,121,122,120,0,0,0,0,0,56,57,58,59,0,0,0,0,69,78,68,0,0,0,0,0,112,97,114,97,36,108,108,101,108,0,0,0,0,0,0,0,110,111,110,45,110,101,103,97,116,105,118,101,32,110,117,109,98,101,114,32,114,101,113,117,105,114,101,100,0,0,0,0,117,110,115,101,116,32,108,111,103,115,99,97,108,101,10,0,27,37,99,0,0,0,0,0,27,91,63,51,56,104,0,0,116,105,116,108,101,0,0,0,67,97,110,32,111,110,108,121,32,102,108,105,112,32,120,44,32,121,44,32,97,110,100,47,111,114,32,122,0,0,0,0,32,101,109,112,116,121,32,0,106,115,36,100,105,114,0,0,102,115,105,122,101,0,0,0,97,120,36,101,115,0,0,0,32,106,115,100,105,114,32,34,37,115,34,0,0,0,0,0,47,98,105,110,47,115,104,0,38,38,0,0,0,0,0,0,32,116,105,116,108,101,32,34,37,115,34,0,0,0,0,0,118,97,114,110,97,109,101,0,32,109,111,117,115,105,110,103,0,0,0,0,0,0,0,0,100,114,97,119,32,105,109,97,103,101,40,10,32,32,0,0,32,115,116,97,110,100,97,108,111,110,101,0,0,0,0,0,114,97,120,36,105,115,0,0,32,110,97,109,101,32,34,37,115,34,0,0,0,0,0,0,115,119,97,112,112,101,100,32,112,100,112,32,40,100,105,109,109,108,101,41,0,0,0,0,66,69,71,73,78,0,0,0,85,110,107,110,111,119,110,32,99,111,108,111,114,32,109,111,100,101,108,46,0,0,0,0,37,115,10,0,0,0,0,0,116,105,116,108,101,32,0,0,32,102,111,110,116,115,99,97,108,101,32,37,103,0,0,0,9,99,117,114,114,101,110,116,32,116,101,114,109,105,110,97,108,32,116,121,112,101,32,105,115,32,117,110,107,110,111,119,110,10,0,0,0,0,0,0,77,79,85,83,69,95,67,84,82,76,0,0,0,0,0,0,32,101,110,104,97,110,99,101,100,0,0,0,0,0,0,0,115,112,114,105,110,116,102,32,97,114,103,115,0,0,0,0,37,115,32,102,115,105,122,101,32,37,103,32,108,119,32,37,103,0,0,0,0,0,0,0,120,88,121,89,122,90,0,0,32,115,105,122,101,32,37,100,44,37,100,0,0,0,0,0,32,98,117,116,116,0,0,0,32,114,111,117,110,100,101,100,0,0,0,0,0,0,0,0,32,100,97,115,104,108,101,110,103,116,104,32,37,51,46,49,102,0,0,0,0,0,0,0,32,115,111,108,105,100,0,0,105,109,97,32,58,61,32,34,37,37,10,0,0,0,0,0,102,111,110,116,58,32,101,120,112,101,99,116,105,110,103,32,115,116,114,105,110,103,0,0,122,101,114,111,97,36,120,105,115,0,0,0,0,0,0,0,105,108,108,101,103,97,108,32,106,97,118,97,115,99,114,105,112,116,32,102,117,110,99,116,105,111,110,32,110,97,109,101,0,0,0,0,0,0,0,0,102,108,117,115,104,101,100,32,102,114,111,109,32,37,115,10,0,0,0,0,0,0,0,0,69,120,112,101,99,116,101,100,32,99,111,108,111,114,32,109,111,100,101,108,46,0,0,0,99,111,108,117,109,110,115,116,97,99,107,101,100,32,0,0,101,120,112,101,99,116,105,110,103,32,97,32,106,97,118,97,115,99,114,105,112,116,32,102,117,110,99,116,105,111,110,32,110,97,109,101,0,0,0,0,77,79,85,83,69,95,65,76,84,0,0,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,97,110,32,72,84,77,76,32,116,105,116,108,101,32,115,116,114,105,110,103,0,0,60,47,100,105,118,62,10,10,60,47,98,111,100,121,62,10,60,47,104,116,109,108,62,10,0,0,0,0,0,0,0,0,70,108,105,112,112,105,110,103,32,100,105,109,101,110,115,105,111,110,32,100,105,114,101,99,116,105,111,110,32,109,117,115,116,32,98,101,32,49,32,111,114,32,48,0,0,0,0,0,60,47,116,100,62,60,47,116,114,62,60,47,116,97,98,108,101,62,10,0,0,0,0,0,104,105,100,100,101,110,32,110,111,114,116,104,95,112,111,108,121,115,0,0,0,0,0,0,60,116,97,98,108,101,32,99,108,97,115,115,61,34,112,108,111,116,34,62,10,60,116,114,62,60,116,100,62,10,32,32,32,32,60,99,97,110,118,97,115,32,105,100,61,34,103,110,117,112,108,111,116,95,99,97,110,118,97,115,34,32,119,105,100,116,104,61,34,37,100,34,32,104,101,105,103,104,116,61,34,37,100,34,32,116,97,98,105,110,100,101,120,61,34,48,34,62,10,9,83,111,114,114,121,44,32,121,111,117,114,32,98,114,111,119,115,101,114,32,115,101,101,109,115,32,110,111,116,32,116,111,32,115,117,112,112,111,114,116,32,116,104,101,32,72,84,77,76,32,53,32,99,97,110,118,97,115,32,101,108,101,109,101,110,116,10,32,32,32,32,60,47,99,97,110,118,97,115,62,10,60,47,116,100,62,60,47,116,114,62,10,60,47,116,97,98,108,101,62,10,0,0,0,0,0,0,0,60,47,116,100,62,60,116,100,62,10,0,0,0,0,0,0,103,110,117,112,108,111,116,95,99,111,110,116,111,117,114,0,60,47,116,97,98,108,101,62,60,47,116,100,62,60,47,116,114,62,10,60,47,116,97,98,108,101,62,10,0,0,0,0,60,116,114,62,32,60,116,100,32,99,108,97,115,115,61,34,109,98,48,34,62,121,50,38,110,98,115,112,59,60,47,116,100,62,32,60,116,100,32,99,108,97,115,115,61,34,109,98,49,34,62,60,115,112,97,110,32,105,100,61,34,103,110,117,112,108,111,116,95,99,97,110,118,97,115,95,121,50,34,62,38,110,98,115,112,59,60,47,115,112,97,110,62,60,47,116,100,62,32,60,47,116,114,62,10,0,0,0,0,0,0,0,60,116,114,62,32,60,116,100,32,99,108,97,115,115,61,34,109,98,48,34,62,120,50,38,110,98,115,112,59,60,47,116,100,62,32,60,116,100,32,99,108,97,115,115,61,34,109,98,49,34,62,60,115,112,97,110,32,105,100,61,34,103,110,117,112,108,111,116,95,99,97,110,118,97,115,95,120,50,34,62,38,110,98,115,112,59,60,47,115,112,97,110,62,60,47,116,100,62,32,60,47,116,114,62,10,0,0,0,0,0,0,0,37,48,50,120,0,0,0,0,88,114,105,103,104,116,89,100,111,119,110,0,0,0,0,0,122,122,101,114,111,97,36,120,105,115,0,0,0,0,0,0,60,116,97,98,108,101,32,99,108,97,115,115,61,34,109,111,117,115,101,98,111,120,34,32,105,100,61,34,103,110,117,112,108,111,116,95,109,111,117,115,101,98,111,120,34,32,98,111,114,100,101,114,61,49,62,10,60,116,114,62,32,60,116,100,32,99,108,97,115,115,61,34,109,98,48,34,62,120,38,110,98,115,112,59,60,47,116,100,62,32,60,116,100,32,99,108,97,115,115,61,34,109,98,49,34,62,60,115,112,97,110,32,105,100,61,34,103,110,117,112,108,111,116,95,99,97,110,118,97,115,95,120,34,62,38,110,98,115,112,59,60,47,115,112,97,110,62,60,47,116,100,62,32,60,47,116,114,62,10,60,116,114,62,32,60,116,100,32,99,108,97,115,115,61,34,109,98,48,34,62,121,38,110,98,115,112,59,60,47,116,100,62,32,60,116,100,32,99,108,97,115,115,61,34,109,98,49,34,62,60,115,112,97,110,32,105,100,61,34,103,110,117,112,108,111,116,95,99,97,110,118,97,115,95,121,34,62,38,110,98,115,112,59,60,47,115,112,97,110,62,60,47,116,100,62,32,60,47,116,114,62,10,0,0,67,69,78,84,69,82,69,68,10,0,0,0,0,0,0,0,115,97,116,36,117,114,97,116,105,111,110,0,0,0,0,0,114,111,119,115,116,97,99,107,101,100,32,0,0,0,0,0,35,35,32,0,0,0,0,0,32,32,32,32,32,32,60,47,116,97,98,108,101,62,10,32,32,60,47,116,100,62,60,47,116,114,62,10,60,47,116,97,98,108,101,62,60,47,116,100,62,60,47,116,114,62,60,116,114,62,60,116,100,32,99,108,97,115,115,61,34,109,111,117,115,101,98,111,120,34,62,10,0,0,0,0,0,0,0,0,77,79,85,83,69,95,83,72,73,70,84,0,0,0,0,0,9,60,47,116,114,62,10,0,9,32,32,60,116,100,32,99,108,97,115,115,61,34,105,99,111,110,34,32,62,32,60,47,116,100,62,10,0,0,0,0,83,97,109,112,108,101,32,112,101,114,105,111,100,32,109,117,115,116,32,98,101,32,112,111,115,105,116,105,118,101,46,32,84,114,121,32,96,102,108,105,112,96,32,102,111,114,32,99,104,97,110,103,105,110,103,32,100,105,114,101,99,116,105,111,110,0,0,0,0,0,0,0,84,104,105,115,32,116,101,114,109,105,110,97,108,32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,102,105,108,108,101,100,32,112,111,108,121,103,111,110,115,0,0,9,32,32,60,116,100,32,99,108,97,115,115,61,34,105,99,111,110,34,32,111,110,99,108,105,99,107,61,103,110,117,112,108,111,116,46,116,111,103,103,108,101,95,112,108,111,116,40,34,103,112,95,112,108,111,116,95,37,100,34,41,62,37,100,60,47,116,100,62,10,0,0,112,97,114,97,109,101,116,101,114,32,116,111,32,96,112,109,51,100,32,97,116,96,32,114,101,113,117,105,114,101,115,32,99,111,109,98,105,110,97,116,105,111,110,32,111,102,32,117,112,32,116,111,32,54,32,99,104,97,114,97,99,116,101,114,115,32,98,44,115,44,116,10,9,40,100,114,97,119,105,110,103,32,97,116,32,98,111,116,116,111,109,44,32,115,117,114,102,97,99,101,44,32,116,111,112,41,0,0,0,0,0,0,9,60,116,114,62,10,0,0,60,116,97,98,108,101,32,99,108,97,115,115,61,34,109,98,108,101,102,116,34,62,60,116,114,62,60,116,100,32,99,108,97,115,115,61,34,109,111,117,115,101,98,111,120,34,62,10,60,116,97,98,108,101,32,99,108,97,115,115,61,34,109,111,117,115,101,98,111,120,34,32,98,111,114,100,101,114,61,48,62,10,32,32,60,116,114,62,60,116,100,32,99,108,97,115,115,61,34,109,111,117,115,101,98,111,120,34,62,10,32,32,32,32,60,116,97,98,108,101,32,99,108,97,115,115,61,34,109,111,117,115,101,98,111,120,34,32,105,100,61,34,103,110,117,112,108,111,116,95,109,111,117,115,101,98,111,120,34,32,98,111,114,100,101,114,61,48,62,10,32,32,32,32,60,116,114,62,60,116,100,32,99,108,97,115,115,61,34,109,98,104,34,62,60,47,116,100,62,60,47,116,114,62,10,32,32,32,32,60,116,114,62,60,116,100,32,99,108,97,115,115,61,34,109,98,104,34,62,10,32,32,32,32,32,32,60,116,97,98,108,101,32,99,108,97,115,115,61,34,109,111,117,115,101,98,111,120,34,62,10,9,60,116,114,62,10,9,32,32,60,116,100,32,99,108,97,115,115,61,34,105,99,111,110,34,62,60,47,116,100,62,10,9,32,32,60,116,100,32,99,108,97,115,115,61,34,105,99,111,110,34,32,111,110,99,108,105,99,107,61,103,110,117,112,108,111,116,46,116,111,103,103,108,101,95,103,114,105,100,62,60,105,109,103,32,115,114,99,61,34,37,115,103,114,105,100,46,112,110,103,34,32,105,100,61,34,103,110,117,112,108,111,116,95,103,114,105,100,95,105,99,111,110,34,32,99,108,97,115,115,61,34,105,99,111,110,45,105,109,97,103,101,34,32,97,108,116,61,34,35,34,32,116,105,116,108,101,61,34,116,111,103,103,108,101,32,103,114,105,100,34,62,60,47,116,100,62,10,9,32,32,60,116,100,32,99,108,97,115,115,61,34,105,99,111,110,34,32,111,110,99,108,105,99,107,61,103,110,117,112,108,111,116,46,117,110,122,111,111,109,62,60,105,109,103,32,115,114,99,61,34,37,115,112,114,101,118,105,111,117,115,122,111,111,109,46,112,110,103,34,32,105,100,61,34,103,110,117,112,108,111,116,95,117,110,122,111,111,109,95,105,99,111,110,34,32,99,108,97,115,115,61,34,105,99,111,110,45,105,109,97,103,101,34,32,97,108,116,61,34,117,110,122,111,111,109,34,32,116,105,116,108,101,61,34,117,110,122,111,111,109,34,62,60,47,116,100,62,10,9,32,32,60,116,100,32,99,108,97,115,115,61,34,105,99,111,110,34,32,111,110,99,108,105,99,107,61,103,110,117,112,108,111,116,46,114,101,122,111,111,109,62,60,105,109,103,32,115,114,99,61,34,37,115,110,101,120,116,122,111,111,109,46,112,110,103,34,32,105,100,61,34,103,110,117,112,108,111,116,95,114,101,122,111,111,109,95,105,99,111,110,34,32,99,108,97,115,115,61,34,105,99,111,110,45,105,109,97,103,101,34,32,97,108,116,61,34,114,101,122,111,111,109,34,32,116,105,116,108,101,61,34,114,101,122,111,111,109,34,62,60,47,116,100,62,10,9,32,32,60,116,100,32,99,108,97,115,115,61,34,105,99,111,110,34,32,111,110,99,108,105,99,107,61,103,110,117,112,108,111,116,46,116,111,103,103,108,101,95,122,111,111,109,95,116,101,120,116,62,60,105,109,103,32,115,114,99,61,34,37,115,116,101,120,116,122,111,111,109,46,112,110,103,34,32,105,100,61,34,103,110,117,112,108,111,116,95,116,101,120,116,122,111,111,109,95,105,99,111,110,34,32,99,108,97,115,115,61,34,105,99,111,110,45,105,109,97,103,101,34,32,97,108,116,61,34,122,111,111,109,32,116,101,120,116,34,32,116,105,116,108,101,61,34,122,111,111,109,32,116,101,120,116,32,119,105,116,104,32,112,108,111,116,34,62,60,47,116,100,62,10,9,32,32,60,116,100,32,99,108,97,115,115,61,34,105,99,111,110,34,32,111,110,99,108,105,99,107,61,103,110,117,112,108,111,116,46,112,111,112,117,112,95,104,101,108,112,40,41,62,60,105,109,103,32,115,114,99,61,34,37,115,104,101,108,112,46,112,110,103,34,32,105,100,61,34,103,110,117,112,108,111,116,95,104,101,108,112,95,105,99,111,110,34,32,99,108,97,115,115,61,34,105,99,111,110,45,105,109,97,103,101,34,32,97,108,116,61,34,63,34,32,116,105,116,108,101,61,34,104,101,108,112,34,62,60,47,116,100,62,10,9,60,47,116,114,62,10,0,0,0,0,0,60,47,115,99,114,105,112,116,62,10,60,108,105,110,107,32,116,121,112,101,61,34,116,101,120,116,47,99,115,115,34,32,104,114,101,102,61,34,37,115,103,110,117,112,108,111,116,95,109,111,117,115,101,46,99,115,115,34,32,114,101,108,61,34,115,116,121,108,101,115,104,101,101,116,34,62,10,60,47,104,101,97,100,62,10,60,98,111,100,121,32,111,110,108,111,97,100,61,34,103,110,117,112,108,111,116,95,99,97,110,118,97,115,40,41,59,32,103,110,117,112,108,111,116,46,105,110,105,116,40,41,59,34,32,111,110,99,111,110,116,101,120,116,109,101,110,117,61,34,114,101,116,117,114,110,32,102,97,108,115,101,59,34,62,10,10,60,100,105,118,32,99,108,97,115,115,61,34,103,110,117,112,108,111,116,34,62,10,0,0,0,0,103,110,117,112,108,111,116,46,112,108,111,116,95,116,105,109,101,97,120,105,115,95,120,32,61,32,34,34,59,10,0,0,34,59,10,0,0,0,0,0,103,110,117,112,108,111,116,46,112,108,111,116,95,116,105,109,101,97,120,105,115,95,120,32,61,32,34,37,115,34,59,10,0,0,0,0,0,0,0,0,121,50,122,101,114,111,97,36,120,105,115,0,0,0,0,0,103,110,117,112,108,111,116,46,112,108,111,116,95,97,120,105,115,95,120,109,97,120,32,61,32,37,46,51,102,59,10,0,9,115,117,98,115,101,113,117,101,110,116,32,115,99,97,110,115,32,119,105,116,104,32,100,105,102,102,101,114,101,110,116,32,110,98,32,111,102,32,112,116,115,32,97,114,101,32,0,99,121,99,36,108,101,115,0,101,114,114,111,114,98,97,114,115,32,103,97,112,32,37,100,32,108,119,32,37,103,0,0,103,110,117,112,108,111,116,46,112,108,111,116,95,97,120,105,115,95,120,109,105,110,32,61,32,37,46,51,102,59,10,0,77,79,85,83,69,95,89,50,0,0,0,0,0,0,0,0,103,110,117,112,108,111,116,46,112,108,111,116,95,97,120,105,115,95,104,101,105,103,104,116,32,61,32,103,110,117,112,108,111,116,46,112,108,111,116,95,97,120,105,115,95,121,109,97,120,32,45,32,103,110,117,112,108,111,116,46,112,108,111,116,95,97,120,105,115,95,121,109,105,110,59,10,0,0,0,0,103,110,117,112,108,111,116,46,112,108,111,116,95,97,120,105,115,95,119,105,100,116,104,32,61,32,103,110,117,112,108,111,116,46,112,108,111,116,95,97,120,105,115,95,120,109,97,120,32,45,32,103,110,117,112,108,111,116,46,112,108,111,116,95,97,120,105,115,95,120,109,105,110,59,10,0,0,0,0,0,77,111,114,101,32,112,97,114,97,109,101,116,101,114,115,32,115,112,101,99,105,102,105,101,100,32,116,104,97,110,32,100,97,116,97,32,114,101,99,111,114,100,115,32,115,112,101,99,105,102,105,101,100,0,0,0,103,110,117,112,108,111,116,46,112,108,111,116,95,108,111,103,97,120,105,115,95,114,32,61,32,37,100,59,10,0,0,0,103,110,117,112,108,111,116,46,112,108,111,116,95,108,111,103,97,120,105,115,95,121,32,61,32,37,100,59,10,0,0,0,103,110,117,112,108,111,116,46,112,108,111,116,95,108,111,103,97,120,105,115,95,120,32,61,32,37,100,59,10,0,0,0,103,110,117,112,108,111,116,46,112,108,111,116,95,97,120,105,115,95,121,50,109,105,110,32,61,32,34,110,111,110,101,34,10,0,0,0,0,0,0,0,57,48,32,109,117,108,32,115,105,110,0,0,0,0,0,0,103,110,117,112,108,111,116,46,112,108,111,116,95,97,120,105,115,95,121,50,109,97,120,0,37,48,50,120,37,48,50,120,37,48,50,120,0,0,0,0,103,110,117,112,108,111,116,46,112,108,111,116,95,97,120,105,115,95,121,50,109,105,110,0,121,122,101,114,111,97,36,120,105,115,0,0,0,0,0,0,103,110,117,112,108,111,116,46,112,108,111,116,95,97,120,105,115,95,120,50,109,105,110,32,61,32,34,110,111,110,101,34,10,0,0,0,0,0,0,0,9,116,97,107,105,110,103,32,115,99,97,110,115,32,100,105,114,101,99,116,105,111,110,32,97,117,116,111,109,97,116,105,99,97,108,108,121,10,0,0,99,108,117,115,116,101,114,101,100,32,103,97,112,32,37,100,32,0,0,0,0,0,0,0,103,110,117,112,108,111,116,46,112,108,111,116,95,97,120,105,115,95,120,50,109,97,120,0,101,120,112,97,110,100,105,110,103,32,99,117,114,118,101,32,118,97,114,105,97,98,108,101,32,99,111,108,111,114,115,0,77,79,85,83,69,95,88,50,0,0,0,0,0,0,0,0,103,110,117,112,108,111,116,46,112,108,111,116,95,97,120,105,115,95,120,50,109,105,110,0,103,110,117,112,108,111,116,46,112,108,111,116,95,97,120,105,115,95,114,109,105,110,32,61,32,37,103,59,10,0,0,0,67,97,110,110,111,116,32,102,108,105,112,32,97,32,110,111,110,45,101,120,105,115,116,101,110,116,32,100,105,109,101,110,115,105,111,110,0,0,0,0,103,110,117,112,108,111,116,46,112,108,111,116,95,97,120,105,115,95,121,109,97,120,0,0,103,110,117,112,108,111,116,46,112,108,111,116,95,97,120,105,115,95,121,109,105,110,0,0,103,110,117,112,108,111,116,32,37,115,32,112,97,116,99,104,108,101,118,101,108,32,37,115,10,0,0,0,0,0,0,0,103,110,117,112,108,111,116,46,112,108,111,116,95,97,120,105,115,95,120,109,97,120,0,0,37,115,32,61,32,37,103,59,10,0,0,0,0,0,0,0,103,110,117,112,108,111,116,46,112,108,111,116,95,97,120,105,115,95,120,109,105,110,0,0,37,37,10,0,0,0,0,0,37,115,32,61,32,37,100,59,10,0,0,0,0,0,0,0,120,50,122,101,114,111,97,36,120,105,115,0,0,0,0,0,103,110,117,112,108,111,116,46,112,108,111,116,95,104,101,105,103,104,116,32,61,32,37,46,49,102,59,10,0,0,0,0,66,65,67,75,87,65,82,68,0,0,0,0,0,0,0,0,99,111,108,111,114,32,102,111,114,109,117,108,97,32,111,117,116,32,111,102,32,114,97,110,103,101,32,40,117,115,101,32,96,115,104,111,119,32,112,97,108,101,116,116,101,32,114,103,98,102,111,114,109,117,108,97,101,39,32,116,111,32,100,105,115,112,108,97,121,32,116,104,101,32,114,97,110,103,101,41,0,0,0,0,0,0,0,0,115,101,116,32,115,116,121,108,101,32,104,105,115,116,111,103,114,97,109,32,0,0,0,0,103,110,117,112,108,111,116,46,112,108,111,116,95,119,105,100,116,104,32,61,32,37,46,49,102,59,10,0,0,0,0,0,77,79,85,83,69,95,89,0,103,110,117,112,108,111,116,46,112,108,111,116,95,121,116,111,112,32,61,32,37,46,49,102,59,10,0,0,0,0,0,0,103,110,117,112,108,111,116,46,112,108,111,116,95,121,98,111,116,32,61,32,37,46,49,102,59,10,0,0,0,0,0,0,70,111,114,109,97,116,32,115,112,101,99,105,102,105,101,114,32,109,117,115,116,32,98,101,103,105,110,32,119,105,116,104,32,39,37,39,0,0,0,0,103,110,117,112,108,111,116,46,112,108,111,116,95,120,109,97,120,32,61,32,37,46,49,102,59,10,0,0,0,0,0,0,67,97,110,39,116,32,114,101,45,110,97,109,101,32,39,121,39,32,105,110,32,97,32,111,110,101,45,118,97,114,105,97,98,108,101,32,102,105,116,0,117,110,100,101,102,105,110,101,100,32,118,97,108,117,101,0,103,110,117,112,108,111,116,46,112,108,111,116,95,120,109,105,110,32,61,32,37,46,49,102,59,10,0,0,0,0,0,0,103,110,117,112,108,111,116,46,112,108,111,116,95,116,101,114,109,95,121,109,97,120,32,61,32,37,100,59,10,0,0,0,103,110,117,112,108,111,116,46,112,108,111,116,95,116,101,114,109,95,120,109,97,120,32,61,32,37,100,59,10,0,0,0,10,47,47,32,112,108,111,116,32,98,111,117,110,100,97,114,105,101,115,32,97,110,100,32,97,120,105,115,32,115,99,97,108,105,110,103,32,105,110,102,111,114,109,97,116,105,111,110,32,102,111,114,32,109,111,117,115,105,110,103,32,10,0,0,105,109,103,32,58,61,32,34,37,37,10,0,0,0,0,0,67,97,110,118,97,115,84,101,120,116,70,117,110,99,116,105,111,110,115,46,101,110,97,98,108,101,40,99,116,120,41,59,10,99,116,120,46,115,116,114,111,107,101,83,116,121,108,101,32,61,32,34,114,103,98,40,50,49,53,44,50,49,53,44,50,49,53,41,34,59,10,99,116,120,46,108,105,110,101,87,105,100,116,104,32,61,32,37,46,49,103,59,10,10,0,0,120,122,101,114,111,97,36,120,105,115,0,0,0,0,0,0,99,116,120,46,102,105,108,108,83,116,121,108,101,32,61,32,34,37,115,34,59,10,99,116,120,46,102,105,108,108,82,101,99,116,40,48,44,48,44,37,100,44,37,100,41,59,10,0,70,79,82,87,65,82,68,0,99,111,110,102,108,105,99,116,105,110,103,32,111,112,116,105,111,110,115,0,0,0,0,0,99,116,120,46,108,105,110,101,67,97,112,32,61,32,34,37,115,34,59,32,99,116,120,46,108,105,110,101,74,111,105,110,32,61,32,34,37,115,34,59,10,0,0,0,0,0,0,0,77,79,85,83,69,95,88,0,103,110,117,112,108,111,116,46,100,97,115,104,108,101,110,103,116,104,32,61,32,37,100,59,10,0,0,0,0,0,0,0,47,47,32,115,104,111,114,116,32,102,111,114,109,115,32,111,102,32,99,111,109,109,97,110,100,115,32,112,114,111,118,105,100,101,100,32,98,121,32,103,110,117,112,108,111,116,95,99,111,109,109,111,110,46,106,115,10,102,117,110,99,116,105,111,110,32,68,84,32,32,40,100,116,41,32,32,123,103,110,117,112,108,111,116,46,100,97,115,104,116,121,112,101,40,100,116,41,59,125,59,10,102,117,110,99,116,105,111,110,32,68,83,32,32,40,120,44,121,41,32,123,103,110,117,112,108,111,116,46,100,97,115,104,115,116,97,114,116,40,120,44,121,41,59,125,59,10,102,117,110,99,116,105,111,110,32,68,76,32,32,40,120,44,121,41,32,123,103,110,117,112,108,111,116,46,100,97,115,104,115,116,101,112,40,120,44,121,41,59,125,59,10,102,117,110,99,116,105,111,110,32,77,32,32,32,40,120,44,121,41,32,123,105,102,32,40,103,110,117,112,108,111,116,46,112,97,116,116,101,114,110,46,108,101,110,103,116,104,32,62,32,48,41,32,68,83,40,120,44,121,41,59,32,101,108,115,101,32,103,110,117,112,108,111,116,46,77,40,120,44,121,41,59,125,59,10,102,117,110,99,116,105,111,110,32,76,32,32,32,40,120,44,121,41,32,123,105,102,32,40,103,110,117,112,108,111,116,46,112,97,116,116,101,114,110,46,108,101,110,103,116,104,32,62,32,48,41,32,68,76,40,120,44,121,41,59,32,101,108,115,101,32,103,110,117,112,108,111,116,46,76,40,120,44,121,41,59,125,59,10,102,117,110,99,116,105,111,110,32,68,111,116,32,40,120,44,121,41,32,123,103,110,117,112,108,111,116,46,68,111,116,40,120,47,49,48,46,44,121,47,49,48,46,41,59,125,59,10,102,117,110,99,116,105,111,110,32,80,116,32,32,40,78,44,120,44,121,44,119,41,32,123,103,110,117,112,108,111,116,46,80,116,40,78,44,120,47,49,48,46,44,121,47,49,48,46,44,119,47,49,48,46,41,59,125,59,10,102,117,110,99,116,105,111,110,32,82,32,32,32,40,120,44,121,44,119,44,104,41,32,123,103,110,117,112,108,111,116,46,82,40,120,44,121,44,119,44,104,41,59,125,59,10,102,117,110,99,116,105,111,110,32,84,32,32,32,40,120,44,121,44,102,111,110,116,115,105,122,101,44,106,117,115,116,105,102,121,44,115,116,114,105,110,103,41,32,123,103,110,117,112,108,111,116,46,84,40,120,44,121,44,102,111,110,116,115,105,122,101,44,106,117,115,116,105,102,121,44,115,116,114,105,110,103,41,59,125,59,10,102,117,110,99,116,105,111,110,32,84,82,32,32,40,120,44,121,44,97,110,103,108,101,44,102,111,110,116,115,105,122,101,44,106,117,115,116,105,102,121,44,115,116,114,105,110,103,41,32,123,103,110,117,112,108,111,116,46,84,82,40,120,44,121,44,97,110,103,108,101,44,102,111,110,116,115,105,122,101,44,106,117,115,116,105,102,121,44,115,116,114,105,110,103,41,59,125,59,10,102,117,110,99,116,105,111,110,32,98,112,32,32,40,120,44,121,41,32,123,103,110,117,112,108,111,116,46,98,112,40,120,44,121,41,59,125,59,10,102,117,110,99,116,105,111,110,32,99,102,112,32,40,41,32,123,103,110,117,112,108,111,116,46,99,102,112,40,41,59,125,59,10,102,117,110,99,116,105,111,110,32,99,102,115,112,40,41,32,123,103,110,117,112,108,111,116,46,99,102,115,112,40,41,59,125,59,10,10,0,85,110,114,101,99,111,103,110,105,122,101,100,32,98,105,110,97,114,121,32,102,111,114,109,97,116,32,115,112,101,99,105,102,105,99,97,116,105,111,110,0,0,0,0,0,0,0,0,47,47,32,71,110,117,112,108,111,116,32,118,101,114,115,105,111,110,32,37,115,46,37,115,10,0,0,0,0,0,0,0,47,47,32,82,101,105,110,105,116,105,97,108,105,122,101,32,109,111,117,115,101,32,116,114,97,99,107,105,110,103,32,97,110,100,32,122,111,111,109,32,102,111,114,32,116,104,105,115,32,112,97,114,116,105,99,117,108,97,114,32,112,108,111,116,10,105,102,32,40,40,116,121,112,101,111,102,40,103,110,117,112,108,111,116,46,97,99,116,105,118,101,95,112,108,111,116,41,32,61,61,32,34,117,110,100,101,102,105,110,101,100,34,32,124,124,32,103,110,117,112,108,111,116,46,97,99,116,105,118,101,95,112,108,111,116,32,33,61,32,37,115,41,32,32,38,38,32,32,116,121,112,101,111,102,40,103,110,117,112,108,111,116,46,109,111,117,115,101,95,117,112,100,97,116,101,41,32,33,61,32,34,117,110,100,101,102,105,110,101,100,34,41,32,123,10,32,32,103,110,117,112,108,111,116,46,97,99,116,105,118,101,95,112,108,111,116,95,110,97,109,101,32,61,32,34,37,115,34,59,10,32,32,103,110,117,112,108,111,116,46,97,99,116,105,118,101,95,112,108,111,116,32,61,32,37,115,59,10,32,32,99,97,110,118,97,115,46,111,110,109,111,117,115,101,109,111,118,101,32,61,32,103,110,117,112,108,111,116,46,109,111,117,115,101,95,117,112,100,97,116,101,59,10,32,32,99,97,110,118,97,115,46,111,110,109,111,117,115,101,117,112,32,61,32,103,110,117,112,108,111,116,46,122,111,111,109,95,105,110,59,10,32,32,99,97,110,118,97,115,46,111,110,109,111,117,115,101,100,111,119,110,32,61,32,103,110,117,112,108,111,116,46,115,97,118,101,99,108,105,99,107,59,10,32,32,99,97,110,118,97,115,46,111,110,107,101,121,112,114,101,115,115,32,61,32,103,110,117,112,108,111,116,46,100,111,95,104,111,116,107,101,121,59,10,32,32,105,102,32,40,99,97,110,118,97,115,46,97,116,116,97,99,104,69,118,101,110,116,41,32,123,99,97,110,118,97,115,46,97,116,116,97,99,104,69,118,101,110,116,40,39,109,111,117,115,101,111,118,101,114,39,44,32,37,115,41,59,125,10,32,32,101,108,115,101,32,105,102,32,40,99,97,110,118,97,115,46,97,100,100,69,118,101,110,116,76,105,115,116,101,110,101,114,41,32,123,99,97,110,118,97,115,46,97,100,100,69,118,101,110,116,76,105,115,116,101,110,101,114,40,39,109,111,117,115,101,111,118,101,114,39,44,32,37,115,44,32,102,97,108,115,101,41,59,125,32,10,32,32,103,110,117,112,108,111,116,46,122,111,111,109,101,100,32,61,32,102,97,108,115,101,59,10,32,32,103,110,117,112,108,111,116,46,122,111,111,109,95,97,120,105,115,95,119,105,100,116,104,32,61,32,48,59,10,32,32,103,110,117,112,108,111,116,46,122,111,111,109,95,105,110,95,112,114,111,103,114,101,115,115,32,61,32,102,97,108,115,101,59,10,32,32,103,110,117,112,108,111,116,46,112,111,108,97,114,95,109,111,100,101,32,61,32,37,115,59,10,32,32,99,116,120,46,99,108,101,97,114,82,101,99,116,40,48,44,48,44,37,100,44,37,100,41,59,10,125,10,0,37,65,0,0,0,0,0,0,102,117,110,99,116,105,111,110,32,37,115,40,41,32,123,10,99,97,110,118,97,115,32,61,32,100,111,99,117,109,101,110,116,46,103,101,116,69,108,101,109,101,110,116,66,121,73,100,40,34,37,115,34,41,59,10,99,116,120,32,61,32,99,97,110,118,97,115,46,103,101,116,67,111,110,116,101,120,116,40,34,50,100,34,41,59,10,0,102,111,114,109,97,116,32,116,111,111,32,108,111,110,103,32,100,117,101,32,116,111,32,108,111,110,103,32,100,101,99,105,109,97,108,115,105,103,110,32,115,116,114,105,110,103,0,0,101,120,116,114,97,110,101,111,117,115,32,97,114,103,117,109,101,110,116,115,32,116,111,32,117,110,115,101,116,32,108,97,98,101,108,0,0,0,0,0,60,115,99,114,105,112,116,32,116,121,112,101,61,34,116,101,120,116,47,106,97,118,97,115,99,114,105,112,116,34,62,10,118,97,114,32,99,97,110,118,97,115,44,32,99,116,120,59,10,103,110,117,112,108,111,116,46,103,114,105,100,95,108,105,110,101,115,32,61,32,116,114,117,101,59,10,103,110,117,112,108,111,116,46,122,111,111,109,101,100,32,61,32,102,97,108,115,101,59,10,103,110,117,112,108,111,116,46,97,99,116,105,118,101,95,112,108,111,116,95,110,97,109,101,32,61,32,34,103,110,117,112,108,111,116,95,99,97,110,118,97,115,34,59,10,10,102,117,110,99,116,105,111,110,32,103,110,117,112,108,111,116,95,99,97,110,118,97,115,40,41,32,123,10,99,97,110,118,97,115,32,61,32,100,111,99,117,109,101,110,116,46,103,101,116,69,108,101,109,101,110,116,66,121,73,100,40,34,103,110,117,112,108,111,116,95,99,97,110,118,97,115,34,41,59,10,99,116,120,32,61,32,99,97,110,118,97,115,46,103,101,116,67,111,110,116,101,120,116,40,34,50,100,34,41,59,10,0,0,0,0,0,0,0,60,115,99,114,105,112,116,32,116,121,112,101,61,34,116,101,120,116,47,106,97,118,97,115,99,114,105,112,116,34,62,103,110,117,112,108,111,116,46,105,110,105,116,32,61,32,102,117,110,99,116,105,111,110,40,41,32,123,125,59,60,47,115,99,114,105,112,116,62,10,0,0,67,111,110,84,101,88,116,32,119,105,116,104,32,77,101,116,97,70,117,110,32,40,102,111,114,32,80,68,70,32,100,111,99,117,109,101,110,116,115,41,0,0,0,0,0,0,0,0,60,115,99,114,105,112,116,32,116,121,112,101,61,34,116,101,120,116,47,106,97,118,97,115,99,114,105,112,116,34,62,32,103,110,117,112,108,111,116,46,104,101,108,112,95,85,82,76,32,61,32,34,37,115,47,99,97,110,118,97,115,95,104,101,108,112,46,104,116,109,108,34,59,32,60,47,115,99,114,105,112,116,62,10,0,0,0,0,118,114,36,97,110,103,101,0,60,115,99,114,105,112,116,32,115,114,99,61,34,37,115,103,110,117,112,108,111,116,95,109,111,117,115,101,46,106,115,34,62,60,47,115,99,114,105,112,116,62,10,0,0,0,0,0,9,116,97,107,105,110,103,32,115,99,97,110,115,32,105,110,32,37,115,32,100,105,114,101,99,116,105,111,110,10,0,0,105,110,118,97,108,105,100,32,99,111,108,111,114,98,111,120,32,111,112,116,105,111,110,0,115,101,116,32,115,116,121,108,101,32,97,114,114,111,119,32,37,100,0,0,0,0,0,0,60,115,99,114,105,112,116,32,115,114,99,61,34,37,115,103,110,117,112,108,111,116,95,100,97,115,104,101,100,108,105,110,101,115,46,106,115,34,62,60,47,115,99,114,105,112,116,62,10,0,0,0,0,0,0,0,107,101,121,95,99,104,97,114,0,0,0,0,0,0,0,0,99,97,110,118,97,115,116,101,120,116,0,0,0,0,0,0,99,97,110,118,97,115,109,97,116,104,0,0,0,0,0,0,70,97,105,108,117,114,101,32,105,110,32,98,105,110,97,114,121,32,116,97,98,108,101,32,105,110,105,116,105,97,108,105,122,97,116,105,111,110,0,0,107,111,105,56,36,117,0,0,60,33,45,45,91,105,102,32,73,69,93,62,60,115,99,114,105,112,116,32,116,121,112,101,61,34,116,101,120,116,47,106,97,118,97,115,99,114,105,112,116,34,32,115,114,99,61,34,101,120,99,97,110,118,97,115,46,106,115,34,62,60,47,115,99,114,105,112,116,62,60,33,91,101,110,100,105,102,93,45,45,62,10,60,115,99,114,105,112,116,32,115,114,99,61,34,37,115,37,115,46,106,115,34,62,60,47,115,99,114,105,112,116,62,10,60,115,99,114,105,112,116,32,115,114,99,61,34,37,115,103,110,117,112,108,111,116,95,99,111,109,109,111,110,46,106,115,34,62,60,47,115,99,114,105,112,116,62,10,0,60,109,101,116,97,32,104,116,116,112,45,101,113,117,105,118,61,34,99,111,110,116,101,110,116,45,116,121,112,101,34,32,99,111,110,116,101,110,116,61,34,116,101,120,116,47,104,116,109,108,59,32,99,104,97,114,115,101,116,61,85,84,70,45,56,34,62,10,0,0,0,0,71,110,117,112,108,111,116,32,67,97,110,118,97,115,32,71,114,97,112,104,0,0,0,0,60,33,68,79,67,84,89,80,69,32,72,84,77,76,62,10,60,104,116,109,108,62,10,60,104,101,97,100,62,10,60,116,105,116,108,101,62,37,115,60,47,116,105,116,108,101,62,10,0,0,0,0,0,0,0,0,99,116,120,46,98,101,103,105,110,80,97,116,104,40,41,59,10,0,0,0,0,0,0,0,99,111,110,116,101,120,116,0,77,40,37,117,44,37,117,41,59,10,0,0,0,0,0,0,117,114,36,97,110,103,101,0,114,101,102,36,114,101,115,104,0,0,0,0,0,0,0,0,76,40,37,117,44,37,117,41,59,10,0,0,0,0,0,0,9,116,114,117,101,32,100,101,112,116,104,32,111,114,100,101,114,105,110,103,10,0,0,0,101,120,112,101,99,116,105,110,103,32,115,99,114,101,101,110,32,118,97,108,117,101,32,91,48,32,45,32,49,93,0,0,105,108,108,101,103,97,108,32,112,114,101,102,105,120,0,0,117,110,115,101,116,32,115,116,121,108,101,32,97,114,114,111,119,10,0,0,0,0,0,0,68,84,40,103,110,117,112,108,111,116,46,100,97,115,104,112,97,116,116,101,114,110,51,41,59,10,0,0,0,0,0,0,77,79,85,83,69,95,67,72,65,82,0,0,0,0,0,0,68,84,40,103,110,117,112,108,111,116,46,100,97,115,104,112,97,116,116,101,114,110,37,49,100,41,59,10,0,0,0,0,119,120,116,0,0,0,0,0,114,103,98,40,49,55,49,44,50,49,52,44,48,48,48,41,0,0,0,0,0,0,0,0,37,39,34,32,0,0,0,0,114,103,98,40,50,49,52,44,48,48,48,44,49,50,48,41,0,0,0,0,0,0,0,0,114,103,98,40,50,53,53,44,50,48,52,44,48,48,48,41,0,0,0,0,0,0,0,0,114,103,98,40,49,54,51,44,49,52,53,44,50,53,53,41,0,0,0,0,0,0,0,0,116,111,107,101,110,32,116,97,98,108,101,0,0,0,0,0,37,115,37,115,10,37,115,37,115,10,37,115,37,115,10,37,115,37,115,37,115,37,115,10,37,115,10,0,0,0,0,0,114,103,98,40,50,49,52,44,50,49,52,44,48,54,57,41,0,0,0,0,0,0,0,0,114,103,98,40,48,48,48,44,49,53,51,44,49,54,49,41,0,0,0,0,0,0,0,0,77,101,116,97,80,111,115,116,32,112,108,111,116,116,105,110,103,32,115,116,97,110,100,97,114,100,0,0,0,0,0,0,114,103,98,40,50,53,53,44,49,53,51,44,48,48,48,41,0,0,0,0,0,0,0,0,116,114,36,97,110,103,101,0,122,120,121,0,0,0,0,0,114,103,98,40,48,48,48,44,48,48,48,44,49,52,56,41,0,0,0,0,0,0,0,0,84,79,80,0,0,0,0,0,98,121,0,0,0,0,0,0,116,97,103,32,109,117,115,116,32,98,101,32,115,116,114,105,99,116,108,121,32,112,111,115,105,116,105,118,101,32,40,115,101,101,32,96,104,101,108,112,32,115,101,116,32,115,116,121,108,101,32,108,105,110,101,39,41,0,0,0,0,0,0,0,115,101,116,32,115,116,121,108,101,32,108,105,110,101,32,37,100,32,0,0,0,0,0,0,114,103,98,40,48,50,49,44,49,49,55,44,48,54,57,41,0,0,0,0,0,0,0,0,77,79,85,83,69,95,75,69,89,0,0,0,0,0,0,0,114,103,98,40,48,48,48,44,50,53,53,44,50,53,53,41,0,0,0,0,0,0,0,0,114,103,98,40,49,57,48,44,48,48,48,44,49,57,48,41,0,0,0,0,0,0,0,0,117,115,105,110,103,32,100,101,102,97,117,108,116,32,98,105,110,97,114,121,32,102,111,114,109,97,116,0,0,0,0,0,32,100,101,102,97,117,108,116,10,0,0,0,0,0,0,0,114,103,98,40,48,48,48,44,48,48,48,44,50,50,53,41,0,0,0,0,0,0,0,0,100,117,112,108,105,99,97,116,101,100,32,111,114,32,99,111,110,116,114,97,100,105,99,116,105,110,103,32,97,114,103,117,109,101,110,116,115,32,105,110,32,112,108,111,116,32,111,112,116,105,111,110,115,0,0,0,114,103,98,40,48,48,48,44,49,55,49,44,48,48,48,41,0,0,0,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,39,117,110,105,113,117,101,39,44,32,39,102,114,101,113,117,101,110,99,121,39,44,32,39,99,117,109,117,108,97,116,105,118,101,39,44,32,39,99,110,111,114,109,97,108,39,44,32,39,107,100,101,110,115,105,116,121,39,44,32,39,97,99,115,112,108,105,110,101,115,39,44,32,39,99,115,112,108,105,110,101,115,39,44,32,39,98,101,122,105,101,114,39,32,111,114,32,39,115,98,101,122,105,101,114,39,0,0,0,0,114,103,98,40,50,53,53,44,48,48,48,44,48,48,48,41,0,0,0,0,0,0,0,0,83,72,69,76,76,0,0,0,124,124,0,0,0,0,0,0,114,103,98,40,49,54,48,44,49,54,48,44,49,54,48,41,0,0,0,0,0,0,0,0,109,97,116,114,105,120,32,101,108,101,109,101,110,116,115,0]) -.concat([114,103,98,40,48,48,48,44,48,48,48,44,48,48,48,41,0,0,0,0,0,0,0,0,115,112,108,105,110,101,32,109,97,116,114,105,120,0,0,0,109,112,0,0,0,0,0,0,114,103,98,40,50,53,53,44,50,53,53,44,50,53,53,41,0,0,0,0,0,0,0,0,114,114,36,97,110,103,101,0,117,115,105,110,103,32,100,101,102,97,117,108,116,32,98,105,110,97,114,121,32,114,101,99,111,114,100,47,97,114,114,97,121,32,115,116,114,117,99,116,117,114,101,0,0,0,0,0,72,111,109,101,0,0,0,0,34,41,59,10,0,0,0,0,83,85,82,70,65,67,69,0,105,110,118,97,108,105,100,32,112,109,51,100,32,111,112,116,105,111,110,0,0,0,0,0,84,40,37,100,44,37,100,44,37,46,49,102,44,34,37,115,34,44,34,0,0,0,0,0,117,110,115,101,116,32,115,116,121,108,101,32,108,105,110,101,10,0,0,0,0,0,0,0,102,105,108,108,101,100,95,112,111,108,121,103,111,110,51,100,32,99,111,114,110,101,114,115,0,0,0,0,0,0,0,0,32,32,32,112,117,115,104,101,100,32,116,101,114,109,105,110,97,108,32,37,115,32,37,115,10,0,0,0,0,0,0,0,77,79,85,83,69,95,66,85,84,84,79,78,0,0,0,0,84,82,40,37,100,44,37,100,44,37,100,44,37,46,49,102,44,34,37,115,34,44,34,0,105,110,116,101,114,110,97,108,32,101,114,114,111,114,32,58,32,110,111,110,45,83,84,82,73,78,71,32,97,114,103,117,109,101,110,116,0,0,0,0,82,105,103,104,116,0,0,0,108,105,116,116,108,101,0,0,80,116,40,37,100,44,37,100,44,37,100,44,37,46,49,102,41,59,10,0,0,0,0,0,68,111,116,40,37,100,44,37,100,41,59,10,0,0,0,0,82,40,37,100,44,37,100,44,37,100,44,37,100,41,59,10,0,0,0,0,0,0,0,0,99,116,120,46,108,105,110,101,87,105,100,116,104,32,61,32,37,103,59,10,0,0,0,0,99,116,120,46,115,116,114,111,107,101,83,116,121,108,101,32,61,32,34,37,115,34,59,10,0,0,0,0,0,0,0,0,77,101,116,97,102,111,110,116,32,112,108,111,116,116,105,110,103,32,115,116,97,110,100,97,114,100,0,0,0,0,0,0,114,103,98,40,37,48,51,100,44,37,48,51,100,44,37,48,51,100,41,0,0,0,0,0,99,98,114,36,97,110,103,101,0,0,0,0,0,0,0,0,37,115,37,99,0,0,0,0,66,79,84,84,79,77,0,0,101,120,112,101,99,116,105,110,103,32,39,109,101,97,110,39,44,32,39,103,101,111,109,101,97,110,39,44,32,39,109,101,100,105,97,110,39,44,32,39,109,105,110,39,44,32,39,109,97,120,39,44,32,39,99,49,39,44,32,39,99,50,39,44,32,39,99,51,39,32,111,114,32,39,99,52,39,0,0,0,117,115,101,114,115,116,121,108,101,115,0,0,0,0,0,0,114,103,98,40,37,51,100,44,37,51,100,44,37,51,100,41,37,99,0,0,0,0,0,0,114,103,98,97,40,50,53,53,44,50,53,53,44,50,53,53,44,48,46,48,48,41,0,0,114,103,98,97,40,37,49,49,46,49,49,115,44,37,52,46,50,102,41,37,99,0,0,0,68,117,112,108,105,99,97,116,101,100,32,111,114,32,99,111,110,116,114,97,100,105,99,116,105,110,103,32,97,114,103,117,109,101,110,116,115,32,105,110,32,100,97,116,97,102,105,108,101,32,111,112,116,105,111,110,115,0,0,0,0,0,0,0,37,77,0,0,0,0,0,0,99,102,115,112,40,41,59,10,0,0,0,0,0,0,0,0,80,108,111,116,32,116,121,112,101,32,105,115,32,110,101,105,116,104,101,114,32,102,117,110,99,116,105,111,110,32,110,111,114,32,100,97,116,97,0,0,99,102,112,40,41,59,10,0,76,40,37,100,44,32,37,100,41,59,10,0,0,0,0,0,98,112,40,37,100,44,32,37,100,41,59,10,0,0,0,0,99,116,120,46,102,105,108,108,83,116,121,108,101,32,61,32,34,37,115,34,59,10,0,0,109,102,0,0,0,0,0,0,68,84,40,103,110,117,112,108,111,116,46,115,111,108,105,100,41,59,10,0,0,0,0,0,122,114,36,97,110,103,101,0,109,0,0,0,0,0,0,0,84,104,105,115,32,99,111,112,121,32,111,102,32,103,110,117,112,108,111,116,32,99,97,110,110,111,116,32,114,101,97,100,32,112,110,103,47,103,105,102,47,106,112,101,103,32,105,109,97,103,101,115,0,0,0,0,44,32,116,104,101,110,32,0,99,52,0,0,0,0,0,0,115,101,116,32,115,116,121,108,101,32,105,110,99,114,101,109,101,110,116,32,37,115,10,0,77,126,60,62,37,87,61,38,64,0,0,0,0,0,0,0,97,120,105,115,32,114,97,110,103,101,115,32,109,117,115,116,32,98,101,32,97,98,111,118,101,32,48,32,102,111,114,32,108,111,103,32,115,99,97,108,101,33,0,0,0,0,0,0,65,99,101,70,86,63,97,98,100,69,103,104,110,111,112,113,117,0,0,0,0,0,0,0,32,74,84,118,94,95,34,42,121,107,76,115,120,122,0,0,109,105,115,115,105,110,103,32,102,111,114,109,97,116,32,115,116,114,105,110,103,0,0,0,40,41,91,93,123,125,92,0,102,116,114,0,0,0,0,0,106,96,39,44,59,58,33,46,0,0,0,0,0,0,0,0,105,73,108,124,0,0,0,0,99,116,120,46,115,116,114,111,107,101,40,41,59,10,0,0,76,97,84,101,88,32,116,101,120,100,114,97,119,32,101,110,118,105,114,111,110,109,101,110,116,0,0,0,0,0,0,0,99,116,120,46,108,105,110,101,87,105,100,116,104,32,61,32,115,97,118,101,87,105,100,116,104,59,10,125,32,47,47,32,103,114,105,100,95,108,105,110,101,115,10,0,0,0,0,0,121,50,114,36,97,110,103,101,0,0,0,0,0,0,0,0,105,102,32,40,103,110,117,112,108,111,116,46,103,114,105,100,95,108,105,110,101,115,41,32,123,10,118,97,114,32,115,97,118,101,87,105,100,116,104,32,61,32,99,116,120,46,108,105,110,101,87,105,100,116,104,59,10,99,116,120,46,108,105,110,101,87,105,100,116,104,32,61,32,99,116,120,46,108,105,110,101,87,105,100,116,104,32,42,32,48,46,53,59,10,0,0,9,112,109,51,100,32,112,108,111,116,116,101,100,32,97,116,32,0,0,0,0,0,0,0,99,51,0,0,0,0,0,0,32,115,105,122,101,32,37,115,32,37,46,51,102,44,37,46,51,102,44,37,46,51,102,0,125,32,47,47,32,69,110,100,32,37,115,95,112,108,111,116,95,37,100,32,10,0,0,0,115,101,116,32,97,117,116,111,115,99,97,108,101,32,107,101,101,112,102,105,120,0,0,0,105,102,32,40,116,121,112,101,111,102,40,103,110,117,112,108,111,116,46,104,105,100,101,95,37,115,95,112,108,111,116,95,37,100,41,32,61,61,32,34,117,110,100,101,102,105,110,101,100,34,124,124,32,33,103,110,117,112,108,111,116,46,104,105,100,101,95,37,115,95,112,108,111,116,95,37,100,41,32,123,10,0,0,0,0,0,0,0,103,112,0,0,0,0,0,0,102,111,114,109,36,97,116,0,99,116,120,46,99,108,111,115,101,80,97,116,104,40,41,59,10,0,0,0,0,0,0,0,119,105,100,36,116,104,0,0,108,105,36,110,101,119,105,100,116,104,0,0,0,0,0,0,110,111,114,36,111,116,97,116,101,0,0,0,0,0,0,0,115,113,114,116,40,115,113,114,116,40,120,41,41,0,0,0,119,105,110,36,119,111,114,100,54,0,0,0,0,0,0,0,116,101,120,100,114,97,119,0,110,111,102,36,111,110,116,108,105,115,116,0,0,0,0,0,121,114,36,97,110,103,101,0,108,97,36,110,100,115,99,97,112,101,0,0,0,0,0,0,101,120,112,108,105,99,105,116,32,40,100,114,97,119,32,112,109,51,100,32,115,117,114,102,97,99,101,32,97,99,99,111,114,100,105,110,103,32,116,111,32,115,116,121,108,101,41,0,99,50,0,0,0,0,0,0,99,104,97,114,97,99,116,101,114,0,0,0,0,0,0,0,32,120,37,48,50,120,37,48,50,120,37,48,50,120,0,0,96,98,117,105,108,116,105,110,45,97,117,116,111,115,99,97,108,101,96,32,40,115,101,116,32,97,117,116,111,115,99,97,108,101,32,107,101,101,112,102,105,120,59,32,114,101,112,108,111,116,41,0,0,0,0,0,110,111,102,111,110,116,108,105,115,116,0,0,0,0,0,0,37,115,32,37,115,32,37,115,32,37,115,32,37,115,32,119,105,100,116,104,32,37,100,32,108,105,110,101,119,105,100,116,104,32,37,100,32,34,37,115,34,32,37,100,0,0,0,0,79,112,116,105,111,110,115,32,97,114,101,32,100,101,102,97,117,108,116,44,32,115,119,97,112,32,40,115,119,97,98,41,44,32,108,105,116,116,108,101,44,32,98,105,103,44,32,109,105,100,100,108,101,32,40,112,100,112,41,0,0,0,0,0,37,115,44,37,100,0,0,0,105,110,118,97,108,105,100,32,99,111,108,111,114,32,115,112,101,99,44,32,109,117,115,116,32,98,101,32,120,82,82,71,71,66,66,0,0,0,0,0,120,37,50,104,120,37,50,104,120,37,50,104,120,0,0,0,119,105,100,116,104,32,111,117,116,32,111,102,32,114,97,110,103,101,0,0,0,0,0,0,108,105,110,101,119,105,100,116,104,32,111,117,116,32,111,102,32,114,97,110,103,101,0,0,76,97,84,101,88,32,112,105,99,116,117,114,101,32,101,110,118,105,114,111,110,109,101,110,116,32,119,105,116,104,32,80,83,84,114,105,99,107,115,32,109,97,99,114,111,115,0,0,99,103,109,32,112,111,108,121,108,105,110,101,115,0,0,0,120,50,114,36,97,110,103,101,0,0,0,0,0,0,0,0,37,46,51,49,115,44,37,100,0,0,0,0,0,0,0,0,105,109,112,108,105,99,105,116,32,40,112,109,51,100,32,100,114,97,119,32,102,111,114,32,97,108,108,32,115,117,114,102,97,99,101,115,41,0,0,0,99,49,0,0,0,0,0,0,115,99,114,101,101,110,0,0,80,73,67,84,85,82,69,49,0,0,0,0,0,0,0,0,96,98,117,105,108,116,105,110,45,116,111,103,103,108,101,45,98,111,114,100,101,114,96,0,67,71,77,32,102,111,110,116,32,108,105,115,116,0,0,0,71,110,117,112,108,111,116,32,118,101,114,115,105,111,110,32,37,115,32,112,97,116,99,104,108,101,118,101,108,32,37,115,44,32,67,111,109,112,117,116,101,114,32,71,114,97,112,104,105,99,115,32,77,101,116,97,102,105,108,101,32,118,101,114,115,105,111,110,32,49,32,112,101,114,32,77,73,76,45,68,45,50,56,48,48,51,65,47,66,65,83,73,67,45,49,46,37,100,0,0,0,0,0,0,112,100,112,0,0,0,0,0,84,105,109,101,115,32,66,111,108,100,32,79,98,108,105,113,117,101,0,0,0,0,0,0,84,105,109,101,115,32,79,98,108,105,113,117,101,0,0,0,67,111,117,114,105,101,114,32,66,111,108,100,32,73,116,97,108,105,99,0,0,0,0,0,67,111,117,114,105,101,114,32,73,116,97,108,105,99,0,0,72,101,108,118,101,116,105,99,97,32,66,111,108,100,32,73,116,97,108,105,99,0,0,0,112,115,116,114,105,99,107,115,0,0,0,0,0,0,0,0,72,101,108,118,101,116,105,99,97,32,73,116,97,108,105,99,0,0,0,0,0,0,0,0,120,114,36,97,110,103,101,0,49,53,0,0,0,0,0,0,9,112,109,51,100,32,115,116,121,108,101,32,105,115,32,37,115,10,0,0,0,0,0,0,103,114,97,112,104,0,0,0,83,99,114,105,112,116,0,0,96,98,117,105,108,116,105,110,45,114,101,112,108,111,116,96,0,0,0,0,0,0,0,0,90,97,112,102,68,105,110,103,98,97,116,115,0,0,0,0,72,101,114,115,104,101,121,47,83,121,109,98,111,108,95,77,97,116,104,0,0,0,0,0,109,105,100,36,100,108,101,0,72,101,114,115,104,101,121,47,83,121,109,98,111,108,95,83,101,116,95,50,0,0,0,0,72,101,114,115,104,101,121,47,83,121,109,98,111,108,95,83,101,116,95,49,0,0,0,0,76,111,99,97,108,101,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,0,0,0,72,101,114,115,104,101,121,47,71,111,116,104,105,99,95,73,116,97,108,105,97,110,0,0,111,101,69,102,70,103,71,0,99,121,99,108,101,0,0,0,72,101,114,115,104,101,121,47,71,111,116,104,105,99,95,69,110,103,108,105,115,104,0,0,72,101,114,115,104,101,121,47,71,111,116,104,105,99,95,71,101,114,109,97,110,0,0,0,84,80,73,67,32,45,45,32,76,97,84,101,88,32,112,105,99,116,117,114,101,32,101,110,118,105,114,111,110,109,101,110,116,32,119,105,116,104,32,116,112,105,99,32,92,115,112,101,99,105,97,108,115,0,0,0,72,101,114,115,104,101,121,47,84,114,105,112,108,101,120,95,73,116,97,108,105,99,0,0,110,111,99,98,109,116,105,36,99,115,0,0,0,0,0,0,72,101,114,115,104,101,121,47,84,114,105,112,108,101,120,95,82,111,109,97,110,0,0,0,9,112,111,105,110,116,115,105,122,101,32,105,115,32,37,103,10,0,0,0,0,0,0,0,115,101,99,111,110,100,0,0,72,101,114,115,104,101,121,47,68,117,112,108,101,120,95,82,111,109,97,110,0,0,0,0,117,110,115,101,116,32,103,114,105,100,0,0,0,0,0,0,72,101,114,115,104,101,121,47,67,111,109,112,108,101,120,95,67,121,114,105,108,108,105,99,0,0,0,0,0,0,0,0,72,101,114,115,104,101,121,47,67,111,109,112,108,101,120,95,73,116,97,108,105,99,0,0,108,105,116,36,116,108,101,0,107,111,105,56,36,114,0,0,72,101,114,115,104,101,121,47,67,111,109,112,108,101,120,95,83,99,114,105,112,116,0,0,103,116,0,0,0,0,0,0,72,101,114,115,104,101,121,47,67,111,109,112,108,101,120,95,71,114,101,101,107,0,0,0,72,101,114,115,104,101,121,47,67,111,109,112,108,101,120,95,82,111,109,97,110,0,0,0,72,101,114,115,104,101,121,47,83,105,109,112,108,101,120,95,83,99,114,105,112,116,0,0,72,101,114,115,104,101,121,47,83,105,109,112,108,101,120,95,71,114,101,101,107,0,0,0,116,112,105,99,0,0,0,0,72,101,114,115,104,101,121,47,83,105,109,112,108,101,120,95,82,111,109,97,110,0,0,0,99,98,109,116,105,36,99,115,0,0,0,0,0,0,0,0,113,36,117,105,116,0,0,0,72,101,114,115,104,101,121,47,67,97,114,116,111,103,114,97,112,104,105,99,95,71,114,101,101,107,0,0,0,0,0,0,9,112,111,105,110,116,105,110,116,101,114,118,97,108,98,111,120,32,105,115,32,37,103,10,0,0,0,0,0,0,0,0,71,80,86,65,76,95,0,0,102,105,114,115,116,0,0,0,72,101,114,115,104,101,121,47,67,97,114,116,111,103,114,97,112,104,105,99,95,82,111,109,97,110,0,0,0,0,0,0,67,71,77,32,99,111,108,111,114,32,116,97,98,108,101,0,48,32,60,61,32,108,101,110,103,116,104,0,0,0,0,0,115,119,97,98,0,0,0,0,40,48,32,60,61,32,99,103,109,95,105,100,41,32,38,38,32,40,99,103,109,95,105,100,32,60,32,49,50,56,41,0,40,48,32,60,61,32,99,108,97,115,115,41,32,38,38,40,99,108,97,115,115,32,60,49,54,41,0,0,0,0,0,0,118,97,108,117,101,32,60,61,32,51,50,55,54,55,0,0,43,68,65,84,65,83,84,82,73,78,71,83,32,32,43,72,73,83,84,79,71,82,65,77,83,32,32,43,79,66,74,69,67,84,83,32,32,43,83,84,82,73,78,71,86,65,82,83,32,32,43,77,65,67,82,79,83,32,32,43,73,77,65,71,69,32,32,43,85,83,69,82,95,76,73,78,69,84,89,80,69,83,32,43,83,84,65,84,83,32,0,0,0,0,0,0,45,51,50,55,54,56,32,60,61,32,118,97,108,117,101,0,69,69,80,73,67,32,45,45,32,101,120,116,101,110,100,101,100,32,76,97,84,101,88,32,112,105,99,116,117,114,101,32,101,110,118,105,114,111,110,109,101,110,116,0,0,0,0,0,99,111,108,111,117,114,36,0,110,111,122,109,116,105,36,99,115,0,0,0,0,0,0,0,99,111,108,111,114,36,0,0,9,104,111,119,101,118,101,114,32,76,67,95,67,84,89,80,69,32,105,110,32,99,117,114,114,101,110,116,32,108,111,99,97,108,101,32,105,115,32,37,115,10,0,0,0,0,0,0,103,101,111,109,101,97,110,0,37,115,32,34,37,115,34,32,37,100,44,37,48,46,49,102,44,37,48,46,49,102,44,37,48,46,49,102,0,0,0,0,96,98,117,105,108,116,105,110,45,116,111,103,103,108,101,45,103,114,105,100,96,0,0,0,83,119,105,116,122,101,114,108,97,110,100,76,105,103,104,116,0,0,0,0,0,0,0,0,37,37,33,80,83,45,65,100,111,98,101,45,50,46,48,32,69,80,83,70,45,49,46,50,10,37,37,37,37,66,111,117,110,100,105,110,103,66,111,120,58,32,37,100,32,37,100,32,37,100,32,37,100,10,37,37,37,37,84,101,109,112,108,97,116,101,66,111,120,58,32,37,100,32,37,100,32,37,100,32,37,100,10,37,37,37,37,69,110,100,67,111,109,109,101,110,116,115,10,37,37,37,37,69,110,100,80,114,111,108,111,103,10,37,37,37,37,66,101,103,105,110,83,101,116,117,112,10,37,37,37,37,69,110,100,83,101,116,117,112,10,0,0,0,115,119,97,112,0,0,0,0,32,37,115,32,112,97,116,116,101,114,110,32,37,100,32,0,37,48,46,50,102,32,37,48,46,50,102,32,109,10,0,0,110,111,115,117,114,36,102,97,99,101,0,0,0,0,0,0,83,10,37,46,50,102,32,37,46,50,102,32,109,10,0,0,115,36,109,111,111,116,104,0,37,46,50,102,32,37,46,50,102,32,108,10,0,0,0,0,110,111,32,72,79,77,69,32,102,111,117,110,100,0,0,0,101,120,116,101,110,100,95,97,116,0,0,0,0,0,0,0,91,50,32,50,32,50,32,50,32,50,32,50,32,50,32,52,93,32,48,32,100,10,50,32,106,10,48,32,71,10,0,0,48,46,53,32,48,46,53,32,48,46,53,32,48,32,75,10,0,0,0,0,0,0,0,0,102,117,110,99,116,105,111,110,32,100,101,102,105,110,105,116,105,111,110,32,101,120,112,101,99,116,101,100,0,0,0,0,101,101,112,105,99,0,0,0,91,50,32,50,32,50,32,50,32,50,32,52,93,32,48,32,100,10,50,32,106,10,48,32,71,10,0,0,0,0,0,0,122,109,116,105,36,99,115,0,73,110,115,101,114,116,0,0,48,32,48,46,55,32,49,32,48,32,75,10,0,0,0,0,9,110,111,109,105,110,97,108,32,99,104,97,114,97,99,116,101,114,32,101,110,99,111,100,105,110,103,32,105,115,32,37,115,10,0,0,0,0,0,0,91,50,32,50,32,50,32,52,93,32,48,32,100,10,50,32,106,10,48,32,71,10,0,0,102,111,110,116,112,97,116,104,95,102,117,108,108,110,97,109,101,58,32,78,111,32,80,105,112,101,32,97,108,108,111,119,101,100,0,0,0,0,0,0,96,98,117,105,108,116,105,110,45,104,101,108,112,96,0,0,91,52,32,51,32,49,32,51,93,32,48,32,100,10,50,32,106,10,48,32,71,10,0,0,105,110,116,101,114,110,97,108,32,101,114,114,111,114,32,58,32,110,111,110,45,73,78,84,71,82,32,97,114,103,117,109,101,110,116,0,0,0,0,0,48,32,48,32,49,32,48,32,75,10,0,0,0,0,0,0,91,53,32,50,32,49,32,50,93,32,48,32,100,10,50,32,106,10,48,32,71,10,0,0,49,32,48,32,48,32,48,32,75,10,0,0,0,0,0,0,37,102,32,119,10,0,0,0,91,49,32,49,46,53,93,32,48,32,100,10,50,32,106,10,48,32,71,10,0,0,0,0,48,32,49,32,48,32,48,32,75,10,0,0,0,0,0,0,112,108,97,105,110,32,84,101,88,32,119,105,116,104,32,80,111,115,116,83,99,114,105,112,116,32,92,115,112,101,99,105,97,108,115,0,0,0,0,0,91,50,32,51,93,32,48,32,100,10,50,32,106,10,48,32,71,10,0,0,0,0,0,0,110,111,121,50,109,116,105,36,99,115,0,0,0,0,0,0,48,32,49,32,49,32,48,32,75,10,0,0,0,0,0,0,9,100,101,103,114,101,101,32,115,105,103,110,32,102,111,114,32,111,117,116,112,117,116,32,105,115,32,37,115,32,10,0,68,101,112,114,101,99,97,116,101,100,32,115,121,110,116,97,120,32,45,45,45,32,105,103,110,111,114,101,100,0,0,0,91,52,32,50,93,32,48,32,100,10,50,32,106,10,48,32,71,10,0,0,0,0,0,0,67,97,110,110,111,116,32,116,111,103,103,108,101,32,108,111,103,32,115,99,97,108,101,32,102,111,114,32,118,111,108,97,116,105,108,101,32,100,97,116,97,0,0,0,0,0,0,0,49,32,49,32,48,32,48,32,75,10,0,0,0,0,0,0,91,93,32,48,32,100,10,50,32,106,10,48,32,71,10,0,101,110,100,36,105,97,110,0,49,32,48,32,49,32,48,32,75,10,0,0,0,0,0,0,91,49,32,50,93,32,48,32,100,10,48,32,106,10,48,32,71,10,0,0,0,0,0,0,104,105,100,100,101,110,32,115,111,114,116,32,101,100,103,101,115,0,0,0,0,0,0,0,117,110,100,101,102,105,110,101,100,32,102,117,110,99,116,105,111,110,58,32,37,115,0,0,91,93,32,48,32,100,10,48,32,106,10,48,32,71,10,0,48,32,48,32,48,32,49,32,75,10,0,0,0,0,0,0,37,46,50,102,32,119,10,0,112,115,116,101,120,0,0,0,41,116,10,84,10,0,0,0,121,50,109,116,105,36,99,115,0,0,0,0,0,0,0,0,91,48,32,49,32,45,49,32,48,32,37,46,50,102,32,37,46,50,102,93,101,10,48,32,103,10,0,0,0,0,0,0,9,100,101,99,105,109,97,108,115,105,103,110,32,102,111,114,32,111,117,116,112,117,116,32,104,97,115,32,100,101,102,97,117,108,116,32,118,97,108,117,101,32,40,110,111,114,109,97,108,108,121,32,39,46,39,41,10,0,0,0,0,0,0,0,91,49,32,48,32,48,32,49,32,37,46,50,102,32,37,46,50,102,93,101,10,48,32,103,10,0,0,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,102,108,117,115,104,32,39,98,101,103,105,110,39,44,32,39,99,101,110,116,101,114,39,32,111,114,32,39,101,110,100,39,0,0,0,0,0,0,32,37,115,32,37,115,32,37,115,0,0,0,0,0,0,0,82,97,115,116,101,114,65,120,101,115,0,0,0,0,0,0,96,98,117,105,108,116,105,110,45,116,111,103,103,108,101,45,108,111,103,96,32,121,32,108,111,103,115,99,97,108,101,32,102,111,114,32,112,108,111,116,115,44,32,122,32,97,110,100,32,99,98,32,102,111,114,32,115,112,108,111,116,115,0,0,47,95,37,115,32,37,100,32,37,100,32,48,32,50,32,122,10,0,0,0,0,0,0,0,47,95,37,115,32,37,100,32,37,100,32,48,32,49,32,122,10,0,0,0,0,0,0,0,115,107,105,112,0,0,0,0,86,105,115,105,98,108,101,32,112,105,120,101,108,32,103,114,105,100,32,104,97,115,32,97,32,115,99,97,110,32,108,105,110,101,32,115,104,111,114,116,101,114,32,116,104,97,110,32,112,114,101,118,105,111,117,115,32,115,99,97,110,32,108,105,110,101,115,46,0,0,0,0,47,95,37,115,32,37,100,32,37,100,32,48,32,48,32,122,10,0,0,0,0,0,0,0,83,10,0,0,0,0,0,0,110,111,101,36,110,104,97,110,99,101,100,0,0,0,0,0,110,111,102,36,101,101,100,0,102,36,101,101,100,0,0,0,76,97,84,101,88,32,112,105,99,116,117,114,101,32,101,110,118,105,114,111,110,109,101,110,116,32,119,105,116,104,32,80,111,115,116,83,99,114,105,112,116,32,92,115,112,101,99,105,97,108,115,0,0,0,0,0,37,115,102,101,101,100,32,37,115,32,115,105,122,101,32,37,100,44,32,37,100,0,0,0,110,111,121,109,116,105,36,99,115,0,0,0,0,0,0,0,100,117,109,98,32,116,101,114,109,105,110,97,108,0,0,0,9,100,101,99,105,109,97,108,115,105,103,110,32,102,111,114,32,111,117,116,112,117,116,32,105,115,32,37,115,32,10,0,101,36,110,100,0,0,0,0,32,32,48,10,69,78,68,83,69,67,10,32,32,48,10,69,79,70,10,0,0,0,0,0,115,101,116,32,108,111,103,32,121,50,0,0,0,0,0,0,55,0,0,0,0,0,0,0,32,32,48,10,69,78,68,84,65,66,10,48,10,69,78,68,83,69,67,10,32,32,48,10,83,69,67,84,73,79,78,10,32,32,50,10,66,76,79,67,75,83,10,32,32,48,10,69,78,68,83,69,67,10,32,32,48,10,83,69,67,84,73,79,78,10,32,32,50,10,69,78,84,73,84,73,69,83,10,0,75,101,121,32,119,111,114,100,32,96,112,101,114,112,101,110,100,105,99,117,108,97,114,96,32,105,115,32,110,111,116,32,97,108,108,111,119,101,100,32,119,105,116,104,32,96,112,108,111,116,96,32,99,111,109,109,97,110,100,0,0,0,0,0,32,32,48,10,76,65,89,69,82,10,32,32,50,10,37,115,10,32,55,48,10,32,32,32,54,52,10,54,50,10,32,32,32,37,115,10,32,32,54,10,37,115,10,0,0,0,0,0,32,32,48,10,84,65,66,76,69,10,32,32,50,10,76,65,89,69,82,10,32,55,48,10,32,32,32,37,45,100,10,0,32,32,48,10,80,79,76,89,76,73,78,69,10,32,32,56,10,37,115,10,32,54,54,10,32,32,32,49,10,32,32,54,10,37,115,10,32,32,48,10,86,69,82,84,69,88,10,32,32,56,10,37,115,10,32,32,54,10,37,115,10,32,49,48,10,37,45,54,46,51,102,10,32,50,48,10,37,45,54,46,51,102,10,32,51,48,10,48,46,48,48,48,10,0,0,0,68,65,83,72,68,79,84,0,115,113,114,116,32,115,113,114,116,0,0,0,0,0,0,0,68,79,84,0,0,0,0,0,112,115,108,97,116,101,120,0,80,72,65,78,84,79,77,0,121,109,116,105,36,99,115,0,67,69,78,84,69,82,0,0,9,100,101,99,105,109,97,108,115,105,103,110,32,102,111,114,32,105,110,112,117,116,32,105,115,32,32,37,115,32,10,0,98,36,101,103,105,110,0,0,115,101,116,32,97,114,114,111,119,32,37,100,32,102,114,111,109,32,0,0,0,0,0,0,72,73,68,68,69,78,0,0,117,110,115,101,116,32,108,111,103,32,121,50,0,0,0,0,68,65,83,72,69,68,0,0,67,79,78,84,73,78,85,79,85,83,0,0,0,0,0,0,112,101,114,112,36,101,110,100,105,99,117,108,97,114,0,0,32,32,48,10,86,69,82,84,69,88,10,32,32,56,10,37,115,10,32,32,54,10,37,115,10,32,32,49,48,10,37,45,54,46,51,102,10,32,32,50,48,10,37,45,54,46,51,102,10,32,32,51,48,10,48,46,48,48,48,10,0,0,0,0,53,0,0,0,0,0,0,0,52,0,0,0,0,0,0,0,50,0,0,0,0,0,0,0,76,97,84,101,88,32,112,105,99,116,117,114,101,32,101,110,118,105,114,111,110,109,101,110,116,32,117,115,105,110,103,32,103,114,97,112,104,105,99,120,32,112,97,99,107,97,103,101,0,0,0,0,0,0,0,0,49,0,0,0,0,0,0,0,110,111,120,50,109,116,105,36,99,115,0,0,0,0,0,0,83,84,65,78,68,65,82,68,0,0,0,0,0,0,0,0,78,111,32,102,117,114,116,104,101,114,32,111,112,116,105,111,110,115,32,97,108,108,111,119,101,100,32,97,102,116,101,114,32,39,100,101,102,97,117,108,116,115,39,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,115,116,101,112,32,118,97,108,117,101,115,32,105,44,106,0,0,0,0,0,0,0,117,110,115,101,116,32,97,114,114,111,119,10,0,0,0,0,32,55,50,10,37,100,10,32,49,49,10,37,45,54,46,51,102,10,32,50,49,10,37,45,54,46,51,102,10,32,51,49,10,48,46,48,48,48,10,0,115,101,116,32,108,111,103,32,120,50,0,0,0,0,0,0,32,49,48,10,37,45,54,46,51,102,10,32,50,48,10,37,45,54,46,51,102,10,32,51,48,10,48,46,48,48,48,10,32,52,48,10,37,45,54,46,51,102,10,32,32,49,10,37,115,10,32,53,48,10,37,45,54,46,51,102,10,32,32,55,10,37,115,10,0,0,0,0,32,32,48,10,84,69,88,84,10,32,32,56,10,37,115,10,0,0,0,0,0,0,0,0,32,32,48,10,83,69,81,69,78,68,10,0,0,0,0,0,38,35,120,37,50,46,50,120,59,0,0,0,0,0,0,0,123,125,94,95,64,38,126,0,32,98,97,99,107,103,114,111,117,110,100,32,34,35,37,48,54,120,34,0,0,0,0,0,32,100,97,115,104,108,101,110,103,116,104,32,37,46,49,102,0,0,0,0,0,0,0,0,101,112,115,108,97,116,101,120,0,0,0,0,0,0,0,0,32,108,119,32,37,46,49,102,0,0,0,0,0,0,0,0,120,50,109,116,105,36,99,115,0,0,0,0,0,0,0,0,114,111,116,36,97,116,105,111,110,0,0,0,0,0,0,0,32,115,105,122,101,32,37,100,44,37,100,32,0,0,0,0,9,108,111,103,45,102,105,108,101,32,102,111,114,32,102,105,116,115,32,105,115,32,117,110,99,104,97,110,103,101,100,32,102,114,111,109,32,116,104,101,32,101,110,118,105,114,111,110,109,101,110,116,32,100,101,102,97,117,108,116,32,111,102,10,9,39,37,115,39,10,0,0,32,112,111,105,110,116,0,0,32,102,111,110,116,115,99,97,108,101,32,37,46,49,102,0,117,110,115,101,116,32,108,111,103,32,120,50,0,0,0,0,32,101,110,104,97,110,99,101,100,32,0,0,0,0,0,0,37,115,32,37,115,32,37,115,32,102,111,110,116,32,34,37,115,44,37,103,34,0,0,0,99,111,110,116,111,117,114,32,112,111,108,121,103,111,110,0,37,103,0,0,0,0,0,0,110,111,112,114,111,36,112,111,114,116,105,111,110,97,108,0,98,97,99,107,36,103,114,111,117,110,100,0,0,0,0,0,66,97,100,32,102,111,114,109,97,116,32,99,104,97,114,97,99,116,101,114,0,0,0,0,100,101,36,102,97,117,108,116,0,0,0,0,0,0,0,0,101,120,116,114,97,110,101,111,117,115,32,97,114,103,117,109,101,110,116,115,32,116,111,32,117,110,115,101,116,32,114,101,99,116,97,110,103,108,101,0,116,101,114,109,111,112,116,36,105,111,110,0,0,0,0,0,101,109,102,95,109,111,118,101,58,32,40,37,100,44,37,100,41,32,111,117,116,32,111,102,32,114,97,110,103,101,0,0,76,97,84,101,88,32,112,105,99,116,117,114,101,32,101,110,118,105,114,111,110,109,101,110,116,32,119,105,116,104,32,101,109,84,101,88,32,115,112,101,99,105,97,108,115,0,0,0,110,111,120,109,116,105,36,99,115,0,0,0,0,0,0,0,101,109,102,95,115,111,108,105,100,95,118,101,99,116,111,114,58,32,40,37,100,44,37,100,41,32,111,117,116,32,111,102,32,114,97,110,103,101,0,0,9,108,111,103,45,102,105,108,101,32,102,111,114,32,102,105,116,115,32,105,115,32,119,97,115,32,115,101,116,32,98,121,32,116,104,101,32,117,115,101,114,32,116,111,32,98,101,32,10,9,39,37,115,39,10,0,10,9,100,117,109,109,121,32,118,97,114,105,97,98,108,101,32,105,115,32,116,32,102,111,114,32,99,117,114,118,101,115,10,0,0,0,0,0,0,0,105,99,111,110,118,32,102,97,105,108,101,100,0,0,0,0,115,101,116,32,108,111,103,32,121,0,0,0,0,0,0,0,105,99,111,110,118,95,111,112,101,110,32,102,97,105,108,101,100,0,0,0,0,0,0,0,85,84,70,45,49,54,76,69,0,0,0,0,0,0,0,0,99,112,52,36,51,55,0,0,83,104,105,102,116,95,74,73,83,0,0,0,0,0,0,0,32,34,37,115,34,10,0,0,85,84,70,45,56,0,0,0,105,99,111,110,118,32,115,116,114,105,110,103,0,0,0,0,32,83,116,114,105,107,101,79,117,116,0,0,0,0,0,0,32,83,116,114,105,107,101,111,117,116,0,0,0,0,0,0,101,109,116,101,120,0,0,0,32,115,116,114,105,107,101,111,117,116,0,0,0,0,0,0,120,109,116,105,36,99,115,0,112,119,100,0,0,0,0,0,32,85,110,100,101,114,108,105,110,101,0,0,0,0,0,0,32,110,111,116,0,0,0,0,117,110,114,101,99,111,103,110,105,122,101,100,32,111,98,106,101,99,116,32,116,121,112,101,0,0,0,0,0,0,0,0,32,117,110,100,101,114,108,105,110,101,0,0,0,0,0,0,117,110,115,101,116,32,108,111,103,32,121,0,0,0,0,0,101,109,102,95,100,97,115,104,101,100,95,118,101,99,116,111,114,58,32,40,37,100,44,37,100,41,32,111,117,116,32,111,102,32,114,97,110,103,101,0,32,105,46,44,59,58,124,33,39,0,0,0,0,0,0,0,111,114,105,103,36,105,110,0,109,119,60,62,0,0,0,0,32,105,106,108,46,44,59,58,124,33,40,41,91,93,73,45,39,0,0,0,0,0,0,0,118,36,101,114,115,105,111,110,0,0,0,0,0,0,0,0,43,85,83,69,95,77,79,85,83,69,32,32,0,0,0,0,116,101,120,116,115,36,112,101,99,105,97,108,0,0,0,0,116,101,120,116,114,36,105,103,105,100,0,0,0,0,0,0,76,97,84,101,88,32,112,105,99,116,117,114,101,32,101,110,118,105,114,111,110,109,101,110,116,0,0,0,0,0,0,0,116,101,120,116,110,36,111,114,109,97,108,0,0,0,0,0,110,111,99,98,100,116,105,36,99,115,0,0,0,0,0,0,114,116,0,0,0,0,0,0,116,101,120,116,104,36,105,100,100,101,110,0,0,0,0,0,9,102,105,116,32,119,105,108,108,37,115,32,112,108,97,99,101,32,112,97,114,97,109,101,116,101,114,32,101,114,114,111,114,115,32,105,110,32,118,97,114,105,97,98,108,101,115,10,0,0,0,0,0,0,0,0,117,110,107,110,111,119,110,32,111,98,106,101,99,116,0,0,116,36,104,105,99,107,110,101,115,115,0,0,0,0,0,0,115,101,116,32,108,111,103,32,120,0,0,0,0,0,0,0,115,109,36,97,108,108,0,0,112,111,114,36,116,114,97,105,116,0,0,0,0,0,0,0,116,114,97,110,115,36,112,111,115,101,0,0,0,0,0,0,112,111,105,36,110,116,115,109,97,120,0,0,0,0,0,0,109,101,36,116,114,105,99,0,110,111,99,111,110,36,116,111,117,114,115,0,0,0,0,0,35,32,32,32,32,69,79,70,10,0,0,0,0,0,0,0,102,36,111,110,116,115,105,122,101,0,0,0,0,0,0,0,72,79,77,69,0,0,0,0,101,120,112,101,99,116,105,110,103,32,39,58,39,0,0,0,100,101,36,112,116,104,0,0,98,36,105,103,0,0,0,0,102,117,110,99,116,105,111,110,32,99,111,110,116,97,105,110,115,32,116,111,111,32,109,97,110,121,32,112,97,114,97,109,101,116,101,114,115,0,0,0,108,97,116,101,120,0,0,0,32,115,105,122,101,32,37,102,32,37,102,0,0,0,0,0,99,98,100,116,105,36,99,115,0,0,0,0,0,0,0,0,83,121,115,95,82,101,113,0,32,115,105,122,101,32,37,100,32,37,100,0,0,0,0,0,79,70,70,0,0,0,0,0,112,111,108,121,36,103,111,110,0,0,0,0,0,0,0,0,118,101,114,115,105,111,110,0,108,111,97,100,112,97,116,104,95,102,111,112,101,110,0,0,117,110,115,101,116,32,108,111,103,32,120,0,0,0,0,0,100,101,112,116,104,0,0,0,109,101,116,114,105,99,0,0,115,99,97,110,0,0,0,0,105,110,99,104,101,115,0,0,112,111,105,110,116,115,109,97,120,0,0,0,0,0,0,0,115,109,97,108,108,0,0,0,98,105,103,0,0,0,0,0,37,115,32,37,115,32,37,115,32,37,100,32,37,115,32,37,115,32,37,115,37,115,32,37,115,32,34,37,115,44,37,100,34,32,37,115,32,37,100,32,37,115,32,37,100,32,37,115,32,37,115,0,0,0,0,0,84,107,47,84,99,108,32,99,97,110,118,97,115,32,119,105,100,103,101,116,32,91,112,101,114,108,116,107,93,32,91,105,110,116,101,114,97,99,116,105,118,101,93,0,0,0,0,0,32,116,101,120,116,114,105,103,105,100,0,0,0,0,0,0,110,111,122,100,116,105,36,99,115,0,0,0,0,0,0,0,32,116,101,120,116,104,105,100,100,101,110,0,0,0,0,0,79,78,0,0,0,0,0,0,32,114,111,116,97,116,101,32,98,121,32,37,100,0,0,0,32,116,101,120,116,115,112,101,99,105,97,108,0,0,0,0,115,101,116,32,108,111,103,32,122,0,0,0,0,0,0,0,37,115,37,115,37,115,0,0,32,116,101,120,116,110,111,114,109,97,108,0,0,0,0,0,110,111,102,108,105,112,0,0,37,72,0,0,0,0,0,0,119,114,111,110,103,32,118,101,114,115,105,111,110,32,110,117,109,98,101,114,44,32,109,117,115,116,32,98,101,32,51,46,49,32,111,114,32,51,46,50,0,0,0,0,0,0,0,0,104,105,100,100,101,110,32,115,111,114,116,97,114,114,97,121,0,0,0,0,0,0,0,0,118,101,114,115,105,111,110,58,32,51,46,49,32,111,114,32,51,46,50,32,101,120,112,101,99,116,101,100,0,0,0,0,112,111,105,110,116,115,109,97,120,58,32,110,117,109,98,101,114,32,111,117,116,32,111,102,32,114,97,110,103,101,32,40,50,44,37,108,100,41,0,0,109,97,120,46,32,112,111,105,110,116,115,32,112,101,114,32,112,111,108,121,108,105,110,101,58,32,110,117,109,98,101,114,32,101,120,112,101,99,116,101,100,0,0,0,0,0,0,0,100,101,112,116,104,32,111,117,116,32,111,102,32,114,97,110,103,101,0,0,0,0,0,0,116,107,99,97,110,118,97,115,0,0,0,0,0,0,0,0,100,101,112,116,104,58,32,110,117,109,98,101,114,32,101,120,112,101,99,116,101,100,0,0,122,100,116,105,36,99,115,0,116,104,105,99,107,110,101,115,115,32,111,117,116,32,111,102,32,114,97,110,103,101,0,0,9,112,111,108,97,114,32,105,115,32,37,115,10,0,0,0,116,104,105,99,107,110,101,115,115,58,32,110,117,109,98,101,114,32,101,120,112,101,99,116,101,100,0,0,0,0,0,0,117,110,115,101,116,32,108,111,103,32,122,0,0,0,0,0,115,105,122,101,58,32,50,32,110,117,109,98,101,114,115,32,101,120,112,101,99,116,101,100,0,0,0,0,0,0,0,0,80,83,105,122,101,95,50,0,83,105,110,103,108,101,0,0,102,108,105,112,0,0,0,0,86,105,115,105,98,108,101,32,112,105,120,101,108,32,103,114,105,100,32,104,97,115,32,97,32,115,99,97,110,32,108,105,110,101,32,108,111,110,103,101,114,32,116,104,97,110,32,112,114,101,118,105,111,117,115,32,115,99,97,110,32,108,105,110,101,115,46,0,0,0,0,0,65,52,0,0,0,0,0,0,76,101,116,116,101,114,0,0,35,70,73,71,32,51,46,50,10,37,115,10,37,115,10,37,115,10,37,115,10,37,54,46,50,102,10,37,115,10,37,100,10,37,100,32,37,100,10,0,51,46,50,0,0,0,0,0,77,101,116,114,105,99,0,0,84,71,73,70,32,88,49,49,32,91,109,111,100,101,93,32,91,120,44,121,93,32,91,100,97,115,104,101,100,93,32,91,34,102,111,110,116,34,32,91,102,111,110,116,115,105,122,101,93,93,0,0,0,0,0,0,73,110,99,104,101,115,0,0,110,111,121,50,100,116,105,36,99,115,0,0,0,0,0,0,67,101,110,116,101,114,0,0,100,101,103,114,101,101,115,10,0,0,0,0,0,0,0,0,115,101,116,32,108,97,98,101,108,32,37,100,32,34,37,115,34,32,97,116,32,0,0,0,35,70,73,71,32,51,46,49,10,37,115,10,37,115,10,37,115,10,37,100,32,37,100,10,0,0,0,0,0,0,0,0,115,101,116,32,108,111,103,32,99,98,0,0,0,0,0,0,51,46,49,0,0,0,0,0,70,73,71,95,112,111,105,110,116,115,0,0,0,0,0,0,102,108,105,112,122,0,0,0,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,54,46,51,102,32,37,54,46,51,102,32,37,100,32,37,54,46,51,102,32,37,54,46,51,102,32,37,100,32,37,100,32,37,115,92,48,48,49,10,0,0,0,0,0,0,70,73,71,32,116,101,120,116,0,0,0,0,0,0,0,0,52,10,9,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,10,0,0,0,0,0,53,10,9,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,10,0,0,0,0,0,0,0,115,113,114,116,40,120,41,0,50,32,51,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,54,46,51,102,32,48,32,48,32,48,32,48,32,48,32,0,0,0,0,0,0,0,116,103,105,102,0,0,0,0,49,32,51,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,54,46,51,102,32,49,32,48,46,48,48,48,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,10,0,121,50,100,116,105,36,99,115,0,0,0,0,0,0,0,0,37,100,32,37,100,32,37,100,32,37,100,10,0,0,0,0,114,97,100,105,97,110,115,10,0,0,0,0,0,0,0,0,37,100,32,37,100,32,37,46,51,102,32,37,46,51,102,32,37,46,51,102,10,0,0,0,115,97,109,112,108,105,110,103,32,114,97,116,101,32,109,117,115,116,32,98,101,32,62,32,49,59,32,115,97,109,112,108,105,110,103,32,117,110,99,104,97,110,103,101,100,0,0,0,117,110,115,101,116,32,108,97,98,101,108,10,0,0,0,0,114,101,99,116,0,0,0,0,117,110,115,101,116,32,108,111,103,32,99,98,0,0,0,0,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,57,46,51,102,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,10,0,0,0,0,0,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,54,46,51,102,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,10,32,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,10,0,0,0,0,0,77,117,115,116,32,115,112,101,99,105,102,121,32,97,32,115,97,109,112,108,105,110,103,32,97,114,114,97,121,32,115,105,122,101,32,98,101,102,111,114,101,32,105,110,100,105,99,97,116,105,110,103,32,102,108,105,112,32,105,110,32,115,101,99,111,110,100,32,100,105,109,101,110,115,105,111,110,0,0,0,102,105,103,58,32,65,116,116,101,109,112,116,32,116,111,32,115,101,116,32,112,97,108,101,116,116,101,32,116,119,105,99,101,10,0,0,0,0,0,0,37,100,32,37,100,32,35,37,50,46,50,120,37,50,46,50,120,37,50,46,50,120,10,0,77,111,110,111,99,104,114,111,109,101,32,102,105,103,32,102,105,108,101,58,32,117,115,105,110,103,32,103,114,97,121,32,112,97,108,101,116,116,101,32,105,110,115,116,101,97,100,32]) -.concat([111,102,32,99,111,108,111,114,10,0,0,0,0,0,0,0,102,105,103,58,32,80,97,108,101,116,116,101,32,117,115,101,100,32,98,101,102,111,114,101,32,115,101,116,10,0,0,0,32,37,100,32,37,100,0,0,87,51,67,32,83,99,97,108,97,98,108,101,32,86,101,99,116,111,114,32,71,114,97,112,104,105,99,115,32,100,114,105,118,101,114,0,0,0,0,0,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,57,46,51,102,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,108,100,10,9,0,0,0,110,111,121,100,116,105,36,99,115,0,0,0,0,0,0,0,45,54,10,0,0,0,0,0,9,65,110,103,108,101,115,32,97,114,101,32,105,110,32,0,73,108,108,101,103,97,108,32,118,97,108,117,101,32,102,111,114,32,115,105,122,101,0,0,117,110,115,101,116,32,107,101,121,10,0,0,0,0,0,0,35,32,69,110,100,32,112,108,111,116,32,35,37,100,10,0,96,98,117,105,108,116,105,110,45,110,101,97,114,101,115,116,45,108,111,103,96,32,116,111,103,103,108,101,32,108,111,103,115,99,97,108,101,32,111,102,32,97,120,105,115,32,110,101,97,114,101,115,116,32,99,117,114,115,111,114,0,0,0,0,35,32,66,101,103,105,110,32,112,108,111,116,32,35,37,100,10,0,0,0,0,0,0,0,32,37,100,32,37,100,32,37,100,32,37,100,10,0,0,0,102,108,105,112,121,0,0,0,54,0,0,0,0,0,0,0,78,101,101,100,32,50,32,116,111,32,55,32,117,115,105,110,103,32,115,112,101,99,115,0,27,42,109,112,49,109,50,97,50,81,0,0,0,0,0,0,27,42,100,101,84,0,0,0,27,42,100,97,102,108,115,67,0,0,0,0,0,0,0,0,27,42,112,0,0,0,0,0,81,77,83,47,81,85,73,67,32,76,97,115,101,114,32,112,114,105,110,116,101,114,32,40,97,108,115,111,32,84,97,108,97,114,105,115,32,49,50,48,48,32,97,110,100,32,111,116,104,101,114,115,41,0,0,0,27,42,109,37,100,66,0,0,121,100,116,105,36,99,115,0,27,42,100,84,0,0,0,0,9,115,97,109,112,108,105,110,103,32,114,97,116,101,32,105,115,32,37,100,44,32,37,100,10,0,0,0,0,0,0,0,110,111,115,113,36,117,97,114,101,0,0,0,0,0,0,0,115,101,116,32,107,101,121,32,37,115,111,112,97,113,117,101,10,0,0,0,0,0,0,0,72,80,50,54,0,0,0,0,116,117,114,110,105,110,103,32,109,111,117,115,101,32,111,102,102,46,10,0,0,0,0,0,37,100,44,37,100,79,0,0,37,100,44,37,100,80,0,0,102,108,105,112,120,0,0,0,27,42,100,0,0,0,0,0,27,42,109,37,100,78,0,0,9,102,111,110,116,112,97,116,104,32,105,115,32,101,109,112,116,121,10,0,0,0,0,0,27,42,109,49,109,49,110,49,51,54,44,49,99,90,0,0,120,50,94,123,37,100,125,0,27,42,100,97,99,90,0,0,105,110,118,97,108,105,100,32,97,120,105,115,0,0,0,0,27,42,112,97,102,37,100,44,37,100,90,0,0,0,0,0,113,109,115,0,0,0,0,0,27,42,112,98,102,37,100,44,37,100,90,0,0,0,0,0,110,111,120,50,100,116,105,36,99,115,0,0,0,0,0,0,27,42,109,37,100,98,90,0,9,105,115,111,32,115,97,109,112,108,105,110,103,32,114,97,116,101,32,105,115,32,37,100,44,32,37,100,10,0,0,0,110,111,114,97,36,116,105,111,0,0,0,0,0,0,0,0,10,115,101,116,32,107,101,121,32,109,97,120,99,111,108,117,109,110,115,32,37,100,32,109,97,120,114,111,119,115,32,37,100,0,0,0,0,0,0,0,27,42,108,37,115,10,0,0,116,117,114,110,105,110,103,32,109,111,117,115,101,32,111,110,46,10,0,0,0,0,0,0,27,42,109,37,100,110,90,10,0,0,0,0,0,0,0,0,110,111,101,106,101,99,116,0,120,95,109,105,110,51,100,32,115,104,111,117,108,100,32,110,111,116,32,101,113,117,97,108,32,120,95,109,97,120,51,100,33,0,0,0,0,0,0,0,67,117,114,114,101,110,116,108,121,32,110,111,116,32,115,117,112,112,111,114,116,105,110,103,32,116,104,114,101,101,45,100,105,109,101,110,115,105,111,110,97,108,32,115,97,109,112,108,105,110,103,0,0,0,0,0,105,115,111,36,95,56,56,53,57,95,49,0,0,0,0,0,101,106,101,99,116,0,0,0,32,116,121,112,101,10,0,0,37,100,32,112,101,110,115,32,37,115,0,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,34,101,106,101,99,116,34,32,111,114,32,110,117,109,98,101,114,32,111,102,32,112,101,110,115,0,0,0,0,0,78,117,109,98,101,114,32,111,102,32,112,101,110,115,32,109,117,115,116,32,98,101,32,112,111,115,105,116,105,118,101,0,101,106,101,36,99,116,0,0,80,111,115,116,83,99,114,105,112,116,32,103,114,97,112,104,105,99,115,44,32,105,110,99,108,117,100,105,110,103,32,69,80,83,70,32,101,109,98,101,100,100,101,100,32,102,105,108,101,115,32,40,42,46,101,112,115,41,0,0,0,0,0,0,80,85,83,80,48,59,80,71,59,27,46,90,10,0,0,0,120,50,100,116,105,36,99,115,0,0,0,0,0,0,0,0,112,114,36,105,110,116,0,0,80,85,83,80,48,59,27,46,90,10,0,0,0,0,0,0,105,110,100,101,112,101,110,100,101,110,116,108,121,32,115,99,97,108,101,100,0,0,0,0,114,97,36,116,105,111,0,0,112,114,101,36,102,105,120,0,10,115,101,116,32,107,101,121,32,37,115,105,110,118,101,114,116,32,115,97,109,112,108,101,110,32,37,103,32,115,112,97,99,105,110,103,32,37,103,32,119,105,100,116,104,32,37,103,32,104,101,105,103,104,116,32,37,103,32,0,0,0,0,0,67,65,55,59,0,0,0,0,96,98,117,105,108,116,105,110,45,116,111,103,103,108,101,45,109,111,117,115,101,96,0,0,73,78,59,37,115,10,83,67,48,44,37,100,44,48,44,37,100,59,10,83,82,37,102,44,37,102,59,10,0,0,0,0,27,46,89,10,27,46,73,56,49,59,59,49,55,58,27,46,78,59,49,57,58,27,46,77,53,48,48,58,10,0,0,0,100,122,0,0,0,0,0,0,80,85,59,80,65,37,100,44,37,100,59,10,0,0,0,0,80,65,37,100,44,37,100,59,10,0,0,0,0,0,0,0,80,68,59,80,65,37,100,44,37,100,59,10,0,0,0,0,45,85,83,69,95,67,87,68,82,67,32,32,0,0,0,0,80,85,59,10,83,80,37,100,59,10,0,0,0,0,0,0,3,10,0,0,0,0,0,0,112,111,115,116,115,99,114,105,112,116,0,0,0,0,0,0,76,66,0,0,0,0,0,0,110,111,120,100,116,105,36,99,115,0,0,0,0,0,0,0,116,114,0,0,0,0,0,0,68,73,48,44,49,59,10,0,111,110,32,116,104,101,32,115,97,109,101,32,115,99,97,108,101,0,0,0,0,0,0,0,115,113,36,117,97,114,101,0,110,111,98,111,120,0,0,0,68,73,48,44,45,49,59,10,0,0,0,0,0,0,0,0,96,98,117,105,108,116,105,110,45,112,114,101,118,105,111,117,115,45,109,111,117,115,101,45,102,111,114,109,97,116,96,0,68,73,49,44,48,59,10,0,116,0,0,0,0,0,0,0,112,36,115,112,111,105,110,116,115,0,0,0,0,0,0,0,77,117,115,116,32,115,112,101,99,105,102,121,32,97,32,115,97,109,112,108,105,110,103,32,97,114,114,97,121,32,115,105,122,101,32,98,101,102,111,114,101,32,105,110,100,105,99,97,116,105,110,103,32,115,112,97,99,105,110,103,32,105,110,32,115,101,99,111,110,100,32,100,105,109,101,110,115,105,111,110,0,0,0,0,0,0,0,0,32,37,115,32,115,111,108,105,100,32,37,46,50,102,32,0,110,36,111,112,115,112,111,105,110,116,115,0,0,0,0,0,110,111,104,105,100,100,101,110,36,51,100,0,0,0,0,0,102,36,111,110,116,0,0,0,115,121,110,116,97,120,32,101,114,114,111,114,0,0,0,0,100,97,115,36,104,101,100,0,115,111,108,36,105,100,0,0,110,111,112,115,112,111,105,110,116,115,0,0,0,0,0,0,70,114,97,109,101,32,109,97,107,101,114,32,77,73,70,32,51,46,48,48,32,102,111,114,109,97,116,0,0,0,0,0,112,115,112,111,105,110,116,115,0,0,0,0,0,0,0,0,120,100,116,105,36,99,115,0,83,99,114,111,108,108,95,76,111,99,107,0,0,0,0,0,112,105,116,99,104,0,0,0,120,47,121,47,122,0,0,0,101,120,116,114,97,110,101,111,117,115,32,111,114,32,111,117,116,45,111,102,45,111,114,100,101,114,32,97,114,103,117,109,101,110,116,115,32,105,110,32,115,101,116,32,97,114,114,111,119,115,116,121,108,101,0,0,104,101,105,103,104,116,0,0,115,119,105,116,99,104,101,100,32,109,111,117,115,101,32,102,111,114,109,97,116,32,102,114,111,109,32,37,108,100,32,116,111,32,37,108,100,10,0,0,32,37,115,32,37,100,32,37,115,32,92,10,32,32,32,37,115,32,37,115,32,37,102,32,37,115,0,0,0,0,0,0,105,110,116,101,114,110,97,108,32,101,114,114,111,114,58,32,115,117,98,115,116,114,105,110,103,32,114,97,110,103,101,32,111,112,101,114,97,116,111,114,32,97,112,112,108,105,101,100,32,116,111,32,110,111,110,45,83,84,82,73,78,71,32,116,121,112,101,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,112,111,105,110,116,32,115,105,122,101,58,32,114,101,97,108,32,110,117,109,98,101,114,0,0,0,0,0,0,0,100,114,0,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,102,111,110,116,58,32,115,116,105,99,107,44,32,99,103,95,116,105,109,101,115,44,32,117,110,105,118,101,114,115,44,32,122,97,112,102,95,100,105,110,103,98,97,116,115,44,32,97,110,116,105,113,117,101,95,111,108,105,118,101,44,10,97,114,105,97,108,44,32,99,111,117,114,105,101,114,44,32,103,97,114,97,109,111,110,100,95,97,110,116,105,103,117,97,44,32,108,101,116,116,101,114,95,103,111,116,104,105,99,44,32,99,103,95,111,109,101,103,97,44,32,97,108,98,101,114,116,117,115,44,10,116,105,109,101,115,95,110,101,119,95,114,111,109,97,110,44,32,99,108,97,114,101,110,100,111,110,44,32,99,111,114,111,110,101,116,44,32,109,97,114,105,103,111,108,100,44,32,116,114,117,101,116,121,112,101,95,115,121,109,98,111,108,115,44,32,111,114,32,119,105,110,103,100,105,110,103,115,0,0,0,0,0,0,78,117,109,98,101,114,32,111,102,32,112,101,110,115,32,109,117,115,116,32,98,101,32,97,32,112,111,115,105,116,105,118,101,0,0,0,0,0,0,0,108,101,116,116,101,114,0,0,108,101,116,36,116,101,114,0,108,101,103,97,108,0,0,0,109,105,102,0,0,0,0,0,108,101,103,36,97,108,0,0,110,111,99,98,116,105,36,99,115,0,0,0,0,0,0,0,110,111,101,120,116,101,110,100,101,100,0,0,0,0,0,0,120,47,121,0,0,0,0,0,97,114,114,111,119,115,116,121,108,101,0,0,0,0,0,0,110,111,97,117,116,111,116,105,116,108,101,115,0,0,0,0,110,111,101,120,116,36,101,110,100,101,100,0,0,0,0,0,96,98,117,105,108,116,105,110,45,110,101,120,116,45,109,111,117,115,101,45,102,111,114,109,97,116,96,0,0,0,0,0,101,120,116,101,110,100,101,100,0,0,0,0,0,0,0,0,101,120,116,36,101,110,100,101,100,0,0,0,0,0,0,0,100,121,0,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,109,111,100,101,58,32,112,111,114,116,114,97,105,116,32,111,114,32,108,97,110,100,115,99,97,112,101,0,0,0,109,36,111,100,101,0,0,0,42,65,108,108,42,32,101,100,103,101,115,32,117,110,100,101,102,105,110,101,100,32,111,114,32,111,117,116,32,111,102,32,114,97,110,103,101,44,32,116,104,117,115,32,110,111,32,112,108,111,116,46,0,0,0,0,27,38,108,48,79,0,0,0,27,38,108,49,79,0,0,0,27,69,27,38,108,49,88,37,115,10,0,0,0,0,0,0,73,109,97,103,101,110,32,108,97,115,101,114,32,112,114,105,110,116,101,114,0,0,0,0,27,37,48,65,27,69,10,0,99,98,116,105,36,99,115,0,27,37,49,65,27,38,108,48,72,10,0,0,0,0,0,0,9,9,37,115,32,97,120,101,115,32,97,114,101,32,37,115,10,0,0,0,0,0,0,0,111,98,106,101,99,116,32,105,110,105,116,105,97,108,105,122,97,116,105,111,110,32,102,97,105,108,117,114,101,0,0,0,97,117,116,111,116,105,116,108,101,115,0,0,0,0,0,0,85,76,49,44,49,48,48,59,10,85,76,50,44,56,44,56,44,57,44,56,44,56,44,57,44,56,44,56,44,57,44,56,44,56,44,57,59,10,85,76,51,44,54,44,54,44,54,44,55,44,54,44,54,44,54,44,55,44,54,44,54,44,54,44,55,44,54,44,54,44,54,44,55,59,10,85,76,52,44,53,44,53,44,53,44,49,48,44,53,44,53,44,53,44,49,48,44,53,44,53,44,53,44,49,48,59,10,85,76,53,44,53,44,53,44,53,44,53,44,53,44,56,44,53,44,53,44,53,44,53,44,53,44,56,44,53,44,53,44,53,44,53,44,53,44,57,59,10,85,76,54,44,56,44,56,44,48,44,57,44,56,44,56,44,48,44,57,44,56,44,56,44,48,44,57,59,10,85,76,55,44,52,44,52,44,52,44,52,44,48,44,52,44,52,44,52,44,52,44,52,44,48,44,52,44,52,44,52,44,52,44,52,44,48,44,52,59,10,85,76,56,44,54,44,54,44,54,44,54,44,54,44,54,44,48,44,54,44,54,44,54,44,54,44,54,44,54,44,54,44,48,44,54,59,10,0,96,98,117,105,108,116,105,110,45,100,101,99,114,101,109,101,110,116,45,99,108,105,112,98,111,97,114,100,109,111,100,101,96,0,0,0,0,0,0,0,73,78,83,80,49,83,68,49,44,37,100,44,50,44,37,100,44,0,0,0,0,0,0,0,27,37,48,66,0,0,0,0,80,83,105,122,101,95,49,0,100,116,0,0,0,0,0,0,105,109,97,103,101,0,0,0,80,69,60,0,0,0,0,0,80,69,0,0,0,0,0,0,46,48,56,0,0,0,0,0,105,109,97,103,101,110,0,0,46,49,54,0,0,0,0,0,110,111,114,116,105,36,99,115,0,0,0,0,0,0,0,0,46,50,52,0,0,0,0,0,37,103,32,114,111,116,95,120,44,32,37,103,32,114,111,116,95,122,44,32,37,103,32,115,99,97,108,101,44,32,37,103,32,115,99,97,108,101,95,122,10,0,0,0,0,0,0,0,111,98,106,101,99,116,0,0,97,117,116,111,116,105,116,108,101,115,32,99,111,108,117,109,110,104,101,97,100,0,0,0,44,50,0,0,0,0,0,0,115,119,105,116,99,104,101,100,32,99,108,105,112,98,111,97,114,100,32,102,111,114,109,97,116,32,102,114,111,109,32,37,108,100,32,116,111,32,37,108,100,10,0,0,0,0,0,0,80,87,46,49,76,84,49,44,46,50,53,0,0,0,0,0,80,87,46,50,76,84,0,0,100,120,0,0,0,0,0,0,80,87,37,115,76,84,0,0,80,87,37,115,76,84,37,100,37,115,0,0,0,0,0,0,80,85,59,10,83,80,49,59,10,80,87,46,50,76,84,49,44,46,50,53,0,0,0,0,80,85,59,10,83,80,49,59,10,80,87,46,50,76,84,0,115,113,114,116,0,0,0,0,80,85,59,10,83,80,37,100,59,10,76,84,59,0,0,0,72,80,32,68,101,115,105,103,110,106,101,116,32,55,53,48,67,44,32,72,80,32,76,97,115,101,114,106,101,116,32,73,73,73,47,73,86,44,32,101,116,99,46,32,40,109,97,110,121,32,111,112,116,105,111,110,115,41,0,0,0,0,0,0,80,85,59,10,83,80,37,100,59,10,76,84,37,100,59,0,114,116,105,36,99,115,0,0,76,66,37,115,3,10,0,0,109,97,112,10,0,0,0,0,73,110,99,111,110,115,105,115,116,101,110,116,32,111,112,116,105,111,110,115,0,0,0,0,68,73,49,44,48,0,0,0,96,98,117,105,108,116,105,110,45,105,110,99,114,101,109,101,110,116,45,99,108,105,112,98,111,97,114,100,109,111,100,101,96,0,0,0,0,0,0,0,68,73,48,44,45,49,0,0,68,73,48,44,49,0,0,0,97,114,114,36,97,121,0,0,76,79,55,0,0,0,0,0,76,79,52,0,0,0,0,0,76,79,49,0,0,0,0,0,87,71,37,46,50,102,44,49,56,48,44,49,56,48,59,69,80,59,10,0,0,0,0,0,69,87,37,46,50,102,44,48,44,49,56,48,59,10,0,0,112,99,108,53,0,0,0,0,80,77,50,59,70,84,49,48,44,51,48,59,70,80,59,69,80,59,70,84,59,10,0,0,110,111,122,116,105,36,99,115,0,0,0,0,0,0,0,0,70,84,49,48,44,51,48,59,87,71,37,46,50,102,44,48,44,51,54,48,59,69,80,59,70,84,59,10,0,0,0,0,9,118,105,101,119,32,105,115,32,0,0,0,0,0,0,0,85,110,114,101,99,111,103,110,105,122,101,100,32,111,114,32,100,117,112,108,105,99,97,116,101,32,111,112,116,105,111,110,0,0,0,0,0,0,0,0,76,101,102,116,0,0,0,0,70,84,49,48,44,51,48,59,82,65,37,100,44,37,100,59,69,80,59,70,84,59,10,0,110,111,116,0,0,0,0,0,82,65,37,100,44,37,100,59,69,80,59,10,0,0,0,0,87,71,37,100,44,48,44,51,54,48,59,69,80,59,10,0,114,101,99,36,111,114,100,0,87,71,37,100,44,57,48,44,50,55,48,59,69,80,59,69,87,37,100,44,48,44,57,48,59,10,0,0,0,0,0,0,87,71,37,100,44,49,56,48,44,50,55,48,59,69,80,59,69,87,37,100,44,57,48,44,57,48,59,10,0,0,0,0,87,71,37,100,44,49,56,48,44,49,56,48,59,69,80,59,69,87,37,100,44,48,44,49,56,48,59,10,0,0,0,0,87,71,37,100,44,50,55,48,44,50,55,48,59,69,80,59,69,87,37,100,44,49,56,48,44,57,48,59,10,0,0,0,87,71,37,100,44,57,48,44,57,48,59,69,80,59,69,87,37,100,44,49,56,48,44,57,48,59,87,71,37,100,44,50,55,48,44,57,48,59,69,80,59,69,87,37,100,44,48,44,57,48,59,10,0,0,0,0,72,80,55,52,55,53,32,97,110,100,32,114,101,108,97,116,105,118,101,115,32,91,110,117,109,98,101,114,32,111,102,32,112,101,110,115,93,32,91,101,106,101,99,116,93,0,0,0,87,71,37,100,44,50,55,48,44,49,56,48,59,69,80,59,69,87,37,100,44,57,48,44,49,56,48,59,10,0,0,0,122,116,105,36,99,115,0,0,87,71,37,100,44,50,55,48,44,57,48,59,69,80,59,69,87,37,100,44,48,44,50,55,48,59,10,0,0,0,0,0,9,115,117,114,102,97,99,101,32,105,115,32,37,115,100,114,97,119,110,10,0,0,0,0,102,105,108,108,99,36,111,108,111,114,0,0,0,0,0,0,104,111,114,105,122,111,110,116,97,108,0,0,0,0,0,0,87,71,37,100,44,48,44,50,55,48,59,69,80,59,69,87,37,100,44,50,55,48,44,57,48,59,10,0,0,0,0,0,100,105,115,116,97,110,99,101,32,116,111,32,114,117,108,101,114,32,119,105,108,108,32,37,115,32,98,101,32,115,104,111,119,110,32,105,110,32,112,111,108,97,114,32,99,111,111,114,100,105,110,97,116,101,115,46,10,0,0,0,0,0,0,0,87,71,37,100,44,57,48,44,49,56,48,59,69,80,59,69,87,37,100,44,50,55,48,44,49,56,48,59,10,0,0,0,87,71,37,100,44,48,44,57,48,59,69,80,59,69,87,37,100,44,57,48,44,57,48,59,87,71,37,100,44,49,56,48,44,57,48,59,69,80,59,69,87,37,100,44,50,55,48,44,57,48,59,10,0,0,0,0,85,110,114,101,99,111,103,110,105,122,101,100,32,102,105,108,101,116,121,112,101,59,32,116,114,121,32,34,115,104,111,119,32,100,97,116,97,102,105,108,101,32,98,105,110,97,114,121,32,102,105,108,101,116,121,112,101,115,34,0,0,0,0,0,87,71,37,100,44,49,56,48,44,57,48,59,69,80,59,69,87,37,100,44,50,55,48,44,50,55,48,59,10,0,0,0,87,71,37,100,44,48,44,49,56,48,59,69,80,59,69,87,37,100,44,49,56,48,44,49,56,48,59,10,0,0,0,0,9,115,121,115,116,101,109,32,102,111,110,116,112,97,116,104,32,105,115,32,0,0,0,0,87,71,37,100,44,57,48,44,57,48,59,69,80,59,69,87,37,100,44,49,56,48,44,50,55,48,59,10,0,0,0,0,120,50,94,123,37,100,125,89,105,0,0,0,0,0,0,0,87,71,37,100,44,48,44,57,48,59,69,80,59,69,87,37,100,44,57,48,44,50,55,48,59,10,0,0,0,0,0,0,121,111,117,32,99,97,110,39,116,32,99,104,97,110,103,101,32,116,104,101,32,111,117,116,112,117,116,32,105,110,32,109,117,108,116,105,112,108,111,116,32,109,111,100,101,0,0,0,37,72,58,37,77,58,37,83,0,0,0,0,0,0,0,0,67,73,37,100,59,10,0,0,104,112,103,108,0,0,0,0,80,77,50,59,70,80,59,69,80,59,10,0,0,0,0,0,110,111,121,50,116,105,36,99,115,0,0,0,0,0,0,0,80,77,48,59,10,0,0,0,100,114,97,119,110,0,0,0,102,99,0,0,0,0,0,0,118,101,114,116,105,99,97,108,0,0,0,0,0,0,0,0,87,71,37,46,50,102,44,48,44,51,54,48,59,69,80,59,10,0,0,0,0,0,0,0,96,98,117,105,108,116,105,110,45,116,111,103,103,108,101,45,112,111,108,97,114,100,105,115,116,97,110,99,101,96,0,0,67,73,37,46,50,102,59,10,0,0,0,0,0,0,0,0,82,65,37,46,50,102,44,37,46,50,102,59,69,80,59,10,0,0,0,0,0,0,0,0,117,116,102,36,56,0,0,0,119,105,110,103,100,105,110,103,115,0,0,0,0,0,0,0,32,32,99,111,108,111,114,0,98,97,110,100,0,0,0,0,119,36,105,110,103,100,105,110,103,115,0,0,0,0,0,0,116,114,117,101,116,121,112,101,95,115,121,109,98,111,108,115,0,0,0,0,0,0,0,0,116,114,36,117,101,116,121,112,101,95,115,121,109,98,111,108,115,0,0,0,0,0,0,0,103,101,116,99,111,108,111,114,46,99,0,0,0,0,0,0,109,97,114,105,103,111,108,100,0,0,0,0,0,0,0,0,72,80,50,54,52,56,32,97,110,100,32,72,80,50,54,52,55,0,0,0,0,0,0,0,109,36,97,114,105,103,111,108,100,0,0,0,0,0,0,0,121,50,116,105,36,99,115,0,112,36,108,111,116,0,0,0,99,111,114,111,110,101,116,0,114,101,109,111,118,101,100,0,73,110,118,97,108,105,100,32,99,111,109,109,97,110,100,32,45,32,100,105,100,32,121,111,117,32,109,101,97,110,32,39,117,110,115,101,116,32,115,116,121,108,101,32,114,101,99,116,97,110,103,108,101,39,63,0,110,111,111,117,116,36,112,117,116,0,0,0,0,0,0,0,32,37,115,32,37,115,32,37,115,114,101,118,101,114,115,101,32,37,115,101,110,104,97,110,99,101,100,32,37,115,32,0,99,111,114,36,111,110,101,116,0,0,0,0,0,0,0,0,99,111,109,109,117,110,105,99,97,116,105,111,110,32,99,111,109,109,97,110,100,115,32,119,105,108,108,32,98,101,32,101,99,104,111,101,100,46,10,0,99,108,97,114,101,110,100,111,110,0,0,0,0,0,0,0,99,108,36,97,114,101,110,100,111,110,0,0,0,0,0,0,102,105,108,101,36,116,121,112,101,0,0,0,0,0,0,0,116,105,109,101,115,95,110,101,119,95,114,111,109,97,110,0,116,105,36,109,101,115,95,110,101,119,95,114,111,109,97,110,0,0,0,0,0,0,0,0,97,108,98,101,114,116,117,115,0,0,0,0,0,0,0,0,43,66,73,78,65,82,89,95,68,65,84,65,32,32,0,0,97,108,36,98,101,114,116,117,115,0,0,0,0,0,0,0,99,103,95,111,109,101,103,97,0,0,0,0,0,0,0,0,104,112,50,54,52,56,0,0,99,103,95,111,36,109,101,103,97,0,0,0,0,0,0,0,110,111,121,116,105,36,99,115,0,0,0,0,0,0,0,0,108,101,116,116,101,114,95,103,111,116,104,105,99,0,0,0,0,0,0,0,0,0,0,0,9,104,105,100,100,101,110,32,115,117,114,102,97,99,101,32,105,115,32,37,115,10,0,0,99,36,101,110,116,114,101,0,32,98,111,116,116,111,109,0,108,36,101,116,116,101,114,95,103,111,116,104,105,99,0,0,101,99,104,111,105,110,103,32,111,102,32,99,111,109,109,117,110,105,99,97,116,105,111,110,32,99,111,109,109,97,110,100,115,32,105,115,32,116,117,114,110,101,100,32,111,102,102,46,10,0,0,0,0,0,0,0,103,97,114,97,109,111,110,100,95,97,110,116,105,103,117,97,0,0,0,0,0,0,0,0,103,36,97,114,97,109,111,110,100,95,97,110,116,105,103,117,97,0,0,0,0,0,0,0,100,97,116,97,102,105,108,101,32,99,111,108,117,109,110,0,115,101,116,32,97,117,116,111,115,99,97,108,101,32,37,115,102,105,120,109,97,120,10,0,99,111,117,36,114,105,101,114,0,0,0,0,0,0,0,0,97,114,105,97,108,0,0,0,97,114,36,105,97,108,0,0,99,117,114,118,101,32,112,111,105,110,116,115,0,0,0,0,117,110,114,101,99,111,103,110,105,122,101,100,32,111,112,116,105,111,110,32,37,115,10,0,105,116,101,114,97,116,105,111,110,32,108,105,110,107,101,100,32,108,105,115,116,0,0,0,97,110,116,105,113,117,101,95,111,108,105,118,101,0,0,0,97,110,36,116,105,113,117,101,95,111,108,105,118,101,0,0,72,80,50,54,50,51,65,32,97,110,100,32,109,97,121,98,101,32,111,116,104,101,114,115,0,0,0,0,0,0,0,0,122,97,112,102,95,100,105,110,103,98,97,116,115,0,0,0,121,116,105,36,99,115,0,0,80,97,117,115,101,0,0,0,122,36,97,112,102,95,100,105,110,103,98,97,116,115,0,0,9,84,114,121,32,116,111,32,115,101,116,32,76,79,67,75,69,68,32,97,115,112,101,99,116,32,114,97,116,105,111,32,116,111,32,37,103,58,49,46,48,10,0,0,0,0,0,0,85,110,114,101,99,111,103,105,110,105,122,101,100,32,111,98,106,101,99,116,32,116,121,112,101,0,0,0,0,0,0,0,32,116,111,112,0,0,0,0,99,103,95,116,105,109,101,115,0,0,0,0,0,0,0,0,108,102,32,116,111,107,101,110,115,0,0,0,0,0,0,0,96,98,117,105,108,116,105,110,45,116,111,103,103,108,101,45,118,101,114,98,111,115,101,96,0,0,0,0,0,0,0,0,99,103,95,116,36,105,109,101,115,0,0,0,0,0,0,0,105,110,116,101,114,110,97,108,32,101,114,114,111,114,58,32,115,117,98,115,116,114,105,110,103,32,114,97,110,103,101,32,115,112,101,99,105,102,105,101,114,115,32,109,117,115,116,32,104,97,118,101,32,105,110,116,101,103,101,114,32,118,97,108,117,101,115,0,0,0,0,0,115,116,105,99,107,0,0,0,100,102,95,110,111,95,117,115,101,95,115,112,101,99,115,32,61,61,32,48,32,124,124,32,111,117,116,112,117,116,32,61,61,32,100,102,95,110,111,95,117,115,101,95,115,112,101,99,115,32,124,124,32,111,117,116,112,117,116,32,61,61,32,109,97,120,0,0,0,0,0,0,115,36,116,105,99,107,0,0,117,110,105,118,101,114,115,0,117,36,110,105,118,101,114,115,0,0,0,0,0,0,0,0,53,44,37,100,44,54,44,37,100,44,55,44,37,100,59,83,83,59,10,0,0,0,0,0,51,44,37,102,44,0,0,0,104,112,50,54,50,51,65,0,52,44,37,102,44,0,0,0,110,111,120,50,116,105,36,99,115,0,0,0,0,0,0,0,83,68,49,44,37,100,44,50,44,37,100,44,0,0,0,0,9,78,111,32,97,116,116,101,109,112,116,32,116,111,32,99,111,110,116,114,111,108,32,97,115,112,101,99,116,32,114,97,116,105,111,10,0,0,0,0,85,110,114,101,99,111,103,110,105,122,101,100,32,112,111,108,121,103,111,110,32,115,121,110,116,97,120,0,0,0,0,0,36,0,0,0,0,0,0,0,115,101,116,32,115,105,122,101,32,115,113,117,97,114,101,0,37,100,32,37,115,32,91,37,49,100,44,37,49,100,93,0,99,111,117,114,0,0,0,0,105,110,116,101,114,110,97,108,32,101,114,114,111,114,58,32,117,110,107,110,111,119,110,32,99,111,108,117,109,110,32,116,121,112,101,0,0,0,0,0,37,37,46,37,100,102,0,0,37,115,37,48,50,100,0,0,64,100,111,99,117,109,101,110,116,40,108,97,110,103,117,97,103,101,32,105,109,112,114,101,115,115,44,32,112,97,112,101,114,32,97,52,41,0,0,0,99,111,110,118,101,114,116,101,100,32,108,97,98,101,108,32,115,116,114,105,110,103,0,0,63,36,0,0,0,0,0,0,104,36,101,108,112,0,0,0,70,73,71,32,103,114,97,112,104,105,99,115,32,108,97,110,103,117,97,103,101,32,102,111,114,32,88,70,73,71,32,103,114,97,112,104,105,99,115,32,101,100,105,116,111,114,0,0,112,36,111,108,121,108,105,110,101,0,0,0,0,0,0,0,120,50,116,105,36,99,115,0,118,36,101,99,116,111,114,115,0,0,0,0,0,0,0,0,9,84,114,121,32,116,111,32,115,101,116,32,97,115,112,101,99,116,32,114,97,116,105,111,32,116,111,32,37,103,58,49,46,48,10,0,0,0,0,0,80,111,108,121,103,111,110,32,105,115,32,110,111,116,32,99,108,111,115,101,100,32,45,32,97,100,100,105,110,103,32,101,120,116,114,97,32,118,101,114,116,101,120,10,0,0,0,0,118,101,99,116,111,114,115,0,115,101,116,32,115,105,122,101,32,110,111,115,113,117,97,114,101,0,0,0,0,0,0,0,112,111,108,121,108,105,110,101,0,0,0,0,0,0,0,0,99,111,108,111,117,114,0,0,113,117,111,116,101,0,0,0,85,115,97,103,101,58,32,115,101,116,32,116,101,114,109,105,110,97,108,32,109,105,102,32,91,111,112,116,105,111,110,115,93,10,9,111,112,116,105,111,110,115,58,10,9,9,99,111,108,111,117,114,32,47,32,32,32,32,32,32,32,32,68,114,97,119,32,112,114,105,109,105,116,105,118,101,115,32,119,105,116,104,32,108,105,110,101,32,116,121,112,101,115,32,62,61,32,48,32,105,110,32,99,111,108,111,117,114,32,40,115,101,112,46,32,50,45,55,41,10,9,9,109,111,110,111,99,104,114,111,109,101,32,32,32,32,32,32,68,114,97,119,32,112,114,105,109,105,116,105,118,101,115,32,105,110,32,98,108,97,99,107,32,40,115,101,112,46,32,48,41,10,10,9,9,112,111,108,121,108,105,110,101,32,47,32,32,32,32,32,32,68,114,97,119,32,108,105,110,101,115,32,97,115,32,99,111,110,116,105,110,117,111,117,115,32,99,117,114,118,101,115,10,9,9,118,101,99,116,111,114,115,32,32,32,32,32,32,32,32,32,68,114,97,119,32,108,105,110,101,115,32,97,115,32,99,111,108,108,101,99,116,105,111,110,115,32,111,102,32,118,101,99,116,111,114,115,10,10,9,9,104,101,108,112,32,47,32,63,32,32,32,32,32,32,32,32,80,114,105,110,116,32,115,104,111,114,116,32,117,115,97,103,101,32,100,101,115,99,114,105,112,116,105,111,110,32,111,110,32,115,116,100,101,114,114,10,0,0,0,0,0,0,0,78,117,109,98,101,114,32,111,102,32,112,105,120,101,108,115,32,99,97,110,110,111,116,32,98,101,32,102,97,99,116,111,114,101,100,32,105,110,116,111,32,105,110,116,101,103,101,114,115,32,109,97,116,99,104,105,110,103,32,103,114,105,100,46,32,78,32,61,32,37,100,32,32,75,32,61,32,37,100,0,67,101,110,116,101,114,95,50,0,0,0,0,0,0,0,0,60,77,73,70,70,105,108,101,32,51,46,48,48,62,32,35,32,71,101,110,101,114,97,116,101,100,32,98,121,32,103,110,117,112,108,111,116,32,118,101,114,115,105,111,110,32,37,115,32,112,97,116,99,104,108,101,118,101,108,32,37,115,59,32,105,100,101,110,116,105,102,105,101,115,32,116,104,105,115,32,97,115,32,97,32,77,73,70,32,102,105,108,101,10,35,10,35,32,115,104,111,119,32,98,111,114,100,101,114,115,10,60,68,111,99,117,109,101,110,116,10,60,68,66,111,114,100,101,114,115,79,110,32,89,101,115,62,10,62,10,35,32,83,101,116,32,97,32,100,101,102,97,117,108,116,32,112,101,110,32,112,97,116,116,101,114,110,44,32,112,101,110,32,119,105,100,116,104,44,32,117,110,105,116,32,97,110,100,32,102,111,110,116,32,102,111,114,32,115,117,98,115,101,113,117,101,110,116,32,111,98,106,101,99,116,115,10,60,80,101,110,32,48,62,10,60,70,105,108,108,32,49,53,62,10,60,80,101,110,87,105,100,116,104,32,48,46,53,32,112,116,62,10,60,83,101,112,97,114,97,116,105,111,110,32,48,62,10,60,85,110,105,116,115,32,85,99,109,62,10,60,70,111,110,116,67,97,116,97,108,111,103,10,9,60,70,111,110,116,32,60,70,84,97,103,32,96,37,115,39,62,60,70,70,97,109,105,108,121,32,96,84,105,109,101,115,39,62,60,70,83,105,122,101,32,37,100,62,60,70,80,108,97,105,110,32,89,101,115,62,62,10,9,60,70,111,110,116,32,60,70,84,97,103,32,96,37,115,39,62,60,70,70,97,109,105,108,121,32,96,90,97,112,102,68,105,110,103,98,97,116,115,39,62,60,70,83,105,122,101,32,55,46,48,32,112,116,62,60,70,80,108,97,105,110,32,89,101,115,62,62,10,9,60,70,111,110,116,32,60,70,84,97,103,32,96,37,115,39,62,60,70,70,97,109,105,108,121,32,96,83,121,109,98,111,108,39,62,60,70,83,105,122,101,32,53,46,48,32,112,116,62,60,70,80,108,97,105,110,32,89,101,115,62,62,10,62,10,35,10,0,0,0,0,0,0,35,10,35,32,69,110,100,32,111,102,32,77,73,70,70,105,108,101,10,0,0,0,0,0,62,10,35,32,69,110,100,32,111,102,32,70,114,97,109,101,32,110,117,109,98,101,114,32,37,100,10,35,10,0,0,0,37,115,95,37,115,95,37,115,0,0,0,0,0,0,0,0,9,60,71,114,111,117,112,10,9,9,60,73,68,32,37,100,62,10,9,62,10,0,0,0,102,105,103,0,0,0,0,0,9,35,10,9,35,32,71,114,111,117,112,32,116,104,101,32,116,104,101,32,111,98,106,101,99,116,115,32,105,110,32,103,114,111,117,112,115,32,116,111,32,109,97,107,101,32,116,104,101,32,99,104,97,114,116,32,101,97,115,105,101,114,32,116,111,32,109,97,110,105,112,117,108,97,116,101,10,9,35,32,97,102,116,101,114,32,105,116,39,115,32,105,109,112,111,114,116,101,100,32,105,110,116,111,32,70,114,97,109,101,77,97,107,101,114,46,10,0,0,0,110,111,120,116,105,36,99,115,0,0,0,0,0,0,0,0,35,10,35,32,70,114,97,109,101,32,110,117,109,98,101,114,32,37,100,32,119,105,116,104,32,112,108,111,116,32,111,102,32,103,114,97,112,104,105,99,115,10,60,70,114,97,109,101,10,9,60,80,101,110,32,49,53,62,10,9,60,70,105,108,108,32,49,53,62,10,9,60,80,101,110,87,105,100,116,104,32,32,48,46,53,32,112,116,62,10,9,60,83,101,112,97,114,97,116,105,111,110,32,48,62,10,9,60,66,82,101,99,116,32,50,46,48,48,48,32,37,46,51,102,32,37,46,51,102,32,37,46,51,102,62,10,9,60,78,83,79,102,102,115,101,116,32,32,48,46,48,48,48,62,10,9,60,66,76,79,102,102,115,101,116,32,32,48,46,48,48,48,62,10,0,0,9,115,105,122,101,32,105,115,32,115,99,97,108,101,100,32,98,121,32,37,103,44,37,103,10,0,0,0,0,0,0,0,112,111,108,121,103,111,110,32,118,101,114,116,101,120,0,0,77,73,70,32,100,114,105,118,101,114,0,0,0,0,0,0,115,101,116,32,115,105,122,101,32,114,97,116,105,111,32,45,49,0,0,0,0,0,0,0,32,60,80,101,110,32,37,100,62,32,0,0,0,0,0,0,32,60,70,111,110,116,32,60,70,83,101,112,97,114,97,116,105,111,110,32,37,100,62,62,32,0,0,0,0,0,0,0,76,97,115,116,32,112,111,105,110,116,32,105,110,32,116,104,101,32,98,105,110,97,114,121,32,102,105,108,101,32,100,105,100,32,110,111,116,32,109,97,116,99,104,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,96,117,115,105,110,103,96,32,99,111,108,117,109,110,115,0,0,0,0,0,0,0,32,60,83,101,112,97,114,97,116,105,111,110,32,37,100,62,32,0,0,0,0,0,0,0,32,60,80,101,110,87,105,100,116,104,32,48,46,49,32,112,116,62,32,0,0,0,0,0,32,60,70,111,110,116,32,60,70,83,101,112,97,114,97,116,105,111,110,32,48,62,62,32,0,0,0,0,0,0,0,0,32,60,80,101,110,87,105,100,116,104,32,49,46,48,32,112,116,62,32,0,0,0,0,0,71,80,86,65,76,95,68,65,84,65,0,0,0,0,0,0,120,94,52,0,0,0,0,0,32,60,83,101,112,97,114,97,116,105,111,110,32,48,62,32,0,0,0,0,0,0,0,0,69,110,104,97,110,99,101,100,32,77,101,116,97,102,105,108,101,32,102,111,114,109,97,116,0,0,0,0,0,0,0,0,9,9,60,84,76,79,114,105,103,105,110,32,32,37,46,51,102,32,37,46,51,102,62,32,37,115,32,60,65,110,103,108,101,32,37,100,62,32,60,83,116,114,105,110,103,32,96,37,115,39,62,10,9,62,10,0,120,116,105,36,99,115,0,0,9,60,84,101,120,116,76,105,110,101,32,60,71,114,111,117,112,73,68,32,37,100,62,32,37,115,32,37,115,32,37,115,32,37,115,10,0,0,0,0,9,111,114,105,103,105,110,32,105,115,32,115,101,116,32,116,111,32,37,103,44,37,103,10,0,0,0,0,0,0,0,0,69,120,112,101,99,116,105,110,103,32,97,114,99,32,91,60,98,101,103,105,110,62,58,60,101,110,100,62,93,0,0,0,97,116,32,0,0,0,0,0,32,60,84,76,65,108,105,103,110,109,101,110,116,32,82,105,103,104,116,62,32,0,0,0,96,98,117,105,108,116,105,110,45,116,111,103,103,108,101,45,114,97,116,105,111,96,0,0,32,60,84,76,65,108,105,103,110,109,101,110,116,32,67,101,110,116,101,114,62,32,0,0,45,86,0,0,0,0,0,0,32,60,84,76,65,108,105,103,110,109,101,110,116,32,76,101,102,116,62,32,0,0,0,0,110,111,116,32,101,110,111,117,103,104,32,109,101,109,111,114,121,32,116,111,32,99,114,101,97,116,101,32,118,101,99,116,111,114,0,0,0,0,0,0,9,60,80,111,108,121,76,105,110,101,32,60,71,114,111,117,112,73,68,32,37,100,62,32,37,115,32,37,115,32,37,115,32,60,70,105,108,108,32,49,53,62,10,0,0,0,0,0,9,9,60,70,111,110,116,10,9,9,9,60,70,84,97,103,32,96,37,115,39,62,10,9,9,62,10,0,0,0,0,0,9,62,10,0,0,0,0,0,9,9,60,84,76,79,114,105,103,105,110,32,32,37,46,51,102,32,37,46,51,102,62,32,37,115,32,60,83,116,114,105,110,103,32,96,37,99,39,62,10,0,0,0,0,0,0,0,76,79,71,0,0,0,0,0,9,60,84,101,120,116,76,105,110,101,32,60,71,114,111,117,112,73,68,32,37,100,62,32,37,115,10,0,0,0,0,0,101,109,102,0,0,0,0,0,9,9,60,83,104,97,112,101,82,101,99,116,32,37,46,51,102,32,37,46,51,102,32,37,46,51,102,32,37,46,51,102,62,10,0,0,0,0,0,0,99,98,108,36,97,98,101,108,0,0,0,0,0,0,0,0,9,60,82,101,99,116,97,110,103,108,101,32,60,71,114,111,117,112,73,68,32,37,100,62,32,37,115,10,0,0,0,0,9,116,101,114,109,105,110,97,108,32,116,121,112,101,32,105,115,32,117,110,107,110,111,119,110,10,0,0,0,0,0,0,58,0,0,0,0,0,0,0,114,109,97,114,103,105,110,0,10,9,62,10,0,0,0,0,110,101,120,116,32,122,111,111,109,46,10,0,0,0,0,0,60,80,111,105,110,116,32,32,37,46,51,102,32,37,46,51,102,62,32,0,0,0,0,0,9,9,60,78,117,109,80,111,105,110,116,115,32,37,100,62,32,0,0,0,0,0,0,0,103,112,98,105,110,97,114,121,32,109,97,116,114,105,120,32,114,111,119,0,0,0,0,0,9,9,60,70,105,108,108,32,37,100,62,10,0,0,0,0,9,60,80,111,108,121,103,111,110,32,60,71,114,111,117,112,73,68,32,37,100,62,10,0,110,111,98,97,99,107,103,36,114,111,117,110,100,0,0,0,110,111,97,100,111,98,101,36,103,108,121,112,104,110,97,109,101,115,0,0,0,0,0,0,77,65,88,0,0,0,0,0,97,100,111,98,101,36,103,108,121,112,104,110,97,109,101,115,0,0,0,0,0,0,0,0,100,120,102,45,102,105,108,101,32,102,111,114,32,65,117,116,111,67,97,100,32,40,100,101,102,97,117,108,116,32,115,105,122,101,32,49,50,48,120,56,48,41,0,0,0,0,0,0,110,101,119,36,115,116,121,108,101,0,0,0,0,0,0,0,122,108,36,97,98,101,108,0,111,108,100,36,115,116,121,108,101,0,0,0,0,0,0,0,32,32,32,116,101,114,109,105,110,97,108,32,116,121,112,101,32,105,115,32,37,115,32,37,115,10,0,0,0,0,0,0,65,110,103,108,101,32,111,117,116,32,111,102,32,114,97,110,103,101,0,0,0,0,0,0,108,109,97,114,103,105,110,0,110,111,97,36,117,120,102,105,108,101,0,0,0,0,0,0,96,98,117,105,108,116,105,110,45,122,111,111,109,45,110,101,120,116,96,32,103,111,32,116,111,32,110,101,120,116,32,122,111,111,109,32,105,110,32,116,104,101,32,122,111,111,109,32,115,116,97,99,107,0,0,0,97,36,117,120,102,105,108,101,0,0,0,0,0,0,0,0,110,36,111,114,111,116,97,116,101,0,0,0,0,0,0,0,66,105,110,97,114,121,32,100,97,116,97,32,116,121,112,101,32,117,110,107,110,111,119,110,0,0,0,0,0,0,0,0,112,97,108,102,36,117,110,99,112,97,114,97,109,0,0,0,110,111,102,111,110,116,102,36,105,108,101,115,0,0,0,0,9,102,111,110,116,112,97,116,104,32,105,115,32,0,0,0,102,111,110,116,102,36,105,108,101,0,0,0,0,0,0,0,32,107,77,71,84,80,69,90,89,0,0,0,0,0,0,0,114,111,117,36,110,100,101,100,0,0,0,0,0,0,0,0,10,9,100,117,109,109,121,32,118,97,114,105,97,98,108,101,32,105,115,32,120,32,102,111,114,32,99,117,114,118,101,115,44,32,120,47,121,32,102,111,114,32,115,117,114,102,97,99,101,115,10,0,0,0,0,0,46,37,48,42,100,0,0,0,77,73,78,0,0,0,0,0,100,101,102,97,117,108,116,112,36,108,101,120,0,0,0,0,100,120,102,0,0,0,0,0,100,117,36,112,108,101,120,0,121,50,108,36,97,98,101,108,0,0,0,0,0,0,0,0,115,105,36,109,112,108,101,120,0,0,0,0,0,0,0,0]) -.concat([97,114,99,0,0,0,0,0,98,109,97,114,103,105,110,0,99,111,108,111,117,114,116,36,101,120,116,0,0,0,0,0,112,114,101,118,105,111,117,115,32,122,111,111,109,46,10,0,99,111,108,111,114,116,36,101,120,116,0,0,0,0,0,0,98,36,108,97,99,107,116,101,120,116,0,0,0,0,0,0,67,111,117,108,100,110,39,116,32,115,108,117,114,112,32,37,108,100,32,98,121,116,101,115,32,40,114,101,116,117,114,110,32,119,97,115,32,37,122,100,41,10,0,0,0,0,0,0,100,101,102,36,97,117,108,116,0,0,0,0,0,0,0,0,109,36,111,110,111,99,104,114,111,109,101,0,0,0,0,0,116,104,105,115,0,0,0,0,120,111,114,0,0,0,0,0,101,112,36,115,102,0,0,0,32,102,111,110,116,115,99,97,108,101,32,37,51,46,49,102,32,0,0,0,0,0,0,0,37,103,32,0,0,0,0,0,71,80,86,65,76,0,0,0,34,37,115,34,32,37,103,32,0,0,0,0,0,0,0,0,97,115,99,105,105,32,97,114,116,32,102,111,114,32,97,110,121,116,104,105,110,103,32,116,104,97,116,32,112,114,105,110,116,115,32,116,101,120,116,0,34,37,115,34,32,37,103,37,115,32,0,0,0,0,0,0,121,108,36,97,98,101,108,0,100,102,95,114,101,97,100,98,105,110,97,114,121,32,115,108,117,114,112,101,114,0,0,0,112,97,36,117,115,101,0,0,32,37,115,97,100,111,98,101,103,108,121,112,104,110,97,109,101,115,32,92,10,32,32,32,0,0,0,0,0,0,0,0,114,97,100,105,117,115,0,0,111,117,116,36,112,117,116,0,116,109,97,114,103,105,110,0,110,111,104,101,97,100,101,114,32,0,0,0,0,0,0,0,96,98,117,105,108,116,105,110,45,122,111,111,109,45,112,114,101,118,105,111,117,115,96,32,103,111,32,116,111,32,112,114,101,118,105,111,117,115,32,122,111,111,109,32,105,110,32,116,104,101,32,122,111,111,109,32,115,116,97,99,107,0,0,0,104,101,97,100,101,114,32,34,37,115,34,32,0,0,0,0,110,111,97,117,120,102,105,108,101,0,0,0,0,0,0,0,97,117,120,102,105,108,101,0,37,115,32,37,115,32,0,0,32,32,32,112,97,108,102,117,110,99,112,97,114,97,109,32,37,100,44,37,103,32,92,10,32,32,32,0,0,0,0,0,45,66,65,67,75,87,65,82,68,83,95,67,79,77,80,65,84,73,66,73,76,73,84,89,32,32,0,0,0,0,0,0,32,32,32,110,111,98,97,99,107,103,114,111,117,110,100,32,92,10,0,0,0,0,0,0,71,80,86,65,76,95,84,69,82,77,95,89,83,73,90,69,0,0,0,0,0,0,0,0,32,32,32,98,97,99,107,103,114,111,117,110,100,32,34,35,37,48,50,120,37,48,50,120,37,48,50,120,34,32,92,10,0,0,0,0,0,0,0,0,100,117,109,98,0,0,0,0,110,111,99,108,105,112,0,0,120,50,108,36,97,98,101,108,0,0,0,0,0,0,0,0,99,108,105,112,0,0,0,0,116,105,99,115,32,97,114,101,32,105,110,32,37,115,32,111,102,32,112,108,111,116,10,0,99,101,110,36,116,101,114,0,111,117,116,115,105,100,101,0,99,111,108,111,114,116,101,120,116,0,0,0,0,0,0,0,98,108,97,99,107,116,101,120,116,0,0,0,0,0,0,0,108,101,118,101,108,100,101,102,97,117,108,116,0,0,0,0,83,99,97,110,32,115,105,122,101,32,111,102,32,109,97,116,114,105,120,32,105,115,32,122,101,114,111,0,0,0,0,0,115,101,116,32,97,117,116,111,115,99,97,108,101,32,37,115,102,105,120,109,105,110,10,0,108,101,118,101,108,49,0,0,84,104,105,115,32,112,108,111,116,32,115,116,121,108,101,32,105,115,32,111,110,108,121,32,102,111,114,32,100,97,116,97,102,105,108,101,115,32,44,32,114,101,118,101,114,116,105,110,103,32,116,111,32,34,112,111,105,110,116,115,34,0,0,0,32,32,32,37,115,32,37,115,32,37,115,32,92,10,32,32,32,37,115,32,100,97,115,104,108,101,110,103,116,104,32,37,46,49,102,32,108,105,110,101,119,105,100,116,104,32,37,46,49,102,32,37,115,32,37,115,32,92,10,0,0,0,0,0,32,97,117,120,102,105,108,101,0,0,0,0,0,0,0,0,115,121,110,116,97,120,58,32,32,103,110,117,112,108,111,116,32,45,101,32,34,99,111,109,109,97,110,100,115,34,10,0,110,111,114,111,116,97,116,101,0,0,0,0,0,0,0,0,71,80,86,65,76,95,84,69,82,77,95,88,83,73,90,69,0,0,0,0,0,0,0,0,114,111,116,97,116,101,0,0,114,101,102,114,101,115,104,32,110,111,116,32,112,111,115,115,105,98,108,101,32,97,110,100,32,114,101,112,108,111,116,32,105,115,32,100,105,115,97,98,108,101,100,0,0,0,0,0,69,80,83,32,102,111,114,109,97,116,32,102,111,114,32,67,111,114,101,108,68,82,65,87,0,0,0,0,0,0,0,0,100,101,102,97,117,108,116,112,108,101,120,0,0,0,0,0,120,108,36,97,98,101,108,0,67,108,101,97,114,0,0,0,115,105,109,112,108,101,120,0,9,120,121,112,108,97,110,101,32,116,105,99,115,108,101,118,101,108,32,105,115,32,37,103,10,0,0,0,0,0,0,0,69,120,112,101,99,116,105,110,103,32,116,111,32,111,114,32,114,116,111,0,0,0,0,0,105,110,115,105,100,101,0,0,100,117,112,108,101,120,0,0,108,111,97,100,47,101,118,97,108,32,110,101,115,116,101,100,32,116,111,111,32,100,101,101,112,108,121,0,0,0,0,0,59,32,115,101,116,32,120,50,114,91,37,32,35,103,58,37,32,35,103,93,59,32,115,101,116,32,121,50,114,91,37,32,35,103,58,37,32,35,103,93,0,0,0,0,0,0,0,0,110,111,101,110,104,97,110,99,101,100,0,0,0,0,0,0,105,110,116,101,114,110,97,108,32,101,114,114,111,114,32,58,32,110,111,110,45,83,84,82,73,78,71,32,97,114,103,117,109,101,110,116,32,116,111,32,115,116,114,115,116,114,116,0,37,115,32,37,115,32,37,115,32,92,10,0,0,0,0,0,100,102,95,110,111,95,98,105,110,95,99,111,108,115,0,0,32,102,111,110,116,102,105,108,101,32,34,37,115,34,0,0,112,115,95,102,111,110,116,102,105,108,101,95,99,104,97,114,0,0,0,0,0,0,0,0,37,115,44,37,103,0,0,0,111,102,32,102,111,110,116,32,110,97,109,101,0,0,0,0,71,80,86,65,76,95,84,69,82,77,95,89,77,65,88,0,116,101,114,109,105,110,97,108,32,37,115,32,100,111,101,115,32,110,111,116,32,97,108,108,111,119,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,37,115,0,0,0,0,0,99,111,114,101,108,0,0,0,73,32,119,105,108,108,32,116,114,121,32,116,111,32,102,105,120,32,105,116,32,98,117,116,32,116,104,105,115,32,109,97,121,32,110,111,116,32,119,111,114,107,46,0,0,0,0,0,99,98,100,97,36,116,97,0,73,108,108,101,103,97,108,32,99,104,97,114,97,99,116,101,114,115,32,105,110,32,80,111,115,116,83,99,114,105,112,116,32,102,111,110,116,32,110,97,109,101,46,0,0,0,0,0,9,120,121,112,108,97,110,101,32,105,110,116,101,114,99,101,112,116,115,32,122,32,97,120,105,115,32,97,116,32,37,103,10,0,0,0,0,0,0,0,114,101,108,97,116,105,118,101,32,99,111,111,114,100,105,110,97,116,101,115,32,109,117,115,116,32,109,97,116,99,104,32,105,110,32,116,121,112,101,0,115,101,116,32,107,101,121,32,0,0,0,0,0,0,0,0,40,41,91,93,123,125,124,32,0,0,0,0,0,0,0,0,115,101,116,32,120,114,91,37,46,49,50,103,58,37,46,49,50,103,93,59,32,115,101,116,32,121,114,91,37,46,49,50,103,58,37,46,49,50,103,93,0,0,0,0,0,0,0,0,97,108,108,111,119,101,100,32,100,101,118,105,97,116,105,111,110,32,109,117,115,116,32,98,101,32,60,32,49,0,0,0,67,97,110,39,116,32,100,101,108,101,116,101,32,70,111,110,116,32,102,105,108,101,110,97,109,101,32,39,37,115,39,0,100,102,95,109,97,120,95,98,105,110,105,110,102,111,95,99,111,108,115,32,62,32,100,102,95,110,111,95,98,105,110,95,99,111,108,115,0,0,0,0,37,32,103,0,0,0,0,0,110,101,119,95,112,115,95,102,111,110,116,102,105,108,101,45,62,102,111,110,116,102,105,108,101,95,110,97,109,101,0,0,110,101,119,95,112,115,95,102,111,110,116,102,105,108,101,0,115,101,116,32,104,105,100,100,101,110,51,100,32,37,115,32,111,102,102,115,101,116,32,37,100,32,116,114,105,97,110,103,108,101,112,97,116,116,101,114,110,32,37,108,100,32,117,110,100,101,102,105,110,101,100,32,37,100,32,37,115,97,108,116,100,105,97,103,111,110,97,108,32,37,115,98,101,110,116,111,118,101,114,10,0,0,0,0,100,101,108,36,101,116,101,0,97,100,100,0,0,0,0,0,71,80,86,65,76,95,84,69,82,77,95,89,77,73,78,0,67,97,110,110,111,116,32,117,115,101,32,97,117,120,32,102,105,108,101,32,111,110,32,115,116,100,111,117,116,46,32,83,119,105,116,99,104,105,110,103,32,111,102,102,32,97,117,120,102,105,108,101,32,111,112,116,105,111,110,46,10,0,0,0,67,111,109,112,117,116,101,114,32,71,114,97,112,104,105,99,115,32,77,101,116,97,102,105,108,101,0,0,0,0,0,0,84,117,114,110,105,110,103,32,111,102,102,32,97,117,120,102,105,108,101,32,111,112,116,105,111,110,10,0,0,0,0,0,122,100,97,36,116,97,0,0,67,97,110,110,111,116,32,109,97,107,101,32,80,111,115,116,83,99,114,105,112,116,32,102,105,108,101,32,110,97,109,101,32,102,114,111,109,32,37,115,10,0,0,0,0,0,0,0,85,110,107,110,111,119,110,32,109,105,110,105,116,105,99,32,116,121,112,101,32,105,110,32,115,104,111,119,95,109,116,105,99,115,40,41,0,0,0,0,114,116,111,0,0,0,0,0,67,97,110,110,111,116,32,111,112,101,110,32,97,117,120,32,102,105,108,101,32,37,115,32,102,111,114,32,111,117,116,112,117,116,46,32,83,119,105,116,99,104,105,110,103,32,111,102,102,32,97,117,120,102,105,108,101,32,111,112,116,105,111,110,46,10,0,0,0,0,0,0,117,110,122,111,111,109,46,10,0,0,0,0,0,0,0,0,112,115,108,97,116,101,120,32,97,117,120,32,102,105,108,101,110,97,109,101,0,0,0,0,109,97,120,32,60,61,32,77,65,88,68,65,84,65,67,79,76,83,0,0,0,0,0,0,73,109,97,103,101,32,103,114,105,100,32,109,117,115,116,32,98,101,32,97,116,32,108,101,97,115,116,32,50,32,120,32,50,46,10,10,0,0,0,0,101,112,115,108,97,116,101,120,32,84,101,88,32,102,105,108,101,110,97,109,101,0,0,0,111,112,101,110,32,111,102,32,112,111,115,116,115,99,105,112,116,32,111,117,116,112,117,116,32,102,105,108,101,32,37,115,32,102,97,105,108,101,100,0,67,101,110,116,101,114,95,49,0,0,0,0,0,0,0,0,46,37,115,0,0,0,0,0,45,105,110,99,46,37,115,0,71,80,86,65,76,95,84,69,82,77,95,88,77,65,88,0,45,45,45,32,114,101,111,112,101,110,32,102,97,105,108,101,100,0,0,0,0,0,0,0,99,103,109,0,0,0,0,0,82,101,115,101,116,116,105,110,103,32,112,114,105,109,97,114,121,32,111,117,116,112,117,116,32,102,105,108,101,32,116,111,32,37,115,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,80,111,115,116,83,99,114,105,112,116,32,111,117,116,112,117,116,32,116,111,32,37,115,0,0,121,50,100,97,36,116,97,0,9,109,105,110,111,114,32,37,115,116,105,99,115,32,97,114,101,32,100,114,97,119,110,32,119,105,116,104,32,37,100,32,115,117,98,105,110,116,101,114,118,97,108,115,32,98,101,116,119,101,101,110,32,109,97,106,111,114,32,120,116,105,99,32,109,97,114,107,115,10,0,0,116,111,0,0,0,0,0,0,115,101,116,32,107,101,121,32,116,105,116,108,101,32,34,37,115,34,0,0,0,0,0,0,103,105,118,101,32,116,104,101,32,116,101,120,32,102,105,108,101,110,97,109,101,32,97,115,32,111,117,116,112,117,116,0,96,98,117,105,108,116,105,110,45,117,110,122,111,111,109,96,0,0,0,0,0,0,0,0,70,111,114,32,101,112,115,108,97,116,101,120,32,115,116,97,110,100,97,108,111,110,101,32,109,111,100,101,44,32,121,111,117,32,104,97,118,101,32,116,111,32,37,115,0,0,0,0,46,69,80,83,0,0,0,0,100,97,116,97,95,102,112,32,33,61,32,78,85,76,76,0,46,101,112,115,0,0,0,0,101,112,115,108,97,116,101,120,32,101,112,115,32,102,105,108,101,110,97,109,101,0,0,0,101,112,115,108,97,116,101,120,32,111,117,116,112,117,116,32,102,105,108,101,32,110,97,109,101,32,109,117,115,116,32,98,101,32,111,102,32,116,104,101,32,102,111,114,109,32,102,105,108,101,110,97,109,101,46,120,120,120,0,0,0,0,0,0,92,112,117,116,40,48,44,48,41,123,92,99,111,108,111,114,98,111,120,123,103,112,66,97,99,107,103,114,111,117,110,100,125,123,92,109,97,107,101,98,111,120,40,37,46,50,102,44,37,46,50,102,41,91,93,123,125,125,125,37,37,10,0,0,71,80,86,65,76,95,84,69,82,77,95,88,77,73,78,0,100,117,112,32,109,117,108,32,100,117,112,32,109,117,108,0,92,100,101,102,105,110,101,99,111,108,111,114,123,103,112,66,97,99,107,103,114,111,117,110,100,125,123,114,103,98,125,123,37,46,51,102,44,32,37,46,51,102,44,32,37,46,51,102,125,37,37,10,0,0,0,0,72,84,77,76,32,67,97,110,118,97,115,32,111,98,106,101,99,116,0,0,0,0,0,0,32,32,92,115,101,116,108,101,110,103,116,104,123,92,117,110,105,116,108,101,110,103,116,104,125,123,37,46,52,102,98,112,125,37,37,10,32,32,92,98,101,103,105,110,123,112,105,99,116,117,114,101,125,40,37,46,50,102,44,37,46,50,102,41,37,37,10,0,0,0,0,0,121,100,97,36,116,97,0,0,32,32,32,32,92,101,108,115,101,10,32,32,32,32,32,32,37,32,103,114,97,121,10,32,32,32,32,32,32,92,100,101,102,92,99,111,108,111,114,114,103,98,35,49,123,92,99,111,108,111,114,123,98,108,97,99,107,125,125,37,10,32,32,32,32,32,32,92,100,101,102,92,99,111,108,111,114,103,114,97,121,35,49,123,92,99,111,108,111,114,91,103,114,97,121,93,123,35,49,125,125,37,10,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,119,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,123,119,104,105,116,101,125,125,37,10,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,98,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,123,98,108,97,99,107,125,125,37,10,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,97,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,123,98,108,97,99,107,125,125,37,10,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,48,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,123,98,108,97,99,107,125,125,37,10,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,49,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,123,98,108,97,99,107,125,125,37,10,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,50,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,123,98,108,97,99,107,125,125,37,10,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,51,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,123,98,108,97,99,107,125,125,37,10,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,52,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,123,98,108,97,99,107,125,125,37,10,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,53,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,123,98,108,97,99,107,125,125,37,10,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,54,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,123,98,108,97,99,107,125,125,37,10,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,55,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,123,98,108,97,99,107,125,125,37,10,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,56,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,123,98,108,97,99,107,125,125,37,10,32,32,32,32,92,102,105,10,32,32,92,102,105,10,0,0,0,9,109,105,110,111,114,32,37,115,116,105,99,115,32,97,114,101,32,99,111,109,112,117,116,101,100,32,97,117,116,111,109,97,116,105,99,97,108,108,121,10,0,0,0,0,0,0,0,102,114,111,109,0,0,0,0,37,115,115,101,116,32,114,97,120,105,115,10,0,0,0,0,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,48,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,91,114,103,98,93,123,49,44,48,44,48,125,125,37,10,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,49,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,91,114,103,98,93,123,48,44,49,44,48,125,125,37,10,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,50,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,91,114,103,98,93,123,48,44,48,44,49,125,125,37,10,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,51,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,91,114,103,98,93,123,49,44,48,44,49,125,125,37,10,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,52,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,91,114,103,98,93,123,48,44,49,44,49,125,125,37,10,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,53,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,91,114,103,98,93,123,49,44,49,44,48,125,125,37,10,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,54,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,91,114,103,98,93,123,48,44,48,44,48,125,125,37,10,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,55,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,91,114,103,98,93,123,49,44,48,46,51,44,48,125,125,37,10,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,56,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,91,114,103,98,93,123,48,46,53,44,48,46,53,44,48,46,53,125,125,37,10,0,0,0,0,0,0,0,96,98,117,105,108,116,105,110,45,114,111,116,97,116,101,45,114,105,103,104,116,96,32,111,110,108,121,32,102,111,114,32,115,112,108,111,116,115,59,32,60,115,104,105,102,116,62,32,105,110,99,114,101,97,115,101,115,32,97,109,111,117,110,116,0,0,0,0,0,0,0,0,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,48,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,91,114,103,98,93,123,49,44,48,44,48,125,125,37,10,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,49,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,91,114,103,98,93,123,48,44,48,44,49,125,125,37,10,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,50,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,91,114,103,98,93,123,48,44,49,44,49,125,125,37,10,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,51,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,91,114,103,98,93,123,49,44,48,44,49,125,125,37,10,0,0,0,0,32,32,92,105,102,71,80,98,108,97,99,107,116,101,120,116,10,32,32,32,32,37,32,110,111,32,116,101,120,116,99,111,108,111,114,32,97,116,32,97,108,108,10,32,32,32,32,92,100,101,102,92,99,111,108,111,114,114,103,98,35,49,123,125,37,10,32,32,32,32,92,100,101,102,92,99,111,108,111,114,103,114,97,121,35,49,123,125,37,10,32,32,92,101,108,115,101,10,32,32,32,32,37,32,103,114,97,121,32,111,114,32,99,111,108,111,114,63,10,32,32,32,32,92,105,102,71,80,99,111,108,111,114,10,32,32,32,32,32,32,92,100,101,102,92,99,111,108,111,114,114,103,98,35,49,123,92,99,111,108,111,114,91,114,103,98,93,123,35,49,125,125,37,10,32,32,32,32,32,32,92,100,101,102,92,99,111,108,111,114,103,114,97,121,35,49,123,92,99,111,108,111,114,91,103,114,97,121,93,123,35,49,125,125,37,10,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,119,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,123,119,104,105,116,101,125,125,37,10,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,98,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,123,98,108,97,99,107,125,125,37,10,32,32,32,32,32,32,92,101,120,112,97,110,100,97,102,116,101,114,92,100,101,102,92,99,115,110,97,109,101,32,76,84,97,92,101,110,100,99,115,110,97,109,101,123,92,99,111,108,111,114,123,98,108,97,99,107,125,125,37,10,0,0,0,0,9,32,32,37,115,0,0,0,32,32,92,109,97,107,101,97,116,108,101,116,116,101,114,10,32,32,92,112,114,111,118,105,100,101,99,111,109,109,97,110,100,92,99,111,108,111,114,91,50,93,91,93,123,37,37,10,32,32,32,32,92,71,101,110,101,114,105,99,69,114,114,111,114,123,40,103,110,117,112,108,111,116,41,32,92,115,112,97,99,101,92,115,112,97,99,101,92,115,112,97,99,101,92,64,115,112,97,99,101,115,125,123,37,37,10,32,32,32,32,32,32,80,97,99,107,97,103,101,32,99,111,108,111,114,32,110,111,116,32,108,111,97,100,101,100,32,105,110,32,99,111,110,106,117,110,99,116,105,111,110,32,119,105,116,104,10,32,32,32,32,32,32,116,101,114,109,105,110,97,108,32,111,112,116,105,111,110,32,96,99,111,108,111,117,114,116,101,120,116,39,37,37,10,32,32,32,32,125,123,83,101,101,32,116,104,101,32,103,110,117,112,108,111,116,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,102,111,114,32,101,120,112,108,97,110,97,116,105,111,110,46,37,37,10,32,32,32,32,125,123,69,105,116,104,101,114,32,117,115,101,32,39,98,108,97,99,107,116,101,120,116,39,32,105,110,32,103,110,117,112,108,111,116,32,111,114,32,108,111,97,100,32,116,104,101,32,112,97,99,107,97,103,101,10,32,32,32,32,32,32,99,111,108,111,114,46,115,116,121,32,105,110,32,76,97,84,101,88,46,125,37,37,10,32,32,32,32,92,114,101,110,101,119,99,111,109,109,97,110,100,92,99,111,108,111,114,91,50,93,91,93,123,125,37,37,10,32,32,125,37,37,10,32,32,92,112,114,111,118,105,100,101,99,111,109,109,97,110,100,92,105,110,99,108,117,100,101,103,114,97,112,104,105,99,115,91,50,93,91,93,123,37,37,10,32,32,32,32,92,71,101,110,101,114,105,99,69,114,114,111,114,123,40,103,110,117,112,108,111,116,41,32,92,115,112,97,99,101,92,115,112,97,99,101,92,115,112,97,99,101,92,64,115,112,97,99,101,115,125,123,37,37,10,32,32,32,32,32,32,80,97,99,107,97,103,101,32,103,114,97,112,104,105,99,120,32,111,114,32,103,114,97,112,104,105,99,115,32,110,111,116,32,108,111,97,100,101,100,37,37,10,32,32,32,32,125,123,83,101,101,32,116,104,101,32,103,110,117,112,108,111,116,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,102,111,114,32,101,120,112,108,97,110,97,116,105,111,110,46,37,37,10,32,32,32,32,125,123,84,104,101,32,103,110,117,112,108,111,116,32,101,112,115,108,97,116,101,120,32,116,101,114,109,105,110,97,108,32,110,101,101,100,115,32,103,114,97,112,104,105,99,120,46,115,116,121,32,111,114,32,103,114,97,112,104,105,99,115,46,115,116,121,46,125,37,37,10,32,32,32,32,92,114,101,110,101,119,99,111,109,109,97,110,100,92,105,110,99,108,117,100,101,103,114,97,112,104,105,99,115,91,50,93,91,93,123,125,37,37,10,32,32,125,37,37,10,32,32,92,112,114,111,118,105,100,101,99,111,109,109,97,110,100,92,114,111,116,97,116,101,98,111,120,91,50,93,123,35,50,125,37,37,10,32,32,92,64,105,102,117,110,100,101,102,105,110,101,100,123,105,102,71,80,99,111,108,111,114,125,123,37,37,10,32,32,32,32,92,110,101,119,105,102,92,105,102,71,80,99,111,108,111,114,10,32,32,32,32,92,71,80,99,111,108,111,114,37,115,10,32,32,125,123,125,37,37,10,32,32,92,64,105,102,117,110,100,101,102,105,110,101,100,123,105,102,71,80,98,108,97,99,107,116,101,120,116,125,123,37,37,10,32,32,32,32,92,110,101,119,105,102,92,105,102,71,80,98,108,97,99,107,116,101,120,116,10,32,32,32,32,92,71,80,98,108,97,99,107,116,101,120,116,37,115,10,32,32,125,123,125,37,37,10,32,32,37,37,32,100,101,102,105,110,101,32,97,32,92,103,64,97,100,100,116,111,64,109,97,99,114,111,32,119,105,116,104,111,117,116,32,64,32,105,110,32,116,104,101,32,110,97,109,101,58,10,32,32,92,108,101,116,92,103,112,108,103,97,100,100,116,111,109,97,99,114,111,92,103,64,97,100,100,116,111,64,109,97,99,114,111,10,32,32,37,37,32,100,101,102,105,110,101,32,101,109,112,116,121,32,116,101,109,112,108,97,116,101,115,32,102,111,114,32,97,108,108,32,99,111,109,109,97,110,100,115,32,116,97,107,105,110,103,32,116,101,120,116,58,10,32,32,92,103,100,101,102,92,103,112,108,98,97,99,107,116,101,120,116,123,125,37,37,10,32,32,92,103,100,101,102,92,103,112,108,102,114,111,110,116,116,101,120,116,123,125,37,37,10,32,32,92,109,97,107,101,97,116,111,116,104,101,114,10,0,0,0,0,0,0,0,32,32,92,115,101,108,101,99,116,102,111,110,116,10,0,0,32,32,92,102,111,110,116,115,104,97,112,101,123,37,115,125,37,37,10,0,0,0,0,0,32,32,92,102,111,110,116,115,101,114,105,101,115,123,37,115,125,37,37,10,0,0,0,0,71,80,86,65,76,95,84,69,82,77,95,87,73,78,68,79,87,73,68,0,0,0,0,0,32,32,92,102,111,110,116,102,97,109,105,108,121,123,37,115,125,37,37,10,0,0,0,0,99,97,110,118,97,115,0,0,32,32,37,37,32,69,110,99,111,100,105,110,103,32,105,110,115,105,100,101,32,116,104,101,32,112,108,111,116,46,32,32,73,110,32,116,104,101,32,104,101,97,100,101,114,32,111,102,32,121,111,117,114,32,100,111,99,117,109,101,110,116,44,32,116,104,105,115,32,101,110,99,111,100,105,110,103,10,32,32,37,37,32,115,104,111,117,108,100,32,116,111,32,100,101,102,105,110,101,100,44,32,101,46,103,46,44,32,98,121,32,117,115,105,110,103,10,32,32,37,37,32,92,117,115,101,112,97,99,107,97,103,101,91,37,115,44,60,111,116,104,101,114,32,101,110,99,111,100,105,110,103,115,62,93,123,105,110,112,117,116,101,110,99,125,10,32,32,92,105,110,112,117,116,101,110,99,111,100,105,110,103,123,37,115,125,37,37,10,0,0,0,120,50,100,97,36,116,97,0,92,98,101,103,105,110,103,114,111,117,112,10,0,0,0,0,9,109,105,110,111,114,32,37,115,116,105,99,115,32,97,114,101,32,111,102,102,32,102,111,114,32,108,105,110,101,97,114,32,115,99,97,108,101,115,10,9,109,105,110,111,114,32,37,115,116,105,99,115,32,97,114,101,32,99,111,109,112,117,116,101,100,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,102,111,114,32,108,111,103,32,115,99,97,108,101,115,10,0,0,0,0,0,0,0,0,85,110,107,110,111,119,110,32,111,98,106,101,99,116,32,116,121,112,101,0,0,0,0,0,37,0,0,0,0,0,0,0,96,98,117,105,108,116,105,110,45,114,111,116,97,116,101,45,117,112,96,32,111,110,108,121,32,102,111,114,32,115,112,108,111,116,115,59,32,60,115,104,105,102,116,62,32,105,110,99,114,101,97,115,101,115,32,97,109,111,117,110,116,0,0,0,92,109,97,107,101,97,116,108,101,116,116,101,114,10,37,37,32,83,101,108,101,99,116,32,97,110,32,97,112,112,114,111,112,114,105,97,116,101,32,100,101,102,97,117,108,116,32,100,114,105,118,101,114,32,40,102,114,111,109,32,84,101,88,76,105,118,101,32,103,114,97,112,104,105,99,115,46,99,102,103,41,10,92,98,101,103,105,110,103,114,111,117,112,10,32,32,92,99,104,97,114,100,101,102,92,120,61,48,32,37,37,10,32,32,37,37,32,99,104,101,99,107,32,112,100,102,84,101,88,10,32,32,92,64,105,102,117,110,100,101,102,105,110,101,100,123,112,100,102,111,117,116,112,117,116,125,123,125,123,37,37,10,32,32,32,32,92,105,102,99,97,115,101,92,112,100,102,111,117,116,112,117,116,10,32,32,32,32,92,101,108,115,101,10,32,32,32,32,32,32,92,99,104,97,114,100,101,102,92,120,61,49,32,37,37,10,32,32,32,32,92,102,105,10,32,32,125,37,37,10,32,32,37,37,32,99,104,101,99,107,32,86,84,101,88,10,32,32,92,64,105,102,117,110,100,101,102,105,110,101,100,123,79,112,77,111,100,101,125,123,125,123,37,37,10,32,32,32,32,92,99,104,97,114,100,101,102,92,120,61,50,32,37,37,10,32,32,125,37,37,10,92,101,120,112,97,110,100,97,102,116,101,114,92,101,110,100,103,114,111,117,112,10,92,105,102,99,97,115,101,92,120,10,32,32,37,37,32,100,101,102,97,117,108,116,32,99,97,115,101,10,32,32,92,80,97,115,115,79,112,116,105,111,110,115,84,111,80,97,99,107,97,103,101,123,100,118,105,112,115,125,123,103,101,111,109,101,116,114,121,125,10,92,111,114,10,32,32,37,37,32,112,100,102,84,101,88,32,105,115,32,114,117,110,110,105,110,103,32,105,110,32,112,100,102,32,109,111,100,101,10,32,32,92,80,97,115,115,79,112,116,105,111,110,115,84,111,80,97,99,107,97,103,101,123,112,100,102,116,101,120,125,123,103,101,111,109,101,116,114,121,125,10,92,101,108,115,101,10,32,32,37,37,32,86,84,101,88,32,105,115,32,114,117,110,110,105,110,103,10,32,32,92,80,97,115,115,79,112,116,105,111,110,115,84,111,80,97,99,107,97,103,101,123,118,116,101,120,125,123,103,101,111,109,101,116,114,121,125,10,92,102,105,10,92,109,97,107,101,97,116,111,116,104,101,114,10,37,37,32,83,101,116,32,112,97,112,101,114,115,105,122,101,10,92,117,115,101,112,97,99,107,97,103,101,91,112,97,112,101,114,115,105,122,101,61,123,37,46,50,102,98,112,44,37,46,50,102,98,112,125,44,116,101,120,116,61,123,37,46,50,102,98,112,44,37,46,50,102,98,112,125,93,123,103,101,111,109,101,116,114,121,125,10,37,37,32,78,111,32,112,97,103,101,32,110,117,109,98,101,114,115,32,97,110,100,32,110,111,32,112,97,114,97,103,114,97,112,104,32,105,110,100,101,110,116,97,116,105,111,110,10,92,112,97,103,101,115,116,121,108,101,123,101,109,112,116,121,125,10,92,115,101,116,108,101,110,103,116,104,123,92,112,97,114,105,110,100,101,110,116,125,123,48,98,112,125,37,37,10,37,37,32,76,111,97,100,32,99,111,110,102,105,103,117,114,97,116,105,111,110,32,102,105,108,101,10,92,73,110,112,117,116,73,102,70,105,108,101,69,120,105,115,116,115,123,103,110,117,112,108,111,116,46,99,102,103,125,123,37,37,10,32,32,92,116,121,112,101,111,117,116,123,85,115,105,110,103,32,99,111,110,102,105,103,117,114,97,116,105,111,110,32,102,105,108,101,32,103,110,117,112,108,111,116,46,99,102,103,125,37,37,10,125,123,37,37,10,32,92,116,121,112,101,111,117,116,123,78,111,32,99,111,110,102,105,103,117,114,97,116,105,111,110,32,102,105,108,101,32,103,110,117,112,108,111,116,46,99,102,103,32,102,111,117,110,100,46,125,37,37,10,125,37,37,10,37,115,10,92,98,101,103,105,110,123,100,111,99,117,109,101,110,116,125,10,0,0,0,0,0,0,0,0,92,117,115,101,112,97,99,107,97,103,101,91,37,115,93,123,105,110,112,117,116,101,110,99,125,10,0,0,0,0,0,0,9,84,104,105,115,32,118,101,114,115,105,111,110,32,111,102,32,103,110,117,112,108,111,116,32,117,110,100,101,114,115,116,97,110,100,115,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,98,105,110,97,114,121,32,102,105,108,101,32,116,121,112,101,115,58,10,0,0,37,32,76,111,97,100,32,112,97,99,107,97,103,101,115,10,92,117,115,101,112,97,99,107,97,103,101,123,103,114,97,112,104,105,99,120,125,10,92,117,115,101,112,97,99,107,97,103,101,123,99,111,108,111,114,125,10,0,0,0,0,0,0,0,111,110,108,121,32,54,32,114,97,110,103,101,32,115,112,101,99,115,32,97,114,101,32,112,101,114,109,105,116,116,101,100,0,0,0,0,0,0,0,0,92,114,101,110,101,119,99,111,109,109,97,110,100,42,92,117,112,100,101,102,97,117,108,116,123,37,115,125,37,37,10,0,92,114,101,110,101,119,99,111,109,109,97,110,100,42,92,109,100,100,101,102,97,117,108,116,123,37,115,125,37,37,10,0,92,114,101,110,101,119,99,111,109,109,97,110,100,42,92,114,109,100,101,102,97,117,108,116,123,37,115,125,37,37,10,0,71,80,86,65,76,95,80,87,68,0,0,0,0,0,0,0,92,100,111,99,117,109,101,110,116,99,108,97,115,115,123,109,105,110,105,109,97,108,125,10,37,37,32,83,101,116,32,102,111,110,116,32,115,105,122,101,10,92,109,97,107,101,97,116,108,101,116,116,101,114,10,92,100,101,102,92,64,112,116,115,105,122,101,123,37,100,125,10,92,73,110,112,117,116,73,102,70,105,108,101,69,120,105,115,116,115,123,115,105,122,101,37,100,46,99,108,111,125,123,125,123,37,37,10,32,32,32,92,71,101,110,101,114,105,99,69,114,114,111,114,123,40,103,110,117,112,108,111,116,41,32,92,115,112,97,99,101,92,115,112,97,99,101,92,115,112,97,99,101,92,64,115,112,97,99,101,115,125,123,37,37,10,32,32,32,32,32,32,71,110,117,112,108,111,116,32,69,114,114,111,114,58,32,70,105,108,101,32,96,115,105,122,101,37,100,46,99,108,111,39,32,110,111,116,32,102,111,117,110,100,33,32,67,111,117,108,100,32,110,111,116,32,115,101,116,32,102,111,110,116,32,115,105,122,101,37,37,10,32,32,32,125,123,83,101,101,32,116,104,101,32,103,110,117,112,108,111,116,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,102,111,114,32,101,120,112,108,97,110,97,116,105,111,110,46,37,37,10,32,32,32,125,123,70,111,114,32,117,115,105,110,103,32,97,32,102,111,110,116,32,115,105,122,101,32,97,32,102,105,108,101,32,96,115,105,122,101,60,102,111,110,116,115,105,122,101,62,46,99,108,111,39,32,104,97,115,32,116,111,32,101,120,105,115,116,46,10,32,32,32,32,32,32,32,32,70,97,108,108,105,110,103,32,98,97,99,107,32,94,94,74,116,111,32,100,101,102,97,117,108,116,32,102,111,110,116,115,105,122,101,32,49,48,112,116,46,125,37,37,10,32,32,92,100,101,102,92,64,112,116,115,105,122,101,123,48,125,10,32,32,92,105,110,112,117,116,123,115,105,122,101,49,48,46,99,108,111,125,37,37,10,125,37,37,10,92,109,97,107,101,97,116,111,116,104,101,114,10,0,0,0,0,88,116,101,114,109,32,84,101,107,116,114,111,110,105,120,32,52,48,49,52,32,77,111,100,101,0,0,0,0,0,0,0,69,80,83,76,65,84,69,88,95,99,111,109,109,111,110,95,105,110,105,116,0,0,0,0,120,100,97,36,116,97,0,0,105,110,118,97,108,105,100,32,105,110,112,117,116,32,101,110,99,111,100,105,110,103,32,117,115,101,100,0,0,0,0,0,9,109,105,110,111,114,32,37,115,116,105,99,115,32,97,114,101,32,111,102,102,10,0,0,108,97,121,101,114,100,101,102,97,117,108,116,0,0,0,0,107,111,105,56,45,117,0,0,96,98,117,105,108,116,105,110,45,114,111,116,97,116,101,45,108,101,102,116,96,32,111,110,108,121,32,102,111,114,32,115,112,108,111,116,115,59,32,60,115,104,105,102,116,62,32,105,110,99,114,101,97,115,101,115,32,97,109,111,117,110,116,0,107,111,105,56,45,114,0,0,99,112,52,51,55,100,101,0,32,45,45,32,112,114,111,99,101,115,115,111,114,32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,116,104,105,115,32,115,105,122,101,0,0,0,0,0,0,0,0,108,97,116,105,110,57,0,0,108,97,116,105,110,53,0,0,114,0,0,0,0,0,0,0,108,97,116,105,110,50,0,0,70,111,114,109,97,116,32,99,104,97,114,97,99,116,101,114,32,109,105,115,109,97,116,99,104,58,32,37,37,66,32,105,115,32,111,110,108,121,32,118,97,108,105,100,32,119,105,116,104,32,37,37,98,0,0,0,108,97,116,105,110,49,0,0,121,111,117,32,99,97,110,39,116,32,117,110,115,101,116,32,116,104,101,32,112,97,108,101,116,116,101,46,10,0,0,0,102,105,108,108,105,110,103,32,71,80,86,65,76,95,80,87,68,0,0,0,0,0,0,0,37,37,32,71,78,85,80,76,79,84,58,32,76,97,84,101,88,32,112,105,99,116,117,114,101,32,119,105,116,104,32,80,111,115,116,115,99,114,105,112,116,10,0,0,0,0,0,0,120,116,101,114,109,0,0,0,101,112,115,108,97,116,101,120,32,116,101,114,109,105,110,97,108,32,99,97,110,110,111,116,32,119,114,105,116,101,32,116,111,32,115,116,97,110,100,97,114,100,32,111,117,116,112,117,116,0,0,0,0,0,0,0,120,121,112,36,108,97,110,101,0,0,0,0,0,0,0,0,9,110,111,116,32,114,111,116,97,116,101,100,10,9,0,0,101,120,112,101,99,116,101,100,32,103,97,112,32,118,97,108,117,101,0,0,0,0,0,0,115,101,116,32,103,114,105,100,32,37,115,32,32,0,0,0,32,32,123,92,71,78,85,80,76,79,84,115,112,101,99,105,97,108,123,34,10,0,0,0,99,104,97,110,103,105,110,103,32,118,105,101,119,32,116,111,32,37,102,44,32,37,102,46,10,0,0,0,0,0,0,0,32,32,92,115,112,101,99,105,97,108,123,112,115,102,105,108,101,61,37,115,32,108,108,120,61,48,32,108,108,121,61,48,32,117,114,120,61,37,100,32,117,114,121,61,37,100,32,114,119,105,61,37,100,125,10,0,92,71,78,85,80,76,79,84,112,105,99,116,117,114,101,40,37,100,44,37,100,41,10,0,40,37,100,41,0,0,0,0,117,116,102,56,0,0,0,0,37,37,32,71,78,85,80,76,79,84,58,32,112,108,97,105,110,32,84,101,88,32,119,105,116,104,32,80,111,115,116,115,99,114,105,112,116,10,92,98,101,103,105,110,103,114,111,117,112,10,92,99,97,116,99,111,100,101,96,92,64,61,49,49,92,114,101,108,97,120,10,92,100,101,102,92,71,78,85,80,76,79,84,115,112,101,99,105,97,108,123,37,37,10,32,32,92,100,101,102,92,100,111,35,35,49,123,92,99,97,116,99,111,100,101,96,35,35,49,61,49,50,92,114,101,108,97,120,125,92,100,111,115,112,101,99,105,97,108,115,10,32,32,92,99,97,116,99,111,100,101,96,92,123,61,49,92,99,97,116,99,111,100,101,96,92,125,61,50,92,99,97,116,99,111,100,101,92,37,37,61,49,52,92,114,101,108,97,120,92,115,112,101,99,105,97,108,125,37,37,10,37,37,10,92,101,120,112,97,110,100,97,102,116,101,114,92,105,102,120,92,99,115,110,97,109,101,32,71,78,85,80,76,79,84,112,105,99,116,117,114,101,92,101,110,100,99,115,110,97,109,101,92,114,101,108,97,120,10,32,32,92,99,115,110,97,109,101,32,110,101,119,100,105,109,101,110,92,101,110,100,99,115,110,97,109,101,92,71,78,85,80,76,79,84,117,110,105,116,10,32,32,92,103,100,101,102,92,71,78,85,80,76,79,84,112,105,99,116,117,114,101,40,35,49,44,35,50,41,123,92,118,98,111,120,32,116,111,35,50,92,71,78,85,80,76,79,84,117,110,105,116,92,98,103,114,111,117,112,10,32,32,32,32,92,100,101,102,92,112,117,116,40,35,35,49,44,35,35,50,41,35,35,51,123,92,117,110,115,107,105,112,92,114,97,105,115,101,35,35,50,92,71,78,85,80,76,79,84,117,110,105,116,10,32,32,32,32,32,32,92,104,98,111,120,32,116,111,48,112,116,123,92,107,101,114,110,35,35,49,92,71,78,85,80,76,79,84,117,110,105,116,32,35,35,51,92,104,115,115,125,92,105,103]) -.concat([110,111,114,101,115,112,97,99,101,115,125,37,37,10,32,32,32,32,92,100,101,102,92,108,106,117,115,116,35,35,49,123,92,118,98,111,120,32,116,111,48,112,116,123,92,118,115,115,92,104,98,111,120,32,116,111,48,112,116,123,35,35,49,92,104,115,115,125,92,118,115,115,125,125,37,37,10,32,32,32,32,92,100,101,102,92,99,106,117,115,116,35,35,49,123,92,118,98,111,120,32,116,111,48,112,116,123,92,118,115,115,92,104,98,111,120,32,116,111,48,112,116,123,92,104,115,115,32,35,35,49,92,104,115,115,125,92,118,115,115,125,125,37,37,10,32,32,32,32,92,100,101,102,92,114,106,117,115,116,35,35,49,123,92,118,98,111,120,32,116,111,48,112,116,123,92,118,115,115,92,104,98,111,120,32,116,111,48,112,116,123,92,104,115,115,32,35,35,49,125,92,118,115,115,125,125,37,37,10,32,32,32,32,92,100,101,102,92,115,116,97,99,107,35,35,49,123,92,108,101,116,92,92,61,92,99,114,92,116,97,98,115,107,105,112,61,48,112,116,92,104,97,108,105,103,110,123,92,104,102,105,108,32,35,35,35,35,92,104,102,105,108,92,99,114,32,35,35,49,92,99,114,99,114,125,125,37,37,10,32,32,32,32,92,100,101,102,92,108,115,116,97,99,107,35,35,49,123,92,104,98,111,120,32,116,111,48,112,116,123,92,118,98,111,120,32,116,111,48,112,116,123,92,118,115,115,92,115,116,97,99,107,123,35,35,49,125,125,92,104,115,115,125,125,37,37,10,32,32,32,32,92,100,101,102,92,99,115,116,97,99,107,35,35,49,123,92,104,98,111,120,32,116,111,48,112,116,123,92,104,115,115,92,118,98,111,120,32,116,111,48,112,116,123,92,118,115,115,92,115,116,97,99,107,123,35,35,49,125,125,92,104,115,115,125,125,37,37,10,32,32,32,32,92,100,101,102,92,114,115,116,97,99,107,35,35,49,123,92,104,98,111,120,32,116,111,48,112,116,123,92,118,98,111,120,32,116,111,48,112,116,123,92,115,116,97,99,107,123,35,35,49,125,92,118,115,115,125,92,104,115,115,125,125,37,37,10,32,32,32,32,92,118,115,115,92,104,98,111,120,32,116,111,35,49,92,71,78,85,80,76,79,84,117,110,105,116,92,98,103,114,111,117,112,92,105,103,110,111,114,101,115,112,97,99,101,115,125,37,37,10,32,32,92,103,100,101,102,92,101,110,100,71,78,85,80,76,79,84,112,105,99,116,117,114,101,123,92,104,115,115,92,101,103,114,111,117,112,92,101,103,114,111,117,112,125,37,37,10,92,102,105,10,92,71,78,85,80,76,79,84,117,110,105,116,61,37,46,52,102,98,112,10,0,104,105,115,116,111,103,114,97,109,115,0,0,0,0,0,0,98,111,114,0,0,0,0,0,92,98,101,103,105,110,123,112,105,99,116,117,114,101,125,40,37,100,44,37,100,41,40,48,44,48,41,37,37,10,0,0,37,37,32,71,78,85,80,76,79,84,58,32,76,97,84,101,88,32,112,105,99,116,117,114,101,32,119,105,116,104,32,80,111,115,116,115,99,114,105,112,116,10,92,98,101,103,105,110,103,114,111,117,112,37,37,10,92,109,97,107,101,97,116,108,101,116,116,101,114,37,37,10,92,110,101,119,99,111,109,109,97,110,100,123,92,71,78,85,80,76,79,84,115,112,101,99,105,97,108,125,123,37,37,10,32,32,92,64,115,97,110,105,116,105,122,101,92,99,97,116,99,111,100,101,96,92,37,37,61,49,52,92,114,101,108,97,120,92,115,112,101,99,105,97,108,125,37,37,10,92,115,101,116,108,101,110,103,116,104,123,92,117,110,105,116,108,101,110,103,116,104,125,123,37,46,52,102,98,112,125,37,37,10,0,80,108,111,116,32,102,97,105,108,101,100,33,0,0,0,0,111,114,32,115,101,116,32,116,104,101,32,108,111,97,100,112,97,116,104,32,97,112,112,114,111,112,114,105,97,116,101,108,121,10,0,0,0,0,0,0,86,84,45,108,105,107,101,32,116,101,107,52,48,120,120,32,116,101,114,109,105,110,97,108,32,101,109,117,108,97,116,111,114,0,0,0,0,0,0,0,111,114,32,115,101,116,32,116,104,101,32,101,110,118,105,114,111,110,109,101,110,116,97,108,32,118,97,114,105,97,98,108,101,32,71,78,85,80,76,79,84,95,80,83,95,68,73,82,10,0,0,0,0,0,0,0,118,105,36,101,119,0,0,0,108,36,111,97,100,0,0,0,80,108,101,97,115,101,32,99,111,112,121,32,37,115,32,116,111,32,111,110,101,32,111,102,32,116,104,101,32,97,98,111,118,101,32,100,105,114,101,99,116,111,114,105,101,115,10,0,9,114,111,116,97,116,101,100,32,105,102,32,116,104,101,32,116,101,114,109,105,110,97,108,32,97,108,108,111,119,115,32,105,116,10,9,0,0,0,0,103,97,112,0,0,0,0,0,32,92,10,0,0,0,0,0,67,97,110,39,116,32,102,105,110,100,32,80,111,115,116,83,99,114,105,112,116,32,112,114,111,108,111,103,117,101,32,102,105,108,101,32,37,115,10,0,71,80,86,65,76,95,86,73,69,87,95,82,79,84,95,90,0,0,0,0,0,0,0,0,71,78,85,80,76,79,84,95,80,83,95,68,73,82,0,0,80,114,111,108,111,103,32,110,97,109,101,0,0,0,0,0,10,9,84,104,101,32,102,111,108,108,111,119,105,110,103,32,98,105,110,97,114,121,32,100,97,116,97,32,115,105,122,101,115,32,97,116,116,101,109,112,116,32,116,111,32,98,101,32,109,97,99,104,105,110,101,32,105,110,100,101,112,101,110,100,101,110,116,58,10,10,9,32,32,110,97,109,101,32,40,115,105,122,101,32,105,110,32,98,121,116,101,115,41,10,10,0,47,117,115,114,47,108,111,99,97,108,47,115,104,97,114,101,47,103,110,117,112,108,111,116,47,52,46,54,47,80,111,115,116,83,99,114,105,112,116,0,97,103,108,105,115,116,0,0,97,103,108,102,110,46,116,120,116,0,0,0,0,0,0,0,47,76,84,51,32,123,32,80,76,32,91,56,32,100,108,49,32,53,32,100,108,49,32,48,46,53,32,100,108,49,32,53,32,100,108,49,93,32,49,32,48,32,49,32,68,76,32,125,32,100,101,102,10,0,0,0,71,80,86,65,76,95,78,97,78,0,0,0,0,0,0,0,47,76,84,50,32,123,32,80,76,32,91,52,32,100,108,49,32,52,32,100,108,49,93,32,48,32,49,32,49,32,68,76,32,125,32,100,101,102,10,0,118,116,116,101,107,0,0,0,47,76,84,49,32,123,32,80,76,32,91,56,32,100,108,49,32,53,32,100,108,49,93,32,48,32,48,32,49,32,68,76,32,125,32,100,101,102,10,0,118,101,36,114,115,105,111,110,0,0,0,0,0,0,0,0,47,76,84,48,32,123,32,80,76,32,91,93,32,49,32,48,32,48,32,68,76,32,125,32,100,101,102,10,0,0,0,0,116,111,112,0,0,0,0,0,99,111,108,117,109,110,115,36,116,97,99,107,101,100,0,0,32,37,115,37,115,116,105,99,115,32,37,115,109,37,115,116,105,99,115,0,0,0,0,0,47,76,84,97,32,123,32,65,76,32,91,49,32,117,100,108,32,109,117,108,32,50,32,117,100,108,32,109,117,108,93,32,48,32,115,101,116,100,97,115,104,32,48,32,48,32,48,32,115,101,116,114,103,98,99,111,108,111,114,32,125,32,100,101,102,10,0,0,0,0,0,0,71,80,86,65,76,95,86,73,69,87,95,82,79,84,95,88,0,0,0,0,0,0,0,0,47,76,84,98,32,123,32,66,76,32,91,93,32,48,32,48,32,48,32,68,76,32,125,32,100,101,102,10,0,0,0,0,47,76,84,119,32,123,32,80,76,32,91,93,32,49,32,115,101,116,103,114,97,121,32,125,32,100,101,102,10,0,0,0,40,37,100,41,10,0,0,0,93,32,41,10,0,0,0,0,37,32,82,101,100,101,102,105,110,101,32,108,105,110,101,32,116,121,112,101,115,32,116,111,32,109,97,116,99,104,32,111,108,100,32,101,112,115,108,97,116,101,120,32,100,114,105,118,101,114,10,0,0,0,0,0,119,36,105,116,104,0,0,0,99,117,114,114,101,110,116,100,105,99,116,32,101,110,100,32,100,101,102,105,110,101,102,111,110,116,32,112,111,112,10,0,100,117,112,32,108,101,110,103,116,104,32,100,105,99,116,32,98,101,103,105,110,32,123,49,32,105,110,100,101,120,32,47,70,73,68,32,101,113,32,123,112,111,112,32,112,111,112,125,32,123,100,101,102,125,32,105,102,101,108,115,101,125,32,102,111,114,97,108,108,10,0,0,45,101,0,0,0,0,0,0,47,67,77,69,88,49,48,45,66,97,115,101,108,105,110,101,32,47,67,77,69,88,49,48,32,102,105,110,100,102,111,110,116,32,91,49,32,48,32,48,32,49,32,48,32,49,93,32,109,97,107,101,102,111,110,116,10,0,0,0,0,0,0,0,71,80,86,65,76,95,112,105,0,0,0,0,0,0,0,0,37,37,66,101,103,105,110,80,114,111,99,83,101,116,58,32,67,77,69,88,49,48,45,66,97,115,101,108,105,110,101,10,0,0,0,0,0,0,0,0,114,101,102,114,101,115,104,10,0,0,0,0,0,0,0,0,84,101,107,116,114,111,110,105,120,32,52,48,49,48,32,97,110,100,32,111,116,104,101,114,115,59,32,109,111,115,116,32,84,69,75,32,101,109,117,108,97,116,111,114,115,0,0,0,67,77,69,88,49,48,0,0,116,105,116,36,108,101,0,0,76,105,110,101,102,101,101,100,0,0,0,0,0,0,0,0,37,37,69,110,100,80,114,111,99,83,101,116,10,0,0,0,98,111,116,116,111,109,0,0,114,111,119,115,36,116,97,99,107,101,100,0,0,0,0,0,115,101,116,32,103,114,105,100,0,0,0,0,0,0,0,0,67,111,109,109,97,110,100,32,39,37,115,39,32,103,101,110,101,114,97,116,101,100,32,101,114,114,111,114,44,32,101,120,105,116,99,111,100,101,32,105,115,32,37,100,0,0,0,0,110,111,116,32,101,110,111,117,103,104,32,109,101,109,111,114,121,32,116,111,32,108,111,97,100,32,102,105,108,101,0,0,67,97,110,39,116,32,99,97,108,99,117,108,97,116,101,32,99,117,98,105,99,32,115,112,108,105,110,101,115,0,0,0,96,98,117,105,108,116,105,110,45,114,111,116,97,116,101,45,100,111,119,110,96,32,111,110,108,121,32,102,111,114,32,115,112,108,111,116,115,59,32,60,115,104,105,102,116,62,32,105,110,99,114,101,97,115,101,115,32,97,109,111,117,110,116,0,80,105,112,101,32,39,37,115,39,32,99,111,110,116,97,105,110,115,32,116,104,101,32,102,111,110,116,32,39,37,115,39,46,10,0,0,0,0,0,0,105,110,116,101,114,110,97,108,32,101,114,114,111,114,32,58,32,115,116,114,108,101,110,32,111,102,32,110,111,110,45,83,84,82,73,78,71,32,97,114,103,117,109,101,110,116,0,0,70,111,110,116,32,102,105,108,101,32,39,37,115,39,32,99,111,110,116,97,105,110,115,32,116,104,101,32,102,111,110,116,32,39,37,115,39,46,32,76,111,99,97,116,105,111,110,58,10,32,32,32,37,115,10,0,108,111,97,100,95,102,111,110,116,102,105,108,101,115,0,0,47,70,111,110,116,78,97,109,101,0,0,0,0,0,0,0,70,111,110,116,32,102,105,108,101,32,39,37,115,39,32,115,101,101,109,115,32,110,111,116,32,116,111,32,98,101,32,97,32,80,70,65,32,102,105,108,101,0,0,0,0,0,0,0,67,111,109,109,97,110,100,32,39,37,115,39,32,115,101,101,109,115,32,110,111,116,32,116,111,32,103,101,110,101,114,97,116,101,32,80,70,65,32,100,97,116,97,0,0,0,0,0,71,80,86,65,76,95,84,69,82,77,73,78,65,76,83,0,37,33,70,111,110,116,84,121,112,101,49,0,0,0,0,0,116,101,107,52,48,120,120,0,37,33,80,83,45,65,100,111,98,101,70,111,110,116,0,0,116,105,109,36,101,115,116,97,109,112,0,0,0,0,0,0,70,111,110,116,32,102,105,108,101,32,39,37,115,39,32,104,97,115,32,117,110,107,110,111,119,110,32,101,120,116,101,110,115,105,111,110,46,32,65,115,115,117,109,101,32,105,116,32,105,115,32,97,32,112,102,97,32,102,105,108,101,0,0,0,9,119,114,105,116,116,101,110,32,105,110,32,37,115,32,99,111,114,110,101,114,10,0,0,101,114,114,111,114,36,98,97,114,115,0,0,0,0,0,0,115,101,116,32,103,114,105,100,32,110,111,112,111,108,97,114,10,0,0,0,0,0,0,0,112,102,97,0,0,0,0,0,78,111,32,99,111,109,109,97,110,100,32,102,111,114,32,97,117,116,111,109,97,116,105,99,32,102,111,110,116,32,99,111,110,118,101,114,115,105,111,110,32,112,102,98,45,62,112,102,97,32,100,101,102,105,110,101,100,0,0,0,0,0,0,0,112,102,98,116,111,112,115,32,37,115,0,0,0,0,0,0,9,32,32,0,0,0,0,0,67,97,110,39,116,32,112,108,111,116,32,119,105,116,104,32,97,110,32,101,109,112,116,121,32,37,115,32,114,97,110,103,101,33,0,0,0,0,0,0,71,78,85,80,76,79,84,95,80,70,66,84,79,80,70,65,0,0,0,0,0,0,0,0,112,102,98,0,0,0,0,0,117,110,115,101,116,32,104,105,100,100,101,110,51,100,10,0,67,111,117,108,100,32,110,111,116,32,101,120,101,99,117,116,101,32,99,111,109,109,97,110,100,32,39,37,115,39,0,0,78,111,32,99,111,109,109,97,110,100,32,102,111,114,32,97,117,116,111,109,97,116,105,99,32,102,111,110,116,32,99,111,110,118,101,114,115,105,111,110,32,116,116,102,45,62,112,102,97,32,100,101,102,105,110,101,100,0,0,0,0,0,0,0,110,101,119,32,107,101,121,32,108,105,115,116,0,0,0,0,116,116,102,50,112,116,49,32,45,97,32,45,101,32,45,87,32,48,32,37,115,32,45,0,84,101,107,116,114,111,110,105,120,32,52,49,48,54,44,32,52,49,48,55,44,32,52,49,48,57,32,97,110,100,32,52,50,48,88,32,116,101,114,109,105,110,97,108,115,0,0,0,71,78,85,80,76,79,84,95,84,84,70,84,79,80,70,65,0,0,0,0,0,0,0,0,116,105,109,101,102,36,109,116,0,0,0,0,0,0,0,0,111,116,102,0,0,0,0,0,99,108,117,115,116,36,101,114,101,100,0,0,0,0,0,0,115,101,116,32,103,114,105,100,32,112,111,108,97,114,32,37,102,10,0,0,0,0,0,0,116,116,102,0,0,0,0,0,112,0,0,0,0,0,0,0,37,37,37,37,66,101,103,105,110,80,114,111,99,83,101,116,58,32,37,115,10,0,0,0,80,83,95,101,115,99,97,112,101,95,115,116,114,105,110,103,0,0,0,0,0,0,0,0,9,84,104,101,32,102,111,108,108,111,119,105,110,103,32,98,105,110,97,114,121,32,100,97,116,97,32,115,105,122,101,115,32,97,114,101,32,109,97,99,104,105,110,101,32,100,101,112,101,110,100,101,110,116,58,10,10,9,32,32,110,97,109,101,32,40,115,105,122,101,32,105,110,32,98,121,116,101,115,41,10,10,0,0,0,0,0,0,76,111,103,32,115,99,97,108,105,110,103,32,111,102,32,51,68,32,105,109,97,103,101,32,112,108,111,116,115,32,105,115,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,0,101,110,100,10,37,37,69,110,100,80,114,111,108,111,103,10,0,0,0,0,0,0,0,0,40,41,92,0,0,0,0,0,115,116,97,116,117,115,100,105,99,116,32,98,101,103,105,110,32,37,115,32,115,101,116,100,117,112,108,101,120,109,111,100,101,32,101,110,100,10,0,0,79,114,105,103,105,110,95,50,0,0,0,0,0,0,0,0,117,116,102,45,56,46,112,115,0,0,0,0,0,0,0,0,71,80,86,65,76,95,67,79,77,80,73,76,69,95,79,80,84,73,79,78,83,0,0,0,107,111,105,56,117,46,112,115,0,0,0,0,0,0,0,0,116,101,107,52,49,48,120,0,107,111,105,56,114,46,112,115,0,0,0,0,0,0,0,0,116,105,99,115,108,36,101,118,101,108,0,0,0,0,0,0,99,112,49,50,53,49,46,112,115,0,0,0,0,0,0,0,9,115,101,116,32,37,115,100,97,116,97,32,116,105,109,101,10,0,0,0,0,0,0,0,117,110,115,101,116,32,103,114,105,100,10,0,0,0,0,0,99,112,49,50,53,48,46,112,115,0,0,0,0,0,0,0,110,0,0,0,0,0,0,0,99,112,56,53,50,46,112,115,0,0,0,0,0,0,0,0,99,112,56,53,48,46,112,115,0,0,0,0,0,0,0,0,99,112,52,51,55,46,112,115,0,0,0,0,0,0,0,0,56,56,53,57,45,49,53,46,112,115,0,0,0,0,0,0,56,56,53,57,45,57,46,112,115,0,0,0,0,0,0,0,56,56,53,57,45,50,46,112,115,0,0,0,0,0,0,0,108,111,97,100,112,97,116,104,32,61,61,32,78,85,76,76,0,0,0,0,0,0,0,0,71,80,86,65,76,95,80,65,84,67,72,76,69,86,69,76,0,0,0,0,0,0,0,0,56,56,53,57,45,49,46,112,115,0,0,0,0,0,0,0,120,94,51,0,0,0,0,0,82,69,71,73,83,32,103,114,97,112,104,105,99,115,32,108,97,110,103,117,97,103,101,0,112,114,111,108,111,103,117,101,46,112,115,0,0,0,0,0,116,105,99,115,99,36,97,108,101,0,0,0,0,0,0,0,47,100,111,99,108,105,112,32,123,10,32,32,67,108,105,112,84,111,66,111,117,110,100,105,110,103,66,111,120,32,123,10,32,32,32,32,110,101,119,112,97,116,104,32,37,100,32,37,100,32,109,111,118,101,116,111,32,37,100,32,37,100,32,108,105,110,101,116,111,32,37,100,32,37,100,32,108,105,110,101,116,111,32,37,100,32,37,100,32,108,105,110,101,116,111,32,99,108,111,115,101,112,97,116,104,10,32,32,32,32,99,108,105,112,10,32,32,125,32,105,102,10,125,32,100,101,102,10,0,0,0,0,0,0,0,0,104,115,0,0,0,0,0,0,115,101,116,32,116,105,99,115,32,37,115,10,0,0,0,0,37,37,80,97,103,101,115,58,32,40,97,116,101,110,100,41,10,0,0,0,0,0,0,0,80,111,114,116,114,97,105,116,0,0,0,0,0,0,0,0,76,97,110,100,115,99,97,112,101,0,0,0,0,0,0,0,44,32,37,100,32,98,101,102,111,114,101,32,112,108,97,110,101,0,0,0,0,0,0,0,37,37,37,37,79,114,105,101,110,116,97,116,105,111,110,58,32,37,115,10,0,0,0,0,37,37,37,37,66,111,117,110,100,105,110,103,66,111,120,58,32,37,100,32,37,100,32,37,100,32,37,100,10,0,0,0,40,97,116,101,110,100,41,0,37,37,37,37,84,105,116,108,101,58,32,37,115,10,0,0,71,80,86,65,76,95,86,69,82,83,73,79,78,0,0,0,37,33,80,83,45,65,100,111,98,101,45,50,46,48,10,0,114,101,103,105,115,0,0,0,37,33,80,83,45,65,100,111,98,101,45,50,46,48,32,69,80,83,70,45,50,46,48,10,0,0,0,0,0,0,0,0,116,105,36,99,115,0,0,0,101,112,115,0,0,0,0,0,40,0,0,0,0,0,0,0,32,110,111,101,110,104,97,110,99,101,100,0,0,0,0,0,117,110,36,115,111,114,116,101,100,0,0,0,0,0,0,0,105,110,118,97,108,105,100,32,112,111,115,116,115,99,114,105,112,116,32,102,111,114,109,97,116,32,117,115,101,100,0,0,37,37,37,37,80,97,103,101,115,58,32,37,100,10,0,0,37,115,37,115,0,0,0,0,44,32,37,100,32,98,101,102,111,114,101,32,108,105,110,101,0,0,0,0,0,0,0,0,37,37,68,111,99,117,109,101,110,116,70,111,110,116,115,58,32,0,0,0,0,0,0,0,35,0,0,0,0,0,0,0,37,37,84,114,97,105,108,101,114,10,0,0,0,0,0,0,115,116,114,111,107,101,10,103,114,101,115,116,111,114,101,10,101,110,100,10,115,104,111,119,112,97,103,101,10,0,0,0,77,82,115,104,111,119,10,0,66,97,100,32,102,117,108,108,32,109,111,110,116,104,32,110,97,109,101,0,0,0,0,0,71,80,86,65,76,95,69,82,82,78,79,0,0,0,0,0,77,67,115,104,111,119,10,0,71,80,73,67,32,45,45,32,80,114,111,100,117,99,101,32,103,114,97,112,104,115,32,105,110,32,103,114,111,102,102,32,117,115,105,110,103,32,116,104,101,32,103,112,105,99,32,112,114,101,112,114,111,99,101,115,115,111,114,0,0,0,0,0,77,76,115,104,111,119,10,0,116,101,114,109,111,36,112,116,105,111,110,115,0,0,0,0,93,32,37,46,49,102,32,0,44,32,114,111,116,97,116,101,100,32,98,121,32,37,100,32,100,101,103,114,101,101,115,32,105,110,32,50,68,32,112,108,111,116,115,0,0,0,0,0,115,111,36,114,116,101,100,0,92,37,111,0,0,0,0,0,91,32,0,0,0,0,0,0,99,117,114,114,101,110,116,112,111,105,110,116,32,103,115,97,118,101,32,116,114,97,110,115,108,97,116,101,32,37,100,32,114,111,116,97,116,101,32,48,32,48,32,109,111,118,101,116,111,10,0,0,0,0,0,0,10,9,32,32,32,32,83,107,105,112,32,98,121,116,101,115,58,32,37,100,32,98,101,102,111,114,101,32,114,101,99,111,114,100,0,0,0,0,0,0,47,88,89,114,101,115,116,111,114,101,32,123,32,91,40,32,41,32,49,32,50,32,116,114,117,101,32,102,97,108,115,101,32,52,32,40,41,93,32,125,32,98,105,110,100,32,100,101,102,10,0,0,0,0,0,0,47,88,89,115,97,118,101,32,32,32,32,123,32,91,40,32,41,32,49,32,50,32,116,114,117,101,32,102,97,108,115,101,32,51,32,40,41,93,32,125,32,98,105,110,100,32,100,101,102,10,0,0,0,0,0,0,101,120,112,97,110,100,32,102,111,110,116,112,97,116,104,0,32,32,101,120,99,104,32,100,117,112,32,77,70,119,105,100,116,104,32,45,50,32,100,105,118,32,51,32,45,49,32,114,111,108,108,32,82,10,32,32,66,108,97,99,107,116,101,120,116,32,123,103,115,97,118,101,32,48,32,115,101,116,103,114,97,121,32,77,70,115,104,111,119,32,103,114,101,115,116,111,114,101,125,32,123,77,70,115,104,111,119,125,32,105,102,101,108,115,101,32,125,32,98,105,110,100,32,100,101,102,10,0,101,37,43,48,50,100,0,0,47,77,67,115,104,111,119,32,123,32,99,117,114,114,101,110,116,112,111,105,110,116,32,115,116,114,111,107,101,32,77,10,0,0,0,0,0,0,0,0,10,9,100,117,109,109,121,32,118,97,114,105,97,98,108,101,32,105,115,32,120,32,102,111,114,32,99,117,114,118,101,115,10,0,0,0,0,0,0,0,37,72,58,37,77,0,0,0,71,80,86,65,76,95,69,78,67,79,68,73,78,71,0,0,32,32,101,120,99,104,32,100,117,112,32,77,70,119,105,100,116,104,32,110,101,103,32,51,32,45,49,32,114,111,108,108,32,82,10,32,32,66,108,97,99,107,116,101,120,116,32,123,103,115,97,118,101,32,48,32,115,101,116,103,114,97,121,32,77,70,115,104,111,119,32,103,114,101,115,116,111,114,101,125,32,123,77,70,115,104,111,119,125,32,105,102,101,108,115,101,32,125,32,98,105,110,100,32,100,101,102,10,0,0,0,0,103,112,105,99,0,0,0,0,47,77,82,115,104,111,119,32,123,32,99,117,114,114,101,110,116,112,111,105,110,116,32,115,116,114,111,107,101,32,77,10,0,0,0,0,0,0,0,0,116,97,98,108,101,0,0,0,32,32,48,32,101,120,99,104,32,82,10,32,32,66,108,97,99,107,116,101,120,116,32,123,103,115,97,118,101,32,48,32,115,101,116,103,114,97,121,32,77,70,115,104,111,119,32,103,114,101,115,116,111,114,101,125,32,123,77,70,115,104,111,119,125,32,105,102,101,108,115,101,32,125,32,98,105,110,100,32,100,101,102,10,0,0,0,0,44,32,112,97,114,97,108,108,101,108,32,116,111,32,97,120,105,115,32,105,110,32,51,68,32,112,108,111,116,115,0,0,101,120,112,101,99,116,105,110,103,32,39,120,39,44,32,39,120,50,39,44,32,39,97,117,116,111,39,32,111,114,32,39,111,102,102,39,0,0,0,0,115,101,116,32,97,110,103,108,101,115,32,37,115,10,0,0,47,77,76,115,104,111,119,32,123,32,99,117,114,114,101,110,116,112,111,105,110,116,32,115,116,114,111,107,101,32,77,10,0,0,0,0,0,0,0,0,32,32,32,32,32,54,32,103,101,116,32,71,115,119,105,100,116,104,32,112,111,112,32,97,100,100,125,32,123,112,111,112,125,32,105,102,101,108,115,101,125,32,105,102,101,108,115,101,125,32,102,111,114,97,108,108,125,32,100,101,102,10,0,0,32,123,100,117,112,32,51,32,103,101,116,123,100,117,112,32,100,117,112,32,48,32,103,101,116,32,102,105,110,100,102,111,110,116,32,101,120,99,104,32,49,32,103,101,116,32,115,99,97,108,101,102,111,110,116,32,115,101,116,102,111,110,116,10,0,0,0,0,0,0,0,0,37,50,46,50,115,0,0,0,115,106,105,115,0,0,0,0,47,77,70,119,105,100,116,104,32,123,48,32,101,120,99,104,32,123,32,100,117,112,32,53,32,103,101,116,32,51,32,103,101,32,123,32,53,32,103,101,116,32,51,32,101,113,32,123,32,48,32,125,32,123,32,112,111,112,32,125,32,105,102,101,108,115,101,32,125,10,0,0,84,97,98,117,108,97,114,32,111,117,116,112,117,116,32,111,102,32,37,115,32,112,108,111,116,32,115,116,121,108,101,32,110,111,116,32,102,117,108,108,121,32,105,109,112,108,101,109,101,110,116,101,100,10,0,0,108,97,110,100,0,0,0,0,47,71,115,119,105,100,116,104,32,123,100,117,112,32,116,121,112,101,32,47,115,116,114,105,110,103,116,121,112,101,32,101,113,32,123,115,116,114,105,110,103,119,105,100,116,104,125,32,123,112,111,112,32,40,110,41,32,115,116,114,105,110,103,119,105,100,116,104,125,32,105,102,101,108,115,101,125,32,100,101,102,10,0,0,0,0,0,0,32,32,32,102,111,114,97,108,108,125,32,100,101,102,10,0,32,32,32,32,32,105,102,101,108,115,101,32,125,10,0,0,71,80,86,65,76,95,79,85,84,80,85,84,0,0,0,0,32,32,32,32,32,112,111,112,32,97,108,111,97,100,32,112,111,112,32,77,125,32,105,102,101,108,115,101,32,125,105,102,101,108,115,101,32,125,105,102,101,108,115,101,32,125,10,0,85,110,107,110,111,119,110,32,116,101,114,109,105,110,97,108,32,116,121,112,101,32,45,32,110,111,116,32,97,32,112,108,111,116,116,105,110,103,32,100,101,118,105,99,101,0,0,0,32,32,32,32,32,115,104,111,119,32,50,32,105,110,100,101,120,32,123,97,108,111,97,100,32,112,111,112,32,77,32,110,101,103,32,51,32,45,49,32,114,111,108,108,32,110,101,103,32,82,32,112,111,112,32,112,111,112,125,32,123,112,111,112,32,112,111,112,32,112,111,112,10,0,0,0,0,0,0,0,115,117,36,114,102,97,99,101,0,0,0,0,0,0,0,0,101,108,115,101,0,0,0,0,32,32,32,32,32,100,117,112,32,48,32,82,125,32,123,100,117,112,32,54,32,103,101,116,32,115,116,114,105,110,103,119,105,100,116,104,32,112,111,112,32,45,50,32,100,105,118,32,48,32,82,32,54,32,103,101,116,10,0,0,0,0,0,0,44,32,117,115,105,110,103,32,102,111,110,116,32,34,37,115,34,0,0,0,0,0,0,0,97,117,116,111,0,0,0,0,78,111,32,118,97,108,105,100,32,100,97,116,97,32,112,111,105,110,116,115,32,102,111,117,110,100,32,105,110,32,102,105,108,101,0,0,0,0,0,0,115,101,116,32,102,111,114,109,97,116,32,37,115,32,34,37,115,34,10,0,0,0,0,0,32,32,32,32,32,103,101,116,32,49,32,101,113,32,123,100,117,112,32,50,32,103,101,116,32,101,120,99,104,32,100,117,112,32,51,32,103,101,116,32,101,120,99,104,32,54,32,103,101,116,32,115,116,114,105,110,103,119,105,100,116,104,32,112,111,112,32,45,50,32,100,105,118,10,0,0,0,0,0,0,32,32,32,32,32,123,100,117,112,32,51,32,103,101,116,32,123,50,32,103,101,116,32,110,101,103,32,48,32,101,120,99,104,32,82,32,112,111,112,125,32,123,112,111,112,32,97,108,111,97,100,32,112,111,112,32,77,125,32,105,102,101,108,115,101,125,32,123,100,117,112,32,53,10,0,0,0,0,0,0,32,32,32,32,32,103,101,116,32,101,120,99,104,32,52,32,103,101,116,32,123,71,115,104,111,119,125,32,123,115,116,114,105,110,103,119,105,100,116,104,32,112,111,112,32,48,32,82,125,32,105,102,101,108,115,101,32,125,105,102,32,100,117,112,32,53,32,103,101,116,32,48,32,101,113,10,0,0,0,0,10,9,32,32,32,32,83,99,97,110,58,32,0,0,0,0,32,32,32,32,32,91,32,99,117,114,114,101,110,116,112,111,105,110,116,32,93,32,101,120,99,104,32,100,117,112,32,50,32,103,101,116,32,48,32,101,120,99,104,32,82,32,100,117,112,32,53,32,103,101,116,32,50,32,110,101,32,123,100,117,112,32,100,117,112,32,54,10,0,0,0,0,0,0,0,0,32,32,32,32,32,123,100,117,112,32,100,117,112,32,48,32,103,101,116,32,102,105,110,100,102,111,110,116,32,101,120,99,104,32,49,32,103,101,116,32,115,99,97,108,101,102,111,110,116,32,115,101,116,102,111,110,116,10,0,0,0,0,0,0,32,32,32,32,32,123,32,53,32,103,101,116,32,51,32,101,113,32,123,103,115,97,118,101,125,32,123,103,114,101,115,116,111,114,101,125,32,105,102,101,108,115,101,32,125,10,0,0,45,76,73,66,71,68,32,32,0,0,0,0,0,0,0,0,32,32,32,123,32,100,117,112,32,53,32,103,101,116,32,51,32,103,101,10,0,0,0,0,71,80,86,65,76,95,84,69,82,77,79,80,84,73,79,78,83,0,0,0,0,0,0,0,47,77,70,115,104,111,119,32,123,10,0,0,0,0,0,0,123,125,94,95,64,38,126,10,0,0,0,0,0,0,0,0,125,32,105,102,10,0,0,0,115,116,36,121,108,101,0,0,103,115,97,118,101,32,66,97,99,107,103,114,111,117,110,100,67,111,108,111,114,32,67,32,99,108,105,112,112,97,116,104,32,102,105,108,108,32,103,114,101,115,116,111,114,101,0,0,9,37,115,37,115,32,105,115,32,34,37,115,34,44,32,111,102,102,115,101,116,32,97,116,32,0,0,0,0,0,0,0,116,101,120,116,95,108,97,98,101,108,0,0,0,0,0,0,115,101,116,32,100,117,109,109,121,32,37,115,44,37,115,10,0,0,0,0,0,0,0,0,66,97,99,107,103,114,111,117,110,100,67,111,108,111,114,32,67,32,49,46,48,48,48,32,48,32,48,32,37,46,50,102,32,37,46,50,102,32,66,111,120,67,111,108,70,105,108,108,0,0,0,0,0,0,0,0,66,97,99,107,103,114,111,117,110,100,67,111,108,111,114,32,48,32,108,116,32,51,32,49,32,114,111,108,108,32,48,32,108,116,32,101,120,99,104,32,48,32,108,116,32,111,114,32,111,114,32,110,111,116,32,123,0,0,0,0,0,0,0,0,40,37,115,41,32,102,105,110,100,102,111,110,116,32,37,100,32,115,99,97,108,101,102,111,110,116,32,115,101,116,102,111,110,116,10,0,0,0,0,0,10,9,32,32,32,32,51,68,32,110,111,114,109,97,108,32,118,101,99,116,111,114,58,32,40,37,102,44,32,37,102,44,32,37,102,41,0,0,0,0,32,32,35,32,40,99,117,114,114,101,110,116,108,121,32,91,0,0,0,0,0,0,0,0,48,32,115,101,116,103,114,97,121,10,110,101,119,112,97,116,104,10,0,0,0,0,0,0,110,111,116,36,105,116,108,101,0,0,0,0,0,0,0,0,57,48,32,114,111,116,97,116,101,10,48,32,37,100,32,116,114,97,110,115,108,97,116,101,10,0,0,0,0,0,0,0,103,110,117,100,105,99,116,32,98,101,103,105,110,10,103,115,97,118,101,10,100,111,99,108,105,112,10,37,100,32,37,100,32,116,114,97,110,115,108,97,116,101,10,37,46,51,102,32,37,46,51,102,32,115,99,97,108,101,10,0,0,0,0,0,45,0,0,0,0,0,0,0,87,114,105,116,105,110,103,32,111,117,116,32,80,111,115,116,83,99,114,105,112,116,32,109,97,99,114,111,115,32,102,111,114,32,101,110,104,97,110,99,101,100,32,116,101,120,116,32,109,111,100,101,10,0,0,0,37,37,37,37,80,97,103,101,58,32,37,100,32,37,100,10,0,0,0,0,0,0,0,0,46,0,0,0,0,0,0,0,37,100,32,37,100,32,78,10,0,0,0,0,0,0,0,0,71,80,95,70,73,82,83,84,95,75,69,89,0,0,0,0,37,100,32,37,100,32,82,10,0,0,0,0,0,0,0,0,108,97,98,101,108,0,0,0,47,121,48,32,121,48,32,121,115,116,101,112,32,97,100,100,32,100,101,102,32,47,105,105,32,105,105,32,49,32,97,100,100,32,100,101,102,10,105,105,32,105,109,97,120,32,103,101,32,123,101,120,105,116,125,32,105,102,32,125,32,108,111,111,112,10,103,114,101,115,116,111,114,101,32,48,32,115,101,116,103,114,97,121,10,0,0,0,120,0,0,0,0,0,0,0,32,107,100,101,110,115,105,116,121,50,100,0,0,0,0,0,37,100,32,37,100,32,77,10,0,0,0,0,0,0,0,0,116,111,107,101,110,95,116,97,98,108,101,95,115,105,122,101,32,62,61,32,108,102,45,62,110,117,109,95,116,111,107,101,110,115,43,49,0,0,0,0,67,97,110,39,116,32,99,97,108,99,117,108,97,116,101,32,115,112,108,105,110,101,115,44,32,110,101,101,100,32,97,116,32,108,101,97,115,116,32,51,32,112,111,105,110,116,115,0,115,116,114,111,107,101,32,37,100,32,37,100,32,77,10,0,105,110,116,101,114,110,97,108,32,101,114,114,111,114,32,58,32,83,84,82,73,78,71,32,111,112,101,114,97,116,111,114,32,97,112,112,108,105,101,100,32,116,111,32,110,111,110,45,83,84,82,73,78,71,32,116,121,112,101,0,0,0,0,0,37,100,32,37,100,32,86,10,0,0,0,0,0,0,0,0,10,9,32,32,32,32,50,68,32,114,111,116,97,116,105,111,110,32,97,110,103,108,101,58,32,37,102,0,0,0,0,0,37,100,32,37,100,32,76,10,0,0,0,0,0,0,0,0,76,84,37,99,10,0,0,0,41,32,82,115,104,111,119,10,0,0,0,0,0,0,0,0,41,32,67,115,104,111,119,10,0,0,0,0,0,0,0,0,71,80,86,65,76,95,84,69,82,77,0,0,0,0,0,0,41,32,76,115,104,111,119,10,0,0,0,0,0,0,0,0,101,115,116,105,109,97,116,101,32,119,105,100,116,104,32,111,102,32,101,110,104,97,110,99,101,100,32,116,101,120,116,32,115,116,114,105,110,103,0,0,93,32,71,82,115,104,111,119,10,0,0,0,0,0,0,0,115,97,36,109,112,108,101,115,0,0,0,0,0,0,0,0,93,32,71,67,115,104,111,119,10,0,0,0,0,0,0,0,110,117,109,101,114,105,99,97,108,0,0,0,0,0,0,0,115,101,116,32,100,103,114,105,100,51,100,32,37,100,44,37,100,32,37,115,37,115,32,37,102,44,37,102,10,0,0,0,93,32,71,76,115,104,111,119,10,0,0,0,0,0,0,0,99,117,114,114,101,110,116,112,111,105,110,116,32,103,115,97,118,101,32,116,114,97,110,115,108,97,116,101,32,37,100,32,114,111,116,97,116,101,32,48,32,48,32,77,10,0,0,0,37,100,32,37,100,32,37,115,10,0,0,0,0,0,0,0,32,40,37,102,44,32,37,102,44,32,37,102,41,0,0,0,97,100,106,117,115,116,105,110,103,32,116,111,32,91,37,103,58,37,103,93,10,0,0,0,80,101,110,116,87,0,0,0,68,105,97,87,0,0,0,0,84,114,105,68,87,0,0,0,84,114,105,85,87,0,0,0,110,101,119,32,108,105,110,101,32,98,117,102,102,101,114,0,67,105,114,99,87,0,0,0,101,115,116,105,109,97,116,101,0,0,0,0,0,0,0,0,66,111,120,87,0,0,0,0,111,98,106,36,101,99,116,0,80,101,110,116,69,0,0,0,108,97,98,36,101,108,115,0,115,101,116,32,100,103,114,105,100,51,100,32,37,100,44,37,100,32,115,112,108,105,110,101,115,10,0,0,0,0,0,0,68,105,97,69,0,0,0,0,84,114,105,68,69,0,0,0,105,115,111,95,56,56,53,57,95,49,0,0,0,0,0,0,84,114,105,85,69,0,0,0,10,9,32,32,32,32,67,101,110,116,101,114,58,0,0,0,67,105,114,99,69,0,0,0,73,109,97,103,101,32,103,114,105,100,32,109,117,115,116,32,98,101,32,97,116,32,108,101,97,115,116,32,52,32,112,111,105,110,116,115,32,40,50,32,120,32,50,41,46,10,10,0,66,111,120,69,0,0,0,0,68,49,53,0,0,0,0,0,68,49,52,0,0,0,0,0,85,110,107,110,111,119,110,32,112,111,105,110,116,32,116,121,112,101,32,105,110,32,112,108,111,116,51,100,95,108,105,110,101,115,0,0,0,0,0,0,79,114,105,103,105,110,95,49,0,0,0,0,0,0,0,0,10,35,32,67,117,114,118,101,32,37,100,32,111,102,32,37,100,44,32,37,100,32,112,111,105,110,116,115,0,0,0,0,68,49,51,0,0,0,0,0,123,125,36,91,93,92,0,0,68,49,50,0,0,0,0,0,112,115,100,105,114,0,0,0,68,49,49,0,0,0,0,0,9,37,115,32,105,115,32,115,101,116,32,116,111,32,37,115,10,0,0,0,0,0,0,0,115,101,112,97,114,97,116,105,111,110,32,109,117,115,116,32,98,101,32,62,32,48,0,0,115,101,116,32,100,103,114,105,100,51,100,32,37,100,44,37,100,44,32,37,100,10,0,0,68,49,48,0,0,0,0,0,76,0,0,0,0,0,0,0,68,57,0,0,0,0,0,0,68,56,0,0,0,0,0,0,10,9,32,32,32,32,79,114,105,103,105,110,58,0,0,0,68,55,0,0,0,0,0,0,68,54,0,0,0,0,0,0,68,53,0,0,0,0,0,0,68,52,0,0,0,0,0,0,68,51,0,0,0,0,0,0,100,117,112,32,100,117,112,32,109,117,108,32,109,117,108,0,101,110,104,97,110,99,101,100,32,116,101,120,116,32,109,111,100,101,32,112,97,114,115,105,110,103,32,101,114,114,111,114,0,0,0,0,0,0,0,0,68,50,0,0,0,0,0,0,112,111,108,36,97,114,0,0,68,49,0,0,0,0,0,0,9,114,101,97,100,32,102,111,114,109,97,116,32,102,111,114,32,116,105,109,101,32,111,110,32,37,115,32,97,120,105,115,32,105,115,32,34,37,115,34,10,0,0,0,0,0,0,0,115,101,112,36,97,114,97,116,105,111,110,0,0,0,0,0,121,121,10,0,0,0,0,0,68,48,0,0,0,0,0,0,108,0,0,0,0,0,0,0,83,49,53,0,0,0,0,0,83,49,52,0,0,0,0,0,44,32,100,122,61,37,102,0,83,49,51,0,0,0,0,0,83,49,50,0,0,0,0,0,83,49,49,0,0,0,0,0,83,49,48,0,0,0,0,0,83,57,0,0,0,0,0,0,101,110,104,97,110,99,101,100,32,116,101,120,116,32,109,111,100,101,32,112,97,114,115,101,114,32,45,32,105,103,110,111,114,105,110,103,32,115,112,117,114,105,111,117,115,32,125,0,83,56,0,0,0,0,0,0,112,111,105,36,110,116,115,105,122,101,0,0,0,0,0,0,83,55,0,0,0,0,0,0,9,122,101,114,111,32,105,115,32,37,103,10,0,0,0,0,83,54,0,0,0,0,0,0,102,105,110,97,110,99,101,36,98,97,114,115,0,0,0,0,120,120,10,0,0,0,0,0,114,101,115,105,122,101,95,100,121,110,97,114,114,97,121,58,32,100,121,110,97,114,114,97,121,32,119,97,115,110,39,116,32,105,110,105,116,105,97,108,105,122,101,100,33,0,0,0,104,0,0,0,0,0,0,0,83,53,0,0,0,0,0,0,83,52,0,0,0,0,0,0,44,32,100,121,61,37,102,0,83,51,0,0,0,0,0,0,83,50,0,0,0,0,0,0,73,47,79,32,101,114,114,111,114,32,100,117,114,105,110,103,32,117,112,100,97,116,101,0,83,49,0,0,0,0,0,0,83,48,0,0,0,0,0,0,71,80,86,65,76,95,86,73,69,87,95,77,65,80,0,0,67,49,53,0,0,0,0,0,115,118,103,0,0,0,0,0,67,49,52,0,0,0,0,0,112,111,105,110,116,105,110,116,36,101,114,118,97,108,98,111,120,0,0,0,0,0,0,0,67,49,51,0,0,0,0,0,102,105,108,101,116,36,121,112,101,115,0,0,0,0,0,0,99,97,110,100,108,101,36,115,116,105,99,107,115,0,0,0,120,121,10,0,0,0,0,0,67,49,50,0,0,0,0,0,103,0,0,0,0,0,0,0,67,49,49,0,0,0,0,0,67,49,48,0,0,0,0,0,10,9,32,32,32,32,83,97,109,112,108,101,32,112,101,114,105,111,100,115,58,32,100,120,61,37,102,0,0,0,0,0,67,57,0,0,0,0,0,0,67,56,0,0,0,0,0,0,36,96,0,0,0,0,0,0,67,55,0,0,0,0,0,0,121,122,97,102,112,110,117,109,32,107,77,71,84,80,69,90,89,0,0,0,0,0,0,0,67,54,0,0,0,0,0,0,37,73,58,37,77,58,37,83,32,37,112,0,0,0,0,0,71,80,86,65,76,95,83,80,76,79,84,0,0,0,0,0,67,53,0,0,0,0,0,0,101,110,104,97,110,99,101,100,32,116,101,120,116,32,112,97,114,115,101,114,32,45,45,32,115,112,117,114,105,111,117,115,32,98,97,99,107,115,108,97,115,104,0,0,0,0,0,0,67,52,0,0,0,0,0,0,99,111,108,111,114,115,0,0,67,51,0,0,0,0,0,0,100,97,116,97,115,36,105,122,101,115,0,0,0,0,0,0,102,114,97,99,116,105,111,110,32,109,117,115,116,32,98,101,32,108,101,115,115,32,116,104,97,110,32,49,0,0,0,0,117,110,105,116,115,32,0,0,67,50,0,0,0,0,0,0,101,0,0,0,0,0,0,0,67,49,0,0,0,0,0,0,67,48,0,0,0,0,0,0,97,108,108,32,102,111,114,119,97,114,100,0,0,0,0,0,107,111,105,56,117,0,0,0,80,101,110,116,70,0,0,0,32,32,114,101,100,32,103,114,101,101,110,32,98,108,117,101,32,97,108,112,104,97,0,0,80,101,110,116,0,0,0,0,108,111,114,0,0,0,0,0,68,105,97,70,0,0,0,0,68,105,97,0,0,0,0,0,71,80,86,65,76,95,80,76,79,84,0,0,0,0,0,0,84,114,105,68,70,0,0,0,94,95,64,38,126,123,125,0,84,114,105,68,0,0,0,0,99,111,108,111,114,110,36,97,109,101,115,0,0,0,0,0,105,102,0,0,0,0,0,0,84,114,105,85,70,0,0,0,98,105,110,36,97,114,121,0,102,114,97,99,36,116,105,111,110,0,0,0,0,0,0,0,65,108,108,32,112,111,105,110,116,115,32,111,117,116,32,111,102,32,114,97,110,103,101,0,32,97,110,103,108,101,32,37,103,32,0,0,0,0,0,0,84,114,105,85,0,0,0,0,98,0,0,0,0,0,0,0,67,105,114,99,108,101,70,0,108,111,119,36,101,114,0,0,67,105,114,99,108,101,0,0,37,115,102,108,105,112,32,122,0,0,0,0,0,0,0,0,66,111,120,70,0,0,0,0,66,111,120,0,0,0,0,0,83,116,97,114,0,0,0,0,45,76,73,66,82,69,65,68,76,73,78,69,32,32,45,72,73,83,84,79,82,89,32,32,0,0,0,0,0,0,0,0,67,114,115,0,0,0,0,0,71,80,86,65,76,95,82,95,76,79,71,0,0,0,0,0]) -.concat([80,108,115,0,0,0,0,0,98,97,100,32,115,121,110,116,97,120,32,105,110,32,101,110,104,97,110,99,101,100,32,116,101,120,116,32,115,116,114,105,110,103,0,0,0,0,0,0,80,110,116,0,0,0,0,0,99,111,108,111,114,98,36,111,120,0,0,0,0,0,0,0,103,115,97,118,101,32,91,93,32,48,32,115,101,116,100,97,115,104,10,0,0,0,0,0,9,78,111,32,102,108,111,97,116,105,110,103,32,112,111,105,110,116,32,101,120,99,101,112,116,105,111,110,32,104,97,110,100,108,101,114,32,100,117,114,105,110,103,32,100,97,116,97,32,105,110,112,117,116,10,0,114,97,119,0,0,0,0,0,85,110,114,101,99,111,103,110,105,122,101,100,32,111,112,116,105,111,110,46,32,32,83,101,101,32,39,104,101,108,112,32,115,101,116,39,46,0,0,0,114,97,110,103,101,0,0,0,115,101,116,32,115,116,121,108,101,32,101,108,108,105,112,115,101,32,115,105,122,101,32,0,47,118,115,104,105,102,116,32,37,100,32,100,101,102,10,0,97,0,0,0,0,0,0,0,47,37,115,32,102,105,110,100,102,111,110,116,32,37,103,32,115,99,97,108,101,102,111,110,116,32,115,101,116,102,111,110,116,10,0,0,0,0,0,0,37,102,0,0,0,0,0,0,109,105,115,115,105,110,103,32,102,105,108,101,110,97,109,101,0,0,0,0,0,0,0,0,37,46,51,102,32,85,80,10,0,0,0,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,34,116,105,116,108,101,34,32,102,111,114,32,112,108,111,116,0,0,0,0,0,0,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,48,32,80,97,116,116,101,114,110,70,105,108,108,10,0,0,0,0,0,0,0,0,110,101,119,104,105,115,116,36,111,103,114,97,109,0,0,0,49,32,37,100,32,37,100,32,37,100,32,37,100,32,66,111,120,67,111,108,70,105,108,108,10,0,0,0,0,0,0,0,87,65,82,78,73,78,71,58,32,69,114,114,111,114,32,100,117,114,105,110,103,32,105,110,105,116,105,97,108,105,122,97,116,105,111,110,10,10,0,0,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,50,32,80,97,116,116,101,114,110,70,105,108,108,10,0,0,0,0,0,0,0,0,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,49,32,80,97,116,116,101,114,110,70,105,108,108,10,0,0,0,0,0,0,0,0,71,80,86,65,76,95,82,95,77,73,78,0,0,0,0,0,39,59,39,32,101,120,112,101,99,116,101,100,0,0,0,0,101,110,104,97,110,99,101,100,32,116,101,120,116,32,112,97,114,115,101,114,32,45,32,115,112,117,114,105,111,117,115,32,125,0,0,0,0,0,0,0,37,100,32,37,100,32,37,100,32,37,100,32,66,111,120,70,105,108,108,10,0,0,0,0,112,97,108,36,101,116,116,101,0,0,0,0,0,0,0,0,98,105,110,100,58,32,99,97,110,110,111,116,32,112,97,114,115,101,32,37,115,10,0,0,10,32,47,84,114,97,110,115,112,97,114,101,110,116,80,97,116,116,101,114,110,115,32,116,114,117,101,32,100,101,102,10,0,0,0,0,0,0,0,0,9,68,97,116,97,102,105,108,101,32,112,97,114,115,105,110,103,32,119,105,108,108,32,97,99,99,101,112,116,32,70,111,114,116,114,97,110,32,68,32,111,114,32,81,32,99,111,110,115,116,97,110,116,115,10,0,112,116,0,0,0,0,0,0,121,48,32,48,32,78,32,48,32,49,32,86,32,121,115,116,101,112,32,48,32,86,32,48,32,45,49,32,102,10,0,0,32,10,0,0,0,0,0,0,37,46,51,102,32,37,100,32,37,100,32,37,100,32,37,100,32,66,111,120,67,111,108,70,105,108,108,10,0,0,0,0,67,97,110,110,111,116,32,115,109,111,111,116,104,58,32,110,111,32,100,97,116,97,32,119,105,116,104,105,110,32,102,105,120,101,100,32,120,114,97,110,103,101,33,0,0,0,0,0,37,115,65,108,116,45,0,0,105,110,116,101,114,110,97,108,32,101,114,114,111,114,32,58,32,97,114,103,117,109,101,110,116,32,110,101,105,116,104,101,114,32,73,78,84,32,111,114,32,67,77,80,76,88,0,0,37,100,32,37,100,32,37,100,32,37,100,32,82,101,99,32,102,105,108,108,10,0,0,0,37,46,51,102,32,85,76,10,0,0,0,0,0,0,0,0,37,115,102,108,105,112,32,121,0,0,0,0,0,0,0,0,32,32,105,102,125,32,105,102,101,108,115,101,125,32,105,102,101,108,115,101,125,32,105,102,101,108,115,101,125,32,100,101,102,10,0,0,0,0,0,0,32,32,88,89,90,50,82,71,66,125,123,67,111,108,111,114,83,112,97,99,101,32,40,67,77,89,41,32,101,113,32,123,67,77,89,50,82,71,66,125,123,67,111,108,111,114,83,112,97,99,101,32,40,89,73,81,41,32,101,113,32,123,89,73,81,50,82,71,66,125,10,0,105,110,118,101,114,115,101,95,110,111,114,109,97,108,95,102,117,110,99,0,0,0,0,0,47,83,101,108,101,99,116,83,112,97,99,101,32,123,67,111,108,111,114,83,112,97,99,101,32,40,72,83,86,41,32,101,113,32,123,72,83,86,50,82,71,66,125,123,67,111,108,111,114,83,112,97,99,101,32,40,88,89,90,41,32,101,113,32,123,10,0,0,0,0,0,0,32,32,101,120,99,104,32,49,46,57,49,32,109,117,108,32,101,120,99,104,32,97,100,100,32,67,111,110,115,116,114,97,105,110,32,51,32,49,32,114,111,108,108,125,32,100,101,102,10,0,0,0,0,0,0,0,32,32,45,48,46,57,56,52,52,32,109,117,108,32,97,100,100,32,67,111,110,115,116,114,97,105,110,32,53,32,49,32,114,111,108,108,32,45,48,46,50,56,57,49,32,109,117,108,32,101,120,99,104,32,45,48,46,53,51,51,56,32,109,117,108,32,97,100,100,10,0,0,105,115,95,106,117,109,112,40,111,112,101,114,97,116,111,114,41,32,124,124,32,40,106,117,109,112,95,111,102,102,115,101,116,32,61,61,32,49,41,0,78,111,32,102,105,108,108,101,100,32,112,111,108,121,103,111,110,115,0,0,0,0,0,0,32,32,67,111,110,115,116,114,97,105,110,32,52,32,49,32,114,111,108,108,32,51,32,99,111,112,121,32,45,48,46,48,50,55,57,32,109,117,108,32,101,120,99,104,32,49,46,57,57,57,32,109,117,108,32,97,100,100,32,101,120,99,104,10,0,0,0,0,0,0,0,0,112,109,36,51,100,0,0,0,32,32,51,32,99,111,112,121,32,45,48,46,57,48,49,55,32,109,117,108,32,101,120,99,104,32,45,48,46,49,49,56,55,32,109,117,108,32,97,100,100,32,101,120,99,104,32,48,46,48,53,56,53,32,109,117,108,32,101,120,99,104,32,97,100,100,10,0,0,0,0,0,9,67,111,109,109,101,110,116,115,32,99,104,97,114,115,32,97,114,101,32,34,37,115,34,10,0,0,0,0,0,0,0,112,111,105,110,116,36,116,121,112,101,0,0,0,0,0,0,115,101,116,32,115,116,121,108,101,32,99,105,114,99,108,101,32,114,97,100,105,117,115,32,0,0,0,0,0,0,0,0,47,88,89,90,50,82,71,66,32,123,0,0,0,0,0,0,32,32,49,32,101,120,99,104,32,115,117,98,32,101,120,99,104,32,49,32,101,120,99,104,32,115,117,98,32,51,32,50,32,114,111,108,108,32,49,32,101,120,99,104,32,115,117,98,32,51,32,49,32,114,111,108,108,32,101,120,99,104,32,125,32,100,101,102,10,0,0,0,67,116,114,108,45,0,0,0,47,67,77,89,50,82,71,66,32,123,0,0,0,0,0,0,102,108,105,112,32,120,0,0,87,97,114,110,105,110,103,58,32,101,109,112,116,121,32,37,115,32,114,97,110,103,101,32,91,37,103,58,37,103,93,44,32,0,0,0,0,0,0,0,32,32,48,46,54,50,49,32,109,117,108,32,101,120,99,104,32,45,48,46,57,53,54,32,109,117,108,32,97,100,100,32,97,100,100,32,67,111,110,115,116,114,97,105,110,32,51,32,49,32,114,111,108,108,32,125,32,100,101,102,10,0,0,0,32,32,51,32,99,111,112,121,32,45,48,46,54,52,55,32,109,117,108,32,101,120,99,104,32,45,48,46,50,55,50,32,109,117,108,32,97,100,100,32,97,100,100,32,67,111,110,115,116,114,97,105,110,32,53,32,49,32,114,111,108,108,10,0,32,32,51,32,99,111,112,121,32,45,49,46,55,48,50,32,109,117,108,32,101,120,99,104,32,45,49,46,49,48,53,32,109,117,108,32,97,100,100,32,97,100,100,32,67,111,110,115,116,114,97,105,110,32,52,32,49,32,114,111,108,108,10,0,47,89,73,81,50,82,71,66,32,123,10,0,0,0,0,0,107,101,121,32,97,114,114,97,121,0,0,0,0,0,0,0,32,32,100,117,112,32,48,32,108,116,32,123,48,32,101,120,99,104,32,112,111,112,125,123,100,117,112,32,49,32,103,116,32,123,49,32,101,120,99,104,32,112,111,112,125,32,105,102,125,32,105,102,101,108,115,101,125,32,100,101,102,10,0,0,102,105,108,108,101,100,32,112,111,108,121,103,111,110,115,58,0,0,0,0,0,0,0,0,47,67,111,110,115,116,114,97,105,110,32,123,10,0,0,0,112,97,36,114,97,109,101,116,114,105,99,0,0,0,0,0,32,32,125,32,105,102,101,108,115,101,125,32,100,101,102,10,0,0,0,0,0,0,0,0,99,111,109,36,109,101,110,116,115,0,0,0,0,0,0,0,111,117,116,36,108,105,101,114,115,0,0,0,0,0,0,0,115,101,116,32,115,116,121,108,101,32,114,101,99,116,97,110,103,108,101,32,37,115,32,102,99,32,0,0,0,0,0,0,9,32,123,72,83,86,118,32,72,83,86,112,32,72,83,86,113,125,32,105,102,101,108,115,101,125,32,105,102,101,108,115,101,125,32,105,102,101,108,115,101,125,32,105,102,101,108,115,101,125,32,105,102,101,108,115,101,10,0,0,0,0,0,0,96,37,115,58,37,100,32,111,111,112,115,46,39,10,0,0,9,32,123,51,32,72,83,86,105,32,101,113,32,123,72,83,86,112,32,72,83,86,113,32,72,83,86,118,125,123,52,32,72,83,86,105,32,101,113,32,123,72,83,86,116,32,72,83,86,112,32,72,83,86,118,125,10,0,0,0,0,0,0,0,9,32,123,49,32,72,83,86,105,32,101,113,32,123,72,83,86,113,32,72,83,86,118,32,72,83,86,112,125,123,50,32,72,83,86,105,32,101,113,32,123,72,83,86,112,32,72,83,86,118,32,72,83,86,116,125,10,0,0,0,0,0,0,0,10,9,32,32,32,32,68,105,114,101,99,116,105,111,110,58,32,0,0,0,0,0,0,0,9,32,47,72,83,86,105,32,72,83,86,105,32,54,32,109,111,100,32,100,101,102,32,48,32,72,83,86,105,32,101,113,32,123,72,83,86,118,32,72,83,86,116,32,72,83,86,112,125,10,0,0,0,0,0,0,78,111,32,112,111,105,110,116,115,32,40,118,105,115,105,98,108,101,32,111,114,32,105,110,118,105,115,105,98,108,101,41,32,116,111,32,112,108,111,116,46,10,10,0,0,0,0,0,9,32,47,72,83,86,116,32,72,83,86,118,32,49,46,48,32,72,83,86,115,32,49,46,48,32,72,83,86,102,32,115,117,98,32,109,117,108,32,115,117,98,32,109,117,108,32,100,101,102,10,0,0,0,0,0,9,32,47,72,83,86,113,32,72,83,86,118,32,49,46,48,32,72,83,86,115,32,72,83,86,102,32,109,117,108,32,115,117,98,32,109,117,108,32,100,101,102,32,10,0,0,0,0,32,32,32,32,47,72,83,86,102,32,101,120,99,104,32,100,101,102,32,47,72,83,86,105,32,101,120,99,104,32,99,118,105,32,100,101,102,32,47,72,83,86,112,32,72,83,86,118,32,49,46,48,32,72,83,86,115,32,115,117,98,32,109,117,108,32,100,101,102,10,0,0,103,114,97,112,104,98,111,120,0,0,0,0,0,0,0,0,32,32,123,32,47,72,83,86,115,32,101,120,99,104,32,100,101,102,32,47,72,83,86,118,32,101,120,99,104,32,100,101,102,32,54,46,48,32,109,117,108,32,100,117,112,32,102,108,111,111,114,32,100,117,112,32,51,32,49,32,114,111,108,108,32,115,117,98,10,32,0,0,66,121,116,101,79,114,100,101,114,0,0,0,0,0,0,0,110,111,110,45,105,110,116,101,103,101,114,32,112,97,115,115,101,100,32,116,111,32,98,111,111,108,101,97,110,32,111,112,101,114,97,116,111,114,0,0,37,50,100,0,0,0,0,0,32,32,101,120,99,104,32,100,117,112,32,48,46,48,32,101,113,32,123,112,111,112,32,101,120,99,104,32,112,111,112,32,100,117,112,32,100,117,112,125,32,37,32,97,99,104,114,111,109,97,116,105,99,32,103,114,97,121,10,0,0,0,0,0,111,36,117,116,112,117,116,0,47,72,83,86,50,82,71,66,32,123,0,0,0,0,0,0,9,100,97,116,97,102,105,108,101,32,102,105,101,108,100,115,32,115,101,112,97,114,97,116,101,100,32,98,121,32,119,104,105,116,101,115,112,97,99,101,10,0,0,0,0,0,0,0,110,111,111,117,116,36,108,105,101,114,115,0,0,0,0,0,115,101,116,32,115,116,121,108,101,32,102,105,108,108,32,0,47,99,70,37,105,32,123,37,115,125,32,98,105,110,100,32,100,101,102,9,37,37,32,37,115,10,0,0,0,0,0,0,32,32,32,32,123,47,100,103,100,120,118,97,108,32,100,103,100,120,32,100,101,102,32,114,101,100,118,97,108,117,101,32,103,114,101,101,110,118,97,108,117,101,32,98,108,117,101,118,97,108,117,101,125,32,105,102,101,108,115,101,125,32,100,101,102,10,0,0,0,0,0,0,32,32,32,32,123,82,101,100,65,32,103,105,100,120,32,103,101,116,32,71,114,101,101,110,65,32,103,105,100,120,32,103,101,116,32,66,108,117,101,65,32,103,105,100,120,32,103,101,116,125,10,0,0,0,0,0,32,32,103,114,97,121,105,110,100,101,120,32,103,114,97,121,118,32,71,114,97,121,65,32,103,105,100,120,32,103,101,116,32,115,117,98,32,97,98,115,32,49,101,45,53,32,108,101,10,0,0,0,0,0,0,0,47,105,110,116,101,114,112,111,108,97,116,101,32,123,10,0,32,32,66,108,117,101,65,32,103,105,100,120,32,103,101,116,32,115,117,98,32,100,103,100,120,118,97,108,32,109,117,108,32,97,100,100,125,32,100,101,102,10,0,0,0,0,0,0,47,98,108,117,101,118,97,108,117,101,32,123,66,108,117,101,65,32,103,105,100,120,32,103,101,116,32,66,108,117,101,65,32,103,105,100,120,32,49,32,115,117,98,32,103,101,116,10,0,0,0,0,0,0,0,0,32,32,71,114,101,101,110,65,32,103,105,100,120,32,103,101,116,32,115,117,98,32,100,103,100,120,118,97,108,32,109,117,108,32,97,100,100,125,32,100,101,102,10,0,0,0,0,0,115,116,97,99,107,32,111,118,101,114,102,108,111,119,0,0,120,94,50,0,0,0,0,0,112,97,116,116,101,114,110,32,102,105,108,108,0,0,0,0,47,103,114,101,101,110,118,97,108,117,101,32,123,71,114,101,101,110,65,32,103,105,100,120,32,103,101,116,32,71,114,101,101,110,65,32,103,105,100,120,32,49,32,115,117,98,32,103,101,116,10,0,0,0,0,0,111,114,36,105,103,105,110,0,32,32,82,101,100,65,32,103,105,100,120,32,103,101,116,32,115,117,98,32,100,103,100,120,118,97,108,32,109,117,108,32,97,100,100,125,32,100,101,102,10,0,0,0,0,0,0,0,9,100,97,116,97,102,105,108,101,32,102,105,101,108,100,115,32,115,101,112,97,114,97,116,101,100,32,98,121,32,34,37,99,34,10,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,39,100,97,116,97,39,44,32,39,102,117,110,99,116,105,111,110,39,44,32,39,108,105,110,101,39,44,32,39,102,105,108,108,39,44,32,39,114,101,99,116,97,110,103,108,101,39,44,32,39,99,105,114,99,108,101,39,44,32,39,101,108,108,105,112,115,101,39,32,111,114,32,39,97,114,114,111,119,39,0,0,0,0,0,0,0,47,114,101,100,118,97,108,117,101,32,123,82,101,100,65,32,103,105,100,120,32,103,101,116,32,82,101,100,65,32,103,105,100,120,32,49,32,115,117,98,32,103,101,116,10,0,0,0,96,37,115,39,10,0,0,0,32,32,71,114,97,121,65,32,103,105,100,120,32,103,101,116,32,115,117,98,32,100,105,118,125,32,100,101,102,32,10,0,47,100,103,100,120,32,123,103,114,97,121,118,32,71,114,97,121,65,32,103,105,100,120,32,103,101,116,32,115,117,98,32,71,114,97,121,65,32,103,105,100,120,32,49,32,115,117,98,32,103,101,116,10,0,0,0,32,32,123,71,114,97,121,65,32,103,105,100,120,32,103,101,116,32,103,114,97,121,118,32,103,101,32,123,101,120,105,116,125,32,105,102,32,47,103,105,100,120,32,103,105,100,120,32,49,32,97,100,100,32,100,101,102,125,32,108,111,111,112,125,32,100,101,102,10,0,0,0,47,103,114,97,121,105,110,100,101,120,32,123,47,103,105,100,120,32,48,32,100,101,102,10,0,0,0,0,0,0,0,0,93,32,100,101,102,10,0,0,47,37,115,32,91,0,0,0,66,108,117,101,65,0,0,0,78,111,110,45,110,117,109,101,114,105,99,32,115,116,114,105,110,103,32,102,111,117,110,100,32,119,104,101,114,101,32,97,32,110,117,109,101,114,105,99,32,101,120,112,114,101,115,115,105,111,110,32,119,97,115,32,101,120,112,101,99,116,101,100,0,0,0,0,0,0,0,0,116,97,103,32,109,117,115,116,32,98,101,32,62,32,122,101,114,111,0,0,0,0,0,0,108,105,110,101,119,105,100,116,104,0,0,0,0,0,0,0,71,114,101,101,110,65,0,0,111,102,36,102,115,101,116,115,0,0,0,0,0,0,0,0,82,101,100,65,0,0,0,0,115,101,112,36,97,114,97,116,111,114,0,0,0,0,0,0,117,36,115,101,114,115,116,121,108,101,115,0,0,0,0,0,71,114,97,121,65,0,0,0,37,99,32,0,0,0,0,0,32,100,101,102,10,0,0,0,37,115,58,37,100,32,111,111,111,112,115,58,32,85,110,107,110,111,119,110,32,99,111,108,111,114,32,109,111,100,101,108,32,39,37,99,39,46,32,87,105,108,108,32,98,101,32,82,71,66,10,0,0,0,0,0,10,9,32,32,32,32,71,101,110,101,114,97,116,101,32,99,111,111,114,100,105,110,97,116,101,115,58,32,37,115,0,0,40,88,89,90,41,0,0,0,40,89,73,81,41,0,0,0,37,45,49,53,46,49,53,115,32,61,32,37,45,49,53,46,49,53,115,32,32,32,37,115,0,0,0,0,0,0,0,0,40,67,77,89,41,0,0,0,40,72,83,86,41,0,0,0,40,82,71,66,41,0,0,0,115,116,97,99,107,32,117,110,100,101,114,102,108,111,119,32,40,102,117,110,99,116,105,111,110,32,99,97,108,108,32,119,105,116,104,32,109,105,115,115,105,110,103,32,112,97,114,97,109,101,116,101,114,115,63,41,0,0,0,0,0,0,0,0,32,32,108,119,32,37,49,100,37,99,0,0,0,0,0,0,47,67,111,108,111,114,83,112,97,99,101,32,0,0,0,0,120,37,100,0,0,0,0,0,110,111,109,99,98,116,36,105,99,115,0,0,0,0,0,0,32,32,47,103,32,123,115,116,114,111,107,101,32,112,109,51,100,114,111,117,110,100,32,112,109,51,100,71,97,109,109,97,32,101,120,112,32,115,101,116,103,114,97,121,125,32,98,105,110,100,32,100,101,102,10,0,9,34,37,115,34,32,105,110,32,100,97,116,97,102,105,108,101,32,105,115,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,109,105,115,115,105,110,103,32,118,97,108,117,101,10,0,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,39,117,110,105,116,115,32,123,120,121,124,120,120,124,121,121,125,39,44,32,39,97,110,103,108,101,32,60,110,117,109,98,101,114,62,39,32,111,114,32,39,115,105,122,101,32,60,112,111,115,105,116,105,111,110,62,39,0,0,0,0,0,115,101,116,32,98,111,120,119,105,100,116,104,32,37,103,32,37,115,10,0,0,0,0,0,125,123,10,0,0,0,0,0,32,37,45,49,50,115,32,0,32,32,125,32,105,102,101,108,115,101,10,0,0,0,0,0,10,32,32,32,32,32,32,32,83,101,108,101,99,116,83,112,97,99,101,32,115,101,116,114,103,98,99,111,108,111,114,125,32,98,105,110,100,32,100,101,102,10,0,0,0,0,0,0,103,112,95,105,110,112,117,116,95,108,105,110,101,0,0,0,99,70,37,105,32,67,111,110,115,116,114,97,105,110,32,0,99,70,37,105,32,67,111,110,115,116,114,97,105,110,32,101,120,99,104,32,0,0,0,0,36,40,0,0,0,0,0,0,99,70,37,105,32,67,111,110,115,116,114,97,105,110,32,101,120,99,104,32,100,117,112,32,0,0,0,0,0,0,0,0,70,111,114,109,97,116,32,99,104,97,114,97,99,116,101,114,32,109,105,115,109,97,116,99,104,58,32,37,37,99,32,105,115,32,111,110,108,121,32,118,97,108,105,100,32,119,105,116,104,32,37,37,115,0,0,0,49,32,101,120,99,104,32,115,117,98,32,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,39,100,97,116,97,39,44,32,39,102,117,110,99,116,105,111,110,39,44,32,39,108,105,110,101,39,44,32,39,102,105,108,108,39,32,111,114,32,39,97,114,114,111,119,39,0,112,109,0,0,0,0,0,0,32,32,47,103,32,123,115,116,114,111,107,101,32,112,109,51,100,114,111,117,110,100,32,100,117,112,32,0,0,0,0,0,10,119,97,114,110,105,110,103,58,32,32,105,110,116,101,114,110,97,108,32,101,114,114,111,114,45,45,115,116,97,99,107,32,110,111,116,32,101,109,112,116,121,33,10,32,32,32,32,32,32,32,32,32,32,40,102,117,110,99,116,105,111,110,32,99,97,108,108,101,100,32,119,105,116,104,32,116,111,111,32,109,97,110,121,32,112,97,114,97,109,101,116,101,114,115,63,41,10,0,0,0,0,0,0,37,100,0,0,0,0,0,0,32,32,125,123,10,0,0,0,73,110,102,0,0,0,0,0,109,99,98,116,36,105,99,115,0,0,0,0,0,0,0,0,32,32,32,32,32,32,32,32,83,101,108,101,99,116,83,112,97,99,101,32,115,101,116,114,103,98,99,111,108,111,114,125,32,98,105,110,100,32,100,101,102,10,0,0,0,0,0,0,9,78,111,32,109,105,115,115,105,110,103,32,100,97,116,97,32,115,116,114,105,110,103,32,115,101,116,32,102,111,114,32,100,97,116,97,102,105,108,101,10,0,0,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,39,120,121,39,44,32,39,120,120,39,32,111,114,32,39,121,121,39,0,0,0,0,115,101,116,32,98,111,120,119,105,100,116,104,10,0,0,0,32,32,32,32,47,103,32,123,115,116,114,111,107,101,32,112,109,51,100,114,111,117,110,100,32,47,103,114,97,121,118,32,101,120,99,104,32,100,101,102,32,105,110,116,101,114,112,111,108,97,116,101,10,0,0,0,32,32,32,32,32,32,32,32,32,32,32,32,32,32,42,32,105,110,100,105,99,97,116,101,115,32,116,104,105,115,32,107,101,121,32,105,115,32,97,99,116,105,118,101,32,102,114,111,109,32,97,108,108,32,112,108,111,116,32,119,105,110,100,111,119,115,10,0,0,0,0,0,32,32,73,110,116,101,114,112,111,108,97,116,101,100,67,111,108,111,114,32,123,32,37,37,32,73,110,116,101,114,112,111,108,97,116,105,111,110,32,118,115,46,32,82,71,66,45,70,111,114,109,117,108,97,10,0,67,111,108,111,114,32,73,110,116,101,114,112,111,108,97,116,101,100,67,111,108,111,114,32,111,114,32,123,32,37,32,67,79,76,79,85,82,32,118,115,46,32,71,82,65,89,32,109,97,112,10,0,0,0,0,0,101,10,0,0,0,0,0,0,107,111,105,56,114,0,0,0,102,97,108,115,101,32,123,32,37,32,67,79,76,79,85,82,32,118,115,46,32,71,82,65,89,32,109,97,112,10,0,0,32,32,112,105,120,101,108,0,47,112,109,51,100,71,97,109,109,97,32,49,46,48,32,37,103,32,71,97,109,109,97,32,109,117,108,32,100,105,118,32,100,101,102,10,0,0,0,0,117,109,105,110,117,115,0,0,9,123,112,111,112,32,49,125,32,123,109,97,120,99,111,108,111,114,115,32,109,117,108,32,102,108,111,111,114,32,109,97,120,99,111,108,111,114,115,32,49,32,115,117,98,32,100,105,118,125,32,105,102,101,108,115,101,125,32,105,102,125,32,100,101,102,10,0,0,0,0,0,47,112,109,51,100,114,111,117,110,100,32,123,109,97,120,99,111,108,111,114,115,32,48,32,103,116,32,123,100,117,112,32,49,32,103,101,10,0,0,0,46,46,47,116,101,114,109,47,112,111,115,116,46,116,114,109,0,0,0,0,0,0,0,0,117,110,107,110,111,119,110,32,116,121,112,101,32,105,110,32,97,110,103,108,101,40,41,0,115,104,111,119,32,116,105,99,115,99,97,108,101,0,0,0,37,115,58,37,100,32,111,111,111,112,115,58,32,85,110,107,110,111,119,110,32,99,111,108,111,114,32,109,111,100,101,32,39,37,99,39,10,0,0,0,110,111,109,122,116,36,105,99,115,0,0,0,0,0,0,0,9,32,32,32,32,68,105,109,101,110,115,105,111,110,58,32,0,0,0,0,0,0,0,0,104,105,36,115,116,111,114,121,0,0,0,0,0,0,0,0,47,73,110,116,101,114,112,111,108,97,116,101,100,67,111,108,111,114,32,116,114,117,101,32,100,101,102,10,0,0,0,0,109,105,115,115,36,105,110,103,0,0,0,0,0,0,0,0,121,121,0,0,0,0,0,0,47,73,110,116,101,114,112,111,108,97,116,101,100,67,111,108,111,114,32,102,97,108,115,101,32,100,101,102,10,0,0,0,37,48,46,52,102,9,37,48,46,52,102,10,0,0,0,0,99,108,111,115,101,32,116,104,105,115,32,112,108,111,116,32,119,105,110,100,111,119,0,0,47,109,97,120,99,111,108,111,114,115,32,37,105,32,100,101,102,10,0,0,0,0,0,0,103,115,97,118,101,32,37,32,99,111,108,111,117,114,32,112,97,108,101,116,116,101,32,98,101,103,105,110,10,0,0,0,37,115,32,104,97,115,32,37,115,32,99,111,111,114,100,32,111,102,32,37,103,59,32,109,117,115,116,32,98,101,32,97,98,111,118,101,32,48,32,102,111,114,32,108,111,103,32,115,99,97,108,101,33,0,0,0,103,114,101,115,116,111,114,101,32,37,32,99,111,108,111,117,114,32,112,97,108,101,116,116,101,32,101,110,100,10,0,0,37,115,32,103,32,0,0,0,49,32,103,32,0,0,0,0,45,82,69,65,68,76,73,78,69,32,32,0,0,0,0,0,48,32,103,32,0,0,0,0,37,51,46,50,102,32,37,51,46,50,102,32,37,51,46,50,102,32,67,32,0,0,0,0,117,110,107,110,111,119,110,32,116,121,112,101,32,105,110,32,109,97,103,110,105,116,117,100,101,40,41,0,0,0,0,0,99,97,110,39,116,32,114,111,116,97,116,101,32,116,101,120,116,0,0,0,0,0,0,0,76,67,37,49,99,32,115,101,116,114,103,98,99,111,108,111,114,10,0,0,0,0,0,0,105,110,118,97,108,105,100,32,99,111,109,112,108,101,120,32,99,111,110,115,116,97,110,116,0,0,0,0,0,0,0,0,109,122,116,36,105,99,115,0,10,9,32,32,82,101,99,111,114,100,32,37,100,58,10,0,80,76,32,0,0,0,0,0,9,109,111,117,115,101,32,105,115,32,111,102,102,10,0,0,101,120,112,101,99,116,105,110,103,32,100,97,116,97,102,105,108,101,32,109,111,100,105,102,105,101,114,0,0,0,0,0,112,110,103,0,0,0,0,0,120,120,0,0,0,0,0,0,115,101,116,32,37,115,100,97,116,97,32,37,115,10,0,0,32,80,97,116,116,101,114,110,37,100,32,102,105,108,108,32,103,114,101,115,116,111,114,101,10,0,0,0,0,0,0,0,113,0,0,0,0,0,0,0,32,37,46,49,102,32,80,111,108,121,70,105,108,108,10,0,32,47,84,114,97,110,115,112,97,114,101,110,116,80,97,116,116,101,114,110,115,32,116,114,117,101,32,100,101,102,10,0,32,37,46,50,102,32,80,111,108,121,70,105,108,108,10,0,32,49,32,80,111,108,121,70,105,108,108,10,0,0,0,0,32,37,105,32,37,105,32,76,0,0,0,0,0,0,0,0,10,84,101,114,109,105,110,97,108,32,116,121,112,101,32,115,101,116,32,116,111,32,39,37,115,39,10,0,0,0,0,0,32,37,105,32,37,105,32,86,0,0,0,0,0,0,0,0,103,115,97,118,101,32,0,0,117,110,107,110,111,119,110,32,116,121,112,101,32,105,110,32,105,109,97,103,40,41,0,0,32,114,111,116,97,116,101,100,32,98,121,32,45,52,53,32,100,101,103,0,0,0,0,0,32,37,105,32,37,105,32,37,105,32,37,105,32,37,105,32,37,105,32,104,10,0,0,0,110,111,109,121,50,116,36,105,99,115,0,0,0,0,0,0,10,9,32,32,68,101,102,97,117,108,116,32,98,105,110,97,114,121,32,102,111,114,109,97,116,58,32,37,115,0,0,0,99,116,114,108,45,0,0,0,37,105,32,37,105,32,78,0,110,111,116,32,0,0,0,0,42,114,101,116,117,114,110,95,110,117,109,95,98,121,116,101,115,32,60,61,32,109,97,120,95,101,110,99,111,100,101,100,95,98,121,116,101,115,0,0,117,110,105,116,36,115,0,0,48,32,121,48,32,78,32,49,32,48,32,86,32,48,32,121,115,116,101,112,32,86,32,45,49,32,48,32,102,10,0,0,115,101,116,32,116,105,109,101,102,109,116,32,37,115,32,34,37,115,34,10,0,0,0,0,112,100,112,32,40,109,105,100,100,108,101,41,0,0,0,0,85,110,101,120,112,101,99,116,101,100,32,125,0,0,0,0,102,105,118,101,95,100,105,97,103,32,104,101,108,112,32,118,97,114,115,0,0,0,0,0,32,37,45,49,50,115,32,42,32,37,115,10,0,0,0,0,126,62,0,0,0,0,0,0,115,116,114,95,99,111,110,115,116,0,0,0,0,0,0,0,37,49,120,0,0,0,0,0,44,32,39,45,39,32,119,32,108,32,116,105,116,108,101,32,39,78,84,83,67,39,32,108,116,32,45,49,0,0,0,0,101,110,99,111,100,101,100,32,105,109,97,103,101,0,0,0,37,115,105,109,97,103,101,10,0,0,0,0,0,0,0,0,37,115,102,97,108,115,101,32,51,10,37,115,99,111,108,111,114,105,109,97,103,101,10,0,32,32,99,117,114,114,101,110,116,102,105,108,101,32,47,65,83,67,73,73,56,53,68,101,99,111,100,101,32,102,105,108,116,101,114,10,0,0,0,0,68,105,100,32,121,111,117,32,116,114,121,32,116,111,32,103,101,110,101,114,97,116,101,32,97,32,102,105,108,101,32,110,97,109,101,32,117,115,105,110,103,32,100,117,109,109,121,32,118,97,114,105,97,98,108,101,32,120,32,111,114,32,121,63,0,0,0,0,0,0,0,0,32,114,111,116,97,116,101,100,32,98,121,32,43,52,53,32,100,101,103,0,0,0,0,0,123,99,117,114,114,101,110,116,102,105,108,101,32,105,109,97,103,101,98,117,102,32,114,101,97,100,104,101,120,115,116,114,105,110,103,32,112,111,112,125,10,0,0,0,0,0,0,0,109,121,50,116,36,105,99,115,0,0,0,0,0,0,0,0,10,9,32,32,70,105,108,101,32,69,110,100,105,97,110,110,101,115,115,58,32,37,115,0,47,105,109,97,103,101,98,117,102,32,37,100,32,115,116,114,105,110,103,32,100,101,102,10,0,0,0,0,0,0,0,0,9,99,111,109,109,117,110,105,99,97,116,105,111,110,32,99,111,109,109,97,110,100,115,32,119,105,108,108,32,37,115,98,101,32,115,104,111,119,110,10,0,0,0,0,0,0,0,0,97,110,103,36,108,101,0,0,58,32,0,0,0,0,0,0,117,110,115,101,116,32,98,111,114,100,101,114,10,0,0,0,37,115,91,32,37,100,32,48,32,48,32,37,100,32,48,32,48,32,93,10,0,0,0,0,114,97,105,115,101,32,103,110,117,112,108,111,116,32,99,111,110,115,111,108,101,32,119,105,110,100,111,119,0,0,0,0,37,115,37,100,32,37,100,32,37,100,10,0,0,0,0,0,37,115,37,100,32,37,100,32,115,99,97,108,101,10,0,0,98,108,117,101,39,119,32,108,32,108,116,32,51,32,108,99,32,114,103,98,32,39,98,108,117,101,39,0,0,0,0,0,121,0,0,0,0,0,0,0,37,115,37,100,32,37,100,32,116,114,97,110,115,108,97,116,101,10,0,0,0,0,0,0,37,115,123,112,109,51,100,71,97,109,109,97,32,101,120,112,125,32,115,101,116,116,114,97,110,115,102,101,114,10,0,0,9,32,32,87,105,108,108,32,37,115,117,115,101,32,111,116,104,101,114,32,100,105,97,103,111,110,97,108,32,105,102,32,105,116,32,103,105,118,101,115,32,97,32,108,101,115,115,32,106,97,103,103,121,32,111,117,116,108,105,110,101,10,9,32,32,87,105,108,108,32,37,115,100,114,97,119,32,100,105,97,103,111,110,97,108,32,118,105,115,105,98,108,121,32,105,102,32,113,117,97,100,114,97,110,103,108,101,32,105,115,32,39,98,101,110,116,32,111,118,101,114,39,10,0,0,0,0,0,37,115,103,115,97,118,101,10,0,0,0,0,0,0,0,0,37,37,37,37,69,110,100,73,109,97,103,101,10,0,0,0,99,111,110,116,111,117,114,32,101,100,103,101,0,0,0,0,103,114,101,115,116,111,114,101,10,0,0,0,0,0,0,0,101,110,99,111,117,110,116,101,114,101,100,32,97,32,115,116,114,105,110,103,32,119,104,101,110,32,101,120,112,101,99,116,105,110,103,32,97,32,110,117,109,98,101,114,0,0,0,0,114,111,116,97,116,101,100,32,99,101,43,110,116,114,101,100,32,116,101,120,116,0,0,0,10,73,110,116,101,114,112,114,101,116,76,101,118,101,108,49,32,110,111,116,32,123,10,32,32,103,114,101,115,116,111,114,101,10,125,32,105,102,10,0,110,111,109,121,116,36,105,99,115,0,0,0,0,0,0,0,10,103,114,101,115,116,111,114,101,10,0,0,0,0,0,0,9,122,111,111,109,106,117,109,112,32,105,115,32,37,115,10,0,0,0,0,0,0,0,0,115,101,116,32,98,111,114,100,101,114,32,37,100,32,37,115,0,0,0,0,0,0,0,0,32,32,47,73,110,116,101,114,112,111,108,97,116,101,32,102,97,108,115,101,10,62,62,10,105,109,97,103,101,10,0,0,83,112,97,99,101,0,0,0,32,32,47,77,117,108,116,105,112,108,101,68,97,116,97,83,111,117,114,99,101,115,32,102,97,108,115,101,10,0,0,0,32,32,47,68,97,116,97,83,111,117,114,99,101,32,99,117,114,114,101,110,116,102,105,108,101,32,47,65,83,67,73,73,56,53,68,101,99,111,100,101,32,102,105,108,116,101,114,10,0,0,0,0,0,0,0,0,103,114,101,101,110,39,119,32,108,32,108,116,32,50,32,108,99,32,114,103,98,32,39,103,114,101,101,110,39,0,0,0,32,32,47,68,97,116,97,83,111,117,114,99,101,32,123,99,117,114,114,101,110,116,102,105,108,101,32,105,109,97,103,101,98,117,102,32,114,101,97,100,104,101,120,115,116,114,105,110,103,32,112,111,112,125,10,0,112,118,101,114,116,0,0,0,32,32,47,68,101,99,111,100,101,32,91,32,48,32,37,100,32,93,10,0,0,0,0,0,32,32,47,66,105,116,115,80,101,114,67,111,109,112,111,110,101,110,116,32,37,100,10,32,32,47,73,109,97,103,101,77,97,116,114,105,120,32,91,32,37,100,32,48,32,48,32,37,100,32,48,32,48,32,93,10,0,0,0,0,0,0,0,0,32,61,9,10,0,0,0,0,60,60,10,32,32,47,73,109,97,103,101,84,121,112,101,32,49,10,32,32,47,87,105,100,116,104,32,37,100,10,32,32,47,72,101,105,103,104,116,32,37,100,10,0,0,0,0,0,115,116,0,0,0,0,0,0,37,37,37,37,69,110,100,80,97,108,101,116,116,101,10,0,117,110,107,110,111,119,110,32,116,121,112,101,32,105,110,32,114,101,97,108,40,41,0,0,10,32,32,62,10,93,32,115,101,116,99,111,108,111,114,115,112,97,99,101,10,0,0,0,114,105,103,104,116,32,106,117,115,116,105,102,105,101,100,0,68,97,116,97,84,121,112,101,0,0,0,0,0,0,0,0,109,121,116,36,105,99,115,0,32,37,50,46,50,120,37,50,46,50,120,37,50,46,50,120,0,0,0,0,0,0,0,0,9,66,117,116,116,111,110,32,50,32,100,114,97,119,115,32,116,101,109,112,111,114,97,114,121,32,108,97,98,101,108,115,10,0,0,0,0,0,0,0,114,36,97,100,105,117,115,0,117,110,0,0,0,0,0,0,91,32,47,73,110,100,101,120,101,100,10,32,32,47,68,101,118,105,99,101,82,71,66,32,37,100,10,32,32,60,0,0,32,37,45,49,50,115,32,32,32,37,115,10,0,0,0,0,37,37,37,37,66,101,103,105,110,80,97,108,101,116,116,101,10,0,0,0,0,0,0,0,37,100,32,37,100,32,115,99,97,108,101,10,0,0,0,0,114,101,100,39,119,32,108,32,108,116,32,49,32,108,99,32,114,103,98,32,39,114,101,100,39,0,0,0,0,0,0,0,37,100,32,37,100,32,116,114,97,110,115,108,97,116,101,10,0,0,0,0,0,0,0,0,103,115,97,118,101,10,0,0,125,32,123,10,0,0,0,0,67,111,117,108,100,32,110,111,116,32,114,101,110,97,109,101,32,102,105,108,101,32,37,115,32,116,111,32,37,115,0,0,32,32,52,48,32,45,49,49,48,32,82,10,32,32,40,80,83,32,108,101,118,101,108,32,50,32,105,109,97,103,101,41,32,76,115,104,111,119,10,32,32,37,37,32,82,101,97,100,32,100,97,116,97,32,98,117,116,32,105,103,110,111,114,101,32,105,116,10,32,32,47,105,109,97,103,101,98,117,102,32,37,100,32,115,116,114,105,110,103,32,100,101,102,10,32,32,99,117,114,114,101,110,116,102,105,108,101,32,105,109,97,103,101,98,117,102,32,114,101,97,100,115,116,114,105,110,103,10,0,0,0,0,0,0,0,0,125,32,105,102,101,108,115,101,10,0,0,0,0,0,0,0,105,115,111,32,99,117,114,118,101,0,0,0,0,0,0,0,118,97,108,117,101,0,0,0,100,117,112,32,109,117,108,0,99,101,110,116,114,101,43,100,32,116,101,120,116,0,0,0,32,32,99,117,114,114,101,110,116,102,105,108,101,32,105,109,97,103,101,98,117,102,32,114,101,97,100,115,116,114,105,110,103,10,125,32,123,10,0,0,110,111,109,120,50,116,36,105,99,115,0,0,0,0,0,0,10,9,32,32,70,105,108,101,32,84,121,112,101,58,32,0,32,32,47,105,109,97,103,101,98,117,102,32,37,100,32,115,116,114,105,110,103,32,100,101,102,10,0,0,0,0,0,0,9,66,117,116,116,111,110,32,50,32,100,114,97,119,115,32,112,101,114,115,105,115,116,101,110,116,32,108,97,98,101,108,115,32,119,105,116,104,32,111,112,116,105,111,110,115,32,34,37,115,34,10,0,0,0,0,115,116,121,108,101,32,110,111,116,32,117,115,97,98,108,101,32,102,111,114,32,102,117,110,99,116,105,111,110,32,112,108,111,116,115,44,32,108,101,102,116,32,117,110,99,104,97,110,103,101,100,0,0,0,0,0,37,115,115,101,116,32,99,108,105,112,32,112,111,105,110,116,115,10,37,115,115,101,116,32,99,108,105,112,32,111,110,101,10,37,115,115,101,116,32,99,108,105,112,32,116,119,111,10,115,101,116,32,98,97,114,32,37,102,32,37,115,10,0,0,32,32,52,48,32,45,49,49,48,32,82,10,32,32,40,80,83,32,108,101,118,101,108,32,50,32,105,109,97,103,101,41,32,76,115,104,111,119,10,32,32,37,32,82,101,97,100,32,100,97,116,97,32,98,117,116,32,105,103,110,111,114,101,32,105,116,10,0,0,0,0,0,101,120,112,97,110,100,105,110,103,32,99,117,114,118,101,32,112,111,105,110,116,115,0,0,122,111,111,109,32,111,117,116,32,111,110,108,121,32,116,104,101,32,88,32,97,120,105,115,46,0,0,0,0,0,0,0,32,32,37,100,32,37,100,32,76,10,0,0,0,0,0,0,32,32,48,32,37,100,32,86,10,0,0,0,0,0,0,0,39,45,39,116,105,116,39,0,32,32,37,100,32,48,32,86,10,0,0,0,0,0,0,0,32,32,37,100,32,37,100,32,77,10,0,0,0,0,0,0,45,45,118,101,114,115,105,111,110,0,0,0,0,0,0,0,73,110,116,101,114,112,114,101,116,76,101,118,101,108,49,32,123,10,32,32,37,37,32,67,111,110,115,116,114,117,99,116,32,97,32,98,111,120,32,105,110,115,116,101,97,100,32,111,102,32,105,109,97,103,101,10,32,32,76,84,98,10,0,0,46,111,108,100,0,0,0,0,103,115,97,118,101,32,37,100,32,37,100,32,78,32,37,100,32,37,100,32,76,32,37,100,32,37,100,32,76,32,37,100,32,37,100,32,76,32,90,32,99,108,105,112,10,0,0,0,37,37,37,37,66,101,103,105,110,73,109,97,103,101,10,0,101,120,105,115,116,115,0,0,108,101,102,116,32,106,117,115,116,105,102,105,101,100,0,0,71,78,85,80,76,79,84,32,40,112,111,115,116,46,116,114,109,41,58,32,32,67,111,109,112,111,110,101,110,116,32,98,105,116,115,32,40,37,100,41,32,111,117,116,32,111,102,32,114,97,110,103,101,46,10,0,109,120,50,116,36,105,99,115,0,0,0,0,0,0,0,0,9,68,101,102,97,117,108,116,32,98,105,110,97,114,121,32,100,97,116,97,32,102,105,108,101,32,115,101,116,116,105,110,103,115,32,40,105,110,45,102,105,108,101,32,115,101,116,116,105,110,103,115,32,109,97,121,32,111,118,101,114,114,105,100,101,41,58,10,0,0,0,0,47,37,115,32,37,115,0,0,9,97,108,116,101,114,110,97,116,105,118,101,32,102,111,114,109,97,116,32,102,111,114,32,66,117,116,116,111,110,32,50,32,105,115,32,39,37,115,39,10,0,0,0,0,0,0,0,99,97,110,110,111,116,32,111,112,101,110,32,116,97,98,108,101,32,111,117,116,112,117,116,32,102,105,108,101,0,0,0,35,32,115,101,116,32,116,101,114,109,105,110,97,108,32,117,110,107,110,111,119,110,10,0,114,101,101,110,99,111,100,101,75,79,73,56,85,32,100,101,102,10,0,0,0,0,0,0,60,115,104,105,102,116,45,99,111,110,116,114,111,108,45,119,104,101,101,108,45,100,111,119,110,62,0,0,0,0,0,0,114,101,101,110,99,111,100,101,67,80,49,50,53,49,32,100,101,102,10,0,0,0,0,0,114,101,101,110,99,111,100,101,67,80,49,50,53,48,32,100,101,102,10,0,0,0,0,0,114,101,101,110,99,111,100,101,75,79,73,56,82,32,100,101,102,10,0,0,0,0,0,0,99,111,110,115,116,97,110,116,32,101,120,112,114,101,115,115,105,111,110,32,114,101,113,117,105,114,101,100,0,0,0,0,114,101,101,110,99,111,100,101,67,80,56,53,50,32,100,101,102,10,0,0,0,0,0,0,114,101,101,110,99,111,100,101,67,80,56,53,48,32,100,101,102,10,0,0,0,0,0,0,70,73,84,95,76,73,77,73,84,0,0,0,0,0,0,0,114,101,101,110,99,111,100,101,67,80,52,51,55,32,100,101,102,10,0,0,0,0,0,0,118,101,99,0,0,0,0,0,114,101,101,110,99,111,100,101,73,83,79,49,53,32,100,101,102,10,0,0,0,0,0,0,101,120,105,115,116,0,0,0]) -.concat([115,101,116,32,116,101,114,109,111,112,116,32,110,111,101,110,104,0,0,0,0,0,0,0,114,101,101,110,99,111,100,101,73,83,79,57,32,100,101,102,10,0,0,0,0,0,0,0,110,111,109,120,116,36,105,99,115,0,0,0,0,0,0,0,100,97,116,97,102,105,108,101,32,99,111,108,117,109,110,115,32,98,105,110,97,114,121,32,105,110,102,111,114,109,97,116,105,111,110,0,0,0,0,0,114,101,101,110,99,111,100,101,73,83,79,50,32,100,101,102,10,0,0,0,0,0,0,0,9,102,111,114,109,97,116,32,102,111,114,32,66,117,116,116,111,110,32,50,32,105,115,32,37,100,10,0,0,0,0,0,35,32,115,101,116,32,116,101,114,109,105,110,97,108,32,37,115,32,37,115,10,0,0,0,114,101,101,110,99,111,100,101,73,83,79,32,100,101,102,10,0,0,0,0,0,0,0,0,122,111,111,109,32,105,110,32,111,110,108,121,32,116,104,101,32,88,32,97,120,105,115,46,0,0,0,0,0,0,0,0,80,111,115,116,83,99,114,105,112,116,32,70,111,110,116,32,114,101,99,111,114,100,0,0,123,125,91,93,40,41,32,0,99,97,110,110,111,116,32,119,114,105,116,101,32,116,101,109,112,111,114,97,114,121,32,102,105,108,101,0,0,0,0,0,83,121,109,98,111,108,45,79,98,108,105,113,117,101,0,0,37,115,40,0,0,0,0,0,71,78,85,80,76,79,84,95,70,79,78,84,80,65,84,72,0,0,0,0,0,0,0,0,91,40,37,115,41,32,37,46,49,102,32,37,46,49,102,32,37,115,32,37,115,32,37,100,32,0,0,0,0,0,0,0,70,73,84,95,77,65,88,73,84,69,82,0,0,0,0,0,70,111,114,109,97,116,32,99,104,97,114,97,99,116,101,114,32,109,105,115,109,97,116,99,104,58,32,37,37,83,32,105,115,32,111,110,108,121,32,118,97,108,105,100,32,119,105,116,104,32,37,37,115,0,0,0,69,78,72,80,83,95,111,112,101,110,115,101,113,117,101,110,99,101,0,0,0,0,0,0,71,78,85,84,69,82,77,0,97,109,0,0,0,0,0,0,88,89,114,101,115,116,111,114,101,10,0,0,0,0,0,0,115,121,115,116,101,109,0,0,69,110,104,97,110,99,101,100,32,116,101,120,116,58,32,32,32,123,120,64,95,123,48,125,94,123,110,43,49,125,125,0,88,89,115,97,118,101,10,0,109,120,116,36,105,99,115,0,99,111,108,32,62,32,48,0,41,93,10,0,0,0,0,0,9,97,108,116,101,114,110,97,116,105,118,101,32,102,111,114,109,97,116,32,102,111,114,32,66,117,116,116,111,110,32,49,32,105,115,32,39,37,115,39,10,0,0,0,0,0,0,0,79,112,116,105,111,110,115,32,97,114,101,32,39,37,115,39,10,0,0,0,0,0,0,0,37,115,37,103,44,32,37,115,37,103,44,32,37,115,37,103,0,0,0,0,0,0,0,0,117,110,105,37,48,52,108,88,0,0,0,0,0,0,0,0,60,115,104,105,102,116,45,99,111,110,116,114,111,108,45,119,104,101,101,108,45,117,112,62,0,0,0,0,0,0,0,0,117,37,108,88,0,0,0,0,37,115,47,0,0,0,0,0,99,111,109,98,105,110,97,116,105,111,110,32,114,103,98,32,111,114,32,103,98,114,32,111,114,32,98,114,103,32,101,116,99,46,32,101,120,112,101,99,116,101,100,0,0,0,0,0,37,37,32,69,110,100,32,112,108,111,116,32,35,37,100,10,0,0,0,0,0,0,0,0,99,112,49,50,53,52,0,0,105,110,116,101,114,112,111,108,97,116,105,111,110,32,116,97,98,108,101,0,0,0,0,0,32,100,101,108,116,97,95,120,32,100,101,108,116,97,95,121,0,0,0,0,0,0,0,0,37,37,32,66,101,103,105,110,32,112,108,111,116,32,35,37,100,10,0,0,0,0,0,0,98,110,111,116,0,0,0,0,115,116,114,111,107,101,10,0,70,73,84,95,83,84,65,82,84,95,76,65,77,66,68,65,0,0,0,0,0,0,0,0,94,80,89,94,45,10,94,73,79,76,10,94,73,83,89,78,84,65,88,48,48,48,48,48,94,70,94,73,66,49,49,48,48,48,94,73,74,48,48,48,48,48,94,73,84,48,48,48,48,48,10,0,0,0,0,0,94,80,78,94,45,10,0,0,116,101,115,116,32,111,102,32,99,104,97,114,97,99,116,101,114,32,119,105,100,116,104,58,0,0,0,0,0,0,0,0,94,73,71,69,10,94,45,94,44,0,0,0,0,0,0,0,109,117,108,116,105,36,112,108,111,116,0,0,0,0,0,0,69,114,114,111,114,32,97,115,115,105,103,110,105,110,103,32,109,101,109,111,114,121,32,102,111,114,32,98,105,110,97,114,121,32,102,105,108,101,32,100,97,116,97,32,114,101,99,111,114,100,115,0,0,0,0,0,63,0,0,0,0,0,0,0,94,73,71,86,10,0,0,0,9,102,111,114,109,97,116,32,102,111,114,32,66,117,116,116,111,110,32,49,32,105,115,32,37,100,10,0,0,0,0,0,112,111,112,0,0,0,0,0,98,97,100,32,100,97,116,97,32,111,110,32,108,105,110,101,32,37,100,32,111,102,32,102,105,108,101,32,37,115,0,0,32,111,102,102,115,101,116,32,0,0,0,0,0,0,0,0,94,85,37,48,53,100,58,37,48,53,100,10,0,0,0,0,32,122,111,111,109,32,111,117,116,46,0,0,0,0,0,0,94,68,37,48,53,100,58,37,48,53,100,10,0,0,0,0,73,108,108,101,103,97,108,32,115,101,101,100,32,118,97,108,117,101,0,0,0,0,0,0,94,86,48,10,0,0,0,0,94,80,86,51,48,50,49,48,48,94,71,10,94,86,51,10,0,0,0,0,0,0,0,0,94,80,86,50,48,50,48,53,48,94,71,10,94,86,50,10,0,0,0,0,0,0,0,0,94,80,86,49,48,50,48,50,53,94,71,10,94,86,49,10,0,0,0,0,0,0,0,0,70,73,84,95,76,65,77,66,68,65,95,70,65,67,84,79,82,0,0,0,0,0,0,0,99,111,109,112,105,108,101,95,111,112,116,105,111,110,115,0,94,80,87,37,48,50,100,10,0,0,0,0,0,0,0,0,101,120,116,101,110,100,32,105,110,112,117,116,32,108,105,110,101,0,0,0,0,0,0,0,10,94,73,71,86,10,0,0,115,116,114,112,116,105,109,101,0,0,0,0,0,0,0,0,49,50,51,52,53,54,55,56,57,48,49,50,51,52,53,54,55,56,57,48,0,0,0,0,94,73,71,69,10,0,0,0,109,111,36,117,115,101,0,0,98,105,110,97,114,121,32,102,105,108,101,32,100,97,116,97,32,114,101,99,111,114,100,115,0,0,0,0,0,0,0,0,65,114,105,97,108,0,0,0,9,102,111,114,109,97,116,116,105,110,103,32,110,117,109,98,101,114,115,32,119,105,116,104,32,34,37,115,34,10,0,0,110,111,102,112,101,95,116,114,97,112,0,0,0,0,0,0,106,112,103,0,0,0,0,0,112,117,115,104,0,0,0,0,99,104,97,114,97,99,116,101,114,32,0,0,0,0,0,0,60,116,115,112,97,110,32,102,111,110,116,45,115,105,122,101,61,34,37,46,49,102,112,116,34,32,100,121,61,34,37,46,50,102,112,116,34,62,60,47,116,115,112,97,110,62,0,0,60,99,111,110,116,114,111,108,45,119,104,101,101,108,45,100,111,119,110,62,0,0,0,0,37,99,0,0,0,0,0,0,99,111,110,116,111,117,114,32,99,110,116,114,95,115,116,114,117,99,116,0,0,0,0,0,98,97,99,107,103,114,111,117,110,100,32,34,35,37,48,54,120,34,32,0,0,0,0,0,99,111,110,118,101,114,116,32,98,97,99,107,32,34,37,115,34,32,45,32,37,100,47,37,100,47,37,100,58,58,37,100,58,37,100,58,37,100,32,44,32,119,100,97,121,61,37,100,44,32,121,100,97,121,61,37,100,10,0,0,0,0,0,0,32,93,32,37,115,114,101,118,101,114,115,101,32,37,115,119,114,105,116,101,98,97,99,107,0,0,0,0,0,0,0,0,108,105,110,101,119,105,100,116,104,32,37,51,46,49,102,32,0,0,0,0,0,0,0,0,34,116,105,116,108,101,34,32,97,108,108,111,119,101,100,32,111,110,108,121,32,97,102,116,101,114,32,112,97,114,97,109,101,116,114,105,99,32,102,117,110,99,116,105,111,110,32,102,117,108,108,121,32,115,112,101,99,105,102,105,101,100,0,0,115,111,108,105,100,32,0,0,105,115,111,32,99,117,114,118,101,32,112,111,105,110,116,115,0,0,0,0,0,0,0,0,100,97,115,104,101,100,32,0,70,73,84,95,83,67,82,73,80,84,0,0,0,0,0,0,98,117,116,116,32,0,0,0,102,111,114,0,0,0,0,0,109,97,116,114,105,120,32,114,111,119,32,112,111,105,110,116,101,114,115,0,0,0,0,0,102,111,110,116,102,105,108,101,32,34,37,115,34,32,0,0,115,116,114,102,116,105,109,101,0,0,0,0,0,0,0,0,98,101,122,105,101,114,32,99,111,101,102,102,105,99,105,101,110,116,115,0,0,0,0,0,77,111,117,115,101,32,97,110,100,32,104,111,116,107,101,121,115,32,97,114,101,32,115,117,112,112,111,114,116,101,100,44,32,104,105,116,58,32,104,32,114,32,109,32,54,0,0,0,110,97,109,101,32,34,37,115,34,32,0,0,0,0,0,0,98,109,97,114,36,103,105,110,0,0,0,0,0,0,0,0,69,113,117,97,108,32,40,39,61,39,41,32,115,121,109,98,111,108,32,114,101,113,117,105,114,101,100,0,0,0,0,0,97,108,116,45,0,0,0,0,115,116,97,110,100,97,108,111,110,101,32,0,0,0,0,0,9,100,111,117,98,108,101,32,99,108,105,99,107,32,114,101,115,111,108,117,116,105,111,110,32,105,115,32,111,102,102,10,0,0,0,0,0,0,0,0,89,111,117,32,99,97,110,39,116,32,99,104,97,110,103,101,32,116,104,101,32,116,101,114,109,105,110,97,108,32,105,110,32,109,117,108,116,105,112,108,111,116,32,109,111,100,101,0,123,32,121,48,32,103,32,0,115,99,114,101,101,110,32,0,109,111,117,115,105,110,103,32,0,0,0,0,0,0,0,0,108,111,97,100,0,0,0,0,67,97,110,39,116,32,99,97,108,99,117,108,97,116,101,32,97,112,112,114,111,120,105,109,97,116,105,111,110,32,115,112,108,105,110,101,115,0,0,0,101,110,104,97,110,99,101,100,0,0,0,0,0,0,0,0,122,111,111,109,32,105,110,32,116,111,119,97,114,100,32,116,104,101,32,99,101,110,116,101,114,32,111,102,32,116,104,101,32,112,108,111,116,46,0,0,112,109,51,100,32,112,97,108,101,116,116,101,32,99,111,108,111,114,0,0,0,0,0,0,102,97,99,116,111,114,105,97,108,32,40,33,41,32,97,114,103,117,109,101,110,116,32,109,117,115,116,32,98,101,32,97,110,32,105,110,116,101,103,101,114,0,0,0,0,0,0,0,32,100,121,110,97,109,105,99,0,0,0,0,0,0,0,0,105,110,116,101,114,110,97,108,32,61,32,37,102,32,45,32,37,100,47,37,100,47,37,100,58,58,37,100,58,37,100,58,37,100,32,44,32,119,100,97,121,61,37,100,44,32,121,100,97,121,61,37,100,10,0,0,32,102,105,120,101,100,0,0,115,105,122,101,32,37,100,44,37,100,37,115,32,37,115,32,102,110,97,109,101,32,39,37,115,39,32,32,102,115,105,122,101,32,37,103,32,0,0,0,117,110,114,101,99,111,103,110,105,122,101,100,32,116,101,114,109,105,110,97,108,32,111,112,116,105,111,110,0,0,0,0,98,97,99,107,103,36,114,111,117,110,100,0,0,0,0,0,100,97,115,104,36,101,100,0,32,32,116,101,114,109,105,110,97,108,32,116,101,115,116,0,114,111,117,110,100,36,101,100,0,0,0,0,0,0,0,0,116,109,97,114,36,103,105,110,0,0,0,0,0,0,0,0,111,112,116,105,111,110,32,101,120,112,101,99,116,101,100,0,70,111,110,116,32,102,105,108,101,110,97,109,101,32,101,120,112,101,99,116,101,100,0,0,9,100,111,117,98,108,101,32,99,108,105,99,107,32,114,101,115,111,108,117,116,105,111,110,32,105,115,32,37,100,32,109,115,10,0,0,0,0,0,0,84,104,105,115,32,111,112,116,105,111,110,32,99,97,110,110,111,116,32,98,101,32,99,104,97,110,103,101,100,32,117,115,105,110,103,32,39,115,101,116,32,116,101,114,109,111,112,116,105,111,110,39,0,0,0,0,115,101,99,111,110,100,32,0,102,111,110,116,102,105,108,101,0,0,0,0,0,0,0,0,60,99,111,110,116,114,111,108,45,119,104,101,101,108,45,117,112,62,0,0,0,0,0,0,102,115,105,122,101,58,32,101,120,112,101,99,116,105,110,103,32,102,111,110,116,32,115,105,122,101,0,0,0,0,0,0,102,115,36,105,122,101,0,0,115,109,111,111,116,104,32,112,97,108,101,116,116,101,32,105,110,32,37,115,58,32,117,115,105,110,103,32,37,105,32,111,102,32,37,105,32,97,118,97,105,108,97,98,108,101,32,99,111,108,111,114,32,112,111,115,105,116,105,111,110,115,10,0,37,115,32,114,97,110,103,101,32,109,117,115,116,32,98,101,32,103,114,101,97,116,101,114,32,116,104,97,110,32,48,32,102,111,114,32,108,111,103,32,115,99,97,108,101,0,0,0,102,110,36,97,109,101,0,0,102,105,36,120,101,100,0,0,86,97,108,117,101,32,115,116,111,114,101,100,32,102,111,114,32,117,110,100,101,102,105,110,101,100,32,100,97,116,97,112,111,105,110,116,32,104,97,110,100,108,105,110,103,32,105,115,32,105,108,108,101,103,97,108,33,33,33,10,0,0,0,0,100,36,121,110,97,109,105,99,0,0,0,0,0,0,0,0,110,97,109,101,32,109,117,115,116,32,99,111,110,116,97,105,110,32,111,110,108,121,32,97,108,112,104,97,110,117,109,101,114,105,99,115,32,111,114,32,95,0,0,0,0,0,0,0,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,95,49,50,51,52,53,54,55,56,57,48,0,119,111,114,100,0,0,0,0,116,101,114,109,105,110,97,108,32,116,121,112,101,32,105,115,32,117,110,107,110,111,119,110,0,0,0,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,97,32,112,108,111,116,32,110,97,109,101,0,0,0,114,109,97,114,36,103,105,110,0,0,0,0,0,0,0,0,110,97,109,101,0,0,0,0,9,110,111,32,112,111,108,97,114,32,100,105,115,116,97,110,99,101,32,116,111,32,114,117,108,101,114,32,119,105,108,108,32,98,101,32,115,104,111,119,110,10,0,0,0,0,0,0,100,101,108,97,121,0,0,0,102,105,114,115,116,32,0,0,109,111,117,115,36,105,110,103,0,0,0,0,0,0,0,0,115,99,114,111,108,108,32,114,105,103,104,116,46,0,0,0,109,111,117,115,101,0,0,0,121,32,115,105,122,101,32,111,117,116,32,111,102,32,114,97,110,103,101,0,0,0,0,0,101,120,116,101,110,100,32,105,110,32,100,111,95,115,121,115,116,101,109,95,102,117,110,99,0,0,0,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,121,32,115,105,122,101,0,0,0,0,0,0,0,0,112,111,108,121,103,111,110,0,120,32,115,105,122,101,32,111,117,116,32,111,102,32,114,97,110,103,101,0,0,0,0,0,101,120,112,101,99,116,105,110,103,32,120,32,115,105,122,101,0,0,0,0,0,0,0,0,115,36,105,122,101,0,0,0,67,97,110,110,111,116,32,109,105,120,32,115,99,114,101,101,110,32,111,114,32,99,104,97,114,97,99,116,101,114,32,99,111,111,114,100,115,32,119,105,116,104,32,112,108,111,116,32,99,111,111,114,100,115,0,0,70,111,110,116,32,102,105,108,101,32,39,37,115,39,32,105,115,32,101,109,112,116,121,0,115,117,98,115,116,114,0,0,115,101,116,32,116,101,114,109,111,112,116,32,101,110,104,0,67,111,109,109,97,110,100,32,39,37,115,39,32,103,101,110,101,114,97,116,101,115,32,101,109,112,116,121,32,111,117,116,112,117,116,0,0,0,0,0,67,111,109,109,97,110,100,32,39,37,115,39,32,103,101,110,101,114,97,116,101,100,32,101,114,114,111,114,32,101,120,105,116,99,111,100,101,32,37,100,0,0,0,0,0,0,0,0,108,109,97,114,36,103,105,110,0,0,0,0,0,0,0,0,68,105,109,95,50,0,0,0,9,100,105,115,116,97,110,99,101,32,116,111,32,114,117,108,101,114,32,119,105,108,108,32,98,101,32,115,104,111,119,32,105,110,32,112,111,108,97,114,32,99,111,111,114,100,105,110,97,116,101,115,10,0,0,0,103,105,102,0,0,0,0,0,111,98,106,101,99,116,32,110,111,116,32,102,111,117,110,100,0,0,0,0,0,0,0,0,70,111,110,116,32,102,105,108,101,32,39,37,115,39,32,99,111,110,116,97,105,110,115,32,116,104,101,32,102,111,110,116,32,39,37,115,39,10,0,0,60,115,104,105,102,116,45,119,104,101,101,108,45,100,111,119,110,62,0,0,0,0,0,0,102,111,110,116,45,102,97,109,105,108,121,0,0,0,0,0,70,111,110,116,32,102,105,108,101,32,39,37,115,39,32,110,111,116,32,102,111,117,110,100,0,0,0,0,0,0,0,0,42,118,101,114,121,42,32,108,111,110,103,32,115,121,115,116,101,109,32,99,97,108,108,32,111,117,116,112,117,116,32,104,97,115,32,98,101,101,110,32,116,114,117,110,99,97,116,101,100,0,0,0,0,0,0,0,67,111,117,108,100,32,110,111,116,32,101,120,101,99,117,116,101,32,112,105,112,101,32,39,37,115,39,0,0,0,0,0,10,9,60,99,105,114,99,108,101,32,105,100,61,39,103,112,68,111,116,39,32,114,61,39,48,46,53,39,32,115,116,114,111,107,101,45,119,105,100,116,104,61,39,48,46,53,39,47,62,10,9,60,112,97,116,104,32,105,100,61,39,103,112,80,116,48,39,32,115,116,114,111,107,101,45,119,105,100,116,104,61,39,37,46,51,102,39,32,115,116,114,111,107,101,61,39,99,117,114,114,101,110,116,67,111,108,111,114,39,32,100,61,39,77,45,49,44,48,32,104,50,32,77,48,44,45,49,32,118,50,39,47,62,10,9,60,112,97,116,104,32,105,100,61,39,103,112,80,116,49,39,32,115,116,114,111,107,101,45,119,105,100,116,104,61,39,37,46,51,102,39,32,115,116,114,111,107,101,61,39,99,117,114,114,101,110,116,67,111,108,111,114,39,32,100,61,39,77,45,49,44,45,49,32,76,49,44,49,32,77,49,44,45,49,32,76,45,49,44,49,39,47,62,10,9,60,112,97,116,104,32,105,100,61,39,103,112,80,116,50,39,32,115,116,114,111,107,101,45,119,105,100,116,104,61,39,37,46,51,102,39,32,115,116,114,111,107,101,61,39,99,117,114,114,101,110,116,67,111,108,111,114,39,32,100,61,39,77,45,49,44,48,32,76,49,44,48,32,77,48,44,45,49,32,76,48,44,49,32,77,45,49,44,45,49,32,76,49,44,49,32,77,45,49,44,49,32,76,49,44,45,49,39,47,62,10,9,60,114,101,99,116,32,105,100,61,39,103,112,80,116,51,39,32,115,116,114,111,107,101,45,119,105,100,116,104,61,39,37,46,51,102,39,32,115,116,114,111,107,101,61,39,99,117,114,114,101,110,116,67,111,108,111,114,39,32,120,61,39,45,49,39,32,121,61,39,45,49,39,32,119,105,100,116,104,61,39,50,39,32,104,101,105,103,104,116,61,39,50,39,47,62,10,9,60,114,101,99,116,32,105,100,61,39,103,112,80,116,52,39,32,115,116,114,111,107,101,45,119,105,100,116,104,61,39,37,46,51,102,39,32,115,116,114,111,107,101,61,39,99,117,114,114,101,110,116,67,111,108,111,114,39,32,102,105,108,108,61,39,99,117,114,114,101,110,116,67,111,108,111,114,39,32,120,61,39,45,49,39,32,121,61,39,45,49,39,32,119,105,100,116,104,61,39,50,39,32,104,101,105,103,104,116,61,39,50,39,47,62,10,9,60,99,105,114,99,108,101,32,105,100,61,39,103,112,80,116,53,39,32,115,116,114,111,107,101,45,119,105,100,116,104,61,39,37,46,51,102,39,32,115,116,114,111,107,101,61,39,99,117,114,114,101,110,116,67,111,108,111,114,39,32,99,120,61,39,48,39,32,99,121,61,39,48,39,32,114,61,39,49,39,47,62,10,9,60,117,115,101,32,120,108,105,110,107,58,104,114,101,102,61,39,35,103,112,80,116,53,39,32,105,100,61,39,103,112,80,116,54,39,32,102,105,108,108,61,39,99,117,114,114,101,110,116,67,111,108,111,114,39,32,115,116,114,111,107,101,61,39,110,111,110,101,39,47,62,10,9,60,112,97,116,104,32,105,100,61,39,103,112,80,116,55,39,32,115,116,114,111,107,101,45,119,105,100,116,104,61,39,37,46,51,102,39,32,115,116,114,111,107,101,61,39,99,117,114,114,101,110,116,67,111,108,111,114,39,32,100,61,39,77,48,44,45,49,46,51,51,32,76,45,49,46,51,51,44,48,46,54,55,32,76,49,46,51,51,44,48,46,54,55,32,122,39,47,62,10,9,60,117,115,101,32,120,108,105,110,107,58,104,114,101,102,61,39,35,103,112,80,116,55,39,32,105,100,61,39,103,112,80,116,56,39,32,102,105,108,108,61,39,99,117,114,114,101,110,116,67,111,108,111,114,39,32,115,116,114,111,107,101,61,39,110,111,110,101,39,47,62,10,9,60,117,115,101,32,120,108,105,110,107,58,104,114,101,102,61,39,35,103,112,80,116,55,39,32,105,100,61,39,103,112,80,116,57,39,32,115,116,114,111,107,101,61,39,99,117,114,114,101,110,116,67,111,108,111,114,39,32,116,114,97,110,115,102,111,114,109,61,39,114,111,116,97,116,101,40,49,56,48,41,39,47,62,10,9,60,117,115,101,32,120,108,105,110,107,58,104,114,101,102,61,39,35,103,112,80,116,57,39,32,105,100,61,39,103,112,80,116,49,48,39,32,102,105,108,108,61,39,99,117,114,114,101,110,116,67,111,108,111,114,39,32,115,116,114,111,107,101,61,39,110,111,110,101,39,47,62,10,9,60,117,115,101,32,120,108,105,110,107,58,104,114,101,102,61,39,35,103,112,80,116,51,39,32,105,100,61,39,103,112,80,116,49,49,39,32,115,116,114,111,107,101,61,39,99,117,114,114,101,110,116,67,111,108,111,114,39,32,116,114,97,110,115,102,111,114,109,61,39,114,111,116,97,116,101,40,52,53,41,39,47,62,10,9,60,117,115,101,32,120,108,105,110,107,58,104,114,101,102,61,39,35,103,112,80,116,49,49,39,32,105,100,61,39,103,112,80,116,49,50,39,32,102,105,108,108,61,39,99,117,114,114,101,110,116,67,111,108,111,114,39,32,115,116,114,111,107,101,61,39,110,111,110,101,39,47,62,10,60,47,100,101,102,115,62,10,0,60,100,101,102,115,62,10,0,9,37,115,32,114,97,110,103,101,32,114,101,115,116,114,105,99,116,101,100,32,116,111,32,91,0,0,0,0,0,0,0,47,62,10,0,0,0,0,0,32,102,105,108,108,61,34,35,37,48,54,120,34,0,0,0,115,116,114,115,116,114,116,0,85,110,107,110,111,119,110,32,111,114,32,97,109,98,105,103,117,111,117,115,32,116,101,114,109,105,110,97,108,32,110,97,109,101,32,39,37,115,39,10,0,0,0,0,0,0,0,0,60,103,32,105,100,61,34,103,110,117,112,108,111,116,95,99,97,110,118,97,115,34,62,10,10,0,0,0,0,0,0,0,109,97,114,36,103,105,110,0,60,103,32,105,100,61,34,103,110,117,112,108,111,116,95,99,97,110,118,97,115,34,32,111,110,99,108,105,99,107,61,34,103,110,117,112,108,111,116,95,115,118,103,46,116,111,103,103,108,101,67,111,111,114,100,66,111,120,40,101,118,116,41,34,32,111,110,109,111,117,115,101,109,111,118,101,61,34,103,110,117,112,108,111,116,95,115,118,103,46,109,111,118,101,67,111,111,114,100,66,111,120,40,101,118,116,41,34,62,10,10,0,9,110,111,32,122,111,111,109,32,99,111,111,114,100,105,110,97,116,101,115,32,119,105,108,108,32,98,101,32,100,114,97,119,110,10,0,0,0,0,0,10,60,33,45,45,32,65,108,115,111,32,116,114,97,99,107,32,109,111,117,115,101,32,119,104,101,110,32,105,116,32,105,115,32,111,110,32,97,32,112,108,111,116,32,101,108,101,109,101,110,116,32,45,45,62,10,0,0,0,0,0,0,0,0,32,102,105,108,108,115,116,121,108,101,32,0,0,0,0,0,115,99,114,111,108,108,32,108,101,102,116,32,40,105,110,32,45,88,32,100,105,114,101,99,116,105,111,110,41,46,0,0,111,110,99,108,105,99,107,61,34,103,110,117,112,108,111,116,95,115,118,103,46,116,111,103,103,108,101,67,111,111,114,100,66,111,120,40,101,118,116,41,34,32,32,111,110,109,111,117,115,101,109,111,118,101,61,34,103,110,117,112,108,111,116,95,115,118,103,46,109,111,118,101,67,111,111,114,100,66,111,120,40,101,118,116,41,34,47,62,10,0,0,0,0,0,0,0,32,102,105,108,108,61,34,35,37,48,54,120,34,32,115,116,114,111,107,101,61,34,98,108,97,99,107,34,32,115,116,114,111,107,101,45,119,105,100,116,104,61,34,49,34,10,0,0,100,111,95,115,121,115,116,101,109,95,102,117,110,99,0,0,60,114,101,99,116,32,120,61,34,37,100,34,32,121,61,34,37,100,34,32,119,105,100,116,104,61,34,37,100,34,32,104,101,105,103,104,116,61,34,37,100,34,0,0,0,0,0,0,10,60,33,45,45,32,84,105,101,32,109,111,117,115,105,110,103,32,116,111,32,101,110,116,105,114,101,32,98,111,117,110,100,105,110,103,32,98,111,120,32,111,102,32,116,104,101,32,112,108,111,116,32,45,45,62,10,0,0,0,0,0,0,0,60,115,99,114,105,112,116,32,108,97,110,103,117,97,103,101,61,34,106,97,118,97,83,99,114,105,112,116,34,32,84,89,80,69,61,34,116,101,120,116,47,106,97,118,97,115,99,114,105,112,116,34,32,62,32,60,33,91,67,68,65,84,65,91,10,0,0,0,0,0,0,0,35,32,70,73,88,69,68,0,70,97,105,108,101,100,32,116,111,32,105,110,115,101,114,116,32,106,97,118,97,115,99,114,105,112,116,32,102,105,108,101,32,37,115,10,0,0,0,0,115,116,114,108,101,110,0,0,106,97,118,97,115,99,114,105,112,116,32,110,97,109,101,0,109,97,112,36,112,105,110,103,51,100,0,0,0,0,0,0,103,110,117,112,108,111,116,95,115,118,103,46,106,115,0,0,9,122,111,111,109,32,99,111,111,114,100,105,110,97,116,101,115,32,119,105,108,108,32,98,101,32,100,114,97,119,110,10,0,0,0,0,0,0,0,0,60,115,99,114,105,112,116,32,116,121,112,101,61,34,116,101,120,116,47,106,97,118,97,115,99,114,105,112,116,34,32,120,108,105,110,107,58,104,114,101,102,61,34,37,115,103,110,117,112,108,111,116,95,115,118,103,46,106,115,34,47,62,10,0,60,115,104,105,102,116,45,119,104,101,101,108,45,117,112,62,0,0,0,0,0,0,0,0,116,111,111,32,109,97,110,121,32,97,114,103,117,109,101,110,116,115,32,102,111,114,32,39,99,97,108,108,32,60,102,105,108,101,62,39,0,0,0,0,106,115,100,105,114,0,0,0,112,111,112,101,110,32,102,97,105,108,101,100,0,0,0,0,47,117,115,114,47,108,111,99,97,108,47,115,104,97,114,101,47,103,110,117,112,108,111,116,47,52,46,54,47,106,115,0,60,100,101,115,99,62,80,114,111,100,117,99,101,100,32,98,121,32,71,78,85,80,76,79,84,32,37,115,32,112,97,116,99,104,108,101,118,101,108,32,37,115,32,60,47,100,101,115,99,62,10,10,0,0,0,0,71,110,117,112,108,111,116,0,85,110,100,101,102,105,110,101,100,32,118,97,108,117,101,32,100,117,114,105,110,103,32,102,117,110,99,116,105,111,110,32,101,118,97,108,117,97,116,105,111,110,0,0,0,0,0,0,60,116,105,116,108,101,62,37,115,60,47,116,105,116,108,101,62,10,0,0,0,0,0,0,62,10,10,0,0,0,0,0,103,112,114,105,110,116,102,0,84,101,114,109,105,110,97,108,32,116,121,112,101,32,115,101,116,32,116,111,32,39,37,115,39,10,0,0,0,0,0,0,32,120,109,108,110,115,58,120,108,105,110,107,61,34,104,116,116,112,58,47,47,119,119,119,46,119,51,46,111,114,103,47,49,57,57,57,47,120,108,105,110,107,34,10,0,0,0,0,109,97,112,36,112,105,110,103,0,0,0,0,0,0,0,0,112,108,111,116,32,116,105,116,108,101,0,0,0,0,0,0,32,120,109,108,110,115,61,34,104,116,116,112,58,47,47,119,119,119,46,119,51,46,111,114,103,47,50,48,48,48,47,115,118,103,34,10,0,0,0,0,9,109,111,117,115,101,32,105,115,32,111,110,10,0,0,0,10,32,118,105,101,119,66,111,120,61,34,48,32,48,32,37,117,32,37,117,34,10,0,0,115,99,114,111,108,108,32,100,111,119,110,46,0,0,0,0,46,46,0,0,0,0,0,0,10,32,119,105,100,116,104,61,34,37,117,34,32,104,101,105,103,104,116,61,34,37,117,34,32,0,0,0,0,0,0,0,111,110,108,111,97,100,61,34,105,102,32,40,116,121,112,101,111,102,40,103,110,117,112,108,111,116,95,115,118,103,41,33,61,39,117,110,100,101,102,105,110,101,100,39,41,32,103,110,117,112,108,111,116,95,115,118,103,46,73,110,105,116,40,101,118,116,41,34,32,0,0,0,37,115,32,105,115,32,110,111,116,32,97,32,115,116,114,105,110,103,32,118,97,114,105,97,98,108,101,0,0,0,0,0,60,63,120,109,108,32,118,101,114,115,105,111,110,61,34,49,46,48,34,32,37,115,32,115,116,97,110,100,97,108,111,110,101,61,34,110,111,34,63,62,10,60,33,68,79,67,84,89,80,69,32,115,118,103,32,80,85,66,76,73,67,32,34,45,47,47,87,51,67,47,47,68,84,68,32,83,86,71,32,49,46,49,47,47,69,78,34,32,10,32,34,104,116,116,112,58,47,47,119,119,119,46,119,51,46,111,114,103,47,71,114,97,112,104,105,99,115,47,83,86,71,47,49,46,49,47,68,84,68,47,115,118,103,49,49,46,100,116,100,34,62,10,60,115,118,103,32,0,0,0,0,0,101,110,99,111,100,105,110,103,61,34,117,116,102,45,56,34,32,0,0,0,0,0,0,0,102,111,110,116,112,97,116,104,32,61,61,32,78,85,76,76,0,0,0,0,0,0,0,0,101,110,99,111,100,105,110,103,61,34,83,104,105,102,116,95,74,73,83,34,32,0,0,0,37,45,49,53,46,49,53,115,32,61,32,37,103,10,0,0,70,111,114,109,97,116,32,99,104,97,114,97,99,116,101,114,32,109,105,115,109,97,116,99,104,58,32,37,37,84,32,105,115,32,111,110,108,121,32,118,97,108,105,100,32,119,105,116,104,32,37,37,116,0,0,0,101,110,99,111,100,105,110,103,61,34,107,111,105,56,45,117,34,32,0,0,0,0,0,0,68,101,112,114,101,99,97,116,101,100,32,115,121,110,116,97,120,32,45,32,112,108,101,97,115,101,32,117,115,101,32,39,115,101,116,32,116,105,99,115,32,115,99,97,108,101,32,100,101,102,97,117,108,116,39,0,37,89,45,37,109,45,37,100,0,0,0,0,0,0,0,0,101,110,99,111,100,105,110,103,61,34,107,111,105,56,45,114,34,32,0,0,0,0,0,0,87,97,114,110,105,110,103,58,32,115,99,97,108,101,32,105,110,116,101,114,102,97,99,101,32,105,115,32,110,111,116,32,110,117,108,108,95,115,99,97,108,101,32,45,32,109,97,121,32,110,111,116,32,119,111,114,107,32,119,105,116,104,32,109,117,108,116,105,112,108,111,116,10,0,0,0,0,0,0,0,101,110,99,111,100,105,110,103,61,34,119,105,110,100,111,119,115,45,49,50,53,49,34,32,0,0,0,0,0,0,0,0,109,97,99,36,114,111,115,0,116,105,109,101,99,111,108,117,109,110,40,41,32,99,97,108,108,101,100,32,102,114,111,109,32,105,110,118,97,108,105,100,32,99,111,110,116,101,120,116,0,0,0,0,0,0,0,0,101,110,99,111,100,105,110,103,61,34,119,105,110,100,111,119,115,45,49,50,53,48,34,32,0,0,0,0,0,0,0,0,9,108,97,115,116,32,112,108,111,116,32,99,111,109,109,97,110,100,32,119,97,115,58,32,37,115,10,0,0,0,0,0,102,99,32,0,0,0,0,0,101,110,99,111,100,105,110,103,61,34,99,112,57,53,48,34,32,0,0,0,0,0,0,0,60,119,104,101,101,108,45,100,111,119,110,62,0,0,0,0,101,110,99,111,100,105,110,103,61,34,105,98,109,45,56,53,50,34,32,0,0,0,0,0,101,110,99,111,100,105,110,103,61,34,105,98,109,45,56,53,48,34,32,0,0,0,0,0,115,116,114,105,110,103,32,118,97,114,105,97,98,108,101,0,99,112,49,50,53,49,0,0,101,110,99,111,100,105,110,103,61,34,105,115,111,45,56,56,53,57,45,49,53,34,32,0,32,108,97,98,101,108,0,0,101,110,99,111,100,105,110,103,61,34,105,115,111,45,56,56,53,57,45,57,34,32,0,0,108,110,111,116,0,0,0,0,101,110,99,111,100,105,110,103,61,34,105,115,111,45,56,56,53,57,45,50,34,32,0,0,105,110,105,116,105,97,108,32,115,101,116,32,111,102,32,102,114,101,101,0,0,0,0,0,101,110,99,111,100,105,110,103,61,34,105,115,111,45,56,56,53,57,45,49,34,32,0,0,35,37,50,46,50,88,37,50,46,50,88,37,50,46,50,88,0,0,0,0,0,0,0,0,116,109,95,121,100,97,121,0,120,49,49,0,0,0,0,0,60,47,115,118,103,62,10,10,0,0,0,0,0,0,0,0,108,111,103,36,115,99,97,108,101,0,0,0,0,0,0,0,64,67,79,76,85,77,78,72,69,65,68,64,0,0,0,0,32,32,32,32,111,110,99,108,105,99,107,61,39,103,110,117,112,108,111,116,95,115,118,103,46,116,111,103,103,108,101,71,114,105,100,40,41,59,39,47,62,10,0,0,0,0,0,0,61,32,0,0,0,0,0,0,83,116,97,116,115,32,99,111,109,109,97,110,100,32,110,111,116,32,97,118,97,105,108,97,98,108,101,32,105,110,32,112,97,114,97,109,101,116,114,105,99,32,109,111,100,101,0,0,108,119,32,37,46,49,102,32,0,0,0,0,0,0,0,0,10,32,32,60,105,109,97,103,101,32,120,61,39,49,48,39,32,121,61,39,37,100,39,32,119,105,100,116,104,61,39,49,54,39,32,104,101,105,103,104,116,61,39,49,54,39,32,120,108,105,110,107,58,104,114,101,102,61,39,103,114,105,100,46,112,110,103,39,10,0,0,0,115,99,114,111,108,108,32,117,112,32,40,105,110,32,43,89,32,100,105,114,101,99,116,105,111,110,41,46,0,0,0,0,102,111,110,116,112,97,116,104,95,102,117,108,108,110,97,109,101,0,0,0,0,0,0,0,32,32,118,105,115,105,98,105,108,105,116,121,61,34,104,105,100,100,101,110,34,62,32,60,47,116,101,120,116,62,10,0,37,115,32,101,114,114,111,114,10,0,0,0,0,0,0,0,32,32,102,111,110,116,45,115,105,122,101,61,34,49,50,34,32,102,111,110,116,45,102,97,109,105,108,121,61,34,65,114,105,97,108,34,10,0,0,0,115,121,115,116,101,109,40,41,32,102,97,105,108,101,100,0,10,32,32,60,116,101,120,116,32,105,100,61,34,99,111,111,114,100,95,116,101,120,116,34,32,116,101,120,116,45,97,110,99,104,111,114,61,34,115,116,97,114,116,34,32,112,111,105,110,116,101,114,45,101,118,101,110,116,115,61,34,110,111,110,101,34,10,0,0,0,0,0,93,93,62,10,60,47,115,99,114,105,112,116,62,10,0,0,103,110,117,112,108,111,116,95,115,118,103,46,112,108,111,116,95,116,105,109,101,97,120,105,115,95,120,32,61,32,34,34,59,10,0,0,0,0,0,0,114,101,115,117,108,116,97,110,116,0,0,0,0,0,0,0,105,110,118,97,108,105,100,32,111,114,32,100,101,112,114,101,99,97,116,101,100,32,115,121,110,116,97,120,0,0,0,0,68,97,116,101,84,105,109,101,0,0,0,0,0,0,0,0,84,105,109,101,0,0,0,0,116,109,95,119,100,97,121,0,88,49,49,0,0,0,0,0,68,97,116,101,0,0,0,0,108,111,99,36,97,108,101,0,97,110,97,108,121,122,101,95,115,103,108,95,99,111,108,117,109,110,0,0,0,0,0,0,99,111,108,117,109,110,104,101,97,100,40,41,32,99,97,108,108,101,100,32,102,114,111,109,32,105,110,118,97,108,105,100,32,99,111,110,116,101,120,116,0,0,0,0,0,0,0,0,103,110,117,112,108,111,116,95,115,118,103,46,112,108,111,116,95,116,105,109,101,97,120,105,115,95,120,32,61,32,34,37,115,34,59,10,0,0,0,0,9,37,45,42,115,32,0,0,102,112,101,95,116,114,97,112,0,0,0,0,0,0,0,0,102,110,97,109,101,0,0,0,106,112,101,103,0,0,0,0,103,110,117,112,108,111,116,95,115,118,103,46,112,108,111,116,95,97,120,105,115,95,120,109,97,120,32,61,32,37,46,51,102,59,10,0,0,0,0,0,60,119,104,101,101,108,45,117,112,62,0,0,0,0,0,0,114,101,99,117,114,115,105,118,101,102,117,108,108,110,97,109,101,0,0,0,0,0,0,0,103,110,117,112,108,111,116,95,115,118,103,46,112,108,111,116,95,97,120,105,115,95,120,109,105,110,32,61,32,37,46,51,102,59,10,0,0,0,0,0,116,114,97,99,101,95,99,111,110,116,111,117,114,58,32,117,110,101,120,112,101,99,116,101,100,32,101,110,100,32,111,102,32,99,111,110,116,111,117,114,10,0,0,0,0,0,0,0,103,110,117,112,108,111,116,95,115,118,103,46,112,108,111,116,95,108,111,103,97,120,105,115,95,114,32,61,32,37,100,59,10,0,0,0,0,0,0,0,73,109,112,111,115,115,105,98,108,101,32,99,97,115,101,32,105,110,32,115,119,105,116,99,104,0,0,0,0,0,0,0,32,58,32,0,0,0,0,0,103,110,117,112,108,111,116,95,115,118,103,46,112,108,111,116,95,108,111,103,97,120,105,115,95,121,32,61,32,37,100,59,10,0,0,0,0,0,0,0,112,109,51,100,32,115,99,97,110,32,97,114,114,97,121,0,116,36,105,116,108,101,0,0,103,110,117,112,108,111,116,95,115,118,103,46,112,108,111,116,95,108,111,103,97,120,105,115,95,120,32,61,32,37,100,59,10,0,0,0,0,0,0,0,108,97,98,101,108,112,111,105,110,116,32,116,101,120,116,0,103,110,117,112,108,111,116,95,115,118,103,46,112,108,111,116,95,97,120,105,115,95,121,50,109,105,110,32,61,32,34,110,111,110,101,34,10,0,0,0,67,111,117,108,100,32,110,111,116,32,108,105,110,101,98,117,102,102,101,114,32,115,116,100,111,117,116,10,0,0,0,0,10,10,32,73,116,101,114,97,116,105,111,110,32,37,100,10,32,87,83,83,82,32,32,32,32,32,32,32,32,58,32,37,45,49,53,103,32,32,32,100,101,108,116,97,40,87,83,83,82,41,47,87,83,83,82,32,32,32,58,32,37,103,10,32,100,101,108,116,97,40,87,83,83,82,41,32,58,32,37,45,49,53,103,32,32,32,108,105,109,105,116,32,102,111,114,32,115,116,111,112,112,105,110,103,32,58,32,37,103,10,32,108,97,109,98,100,97,9,32,32,58,32,37,103,10,10,37,115,32,112,97,114,97,109,101,116,101,114,32,118,97,108,117,101,115,10,10,0,0,0,0,0,112,108,111,116,95,97,120,105,115,95,121,50,109,97,120,0,69,120,112,101,99,116,105,110,103,32,105,116,101,114,97,116,111,114,32,9,102,111,114,32,91,60,118,97,114,62,32,61,32,60,115,116,97,114,116,62,32,58,32,60,101,110,100,62,93,10,9,9,9,111,114,9,102,111,114,32,91,60,118,97,114,62,32,105,110,32,34,115,116,114,105,110,103,32,111,102,32,119,111,114,100,115,34,93,0,0,0,0,0,0,0,0,71,80,86,65,76,95,89,50,95,77,65,88,0,0,0,0,116,109,95,121,101,97,114,0,117,110,107,110,111,119,110,32,111,114,32,97,109,98,105,103,117,111,117,115,32,116,101,114,109,105,110,97,108,32,116,121,112,101,59,32,116,121,112,101,32,106,117,115,116,32,39,115,101,116,32,116,101,114,109,105,110,97,108,39,32,102,111,114,32,97,32,108,105,115,116,0,112,108,111,116,95,97,120,105,115,95,121,50,109,105,110,0,83,121,110,116,97,120,32,101,114,114,111,114,58,32,109,105,115,115,105,110,103,32,98,108,111,99,107,32,116,101,114,109,105,110,97,116,111,114,32,125,0,0,0,0,0,0,0,0,108,111,97,36,100,112,97,116,104,0,0,0,0,0,0,0,98,108,97,110,107,0,0,0,116,117,114,110,105,110,103,32,114,117,108,101,114,32,111,110,46,10,0,0,0,0,0,0,71,80,86,65,76,95,89,50,95,77,73,78,0,0,0,0,101,120,116,114,97,110,101,111,117,115,32,97,114,103,117,109,101,110,116,115,32,105,110,32,115,101,116,32,116,105,99,115,0,0,0,0,0,0,0,0,123,32,48,46,57,57,57,57,57,32,121,48,32,115,117,98,32,103,32,0,0,0,0,0,103,110,117,112,108,111,116,95,115,118,103,46,112,108,111,116,95,97,120,105,115,95,120,50,109,105,110,32,61,32,34,110,111,110,101,34,10,0,0,0,99,97,108,108,0,0,0,0,121,32,112,111,115,0,0,0,118,101,114,116,105,99,97,108,32,109,111,116,105,111,110,32,45,45,32,99,104,97,110,103,101,32,120,121,112,108,97,110,101,0,0,0,0,0,0,0,102,97,105,108,115,97,102,101,0,0,0,0,0,0,0,0,112,108,111,116,95,97,120,105,115,95,120,50,109,97,120,0,99,97,110,32,111,110,108,121,32,109,111,100,32,105,110,116,115,0,0,0,0,0,0,0,71,80,86,65,76,95,88,50,95,77,65,88,0,0,0,0,83,111,114,114,121,44,32,110,111,32,104,101,108,112,32,102,111,114,32,39,37,115,39,10,0,0,0,0,0,0,0,0,112,108,111,116,95,97,120,105,115,95,120,50,109,105,110,0,71,80,86,65,76,95,88,50,95,77,73,78,0,0,0,0,103,110,117,112,108,111,116,95,115,118,103,46,112,108,111,116,95,97,120,105,115,95,114,109,105,110,32,61,32,37,103,59,10,0,0,0,0,0,0,0,102,97,108,115,101,0,0,0,116,114,117,101,0,0,0,0,116,109,95,109,111,110,0,0,117,110,107,110,111,119,110,0,103,110,117,112,108,111,116,95,115,118,103,46,112,111,108,97,114,95,109,111,100,101,32,61,32,37,115,59,10,0,0,0,108,116,0,0,0,0,0,0,105,110,100,101,120,95,109,97,120,0,0,0,0,0,0,0,112,97,114,116,105,97,108,32,109,97,116,99,104,32,97,103,97,105,110,115,116,32,99,111,108,117,109,110,32,37,100,32,104,101,97,100,101,114,32,37,115,0,0,0,0,0,0,0,112,108,111,116,95,97,120,105,115,95,121,109,97,120,0,0,68,101,112,114,101,99,97,116,101,100,32,115,121,110,116,97,120,32,45,32,112,108,101,97,115,101,32,117,115,101,32,39,115,101,116,32,116,105,99,115,32,115,99,97,108,101,39,32,107,101,121,119,111,114,100,0,71,80,86,65,76,95,89,95,77,65,88,0,0,0,0,0,60,83,104,105,102,116,45,66,50,45,77,111,116,105,111,110,62,0,0,0,0,0,0,0,112,108,111,116,95,97,120,105,115,95,121,109,105,110,0,0,71,80,86,65,76,95,89,95,77,73,78,0,0,0,0,0,72,101,108,112,32,116,111,112,105,99,58,32,0,0,0,0]) -.concat([118,0,0,0,0,0,0,0,111,117,116,32,111,102,32,109,101,109,111,114,121,32,102,111,114,32,37,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,37,32,71,78,85,80,76,79,84,58,32,76,97,84,101,88,32,112,105,99,116,117,114,101,32,117,115,105,110,103,32,116,112,105,99,32,92,115,112,101,99,105,97,108,115,10,37,37,32,32,32,32,32,32,32,32,32,32,119,105,116,104,32,37,100,32,112,111,105,110,116,32,116,121,112,101,115,32,97,110,100,32,37,100,32,108,105,110,101,32,116,121,112,101,115,10,37,37,32,79,112,116,105,111,110,115,58,32,112,111,105,110,116,115,105,122,101,32,61,32,37,100,44,32,108,105,110,101,119,105,100,116,104,32,61,32,37,100,44,32,105,110,116,101,114,118,97,108,32,61,32,37,102,10,37,37,32,84,111,32,99,104,97,110,103,101,32,97,98,111,118,101,32,111,112,116,105,111,110,115,44,32,115,97,121,58,10,37,37,32,115,101,116,32,116,101,114,109,105,110,97,108,32,116,112,105,99,32,112,111,105,110,116,115,105,122,101,95,118,97,108,117,101,32,108,105,110,101,119,105,100,116,104,95,118,97,108,117,101,32,105,110,116,101,114,118,97,108,95,118,97,108,117,101,10,37,37,32,40,112,111,105,110,116,115,105,122,101,32,97,110,100,32,108,105,110,101,119,105,100,116,104,32,45,32,105,110,116,101,103,101,114,115,32,105,110,32,109,105,108,108,105,45,105,110,99,104,101,115,46,10,37,37,32,32,105,110,116,101,114,118,97,108,32,45,32,97,32,102,108,111,97,116,32,105,110,32,105,110,99,104,101,115,46,32,32,73,102,32,122,101,114,111,32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,10,37,37,32,32,116,104,101,32,100,101,102,97,117,108,116,32,118,97,108,117,101,32,105,115,32,99,104,111,115,101,110,46,41,10,92,115,101,116,108,101,110,103,116,104,123,92,117,110,105,116,108,101,110,103,116,104,125,123,37,102,105,110,125,37,37,10,0,0,0,0,37,115,92,98,101,103,105,110,123,112,105,99,116,117,114,101,125,40,37,100,44,37,100,41,40,37,100,44,37,100,41,37,37,32,37,115,10,0,0,0,64,74,1,0,0,0,0,0,184,73,1,0,1,0,0,0,0,0,0,0,2,0,0,0,232,195,1,0,0,0,0,0,144,195,1,0,1,0,0,0,80,195,1,0,1,0,0,0,144,245,1,0,2,0,0,0,40,245,1,0,2,0,0,0,32,50,1,0,3,0,0,0,232,49,1,0,4,0,0,0,200,49,1,0,5,0,0,0,40,195,1,0,6,0,0,0,192,49,1,0,7,0,0,0,192,229,1,0,8,0,0,0,72,236,1,0,10,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,56,166,1,0,200,165,1,0,248,164,1,0,184,164,1,0,88,164,1,0,8,164,1,0,176,163,1,0,120,163,1,0,64,163,1,0,232,162,1,0,152,162,1,0,248,161,1,0,4,0,0,0,3,0,0,0,3,0,0,0,4,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,92,98,101,103,105,110,123,116,101,120,100,114,97,119,125,10,92,110,111,114,109,97,108,115,105,122,101,10,92,105,102,120,92,112,97,116,104,68,69,70,73,78,69,68,92,114,101,108,97,120,92,101,108,115,101,92,108,101,116,92,112,97,116,104,68,69,70,73,78,69,68,92,114,101,108,97,120,10,32,92,100,101,102,92,81,116,71,102,114,123,92,105,102,120,32,40,92,84,71,114,101,32,92,108,101,116,92,89,104,101,116,84,92,99,112,97,116,104,92,101,108,115,101,92,108,101,116,92,89,104,101,116,84,92,114,101,108,97,120,92,102,105,92,89,104,101,116,84,125,10,32,92,100,101,102,92,112,97,116,104,32,40,35,49,32,35,50,41,123,92,109,111,118,101,32,40,35,49,32,35,50,41,92,102,117,116,117,114,101,108,101,116,92,84,71,114,101,92,81,116,71,102,114,125,10,32,92,100,101,102,92,99,112,97,116,104,32,40,35,49,32,35,50,41,123,92,108,118,101,99,32,40,35,49,32,35,50,41,92,102,117,116,117,114,101,108,101,116,92,84,71,114,101,92,81,116,71,102,114,125,10,92,102,105,10,92,100,114,97,119,100,105,109,32,112,116,10,92,115,101,116,117,110,105,116,115,99,97,108,101,32,37,50,46,50,102,10,92,108,105,110,101,119,100,32,37,100,10,92,116,101,120,116,114,101,102,32,104,58,76,32,118,58,67,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,18,0,0,0,0,0,0,255,255,255,255,0,0,0,0,112,23,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,0,0,0,0,0,0,40,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,152,190,2,0,192,31,1,0,184,31,1,0,72,31,1,0,24,31,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,253,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,2,0,0,0,2,0,0,0,3,0,0,0,2,0,0,0,1,0,0,0,3,0,0,0,2,0,0,0,1,0,0,0,3,0,0,0,2,0,0,0,1,0,0,0,0,0,0,0,7,0,0,0,7,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,4,0,0,0,5,0,0,0,6,0,0,0,7,0,0,0,8,0,0,0,9,0,0,0,10,0,0,0,11,0,0,0,12,0,0,0,13,0,0,0,14,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,3,0,0,0,3,0,0,0,3,0,0,0,3,0,0,0,5,0,0,0,5,0,0,0,5,0,0,0,7,0,0,0,7,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,56,32,3,0,240,30,3,0,160,31,3,0,8,32,3,0,240,31,3,0,192,31,3,0,232,30,3,0,144,31,3,0,184,31,3,0,0,0,0,0,56,32,3,0,8,32,3,0,240,31,3,0,200,31,3,0,192,31,3,0,184,31,3,0,160,31,3,0,144,31,3,0,128,31,3,0,56,31,3,0,24,31,3,0,8,31,3,0,240,30,3,0,232,30,3,0,216,30,3,0,184,30,3,0,152,30,3,0,144,30,3,0,128,30,3,0,64,30,3,0,48,30,3,0,248,29,3,0,208,29,3,0,176,29,3,0,160,29,3,0,152,29,3,0,112,29,3,0,104,29,3,0,88,29,3,0,40,29,3,0,8,29,3,0,248,28,3,0,224,28,3,0,216,28,3,0,184,28,3,0,176,28,3,0,160,28,3,0,152,28,3,0,64,28,3,0,40,28,3,0,16,28,3,0,216,27,3,0,208,27,3,0,200,27,3,0,192,27,3,0,184,27,3,0,168,27,3,0,160,27,3,0,144,27,3,0,64,27,3,0,48,27,3,0,240,26,3,0,232,26,3,0,224,26,3,0,216,26,3,0,208,26,3,0,184,26,3,0,176,26,3,0,160,26,3,0,80,26,3,0,64,26,3,0,48,26,3,0,208,25,3,0,200,25,3,0,192,25,3,0,136,25,3,0,112,25,3,0,88,25,3,0,80,25,3,0,32,25,3,0,16,25,3,0,248,24,3,0,224,24,3,0,216,24,3,0,208,24,3,0,200,24,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,254,1,0,3,0,0,0,32,50,1,0,0,0,0,0,232,49,1,0,1,0,0,0,184,208,2,0,2,0,0,0,0,224,1,0,4,0,0,0,192,218,1,0,5,0,0,0,152,208,2,0,9,0,0,0,144,195,1,0,10,0,0,0,80,195,1,0,10,0,0,0,72,208,2,0,11,0,0,0,56,208,2,0,12,0,0,0,24,208,2,0,12,0,0,0,232,247,1,0,13,0,0,0,80,248,1,0,14,0,0,0,48,246,1,0,15,0,0,0,224,245,1,0,15,0,0,0,144,245,1,0,16,0,0,0,40,245,1,0,16,0,0,0,192,253,1,0,39,0,0,0,248,207,2,0,17,0,0,0,224,207,2,0,18,0,0,0,200,207,2,0,19,0,0,0,16,24,2,0,21,0,0,0,112,207,2,0,20,0,0,0,200,210,2,0,22,0,0,0,176,210,2,0,23,0,0,0,80,207,2,0,24,0,0,0,96,244,1,0,30,0,0,0,48,207,2,0,25,0,0,0,32,207,2,0,26,0,0,0,96,211,2,0,27,0,0,0,24,211,2,0,28,0,0,0,192,229,1,0,29,0,0,0,224,252,1,0,7,0,0,0,24,253,1,0,8,0,0,0,200,251,1,0,37,0,0,0,72,251,1,0,38,0,0,0,56,117,1,0,31,0,0,0,240,206,2,0,32,0,0,0,224,206,2,0,33,0,0,0,152,206,2,0,34,0,0,0,72,206,2,0,35,0,0,0,48,206,2,0,36,0,0,0,232,205,2,0,40,0,0,0,200,205,2,0,41,0,0,0,136,82,3,0,42,0,0,0,184,205,2,0,43,0,0,0,0,0,0,0,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,101,108,118,101,116,105,99,97,44,49,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,76,101,118,101,108,49,32,83,117,112,112,114,101,115,115,80,68,70,77,97,114,107,32,111,114,32,10,123,125,32,123,10,47,83,68,105,99,116,32,49,48,32,100,105,99,116,32,100,101,102,10,115,121,115,116,101,109,100,105,99,116,32,47,112,100,102,109,97,114,107,32,107,110,111,119,110,32,110,111,116,32,123,10,32,32,117,115,101,114,100,105,99,116,32,47,112,100,102,109,97,114,107,32,115,121,115,116,101,109,100,105,99,116,32,47,99,108,101,97,114,116,111,109,97,114,107,32,103,101,116,32,112,117,116,10,125,32,105,102,10,83,68,105,99,116,32,98,101,103,105,110,32,91,10,32,32,47,84,105,116,108,101,32,40,37,115,41,10,32,32,47,83,117,98,106,101,99,116,32,40,103,110,117,112,108,111,116,32,112,108,111,116,41,10,32,32,47,67,114,101,97,116,111,114,32,40,103,110,117,112,108,111,116,32,37,115,32,112,97,116,99,104,108,101,118,101,108,32,37,115,41,10,32,32,47,65,117,116,104,111,114,32,40,37,115,41,10,37,37,32,32,47,80,114,111,100,117,99,101,114,32,40,103,110,117,112,108,111,116,41,10,37,37,32,32,47,75,101,121,119,111,114,100,115,32,40,41,10,32,32,47,67,114,101,97,116,105,111,110,68,97,116,101,32,40,37,115,41,10,32,32,47,68,79,67,73,78,70,79,32,112,100,102,109,97,114,107,10,101,110,100,10,125,32,105,102,101,108,115,101,10,0,0,0,37,37,37,37,69,110,100,67,111,109,109,101,110,116,115,10,37,37,37,37,66,101,103,105,110,80,114,111,108,111,103,10,47,103,110,117,100,105,99,116,32,50,53,54,32,100,105,99,116,32,100,101,102,10,103,110,117,100,105,99,116,32,98,101,103,105,110,10,37,37,10,37,37,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,116,114,117,101,47,102,97,108,115,101,32,102,108,97,103,115,32,109,97,121,32,98,101,32,101,100,105,116,101,100,32,98,121,32,104,97,110,100,32,105,102,32,100,101,115,105,114,101,100,46,10,37,37,32,84,104,101,32,117,110,105,116,32,108,105,110,101,32,119,105,100,116,104,32,97,110,100,32,103,114,97,121,115,99,97,108,101,32,105,109,97,103,101,32,103,97,109,109,97,32,99,111,114,114,101,99,116,105,111,110,32,109,97,121,32,97,108,115,111,32,98,101,32,99,104,97,110,103,101,100,46,10,37,37,10,47,67,111,108,111,114,32,37,115,32,100,101,102,10,47,66,108,97,99,107,116,101,120,116,32,37,115,32,100,101,102,10,47,83,111,108,105,100,32,37,115,32,100,101,102,10,47,68,97,115,104,108,101,110,103,116,104,32,37,103,32,100,101,102,10,47,76,97,110,100,115,99,97,112,101,32,37,115,32,100,101,102,10,47,76,101,118,101,108,49,32,37,115,32,100,101,102,10,47,82,111,117,110,100,101,100,32,37,115,32,100,101,102,10,47,67,108,105,112,84,111,66,111,117,110,100,105,110,103,66,111,120,32,37,115,32,100,101,102,10,47,83,117,112,112,114,101,115,115,80,68,70,77,97,114,107,32,102,97,108,115,101,32,100,101,102,10,47,84,114,97,110,115,112,97,114,101,110,116,80,97,116,116,101,114,110,115,32,102,97,108,115,101,32,100,101,102,10,47,103,110,117,108,105,110,101,119,105,100,116,104,32,37,46,51,102,32,100,101,102,10,47,117,115,101,114,108,105,110,101,119,105,100,116,104,32,103,110,117,108,105,110,101,119,105,100,116,104,32,100,101,102,10,47,71,97,109,109,97,32,49,46,48,32,100,101,102,10,47,66,97,99,107,103,114,111,117,110,100,67,111,108,111,114,32,123,37,46,51,102,32,37,46,51,102,32,37,46,51,102,125,32,100,101,102,10,37,37,10,47,118,115,104,105,102,116,32,37,100,32,100,101,102,10,47,100,108,49,32,123,10,32,32,37,46,49,102,32,68,97,115,104,108,101,110,103,116,104,32,109,117,108,32,109,117,108,10,32,32,82,111,117,110,100,101,100,32,123,32,99,117,114,114,101,110,116,108,105,110,101,119,105,100,116,104,32,48,46,55,53,32,109,117,108,32,115,117,98,32,100,117,112,32,48,32,108,101,32,123,32,112,111,112,32,48,46,48,49,32,125,32,105,102,32,125,32,105,102,10,125,32,100,101,102,10,47,100,108,50,32,123,10,32,32,37,46,49,102,32,68,97,115,104,108,101,110,103,116,104,32,109,117,108,32,109,117,108,10,32,32,82,111,117,110,100,101,100,32,123,32,99,117,114,114,101,110,116,108,105,110,101,119,105,100,116,104,32,48,46,55,53,32,109,117,108,32,97,100,100,32,125,32,105,102,10,125,32,100,101,102,10,47,104,112,116,95,32,37,46,49,102,32,100,101,102,10,47,118,112,116,95,32,37,46,49,102,32,100,101,102,10,47,104,112,116,32,104,112,116,95,32,100,101,102,10,47,118,112,116,32,118,112,116,95,32,100,101,102,10,0,0,0,0,0,0,37,37,37,37,67,114,101,97,116,111,114,58,32,103,110,117,112,108,111,116,32,37,115,32,112,97,116,99,104,108,101,118,101,108,32,37,115,10,37,37,37,37,67,114,101,97,116,105,111,110,68,97,116,101,58,32,37,115,10,37,37,37,37,68,111,99,117,109,101,110,116,70,111,110,116,115,58,32,37,115,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,104,153,1,0,40,153,1,0,224,152,1,0,200,152,1,0,184,152,1,0,112,152,1,0,88,152,1,0,64,152,1,0,48,152,1,0,24,152,1,0,112,151,1,0,232,150,1,0,0,0,0,0,0,0,0,0,224,148,1,0,192,148,1,0,176,148,1,0,160,148,1,0,144,148,1,0,40,148,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,49,1,0,112,51,1,0,64,179,2,0,21,177,0,0,148,132,0,0,32,50,1,0,128,51,1,0,56,179,2,0,148,132,0,0,21,177,0,0,40,139,3,0,0,0,0,0,64,178,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,195,1,0,0,0,0,0,144,195,1,0,1,0,0,0,80,195,1,0,1,0,0,0,40,195,1,0,2,0,0,0,80,248,1,0,3,0,0,0,232,194,1,0,4,0,0,0,184,194,1,0,5,0,0,0,96,194,1,0,6,0,0,0,24,194,1,0,7,0,0,0,80,193,1,0,11,0,0,0,232,192,1,0,8,0,0,0,144,192,1,0,9,0,0,0,88,192,1,0,10,0,0,0,0,192,1,0,14,0,0,0,208,191,1,0,15,0,0,0,152,191,1,0,16,0,0,0,104,191,1,0,12,0,0,0,0,0,0,0,17,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,254,255,255,255,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,152,208,2,0,0,0,0,0,144,195,1,0,1,0,0,0,80,195,1,0,1,0,0,0,48,195,2,0,2,0,0,0,24,195,2,0,3,0,0,0,224,194,2,0,4,0,0,0,216,194,2,0,4,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,192,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,63,5,0,0,0,6,0,0,0,5,0,0,0,6,0,0,0,1,0,0,0,0,0,192,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,63,15,0,0,0,10,0,0,0,15,0,0,0,10,0,0,0,0,0,0,0,0,0,192,63,10,0,0,0,15,0,0,0,10,0,0,0,15,0,0,0,0,0,0,0,0,0,192,63,20,0,0,0,10,0,0,0,5,0,0,0,10,0,0,0,0,0,0,0,0,0,192,63,10,0,0,0,6,0,0,0,10,0,0,0,6,0,0,0,0,0,0,0,0,0,192,63,15,0,0,0,6,0,0,0,5,0,0,0,10,0,0,0,0,0,0,0,0,0,192,63,10,0,0,0,6,0,0,0,10,0,0,0,10,0,0,0,0,0,0,0,0,0,192,63,5,0,0,0,6,0,0,0,5,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,1,0,0,0,3,0,0,0,1,0,0,0,4,0,0,0,2,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,3,0,0,0,1,0,0,0,3,0,0,0,2,0,0,0,3,0,0,0,4,0,0,0,4,0,0,0,1,0,0,0,4,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,160,150,1,0,152,190,2,0,152,150,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,112,130,1,0,208,129,1,0,184,105,1,0,80,105,1,0,240,104,1,0,176,104,1,0,56,104,1,0,0,129,1,0,8,104,1,0,216,103,1,0,88,103,1,0,208,102,1,0,144,102,1,0,104,102,1,0,0,102,1,0,0,0,0,0,176,97,1,0,0,0,0,0,160,97,1,0,1,0,0,0,48,254,1,0,2,0,0,0,120,97,1,0,3,0,0,0,88,97,1,0,4,0,0,0,56,97,1,0,5,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,205,204,204,62,0,0,0,0,205,204,204,62,0,0,160,64,205,204,76,63,0,0,0,0,0,0,128,63,0,0,160,64,154,153,153,63,0,0,0,0,0,0,128,63,0,0,32,65,10,0,0,0,0,0,0,0,100,111,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,4,0,0,0,0,0,0,0,0,3,8,0,0,0,0,0,0,0,0,8,8,0,0,0,0,0,0,0,0,16,6,3,6,0,0,0,0,0,0,16,6,8,6,0,0,0,0,0,0,16,4,1,4,8,4,1,4,0,0,16,4,1,8,1,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,9,0,0,0,0,0,0,228,12,0,0,0,0,0,0,36,9,0,0,0,0,0,0,228,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,50,1,0,0,0,0,0,232,49,1,0,1,0,0,0,0,0,0,0,2,0,0,0,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,246,255,255,255,0,0,0,0,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,246,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,112,181,2,0,88,181,2,0,72,181,2,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,246,255,255,255,0,0,0,0,112,249,1,0,0,0,0,0,208,250,1,0,1,0,0,0,40,250,1,0,1,0,0,0,144,175,2,0,2,0,0,0,136,175,2,0,3,0,0,0,112,175,2,0,4,0,0,0,56,86,3,0,5,0,0,0,80,175,2,0,6,0,0,0,216,174,2,0,7,0,0,0,0,0,0,0,8,0,0,0,6,0,0,0,0,0,0,0,152,190,2,0,200,181,2,0,200,181,2,0,200,181,2,0,200,181,2,0,200,181,2,0,200,181,2,0,200,181,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]) -.concat([136,193,2,0,128,193,2,0,21,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,0,0,0,0,0,0,0,0,52,16,0,0,0,0,0,0,120,193,2,0,40,193,2,0,21,1,0,0,0,0,0,0,0,0,0,0,0,0,34,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,0,0,0,0,0,0,0,208,192,2,0,144,192,2,0,21,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,0,0,0,0,0,0,0,0,5,16,0,0,0,0,0,0,40,192,2,0,8,192,2,0,108,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,0,0,0,0,0,0,0,0,45,16,0,0,0,0,0,0,216,191,2,0,200,191,2,0,21,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,0,0,0,0,0,0,0,0,72,16,0,0,0,0,0,0,128,191,2,0,120,191,2,0,21,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,0,0,0,0,0,0,0,0,218,64,0,0,0,0,0,0,104,191,2,0,176,98,1,0,21,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,0,0,0,0,0,0,0,0,3,16,0,0,0,0,0,0,40,191,2,0,16,191,2,0,21,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,0,0,0,0,0,0,0,0,101,16,0,0,0,0,0,0,200,190,2,0,136,190,2,0,21,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,0,0,0,0,0,0,0,0,6,16,0,0,0,0,0,0,104,190,2,0,80,190,2,0,21,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,0,0,0,0,0,0,0,0,17,16,0,0,0,0,0,0,64,190,2,0,32,190,2,0,21,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,0,0,0,0,1,0,0,0,10,17,0,0,0,0,0,0,8,190,2,0,248,189,2,0,21,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,0,0,0,0,0,0,0,0,5,66,0,0,0,0,0,0,216,189,2,0,200,189,2,0,21,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,4,0,0,0,3,0,0,0,44,16,0,0,0,0,0,0,144,189,2,0,24,189,2,0,21,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,1,0,0,0,0,0,0,0,20,16,0,0,0,0,0,0,248,188,2,0,208,188,2,0,21,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,0,0,0,0,0,0,0,0,201,16,0,0,0,0,0,0,168,188,2,0,144,188,2,0,109,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,0,0,0,0,0,0,0,0,46,65,0,0,0,0,0,0,128,188,2,0,96,188,2,0,108,72,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,1,0,0,0,0,0,0,0,170,122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,152,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,1,0,0,0,7,0,0,0,1,0,0,0,4,0,0,0,5,0,0,0,6,0,0,0,8,0,0,0,9,0,0,0,10,0,0,0,7,0,0,0,2,0,0,0,0,0,0,0,32,32,114,117,108,101,114,58,32,91,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,84,2,0,152,190,2,0,152,190,2,0,24,84,2,0,8,84,2,0,248,83,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,73,84,95,76,79,71,0,176,4,0,0,0,0,0,0,176,4,0,0,0,0,0,0,51,46,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,231,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,160,2,0,3,0,0,0,144,195,1,0,1,0,0,0,80,195,1,0,1,0,0,0,80,248,1,0,15,0,0,0,24,160,2,0,12,0,0,0,192,229,1,0,9,0,0,0,240,159,2,0,10,0,0,0,96,255,1,0,4,0,0,0,232,49,1,0,7,0,0,0,200,159,2,0,5,0,0,0,232,195,1,0,0,0,0,0,184,159,2,0,13,0,0,0,152,159,2,0,6,0,0,0,120,97,1,0,8,0,0,0,144,159,2,0,2,0,0,0,232,247,1,0,14,0,0,0,144,245,1,0,11,0,0,0,112,159,2,0,11,0,0,0,24,159,2,0,18,0,0,0,240,158,2,0,16,0,0,0,192,158,2,0,19,0,0,0,176,158,2,0,17,0,0,0,144,158,2,0,20,0,0,0,0,0,0,0,21,0,0,0,4,0,0,0,2,0,0,0,1,0,0,0,5,0,0,0,3,0,0,0,6,0,0,0,0,0,0,0,26,0,0,0,11,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,104,134,1,0,0,0,0,0,176,132,1,0,1,0,0,0,8,131,1,0,2,0,0,0,88,128,1,0,3,0,0,0,0,126,1,0,4,0,0,0,152,123,1,0,5,0,0,0,112,121,1,0,6,0,0,0,208,119,1,0,7,0,0,0,0,118,1,0,8,0,0,0,24,116,1,0,9,0,0,0,80,114,1,0,10,0,0,0,152,111,1,0,11,0,0,0,48,109,1,0,12,0,0,0,232,105,1,0,13,0,0,0,176,102,1,0,14,0,0,0,16,100,1,0,15,0,0,0,216,97,1,0,16,0,0,0,224,95,1,0,17,0,0,0,16,93,1,0,18,0,0,0,32,91,1,0,19,0,0,0,232,88,1,0,20,0,0,0,224,83,1,0,21,0,0,0,200,79,1,0,22,0,0,0,240,74,1,0,23,0,0,0,200,72,1,0,24,0,0,0,128,69,1,0,25,0,0,0,240,65,1,0,26,0,0,0,192,59,1,0,27,0,0,0,216,54,1,0,28,0,0,0,0,52,1,0,29,0,0,0,216,49,1,0,30,0,0,0,8,48,1,0,31,0,0,0,224,45,1,0,32,0,0,0,128,43,1,0,33,0,0,0,56,41,1,0,34,0,0,0,0,0,0,0,255,255,255,255,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,3,0,200,23,3,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,78,1,0,0,138,1,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,112,19,3,0,64,19,3,0,0,19,3,0,192,18,3,0,112,18,3,0,16,18,3,0,192,17,3,0,112,17,3,0,208,16,3,0,104,16,3,0,8,16,3,0,232,15,3,0,216,15,3,0,128,15,3,0,248,14,3,0,160,14,3,0,96,14,3,0,56,14,3,0,136,13,3,0,88,13,3,0,224,12,3,0,120,12,3,0,0,12,3,0,184,11,3,0,128,11,3,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,255,0,255,0,255,0,0,0,128,0,128,0,0,0,0,128,128,0,0,0,0,0,128,128,128,0,0,128,64,0,128,128,0,0,128,0,128,0,192,192,192,0,0,255,255,0,255,255,0,0,0,0,0,0,5,0,0,0,8,0,0,0,5,0,0,0,8,0,0,0,5,0,0,0,8,0,0,0,5,0,0,0,8,0,0,0,4,0,0,0,2,0,0,0,4,0,0,0,2,0,0,0,4,0,0,0,2,0,0,0,4,0,0,0,2,0,0,0,4,0,0,0,8,0,0,0,4,0,0,0,2,0,0,0,4,0,0,0,8,0,0,0,4,0,0,0,2,0,0,0,4,0,0,0,9,0,0,0,4,0,0,0,2,0,0,0,4,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,136,130,1,0,112,130,1,0,48,130,1,0,208,129,1,0,0,129,1,0,200,128,1,0,72,128,1,0,48,128,1,0,32,128,1,0,200,127,1,0,160,127,1,0,120,127,1,0,64,127,1,0,16,127,1,0,176,126,1,0,40,126,1,0,216,125,1,0,168,125,1,0,72,128,1,0,48,128,1,0,200,127,1,0,160,127,1,0,0,0,0,0,0,0,0,0,120,125,1,0,48,125,1,0,248,124,1,0,200,124,1,0,152,124,1,0,104,124,1,0,72,128,1,0,200,127,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,160,119,1,0,128,119,1,0,88,119,1,0,160,119,1,0,64,119,1,0,0,0,0,0,0,0,0,0,0,0,0,0,160,119,1,0,128,119,1,0,88,119,1,0,16,119,1,0,240,118,1,0,208,118,1,0,120,118,1,0,0,0,0,0,160,119,1,0,128,119,1,0,88,119,1,0,88,119,1,0,88,119,1,0,88,119,1,0,88,119,1,0,88,119,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,10,84,65,66,76,69,10,32,32,50,10,76,84,89,80,69,10,32,55,48,10,32,32,32,32,37,100,10,48,10,76,84,89,80,69,10,32,32,50,10,67,79,78,84,73,78,85,79,85,83,10,32,55,48,10,32,32,32,32,54,52,10,32,32,51,10,83,111,108,105,100,32,108,105,110,101,10,32,55,50,10,32,32,32,32,54,53,10,32,55,51,10,32,32,32,32,32,32,48,10,32,52,48,10,48,46,48,10,32,32,48,10,76,84,89,80,69,10,32,32,50,10,68,65,83,72,69,68,10,32,55,48,10,32,32,32,32,54,52,10,32,32,51,10,95,95,32,95,95,32,95,95,32,95,95,32,95,95,32,95,95,32,95,95,32,95,95,32,95,95,32,95,95,32,95,95,32,95,95,32,95,95,32,95,95,32,95,95,10,32,55,50,10,32,32,32,32,54,53,10,32,55,51,10,32,32,32,32,32,50,10,32,52,48,10,48,46,55,53,10,32,52,57,10,48,46,53,10,32,52,57,10,45,48,46,50,53,10,32,32,48,10,76,84,89,80,69,10,32,32,50,10,72,73,68,68,69,78,10,32,55,48,10,32,32,32,32,54,52,10,32,32,51,10,95,32,95,32,95,32,95,32,95,32,95,32,95,32,95,32,95,32,95,32,95,32,95,32,95,32,95,32,95,32,95,32,95,32,95,32,95,32,95,32,95,32,95,32,95,10,32,55,50,10,32,32,32,32,54,53,10,32,55,51,10,32,32,32,32,32,50,10,32,52,48,10,48,46,51,55,53,10,32,52,57,10,48,46,50,53,10,32,52,57,10,45,48,46,49,50,53,10,32,32,48,10,76,84,89,80,69,10,32,32,50,10,67,69,78,84,69,82,10,32,55,48,10,32,32,32,32,54,52,10,32,32,51,10,95,95,95,95,32,95,32,95,95,95,95,32,95,32,95,95,95,95,32,95,32,95,95,95,95,32,95,32,95,95,95,95,32,95,32,95,95,95,95,32,95,32,95,95,95,95,10,32,55,50,10,32,32,32,32,54,53,10,32,55,51,10,32,32,32,32,32,52,10,32,52,48,10,50,46,48,10,32,52,57,10,49,46,50,53,10,32,52,57,10,45,48,46,50,53,10,32,52,57,10,48,46,50,53,10,32,52,57,10,45,48,46,50,53,10,32,32,48,10,76,84,89,80,69,10,32,32,50,10,80,72,65,78,84,79,77,10,32,55,48,10,32,32,32,32,54,52,10,32,32,51,10,95,95,95,95,95,32,95,32,95,32,95,95,95,95,95,32,95,32,95,32,95,95,95,95,95,32,95,32,95,32,95,95,95,95,95,32,95,32,95,32,95,95,95,95,10,32,55,50,10,32,32,32,32,54,53,10,32,55,51,10,32,32,32,32,32,54,10,32,52,48,10,50,46,53,10,32,52,57,10,49,46,50,53,10,32,52,57,10,45,48,46,50,53,10,32,52,57,10,48,46,50,53,10,32,52,57,10,45,48,46,50,53,10,32,52,57,10,48,46,50,53,10,32,52,57,10,45,48,46,50,53,10,32,32,48,10,76,84,89,80,69,10,32,32,50,10,68,79,84,10,32,55,48,10,32,32,32,32,54,52,10,32,32,51,10,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,10,32,55,50,10,32,32,32,32,54,53,10,32,55,51,10,32,32,32,32,32,50,10,32,52,48,10,48,46,50,53,10,32,52,57,10,48,46,48,10,32,52,57,10,45,48,46,50,53,10,32,32,48,10,76,84,89,80,69,10,32,32,50,10,68,65,83,72,68,79,84,10,32,55,48,10,32,32,32,32,54,52,10,32,32,51,10,95,95,32,46,32,95,95,32,46,32,95,95,32,46,32,95,95,32,46,32,95,95,32,46,32,95,95,32,46,32,95,95,32,46,32,95,95,32,46,32,95,95,32,46,32,95,95,10,32,55,50,10,32,32,32,32,54,53,10,32,55,51,10,32,32,32,32,32,52,10,32,52,48,10,49,46,48,10,32,52,57,10,48,46,53,10,32,52,57,10,45,48,46,50,53,10,32,52,57,10,48,46,48,10,32,52,57,10,45,48,46,50,53,10,32,32,48,10,69,78,68,84,65,66,10,0,0,0,0,0,0,0,57,57,57,10,37,37,32,71,78,85,80,76,79,84,58,32,100,120,102,32,102,105,108,101,32,102,111,114,32,65,117,116,111,67,97,100,10,32,32,48,10,83,69,67,84,73,79,78,10,32,32,50,10,72,69,65,68,69,82,10,32,32,57,10,36,69,88,84,77,73,78,10,32,49,48,10,48,46,48,48,48,10,32,50,48,10,48,46,48,48,48,10,32,32,57,10,36,69,88,84,77,65,88,10,32,49,48,10,37,45,54,46,51,102,10,32,50,48,10,37,45,54,46,51,102,10,32,32,57,10,36,76,73,77,77,73,78,10,32,49,48,10,48,46,48,48,48,10,32,50,48,10,48,46,48,48,48,10,32,32,57,10,36,76,73,77,77,65,88,10,32,49,48,10,37,45,54,46,51,102,10,32,50,48,10,37,45,54,46,51,102,10,32,32,57,10,36,84,69,88,84,83,84,89,76,69,10,32,32,55,10,37,115,10,32,32,57,10,36,84,69,88,84,83,73,90,69,10,32,52,48,10,37,45,54,46,51,102,10,32,32,57,10,36,80,76,73,78,69,87,73,68,10,32,52,48,10,37,45,54,46,52,102,10,32,32,57,10,36,76,84,83,67,65,76,69,10,32,32,52,48,10,37,45,54,46,51,102,10,32,32,57,10,36,67,79,79,82,68,83,10,32,55,48,10,32,32,49,10,32,32,57,10,36,67,69,76,84,89,80,69,10,32,54,10,66,89,76,65,89,69,82,10,32,32,57,10,36,67,76,65,89,69,82,10,32,32,56,10,48,10,32,32,57,10,36,67,69,67,79,76,79,82,10,32,54,50,10,32,32,32,37,115,10,32,32,57,10,36,77,69,78,85,10,32,32,49,10,97,99,97,100,10,32,32,48,10,69,78,68,83,69,67,10,32,32,48,10,83,69,67,84,73,79,78,10,32,32,50,10,84,65,66,76,69,83,10,0,0,0,0,0,208,149,2,0,0,0,0,0,200,149,2,0,1,0,0,0,0,224,1,0,2,0,0,0,184,149,2,0,3,0,0,0,192,253,1,0,4,0,0,0,0,0,0,0,5,0,0,0,42,35,36,37,64,38,61,0,0,0,0,0,0,0,0,0,200,172,3,0,0,0,0,0,255,255,255,255,255,255,15,0,255,0,255,0,255,15,240,0,255,127,240,0,7,7,7,7,255,7,255,7,255,7,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,136,208,2,0,0,0,0,0,112,249,1,0,1,0,0,0,248,142,2,0,2,0,0,0,224,142,2,0,2,0,0,0,0,0,0,0,3,0,0,0,49,46,48,0,0,0,0,0,50,48,49,49,45,49,49,45,48,53,0,0,0,0,0,0,99,101,110,116,101,114,0,0,0,0,108,101,102,116,0,0,0,0,0,0,114,105,103,104,116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,64,0,0,0,0,0,0,8,64,1,0,0,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,0,0,0,0,0,0,20,64,0,0,0,0,0,0,8,64,1,0,0,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,48,254,1,0,0,0,0,0,192,253,1,0,1,0,0,0,88,253,1,0,2,0,0,0,24,253,1,0,3,0,0,0,224,252,1,0,4,0,0,0,144,252,1,0,5,0,0,0,0,252,1,0,6,0,0,0,200,251,1,0,7,0,0,0,72,251,1,0,8,0,0,0,208,250,1,0,9,0,0,0,40,250,1,0,9,0,0,0,112,249,1,0,10,0,0,0,80,248,1,0,11,0,0,0,232,247,1,0,12,0,0,0,128,247,1,0,13,0,0,0,48,26,2,0,14,0,0,0,8,247,1,0,15,0,0,0,16,24,2,0,16,0,0,0,96,3,2,0,17,0,0,0,152,246,1,0,18,0,0,0,48,246,1,0,19,0,0,0,224,245,1,0,19,0,0,0,144,245,1,0,20,0,0,0,40,245,1,0,20,0,0,0,96,244,1,0,21,0,0,0,216,243,1,0,21,0,0,0,128,243,1,0,22,0,0,0,248,242,1,0,23,0,0,0,104,242,1,0,22,0,0,0,8,242,1,0,22,0,0,0,184,241,1,0,23,0,0,0,240,240,1,0,24,0,0,0,120,240,1,0,25,0,0,0,192,229,1,0,27,0,0,0,232,239,1,0,26,0,0,0,0,0,0,0,28,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,253,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,50,1,0,0,0,0,0,24,135,2,0,1,0,0,0,224,155,2,0,2,0,0,0,0,135,2,0,11,0,0,0,232,134,2,0,11,0,0,0,152,208,2,0,3,0,0,0,144,195,1,0,4,0,0,0,80,195,1,0,4,0,0,0,56,117,1,0,5,0,0,0,200,134,2,0,6,0,0,0,80,248,1,0,7,0,0,0,40,195,1,0,8,0,0,0,184,134,2,0,9,0,0,0,40,245,1,0,9,0,0,0,176,134,2,0,10,0,0,0,136,82,3,0,12,0,0,0,0,0,0,0,13,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,16,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,5,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,1,0,0,0,3,0,0,0,1,0,0,0,4,0,0,0,1,0,0,0,5,0,0,0,1,0,0,0,6,0,0,0,1,0,0,0,7,0,0,0,1,0,0,0,8,0,0,0,1,0,0,0,9,0,0,0,1,0,0,0,10,0,0,0,1,0,0,0,13,0,0,0,2,0,0,0,1,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,3,0,0,0,2,0,0,0,4,0,0,0,2,0,0,0,5,0,0,0,2,0,0,0,6,0,0,0,4,0,0,0,1,0,0,0,4,0,0,0,3,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,7,0,0,0,4,0,0,0,11,0,0,0,4,0,0,0,12,0,0,0,4,0,0,0,15,0,0,0,4,0,0,0,16,0,0,0,4,0,0,0,17,0,0,0,4,0,0,0,18,0,0,0,4,0,0,0,19,0,0,0,5,0,0,0,2,0,0,0,5,0,0,0,3,0,0,0,5,0,0,0,4,0,0,0,5,0,0,0,6,0,0,0,5,0,0,0,7,0,0,0,5,0,0,0,8,0,0,0,5,0,0,0,10,0,0,0,5,0,0,0,14,0,0,0,5,0,0,0,15,0,0,0,5,0,0,0,16,0,0,0,5,0,0,0,18,0,0,0,5,0,0,0,22,0,0,0,5,0,0,0,23,0,0,0,5,0,0,0,24,0,0,0,5,0,0,0,27,0,0,0,5,0,0,0,28,0,0,0,5,0,0,0,29,0,0,0,5,0,0,0,30,0,0,0,5,0,0,0,34,0,0,0,6,0,0,0,1,0,0,0,7,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,5,0,0,0,0,0,0,0,4,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,8,0,0,0,5,0,0,0,8,0,0,0,5,0,0,0,8,0,0,0,5,0,0,0,8,0,0,0,5,0,0,0,3,0,0,0,5,0,0,0,3,0,0,0,5,0,0,0,3,0,0,0,5,0,0,0,3,0,0,0,4,0,0,0,1,0,0,0,4,0,0,0,1,0,0,0,4,0,0,0,1,0,0,0,4,0,0,0,1,0,0,0,4,0,0,0,8,0,0,0,4,0,0,0,1,0,0,0,4,0,0,0,8,0,0,0,4,0,0,0,1,0,0,0,4,0,0,0,9,0,0,0,4,0,0,0,1,0,0,0,4,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,10,0,0,0,4,0,0,0,1,0,0,0,4,0,0,0,1,0,0,0,4,0,0,0,1,0,0,0,4,0,0,0,10,0,0,0,4,0,0,0,10,0,0,0,4,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,10,0,0,0,4,0,0,0,10,0,0,0,4,0,0,0,1,0,0,0,4,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,192,229,1,0,1,0,0,0,128,91,2,0,2,0,0,0,64,85,3,0,3,0,0,0,192,253,1,0,0,0,0,0,152,10,2,0,4,0,0,0,136,85,3,0,7,0,0,0,168,85,3,0,7,0,0,0,120,91,2,0,8,0,0,0,0,224,1,0,9,0,0,0,192,218,1,0,10,0,0,0,40,245,1,0,6,0,0,0,144,245,1,0,6,0,0,0,72,91,2,0,5,0,0,0,96,244,1,0,11,0,0,0,176,1,2,0,12,0,0,0,152,82,3,0,13,0,0,0,48,246,1,0,14,0,0,0,224,245,1,0,14,0,0,0,176,82,3,0,15,0,0,0,16,24,2,0,16,0,0,0,136,82,3,0,17,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,56,128,2,0,8,128,2,0,224,127,2,0,184,127,2,0,40,127,2,0,216,126,2,0,144,126,2,0,120,126,2,0,80,126,2,0,208,125,2,0,168,125,2,0,112,125,2,0,88,125,2,0,16,125,2,0,248,124,2,0,224,124,2,0,192,124,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]) -, "i8", ALLOC_NONE, Runtime.GLOBAL_BASE) -function runPostSets() { -} -if (!awaitingMemoryInitializer) runPostSets(); -var tempDoublePtr = Runtime.alignMemory(allocate(12, "i8", ALLOC_STATIC), 8); -assert(tempDoublePtr % 8 == 0); -function copyTempFloat(ptr) { // functions, because inlining this code increases code size too much - HEAP8[tempDoublePtr] = HEAP8[ptr]; - HEAP8[tempDoublePtr+1] = HEAP8[ptr+1]; - HEAP8[tempDoublePtr+2] = HEAP8[ptr+2]; - HEAP8[tempDoublePtr+3] = HEAP8[ptr+3]; -} -function copyTempDouble(ptr) { - HEAP8[tempDoublePtr] = HEAP8[ptr]; - HEAP8[tempDoublePtr+1] = HEAP8[ptr+1]; - HEAP8[tempDoublePtr+2] = HEAP8[ptr+2]; - HEAP8[tempDoublePtr+3] = HEAP8[ptr+3]; - HEAP8[tempDoublePtr+4] = HEAP8[ptr+4]; - HEAP8[tempDoublePtr+5] = HEAP8[ptr+5]; - HEAP8[tempDoublePtr+6] = HEAP8[ptr+6]; - HEAP8[tempDoublePtr+7] = HEAP8[ptr+7]; -} - var _log=Math.log; - var _fabs=Math.abs; - var ERRNO_CODES={EPERM:1,ENOENT:2,ESRCH:3,EINTR:4,EIO:5,ENXIO:6,E2BIG:7,ENOEXEC:8,EBADF:9,ECHILD:10,EAGAIN:11,EWOULDBLOCK:11,ENOMEM:12,EACCES:13,EFAULT:14,ENOTBLK:15,EBUSY:16,EEXIST:17,EXDEV:18,ENODEV:19,ENOTDIR:20,EISDIR:21,EINVAL:22,ENFILE:23,EMFILE:24,ENOTTY:25,ETXTBSY:26,EFBIG:27,ENOSPC:28,ESPIPE:29,EROFS:30,EMLINK:31,EPIPE:32,EDOM:33,ERANGE:34,ENOMSG:35,EIDRM:36,ECHRNG:37,EL2NSYNC:38,EL3HLT:39,EL3RST:40,ELNRNG:41,EUNATCH:42,ENOCSI:43,EL2HLT:44,EDEADLK:45,ENOLCK:46,EBADE:50,EBADR:51,EXFULL:52,ENOANO:53,EBADRQC:54,EBADSLT:55,EDEADLOCK:56,EBFONT:57,ENOSTR:60,ENODATA:61,ETIME:62,ENOSR:63,ENONET:64,ENOPKG:65,EREMOTE:66,ENOLINK:67,EADV:68,ESRMNT:69,ECOMM:70,EPROTO:71,EMULTIHOP:74,ELBIN:75,EDOTDOT:76,EBADMSG:77,EFTYPE:79,ENOTUNIQ:80,EBADFD:81,EREMCHG:82,ELIBACC:83,ELIBBAD:84,ELIBSCN:85,ELIBMAX:86,ELIBEXEC:87,ENOSYS:88,ENMFILE:89,ENOTEMPTY:90,ENAMETOOLONG:91,ELOOP:92,EOPNOTSUPP:95,EPFNOSUPPORT:96,ECONNRESET:104,ENOBUFS:105,EAFNOSUPPORT:106,EPROTOTYPE:107,ENOTSOCK:108,ENOPROTOOPT:109,ESHUTDOWN:110,ECONNREFUSED:111,EADDRINUSE:112,ECONNABORTED:113,ENETUNREACH:114,ENETDOWN:115,ETIMEDOUT:116,EHOSTDOWN:117,EHOSTUNREACH:118,EINPROGRESS:119,EALREADY:120,EDESTADDRREQ:121,EMSGSIZE:122,EPROTONOSUPPORT:123,ESOCKTNOSUPPORT:124,EADDRNOTAVAIL:125,ENETRESET:126,EISCONN:127,ENOTCONN:128,ETOOMANYREFS:129,EPROCLIM:130,EUSERS:131,EDQUOT:132,ESTALE:133,ENOTSUP:134,ENOMEDIUM:135,ENOSHARE:136,ECASECLASH:137,EILSEQ:138,EOVERFLOW:139,ECANCELED:140,ENOTRECOVERABLE:141,EOWNERDEAD:142,ESTRPIPE:143}; - var ___errno_state=0;function ___setErrNo(value) { - // For convenient setting and returning of errno. - HEAP32[((___errno_state)>>2)]=value - return value; - } - var _stdin=allocate(1, "i32*", ALLOC_STATIC); - var _stdout=allocate(1, "i32*", ALLOC_STATIC); - var _stderr=allocate(1, "i32*", ALLOC_STATIC); - var __impure_ptr=allocate(1, "i32*", ALLOC_STATIC);var FS={currentPath:"/",nextInode:2,streams:[null],ignorePermissions:true,createFileHandle:function (stream, fd) { - if (typeof stream === 'undefined') { - stream = null; - } - if (!fd) { - if (stream && stream.socket) { - for (var i = 1; i < 64; i++) { - if (!FS.streams[i]) { - fd = i; - break; - } - } - assert(fd, 'ran out of low fds for sockets'); - } else { - fd = Math.max(FS.streams.length, 64); - for (var i = FS.streams.length; i < fd; i++) { - FS.streams[i] = null; // Keep dense - } - } - } - // Close WebSocket first if we are about to replace the fd (i.e. dup2) - if (FS.streams[fd] && FS.streams[fd].socket && FS.streams[fd].socket.close) { - FS.streams[fd].socket.close(); - } - FS.streams[fd] = stream; - return fd; - },removeFileHandle:function (fd) { - FS.streams[fd] = null; - },joinPath:function (parts, forceRelative) { - var ret = parts[0]; - for (var i = 1; i < parts.length; i++) { - if (ret[ret.length-1] != '/') ret += '/'; - ret += parts[i]; - } - if (forceRelative && ret[0] == '/') ret = ret.substr(1); - return ret; - },absolutePath:function (relative, base) { - if (typeof relative !== 'string') return null; - if (base === undefined) base = FS.currentPath; - if (relative && relative[0] == '/') base = ''; - var full = base + '/' + relative; - var parts = full.split('/').reverse(); - var absolute = ['']; - while (parts.length) { - var part = parts.pop(); - if (part == '' || part == '.') { - // Nothing. - } else if (part == '..') { - if (absolute.length > 1) absolute.pop(); - } else { - absolute.push(part); - } - } - return absolute.length == 1 ? '/' : absolute.join('/'); - },analyzePath:function (path, dontResolveLastLink, linksVisited) { - var ret = { - isRoot: false, - exists: false, - error: 0, - name: null, - path: null, - object: null, - parentExists: false, - parentPath: null, - parentObject: null - }; - path = FS.absolutePath(path); - if (path == '/') { - ret.isRoot = true; - ret.exists = ret.parentExists = true; - ret.name = '/'; - ret.path = ret.parentPath = '/'; - ret.object = ret.parentObject = FS.root; - } else if (path !== null) { - linksVisited = linksVisited || 0; - path = path.slice(1).split('/'); - var current = FS.root; - var traversed = ['']; - while (path.length) { - if (path.length == 1 && current.isFolder) { - ret.parentExists = true; - ret.parentPath = traversed.length == 1 ? '/' : traversed.join('/'); - ret.parentObject = current; - ret.name = path[0]; - } - var target = path.shift(); - if (!current.isFolder) { - ret.error = ERRNO_CODES.ENOTDIR; - break; - } else if (!current.read) { - ret.error = ERRNO_CODES.EACCES; - break; - } else if (!current.contents.hasOwnProperty(target)) { - ret.error = ERRNO_CODES.ENOENT; - break; - } - current = current.contents[target]; - if (current.link && !(dontResolveLastLink && path.length == 0)) { - if (linksVisited > 40) { // Usual Linux SYMLOOP_MAX. - ret.error = ERRNO_CODES.ELOOP; - break; - } - var link = FS.absolutePath(current.link, traversed.join('/')); - ret = FS.analyzePath([link].concat(path).join('/'), - dontResolveLastLink, linksVisited + 1); - return ret; - } - traversed.push(target); - if (path.length == 0) { - ret.exists = true; - ret.path = traversed.join('/'); - ret.object = current; - } - } - } - return ret; - },findObject:function (path, dontResolveLastLink) { - FS.ensureRoot(); - var ret = FS.analyzePath(path, dontResolveLastLink); - if (ret.exists) { - return ret.object; - } else { - ___setErrNo(ret.error); - return null; - } - },createObject:function (parent, name, properties, canRead, canWrite) { - if (!parent) parent = '/'; - if (typeof parent === 'string') parent = FS.findObject(parent); - if (!parent) { - ___setErrNo(ERRNO_CODES.EACCES); - throw new Error('Parent path must exist.'); - } - if (!parent.isFolder) { - ___setErrNo(ERRNO_CODES.ENOTDIR); - throw new Error('Parent must be a folder.'); - } - if (!parent.write && !FS.ignorePermissions) { - ___setErrNo(ERRNO_CODES.EACCES); - throw new Error('Parent folder must be writeable.'); - } - if (!name || name == '.' || name == '..') { - ___setErrNo(ERRNO_CODES.ENOENT); - throw new Error('Name must not be empty.'); - } - if (parent.contents.hasOwnProperty(name)) { - ___setErrNo(ERRNO_CODES.EEXIST); - throw new Error("Can't overwrite object."); - } - parent.contents[name] = { - read: canRead === undefined ? true : canRead, - write: canWrite === undefined ? false : canWrite, - timestamp: Date.now(), - inodeNumber: FS.nextInode++ - }; - for (var key in properties) { - if (properties.hasOwnProperty(key)) { - parent.contents[name][key] = properties[key]; - } - } - return parent.contents[name]; - },createFolder:function (parent, name, canRead, canWrite) { - var properties = {isFolder: true, isDevice: false, contents: {}}; - return FS.createObject(parent, name, properties, canRead, canWrite); - },createPath:function (parent, path, canRead, canWrite) { - var current = FS.findObject(parent); - if (current === null) throw new Error('Invalid parent.'); - path = path.split('/').reverse(); - while (path.length) { - var part = path.pop(); - if (!part) continue; - if (!current.contents.hasOwnProperty(part)) { - FS.createFolder(current, part, canRead, canWrite); - } - current = current.contents[part]; - } - return current; - },createFile:function (parent, name, properties, canRead, canWrite) { - properties.isFolder = false; - return FS.createObject(parent, name, properties, canRead, canWrite); - },createDataFile:function (parent, name, data, canRead, canWrite) { - if (typeof data === 'string') { - var dataArray = new Array(data.length); - for (var i = 0, len = data.length; i < len; ++i) dataArray[i] = data.charCodeAt(i); - data = dataArray; - } - var properties = { - isDevice: false, - contents: data.subarray ? data.subarray(0) : data // as an optimization, create a new array wrapper (not buffer) here, to help JS engines understand this object - }; - return FS.createFile(parent, name, properties, canRead, canWrite); - },createLazyFile:function (parent, name, url, canRead, canWrite) { - if (typeof XMLHttpRequest !== 'undefined') { - if (!ENVIRONMENT_IS_WORKER) throw 'Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc'; - // Lazy chunked Uint8Array (implements get and length from Uint8Array). Actual getting is abstracted away for eventual reuse. - var LazyUint8Array = function() { - this.lengthKnown = false; - this.chunks = []; // Loaded chunks. Index is the chunk number - } - LazyUint8Array.prototype.get = function(idx) { - if (idx > this.length-1 || idx < 0) { - return undefined; - } - var chunkOffset = idx % this.chunkSize; - var chunkNum = Math.floor(idx / this.chunkSize); - return this.getter(chunkNum)[chunkOffset]; - } - LazyUint8Array.prototype.setDataGetter = function(getter) { - this.getter = getter; - } - LazyUint8Array.prototype.cacheLength = function() { - // Find length - var xhr = new XMLHttpRequest(); - xhr.open('HEAD', url, false); - xhr.send(null); - if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); - var datalength = Number(xhr.getResponseHeader("Content-length")); - var header; - var hasByteServing = (header = xhr.getResponseHeader("Accept-Ranges")) && header === "bytes"; - var chunkSize = 1024*1024; // Chunk size in bytes - if (!hasByteServing) chunkSize = datalength; - // Function to get a range from the remote URL. - var doXHR = (function(from, to) { - if (from > to) throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!"); - if (to > datalength-1) throw new Error("only " + datalength + " bytes available! programmer error!"); - // TODO: Use mozResponseArrayBuffer, responseStream, etc. if available. - var xhr = new XMLHttpRequest(); - xhr.open('GET', url, false); - if (datalength !== chunkSize) xhr.setRequestHeader("Range", "bytes=" + from + "-" + to); - // Some hints to the browser that we want binary data. - if (typeof Uint8Array != 'undefined') xhr.responseType = 'arraybuffer'; - if (xhr.overrideMimeType) { - xhr.overrideMimeType('text/plain; charset=x-user-defined'); - } - xhr.send(null); - if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); - if (xhr.response !== undefined) { - return new Uint8Array(xhr.response || []); - } else { - return intArrayFromString(xhr.responseText || '', true); - } - }); - var lazyArray = this; - lazyArray.setDataGetter(function(chunkNum) { - var start = chunkNum * chunkSize; - var end = (chunkNum+1) * chunkSize - 1; // including this byte - end = Math.min(end, datalength-1); // if datalength-1 is selected, this is the last block - if (typeof(lazyArray.chunks[chunkNum]) === "undefined") { - lazyArray.chunks[chunkNum] = doXHR(start, end); - } - if (typeof(lazyArray.chunks[chunkNum]) === "undefined") throw new Error("doXHR failed!"); - return lazyArray.chunks[chunkNum]; - }); - this._length = datalength; - this._chunkSize = chunkSize; - this.lengthKnown = true; - } - var lazyArray = new LazyUint8Array(); - Object.defineProperty(lazyArray, "length", { - get: function() { - if(!this.lengthKnown) { - this.cacheLength(); - } - return this._length; - } - }); - Object.defineProperty(lazyArray, "chunkSize", { - get: function() { - if(!this.lengthKnown) { - this.cacheLength(); - } - return this._chunkSize; - } - }); - var properties = { isDevice: false, contents: lazyArray }; - } else { - var properties = { isDevice: false, url: url }; - } - return FS.createFile(parent, name, properties, canRead, canWrite); - },createPreloadedFile:function (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile) { - Browser.init(); - var fullname = FS.joinPath([parent, name], true); - function processData(byteArray) { - function finish(byteArray) { - if (!dontCreateFile) { - FS.createDataFile(parent, name, byteArray, canRead, canWrite); - } - if (onload) onload(); - removeRunDependency('cp ' + fullname); - } - var handled = false; - Module['preloadPlugins'].forEach(function(plugin) { - if (handled) return; - if (plugin['canHandle'](fullname)) { - plugin['handle'](byteArray, fullname, finish, function() { - if (onerror) onerror(); - removeRunDependency('cp ' + fullname); - }); - handled = true; - } - }); - if (!handled) finish(byteArray); - } - addRunDependency('cp ' + fullname); - if (typeof url == 'string') { - Browser.asyncLoad(url, function(byteArray) { - processData(byteArray); - }, onerror); - } else { - processData(url); - } - },createLink:function (parent, name, target, canRead, canWrite) { - var properties = {isDevice: false, link: target}; - return FS.createFile(parent, name, properties, canRead, canWrite); - },createDevice:function (parent, name, input, output) { - if (!(input || output)) { - throw new Error('A device must have at least one callback defined.'); - } - var ops = {isDevice: true, input: input, output: output}; - return FS.createFile(parent, name, ops, Boolean(input), Boolean(output)); - },forceLoadFile:function (obj) { - if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true; - var success = true; - if (typeof XMLHttpRequest !== 'undefined') { - throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread."); - } else if (Module['read']) { - // Command-line. - try { - // WARNING: Can't read binary files in V8's d8 or tracemonkey's js, as - // read() will try to parse UTF8. - obj.contents = intArrayFromString(Module['read'](obj.url), true); - } catch (e) { - success = false; - } - } else { - throw new Error('Cannot load without read() or XMLHttpRequest.'); - } - if (!success) ___setErrNo(ERRNO_CODES.EIO); - return success; - },ensureRoot:function () { - if (FS.root) return; - // The main file system tree. All the contents are inside this. - FS.root = { - read: true, - write: true, - isFolder: true, - isDevice: false, - timestamp: Date.now(), - inodeNumber: 1, - contents: {} - }; - },init:function (input, output, error) { - // Make sure we initialize only once. - assert(!FS.init.initialized, 'FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)'); - FS.init.initialized = true; - FS.ensureRoot(); - // Allow Module.stdin etc. to provide defaults, if none explicitly passed to us here - input = input || Module['stdin']; - output = output || Module['stdout']; - error = error || Module['stderr']; - // Default handlers. - var stdinOverridden = true, stdoutOverridden = true, stderrOverridden = true; - if (!input) { - stdinOverridden = false; - input = function() { - if (!input.cache || !input.cache.length) { - var result; - if (typeof window != 'undefined' && - typeof window.prompt == 'function') { - // Browser. - result = window.prompt('Input: '); - if (result === null) result = String.fromCharCode(0); // cancel ==> EOF - } else if (typeof readline == 'function') { - // Command line. - result = readline(); - } - if (!result) result = ''; - input.cache = intArrayFromString(result + '\n', true); - } - return input.cache.shift(); - }; - } - var utf8 = new Runtime.UTF8Processor(); - function simpleOutput(val) { - if (val === null || val === 10) { - output.printer(output.buffer.join('')); - output.buffer = []; - } else { - output.buffer.push(utf8.processCChar(val)); - } - } - if (!output) { - stdoutOverridden = false; - output = simpleOutput; - } - if (!output.printer) output.printer = Module['print']; - if (!output.buffer) output.buffer = []; - if (!error) { - stderrOverridden = false; - error = simpleOutput; - } - if (!error.printer) error.printer = Module['print']; - if (!error.buffer) error.buffer = []; - // Create the temporary folder, if not already created - try { - FS.createFolder('/', 'tmp', true, true); - } catch(e) {} - // Create the I/O devices. - var devFolder = FS.createFolder('/', 'dev', true, true); - var stdin = FS.createDevice(devFolder, 'stdin', input); - var stdout = FS.createDevice(devFolder, 'stdout', null, output); - var stderr = FS.createDevice(devFolder, 'stderr', null, error); - FS.createDevice(devFolder, 'tty', input, output); - FS.createDevice(devFolder, 'null', function(){}, function(){}); - // Create default streams. - FS.streams[1] = { - path: '/dev/stdin', - object: stdin, - position: 0, - isRead: true, - isWrite: false, - isAppend: false, - isTerminal: !stdinOverridden, - error: false, - eof: false, - ungotten: [] - }; - FS.streams[2] = { - path: '/dev/stdout', - object: stdout, - position: 0, - isRead: false, - isWrite: true, - isAppend: false, - isTerminal: !stdoutOverridden, - error: false, - eof: false, - ungotten: [] - }; - FS.streams[3] = { - path: '/dev/stderr', - object: stderr, - position: 0, - isRead: false, - isWrite: true, - isAppend: false, - isTerminal: !stderrOverridden, - error: false, - eof: false, - ungotten: [] - }; - // TODO: put these low in memory like we used to assert on: assert(Math.max(_stdin, _stdout, _stderr) < 15000); // make sure these are low, we flatten arrays with these - HEAP32[((_stdin)>>2)]=1; - HEAP32[((_stdout)>>2)]=2; - HEAP32[((_stderr)>>2)]=3; - // Other system paths - FS.createPath('/', 'dev/shm/tmp', true, true); // temp files - // Newlib initialization - for (var i = FS.streams.length; i < Math.max(_stdin, _stdout, _stderr) + 4; i++) { - FS.streams[i] = null; // Make sure to keep FS.streams dense - } - FS.streams[_stdin] = FS.streams[1]; - FS.streams[_stdout] = FS.streams[2]; - FS.streams[_stderr] = FS.streams[3]; - allocate([ allocate( - [0, 0, 0, 0, _stdin, 0, 0, 0, _stdout, 0, 0, 0, _stderr, 0, 0, 0], - 'void*', ALLOC_NORMAL) ], 'void*', ALLOC_NONE, __impure_ptr); - },quit:function () { - if (!FS.init.initialized) return; - // Flush any partially-printed lines in stdout and stderr. Careful, they may have been closed - if (FS.streams[2] && FS.streams[2].object.output.buffer.length > 0) FS.streams[2].object.output(10); - if (FS.streams[3] && FS.streams[3].object.output.buffer.length > 0) FS.streams[3].object.output(10); - },standardizePath:function (path) { - if (path.substr(0, 2) == './') path = path.substr(2); - return path; - },deleteFile:function (path) { - path = FS.analyzePath(path); - if (!path.parentExists || !path.exists) { - throw 'Invalid path ' + path; - } - delete path.parentObject.contents[path.name]; - }}; - function _send(fd, buf, len, flags) { - var info = FS.streams[fd]; - if (!info) return -1; - info.sender(HEAPU8.subarray(buf, buf+len)); - return len; - } - function _pwrite(fildes, buf, nbyte, offset) { - // ssize_t pwrite(int fildes, const void *buf, size_t nbyte, off_t offset); - // http://pubs.opengroup.org/onlinepubs/000095399/functions/write.html - var stream = FS.streams[fildes]; - if (!stream || stream.object.isDevice) { - ___setErrNo(ERRNO_CODES.EBADF); - return -1; - } else if (!stream.isWrite) { - ___setErrNo(ERRNO_CODES.EACCES); - return -1; - } else if (stream.object.isFolder) { - ___setErrNo(ERRNO_CODES.EISDIR); - return -1; - } else if (nbyte < 0 || offset < 0) { - ___setErrNo(ERRNO_CODES.EINVAL); - return -1; - } else { - var contents = stream.object.contents; - while (contents.length < offset) contents.push(0); - for (var i = 0; i < nbyte; i++) { - contents[offset + i] = HEAPU8[(((buf)+(i))|0)]; - } - stream.object.timestamp = Date.now(); - return i; - } - }function _write(fildes, buf, nbyte) { - // ssize_t write(int fildes, const void *buf, size_t nbyte); - // http://pubs.opengroup.org/onlinepubs/000095399/functions/write.html - var stream = FS.streams[fildes]; - if (stream && ('socket' in stream)) { - return _send(fildes, buf, nbyte, 0); - } else if (!stream) { - ___setErrNo(ERRNO_CODES.EBADF); - return -1; - } else if (!stream.isWrite) { - ___setErrNo(ERRNO_CODES.EACCES); - return -1; - } else if (nbyte < 0) { - ___setErrNo(ERRNO_CODES.EINVAL); - return -1; - } else { - if (stream.object.isDevice) { - if (stream.object.output) { - for (var i = 0; i < nbyte; i++) { - try { - stream.object.output(HEAP8[(((buf)+(i))|0)]); - } catch (e) { - ___setErrNo(ERRNO_CODES.EIO); - return -1; - } - } - stream.object.timestamp = Date.now(); - return i; - } else { - ___setErrNo(ERRNO_CODES.ENXIO); - return -1; - } - } else { - var bytesWritten = _pwrite(fildes, buf, nbyte, stream.position); - if (bytesWritten != -1) stream.position += bytesWritten; - return bytesWritten; - } - } - }function _fwrite(ptr, size, nitems, stream) { - // size_t fwrite(const void *restrict ptr, size_t size, size_t nitems, FILE *restrict stream); - // http://pubs.opengroup.org/onlinepubs/000095399/functions/fwrite.html - var bytesToWrite = nitems * size; - if (bytesToWrite == 0) return 0; - var bytesWritten = _write(stream, ptr, bytesToWrite); - if (bytesWritten == -1) { - if (FS.streams[stream]) FS.streams[stream].error = true; - return 0; - } else { - return Math.floor(bytesWritten / size); - } - } - Module["_strlen"] = _strlen; - function __reallyNegative(x) { - return x < 0 || (x === 0 && (1/x) === -Infinity); - }function __formatString(format, varargs) { - var textIndex = format; - var argIndex = 0; - function getNextArg(type) { - // NOTE: Explicitly ignoring type safety. Otherwise this fails: - // int x = 4; printf("%c\n", (char)x); - var ret; - if (type === 'double') { - ret = HEAPF64[(((varargs)+(argIndex))>>3)]; - } else if (type == 'i64') { - ret = [HEAP32[(((varargs)+(argIndex))>>2)], - HEAP32[(((varargs)+(argIndex+8))>>2)]]; - argIndex += 8; // each 32-bit chunk is in a 64-bit block - } else { - type = 'i32'; // varargs are always i32, i64, or double - ret = HEAP32[(((varargs)+(argIndex))>>2)]; - } - argIndex += Math.max(Runtime.getNativeFieldSize(type), Runtime.getAlignSize(type, null, true)); - return ret; - } - var ret = []; - var curr, next, currArg; - while(1) { - var startTextIndex = textIndex; - curr = HEAP8[(textIndex)]; - if (curr === 0) break; - next = HEAP8[((textIndex+1)|0)]; - if (curr == 37) { - // Handle flags. - var flagAlwaysSigned = false; - var flagLeftAlign = false; - var flagAlternative = false; - var flagZeroPad = false; - flagsLoop: while (1) { - switch (next) { - case 43: - flagAlwaysSigned = true; - break; - case 45: - flagLeftAlign = true; - break; - case 35: - flagAlternative = true; - break; - case 48: - if (flagZeroPad) { - break flagsLoop; - } else { - flagZeroPad = true; - break; - } - default: - break flagsLoop; - } - textIndex++; - next = HEAP8[((textIndex+1)|0)]; - } - // Handle width. - var width = 0; - if (next == 42) { - width = getNextArg('i32'); - textIndex++; - next = HEAP8[((textIndex+1)|0)]; - } else { - while (next >= 48 && next <= 57) { - width = width * 10 + (next - 48); - textIndex++; - next = HEAP8[((textIndex+1)|0)]; - } - } - // Handle precision. - var precisionSet = false; - if (next == 46) { - var precision = 0; - precisionSet = true; - textIndex++; - next = HEAP8[((textIndex+1)|0)]; - if (next == 42) { - precision = getNextArg('i32'); - textIndex++; - } else { - while(1) { - var precisionChr = HEAP8[((textIndex+1)|0)]; - if (precisionChr < 48 || - precisionChr > 57) break; - precision = precision * 10 + (precisionChr - 48); - textIndex++; - } - } - next = HEAP8[((textIndex+1)|0)]; - } else { - var precision = 6; // Standard default. - } - // Handle integer sizes. WARNING: These assume a 32-bit architecture! - var argSize; - switch (String.fromCharCode(next)) { - case 'h': - var nextNext = HEAP8[((textIndex+2)|0)]; - if (nextNext == 104) { - textIndex++; - argSize = 1; // char (actually i32 in varargs) - } else { - argSize = 2; // short (actually i32 in varargs) - } - break; - case 'l': - var nextNext = HEAP8[((textIndex+2)|0)]; - if (nextNext == 108) { - textIndex++; - argSize = 8; // long long - } else { - argSize = 4; // long - } - break; - case 'L': // long long - case 'q': // int64_t - case 'j': // intmax_t - argSize = 8; - break; - case 'z': // size_t - case 't': // ptrdiff_t - case 'I': // signed ptrdiff_t or unsigned size_t - argSize = 4; - break; - default: - argSize = null; - } - if (argSize) textIndex++; - next = HEAP8[((textIndex+1)|0)]; - // Handle type specifier. - switch (String.fromCharCode(next)) { - case 'd': case 'i': case 'u': case 'o': case 'x': case 'X': case 'p': { - // Integer. - var signed = next == 100 || next == 105; - argSize = argSize || 4; - var currArg = getNextArg('i' + (argSize * 8)); - var origArg = currArg; - var argText; - // Flatten i64-1 [low, high] into a (slightly rounded) double - if (argSize == 8) { - currArg = Runtime.makeBigInt(currArg[0], currArg[1], next == 117); - } - // Truncate to requested size. - if (argSize <= 4) { - var limit = Math.pow(256, argSize) - 1; - currArg = (signed ? reSign : unSign)(currArg & limit, argSize * 8); - } - // Format the number. - var currAbsArg = Math.abs(currArg); - var prefix = ''; - if (next == 100 || next == 105) { - if (argSize == 8 && i64Math) argText = i64Math.stringify(origArg[0], origArg[1], null); else - argText = reSign(currArg, 8 * argSize, 1).toString(10); - } else if (next == 117) { - if (argSize == 8 && i64Math) argText = i64Math.stringify(origArg[0], origArg[1], true); else - argText = unSign(currArg, 8 * argSize, 1).toString(10); - currArg = Math.abs(currArg); - } else if (next == 111) { - argText = (flagAlternative ? '0' : '') + currAbsArg.toString(8); - } else if (next == 120 || next == 88) { - prefix = (flagAlternative && currArg != 0) ? '0x' : ''; - if (argSize == 8 && i64Math) { - if (origArg[1]) { - argText = (origArg[1]>>>0).toString(16); - var lower = (origArg[0]>>>0).toString(16); - while (lower.length < 8) lower = '0' + lower; - argText += lower; - } else { - argText = (origArg[0]>>>0).toString(16); - } - } else - if (currArg < 0) { - // Represent negative numbers in hex as 2's complement. - currArg = -currArg; - argText = (currAbsArg - 1).toString(16); - var buffer = []; - for (var i = 0; i < argText.length; i++) { - buffer.push((0xF - parseInt(argText[i], 16)).toString(16)); - } - argText = buffer.join(''); - while (argText.length < argSize * 2) argText = 'f' + argText; - } else { - argText = currAbsArg.toString(16); - } - if (next == 88) { - prefix = prefix.toUpperCase(); - argText = argText.toUpperCase(); - } - } else if (next == 112) { - if (currAbsArg === 0) { - argText = '(nil)'; - } else { - prefix = '0x'; - argText = currAbsArg.toString(16); - } - } - if (precisionSet) { - while (argText.length < precision) { - argText = '0' + argText; - } - } - // Add sign if needed - if (flagAlwaysSigned) { - if (currArg < 0) { - prefix = '-' + prefix; - } else { - prefix = '+' + prefix; - } - } - // Add padding. - while (prefix.length + argText.length < width) { - if (flagLeftAlign) { - argText += ' '; - } else { - if (flagZeroPad) { - argText = '0' + argText; - } else { - prefix = ' ' + prefix; - } - } - } - // Insert the result into the buffer. - argText = prefix + argText; - argText.split('').forEach(function(chr) { - ret.push(chr.charCodeAt(0)); - }); - break; - } - case 'f': case 'F': case 'e': case 'E': case 'g': case 'G': { - // Float. - var currArg = getNextArg('double'); - var argText; - if (isNaN(currArg)) { - argText = 'nan'; - flagZeroPad = false; - } else if (!isFinite(currArg)) { - argText = (currArg < 0 ? '-' : '') + 'inf'; - flagZeroPad = false; - } else { - var isGeneral = false; - var effectivePrecision = Math.min(precision, 20); - // Convert g/G to f/F or e/E, as per: - // http://pubs.opengroup.org/onlinepubs/9699919799/functions/printf.html - if (next == 103 || next == 71) { - isGeneral = true; - precision = precision || 1; - var exponent = parseInt(currArg.toExponential(effectivePrecision).split('e')[1], 10); - if (precision > exponent && exponent >= -4) { - next = ((next == 103) ? 'f' : 'F').charCodeAt(0); - precision -= exponent + 1; - } else { - next = ((next == 103) ? 'e' : 'E').charCodeAt(0); - precision--; - } - effectivePrecision = Math.min(precision, 20); - } - if (next == 101 || next == 69) { - argText = currArg.toExponential(effectivePrecision); - // Make sure the exponent has at least 2 digits. - if (/[eE][-+]\d$/.test(argText)) { - argText = argText.slice(0, -1) + '0' + argText.slice(-1); - } - } else if (next == 102 || next == 70) { - argText = currArg.toFixed(effectivePrecision); - if (currArg === 0 && __reallyNegative(currArg)) { - argText = '-' + argText; - } - } - var parts = argText.split('e'); - if (isGeneral && !flagAlternative) { - // Discard trailing zeros and periods. - while (parts[0].length > 1 && parts[0].indexOf('.') != -1 && - (parts[0].slice(-1) == '0' || parts[0].slice(-1) == '.')) { - parts[0] = parts[0].slice(0, -1); - } - } else { - // Make sure we have a period in alternative mode. - if (flagAlternative && argText.indexOf('.') == -1) parts[0] += '.'; - // Zero pad until required precision. - while (precision > effectivePrecision++) parts[0] += '0'; - } - argText = parts[0] + (parts.length > 1 ? 'e' + parts[1] : ''); - // Capitalize 'E' if needed. - if (next == 69) argText = argText.toUpperCase(); - // Add sign. - if (flagAlwaysSigned && currArg >= 0) { - argText = '+' + argText; - } - } - // Add padding. - while (argText.length < width) { - if (flagLeftAlign) { - argText += ' '; - } else { - if (flagZeroPad && (argText[0] == '-' || argText[0] == '+')) { - argText = argText[0] + '0' + argText.slice(1); - } else { - argText = (flagZeroPad ? '0' : ' ') + argText; - } - } - } - // Adjust case. - if (next < 97) argText = argText.toUpperCase(); - // Insert the result into the buffer. - argText.split('').forEach(function(chr) { - ret.push(chr.charCodeAt(0)); - }); - break; - } - case 's': { - // String. - var arg = getNextArg('i8*'); - var argLength = arg ? _strlen(arg) : '(null)'.length; - if (precisionSet) argLength = Math.min(argLength, precision); - if (!flagLeftAlign) { - while (argLength < width--) { - ret.push(32); - } - } - if (arg) { - for (var i = 0; i < argLength; i++) { - ret.push(HEAPU8[((arg++)|0)]); - } - } else { - ret = ret.concat(intArrayFromString('(null)'.substr(0, argLength), true)); - } - if (flagLeftAlign) { - while (argLength < width--) { - ret.push(32); - } - } - break; - } - case 'c': { - // Character. - if (flagLeftAlign) ret.push(getNextArg('i8')); - while (--width > 0) { - ret.push(32); - } - if (!flagLeftAlign) ret.push(getNextArg('i8')); - break; - } - case 'n': { - // Write the length written so far to the next parameter. - var ptr = getNextArg('i32*'); - HEAP32[((ptr)>>2)]=ret.length - break; - } - case '%': { - // Literal percent sign. - ret.push(curr); - break; - } - default: { - // Unknown specifiers remain untouched. - for (var i = startTextIndex; i < textIndex + 2; i++) { - ret.push(HEAP8[(i)]); - } - } - } - textIndex += 2; - // TODO: Support a/A (hex float) and m (last error) specifiers. - // TODO: Support %1${specifier} for arg selection. - } else { - ret.push(curr); - textIndex += 1; - } - } - return ret; - }function _fprintf(stream, format, varargs) { - // int fprintf(FILE *restrict stream, const char *restrict format, ...); - // http://pubs.opengroup.org/onlinepubs/000095399/functions/printf.html - var result = __formatString(format, varargs); - var stack = Runtime.stackSave(); - var ret = _fwrite(allocate(result, 'i8', ALLOC_STACK), 1, result.length, stream); - Runtime.stackRestore(stack); - return ret; - } - Module["_strcpy"] = _strcpy; - function _strncmp(px, py, n) { - var i = 0; - while (i < n) { - var x = HEAPU8[(((px)+(i))|0)]; - var y = HEAPU8[(((py)+(i))|0)]; - if (x == y && x == 0) return 0; - if (x == 0) return -1; - if (y == 0) return 1; - if (x == y) { - i ++; - continue; - } else { - return x > y ? 1 : -1; - } - } - return 0; - }function _strcmp(px, py) { - return _strncmp(px, py, TOTAL_MEMORY); - } - var _exp=Math.exp; - var _ceil=Math.ceil; - function _log10(x) { - return Math.log(x) / Math.LN10; - } - function _snprintf(s, n, format, varargs) { - // int snprintf(char *restrict s, size_t n, const char *restrict format, ...); - // http://pubs.opengroup.org/onlinepubs/000095399/functions/printf.html - var result = __formatString(format, varargs); - var limit = (n === undefined) ? result.length - : Math.min(result.length, Math.max(n - 1, 0)); - if (s < 0) { - s = -s; - var buf = _malloc(limit+1); - HEAP32[((s)>>2)]=buf; - s = buf; - } - for (var i = 0; i < limit; i++) { - HEAP8[(((s)+(i))|0)]=result[i]; - } - if (limit < n || (n === undefined)) HEAP8[(((s)+(i))|0)]=0; - return result.length; - }function _sprintf(s, format, varargs) { - // int sprintf(char *restrict s, const char *restrict format, ...); - // http://pubs.opengroup.org/onlinepubs/000095399/functions/printf.html - return _snprintf(s, undefined, format, varargs); - } - Module["_strcat"] = _strcat; - function _strchr(ptr, chr) { - ptr--; - do { - ptr++; - var val = HEAP8[(ptr)]; - if (val == chr) return ptr; - } while (val); - return 0; - } - var _floor=Math.floor; - var _llvm_pow_f64=Math.pow; - Module["_memcpy"] = _memcpy;var _llvm_memcpy_p0i8_p0i8_i32=_memcpy; - Module["_memset"] = _memset;var _llvm_memset_p0i8_i32=_memset; - function _ftell(stream) { - // long ftell(FILE *stream); - // http://pubs.opengroup.org/onlinepubs/000095399/functions/ftell.html - if (FS.streams[stream]) { - stream = FS.streams[stream]; - if (stream.object.isDevice) { - ___setErrNo(ERRNO_CODES.ESPIPE); - return -1; - } else { - return stream.position; - } - } else { - ___setErrNo(ERRNO_CODES.EBADF); - return -1; - } - } - function _lseek(fildes, offset, whence) { - // off_t lseek(int fildes, off_t offset, int whence); - // http://pubs.opengroup.org/onlinepubs/000095399/functions/lseek.html - if (FS.streams[fildes] && !FS.streams[fildes].object.isDevice) { - var stream = FS.streams[fildes]; - var position = offset; - if (whence === 1) { // SEEK_CUR. - position += stream.position; - } else if (whence === 2) { // SEEK_END. - position += stream.object.contents.length; - } - if (position < 0) { - ___setErrNo(ERRNO_CODES.EINVAL); - return -1; - } else { - stream.ungotten = []; - stream.position = position; - return position; - } - } else { - ___setErrNo(ERRNO_CODES.EBADF); - return -1; - } - }function _fseek(stream, offset, whence) { - // int fseek(FILE *stream, long offset, int whence); - // http://pubs.opengroup.org/onlinepubs/000095399/functions/fseek.html - var ret = _lseek(stream, offset, whence); - if (ret == -1) { - return -1; - } else { - FS.streams[stream].eof = false; - return 0; - } - }function _rewind(stream) { - // void rewind(FILE *stream); - // http://pubs.opengroup.org/onlinepubs/000095399/functions/rewind.html - _fseek(stream, 0, 0); // SEEK_SET. - if (FS.streams[stream]) FS.streams[stream].error = false; - } - function _recv(fd, buf, len, flags) { - var info = FS.streams[fd]; - if (!info) return -1; - if (!info.hasData()) { - ___setErrNo(ERRNO_CODES.EAGAIN); // no data, and all sockets are nonblocking, so this is the right behavior - return -1; - } - var buffer = info.inQueue.shift(); - if (len < buffer.length) { - if (info.stream) { - // This is tcp (reliable), so if not all was read, keep it - info.inQueue.unshift(buffer.subarray(len)); - } - buffer = buffer.subarray(0, len); - } - HEAPU8.set(buffer, buf); - return buffer.length; - } - function _pread(fildes, buf, nbyte, offset) { - // ssize_t pread(int fildes, void *buf, size_t nbyte, off_t offset); - // http://pubs.opengroup.org/onlinepubs/000095399/functions/read.html - var stream = FS.streams[fildes]; - if (!stream || stream.object.isDevice) { - ___setErrNo(ERRNO_CODES.EBADF); - return -1; - } else if (!stream.isRead) { - ___setErrNo(ERRNO_CODES.EACCES); - return -1; - } else if (stream.object.isFolder) { - ___setErrNo(ERRNO_CODES.EISDIR); - return -1; - } else if (nbyte < 0 || offset < 0) { - ___setErrNo(ERRNO_CODES.EINVAL); - return -1; - } else { - var bytesRead = 0; - while (stream.ungotten.length && nbyte > 0) { - HEAP8[((buf++)|0)]=stream.ungotten.pop() - nbyte--; - bytesRead++; - } - var contents = stream.object.contents; - var size = Math.min(contents.length - offset, nbyte); - if (contents.subarray) { // typed array - HEAPU8.set(contents.subarray(offset, offset+size), buf); - } else - if (contents.slice) { // normal array - for (var i = 0; i < size; i++) { - HEAP8[(((buf)+(i))|0)]=contents[offset + i] - } - } else { - for (var i = 0; i < size; i++) { // LazyUint8Array from sync binary XHR - HEAP8[(((buf)+(i))|0)]=contents.get(offset + i) - } - } - bytesRead += size; - return bytesRead; - } - }function _read(fildes, buf, nbyte) { - // ssize_t read(int fildes, void *buf, size_t nbyte); - // http://pubs.opengroup.org/onlinepubs/000095399/functions/read.html - var stream = FS.streams[fildes]; - if (stream && ('socket' in stream)) { - return _recv(fildes, buf, nbyte, 0); - } else if (!stream) { - ___setErrNo(ERRNO_CODES.EBADF); - return -1; - } else if (!stream.isRead) { - ___setErrNo(ERRNO_CODES.EACCES); - return -1; - } else if (nbyte < 0) { - ___setErrNo(ERRNO_CODES.EINVAL); - return -1; - } else { - var bytesRead; - if (stream.object.isDevice) { - if (stream.object.input) { - bytesRead = 0; - while (stream.ungotten.length && nbyte > 0) { - HEAP8[((buf++)|0)]=stream.ungotten.pop() - nbyte--; - bytesRead++; - } - for (var i = 0; i < nbyte; i++) { - try { - var result = stream.object.input(); - } catch (e) { - ___setErrNo(ERRNO_CODES.EIO); - return -1; - } - if (result === undefined && bytesRead === 0) { - ___setErrNo(ERRNO_CODES.EAGAIN); - return -1; - } - if (result === null || result === undefined) break; - bytesRead++; - HEAP8[(((buf)+(i))|0)]=result - } - return bytesRead; - } else { - ___setErrNo(ERRNO_CODES.ENXIO); - return -1; - } - } else { - var ungotSize = stream.ungotten.length; - bytesRead = _pread(fildes, buf, nbyte, stream.position); - if (bytesRead != -1) { - stream.position += (stream.ungotten.length - ungotSize) + bytesRead; - } - return bytesRead; - } - } - }function _fread(ptr, size, nitems, stream) { - // size_t fread(void *restrict ptr, size_t size, size_t nitems, FILE *restrict stream); - // http://pubs.opengroup.org/onlinepubs/000095399/functions/fread.html - var bytesToRead = nitems * size; - if (bytesToRead == 0) return 0; - var bytesRead = _read(stream, ptr, bytesToRead); - var streamObj = FS.streams[stream]; - if (bytesRead == -1) { - if (streamObj) streamObj.error = true; - return 0; - } else { - if (bytesRead < bytesToRead) streamObj.eof = true; - return Math.floor(bytesRead / size); - } - } - function _close(fildes) { - // int close(int fildes); - // http://pubs.opengroup.org/onlinepubs/000095399/functions/close.html - if (FS.streams[fildes]) { - if (FS.streams[fildes].currentEntry) { - _free(FS.streams[fildes].currentEntry); - } - FS.streams[fildes] = null; - return 0; - } else { - ___setErrNo(ERRNO_CODES.EBADF); - return -1; - } - } - function _fsync(fildes) { - // int fsync(int fildes); - // http://pubs.opengroup.org/onlinepubs/000095399/functions/fsync.html - if (FS.streams[fildes]) { - // We write directly to the file system, so there's nothing to do here. - return 0; - } else { - ___setErrNo(ERRNO_CODES.EBADF); - return -1; - } - }function _fclose(stream) { - // int fclose(FILE *stream); - // http://pubs.opengroup.org/onlinepubs/000095399/functions/fclose.html - _fsync(stream); - return _close(stream); - } - function _strcspn(pstr, pset) { - var str = pstr, set, strcurr, setcurr; - while (1) { - strcurr = HEAP8[(str)]; - if (!strcurr) return str - pstr; - set = pset; - while (1) { - setcurr = HEAP8[(set)]; - if (!setcurr || setcurr == strcurr) break; - set++; - } - if (setcurr) return str - pstr; - str++; - } - } - Module["_strncpy"] = _strncpy; - function _isspace(chr) { - return chr in { 32: 0, 9: 0, 10: 0, 11: 0, 12: 0, 13: 0 }; - }function __parseInt(str, endptr, base, min, max, bits, unsign) { - // Skip space. - while (_isspace(HEAP8[(str)])) str++; - // Check for a plus/minus sign. - var multiplier = 1; - if (HEAP8[(str)] == 45) { - multiplier = -1; - str++; - } else if (HEAP8[(str)] == 43) { - str++; - } - // Find base. - var finalBase = base; - if (!finalBase) { - if (HEAP8[(str)] == 48) { - if (HEAP8[((str+1)|0)] == 120 || - HEAP8[((str+1)|0)] == 88) { - finalBase = 16; - str += 2; - } else { - finalBase = 8; - str++; - } - } - } else if (finalBase==16) { - if (HEAP8[(str)] == 48) { - if (HEAP8[((str+1)|0)] == 120 || - HEAP8[((str+1)|0)] == 88) { - str += 2; - } - } - } - if (!finalBase) finalBase = 10; - // Get digits. - var chr; - var ret = 0; - while ((chr = HEAP8[(str)]) != 0) { - var digit = parseInt(String.fromCharCode(chr), finalBase); - if (isNaN(digit)) { - break; - } else { - ret = ret * finalBase + digit; - str++; - } - } - // Apply sign. - ret *= multiplier; - // Set end pointer. - if (endptr) { - HEAP32[((endptr)>>2)]=str - } - // Unsign if needed. - if (unsign) { - if (Math.abs(ret) > max) { - ret = max; - ___setErrNo(ERRNO_CODES.ERANGE); - } else { - ret = unSign(ret, bits); - } - } - // Validate range. - if (ret > max || ret < min) { - ret = ret > max ? max : min; - ___setErrNo(ERRNO_CODES.ERANGE); - } - if (bits == 64) { - return ((asm["setTempRet0"](Math.min(Math.floor((ret)/(+(4294967296))), (+(4294967295)))>>>0),ret>>>0)|0); - } - return ret; - }function _strtol(str, endptr, base) { - return __parseInt(str, endptr, base, -2147483648, 2147483647, 32); // LONG_MIN, LONG_MAX. - }function _atoi(ptr) { - return _strtol(ptr, null, 10); - } - function _strstr(ptr1, ptr2) { - var check = 0, start; - do { - if (!check) { - start = ptr1; - check = ptr2; - } - var curr1 = HEAP8[((ptr1++)|0)]; - var curr2 = HEAP8[((check++)|0)]; - if (curr2 == 0) return start; - if (curr2 != curr1) { - // rewind to one character after start, to find ez in eeez - ptr1 = start + 1; - check = 0; - } - } while (curr1); - return 0; - } - Module["_memcmp"] = _memcmp; - function _fputs(s, stream) { - // int fputs(const char *restrict s, FILE *restrict stream); - // http://pubs.opengroup.org/onlinepubs/000095399/functions/fputs.html - return _write(stream, s, _strlen(s)); - } - Module["_memmove"] = _memmove;var _llvm_memmove_p0i8_p0i8_i32=_memmove; - function _fflush(stream) { - // int fflush(FILE *stream); - // http://pubs.opengroup.org/onlinepubs/000095399/functions/fflush.html - var flush = function(filedes) { - // Right now we write all data directly, except for output devices. - if (FS.streams[filedes] && FS.streams[filedes].object.output) { - if (!FS.streams[filedes].isTerminal) { // don't flush terminals, it would cause a \n to also appear - FS.streams[filedes].object.output(null); - } - } - }; - try { - if (stream === 0) { - for (var i = 0; i < FS.streams.length; i++) if (FS.streams[i]) flush(i); - } else { - flush(stream); - } - return 0; - } catch (e) { - ___setErrNo(ERRNO_CODES.EIO); - return -1; - } - } - function __exit(status) { - // void _exit(int status); - // http://pubs.opengroup.org/onlinepubs/000095399/functions/exit.html - function ExitStatus() { - this.name = "ExitStatus"; - this.message = "Program terminated with exit(" + status + ")"; - this.status = status; - Module.print('Exit Status: ' + status); - }; - ExitStatus.prototype = new Error(); - ExitStatus.prototype.constructor = ExitStatus; - exitRuntime(); - ABORT = true; - throw new ExitStatus(); - }function _exit(status) { - __exit(status); - } - function _fgetc(stream) { - // int fgetc(FILE *stream); - // http://pubs.opengroup.org/onlinepubs/000095399/functions/fgetc.html - if (!FS.streams[stream]) return -1; - var streamObj = FS.streams[stream]; - if (streamObj.eof || streamObj.error) return -1; - var ret = _read(stream, _fgetc.ret, 1); - if (ret == 0) { - streamObj.eof = true; - return -1; - } else if (ret == -1) { - streamObj.error = true; - return -1; - } else { - return HEAPU8[((_fgetc.ret)|0)]; - } - }function _fgets(s, n, stream) { - // char *fgets(char *restrict s, int n, FILE *restrict stream); - // http://pubs.opengroup.org/onlinepubs/000095399/functions/fgets.html - if (!FS.streams[stream]) return 0; - var streamObj = FS.streams[stream]; - if (streamObj.error || streamObj.eof) return 0; - var byte_; - for (var i = 0; i < n - 1 && byte_ != 10; i++) { - byte_ = _fgetc(stream); - if (byte_ == -1) { - if (streamObj.error || (streamObj.eof && i == 0)) return 0; - else if (streamObj.eof) break; - } - HEAP8[(((s)+(i))|0)]=byte_ - } - HEAP8[(((s)+(i))|0)]=0 - return s; - } - function _usleep(useconds) { - // int usleep(useconds_t useconds); - // http://pubs.opengroup.org/onlinepubs/000095399/functions/usleep.html - // We're single-threaded, so use a busy loop. Super-ugly. - var msec = useconds / 1000; - var start = Date.now(); - while (Date.now() - start < msec) { - // Do nothing. - } - return 0; - } - function _fputc(c, stream) { - // int fputc(int c, FILE *stream); - // http://pubs.opengroup.org/onlinepubs/000095399/functions/fputc.html - var chr = unSign(c & 0xFF); - HEAP8[((_fputc.ret)|0)]=chr - var ret = _write(stream, _fputc.ret, 1); - if (ret == -1) { - if (FS.streams[stream]) FS.streams[stream].error = true; - return -1; - } else { - return chr; - } - } - function _pclose(stream) { - // int pclose(FILE *stream); - // http://pubs.opengroup.org/onlinepubs/000095399/functions/pclose.html - // We allow only one process, so no pipes. - ___setErrNo(ERRNO_CODES.ECHILD); - return -1; - } - function _puts(s) { - // int puts(const char *s); - // http://pubs.opengroup.org/onlinepubs/000095399/functions/puts.html - // NOTE: puts() always writes an extra newline. - var stdout = HEAP32[((_stdout)>>2)]; - var ret = _fputs(s, stdout); - if (ret < 0) { - return ret; - } else { - var newlineRet = _fputc(10, stdout); - return (newlineRet < 0) ? -1 : ret + 1; - } - } - var ERRNO_MESSAGES={0:"Success",1:"Not super-user",2:"No such file or directory",3:"No such process",4:"Interrupted system call",5:"I/O error",6:"No such device or address",7:"Arg list too long",8:"Exec format error",9:"Bad file number",10:"No children",11:"No more processes",12:"Not enough core",13:"Permission denied",14:"Bad address",15:"Block device required",16:"Mount device busy",17:"File exists",18:"Cross-device link",19:"No such device",20:"Not a directory",21:"Is a directory",22:"Invalid argument",23:"Too many open files in system",24:"Too many open files",25:"Not a typewriter",26:"Text file busy",27:"File too large",28:"No space left on device",29:"Illegal seek",30:"Read only file system",31:"Too many links",32:"Broken pipe",33:"Math arg out of domain of func",34:"Math result not representable",35:"No message of desired type",36:"Identifier removed",37:"Channel number out of range",38:"Level 2 not synchronized",39:"Level 3 halted",40:"Level 3 reset",41:"Link number out of range",42:"Protocol driver not attached",43:"No CSI structure available",44:"Level 2 halted",45:"Deadlock condition",46:"No record locks available",50:"Invalid exchange",51:"Invalid request descriptor",52:"Exchange full",53:"No anode",54:"Invalid request code",55:"Invalid slot",56:"File locking deadlock error",57:"Bad font file fmt",60:"Device not a stream",61:"No data (for no delay io)",62:"Timer expired",63:"Out of streams resources",64:"Machine is not on the network",65:"Package not installed",66:"The object is remote",67:"The link has been severed",68:"Advertise error",69:"Srmount error",70:"Communication error on send",71:"Protocol error",74:"Multihop attempted",75:"Inode is remote (not really error)",76:"Cross mount point (not really error)",77:"Trying to read unreadable message",79:"Inappropriate file type or format",80:"Given log. name not unique",81:"f.d. invalid for this operation",82:"Remote address changed",83:"Can\t access a needed shared lib",84:"Accessing a corrupted shared lib",85:".lib section in a.out corrupted",86:"Attempting to link in too many libs",87:"Attempting to exec a shared library",88:"Function not implemented",89:"No more files",90:"Directory not empty",91:"File or path name too long",92:"Too many symbolic links",95:"Operation not supported on transport endpoint",96:"Protocol family not supported",104:"Connection reset by peer",105:"No buffer space available",106:"Address family not supported by protocol family",107:"Protocol wrong type for socket",108:"Socket operation on non-socket",109:"Protocol not available",110:"Can't send after socket shutdown",111:"Connection refused",112:"Address already in use",113:"Connection aborted",114:"Network is unreachable",115:"Network interface is not configured",116:"Connection timed out",117:"Host is down",118:"Host is unreachable",119:"Connection already in progress",120:"Socket already connected",121:"Destination address required",122:"Message too long",123:"Unknown protocol",124:"Socket type not supported",125:"Address not available",126:"ENETRESET",127:"Socket is already connected",128:"Socket is not connected",129:"TOOMANYREFS",130:"EPROCLIM",131:"EUSERS",132:"EDQUOT",133:"ESTALE",134:"Not supported",135:"No medium (in tape drive)",136:"No such host or network path",137:"Filename exists with different case",138:"EILSEQ",139:"Value too large for defined data type",140:"Operation canceled",141:"State not recoverable",142:"Previous owner died",143:"Streams pipe error"};function _strerror_r(errnum, strerrbuf, buflen) { - if (errnum in ERRNO_MESSAGES) { - if (ERRNO_MESSAGES[errnum].length > buflen - 1) { - return ___setErrNo(ERRNO_CODES.ERANGE); - } else { - var msg = ERRNO_MESSAGES[errnum]; - for (var i = 0; i < msg.length; i++) { - HEAP8[(((strerrbuf)+(i))|0)]=msg.charCodeAt(i) - } - HEAP8[(((strerrbuf)+(i))|0)]=0 - return 0; - } - } else { - return ___setErrNo(ERRNO_CODES.EINVAL); - } - }function _strerror(errnum) { - if (!_strerror.buffer) _strerror.buffer = _malloc(256); - _strerror_r(errnum, _strerror.buffer, 256); - return _strerror.buffer; - } - function ___errno_location() { - return ___errno_state; - }function _perror(s) { - // void perror(const char *s); - // http://pubs.opengroup.org/onlinepubs/000095399/functions/perror.html - var stdout = HEAP32[((_stdout)>>2)]; - if (s) { - _fputs(s, stdout); - _fputc(58, stdout); - _fputc(32, stdout); - } - var errnum = HEAP32[((___errno_location())>>2)]; - _puts(_strerror(errnum)); - } - function _popen(command, mode) { - // FILE *popen(const char *command, const char *mode); - // http://pubs.opengroup.org/onlinepubs/000095399/functions/popen.html - // We allow only one process, so no pipes. - ___setErrNo(ERRNO_CODES.EMFILE); - return 0; - } - var ___dirent_struct_layout={__size__:1040,d_ino:0,d_name:4,d_off:1028,d_reclen:1032,d_type:1036};function _open(path, oflag, varargs) { - // int open(const char *path, int oflag, ...); - // http://pubs.opengroup.org/onlinepubs/009695399/functions/open.html - // NOTE: This implementation tries to mimic glibc rather than strictly - // following the POSIX standard. - var mode = HEAP32[((varargs)>>2)]; - // Simplify flags. - var accessMode = oflag & 3; - var isWrite = accessMode != 0; - var isRead = accessMode != 1; - var isCreate = Boolean(oflag & 512); - var isExistCheck = Boolean(oflag & 2048); - var isTruncate = Boolean(oflag & 1024); - var isAppend = Boolean(oflag & 8); - // Verify path. - var origPath = path; - path = FS.analyzePath(Pointer_stringify(path)); - if (!path.parentExists) { - ___setErrNo(path.error); - return -1; - } - var target = path.object || null; - var finalPath; - // Verify the file exists, create if needed and allowed. - if (target) { - if (isCreate && isExistCheck) { - ___setErrNo(ERRNO_CODES.EEXIST); - return -1; - } - if ((isWrite || isCreate || isTruncate) && target.isFolder) { - ___setErrNo(ERRNO_CODES.EISDIR); - return -1; - } - if (isRead && !target.read || isWrite && !target.write) { - ___setErrNo(ERRNO_CODES.EACCES); - return -1; - } - if (isTruncate && !target.isDevice) { - target.contents = []; - } else { - if (!FS.forceLoadFile(target)) { - ___setErrNo(ERRNO_CODES.EIO); - return -1; - } - } - finalPath = path.path; - } else { - if (!isCreate) { - ___setErrNo(ERRNO_CODES.ENOENT); - return -1; - } - if (!path.parentObject.write) { - ___setErrNo(ERRNO_CODES.EACCES); - return -1; - } - target = FS.createDataFile(path.parentObject, path.name, [], - mode & 0x100, mode & 0x80); // S_IRUSR, S_IWUSR. - finalPath = path.parentPath + '/' + path.name; - } - // Actually create an open stream. - var id; - if (target.isFolder) { - var entryBuffer = 0; - if (___dirent_struct_layout) { - entryBuffer = _malloc(___dirent_struct_layout.__size__); - } - var contents = []; - for (var key in target.contents) contents.push(key); - id = FS.createFileHandle({ - path: finalPath, - object: target, - // An index into contents. Special values: -2 is ".", -1 is "..". - position: -2, - isRead: true, - isWrite: false, - isAppend: false, - error: false, - eof: false, - ungotten: [], - // Folder-specific properties: - // Remember the contents at the time of opening in an array, so we can - // seek between them relying on a single order. - contents: contents, - // Each stream has its own area for readdir() returns. - currentEntry: entryBuffer - }); - } else { - id = FS.createFileHandle({ - path: finalPath, - object: target, - position: 0, - isRead: isRead, - isWrite: isWrite, - isAppend: isAppend, - error: false, - eof: false, - ungotten: [] - }); - } - return id; - }function _fopen(filename, mode) { - // FILE *fopen(const char *restrict filename, const char *restrict mode); - // http://pubs.opengroup.org/onlinepubs/000095399/functions/fopen.html - var flags; - mode = Pointer_stringify(mode); - if (mode[0] == 'r') { - if (mode.indexOf('+') != -1) { - flags = 2; - } else { - flags = 0; - } - } else if (mode[0] == 'w') { - if (mode.indexOf('+') != -1) { - flags = 2; - } else { - flags = 1; - } - flags |= 512; - flags |= 1024; - } else if (mode[0] == 'a') { - if (mode.indexOf('+') != -1) { - flags = 2; - } else { - flags = 1; - } - flags |= 512; - flags |= 8; - } else { - ___setErrNo(ERRNO_CODES.EINVAL); - return 0; - } - var ret = _open(filename, flags, allocate([0x1FF, 0, 0, 0], 'i32', ALLOC_STACK)); // All creation permissions. - return (ret == -1) ? 0 : ret; - } - var _putc=_fputc; - function _getcwd(buf, size) { - // char *getcwd(char *buf, size_t size); - // http://pubs.opengroup.org/onlinepubs/000095399/functions/getcwd.html - if (size == 0) { - ___setErrNo(ERRNO_CODES.EINVAL); - return 0; - } else if (size < FS.currentPath.length + 1) { - ___setErrNo(ERRNO_CODES.ERANGE); - return 0; - } else { - for (var i = 0; i < FS.currentPath.length; i++) { - HEAP8[(((buf)+(i))|0)]=FS.currentPath.charCodeAt(i) - } - HEAP8[(((buf)+(i))|0)]=0 - return buf; - } - } - var _environ=allocate(1, "i32*", ALLOC_STATIC);var ___environ=_environ;function ___buildEnvironment(env) { - // WARNING: Arbitrary limit! - var MAX_ENV_VALUES = 64; - var TOTAL_ENV_SIZE = 1024; - // Statically allocate memory for the environment. - var poolPtr; - var envPtr; - if (!___buildEnvironment.called) { - ___buildEnvironment.called = true; - // Set default values. Use string keys for Closure Compiler compatibility. - ENV['USER'] = 'root'; - ENV['PATH'] = '/'; - ENV['PWD'] = '/'; - ENV['HOME'] = '/home/emscripten'; - ENV['LANG'] = 'en_US.UTF-8'; - ENV['_'] = './this.program'; - // Allocate memory. - poolPtr = allocate(TOTAL_ENV_SIZE, 'i8', ALLOC_STATIC); - envPtr = allocate(MAX_ENV_VALUES * 4, - 'i8*', ALLOC_STATIC); - HEAP32[((envPtr)>>2)]=poolPtr - HEAP32[((_environ)>>2)]=envPtr; - } else { - envPtr = HEAP32[((_environ)>>2)]; - poolPtr = HEAP32[((envPtr)>>2)]; - } - // Collect key=value lines. - var strings = []; - var totalSize = 0; - for (var key in env) { - if (typeof env[key] === 'string') { - var line = key + '=' + env[key]; - strings.push(line); - totalSize += line.length; - } - } - if (totalSize > TOTAL_ENV_SIZE) { - throw new Error('Environment size exceeded TOTAL_ENV_SIZE!'); - } - // Make new. - var ptrSize = 4; - for (var i = 0; i < strings.length; i++) { - var line = strings[i]; - for (var j = 0; j < line.length; j++) { - HEAP8[(((poolPtr)+(j))|0)]=line.charCodeAt(j); - } - HEAP8[(((poolPtr)+(j))|0)]=0; - HEAP32[(((envPtr)+(i * ptrSize))>>2)]=poolPtr; - poolPtr += line.length + 1; - } - HEAP32[(((envPtr)+(strings.length * ptrSize))>>2)]=0; - }var ENV={};function _getenv(name) { - // char *getenv(const char *name); - // http://pubs.opengroup.org/onlinepubs/009695399/functions/getenv.html - if (name === 0) return 0; - name = Pointer_stringify(name); - if (!ENV.hasOwnProperty(name)) return 0; - if (_getenv.ret) _free(_getenv.ret); - _getenv.ret = allocate(intArrayFromString(ENV[name]), 'i8', ALLOC_NORMAL); - return _getenv.ret; - } - function _strncat(pdest, psrc, num) { - var len = _strlen(pdest); - var i = 0; - while(1) { - HEAP8[((pdest+len+i)|0)]=HEAP8[((psrc+i)|0)]; - if (HEAP8[(((pdest)+(len+i))|0)] == 0) break; - i ++; - if (i == num) { - HEAP8[(((pdest)+(len+i))|0)]=0 - break; - } - } - return pdest; - } - function _printf(format, varargs) { - // int printf(const char *restrict format, ...); - // http://pubs.opengroup.org/onlinepubs/000095399/functions/printf.html - var stdout = HEAP32[((_stdout)>>2)]; - return _fprintf(stdout, format, varargs); - } - function _system(command) { - // int system(const char *command); - // http://pubs.opengroup.org/onlinepubs/000095399/functions/system.html - // Can't call external programs. - ___setErrNo(ERRNO_CODES.EAGAIN); - return -1; - } - function _isalpha(chr) { - return (chr >= 97 && chr <= 122) || - (chr >= 65 && chr <= 90); - } - function _isalnum(chr) { - return (chr >= 48 && chr <= 57) || - (chr >= 97 && chr <= 122) || - (chr >= 65 && chr <= 90); - } - var _getc=_fgetc; - function _chdir(path) { - // int chdir(const char *path); - // http://pubs.opengroup.org/onlinepubs/000095399/functions/chdir.html - // NOTE: The path argument may be a string, to simplify fchdir(). - if (typeof path !== 'string') path = Pointer_stringify(path); - path = FS.analyzePath(path); - if (!path.exists) { - ___setErrNo(path.error); - return -1; - } else if (!path.object.isFolder) { - ___setErrNo(ERRNO_CODES.ENOTDIR); - return -1; - } else { - FS.currentPath = path.path; - return 0; - } - } - function _tmpnam(s, dir, prefix) { - // char *tmpnam(char *s); - // http://pubs.opengroup.org/onlinepubs/000095399/functions/tmpnam.html - // NOTE: The dir and prefix arguments are for internal use only. - var folder = FS.findObject(dir || '/tmp'); - if (!folder || !folder.isFolder) { - dir = '/tmp'; - folder = FS.findObject(dir); - if (!folder || !folder.isFolder) return 0; - } - var name = prefix || 'file'; - do { - name += String.fromCharCode(65 + Math.floor(Math.random() * 25)); - } while (name in folder.contents); - var result = dir + '/' + name; - if (!_tmpnam.buffer) _tmpnam.buffer = _malloc(256); - if (!s) s = _tmpnam.buffer; - for (var i = 0; i < result.length; i++) { - HEAP8[(((s)+(i))|0)]=result.charCodeAt(i); - } - HEAP8[(((s)+(i))|0)]=0; - return s; - }function _tmpfile() { - // FILE *tmpfile(void); - // http://pubs.opengroup.org/onlinepubs/000095399/functions/tmpfile.html - // TODO: Delete the created file on closing. - if (_tmpfile.mode) { - _tmpfile.mode = allocate(intArrayFromString('w+'), 'i8', ALLOC_NORMAL); - } - return _fopen(_tmpnam(0), _tmpfile.mode); - } - function _memchr(ptr, chr, num) { - chr = unSign(chr); - for (var i = 0; i < num; i++) { - if (HEAP8[(ptr)] == chr) return ptr; - ptr++; - } - return 0; - } - var _sqrt=Math.sqrt; - function _fileno(stream) { - // int fileno(FILE *stream); - // http://pubs.opengroup.org/onlinepubs/000095399/functions/fileno.html - // We use file descriptor numbers and FILE* streams interchangeably. - return stream; - } - function _fdopen(fildes, mode) { - // FILE *fdopen(int fildes, const char *mode); - // http://pubs.opengroup.org/onlinepubs/000095399/functions/fdopen.html - if (FS.streams[fildes]) { - var stream = FS.streams[fildes]; - mode = Pointer_stringify(mode); - if ((mode.indexOf('w') != -1 && !stream.isWrite) || - (mode.indexOf('r') != -1 && !stream.isRead) || - (mode.indexOf('a') != -1 && !stream.isAppend) || - (mode.indexOf('+') != -1 && (!stream.isRead || !stream.isWrite))) { - ___setErrNo(ERRNO_CODES.EINVAL); - return 0; - } else { - stream.error = false; - stream.eof = false; - return fildes; - } - } else { - ___setErrNo(ERRNO_CODES.EBADF); - return 0; - } - } - var ___stat_struct_layout={__size__:68,st_dev:0,st_ino:4,st_mode:8,st_nlink:12,st_uid:16,st_gid:20,st_rdev:24,st_size:28,st_atime:32,st_spare1:36,st_mtime:40,st_spare2:44,st_ctime:48,st_spare3:52,st_blksize:56,st_blocks:60,st_spare4:64};function _stat(path, buf, dontResolveLastLink) { - // http://pubs.opengroup.org/onlinepubs/7908799/xsh/stat.html - // int stat(const char *path, struct stat *buf); - // NOTE: dontResolveLastLink is a shortcut for lstat(). It should never be - // used in client code. - var obj = FS.findObject(Pointer_stringify(path), dontResolveLastLink); - if (obj === null || !FS.forceLoadFile(obj)) return -1; - var offsets = ___stat_struct_layout; - // Constants. - HEAP32[(((buf)+(offsets.st_nlink))>>2)]=1 - HEAP32[(((buf)+(offsets.st_uid))>>2)]=0 - HEAP32[(((buf)+(offsets.st_gid))>>2)]=0 - HEAP32[(((buf)+(offsets.st_blksize))>>2)]=4096 - // Variables. - HEAP32[(((buf)+(offsets.st_ino))>>2)]=obj.inodeNumber - var time = Math.floor(obj.timestamp / 1000); - if (offsets.st_atime === undefined) { - offsets.st_atime = offsets.st_atim.tv_sec; - offsets.st_mtime = offsets.st_mtim.tv_sec; - offsets.st_ctime = offsets.st_ctim.tv_sec; - var nanosec = (obj.timestamp % 1000) * 1000; - HEAP32[(((buf)+(offsets.st_atim.tv_nsec))>>2)]=nanosec - HEAP32[(((buf)+(offsets.st_mtim.tv_nsec))>>2)]=nanosec - HEAP32[(((buf)+(offsets.st_ctim.tv_nsec))>>2)]=nanosec - } - HEAP32[(((buf)+(offsets.st_atime))>>2)]=time - HEAP32[(((buf)+(offsets.st_mtime))>>2)]=time - HEAP32[(((buf)+(offsets.st_ctime))>>2)]=time - var mode = 0; - var size = 0; - var blocks = 0; - var dev = 0; - var rdev = 0; - if (obj.isDevice) { - // Device numbers reuse inode numbers. - dev = rdev = obj.inodeNumber; - size = blocks = 0; - mode = 0x2000; // S_IFCHR. - } else { - dev = 1; - rdev = 0; - // NOTE: In our implementation, st_blocks = Math.ceil(st_size/st_blksize), - // but this is not required by the standard. - if (obj.isFolder) { - size = 4096; - blocks = 1; - mode = 0x4000; // S_IFDIR. - } else { - var data = obj.contents || obj.link; - size = data.length; - blocks = Math.ceil(data.length / 4096); - mode = obj.link === undefined ? 0x8000 : 0xA000; // S_IFREG, S_IFLNK. - } - } - HEAP32[(((buf)+(offsets.st_dev))>>2)]=dev; - HEAP32[(((buf)+(offsets.st_rdev))>>2)]=rdev; - HEAP32[(((buf)+(offsets.st_size))>>2)]=size - HEAP32[(((buf)+(offsets.st_blocks))>>2)]=blocks - if (obj.read) mode |= 0x16D; // S_IRUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH. - if (obj.write) mode |= 0x92; // S_IWUSR | S_IWGRP | S_IWOTH. - HEAP32[(((buf)+(offsets.st_mode))>>2)]=mode - return 0; - } - function _feof(stream) { - // int feof(FILE *stream); - // http://pubs.opengroup.org/onlinepubs/000095399/functions/feof.html - return Number(FS.streams[stream] && FS.streams[stream].eof); - } - function _setlocale(category, locale) { - if (!_setlocale.ret) _setlocale.ret = allocate([0], 'i8', ALLOC_NORMAL); - return _setlocale.ret; - } - function ___fpclassifyf(x) { - if (isNaN(x)) return 0; - if (!isFinite(x)) return 1; - if (x == 0) return 2; - // FP_SUBNORMAL..? - return 4; - }var ___fpclassifyd=___fpclassifyf; - var _cos=Math.cos; - var _sin=Math.sin; - Module["_tolower"] = _tolower; - Module["_strncasecmp"] = _strncasecmp; - Module["_strcasecmp"] = _strcasecmp; - function _strrchr(ptr, chr) { - var ptr2 = ptr + _strlen(ptr); - do { - if (HEAP8[(ptr2)] == chr) return ptr2; - ptr2--; - } while (ptr2 >= ptr); - return 0; - } - function _strspn(pstr, pset) { - var str = pstr, set, strcurr, setcurr; - while (1) { - strcurr = HEAP8[(str)]; - if (!strcurr) return str - pstr; - set = pset; - while (1) { - setcurr = HEAP8[(set)]; - if (!setcurr || setcurr == strcurr) break; - set++; - } - if (!setcurr) return str - pstr; - str++; - } - } - function _strpbrk(ptr1, ptr2) { - var curr; - var searchSet = {}; - while (1) { - var curr = HEAP8[((ptr2++)|0)]; - if (!curr) break; - searchSet[curr] = 1; - } - while (1) { - curr = HEAP8[(ptr1)]; - if (!curr) break; - if (curr in searchSet) return ptr1; - ptr1++; - } - return 0; - } - function __isFloat(text) { - return !!(/^[+-]?[0-9]*\.?[0-9]+([eE][+-]?[0-9]+)?$/.exec(text)); - }function __scanString(format, get, unget, varargs) { - if (!__scanString.whiteSpace) { - __scanString.whiteSpace = {}; - __scanString.whiteSpace[32] = 1; - __scanString.whiteSpace[9] = 1; - __scanString.whiteSpace[10] = 1; - __scanString.whiteSpace[11] = 1; - __scanString.whiteSpace[12] = 1; - __scanString.whiteSpace[13] = 1; - __scanString.whiteSpace[' '] = 1; - __scanString.whiteSpace['\t'] = 1; - __scanString.whiteSpace['\n'] = 1; - __scanString.whiteSpace['\v'] = 1; - __scanString.whiteSpace['\f'] = 1; - __scanString.whiteSpace['\r'] = 1; - } - // Supports %x, %4x, %d.%d, %lld, %s, %f, %lf. - // TODO: Support all format specifiers. - format = Pointer_stringify(format); - var soFar = 0; - if (format.indexOf('%n') >= 0) { - // need to track soFar - var _get = get; - get = function() { - soFar++; - return _get(); - } - var _unget = unget; - unget = function() { - soFar--; - return _unget(); - } - } - var formatIndex = 0; - var argsi = 0; - var fields = 0; - var argIndex = 0; - var next; - mainLoop: - for (var formatIndex = 0; formatIndex < format.length;) { - if (format[formatIndex] === '%' && format[formatIndex+1] == 'n') { - var argPtr = HEAP32[(((varargs)+(argIndex))>>2)]; - argIndex += Runtime.getAlignSize('void*', null, true); - HEAP32[((argPtr)>>2)]=soFar; - formatIndex += 2; - continue; - } - // TODO: Support strings like "%5c" etc. - if (format[formatIndex] === '%' && format[formatIndex+1] == 'c') { - var argPtr = HEAP32[(((varargs)+(argIndex))>>2)]; - argIndex += Runtime.getAlignSize('void*', null, true); - fields++; - next = get(); - HEAP8[(argPtr)]=next - formatIndex += 2; - continue; - } - // remove whitespace - while (1) { - next = get(); - if (next == 0) return fields; - if (!(next in __scanString.whiteSpace)) break; - } - unget(); - if (format[formatIndex] === '%') { - formatIndex++; - var suppressAssignment = false; - if (format[formatIndex] == '*') { - suppressAssignment = true; - formatIndex++; - } - var maxSpecifierStart = formatIndex; - while (format[formatIndex].charCodeAt(0) >= 48 && - format[formatIndex].charCodeAt(0) <= 57) { - formatIndex++; - } - var max_; - if (formatIndex != maxSpecifierStart) { - max_ = parseInt(format.slice(maxSpecifierStart, formatIndex), 10); - } - var long_ = false; - var half = false; - var longLong = false; - if (format[formatIndex] == 'l') { - long_ = true; - formatIndex++; - if (format[formatIndex] == 'l') { - longLong = true; - formatIndex++; - } - } else if (format[formatIndex] == 'h') { - half = true; - formatIndex++; - } - var type = format[formatIndex]; - formatIndex++; - var curr = 0; - var buffer = []; - // Read characters according to the format. floats are trickier, they may be in an unfloat state in the middle, then be a valid float later - if (type == 'f' || type == 'e' || type == 'g' || - type == 'F' || type == 'E' || type == 'G') { - var last = 0; - next = get(); - while (next > 0) { - buffer.push(String.fromCharCode(next)); - if (__isFloat(buffer.join(''))) { - last = buffer.length; - } - next = get(); - } - for (var i = 0; i < buffer.length - last + 1; i++) { - unget(); - } - buffer.length = last; - } else { - next = get(); - var first = true; - while ((curr < max_ || isNaN(max_)) && next > 0) { - if (!(next in __scanString.whiteSpace) && // stop on whitespace - (type == 's' || - ((type === 'd' || type == 'u' || type == 'i') && ((next >= 48 && next <= 57) || - (first && next == 45))) || - ((type === 'x' || type === 'X') && (next >= 48 && next <= 57 || - next >= 97 && next <= 102 || - next >= 65 && next <= 70))) && - (formatIndex >= format.length || next !== format[formatIndex].charCodeAt(0))) { // Stop when we read something that is coming up - buffer.push(String.fromCharCode(next)); - next = get(); - curr++; - first = false; - } else { - break; - } - } - unget(); - } - if (buffer.length === 0) return 0; // Failure. - if (suppressAssignment) continue; - var text = buffer.join(''); - var argPtr = HEAP32[(((varargs)+(argIndex))>>2)]; - argIndex += Runtime.getAlignSize('void*', null, true); - switch (type) { - case 'd': case 'u': case 'i': - if (half) { - HEAP16[((argPtr)>>1)]=parseInt(text, 10); - } else if (longLong) { - (tempI64 = [parseInt(text, 10)>>>0,Math.min(Math.floor((parseInt(text, 10))/(+(4294967296))), (+(4294967295)))>>>0],HEAP32[((argPtr)>>2)]=tempI64[0],HEAP32[(((argPtr)+(4))>>2)]=tempI64[1]); - } else { - HEAP32[((argPtr)>>2)]=parseInt(text, 10); - } - break; - case 'X': - case 'x': - HEAP32[((argPtr)>>2)]=parseInt(text, 16) - break; - case 'F': - case 'f': - case 'E': - case 'e': - case 'G': - case 'g': - case 'E': - // fallthrough intended - if (long_) { - HEAPF64[((argPtr)>>3)]=parseFloat(text) - } else { - HEAPF32[((argPtr)>>2)]=parseFloat(text) - } - break; - case 's': - var array = intArrayFromString(text); - for (var j = 0; j < array.length; j++) { - HEAP8[(((argPtr)+(j))|0)]=array[j] - } - break; - } - fields++; - } else if (format[formatIndex] in __scanString.whiteSpace) { - next = get(); - while (next in __scanString.whiteSpace) { - if (next <= 0) break mainLoop; // End of input. - next = get(); - } - unget(next); - formatIndex++; - } else { - // Not a specifier. - next = get(); - if (format[formatIndex].charCodeAt(0) !== next) { - unget(next); - break mainLoop; - } - formatIndex++; - } - } - return fields; - }function _sscanf(s, format, varargs) { - // int sscanf(const char *restrict s, const char *restrict format, ... ); - // http://pubs.opengroup.org/onlinepubs/000095399/functions/scanf.html - var index = 0; - var get = function() { return HEAP8[(((s)+(index++))|0)]; }; - var unget = function() { index--; }; - return __scanString(format, get, unget, varargs); - } - var _atan2=Math.atan2; - var ___errno=___errno_location; - function _putchar(c) { - // int putchar(int c); - // http://pubs.opengroup.org/onlinepubs/000095399/functions/putchar.html - return _fputc(c, HEAP32[((_stdout)>>2)]); - } - Module["_saveSetjmp"] = _saveSetjmp; - Module["_testSetjmp"] = _testSetjmp;var _setjmp=undefined; - function _signal(sig, func) { - // TODO - return 0; - } - function _toupper(chr) { - if (chr >= 97 && chr <= 122) { - return chr - 97 + 65; - } else { - return chr; - } - } - function _longjmp(env, value) { - asm['setThrew'](env, value || 1); - throw 'longjmp'; - } - function _time(ptr) { - var ret = Math.floor(Date.now()/1000); - if (ptr) { - HEAP32[((ptr)>>2)]=ret - } - return ret; - } - var ___tm_struct_layout={__size__:44,tm_sec:0,tm_min:4,tm_hour:8,tm_mday:12,tm_mon:16,tm_year:20,tm_wday:24,tm_yday:28,tm_isdst:32,tm_gmtoff:36,tm_zone:40}; - var ___tm_current=allocate(4*26, "i8", ALLOC_STATIC); - var ___tm_timezones={}; - var __tzname=allocate(8, "i32*", ALLOC_STATIC); - var __daylight=allocate(1, "i32*", ALLOC_STATIC); - var __timezone=allocate(1, "i32*", ALLOC_STATIC);function _tzset() { - // TODO: Use (malleable) environment variables instead of system settings. - if (_tzset.called) return; - _tzset.called = true; - HEAP32[((__timezone)>>2)]=-(new Date()).getTimezoneOffset() * 60 - var winter = new Date(2000, 0, 1); - var summer = new Date(2000, 6, 1); - HEAP32[((__daylight)>>2)]=Number(winter.getTimezoneOffset() != summer.getTimezoneOffset()) - var winterName = 'GMT'; // XXX do not rely on browser timezone info, it is very unpredictable | winter.toString().match(/\(([A-Z]+)\)/)[1]; - var summerName = 'GMT'; // XXX do not rely on browser timezone info, it is very unpredictable | summer.toString().match(/\(([A-Z]+)\)/)[1]; - var winterNamePtr = allocate(intArrayFromString(winterName), 'i8', ALLOC_NORMAL); - var summerNamePtr = allocate(intArrayFromString(summerName), 'i8', ALLOC_NORMAL); - HEAP32[((__tzname)>>2)]=winterNamePtr - HEAP32[(((__tzname)+(4))>>2)]=summerNamePtr - }function _localtime_r(time, tmPtr) { - _tzset(); - var offsets = ___tm_struct_layout; - var date = new Date(HEAP32[((time)>>2)]*1000); - HEAP32[(((tmPtr)+(offsets.tm_sec))>>2)]=date.getSeconds() - HEAP32[(((tmPtr)+(offsets.tm_min))>>2)]=date.getMinutes() - HEAP32[(((tmPtr)+(offsets.tm_hour))>>2)]=date.getHours() - HEAP32[(((tmPtr)+(offsets.tm_mday))>>2)]=date.getDate() - HEAP32[(((tmPtr)+(offsets.tm_mon))>>2)]=date.getMonth() - HEAP32[(((tmPtr)+(offsets.tm_year))>>2)]=date.getFullYear()-1900 - HEAP32[(((tmPtr)+(offsets.tm_wday))>>2)]=date.getDay() - var start = new Date(date.getFullYear(), 0, 1); - var yday = Math.floor((date.getTime() - start.getTime()) / (1000 * 60 * 60 * 24)); - HEAP32[(((tmPtr)+(offsets.tm_yday))>>2)]=yday - HEAP32[(((tmPtr)+(offsets.tm_gmtoff))>>2)]=start.getTimezoneOffset() * 60 - var dst = Number(start.getTimezoneOffset() != date.getTimezoneOffset()); - HEAP32[(((tmPtr)+(offsets.tm_isdst))>>2)]=dst - var timezone = 'GMT'; // XXX do not rely on browser timezone info, it is very unpredictable | date.toString().match(/\(([A-Z]+)\)/)[1]; - if (!(timezone in ___tm_timezones)) { - ___tm_timezones[timezone] = allocate(intArrayFromString(timezone), 'i8', ALLOC_NORMAL); - } - HEAP32[(((tmPtr)+(offsets.tm_zone))>>2)]=___tm_timezones[timezone] - return tmPtr; - }function _localtime(time) { - return _localtime_r(time, ___tm_current); - } - var ___tm_formatted=allocate(4*26, "i8", ALLOC_STATIC); - function _mktime(tmPtr) { - _tzset(); - var offsets = ___tm_struct_layout; - var year = HEAP32[(((tmPtr)+(offsets.tm_year))>>2)]; - var timestamp = new Date(year >= 1900 ? year : year + 1900, - HEAP32[(((tmPtr)+(offsets.tm_mon))>>2)], - HEAP32[(((tmPtr)+(offsets.tm_mday))>>2)], - HEAP32[(((tmPtr)+(offsets.tm_hour))>>2)], - HEAP32[(((tmPtr)+(offsets.tm_min))>>2)], - HEAP32[(((tmPtr)+(offsets.tm_sec))>>2)], - 0).getTime() / 1000; - HEAP32[(((tmPtr)+(offsets.tm_wday))>>2)]=new Date(timestamp).getDay() - var yday = Math.round((timestamp - (new Date(year, 0, 1)).getTime()) / (1000 * 60 * 60 * 24)); - HEAP32[(((tmPtr)+(offsets.tm_yday))>>2)]=yday - return timestamp; - }function _asctime_r(tmPtr, buf) { - var date = new Date(_mktime(tmPtr)*1000); - var formatted = date.toString(); - var datePart = formatted.replace(/\d{4}.*/, '').replace(/ 0/, ' '); - var timePart = formatted.match(/\d{2}:\d{2}:\d{2}/)[0]; - formatted = datePart + timePart + ' ' + date.getFullYear() + '\n'; - formatted.split('').forEach(function(chr, index) { - HEAP8[(((buf)+(index))|0)]=chr.charCodeAt(0) - }); - HEAP8[(((buf)+(25))|0)]=0 - return buf; - }function _asctime(tmPtr) { - return _asctime_r(tmPtr, ___tm_formatted); - }function _ctime(timer) { - return _asctime(_localtime(timer)); - } - var _llvm_va_start=undefined; - function _vfprintf(s, f, va_arg) { - return _fprintf(s, f, HEAP32[((va_arg)>>2)]); - } - function _llvm_va_end() {} - function _rename(old, new_) { - // int rename(const char *old, const char *new); - // http://pubs.opengroup.org/onlinepubs/000095399/functions/rename.html - var oldObj = FS.analyzePath(Pointer_stringify(old)); - var newObj = FS.analyzePath(Pointer_stringify(new_)); - if (newObj.path == oldObj.path) { - return 0; - } else if (!oldObj.exists) { - ___setErrNo(oldObj.error); - return -1; - } else if (oldObj.isRoot || oldObj.path == FS.currentPath) { - ___setErrNo(ERRNO_CODES.EBUSY); - return -1; - } else if (newObj.parentPath && - newObj.parentPath.indexOf(oldObj.path) == 0) { - ___setErrNo(ERRNO_CODES.EINVAL); - return -1; - } else if (newObj.exists && newObj.object.isFolder) { - ___setErrNo(ERRNO_CODES.EISDIR); - return -1; - } else { - delete oldObj.parentObject.contents[oldObj.name]; - newObj.parentObject.contents[newObj.name] = oldObj.object; - return 0; - } - } - function _strftime(s, maxsize, format, timeptr) { - // size_t strftime(char *restrict s, size_t maxsize, const char *restrict format, const struct tm *restrict timeptr); - // http://pubs.opengroup.org/onlinepubs/009695399/functions/strftime.html - // TODO: Implement. - return 0; - } - function _qsort(base, num, size, cmp) { - if (num == 0 || size == 0) return; - // forward calls to the JavaScript sort method - // first, sort the items logically - var comparator = function(x, y) { - return Runtime.dynCall('iii', cmp, [x, y]); - } - var keys = []; - for (var i = 0; i < num; i++) keys.push(i); - keys.sort(function(a, b) { - return comparator(base+a*size, base+b*size); - }); - // apply the sort - var temp = _malloc(num*size); - _memcpy(temp, base, num*size); - for (var i = 0; i < num; i++) { - if (keys[i] == i) continue; // already in place - _memcpy(base+i*size, temp+keys[i]*size, size); - } - _free(temp); - } - function _gettimeofday(ptr) { - // %struct.timeval = type { i32, i32 } - var now = Date.now(); - HEAP32[((ptr)>>2)]=Math.floor(now/1000); // seconds - HEAP32[(((ptr)+(4))>>2)]=Math.floor((now-1000*Math.floor(now/1000))*1000); // microseconds - return 0; - } - function _opendir(dirname) { - // DIR *opendir(const char *dirname); - // http://pubs.opengroup.org/onlinepubs/007908799/xsh/opendir.html - // NOTE: Calculating absolute path redundantly since we need to associate it - // with the opened stream. - var path = FS.absolutePath(Pointer_stringify(dirname)); - if (path === null) { - ___setErrNo(ERRNO_CODES.ENOENT); - return 0; - } - var target = FS.findObject(path); - if (target === null) return 0; - if (!target.isFolder) { - ___setErrNo(ERRNO_CODES.ENOTDIR); - return 0; - } else if (!target.read) { - ___setErrNo(ERRNO_CODES.EACCES); - return 0; - } - var contents = []; - for (var key in target.contents) contents.push(key); - var id = FS.createFileHandle({ - path: path, - object: target, - // An index into contents. Special values: -2 is ".", -1 is "..". - position: -2, - isRead: true, - isWrite: false, - isAppend: false, - error: false, - eof: false, - ungotten: [], - // Folder-specific properties: - // Remember the contents at the time of opening in an array, so we can - // seek between them relying on a single order. - contents: contents, - // Each stream has its own area for readdir() returns. - currentEntry: _malloc(___dirent_struct_layout.__size__) - }); - return id; - } - function _readdir_r(dirp, entry, result) { - // int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result); - // http://pubs.opengroup.org/onlinepubs/007908799/xsh/readdir_r.html - if (!FS.streams[dirp] || !FS.streams[dirp].object.isFolder) { - return ___setErrNo(ERRNO_CODES.EBADF); - } - var stream = FS.streams[dirp]; - var loc = stream.position; - var entries = 0; - for (var key in stream.contents) entries++; - if (loc < -2 || loc >= entries) { - HEAP32[((result)>>2)]=0 - } else { - var name, inode, type; - if (loc === -2) { - name = '.'; - inode = 1; // Really undefined. - type = 4; //DT_DIR - } else if (loc === -1) { - name = '..'; - inode = 1; // Really undefined. - type = 4; //DT_DIR - } else { - var object; - name = stream.contents[loc]; - object = stream.object.contents[name]; - inode = object.inodeNumber; - type = object.isDevice ? 2 // DT_CHR, character device. - : object.isFolder ? 4 // DT_DIR, directory. - : object.link !== undefined ? 10 // DT_LNK, symbolic link. - : 8; // DT_REG, regular file. - } - stream.position++; - var offsets = ___dirent_struct_layout; - HEAP32[(((entry)+(offsets.d_ino))>>2)]=inode - HEAP32[(((entry)+(offsets.d_off))>>2)]=stream.position - HEAP32[(((entry)+(offsets.d_reclen))>>2)]=name.length + 1 - for (var i = 0; i < name.length; i++) { - HEAP8[(((entry + offsets.d_name)+(i))|0)]=name.charCodeAt(i) - } - HEAP8[(((entry + offsets.d_name)+(i))|0)]=0 - HEAP8[(((entry)+(offsets.d_type))|0)]=type - HEAP32[((result)>>2)]=entry - } - return 0; - }function _readdir(dirp) { - // struct dirent *readdir(DIR *dirp); - // http://pubs.opengroup.org/onlinepubs/007908799/xsh/readdir_r.html - if (!FS.streams[dirp] || !FS.streams[dirp].object.isFolder) { - ___setErrNo(ERRNO_CODES.EBADF); - return 0; - } else { - if (!_readdir.result) _readdir.result = _malloc(4); - _readdir_r(dirp, FS.streams[dirp].currentEntry, _readdir.result); - if (HEAP32[((_readdir.result)>>2)] === 0) { - return 0; - } else { - return FS.streams[dirp].currentEntry; - } - } - } - function _closedir(dirp) { - // int closedir(DIR *dirp); - // http://pubs.opengroup.org/onlinepubs/007908799/xsh/closedir.html - if (!FS.streams[dirp] || !FS.streams[dirp].object.isFolder) { - return ___setErrNo(ERRNO_CODES.EBADF); - } else { - _free(FS.streams[dirp].currentEntry); - FS.streams[dirp] = null; - return 0; - } - } - function _ungetc(c, stream) { - // int ungetc(int c, FILE *stream); - // http://pubs.opengroup.org/onlinepubs/000095399/functions/ungetc.html - if (FS.streams[stream]) { - c = unSign(c & 0xFF); - FS.streams[stream].ungotten.push(c); - return c; - } else { - return -1; - } - } - function _fmod(x, y) { - return x % y; - } - function _gmtime_r(time, tmPtr) { - var date = new Date(HEAP32[((time)>>2)]*1000); - var offsets = ___tm_struct_layout; - HEAP32[(((tmPtr)+(offsets.tm_sec))>>2)]=date.getUTCSeconds() - HEAP32[(((tmPtr)+(offsets.tm_min))>>2)]=date.getUTCMinutes() - HEAP32[(((tmPtr)+(offsets.tm_hour))>>2)]=date.getUTCHours() - HEAP32[(((tmPtr)+(offsets.tm_mday))>>2)]=date.getUTCDate() - HEAP32[(((tmPtr)+(offsets.tm_mon))>>2)]=date.getUTCMonth() - HEAP32[(((tmPtr)+(offsets.tm_year))>>2)]=date.getUTCFullYear()-1900 - HEAP32[(((tmPtr)+(offsets.tm_wday))>>2)]=date.getUTCDay() - HEAP32[(((tmPtr)+(offsets.tm_gmtoff))>>2)]=0 - HEAP32[(((tmPtr)+(offsets.tm_isdst))>>2)]=0 - var start = new Date(date.getFullYear(), 0, 1); - var yday = Math.round((date.getTime() - start.getTime()) / (1000 * 60 * 60 * 24)); - HEAP32[(((tmPtr)+(offsets.tm_yday))>>2)]=yday - var timezone = "GMT"; - if (!(timezone in ___tm_timezones)) { - ___tm_timezones[timezone] = allocate(intArrayFromString(timezone), 'i8', ALLOC_NORMAL); - } - HEAP32[(((tmPtr)+(offsets.tm_zone))>>2)]=___tm_timezones[timezone] - return tmPtr; - }function _gmtime(time) { - return _gmtime_r(time, ___tm_current); - } - function _setvbuf(stream, buf, type, size) { - // int setvbuf(FILE *restrict stream, char *restrict buf, int type, size_t size); - // http://pubs.opengroup.org/onlinepubs/000095399/functions/setvbuf.html - // TODO: Implement custom buffering. - return 0; - }function _setbuf(stream, buf) { - // void setbuf(FILE *restrict stream, char *restrict buf); - // http://pubs.opengroup.org/onlinepubs/000095399/functions/setbuf.html - if (buf) _setvbuf(stream, buf, 0, 8192); // _IOFBF, BUFSIZ. - else _setvbuf(stream, buf, 2, 8192); // _IONBF, BUFSIZ. - } - function _atexit(func, arg) { - __ATEXIT__.unshift({ func: func, arg: arg }); - } - function _isatty(fildes) { - // int isatty(int fildes); - // http://pubs.opengroup.org/onlinepubs/000095399/functions/isatty.html - if (!FS.streams[fildes]) { - ___setErrNo(ERRNO_CODES.EBADF); - return 0; - } - if (FS.streams[fildes].isTerminal) return 1; - ___setErrNo(ERRNO_CODES.ENOTTY); - return 0; - } - var ___utsname_struct_layout={__size__:160,sysname:0,nodename:32,release:64,version:96,machine:128};function _uname(name) { - // int uname(struct utsname *name); - // http://pubs.opengroup.org/onlinepubs/009695399/functions/uname.html - function copyString(element, value) { - var offset = ___utsname_struct_layout[element]; - for (var i = 0; i < value.length; i++) { - HEAP8[(((name)+(offset + i))|0)]=value.charCodeAt(i) - } - HEAP8[(((name)+(offset + i))|0)]=0 - } - if (name === 0) { - return -1; - } else { - copyString('sysname', 'Emscripten'); - copyString('nodename', 'emscripten'); - copyString('release', '1.0'); - copyString('version', '#1'); - copyString('machine', 'x86-JS'); - return 0; - } - } - function _nl_langinfo(item) { - // char *nl_langinfo(nl_item item); - // http://pubs.opengroup.org/onlinepubs/000095399/functions/nl_langinfo.html - var result; - switch (item) { - case 0: - result = 'ANSI_X3.4-1968'; - break; - case 1: - result = '%a %b %e %H:%M:%S %Y'; - break; - case 2: - result = '%m/%d/%y'; - break; - case 3: - result = '%H:%M:%S'; - break; - case 4: - result = '%I:%M:%S %p'; - break; - case 5: - result = 'AM'; - break; - case 6: - result = 'PM'; - break; - case 7: - result = 'Sunday'; - break; - case 8: - result = 'Monday'; - break; - case 9: - result = 'Tuesday'; - break; - case 10: - result = 'Wednesday'; - break; - case 11: - result = 'Thursday'; - break; - case 12: - result = 'Friday'; - break; - case 13: - result = 'Saturday'; - break; - case 14: - result = 'Sun'; - break; - case 15: - result = 'Mon'; - break; - case 16: - result = 'Tue'; - break; - case 17: - result = 'Wed'; - break; - case 18: - result = 'Thu'; - break; - case 19: - result = 'Fri'; - break; - case 20: - result = 'Sat'; - break; - case 21: - result = 'January'; - break; - case 22: - result = 'February'; - break; - case 23: - result = 'March'; - break; - case 24: - result = 'April'; - break; - case 25: - result = 'May'; - break; - case 26: - result = 'June'; - break; - case 27: - result = 'July'; - break; - case 28: - result = 'August'; - break; - case 29: - result = 'September'; - break; - case 30: - result = 'October'; - break; - case 31: - result = 'November'; - break; - case 32: - result = 'December'; - break; - case 33: - result = 'Jan'; - break; - case 34: - result = 'Feb'; - break; - case 35: - result = 'Mar'; - break; - case 36: - result = 'Apr'; - break; - case 37: - result = 'May'; - break; - case 38: - result = 'Jun'; - break; - case 39: - result = 'Jul'; - break; - case 40: - result = 'Aug'; - break; - case 41: - result = 'Sep'; - break; - case 42: - result = 'Oct'; - break; - case 43: - result = 'Nov'; - break; - case 44: - result = 'Dec'; - break; - case 49: - result = ''; - break; - case 50: - result = '.'; - break; - case 51: - result = ''; - break; - case 52: - result = '^[yY]'; - break; - case 53: - result = '^[nN]'; - break; - case 56: - result = '-'; - break; - case 45: - case 46: - case 47: - case 48: - default: - result = ''; - break; - } - var me = _nl_langinfo; - if (!me.ret) me.ret = _malloc(32); - for (var i = 0; i < result.length; i++) { - HEAP8[(((me.ret)+(i))|0)]=result.charCodeAt(i) - } - HEAP8[(((me.ret)+(i))|0)]=0 - return me.ret; - } - function _iconv_open() { - Module['printErr']('missing function: iconv_open'); abort(-1); - } - function _iconv() { - Module['printErr']('missing function: iconv'); abort(-1); - } - function _iconv_close() { - Module['printErr']('missing function: iconv_close'); abort(-1); - } - function _localeconv() { - // %struct.timeval = type { char* decimal point, other stuff... } - // var indexes = Runtime.calculateStructAlignment({ fields: ['i32', 'i32'] }); - var me = _localeconv; - if (!me.ret) { - me.ret = allocate([allocate(intArrayFromString('.'), 'i8', ALLOC_NORMAL)], 'i8*', ALLOC_NORMAL); // just decimal point, for now - } - return me.ret; - } - function _isprint(chr) { - return 0x1F < chr && chr < 0x7F; - } - function _erfc(x) { - var MATH_TOLERANCE = 1E-12; - var ONE_SQRTPI = 0.564189583547756287; - var a = 1; - var b = x; - var c = x; - var d = x * x + 0.5; - var n = 1.0; - var q2 = b / d; - var q1, t; - if (Math.abs(x) < 2.2) { - return 1.0 - _erf(x); - } - if (x < 0) { - return 2.0 - _erfc(-x); - } - do { - t = a * n + b * x; - a = b; - b = t; - t = c * n + d * x; - c = d; - d = t; - n += 0.5; - q1 = q2; - q2 = b / d; - } while (Math.abs(q1 - q2) / q2 > MATH_TOLERANCE); - return (ONE_SQRTPI * Math.exp(- x * x) * q2); - }function _erf(x) { - var MATH_TOLERANCE = 1E-12; - var TWO_SQRTPI = 1.128379167095512574; - var sum = x; - var term = x; - var xsqr = x*x; - var j = 1; - if (Math.abs(x) > 2.2) { - return 1.0 - _erfc(x); - } - do { - term *= xsqr / j; - sum -= term / (2 * j + 1); - ++j; - term *= xsqr / j; - sum += term / (2 * j + 1); - ++j; - } while (Math.abs(term / sum) > MATH_TOLERANCE); - return (TWO_SQRTPI * sum); - } - function _lgamma() { - Module['printErr']('missing function: lgamma'); abort(-1); - } - function ___signgam() { - Module['printErr']('missing function: __signgam'); abort(-1); - } - function _modf(x, intpart) { - HEAPF64[((intpart)>>3)]=Math.floor(x) - return x - HEAPF64[((intpart)>>3)]; - } - function _cosh(x) { - var p = Math.pow(Math.E, x); - return (p + (1 / p)) / 2; - } - function _sinh(x) { - var p = Math.pow(Math.E, x); - return (p - (1 / p)) / 2; - } - var _tan=Math.tan; - var _asin=Math.asin; - var _acos=Math.acos; - var _atan=Math.atan; - function _sleep(seconds) { - // unsigned sleep(unsigned seconds); - // http://pubs.opengroup.org/onlinepubs/000095399/functions/sleep.html - return _usleep(seconds * 1e6); - } - function _strdup(ptr) { - var len = _strlen(ptr); - var newStr = _malloc(len + 1); - _memcpy(newStr, ptr, len); - HEAP8[(((newStr)+(len))|0)]=0; - return newStr; - } - function _vsnprintf(s, n, format, va_arg) { - return _snprintf(s, n, format, HEAP32[((va_arg)>>2)]); - } - function _abort() { - ABORT = true; - throw 'abort() at ' + (new Error().stack); - } - function _sysconf(name) { - // long sysconf(int name); - // http://pubs.opengroup.org/onlinepubs/009695399/functions/sysconf.html - switch(name) { - case 8: return PAGE_SIZE; - case 54: - case 56: - case 21: - case 61: - case 63: - case 22: - case 67: - case 23: - case 24: - case 25: - case 26: - case 27: - case 69: - case 28: - case 101: - case 70: - case 71: - case 29: - case 30: - case 199: - case 75: - case 76: - case 32: - case 43: - case 44: - case 80: - case 46: - case 47: - case 45: - case 48: - case 49: - case 42: - case 82: - case 33: - case 7: - case 108: - case 109: - case 107: - case 112: - case 119: - case 121: - return 200809; - case 13: - case 104: - case 94: - case 95: - case 34: - case 35: - case 77: - case 81: - case 83: - case 84: - case 85: - case 86: - case 87: - case 88: - case 89: - case 90: - case 91: - case 94: - case 95: - case 110: - case 111: - case 113: - case 114: - case 115: - case 116: - case 117: - case 118: - case 120: - case 40: - case 16: - case 79: - case 19: - return -1; - case 92: - case 93: - case 5: - case 72: - case 6: - case 74: - case 92: - case 93: - case 96: - case 97: - case 98: - case 99: - case 102: - case 103: - case 105: - return 1; - case 38: - case 66: - case 50: - case 51: - case 4: - return 1024; - case 15: - case 64: - case 41: - return 32; - case 55: - case 37: - case 17: - return 2147483647; - case 18: - case 1: - return 47839; - case 59: - case 57: - return 99; - case 68: - case 58: - return 2048; - case 0: return 2097152; - case 3: return 65536; - case 14: return 32768; - case 73: return 32767; - case 39: return 16384; - case 60: return 1000; - case 106: return 700; - case 52: return 256; - case 62: return 255; - case 2: return 100; - case 65: return 64; - case 36: return 20; - case 100: return 16; - case 20: return 6; - case 53: return 4; - case 10: return 1; - } - ___setErrNo(ERRNO_CODES.EINVAL); - return -1; - } - function _sbrk(bytes) { - // Implement a Linux-like 'memory area' for our 'process'. - // Changes the size of the memory area by |bytes|; returns the - // address of the previous top ('break') of the memory area - // We control the "dynamic" memory - DYNAMIC_BASE to DYNAMICTOP - var self = _sbrk; - if (!self.called) { - DYNAMICTOP = alignMemoryPage(DYNAMICTOP); // make sure we start out aligned - self.called = true; - assert(Runtime.dynamicAlloc); - self.alloc = Runtime.dynamicAlloc; - Runtime.dynamicAlloc = function() { abort('cannot dynamically allocate, sbrk now has control') }; - } - var ret = DYNAMICTOP; - if (bytes != 0) self.alloc(bytes); - return ret; // Previous break location. - } - function _llvm_lifetime_start() {} - function _llvm_lifetime_end() {} - var _llvm_memset_p0i8_i64=_memset; - var _llvm_memcpy_p0i8_p0i8_i64=_memcpy; - function _llvm_trap() { - throw 'trap! ' + new Error().stack; - } - var Browser={mainLoop:{scheduler:null,shouldPause:false,paused:false,queue:[],pause:function () { - Browser.mainLoop.shouldPause = true; - },resume:function () { - if (Browser.mainLoop.paused) { - Browser.mainLoop.paused = false; - Browser.mainLoop.scheduler(); - } - Browser.mainLoop.shouldPause = false; - },updateStatus:function () { - if (Module['setStatus']) { - var message = Module['statusMessage'] || 'Please wait...'; - var remaining = Browser.mainLoop.remainingBlockers; - var expected = Browser.mainLoop.expectedBlockers; - if (remaining) { - if (remaining < expected) { - Module['setStatus'](message + ' (' + (expected - remaining) + '/' + expected + ')'); - } else { - Module['setStatus'](message); - } - } else { - Module['setStatus'](''); - } - } - }},isFullScreen:false,pointerLock:false,moduleContextCreatedCallbacks:[],workers:[],init:function () { - if (Browser.initted) return; - Browser.initted = true; - try { - new Blob(); - Browser.hasBlobConstructor = true; - } catch(e) { - Browser.hasBlobConstructor = false; - console.log("warning: no blob constructor, cannot create blobs with mimetypes"); - } - Browser.BlobBuilder = typeof MozBlobBuilder != "undefined" ? MozBlobBuilder : (typeof WebKitBlobBuilder != "undefined" ? WebKitBlobBuilder : (!Browser.hasBlobConstructor ? console.log("warning: no BlobBuilder") : null)); - Browser.URLObject = typeof window != "undefined" ? (window.URL ? window.URL : window.webkitURL) : console.log("warning: cannot create object URLs"); - // Support for plugins that can process preloaded files. You can add more of these to - // your app by creating and appending to Module.preloadPlugins. - // - // Each plugin is asked if it can handle a file based on the file's name. If it can, - // it is given the file's raw data. When it is done, it calls a callback with the file's - // (possibly modified) data. For example, a plugin might decompress a file, or it - // might create some side data structure for use later (like an Image element, etc.). - function getMimetype(name) { - return { - 'jpg': 'image/jpeg', - 'jpeg': 'image/jpeg', - 'png': 'image/png', - 'bmp': 'image/bmp', - 'ogg': 'audio/ogg', - 'wav': 'audio/wav', - 'mp3': 'audio/mpeg' - }[name.substr(name.lastIndexOf('.')+1)]; - } - if (!Module["preloadPlugins"]) Module["preloadPlugins"] = []; - var imagePlugin = {}; - imagePlugin['canHandle'] = function(name) { - return !Module.noImageDecoding && /\.(jpg|jpeg|png|bmp)$/.exec(name); - }; - imagePlugin['handle'] = function(byteArray, name, onload, onerror) { - var b = null; - if (Browser.hasBlobConstructor) { - try { - b = new Blob([byteArray], { type: getMimetype(name) }); - } catch(e) { - Runtime.warnOnce('Blob constructor present but fails: ' + e + '; falling back to blob builder'); - } - } - if (!b) { - var bb = new Browser.BlobBuilder(); - bb.append((new Uint8Array(byteArray)).buffer); // we need to pass a buffer, and must copy the array to get the right data range - b = bb.getBlob(); - } - var url = Browser.URLObject.createObjectURL(b); - var img = new Image(); - img.onload = function() { - assert(img.complete, 'Image ' + name + ' could not be decoded'); - var canvas = document.createElement('canvas'); - canvas.width = img.width; - canvas.height = img.height; - var ctx = canvas.getContext('2d'); - ctx.drawImage(img, 0, 0); - Module["preloadedImages"][name] = canvas; - Browser.URLObject.revokeObjectURL(url); - if (onload) onload(byteArray); - }; - img.onerror = function(event) { - console.log('Image ' + url + ' could not be decoded'); - if (onerror) onerror(); - }; - img.src = url; - }; - Module['preloadPlugins'].push(imagePlugin); - var audioPlugin = {}; - audioPlugin['canHandle'] = function(name) { - return !Module.noAudioDecoding && name.substr(-4) in { '.ogg': 1, '.wav': 1, '.mp3': 1 }; - }; - audioPlugin['handle'] = function(byteArray, name, onload, onerror) { - var done = false; - function finish(audio) { - if (done) return; - done = true; - Module["preloadedAudios"][name] = audio; - if (onload) onload(byteArray); - } - function fail() { - if (done) return; - done = true; - Module["preloadedAudios"][name] = new Audio(); // empty shim - if (onerror) onerror(); - } - if (Browser.hasBlobConstructor) { - try { - var b = new Blob([byteArray], { type: getMimetype(name) }); - } catch(e) { - return fail(); - } - var url = Browser.URLObject.createObjectURL(b); // XXX we never revoke this! - var audio = new Audio(); - audio.addEventListener('canplaythrough', function() { finish(audio) }, false); // use addEventListener due to chromium bug 124926 - audio.onerror = function(event) { - if (done) return; - console.log('warning: browser could not fully decode audio ' + name + ', trying slower base64 approach'); - function encode64(data) { - var BASE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; - var PAD = '='; - var ret = ''; - var leftchar = 0; - var leftbits = 0; - for (var i = 0; i < data.length; i++) { - leftchar = (leftchar << 8) | data[i]; - leftbits += 8; - while (leftbits >= 6) { - var curr = (leftchar >> (leftbits-6)) & 0x3f; - leftbits -= 6; - ret += BASE[curr]; - } - } - if (leftbits == 2) { - ret += BASE[(leftchar&3) << 4]; - ret += PAD + PAD; - } else if (leftbits == 4) { - ret += BASE[(leftchar&0xf) << 2]; - ret += PAD; - } - return ret; - } - audio.src = 'data:audio/x-' + name.substr(-3) + ';base64,' + encode64(byteArray); - finish(audio); // we don't wait for confirmation this worked - but it's worth trying - }; - audio.src = url; - // workaround for chrome bug 124926 - we do not always get oncanplaythrough or onerror - Browser.safeSetTimeout(function() { - finish(audio); // try to use it even though it is not necessarily ready to play - }, 10000); - } else { - return fail(); - } - }; - Module['preloadPlugins'].push(audioPlugin); - // Canvas event setup - var canvas = Module['canvas']; - canvas.requestPointerLock = canvas['requestPointerLock'] || - canvas['mozRequestPointerLock'] || - canvas['webkitRequestPointerLock']; - canvas.exitPointerLock = document['exitPointerLock'] || - document['mozExitPointerLock'] || - document['webkitExitPointerLock'] || - function(){}; // no-op if function does not exist - canvas.exitPointerLock = canvas.exitPointerLock.bind(document); - function pointerLockChange() { - Browser.pointerLock = document['pointerLockElement'] === canvas || - document['mozPointerLockElement'] === canvas || - document['webkitPointerLockElement'] === canvas; - } - document.addEventListener('pointerlockchange', pointerLockChange, false); - document.addEventListener('mozpointerlockchange', pointerLockChange, false); - document.addEventListener('webkitpointerlockchange', pointerLockChange, false); - if (Module['elementPointerLock']) { - canvas.addEventListener("click", function(ev) { - if (!Browser.pointerLock && canvas.requestPointerLock) { - canvas.requestPointerLock(); - ev.preventDefault(); - } - }, false); - } - },createContext:function (canvas, useWebGL, setInModule) { - var ctx; - try { - if (useWebGL) { - ctx = canvas.getContext('experimental-webgl', { - alpha: false - }); - } else { - ctx = canvas.getContext('2d'); - } - if (!ctx) throw ':('; - } catch (e) { - Module.print('Could not create canvas - ' + e); - return null; - } - if (useWebGL) { - // Set the background of the WebGL canvas to black - canvas.style.backgroundColor = "black"; - // Warn on context loss - canvas.addEventListener('webglcontextlost', function(event) { - alert('WebGL context lost. You will need to reload the page.'); - }, false); - } - if (setInModule) { - Module.ctx = ctx; - Module.useWebGL = useWebGL; - Browser.moduleContextCreatedCallbacks.forEach(function(callback) { callback() }); - Browser.init(); - } - return ctx; - },destroyContext:function (canvas, useWebGL, setInModule) {},fullScreenHandlersInstalled:false,lockPointer:undefined,resizeCanvas:undefined,requestFullScreen:function (lockPointer, resizeCanvas) { - Browser.lockPointer = lockPointer; - Browser.resizeCanvas = resizeCanvas; - if (typeof Browser.lockPointer === 'undefined') Browser.lockPointer = true; - if (typeof Browser.resizeCanvas === 'undefined') Browser.resizeCanvas = false; - var canvas = Module['canvas']; - function fullScreenChange() { - Browser.isFullScreen = false; - if ((document['webkitFullScreenElement'] || document['webkitFullscreenElement'] || - document['mozFullScreenElement'] || document['mozFullscreenElement'] || - document['fullScreenElement'] || document['fullscreenElement']) === canvas) { - canvas.cancelFullScreen = document['cancelFullScreen'] || - document['mozCancelFullScreen'] || - document['webkitCancelFullScreen']; - canvas.cancelFullScreen = canvas.cancelFullScreen.bind(document); - if (Browser.lockPointer) canvas.requestPointerLock(); - Browser.isFullScreen = true; - if (Browser.resizeCanvas) Browser.setFullScreenCanvasSize(); - } else if (Browser.resizeCanvas){ - Browser.setWindowedCanvasSize(); - } - if (Module['onFullScreen']) Module['onFullScreen'](Browser.isFullScreen); - } - if (!Browser.fullScreenHandlersInstalled) { - Browser.fullScreenHandlersInstalled = true; - document.addEventListener('fullscreenchange', fullScreenChange, false); - document.addEventListener('mozfullscreenchange', fullScreenChange, false); - document.addEventListener('webkitfullscreenchange', fullScreenChange, false); - } - canvas.requestFullScreen = canvas['requestFullScreen'] || - canvas['mozRequestFullScreen'] || - (canvas['webkitRequestFullScreen'] ? function() { canvas['webkitRequestFullScreen'](Element['ALLOW_KEYBOARD_INPUT']) } : null); - canvas.requestFullScreen(); - },requestAnimationFrame:function (func) { - if (!window.requestAnimationFrame) { - window.requestAnimationFrame = window['requestAnimationFrame'] || - window['mozRequestAnimationFrame'] || - window['webkitRequestAnimationFrame'] || - window['msRequestAnimationFrame'] || - window['oRequestAnimationFrame'] || - window['setTimeout']; - } - window.requestAnimationFrame(func); - },safeCallback:function (func) { - return function() { - if (!ABORT) return func.apply(null, arguments); - }; - },safeRequestAnimationFrame:function (func) { - return Browser.requestAnimationFrame(function() { - if (!ABORT) func(); - }); - },safeSetTimeout:function (func, timeout) { - return setTimeout(function() { - if (!ABORT) func(); - }, timeout); - },safeSetInterval:function (func, timeout) { - return setInterval(function() { - if (!ABORT) func(); - }, timeout); - },getUserMedia:function (func) { - if(!window.getUserMedia) { - window.getUserMedia = navigator['getUserMedia'] || - navigator['mozGetUserMedia']; - } - window.getUserMedia(func); - },getMovementX:function (event) { - return event['movementX'] || - event['mozMovementX'] || - event['webkitMovementX'] || - 0; - },getMovementY:function (event) { - return event['movementY'] || - event['mozMovementY'] || - event['webkitMovementY'] || - 0; - },mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,calculateMouseEvent:function (event) { // event should be mousemove, mousedown or mouseup - if (Browser.pointerLock) { - // When the pointer is locked, calculate the coordinates - // based on the movement of the mouse. - // Workaround for Firefox bug 764498 - if (event.type != 'mousemove' && - ('mozMovementX' in event)) { - Browser.mouseMovementX = Browser.mouseMovementY = 0; - } else { - Browser.mouseMovementX = Browser.getMovementX(event); - Browser.mouseMovementY = Browser.getMovementY(event); - } - Browser.mouseX = SDL.mouseX + Browser.mouseMovementX; - Browser.mouseY = SDL.mouseY + Browser.mouseMovementY; - } else { - // Otherwise, calculate the movement based on the changes - // in the coordinates. - var rect = Module["canvas"].getBoundingClientRect(); - var x = event.pageX - (window.scrollX + rect.left); - var y = event.pageY - (window.scrollY + rect.top); - // the canvas might be CSS-scaled compared to its backbuffer; - // SDL-using content will want mouse coordinates in terms - // of backbuffer units. - var cw = Module["canvas"].width; - var ch = Module["canvas"].height; - x = x * (cw / rect.width); - y = y * (ch / rect.height); - Browser.mouseMovementX = x - Browser.mouseX; - Browser.mouseMovementY = y - Browser.mouseY; - Browser.mouseX = x; - Browser.mouseY = y; - } - },xhrLoad:function (url, onload, onerror) { - var xhr = new XMLHttpRequest(); - xhr.open('GET', url, true); - xhr.responseType = 'arraybuffer'; - xhr.onload = function() { - if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0 - onload(xhr.response); - } else { - onerror(); - } - }; - xhr.onerror = onerror; - xhr.send(null); - },asyncLoad:function (url, onload, onerror, noRunDep) { - Browser.xhrLoad(url, function(arrayBuffer) { - assert(arrayBuffer, 'Loading data file "' + url + '" failed (no arrayBuffer).'); - onload(new Uint8Array(arrayBuffer)); - if (!noRunDep) removeRunDependency('al ' + url); - }, function(event) { - if (onerror) { - onerror(); - } else { - throw 'Loading data file "' + url + '" failed.'; - } - }); - if (!noRunDep) addRunDependency('al ' + url); - },resizeListeners:[],updateResizeListeners:function () { - var canvas = Module['canvas']; - Browser.resizeListeners.forEach(function(listener) { - listener(canvas.width, canvas.height); - }); - },setCanvasSize:function (width, height, noUpdates) { - var canvas = Module['canvas']; - canvas.width = width; - canvas.height = height; - if (!noUpdates) Browser.updateResizeListeners(); - },windowedWidth:0,windowedHeight:0,setFullScreenCanvasSize:function () { - var canvas = Module['canvas']; - this.windowedWidth = canvas.width; - this.windowedHeight = canvas.height; - canvas.width = screen.width; - canvas.height = screen.height; - var flags = HEAPU32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)]; - flags = flags | 0x00800000; // set SDL_FULLSCREEN flag - HEAP32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)]=flags - Browser.updateResizeListeners(); - },setWindowedCanvasSize:function () { - var canvas = Module['canvas']; - canvas.width = this.windowedWidth; - canvas.height = this.windowedHeight; - var flags = HEAPU32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)]; - flags = flags & ~0x00800000; // clear SDL_FULLSCREEN flag - HEAP32[((SDL.screen+Runtime.QUANTUM_SIZE*0)>>2)]=flags - Browser.updateResizeListeners(); - }}; -__ATINIT__.unshift({ func: function() { if (!Module["noFSInit"] && !FS.init.initialized) FS.init() } });__ATMAIN__.push({ func: function() { FS.ignorePermissions = false } });__ATEXIT__.push({ func: function() { FS.quit() } });Module["FS_createFolder"] = FS.createFolder;Module["FS_createPath"] = FS.createPath;Module["FS_createDataFile"] = FS.createDataFile;Module["FS_createPreloadedFile"] = FS.createPreloadedFile;Module["FS_createLazyFile"] = FS.createLazyFile;Module["FS_createLink"] = FS.createLink;Module["FS_createDevice"] = FS.createDevice; -___errno_state = Runtime.staticAlloc(4); HEAP32[((___errno_state)>>2)]=0; -_fgetc.ret = allocate([0], "i8", ALLOC_STATIC); -_fputc.ret = allocate([0], "i8", ALLOC_STATIC); -___buildEnvironment(ENV); -Module["requestFullScreen"] = function(lockPointer, resizeCanvas) { Browser.requestFullScreen(lockPointer, resizeCanvas) }; - Module["requestAnimationFrame"] = function(func) { Browser.requestAnimationFrame(func) }; - Module["pauseMainLoop"] = function() { Browser.mainLoop.pause() }; - Module["resumeMainLoop"] = function() { Browser.mainLoop.resume() }; - Module["getUserMedia"] = function() { Browser.getUserMedia() } -STACK_BASE = STACKTOP = Runtime.alignMemory(STATICTOP); -staticSealed = true; // seal the static portion of memory -STACK_MAX = STACK_BASE + 5242880; -DYNAMIC_BASE = DYNAMICTOP = Runtime.alignMemory(STACK_MAX); -assert(DYNAMIC_BASE < TOTAL_MEMORY); // Stack must fit in TOTAL_MEMORY; allocations from here on may enlarge TOTAL_MEMORY -var Math_min = Math.min; -function invoke_viiiii(index,a1,a2,a3,a4,a5) { - try { - Module["dynCall_viiiii"](index,a1,a2,a3,a4,a5); - } catch(e) { - if (typeof e !== 'number' && e !== 'longjmp') throw e; - asm["setThrew"](1, 0); - } -} -function invoke_viffiii(index,a1,a2,a3,a4,a5,a6) { - try { - Module["dynCall_viffiii"](index,a1,a2,a3,a4,a5,a6); - } catch(e) { - if (typeof e !== 'number' && e !== 'longjmp') throw e; - asm["setThrew"](1, 0); - } -} -function invoke_vf(index,a1) { - try { - Module["dynCall_vf"](index,a1); - } catch(e) { - if (typeof e !== 'number' && e !== 'longjmp') throw e; - asm["setThrew"](1, 0); - } -} -function invoke_i(index) { - try { - return Module["dynCall_i"](index); - } catch(e) { - if (typeof e !== 'number' && e !== 'longjmp') throw e; - asm["setThrew"](1, 0); - } -} -function invoke_vi(index,a1) { - try { - Module["dynCall_vi"](index,a1); - } catch(e) { - if (typeof e !== 'number' && e !== 'longjmp') throw e; - asm["setThrew"](1, 0); - } -} -function invoke_vii(index,a1,a2) { - try { - Module["dynCall_vii"](index,a1,a2); - } catch(e) { - if (typeof e !== 'number' && e !== 'longjmp') throw e; - asm["setThrew"](1, 0); - } -} -function invoke_ii(index,a1) { - try { - return Module["dynCall_ii"](index,a1); - } catch(e) { - if (typeof e !== 'number' && e !== 'longjmp') throw e; - asm["setThrew"](1, 0); - } -} -function invoke_iff(index,a1,a2) { - try { - return Module["dynCall_iff"](index,a1,a2); - } catch(e) { - if (typeof e !== 'number' && e !== 'longjmp') throw e; - asm["setThrew"](1, 0); - } -} -function invoke_iiii(index,a1,a2,a3) { - try { - return Module["dynCall_iiii"](index,a1,a2,a3); - } catch(e) { - if (typeof e !== 'number' && e !== 'longjmp') throw e; - asm["setThrew"](1, 0); - } -} -function invoke_viii(index,a1,a2,a3) { - try { - Module["dynCall_viii"](index,a1,a2,a3); - } catch(e) { - if (typeof e !== 'number' && e !== 'longjmp') throw e; - asm["setThrew"](1, 0); - } -} -function invoke_v(index) { - try { - Module["dynCall_v"](index); - } catch(e) { - if (typeof e !== 'number' && e !== 'longjmp') throw e; - asm["setThrew"](1, 0); - } -} -function invoke_vifiii(index,a1,a2,a3,a4,a5) { - try { - Module["dynCall_vifiii"](index,a1,a2,a3,a4,a5); - } catch(e) { - if (typeof e !== 'number' && e !== 'longjmp') throw e; - asm["setThrew"](1, 0); - } -} -function invoke_iiiii(index,a1,a2,a3,a4) { - try { - return Module["dynCall_iiiii"](index,a1,a2,a3,a4); - } catch(e) { - if (typeof e !== 'number' && e !== 'longjmp') throw e; - asm["setThrew"](1, 0); - } -} -function invoke_fii(index,a1,a2) { - try { - return Module["dynCall_fii"](index,a1,a2); - } catch(e) { - if (typeof e !== 'number' && e !== 'longjmp') throw e; - asm["setThrew"](1, 0); - } -} -function invoke_iii(index,a1,a2) { - try { - return Module["dynCall_iii"](index,a1,a2); - } catch(e) { - if (typeof e !== 'number' && e !== 'longjmp') throw e; - asm["setThrew"](1, 0); - } -} -function asmPrintInt(x, y) { - Module.print('int ' + x + ',' + y);// + ' ' + new Error().stack); -} -function asmPrintFloat(x, y) { - Module.print('float ' + x + ',' + y);// + ' ' + new Error().stack); -} -// EMSCRIPTEN_START_ASM -var asm=(function(global,env,buffer){"use asm";var a=new global.Int8Array(buffer);var b=new global.Int16Array(buffer);var c=new global.Int32Array(buffer);var d=new global.Uint8Array(buffer);var e=new global.Uint16Array(buffer);var f=new global.Uint32Array(buffer);var g=new global.Float32Array(buffer);var h=new global.Float64Array(buffer);var i=env.STACKTOP|0;var j=env.STACK_MAX|0;var k=env.tempDoublePtr|0;var l=env.ABORT|0;var m=env._stderr|0;var n=env._stdout|0;var o=env._stdin|0;var p=+env.NaN;var q=+env.Infinity;var r=0;var s=0;var t=0;var u=0;var v=0,w=0,x=0,y=0,z=0.0,A=0,B=0,C=0,D=0.0;var E=0;var F=0;var G=0;var H=0;var I=0;var J=0;var K=0;var L=0;var M=0;var N=0;var O=global.Math.floor;var P=global.Math.abs;var Q=global.Math.sqrt;var R=global.Math.pow;var S=global.Math.cos;var T=global.Math.sin;var U=global.Math.tan;var V=global.Math.acos;var W=global.Math.asin;var X=global.Math.atan;var Y=global.Math.atan2;var Z=global.Math.exp;var _=global.Math.log;var $=global.Math.ceil;var aa=global.Math.imul;var ab=env.abort;var ac=env.assert;var ad=env.asmPrintInt;var ae=env.asmPrintFloat;var af=env.copyTempDouble;var ag=env.copyTempFloat;var ah=env.min;var ai=env.invoke_viiiii;var aj=env.invoke_viffiii;var ak=env.invoke_vf;var al=env.invoke_i;var am=env.invoke_vi;var an=env.invoke_vii;var ao=env.invoke_ii;var ap=env.invoke_iff;var aq=env.invoke_iiii;var ar=env.invoke_viii;var as=env.invoke_v;var at=env.invoke_vifiii;var au=env.invoke_iiiii;var av=env.invoke_fii;var aw=env.invoke_iii;var ax=env._lseek;var ay=env.__scanString;var az=env._fclose;var aA=env._uname;var aB=env._sleep;var aC=env.__isFloat;var aD=env._fflush;var aE=env._strtol;var aF=env._fputc;var aG=env._iconv;var aH=env.___signgam;var aI=env._fwrite;var aJ=env._send;var aK=env._fputs;var aL=env._tmpnam;var aM=env._isspace;var aN=env._localtime;var aO=env._read;var aP=env._ceil;var aQ=env._strstr;var aR=env._fileno;var aS=env._perror;var aT=env._ctime;var aU=env._fsync;var aV=env._signal;var aW=env._opendir;var aX=env._fmod;var aY=env._strcmp;var aZ=env._memchr;var a_=env._strncmp;var a$=env._tmpfile;var a0=env._snprintf;var a1=env._fgetc;var a2=env._pclose;var a3=env._readdir;var a4=env._cosh;var a5=env._atexit;var a6=env._fgets;var a7=env._close;var a8=env._strchr;var a9=env._asin;var ba=env._llvm_lifetime_start;var bb=env.___setErrNo;var bc=env._ftell;var bd=env._exit;var be=env._sprintf;var bf=env._llvm_lifetime_end;var bg=env._asctime;var bh=env._strrchr;var bi=env._iconv_open;var bj=env._modf;var bk=env._strcspn;var bl=env._getcwd;var bm=env._gmtime;var bn=env._localtime_r;var bo=env._asctime_r;var bp=env._recv;var bq=env._cos;var br=env._putchar;var bs=env._isalnum;var bt=env._popen;var bu=env._erfc;var bv=env.__exit;var bw=env._strftime;var bx=env._llvm_va_end;var by=env._tzset;var bz=env._sinh;var bA=env._setlocale;var bB=env._isprint;var bC=env._toupper;var bD=env._printf;var bE=env._pread;var bF=env._fopen;var bG=env._open;var bH=env._usleep;var bI=env._log;var bJ=env._puts;var bK=env._mktime;var bL=env._fdopen;var bM=env._qsort;var bN=env._system;var bO=env._isalpha;var bP=env._strdup;var bQ=env._log10;var bR=env._closedir;var bS=env._isatty;var bT=env.__formatString;var bU=env._getenv;var bV=env._gettimeofday;var bW=env._atoi;var bX=env._vfprintf;var bY=env._chdir;var bZ=env._llvm_pow_f64;var b_=env._sbrk;var b$=env._localeconv;var b0=env.___errno_location;var b1=env._strerror;var b2=env._lgamma;var b3=env._erf;var b4=env._strspn;var b5=env.__parseInt;var b6=env._ungetc;var b7=env._llvm_trap;var b8=env._rename;var b9=env._vsnprintf;var ca=env._sscanf;var cb=env._sysconf;var cc=env._acos;var cd=env._fread;var ce=env._abort;var cf=env._fprintf;var cg=env.___fpclassifyf;var ch=env._tan;var ci=env.___buildEnvironment;var cj=env._feof;var ck=env._strncat;var cl=env._gmtime_r;var cm=env._fabs;var cn=env._floor;var co=env.__reallyNegative;var cp=env._fseek;var cq=env._sqrt;var cr=env._write;var cs=env._rewind;var ct=env._sin;var cu=env._stat;var cv=env._longjmp;var cw=env._atan;var cx=env._readdir_r;var cy=env._strpbrk;var cz=env._iconv_close;var cA=env._setbuf;var cB=env._nl_langinfo;var cC=env._pwrite;var cD=env._strerror_r;var cE=env._atan2;var cF=env._exp;var cG=env._time;var cH=env._setvbuf; -// EMSCRIPTEN_START_FUNCS -function cX(a){a=a|0;var b=0;b=i;i=i+a|0;i=i+7>>3<<3;return b|0}function cY(){return i|0}function cZ(a){a=a|0;i=a}function c_(a,b){a=a|0;b=b|0;if((r|0)==0){r=a;s=b}}function c$(a){a=a|0;E=a}function c0(a){a=a|0;F=a}function c1(a){a=a|0;G=a}function c2(a){a=a|0;H=a}function c3(a){a=a|0;I=a}function c4(a){a=a|0;J=a}function c5(a){a=a|0;K=a}function c6(a){a=a|0;L=a}function c7(a){a=a|0;M=a}function c8(a){a=a|0;N=a}function c9(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0.0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,x=0.0;d=i;i=i+96|0;e=d|0;f=d+48|0;do{if((c[64808+(b*688&-1)>>2]|0)==1){if((a[64812+(b*688&-1)|0]&1)==0){break}g=4968+(b*51&-1)|0;a[g]=0;j=4608+(b<<2)|0;k=+da(c[j>>2]|0,+h[64664+(b*688&-1)>>3]);t3(e,k);k=+da(c[j>>2]|0,+h[64672+(b*688&-1)>>3]);t3(f,k);l=c[f+20>>2]|0;m=c[e+20>>2]|0;n=(l|0)==(m|0);do{if(n){if((c[f+28>>2]|0)!=(c[e+28>>2]|0)){break}if((c[f+8>>2]|0)!=(c[e+8>>2]|0)){a[g]=a[172544]|0;a[g+1|0]=a[172545|0]|0;a[g+2|0]=a[172546|0]|0}o=c[j>>2]|0;if(o>>>0>=4){p=g;i=d;return p|0}if((a[g]|0)!=0){q=(uA(g|0)|0)+(4968+(b*51&-1))|0;w=58;a[q]=w&255;w=w>>8;a[q+1|0]=w&255}q=(uA(g|0)|0)+(4968+(b*51&-1))|0;a[q]=a[164672]|0;a[q+1|0]=a[164673|0]|0;a[q+2|0]=a[164674|0]|0;if(o>>>0>=3){p=g;i=d;return p|0}o=(uA(g|0)|0)+(4968+(b*51&-1))|0;w=5449018;a[o]=w&255;w=w>>8;a[o+1|0]=w&255;w=w>>8;a[o+2|0]=w&255;w=w>>8;a[o+3|0]=w&255;p=g;i=d;return p|0}}while(0);o=64813+(b*688&-1)|0;q=a8(o|0,109)|0;r=q>>>0<(a8(o|0,100)|0)>>>0;do{if(n){if(r){a[g]=a[145768]|0;a[g+1|0]=a[145769|0]|0;a[g+2|0]=a[145770|0]|0;a[g+3|0]=a[145771|0]|0;a[g+4|0]=a[145772|0]|0;a[g+5|0]=a[145773|0]|0;break}else{a[g]=a[143792]|0;a[g+1|0]=a[143793|0]|0;a[g+2|0]=a[143794|0]|0;a[g+3|0]=a[143795|0]|0;a[g+4|0]=a[143796|0]|0;a[g+5|0]=a[143797|0]|0;break}}else{o=g;q=o|0;w=r?623865125:623862821;a[q]=w&255;w=w>>8;a[q+1|0]=w&255;w=w>>8;a[q+2|0]=w&255;w=w>>8;a[q+3|0]=w&255;q=o+4|0;w=r?2436964:2436973;a[q]=w&255;w=w>>8;a[q+1|0]=w&255;w=w>>8;a[q+2|0]=w&255;w=w>>8;a[q+3|0]=w&255;q=(uA(g|0)|0)+(4968+(b*51&-1))|0;if(((l|0)/100&-1|0)==((m|0)/100&-1|0)){w=121;a[q]=w&255;w=w>>8;a[q+1|0]=w&255;break}else{w=89;a[q]=w&255;w=w>>8;a[q+1|0]=w&255;break}}}while(0);if((c[j>>2]|0)>>>0>=5){p=g;i=d;return p|0}m=(uA(g|0)|0)+(4968+(b*51&-1))|0;a[m]=a[142240]|0;a[m+1|0]=a[142241|0]|0;a[m+2|0]=a[142242|0]|0;a[m+3|0]=a[142243|0]|0;a[m+4|0]=a[142244|0]|0;a[m+5|0]=a[142245|0]|0;a[m+6|0]=a[142246|0]|0;p=g;i=d;return p|0}}while(0);e=4968+(b*51&-1)|0;uB(e|0,64864+(b*688&-1)|0);if((aY(e|0,186288)|0)!=0){p=e;i=d;return p|0}k=+h[64664+(b*688&-1)>>3];if((a[64788+(b*688&-1)|0]&1)==0){s=+h[64672+(b*688&-1)>>3];t=k}else{u=+h[64800+(b*688&-1)>>3];x=+Z(+(k*u));s=+Z(+(+h[64672+(b*688&-1)>>3]*u));t=x}b=~~+$(+(-0.0- +bQ(+(+P(+(s-t))))));if(t*s>0.0&(b|0)>4){f=(b|0)>14?14:b;be(e|0,180872,(v=i,i=i+8|0,c[v>>2]=f,v)|0);p=e;i=d;return p|0}else{a[e]=a[170912]|0;a[e+1|0]=a[170913|0]|0;a[e+2|0]=a[170914|0]|0;p=e;i=d;return p|0}return 0}function da(a,b){a=a|0;b=+b;var d=0,e=0,f=0.0,g=0,h=0,j=0;d=i;i=i+48|0;e=d|0;if(a>>>0<2){f=b;i=d;return+f}t3(e,b);g=e|0;if((c[g>>2]|0)>55){h=e+4|0;c[h>>2]=(c[h>>2]|0)+1}c[g>>2]=0;do{if(a>>>0>2){g=e+4|0;if((c[g>>2]|0)>55){h=e+8|0;c[h>>2]=(c[h>>2]|0)+1}c[g>>2]=0;if(a>>>0<=3){break}g=e+8|0;if((c[g>>2]|0)>22){c[g>>2]=0;c[e+12>>2]=0;g=e+28|0;c[g>>2]=(c[g>>2]|0)+1;b=+t2(e);t3(e,b)}if(a>>>0<=5){break}g=e+12|0;do{if((c[g>>2]|0)>25){h=e+16|0;j=(c[h>>2]|0)+1|0;c[h>>2]=j;if((j|0)<=11){break}j=e+20|0;c[j>>2]=(c[j>>2]|0)+1;c[h>>2]=0}}while(0);c[g>>2]=1}}while(0);f=+t2(e);i=d;return+f}function db(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;do{if((a|0)==0){f=ut(b)|0;if((f|0)!=0){g=f;break}gk();f=ut(b)|0;if((f|0)!=0|(d|0)==0){g=f;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=d,v)|0);return 0}else{f=uv(a,b)|0;if((f|0)!=0){g=f;break}gk();f=uv(a,b)|0;if((f|0)!=0|(d|0)==0){g=f;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=d,v)|0);return 0}}while(0);i=e;return g|0}function dc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,g=0,j=0.0,k=0,l=0,n=0.0,o=0,p=0,q=0;d=i;e=64664+(a*688&-1)|0;f=+h[e>>3];g=64672+(a*688&-1)|0;j=+h[g>>3];k=(b|0)!=0;do{if(k){if(!(f==8.988465674311579e+307|j==-8.988465674311579e+307)){break}uf(c[13898]|0,b,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);if(j-f!=0.0){i=d;return}b=64648+(a*688&-1)|0;l=c[b>>2]|0;if((l|0)==0){uf(-1,197584,(v=i,i=i+8|0,c[v>>2]=56832+(a*24&-1),v)|0)}if(j==0.0){n=1.0}else{n=+P(+j)*.01}o=(a|0)!=0|k;if(o){k=c[m>>2]|0;p=56832+(a*24&-1)|0;cf(k|0,206616,(v=i,i=i+24|0,c[v>>2]=p,h[v+8>>3]=f,h[v+16>>3]=j,v)|0);q=c[b>>2]|0}else{q=l}if((q&1|0)!=0){h[e>>3]=+h[e>>3]-n}if((q&2|0)!=0){h[g>>3]=n+ +h[g>>3]}if(!o){i=d;return}n=+h[g>>3];cf(c[m>>2]|0,202928,(v=i,i=i+16|0,h[v>>3]=+h[e>>3],h[v+8>>3]=n,v)|0);i=d;return}function dd(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0.0,n=0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,w=0.0,x=0.0,y=0.0,z=0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,Q=0.0,S=0,T=0.0,U=0.0;e=i;f=c[64648+(b*688&-1)>>2]|0;g=(f&1|0)==0;if(g){j=0}else{j=(f&4|0)==0}k=(f&2|0)==0;if(k){l=0}else{l=(f&8|0)==0}do{if(!g){if((c[64728+(b*688&-1)>>2]&2|0)==0){break}f=64664+(b*688&-1)|0;m=+h[64744+(b*688&-1)>>3];if(+h[f>>3]<=m){break}h[f>>3]=m}}while(0);do{if(!k){if((c[64732+(b*688&-1)>>2]&1|0)==0){break}g=64672+(b*688&-1)|0;m=+h[64752+(b*688&-1)>>3];if(+h[g>>3]>=m){break}h[g>>3]=m}}while(0);if((c[64916+(b*688&-1)>>2]|0)==0){i=e;return}k=64920+(b*688&-1)|0;g=c[k>>2]|0;do{if((g|0)==2){m=+h[64960+(b*688&-1)>>3];h[4880+(b<<3)>>3]=m;if(j){n=+h[64952+(b*688&-1)>>3]==-8.988465674311579e+307}else{n=0}if(!l){o=0;p=n;q=m;break}o=+h[64968+(b*688&-1)>>3]==8.988465674311579e+307;p=n;q=m}else if((g|0)==1){m=+h[64664+(b*688&-1)>>3]- +h[64672+(b*688&-1)>>3];r=+P(+m);do{if(m==0.0){s=1.0}else{if(r>=8.988465674311579e+307){uf(-1,98888,(v=i,i=i+8|0,c[v>>2]=56832+(b*24&-1),v)|0)}t=+R(10.0,+(+O(+(+bQ(+r)))));u=r/t;w=+(d|0);x=w/u;do{if(x>40.0){y=.05}else{if(x>20.0){y=.1;break}if(x>10.0){y=.2;break}if(x>4.0){y=.5;break}if(x>2.0){y=1.0;break}if(x>.5){y=2.0;break}y=+$(+u)}}while(0);u=t*y;x=(a[64788+(b*688&-1)|0]&1)!=0&u<1.0?1.0:u;if((c[64808+(b*688&-1)>>2]|0)!=1){s=x;break}f=(d*3&-1|0)/5&-1;z=4608+(b<<2)|0;c[z>>2]=1;do{if(x>5.0){u=r/60.0;A=+R(12.0,+(+O(+(+_(+u)/2.4849066497880004))));B=u/A;u=+(f|0)/B;do{if(u>24.0){C=A/24.0}else{if(u>12.0){C=A/12.0;break}if(u>6.0){C=A/6.0;break}if(u>4.0){C=A*.25;break}if(u>2.0){C=A*.5;break}if(u>1.0){C=A;break}if(u>.5){C=A*2.0;break}if(u>.3333333333333333){C=A*3.0;break}else{C=A*+$(+B);break}}}while(0);B=C*60.0;if(B<60.0){D=B;break}c[z>>2]=2;D=B}else{D=x}}while(0);do{if(D>300.0){x=r/3600.0;t=+R(12.0,+(+O(+(+_(+x)/2.4849066497880004))));B=x/t;x=+(f|0)/B;do{if(x>24.0){E=t/24.0}else{if(x>12.0){E=t/12.0;break}if(x>6.0){E=t/6.0;break}if(x>4.0){E=t*.25;break}if(x>2.0){E=t*.5;break}if(x>1.0){E=t;break}if(x>.5){E=t*2.0;break}if(x>.3333333333333333){E=t*3.0;break}else{E=t*+$(+B);break}}}while(0);B=E*3600.0;if(B<3600.0){F=B;break}c[z>>2]=3;F=B}else{F=D}}while(0);do{if(F>3600.0){B=r/86400.0;t=+R(12.0,+(+O(+(+_(+B)/2.4849066497880004))));x=B/t;B=+(f|0)/x;do{if(B>24.0){G=t/24.0}else{if(B>12.0){G=t/12.0;break}if(B>6.0){G=t/6.0;break}if(B>4.0){G=t*.25;break}if(B>2.0){G=t*.5;break}if(B>1.0){G=t;break}if(B>.5){G=t*2.0;break}if(B>.3333333333333333){G=t*3.0;break}else{G=t*+$(+x);break}}}while(0);x=G*86400.0;if(x<86400.0){H=x;break}c[z>>2]=4;H=x}else{H=F}}while(0);do{if(H>172800.0){x=r/604800.0;t=+R(10.0,+(+O(+(+bQ(+x)))));B=x/t;x=w/B;do{if(x>40.0){I=.05}else{if(x>20.0){I=.1;break}if(x>10.0){I=.2;break}if(x>4.0){I=.5;break}if(x>2.0){I=1.0;break}if(x>.5){I=2.0;break}I=+$(+B)}}while(0);B=t*I*604800.0;x=B<604800.0?604800.0:B;if(x<604800.0){J=x;break}c[z>>2]=5;J=x}else{J=H}}while(0);do{if(J>1814400.0){x=r/2629800.0;B=+R(10.0,+(+O(+(+bQ(+x)))));A=x/B;x=w/A;do{if(x>40.0){K=.05}else{if(x>20.0){K=.1;break}if(x>10.0){K=.2;break}if(x>4.0){K=.5;break}if(x>2.0){K=1.0;break}if(x>.5){K=2.0;break}K=+$(+A)}}while(0);A=B*K*2629800.0;x=A<2629800.0?2629800.0:A;if(x<2629800.0){L=x;break}c[z>>2]=6;L=x}else{L=J}}while(0);if(L<=2629800.0){s=L;break}w=r/31557600.0;x=+R(12.0,+(+O(+(+_(+w)/2.4849066497880004))));A=w/x;w=+(f|0)/A;do{if(w>24.0){M=x/24.0}else{if(w>12.0){M=x/12.0;break}if(w>6.0){M=x/6.0;break}if(w>4.0){M=x*.25;break}if(w>2.0){M=x*.5;break}if(w>1.0){M=x;break}if(w>.5){M=x*2.0;break}if(w>.3333333333333333){M=x*3.0;break}else{M=x*+$(+A);break}}}while(0);A=M*31557600.0;if(A<31557600.0){s=A;break}c[z>>2]=7;s=A}}while(0);h[4880+(b<<3)>>3]=s;o=l;p=j;q=s}else{o=0;p=0;q=0.0}}while(0);j=(c[64808+(b*688&-1)>>2]|0)==1;do{if(j){if((c[k>>2]|0)!=2){break}if(q>=31536.0e3){c[4608+(b<<2)>>2]=7;break}if(q>=2419200.0){c[4608+(b<<2)>>2]=6;break}if(q>=604800.0){c[4608+(b<<2)>>2]=5;break}if(q>=86400.0){c[4608+(b<<2)>>2]=4;break}if(q>=3600.0){c[4608+(b<<2)>>2]=3;break}l=4608+(b<<2)|0;if(q<60.0){c[l>>2]=1;break}else{c[l>>2]=2;break}}}while(0);do{if(p){k=64664+(b*688&-1)|0;q=+h[k>>3];l=q>=+h[64672+(b*688&-1)>>3];s=+h[4880+(b<<3)>>3];M=q/s;if(l){N=+$(+M)}else{N=+O(+M)}M=s*N;do{if(j){s=+da(c[4608+(b<<2)>>2]|0,M);if(s>M&l){Q=s;break}if(s>3]=Q;if((c[64728+(b*688&-1)>>2]&1|0)==0){break}s=+h[64736+(b*688&-1)>>3];if(Q>=s){break}h[k>>3]=s}}while(0);do{if(o){j=64672+(b*688&-1)|0;Q=+h[j>>3];p=+h[64664+(b*688&-1)>>3]>3];s=Q/N;if(p){T=+$(+s)}else{T=+O(+s)}s=N*T;do{if((c[64808+(b*688&-1)>>2]|0)==1){N=+da(c[4608+(b<<2)>>2]|0,s);if(N>s&p){U=N;break}if(N>3]=U;if((c[64732+(b*688&-1)>>2]&2|0)==0){break}M=+h[64760+(b*688&-1)>>3];if(U<=M){break}h[j>>3]=M}}while(0);c9(b);i=e;return}function de(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0.0,B=0,C=0.0,D=0.0,E=0,F=0.0,G=0.0,H=0.0,I=0.0,J=0,K=0,L=0,M=0,N=0,Q=0,S=0,T=0,U=0,V=0,W=0,X=0.0,Y=0.0,aa=0.0,ab=0.0,ac=0.0,ad=0.0,ae=0.0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0.0,ap=0.0,aq=0.0,ar=0.0,as=0.0,at=0.0,au=0,av=0.0,aw=0.0,ax=0.0,ay=0,az=0.0,aA=0.0,aB=0.0,aC=0.0,aD=0.0,aE=0.0,aF=0.0,aG=0.0,aH=0.0,aI=0.0,aJ=0.0,aK=0.0,aL=0.0,aM=0.0,aN=0.0,aO=0.0,aP=0.0,aQ=0.0,aR=0.0,aS=0.0,aT=0.0;e=i;i=i+432|0;f=e|0;g=e+48|0;j=e+96|0;k=e+152|0;l=e+208|0;m=e+264|0;n=e+320|0;o=e+376|0;p=64920+(b*688&-1)|0;q=c[65040+(b*688&-1)>>2]|0;r=+h[65048+(b*688&-1)>>3];s=j;c[s>>2]=c[10012];c[s+4>>2]=c[10013];c[s+8>>2]=c[10014];c[s+12>>2]=c[10015];c[s+16>>2]=c[10016];c[s+20>>2]=c[10017];c[s+24>>2]=c[10018];c[s+28>>2]=c[10019];c[s+32>>2]=c[10020];c[s+36>>2]=c[10021];c[s+40>>2]=c[10022];c[s+44>>2]=c[10023];c[s+48>>2]=c[10024];c[s+52>>2]=c[10025];t=k;c[t>>2]=c[8694];c[t+4>>2]=c[8695];c[t+8>>2]=c[8696];c[t+12>>2]=c[8697];c[t+16>>2]=c[8698];c[t+20>>2]=c[8699];c[t+24>>2]=c[8700];c[t+28>>2]=c[8701];c[t+32>>2]=c[8702];c[t+36>>2]=c[8703];c[t+40>>2]=c[8704];c[t+44>>2]=c[8705];c[t+48>>2]=c[8706];c[t+52>>2]=c[8707];if((a[65036+(b*688&-1)|0]&1)==0){c[j+4>>2]=-3}if((a[65037+(b*688&-1)|0]&1)==0){c[k+4>>2]=-3}u=64944+(b*688&-1)|0;do{if((c[u>>2]|0)==0){w=64664+(b*688&-1)|0;x=64672+(b*688&-1)|0;y=64788+(b*688&-1)|0}else{z=64672+(b*688&-1)|0;A=+h[z>>3];B=64664+(b*688&-1)|0;C=+h[B>>3];D=(A-C)/10.0*.01;E=64788+(b*688&-1)|0;if((a[E]&1)==0){F=1.0}else{F=+bQ(+(+h[64792+(b*688&-1)>>3]))}if((a[30528]&1)==0){G=C;H=A;I=0.0}else{J=c[200]|0;G=+h[64664+(J*688&-1)>>3];H=+h[64672+(J*688&-1)>>3];I=(c[17366]&1|0)==0?+h[8685]:0.0}A=G-D;C=D+H;J=c[u>>2]|0;if((J|0)!=0){K=(b|0)==7;L=A>3];if((a[69604]&1)==0){X=I;Y=D}else{aa=+_(+D);ab=+h[8702];X=+_(+I)/ab;Y=aa/ab}ac=Y-X;ad=D}else{D=+h[W>>3];if((a[E]&1)==0){ae=D}else{ab=+_(+D);ae=ab/+h[V>>3]}ac=ae-I;ad=D}if(L){if(!(acC)){af=272}}else{if(!(acA)){af=272}}do{if((af|0)==272){af=0;J=W+12|0;ag=c[W+8>>2]|0;do{if((c[J>>2]|0)<0){ah=ag;ai=ag;af=280}else{if((ag|0)==0){af=275}else{if((a8(ag|0,37)|0)==0){aj=ag}else{af=275}}do{if((af|0)==275){af=0;ak=(ag|0)!=0?ag:U;if((c[S>>2]|0)==1){t3(g,ad);D=ad- +O(+ad);t4(T,49,ak,g,D);aj=T;break}else{ud(T,50,ak,F,ad);aj=T;break}}}while(0);ak=(c[J>>2]|0)>0;al=ak?0:aj;if(!ak){ah=aj;ai=al;af=280;break}c[M>>2]=c[t>>2];c[M+4>>2]=c[t+4>>2];c[M+8>>2]=c[t+8>>2];c[M+12>>2]=c[t+12>>2];c[M+16>>2]=c[t+16>>2];c[M+20>>2]=c[t+20>>2];c[M+24>>2]=c[t+24>>2];c[M+28>>2]=c[t+28>>2];c[M+32>>2]=c[t+32>>2];c[M+36>>2]=c[t+36>>2];c[M+40>>2]=c[t+40>>2];c[M+44>>2]=c[t+44>>2];c[M+48>>2]=c[t+48>>2];c[M+52>>2]=c[t+52>>2];am=aj;an=al}}while(0);if((af|0)==280){af=0;c[M>>2]=c[s>>2];c[M+4>>2]=c[s+4>>2];c[M+8>>2]=c[s+8>>2];c[M+12>>2]=c[s+12>>2];c[M+16>>2]=c[s+16>>2];c[M+20>>2]=c[s+20>>2];c[M+24>>2]=c[s+24>>2];c[M+28>>2]=c[s+28>>2];c[M+32>>2]=c[s+32>>2];c[M+36>>2]=c[s+36>>2];c[M+40>>2]=c[s+40>>2];c[M+44>>2]=c[s+44>>2];c[M+48>>2]=c[s+48>>2];c[M+52>>2]=c[s+52>>2];am=ah;an=ai}cT[d&15](b,ac,an,m,0);if(!K){break}if((c[17433]&4|0)==0){break}ag=c[N>>2]|0;c[N>>2]=-3;al=(c[J>>2]|0)>0;if(al){c[Q>>2]=c[t>>2];c[Q+4>>2]=c[t+4>>2];c[Q+8>>2]=c[t+8>>2];c[Q+12>>2]=c[t+12>>2];c[Q+16>>2]=c[t+16>>2];c[Q+20>>2]=c[t+20>>2];c[Q+24>>2]=c[t+24>>2];c[Q+28>>2]=c[t+28>>2];c[Q+32>>2]=c[t+32>>2];c[Q+36>>2]=c[t+36>>2];c[Q+40>>2]=c[t+40>>2];c[Q+44>>2]=c[t+44>>2];c[Q+48>>2]=c[t+48>>2];c[Q+52>>2]=c[t+52>>2]}else{c[Q>>2]=c[s>>2];c[Q+4>>2]=c[s+4>>2];c[Q+8>>2]=c[s+8>>2];c[Q+12>>2]=c[s+12>>2];c[Q+16>>2]=c[s+16>>2];c[Q+20>>2]=c[s+20>>2];c[Q+24>>2]=c[s+24>>2];c[Q+28>>2]=c[s+28>>2];c[Q+32>>2]=c[s+32>>2];c[Q+36>>2]=c[s+36>>2];c[Q+40>>2]=c[s+40>>2];c[Q+44>>2]=c[s+44>>2];c[Q+48>>2]=c[s+48>>2];c[Q+52>>2]=c[s+52>>2]}cT[d&15](7,-0.0-ac,al?0:am,n,0);c[N>>2]=ag}}while(0);W=c[W+16>>2]|0;}while((W|0)!=0)}if((c[p>>2]|0)!=3){w=B;x=z;y=E;break}i=e;return}}while(0);ac=+h[w>>3];ad=+h[x>>3];if((a[y]&1)==0){ao=1.0}else{ao=+bQ(+(+h[64792+(b*688&-1)>>3]))}x=ad>2]|0;do{if((p|0)==2){if((a[y]&1)==0|(b|0)==7){ad=+h[64952+(b*688&-1)>>3];ac=+h[64960+(b*688&-1)>>3];ae=+h[64968+(b*688&-1)>>3];if(ad==-8.988465674311579e+307){ap=ac*+O(+(F/ac))}else{ap=ad}if(ae!=8.988465674311579e+307){aq=ae;ar=ac;as=ap;break}aq=ac*+$(+(I/ac));ar=ac;as=ap;break}ac=+h[64968+(b*688&-1)>>3];if(ac<=0.0){i=e;return}ae=+h[64960+(b*688&-1)>>3];if(ae<=0.0){i=e;return}ad=+_(+ae);ae=+h[64800+(b*688&-1)>>3];X=ad/ae;ad=+h[64952+(b*688&-1)>>3];if(ad>0.0){at=+_(+ad)/ae}else{at=X*+O(+(F/X))}if(ac==8.988465674311579e+307){aq=X*+$(+(I/X));ar=X;as=at;break}else{aq=+_(+ac)/ae;ar=X;as=at;break}}else if((p|0)==1){X=+h[4880+(b<<3)>>3];ae=X*+O(+(F/X));aq=X*+$(+(I/X));ar=X;as=ae}else if((p|0)==4){ae=+O(+F);X=+$(+I);ac=+O(+((X-ae)/12.0));if(ac>=1.0){aq=X;ar=ac;as=ae;break}aq=X;ar=1.0;as=ae}else if((p|0)==5){ae=+O(+F);X=+$(+I);ac=+O(+((X-ae)/14.0));if(ac>=1.0){aq=X;ar=ac;as=ae;break}aq=X;ar=1.0;as=ae}else{uk(140640,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);p=aq>3]==0.0){au=q;av=1.0;aw=1.0;ax=0.0;break}do{if((q|0)==2){if(r<=0.0){au=0;av=1.0;aw=1.0;ax=0.0;break L424}as=aq/r;if((a[y]&1)==0){ay=2;az=aq;aA=as;break}ae=+h[64792+(b*688&-1)>>3];ay=2;az=aq*ae;aA=as*ae}else{if((a[y]&1)!=0){if(aq<=1.5){ae=+h[64792+(b*688&-1)>>3];as=ap-at;if(as>=10.0){au=0;av=ae;aw=1.0;ax=0.0;break L424}au=q;av=ae;aw=as<5.0?1.0:3.0;ax=2.0;break L424}as=aq*.2;if(aq<65535.0){aB=+(~~as|0)}else{aB=as}ay=q;az=aq;aA=aB<1.0?1.0:aB;break}if((c[64808+(b*688&-1)>>2]|0)!=1){if((q|0)!=3){au=0;av=1.0;aw=1.0;ax=0.0;break L424}as=+P(+aq);ay=3;az=aq;aA=aq*((~~(as/+R(10.0,+(+O(+(+bQ(+as))))))|0)==2?.5:.2);break}p=c[4608+(b<<2)>>2]|0;w=(p|0)<1?1:p;do{if((w|0)==1|(w|0)==2){if(aq<1440.0){aC=aq<720.0?aq<360.0?aq<120.0?aq<60.0?aq<20.0?aq<10.0?aq<5.0?0.0:1.0:5.0:10.0:20.0:60.0:120.0:180.0;break}aC=360.0}else if((w|0)==3){if(aq<86400.0){aC=aq<43200.0?aq<21600.0?aq<7200.0?aq<3600.0?aq<1200.0?0.0:600.0:1800.0:3600.0:7200.0:10800.0;break}aC=21600.0}else if((w|0)==4){if(aq<=172800.0){aC=aq>86400.0?43200.0:aq>46800.0?21600.0:aq>25200.0?10800.0:aq>14400.0?7200.0:aq>7200.0?3600.0:0.0;break}aC=86400.0}else if((w|0)==5){if(aq<=604800.0){aC=aq>172800.0?86400.0:0.0;break}aC=604800.0}else if((w|0)==6){if(aq<=63115200.0){aC=aq>15778800.0?7889400.0:aq>5259600.0?2629800.0:aq>1296.0e3?864.0e3:aq>172800.0?86400.0:0.0;break}aC=31557600.0}else if((w|0)==7){if(aq<=946728.0e4){aC=aq>631152.0e4?157788.0e4:aq>315576.0e4?631152.0e3:aq>157788.0e4?315576.0e3:aq>315576.0e3?157788.0e3:aq>63115200.0?31557600.0:aq>15778800.0?7889400.0:aq>5259600.0?2629800.0:0.0;break}aC=315576.0e4}else{aC=0.0}}while(0);ay=q;az=aq*.9;aA=aC}}while(0);if(aA>0.0){au=ay;av=az;aw=aA;ax=aA;break}au=0;av=az;aw=aA;ax=aA}}while(0);aA=aq*.01;az=ap+aA;ap=+P(+I);if(aq+((c[(c[3524]|0)+8>>2]|0)>>>0>>>0)){uh(-1,138720,(v=i,i=i+8|0,h[v>>3]=ar,v)|0);i=e;return}h[111]=at-aq;h[110]=at;L473:do{if(+h[110]>az){aF=aq}else{ar=aq*.25;while(1){if(+P(+(+h[110]- +h[111]))az){aF=aq;break L473}}uh(-1,137120,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);aF=az-at}}while(0);if(at>az){i=e;return}ay=(b|0)==7;q=(au|0)==0;au=65064+(b*688&-1)|0;E=64808+(b*688&-1)|0;z=4608+(b<<2)|0;B=aE1.5;n=64800+(b*688&-1)|0;am=o|0;o=4968+(b*51&-1)|0;s=65024+(b*688&-1)|0;t=j+4|0;m=64712+(b*688&-1)|0;an=64720+(b*688&-1)|0;I=at;at=0.0;while(1){do{if(ay){aG=at;aH=I}else{if((a[y]&1)!=0){aG=+Z(+(I*+h[n>>3]));aH=I;break}if((c[E>>2]|0)==1){aI=+da(c[z>>2]|0,I)}else{aI=I}aG=+P(+aI)aD){af=427;break}L495:do{if(aH>2]|0;if((ai|0)==5){ah=(~~+O(+(aG+.5))|0)%7&-1;cT[d&15](b,aH,72464+(((ah|0)<0?ah+7|0:ah)<<3)|0,j,c[u>>2]|0);aJ=aH;af=382;break}else if((ai|0)==4){ai=(~~+O(+(aG+-1.0))|0)%12&-1;cT[d&15](b,aH,72368+(((ai|0)<0?ai+12|0:ai)<<3)|0,j,c[u>>2]|0);aJ=aH;af=382;break}else{do{if((c[E>>2]|0)==1){t3(f,aG);aA=aG- +O(+aG);t4(am,49,o,f,aA);aK=aH}else{if((a[30528]&1)==0){ud(am,50,o,ao,aG);aK=aH;break}aA=+h[8685];ap=(c[17366]&1|0)==0?aA:0.0;aC=+P(+aG)+ap;if(ay){if((a[y]&1)==0){aL=aA;aM=I}else{ap=+_(+I);aB=+h[n>>3];aL=+_(+aA)/aB;aM=ap/aB}aN=I;aO=aM-aL}else{aN=aC;aO=aH}ud(am,50,o,ao,aN);aK=aO}}while(0);do{if((a[s]&1)!=0){aC=+h[m>>3];aB=+h[an>>3];if(aCaB){break L495}else{break}}else{if(aKaC){break L495}else{break}}}}while(0);cT[d&15](b,aK,am,j,c[u>>2]|0);if(!ay){aJ=aK;af=382;break}if((c[17433]&4|0)==0){aJ=aK;af=382;break}ai=c[t>>2]|0;c[t>>2]=-3;cT[d&15](7,-0.0-aK,am,j,c[u>>2]|0);c[t>>2]=ai;aJ=aK;af=382;break}}}while(0);L522:do{if((af|0)==382){af=0;if(q){break}if(+h[au>>3]==0.0|ax>=av){break}if(p){aC=ax;while(1){if((c[E>>2]|0)==1){aP=+da((c[z>>2]|0)-1|0,aJ+aC)}else{aP=aJ+aC}if(B){if(!(aPaD)){af=392}}else{if(!(aPaE)){af=392}}do{if((af|0)==392){af=0;if(w){if(aPF){break}}else{if(aPar){break}}cT[d&15](b,aP,0,k,0)}}while(0);aC=aw+aC;if(aC>=av){break L522}}}if(B){aC=ax;do{if((c[E>>2]|0)==1){aQ=+da((c[z>>2]|0)-1|0,aJ+aC)}else{if((a[y]&1)==0){aR=aC}else{aB=+_(+aC);aR=aB/+h[n>>3]}aQ=aJ+aR}do{if(!(aQaD)){if(w){if(aQF){break}}else{if(aQar){break}}cT[d&15](b,aQ,0,k,0)}}while(0);aC=aw+aC;}while(aC>2]|0)==1){aS=+da((c[z>>2]|0)-1|0,aJ+aC)}else{if((a[y]&1)==0){aT=aC}else{aB=+_(+aC);aT=aB/+h[n>>3]}aS=aJ+aT}do{if(!(aSaE)){if(w){if(aSF){break}}else{if(aSar){break}}cT[d&15](b,aS,0,k,0)}}while(0);aC=aw+aC;}while(aCaz){af=428;break}else{I=aC;at=aG}}if((af|0)==427){i=e;return}else if((af|0)==428){i=e;return}}function df(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0.0,v=0,w=0.0,x=0.0,y=0.0,z=0,A=0;g=c[3524]|0;i=(b&3|0)==1;j=(b&-4|0)==4;if(e>>>0>3){k=64768+(e*688&-1)|0;l=64772+(e*688&-1)|0}else{k=64772+(e*688&-1)|0;l=64768+(e*688&-1)|0}m=c[k>>2]|0;k=c[l>>2]|0;l=64916+(b*688&-1)|0;if((c[l>>2]|0)==0){return}n=65032+(b*688&-1)|0;o=c[n>>2]|0;do{if((o|0)==-270){if((cO[c[g+72>>2]&255](-270)|0)==0){p=c[n>>2]|0;q=441;break}if(i){c[1398]=1;r=j?0:2}else{c[1398]=j?0:2;r=1}c[1384]=r;c[6586]=-270;if((b|0)!=1){break}c[d>>2]=(c[d>>2]|0)+((c[g+16>>2]|0)>>>1)}else{p=o;q=441}}while(0);L599:do{if((q|0)==441){do{if((p|0)!=0){if((cO[c[g+72>>2]&255](p)|0)==0){break}if((b|0)==5){c[1398]=0}else if((b|0)==2){c[1398]=0}else if((b|0)==6){c[1398]=0}else if((b|0)==1){c[d>>2]=~~(+(c[d>>2]|0)+ +((c[g+20>>2]|0)>>>0>>>0)*2.5);c[1398]=2}else{c[1398]=0}c[1384]=1;c[6586]=c[n>>2];break L599}}while(0);if(i){c[1398]=j?0:2;s=1}else{c[1398]=1;s=j?2:0}c[1384]=s;c[6586]=0}}while(0);if((a[65272+(b*688&-1)|0]&1)==0){c[65128+(b*688&-1)>>2]=c[1398]}else{c[1398]=c[65128+(b*688&-1)>>2]}s=c[l>>2]|0;l=(s&4|0)==0;c[1396]=l?-1:m;do{if((s&2|0)==0){q=481}else{if((a[64788+(e*688&-1)|0]&1)!=0){q=481;break}t=+h[64664+(e*688&-1)>>3];u=+h[64672+(e*688&-1)>>3];if(t0.0|u<0.0){q=481;break}}else{if(u>0.0|t<0.0){q=481;break}}m=~~(+(c[64768+(e*688&-1)>>2]|0)+(0.0-t)*+h[64776+(e*688&-1)>>3]+.5);c[1394]=m;n=j?1:-1;c[1400]=n;if(!l){c[1396]=m}p=aa(m-k|0,j?-1:1);if(i){o=g+20|0;do{if(p>>>0>((c[o>>2]|0)*3&-1)>>>0){q=469}else{r=c[11692]|0;if(j){if((r&8|0)==0){q=469;break}else{v=k;break}}else{if((r&2|0)==0){q=469;break}else{v=k;break}}}}while(0);if((q|0)==469){v=m}c[1392]=v;c[1392]=aa(c[o>>2]|0,n)+v;break}r=g+16|0;do{if(p>>>0>c[r>>2]<<1>>>0){t=+(m|0);if(j){w=0.0;x=t;q=479}else{y=t;q=478}}else{z=c[11692]|0;if(j){if((z&4|0)!=0){A=k;break}w=0.0;x=+(m|0);q=479;break}else{if((z&1|0)!=0){A=k;break}y=+(m|0);q=478;break}}}while(0);if((q|0)==478){w=+((c[g+24>>2]|0)>>>0>>>0)*(-0.0- +h[65056+(b*688&-1)>>3]);x=y;q=479}if((q|0)==479){A=~~(x+w)}c[1392]=A;c[1392]=A-(c[r>>2]|0)}}while(0);if((q|0)==481){c[1394]=k;c[1400]=aa((a[65072+(b*688&-1)|0]&1)!=0?1:-1,j?-1:1);c[1392]=c[d>>2]}de(b,f);cO[c[g+72>>2]&255](0);return}function dg(b,d){b=b|0;d=d|0;var e=0,f=0,g=0.0,j=0.0,k=0.0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=i;i=i+16|0;f=e|0;g=+h[64664+(d*688&-1)>>3];if(g>0.0){j=+h[64672+(d*688&-1)>>3];if(j>0.0){k=j}else{l=488}}else{l=488}do{if((l|0)==488){if((a[64788+(d*688&-1)|0]&1)!=0){k=+h[64672+(d*688&-1)>>3];break}do{if(g<0.0){j=+h[64672+(d*688&-1)>>3];if(j>=0.0){break}if(j>2]=c[m>>2];i=e;return}}while(0);c[64784+(d*688&-1)>>2]=~~(+(c[64768+(d*688&-1)>>2]|0)+(0.0-g)*+h[64776+(d*688&-1)>>3]+.5);n=c[65284+(b*688&-1)>>2]|0;if((n|0)<=-3){i=e;return}o=f;p=65320+(b*688&-1)|0;c[o>>2]=c[p>>2];c[o+4>>2]=c[p+4>>2];c[o+8>>2]=c[p+8>>2];c[o+12>>2]=c[p+12>>2];do{if((c[65280+(b*688&-1)>>2]|0)!=0){j=+h[65304+(b*688&-1)>>3];p=c[(c[3524]|0)+92>>2]|0;if(j<0.0){cK[p&63](+h[3817]);break}else{cK[p&63](j);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[65296+(b*688&-1)>>3]);p=c[(c[3524]|0)+64>>2]|0;if((n|0)<-5){cM[p&511](-2)}else{cM[p&511](n)}p=c[3524]|0;do{if((a[65312+(b*688&-1)|0]&1)==0){if((c[p+96>>2]&1024|0)!=0){q=p;break}c[f>>2]=1;c[f+4>>2]=n;l=511}else{l=511}}while(0);if((l|0)==511){fn(f,p);q=c[3524]|0}n=c[q+56>>2]|0;if((b&3|0)==2){o=64784+(d*688&-1)|0;cN[n&255](c[64768+(b*688&-1)>>2]|0,c[o>>2]|0);cN[c[(c[3524]|0)+60>>2]&255](c[64772+(b*688&-1)>>2]|0,c[o>>2]|0);i=e;return}else{o=64784+(d*688&-1)|0;cN[n&255](c[o>>2]|0,c[64768+(b*688&-1)>>2]|0);cN[c[(c[3524]|0)+60>>2]&255](c[o>>2]|0,c[64772+(b*688&-1)>>2]|0);i=e;return}}}while(0);if(k>2]=c[r>>2];i=e;return}function dh(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0.0,L=0.0,M=0.0,N=0.0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0.0,V=0.0,W=0.0;g=i;i=i+208|0;j=g|0;k=g+24|0;l=g+48|0;m=g+72|0;n=g+96|0;o=g+144|0;p=g+152|0;q=g+200|0;r=(f|0)==1;s=(f|0)==2;if((f-1|0)>>>0>=2){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=133592,v)|0)}t=c[13898]|0;u=(c[8272]|0)>(t|0);L710:do{if(u){w=c[1054]|0;if((a[w+(t*40&-1)|0]&1)==0){x=533;break}y=c[w+(t*40&-1)+36>>2]|0;z=w+(t*40&-1)+32|0;w=c[10036]|0;A=0;while(1){if((A|0)>=(y|0)){break}if((a[w+((c[z>>2]|0)+A|0)|0]|0)==(a[A+134808|0]|0)){A=A+1|0}else{x=533;break L710}}if((A|0)!=1){x=533;break}c[e>>2]=c[e>>2]|f;if(r){z=64728+(b*688&-1)|0;c[z>>2]=c[z>>2]&-2;h[64736+(b*688&-1)>>3]=0.0}else{z=64732+(b*688&-1)|0;c[z>>2]=c[z>>2]&-2;h[64752+(b*688&-1)>>3]=0.0}z=(c[13898]|0)+1|0;c[13898]=z;B=z}else{x=533}}while(0);L722:do{if((x|0)==533){a[25288]=1;L724:do{if((c[64808+(b*688&-1)>>2]|0)==1){z=c[1054]|0;w=(a[z+(t*40&-1)|0]&1)==0;if(w){x=536}else{y=c[10036]|0;C=a[y+(c[z+(t*40&-1)+32>>2]|0)|0]|0;if((C<<24>>24|0)==39|(C<<24>>24|0)==34){D=y}else{x=536}}if((x|0)==536){y=c[10810]|0;if((y|0)==0){x=558;break}C=z+(t*40&-1)+36|0;E=z+(t*40&-1)+32|0;F=c[10036]|0;G=y;L731:while(1){y=c[G+4>>2]|0;L733:do{if(!(w|u^1)){H=c[C>>2]|0;I=0;while(1){if((I|0)>=(H|0)){break}if((a[F+((c[E>>2]|0)+I|0)|0]|0)==(a[y+I|0]|0)){I=I+1|0}else{break L733}}if((a[y+I|0]|0)==0){break L731}}}while(0);y=c[G>>2]|0;if((y|0)==0){x=558;break L724}else{G=y}}if((a[G+8|0]&1)!=0){x=558;break}if((c[G+16>>2]|0)==3){D=F}else{x=558;break}}L743:do{if(u){L745:do{if(!w){E=c[z+(t*40&-1)+36>>2]|0;C=z+(t*40&-1)+32|0;y=0;while(1){if((y|0)>=(E|0)){break}if((a[D+((c[C>>2]|0)+y|0)|0]|0)==(a[y+103664|0]|0)){y=y+1|0}else{break L745}}if((y|0)==1){J=0;break L743}}}while(0);a[14176]=1;is(m);a[14176]=0;if((c[m>>2]|0)==3){J=c[m+8>>2]|0;break}else{c[13898]=t;J=0;break}}else{J=0}}while(0);if((t1(J,64813+(b*688&-1)|0,n,o)|0)==0){K=0.0}else{L=+t2(n);K=L+ +h[o>>3]}uu(J);M=K}else{x=558}}while(0);do{if((x|0)==558){A=is(l)|0;z=c[A>>2]|0;if((z|0)==1){N=+(c[A+8>>2]|0)}else if((z|0)==2){N=+h[A+8>>3]}else if((z|0)==3){N=+uz(c[A+8>>2]|0,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}A=l|0;if((c[A>>2]|0)!=3){M=N;break}uu(c[l+8>>2]|0);c[A>>2]=1;M=N}}while(0);a[25288]=0;A=c[13898]|0;z=c[8272]|0;if((A|0)>=(z|0)){uf(A,129840,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}w=c[1054]|0;F=(a[w+(A*40&-1)|0]&1)==0;L772:do{if(!F){G=c[w+(A*40&-1)+36>>2]|0;C=w+(A*40&-1)+32|0;E=c[10036]|0;I=0;while(1){if((I|0)>=(G|0)){x=570;break}if((a[E+((c[C>>2]|0)+I|0)|0]|0)==(a[I+103664|0]|0)){I=I+1|0}else{break}}do{if((x|0)==570){if((I|0)!=1){break}uf(A,129840,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);if(F){break}I=c[w+(A*40&-1)+36>>2]|0;C=w+(A*40&-1)+32|0;E=c[10036]|0;G=0;while(1){if((G|0)>=(I|0)){x=576;break}if((a[E+((c[C>>2]|0)+G|0)|0]|0)==(a[G+136608|0]|0)){G=G+1|0}else{break}}do{if((x|0)==576){if((G|0)!=1){break}C=A+1|0;c[13898]=C;if((C|0)>=(z|0)){uf(C,127176,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}I=(a[w+(C*40&-1)|0]&1)==0;if(I){uf(C,126040,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}H=c[w+(C*40&-1)+36>>2]|0;O=w+(C*40&-1)+32|0;P=0;while(1){if((P|0)>=(H|0)){x=582;break}if((a[E+((c[O>>2]|0)+P|0)|0]|0)==(a[P+103664|0]|0)){P=P+1|0}else{break}}do{if((x|0)==582){if((P|0)!=1){break}uf(C,127176,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);if(I){uf(C,126040,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}P=c[w+(C*40&-1)+36>>2]|0;O=w+(C*40&-1)+32|0;H=0;while(1){if((H|0)>=(P|0)){break}if((a[E+((c[O>>2]|0)+H|0)|0]|0)==(a[H+134808|0]|0)){H=H+1|0}else{x=695;break}}if((x|0)==695){uf(C,126040,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((H|0)!=1){uf(C,126040,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[e>>2]=c[e>>2]|f;if(r){O=64728+(b*688&-1)|0;c[O>>2]=c[O>>2]|1;h[64736+(b*688&-1)>>3]=M}else{O=64732+(b*688&-1)|0;c[O>>2]=c[O>>2]|1;h[64752+(b*688&-1)>>3]=M}O=(c[13898]|0)+1|0;c[13898]=O;B=O;break L722}}while(0);if(F){break}E=c[w+(A*40&-1)+36>>2]|0;G=w+(A*40&-1)+32|0;O=c[10036]|0;P=0;while(1){if((P|0)>=(E|0)){break}if((a[O+((c[G>>2]|0)+P|0)|0]|0)==(a[P+138304|0]|0)){P=P+1|0}else{break L772}}if((P|0)!=1){break}uf(A,123680,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);c[e>>2]=c[e>>2]&(f^-1);if(r){c[64728+(b*688&-1)>>2]=0;h[64744+(b*688&-1)>>3]=0.0}else{c[64732+(b*688&-1)>>2]=0;h[64760+(b*688&-1)>>3]=0.0}h[d>>3]=M;B=c[13898]|0}}while(0);d=c[8272]|0;l=(B|0)>=(d|0);L830:do{if((c[e>>2]&f|0)==0){if(l){break}J=c[1054]|0;L923:do{if((a[J+(B*40&-1)|0]&1)!=0){o=c[J+(B*40&-1)+36>>2]|0;n=J+(B*40&-1)+32|0;t=c[10036]|0;m=0;while(1){if((m|0)>=(o|0)){break}if((a[t+((c[n>>2]|0)+m|0)|0]|0)==(a[m+103664|0]|0)){m=m+1|0}else{break L923}}if((m|0)==1){break L830}}}while(0);J=c[1054]|0;L930:do{if((a[J+(B*40&-1)|0]&1)!=0){n=c[J+(B*40&-1)+36>>2]|0;t=J+(B*40&-1)+32|0;o=c[10036]|0;P=0;while(1){if((P|0)>=(n|0)){break}if((a[o+((c[t>>2]|0)+P|0)|0]|0)==(a[P+136608|0]|0)){P=P+1|0}else{break L930}}if((P|0)!=1){break}uf(B,122232,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);J=c[1054]|0;if((a[J+(B*40&-1)|0]&1)==0){break}t=c[J+(B*40&-1)+36>>2]|0;o=J+(B*40&-1)+32|0;J=c[10036]|0;n=0;while(1){if((n|0)>=(t|0)){break}if((a[J+((c[o>>2]|0)+n|0)|0]|0)==(a[n+138304|0]|0)){n=n+1|0}else{break L830}}if((n|0)!=1){break}uf(B,122232,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{if(l){uf(B,129840,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}o=c[1054]|0;L835:do{if((a[o+(B*40&-1)|0]&1)!=0){J=c[o+(B*40&-1)+36>>2]|0;t=o+(B*40&-1)+32|0;m=c[10036]|0;D=0;while(1){if((D|0)>=(J|0)){break}if((a[m+((c[t>>2]|0)+D|0)|0]|0)==(a[D+103664|0]|0)){D=D+1|0}else{break L835}}if((D|0)!=1){break}uf(B,129840,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);o=c[1054]|0;L843:do{if((a[o+(B*40&-1)|0]&1)!=0){n=c[o+(B*40&-1)+36>>2]|0;t=o+(B*40&-1)+32|0;m=c[10036]|0;J=0;while(1){if((J|0)>=(n|0)){break}if((a[m+((c[t>>2]|0)+J|0)|0]|0)==(a[J+136608|0]|0)){J=J+1|0}else{break L843}}if((J|0)!=1){break}t=B+1|0;c[13898]=t;if((t|0)>=(d|0)){uf(t,127176,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}n=(a[o+(t*40&-1)|0]&1)==0;L853:do{if(!n){D=c[o+(t*40&-1)+36>>2]|0;P=o+(t*40&-1)+32|0;u=0;while(1){if((u|0)>=(D|0)){break}if((a[m+((c[P>>2]|0)+u|0)|0]|0)==(a[u+103664|0]|0)){u=u+1|0}else{break L853}}if((u|0)!=1){break}uf(t,127176,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);L861:do{if((c[64808+(b*688&-1)>>2]|0)==1){do{if(n){x=627}else{J=a[m+(c[o+(t*40&-1)+32>>2]|0)|0]|0;if(!((J<<24>>24|0)==39|(J<<24>>24|0)==34)){x=627;break}Q=j;x=639}}while(0);if((x|0)==627){u=c[10810]|0;if((u|0)==0){x=649;break}J=o+(t*40&-1)+36|0;P=o+(t*40&-1)+32|0;D=u;L869:while(1){u=c[D+4>>2]|0;L871:do{if(!n){C=c[J>>2]|0;H=0;while(1){if((H|0)>=(C|0)){break}if((a[m+((c[P>>2]|0)+H|0)|0]|0)==(a[u+H|0]|0)){H=H+1|0}else{break L871}}if((a[u+H|0]|0)==0){break L869}}}while(0);u=c[D>>2]|0;if((u|0)==0){x=649;break L861}else{D=u}}if((a[D+8|0]&1)!=0){x=649;break}if((c[D+16>>2]|0)!=3){x=649;break}P=j;if(n){R=P;x=643}else{Q=P;x=639}}L881:do{if((x|0)==639){P=c[o+(t*40&-1)+36>>2]|0;J=o+(t*40&-1)+32|0;u=0;while(1){if((u|0)>=(P|0)){break}if((a[m+((c[J>>2]|0)+u|0)|0]|0)==(a[u+103664|0]|0)){u=u+1|0}else{R=Q;x=643;break L881}}if((u|0)==1){S=0;T=Q}else{R=Q;x=643}}}while(0);do{if((x|0)==643){a[14176]=1;is(j);a[14176]=0;if((c[j>>2]|0)==3){S=c[j+8>>2]|0;T=R;break}else{c[13898]=t;S=0;T=R;break}}}while(0);if((t1(S,64813+(b*688&-1)|0,p,q)|0)==0){U=0.0}else{M=+t2(p);U=M+ +h[q>>3]}uu(S);V=U}else{x=649}}while(0);do{if((x|0)==649){t=is(k)|0;m=c[t>>2]|0;if((m|0)==1){W=+(c[t+8>>2]|0)}else if((m|0)==2){W=+h[t+8>>3]}else if((m|0)==3){W=+uz(c[t+8>>2]|0,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}t=k|0;if((c[t>>2]|0)!=3){V=W;break}uu(c[k+8>>2]|0);c[t>>2]=1;V=W}}while(0);if(r){t=64728+(b*688&-1)|0;c[t>>2]=c[t>>2]|2;h[64744+(b*688&-1)>>3]=V;break L830}else{t=64732+(b*688&-1)|0;c[t>>2]=c[t>>2]|2;h[64760+(b*688&-1)>>3]=V;break L830}}}while(0);o=c[1054]|0;L910:do{if((a[o+(B*40&-1)|0]&1)!=0){t=c[o+(B*40&-1)+36>>2]|0;m=o+(B*40&-1)+32|0;n=c[10036]|0;D=0;while(1){if((D|0)>=(t|0)){break}if((a[n+((c[m>>2]|0)+D|0)|0]|0)==(a[D+138304|0]|0)){D=D+1|0}else{break L910}}if((D|0)!=1){break}uf(B,123680,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);if(r){o=64728+(b*688&-1)|0;c[o>>2]=c[o>>2]&-3;h[64744+(b*688&-1)>>3]=0.0;break}else{o=64732+(b*688&-1)|0;c[o>>2]=c[o>>2]&-3;h[64760+(b*688&-1)>>3]=0.0;break}}}while(0);if((c[e>>2]&f|0)==0){i=g;return}do{if(r){f=64728+(b*688&-1)|0;if((c[f>>2]|0)!=3){break}if(+h[64744+(b*688&-1)>>3]>=+h[64736+(b*688&-1)>>3]){break}uh(c[13898]|0,120752,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);c[f>>2]=0}}while(0);if(!s){i=g;return}s=64732+(b*688&-1)|0;if((c[s>>2]|0)!=3){i=g;return}if(+h[64760+(b*688&-1)>>3]>=+h[64752+(b*688&-1)>>3]){i=g;return}uh(c[13898]|0,120752,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);c[s>>2]=0;i=g;return}function di(a,b,d,e,f){a=a|0;b=+b;d=d|0;e=e|0;f=f|0;f=i;a=e;e=i;i=i+56|0;uD(e,a,56);do{if((d|0)!=0){a=ga(d,0)|0;if((a|0)<=(c[216]|0)){break}c[216]=a}}while(0);i=f;return}function dj(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0.0,A=0.0;g=i;i=i+8|0;j=g|0;c[j>>2]=f;k=c[13898]|0;l=c[8272]|0;m=(l|0)>(k|0);if(!m){uf(k,116248,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}n=c[1054]|0;do{if((a[n+(k*40&-1)|0]&1)!=0){o=c[n+(k*40&-1)+36>>2]|0;p=n+(k*40&-1)+32|0;q=c[10036]|0;r=0;while(1){if((r|0)>=(o|0)){s=723;break}if((a[q+((c[p>>2]|0)+r|0)|0]|0)==(a[r+78864|0]|0)){r=r+1|0}else{break}}do{if((s|0)==723){if((r|0)!=1){break}c[64728+(b*688&-1)>>2]=0;c[64732+(b*688&-1)>>2]=0;t=f;i=g;return t|0}}while(0);if(m){break}uf(k,116248,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}}while(0);m=c[1054]|0;f=(a[m+(k*40&-1)|0]&1)==0;L984:do{if(f){s=742}else{n=c[m+(k*40&-1)+36>>2]|0;r=m+(k*40&-1)+32|0;p=c[10036]|0;q=0;while(1){if((q|0)>=(n|0)){s=730;break}if((a[p+((c[r>>2]|0)+q|0)|0]|0)==(a[q+103664|0]|0)){q=q+1|0}else{break}}do{if((s|0)==730){if((q|0)!=1){break}uf(k,116248,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}}while(0);if(f){s=742;break}q=c[m+(k*40&-1)+36>>2]|0;r=m+(k*40&-1)+32|0;p=c[10036]|0;n=0;while(1){if((n|0)>=(q|0)){s=736;break}if((a[p+((c[r>>2]|0)+n|0)|0]|0)==(a[n+187176|0]|0)){n=n+1|0}else{break}}if((s|0)==736){if((n|0)==2){u=k;w=l;break}}if(f){s=742;break}r=c[m+(k*40&-1)+36>>2]|0;p=m+(k*40&-1)+32|0;q=c[10036]|0;o=0;while(1){if((o|0)>=(r|0)){break}if((a[q+((c[p>>2]|0)+o|0)|0]|0)==(a[o+183584|0]|0)){o=o+1|0}else{s=742;break L984}}if((o|0)==1){u=k;w=l}else{s=742}}}while(0);if((s|0)==742){dh(b,d,j,1);u=c[13898]|0;w=c[8272]|0}l=(w|0)>(u|0);if(!l){uf(u,114504,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}k=c[1054]|0;do{if((a[k+(u*40&-1)|0]&1)==0){s=750}else{m=c[k+(u*40&-1)+36>>2]|0;f=k+(u*40&-1)+32|0;p=c[10036]|0;q=0;while(1){if((q|0)>=(m|0)){s=748;break}if((a[p+((c[f>>2]|0)+q|0)|0]|0)==(a[q+187176|0]|0)){q=q+1|0}else{break}}if((s|0)==748){if((q|0)==2){x=k;y=p;break}}if(l){s=750;break}uf(u,114504,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}}while(0);do{if((s|0)==750){l=c[1054]|0;if((a[l+(u*40&-1)|0]&1)==0){uf(u,114504,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}k=c[l+(u*40&-1)+36>>2]|0;f=l+(u*40&-1)+32|0;m=c[10036]|0;o=0;while(1){if((o|0)>=(k|0)){break}if((a[m+((c[f>>2]|0)+o|0)|0]|0)==(a[o+183584|0]|0)){o=o+1|0}else{s=774;break}}if((s|0)==774){uf(u,114504,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}if((o|0)==1){x=l;y=m;break}uf(u,114504,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}}while(0);f=u+1|0;c[13898]=f;L1033:do{if((w|0)>(f|0)){if((a[x+(f*40&-1)|0]&1)==0){s=762;break}u=c[x+(f*40&-1)+36>>2]|0;k=x+(f*40&-1)+32|0;p=0;while(1){if((p|0)>=(u|0)){break}if((a[y+((c[k>>2]|0)+p|0)|0]|0)==(a[p+78864|0]|0)){p=p+1|0}else{s=762;break L1033}}if((p|0)!=1){s=762}}else{s=762}}while(0);if((s|0)==762){dh(b,e,j,2)}s=c[j>>2]|0;if((s&3|0)!=0){t=s;i=g;return t|0}z=+h[e>>3];A=+h[d>>3];if(z>=A){t=s;i=g;return t|0}h[d>>3]=z;h[e>>3]=A;e=64656+(b*688&-1)|0;c[e>>2]=c[e>>2]|2;t=s;i=g;return t|0}function dk(){var b=0,d=0,e=0.0,f=0.0,g=0.0,j=0,k=0.0,l=0.0,m=0.0,n=0.0;b=i;d=c[16679]|0;e=+h[8341];if((d&1|0)==0|e<8.988465674311579e+307){f=e}else{e=+h[64664+((c[34]|0)*688&-1)>>3];if((a[64788]&1)==0){g=e}else{g=+Z(+(e*+h[8100]))}h[8341]=g;f=g}j=(a[66852]&1)==0;do{if(j){k=f}else{if(f>0.0){g=+_(+f);k=g/+h[8358];break}else{uk(210984,(v=i,i=i+24|0,c[v>>2]=112752,c[v+8>>2]=56904,h[v+16>>3]=f,v)|0);return 0}}}while(0);h[8341]=k;f=+h[8342];if((d&2|0)==0|f>-8.988465674311579e+307){l=f}else{f=+h[64672+((c[34]|0)*688&-1)>>3];if((a[64788]&1)==0){m=f}else{m=+Z(+(f*+h[8100]))}h[8342]=m;l=m}do{if(j){n=l}else{if(l>0.0){m=+_(+l);n=m/+h[8358];break}else{uk(210984,(v=i,i=i+24|0,c[v>>2]=112752,c[v+8>>2]=56904,h[v+16>>3]=l,v)|0);return 0}}}while(0);h[8342]=n;if(k<=n){i=b;return 1}h[8342]=k;h[8341]=n;i=b;return 1}function dl(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0.0,M=0.0,N=0,O=0,P=0,Q=0.0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0.0;e=i;i=i+328|0;f=e|0;g=e+24|0;j=e+48|0;k=e+72|0;l=e+96|0;m=e+120|0;n=e+144|0;o=e+152|0;p=e+160|0;q=e+208|0;r=e+216|0;s=e+264|0;t=e+272|0;u=e+320|0;c[o>>2]=d;uE(b|0,0,40);dm(o,n);d=c[o>>2]|0;c[b>>2]=d;w=c[n>>2]|0;L1080:do{if((w|0)>-1){if((c[64808+((w+2|0)*688&-1)>>2]|0)!=1){x=826;break}y=c[13898]|0;z=c[1054]|0;A=(a[z+(y*40&-1)|0]&1)==0;if(A){x=804}else{B=c[10036]|0;C=a[B+(c[z+(y*40&-1)+32>>2]|0)|0]|0;if((C<<24>>24|0)==39|(C<<24>>24|0)==34){D=B}else{x=804}}if((x|0)==804){B=c[10810]|0;if((B|0)==0){x=826;break}C=c[8272]|0;E=z+(y*40&-1)+36|0;F=z+(y*40&-1)+32|0;G=c[10036]|0;H=B;L1088:while(1){B=c[H+4>>2]|0;L1090:do{if(!((C|0)<=(y|0)|A)){I=c[E>>2]|0;J=0;while(1){if((J|0)>=(I|0)){break}if((a[G+((c[F>>2]|0)+J|0)|0]|0)==(a[B+J|0]|0)){J=J+1|0}else{break L1090}}if((a[B+J|0]|0)==0){break L1088}}}while(0);B=c[H>>2]|0;if((B|0)==0){x=826;break L1080}else{H=B}}if((a[H+8|0]&1)!=0){x=826;break}if((c[H+16>>2]|0)==3){D=G}else{x=826;break}}L1100:do{if((y|0)<(c[8272]|0)){L1102:do{if(!A){F=c[z+(y*40&-1)+36>>2]|0;E=z+(y*40&-1)+32|0;C=0;while(1){if((C|0)>=(F|0)){break}if((a[D+((c[E>>2]|0)+C|0)|0]|0)==(a[C+103664|0]|0)){C=C+1|0}else{break L1102}}if((C|0)==1){K=0;break L1100}}}while(0);a[14176]=1;is(l);a[14176]=0;if((c[l>>2]|0)==3){K=c[l+8>>2]|0;break}else{c[13898]=y;K=0;break}}else{K=0}}while(0);if((t1(K,66189,p,q)|0)!=0){L=+t2(p);h[b+16>>3]=L+ +h[q>>3]}uu(K)}else{x=826}}while(0);if((x|0)==826){K=is(k)|0;q=c[K>>2]|0;if((q|0)==1){M=+(c[K+8>>2]|0)}else if((q|0)==2){M=+h[K+8>>3]}else if((q|0)==3){M=+uz(c[K+8>>2]|0,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}K=k|0;if((c[K>>2]|0)==3){uu(c[k+8>>2]|0);c[K>>2]=1}h[b+16>>3]=M}K=c[13898]|0;L1128:do{if((c[8272]|0)>(K|0)){k=c[1054]|0;if((a[k+(K*40&-1)|0]&1)==0){x=874;break}q=c[k+(K*40&-1)+36>>2]|0;p=k+(K*40&-1)+32|0;k=c[10036]|0;l=0;while(1){if((l|0)>=(q|0)){break}if((a[k+((c[p>>2]|0)+l|0)|0]|0)==(a[l+148464|0]|0)){l=l+1|0}else{x=874;break L1128}}if((l|0)!=1){x=874;break}c[13898]=K+1;dm(o,n);p=c[o>>2]|0;c[b+4>>2]=p;k=c[n>>2]|0;L1136:do{if((k|0)>-1){if((c[64808+((k+1|0)*688&-1)>>2]|0)!=1){break}q=c[13898]|0;D=c[1054]|0;w=(a[D+(q*40&-1)|0]&1)==0;if(w){x=844}else{y=c[10036]|0;z=a[y+(c[D+(q*40&-1)+32>>2]|0)|0]|0;if((z<<24>>24|0)==39|(z<<24>>24|0)==34){N=y}else{x=844}}if((x|0)==844){y=c[10810]|0;if((y|0)==0){break}z=c[8272]|0;A=D+(q*40&-1)+36|0;G=D+(q*40&-1)+32|0;H=c[10036]|0;E=y;L1144:while(1){y=c[E+4>>2]|0;L1146:do{if(!((z|0)<=(q|0)|w)){F=c[A>>2]|0;J=0;while(1){if((J|0)>=(F|0)){break}if((a[H+((c[G>>2]|0)+J|0)|0]|0)==(a[y+J|0]|0)){J=J+1|0}else{break L1146}}if((a[y+J|0]|0)==0){break L1144}}}while(0);y=c[E>>2]|0;if((y|0)==0){break L1136}else{E=y}}if((a[E+8|0]&1)!=0){break}if((c[E+16>>2]|0)==3){N=H}else{break}}L1156:do{if((q|0)<(c[8272]|0)){L1158:do{if(!w){G=c[D+(q*40&-1)+36>>2]|0;A=D+(q*40&-1)+32|0;z=0;while(1){if((z|0)>=(G|0)){break}if((a[N+((c[A>>2]|0)+z|0)|0]|0)==(a[z+103664|0]|0)){z=z+1|0}else{break L1158}}if((z|0)==1){O=0;break L1156}}}while(0);a[14176]=1;is(j);a[14176]=0;if((c[j>>2]|0)==3){O=c[j+8>>2]|0;break}else{c[13898]=q;O=0;break}}else{O=0}}while(0);if((t1(O,65501,r,s)|0)!=0){M=+t2(r);h[b+24>>3]=M+ +h[s>>3]}uu(O);P=p;break L1128}}while(0);k=is(g)|0;l=c[k>>2]|0;if((l|0)==1){Q=+(c[k+8>>2]|0)}else if((l|0)==2){Q=+h[k+8>>3]}else if((l|0)==3){Q=+uz(c[k+8>>2]|0,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}k=g|0;if((c[k>>2]|0)==3){uu(c[g+8>>2]|0);c[k>>2]=1}h[b+24>>3]=Q;P=p}else{x=874}}while(0);if((x|0)==874){h[b+24>>3]=0.0;c[b+4>>2]=d;P=d}d=c[13898]|0;g=c[8272]|0;L1185:do{if((g|0)>(d|0)){O=c[1054]|0;if((a[O+(d*40&-1)|0]&1)==0){break}s=c[O+(d*40&-1)+36>>2]|0;r=O+(d*40&-1)+32|0;j=c[10036]|0;N=0;while(1){if((N|0)>=(s|0)){break}if((a[j+((c[r>>2]|0)+N|0)|0]|0)==(a[N+148464|0]|0)){N=N+1|0}else{break L1185}}if((N|0)!=1){break}r=d+1|0;s=(a[O+(r*40&-1)|0]&1)==0;if(!s){p=a[j+(c[O+(r*40&-1)+32>>2]|0)|0]|0;if((p<<24>>24|0)==39|(p<<24>>24|0)==34){break}}p=c[10810]|0;L1196:do{if((p|0)==0){R=O+(r*40&-1)+36|0;S=O+(r*40&-1)+32|0}else{K=O+(r*40&-1)+36|0;k=O+(r*40&-1)+32|0;l=p;L1199:while(1){q=c[l+4>>2]|0;L1201:do{if(!((g|0)<=(r|0)|s)){D=c[K>>2]|0;w=0;while(1){if((w|0)>=(D|0)){break}if((a[j+((c[k>>2]|0)+w|0)|0]|0)==(a[q+w|0]|0)){w=w+1|0}else{break L1201}}if((a[q+w|0]|0)==0){break L1199}}}while(0);q=c[l>>2]|0;if((q|0)==0){R=K;S=k;break L1196}else{l=q}}if((a[l+8|0]&1)!=0){R=K;S=k;break}if((c[l+16>>2]|0)==3){break L1185}else{R=K;S=k}}}while(0);p=c[R>>2]|0;O=c[S>>2]|0;L1211:do{if((p|0)>0&(s^1)){N=0;q=0;D=O;while(1){if((a[N+205224|0]|0)==(a[j+(N+D|0)|0]|0)){T=D;U=q}else{if((N|0)!=7){break}T=D-1|0;U=1}z=N+1|0;if((z|0)<(U+p|0)){N=z;q=U;D=T}else{x=899;break}}if((x|0)==899){if((U|0)!=0){break L1185}if((N|0)==6|(N|0)==12){break L1185}}if((p|0)>0&(s^1)){V=0}else{break}do{if((a[V+217064|0]|0)!=(a[j+(V+O|0)|0]|0)){break L1211}V=V+1|0;}while((V|0)<(p|0));if((V|0)==3){break L1185}}}while(0);c[13898]=r;dm(o,n);c[b+8>>2]=c[o>>2];p=c[n>>2]|0;L1227:do{if((p|0)>-1){if((c[64808+(p*688&-1)>>2]|0)!=1){break}O=c[13898]|0;j=c[1054]|0;s=(a[j+(O*40&-1)|0]&1)==0;if(s){x=909}else{N=c[10036]|0;D=a[N+(c[j+(O*40&-1)+32>>2]|0)|0]|0;if((D<<24>>24|0)==39|(D<<24>>24|0)==34){W=N}else{x=909}}if((x|0)==909){N=c[10810]|0;if((N|0)==0){break}D=c[8272]|0;q=j+(O*40&-1)+36|0;k=j+(O*40&-1)+32|0;K=c[10036]|0;l=N;L1235:while(1){N=c[l+4>>2]|0;L1237:do{if(!((D|0)<=(O|0)|s)){z=c[q>>2]|0;H=0;while(1){if((H|0)>=(z|0)){break}if((a[K+((c[k>>2]|0)+H|0)|0]|0)==(a[N+H|0]|0)){H=H+1|0}else{break L1237}}if((a[N+H|0]|0)==0){break L1235}}}while(0);N=c[l>>2]|0;if((N|0)==0){break L1227}else{l=N}}if((a[l+8|0]&1)!=0){break}if((c[l+16>>2]|0)==3){W=K}else{break}}L1247:do{if((O|0)<(c[8272]|0)){L1249:do{if(!s){k=c[j+(O*40&-1)+36>>2]|0;q=j+(O*40&-1)+32|0;D=0;while(1){if((D|0)>=(k|0)){break}if((a[W+((c[q>>2]|0)+D|0)|0]|0)==(a[D+103664|0]|0)){D=D+1|0}else{break L1249}}if((D|0)==1){X=0;break L1247}}}while(0);a[14176]=1;is(f);a[14176]=0;if((c[f>>2]|0)==3){X=c[f+8>>2]|0;break}else{c[13898]=O;X=0;break}}else{X=0}}while(0);if((t1(X,64813,t,u)|0)!=0){Q=+t2(t);h[b+32>>3]=Q+ +h[u>>3]}uu(X);i=e;return}}while(0);p=is(m)|0;r=c[p>>2]|0;if((r|0)==1){Y=+(c[p+8>>2]|0)}else if((r|0)==2){Y=+h[p+8>>3]}else if((r|0)==3){Y=+uz(c[p+8>>2]|0,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}p=m|0;if((c[p>>2]|0)==3){uu(c[m+8>>2]|0);c[p>>2]=1}h[b+32>>3]=Y;i=e;return}}while(0);h[b+32>>3]=0.0;c[b+8>>2]=P;i=e;return}function dm(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;e=c[13898]|0;f=c[1054]|0;g=c[f+(e*40&-1)+36>>2]|0;h=c[f+(e*40&-1)+32>>2]|0;i=(a[f+(e*40&-1)|0]&1)==0;L1278:do{if((g|0)>0&(i^1)){f=c[10036]|0;j=0;k=0;l=h;while(1){if((a[j+101440|0]|0)==(a[f+(j+l|0)|0]|0)){m=l;n=k}else{if((j|0)!=3){break}m=l-1|0;n=1}o=j+1|0;if((o|0)<(n+g|0)){j=o;k=n;l=m}else{p=950;break}}do{if((p|0)==950){if((n|0)==0){if(!((j|0)==5|(j|0)==2)){break}}c[13898]=e+1;c[b>>2]=0;p=990;break L1278}}while(0);if(!((g|0)>0&(i^1))){p=989;break}j=c[10036]|0;l=0;k=0;f=h;while(1){if((a[l+100944|0]|0)==(a[j+(l+f|0)|0]|0)){q=f;r=k}else{if((l|0)!=3){break}q=f-1|0;r=1}o=l+1|0;if((o|0)<(r+g|0)){l=o;k=r;f=q}else{p=959;break}}do{if((p|0)==959){if((r|0)==0){if(!((l|0)==6|(l|0)==2)){break}}c[13898]=e+1;c[b>>2]=1;p=991;break L1278}}while(0);if(!((g|0)>0&(i^1))){p=989;break}l=c[10036]|0;f=0;k=0;j=h;while(1){if((a[f+148408|0]|0)==(a[l+(f+j|0)|0]|0)){s=j;t=k}else{if((f|0)!=2){break}s=j-1|0;t=1}o=f+1|0;if((o|0)<(t+g|0)){f=o;k=t;j=s}else{p=968;break}}do{if((p|0)==968){if((t|0)==0){if(!((f|0)==5|(f|0)==1)){break}}c[13898]=e+1;c[b>>2]=2;p=992;break L1278}}while(0);if(!((g|0)>0&(i^1))){p=989;break}f=c[10036]|0;j=0;k=0;l=h;while(1){if((a[j+142056|0]|0)==(a[f+(j+l|0)|0]|0)){u=l;v=k}else{if((j|0)!=2){break}u=l-1|0;v=1}o=j+1|0;if((o|0)<(v+g|0)){j=o;k=v;l=u}else{p=977;break}}do{if((p|0)==977){if((v|0)==0){if(!((j|0)==6|(j|0)==1)){break}}c[13898]=e+1;c[b>>2]=3;p=992;break L1278}}while(0);if(!((g|0)>0&(i^1))){p=989;break}j=c[10036]|0;l=0;k=0;f=h;while(1){if((a[l+99320|0]|0)==(a[j+(l+f|0)|0]|0)){w=f;x=k}else{if((l|0)!=4){p=989;break L1278}w=f-1|0;x=1}o=l+1|0;if((o|0)<(x+g|0)){l=o;k=x;f=w}else{break}}if((x|0)==0){if(!((l|0)==3|(l|0)==9)){p=989;break}}c[13898]=e+1;c[b>>2]=4;p=992}else{p=989}}while(0);if((p|0)==989){e=c[b>>2]|0;if((e|0)==0){p=990}else if((e|0)==1){p=991}else{p=992}}if((p|0)==992){c[d>>2]=-1;return}else if((p|0)==990){c[d>>2]=0;return}else if((p|0)==991){c[d>>2]=4;return}}function dn(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;b=c[8272]|0;d=c[13898]|0;L1352:while(1){e=d+1|0;c[13898]=e;L1354:do{if((b|0)>(d|0)){f=c[1054]|0;if((a[f+(d*40&-1)|0]&1)==0){g=1004;break}h=c[f+(d*40&-1)+36>>2]|0;i=f+(d*40&-1)+32|0;f=c[10036]|0;j=0;while(1){if((j|0)>=(h|0)){break}if((a[f+((c[i>>2]|0)+j|0)|0]|0)==(a[j+78864|0]|0)){j=j+1|0}else{g=1004;break L1354}}if(!((j|0)!=1&(e|0)<(b|0))){g=1011;break L1352}}else{g=1004}}while(0);if((g|0)==1004){g=0;if((e|0)>=(b|0)){g=1012;break}}i=c[1054]|0;if((a[i+(e*40&-1)|0]&1)==0){d=e;continue}f=c[i+(e*40&-1)+36>>2]|0;h=i+(e*40&-1)+32|0;i=c[10036]|0;k=0;while(1){if((k|0)>=(f|0)){break}if((a[i+((c[h>>2]|0)+k|0)|0]|0)==(a[k+103664|0]|0)){k=k+1|0}else{d=e;continue L1352}}if((k|0)==1){g=1013;break}else{d=e}}if((g|0)==1013){return}else if((g|0)==1011){return}else if((g|0)==1012){return}}function dp(b,d,e,f){b=b|0;d=d|0;e=+e;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0,s=0,t=0;g=i;i=i+24|0;j=g|0;k=(d|0)!=0;if((f|0)<0&(k^1)){i=g;return}if((a[64976+(b*688&-1)|0]&1)==0){c[64920+(b*688&-1)>>2]=3}l=64944+(b*688&-1)|0;b=c[l>>2]|0;m=j+16|0;c[m>>2]=b;h[j>>3]=-1.7976931348623157e+308;n=j;j=b;while(1){o=n+16|0;if((j|0)==0){p=1022;break}q=+h[j>>3];if(q>=e){p=1021;break}n=j;j=c[j+16>>2]|0}do{if((p|0)==1021){if(q>e){p=1022;break}if(q!=e){uh(-1,105096,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);r=c[o>>2]|0}else{r=j}if((c[r+12>>2]|0)<(f|0)){i=g;return}n=r+8|0;b=c[n>>2]|0;if((b|0)==0){s=r;break}uu(b);c[n>>2]=0;s=r}}while(0);if((p|0)==1022){p=ut(24)|0;if((p|0)==0){gk();t=ut(24)|0}else{t=p}p=t;h[t>>3]=e;c[t+12>>2]=f;c[t+16>>2]=c[o>>2];c[o>>2]=p;s=p}if(k){c[s+8>>2]=bP(d|0)|0}else{c[s+8>>2]=0}c[l>>2]=c[m>>2];i=g;return}function dq(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;e=c[13898]|0;if((c[8272]|0)<=(e|0)){i=d;return}f=c[1054]|0;if((a[f+(e*40&-1)|0]&1)==0){i=d;return}g=c[f+(e*40&-1)+36>>2]|0;h=f+(e*40&-1)+32|0;f=c[10036]|0;j=0;while(1){if((j|0)>=(g|0)){break}if((a[f+((c[h>>2]|0)+j|0)|0]|0)==(a[j+78280|0]|0)){j=j+1|0}else{k=1056;break}}if((k|0)==1056){i=d;return}if((j|0)!=1){i=d;return}c[13898]=e+1;e=64648+(b*688&-1)|0;c[e>>2]=dj(b,64664+(b*688&-1)|0,64672+(b*688&-1)|0,c[e>>2]|0)|0;e=c[13898]|0;L1421:do{if((c[8272]|0)>(e|0)){b=c[1054]|0;if((a[b+(e*40&-1)|0]&1)==0){break}j=c[b+(e*40&-1)+36>>2]|0;k=b+(e*40&-1)+32|0;b=c[10036]|0;h=0;while(1){if((h|0)>=(j|0)){break}if((a[b+((c[k>>2]|0)+h|0)|0]|0)==(a[h+78864|0]|0)){h=h+1|0}else{break L1421}}if((h|0)!=1){break}c[13898]=e+1;i=d;return}}while(0);uf(e,101328,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}function dr(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;f=i;g=c[13898]|0;if((c[8272]|0)<=(g|0)){h=e;i=f;return h|0}j=c[1054]|0;if((a[j+(g*40&-1)|0]&1)==0){h=e;i=f;return h|0}k=c[j+(g*40&-1)+36>>2]|0;l=j+(g*40&-1)+32|0;m=c[10036]|0;n=0;while(1){if((n|0)>=(k|0)){break}if((a[m+((c[l>>2]|0)+n|0)|0]|0)==(a[n+78280|0]|0)){n=n+1|0}else{h=e;o=1085;break}}if((o|0)==1085){i=f;return h|0}if((n|0)!=1){h=e;i=f;return h|0}n=g+1|0;c[13898]=n;L1447:do{if((a[j+(n*40&-1)|0]&1)==0){p=e}else{if((bO(d[m+(c[j+(n*40&-1)+32>>2]|0)|0]|0|0)|0)==0){if((a[(c[10036]|0)+(c[(c[1054]|0)+(n*40&-1)+32>>2]|0)|0]|0)!=95){p=e;break}}g=c[13898]|0;l=g+1|0;if((c[8272]|0)<=(l|0)){p=e;break}k=c[1054]|0;if((a[k+(l*40&-1)|0]&1)==0){p=e;break}q=c[k+(l*40&-1)+36>>2]|0;r=k+(l*40&-1)+32|0;l=c[10036]|0;k=0;while(1){if((k|0)>=(q|0)){break}if((a[l+((c[r>>2]|0)+k|0)|0]|0)==(a[k+115e3|0]|0)){k=k+1|0}else{p=e;break L1447}}if((k|0)!=1){p=e;break}c[13898]=g+2;p=g}}while(0);e=64648+(b*688&-1)|0;c[e>>2]=dj(b,64664+(b*688&-1)|0,64672+(b*688&-1)|0,c[e>>2]|0)|0;e=c[13898]|0;if((c[8272]|0)<=(e|0)){uf(e,101328,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}b=c[1054]|0;if((a[b+(e*40&-1)|0]&1)==0){uf(e,101328,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}n=c[b+(e*40&-1)+36>>2]|0;j=b+(e*40&-1)+32|0;b=c[10036]|0;m=0;while(1){if((m|0)>=(n|0)){break}if((a[b+((c[j>>2]|0)+m|0)|0]|0)==(a[m+78864|0]|0)){m=m+1|0}else{o=1089;break}}if((o|0)==1089){uf(e,101328,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}if((m|0)!=1){uf(e,101328,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}c[13898]=e+1;h=p;i=f;return h|0}function ds(){var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0.0,B=0,C=0;d=i;e=hA(c[11932]|0,78360)|0;if((e|0)==0){uj(-1,146640,(v=i,i=i+8|0,c[v>>2]=c[11932],v)|0)}else{f=0;g=0}L1479:while(1){if((g|0)!=0){if((a_(f+(g-2|0)|0,86144,2)|0)==0){j=1104;break}}k=g+512|0;l=g+513|0;do{if((f|0)==0){m=ut(l)|0;if((m|0)!=0){n=m;break}gk();m=ut(l)|0;if((m|0)==0){j=1099;break L1479}else{n=m}}else{n=db(f,l,127720)|0}}while(0);l=n+g|0;a[l]=0;if((cd(l|0,512,1,e|0)|0)==0){j=1102;break}a[n+k|0]=0;f=n;g=k}if((j|0)==1099){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=127720,v)|0)}else if((j|0)==1102){uu(n);uj(-1,113448,(v=i,i=i+8|0,c[v>>2]=c[11932],v)|0)}else if((j|0)==1104){az(e|0);e=c[11864]|0;do{if((e|0)<1){n=1-e|0;do{if((c[11880]|0)<1){l=db(c[12172]|0,232,216568)|0;c[12172]=l;if((l|0)==0){c[11880]=0;uf(c[13898]|0,216112,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{c[11880]=1;break}}}while(0);if((n|0)<=0){break}k=c[12172]|0;l=0;m=c[11864]|0;do{uD(k+(m*232&-1)|0,48440,232);m=(c[11864]|0)+1|0;c[11864]=m;l=l+1|0;}while((l|0)<(n|0))}}while(0);e=aQ(f|0,100248)|0;L1506:do{if((e|0)==0){j=1122}else{n=a8(e+18|0,61)|0;do{n=n+1|0;}while((aM(a[n]|0|0)|0)!=0);if((n|0)==0){j=1122;break}l=bk(n|0,95048)|0;m=db(c[11932]|0,l+1|0,88488)|0;c[11932]=m;uF(m|0,n|0,l|0);a[(c[11932]|0)+l|0]=0;l=aQ(f|0,78632)|0;do{if((l|0)!=0){m=a8(l+22|0,61)|0;do{m=m+1|0;}while((aM(a[m]|0|0)|0)!=0);if((m|0)==0){break}k=bW(m|0)|0;c[(c[12172]|0)+128>>2]=k;break L1506}}while(0);c[(c[12172]|0)+128>>2]=0}}while(0);if((j|0)==1122){c[(c[12172]|0)+128>>2]=g}c[(c[12172]|0)+152>>2]=1;c[(c[12172]|0)+156>>2]=-1;a[(c[12172]|0)+124|0]=1;c[(c[12172]|0)+112>>2]=-3;c[(c[12172]|0)+116>>2]=-4;eQ(1);g=c[11950]|0;if((c[11884]|0)<1){j=db(g,12,215112)|0;c[11950]=j;c[11884]=1;o=j}else{o=g}c[o>>2]=0;o=c[11950]|0;if((c[11884]|0)<2){g=db(o,24,215112)|0;c[11950]=g;c[11884]=2;p=g}else{p=o}c[p+12>>2]=0;c[11870]=1;c[262]=1;p=aQ(f|0,73608)|0;do{if((p|0)!=0){o=a8(p+5|0,61)|0;do{o=o+1|0;}while((aM(a[o]|0|0)|0)!=0);if((o|0)==0){break}g=bW(o|0)|0;c[(c[12172]|0)+140>>2]=g}}while(0);p=aQ(f|0,218896)|0;do{if((p|0)!=0){g=a8(p+5|0,61)|0;do{g=g+1|0;}while((aM(a[g]|0|0)|0)!=0);if((g|0)==0){break}o=bW(g|0)|0;c[(c[12172]|0)+144>>2]=o}}while(0);p=aQ(f|0,213352)|0;L1542:do{if((p|0)!=0){o=a8(p+8|0,61)|0;do{o=o+1|0;}while((aM(a[o]|0|0)|0)!=0);if((o|0)==0){break}else{q=-1}while(1){r=q+1|0;g=c[46440+(r*12&-1)>>2]|0;if((r|0)==12){break L1542}if((a_(o|0,g|0,uA(g|0)|0)|0)==0){break}else{q=r}}if((r|0)<=-1){break}o=b[46448+(r*12&-1)>>1]|0;if((o|0)==1){g=1328>>>(r>>>0);do{if((g&1|0)==0){j=2752>>>(r>>>0);if(((j|g)&1|0)!=0){s=(j&1|0)!=0?11:5;break}if((q-1|0)>>>0<2){s=3;break}s=r>>>0<2?1:12}else{s=7}}while(0);g=c[11950]|0;if((c[11884]|0)<1){j=db(g,12,215112)|0;c[11950]=j;c[11884]=1;t=j}else{t=g}c[t+4>>2]=s;b[(c[11950]|0)+8>>1]=b[48036+(s<<4)>>1]|0;break}else if((o|0)==2){if((1328>>>(r>>>0)&1|0)==0){u=(2752>>>(r>>>0)&1|0)!=0?9:12}else{u=8}g=c[11950]|0;if((c[11884]|0)<1){j=db(g,12,215112)|0;c[11950]=j;c[11884]=1;w=j}else{w=g}c[w+4>>2]=u;b[(c[11950]|0)+8>>1]=b[48036+(u<<4)>>1]|0;break}else if((o|0)==0){g=1328>>>(r>>>0);do{if((g&1|0)==0){j=2752>>>(r>>>0);if(((j|g)&1|0)!=0){x=(j&1|0)!=0?10:4;break}if((q-1|0)>>>0<2){x=2;break}x=r>>>0<2?0:12}else{x=6}}while(0);g=c[11950]|0;if((c[11884]|0)<1){o=db(g,12,215112)|0;c[11950]=o;c[11884]=1;y=o}else{y=g}c[y+4>>2]=x;b[(c[11950]|0)+8>>1]=b[48036+(x<<4)>>1]|0;break}else{break}}}while(0);x=aQ(f|0,207688)|0;L1579:do{if((x|0)!=0){y=a8(x+9|0,61)|0;do{y=y+1|0;}while((aM(a[y]|0|0)|0)!=0);if((y|0)==0){break}do{if((aY(y|0,149792)|0)==0){z=0}else{r=(a_(y|0,149792,12)|0)!=0;if((aY(y|0,147968)|0)==0){z=1;break}q=(a_(y|0,147968,13)|0)==0&r?1:r<<31>>31;if((q|0)>-1){z=q}else{break L1579}}}while(0);c[12208]=c[46604+(z<<3)>>2]}}while(0);z=aQ(f|0,203264)|0;do{if((z|0)!=0){x=a8(z+8|0,61)|0;do{x=x+1|0;}while((aM(a[x]|0|0)|0)!=0);if((x|0)==0){break}A=+uz(x,0);y=c[12172]|0;h[y+200>>3]=A;c[y+192>>2]=1}}while(0);z=aQ(f|0,198216)|0;do{if((z|0)!=0){y=a8(z+8|0,61)|0;do{y=y+1|0;}while((aM(a[y]|0|0)|0)!=0);if((y|0)==0){break}A=+uz(y,0);x=c[12172]|0;h[x+208>>3]=A;c[x+192>>2]=1}}while(0);z=aQ(f|0,186936)|0;do{if((z|0)!=0){x=a8(z+8|0,61)|0;do{x=x+1|0;}while((aM(a[x]|0|0)|0)!=0);if((x|0)==0){break}A=+uz(x,0);y=c[12172]|0;h[y+200>>3]=A;c[y+192>>2]=2}}while(0);z=aQ(f|0,181632)|0;do{if((z|0)!=0){y=a8(z+8|0,61)|0;do{y=y+1|0;}while((aM(a[y]|0|0)|0)!=0);if((y|0)==0){break}A=+uz(y,0);x=c[12172]|0;h[x+208>>3]=A;c[x+192>>2]=2}}while(0);z=aQ(f|0,177440)|0;do{if((z|0)!=0){x=a8(z+7|0,61)|0;do{x=x+1|0;}while((aM(a[x]|0|0)|0)!=0);if((x|0)==0){break}A=+uz(x,0);h[(c[12172]|0)+168>>3]=A}}while(0);z=aQ(f|0,172936)|0;do{if((z|0)!=0){y=a8(z+7|0,61)|0;do{y=y+1|0;}while((aM(a[y]|0|0)|0)!=0);if((y|0)==0){break}A=+uz(y,0);h[(c[12172]|0)+176>>3]=A}}while(0);z=aQ(f|0,169160)|0;if((z|0)==0){uu(f);i=d;return}x=a8(z+10|0,61)|0;do{x=x+1|0;}while((aM(a[x]|0|0)|0)!=0);if((x|0)==0){uu(f);i=d;return}do{if((aY(x|0,155800)|0)==0){c[(c[12172]|0)+152>>2]=1;B=(c[12172]|0)+156|0}else{if((aY(x|0,151720)|0)==0){c[(c[12172]|0)+152>>2]=1;C=(c[12172]|0)+156|0}else{z=(a_(x|0,155800,11)|0)!=0;q=(a_(x|0,151720,9)|0)==0&z;c[(c[12172]|0)+152>>2]=1;z=(c[12172]|0)+156|0;if(q){C=z}else{B=z;break}}c[C>>2]=1;c[(c[12172]|0)+112>>2]=-3;c[(c[12172]|0)+116>>2]=-4;uu(f);i=d;return}}while(0);c[B>>2]=-1;c[(c[12172]|0)+112>>2]=-3;c[(c[12172]|0)+116>>2]=-4;uu(f);i=d;return}}function dt(){du(0)}function du(a){a=a|0;uf(-1,164848,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}function dv(){du(0)}function dw(){du(0)}function dx(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0.0,l=0;d=i;i=i+16|0;e=d|0;f=c[12372]|0;if((f|0)==2|(f|0)==5){g=(c[12374]<<4&65520)+f|0;j=1226}else if((f|0)==1|(f|0)==4){g=(c[12373]<<4&65520)+f|0;j=1226}else if((f|0)==0){c[b+8>>2]=1601}else{g=0;j=1226}if((j|0)==1226){c[b+8>>2]=g}cN[c[(c[3524]|0)+148>>2]&255](4,b);if((c[7661]|0)==0){i=d;return}g=e;c[g>>2]=c[7654];c[g+4>>2]=c[30620>>2];c[g+8>>2]=c[30624>>2];c[g+12>>2]=c[30628>>2];g=c[7645]|0;do{if((c[7644]|0)!=0){k=+h[3825];f=c[(c[3524]|0)+92>>2]|0;if(k<0.0){cK[f&63](+h[3817]);break}else{cK[f&63](k);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[3824]);f=c[(c[3524]|0)+64>>2]|0;if((g|0)<-5){cM[f&511](-2)}else{cM[f&511](g)}f=c[3524]|0;do{if((a[30608]&1)==0){if((c[f+96>>2]&1024|0)!=0){l=f;break}c[e>>2]=1;c[e+4>>2]=g;j=1238}else{j=1238}}while(0);if((j|0)==1238){fn(e,f);l=c[3524]|0}f=b|0;e=b+4|0;cN[c[l+56>>2]&255](c[f>>2]|0,c[e>>2]|0);cN[c[(c[3524]|0)+60>>2]&255](c[b+36>>2]|0,c[b+40>>2]|0);cN[c[(c[3524]|0)+60>>2]&255](c[b+24>>2]|0,c[b+28>>2]|0);cN[c[(c[3524]|0)+60>>2]&255](c[b+12>>2]|0,c[b+16>>2]|0);cN[c[(c[3524]|0)+60>>2]&255](c[f>>2]|0,c[e>>2]|0);i=d;return}function dy(a){a=a|0;var b=0,d=0,e=0.0,f=0.0,g=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0,D=0.0,E=0,F=0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0;b=i;i=i+48|0;d=b|0;e=+h[64664+((c[200]|0)*688&-1)>>3];f=+h[91];g=+h[96];j=+h[64664+((c[144]|0)*688&-1)>>3];k=+h[21];l=+h[68];m=+h[5279];n=+h[2];o=+h[12];p=+h[403];q=+h[391];r=+h[395];s=+h[399];t=+h[404];u=+h[392];v=+h[396];w=+h[400];x=+h[406];y=+h[394];z=+h[398];A=+h[402];B=+(c[180]|0);C=c[186]|0;D=+(c[40]|0);E=c[46]|0;F=0;do{G=(+h[a+(F<<5)>>3]-e)*f+g+-1.0;H=(+h[a+(F<<5)+8>>3]-j)*k+l+-1.0;I=(+h[a+(F<<5)+16>>3]-m)*n+o+-1.0;J=x+G*y+H*z+I*A;K=J==0.0?1.0e-5:J;c[d+(F*12&-1)>>2]=~~((p+G*q+H*r+I*s)/K*B)+C;c[d+(F*12&-1)+4>>2]=~~((t+G*u+H*v+I*w)/K*D)+E;F=F+1|0;}while((F|0)<4);dx(d|0);i=b;return}function dz(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;b=i;d=c[(c[3524]|0)+136>>2]|0;if((d|0)==0){e=1;i=b;return e|0}f=cO[d&255](0)|0;c[5169]=f;if((f|0)==0){if((uG(29056,20648,1024)|0)==0){e=0;i=b;return e|0}d=c[(c[3524]|0)+136>>2]|0;cO[d&255](20648);uD(29056,20648,1024);e=0;i=b;return e|0}d=c[5168]|0;do{if((d|0)>0){if((c[5163]|0)==100){c[5169]=f;g=f;break}if((f|0)<=(d|0)){g=f;break}c[5169]=d;g=d}else{g=f}}while(0);d=c[7264]|0;do{if((d|0)>-1&(c[5162]|0)==(d|0)){if((c[5163]|0)!=(c[7265]|0)){h=1261;break}if((c[5164]|0)!=(c[7266]|0)){h=1261;break}if((c[5165]|0)!=(c[7267]|0)){h=1261;break}if((c[5166]|0)!=(c[7268]|0)){h=1261;break}if(!((a[20668]|0)==(a[29076]|0)&(g|0)==(c[7271]|0))){h=1261}}else{h=1261}}while(0);do{if((h|0)==1261){if((a[37400]&1)==0){break}d=c[m>>2]|0;j=c[c[3524]>>2]|0;cf(d|0,218032,(v=i,i=i+24|0,c[v>>2]=j,c[v+8>>2]=g,c[v+16>>2]=f,v)|0)}}while(0);uD(29056,20648,1024);f=c[5170]|0;if((f|0)!=0){uu(f);c[5170]=0}f=(c[5169]|0)*24&-1;g=ut(f)|0;do{if((g|0)==0){gk();h=ut(f)|0;if((h|0)!=0){k=h;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=217512,v)|0);return 0}else{k=g}}while(0);g=k;c[5170]=g;k=c[5169]|0;L1722:do{if((k|0)>0){f=0;h=k;j=g;while(1){fq(+(f|0)/+(h-1|0),j+(f*24&-1)|0);d=f+1|0;l=c[5169]|0;if((d|0)>=(l|0)){break L1722}f=d;h=l;j=c[5170]|0}}}while(0);cO[c[(c[3524]|0)+136>>2]&255](20648);e=0;i=b;return e|0}function dA(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0,s=0;d=i;e=a*12&-1;f=ut(e)|0;do{if((f|0)==0){gk();g=ut(e)|0;if((g|0)!=0){j=g;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=164072,v)|0)}else{j=f}}while(0);f=j;if((a|0)>0){e=0;do{k=(+h[b+(e<<6)+8>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;l=(+h[b+(e<<6)+16>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;m=(+h[b+(e<<6)+24>>3]- +h[5279])*+h[2]+ +h[12]+-1.0;n=+h[406]+k*+h[394]+l*+h[398]+m*+h[402];o=n==0.0?1.0e-5:n;g=~~((+h[404]+k*+h[392]+l*+h[396]+m*+h[400])/o*+(c[40]|0))+(c[46]|0)|0;c[f+(e*12&-1)>>2]=~~((+h[403]+k*+h[391]+l*+h[395]+m*+h[399])/o*+(c[180]|0))+(c[186]|0);c[f+(e*12&-1)+4>>2]=g;e=e+1|0;}while((e|0)<(a|0))}e=c[12372]|0;if((e|0)==1|(e|0)==4){p=(c[12373]<<4&65520)+e|0}else if((e|0)==2|(e|0)==5){p=(c[12374]<<4&65520)+e|0}else if((e|0)==0){c[j+8>>2]=1601;q=c[3524]|0;r=q+148|0;s=c[r>>2]|0;cN[s&255](a,f);uu(j);i=d;return}else{p=0}c[j+8>>2]=p;q=c[3524]|0;r=q+148|0;s=c[r>>2]|0;cN[s&255](a,f);uu(j);i=d;return}function dB(a,b,d){a=a|0;b=b|0;d=+d;var e=0,f=0,g=0,j=0,k=0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0,t=0;e=i;f=a*12&-1;g=ut(f)|0;do{if((g|0)==0){gk();j=ut(f)|0;if((j|0)!=0){k=j;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=136792,v)|0)}else{k=g}}while(0);g=k;if((a|0)>0){f=0;do{l=(+h[b+(f<<6)+8>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;m=(+h[b+(f<<6)+16>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;n=(d- +h[5279])*+h[2]+ +h[12]+-1.0;o=+h[406]+l*+h[394]+m*+h[398]+n*+h[402];p=o==0.0?1.0e-5:o;j=~~((+h[404]+l*+h[392]+m*+h[396]+n*+h[400])/p*+(c[40]|0))+(c[46]|0)|0;c[g+(f*12&-1)>>2]=~~((+h[403]+l*+h[391]+m*+h[395]+n*+h[399])/p*+(c[180]|0))+(c[186]|0);c[g+(f*12&-1)+4>>2]=j;f=f+1|0;}while((f|0)<(a|0))}f=c[12372]|0;if((f|0)==0){c[k+8>>2]=1601;q=c[3524]|0;r=q+148|0;s=c[r>>2]|0;cN[s&255](a,g);uu(k);i=e;return}else if((f|0)==1|(f|0)==4){t=(c[12373]<<4&65520)+f|0}else if((f|0)==2|(f|0)==5){t=(c[12374]<<4&65520)+f|0}else{t=0}c[k+8>>2]=t;q=c[3524]|0;r=q+148|0;s=c[r>>2]|0;cN[s&255](a,g);uu(k);i=e;return}function dC(b,d,e,f,g){b=b|0;d=+d;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;j=i;i=i+64|0;k=f;f=i;i=i+56|0;uD(f,k,56);k=j|0;l=j+16|0;m=j+32|0;n=j+48|0;o=j+56|0;p=(e|0)!=0;q=c[3524]|0;r=~~(+((c[q+28>>2]|0)>>>0>>>0)*(p?+h[8390]:+h[8391])*((a[67136]&1)!=0?-1.0:1.0));s=+h[8341];t=(d-s)/(+h[8342]-s);if((a[54017]|0)==104){u=c[13528]|0;v=~~(+(u|0)+t*+((c[13529]|0)-u|0));u=c[13530]|0;w=u-r|0;x=v;y=u;z=v}else{v=c[13529]|0;u=c[13530]|0;A=~~(+(u|0)+t*+((c[13531]|0)-u|0));w=A;x=v+r|0;y=A;z=v}v=c[f+4>>2]|0;do{if((v|0)>-3){A=m;u=f+40|0;c[A>>2]=c[u>>2];c[A+4>>2]=c[u+4>>2];c[A+8>>2]=c[u+8>>2];c[A+12>>2]=c[u+12>>2];do{if((c[f>>2]|0)!=0){t=+h[f+24>>3];u=c[q+92>>2]|0;if(t<0.0){cK[u&63](+h[3817]);break}else{cK[u&63](t);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[f+16>>3]);u=c[(c[3524]|0)+64>>2]|0;if((v|0)<-5){cM[u&511](-2)}else{cM[u&511](v)}u=c[3524]|0;do{if((a[f+32|0]&1)==0){if((c[u+96>>2]&1024|0)!=0){B=u;break}c[m>>2]=1;c[m+4>>2]=v;C=1317}else{C=1317}}while(0);if((C|0)==1317){fn(m,u);B=c[3524]|0}A=c[B+56>>2]|0;if((a[54017]|0)==104){cN[A&255](z,c[13530]|0);cN[c[(c[3524]|0)+60>>2]&255](z,c[13531]|0)}else{cN[A&255](c[13528]|0,y);cN[c[(c[3524]|0)+60>>2]&255](c[13529]|0,y)}A=l;c[A>>2]=c[14084];c[A+4>>2]=c[56340>>2];c[A+8>>2]=c[56344>>2];c[A+12>>2]=c[56348>>2];A=c[14075]|0;do{if((c[14074]|0)!=0){t=+h[7040];D=c[(c[3524]|0)+92>>2]|0;if(t<0.0){cK[D&63](+h[3817]);break}else{cK[D&63](t);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[7039]);u=c[(c[3524]|0)+64>>2]|0;if((A|0)<-5){cM[u&511](-2)}else{cM[u&511](A)}u=c[3524]|0;if((a[56328]&1)==0){if((c[u+96>>2]&1024|0)!=0){E=u;break}c[l>>2]=1;c[l+4>>2]=A}fn(l,u);E=c[3524]|0}else{E=q}}while(0);cN[c[E+56>>2]&255](z,y);cN[c[(c[3524]|0)+60>>2]&255](x,w);do{if(p){L1804:do{if((g|0)==0){F=e}else{t=+h[8342]- +h[8341];E=g;while(1){if(+P(+((d- +h[E>>3])/t))<=.001){F=0;break L1804}q=c[E+16>>2]|0;if((q|0)==0){F=e;break}else{E=q}}}}while(0);fx(64984+(b*688&-1)|0,n,o,123416);A=64928+(b*688&-1)|0;if((c[A>>2]|0)!=0){fn(A,c[3524]|0)}do{if((a[54017]|0)==104){A=c[3524]|0;E=(c[13530]|0)-(c[A+16>>2]|0)|0;q=65032+(b*688&-1)|0;l=c[q>>2]|0;do{if((l|0)==0){G=0}else{if((cO[c[A+72>>2]&255](l)|0)==0){G=0;break}G=c[q>>2]|0}}while(0);q=E+((r|0)>0?-r|0:0)|0;l=(G|0)!=0;if((a[65272+(b*688&-1)|0]&1)==0){H=l&1^1}else{H=c[65128+(b*688&-1)>>2]|0}ln((c[n>>2]|0)+x|0,(c[o>>2]|0)+((q|0)<0?0:q)|0,F,H,1,G,c[64924+(b*688&-1)>>2]|0);if(!l){break}l=c[(c[3524]|0)+72>>2]|0;cO[l&255](0)}else{if((a[65272+(b*688&-1)|0]&1)==0){I=0}else{I=c[65128+(b*688&-1)>>2]|0}ln((((c[13529]|0)+((r|0)>0?r:0)|0)+(c[(c[3524]|0)+20>>2]|0)|0)+(c[n>>2]|0)|0,(c[o>>2]|0)+w|0,F,I,1,0,c[64924+(b*688&-1)>>2]|0)}}while(0);l=k;c[l>>2]=c[14084];c[l+4>>2]=c[56340>>2];c[l+8>>2]=c[56344>>2];c[l+12>>2]=c[56348>>2];l=c[14075]|0;do{if((c[14074]|0)!=0){t=+h[7040];q=c[(c[3524]|0)+92>>2]|0;if(t<0.0){cK[q&63](+h[3817]);break}else{cK[q&63](t);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[7039]);q=c[(c[3524]|0)+64>>2]|0;if((l|0)<-5){cM[q&511](-2)}else{cM[q&511](l)}q=c[3524]|0;if((a[56328]&1)==0){if((c[q+96>>2]&1024|0)!=0){break}c[k>>2]=1;c[k+4>>2]=l}fn(k,q)}}while(0);if((c[16745]&4|0)==0){i=j;return}if((a[54017]|0)==104){k=c[13531]|0;J=k+r|0;K=x;L=k;M=z}else{z=c[13528]|0;J=w;K=z-r|0;L=y;M=z}cN[c[(c[3524]|0)+56>>2]&255](M,L);cN[c[(c[3524]|0)+60>>2]&255](K,J);i=j;return}function dD(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ab=0.0,ac=0.0,ad=0.0,ae=0.0,af=0.0,ag=0.0,ah=0.0,ai=0.0,aj=0.0,ak=0.0,al=0.0,am=0.0,an=0.0,ao=0.0,ap=0.0,aq=0.0,ar=0.0,as=0.0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0,aA=0,aB=0,aC=0,aD=0,aE=0,aF=0,aG=0,aH=0,aJ=0,aK=0.0,aL=0,aM=0,aN=0,aO=0,aP=0,aQ=0,aR=0,aS=0,aT=0,aU=0,aV=0.0,aW=0.0,aX=0,aY=0,aZ=0,a_=0.0,a$=0,a0=0,a1=0,a2=0,a3=0,a4=0;d=i;i=i+304|0;e=d|0;f=d+16|0;g=d+32|0;j=d+48|0;k=d+64|0;l=d+80|0;m=d+128|0;n=d+136|0;o=d+144|0;p=d+152|0;q=d+160|0;r=d+168|0;s=d+176|0;t=d+184|0;u=d+192|0;w=d+232|0;x=d+272|0;y=d+280|0;z=d+288|0;A=d+296|0;B=c[10028]|0;C=a[54016]|0;if(C<<24>>24==110){i=d;return}D=c[3524]|0;if((c[D+148>>2]|0)==0){i=d;return}do{if(C<<24>>24==117){do{if((a[37384]&1)==0){fR(54032,o,p,106096);c[13528]=~~+h[o>>3];c[13530]=~~+h[p>>3];fN(54072,q,r,106096);E=~~+h[q>>3];c[13529]=E;F=~~+h[r>>3];c[13531]=F;G=E;H=F}else{if((c[5094]|0)==0){F=D+8|0;c[13528]=~~(+h[6756]*+((c[F>>2]|0)>>>0>>>0)+.5);E=D+12|0;c[13530]=~~(+h[6757]*+((c[E>>2]|0)>>>0>>>0)+.5);I=~~(+h[6761]*+(((c[F>>2]|0)-1|0)>>>0>>>0)+.5);c[13529]=I;F=~~(+h[6762]*+(((c[E>>2]|0)-1|0)>>>0>>>0)+.5);c[13531]=F;G=I;H=F;break}else{fK(54032,s,t,106096);c[13528]=~~+h[s>>3];c[13530]=~~+h[t>>3];fx(54072,54116,54124,106096);G=c[13529]|0;H=c[13531]|0;break}}}while(0);F=c[13528]|0;I=G+F|0;c[13529]=I;E=c[13530]|0;J=H+E|0;c[13531]=J;K=E;L=J;M=F;N=I}else{do{if((b|0)!=2|(c[5094]|0)!=0){if((a[37384]&1)==0){uE(u|0,0,40);c[u>>2]=2;c[u+4>>2]=2;c[u+8>>2]=2;h[u+16>>3]=1.025;uE(w|0,0,40);c[w>>2]=2;c[w+4>>2]=2;c[w+8>>2]=2;h[w+16>>3]=.05;h[w+24>>3]=1.0;fR(u,m,n,106096);I=~~+h[m>>3];c[13530]=~~+h[n>>3];c[13528]=I+(c[13507]|0);fN(w,x,y,106096);I=c[13528]|0;F=~~(+h[x>>3]+ +(I|0));c[13529]=F;J=c[13530]|0;E=~~(+h[y>>3]+ +(J|0));c[13531]=E;O=J;P=E;Q=I;R=F;break}else{F=c[200]|0;S=+h[64672+(F*688&-1)>>3];T=+h[64664+(F*688&-1)>>3];U=S-T;F=c[144]|0;V=+h[64664+(F*688&-1)>>3];W=+h[91];X=+h[96];Y=(S+U*.025-T)*W+X+-1.0;Z=+h[21];_=+h[68];$=(V-V)*Z+_+-1.0;aa=+h[5279];ab=+h[2];ac=+h[12];ad=(+h[7076]-aa)*ab+ac+-1.0;ae=+h[403];af=+h[391];ag=+h[395];ah=+h[399];ai=+h[404];aj=+h[392];ak=+h[396];al=+h[400];am=+h[406];an=+h[394];ao=+h[398];ap=+h[402];aq=am+Y*an+$*ao+ad*ap;ar=aq==0.0?1.0e-5:aq;aq=+(c[180]|0);I=c[186]|0;E=~~((ae+Y*af+$*ag+ad*ah)/ar*aq)+I|0;as=+(c[40]|0);J=c[46]|0;at=~~((ai+Y*aj+$*ak+ad*al)/ar*as)+J|0;c[13528]=E;c[13530]=at;ar=(U*.075+S-T)*W+X+-1.0;X=(+h[64672+(F*688&-1)>>3]-V)*Z+_+-1.0;_=(+h[6915]-aa)*ab+ac+-1.0;ac=am+ar*an+X*ao+_*ap;ap=ac==0.0?1.0e-5:ac;F=~~((ae+ar*af+X*ag+_*ah)/ap*aq)+I|0;I=~~((ai+ar*aj+X*ak+_*al)/ap*as)+J|0;c[13529]=F;c[13531]=I;O=at;P=I;Q=E;R=F;break}}else{as=+(c[186]|0);ap=+(c[180]|0);F=~~(as+ap*.709);c[13528]=F;E=~~(as+ap*.778);c[13529]=E;ap=+(c[46]|0);as=+(c[40]|0);I=~~(ap-as*.147);c[13530]=I;at=~~(ap+as*.497);c[13531]=at;O=I;P=at;Q=F;R=E}}while(0);if((a[54017]|0)!=118){K=O;L=P;M=Q;N=R;break}as=+((c[(c[3524]|0)+28>>2]|0)>>>0>>>0);E=~~(+h[8390]*((a[67136]&1)!=0?-1.0:1.0)*as);F=c[144]|0;at=~~(as*+h[65056+(F*688&-1)>>3]*((a[65072+(F*688&-1)|0]&1)!=0?-1.0:1.0));do{if((E|0)>0){if((c[16745]&4|0)==0){au=Q;av=R;break}F=Q+E|0;c[13528]=F;I=R+E|0;c[13529]=I;au=F;av=I}else{au=Q;av=R}}while(0);if((at|0)<=0){K=O;L=P;M=au;N=av;break}if((c[16401]&4|0)==0){K=O;L=P;M=au;N=av;break}E=au+at|0;c[13528]=E;I=av+at|0;c[13529]=I;K=O;L=P;M=E;N=I}}while(0);if((K|0)>(L|0)){c[13531]=K;c[13530]=L;aw=L;ax=K}else{aw=K;ax=L}if((c[(c[3524]|0)+96>>2]&16|0)==0){if((a[54017]|0)==118){L=l+36|0;c[L>>2]=M;K=l|0;c[K>>2]=M;P=l+24|0;c[P>>2]=N;O=l+12|0;c[O>>2]=N;ay=ax-aw|0;az=ax;aA=aw;aB=l+16|0;aC=l+4|0;aD=l+40|0;aE=l+28|0;aF=L;aG=K;aH=P;aJ=O}else{O=l+16|0;c[O>>2]=aw;P=l+4|0;c[P>>2]=aw;K=l+40|0;c[K>>2]=ax;L=l+28|0;c[L>>2]=ax;ay=N-M|0;az=N;aA=M;aB=O;aC=P;aD=K;aE=L;aF=l+36|0;aG=l|0;aH=l+24|0;aJ=l+12|0}as=+(ay|0)*.0078125;ap=+(az-aA|0);ay=1-aA|0;L=l+8|0;K=l|0;l=k|0;P=k+8|0;O=k+4|0;av=aA;au=0;R=0;while(1){Q=~~(as*+(R+1|0))+aA|0;al=+(ay+av|0)/ap;if((a[20668]|0)==110){aK=1.0-al}else{aK=al}y=(c[3524]|0)+144|0;if((c[y>>2]|0)!=0){c[l>>2]=5;h[P>>3]=aK;c[O>>2]=0;cM[c[y>>2]&511](k)}L1909:do{if((c[5163]|0)==100){y=c[5172]|0;x=c[5173]|0;w=au;n=au;while(1){if((w|0)>=(y|0)){aL=R;aM=n;aN=Q;break L1909}aO=~~(ap*+h[x+(w<<5)>>3])+aA|0;if((av|0)<(aO|0)){if((Q|0)>(aO|0)){break}else{aP=n}}else{aP=w}if((Q|0)<(aO|0)){aL=R;aM=aP;aN=Q;break L1909}else{w=w+1|0;n=aP}}aL=R-1|0;aM=n;aN=aO}else{aL=R;aM=au;aN=Q}}while(0);if((a[54017]|0)==118){c[aB>>2]=av;c[aC>>2]=av;Q=aN+1|0;at=(az|0)<(Q|0)?az:Q;c[aD>>2]=at;c[aE>>2]=at}else{c[aF>>2]=av;c[aG>>2]=av;at=aN+1|0;Q=(az|0)<(at|0)?az:at;c[aH>>2]=Q;c[aJ>>2]=Q}Q=c[12372]|0;if((Q|0)==0){aQ=1601}else if((Q|0)==1|(Q|0)==4){aR=(c[12373]<<4&65520)+Q|0;aS=1421}else if((Q|0)==2|(Q|0)==5){aR=(c[12374]<<4&65520)+Q|0;aS=1421}else{aR=0;aS=1421}if((aS|0)==1421){aS=0;aQ=aR}c[L>>2]=aQ;cN[c[(c[3524]|0)+148>>2]&255](4,K);Q=aL+1|0;if((Q|0)<128){av=aN;au=aM;R=Q}else{break}}}else{aI(92952,104,1,B|0);R=c[13530]|0;cf(B|0,85112,(v=i,i=i+32|0,c[v>>2]=c[13528],c[v+8>>2]=R,c[v+16>>2]=N-M,c[v+24>>2]=ax-aw,v)|0);aI(76928,42,1,B|0);if((a[20668]|0)==110){aI(224696,19,1,B|0)}else{aI(217376,7,1,B|0)}if((a[54017]|0)==118){aI(211744,30,1,B|0)}else{aI(205632,30,1,B|0)}aI(202264,85,1,B|0)}do{if((a[54018]|0)!=0){B=c[13505]|0;do{if((B|0)>-1){aw=c[14074]|0;ap=+h[7039];aK=+h[7040];ax=a[56328]|0;as=+h[7043];M=43280;while(1){aT=c[M>>2]|0;if((aT|0)==0){aS=1429;break}if((c[aT+4>>2]|0)==(B|0)){aS=1428;break}else{M=aT|0}}L1952:do{if((aS|0)==1428){M=c[aT+12>>2]|0;n=a[aT+40|0]|0;N=(n&1)==0;aU=M;aV=+h[aT+24>>3];aW=+h[aT+32>>3];aX=n;aY=N?1:c[aT+48>>2]|0;aZ=N?M:c[aT+52>>2]|0;a_=+h[aT+56>>3]}else if((aS|0)==1429){M=c[8798]|0;N=(M|0)>0;n=B;L1955:while(1){R=43264;while(1){a$=c[R>>2]|0;if((a$|0)==0){break}if((c[a$+4>>2]|0)==(n|0)){break L1955}else{R=a$|0}}R=n-1|0;if(!((n|0)>(M|0)&N)){aU=R;aV=ap;aW=aK;aX=ax;aY=1;aZ=R;a_=as;break L1952}n=((R|0)%(M|0)&-1)+1|0}M=c[a$+12>>2]|0;al=+h[a$+24>>3];_=+h[a$+32>>3];N=a[a$+40|0]|0;R=c[a$+48>>2]|0;aM=c[a$+52>>2]|0;ak=+h[a$+56>>3];if((c[(c[3524]|0)+96>>2]&1024|0)!=0){aU=n;aV=al;aW=_;aX=0;aY=R;aZ=aM;a_=ak;break}au=(N&1)==0;aU=M;aV=al;aW=_;aX=N;aY=au?1:R;aZ=au?M:aM;a_=ak}}while(0);ax=j|0;c[ax>>2]=aY;aM=j+4|0;c[aM>>2]=aZ;h[j+8>>3]=a_;do{if((aw|0)!=0){M=c[(c[3524]|0)+92>>2]|0;if(aW<0.0){cK[M&63](+h[3817]);break}else{cK[M&63](aW);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](aV);aw=c[(c[3524]|0)+64>>2]|0;if((aU|0)<-5){cM[aw&511](-2)}else{cM[aw&511](aU)}aw=c[3524]|0;if((aX&1)==0){if((c[aw+96>>2]&1024|0)!=0){break}c[ax>>2]=1;c[aM>>2]=aU}fn(j,aw)}else{aw=g;c[aw>>2]=c[14084];c[aw+4>>2]=c[56340>>2];c[aw+8>>2]=c[56344>>2];c[aw+12>>2]=c[56348>>2];aw=c[14075]|0;do{if((c[14074]|0)!=0){as=+h[7040];M=c[(c[3524]|0)+92>>2]|0;if(as<0.0){cK[M&63](+h[3817]);break}else{cK[M&63](as);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[7039]);aM=c[(c[3524]|0)+64>>2]|0;if((aw|0)<-5){cM[aM&511](-2)}else{cM[aM&511](aw)}aM=c[3524]|0;if((a[56328]&1)==0){if((c[aM+96>>2]&1024|0)!=0){break}c[g>>2]=1;c[g+4>>2]=aw}fn(g,aM)}}while(0);B=c[3524]|0;aM=c[B+172>>2]|0;if((aM|0)==0){a0=B}else{cM[aM&511](0);a0=c[3524]|0}cN[c[a0+56>>2]&255](c[13528]|0,c[13530]|0);cN[c[(c[3524]|0)+60>>2]&255](c[13529]|0,c[13530]|0);cN[c[(c[3524]|0)+60>>2]&255](c[13529]|0,c[13531]|0);cN[c[(c[3524]|0)+60>>2]&255](c[13528]|0,c[13531]|0);cN[c[(c[3524]|0)+60>>2]&255](c[13528]|0,c[13530]|0);aM=c[(c[3524]|0)+172>>2]|0;if((aM|0)!=0){cM[aM&511](1)}aM=f;c[aM>>2]=c[14084];c[aM+4>>2]=c[56340>>2];c[aM+8>>2]=c[56344>>2];c[aM+12>>2]=c[56348>>2];aM=c[14075]|0;do{if((c[14074]|0)!=0){as=+h[7040];B=c[(c[3524]|0)+92>>2]|0;if(as<0.0){cK[B&63](+h[3817]);break}else{cK[B&63](as);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[7039]);B=c[(c[3524]|0)+64>>2]|0;if((aM|0)<-5){cM[B&511](-2)}else{cM[B&511](aM)}B=c[3524]|0;if((a[56328]&1)==0){if((c[B+96>>2]&1024|0)!=0){break}c[f>>2]=1;c[f+4>>2]=aM}fn(f,B)}}while(0);if((c[16745]|0)!=0){f=e;c[f>>2]=c[14084];c[f+4>>2]=c[56340>>2];c[f+8>>2]=c[56344>>2];c[f+12>>2]=c[56348>>2];f=c[14075]|0;do{if((c[14074]|0)!=0){aV=+h[7040];a0=c[(c[3524]|0)+92>>2]|0;if(aV<0.0){cK[a0&63](+h[3817]);break}else{cK[a0&63](aV);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[7039]);a0=c[(c[3524]|0)+64>>2]|0;if((f|0)<-5){cM[a0&511](-2)}else{cM[a0&511](f)}a0=c[3524]|0;do{if((a[56328]&1)==0){if((c[a0+96>>2]&1024|0)!=0){break}c[e>>2]=1;c[e+4>>2]=f;aS=1485}else{aS=1485}}while(0);if((aS|0)==1485){fn(e,a0)}de(3,8)}if((c[16801]|0)==0){i=d;return}fn(67216,c[3524]|0);aV=+h[8390];a0=(a[67136]&1)!=0;do{if((a[54017]|0)==104){e=~~(aV*(a0?1.0:-1.0)*+((c[(c[3524]|0)+24>>2]|0)>>>0>>>0));fx(67288,z,A,98672);aS=(c[z>>2]|0)+(((c[13529]|0)+(c[13528]|0)|0)/2&-1)|0;c[z>>2]=aS;f=~~(+(c[A>>2]|0)+(+(c[13530]|0)+ +((c[(c[3524]|0)+16>>2]|0)>>>0>>>0)*-2.7))+((e|0)<0?e:0)|0;c[A>>2]=f;if((aS|0)<0){c[z>>2]=0;a1=0}else{a1=aS}if((f|0)<0){c[A>>2]=0;a2=0}else{a2=f}ln(a1,a2,c[16801]|0,1,1,0,c[16802]|0)}else{f=~~(aV*(a0?-1.0:1.0)*+((c[(c[3524]|0)+28>>2]|0)>>>0>>>0));c[216]=0;if((c[16745]&1|0)!=0){c[216]=0;de(3,14)}fx(67288,z,A,98672);aS=c[3524]|0;e=~~(+(c[z>>2]|0)+(+(c[13529]|0)+(+(c[216]|0)+1.5)*+((c[aS+20>>2]|0)>>>0>>>0)))+((f|0)>0?f:0)|0;c[z>>2]=e;f=(c[A>>2]|0)+(((c[13531]|0)+(c[13530]|0)|0)/2&-1)|0;c[A>>2]=f;if((e|0)<0){c[z>>2]=0;a3=0}else{a3=e}if((f|0)<0){c[A>>2]=0;a4=0}else{a4=f}f=(cO[c[aS+72>>2]&255](c[16799]|0)|0)==0;aS=c[16801]|0;if(f){ln(a3,a4,aS,0,0,0,c[16802]|0);break}else{ln(a3,a4,aS,1,0,c[16799]|0,c[16802]|0);aS=c[(c[3524]|0)+72>>2]|0;cO[aS&255](0);break}}}while(0);if((c[16804]|0)==0){i=d;return}cM[c[(c[3524]|0)+64>>2]&511](-2);i=d;return}function dE(){c[13544]=(c[13544]|0)+1;c[13898]=(c[13898]|0)+1;return}function dF(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,n=0,p=0,q=0;c[12906]=b;do{if((d|0)==0){if((a[37400]&1)!=0){e=b;f=0;break}c[8272]=0;c[13898]=0;a[c[10036]|0]=0;e=b;f=0}else{e=b;f=d}}while(0);L2054:while(1){d=(c[10036]|0)+f|0;b=(c[10034]|0)-f|0;if((a[37400]&1)!=0){g=c[m>>2]|0;aK(e|0,g|0)}if((a6(d|0,b|0,c[o>>2]|0)|0)==0){h=1518;break}b=c[10036]|0;d=uA(b|0)|0;g=d-1|0;if((g|0)<=-1){break}i=b+g|0;b=a[i]|0;do{if(b<<24>>24==10){a[i]=0;do{if((g|0)>0){j=d-2|0;k=(c[10036]|0)+j|0;if((a[k]|0)!=13){l=g;break}a[k]=0;l=j}else{l=g}}while(0);j=(((l|0)>0)<<31>>31)+l|0;n=j;p=a[(c[10036]|0)+j|0]|0}else{if((d+1|0)>>>0<(c[10034]|0)>>>0){n=g;p=b;break}dG();e=138304;f=d;continue L2054}}while(0);d=p<<24>>24==92;if(d){e=138304;f=d?n:f}else{q=0;h=1533;break}}if((h|0)==1533){return q|0}do{if((h|0)==1518){if((a[37400]&1)!=0){n=c[m>>2]|0;aF(10,n|0)}a[(c[10036]|0)+f|0]=0;c[9354]=(c[9354]|0)+1;if((f|0)>0&(c[12918]|0)==0){break}else{q=1}return q|0}}while(0);q=0;return q|0}function dG(){var b=0,d=0,e=0,f=0;b=i;d=c[10034]|0;if((d|0)!=0){c[10036]=db(c[10036]|0,d+1024|0,216480)|0;c[10034]=(c[10034]|0)+1024;i=b;return}d=ut(1024)|0;do{if((d|0)==0){gk();e=ut(1024)|0;if((e|0)!=0){f=e;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=209632,v)|0)}else{f=d}}while(0);c[10036]=f;c[10034]=1024;a[f]=0;i=b;return}function dH(){var a=0,b=0,d=0,e=0;a=i;b=c[1052]|0;if((b|0)!=0){d=db(c[1054]|0,(b*40&-1)+16e3|0,136360)|0;c[1054]=d;uE(d+((c[1052]|0)*40&-1)|0,0,16e3);c[1052]=(c[1052]|0)+400;i=a;return}d=ut(16e3)|0;do{if((d|0)==0){gk();b=ut(16e3)|0;if((b|0)!=0){e=b;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=163112,v)|0)}else{e=d}}while(0);c[1054]=e;c[1052]=400;uE(e|0,0,16e3);i=a;return}function dI(){var b=0,d=0,e=0;b=i;do{if((a[33512]&1)==0){if((dF(105808,0)|0)==0){break}else{d=1}i=b;return d|0}else{do{if((a[14080]&1)!=0){do{if((a[37400]&1)!=0){e=c[(c[3524]|0)+96>>2]|0;if((e&1|0)!=0){break}if((c[10030]|0)!=(c[n>>2]|0)){if((e&2|0)==0){break}}lm();if((c[(c[3524]|0)+96>>2]&2|0)==0){uf(-1,100528,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else{uf(-1,101160,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}}}while(0);if(a[13032]|0){break}e=c[(c[3524]|0)+100>>2]|0;if((e|0)==0){break}cS[e&511]();a[13032]=1}}while(0);if((dF(123048,0)|0)==0){break}else{d=1}i=b;return d|0}}while(0);a[25280]=a[37400]&1;d=(dJ()|0)!=0&1;i=b;return d|0}function dJ(){var b=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,x=0,y=0,z=0,A=0,B=0;b=i;do{if((a[43472]&1)!=0){if((dK()|0)==0){break}if((dK()|0)==0){break}if((dK()|0)==0){break}if((dK()|0)==0){break}uf(-1,98448,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}}while(0);e=c[10036]|0;while(1){if((aM(d[e]|0|0)|0)==0){break}else{e=e+1|0}}do{if((a8(e|0,35)|0)!=0){f=jl(40144,40136)|0;c[8272]=f;g=(c[10036]|0)+(c[(c[1054]|0)+(f*40&-1)+32>>2]|0)|0;if((a[g]|0)!=35){break}a[g]=0}}while(0);g=c[10036]|0;if((e|0)==(g|0)){h=e}else{uH(g|0,e|0,uA(e|0)|0);g=uA(e|0)|0;a[(c[10036]|0)+g|0]=0;h=c[10036]|0}if((a[h]|0)==33){g=h+1|0;if((g|0)==0){j=0;i=b;return j|0}if(!(a[14168]|0)){uf(-1,145320,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}bN(g|0);j=0;i=b;return j|0}c[9368]=0;g=jl(40144,40136)|0;c[8272]=g;h=c[12918]|0;if((h|0)<0){uf(-1,211816,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}do{if((h|0)>0){while(1){if((a[37400]&1)==0){if((a[33232]&1)==0){k=1600;break}}e=c[10036]|0;f=e+(uA(e|0)|0)|0;w=59;a[f]=w&255;w=w>>8;a[f+1|0]=w&255;if((dF(76720,uA(c[10036]|0)|0)|0)!=0){k=1597;break}f=jl(40144,40136)|0;c[8272]=f;e=(c[10036]|0)+(c[(c[1054]|0)+(f*40&-1)+32>>2]|0)|0;if((a[e]|0)==35){a[e]=0}if((c[12918]|0)<=0){k=1601;break}}if((k|0)==1597){uf(-1,224544,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((k|0)==1600){uf(-1,224544,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((k|0)==1601){l=c[8272]|0;break}}else{l=g}}while(0);c[13898]=0;if((l|0)>0){m=0}else{j=0;i=b;return j|0}L2171:while(1){a[55600]=0;a[55651]=0;a[55702]=0;a[55753]=0;a[55804]=0;a[55855]=0;a[55906]=0;a[55957]=0;a[56008]=0;a[56059]=0;a[56110]=0;a[56161]=0;if((t9(m)|0)==0){l=c[13898]|0;g=c[1054]|0;h=c[g+(l*40&-1)+36>>2]|0;e=c[g+(l*40&-1)+32>>2]|0;f=(a[g+(l*40&-1)|0]&1)==0;l=(h|0)>0;g=c[10036]|0;n=53600;o=133488;L2176:while(1){L2178:do{if(!f){if(l){p=0;q=0;r=e;while(1){s=a[o+p|0]|0;if(s<<24>>24==(a[g+(p+r|0)|0]|0)){t=r;u=q}else{if(s<<24>>24!=36){break L2178}t=r-1|0;u=1}x=p+1|0;if((x|0)<(u+h|0)){p=x;q=u;r=t}else{break}}if((u|0)==0){y=x}else{z=n;break L2176}}else{y=0}r=a[o+y|0]|0;if((r<<24>>24|0)==36|(r<<24>>24|0)==0){z=n;break L2176}}}while(0);r=n+8|0;q=c[r>>2]|0;if((q|0)==0){z=r;break}else{n=r;o=q}}cS[c[z+4>>2]&511]()}else{dT()}if((c[13484]|0)!=0){k=1617;break}A=c[13898]|0;o=c[8272]|0;L2193:do{if((A|0)<(o|0)){n=c[1054]|0;h=(a[n+(A*40&-1)|0]&1)==0;if(h){k=1649;break L2171}g=c[n+(A*40&-1)+36>>2]|0;e=n+(A*40&-1)+32|0;l=c[10036]|0;f=0;while(1){if((f|0)>=(g|0)){k=1623;break}if((a[l+((c[e>>2]|0)+f|0)|0]|0)==(a[f+103664|0]|0)){f=f+1|0}else{break}}do{if((k|0)==1623){k=0;if((f|0)!=1){break}e=A+1|0;c[13898]=e;B=e;break L2193}}while(0);if(h){k=1651;break L2171}f=c[n+(A*40&-1)+36>>2]|0;e=n+(A*40&-1)+32|0;l=c[10036]|0;g=0;while(1){if((g|0)>=(f|0)){k=1630;break}if((a[l+((c[e>>2]|0)+g|0)|0]|0)==(a[g+126728|0]|0)){g=g+1|0}else{break}}do{if((k|0)==1630){k=0;if((g|0)!=1){break}c[13544]=(c[13544]|0)+1;e=A+1|0;c[13898]=e;B=e;break L2193}}while(0);if(h){k=1647;break L2171}g=c[n+(A*40&-1)+36>>2]|0;e=n+(A*40&-1)+32|0;l=c[10036]|0;f=0;while(1){if((f|0)>=(g|0)){break}if((a[l+((c[e>>2]|0)+f|0)|0]|0)==(a[f+125616|0]|0)){f=f+1|0}else{k=1650;break L2171}}if((f|0)!=1){k=1648;break L2171}e=c[13544]|0;if((e|0)==0){k=1638;break L2171}c[13544]=e-1;e=A+1|0;c[13898]=e;B=e}else{B=A}}while(0);if((B|0)<(o|0)){m=B}else{j=0;k=1646;break}}if((k|0)==1646){i=b;return j|0}else if((k|0)==1647){uf(A,205408,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((k|0)==1648){uf(A,205408,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((k|0)==1649){uf(A,205408,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((k|0)==1638){uf(A,103896,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((k|0)==1617){c[13484]=0;j=1;i=b;return j|0}else if((k|0)==1650){uf(A,205408,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((k|0)==1651){uf(A,205408,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}return 0}function dK(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0;b=i;if((a8(c[10036]|0,64)|0)==0){d=0;i=b;return d|0}e=c[10034]|0;f=ut(e)|0;do{if((f|0)==0){gk();g=ut(e)|0;if((g|0)!=0){h=g;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=222744,v)|0);return 0}else{h=f}}while(0);f=c[10036]|0;e=uA(f|0)|0;g=c[10034]|0;j=e>>>0>>0?e:g-1|0;uF(h|0,f|0,j|0);a[h+j|0]=0;L2237:do{if((j|0)==0|(h|0)==0){k=0;l=0}else{f=0;g=0;e=j;m=0;n=0;o=h;p=0;q=0;while(1){r=a[o]|0;if(r<<24>>24==0){k=m;l=n;break L2237}s=r<<24>>24;L2241:do{if((s|0)==64){do{if(q|p|g){t=r}else{u=o+1|0;if((bO(a[u]|0|0)|0)==0){t=a[o]|0;break}else{w=u}while(1){if((bs(a[w]|0|0)|0)==0){x=a[w]|0;if(x<<24>>24!=95){break}}w=w+1|0}a[w]=0;y=e6(u)|0;do{if((y|0)==0){z=1671}else{if((c[y+16>>2]|0)!=3){z=1671;break}A=n+1|0;B=c[y+24>>2]|0;C=m+e|0;D=C+(uA(B|0)|0)|0;if(D>>>0>(c[10034]|0)>>>0){do{dG();D=C+(uA(B|0)|0)|0;}while(D>>>0>(c[10034]|0)>>>0)}C=a[B]|0;if(C<<24>>24==0){E=A;F=m;break}else{G=m;H=B;I=C}while(1){C=H+1|0;D=G+1|0;a[(c[10036]|0)+G|0]=I;J=a[C]|0;if(J<<24>>24==0){E=A;F=D;break}else{G=D;H=C;I=J}}}}while(0);if((z|0)==1671){z=0;uh(-1,221968,(v=i,i=i+8|0,c[v>>2]=u,v)|0);E=n;F=m}a[w]=x;K=0;L=0;M=w-1|0;N=E;O=F;P=0;Q=0;break L2241}}while(0);a[(c[10036]|0)+m|0]=t;K=q;L=p;M=o;N=n;O=m+1|0;P=g;Q=0}else if((s|0)==34){a[(c[10036]|0)+m|0]=r;K=q;L=p^(f^1);M=o;N=n;O=m+1|0;P=g;Q=0}else if((s|0)==39){a[(c[10036]|0)+m|0]=r;K=q^1;L=p;M=o;N=n;O=m+1|0;P=g;Q=0}else if((s|0)==92){a[(c[10036]|0)+m|0]=r;K=q;L=p;M=o;N=n;O=m+1|0;P=g;Q=f^p}else if((s|0)==35){if(q){R=g;z=1679;break}R=g|p^1;z=1679}else{R=g;z=1679}}while(0);if((z|0)==1679){z=0;a[(c[10036]|0)+m|0]=r;K=q;L=p;M=o;N=n;O=m+1|0;P=R;Q=0}s=M+1|0;y=e-1|0;if((y|0)==0|(s|0)==0){k=O;l=N;break}else{f=Q;g=P;e=y;m=O;n=N;o=s;p=L;q=K}}}}while(0);a[(c[10036]|0)+k|0]=0;uu(h);d=l;i=b;return d|0}function dL(b){b=b|0;var d=0,e=0;d=i;if((c[8501]|0)!=0){e=c[m>>2]|0;cf(e|0,154696,(v=i,i=i+8|0,c[v>>2]=b,v)|0)}hx(0,0,b);e=c[10034]|0;if(e>>>0<((uA(b|0)|0)+1|0)>>>0){do{dG();e=c[10034]|0;}while(e>>>0<((uA(b|0)|0)+1|0)>>>0)}uB(c[10036]|0,b|0);a[25280]=0;c[13484]=dJ()|0;hy();i=d;return}function dM(b){b=b|0;var d=0,e=0;d=i;if((b|0)==0){e=0}else{e=bP(b|0)|0}dL(e);if((a[872]&1)!=0&(c[6928]|0)!=0){if((c[8501]|0)!=0){e=c[m>>2]|0;aI(196688,8,1,e|0)}dO();i=d;return}if((a[27704]&1)==0){dP();i=d;return}else{uh(-1,185416,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);i=d;return}}function dN(){var a=0,b=0;a=i;b=c[13544]|0;if((b|0)==0){uf(c[13898]|0,103896,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{c[13544]=b-1;c[13898]=(c[13898]|0)+1;i=a;return}}function dO(){var b=0,d=0,e=0,f=0,g=0,j=0.0,k=0.0,l=0.0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0;b=i;d=c[10814]|0;e=c[6928]|0;if((d|0)==0&(e|0)==2){uf(-1,87408,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=c[10828]|0;if((f|0)==0&(e|0)==3){uf(-1,87408,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((e|0)==0){uh(-1,86328,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);dP();i=b;return}g=c[16507]|0;c[16506]=g;do{if((g&1|0)==0){j=+h[8257];if((a[66164]&1)==0){k=j;break}l=+_(+j);k=l/+h[8272]}else{k=8.988465674311578e+304}}while(0);h[8255]=k;m=a[66164]|0;do{if((g&2|0)==0){k=+h[8258];if((m&1)==0){n=k;break}l=+_(+k);n=l/+h[8272]}else{n=-8.988465674311578e+304}}while(0);h[8256]=n;if((m&1)==0){o=0.0}else{o=+_(+(+h[8271]))}h[8272]=o;m=c[16335]|0;c[16334]=m;do{if((m&1|0)==0){o=+h[8171];if((a[65476]&1)==0){p=o;break}n=+_(+o);p=n/+h[8186]}else{p=8.988465674311578e+304}}while(0);h[8169]=p;g=a[65476]|0;do{if((m&2|0)==0){p=+h[8172];if((g&1)==0){q=p;break}n=+_(+p);q=n/+h[8186]}else{q=-8.988465674311578e+304}}while(0);h[8170]=q;if((g&1)==0){r=0.0}else{r=+_(+(+h[8185]))}h[8186]=r;g=c[17195]|0;c[17194]=g;do{if((g&1|0)==0){r=+h[8601];if((a[68916]&1)==0){s=r;break}q=+_(+r);s=q/+h[8616]}else{s=8.988465674311578e+304}}while(0);h[8599]=s;m=a[68916]|0;do{if((g&2|0)==0){s=+h[8602];if((m&1)==0){t=s;break}q=+_(+s);t=q/+h[8616]}else{t=-8.988465674311578e+304}}while(0);h[8600]=t;if((m&1)==0){u=0.0}else{u=+_(+(+h[8615]))}h[8616]=u;m=c[17023]|0;c[17022]=m;do{if((m&1|0)==0){u=+h[8515];if((a[68228]&1)==0){w=u;break}t=+_(+u);w=t/+h[8530]}else{w=8.988465674311578e+304}}while(0);h[8513]=w;g=a[68228]|0;do{if((m&2|0)==0){w=+h[8516];if((g&1)==0){x=w;break}t=+_(+w);x=t/+h[8530]}else{x=-8.988465674311578e+304}}while(0);h[8514]=x;if((g&1)==0){y=0.0}else{y=+_(+(+h[8529]))}h[8530]=y;g=c[17539]|0;if((g&1|0)==0){y=+h[8773];if((a[70292]&1)==0){z=y}else{x=+_(+y);z=x/+h[8788]}h[8771]=z}if((g&2|0)==0){z=+h[8774];if((a[70292]&1)==0){A=z}else{x=+_(+z);A=x/+h[8788]}h[8772]=A}g=c[17367]|0;if((g&1|0)==0){A=+h[8687];if((a[69604]&1)==0){B=A}else{x=+_(+A);B=x/+h[8702]}h[8685]=B}if((g&2|0)==0){B=+h[8688];if((a[69604]&1)==0){C=B}else{x=+_(+B);C=x/+h[8702]}h[8686]=C}g=c[16163]|0;if((g&1|0)==0){C=+h[8085];if((a[64788]&1)==0){D=C}else{x=+_(+C);D=x/+h[8100]}h[8083]=D}if((g&2|0)==0){D=+h[8086];if((a[64788]&1)==0){E=D}else{x=+_(+D);E=x/+h[8100]}h[8084]=E}g=c[16679]|0;if((g&1|0)==0){E=+h[8343];if((a[66852]&1)==0){F=E}else{x=+_(+E);F=x/+h[8358]}h[8341]=F}if((g&2|0)==0){F=+h[8344];if((a[66852]&1)==0){G=F}else{x=+_(+F);G=x/+h[8358]}h[8342]=G}if((e|0)==2){iU(d,c[6930]|0)}else if((e|0)==3){i$(f,c[6930]|0)}if((c[16508]&2|0)!=0){G=+h[8256];h[8256]=+h[8255];h[8255]=G}if((c[16336]&2|0)!=0){G=+h[8170];h[8170]=+h[8169];h[8169]=G}if((c[17196]&2|0)!=0){G=+h[8600];h[8600]=+h[8599];h[8599]=G}if((c[17024]&2|0)!=0){G=+h[8514];h[8514]=+h[8513];h[8513]=G}f=c[6928]|0;if((f|0)==2){fS(c[10814]|0,c[6930]|0);i=b;return}else if((f|0)==3){fv(c[10828]|0,c[6930]|0,0);i=b;return}else{uf(-1,85504,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}function dP(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0;b=i;d=c[13898]|0;e=c[8272]|0;f=(e|0)>(d|0);L2430:do{if(f){g=c[1054]|0;if((a[g+(d*40&-1)|0]&1)!=0){h=c[g+(d*40&-1)+36>>2]|0;j=g+(d*40&-1)+32|0;g=c[10036]|0;k=0;while(1){if((k|0)>=(h|0)){l=1801;break}if((a[g+((c[j>>2]|0)+k|0)|0]|0)==(a[k+78280|0]|0)){k=k+1|0}else{break}}do{if((l|0)==1801){if((k|0)!=1){break}uf(d,77152,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);if(!f){l=1804;break}}k=c[1054]|0;L2442:do{if((a[k+(d*40&-1)|0]&1)==0){m=k+(d*40&-1)+32|0}else{j=c[k+(d*40&-1)+36>>2]|0;g=k+(d*40&-1)+32|0;h=c[10036]|0;n=0;while(1){if((n|0)>=(j|0)){break}if((a[h+((c[g>>2]|0)+n|0)|0]|0)==(a[n+103664|0]|0)){n=n+1|0}else{m=g;break L2442}}if((n|0)==1){o=k;p=h;l=1811;break L2430}else{m=g}}}while(0);j=e-1|0;q=uA(c[6924]|0)|0;r=c[k+(j*40&-1)+32>>2]|0;s=c[k+(j*40&-1)+36>>2]|0;j=c[m>>2]|0;t=(((q+3|0)+r|0)+s|0)-j|0;q=s+r|0;r=db(0,(q+1|0)-j|0,116456)|0;j=c[(c[1054]|0)+(d*40&-1)+32>>2]|0;L2450:do{if((j|0)<(q|0)){s=j;u=r;while(1){w=a[(c[10036]|0)+s|0]|0;if(w<<24>>24==0){x=u;break L2450}y=u+1|0;a[u]=w;w=s+1|0;if((w|0)<(q|0)){s=w;u=y}else{x=y;break}}}else{x=r}}while(0);a[x]=0;if((c[10034]|0)>>>0>>0){do{dG();}while((c[10034]|0)>>>0>>0)}t=c[10036]|0;q=c[6924]|0;uB(t|0,q|0);q=c[10036]|0;t=q+(uA(q|0)|0)|0;a[t]=a[86120]|0;a[t+1|0]=a[86121|0]|0;a[t+2|0]=a[86122|0]|0;t=c[10036]|0;uC(t|0,r|0);uu(r)}else{l=1804}}while(0);if((l|0)==1804){o=c[1054]|0;p=c[10036]|0;l=1811}if((l|0)==1811){l=p+(c[o+(d*40&-1)+32>>2]|0)|0;d=uA(c[6924]|0)|0;o=uA(l|0)|0;x=o+1|0;uH(p|0,l|0,x|0);l=(d+1|0)+o|0;if((c[10034]|0)>>>0>>0){do{dG();}while((c[10034]|0)>>>0>>0)}l=c[10036]|0;uH(l+d|0,l|0,x|0);uD(c[10036]|0,c[6924]|0,d)}c[7738]=0;c[6928]=0;a[25280]=0;c[8272]=jl(40144,40136)|0;c[13898]=1;if((a[37384]&1)==0){iS();i=b;return}else{iZ();i=b;return}}function dQ(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;b=i;i=i+56|0;d=b|0;e=d|0;f=(c[13898]|0)+1|0;c[13898]=f;g=c[8272]|0;if((f|0)>=(g|0)){i=b;return}h=d|0;j=f;f=g;L2477:while(1){g=c[1054]|0;k=c[g+(j*40&-1)+36>>2]|0;L2479:do{if((a[g+(j*40&-1)|0]&1)==0){l=c[10036]|0;m=g+(j*40&-1)+32|0}else{n=g+(j*40&-1)+32|0;o=c[10036]|0;p=0;while(1){if((p|0)>=(k|0)){break}if((a[o+((c[n>>2]|0)+p|0)|0]|0)==(a[p+103664|0]|0)){p=p+1|0}else{l=o;m=n;break L2479}}if((p|0)==1){q=1848;break L2477}else{l=o;m=n}}}while(0);uD(e|0,l+(c[m>>2]|0)|0,(k|0)<49?k:49);a[d+((k|0)>49?49:k)|0]=0;r=j+1|0;L2487:do{if((f|0)>(r|0)){if((a[g+(r*40&-1)|0]&1)==0){s=0;t=j;break}u=c[g+(r*40&-1)+36>>2]|0;v=g+(r*40&-1)+32|0;w=0;while(1){if((w|0)>=(u|0)){break}if((a[l+((c[v>>2]|0)+w|0)|0]|0)==(a[w+134808|0]|0)){w=w+1|0}else{s=0;t=j;break L2487}}if((w|0)!=1){s=0;t=j;break}c[13898]=r;s=1;t=r}else{s=0;t=j}}while(0);do{if((a_(h|0,167320,6)|0)==0){x=t;y=f}else{if((a_(h|0,126208,6)|0)==0){x=t;y=f;break}e2(h,s);x=c[13898]|0;y=c[8272]|0}}while(0);r=x+1|0;c[13898]=r;if((r|0)<(y|0)){j=r;f=y}else{q=1847;break}}if((q|0)==1847){i=b;return}else if((q|0)==1848){i=b;return}}function dR(){dU(0);return}function dS(){dU(1);return}function dT(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;b=i;i=i+696|0;d=b|0;e=b+56|0;f=b+80|0;g=c[13898]|0;h=g+1|0;j=c[8272]|0;k=c[1054]|0;L2506:do{if((j|0)>(h|0)){if((a[k+(h*40&-1)|0]&1)==0){break}l=c[k+(h*40&-1)+36>>2]|0;m=k+(h*40&-1)+32|0;n=c[10036]|0;o=0;while(1){if((o|0)>=(l|0)){break}if((a[n+((c[m>>2]|0)+o|0)|0]|0)==(a[o+199040|0]|0)){o=o+1|0}else{break L2506}}if((o|0)!=1){break}uD(f|0,55600,612);m=0;l=g;L2514:while(1){p=l+2|0;c[13898]=p;q=c[k+(p*40&-1)+36>>2]|0;r=(q|0)>49?49:q;q=c[k+(p*40&-1)+32>>2]|0;s=0;while(1){t=s+1|0;a[55600+(m*51&-1)+s|0]=a[n+q|0]|0;if((t|0)==(r|0)){break}else{q=q+1|0;s=t}}u=m+1|0;a[55600+(m*51&-1)+r|0]=0;w=l+3|0;x=(j|0)>(w|0);if(!x){break}if((a[k+(w*40&-1)|0]&1)==0){y=1867;break}s=c[k+(w*40&-1)+36>>2]|0;q=k+(w*40&-1)+32|0;t=0;while(1){if((t|0)>=(s|0)){break}if((a[n+((c[q>>2]|0)+t|0)|0]|0)==(a[t+148464|0]|0)){t=t+1|0}else{y=1866;break L2514}}if((t|0)==1&(u|0)<12){m=u;l=p}else{y=1866;break}}if((y|0)==1866){if(x){y=1867}}L2527:do{if((y|0)==1867){if((a[k+(w*40&-1)|0]&1)==0){break}m=c[k+(w*40&-1)+36>>2]|0;o=k+(w*40&-1)+32|0;q=0;while(1){if((q|0)>=(m|0)){break}if((a[n+((c[o>>2]|0)+q|0)|0]|0)==(a[q+148464|0]|0)){q=q+1|0}else{break L2527}}if((q|0)!=1){break}uf(l+4|0,172072,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);o=l+5|0;c[13898]=o;if((o|0)>=(j|0)){uf(o,168144,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}L2539:do{if((a[k+(o*40&-1)|0]&1)!=0){m=c[k+(o*40&-1)+36>>2]|0;p=k+(o*40&-1)+32|0;t=0;while(1){if((t|0)>=(m|0)){break}if((a[n+((c[p>>2]|0)+t|0)|0]|0)==(a[t+103664|0]|0)){t=t+1|0}else{break L2539}}if((t|0)!=1){break}uf(o,168144,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);o=iv(g)|0;c[11670]=o;c[o+16>>2]=u;it();n=c[18070]|0;l=db(n,c[n>>2]<<5|8,105624)|0;c[18070]=0;if((l|0)==0){uf(g,152776,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}n=o+8|0;p=c[n>>2]|0;if((p|0)!=0){e1(p)}c[n>>2]=l;uD(55600,f|0,612);l=o+12|0;n=(c[13898]|0)-1|0;p=c[1054]|0;m=(c[p+(n*40&-1)+36>>2]|0)+(c[p+(n*40&-1)+32>>2]|0)|0;n=db(c[l>>2]|0,(m+1|0)-(c[p+(g*40&-1)+32>>2]|0)|0,116456)|0;c[l>>2]=n;p=c[(c[1054]|0)+(g*40&-1)+32>>2]|0;L2553:do{if((p|0)<(m|0)){q=p;s=n;while(1){r=a[(c[10036]|0)+q|0]|0;if(r<<24>>24==0){z=s;break L2553}A=s+1|0;a[s]=r;r=q+1|0;if((r|0)<(m|0)){q=r;s=A}else{z=A;break}}}else{z=n}}while(0);a[z]=0;c[11670]=0;n=o+4|0;m=(uA(c[n>>2]|0)|0)+8|0;p=ut(m)|0;do{if((p|0)==0){gk();s=ut(m)|0;if((s|0)!=0){B=s;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=154560,v)|0)}else{B=p}}while(0);a[B]=a[151320]|0;a[B+1|0]=a[151321|0]|0;a[B+2|0]=a[151322|0]|0;a[B+3|0]=a[151323|0]|0;a[B+4|0]=a[151324|0]|0;a[B+5|0]=a[151325|0]|0;a[B+6|0]=a[151326|0]|0;uC(B|0,c[n>>2]|0);p=c[l>>2]|0;m=e6(B)|0;L2562:do{if((m|0)!=0){o=m+8|0;do{if((a[o]&1)==0){s=c[m+24>>2]|0;if((aY(s|0,p|0)|0)==0){break L2562}q=m+16|0;if((c[q>>2]|0)!=3){break}uu(s);c[q>>2]=1}else{a[o]=0}}while(0);if((p|0)==0){C=0}else{C=bP(p|0)|0}c[m+16>>2]=3;c[m+24>>2]=C}}while(0);uu(B);i=b;return}}while(0);B=c[10036]|0;C=k+(g*40&-1)+32|0;z=B+(c[C>>2]|0)|0;if((a_(z|0,167320,6)|0)==0){uf(g,145392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((a_(z|0,126208,6)|0)==0){uf(g,145392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[13898]=g+2;z=d|0;f=c[k+(g*40&-1)+36>>2]|0;g=(f|0)>49?49:f;f=c[C>>2]|0;C=0;while(1){k=C+1|0;a[d+C|0]=a[B+f|0]|0;if((k|0)==(g|0)){break}else{f=f+1|0;C=k}}a[d+g|0]=0;g=e6(z)|0;is(e);z=g+8|0;do{if((a[z]&1)==0){d=g+16|0;if((c[d>>2]|0)!=3){break}uu(c[g+24>>2]|0);c[d>>2]=1}}while(0);d=g+16|0;g=e;c[d>>2]=c[g>>2];c[d+4>>2]=c[g+4>>2];c[d+8>>2]=c[g+8>>2];c[d+12>>2]=c[g+12>>2];c[d+16>>2]=c[g+16>>2];c[d+20>>2]=c[g+20>>2];a[z]=0;i=b;return}function dU(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=i;i=i+24|0;e=d|0;f=c[13898]|0;g=f+1|0;c[13898]=g;h=c[8272]|0;if((g|0)>=(h|0)){i=d;return}j=c[1054]|0;k=(a[j+(g*40&-1)|0]&1)==0;L2594:do{if(k){l=g}else{m=c[j+(g*40&-1)+36>>2]|0;n=j+(g*40&-1)+32|0;o=c[10036]|0;p=0;while(1){if((p|0)>=(m|0)){q=1921;break}if((a[o+((c[n>>2]|0)+p|0)|0]|0)==(a[p+103664|0]|0)){p=p+1|0}else{break}}do{if((q|0)==1921){if((p|0)!=1){break}i=d;return}}while(0);if(k){l=g;break}p=c[j+(g*40&-1)+36>>2]|0;n=j+(g*40&-1)+32|0;o=c[10036]|0;m=0;while(1){if((m|0)>=(p|0)){q=1926;break}if((a[o+((c[n>>2]|0)+m|0)|0]|0)==(a[m+202112|0]|0)){m=m+1|0}else{q=1927;break}}if((q|0)==1926){if((m|0)!=1){q=1927}}if((q|0)==1927){if(k){l=g;break}n=c[j+(g*40&-1)+36>>2]|0;o=j+(g*40&-1)+32|0;p=c[10036]|0;r=0;while(1){if((r|0)>=(n|0)){break}if((a[p+((c[o>>2]|0)+r|0)|0]|0)==(a[r+129568|0]|0)){r=r+1|0}else{l=g;break L2594}}if((r|0)!=1){l=g;break}}o=f+2|0;c[13898]=o;l=o}}while(0);L2618:do{if((l|0)<(h|0)){f=(a[j+(l*40&-1)|0]&1)==0;do{if(!f){g=c[j+(l*40&-1)+36>>2]|0;k=j+(l*40&-1)+32|0;o=c[10036]|0;p=0;while(1){if((p|0)>=(g|0)){q=1938;break}if((a[o+((c[k>>2]|0)+p|0)|0]|0)==(a[p+103664|0]|0)){p=p+1|0}else{q=1939;break}}if((q|0)==1938){if((p|0)==1|f^1){break L2618}else{break}}else if((q|0)==1939){if(f){break}else{break L2618}}}}while(0);f=is(e)|0;r=c[f>>2]|0;if((r|0)==3){k=c[f+8>>2]|0;uz(k,0)}else if(!((r|0)==1|(r|0)==2)){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}r=e|0;if((c[r>>2]|0)==3){uu(c[e+8>>2]|0);c[r>>2]=1}c[13898]=(c[13898]|0)+1;i=d;return}}while(0);if((b|0)==0){uf(l,136616,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{uf(l,138312,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}function dV(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0;b=i;d=c[13898]|0;e=d+1|0;c[13898]=e;f=c[8272]|0;g=(e|0)<(f|0);L2642:do{if(g){h=c[1054]|0;j=(a[h+(e*40&-1)|0]&1)==0;if(!j){k=c[h+(e*40&-1)+36>>2]|0;l=h+(e*40&-1)+32|0;n=c[10036]|0;o=0;while(1){if((o|0)>=(k|0)){p=1958;break}if((a[n+((c[l>>2]|0)+o|0)|0]|0)==(a[o+103664|0]|0)){o=o+1|0}else{p=1959;break}}if((p|0)==1959){if(!j){p=1960}}else if((p|0)==1958){if(!((o|0)==1|j)){p=1960}}L2652:do{if((p|0)==1960){l=c[h+(e*40&-1)+36>>2]|0;n=h+(e*40&-1)+32|0;k=c[10036]|0;q=0;while(1){if((q|0)>=(l|0)){break}if((a[k+((c[n>>2]|0)+q|0)|0]|0)==(a[q+124624|0]|0)){q=q+1|0}else{break L2652}}if((q|0)!=1){break}n=c[14128]|0;if((n|0)==0){r=e}else{k=n;while(1){n=k+12|0;l=c[n>>2]|0;if((l|0)!=0){uu(l);c[n>>2]=0}n=c[k+24>>2]|0;uu(k);if((n|0)==0){break}else{k=n}}r=c[13898]|0}c[14128]=0;c[13898]=r+1;i=b;return}}while(0);if(!g){s=0;t=e;break}}h=c[1054]|0;j=(a[h+(e*40&-1)|0]&1)==0;if(j){s=0;t=e;break}o=c[h+(e*40&-1)+36>>2]|0;k=h+(e*40&-1)+32|0;h=c[10036]|0;q=0;while(1){if((q|0)>=(o|0)){p=1975;break}if((a[h+((c[k>>2]|0)+q|0)|0]|0)==(a[q+103664|0]|0)){q=q+1|0}else{break}}if((p|0)==1975){if((q|0)==1){s=0;t=e;break}}if(!((o|0)>0&(j^1))){s=0;t=e;break}h=c[10036]|0;n=0;l=0;u=c[k>>2]|0;while(1){if((a[n+133296|0]|0)==(a[h+(n+u|0)|0]|0)){w=u;x=l}else{if((n|0)!=3){s=0;t=e;break L2642}w=u-1|0;x=1}y=n+1|0;if((y|0)<(x+o|0)){n=y;l=x;u=w}else{break}}if((x|0)==0){if(!((n|0)==2|(n|0)==10)){s=0;t=e;break}}u=d+2|0;c[13898]=u;s=1;t=u}else{s=0;t=e}}while(0);L2689:do{if((t|0)<(f|0)){e=c[1054]|0;L2691:do{if((a[e+(t*40&-1)|0]&1)==0){z=c[10036]|0;A=e+(t*40&-1)+32|0}else{d=c[e+(t*40&-1)+36>>2]|0;x=e+(t*40&-1)+32|0;w=c[10036]|0;g=0;while(1){if((g|0)>=(d|0)){break}if((a[w+((c[x>>2]|0)+g|0)|0]|0)==(a[g+103664|0]|0)){g=g+1|0}else{z=w;A=x;break L2691}}if((g|0)==1){B=0;C=t;D=f;break L2689}else{z=w;A=x}}}while(0);e=z+(c[A>>2]|0)|0;n=e;d=(a8(e|0,32)|0)-n|0;do{if((d|0)<0){r=(a8(e|0,0)|0)-n|0;if((r|0)>=0){E=r;break}r=c[m>>2]|0;cf(r|0,131904,(v=i,i=i+16|0,c[v>>2]=130592,c[v+8>>2]=754,v)|0);i=b;return}else{E=d}}while(0);d=E+1|0;n=ut(d)|0;do{if((n|0)==0){gk();e=ut(d)|0;if((e|0)!=0){F=e;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=129544,v)|0)}else{F=n}}while(0);n=c[13898]|0;d=c[1054]|0;e=a[d+(n*40&-1)|0]|0;do{if((e&1)==0){p=2e3}else{r=c[d+(n*40&-1)+32>>2]|0;u=c[10036]|0;l=a[u+r|0]|0;if(!((l<<24>>24|0)==39|(l<<24>>24|0)==34)){p=2e3;break}l=(c[d+(n*40&-1)+36>>2]|0)-2|0;L2711:do{if((l|0)>0){o=r;h=0;k=u;while(1){j=o+1|0;q=h+1|0;a[F+h|0]=a[k+j|0]|0;if((q|0)==(l|0)){G=l;break L2711}o=j;h=q;k=c[10036]|0}}else{G=0}}while(0);a[F+G|0]=0;if((a[(c[10036]|0)+(c[(c[1054]|0)+(n*40&-1)+32>>2]|0)|0]|0)==34){ua(F);break}else{H=F;I=F}while(1){l=a[I]|0;if((l<<24>>24|0)==0){break}else if((l<<24>>24|0)==39){u=I+1|0;r=(a[u]|0)==39?u:I;J=r;K=a[r]|0}else{J=I;K=l}a[H]=K;H=H+1|0;I=J+1|0}a[H]=0}}while(0);L2724:do{if((p|0)==2e3){if((n|0)<(c[8272]|0)){L=F;M=n;N=d;O=e}else{break}while(1){l=c[N+(M*40&-1)+36>>2]|0;r=N+(M*40&-1)+32|0;L2728:do{if((O&1)!=0){u=c[10036]|0;x=0;while(1){if((x|0)>=(l|0)){break}if((a[u+((c[r>>2]|0)+x|0)|0]|0)==(a[x+103664|0]|0)){x=x+1|0}else{break L2728}}if((x|0)==1){break L2724}}}while(0);u=c[r>>2]|0;w=0;while(1){g=w+1|0;a[L+w|0]=a[(c[10036]|0)+u|0]|0;if((g|0)==(l|0)){break}u=u+1|0;w=g}a[L+l|0]=0;w=c[13898]|0;u=c[1054]|0;r=c[u+(w*40&-1)+36>>2]|0;g=a[(c[10036]|0)+((c[u+(w*40&-1)+32>>2]|0)+r|0)|0]|0;if((g<<24>>24|0)==32|(g<<24>>24|0)==9|(g<<24>>24|0)==0){break L2724}g=w+1|0;c[13898]=g;if((g|0)>=(c[8272]|0)){break L2724}L=L+r|0;M=g;N=u;O=a[u+(g*40&-1)|0]|0}}}while(0);e=(c[13898]|0)+1|0;c[13898]=e;B=F;C=e;D=c[8272]|0}else{B=0;C=t;D=f}}while(0);L2743:do{if((C|0)<(D|0)){f=c[1054]|0;L2745:do{if((a[f+(C*40&-1)|0]&1)==0){P=c[10036]|0}else{t=c[f+(C*40&-1)+36>>2]|0;F=f+(C*40&-1)+32|0;O=c[10036]|0;N=0;while(1){if((N|0)>=(t|0)){break}if((a[O+((c[F>>2]|0)+N|0)|0]|0)==(a[N+103664|0]|0)){N=N+1|0}else{P=O;break L2745}}if((N|0)==1){Q=0;break L2743}else{P=O}}}while(0);f=(uA(P|0)|0)+1|0;F=ut(f)|0;do{if((F|0)==0){gk();t=ut(f)|0;if((t|0)!=0){R=t;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=128272,v)|0)}else{R=F}}while(0);F=c[13898]|0;f=c[1054]|0;t=a[f+(F*40&-1)|0]|0;do{if((t&1)!=0){M=c[f+(F*40&-1)+32>>2]|0;L=c[10036]|0;p=a[L+M|0]|0;if(!((p<<24>>24|0)==39|(p<<24>>24|0)==34)){break}p=(c[f+(F*40&-1)+36>>2]|0)-2|0;L2760:do{if((p|0)>0){H=M;J=0;I=L;while(1){K=H+1|0;G=J+1|0;a[R+J|0]=a[I+K|0]|0;if((G|0)==(p|0)){S=p;break L2760}H=K;J=G;I=c[10036]|0}}else{S=0}}while(0);a[R+S|0]=0;if((a[(c[10036]|0)+(c[(c[1054]|0)+(F*40&-1)+32>>2]|0)|0]|0)==34){ua(R)}else{p=R;L=R;while(1){M=a[L]|0;if((M<<24>>24|0)==39){O=L+1|0;N=(a[O]|0)==39?O:L;T=N;U=a[N]|0}else if((M<<24>>24|0)==0){break}else{T=L;U=M}a[p]=U;p=p+1|0;L=T+1|0}a[p]=0}c[13898]=(c[13898]|0)+1;Q=R;break L2743}}while(0);if((F|0)<(c[8272]|0)){V=R;W=F;X=f;Y=t}else{Q=R;break}while(1){L=c[X+(W*40&-1)+36>>2]|0;M=X+(W*40&-1)+32|0;L2777:do{if((Y&1)!=0){N=c[10036]|0;O=0;while(1){if((O|0)>=(L|0)){break}if((a[N+((c[M>>2]|0)+O|0)|0]|0)==(a[O+103664|0]|0)){O=O+1|0}else{break L2777}}if((O|0)==1){Q=R;break L2743}}}while(0);p=c[M>>2]|0;N=0;while(1){I=N+1|0;a[V+N|0]=a[(c[10036]|0)+p|0]|0;if((I|0)==(L|0)){break}p=p+1|0;N=I}a[V+L|0]=0;N=c[13898]|0;p=c[1054]|0;M=c[p+(N*40&-1)+36>>2]|0;I=V+M|0;J=a[(c[10036]|0)+((c[p+(N*40&-1)+32>>2]|0)+M|0)|0]|0;if((J<<24>>24|0)==32|(J<<24>>24|0)==9|(J<<24>>24|0)==0){J=V+(M+1|0)|0;a[I]=32;a[J]=0;Z=J;_=c[13898]|0}else{Z=I;_=N}N=_+1|0;c[13898]=N;if((N|0)>=(c[8272]|0)){Q=R;break L2743}I=c[1054]|0;V=Z;W=N;X=I;Y=a[I+(N*40&-1)|0]|0}}else{Q=0}}while(0);hR(B,Q,s);i=b;return}function dW(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;b=i;i=i+32|0;d=b|0;e=b+24|0;c[e>>2]=0;f=(c[13898]|0)+1|0;c[13898]=f;L2795:do{if((f|0)<(c[8272]|0)){g=c[1054]|0;L2797:do{if((a[g+(f*40&-1)|0]&1)!=0){h=c[g+(f*40&-1)+36>>2]|0;j=g+(f*40&-1)+32|0;k=c[10036]|0;l=0;while(1){if((l|0)>=(h|0)){break}if((a[k+((c[j>>2]|0)+l|0)|0]|0)==(a[l+103664|0]|0)){l=l+1|0}else{break L2797}}if((l|0)==1){break L2795}}}while(0);a[14176]=1;is(d);a[14176]=0;if((c[d>>2]|0)!=3){c[13898]=f;break}g=c[d+8>>2]|0;c[e>>2]=g;if((g|0)!=0){iQ(e);g=c[e>>2]|0;hw(hA(g,193632)|0,g,1);i=b;return}m=c[13898]|0;uf(m,149040,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);c[e>>2]=0;m=f;uf(m,149040,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}function dX(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;b=i;i=i+32|0;d=b|0;e=b+24|0;c[e>>2]=0;f=(c[13898]|0)+1|0;c[13898]=f;L2814:do{if((f|0)<(c[8272]|0)){g=c[1054]|0;L2816:do{if((a[g+(f*40&-1)|0]&1)!=0){h=c[g+(f*40&-1)+36>>2]|0;j=g+(f*40&-1)+32|0;k=c[10036]|0;l=0;while(1){if((l|0)>=(h|0)){break}if((a[k+((c[j>>2]|0)+l|0)|0]|0)==(a[l+103664|0]|0)){l=l+1|0}else{break L2816}}if((l|0)==1){break L2814}}}while(0);a[14176]=1;is(d);a[14176]=0;if((c[d>>2]|0)!=3){c[13898]=f;break}g=c[d+8>>2]|0;c[e>>2]=g;if((g|0)==0){m=c[13898]|0;uf(m,124592,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}iQ(e);g=c[e>>2]|0;if((bY(g|0)|0)==0){e7(5);uu(g);i=b;return}else{uf(c[13898]|0,123232,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);c[e>>2]=0;m=f;uf(m,124592,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}function dY(){var b=0,d=0,e=0,f=0,h=0,i=0,j=0.0,k=0.0;if((a[14080]&1)==0){lk()}do{if(a[14088]|0){if((a[33512]&1)==0){break}if(!(a[13032]|0)){break}b=c[(c[3524]|0)+104>>2]|0;if((b|0)!=0){cS[b&511]()}a[13032]=0}else{cS[c[(c[3524]|0)+52>>2]&511]();a[14088]=1}}while(0);cM[c[(c[3524]|0)+168>>2]&511](0);b=c[3524]|0;if((c[b+96>>2]&16|0)!=0){c[7271]=-1}c[13880]=0;d=b+8|0;c[13881]=(c[d>>2]|0)-1;c[13882]=0;e=b+12|0;c[13883]=(c[e>>2]|0)-1;if((a[33512]&1)==0){lh();a[25280]=0;f=c[13898]|0;h=f+1|0;c[13898]=h;return}i=c[b+108>>2]|0;if((i|0)==0){lh();a[25280]=0;f=c[13898]|0;h=f+1|0;c[13898]=h;return}j=+((c[d>>2]|0)>>>0>>>0);k=+((c[e>>2]|0)>>>0>>>0);cI[i&63](0,~~(+g[184]*j),~~(+g[44]*k),~~(j*+g[178]),~~(k*+g[38]));lh();a[25280]=0;f=c[13898]|0;h=f+1|0;c[13898]=h;return}function dZ(){var a=0;a=i;c[13898]=(c[13898]|0)+1;uh(-1,116984,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);i=a;return}function d_(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;b=i;i=i+24|0;d=b|0;e=(c[13898]|0)+1|0;c[13898]=e;L2860:do{if((e|0)<(c[8272]|0)){f=c[1054]|0;L2862:do{if((a[f+(e*40&-1)|0]&1)!=0){g=c[f+(e*40&-1)+36>>2]|0;h=f+(e*40&-1)+32|0;j=c[10036]|0;k=0;while(1){if((k|0)>=(g|0)){break}if((a[j+((c[h>>2]|0)+k|0)|0]|0)==(a[k+103664|0]|0)){k=k+1|0}else{break L2862}}if((k|0)==1){l=e;break L2860}}}while(0);a[14176]=1;is(d);a[14176]=0;if((c[d>>2]|0)!=3){c[13898]=e;l=e;break}f=c[d+8>>2]|0;if((f|0)==0){l=c[13898]|0;break}else{dL(f);i=b;return}}else{l=e}}while(0);uf(l,122e3,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}function d$(){var b=0,d=0,e=0,f=0,g=0;b=(c[13898]|0)+1|0;if((c[8272]|0)<=(b|0)){c[13484]=1;return}d=c[1054]|0;if((a[d+(b*40&-1)|0]&1)==0){c[13484]=1;return}e=c[d+(b*40&-1)+36>>2]|0;f=d+(b*40&-1)+32|0;b=c[10036]|0;d=0;while(1){if((d|0)>=(e|0)){break}if((a[b+((c[f>>2]|0)+d|0)|0]|0)==(a[d+78208|0]|0)){d=d+1|0}else{g=2133;break}}if((g|0)==2133){c[13484]=1;return}if((d|0)==7){bd(0)}else{c[13484]=1;return}}function d0(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0;b=i;i=i+24|0;d=b|0;e=(c[13898]|0)+1|0;c[13898]=e;if((c[8272]|0)<=(e|0)){uf(e,116032,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=c[1054]|0;if((a[f+(e*40&-1)|0]&1)==0){uf(e,116032,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=c[f+(e*40&-1)+36>>2]|0;j=f+(e*40&-1)+32|0;f=c[10036]|0;k=0;while(1){if((k|0)>=(g|0)){break}if((a[f+((c[j>>2]|0)+k|0)|0]|0)==(a[k+199040|0]|0)){k=k+1|0}else{l=2234;break}}if((l|0)==2234){uf(e,116032,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((k|0)!=1){uf(e,116032,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=is(d)|0;k=c[e>>2]|0;if((k|0)==1){m=+(c[e+8>>2]|0)}else if((k|0)==3){m=+uz(c[e+8>>2]|0,0)}else if((k|0)==2){m=+h[e+8>>3]}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=d|0;if((c[e>>2]|0)==3){uu(c[d+8>>2]|0);c[e>>2]=1}e=c[13898]|0;d=c[8272]|0;k=(d|0)>(e|0);L2917:do{if(k){j=c[1054]|0;if((a[j+(e*40&-1)|0]&1)==0){break}f=c[j+(e*40&-1)+36>>2]|0;g=j+(e*40&-1)+32|0;n=c[10036]|0;o=0;while(1){if((o|0)>=(f|0)){break}if((a[n+((c[g>>2]|0)+o|0)|0]|0)==(a[o+126728|0]|0)){o=o+1|0}else{break L2917}}if((o|0)!=1){break}f=c[g>>2]|0;p=e+1|0;c[13898]=p;q=1;r=p;while(1){if((r|0)>=(d|0)){l=2159;break}L2928:do{if((a[j+(r*40&-1)|0]&1)==0){l=2166}else{p=c[j+(r*40&-1)+36>>2]|0;s=j+(r*40&-1)+32|0;t=0;while(1){if((t|0)>=(p|0)){break}if((a[n+((c[s>>2]|0)+t|0)|0]|0)==(a[t+126728|0]|0)){t=t+1|0}else{l=2166;break L2928}}if((t|0)!=1){l=2166;break}u=q+1|0}}while(0);if((l|0)==2166){l=0;L2937:do{if((a[j+(r*40&-1)|0]&1)==0){w=0}else{s=c[j+(r*40&-1)+36>>2]|0;p=j+(r*40&-1)+32|0;x=0;while(1){if((x|0)>=(s|0)){break}if((a[n+((c[p>>2]|0)+x|0)|0]|0)==(a[x+125616|0]|0)){x=x+1|0}else{w=0;break L2937}}w=((x|0)==1)<<31>>31}}while(0);u=w+q|0}p=r+1|0;if((u|0)==0){y=p;break}else{q=u;r=p}}if((l|0)==2159){y=r+1|0}q=c[j+(r*40&-1)+32>>2]|0;c[13898]=y;L2948:do{if((d|0)>(y|0)){if((a[j+(y*40&-1)|0]&1)==0){z=0;A=0;B=y;break}g=c[j+(y*40&-1)+36>>2]|0;o=j+(y*40&-1)+32|0;p=0;while(1){if((p|0)>=(g|0)){break}if((a[n+((c[o>>2]|0)+p|0)|0]|0)==(a[p+200904|0]|0)){p=p+1|0}else{z=0;A=0;B=y;break L2948}}if((p|0)!=4){z=0;A=0;B=y;break}o=y+1|0;c[13898]=o;if((d|0)<=(o|0)){uf(o,114208,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((a[j+(o*40&-1)|0]&1)==0){uf(o,114208,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=c[j+(o*40&-1)+36>>2]|0;s=j+(o*40&-1)+32|0;t=0;while(1){if((t|0)>=(g|0)){break}if((a[n+((c[s>>2]|0)+t|0)|0]|0)==(a[t+126728|0]|0)){t=t+1|0}else{l=2242;break}}if((l|0)==2242){uf(o,114208,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((t|0)!=1){uf(o,114208,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=c[s>>2]|0;p=y+2|0;c[13898]=p;C=1;D=p;while(1){if((D|0)>=(d|0)){l=2188;break}L2974:do{if((a[j+(D*40&-1)|0]&1)==0){l=2195}else{p=c[j+(D*40&-1)+36>>2]|0;E=j+(D*40&-1)+32|0;F=0;while(1){if((F|0)>=(p|0)){break}if((a[n+((c[E>>2]|0)+F|0)|0]|0)==(a[F+126728|0]|0)){F=F+1|0}else{l=2195;break L2974}}if((F|0)!=1){l=2195;break}G=C+1|0}}while(0);if((l|0)==2195){l=0;L2983:do{if((a[j+(D*40&-1)|0]&1)==0){H=0}else{x=c[j+(D*40&-1)+36>>2]|0;E=j+(D*40&-1)+32|0;p=0;while(1){if((p|0)>=(x|0)){break}if((a[n+((c[E>>2]|0)+p|0)|0]|0)==(a[p+125616|0]|0)){p=p+1|0}else{H=0;break L2983}}H=((p|0)==1)<<31>>31}}while(0);G=H+C|0}E=D+1|0;if((G|0)==0){I=E;break}else{C=G;D=E}}if((l|0)==2188){I=D+1|0}C=c[j+(D*40&-1)+32>>2]|0;c[13898]=I;z=C;A=g;B=I}else{z=0;A=0;B=y}}while(0);j=m!=0.0;n=j?f:A;a[37480]=j&1;r=(A|0)==0;a[37464]=r&1;c[13544]=(c[13544]|0)+1;if(j|r^1){r=(j?q:z)-n|0;j=ut(r)|0;do{if((j|0)==0){gk();C=ut(r)|0;if((C|0)!=0){J=C;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=110688,v)|0)}else{J=j}}while(0);uD(J|0,(c[10036]|0)+(n+1|0)|0,r);a[J+(r-1|0)|0]=0;dL(J);K=c[13898]|0}else{K=B}c[13898]=K-1;i=b;return}}while(0);if((c[13544]|0)>0){uf(e,107896,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[9368]=(c[9368]|0)+1;if(m!=0.0){K=d-1|0;B=c[1054]|0;J=(c[B+(K*40&-1)+36>>2]|0)+(c[B+(K*40&-1)+32>>2]|0)|0;K=e-1|0;c[13898]=K;c[B+(K*40&-1)+36>>2]=1;K=J+2|0;c[(c[1054]|0)+((c[13898]|0)*40&-1)+32>>2]=K;a[(c[10036]|0)+K|0]=59;a[(c[10036]|0)+(J+3|0)|0]=0;a[37480]=1;i=b;return}L3011:do{if(k){J=e;L3012:while(1){L3014:do{if((J|0)<(d|0)){K=c[1054]|0;B=J;while(1){L3018:do{if((a[K+(B*40&-1)|0]&1)==0){l=2221}else{z=c[K+(B*40&-1)+36>>2]|0;A=K+(B*40&-1)+32|0;y=c[10036]|0;I=0;while(1){if((I|0)>=(z|0)){break}if((a[y+((c[A>>2]|0)+I|0)|0]|0)==(a[I+103664|0]|0)){I=I+1|0}else{l=2221;break L3018}}A=B+1|0;c[13898]=A;if((I|0)==1){L=A;break L3014}else{M=A}}}while(0);if((l|0)==2221){l=0;p=B+1|0;c[13898]=p;M=p}if((M|0)<(d|0)){B=M}else{N=M;l=2216;break}}}else{N=J;l=2216}}while(0);if((l|0)==2216){l=0;g=N+1|0;c[13898]=g;L=g}L3030:do{if((d|0)>(L|0)){g=c[1054]|0;if((a[g+(L*40&-1)|0]&1)==0){break}D=c[g+(L*40&-1)+36>>2]|0;B=g+(L*40&-1)+32|0;g=c[10036]|0;K=0;while(1){if((K|0)>=(D|0)){break}if((a[g+((c[B>>2]|0)+K|0)|0]|0)==(a[K+200904|0]|0)){K=K+1|0}else{break L3030}}if((K|0)==4){break L3012}}}while(0);if((L|0)<(d|0)){J=L}else{break L3011}}a[37480]=0;c[13898]=L-1;i=b;return}}while(0);c[8272]=0;c[13898]=0;i=b;return}function d1(){return}function d2(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0;b=i;d=c[13898]|0;e=d+1|0;f=c[8272]|0;L3044:do{if((f|0)>(e|0)){g=c[1054]|0;if((a[g+(e*40&-1)|0]&1)==0){break}h=c[g+(e*40&-1)+36>>2]|0;j=g+(e*40&-1)+32|0;k=c[10036]|0;l=0;while(1){if((l|0)>=(h|0)){break}if((a[k+((c[j>>2]|0)+l|0)|0]|0)==(a[l+126728|0]|0)){l=l+1|0}else{break L3044}}if((l|0)!=1){break}if((a[37464]&1)==0){uf(d,106968,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}a[37464]=0;c[13898]=e;h=c[j>>2]|0;m=d+2|0;c[13898]=m;n=1;o=m;while(1){if((o|0)>=(f|0)){p=2256;break}L3058:do{if((a[g+(o*40&-1)|0]&1)==0){p=2263}else{m=c[g+(o*40&-1)+36>>2]|0;q=g+(o*40&-1)+32|0;r=0;while(1){if((r|0)>=(m|0)){break}if((a[k+((c[q>>2]|0)+r|0)|0]|0)==(a[r+126728|0]|0)){r=r+1|0}else{p=2263;break L3058}}if((r|0)!=1){p=2263;break}s=n+1|0}}while(0);if((p|0)==2263){p=0;L3067:do{if((a[g+(o*40&-1)|0]&1)==0){t=0}else{q=c[g+(o*40&-1)+36>>2]|0;m=g+(o*40&-1)+32|0;u=0;while(1){if((u|0)>=(q|0)){break}if((a[k+((c[m>>2]|0)+u|0)|0]|0)==(a[u+125616|0]|0)){u=u+1|0}else{t=0;break L3067}}t=((u|0)==1)<<31>>31}}while(0);s=t+n|0}m=o+1|0;if((s|0)==0){w=m;break}else{n=s;o=m}}if((p|0)==2256){w=o+1|0}n=c[g+(o*40&-1)+32>>2]|0;c[13898]=w-1;c[13544]=(c[13544]|0)+1;if((a[37480]&1)!=0){i=b;return}k=n-h|0;n=ut(k)|0;do{if((n|0)==0){gk();j=ut(k)|0;if((j|0)!=0){x=j;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=110688,v)|0)}else{x=n}}while(0);uD(x|0,(c[10036]|0)+(h+1|0)|0,k);a[x+(k-1|0)|0]=0;dL(x);i=b;return}}while(0);x=c[9368]|0;if((x|0)<1){uf(d,106008,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[9368]=x-1;if((a[37480]&1)==0){x=c[1054]|0;w=c[x+(d*40&-1)+32>>2]|0;c[x+(d*40&-1)+36>>2]=1;a[(c[10036]|0)+w|0]=59;a[(c[10036]|0)+(w+1|0)|0]=32;a[(c[10036]|0)+(w+2|0)|0]=32;a[(c[10036]|0)+(w+3|0)|0]=32;a[37480]=1;i=b;return}else{c[8272]=0;c[13898]=0;i=b;return}}function d3(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,x=0;b=i;c[13898]=(c[13898]|0)+1;d=iw()|0;e=c[13898]|0;f=c[8272]|0;if((f|0)<=(e|0)){uf(e,104920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=c[1054]|0;if((a[g+(e*40&-1)|0]&1)==0){uf(e,104920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}h=c[g+(e*40&-1)+36>>2]|0;j=g+(e*40&-1)+32|0;k=c[10036]|0;l=0;while(1){if((l|0)>=(h|0)){break}if((a[k+((c[j>>2]|0)+l|0)|0]|0)==(a[l+126728|0]|0)){l=l+1|0}else{m=2323;break}}if((m|0)==2323){uf(e,104920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((l|0)!=1){uf(e,104920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}l=c[j>>2]|0;j=e+1|0;c[13898]=j;e=1;h=j;while(1){if((h|0)>=(f|0)){m=2295;break}L3114:do{if((a[g+(h*40&-1)|0]&1)==0){m=2302}else{j=c[g+(h*40&-1)+36>>2]|0;n=g+(h*40&-1)+32|0;o=0;while(1){if((o|0)>=(j|0)){break}if((a[k+((c[n>>2]|0)+o|0)|0]|0)==(a[o+126728|0]|0)){o=o+1|0}else{m=2302;break L3114}}if((o|0)!=1){m=2302;break}p=e+1|0}}while(0);if((m|0)==2302){m=0;L3123:do{if((a[g+(h*40&-1)|0]&1)==0){q=0}else{n=c[g+(h*40&-1)+36>>2]|0;j=g+(h*40&-1)+32|0;r=0;while(1){if((r|0)>=(n|0)){break}if((a[k+((c[j>>2]|0)+r|0)|0]|0)==(a[r+125616|0]|0)){r=r+1|0}else{q=0;break L3123}}q=((r|0)==1)<<31>>31}}while(0);p=q+e|0}j=h+1|0;if((p|0)==0){s=j;break}else{e=p;h=j}}if((m|0)==2295){s=h+1|0}m=c[g+(h*40&-1)+32>>2]|0;c[13544]=(c[13544]|0)+1;c[13898]=s-1;s=m-l|0;m=s+2|0;h=ut(m)|0;do{if((h|0)==0){gk();g=ut(m)|0;if((g|0)!=0){t=g;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=110688,v)|0)}else{t=h}}while(0);uD(t|0,(c[10036]|0)+(l+1|0)|0,s);a[t+(s-1|0)|0]=0;s=(d|0)==0;do{if(!s){if((a[d+38|0]&1)==0){break}l=t;w=59;a[l]=w&255;w=w>>8;a[l+1|0]=w&255}}while(0);l=(t|0)==0;do{if(l){u=0}else{u=bP(t|0)|0}dL(u);}while(ix(d)|0);uu(t);if(s){i=b;return}else{x=d}while(1){d=c[x>>2]|0;uu(c[x+12>>2]|0);uu(x);if((d|0)==0){break}else{x=d}}i=b;return}function d4(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0.0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0.0;b=i;i=i+48|0;d=b|0;e=b+24|0;f=(c[13898]|0)+1|0;c[13898]=f;g=is(e)|0;j=c[g>>2]|0;if((j|0)==1){k=+(c[g+8>>2]|0)}else if((j|0)==2){k=+h[g+8>>3]}else if((j|0)==3){k=+uz(c[g+8>>2]|0,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=e|0;if((c[g>>2]|0)==3){uu(c[e+8>>2]|0);c[g>>2]=1}g=c[13898]|0;e=c[8272]|0;if((e|0)<=(g|0)){uf(g,104360,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}j=c[1054]|0;if((a[j+(g*40&-1)|0]&1)==0){uf(g,104360,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}l=c[j+(g*40&-1)+36>>2]|0;m=j+(g*40&-1)+32|0;n=c[10036]|0;o=0;while(1){if((o|0)>=(l|0)){break}if((a[n+((c[m>>2]|0)+o|0)|0]|0)==(a[o+126728|0]|0)){o=o+1|0}else{p=2374;break}}if((p|0)==2374){uf(g,104360,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((o|0)!=1){uf(g,104360,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}o=c[m>>2]|0;m=g+1|0;c[13898]=m;g=1;l=m;while(1){if((l|0)>=(e|0)){p=2344;break}L3181:do{if((a[j+(l*40&-1)|0]&1)==0){p=2351}else{m=c[j+(l*40&-1)+36>>2]|0;q=j+(l*40&-1)+32|0;r=0;while(1){if((r|0)>=(m|0)){break}if((a[n+((c[q>>2]|0)+r|0)|0]|0)==(a[r+126728|0]|0)){r=r+1|0}else{p=2351;break L3181}}if((r|0)!=1){p=2351;break}s=g+1|0}}while(0);if((p|0)==2351){p=0;L3190:do{if((a[j+(l*40&-1)|0]&1)==0){t=0}else{q=c[j+(l*40&-1)+36>>2]|0;m=j+(l*40&-1)+32|0;u=0;while(1){if((u|0)>=(q|0)){break}if((a[n+((c[m>>2]|0)+u|0)|0]|0)==(a[u+125616|0]|0)){u=u+1|0}else{t=0;break L3190}}t=((u|0)==1)<<31>>31}}while(0);s=t+g|0}m=l+1|0;if((s|0)==0){w=m;break}else{g=s;l=m}}if((p|0)==2344){w=l+1|0}s=(c[j+(l*40&-1)+32>>2]|0)-o|0;l=ut(s)|0;do{if((l|0)==0){gk();j=ut(s)|0;if((j|0)!=0){x=j;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=110688,v)|0)}else{x=l}}while(0);uD(x|0,(c[10036]|0)+(o+1|0)|0,s);a[x+(s-1|0)|0]=0;c[13544]=(c[13544]|0)+1;if(k==0.0){uu(x);c[13898]=w;i=b;return}s=d|0;o=d+8|0;while(1){dL(bP(x|0)|0);c[13898]=f;l=is(d)|0;j=c[l>>2]|0;if((j|0)==1){y=+(c[l+8>>2]|0)}else if((j|0)==3){y=+uz(c[l+8>>2]|0,0)}else if((j|0)==2){y=+h[l+8>>3]}else{p=2367;break}if((c[s>>2]|0)==3){uu(c[o>>2]|0);c[s>>2]=1}if(y==0.0){p=2377;break}}if((p|0)==2377){uu(x);c[13898]=w;i=b;return}else if((p|0)==2367){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}function d5(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,o=0;b=i;i=i+32|0;d=b|0;e=b+24|0;f=(c[13898]|0)+1|0;c[13898]=f;L3222:do{if((f|0)<(c[8272]|0)){g=c[1054]|0;L3224:do{if((a[g+(f*40&-1)|0]&1)!=0){h=c[g+(f*40&-1)+36>>2]|0;j=g+(f*40&-1)+32|0;k=c[10036]|0;l=0;while(1){if((l|0)>=(h|0)){break}if((a[k+((c[j>>2]|0)+l|0)|0]|0)==(a[l+103664|0]|0)){l=l+1|0}else{break L3224}}if((l|0)==1){break L3222}}}while(0);a[14176]=1;is(d);a[14176]=0;if((c[d>>2]|0)!=3){c[13898]=f;break}g=c[d+8>>2]|0;c[e>>2]=g;if((g|0)==0){m=c[13898]|0;uf(m,149040,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}iQ(e);g=c[e>>2]|0;if((aY(g|0,202112)|0)==0){o=c[n>>2]|0;hw(o,g,0);i=b;return}else{o=hA(g,193632)|0;hw(o,g,0);i=b;return}}}while(0);c[e>>2]=0;m=f;uf(m,149040,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}function d6(){var b=0;b=c[13898]|0;c[13898]=b+1;c[7738]=b;a[30664]=0;hY(1);a[(e6(159824)|0)+8|0]=1;a[(e6(159208)|0)+8|0]=1;a[(e6(158720)|0)+8|0]=1;a[(e6(158096)|0)+8|0]=1;a[(e6(164136)|0)+8|0]=1;a[(e6(156232)|0)+8|0]=1;a[(e6(155120)|0)+8|0]=1;a[(e6(154768)|0)+8|0]=1;iS();return}function d7(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;b=i;i=i+24|0;d=b|0;if((c[7262]|0)==0){c[7262]=c[m>>2]}a[25280]=0;e=d|0;f=d+8|0;g=0;h=c[13898]|0;L3250:while(1){c[13898]=h+1;is(d);do{if((c[e>>2]|0)==3){j=c[f>>2]|0;k=c[7262]|0;aK(j|0,k|0);if((c[e>>2]|0)!=3){l=0;break}uu(c[f>>2]|0);c[e>>2]=1;l=0}else{if((g|0)!=0){k=c[7262]|0;aF(32,k|0)}j5(c[7262]|0,d,0);l=1}}while(0);k=c[13898]|0;if((k|0)>=(c[8272]|0)){break}j=c[1054]|0;n=(a[j+(k*40&-1)|0]&1)==0;if(n){break}o=c[j+(k*40&-1)+36>>2]|0;p=j+(k*40&-1)+32|0;q=c[10036]|0;r=0;while(1){if((r|0)>=(o|0)){s=2413;break}if((a[q+((c[p>>2]|0)+r|0)|0]|0)==(a[r+103664|0]|0)){r=r+1|0}else{s=2414;break}}if((s|0)==2413){s=0;if((r|0)==1|n){break}}else if((s|0)==2414){s=0;if(n){break}}p=c[j+(k*40&-1)+36>>2]|0;q=j+(k*40&-1)+32|0;o=c[10036]|0;t=0;while(1){if((t|0)>=(p|0)){break}if((a[o+((c[q>>2]|0)+t|0)|0]|0)==(a[t+148464|0]|0)){t=t+1|0}else{break L3250}}if((t|0)==1){g=l;h=k}else{break}}aF(10,c[7262]|0);aD(c[7262]|0);i=b;return}function d8(){c[13898]=(c[13898]|0)+1;dO();return}function d9(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,n=0,p=0,q=0,r=0,s=0.0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0.0,O=0,P=0;b=i;i=i+48|0;d=b|0;e=b+24|0;f=c[13898]|0;g=f+1|0;c[13898]=g;c[8026]=0;j=c[8272]|0;L3276:do{if((j|0)>(g|0)){k=c[1054]|0;if((a[k+(g*40&-1)|0]&1)==0){l=2487;break}n=c[k+(g*40&-1)+36>>2]|0;p=k+(g*40&-1)+32|0;q=c[10036]|0;r=0;while(1){if((r|0)>=(n|0)){break}if((a[q+((c[p>>2]|0)+r|0)|0]|0)==(a[r+218536|0]|0)){r=r+1|0}else{l=2487;break L3276}}if((r|0)!=5){l=2487;break}p=f+2|0;c[13898]=p;if(!((c[8496]|0)!=0&(c[3524]|0)!=0)){uh(-1,96888,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);s=-1.0;break}L3287:do{if((p|0)<(j|0)){n=0;t=p;while(1){u=t;L3290:while(1){w=(a[k+(u*40&-1)|0]&1)==0;x=c[k+(u*40&-1)+36>>2]|0;y=k+(u*40&-1)+32|0;L3292:do{if(w){z=c[y>>2]|0}else{A=0;while(1){if((A|0)>=(x|0)){l=2434;break}if((a[q+((c[y>>2]|0)+A|0)|0]|0)==(a[A+103664|0]|0)){A=A+1|0}else{break}}if((l|0)==2434){l=0;if((A|0)==1){B=n;break L3287}}C=c[y>>2]|0;if((x|0)>0&(w^1)){D=0;E=0;F=C}else{z=C;break}while(1){if((a[D+101312|0]|0)==(a[q+(D+F|0)|0]|0)){G=F;H=E}else{if((D|0)!=3){z=C;break L3292}G=F-1|0;H=1}I=D+1|0;if((I|0)<(H+x|0)){D=I;E=H;F=G}else{break}}if((H|0)!=0){l=2442;break L3290}if((D|0)==2|(D|0)==8){l=2442;break L3290}else{z=C}}}while(0);J=(j|0)>(u|0);if(!J){B=n;break L3287}if(w){l=2451;break}else{K=0}while(1){if((K|0)>=(x|0)){break}if((a[q+(z+K|0)|0]|0)==(a[K+148464|0]|0)){K=K+1|0}else{l=2450;break L3290}}if((K|0)!=1){l=2450;break}x=u+1|0;c[13898]=x;if((x|0)<(j|0)){u=x}else{B=n;break L3287}}if((l|0)==2450){l=0;if(J){l=2451}else{B=n;break L3287}}else if((l|0)==2442){l=0;x=u+1|0;c[13898]=x;L=n|8;M=x}L3318:do{if((l|0)==2451){l=0;L3320:do{if((a[k+(u*40&-1)|0]&1)!=0){x=c[k+(u*40&-1)+36>>2]|0;w=k+(u*40&-1)+32|0;y=0;while(1){if((y|0)>=(x|0)){break}if((a[q+((c[w>>2]|0)+y|0)|0]|0)==(a[y+100784|0]|0)){y=y+1|0}else{break L3320}}if((y|0)!=3){break}w=u+1|0;c[13898]=w;L=n|63;M=w;break L3318}}while(0);if(!J){B=n;break L3287}if((a[k+(u*40&-1)|0]&1)!=0){w=c[k+(u*40&-1)+36>>2]|0;x=k+(u*40&-1)+32|0;C=0;while(1){if((C|0)>=(w|0)){l=2462;break}if((a[q+((c[x>>2]|0)+C|0)|0]|0)==(a[C+100080|0]|0)){C=C+1|0}else{break}}do{if((l|0)==2462){l=0;if((C|0)!=7){break}x=u+1|0;c[13898]=x;L=n|1;M=x;break L3318}}while(0);if(!J){B=n;break L3287}}L3339:do{if((a[k+(u*40&-1)|0]&1)!=0){C=c[k+(u*40&-1)+36>>2]|0;x=k+(u*40&-1)+32|0;w=0;while(1){if((w|0)>=(C|0)){break}if((a[q+((c[x>>2]|0)+w|0)|0]|0)==(a[w+99640|0]|0)){w=w+1|0}else{break L3339}}if((w|0)!=7){break}x=u+1|0;c[13898]=x;L=n|2;M=x;break L3318}}while(0);if(!J){B=n;break L3287}if((a[k+(u*40&-1)|0]&1)!=0){x=c[k+(u*40&-1)+36>>2]|0;C=k+(u*40&-1)+32|0;y=0;while(1){if((y|0)>=(x|0)){l=2476;break}if((a[q+((c[C>>2]|0)+y|0)|0]|0)==(a[y+99208|0]|0)){y=y+1|0}else{break}}do{if((l|0)==2476){l=0;if((y|0)!=7){break}C=u+1|0;c[13898]=C;L=n|4;M=C;break L3318}}while(0);if(!J){B=n;break L3287}}if((a[k+(u*40&-1)|0]&1)==0){B=n;break L3287}y=c[k+(u*40&-1)+36>>2]|0;C=k+(u*40&-1)+32|0;x=0;while(1){if((x|0)>=(y|0)){break}if((a[q+((c[C>>2]|0)+x|0)|0]|0)==(a[x+98600|0]|0)){x=x+1|0}else{B=n;break L3287}}if((x|0)!=5){B=n;break L3287}C=u+1|0;c[13898]=C;L=n|16;M=C}}while(0);if((M|0)<(j|0)){n=L;t=M}else{B=L;break}}}else{B=0}}while(0);c[8026]=(B|0)==0?7:B;q=e6(163432)|0;a[q+8|0]=0;c[q+16>>2]=1;c[q+24>>2]=-1;q=e6(164136)|0;a[q+8|0]=0;c[q+16>>2]=1;c[q+24>>2]=-1;s=-1.0}else{l=2487}}while(0);do{if((l|0)==2487){B=is(d)|0;L=c[B>>2]|0;if((L|0)==1){N=+(c[B+8>>2]|0)}else if((L|0)==2){N=+h[B+8>>3]}else if((L|0)==3){N=+uz(c[B+8>>2]|0,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}B=d|0;if((c[B>>2]|0)!=3){s=N;break}uu(c[d+8>>2]|0);c[B>>2]=1;s=N}}while(0);d=c[13898]|0;L3376:do{if((d|0)<(c[8272]|0)){B=c[1054]|0;L3378:do{if((a[B+(d*40&-1)|0]&1)!=0){L=c[B+(d*40&-1)+36>>2]|0;M=B+(d*40&-1)+32|0;j=c[10036]|0;J=0;while(1){if((J|0)>=(L|0)){break}if((a[j+((c[M>>2]|0)+J|0)|0]|0)==(a[J+103664|0]|0)){J=J+1|0}else{break L3378}}if((J|0)==1){l=2500;break L3376}}}while(0);uu(c[8028]|0);B=c[13898]|0;L3385:do{if((B|0)<(c[8272]|0)){M=c[1054]|0;L3387:do{if((a[M+(B*40&-1)|0]&1)!=0){j=c[M+(B*40&-1)+36>>2]|0;L=M+(B*40&-1)+32|0;K=c[10036]|0;z=0;while(1){if((z|0)>=(j|0)){break}if((a[K+((c[L>>2]|0)+z|0)|0]|0)==(a[z+103664|0]|0)){z=z+1|0}else{break L3387}}if((z|0)==1){break L3385}}}while(0);a[14176]=1;is(e);a[14176]=0;if((c[e>>2]|0)!=3){c[13898]=B;break}M=c[e+8>>2]|0;c[8028]=M;if((M|0)!=0){J=c[m>>2]|0;aK(M|0,J|0);O=1;break L3376}P=c[13898]|0;uf(P,132744,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);c[8028]=0;P=B;uf(P,132744,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{l=2500}}while(0);if((l|0)==2500){uu(c[8028]|0);c[8028]=bP(96376)|0;O=0}L3406:do{if(s<0.0){l=c[3524]|0;do{if((l|0)!=0){P=c[l+116>>2]|0;if((P|0)==0){break}cL[P&7]();break L3406}}while(0);l=c[8028]|0;B=uA(l|0)|0;P=c[o>>2]|0;a6(l|0,B|0,P|0)}}while(0);if(s>0.0){P=~~(s*1.0e6);bH(P|0)}if((O|0)==0|s<0.0){a[25280]=0;i=b;return}aF(10,c[m>>2]|0);a[25280]=0;i=b;return}function ea(b,d){b=b|0;d=d|0;var e=0,f=0;e=i;f=c[7262]|0;do{if(!((f|0)==0|(f|0)==(c[m>>2]|0)|(f|0)==(c[n>>2]|0))){if((a[c[7260]|0]|0)==124){if((a2(f|0)|0)>=0){break}aS(c[7260]|0);break}else{if((az(f|0)|0)>=0){break}aS(c[7260]|0);break}}}while(0);f=c[7260]|0;if((f|0)!=0){uu(f)}c[7260]=0;if((b|0)==0){c[7262]=c[m>>2];i=e;return}if((aY(b|0,202112)|0)==0){c[7262]=c[n>>2];i=e;return}if((a[b]|0)!=124){f=bF(b|0,(d?205056:137896)|0)|0;c[7262]=f;if((f|0)==0){aS(b|0);i=e;return}else{c[7260]=b;i=e;return}}if(!(a[14168]|0)){uf(-1,145320,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=bt(b+1|0,137896)|0;c[7262]=f;if((f|0)==0){aS(b|0);i=e;return}else{c[7260]=b;i=e;return}}function eb(){var a=0,b=0,d=0,e=0;a=i;b=ut(4096)|0;do{if((b|0)==0){gk();d=ut(4096)|0;if((d|0)!=0){e=d;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=88504,v)|0)}else{e=b}}while(0);bl(e|0,4096);cf(c[m>>2]|0,154696,(v=i,i=i+8|0,c[v>>2]=e,v)|0);uu(e);c[13898]=(c[13898]|0)+1;i=a;return}function ec(){var a=0,b=0;a=c[8804]|0;do{if((a|0)!=0){b=c[a>>2]|0;if((b|0)==0){break}cs(b|0)}}while(0);c[13898]=(c[13898]|0)+1;return}function ed(){c[13898]=(c[13898]|0)+1;aI(81576,27,1,c[m>>2]|0);return}function ee(){var b=0;b=c[13898]|0;c[13898]=b+1;c[7738]=b;a[30664]=0;hY(2);a[(e6(159824)|0)+8|0]=1;a[(e6(159208)|0)+8|0]=1;a[(e6(158720)|0)+8|0]=1;a[(e6(158096)|0)+8|0]=1;a[(e6(164136)|0)+8|0]=1;iZ();return}function ef(){k9();return}function eg(){var b=0,d=0,e=0;b=i;if((a[c[6924]|0]|0)==0){uf(c[13898]|0,84384,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((a[27704]&1)!=0){a[27704]=0;iL()}d=c[3524]|0;e=c[13898]|0;if((d|0)==0){uf(e,135392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[13898]=e+1;if((c[d+96>>2]&8|0)==0){dP();i=b;return}cS[c[d+36>>2]&511]();dP();i=b;return}function eh(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0;b=i;i=i+32|0;d=b|0;e=b+24|0;c[e>>2]=0;f=c[13898]|0;g=f+1|0;c[13898]=g;h=c[1054]|0;j=c[h+(g*40&-1)+36>>2]|0;k=c[h+(g*40&-1)+32>>2]|0;l=(a[h+(g*40&-1)|0]&1)==0;m=(j|0)>0;o=c[10036]|0;L3484:do{if(l){p=2648}else{L3486:do{if(m){q=0;r=0;s=k;while(1){if((a[q+98416|0]|0)==(a[o+(q+s|0)|0]|0)){t=s;u=r}else{if((q|0)!=1){break L3486}t=s-1|0;u=1}w=q+1|0;if((w|0)<(u+j|0)){q=w;r=u;s=t}else{break}}if((u|0)==0){x=w;p=2585}else{y=25296;break L3484}}else{x=0;p=2585}}while(0);if((p|0)==2585){s=a[x+98416|0]|0;if((s<<24>>24|0)==36|(s<<24>>24|0)==0){y=25296;break}}if(l){p=2648;break}L3498:do{if(m){s=0;r=0;q=k;while(1){if((a[s+97808|0]|0)==(a[o+(s+q|0)|0]|0)){z=q;A=r}else{if((s|0)!=1){break L3498}z=q-1|0;A=1}B=s+1|0;if((B|0)<(A+j|0)){s=B;r=A;q=z}else{break}}if((A|0)==0){C=B;p=2631}else{y=25304;break L3484}}else{C=0;p=2631}}while(0);if((p|0)==2631){q=a[C+97808|0]|0;if((q<<24>>24|0)==36|(q<<24>>24|0)==0){y=25304;break}}if(l){p=2648;break}L3510:do{if(m){q=0;r=0;s=k;while(1){if((a[q+97200|0]|0)==(a[o+(q+s|0)|0]|0)){D=s;E=r}else{if((q|0)!=1){break L3510}D=s-1|0;E=1}F=q+1|0;if((F|0)<(E+j|0)){q=F;r=E;s=D}else{break}}if((E|0)==0){G=F;p=2639}else{y=25312;break L3484}}else{G=0;p=2639}}while(0);if((p|0)==2639){s=a[G+97200|0]|0;if((s<<24>>24|0)==36|(s<<24>>24|0)==0){y=25312;break}}if(l){p=2648;break}if(m){s=0;r=0;q=k;while(1){if((a[s+96640|0]|0)==(a[o+(s+q|0)|0]|0)){H=q;I=r}else{if((s|0)!=1){p=2648;break L3484}H=q-1|0;I=1}J=s+1|0;if((J|0)<(I+j|0)){s=J;r=I;q=H}else{break}}if((I|0)==0){K=J}else{y=25320;break}}else{K=0}q=a[K+96640|0]|0;if((q<<24>>24|0)==36|(q<<24>>24|0)==0){y=25320}else{p=2648}}}while(0);if((p|0)==2648){y=25328}p=c[y+4>>2]|0;if((p-1|0)>>>0<4){y=f+2|0;c[13898]=y;L=y}else{L=g}L3537:do{if((L|0)<(c[8272]|0)){L3539:do{if((a[h+(L*40&-1)|0]&1)!=0){g=c[h+(L*40&-1)+36>>2]|0;y=h+(L*40&-1)+32|0;f=0;while(1){if((f|0)>=(g|0)){break}if((a[o+((c[y>>2]|0)+f|0)|0]|0)==(a[f+103664|0]|0)){f=f+1|0}else{break L3539}}if((f|0)==1){break L3537}}}while(0);a[14176]=1;is(d);a[14176]=0;if((c[d>>2]|0)!=3){c[13898]=L;break}y=c[d+8>>2]|0;c[e>>2]=y;if((y|0)==0){M=c[13898]|0;uf(M,149040,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}do{if((a[y]|0)==124){if(a[14168]|0){N=bt(y+1|0,137896)|0;O=y;break}else{uf(-1,145320,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}else{iQ(e);g=c[e>>2]|0;if((aY(g|0,202112)|0)==0){N=c[n>>2]|0;O=g;break}else{N=hA(g,137896)|0;O=g;break}}}while(0);if((N|0)==0){uj(c[13898]|0,82848,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((p|0)==4){jI(N);i8(N);aI(172e3,9,1,N|0)}else if((p|0)==1){jI(N);y=c[10812]|0;if((y|0)!=0){g=y;do{y=c[g+12>>2]|0;if((y|0)!=0){cf(N|0,154696,(v=i,i=i+8|0,c[v>>2]=y,v)|0)}g=c[g>>2]|0;}while((g|0)!=0)}aI(172e3,9,1,N|0)}else if((p|0)==3){jI(N);jb(N);aI(172e3,9,1,N|0)}else if((p|0)==2){jd(N)}else{jc(N)}if((c[n>>2]|0)==(N|0)){uu(O);i=b;return}if((a[O]|0)==124){a2(N|0);uu(O);i=b;return}else{az(N|0);uu(O);i=b;return}}}while(0);c[e>>2]=0;M=L;uf(M,149040,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}function ei(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;b=i;i=i+24|0;d=b|0;e=(c[13898]|0)+1|0;c[13898]=e;if((e|0)>=(c[8272]|0)){f=0;uu(f);i=b;return}g=c[1054]|0;L3594:do{if((a[g+(e*40&-1)|0]&1)!=0){h=c[g+(e*40&-1)+36>>2]|0;j=g+(e*40&-1)+32|0;k=c[10036]|0;l=0;while(1){if((l|0)>=(h|0)){break}if((a[k+((c[j>>2]|0)+l|0)|0]|0)==(a[l+103664|0]|0)){l=l+1|0}else{break L3594}}if((l|0)==1){f=0}else{break}uu(f);i=b;return}}while(0);a[14176]=1;is(d);a[14176]=0;if((c[d>>2]|0)!=3){c[13898]=e;f=0;uu(f);i=b;return}e=c[d+8>>2]|0;if((e|0)==0){f=0;uu(f);i=b;return}if(!(a[14168]|0)){uf(-1,145320,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}bN(e|0);f=e;uu(f);i=b;return}function ej(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0.0,Y=0.0,Z=0,_=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0,at=0.0;b=i;i=i+8312|0;d=b|0;e=b+2048|0;f=b+8192|0;g=b+8240|0;j=b+8248|0;k=b+8256|0;l=b+8304|0;n=c[13898]|0;o=n+1|0;c[13898]=o;p=c[3524]|0;if((p|0)==0){uf(o,135392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}L3617:do{if((o|0)<(c[8272]|0)){q=c[1054]|0;r=(a[q+(o*40&-1)|0]&1)==0;L3619:do{if(r){s=c[10036]|0;t=2765}else{u=c[q+(o*40&-1)+36>>2]|0;w=q+(o*40&-1)+32|0;x=c[10036]|0;y=0;while(1){if((y|0)>=(u|0)){t=2680;break}if((a[x+((c[w>>2]|0)+y|0)|0]|0)==(a[y+103664|0]|0)){y=y+1|0}else{break}}if((t|0)==2680){if((y|0)==1){break L3617}}z=c[w>>2]|0;A=(u|0)>0;if(r){s=x;t=2765;break}L3629:do{if(A){B=0;C=0;D=z;while(1){if((a[B+142016|0]|0)==(a[x+(B+D|0)|0]|0)){E=D;F=C}else{if((B|0)!=4){break L3629}E=D-1|0;F=1}G=B+1|0;if((G|0)<(F+u|0)){B=G;C=F;D=E}else{break}}if((F|0)==0){H=G;t=2689}else{I=5696;J=x;break L3619}}else{H=0;t=2689}}while(0);if((t|0)==2689){w=a[H+142016|0]|0;if((w<<24>>24|0)==36|(w<<24>>24|0)==0){I=5696;J=x;break}}if(r){s=x;t=2765;break}L3641:do{if(A){w=0;y=0;D=z;while(1){if((a[w+205488|0]|0)==(a[x+(w+D|0)|0]|0)){K=D;L=y}else{if((w|0)!=3){break L3641}K=D-1|0;L=1}M=w+1|0;if((M|0)<(L+u|0)){w=M;y=L;D=K}else{break}}if((L|0)==0){N=M;t=2759}else{I=5704;J=x;break L3619}}else{N=0;t=2759}}while(0);if((t|0)==2759){D=a[N+205488|0]|0;if((D<<24>>24|0)==36|(D<<24>>24|0)==0){I=5704;J=x;break}}if(r){s=x;t=2765;break}if(A){D=0;while(1){if((a[D+141856|0]|0)!=(a[x+(D+z|0)|0]|0)){s=x;t=2765;break L3619}y=D+1|0;if((y|0)<(u|0)){D=y}else{P=y;break}}}else{P=0}D=a[P+141856|0]|0;if((D<<24>>24|0)==36|(D<<24>>24|0)==0){I=5712;J=x}else{s=x;t=2765}}}while(0);if((t|0)==2765){I=5720;J=s}r=c[I+4>>2]|0;if((r|0)==2){if((c[p+136>>2]|0)==0){Q=0}else{Q=(c[p+144>>2]|0)!=0}D=a$()|0;u=c[13898]|0;z=u+1|0;c[13898]=z;L3666:do{if((z|0)<(c[8272]|0)){A=c[1054]|0;y=c[A+(z*40&-1)+36>>2]|0;L3668:do{if((a[A+(z*40&-1)|0]&1)==0){R=c[10036]|0;S=A+(z*40&-1)+32|0}else{w=A+(z*40&-1)+32|0;C=c[10036]|0;B=0;while(1){if((B|0)>=(y|0)){break}if((a[C+((c[w>>2]|0)+B|0)|0]|0)==(a[B+103664|0]|0)){B=B+1|0}else{R=C;S=w;break L3668}}if((B|0)==1){T=93664;break L3666}else{R=C;S=w}}}while(0);A=(y|0)!=3;x=A&1;U=R+(c[S>>2]|0)|0;if(A){V=x}else{A=((aZ(U|0,114,3)|0)==0&1)+x|0;x=A+((aZ(U|0,103,3)|0)==0&1)|0;V=x+((aZ(U|0,98,3)|0)==0&1)|0}if((V|0)==0){c[13898]=u+2;T=U;break}else{uf(z,215792,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}else{T=93664}}while(0);if((D|0)==0){uf(-1,215320,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{W=0}do{X=+(W|0)/255.0;h[d+(W<<3)>>3]=X;if((a[20668]|0)==110){Y=1.0-X}else{Y=X}fq(Y,e+(W*24&-1)|0);W=W+1|0;}while((W|0)<256);c[11254]=0;z=c[6924]|0;if((z|0)==0){Z=0}else{Z=bP(z|0)|0}z=a[37384]&1;aI(5992,208,1,D|0);if(Q){aI(5976,13,1,D|0)}aI(5728,243,1,D|0);aF(112,D|0);if((a[T]|0)!=0){u=0;do{if((u|0)>0){aF(44,D|0)}aI(214288,7,1,D|0);U=a[T+u|0]|0;if((U|0)==114){aI(213544,25,1,D|0)}else if((U|0)==103){aI(213024,29,1,D|0)}else if((U|0)==98){aI(212416,27,1,D|0)}u=u+1|0;}while(u>>>0<(uA(T|0)|0)>>>0)}aI(211904,28,1,D|0);aF(10,D|0);u=a[T]|0;U=0;do{if((u<<24>>24|0)==103){_=e+(U*24&-1)+8|0}else if((u<<24>>24|0)==114){_=e+(U*24&-1)|0}else{_=e+(U*24&-1)+16|0}X=+h[_>>3];cf(D|0,210888,(v=i,i=i+16|0,h[v>>3]=+h[d+(U<<3)>>3],h[v+8>>3]=X,v)|0);U=U+1|0;}while((U|0)<256);aI(210424,2,1,D|0);U=a[T+1|0]|0;u=0;do{if((U<<24>>24|0)==103){$=e+(u*24&-1)+8|0}else if((U<<24>>24|0)==114){$=e+(u*24&-1)|0}else{$=e+(u*24&-1)+16|0}X=+h[$>>3];cf(D|0,210888,(v=i,i=i+16|0,h[v>>3]=+h[d+(u<<3)>>3],h[v+8>>3]=X,v)|0);u=u+1|0;}while((u|0)<256);aI(210424,2,1,D|0);u=a[T+2|0]|0;U=0;do{if((u<<24>>24|0)==103){aa=e+(U*24&-1)+8|0}else if((u<<24>>24|0)==114){aa=e+(U*24&-1)|0}else{aa=e+(U*24&-1)+16|0}X=+h[aa>>3];cf(D|0,210888,(v=i,i=i+16|0,h[v>>3]=+h[d+(U<<3)>>3],h[v+8>>3]=X,v)|0);U=U+1|0;}while((U|0)<256);aI(210424,2,1,D|0);U=0;do{X=+h[e+(U*24&-1)>>3]*.299+ +h[e+(U*24&-1)+8>>3]*.587+ +h[e+(U*24&-1)+16>>3]*.114;cf(D|0,210888,(v=i,i=i+16|0,h[v>>3]=+h[d+(U<<3)>>3],h[v+8>>3]=X,v)|0);U=U+1|0;}while((U|0)<256);aI(210424,2,1,D|0);aI(6208,14,1,D|0);jI(D);jb(D);aI(172e3,9,1,D|0);cs(D|0);hw(D,0,0);c[11254]=1;uu(c[6924]|0);c[6924]=Z;a[37384]=z;c[8272]=0;c[13898]=0;i=b;return}else if((r|0)==3){U=k;c[g>>2]=0;c[j>>2]=0;u=n+2|0;c[13898]=u;if((a[q+(u*40&-1)|0]&1)==0){i=b;return}x=a[J+(c[q+(u*40&-1)+32>>2]|0)|0]|0;if(!((x<<24>>24|0)==39|(x<<24>>24|0)==34)){i=b;return}ub(g,u,u);u=(c[13898]|0)+1|0;c[13898]=u;x=c[1054]|0;do{if((a[x+(u*40&-1)|0]&1)!=0){A=a[(c[10036]|0)+(c[x+(u*40&-1)+32>>2]|0)|0]|0;if(!((A<<24>>24|0)==39|(A<<24>>24|0)==34)){break}ub(j,u,u);uE(U|0,0,44);A=c[j>>2]|0;ab=c[g>>2]|0;t1(A,ab,k,l);X=+t2(k);ac=c[m>>2]|0;ad=k+12|0;ae=c[ad>>2]|0;af=k+16|0;ag=(c[af>>2]|0)+1|0;ah=k+20|0;ai=(c[ah>>2]|0)%100&-1;aj=k+8|0;ak=c[aj>>2]|0;al=k+4|0;am=c[al>>2]|0;an=k|0;ao=c[an>>2]|0;ap=k+24|0;aq=c[ap>>2]|0;ar=k+28|0;as=c[ar>>2]|0;cf(ac|0,217600,(v=i,i=i+72|0,h[v>>3]=X,c[v+8>>2]=ae,c[v+16>>2]=ag,c[v+24>>2]=ai,c[v+32>>2]=ak,c[v+40>>2]=am,c[v+48>>2]=ao,c[v+56>>2]=aq,c[v+64>>2]=as,v)|0);uE(U|0,0,44);t3(k,X);as=uA(A|0)|0;t3(f,X);at=X- +O(+X);t4(A,as,ab,f,at);ab=c[m>>2]|0;as=c[ad>>2]|0;ad=(c[af>>2]|0)+1|0;af=(c[ah>>2]|0)%100&-1;ah=c[aj>>2]|0;aj=c[al>>2]|0;al=c[an>>2]|0;an=c[ap>>2]|0;ap=c[ar>>2]|0;cf(ab|0,216816,(v=i,i=i+72|0,c[v>>2]=A,c[v+8>>2]=as,c[v+16>>2]=ad,c[v+24>>2]=af,c[v+32>>2]=ah,c[v+40>>2]=aj,c[v+48>>2]=al,c[v+56>>2]=an,c[v+64>>2]=ap,v)|0);uu(A);c[13898]=(c[13898]|0)+1}}while(0);uu(c[g>>2]|0);i=b;return}else if((r|0)==1){lG();i=b;return}else{uf(o,80152,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);lG();i=b;return}function ek(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;b=i;i=i+48|0;d=b|0;e=b+24|0;f=(c[13898]|0)+1|0;c[13898]=f;if((f|0)>=(c[8272]|0)){g=f;uf(g,79192,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}h=c[1054]|0;L3758:do{if((a[h+(f*40&-1)|0]&1)!=0){j=c[h+(f*40&-1)+36>>2]|0;k=h+(f*40&-1)+32|0;l=c[10036]|0;m=0;while(1){if((m|0)>=(j|0)){break}if((a[l+((c[k>>2]|0)+m|0)|0]|0)==(a[m+103664|0]|0)){m=m+1|0}else{break L3758}}if((m|0)==1){g=f}else{break}uf(g,79192,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);a[14176]=1;is(e);a[14176]=0;if((c[e>>2]|0)!=3){c[13898]=f;g=f;uf(g,79192,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=c[e+8>>2]|0;e=c[13898]|0;if((f|0)==0){g=e;uf(g,79192,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((e|0)>=(c[8272]|0)){n=0;fc(f,n);uu(n);uu(f);i=b;return}g=c[1054]|0;h=(a[g+(e*40&-1)|0]&1)==0;L3776:do{if(h){o=d}else{k=c[g+(e*40&-1)+36>>2]|0;l=g+(e*40&-1)+32|0;j=c[10036]|0;p=0;while(1){if((p|0)>=(k|0)){q=2788;break}if((a[j+((c[l>>2]|0)+p|0)|0]|0)==(a[p+103664|0]|0)){p=p+1|0}else{break}}do{if((q|0)==2788){if((p|0)==1){n=0}else{break}fc(f,n);uu(n);uu(f);i=b;return}}while(0);p=d;if(h){o=p;break}l=c[g+(e*40&-1)+36>>2]|0;j=g+(e*40&-1)+32|0;k=c[10036]|0;m=0;while(1){if((m|0)>=(l|0)){break}if((a[k+((c[j>>2]|0)+m|0)|0]|0)==(a[m+103664|0]|0)){m=m+1|0}else{o=p;break L3776}}if((m|0)==1){r=e}else{o=p;break}uf(r,78672,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);a[14176]=1;is(d);a[14176]=0;if((c[d>>2]|0)!=3){c[13898]=e;r=e;uf(r,78672,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=c[d+8>>2]|0;if((e|0)!=0){n=e;fc(f,n);uu(n);uu(f);i=b;return}r=c[13898]|0;uf(r,78672,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}function el(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0;b=c[13898]|0;d=c[8272]|0;L3802:do{if((b|0)<(d|0)){e=c[1054]|0;f=b;do{L3806:do{if((a[e+(f*40&-1)|0]&1)!=0){g=c[e+(f*40&-1)+36>>2]|0;h=e+(f*40&-1)+32|0;j=c[10036]|0;k=0;while(1){if((k|0)>=(g|0)){break}if((a[j+((c[h>>2]|0)+k|0)|0]|0)==(a[k+103664|0]|0)){k=k+1|0}else{break L3806}}if((k|0)==1){break L3802}}}while(0);f=f+1|0;c[13898]=f;}while((f|0)<(d|0))}}while(0);uf(b,78216,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}function em(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;b=i;i=i+8|0;d=b|0;e=bU(140128)|0;f=(e|0)==0?138024:e;if((c[10010]|0)==0){e=ut(1024)|0;do{if((e|0)==0){gk();g=ut(1024)|0;if((g|0)!=0){h=g;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74912,v)|0)}else{h=e}}while(0);c[10010]=h;h=ut(1024)|0;do{if((h|0)==0){gk();e=ut(1024)|0;if((e|0)!=0){j=e;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74440,v)|0)}else{j=h}}while(0);c[10008]=j;a[j]=0;a[c[10010]|0]=0}if(!(a[40024]|0)){a[c[10008]|0]=0;a[c[10010]|0]=0}a[40024]=0;j=c[10010]|0;h=uA(j|0)|0;e=(c[13898]|0)+1|0;c[13898]=e;g=c[8272]|0;L3829:do{if((e|0)<(g|0)){k=c[1054]|0;l=e;while(1){L3833:do{if((a[k+(l*40&-1)|0]&1)!=0){m=c[k+(l*40&-1)+36>>2]|0;n=k+(l*40&-1)+32|0;o=c[10036]|0;p=0;while(1){if((p|0)>=(m|0)){break}if((a[o+((c[n>>2]|0)+p|0)|0]|0)==(a[p+103664|0]|0)){p=p+1|0}else{break L3833}}if((p|0)==1){q=l;break L3829}}}while(0);n=l+1|0;c[13898]=n;if((n|0)<(g|0)){l=n}else{q=n;break}}}else{q=e}}while(0);if((h|0)>0){a[j+h|0]=32;r=h+1|0;s=c[10010]|0;t=c[13898]|0}else{r=h;s=j;t=q}q=s+r|0;s=t-1|0;t=1024-r|0;r=c[1054]|0;j=(c[r+(s*40&-1)+36>>2]|0)+(c[r+(s*40&-1)+32>>2]|0)|0;s=c[r+(e*40&-1)+32>>2]|0;if((j-s|0)<(t|0)){u=j}else{u=(t-1|0)+s|0}L3847:do{if((s|0)<(u|0)){t=q;j=s;while(1){e=a[(c[10036]|0)+j|0]|0;if(e<<24>>24==0){w=t;break L3847}r=t+1|0;a[t]=e;e=j+1|0;if((e|0)<(u|0)){t=r;j=e}else{w=r;break}}}else{w=q}}while(0);a[w]=0;w=(c[10010]|0)+h|0;q=a[w]|0;if(q<<24>>24==0){x=w}else{u=w;s=w;w=0;j=q;while(1){do{if((aM(j&255|0)|0)==0){a[s]=a[u]|0;y=0;z=s+1|0}else{if(w){y=1;z=s;break}a[s]=32;y=1;z=s+1|0}}while(0);q=u+1|0;t=a[q]|0;if(t<<24>>24==0){x=z;break}else{u=q;s=z;w=y;j=t}}}a[x]=0;x=c[10010]|0;j=uA(x|0)|0;if((aY(x+((h|0)==0?0:h+1|0)|0,216168)|0)==0){a[d]=1;a[x+h|0]=0;A=1;B=c[10010]|0}else{a[d]=0;A=0;B=x}x=gm(B,f,d)|0;if((x|0)==1){B=c[10010]|0;bD(224888,(v=i,i=i+8|0,c[v>>2]=B,v)|0);C=c[10010]|0;D=C+h|0;a[D]=0;i=b;return}else if((x|0)==0){a[25280]=0;if((a[d]&1)==0|A){C=c[10010]|0;D=C+h|0;a[D]=0;i=b;return}A=(j|0)>0;L3873:while(1){j=c[10008]|0;if(A){uD(j|0,73672,13);B=c[10010]|0;ck(j|0,B|0,1008);B=c[10008]|0;y=B+(uA(B|0)|0)|0;a[y]=a[212304]|0;a[y+1|0]=a[212305|0]|0;a[y+2|0]=a[212306|0]|0;E=c[10008]|0}else{uD(j|0,225272,13);E=j}dF(E,0);j=jl(40144,40136)|0;c[8272]=j;c[13898]=0;if((j|0)<1){F=2870;break}j=c[1054]|0;L3880:do{if((a[j|0]&1)!=0){y=c[j+36>>2]|0;B=j+32|0;w=c[10036]|0;z=0;while(1){if((z|0)>=(y|0)){break}if((a[w+((c[B>>2]|0)+z|0)|0]|0)==(a[z+103664|0]|0)){z=z+1|0}else{break L3880}}if((z|0)==1){F=2871;break L3873}}}while(0);c[13898]=-1;a[40024]=1;em();if((a[d]&1)==0){F=2872;break}}if((F|0)==2870){C=c[10010]|0;D=C+h|0;a[D]=0;i=b;return}else if((F|0)==2871){C=c[10010]|0;D=C+h|0;a[D]=0;i=b;return}else if((F|0)==2872){C=c[10010]|0;D=C+h|0;a[D]=0;i=b;return}}else if((x|0)==(-1|0)){aS(f|0);C=c[10010]|0;D=C+h|0;a[D]=0;i=b;return}else{uf(-1,223936,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}function en(){var b=0,d=0,e=0,f=0,g=0;b=i;a[25280]=0;c[13898]=(c[13898]|0)+1;d=c[256]|0;if((d|0)==0){e=c[m>>2]|0;f=aF(10,e|0)|0;i=b;return}g=uF(46781,d|0,93)|0;if((uA(d|0)|0)>>>0>=93){a[46873]=0}if((bN(g|0)|0)==0){e=c[m>>2]|0;f=aF(10,e|0)|0;i=b;return}else{uj(-1,223328,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}function eo(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;e=i;if(!(a[14168]|0)){uf(-1,145320,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}f=bt(b|0,193632|0)|0;if((f|0)==0){uj(-1,221448,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}b=ut(1024)|0;do{if((b|0)==0){gk();g=ut(1024)|0;if((g|0)!=0){h=g;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=220968,v)|0);return 0}else{h=b}}while(0);a[h]=0;b=h;h=0;g=1024;L3914:while(1){j=h;while(1){k=a1(f|0)|0;if((k|0)==-1){l=2898;break L3914}m=j+1|0;n=b+j|0;a[n]=k&255;if((m|0)==(g|0)){break}else{j=m}}if((g|0)>1048575){l=2896;break}m=g+1024|0;b=db(b,m,218568)|0;h=g;g=m}if((l|0)==2898){o=b+j|0;a[o]=0;p=a2(f|0)|0;q=uA(b|0)|0;r=q+1|0;s=db(b,r,220968)|0;c[d>>2]=s;i=e;return p|0}else if((l|0)==2896){uh(-1,219104,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);o=n;a[o]=0;p=a2(f|0)|0;q=uA(b|0)|0;r=q+1|0;s=db(b,r,220968)|0;c[d>>2]=s;i=e;return p|0}return 0}function ep(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,w=0.0,x=0.0,y=0,z=0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0,N=0.0,S=0.0,T=0,U=0.0,V=0,W=0.0,X=0.0,Y=0.0,ab=0.0,ac=0.0,ad=0.0,ae=0.0,af=0.0,ag=0.0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0,aA=0,aB=0,aC=0,aD=0,aE=0,aF=0,aG=0,aH=0,aJ=0,aK=0,aL=0,aM=0,aN=0,aO=0,aP=0,aQ=0,aR=0,aS=0,aT=0,aU=0,aV=0,aW=0,aX=0,aY=0,aZ=0,a_=0,a$=0,a0=0,a1=0,a2=0,a3=0,a4=0,a5=0,a6=0,a7=0,a8=0,a9=0,ba=0,bb=0,bc=0,bd=0,be=0.0,bf=0.0,bg=0.0,bh=0,bi=0.0,bj=0.0,bk=0.0,bl=0,bm=0,bn=0,bo=0,bp=0,bq=0,br=0,bs=0,bt=0,bu=0,bv=0,bw=0,bx=0,by=0,bz=0,bA=0.0,bB=0.0,bC=0.0,bD=0,bE=0,bF=0.0,bG=0,bH=0,bI=0,bJ=0.0,bK=0.0,bL=0,bM=0,bN=0,bO=0,bP=0,bR=0,bS=0,bT=0,bU=0,bV=0,bW=0,bX=0,bY=0,bZ=0,b_=0,b$=0,b0=0,b1=0,b2=0.0,b3=0,b4=0,b5=0,b6=0,b7=0,b8=0.0,b9=0,ca=0,cb=0.0,cc=0,cd=0,ce=0,cf=0,cg=0,ch=0,ci=0,cj=0,ck=0.0;e=i;i=i+24|0;f=e|0;g=e+8|0;j=e+16|0;k=c[13374]|0;c[9348]=c[13378];c[13370]=0;l=d+8|0;n=c[l>>2]|0;h[15]=8.988465674311579e+307;h[70]=8.988465674311579e+307;h[98]=8.988465674311579e+307;h[16]=-8.988465674311579e+307;h[71]=-8.988465674311579e+307;h[99]=-8.988465674311579e+307;if((b|0)>0){o=(n|0)>0;p=0;q=d;r=-8.988465674311579e+307;s=-8.988465674311579e+307;t=-8.988465674311579e+307;u=8.988465674311579e+307;w=8.988465674311579e+307;x=8.988465674311579e+307;while(1){y=c[q+12>>2]|0;if(o){z=0;A=r;B=s;C=t;D=u;E=w;F=x;while(1){do{if((c[y+(z<<6)>>2]|0)==2){G=A;H=B;I=C;J=D;K=E;L=F}else{M=y+(z<<6)+8|0;N=+h[M>>3];if(N>A){h[99]=N;S=N}else{S=A}T=y+(z<<6)+16|0;N=+h[T>>3];if(N>B){h[71]=N;U=N}else{U=B}V=y+(z<<6)+24|0;N=+h[V>>3];if(N>C){h[16]=N;W=N}else{W=C}N=+h[M>>3];if(N>3];if(N>3];if(N>=F){G=S;H=U;I=W;J=X;K=Y;L=F;break}h[15]=N;G=S;H=U;I=W;J=X;K=Y;L=N}}while(0);V=z+1|0;if((V|0)<(n|0)){z=V;A=G;B=H;C=I;D=J;E=K;F=L}else{ab=G;ac=H;ad=I;ae=J;af=K;ag=L;break}}}else{ab=r;ac=s;ad=t;ae=u;af=w;ag=x}z=p+1|0;if((z|0)<(b|0)){p=z;q=c[q>>2]|0;r=ab;s=ac;t=ad;u=ae;w=af;x=ag}else{break}}}q=c[d+12>>2]|0;p=(c[l>>2]|0)-1|0;l=(p|0)>0;L3955:do{if(l){n=0;o=0;z=0;L3956:while(1){y=q+(z<<6)|0;V=z+1|0;T=q+(V<<6)|0;do{if((c[y>>2]|0)==0){if((c[T>>2]|0)!=0){ah=o;ai=n;break}M=ut(28)|0;if((M|0)==0){gk();aj=ut(28)|0;if((aj|0)==0){break L3956}else{ak=aj}}else{ak=M}M=ak;c[ak>>2]=0;c[ak+4>>2]=0;c[ak+8>>2]=y;c[ak+12>>2]=T;c[ak+16>>2]=0;c[ak+24>>2]=1;if((o|0)==0){ah=M;ai=M;break}c[o+16>>2]=M;ah=M;ai=n}else{ah=o;ai=n}}while(0);if((V|0)<(p|0)){n=ai;o=ah;z=V}else{al=ai;am=ah;break L3955}}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=212672,v)|0);return 0}else{al=0;am=0}}while(0);L3968:do{if((b|0)>1){ah=al;ai=am;ak=0;z=2;o=q;n=d;T=al;y=0;L3969:while(1){M=c[n>>2]|0;aj=c[M+12>>2]|0;do{if((c[o>>2]|0)==0){if((c[aj>>2]|0)!=0){an=0;ao=ai;ap=T;break}aq=ut(28)|0;if((aq|0)==0){gk();ar=ut(28)|0;if((ar|0)==0){as=2935;break L3969}else{at=ar}}else{at=aq}aq=at;c[at>>2]=0;c[at+4>>2]=0;c[at+8>>2]=o;c[at+12>>2]=aj;c[at+16>>2]=0;c[at+24>>2]=1;if((ai|0)==0){an=aq;ao=aq;ap=aq;break}c[ai+16>>2]=aq;an=aq;ao=aq;ap=T}else{an=0;ao=ai;ap=T}}while(0);do{if(l){V=0;aq=ao;ar=0;au=ak;av=an;aw=ah;ax=0;ay=ap;az=y;while(1){do{if((aw|0)==0){aA=0;aB=0}else{if((c[aw+8>>2]|0)!=(o+(ax<<6)|0)){aA=aw;aB=0;break}aA=c[aw+16>>2]|0;aB=aw}}while(0);aC=ax+1|0;aD=o+(aC<<6)|0;aE=aj+(ax<<6)|0;aF=aD|0;aG=aE|0;do{if((c[aF>>2]|0)==0){if((c[aG>>2]|0)!=0){aH=au;aJ=0;aK=1;aL=aq;aM=ay;aN=az;break}aO=ut(28)|0;if((aO|0)==0){gk();aP=ut(28)|0;if((aP|0)==0){as=2946;break L3969}else{aQ=aP}}else{aQ=aO}aO=aQ;aP=aQ;c[aP>>2]=0;aR=aQ+4|0;c[aR>>2]=0;c[aQ+8>>2]=aD;c[aQ+12>>2]=aE;c[aQ+16>>2]=0;aS=aQ+24|0;c[aS>>2]=1;if((aq|0)==0){aT=aO}else{c[aq+16>>2]=aO;aT=ay}c[aS>>2]=3;if((av|0)==0|(aB|0)==0){aH=au;aJ=aO;aK=0;aL=aO;aM=aT;aN=az;break}aS=ut(16)|0;if((aS|0)==0){gk();aU=ut(16)|0;if((aU|0)==0){as=2952;break L3969}else{aV=aU}}else{aV=aS}aS=aV;c[aV>>2]=av;c[aV+4>>2]=aO;c[aV+8>>2]=aB;c[aV+12>>2]=0;aU=av|0;if((c[aU>>2]|0)==0){c[aU>>2]=aS}else{c[av+4>>2]=aS}if((c[aP>>2]|0)==0){c[aP>>2]=aS}else{c[aR>>2]=aS}aR=aB|0;if((c[aR>>2]|0)==0){c[aR>>2]=aS}else{c[aB+4>>2]=aS}if((au|0)==0){aH=aS;aJ=aO;aK=0;aL=aO;aM=aT;aN=aS;break}c[au+12>>2]=aS;aH=aS;aJ=aO;aK=0;aL=aO;aM=aT;aN=az}else{aH=au;aJ=0;aK=1;aL=aq;aM=ay;aN=az}}while(0);aO=aj+(aC<<6)|0;do{if((c[aG>>2]|0)==0){if((c[aO>>2]|0)!=0){aW=0;aX=ar;aY=V;break}aS=ut(28)|0;if((aS|0)==0){gk();aR=ut(28)|0;if((aR|0)==0){as=2968;break L3969}else{aZ=aR}}else{aZ=aS}aS=aZ;c[aZ>>2]=0;c[aZ+4>>2]=0;c[aZ+8>>2]=aE;c[aZ+12>>2]=aO;c[aZ+16>>2]=0;c[aZ+24>>2]=1;if((ar|0)==0){aW=aS;aX=aS;aY=aS;break}c[ar+16>>2]=aS;aW=aS;aX=aS;aY=V}else{aW=0;aX=ar;aY=V}}while(0);do{if((c[aF>>2]|0)==0){if((c[aO>>2]|0)!=0){a_=aH;a$=aL;a0=0;a1=aM;a2=aN;break}aE=ut(28)|0;if((aE|0)==0){gk();aG=ut(28)|0;if((aG|0)==0){as=2975;break L3969}else{a3=aG}}else{a3=aE}aE=a3;aG=a3;c[aG>>2]=0;aS=a3+4|0;c[aS>>2]=0;c[a3+8>>2]=aD;c[a3+12>>2]=aO;c[a3+16>>2]=0;c[a3+24>>2]=1;if((aL|0)==0){a4=aE}else{c[aL+16>>2]=aE;a4=aM}if(aK|(aW|0)==0){a_=aH;a$=aE;a0=aE;a1=a4;a2=aN;break}aR=ut(16)|0;if((aR|0)==0){gk();aP=ut(16)|0;if((aP|0)==0){as=2981;break L3969}else{a5=aP}}else{a5=aR}aR=a5;c[a5>>2]=aJ;c[a5+4>>2]=aW;c[a5+8>>2]=aE;c[a5+12>>2]=0;aP=aJ|0;if((c[aP>>2]|0)==0){c[aP>>2]=aR}else{c[aJ+4>>2]=aR}aP=aW|0;if((c[aP>>2]|0)==0){c[aP>>2]=aR}else{c[aW+4>>2]=aR}if((c[aG>>2]|0)==0){c[aG>>2]=aR}else{c[aS>>2]=aR}if((aH|0)==0){a_=aR;a$=aE;a0=aE;a1=a4;a2=aR;break}c[aH+12>>2]=aR;a_=aR;a$=aE;a0=aE;a1=a4;a2=aN}else{a_=aH;a$=aL;a0=0;a1=aM;a2=aN}}while(0);if((aC|0)<(p|0)){V=aY;aq=a$;ar=aX;au=a_;av=a0;aw=aA;ax=aC;ay=a1;az=a2}else{break}}if((aY|0)==0){a6=a$;a7=a_;a8=0;a9=a1;ba=a2;break}if((a1|0)==0){a6=aX;a7=a_;a8=aY;a9=aY;ba=a2;break}c[a$+16>>2]=aY;a6=aX;a7=a_;a8=aY;a9=a1;ba=a2}else{a6=ao;a7=ak;a8=0;a9=ap;ba=y}}while(0);if((z|0)>=(b|0)){bb=a9;bc=ba;break L3968}ah=a8;ai=a6;ak=a7;z=z+1|0;o=aj;n=M;T=a9;y=ba}if((as|0)==2968){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=212672,v)|0);return 0}else if((as|0)==2935){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=212672,v)|0);return 0}else if((as|0)==2952){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=170896,v)|0);return 0}else if((as|0)==2975){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=212672,v)|0);return 0}else if((as|0)==2981){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=170896,v)|0);return 0}else if((as|0)==2946){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=212672,v)|0);return 0}}else{bb=al;bc=0}}while(0);al=(bb|0)==0;if(!al){ba=bb;do{if((c[ba>>2]|0)==0){as=3001}else{if((c[ba+4>>2]|0)==0){as=3001}}if((as|0)==3001){as=0;c[ba+24>>2]=2}ba=c[ba+16>>2]|0;}while((ba|0)!=0)}c[12922]=0;if((c[13372]|0)==0){ag=+h[16]- +h[15];if(ag==0.0){bd=0;i=e;return bd|0}x=+P(+ag);ba=(c[13374]<<1)+2|0;ag=+R(10.0,+(+O(+(+bQ(+x)))));af=x/ag;x=+(ba|0)/af;do{if(x>40.0){be=.05}else{if(x>20.0){be=.1;break}if(x>10.0){be=.2;break}if(x>4.0){be=.5;break}if(x>2.0){be=1.0;break}if(x>.5){be=2.0;break}be=+$(+af)}}while(0);af=ag*be;be=af*+O(+(+h[15]/af));bf=af;bg=be;bh=~~+O(+((+h[16]-be)/af))}else{bf=0.0;bg=0.0;bh=k}L4084:do{if((bh|0)>0){af=bf*.01;k=0;be=bg;L4086:while(1){ba=c[13372]|0;do{if((ba|0)==2){ag=+h[(c[11662]|0)+(k<<3)>>3];if((a[64788]&1)==0){bi=ag;break}x=+_(+ag);bi=x/+h[8100]}else if((ba|0)==0){x=bf+be;bi=+P(+x)>3];if((a[64788]&1)==0){bj=+h[a9+8>>3];bk=x}else{ag=+_(+x);x=+h[8100];bj=+_(+(+h[a9+8>>3]))/x;bk=ag/x}bi=bk+ +(k|0)*bj}else{bi=be}}while(0);h[6688]=bi;ba=c[13370]|0;x=+h[98];ag=+h[99];w=+h[70];ae=+h[71];do{if(al){c[j>>2]=0}else{M=bb;aj=0;while(1){a9=M+20|0;if(+h[(c[M+8>>2]|0)+24>>3]>=bi^+h[(c[M+12>>2]|0)+24>>3]>=bi){a[a9]=1;bl=aj+1|0}else{a[a9]=0;bl=aj}a9=c[M+16>>2]|0;if((a9|0)==0){break}else{M=a9;aj=bl}}c[j>>2]=bl;if((bl|0)<=0){break}u=ag-x;ad=ae-w;aj=0;while(1){L4110:do{if((aj&1)==0){M=bb;while(1){if((a[M+20|0]&1)!=0){if((c[M+24>>2]|0)==2){break}}a9=c[M+16>>2]|0;if((a9|0)==0){bm=1;as=3037;break L4110}else{M=a9}}bn=eu(M,bi,j,0)|0;bo=aj;as=3043}else{bm=aj;as=3037}}while(0);do{if((as|0)==3037){as=0;aC=bb;while(1){if((a[aC+20|0]&1)!=0){if((c[aC+24>>2]|0)!=2){as=3042;break}}a9=c[aC+16>>2]|0;if((a9|0)==0){as=3041;break}else{aC=a9}}if((as|0)==3041){as=0;c[j>>2]=0;M=c[m>>2]|0;aI(76408,34,1,M|0);bp=bm;break}else if((as|0)==3042){as=0;bn=eu(aC,bi,j,1)|0;bo=1;as=3043;break}}}while(0);do{if((as|0)==3043){as=0;M=(bo&1)!=0;if((bn|0)==0){bp=bo;break}a9=c[9348]|0;L4130:do{if((a9|0)==1){do{if(M){bq=1}else{a7=bn;while(1){a6=c[a7+16>>2]|0;if((a6|0)==0){break}else{a7=a6}}t=+P(+(+h[99]- +h[98]));if(+P(+(+h[a7>>3]- +h[bn>>3]))>=t*1.0e-5){bq=0;break}t=+P(+(+h[71]- +h[70]));bq=+P(+(+h[a7+8>>3]- +h[bn+8>>3]))>2]|0;if((b|0)==0){bs=bn;break}else{a6=b;a8=br}}while(1){bt=bs+16|0;a6=c[bt>>2]|0;if((a6|0)==0){break}else{bs=a6}}do{if(bq){t=+P(+(+h[99]- +h[98]));if(+P(+(+h[bs>>3]- +h[bn>>3]))>3]- +h[bn+8>>3]))>2]=bn;bu=a8+2|0}else{bu=br}}while(0);a8=bu<<3;a6=ut(a8)|0;if((a6|0)==0){gk();b=ut(a8)|0;if((b|0)==0){as=3081;break L4086}else{bv=b}}else{bv=a6}a6=bv;b=ut(a8)|0;if((b|0)==0){gk();ap=ut(a8)|0;if((ap|0)==0){as=3084;break L4086}else{bw=ap}}else{bw=b}b=bw;ap=ut(a8)|0;if((ap|0)==0){gk();ao=ut(a8)|0;if((ao|0)==0){as=3087;break L4086}else{bx=ao}}else{bx=ap}ap=bx;t=+h[11];L4158:do{if((bu|0)>2){ac=ad>t?ad:t;s=u>t?u:t;ao=bu*24&-1;a8=ut(ao)|0;if((a8|0)==0){gk();a2=ut(ao)|0;if((a2|0)==0){as=3091;break L4086}else{by=a2}}else{by=a8}a8=by;a2=bu-1|0;if((a2|0)>0){ao=0;a1=bn;while(1){aY=a1+16|0;a_=b+(ao<<3)|0;h[a_>>3]=+h[c[aY>>2]>>3]- +h[a1>>3];ab=+h[(c[aY>>2]|0)+8>>3]- +h[a1+8>>3];aX=ap+(ao<<3)|0;h[aX>>3]=ab;r=+h[a_>>3]/s;L=ab/ac;ab=+Q(+(r*r+L*L));a$=a6+(ao<<3)|0;h[a$>>3]=ab;h[a_>>3]=+h[a_>>3]/ab;h[aX>>3]=+h[aX>>3]/+h[a$>>3];a$=ao+1|0;if((a$|0)<(a2|0)){ao=a$;a1=c[aY>>2]|0}else{break}}}if(bq){h[a6+(a2<<3)>>3]=+h[a6>>3];h[b+(a2<<3)>>3]=+h[b>>3];h[ap+(a2<<3)>>3]=+h[ap>>3];bz=a2}else{bz=bu-2|0}a1=(bz|0)>0;if(a1){ao=0;while(1){a7=a6+(ao<<3)|0;h[a8+(ao*24&-1)>>3]=+h[a7>>3];aY=ao+1|0;a$=a6+(aY<<3)|0;h[a8+(ao*24&-1)+8>>3]=(+h[a7>>3]+ +h[a$>>3])*2.0;h[a8+(ao*24&-1)+16>>3]=+h[a$>>3];a$=b+(ao<<3)|0;h[a$>>3]=(+h[b+(aY<<3)>>3]- +h[a$>>3])*6.0;a7=ap+(ao<<3)|0;ab=(+h[ap+(aY<<3)>>3]- +h[a7>>3])*6.0;h[a7>>3]=ab;L=+h[a$>>3];r=L/s;K=ab/ac;ab=+Q(+(r*r+K*K))/8.5;if(ab>1.0){h[a$>>3]=L/ab;h[a7>>3]=+h[a7>>3]/ab}if((aY|0)<(bz|0)){ao=aY}else{break}}}if(!bq){ao=by;aY=by+8|0;h[aY>>3]=+h[ao>>3]+ +h[aY>>3];h[ao>>3]=0.0;ao=bz-1|0;aY=a8+(ao*24&-1)+16|0;a7=a8+(ao*24&-1)+8|0;h[a7>>3]=+h[aY>>3]+ +h[a7>>3];h[aY>>3]=0.0}L4180:do{if((bz|0)>=1){ac=+h[by+8>>3];if(ac<=0.0){break}s=+h[by>>3];aY=a8+((bz-1|0)*24&-1)+8|0;ab=+h[aY>>3];a7=bz-2|0;if((a7|0)>0){ao=0;L=s;K=ab;r=ac;while(1){a$=a8+(ao*24&-1)+16|0;J=+h[a$>>3];I=J/r;h[a$>>3]=I;H=L/r;h[a8+(ao*24&-1)>>3]=H;a$=ao+1|0;aX=a8+(a$*24&-1)+8|0;G=+h[aX>>3]-J*I;if(G<=0.0){break L4180}J=L*(-0.0-I);I=K-L*H;h[aX>>3]=G;if((a$|0)<(a7|0)){ao=a$;L=J;K=I;r=G}else{bA=J;bB=I;bC=G;break}}}else{bA=s;bB=ab;bC=ac}if((bz|0)>1){r=bA+ +h[a8+(a7*24&-1)+16>>3];K=r/bC;h[a8+(a7*24&-1)>>3]=K;L=bB-K*r;h[aY>>3]=L;if(L<=0.0){break}}et(a8,b,bz);et(a8,ap,bz);if(a1){ao=bz;while(1){a$=ao-1|0;h[b+(ao<<3)>>3]=+h[b+(a$<<3)>>3];h[ap+(ao<<3)>>3]=+h[ap+(a$<<3)>>3];if((a$|0)>0){ao=a$}else{break}}}if(bq){h[b>>3]=+h[b+(bz<<3)>>3];h[ap>>3]=+h[ap+(bz<<3)>>3]}else{h[b>>3]=+h[bw+8>>3];h[ap>>3]=+h[bx+8>>3];ao=bz+1|0;h[b+(ao<<3)>>3]=+h[b+(bz<<3)>>3];h[ap+(ao<<3)>>3]=+h[ap+(bz<<3)>>3]}uu(by);bD=a2;break L4158}}while(0);uu(by);uu(bv);uu(bw);uu(bx);if(!bq){bE=bn;break L4130}c[bt>>2]=0;bE=bn;break L4130}else{if((bu|0)>1){h[b>>3]=0.0;h[ap>>3]=0.0;h[bw+8>>3]=0.0;h[bx+8>>3]=0.0;h[a6>>3]=1.0;bD=bu-1|0;break}uu(bv);uu(bw);uu(bx);if(!bq){bE=bn;break L4130}c[bt>>2]=0;bE=bn;break L4130}}while(0);a2=aa(c[13366]|0,bD);a1=(bD|0)>0;if(a1){t=0.0;a8=0;do{t=t+ +h[a6+(a8<<3)>>3];a8=a8+1|0;}while((a8|0)<(bD|0));bF=t*.9999999}else{bF=0.0}ac=bF/+(a2|0);ab=+h[bn>>3];s=+h[bn+8>>3];a8=c[12922]|0;if((a8|0)>98){ao=ut(56)|0;if((ao|0)==0){gk();aY=ut(56)|0;if((aY|0)==0){as=3127;break L4086}else{bG=aY}}else{bG=ao}ao=bG;aY=c[12922]<<6;a7=ut(aY)|0;if((a7|0)==0){gk();a$=ut(aY)|0;if((a$|0)==0){as=3130;break L4086}else{bH=a$}}else{bH=a7}a7=bH;a$=bG+4|0;c[a$>>2]=a7;aY=c[12922]|0;L4220:do{if((aY|0)>0){aX=0;a_=a7;while(1){aA=aX<<1;h[a_+(aX<<6)+8>>3]=+h[51696+(aA<<3)>>3];h[(c[a$>>2]|0)+(aX<<6)+16>>3]=+h[51696+((aA|1)<<3)>>3];h[(c[a$>>2]|0)+(aX<<6)+24>>3]=+h[6688];aA=aX+1|0;if((aA|0)>=(aY|0)){break L4220}aX=aA;a_=c[a$>>2]|0}}}while(0);c[bG+44>>2]=aY;c[bG>>2]=c[13370];c[13370]=ao;a[bG+8|0]=0;a$=a8<<1;h[6462]=+h[51696+(a$-2<<3)>>3];h[6463]=+h[51696+(a$-1<<3)>>3];c[12922]=1;bI=1}else{bI=a8}a$=bI<<1;h[51696+(a$<<3)>>3]=ab;h[51696+((a$|1)<<3)>>3]=s;a$=bI+1|0;c[12922]=a$;L4226:do{if(a1){t=s;L=ab;r=ac+0.0;a7=bn;a2=0;a_=a$;while(1){aX=c[a7+16>>2]|0;aA=a6+(a2<<3)|0;K=+h[aA>>3];G=+h[aX>>3];I=+h[aX+8>>3];J=(G-L)/K;H=(I-t)/K;a0=a2+1|0;Y=+h[b+(a0<<3)>>3];X=+h[b+(a2<<3)>>3];W=(Y+X*2.0)/6.0;U=+h[ap+(a0<<3)>>3];S=+h[ap+(a2<<3)>>3];F=(U+S*2.0)/6.0;E=K*6.0;D=(Y-X)/E;X=(U-S)/E;if(r>K){bJ=r;bK=K;bL=a_}else{E=r;p=a_;while(1){S=E-K;U=L+E*(J+S*(W+D*E));Y=t+E*(H+S*(F+X*E));if((p|0)>98){aN=ut(56)|0;if((aN|0)==0){gk();aM=ut(56)|0;if((aM|0)==0){as=3141;break L4086}else{bM=aM}}else{bM=aN}aN=bM;aM=c[12922]<<6;aL=ut(aM)|0;if((aL|0)==0){gk();aH=ut(aM)|0;if((aH|0)==0){as=3144;break L4086}else{bN=aH}}else{bN=aL}aL=bN;aH=bM+4|0;c[aH>>2]=aL;aM=c[12922]|0;L4241:do{if((aM|0)>0){a4=0;aW=aL;while(1){aJ=a4<<1;h[aW+(a4<<6)+8>>3]=+h[51696+(aJ<<3)>>3];h[(c[aH>>2]|0)+(a4<<6)+16>>3]=+h[51696+((aJ|1)<<3)>>3];h[(c[aH>>2]|0)+(a4<<6)+24>>3]=+h[6688];aJ=a4+1|0;if((aJ|0)>=(aM|0)){break L4241}a4=aJ;aW=c[aH>>2]|0}}}while(0);c[bM+44>>2]=aM;c[bM>>2]=c[13370];c[13370]=aN;a[bM+8|0]=0;aH=p<<1;h[6462]=+h[51696+(aH-2<<3)>>3];h[6463]=+h[51696+(aH-1<<3)>>3];c[12922]=1;bO=1}else{bO=p}aH=bO<<1;h[51696+(aH<<3)>>3]=U;h[51696+((aH|1)<<3)>>3]=Y;aH=bO+1|0;c[12922]=aH;S=ac+E;C=+h[aA>>3];if(S>C){bJ=S;bK=C;bL=aH;break}else{E=S;p=aH}}}if((a0|0)>=(bD|0)){break L4226}t=I;L=G;r=bJ-bK;a7=aX;a2=a0;a_=bL}}}while(0);uu(bv);uu(bw);uu(bx);if(bq){c[bt>>2]=0}ap=ut(56)|0;if((ap|0)==0){gk();b=ut(56)|0;if((b|0)==0){as=3156;break L4086}else{bP=b}}else{bP=ap}ap=bP;b=c[12922]<<6;a6=ut(b)|0;if((a6|0)==0){gk();a$=ut(b)|0;if((a$|0)==0){as=3159;break L4086}else{bR=a$}}else{bR=a6}a6=bR;a$=bP+4|0;c[a$>>2]=a6;b=c[12922]|0;L4259:do{if((b|0)>0){a1=0;a8=a6;while(1){ao=a1<<1;h[a8+(a1<<6)+8>>3]=+h[51696+(ao<<3)>>3];h[(c[a$>>2]|0)+(a1<<6)+16>>3]=+h[51696+((ao|1)<<3)>>3];h[(c[a$>>2]|0)+(a1<<6)+24>>3]=+h[6688];ao=a1+1|0;if((ao|0)>=(b|0)){break L4259}a1=ao;a8=c[a$>>2]|0}}}while(0);c[bP+44>>2]=b;c[bP>>2]=c[13370];c[13370]=ap;a[bP+8|0]=0;c[12922]=0;bE=bn}else if((a9|0)==0){a$=bn;a6=c[12922]|0;do{ac=+h[a$>>3];ab=+h[a$+8>>3];if((a6|0)>98){a8=ut(56)|0;if((a8|0)==0){gk();a1=ut(56)|0;if((a1|0)==0){as=3049;break L4086}else{bS=a1}}else{bS=a8}a8=bS;a1=c[12922]<<6;ao=ut(a1)|0;if((ao|0)==0){gk();aY=ut(a1)|0;if((aY|0)==0){as=3052;break L4086}else{bT=aY}}else{bT=ao}ao=bT;aY=bS+4|0;c[aY>>2]=ao;a1=c[12922]|0;L4275:do{if((a1|0)>0){a_=0;a2=ao;while(1){a7=a_<<1;h[a2+(a_<<6)+8>>3]=+h[51696+(a7<<3)>>3];h[(c[aY>>2]|0)+(a_<<6)+16>>3]=+h[51696+((a7|1)<<3)>>3];h[(c[aY>>2]|0)+(a_<<6)+24>>3]=+h[6688];a7=a_+1|0;if((a7|0)>=(a1|0)){break L4275}a_=a7;a2=c[aY>>2]|0}}}while(0);c[bS+44>>2]=a1;c[bS>>2]=c[13370];c[13370]=a8;a[bS+8|0]=0;aY=a6<<1;h[6462]=+h[51696+(aY-2<<3)>>3];h[6463]=+h[51696+(aY-1<<3)>>3];c[12922]=1;bU=1}else{bU=a6}aY=bU<<1;h[51696+(aY<<3)>>3]=ac;h[51696+((aY|1)<<3)>>3]=ab;a6=bU+1|0;c[12922]=a6;a$=c[a$+16>>2]|0;}while((a$|0)!=0);a$=ut(56)|0;if((a$|0)==0){gk();a6=ut(56)|0;if((a6|0)==0){as=3060;break L4086}else{bV=a6}}else{bV=a$}a$=bV;a6=c[12922]<<6;ap=ut(a6)|0;if((ap|0)==0){gk();b=ut(a6)|0;if((b|0)==0){as=3063;break L4086}else{bW=b}}else{bW=ap}ap=bW;b=bV+4|0;c[b>>2]=ap;a6=c[12922]|0;L4288:do{if((a6|0)>0){aY=0;ao=ap;while(1){a2=aY<<1;h[ao+(aY<<6)+8>>3]=+h[51696+(a2<<3)>>3];h[(c[b>>2]|0)+(aY<<6)+16>>3]=+h[51696+((a2|1)<<3)>>3];h[(c[b>>2]|0)+(aY<<6)+24>>3]=+h[6688];a2=aY+1|0;if((a2|0)>=(a6|0)){break L4288}aY=a2;ao=c[b>>2]|0}}}while(0);c[bV+44>>2]=a6;c[bV>>2]=c[13370];c[13370]=a$;a[bV+8|0]=0;c[12922]=0;bE=bn}else if((a9|0)==2){do{if(M){bX=1}else{b=bn;while(1){ap=c[b+16>>2]|0;if((ap|0)==0){break}else{b=ap}}ab=+P(+(+h[99]- +h[98]));if(+P(+(+h[b>>3]- +h[bn>>3]))>=ab*1.0e-5){bX=0;break}ab=+P(+(+h[71]- +h[70]));bX=+P(+(+h[b+8>>3]- +h[bn+8>>3]))>2]|0;if((ao|0)==0){break}else{a6=ao;ap=bY}}a6=a$-1|0;if((bY|0)<2){bE=bn;break}ao=(a6|0)>(ap|0)?ap:a6;do{if(bX){a6=bn;while(1){bZ=a6+16|0;aY=c[bZ>>2]|0;if((aY|0)==0){break}else{a6=aY}}ab=+P(+(+h[99]- +h[98]));do{if(+P(+(+h[a6>>3]- +h[bn>>3]))>3]- +h[bn+8>>3]))>=ac*1.0e-5){b_=bY;b$=bn;break}b_=ap;b$=c[bn+16>>2]|0}else{b_=bY;b$=bn}}while(0);c[bZ>>2]=b$;b=b_+ao|0;b0=a6;b1=b;b2=+(ao|0);b3=b;as=3179}else{if((bY|0)<=(ao|0)){b4=bn;b5=ao;b6=bY;b7=0;b8=0.0;break}b0=0;b1=bY;b2=0.0;b3=bY-ao|0;as=3179}}while(0);L4314:do{if((as|0)==3179){as=0;ab=+(b3|0);ac=1.0/+(c[13366]|0);if(b2>=ab){b4=bn;b5=ao;b6=b1;b7=b0;b8=ab;break}ap=b1-ao|0;a$=2;G=b2;I=b2+1.0;b=ao;aY=bn;while(1){if(G>I){b9=c[aY+16>>2]|0;ca=b+1|0;cb=I+1.0}else{b9=aY;ca=b;cb=I}ev(G,b9,b1,ao,ca,bX,f,g);s=+h[f>>3];r=+h[g>>3];a8=c[12922]|0;if((a8|0)>98){a1=ut(56)|0;if((a1|0)==0){gk();a2=ut(56)|0;if((a2|0)==0){as=3186;break L4086}else{cc=a2}}else{cc=a1}a1=cc;a2=c[12922]<<6;a_=ut(a2)|0;if((a_|0)==0){gk();a0=ut(a2)|0;if((a0|0)==0){as=3189;break L4086}else{cd=a0}}else{cd=a_}a_=cd;a0=cc+4|0;c[a0>>2]=a_;a2=c[12922]|0;L4330:do{if((a2|0)>0){aX=0;a7=a_;while(1){p=aX<<1;h[a7+(aX<<6)+8>>3]=+h[51696+(p<<3)>>3];h[(c[a0>>2]|0)+(aX<<6)+16>>3]=+h[51696+((p|1)<<3)>>3];h[(c[a0>>2]|0)+(aX<<6)+24>>3]=+h[6688];p=aX+1|0;if((p|0)>=(a2|0)){break L4330}aX=p;a7=c[a0>>2]|0}}}while(0);c[cc+44>>2]=a2;c[cc>>2]=c[13370];c[13370]=a1;a[cc+8|0]=0;a0=a8<<1;h[6462]=+h[51696+(a0-2<<3)>>3];h[6463]=+h[51696+(a0-1<<3)>>3];c[12922]=1;ce=1}else{ce=a8}a0=ce<<1;h[51696+(a0<<3)>>3]=s;h[51696+((a0|1)<<3)>>3]=r;c[12922]=ce+1;if((a$|0)==(aa(c[13366]|0,ap)+1|0)){b4=b9;b5=ca;b6=b1;b7=b0;b8=ab;break L4314}Y=ac+G;if(Y>3];I=+h[g>>3];aY=c[12922]|0;if((aY|0)>98){b=ut(56)|0;if((b|0)==0){gk();a$=ut(56)|0;if((a$|0)==0){as=3199;break L4086}else{cf=a$}}else{cf=b}b=cf;a$=c[12922]<<6;ap=ut(a$)|0;if((ap|0)==0){gk();a6=ut(a$)|0;if((a6|0)==0){as=3202;break L4086}else{cg=a6}}else{cg=ap}ap=cg;a6=cf+4|0;c[a6>>2]=ap;a$=c[12922]|0;L4346:do{if((a$|0)>0){a0=0;a_=ap;while(1){a7=a0<<1;h[a_+(a0<<6)+8>>3]=+h[51696+(a7<<3)>>3];h[(c[a6>>2]|0)+(a0<<6)+16>>3]=+h[51696+((a7|1)<<3)>>3];h[(c[a6>>2]|0)+(a0<<6)+24>>3]=+h[6688];a7=a0+1|0;if((a7|0)>=(a$|0)){break L4346}a0=a7;a_=c[a6>>2]|0}}}while(0);c[cf+44>>2]=a$;c[cf>>2]=c[13370];c[13370]=b;a[cf+8|0]=0;a6=aY<<1;h[6462]=+h[51696+(a6-2<<3)>>3];h[6463]=+h[51696+(a6-1<<3)>>3];c[12922]=1;ch=1}else{ch=aY}a6=ch<<1;h[51696+(a6<<3)>>3]=ab;h[51696+((a6|1)<<3)>>3]=I;c[12922]=ch+1;if(bX){c[b7+16>>2]=0}a6=ut(56)|0;if((a6|0)==0){gk();ap=ut(56)|0;if((ap|0)==0){as=3211;break L4086}else{ci=ap}}else{ci=a6}a6=ci;ap=c[12922]<<6;ao=ut(ap)|0;if((ao|0)==0){gk();a_=ut(ap)|0;if((a_|0)==0){as=3214;break L4086}else{cj=a_}}else{cj=ao}ao=cj;a_=ci+4|0;c[a_>>2]=ao;ap=c[12922]|0;L4361:do{if((ap|0)>0){a0=0;a7=ao;while(1){aX=a0<<1;h[a7+(a0<<6)+8>>3]=+h[51696+(aX<<3)>>3];h[(c[a_>>2]|0)+(a0<<6)+16>>3]=+h[51696+((aX|1)<<3)>>3];h[(c[a_>>2]|0)+(a0<<6)+24>>3]=+h[6688];aX=a0+1|0;if((aX|0)>=(ap|0)){break L4361}a0=aX;a7=c[a_>>2]|0}}}while(0);c[ci+44>>2]=ap;c[ci>>2]=c[13370];c[13370]=a6;a[ci+8|0]=0;c[12922]=0;bE=bn}else{bE=bn}}while(0);while(1){M=c[bE+16>>2]|0;uu(bE);if((M|0)==0){bp=bo;break}else{bE=M}}}}while(0);if((c[j>>2]|0)>0){aj=bp}else{break}}}}while(0);aj=c[13370]|0;if((aj|0)!=(ba|0)){a[aj+8|0]=1;aj=(c[13370]|0)+9|0;if((a[64788]&1)==0){ck=bi}else{ck=+Z(+(bi*+h[8100]))}ud(aj,32,53520,1.0,ck);h[(c[13370]|0)+48>>3]=bi}aj=k+1|0;if((aj|0)<(bh|0)){k=aj;be=bi}else{break L4084}}if((as|0)==3052){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=135136,v)|0);return 0}else if((as|0)==3081){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=105064,v)|0);return 0}else if((as|0)==3084){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=98096,v)|0);return 0}else if((as|0)==3049){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=155520,v)|0);return 0}else if((as|0)==3087){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=92152,v)|0);return 0}else if((as|0)==3091){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=84352,v)|0);return 0}else if((as|0)==3127){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=155520,v)|0);return 0}else if((as|0)==3063){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=135136,v)|0);return 0}else if((as|0)==3060){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=155520,v)|0);return 0}else if((as|0)==3130){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=135136,v)|0);return 0}else if((as|0)==3141){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=155520,v)|0);return 0}else if((as|0)==3144){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=135136,v)|0);return 0}else if((as|0)==3156){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=155520,v)|0);return 0}else if((as|0)==3159){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=135136,v)|0);return 0}else if((as|0)==3186){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=155520,v)|0);return 0}else if((as|0)==3189){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=135136,v)|0);return 0}else if((as|0)==3199){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=155520,v)|0);return 0}else if((as|0)==3202){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=135136,v)|0);return 0}else if((as|0)==3211){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=155520,v)|0);return 0}else if((as|0)==3214){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=135136,v)|0);return 0}}}while(0);if((bc|0)!=0){as=bc;while(1){bc=c[as+12>>2]|0;uu(as);if((bc|0)==0){break}else{as=bc}}}if(!al){al=bb;while(1){bb=c[al+16>>2]|0;uu(al);if((bb|0)==0){break}else{al=bb}}}bd=c[13370]|0;i=e;return bd|0}function eq(){a[47544]=0;a[47856]=1;return}function er(){a[47544]=1;a[47856]=1;return}function es(){return}function et(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0.0,f=0,g=0,i=0.0,j=0.0,k=0,l=0,m=0.0,n=0.0,o=0.0;d=b+(c-1<<3)|0;e=+h[d>>3];f=c-2|0;if((f|0)>0){g=0;i=e;j=+h[b>>3];while(1){k=g+1|0;l=b+(k<<3)|0;m=+h[l>>3]- +h[a+(g*24&-1)+16>>3]*j;h[l>>3]=m;n=i- +h[a+(g*24&-1)>>3]*j;if((k|0)<(f|0)){g=k;i=n;j=m}else{o=n;break}}}else{o=e}g=(c|0)>1;if(g){h[d>>3]=o- +h[a+(f*24&-1)>>3]*+h[b+(f<<3)>>3]}if((c|0)>0){k=0;do{l=b+(k<<3)|0;h[l>>3]=+h[l>>3]/+h[a+(k*24&-1)+8>>3];k=k+1|0;}while((k|0)<(c|0))}o=+h[d>>3];if(g){g=b+(f<<3)|0;h[g>>3]=+h[g>>3]-o*+h[a+(f*24&-1)>>3]}g=c-3|0;if((g|0)<=-1){return}c=g;e=+h[b+(f<<3)>>3];while(1){f=b+(c<<3)|0;j=+h[f>>3]-(+h[a+(c*24&-1)+16>>3]*e+o*+h[a+(c*24&-1)>>3]);h[f>>3]=j;if((c|0)>0){c=c-1|0;e=j}else{break}}return}function eu(b,d,e,f){b=b|0;d=+d;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0;if(!f){a[b+20|0]=0;c[e>>2]=(c[e>>2]|0)-1}do{if((c[b>>2]|0)==0){if((c[b+4>>2]|0)==0){g=0}else{break}return g|0}}while(0);f=ew(b,d)|0;i=0;j=b;k=f;while(1){l=c[j>>2]|0;if((l|0)==(i|0)){n=c[j+4>>2]|0}else{n=l}l=c[n>>2]|0;if((l|0)==(j|0)){o=0}else{o=(a[l+20|0]&1)==0?0:l}l=c[n+4>>2]|0;if((l|0)==(j|0)){p=o}else{p=(a[l+20|0]&1)==0?o:l}l=c[n+8>>2]|0;if((l|0)==(j|0)){q=p}else{q=(a[l+20|0]&1)==0?p:l}if((q|0)==0){r=3261;break}a[q+20|0]=0;c[e>>2]=(c[e>>2]|0)-1;l=q+24|0;do{if((c[l>>2]|0)==3){s=k}else{t=ew(q,d)|0;c[k+16>>2]=t;u=+P(+(+h[99]- +h[98]));if(+P(+(+h[k>>3]- +h[t>>3]))>=u*1.0e-5){s=t;break}u=+P(+(+h[71]- +h[70]));if(+P(+(+h[k+8>>3]- +h[t+8>>3]))>=u*1.0e-5){s=t;break}uu(t);s=k}}while(0);if((q|0)==(b|0)){r=3271;break}if((c[l>>2]|0)==2){r=3270;break}else{i=n;j=q;k=s}}if((r|0)==3270){c[s+16>>2]=0;g=f;return g|0}else if((r|0)==3261){c[k+16>>2]=0;if((f|0)!=0){k=f;while(1){q=c[k+16>>2]|0;uu(k);if((q|0)==0){break}else{k=q}}}aI(223848,41,1,c[m>>2]|0);g=0;return g|0}else if((r|0)==3271){c[s+16>>2]=0;h[f>>3]=+h[s>>3];h[f+8>>3]=+h[s+8>>3];g=f;return g|0}return 0}function ev(a,b,d,e,f,g,j,k){a=+a;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0,w=0.0,x=0,y=0,z=0.0,A=0,B=0,C=0.0,D=0.0,E=0.0,F=0,G=0,H=0.0,I=0.0,J=0,K=0.0;l=i;m=f+e<<3;n=ut(m)|0;do{if((n|0)==0){gk();o=ut(m)|0;if((o|0)!=0){p=o;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=122288,v)|0)}else{p=n}}while(0);n=p;o=ut(m)|0;do{if((o|0)==0){gk();q=ut(m)|0;if((q|0)!=0){r=q;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=122288,v)|0)}else{r=o}}while(0);o=r;m=f-e|0;if((e|0)<0){s=n+(f<<3)|0;t=+h[s>>3];h[j>>3]=t;u=o+(f<<3)|0;w=+h[u>>3];h[k>>3]=w;uu(p);uu(r);i=l;return}else{x=m;y=b}while(1){h[n+(x<<3)>>3]=+h[y>>3];h[o+(x<<3)>>3]=+h[y+8>>3];b=x+1|0;if((b|0)>(f|0)){break}else{x=b;y=c[y+16>>2]|0}}if((e|0)<1){s=n+(f<<3)|0;t=+h[s>>3];h[j>>3]=t;u=o+(f<<3)|0;w=+h[u>>3];h[k>>3]=w;uu(p);uu(r);i=l;return}y=e+1|0;z=+(d-e|0);x=1;b=-1;while(1){q=x+m|0;if((q|0)<=(f|0)){A=y+b|0;B=f;while(1){do{if(g){C=+(A+B|0);D=+(B|0)}else{do{if((B|0)>(e|0)){if((B|0)>(d|0)){E=z;break}E=+(B-e|0)}else{E=0.0}}while(0);F=A+B|0;if((F|0)<=(e|0)){C=0.0;D=E;break}if((F|0)>(d|0)){C=z;D=E;break}C=+(F-e|0);D=E}}while(0);if(D==C){G=B-1|0}else{F=n+(B<<3)|0;H=a-D;I=C-D;J=B-1|0;K=C-a;h[F>>3]=H*+h[F>>3]/I+K*+h[n+(J<<3)>>3]/I;F=o+(B<<3)|0;h[F>>3]=H*+h[F>>3]/I+K*+h[o+(J<<3)>>3]/I;G=J}if((G|0)<(q|0)){break}else{B=G}}}B=x+1|0;q=x^-1;if((B|0)>(e|0)){break}else{x=B;b=q}}s=n+(f<<3)|0;t=+h[s>>3];h[j>>3]=t;u=o+(f<<3)|0;w=+h[u>>3];h[k>>3]=w;uu(p);uu(r);i=l;return}function ew(a,b){a=a|0;b=+b;var d=0,e=0,f=0.0,g=0,j=0.0,k=0,l=0;d=i;e=a+8|0;f=+h[(c[e>>2]|0)+24>>3];g=a+12|0;j=(b-f)/(+h[(c[g>>2]|0)+24>>3]-f);f=j<0.0?0.0:j;j=f>1.0?1.0:f;a=ut(24)|0;do{if((a|0)==0){gk();k=ut(24)|0;if((k|0)!=0){l=k;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=216768,v)|0);return 0}else{l=a}}while(0);f=1.0-j;h[l>>3]=j*+h[(c[g>>2]|0)+8>>3]+f*+h[(c[e>>2]|0)+8>>3];h[l+8>>3]=j*+h[(c[g>>2]|0)+16>>3]+f*+h[(c[e>>2]|0)+16>>3];i=d;return l|0}function ex(){var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0;d=i;i=i+16|0;e=d|0;f=d+8|0;g=hA(c[11932]|0,78360)|0;if((g|0)==0){uj(-1,146640,(v=i,i=i+8|0,c[v>>2]=c[11932],v)|0)}h=e;if((cd(h|0,4,1,g|0)|0)==0){uj(-1,146480,(v=i,i=i+8|0,c[v>>2]=c[11932],v)|0)}j=c[e>>2]|0;k=j>>>0>65535?3:0;l=(k-2|0)>>>0<2;L4523:do{if(l){m=0;n=3;o=j&255;while(1){p=h+n|0;a[h+m|0]=a[p]|0;a[p]=o;p=m+1|0;q=n-1|0;if((p|0)>=(q|0)){break L4523}m=p;n=q;o=a[h+p|0]|0}}}while(0);j=(k-1|0)>>>0<2;if(j){k=h+2|0;o=a[k]|0;n=h+3|0;a[k]=a[n]|0;a[n]=o;o=a[h]|0;n=h+1|0;a[h]=a[n]|0;a[n]=o}o=f;if((cd(o|0,4,1,g|0)|0)==0){uj(-1,146280,(v=i,i=i+8|0,c[v>>2]=c[11932],v)|0)}if(l){l=0;n=3;do{h=o+l|0;k=a[h]|0;m=o+n|0;a[h]=a[m]|0;a[m]=k;l=l+1|0;n=n-1|0;}while((l|0)<(n|0))}if(j){j=o+2|0;n=a[j]|0;l=o+3|0;a[j]=a[l]|0;a[l]=n;n=a[o]|0;l=o+1|0;a[o]=a[l]|0;a[l]=n}az(g|0);a[47544]=0;a[47856]=1;c[(c[12172]|0)+128>>2]=8;c[(c[12172]|0)+140>>2]=c[e>>2];c[(c[12172]|0)+144>>2]=c[f>>2];c[(c[12172]|0)+152>>2]=1;c[(c[12172]|0)+156>>2]=-1;a[(c[12172]|0)+124|0]=1;c[(c[12172]|0)+112>>2]=-3;c[(c[12172]|0)+116>>2]=-4;eQ(4);f=c[11950]|0;if((c[11884]|0)<1){e=db(f,12,215112)|0;c[11950]=e;c[11884]=1;r=e}else{r=f}c[r+4>>2]=1;b[(c[11950]|0)+8>>1]=b[24026]|0;r=c[11950]|0;if((c[11884]|0)<2){f=db(r,24,215112)|0;c[11950]=f;c[11884]=2;s=f}else{s=r}c[s+16>>2]=1;b[(c[11950]|0)+20>>1]=b[24026]|0;s=c[11950]|0;if((c[11884]|0)<3){r=db(s,36,215112)|0;c[11950]=r;c[11884]=3;t=r}else{t=s}c[t+28>>2]=1;b[(c[11950]|0)+32>>1]=b[24026]|0;t=c[11950]|0;if((c[11884]|0)<4){s=db(t,48,215112)|0;c[11950]=s;c[11884]=4;u=s}else{u=t}c[u+40>>2]=1;b[(c[11950]|0)+44>>1]=b[24026]|0;u=c[11950]|0;if((c[11884]|0)>=1){w=u;x=w|0;c[x>>2]=0;c[11870]=4;c[262]=2;c[265]=3;c[268]=4;c[271]=1;i=d;return}t=db(u,12,215112)|0;c[11950]=t;c[11884]=1;w=t;x=w|0;c[x>>2]=0;c[11870]=4;c[262]=2;c[265]=3;c[268]=4;c[271]=1;i=d;return}function ey(e,f,j){e=e|0;f=f|0;j=j|0;var k=0,l=0,p=0,q=0,r=0,s=0,t=0,u=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0,aA=0,aB=0,aC=0,aD=0,aF=0,aG=0,aH=0,aI=0,aJ=0,aK=0,aL=0,aN=0,aO=0,aP=0,aQ=0,aS=0,aT=0,aU=0,aV=0,aW=0,aX=0,aY=0,a_=0,a$=0,a0=0,a1=0.0,a2=0,a3=0,a4=0,a5=0,a6=0,a7=0,a9=0.0,ba=0,bb=0.0,bd=0,be=0,bf=0,bg=0,bh=0.0,bi=0,bj=0,bk=0,bl=0.0,bm=0,bn=0,bo=0,bp=0.0,bq=0,br=0,bs=0,bu=0.0,bv=0,bw=0,bx=0,by=0.0,bz=0,bA=0.0,bB=0,bC=0,bD=0,bE=0,bF=0,bG=0,bH=0,bI=0,bJ=0,bK=0,bM=0,bN=0,bO=0,bQ=0,bR=0,bS=0,bT=0,bU=0,bV=0,bW=0,bX=0,bY=0,bZ=0,b_=0,b$=0,b0=0,b1=0,b2=0,b3=0,b4=0,b5=0,b6=0,b7=0,b8=0,b9=0,ca=0,cb=0,cc=0,cd=0,ce=0,cf=0,cg=0,ch=0,ci=0,cj=0,ck=0,cl=0,cm=0,cn=0,co=0.0,cq=0,cr=0,cs=0,ct=0,cv=0,cw=0,cx=0,cy=0,cz=0,cA=0,cB=0,cC=0,cD=0,cE=0.0,cF=0,cG=0,cH=0,cI=0,cJ=0,cK=0,cL=0,cM=0,cN=0,cO=0,cP=0,cQ=0,cR=0,cS=0,cT=0,cU=0,cV=0,cW=0,cX=0,cY=0,cZ=0,c_=0,c$=0,c0=0,c1=0,c2=0,c3=0,c4=0,c5=0,c6=0,c7=0,c8=0,c9=0,da=0,dc=0,dd=0,de=0,df=0,dg=0,dh=0,di=0;k=i;i=i+504|0;l=k|0;p=k+24|0;q=k+48|0;r=k+72|0;s=k+96|0;t=k+120|0;u=k+144|0;x=k+168|0;y=k+192|0;z=k+216|0;A=k+240|0;B=k+264|0;C=k+288|0;D=k+312|0;E=k+336|0;F=k+424|0;G=k+432|0;H=(c[13898]|0)-1|0;a[43464]=1;if((c[12892]|0)!=0){ez();c[12892]=0}uu(c[11930]|0);c[11930]=0;c[11872]=0;uu(c[11902]|0);c[11902]=0;eA();c[11942]=-1;c[11900]=0;c[11898]=0;c[11904]=1;c[11762]=2147483647;uu(c[9356]|0);c[9356]=0;c[11946]=0;c[14126]=2;c[10874]=1;c[10872]=1;c[10808]=0;c[10806]=0;c[8834]=2147483647;c[8832]=2147483647;a[47544]=0;a[47856]=0;c[11858]=0;c[11864]=0;a[47584]=0;a[47464]=0;a[47736]=0;c[11944]=j;c[13488]=-99;a[32928]=0;a[48872]=0;if((f|0)>=8){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=95312,v)|0);return 0}if((e|0)==0){uf(c[13898]|0,205112,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}I=c[11932]|0;do{if((a[e]|0)==0){if((I|0)==0){J=c[13898]|0;uf(J,94168,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}if((a[I]|0)!=0){break}J=c[13898]|0;uf(J,94168,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else{uu(I);c[11932]=bP(e|0)|0}}while(0);e=c[60]|0;if((e|0)!=0){e1(e)}c[60]=0;e=c[13898]|0;I=c[8272]|0;L4579:do{if((e|0)<(I|0)){J=j+23|0;K=r|0;L=r+8|0;M=p|0;N=p+8|0;O=l|0;P=l+8|0;Q=q|0;R=q+8|0;S=z|0;T=z+8|0;U=y|0;V=y+8|0;W=x|0;X=x+8|0;Y=u|0;Z=u+8|0;_=t|0;$=t+8|0;ab=s|0;ac=s+8|0;ad=D|0;ae=D+8|0;af=C|0;ag=C+8|0;ah=B|0;ai=B+8|0;aj=A|0;ak=A+8|0;al=0;am=0;an=0;ao=0;ap=0;aq=e;ar=I;L4581:while(1){as=c[1054]|0;at=(a[as+(aq*40&-1)|0]&1)==0;if(at){break L4579}au=c[as+(aq*40&-1)+36>>2]|0;av=as+(aq*40&-1)+32|0;aw=c[10036]|0;ax=0;while(1){if((ax|0)>=(au|0)){ay=3362;break}if((a[aw+((c[av>>2]|0)+ax|0)|0]|0)==(a[ax+103664|0]|0)){ax=ax+1|0}else{break}}if((ay|0)==3362){ay=0;if((ax|0)==1){break L4579}}aw=c[av>>2]|0;if(!((au|0)>0&(at^1))){break L4579}az=c[10036]|0;aA=0;aB=0;aC=aw;while(1){if((a[aA+204608|0]|0)==(a[az+(aA+aC|0)|0]|0)){aD=aC;aF=aB}else{if((aA|0)!=3){ay=3393;break}aD=aC-1|0;aF=1}aG=aA+1|0;if((aG|0)<(aF+au|0)){aA=aG;aB=aF;aC=aD}else{ay=3369;break}}do{if((ay|0)==3369){ay=0;if((aF|0)==0){if(!((aA|0)==6|(aA|0)==2)){ay=3393;break}}aC=aq+1|0;c[13898]=aC;if((a[47856]&1)!=0){aH=aC;ay=4033;break L4581}a[47856]=1;a[47544]=1;c[12170]=0;c[12220]=0;c[12222]=0;c[12224]=0;c[11876]=0;aC=c[11950]|0;if((c[11884]|0)<1){aB=db(aC,12,215112)|0;c[11950]=aB;c[11884]=1;aI=aB}else{aI=aC}c[aI>>2]=0;aC=c[12172]|0;aB=c[11864]|0;if((aB|0)>0){az=0;av=aB;while(1){aB=aC+(az*232&-1)+224|0;ax=c[aB>>2]|0;if((ax|0)==0){aJ=av}else{uu(ax);c[aB>>2]=0;aJ=c[11864]|0}aB=az+1|0;if((aB|0)<(aJ|0)){az=aB;av=aJ}else{break}}}c[11864]=0;av=c[11862]|0;if((av|0)==0){c[12204]=c[12200];c[12208]=0;az=c[12172]|0;if((c[11880]|0)<1){aC=db(az,232,216568)|0;aB=aC;c[12172]=aB;if((aC|0)==0){ay=3388;break L4581}c[11880]=1;aK=c[11864]|0;aL=aB}else{aK=0;aL=az}uD(aL+(aK*232&-1)|0,48440,232);c[11864]=(c[11864]|0)+1}else{c[12204]=c[12202];c[12208]=c[12206];if((av|0)>(c[11880]|0)){az=db(c[12172]|0,av*232&-1,216568)|0;c[12172]=az;if((az|0)==0){ay=3381;break L4581}c[11880]=av}az=c[12172]|0;aB=c[11864]|0;if((av|0)>0){aC=0;ax=aB;while(1){uD(az+(ax*232&-1)|0,48440,232);aG=(c[11864]|0)+1|0;c[11864]=aG;aN=aC+1|0;if((aN|0)<(av|0)){aC=aN;ax=aG}else{aO=aG;break}}}else{aO=aB}uD(az|0,c[12168]|0,aO*232&-1)}eB(ap,0);aP=ap;aQ=ao;aS=an;aT=am;aU=al}}while(0);L4629:do{if((ay|0)==3393){ay=0;if(!((au|0)>0&(at^1))){break L4579}aA=c[10036]|0;ax=0;aC=0;av=aw;while(1){if((a[ax+151232|0]|0)==(a[aA+(ax+av|0)|0]|0)){aV=av;aW=aC}else{if((ax|0)!=3){break}aV=av-1|0;aW=1}aG=ax+1|0;if((aG|0)<(aW+au|0)){ax=aG;aC=aW;av=aV}else{ay=3399;break}}do{if((ay|0)==3399){ay=0;if((aW|0)==0){if(!((ax|0)==6|(ax|0)==2)){break}}aX=aq+1|0;c[13898]=aX;if(ap){aH=aX;ay=4035;break L4581}if((a[47544]&1)==0){if((a[47856]&1)!=0){ay=3404;break L4581}}a[47544]=1;a[43464]=0;aP=1;aQ=ao;aS=an;aT=am;aU=al;break L4629}}while(0);if(!((au|0)>0&(at^1))){break L4579}ax=c[10036]|0;av=0;aC=0;aA=aw;while(1){if((a[av+91224|0]|0)==(a[ax+(av+aA|0)|0]|0)){aY=aA;a_=aC}else{if((av|0)!=6){break}aY=aA-1|0;a_=1}az=av+1|0;if((az|0)<(a_+au|0)){av=az;aC=a_;aA=aY}else{ay=3412;break}}do{if((ay|0)==3412){ay=0;if((a_|0)==0){if(!((av|0)==10|(av|0)==5)){break}}c[13898]=aq+1;a[47544]=1;a[47464]=1;a[43464]=0;aP=ap;aQ=ao;aS=an;aT=am;aU=al;break L4629}}while(0);if(!((au|0)>0&(at^1))){break L4579}av=c[10036]|0;aA=0;aC=0;ax=aw;while(1){if((a[aA+90656|0]|0)==(a[av+(aA+ax|0)|0]|0)){a$=ax;a0=aC}else{if((aA|0)!=1){break}a$=ax-1|0;a0=1}az=aA+1|0;if((az|0)<(a0+au|0)){aA=az;aC=a0;ax=a$}else{ay=3421;break}}do{if((ay|0)==3421){ay=0;if((a0|0)==0){if(!((aA|0)==0|(aA|0)==5)){break}}if(al){aH=aq;ay=4034;break L4581}if((a[47856]&1)!=0){if((a[47544]&1)!=0){ay=3426;break L4581}}ax=aq+1|0;c[13898]=ax;L4677:do{if((ax|0)<(ar|0)){L4679:do{if((a[as+(ax*40&-1)|0]&1)!=0){aC=c[as+(ax*40&-1)+36>>2]|0;av=as+(ax*40&-1)+32|0;az=c[10036]|0;aB=0;while(1){if((aB|0)>=(aC|0)){break}if((a[az+((c[av>>2]|0)+aB|0)|0]|0)==(a[aB+103664|0]|0)){aB=aB+1|0}else{break L4679}}if((aB|0)==1){ay=3435;break L4677}}}while(0);a[14176]=1;is(D);a[14176]=0;if((c[ad>>2]|0)!=3){c[13898]=ax;ay=3435;break}av=c[ae>>2]|0;c[9356]=av;if((av|0)==0){break}a[37432]=0;aP=ap;aQ=ao;aS=an;aT=am;aU=1;break L4629}else{ay=3435}}while(0);if((ay|0)==3435){ay=0;c[9356]=0}ax=is(C)|0;av=c[ax>>2]|0;if((av|0)==1){a1=+(c[ax+8>>2]|0)}else if((av|0)==2){a1=+h[ax+8>>3]}else if((av|0)==3){a1=+uz(c[ax+8>>2]|0,0)}else{ay=3442;break L4581}if((c[af>>2]|0)==3){uu(c[ag>>2]|0);c[af>>2]=1}ax=~~a1;c[11898]=ax;av=c[13898]|0;az=c[8272]|0;L4701:do{if((az|0)>(av|0)){aC=c[1054]|0;if((a[aC+(av*40&-1)|0]&1)==0){break}aG=c[aC+(av*40&-1)+36>>2]|0;aN=aC+(av*40&-1)+32|0;a2=c[10036]|0;a3=0;while(1){if((a3|0)>=(aG|0)){break}if((a[a2+((c[aN>>2]|0)+a3|0)|0]|0)==(a[a3+183584|0]|0)){a3=a3+1|0}else{break L4701}}if((a3|0)!=1){break}aN=av+1|0;c[13898]=aN;L4709:do{if((az|0)>(aN|0)){if((a[aC+(aN*40&-1)|0]&1)==0){ay=3458;break}aG=c[aC+(aN*40&-1)+36>>2]|0;a4=aC+(aN*40&-1)+32|0;a5=0;while(1){if((a5|0)>=(aG|0)){break}if((a[a2+((c[a4>>2]|0)+a5|0)|0]|0)==(a[a5+183584|0]|0)){a5=a5+1|0}else{ay=3458;break L4709}}if((a5|0)!=1){ay=3458;break}c[11762]=2147483647;a6=aN;a7=az}else{ay=3458}}while(0);if((ay|0)==3458){ay=0;aN=is(B)|0;a2=c[aN>>2]|0;if((a2|0)==3){a9=+uz(c[aN+8>>2]|0,0)}else if((a2|0)==1){a9=+(c[aN+8>>2]|0)}else if((a2|0)==2){a9=+h[aN+8>>3]}else{ay=3462;break L4581}if((c[ah>>2]|0)==3){uu(c[ai>>2]|0);c[ah>>2]=1}aN=~~a9;c[11762]=aN;ba=c[13898]|0;if((aN|0)<(c[11898]|0)){ay=3467;break L4581}a6=ba;a7=c[8272]|0}if((a7|0)<=(a6|0)){aP=ap;aQ=ao;aS=an;aT=am;aU=1;break L4629}aN=c[1054]|0;if((a[aN+(a6*40&-1)|0]&1)==0){aP=ap;aQ=ao;aS=an;aT=am;aU=1;break L4629}a2=c[aN+(a6*40&-1)+36>>2]|0;aC=aN+(a6*40&-1)+32|0;aN=c[10036]|0;a3=0;while(1){if((a3|0)>=(a2|0)){break}if((a[aN+((c[aC>>2]|0)+a3|0)|0]|0)==(a[a3+183584|0]|0)){a3=a3+1|0}else{aP=ap;aQ=ao;aS=an;aT=am;aU=1;break L4629}}if((a3|0)!=1){aP=ap;aQ=ao;aS=an;aT=am;aU=1;break L4629}c[13898]=a6+1;aC=is(A)|0;aN=c[aC>>2]|0;if((aN|0)==1){bb=+(c[aC+8>>2]|0)}else if((aN|0)==2){bb=+h[aC+8>>3]}else if((aN|0)==3){bb=+uz(c[aC+8>>2]|0,0)}else{ay=3478;break L4581}if((c[aj>>2]|0)==3){uu(c[ak>>2]|0);c[aj>>2]=1}aC=~~bb;aN=(aC|0)>-1?aC:-aC|0;c[11904]=aN;if((aN|0)<1){ay=3482;break L4581}else{aP=ap;aQ=ao;aS=an;aT=am;aU=1;break L4629}}}while(0);c[11762]=ax;aP=ap;aQ=ao;aS=an;aT=am;aU=1;break L4629}}while(0);if(at){break L4579}L4747:do{if((au|0)>0){aA=c[10036]|0;az=0;av=0;aN=aw;while(1){if((a[az+90160|0]|0)==(a[aA+(az+aN|0)|0]|0)){bd=aN;be=av}else{if((az|0)!=2){break L4747}bd=aN-1|0;be=1}aC=az+1|0;if((aC|0)<(be+au|0)){az=aC;av=be;aN=bd}else{break}}if((be|0)==0){if(!((az|0)==1|(az|0)==5)){break}}if(am){aH=aq;ay=4036;break L4581}a[43464]=0;aN=aq+1|0;c[13898]=aN;L4760:do{if((ar|0)>(aN|0)){if((a[as+(aN*40&-1)|0]&1)==0){ay=3500;break}av=c[as+(aN*40&-1)+36>>2]|0;aA=as+(aN*40&-1)+32|0;ax=c[10036]|0;aC=0;while(1){if((aC|0)>=(av|0)){break}if((a[ax+((c[aA>>2]|0)+aC|0)|0]|0)==(a[aC+183584|0]|0)){aC=aC+1|0}else{ay=3500;break L4760}}if((aC|0)==1){bf=aN;bg=ar}else{ay=3500}}else{ay=3500}}while(0);if((ay|0)==3500){ay=0;aN=is(z)|0;az=c[aN>>2]|0;if((az|0)==1){bh=+(c[aN+8>>2]|0)}else if((az|0)==2){bh=+h[aN+8>>3]}else if((az|0)==3){bh=+uz(c[aN+8>>2]|0,0)}else{ay=3504;break L4581}if((c[S>>2]|0)==3){uu(c[T>>2]|0);c[S>>2]=1}aN=~~bh;c[10872]=aN;bi=c[13898]|0;if((aN|0)<1){ay=3509;break L4581}bf=bi;bg=c[8272]|0}L4779:do{if((bg|0)>(bf|0)){aN=c[1054]|0;if((a[aN+(bf*40&-1)|0]&1)==0){bj=bf;bk=bg;break}az=c[aN+(bf*40&-1)+36>>2]|0;aA=aN+(bf*40&-1)+32|0;ax=c[10036]|0;av=0;while(1){if((av|0)>=(az|0)){break}if((a[ax+((c[aA>>2]|0)+av|0)|0]|0)==(a[av+183584|0]|0)){av=av+1|0}else{bj=bf;bk=bg;break L4779}}if((av|0)!=1){bj=bf;bk=bg;break}aA=bf+1|0;c[13898]=aA;L4787:do{if((bg|0)>(aA|0)){if((a[aN+(aA*40&-1)|0]&1)==0){break}az=c[aN+(aA*40&-1)+36>>2]|0;aC=aN+(aA*40&-1)+32|0;a3=0;while(1){if((a3|0)>=(az|0)){break}if((a[ax+((c[aC>>2]|0)+a3|0)|0]|0)==(a[a3+183584|0]|0)){a3=a3+1|0}else{break L4787}}if((a3|0)==1){bj=aA;bk=bg;break L4779}}}while(0);aA=is(y)|0;ax=c[aA>>2]|0;if((ax|0)==1){bl=+(c[aA+8>>2]|0)}else if((ax|0)==2){bl=+h[aA+8>>3]}else if((ax|0)==3){bl=+uz(c[aA+8>>2]|0,0)}else{ay=3526;break L4581}if((c[U>>2]|0)==3){uu(c[V>>2]|0);c[U>>2]=1}aA=~~bl;c[10874]=aA;bm=c[13898]|0;if((aA|0)<1){ay=3531;break L4581}bj=bm;bk=c[8272]|0}else{bj=bf;bk=bg}}while(0);L4805:do{if((bk|0)>(bj|0)){aA=c[1054]|0;if((a[aA+(bj*40&-1)|0]&1)==0){bn=bj;bo=bk;break}ax=c[aA+(bj*40&-1)+36>>2]|0;aN=aA+(bj*40&-1)+32|0;av=c[10036]|0;aC=0;while(1){if((aC|0)>=(ax|0)){break}if((a[av+((c[aN>>2]|0)+aC|0)|0]|0)==(a[aC+183584|0]|0)){aC=aC+1|0}else{bn=bj;bo=bk;break L4805}}if((aC|0)!=1){bn=bj;bo=bk;break}aN=bj+1|0;c[13898]=aN;L4813:do{if((bk|0)>(aN|0)){if((a[aA+(aN*40&-1)|0]&1)==0){break}ax=c[aA+(aN*40&-1)+36>>2]|0;az=aA+(aN*40&-1)+32|0;a5=0;while(1){if((a5|0)>=(ax|0)){break}if((a[av+((c[az>>2]|0)+a5|0)|0]|0)==(a[a5+183584|0]|0)){a5=a5+1|0}else{break L4813}}if((a5|0)==1){bn=aN;bo=bk;break L4805}}}while(0);aN=is(x)|0;av=c[aN>>2]|0;if((av|0)==1){bp=+(c[aN+8>>2]|0)}else if((av|0)==2){bp=+h[aN+8>>3]}else if((av|0)==3){bp=+uz(c[aN+8>>2]|0,0)}else{ay=3548;break L4581}if((c[W>>2]|0)==3){uu(c[X>>2]|0);c[W>>2]=1}aN=~~bp;c[10806]=aN;bq=c[13898]|0;if((aN|0)<0){ay=3553;break L4581}bn=bq;bo=c[8272]|0}else{bn=bj;bo=bk}}while(0);L4831:do{if((bo|0)>(bn|0)){aN=c[1054]|0;if((a[aN+(bn*40&-1)|0]&1)==0){br=bn;bs=bo;break}av=c[aN+(bn*40&-1)+36>>2]|0;aA=aN+(bn*40&-1)+32|0;aC=c[10036]|0;az=0;while(1){if((az|0)>=(av|0)){break}if((a[aC+((c[aA>>2]|0)+az|0)|0]|0)==(a[az+183584|0]|0)){az=az+1|0}else{br=bn;bs=bo;break L4831}}if((az|0)!=1){br=bn;bs=bo;break}aA=bn+1|0;c[13898]=aA;L4839:do{if((bo|0)>(aA|0)){if((a[aN+(aA*40&-1)|0]&1)==0){break}av=c[aN+(aA*40&-1)+36>>2]|0;ax=aN+(aA*40&-1)+32|0;a3=0;while(1){if((a3|0)>=(av|0)){break}if((a[aC+((c[ax>>2]|0)+a3|0)|0]|0)==(a[a3+183584|0]|0)){a3=a3+1|0}else{break L4839}}if((a3|0)==1){br=aA;bs=bo;break L4831}}}while(0);aA=is(u)|0;aC=c[aA>>2]|0;if((aC|0)==1){bu=+(c[aA+8>>2]|0)}else if((aC|0)==2){bu=+h[aA+8>>3]}else if((aC|0)==3){bu=+uz(c[aA+8>>2]|0,0)}else{ay=3570;break L4581}if((c[Y>>2]|0)==3){uu(c[Z>>2]|0);c[Y>>2]=1}aA=~~bu;c[10808]=aA;bv=c[13898]|0;if((aA|0)<0){ay=3575;break L4581}br=bv;bs=c[8272]|0}else{br=bn;bs=bo}}while(0);L4857:do{if((bs|0)>(br|0)){aA=c[1054]|0;if((a[aA+(br*40&-1)|0]&1)==0){bw=br;bx=bs;break}aC=c[aA+(br*40&-1)+36>>2]|0;aN=aA+(br*40&-1)+32|0;az=c[10036]|0;ax=0;while(1){if((ax|0)>=(aC|0)){break}if((a[az+((c[aN>>2]|0)+ax|0)|0]|0)==(a[ax+183584|0]|0)){ax=ax+1|0}else{bw=br;bx=bs;break L4857}}if((ax|0)!=1){bw=br;bx=bs;break}aN=br+1|0;c[13898]=aN;L4865:do{if((bs|0)>(aN|0)){if((a[aA+(aN*40&-1)|0]&1)==0){break}aC=c[aA+(aN*40&-1)+36>>2]|0;av=aA+(aN*40&-1)+32|0;a5=0;while(1){if((a5|0)>=(aC|0)){break}if((a[az+((c[av>>2]|0)+a5|0)|0]|0)==(a[a5+183584|0]|0)){a5=a5+1|0}else{break L4865}}if((a5|0)==1){bw=aN;bx=bs;break L4857}}}while(0);aN=is(t)|0;az=c[aN>>2]|0;if((az|0)==1){by=+(c[aN+8>>2]|0)}else if((az|0)==2){by=+h[aN+8>>3]}else if((az|0)==3){by=+uz(c[aN+8>>2]|0,0)}else{ay=3592;break L4581}if((c[_>>2]|0)==3){uu(c[$>>2]|0);c[_>>2]=1}aN=~~by;c[8832]=aN;bz=c[13898]|0;if((aN|0)<(c[10806]|0)){ay=3597;break L4581}bw=bz;bx=c[8272]|0}else{bw=br;bx=bs}}while(0);if((bx|0)<=(bw|0)){aP=ap;aQ=ao;aS=an;aT=1;aU=al;break L4629}aN=c[1054]|0;if((a[aN+(bw*40&-1)|0]&1)==0){aP=ap;aQ=ao;aS=an;aT=1;aU=al;break L4629}az=c[aN+(bw*40&-1)+36>>2]|0;aA=aN+(bw*40&-1)+32|0;aN=c[10036]|0;ax=0;while(1){if((ax|0)>=(az|0)){break}if((a[aN+((c[aA>>2]|0)+ax|0)|0]|0)==(a[ax+183584|0]|0)){ax=ax+1|0}else{aP=ap;aQ=ao;aS=an;aT=1;aU=al;break L4629}}if((ax|0)!=1){aP=ap;aQ=ao;aS=an;aT=1;aU=al;break L4629}c[13898]=bw+1;aA=is(s)|0;aN=c[aA>>2]|0;if((aN|0)==1){bA=+(c[aA+8>>2]|0)}else if((aN|0)==2){bA=+h[aA+8>>3]}else if((aN|0)==3){bA=+uz(c[aA+8>>2]|0,0)}else{ay=3608;break L4581}if((c[ab>>2]|0)==3){uu(c[ac>>2]|0);c[ab>>2]=1}aA=~~bA;c[8834]=aA;if((aA|0)<(c[10808]|0)){ay=3612;break L4581}else{aP=ap;aQ=ao;aS=an;aT=1;aU=al;break L4629}}}while(0);if(!((au|0)>0&(at^1))){break L4579}aA=c[10036]|0;aN=0;az=0;av=aw;while(1){if((a[aN+89424|0]|0)==(a[aA+(aN+av|0)|0]|0)){bB=av;bC=az}else{if((aN|0)!=4){break}bB=av-1|0;bC=1}aC=aN+1|0;if((aC|0)<(bC+au|0)){aN=aC;az=bC;av=bB}else{ay=3619;break}}do{if((ay|0)==3619){ay=0;if((bC|0)==0){if((aN-3|0)>>>0>=2){break}}if(an){aH=aq;ay=4037;break L4581}c[13898]=aq+1;uB(55600,24544);c[11670]=232;w=121;a[55702]=w&255;w=w>>8;a[55703|0]=w&255;it();av=c[18070]|0;az=db(av,c[av>>2]<<5|8,105624)|0;c[18070]=0;c[60]=az;c[11670]=0;aP=ap;aQ=ao;aS=1;aT=am;aU=al;break L4629}}while(0);if(at){break L4579}L4914:do{if((au|0)>0){aN=c[10036]|0;az=0;av=0;aA=aw;while(1){if((a[az+89072|0]|0)==(a[aN+(az+aA|0)|0]|0)){bD=aA;bE=av}else{if((az|0)!=1){break L4914}bD=aA-1|0;bE=1}aC=az+1|0;if((aC|0)<(bE+au|0)){az=aC;av=bE;aA=bD}else{break}}if((bE|0)==0){if(!((az|0)==0|(az|0)==5)){break}}if(ao){aH=aq;ay=4038;break L4581}if((a[47856]&1)==0){bF=aq;bG=ar}else{eA();bF=c[13898]|0;bG=c[8272]|0}L4930:do{if((bF|0)<(bG|0)){aA=c[1054]|0;L4932:do{if((a[aA+(bF*40&-1)|0]&1)!=0){av=c[aA+(bF*40&-1)+36>>2]|0;aN=aA+(bF*40&-1)+32|0;ax=c[10036]|0;aC=0;while(1){if((aC|0)>=(av|0)){break}if((a[ax+((c[aN>>2]|0)+aC|0)|0]|0)==(a[aC+103664|0]|0)){aC=aC+1|0}else{break L4932}}if((aC|0)==1){bH=bF;bI=bG;break L4930}}}while(0);aN=bF+1|0;c[13898]=aN;if((a[aA+(aN*40&-1)|0]&1)==0){bH=aN;bI=bG;break}ax=c[aA+(aN*40&-1)+32>>2]|0;av=c[10036]|0;a5=a[av+ax|0]|0;if(!((a5<<24>>24|0)==39|(a5<<24>>24|0)==34)){bH=aN;bI=bG;break}L4941:do{if((aN|0)<(bG|0)){a5=c[aA+(aN*40&-1)+36>>2]|0;a3=0;while(1){if((a3|0)>=(a5|0)){ay=3647;break}if((a[av+(a3+ax|0)|0]|0)==(a[a3+103664|0]|0)){a3=a3+1|0}else{break}}if((ay|0)==3647){ay=0;if((a3|0)==1){ay=3650;break}}a[14176]=1;is(r);a[14176]=0;if((c[K>>2]|0)!=3){c[13898]=aN;ay=3650;break}a5=c[L>>2]|0;c[11930]=a5;if((a5|0)==0){bJ=0;break}else{bK=0;bM=a5}L4952:while(1){aC=a8(bM|0,37)|0;if((aC|0)==0){break}else{bN=aC}while(1){aC=bN+1|0;a2=a[aC]|0;if((aZ(140272,a2|0,15)|0)!=0){bN=aC;continue}if((a2|0)==108){break}else if(!((a2|0)==42|(a2|0)==37)){bJ=a5;break L4941}a2=a8(bN+2|0,37)|0;if((a2|0)==0){break L4952}else{bN=a2}}a2=bN+2|0;if((aZ(140120,a[a2]|0|0,7)|0)==0){bJ=a5;break L4941}else{bK=bK+1|0;bM=a2}}if((bK-1|0)>>>0<7){aP=ap;aQ=1;aS=an;aT=am;aU=al;break L4629}else{bJ=a5}}else{ay=3650}}while(0);if((ay|0)==3650){ay=0;c[11930]=0;bJ=0}uu(bJ);c[11930]=0;c[13898]=aN;bH=aN;bI=c[8272]|0}else{bH=bF;bI=bG}}while(0);L4964:do{if((bH|0)<(bI|0)){az=c[1054]|0;L4966:do{if((a[az+(bH*40&-1)|0]&1)==0){bO=0;bQ=bH;bR=bI;bS=az}else{ax=c[az+(bH*40&-1)+36>>2]|0;av=az+(bH*40&-1)+32|0;aA=c[10036]|0;a3=0;while(1){if((a3|0)>=(ax|0)){break}if((a[aA+((c[av>>2]|0)+a3|0)|0]|0)==(a[a3+103664|0]|0)){a3=a3+1|0}else{bO=0;bQ=bH;bR=bI;bS=az;break L4966}}if((a3|0)==1){bT=0;bU=bH;bV=bI;break L4964}else{bO=0;bQ=bH;bR=bI;bS=az}}}while(0);while(1){az=c[11870]|0;if((az|0)>=(f|0)){ay=3666;break L4581}aN=(bR|0)>(bQ|0);av=a[bS+(bQ*40&-1)|0]|0;L4975:do{if(aN){aA=(av&1)==0;if(aA){ay=3680;break}ax=c[bS+(bQ*40&-1)+36>>2]|0;a5=bS+(bQ*40&-1)+32|0;a2=c[10036]|0;aC=0;while(1){if((aC|0)>=(ax|0)){ay=3672;break}if((a[a2+((c[a5>>2]|0)+aC|0)|0]|0)==(a[aC+183584|0]|0)){aC=aC+1|0}else{break}}do{if((ay|0)==3672){ay=0;if((aC|0)!=1){break}c[1048+(az*12&-1)>>2]=az;c[11870]=az+1;bW=(az|0)>(bO|0)?az:bO;break L4975}}while(0);if(aA){ay=3680;break}aC=c[bS+(bQ*40&-1)+36>>2]|0;a5=bS+(bQ*40&-1)+32|0;a2=c[10036]|0;ax=0;while(1){if((ax|0)>=(aC|0)){break}if((a[a2+((c[a5>>2]|0)+ax|0)|0]|0)==(a[ax+199040|0]|0)){ax=ax+1|0}else{ay=3680;break L4975}}if((ax|0)!=1){ay=3680;break}a[43464]=0;c[11670]=0;c[18068]=-99;it();a5=c[18070]|0;a2=db(a5,c[a5>>2]<<5|8,105624)|0;c[18070]=0;a5=c[11870]|0;c[1056+(a5*12&-1)>>2]=a2;a2=c[18068]|0;c[11870]=a5+1;c[1048+(a5*12&-1)>>2]=a2;bW=(bO|0)<(a2|0)?a2:bO}else{ay=3680}}while(0);L4991:do{if((ay|0)==3680){ay=0;az=c[bS+(bQ*40&-1)+36>>2]|0;a3=c[bS+(bQ*40&-1)+32>>2]|0;a2=(av&1)==0;L4993:do{if((az|0)>0&(a2^1)){a5=c[10036]|0;aC=0;aA=0;a4=a3;while(1){if((a[aC+141928|0]|0)==(a[a5+(aC+a4|0)|0]|0)){bX=a4;bY=aA}else{if((aC|0)!=4){break}bX=a4-1|0;bY=1}aG=aC+1|0;if((aG|0)<(bY+az|0)){aC=aG;aA=bY;a4=bX}else{ay=3686;break}}do{if((ay|0)==3686){ay=0;if((bY|0)==0){if(!((aC|0)==3|(aC|0)==10)){break}}eY(3);bW=bO;break L4991}}while(0);if(a2){break}else{bZ=0;b_=0;b$=a3}while(1){if((a[bZ+141800|0]|0)==(a[a5+(bZ+b$|0)|0]|0)){b0=b$;b1=b_}else{if((bZ|0)!=5){b2=0;b3=0;b4=a3;break}b0=b$-1|0;b1=1}aC=bZ+1|0;if((aC|0)<(b1+az|0)){bZ=aC;b_=b1;b$=b0}else{ay=3694;break}}do{if((ay|0)==3694){ay=0;if((b1|0)==0){if(!((bZ|0)==4|(bZ|0)==11)){b2=0;b3=0;b4=a3;break}}eY(4);bW=bO;break L4991}}while(0);while(1){if((a[b2+141632|0]|0)==(a[a5+(b2+b4|0)|0]|0)){b5=b4;b6=b3}else{if((b2|0)!=4){b7=0;b8=0;b9=a3;break}b5=b4-1|0;b6=1}aC=b2+1|0;if((aC|0)<(b6+az|0)){b2=aC;b3=b6;b4=b5}else{ay=3701;break}}do{if((ay|0)==3701){ay=0;if((b6|0)==0){if(!((b2|0)==3|(b2|0)==10)){b7=0;b8=0;b9=a3;break}}eY(5);bW=bO;break L4991}}while(0);while(1){if((a[b7+141416|0]|0)==(a[a5+(b7+b9|0)|0]|0)){ca=b9;cb=b8}else{if((b7|0)!=5){cc=0;cd=0;ce=a3;break}ca=b9-1|0;cb=1}aC=b7+1|0;if((aC|0)<(cb+az|0)){b7=aC;b8=cb;b9=ca}else{ay=3708;break}}do{if((ay|0)==3708){ay=0;if((cb|0)==0){if(!((b7|0)==4|(b7|0)==11)){cc=0;cd=0;ce=a3;break}}eY(6);bW=bO;break L4991}}while(0);while(1){if((a[cc+141296|0]|0)==(a[a5+(cc+ce|0)|0]|0)){cf=ce;cg=cd}else{if((cc|0)!=4){ch=0;ci=0;cj=a3;break}cf=ce-1|0;cg=1}aC=cc+1|0;if((aC|0)<(cg+az|0)){cc=aC;cd=cg;ce=cf}else{ay=3715;break}}do{if((ay|0)==3715){ay=0;if((cg|0)==0){if(!((cc|0)==3|(cc|0)==10)){ch=0;ci=0;cj=a3;break}}eY(7);bW=bO;break L4991}}while(0);while(1){if((a[ch+141096|0]|0)==(a[a5+(ch+cj|0)|0]|0)){ck=cj;cl=ci}else{if((ch|0)!=5){cm=0;break}ck=cj-1|0;cl=1}aC=ch+1|0;if((aC|0)<(cl+az|0)){ch=aC;ci=cl;cj=ck}else{ay=3722;break}}do{if((ay|0)==3722){ay=0;if((cl|0)==0){if(!((ch|0)==4|(ch|0)==11)){cm=0;break}}eY(8);bW=bO;break L4991}}while(0);do{if((a[cm+128552|0]|0)!=(a[a5+(cm+a3|0)|0]|0)){break L4993}cm=cm+1|0;}while((cm|0)<(az|0));if((cm|0)!=3){break}eY(2);bW=bO;break L4991}}while(0);L5068:do{if(aN){L5070:do{if(!a2){ax=c[10036]|0;a5=0;while(1){if((a5|0)>=(az|0)){break}if((a[ax+(a5+a3|0)|0]|0)==(a[a5+103664|0]|0)){a5=a5+1|0}else{break L5070}}if((a5|0)==1){break L5068}}}while(0);a[14176]=1;is(p);a[14176]=0;if((c[M>>2]|0)!=3){c[13898]=bQ;break}ax=c[N>>2]|0;if((ax|0)==0){break}aC=ut(68)|0;if((aC|0)==0){gk();a4=ut(68)|0;if((a4|0)==0){ay=3740;break L4581}else{cn=a4}}else{cn=aC}c[cn>>2]=2;c[cn+8>>2]=1;c[cn+16>>2]=3;c[cn+24>>2]=ax;c[cn+40>>2]=42;c[cn+48>>2]=0;aC=c[11870]|0;c[1056+(aC*12&-1)>>2]=cn;a4=aC+1|0;c[11870]=a4;c[1048+(aC*12&-1)>>2]=-99;a[32928]=1;a[43464]=0;if((a4|0)!=2){bW=bO;break L4991}uu(c[11902]|0);c[11902]=bP(ax|0)|0;bW=bO;break L4991}}while(0);a3=is(l)|0;az=c[a3>>2]|0;if((az|0)==1){co=+(c[a3+8>>2]|0)}else if((az|0)==2){co=+h[a3+8>>3]}else if((az|0)==3){co=+uz(c[a3+8>>2]|0,0)}else{ay=3747;break L4581}if((c[O>>2]|0)==3){uu(c[P>>2]|0);c[O>>2]=1}a3=~~co;if((a3|0)<-2){ay=3751;break L4581}az=c[11870]|0;c[11870]=az+1;c[1048+(az*12&-1)>>2]=a3;bW=(a3|0)>(bO|0)?a3:bO}}while(0);aN=c[13898]|0;av=c[8272]|0;if((av|0)<=(aN|0)){bT=bW;bU=aN;bV=av;break L4964}a3=c[1054]|0;if((a[a3+(aN*40&-1)|0]&1)==0){bT=bW;bU=aN;bV=av;break L4964}az=c[a3+(aN*40&-1)+36>>2]|0;a2=a3+(aN*40&-1)+32|0;ax=c[10036]|0;a4=0;while(1){if((a4|0)>=(az|0)){break}if((a[ax+((c[a2>>2]|0)+a4|0)|0]|0)==(a[a4+183584|0]|0)){a4=a4+1|0}else{bT=bW;bU=aN;bV=av;break L4964}}if((a4|0)!=1){bT=bW;bU=aN;bV=av;break L4964}a2=aN+1|0;c[13898]=a2;if((a2|0)==0){bT=bW;bU=0;bV=av;break}else{bO=bW;bQ=a2;bR=av;bS=a3}}}else{bT=0;bU=bH;bV=bI}}while(0);if((a[47856]&1)==0){cq=bU;cr=bV}else{eQ(bT);cq=c[13898]|0;cr=c[8272]|0}if((cq|0)>=(cr|0)){aP=ap;aQ=1;aS=an;aT=am;aU=al;break L4629}a2=c[1054]|0;if((a[a2+(cq*40&-1)|0]&1)==0){aP=ap;aQ=1;aS=an;aT=am;aU=al;break L4629}ax=c[a2+(cq*40&-1)+36>>2]|0;az=a2+(cq*40&-1)+32|0;a2=c[10036]|0;aC=0;while(1){if((aC|0)>=(ax|0)){ay=3767;break}aA=c[az>>2]|0;if((a[a2+(aA+aC|0)|0]|0)==(a[aC+103664|0]|0)){aC=aC+1|0}else{cs=aA;break}}if((ay|0)==3767){ay=0;if((aC|0)==1){aP=ap;aQ=1;aS=an;aT=am;aU=al;break L4629}cs=c[az>>2]|0}aA=a[a2+cs|0]|0;if((aA<<24>>24|0)==39|(aA<<24>>24|0)==34){ct=0}else{aP=ap;aQ=1;aS=an;aT=am;aU=al;break L4629}while(1){if((ct|0)>=(ax|0)){ay=3772;break}if((a[a2+(ct+cs|0)|0]|0)==(a[ct+103664|0]|0)){ct=ct+1|0}else{break}}if((ay|0)==3772){ay=0;if((ct|0)==1){break L4581}}a[14176]=1;is(q);a[14176]=0;if((c[Q>>2]|0)!=3){ay=3774;break L4581}a2=c[R>>2]|0;c[11930]=a2;if((a2|0)==0){ay=4050;break L4581}else{cv=0;cw=a2}L5123:while(1){a2=a8(cw|0,37)|0;if((a2|0)==0){break}else{cx=a2}while(1){a2=cx+1|0;ax=a[a2]|0;if((aZ(140272,ax|0,15)|0)!=0){cx=a2;continue}if((ax|0)==108){break}else if(!((ax|0)==42|(ax|0)==37)){ay=4051;break L4581}ax=a8(cx+2|0,37)|0;if((ax|0)==0){break L5123}else{cx=ax}}ax=cx+2|0;if((aZ(140120,a[ax]|0|0,7)|0)==0){ay=4052;break L4581}else{cv=cv+1|0;cw=ax}}if((cv-1|0)>>>0<7){aP=ap;aQ=1;aS=an;aT=am;aU=al;break L4629}else{ay=4053;break L4581}}}while(0);if(!((au|0)>0&(at^1))){break L4579}ax=c[10036]|0;a2=0;while(1){if((a[a2+88368|0]|0)!=(a[ax+(a2+aw|0)|0]|0)){break}cy=a2+1|0;if((cy|0)<(au|0)){a2=cy}else{ay=3788;break}}do{if((ay|0)==3788){ay=0;if((cy|0)!=8){break}c[13898]=aq+1;a[872]=1;aP=ap;aQ=ao;aS=an;aT=am;aU=al;break L4629}}while(0);if(!((au|0)>0&(at^1))){break L4579}a2=c[10036]|0;ax=0;az=0;aC=aw;while(1){if((a[ax+87120|0]|0)==(a[a2+(ax+aC|0)|0]|0)){cz=aC;cA=az}else{if((ax|0)!=6){break L4579}cz=aC-1|0;cA=1}aA=ax+1|0;if((aA|0)<(cA+au|0)){ax=aA;az=cA;aC=cz}else{break}}if((cA|0)==0){if(!((ax|0)==5|(ax|0)==11)){break L4579}}c[13898]=aq+1;a[J]=1;aP=ap;aQ=ao;aS=an;aT=am;aU=al}}while(0);au=c[13898]|0;aw=c[8272]|0;if((au|0)<(aw|0)){al=aU;am=aT;an=aS;ao=aQ;ap=aP;aq=au;ar=aw}else{break L4579}}if((ay|0)==3462){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==3509){uf(bi,139088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==3388){c[11880]=0;uf(c[13898]|0,216112,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==3478){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==3404){uf(aX,138160,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==3482){uf(c[13898]|0,139280,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==3526){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==3531){uf(bm,139088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==3575){uf(bv,138968,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==3442){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==3381){c[11880]=0;uf(c[13898]|0,216112,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==3426){uf(aq,139624,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==3570){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==3467){uf(ba,139480,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==3504){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==3548){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==3553){uf(bq,138968,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==3592){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==3597){uf(bz,138672,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==3608){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==3612){uf(c[13898]|0,138528,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==3666){uf(bQ,82688,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==3740){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=179864,v)|0);return 0}else if((ay|0)==3747){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==3751){uf(c[13898]|0,140816,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==3774){c[13898]=cq}else if((ay|0)==4033){uf(aH,86056,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==4034){uf(aH,86056,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==4035){uf(aH,86056,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==4036){uf(aH,86056,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==4037){uf(aH,86056,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==4038){uf(aH,86056,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==4050){cB=c[13898]|0;uf(cB,140584,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==4051){cB=c[13898]|0;uf(cB,140584,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==4052){cB=c[13898]|0;uf(cB,140584,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==4053){cB=c[13898]|0;uf(cB,140584,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}c[11930]=0;cB=c[13898]|0;uf(cB,140584,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}}while(0);L5192:do{if((c[9056]|0)==2){if((c[11870]|0)==1){c[13488]=c[262];break}do{if((j|0)!=0){if((c[j+8>>2]|0)!=3){break}c[13488]=c[268];break L5192}}while(0);c[13488]=c[265]}}while(0);c[7638]=-1;c[8800]=0;c[11854]=0;c[11852]=0;c[11850]=0;if((c[8716]|0)>>>0<160){c[8716]=160;j=ut(160)|0;do{if((j|0)==0){gk();aq=ut(160)|0;if((aq|0)!=0){cC=aq;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=84816,v)|0);return 0}else{cC=j}}while(0);c[8802]=cC}cC=c[11932]|0;j=a[cC]|0;L5209:do{if((j<<24>>24|0)==60){do{if((uA(cC|0)|0)>>>0>1){if((a[cC+1|0]|0)!=38){if((j<<24>>24|0)==60){break}else if((j<<24>>24|0)==45){ay=3830;break L5209}else if((j<<24>>24|0)==43){ay=3836;break L5209}else{ay=3840;break L5209}}aq=aE(cC+2|0,F|0,10)|0;c[12894]=aq;cB=c[F>>2]|0;if((a[cB]|0)!=0|(aq|0)<0){uf(H,84216,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}if((cB|0)==((c[11932]|0)+2|0)){uf(H,84216,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}if((aq|0)==(aR(c[o>>2]|0)|0)){uf(H,83392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}aq=c[12894]|0;if((aq|0)==(aR(c[n>>2]|0)|0)){uf(H,83392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}aq=c[12894]|0;if((aq|0)==(aR(c[m>>2]|0)|0)){uf(H,83392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}aq=bL(c[12894]|0,193632)|0;c[12892]=aq;if((aq|0)!=0){break L5209}uf(H,80992,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}}while(0);if(!(a[14168]|0)){uf(-1,145320,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}aq=bt(cC+1|0,193632)|0;c[12892]=aq;if((aq|0)==0){uj(H,79632,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else{a[47440]=1;break}}else if((j<<24>>24|0)==45){ay=3830}else if((j<<24>>24|0)==43){ay=3836}else{ay=3840}}while(0);do{if((ay|0)==3830){if((uA(cC|0)|0)!=1){ay=3840;break}a[30664]=1;a[872]=1;j=c[8804]|0;if((j|0)==0){c[12892]=0;ay=3834}else{F=c[j>>2]|0;c[12892]=F;if((F|0)==0){ay=3834}}if((ay|0)==3834){c[12892]=c[o>>2]}a[34104]=1}else if((ay|0)==3836){F=uA(cC|0)|0;if((F|0)==1){c[11854]=1;break}if(!((a[cC+1|0]|0)==43&(F|0)==2)){break}c[11854]=2}}while(0);do{if((ay|0)==3840){iQ(47728);do{if((cu(c[11932]|0,G|0)|0)>-1){if((c[G+8>>2]&61440|0)!=16384){break}uj(H,78896,(v=i,i=i+8|0,c[v>>2]=c[11932],v)|0);return 0}}while(0);cC=hA(c[11932]|0,(a[47856]&1)!=0?78360:193632)|0;c[12892]=cC;if((cC|0)!=0){break}uh(-1,77960,(v=i,i=i+8|0,c[v>>2]=c[11932],v)|0);a[47736]=1;cD=-1;i=k;return cD|0}}while(0);do{if((a[47544]&1)!=0){H=c[12892]|0;if((a[47856]&1)!=0){G=~~+eE(H);if((G|0)==0){uf(-1,146120,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}if((G|0)>1e8){uf(-1,145960,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}co=+eE(H);h[5944]=co;if((G|0)>1){cC=(G<<2)-8|0;cp(H|0,cC|0,1);cE=+eE(H)}else{cE=co}h[5946]=cE;h[5945]=+eE(H);cp(H|0,0,2);cC=(bc(H|0)|0)>>>2;F=G+1|0;j=(cC|0)/(F|0)&-1;if((aa(j,F)|0)==(cC|0)){cC=G<<2^-4;cp(H|0,cC|0,2);h[5947]=+eE(H);c[(c[12172]|0)+140>>2]=G;c[(c[12172]|0)+144>>2]=j;cp(H|0,0,0);break}else{uf(-1,145728,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}}H=c[11940]|0;if((H|0)!=0){uu(H)}c[12170]=0;c[12220]=0;c[12222]=0;c[12224]=0;c[11876]=0;H=c[11950]|0;if((c[11884]|0)<1){j=db(H,12,215112)|0;c[11950]=j;c[11884]=1;cF=j}else{cF=H}c[cF>>2]=0;H=c[12172]|0;j=c[11864]|0;if((j|0)>0){G=0;cC=j;while(1){j=H+(G*232&-1)+224|0;F=c[j>>2]|0;if((F|0)==0){cG=cC}else{uu(F);c[j>>2]=0;cG=c[11864]|0}j=G+1|0;if((j|0)<(cG|0)){G=j;cC=cG}else{break}}}c[11864]=0;cC=c[11862]|0;if((cC|0)==0){c[12204]=c[12200];c[12208]=0;G=c[12172]|0;do{if((c[11880]|0)<1){H=db(G,232,216568)|0;j=H;c[12172]=j;if((H|0)==0){c[11880]=0;uf(c[13898]|0,216112,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else{c[11880]=1;cH=c[11864]|0;cI=j;break}}else{cH=0;cI=G}}while(0);uD(cI+(cH*232&-1)|0,48440,232);G=(c[11864]|0)+1|0;c[11864]=G;cJ=G;cK=cI}else{c[12204]=c[12202];c[12208]=c[12206];G=c[12172]|0;do{if((cC|0)>(c[11880]|0)){j=db(G,cC*232&-1,216568)|0;H=j;c[12172]=H;if((j|0)==0){c[11880]=0;uf(c[13898]|0,216112,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else{c[11880]=cC;cL=c[11864]|0;cM=H;break}}else{cL=0;cM=G}}while(0);if((cC|0)>0){G=0;H=cL;while(1){uD(cM+(H*232&-1)|0,48440,232);j=(c[11864]|0)+1|0;c[11864]=j;F=G+1|0;if((F|0)<(cC|0)){G=F;H=j}else{cN=j;break}}}else{cN=cL}uD(cM|0,c[12168]|0,cN*232&-1);cJ=c[11864]|0;cK=c[12172]|0}if((cJ|0)>0){H=0;G=cJ;while(1){cC=cK+(H*232&-1)+224|0;j=c[cC>>2]|0;if((j|0)==0){cO=G}else{uu(j);c[cC>>2]=0;cO=c[11864]|0}cC=H+1|0;if((cC|0)<(cO|0)){H=cC;G=cO}else{break}}}c[11864]=0;G=0;H=0;cC=0;j=0;F=0;aq=0;L5319:while(1){cB=cC;aH=j;cq=F;bQ=aq;L5321:while(1){cP=cB;while(1){bz=eV()|0;if((bz|0)==0){ay=3886;break L5321}else{cQ=bz}while(1){if((aM(d[cQ]|0|0)|0)==0){break}else{cQ=cQ+1|0}}cR=a[cQ]|0;if(cR<<24>>24!=0){if((a8(c[11948]|0,cR<<24>>24|0)|0)==0){break}}if((cP|0)==0){cP=0}else{ay=3891;break L5321}}if(a[34104]|0){if((cR<<24>>24|0)==101|(cR<<24>>24|0)==69){ay=3894;break}}cS=eX(cQ)|0;if((cS|0)==0){ay=3911;break}if(!((cq|0)==0|(cS|0)==(cq|0))){ay=3897;break L5319}cT=bQ+1|0;if((cT|0)>(aH|0)){ax=aH<<1;bz=(ax|0)>1?ax:1;cU=db(cP,aa(bz<<2,cS),145264)|0;cV=bz}else{cU=cP;cV=aH}if((cS|0)>0){cW=H;cX=G;cY=0;ay=3903;break}else{cB=cU;aH=cV;cq=cS;bQ=cT}}if((ay|0)==3886){ay=0;a[47736]=1;ay=3911}else if((ay|0)==3891){ay=0;c[11940]=cP}else if((ay|0)==3894){ay=0;a[47736]=1;ay=3911}else if((ay|0)==3903){while(1){ay=0;aH=c[11952]|0;do{if((cY|0)<(c[10806]|0)){if((c[aH+(cY*24&-1)+8>>2]|0)==1){ay=3906;break}g[cU+(cX<<2)>>2]=0.0}else{ay=3906}}while(0);if((ay|0)==3906){ay=0;g[cU+(cX<<2)>>2]=+h[aH+(cY*24&-1)>>3]}cB=cX+1|0;do{if((c[(c[11952]|0)+(cY*24&-1)+8>>2]|0)==1){cZ=cW}else{bz=cW+1|0;if((cW|0)!=0){cZ=bz;break}uh(-1,145016,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);cZ=bz}}while(0);aH=cY+1|0;if((aH|0)<(cS|0)){cW=cZ;cX=cB;cY=aH;ay=3903}else{break}}G=cS+G|0;H=cZ;cC=cU;j=cV;F=cS;aq=cT;continue}if((ay|0)==3911){ay=0;c[11940]=cP;if((cP|0)==0){ay=3919;break}}aH=c[11864]|0;if((a[47464]&1)==0){c_=cq;c$=bQ}else{c_=cq-1|0;c$=bQ-1|0}bz=aH+1|0;ax=c[12172]|0;if((bz|0)>(c[11880]|0)){bq=db(ax,bz*232&-1,216568)|0;ba=bq;c[12172]=ba;if((bq|0)==0){ay=3916;break}c[11880]=bz;c0=c[11864]|0;c1=c[11940]|0;c2=ba}else{c0=aH;c1=cP;c2=ax}uD(c2+(c0*232&-1)|0,48440,232);c[11864]=(c[11864]|0)+1;c[c2+(aH*232&-1)+224>>2]=c1;c[11940]=0;c[(c[12172]|0)+(aH*232&-1)+140>>2]=c_;c[(c[12172]|0)+(aH*232&-1)+144>>2]=c$;c[(c[12172]|0)+(aH*232&-1)+148>>2]=0;c[12208]=0;G=0;H=0;cC=0;j=0;F=0;aq=0}if((ay|0)==3897){if((cP|0)==0){uf(-1,145560,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}uu(cP);uf(-1,145560,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==3916){c[11880]=0;uf(c[13898]|0,216112,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==3919){a[47736]=0;break}}}while(0);cP=a[47856]|0;c$=a[47544]|0;do{if((cP&1)==0){if((c$&1)!=0){ay=3922;break}a[47392]=0}else{ay=3922}}while(0);L5379:do{if((ay|0)==3922){a[47392]=1;c_=E;c1=(c$&1)==0;if((c$&cP&1)!=0){a[47464]=1}c2=c[13898]|0;c0=c[8272]|0;L5384:do{if((c2|0)<(c0|0)){cT=c[1054]|0;cS=c2;while(1){L5388:do{if((a[cT+(cS*40&-1)|0]&1)!=0){cV=c[cT+(cS*40&-1)+36>>2]|0;cU=cT+(cS*40&-1)+32|0;cZ=c[10036]|0;cY=0;while(1){if((cY|0)>=(cV|0)){ay=3930;break}if((a[cZ+((c[cU>>2]|0)+cY|0)|0]|0)==(a[cY+103664|0]|0)){cY=cY+1|0}else{break}}if((ay|0)==3930){ay=0;if((cY|0)==1){c3=cS;break L5384}}if((cV|0)<=0){break}cX=0;cW=0;cQ=c[cU>>2]|0;while(1){if((a[cX+196448|0]|0)==(a[cZ+(cX+cQ|0)|0]|0)){c4=cQ;c5=cW}else{if((cX|0)!=1){break L5388}c4=cQ-1|0;c5=1}cR=cX+1|0;if((cR|0)<(c5+cV|0)){cX=cR;cW=c5;cQ=c4}else{break}}if((c5|0)!=0){c3=cS;break L5384}if((cX|0)==0|(cX|0)==4){c3=cS;break L5384}}}while(0);cB=cS+1|0;c[13898]=cB;if((cB|0)<(c0|0)){cS=cB}else{c3=cB;break}}}else{c3=c2}}while(0);L5407:do{if((c3|0)<(c0|0)){cS=c[1054]|0;L5409:do{if((a[cS+(c3*40&-1)|0]&1)==0){c6=c[10036]|0}else{cT=c[cS+(c3*40&-1)+36>>2]|0;bQ=cS+(c3*40&-1)+32|0;cq=c[10036]|0;cB=0;while(1){if((cB|0)>=(cT|0)){break}if((a[cq+((c[bQ>>2]|0)+cB|0)|0]|0)==(a[cB+103664|0]|0)){cB=cB+1|0}else{c6=cq;break L5409}}if((cB|0)==1){c7=1;break L5407}else{c6=cq}}}while(0);bQ=c3+1|0;c[13898]=bQ;cT=c[cS+(bQ*40&-1)+36>>2]|0;cQ=c[cS+(bQ*40&-1)+32>>2]|0;cW=(a[cS+(bQ*40&-1)|0]&1)==0;bQ=(cT|0)>0;cV=30672;cZ=116448;L5417:while(1){L5419:do{if(!cW){if(bQ){cU=0;cY=0;cR=cQ;while(1){cO=a[cZ+cU|0]|0;if(cO<<24>>24==(a[c6+(cU+cR|0)|0]|0)){c8=cR;c9=cY}else{if(cO<<24>>24!=36){break L5419}c8=cR-1|0;c9=1}da=cU+1|0;if((da|0)<(c9+cT|0)){cU=da;cY=c9;cR=c8}else{break}}if((c9|0)==0){dc=da}else{dd=cV;break L5417}}else{dc=0}cR=a[cZ+dc|0]|0;if((cR<<24>>24|0)==36|(cR<<24>>24|0)==0){dd=cV;break L5417}}}while(0);cq=cV+8|0;cB=c[cq>>2]|0;if((cB|0)==0){dd=cq;break}else{cV=cq;cZ=cB}}cZ=c[dd+4>>2]|0;cV=c3+2|0;c[13898]=cV;if((cZ|0)!=-1){c7=cZ;break}uf(cV,143640,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else{c7=1}}while(0);c[13898]=c2;c0=0;while(1){if(c0>>>0>=31){break}if((c[48912+(c0<<3)>>2]|0)==(c7|0)){break}else{c0=c0+1|0}}if((c0|0)==31){uf(c2,148528,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}do{if(!c1){if((c[11876]|0)>3){uf(-1,148288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else{eQ(3);break}}}while(0);do{if((c[11870]|0)==0){if((a[47544]&1)!=0){c1=b[48918+(c0<<3)>>1]|0;if((c1<<16>>16|0)==2){if((b[48916+(c0<<3)>>1]|0)==1){c[11870]=3;break}else{uf(-1,147704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}}else if((c1<<16>>16|0)==1){if((b[48916+(c0<<3)>>1]|0)!=1){uf(-1,147704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}if((c[11856]|0)==2){c[11870]=3;break}else{c[11870]=2;c[265]=3;break}}else{uf(-1,147704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}}c1=b[48916+(c0<<3)>>1]|0;cV=c1<<16>>16;if(c1<<16>>16==0){uf(c2,148528,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}do{if((c[11864]|0)==0){ay=3976}else{if((a[(c[12172]|0)+124|0]&1)==0){ay=3976;break}if((b[48918+(c0<<3)>>1]|0)!=0){de=cV;break}uf(c2,148080,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}}while(0);do{if((ay|0)==3976){c1=(b[48918+(c0<<3)>>1]|0)+cV|0;if((c[11856]|0)!=2){de=c1;break}de=c1+1|0}}while(0);if((de|0)<8){c[11870]=de;eQ(de);break}else{uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=147920,v)|0);return 0}}}while(0);c2=c[11864]|0;if((c2|0)==0){break}cV=c[12172]|0;if((a[cV+124|0]&1)==0){break}if((a[47544]&1)!=0){break}uD(c_|0,1048,84);if((c[cV>>2]|0)==0){if((c[cV+140>>2]|0)==0){df=0}else{ay=3994}}else{ay=3994}do{if((ay|0)==3994){if((c[cV+4>>2]|0)==0){if((c[cV+144>>2]|0)==0){df=1;break}}if((c[cV+8>>2]|0)==0){if((c[cV+148>>2]|0)==0){df=2;break}}df=3}}while(0);c1=c[11870]|0;cZ=c1+df|0;if((cZ|0)>6){uf(-1,146856,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}uD(1048+(df*12&-1)|0,c_|0,c1*12&-1);if((df|0)!=0){c1=0;do{c[1048+(c1*12&-1)>>2]=c[cV+112+(c1<<2)>>2];c[1056+(c1*12&-1)>>2]=0;c1=c1+1|0;}while((c1|0)<(df|0))}c[11870]=cZ;if(!((c[11856]|0)==2&(c2|0)>0)){break}c1=48918+(c0<<3)|0;c_=0;cT=cZ;L5502:while(1){do{if((c[cV+(c_*232&-1)+8>>2]|0)==0){if((c[cV+(c_*232&-1)+148>>2]|0)!=0){dg=cT;break}cQ=b[c1>>1]|0;if(cQ<<16>>16>2){ay=4004;break L5502}do{if((c[cV+(c_*232&-1)+4>>2]|0)==0){if((c[cV+(c_*232&-1)+144>>2]|0)!=0){dh=cT;break}if(cQ<<16>>16>1){ay=4008;break L5502}if((cT|0)>6){ay=4011;break L5502}if((cT|0)>1){bQ=cT;while(1){cW=bQ-1|0;cS=1048+(bQ*12&-1)|0;cB=1048+(cW*12&-1)|0;c[cS>>2]=c[cB>>2];c[cS+4>>2]=c[cB+4>>2];c[cS+8>>2]=c[cB+8>>2];if((cW|0)>1){bQ=cW}else{break}}}c[265]=-4;c[267]=0;bQ=cT+1|0;c[11870]=bQ;dh=bQ}else{dh=cT}}while(0);if((dh|0)>6){ay=4016;break L5502}if((dh|0)>2){cQ=dh;while(1){bQ=cQ-1|0;cW=1048+(cQ*12&-1)|0;cB=1048+(bQ*12&-1)|0;c[cW>>2]=c[cB>>2];c[cW+4>>2]=c[cB+4>>2];c[cW+8>>2]=c[cB+8>>2];if((bQ|0)>2){cQ=bQ}else{break}}}c[268]=-5;c[270]=0;cQ=dh+1|0;c[11870]=cQ;dg=cQ}else{dg=cT}}while(0);cQ=c_+1|0;if((cQ|0)<(c2|0)){c_=cQ;cT=dg}else{break L5379}}if((ay|0)==4004){uf(-1,147376,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==4008){uf(-1,147096,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==4011){uf(-1,146856,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((ay|0)==4016){uf(-1,146856,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}}}while(0);do{if((a[47544]&1)==0){if((c[11864]|0)!=1){di=0;break}ay=c[12172]|0;if((c[ay+4>>2]|0)>0){di=1;break}di=(c[ay+144>>2]|0)>0&1}else{di=1}}while(0);a[47584]=di;cD=c[11870]|0;i=k;return cD|0}function ez(){var b=0,d=0,e=0;b=i;c[11874]=0;if((c[12892]|0)==0){i=b;return}d=c[60]|0;if((d|0)!=0){e1(d);c[60]=0}d=c[264]|0;if((d|0)!=0){e1(d);c[264]=0}d=c[267]|0;if((d|0)!=0){e1(d);c[267]=0}d=c[270]|0;if((d|0)!=0){e1(d);c[270]=0}d=c[273]|0;if((d|0)!=0){e1(d);c[273]=0}d=c[276]|0;if((d|0)!=0){e1(d);c[276]=0}d=c[279]|0;if((d|0)!=0){e1(d);c[279]=0}d=c[282]|0;if((d|0)!=0){e1(d);c[282]=0}if((a[47584]&1)!=0&(c[11864]|0)>0){d=0;do{uu(c[(c[12172]|0)+(d*232&-1)+224>>2]|0);c[(c[12172]|0)+(d*232&-1)+224>>2]=0;d=d+1|0;}while((d|0)<(c[11864]|0))}do{if(!(a[34104]|0)){d=c[12894]|0;if((d|0)==(aR(c[12892]|0)|0)){cs(c[12892]|0);d=c[m>>2]|0;e=c[12894]|0;cf(d|0,77344,(v=i,i=i+8|0,c[v>>2]=e,v)|0);break}e=c[12892]|0;if(a[47440]|0){a2(e|0);a[47440]=0;break}else{az(e|0);break}}}while(0);a[34104]=0;c[12892]=0;i=b;return}function eA(){var a=0;c[11870]=0;c[262]=1;c[263]=0;a=c[264]|0;if((a|0)!=0){e1(a);c[264]=0}c[12210]=99;c[265]=2;c[266]=0;a=c[267]|0;if((a|0)!=0){e1(a);c[267]=0}c[12211]=99;c[268]=3;c[269]=0;a=c[270]|0;if((a|0)!=0){e1(a);c[270]=0}c[12212]=99;c[271]=4;c[272]=0;a=c[273]|0;if((a|0)!=0){e1(a);c[273]=0}c[12213]=99;c[274]=5;c[275]=0;a=c[276]|0;if((a|0)!=0){e1(a);c[276]=0}c[12214]=99;c[277]=6;c[278]=0;a=c[279]|0;if((a|0)!=0){e1(a);c[279]=0}c[12215]=99;c[280]=7;c[281]=0;a=c[282]|0;if((a|0)==0){c[12216]=99;return}e1(a);c[282]=0;c[12216]=99;return}function eB(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0,aA=0,aB=0,aC=0,aD=0,aE=0,aF=0,aG=0,aH=0,aI=0,aJ=0,aK=0,aL=0,aM=0,aN=0,aO=0,aP=0,aQ=0,aR=0,aS=0,aT=0,aU=0,aV=0,aW=0,aX=0,aZ=0,a_=0,a$=0,a0=0,a1=0,a2=0,a3=0,a4=0,a5=0,a6=0,a7=0;e=i;i=i+56|0;f=e|0;g=e+24|0;j=e+48|0;k=j;l=i;i=i+47|0;i=i+7>>3<<3;m=c[12202]|0;if((m|0)>-1){c[12204]=m}m=c[13898]|0;n=c[1054]|0;o=n+(m*40&-1)+36|0;p=c[o>>2]|0;q=n+(m*40&-1)+32|0;r=c[q>>2]|0;s=n+(m*40&-1)|0;L5605:do{if((a[s]&1)==0){t=0;u=4113}else{if((p|0)>0){w=c[10036]|0;x=0;y=0;z=r;while(1){if((a[x+179688|0]|0)==(a[w+(x+z|0)|0]|0)){A=z;B=y}else{if((x|0)!=4){t=0;u=4113;break L5605}A=z-1|0;B=1}C=x+1|0;if((C|0)<(B+p|0)){x=C;y=B;z=A}else{break}}if((B|0)!=0|(C|0)==4){u=4117;break}else{D=C}}else{D=0}t=(D|0)==9;u=4113}}while(0);if((u|0)==4113){if(t|(c[12204]|0)>-1){u=4117}else{E=m}}if((u|0)==4117){c[j>>2]=0;c[j+4>>2]=0;if(b){uf(m,138160,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}a[47544]=0;j=c[o>>2]|0;L5624:do{if((a[s]&1)!=0&(j|0)>0){o=c[10036]|0;t=0;D=0;C=c[q>>2]|0;while(1){if((a[t+179688|0]|0)==(a[o+(t+C|0)|0]|0)){F=C;G=D}else{if((t|0)!=4){break L5624}F=C-1|0;G=1}B=t+1|0;if((B|0)<(G+j|0)){t=B;D=G;C=F}else{break}}if((G|0)==0){if(!((t|0)==3|(t|0)==8)){break}}C=m+1|0;c[13898]=C;if((c[8272]|0)<=(C|0)){H=c[10880]|0;uf(C,H,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((a[n+(C*40&-1)|0]&1)==0){H=c[10880]|0;uf(C,H,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}D=c[n+(C*40&-1)+36>>2]|0;o=n+(C*40&-1)+32|0;B=c[10036]|0;A=0;while(1){if((A|0)>=(D|0)){break}if((a[B+((c[o>>2]|0)+A|0)|0]|0)==(a[A+115e3|0]|0)){A=A+1|0}else{u=4519;break}}if((u|0)==4519){H=c[10880]|0;uf(C,H,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((A|0)!=1){H=c[10880]|0;uf(C,H,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}o=m+2|0;c[13898]=o;D=c[n+(o*40&-1)+36>>2]|0;uD(k|0,B+(c[n+(o*40&-1)+32>>2]|0)|0,(D|0)<7?D:7);a[k+((D|0)>7?7:D)|0]=0;D=0;while(1){t=c[48696+(D<<3)>>2]|0;if((t|0)==0){break}if((uK(k|0,t|0)|0)==0){u=4137;break}else{D=D+1|0}}if((u|0)==4137){c[14150]=c[48700+(D<<3)>>2];c[12204]=D}if((c[12204]|0)==(D|0)){c[13898]=m+3;break}else{uf(o,178808,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);if((c[11856]|0)!=0){do{if((aY(201e3,c[48696+(c[12204]<<3)>>2]|0)|0)==0){m=bh(c[11932]|0,46)|0;k=m+1|0;do{if((m|0)!=0){n=c[12174]|0;if((n|0)==0){break}else{I=0;J=n}do{if((uK(k|0,J|0)|0)==0){c[14150]=c[48700+(I<<3)>>2]}I=I+1|0;J=c[48696+(I<<3)>>2]|0;}while((J|0)!=0)}}while(0);if((c[14150]|0)!=64){break}uf(-1,178808,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);cS[c[14150]&511]()}if((c[11864]|0)>0){J=0;do{I=c[12172]|0;if((c[I+(J*232&-1)+140>>2]|0)==(c[12145]|0)){K=I}else{c[I+(J*232&-1)>>2]=0;c[(c[12172]|0)+(J*232&-1)+4>>2]=0;c[(c[12172]|0)+(J*232&-1)+8>>2]=0;K=c[12172]|0}do{if(+h[K+(J*232&-1)+168>>3]!=0.0){if((c[K+(J*232&-1)+112>>2]|0)==-3){h[K+(J*232&-1)+24>>3]=0.0}if((c[K+(J*232&-1)+116>>2]|0)==-3){h[K+(J*232&-1)+32>>3]=0.0}if((c[K+(J*232&-1)+120>>2]|0)!=-3){break}h[K+(J*232&-1)+40>>3]=0.0}}while(0);do{if(+h[K+(J*232&-1)+176>>3]!=0.0){if((c[K+(J*232&-1)+112>>2]|0)==-4){h[K+(J*232&-1)+24>>3]=0.0}if((c[K+(J*232&-1)+116>>2]|0)==-4){h[K+(J*232&-1)+32>>3]=0.0}if((c[K+(J*232&-1)+120>>2]|0)!=-4){break}h[K+(J*232&-1)+40>>3]=0.0}}while(0);do{if(+h[K+(J*232&-1)+184>>3]!=0.0){if((c[K+(J*232&-1)+112>>2]|0)==-5){h[K+(J*232&-1)+24>>3]=0.0}if((c[K+(J*232&-1)+116>>2]|0)==-5){h[K+(J*232&-1)+32>>3]=0.0}if((c[K+(J*232&-1)+120>>2]|0)!=-5){break}h[K+(J*232&-1)+40>>3]=0.0}}while(0);if((c[K+(J*232&-1)+192>>2]|0)!=0){c[K+(J*232&-1)+48>>2]=0}J=J+1|0;}while((J|0)<(c[11864]|0))}E=c[13898]|0}J=c[8272]|0;L5717:do{if((E|0)<(J|0)){K=l|0;I=f|0;k=f+8|0;m=g|0;o=g+8|0;D=0;n=0;H=0;G=0;F=0;j=0;q=0;s=0;B=0;C=0;A=0;t=0;p=0;r=0;z=0;y=0;x=E;w=J;L5719:while(1){L=c[1054]|0;M=(a[L+(x*40&-1)|0]&1)==0;N=c[L+(x*40&-1)+36>>2]|0;O=L+(x*40&-1)+32|0;L5721:do{if(M){uD(K|0,31040,47);P=c[O>>2]|0;u=4193}else{Q=c[10036]|0;R=0;while(1){if((R|0)>=(N|0)){u=4166;break}if((a[Q+((c[O>>2]|0)+R|0)|0]|0)==(a[R+103664|0]|0)){R=R+1|0}else{break}}if((u|0)==4166){u=0;if((R|0)==1){S=y;break L5717}}uD(K|0,31040,47);Q=c[O>>2]|0;if(!((N|0)>0&(M^1))){P=Q;u=4193;break}T=c[10036]|0;U=0;V=0;W=Q;while(1){if((a[U+178256|0]|0)==(a[T+(U+W|0)|0]|0)){X=W;Y=V}else{if((U|0)!=3){break}X=W-1|0;Y=1}Z=U+1|0;if((Z|0)<(Y+N|0)){U=Z;V=Y;W=X}else{u=4173;break}}do{if((u|0)==4173){u=0;if((Y|0)==0){if(!((U|0)==2|(U|0)==6)){break}}if(r){u=4538;break L5719}_=x+1|0;c[13898]=_;if(b){u=4177;break L5719}a[47544]=0;eS();$=y;aa=z;ab=1;ac=p;ad=t;ae=A;af=C;ag=B;ah=s;ai=q;aj=j;ak=F;al=G;am=H;an=n;ao=D;break L5721}}while(0);if(!((N|0)>0&(M^1))){P=Q;u=4193;break}U=c[10036]|0;W=0;V=0;T=Q;while(1){if((a[W+177976|0]|0)==(a[U+(W+T|0)|0]|0)){ap=T;aq=V}else{if((W|0)!=3){P=Q;u=4193;break L5721}ap=T-1|0;aq=1}R=W+1|0;if((R|0)<(aq+N|0)){W=R;V=aq;T=ap}else{break}}if((aq|0)==0){if(!((W|0)==2|(W|0)==5)){P=Q;u=4193;break}}if(H){u=4544;break L5719}ar=x+1|0;c[13898]=ar;if(b){u=4190;break L5719}a[47544]=0;eS();if((c[11864]|0)>0){as=0}else{$=y;aa=z;ab=r;ac=p;ad=t;ae=A;af=C;ag=B;ah=s;ai=q;aj=j;ak=F;al=G;am=1;an=n;ao=D;break}while(1){a[(c[12172]|0)+(as*232&-1)+124|0]=1;T=as+1|0;if((T|0)<(c[11864]|0)){as=T}else{$=y;aa=z;ab=r;ac=p;ad=t;ae=A;af=C;ag=B;ah=s;ai=q;aj=j;ak=F;al=G;am=1;an=n;ao=D;break}}}}while(0);L5760:do{if((u|0)==4193){u=0;O=(w|0)>(x|0);L5762:do{if(O){if(M){S=y;break L5717}Q=c[10036]|0;W=0;while(1){if((W|0)>=(N|0)){u=4198;break}if((a[Q+(P+W|0)|0]|0)==(a[W+177688|0]|0)){W=W+1|0}else{u=4199;break}}if((u|0)==4198){u=0;if((W|0)!=2){u=4199}}do{if((u|0)==4199){u=0;if(!O){break L5762}if(M){S=y;break L5717}Q=c[10036]|0;T=0;while(1){if((T|0)>=(N|0)){u=4204;break}if((a[Q+(P+T|0)|0]|0)==(a[T+177448|0]|0)){T=T+1|0}else{break}}if((u|0)==4204){u=0;if((T|0)==2){break}}if(!O){break L5762}if(M){S=y;break L5717}Q=c[10036]|0;V=0;while(1){if((V|0)>=(N|0)){u=4218;break}if((a[Q+(P+V|0)|0]|0)==(a[V+176840|0]|0)){V=V+1|0}else{u=4219;break}}if((u|0)==4218){u=0;if((V|0)!=2){u=4219}}do{if((u|0)==4219){u=0;if(!O){break L5762}if(M){S=y;break L5717}Q=c[10036]|0;T=0;while(1){if((T|0)>=(N|0)){u=4224;break}if((a[Q+(P+T|0)|0]|0)==(a[T+176376|0]|0)){T=T+1|0}else{break}}if((u|0)==4224){u=0;if((T|0)==2){break}}if(!O){break L5762}if(M){S=y;break L5717}Q=c[10036]|0;U=0;while(1){if((U|0)>=(N|0)){u=4236;break}if((a[Q+(P+U|0)|0]|0)==(a[U+175576|0]|0)){U=U+1|0}else{break}}if((u|0)==4236){u=0;if((U|0)==2){u=4237;break L5719}}if(!O){break L5762}if(M){S=y;break L5717}Q=c[10036]|0;T=0;while(1){if((T|0)>=(N|0)){u=4243;break}if((a[Q+(P+T|0)|0]|0)==(a[T+174728|0]|0)){T=T+1|0}else{break}}do{if((u|0)==4243){u=0;if((T|0)!=5){break}if(t){u=4537;break L5719}U=x+1|0;c[13898]=U;L5814:do{if((w|0)>(U|0)){if((a[L+(U*40&-1)|0]&1)==0){break}R=c[L+(U*40&-1)+36>>2]|0;Z=L+(U*40&-1)+32|0;at=0;while(1){if((at|0)>=(R|0)){break}if((a[Q+((c[Z>>2]|0)+at|0)|0]|0)==(a[at+115e3|0]|0)){at=at+1|0}else{break L5814}}if((at|0)!=1){break}eT(1,0);$=y;aa=z;ab=r;ac=p;ad=1;ae=A;af=C;ag=B;ah=s;ai=q;aj=j;ak=F;al=G;am=H;an=n;ao=D;break L5760}}while(0);if((c[11864]|0)>0){au=0}else{$=y;aa=z;ab=r;ac=p;ad=1;ae=A;af=C;ag=B;ah=s;ai=q;aj=j;ak=F;al=G;am=H;an=n;ao=D;break L5760}while(1){c[(c[12172]|0)+(au*232&-1)+12>>2]=-1;U=au+1|0;if((U|0)<(c[11864]|0)){au=U}else{$=y;aa=z;ab=r;ac=p;ad=1;ae=A;af=C;ag=B;ah=s;ai=q;aj=j;ak=F;al=G;am=H;an=n;ao=D;break L5760}}}}while(0);if(!O){break L5762}if(M){S=y;break L5717}Q=c[10036]|0;T=0;while(1){if((T|0)>=(N|0)){u=4259;break}if((a[Q+(P+T|0)|0]|0)==(a[T+174440|0]|0)){T=T+1|0}else{break}}do{if((u|0)==4259){u=0;if((T|0)!=5){break}if(p){u=4549;break L5719}U=c[12172]|0;if(!(H|(U|0)!=0)){u=4262;break L5719}Z=x+1|0;c[13898]=Z;L5836:do{if((w|0)>(Z|0)){if((a[L+(Z*40&-1)|0]&1)==0){break}R=c[L+(Z*40&-1)+36>>2]|0;av=L+(Z*40&-1)+32|0;aw=0;while(1){if((aw|0)>=(R|0)){break}if((a[Q+((c[av>>2]|0)+aw|0)|0]|0)==(a[aw+115e3|0]|0)){aw=aw+1|0}else{break L5836}}if((aw|0)!=1){break}eT(1,1);$=y;aa=z;ab=r;ac=1;ad=t;ae=A;af=C;ag=B;ah=s;ai=q;aj=j;ak=F;al=G;am=H;an=n;ao=D;break L5760}}while(0);if((c[11864]|0)>0){ax=0;ay=U}else{$=y;aa=z;ab=r;ac=1;ad=t;ae=A;af=C;ag=B;ah=s;ai=q;aj=j;ak=F;al=G;am=H;an=n;ao=D;break L5760}while(1){c[ay+(ax*232&-1)+16>>2]=-1;Z=ax+1|0;if((Z|0)>=(c[11864]|0)){$=y;aa=z;ab=r;ac=1;ad=t;ae=A;af=C;ag=B;ah=s;ai=q;aj=j;ak=F;al=G;am=H;an=n;ao=D;break L5760}ax=Z;ay=c[12172]|0}}}while(0);if(!O){break L5762}if(M){S=y;break L5717}Q=c[10036]|0;T=0;while(1){if((T|0)>=(N|0)){u=4278;break}if((a[Q+(P+T|0)|0]|0)==(a[T+173304|0]|0)){T=T+1|0}else{break}}if((u|0)==4278){u=0;if((T|0)==5){u=4279;break L5719}}if(!O){break L5762}if(M){S=y;break L5717}Q=c[10036]|0;U=0;while(1){if((U|0)>=(N|0)){u=4285;break}if((a[Q+(P+U|0)|0]|0)==(a[U+172952|0]|0)){U=U+1|0}else{break}}do{if((u|0)==4285){u=0;if((U|0)!=4){break}if(C){u=4535;break L5719}c[13898]=x+1;eT(2,-1);$=y;aa=z;ab=r;ac=p;ad=t;ae=A;af=1;ag=B;ah=s;ai=q;aj=j;ak=F;al=G;am=H;an=n;ao=D;break L5760}}while(0);if(!O){break L5762}if(M){S=y;break L5717}U=c[10036]|0;Q=0;while(1){if((Q|0)>=(N|0)){u=4293;break}if((a[U+(P+Q|0)|0]|0)==(a[Q+172536|0]|0)){Q=Q+1|0}else{break}}do{if((u|0)==4293){u=0;if((Q|0)!=6){break}if(A){u=4546;break L5719}c[13898]=x+1;eT(2,1);$=y;aa=z;ab=r;ac=p;ad=t;ae=1;af=C;ag=B;ah=s;ai=q;aj=j;ak=F;al=G;am=H;an=n;ao=D;break L5760}}while(0);if(!O){break L5762}if(M){S=y;break L5717}Q=c[10036]|0;U=0;while(1){if((U|0)>=(N|0)){break}if((a[Q+(P+U|0)|0]|0)==(a[U+172256|0]|0)){U=U+1|0}else{break L5762}}if((U|0)!=4){break L5762}if(z){u=4541;break L5719}c[13898]=x+1;eT(3,0);$=y;aa=1;ab=r;ac=p;ad=t;ae=A;af=C;ag=B;ah=s;ai=q;aj=j;ak=F;al=G;am=H;an=n;ao=D;break L5760}}while(0);if(n){u=4536;break L5719}if(!(H|(c[12172]|0)!=0)){u=4227;break L5719}c[13898]=x+1;eT(0,1);if((c[11864]|0)<=0){$=y;aa=z;ab=r;ac=p;ad=t;ae=A;af=C;ag=B;ah=s;ai=q;aj=j;ak=F;al=G;am=H;an=1;ao=D;break L5760}V=c[12172]|0;Q=0;while(1){h[V+(Q*232&-1)+40>>3]=+h[V+(Q*232&-1)+32>>3];T=Q+1|0;if((T|0)<(c[11864]|0)){Q=T}else{$=y;aa=z;ab=r;ac=p;ad=t;ae=A;af=C;ag=B;ah=s;ai=q;aj=j;ak=F;al=G;am=H;an=1;ao=D;break L5760}}}}while(0);if(D){u=4540;break L5719}c[13898]=x+1;eT(0,0);W=c[11864]|0;if(n){az=W}else{if((W|0)<=0){$=y;aa=z;ab=r;ac=p;ad=t;ae=A;af=C;ag=B;ah=s;ai=q;aj=j;ak=F;al=G;am=H;an=0;ao=1;break L5760}W=c[12172]|0;Q=0;while(1){h[W+(Q*232&-1)+32>>3]=+h[W+(Q*232&-1)+24>>3];V=Q+1|0;T=c[11864]|0;if((V|0)<(T|0)){Q=V}else{az=T;break}}}if((az|0)<=0){$=y;aa=z;ab=r;ac=p;ad=t;ae=A;af=C;ag=B;ah=s;ai=q;aj=j;ak=F;al=G;am=H;an=n;ao=1;break L5760}Q=c[12172]|0;W=0;while(1){h[Q+(W*232&-1)+40>>3]=+h[Q+(W*232&-1)+24>>3];T=W+1|0;if((T|0)<(c[11864]|0)){W=T}else{$=y;aa=z;ab=r;ac=p;ad=t;ae=A;af=C;ag=B;ah=s;ai=q;aj=j;ak=F;al=G;am=H;an=n;ao=1;break L5760}}}}while(0);if(!((N|0)>0&(M^1))){S=y;break L5717}O=c[10036]|0;W=0;Q=0;T=P;while(1){if((a[W+171944|0]|0)==(a[O+(W+T|0)|0]|0)){aA=T;aB=Q}else{if((W|0)!=5){break}aA=T-1|0;aB=1}V=W+1|0;if((V|0)<(aB+N|0)){W=V;Q=aB;T=aA}else{u=4310;break}}do{if((u|0)==4310){u=0;if((aB|0)==0){if(!((W|0)==4|(W|0)==9)){break}}if(z){u=4543;break L5719}c[13898]=x+1;if((c[11864]|0)<=0){$=y;aa=1;ab=r;ac=p;ad=t;ae=A;af=C;ag=B;ah=s;ai=q;aj=j;ak=F;al=G;am=H;an=n;ao=D;break L5760}T=c[12172]|0;Q=0;while(1){O=T+(Q*232&-1)+112|0;c[O>>2]=c[12099];c[O+4>>2]=c[48400>>2];c[O+8>>2]=c[48404>>2];O=Q+1|0;if((O|0)<(c[11864]|0)){Q=O}else{$=y;aa=1;ab=r;ac=p;ad=t;ae=A;af=C;ag=B;ah=s;ai=q;aj=j;ak=F;al=G;am=H;an=n;ao=D;break L5760}}}}while(0);if(M){S=y;break L5717}L5921:do{if((N|0)>0){W=c[10036]|0;Q=0;T=0;O=P;while(1){if((a[Q+171624|0]|0)==(a[W+(Q+O|0)|0]|0)){aC=O;aD=T}else{if((Q|0)!=4){break L5921}aC=O-1|0;aD=1}V=Q+1|0;if((V|0)<(aD+N|0)){Q=V;T=aD;O=aC}else{break}}if((aD|0)==0){if(!((Q|0)==3|(Q|0)==6)){break}}if(G){u=4326;break L5719}if(F){u=4548;break L5719}c[13898]=x+1;eT(4,c[11856]|0);$=y;aa=z;ab=r;ac=p;ad=t;ae=A;af=C;ag=B;ah=s;ai=q;aj=j;ak=1;al=0;am=H;an=n;ao=D;break L5760}}while(0);if(!((N|0)>0&(M^1))){S=y;break L5717}O=c[10036]|0;T=0;W=0;V=P;while(1){if((a[T+185064|0]|0)==(a[O+(T+V|0)|0]|0)){aE=V;aF=W}else{if((T|0)!=3){break}aE=V-1|0;aF=1}Z=T+1|0;if((Z|0)<(aF+N|0)){T=Z;W=aF;V=aE}else{u=4335;break}}do{if((u|0)==4335){u=0;if((aF|0)==0){if(!((T|0)==2|(T|0)==6)){break}}if(F){u=4338;break L5719}if(G){u=4539;break L5719}c[13898]=x+1;eT(5,c[11856]|0);$=y;aa=z;ab=r;ac=p;ad=t;ae=A;af=C;ag=B;ah=s;ai=q;aj=j;ak=0;al=1;am=H;an=n;ao=D;break L5760}}while(0);if(M){S=y;break L5717}L5952:do{if((N|0)>0){T=c[10036]|0;V=0;W=0;O=P;while(1){if((a[V+170712|0]|0)==(a[T+(V+O|0)|0]|0)){aG=O;aH=W}else{if((V|0)!=3){u=4350;break L5952}aG=O-1|0;aH=1}Z=V+1|0;if((Z|0)<(aH+N|0)){V=Z;W=aH;O=aG}else{break}}if((aH|0)!=0){break}if(!((V|0)==2|(V|0)==8)){u=4350}}else{u=4350}}while(0);do{if((u|0)==4350){u=0;if(!((N|0)>0&(M^1))){S=y;break L5717}O=c[10036]|0;W=0;T=0;Q=P;while(1){if((a[W+90456|0]|0)==(a[O+(W+Q|0)|0]|0)){aI=Q;aJ=T}else{if((W|0)!=3){break}aI=Q-1|0;aJ=1}Z=W+1|0;if((Z|0)<(aJ+N|0)){W=Z;T=aJ;Q=aI}else{u=4356;break}}if((u|0)==4356){u=0;if((aJ|0)!=0){break}if((W|0)==2|(W|0)==6){break}}if(M){S=y;break L5717}L5976:do{if((N|0)>0){Q=c[10036]|0;T=0;O=0;V=P;while(1){if((a[T+170128|0]|0)==(a[Q+(T+V|0)|0]|0)){aK=V;aL=O}else{if((T|0)!=4){break L5976}aK=V-1|0;aL=1}Z=T+1|0;if((Z|0)<(aL+N|0)){T=Z;O=aL;V=aK}else{break}}if((aL|0)==0){if(!((T|0)==3|(T|0)==13)){break}}if((c[11856]|0)==1){u=4370;break L5719}if(B){u=4545;break L5719}c[13898]=x+1;eT(7,0);$=y;aa=z;ab=r;ac=p;ad=t;ae=A;af=C;ag=1;ah=s;ai=q;aj=j;ak=F;al=G;am=H;an=n;ao=D;break L5760}}while(0);if(!((N|0)>0&(M^1))){S=y;break L5717}W=c[10036]|0;V=0;while(1){if((a[V+169288|0]|0)!=(a[W+(V+P|0)|0]|0)){break}aM=V+1|0;if((aM|0)<(N|0)){V=aM}else{u=4377;break}}do{if((u|0)==4377){u=0;if((aM|0)!=4){break}if(j){u=4550;break L5719}c[13898]=x+1;eT(8,0);$=y;aa=z;ab=r;ac=p;ad=t;ae=A;af=C;ag=B;ah=s;ai=q;aj=1;ak=F;al=G;am=H;an=n;ao=D;break L5760}}while(0);if(M){S=y;break L5717}L6001:do{if((N|0)>0){V=c[10036]|0;W=0;O=0;Q=P;while(1){if((a[W+168800|0]|0)==(a[V+(W+Q|0)|0]|0)){aN=Q;aO=O}else{if((W|0)!=3){break L6001}aN=Q-1|0;aO=1}Z=W+1|0;if((Z|0)<(aO+N|0)){W=Z;O=aO;Q=aN}else{break}}if((aO|0)==0){if(!((W|0)==2|(W|0)==6)){break}}if(q){u=4551;break L5719}aP=x+1|0;c[13898]=aP;if((w|0)<=(aP|0)){u=4515;break L5719}if((a[L+(aP*40&-1)|0]&1)==0){u=4516;break L5719}Q=c[L+(aP*40&-1)+36>>2]|0;O=L+(aP*40&-1)+32|0;V=c[10036]|0;T=0;while(1){if((T|0)>=(Q|0)){break}if((a[V+((c[O>>2]|0)+T|0)|0]|0)==(a[T+115e3|0]|0)){T=T+1|0}else{u=4513;break L5719}}if((T|0)!=1){u=4514;break L5719}aQ=x+2|0;c[13898]=aQ;O=c[L+(aQ*40&-1)+36>>2]|0;Q=c[L+(aQ*40&-1)+32>>2]|0;W=(a[L+(aQ*40&-1)|0]&1)==0;L6021:do{if((O|0)>0&(W^1)){Z=0;av=0;R=Q;while(1){if((a[Z+184456|0]|0)==(a[V+(Z+R|0)|0]|0)){aR=R;aS=av}else{if((Z|0)!=3){u=4405;break L6021}aR=R-1|0;aS=1}at=Z+1|0;if((at|0)<(aS+O|0)){Z=at;av=aS;R=aR}else{break}}if((aS|0)==0){if(!((Z|0)==2|(Z|0)==7)){u=4405;break}}c[12208]=0}else{u=4405}}while(0);L6032:do{if((u|0)==4405){u=0;T=(w|0)>(aQ|0);L6034:do{if(T){if(W){u=4521;break L5719}else{aT=0}while(1){if((aT|0)>=(O|0)){u=4409;break}if((a[V+(Q+aT|0)|0]|0)==(a[aT+167960|0]|0)){aT=aT+1|0}else{u=4410;break}}if((u|0)==4409){u=0;if((aT|0)!=4){u=4410}}if((u|0)==4410){u=0;if(!T){break}if(W){u=4522;break L5719}else{aU=0}while(1){if((aU|0)>=(O|0)){break}if((a[V+(Q+aU|0)|0]|0)==(a[aU+167400|0]|0)){aU=aU+1|0}else{break L6034}}if((aU|0)!=4){break}}c[12208]=c[12208]&3^3;break L6032}}while(0);L6050:do{if((O|0)>0&(W^1)){Z=0;R=0;av=Q;while(1){if((a[Z+167056|0]|0)==(a[V+(Z+av|0)|0]|0)){aV=av;aW=R}else{if((Z|0)!=3){break L6050}aV=av-1|0;aW=1}U=Z+1|0;if((U|0)<(aW+O|0)){Z=U;R=aW;av=aV}else{break}}if((aW|0)==0){if(!((Z|0)==2|(Z|0)==6)){break}}c[12208]=0;break L6032}}while(0);L6062:do{if(T){if(W){u=4523;break L5719}else{aX=0}while(1){if((aX|0)>=(O|0)){break}if((a[V+(Q+aX|0)|0]|0)==(a[aX+172296|0]|0)){aX=aX+1|0}else{break L6062}}if((aX|0)!=3){break}c[12208]=3;break L6032}}while(0);L6070:do{if((O|0)>0&(W^1)){Z=0;av=0;R=Q;while(1){if((a[Z+166640|0]|0)==(a[V+(Z+R|0)|0]|0)){aZ=R;a_=av}else{if((Z|0)!=3){u=4437;break L6070}aZ=R-1|0;a_=1}U=Z+1|0;if((U|0)<(a_+O|0)){Z=U;av=a_;R=aZ}else{break}}if((a_|0)!=0){break}if(!((Z|0)==2|(Z|0)==6)){u=4437}}else{u=4437}}while(0);if((u|0)==4437){u=0;if(W|T^1){u=4524;break L5719}else{a$=0}while(1){if((a$|0)>=(O|0)){break}if((a[V+(Q+a$|0)|0]|0)==(a[a$+166368|0]|0)){a$=a$+1|0}else{u=4525;break L5719}}if((a$|0)!=3){u=4526;break L5719}}c[12208]=1}}while(0);c[13898]=x+3;$=y;aa=z;ab=r;ac=p;ad=t;ae=A;af=C;ag=B;ah=s;ai=1;aj=j;ak=F;al=G;am=H;an=n;ao=D;break L5760}}while(0);if(!((N|0)>0&(M^1))){S=y;break L5717}Q=c[10036]|0;V=0;O=0;W=P;while(1){if((a[V+165520|0]|0)==(a[Q+(V+W|0)|0]|0)){a0=W;a1=O}else{if((V|0)!=4){S=y;break L5717}a0=W-1|0;a1=1}T=V+1|0;if((T|0)<(a1+N|0)){V=T;O=a1;W=a0}else{break}}if((a1|0)==0){if(!((V|0)==3|(V|0)==6)){S=y;break L5717}}if(y){u=4547;break L5719}a2=x+1|0;c[13898]=a2;if(b){u=4454;break L5719}a[47544]=0;if((w|0)<=(a2|0)){u=4527;break L5719}if((a[L+(a2*40&-1)|0]&1)==0){u=4528;break L5719}W=c[L+(a2*40&-1)+36>>2]|0;O=L+(a2*40&-1)+32|0;Q=c[10036]|0;T=0;while(1){if((T|0)>=(W|0)){break}if((a[Q+((c[O>>2]|0)+T|0)|0]|0)==(a[T+115e3|0]|0)){T=T+1|0}else{u=4529;break L5719}}if((T|0)!=1){u=4530;break L5719}a3=x+2|0;c[13898]=a3;if(!d){if((a3|0)>=(w|0)){a4=a3;u=4531;break L5719}L6111:do{if((a[L+(a3*40&-1)|0]&1)!=0){O=c[L+(a3*40&-1)+36>>2]|0;W=L+(a3*40&-1)+32|0;V=0;while(1){if((V|0)>=(O|0)){break}if((a[Q+((c[W>>2]|0)+V|0)|0]|0)==(a[V+103664|0]|0)){V=V+1|0}else{break L6111}}if((V|0)==1){a4=a3;u=4532;break L5719}}}while(0);a[14176]=1;is(g);a[14176]=0;if((c[m>>2]|0)!=3){u=4480;break L5719}Q=c[o>>2]|0;if((Q|0)==0){u=4482;break L5719}eU(Q);uu(Q);$=1;aa=z;ab=r;ac=p;ad=t;ae=A;af=C;ag=B;ah=s;ai=q;aj=j;ak=F;al=G;am=H;an=n;ao=D;break L5760}uu(c[11962]|0);Q=c[13898]|0;L6121:do{if((Q|0)<(c[8272]|0)){T=c[1054]|0;L6123:do{if((a[T+(Q*40&-1)|0]&1)!=0){W=c[T+(Q*40&-1)+36>>2]|0;O=T+(Q*40&-1)+32|0;R=c[10036]|0;av=0;while(1){if((av|0)>=(W|0)){break}if((a[R+((c[O>>2]|0)+av|0)|0]|0)==(a[av+103664|0]|0)){av=av+1|0}else{break L6123}}if((av|0)==1){a5=0;break L6121}}}while(0);a[14176]=1;is(f);a[14176]=0;if((c[I>>2]|0)==3){a5=c[k>>2]|0;break}else{c[13898]=Q;a5=0;break}}else{a5=0}}while(0);c[11962]=a5;$=1;aa=z;ab=r;ac=p;ad=t;ae=A;af=C;ag=B;ah=s;ai=q;aj=j;ak=F;al=G;am=H;an=n;ao=D;break L5760}}while(0);if(s){u=4542;break L5719}c[13898]=x+1;eT(6,0);$=y;aa=z;ab=r;ac=p;ad=t;ae=A;af=C;ag=B;ah=1;ai=q;aj=j;ak=F;al=G;am=H;an=n;ao=D}}while(0);L=c[13898]|0;N=c[8272]|0;if((L|0)<(N|0)){D=ao;n=an;H=am;G=al;F=ak;j=aj;q=ai;s=ah;B=ag;C=af;A=ae;t=ad;p=ac;r=ab;z=aa;y=$;x=L;w=N}else{S=$;break L5717}}if((u|0)==4227){uf(x,175848,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4237){uf(x,175072,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4177){uf(_,138160,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4338){uf(x,K,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4279){uf(x,175072,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4190){uf(ar,138160,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4370){uf(x,169712,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4513){a6=c[10880]|0;uf(aP,a6,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4514){a6=c[10880]|0;uf(aP,a6,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4515){a6=c[10880]|0;uf(aP,a6,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4516){a6=c[10880]|0;uf(aP,a6,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4521){uf(aQ,165880,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4522){uf(aQ,165880,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4523){uf(aQ,165880,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4524){uf(aQ,165880,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4525){uf(aQ,165880,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4526){uf(aQ,165880,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4527){a7=c[10880]|0;uf(a2,a7,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4528){a7=c[10880]|0;uf(a2,a7,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4529){a7=c[10880]|0;uf(a2,a7,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4530){a7=c[10880]|0;uf(a2,a7,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4531){uf(a4,165048,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4532){uf(a4,165048,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4535){uf(x,164608,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4536){uf(x,164608,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4537){uf(x,164608,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4538){uf(x,164608,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4539){uf(x,164608,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4540){uf(x,164608,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4541){uf(x,164608,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4542){uf(x,164608,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4543){uf(x,164608,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4544){uf(x,164608,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4545){uf(x,164608,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4546){uf(x,164608,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4547){uf(x,164608,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4548){uf(x,164608,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4549){uf(x,164608,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4550){uf(x,164608,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4551){uf(x,164608,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4454){uf(a2,138160,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4326){uf(x,K,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4262){uf(x,173896,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4480){c[13898]=a3;a4=a3;uf(a4,165048,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==4482){a4=c[13898]|0;uf(a4,165048,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}else{S=0}}while(0);do{if(!d){if(!((c[11862]|0)!=0&(b^1))){break}uh(-1,163928,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);if(S){i=e;return}S=c[11962]|0;if(!((a[47544]&1)==0&(S|0)!=0)){i=e;return}eU(S);uh(-1,163496,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);i=e;return}function eC(f,j){f=f|0;j=j|0;var k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,R=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0.0,am=0.0,an=0.0,ao=0.0,ap=0.0,aq=0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0,aA=0,aB=0,aC=0.0,aD=0.0,aE=0,aF=0,aG=0,aH=0,aJ=0,aK=0,aL=0,aN=0,aO=0.0,aP=0.0,aQ=0.0,aR=0,aS=0,aT=0,aU=0,aV=0,aW=0.0,aX=0.0,aZ=0.0,a$=0.0,a0=0.0,a1=0.0,a2=0,a3=0,a4=0,a5=0,a6=0,a7=0,a9=0,ba=0,bb=0,bc=0,bd=0,bf=0,bg=0,bh=0,bi=0,bj=0.0,bk=0,bl=0.0,bm=0.0,bn=0,bo=0.0,bp=0,bq=0,br=0.0,bs=0.0,bt=0,bu=0,bv=0;k=i;i=i+216|0;l=k|0;n=k+24|0;o=k+48|0;p=k+96|0;q=k+104|0;r=k+152|0;s=k+160|0;t=k+168|0;u=k+192|0;x=c[12892]|0;if(!((x|0)!=0|(c[11854]|0)!=0)){y=-1;i=k;return y|0}if((a[47392]&1)==0){if((c[8716]|0)==0){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=143056,v)|0);return 0}if((j|0)>=8){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=186808,v)|0);return 0}if(a[47736]|0){y=-1;i=k;return y|0}z=eV()|0;L6212:do{if((z|0)!=0){A=l|0;B=l+8|0;C=n|0;D=n+8|0;E=D;F=D;D=n+8|0;G=z;L6214:while(1){c[11900]=(c[11900]|0)+1;c[11874]=0;H=G;while(1){if((aM(d[H]|0|0)|0)==0){break}else{H=H+1|0}}I=a[H]|0;J=I<<24>>24==0;do{if(J){K=4799}else{if((a8(c[11948]|0,I<<24>>24|0)|0)==0){K=4799;break}if((c[9356]|0)==0){break}else{L=H;M=I}while(1){N=M<<24>>24;if(M<<24>>24==0){K=4793}else{if((a8(c[11948]|0,N|0)|0)==0){K=4793}}if((K|0)==4793){K=0;if((aM(N|0)|0)==0){break}}N=L+1|0;L=N;M=a[N]|0}if((a[L]|0)==0){break}N=c[9356]|0;if((a_(L|0,N|0,uA(N|0)|0)|0)!=0){break}a[37432]=1}}while(0);L6232:do{if((K|0)==4799){K=0;N=a[34104]|0;if(N){if((I<<24>>24|0)==101|(I<<24>>24|0)==69){K=4801;break L6214}else if((I<<24>>24|0)==0){K=4803}}else{if(J){K=4803}}if((K|0)==4803){K=0;c[7638]=-1;O=c[14126]|0;R=O+1|0;c[14126]=R;if((O|0)==0){c[8800]=(c[8800]|0)+1}do{if((R|0)==2){U=(c[11946]|0)+1|0;c[11946]=U;c[8800]=0;c[11942]=-1;V=c[9356]|0;if((V|0)!=0){if(a[37432]|0){K=4809;break L6214}}if((U|0)<=(c[11898]|0)){break L6232}if((U|0)<=(c[11762]|0)){W=V;break}if(N){break L6232}else{K=4813;break L6214}}else{W=c[9356]|0}}while(0);if((W|0)!=0){if(!(a[37432]|0)){break}}if((c[11946]|0)<(c[11898]|0)|(R|0)>2){break}else{K=4817;break L6214}}c[14126]=0;if((c[9356]|0)!=0){if(!(a[37432]|0)){break}}N=c[11946]|0;V=c[11898]|0;if((N|0)<(V|0)|(N|0)>(c[11762]|0)){break}if(((N-V|0)%(c[11904]|0)&-1|0)!=0){break}if((a[32928]&1)!=0|(c[13488]|0)>0){if(a[48872]|0){K=4824}}else{K=4824}if((K|0)==4824){K=0;V=c[8800]|0;N=c[10808]|0;if((V|0)<(N|0)|(V|0)>(c[8834]|0)){break}if(((V-N|0)%(c[10874]|0)&-1|0)!=0){break}N=(c[7638]|0)+1|0;c[7638]=N;V=c[10806]|0;if((N|0)<(V|0)|(N|0)>(c[8832]|0)){break}if(((N-V|0)%(c[10872]|0)&-1|0)!=0){break}}c[11942]=(c[11942]|0)+1;do{if((c[11930]|0)==0){eX(H)}else{do{if((c[11882]|0)<7){V=db(c[11952]|0,168,180032)|0;c[11952]=V;N=c[11882]|0;if((N|0)>=7){break}h[V+(N*24&-1)>>3]=0.0;c[V+(N*24&-1)+16>>2]=0;N=(c[11882]|0)+1|0;c[11882]=N;if((N|0)<7){X=N}else{break}do{N=c[11952]|0;h[N+(X*24&-1)>>3]=0.0;c[N+(X*24&-1)+16>>2]=0;X=(c[11882]|0)+1|0;c[11882]=X;}while((X|0)<7)}}while(0);N=c[11952]|0;V=ca(c[8802]|0,c[11930]|0,(v=i,i=i+56|0,c[v>>2]=N,c[v+8>>2]=N+24,c[v+16>>2]=N+48,c[v+24>>2]=N+72,c[v+32>>2]=N+96,c[v+40>>2]=N+120,c[v+48>>2]=N+144,v)|0)|0;c[11874]=V;if((V|0)==-1){K=4835;break L6214}if((V|0)>0){Y=0}else{break}do{c[(c[11952]|0)+(Y*24&-1)+8>>2]=1;c[(c[11952]|0)+(Y*24&-1)+12>>2]=0;Y=Y+1|0;}while((Y|0)<(c[11874]|0))}}while(0);do{if((c[11942]|0)==0){if(a[48872]|0){break}R=c[11874]|0;if((R|0)>0){V=0;while(1){uu(c[(c[11952]|0)+(V*24&-1)+16>>2]|0);N=eD(c[(c[11952]|0)+(V*24&-1)+12>>2]|0)|0;c[(c[11952]|0)+(V*24&-1)+16>>2]=N;N=V+1|0;U=c[11874]|0;if((N|0)<(U|0)){V=N}else{Z=U;break}}}else{Z=R}a[48872]=1;V=c[13488]|0;if((V|0)>(Z|0)){c[13488]=Z;_=Z}else{_=V}if((_|0)>0){K=4845;break L6214}if((a[32928]&1)!=0){K=4850;break L6214}}}while(0);V=c[11870]|0;U=c[11872]|0;N=(V|0)==0?7:U+V|0;$=U+j|0;ab=(N|0)>($|0)?$:N;if((ab|0)>0){ac=0;ad=1}else{ae=0;af=U;ag=V;break L6214}L6293:while(1){V=c[1048+(ac*12&-1)>>2]|0;c[12902]=ac;U=1052+(ac*12&-1)|0;N=c[U>>2]|0;L6295:do{if((N|0)>2){$=c[11944]|0;ah=($|0)==0;if(!ah){if((c[$+12>>2]|0)==474){ai=ad;break}}if((N|0)==5){aj=1;ak=1}else if((N|0)==6){aj=1;ak=5}else if((N|0)==7){aj=2;ak=0}else if((N|0)==8){aj=3;ak=3}else if((N|0)==4){aj=0;ak=6}else{aj=0;ak=2}do{if((ac|0)==1){if((aj|0)==0){al=+(c[11942]|0);break}else{al=+h[f+(aj-1<<3)>>3];break}}else{al=+h[f+(aj<<3)>>3]}}while(0);am=al;do{if(ah){an=am}else{if((c[$+12>>2]|0)!=392){an=am;break}if((ac|0)>1){if((aj|0)==0){ao=+(c[11942]|0)}else{ao=+h[f+(aj-1<<3)>>3]}ap=ao}else{ap=am}an=ap+ +h[(c[$+276>>2]|0)+16>>3]}}while(0);$=c[1056+(ac*12&-1)>>2]|0;if(($|0)==0){ah=eD(c[47056+(ac<<2)>>2]|0)|0;dp(ak,ah,an,-1);uu(ah);aq=ad;K=4942;break}a[43504]=1;e4($,l);a[43504]=0;if((c[A>>2]|0)==3){$=c[B>>2]|0;dp(ak,$,an,-1);uu($);c[A>>2]=1;aq=ad;K=4942;break}else{$=c[m>>2]|0;aI(142872,39,1,$|0);aq=ad;K=4942;break}}else{if((N|0)==2){$=eD(c[47056+(ac<<2)>>2]|0)|0;if((c[11944]|0)!=0){ah=c[11942]|0;ar=ut(192)|0;if((ar|0)==0){gk();as=ut(192)|0;if((as|0)==0){K=4883;break L6214}else{at=as}}else{at=ar}ar=at;if((c[(c[11944]|0)+224>>2]|0)==0){as=ut(192)|0;if((as|0)==0){gk();au=ut(192)|0;if((au|0)==0){K=4887;break L6214}else{av=au}}else{av=as}c[(c[11944]|0)+224>>2]=av;as=(c[11944]|0)+224|0;uE(c[as>>2]|0,0,192);c[(c[as>>2]|0)+4>>2]=-1}if(($|0)==0){aw=0}else{aw=bP($|0)|0}c[at+60>>2]=aw;c[at+4>>2]=ah;c[at+64>>2]=0;c[at>>2]=c[c[(c[11944]|0)+224>>2]>>2];c[c[(c[11944]|0)+224>>2]>>2]=ar}uu($);aq=ad;K=4942;break}$=c[1056+(ac*12&-1)>>2]|0;if(($|0)==0){if((V|0)==(-2|0)){h[f+(ac<<3)>>3]=+(c[11946]|0);aq=ad;K=4942;break}else if((V|0)==(-1|0)){h[f+(ac<<3)>>3]=+(c[8800]|0);aq=ad;K=4942;break}else if((V|0)==0){h[f+(ac<<3)>>3]=+(c[11942]|0);aq=ad;K=4942;break}else{if((V|0)<1){K=4928;break L6214}ar=c[48840+(ac<<2)>>2]|0;do{if((ar|0)!=99){if((c[64808+(ar*688&-1)>>2]|0)!=1){break}h[r>>3]=0.0;if((V|0)>(c[11874]|0)){K=4935;break L6293}ah=V-1|0;as=c[11952]|0;if((c[as+(ah*24&-1)+8>>2]|0)==-5){K=4935;break L6293}au=c[as+(ah*24&-1)+12>>2]|0;if((au|0)==0){K=4935;break L6293}if((t1(au,64813+(ar*688&-1)|0,q,r)|0)==0){K=4935;break L6293}am=+t2(q);h[f+(ac<<3)>>3]=am+ +h[r>>3];aq=ad;K=4942;break L6295}}while(0);if((N|0)==1){ax=ad;K=4945;break}if((V|0)>(c[11874]|0)){K=4941;break L6293}ar=V-1|0;au=c[11952]|0;ah=c[au+(ar*24&-1)+8>>2]|0;if((ah|0)==(-5|0)){y=-5;K=4984;break L6214}else if((ah|0)!=1){K=4941;break L6293}h[f+(ac<<3)>>3]=+h[au+(ar*24&-1)>>3];aq=ad;K=4942;break}}a[43504]=1;e4($,n);a[43504]=0;if((a[1960]&1)!=0){y=-2;K=4981;break L6214}ar=48840+(ac<<2)|0;au=c[ar>>2]|0;do{if((au|0)==99){ay=0;K=4908}else{if((c[64808+(au*688&-1)>>2]|0)!=1){ay=0;K=4908;break}ah=c[C>>2]|0;if((ah|0)==3){az=1;break}if((aY(64813+(au*688&-1)|0,132824)|0)!=0){ay=1;K=4908;break}as=ut(20)|0;if((as|0)==0){gk();aA=ut(20)|0;if((aA|0)==0){K=4901;break L6214}else{aB=aA}}else{aB=as}if((ah|0)==1){aC=+(c[F>>2]|0)}else if((ah|0)==2){aC=+h[D>>3]}else if((ah|0)==3){aC=+uz(c[E>>2]|0,0)}else{K=4906;break L6214}be(aB|0,142616,(v=i,i=i+8|0,h[v>>3]=aC,v)|0);c[C>>2]=3;c[E>>2]=aB;ay=1;K=4908}}while(0);do{if((K|0)==4908){K=0;au=c[C>>2]|0;if((au|0)==3){az=ay;break}else if((au|0)==1){aD=+(c[F>>2]|0)}else if((au|0)==2){aD=+h[D>>3]}else{K=4921;break L6214}h[f+(ac<<3)>>3]=aD;aq=ad;K=4942;break L6295}}while(0);if((c[U>>2]|0)==1){au=c[E>>2]|0;$=(uA(au|0)|0)+3|0;ah=ut($)|0;if((ah|0)==0){gk();as=ut($)|0;if((as|0)==0){K=4912;break L6214}else{aE=as}}else{aE=ah}a[aE]=34;ah=aE+1|0;uB(ah|0,au|0);au=aE+(uA(aE|0)|0)|0;w=34;a[au]=w&255;w=w>>8;a[au+1|0]=w&255;au=47088+(ac<<2)|0;uu(c[au>>2]|0);c[au>>2]=aE;c[47056+(ac<<2)>>2]=aE}do{if(az){h[p>>3]=0.0;au=c[E>>2]|0;if((t1(au,64813+((c[ar>>2]|0)*688&-1)|0,o,p)|0)==0){aF=0;aG=au;break}am=+t2(o);h[f+(ac<<3)>>3]=am+ +h[p>>3];aF=ad;aG=au}else{aF=ad;aG=c[E>>2]|0}}while(0);uu(aG);c[C>>2]=1;aq=aF;K=4942}}while(0);do{if((K|0)==4942){K=0;if((c[U>>2]|0)!=1){ai=aq;break}if((c[1056+(ac*12&-1)>>2]|0)==0){ax=aq;K=4945;break}if((c[47056+(ac<<2)>>2]|0)==0){ax=aq;K=4945}else{ai=aq}}}while(0);do{if((K|0)==4945){K=0;if(!((V|0)==(-1|0)|(V|0)==(-2|0)|(V|0)==0)){ai=ax;break}U=ut(32)|0;if((U|0)==0){gk();N=ut(32)|0;if((N|0)==0){K=4948;break L6214}else{aH=N}}else{aH=U}U=~~+h[f+(ac<<3)>>3];be(aH|0,21e4,(v=i,i=i+8|0,c[v>>2]=U,v)|0);U=47088+(ac<<2)|0;uu(c[U>>2]|0);c[U>>2]=aH;c[47056+(ac<<2)>>2]=aH;ai=ax}}while(0);V=ac+1|0;if((V|0)<(ab|0)){ac=V;ad=ai}else{aJ=ai;aK=V;break}}if((K|0)==4935){K=0;aJ=(c[11870]|0)==0?ad:0;aK=ac}else if((K|0)==4941){K=0;aJ=(c[11870]|0)==0?ad:0;aK=ac}if((aJ|0)!=0){K=4952;break L6214}}}while(0);G=eV()|0;if((G|0)==0){break L6212}}if((K|0)==4984){i=k;return y|0}else if((K|0)==4883){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=142224,v)|0);return 0}else if((K|0)==4928){uf(-1,142440,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((K|0)==4850){c[11942]=(c[11942]|0)-1;a[32928]=0;y=-9;i=k;return y|0}else if((K|0)==4887){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=142224,v)|0);return 0}else if((K|0)==4912){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=181200,v)|0);return 0}else if((K|0)==4845){G=c[(c[11952]|0)+((_-1|0)*24&-1)+16>>2]|0;if((G|0)==0){c[11902]=0;y=-7;i=k;return y|0}C=bP(G|0)|0;c[11902]=C;if((C|0)==0){y=-7;i=k;return y|0}c[11942]=(c[11942]|0)-1;c[13488]=-99;a[32928]=0;y=-6;i=k;return y|0}else if((K|0)==4801){a[47736]=1;y=-1;i=k;return y|0}else if((K|0)==4809){a[47736]=1;y=-1;i=k;return y|0}else if((K|0)==4813){a[47736]=1;y=-1;i=k;return y|0}else if((K|0)==4817){y=-3-O|0;i=k;return y|0}else if((K|0)==4835){a[47736]=1;y=-1;i=k;return y|0}else if((K|0)==4921){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((K|0)==4952){ae=aK;af=c[11872]|0;ag=c[11870]|0}else if((K|0)==4901){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=142728,v)|0);return 0}else if((K|0)==4981){i=k;return y|0}else if((K|0)==4906){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((K|0)==4948){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=142320,v)|0);return 0}C=ae-af|0;if((ag|0)==0|(C|0)==(ag|0)|(C|0)==(j|0)){y=C;i=k;return y|0}else{uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=180528,v)|0);return 0}}}while(0);c[11874]=0;a[47736]=1;y=-1;i=k;return y|0}ag=s;if((x|0)==0){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=187320,v)|0);return 0}if((j|0)>=8){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=186808,v)|0);return 0}x=c[11876]|0;if((c[11884]|0)<=(x|0)){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=186248,v)|0);return 0}if((x|0)==0){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=185768,v)|0);return 0}if(a[47736]|0){y=-1;i=k;return y|0}do{if((c[11882]|0)<(x|0)){af=db(c[11952]|0,x*24&-1,180032)|0;c[11952]=af;ae=c[11882]|0;if((ae|0)>=(x|0)){break}h[af+(ae*24&-1)>>3]=0.0;c[af+(ae*24&-1)+16>>2]=0;ae=(c[11882]|0)+1|0;c[11882]=ae;if((ae|0)<(x|0)){aL=ae}else{break}do{ae=c[11952]|0;h[ae+(aL*24&-1)>>3]=0.0;c[ae+(aL*24&-1)+16>>2]=0;aL=(c[11882]|0)+1|0;c[11882]=aL;}while((aL|0)<(x|0))}}while(0);do{if((c[12222]|c[12224]|c[12220]|0)==0){x=c[12172]|0;aL=c[12170]|0;c[11788]=0;c[11787]=0;c[11786]=0;aD=+h[x+(aL*232&-1)+80>>3];if(+P(+aD)<.001){c[11822]=c[6578];c[11823]=c[6579];c[11824]=c[6580];c[11825]=c[6581];c[11826]=c[6582];c[11827]=c[6583];c[11828]=c[6584];c[11829]=c[6585];aN=0;aO=1.0;aP=0.0;aQ=0.0}else{aC=+S(+aD);h[5911]=aC;an=+T(+aD);aD=-0.0-an;h[5912]=aD;h[5913]=an;h[5914]=aC;aN=1;aO=aC;aP=aD;aQ=an}ae=x+(aL*232&-1)+88|0;an=+h[ae>>3];af=x+(aL*232&-1)+96|0;aD=+h[af>>3];aC=an*an+aD*aD;aK=x+(aL*232&-1)+104|0;aD=+h[aK>>3];ap=+Q(+(aC+aD*aD));ao=+Q(+aC);if(ap<1.0e-9|ao>3]);h[5917]=aC*ao*+h[ae>>3];h[5918]=aC*+h[af>>3]*+h[aK>>3];h[5919]=aC*ap*+h[ae>>3];h[5920]=aC*ao*+h[af>>3];h[5921]=ao*(-0.0-ao)*aC;h[5922]=0.0;h[5923]=aC*ao*+h[aK>>3];aR=1}aK=aN?1:aR;a[47128]=aK;if((a[47544]&1)==0){af=x+(aL*232&-1)+48|0;ae=x+(aL*232&-1)+192|0;O=x+(aL*232&-1)+124|0;_=0;do{aJ=x+(aL*232&-1)+(_<<2)|0;ac=c[aJ>>2]|0;do{if((ac|0)==0){if((c[x+(aL*232&-1)+140+(_<<2)>>2]|0)!=0){K=4589;break}aS=-3-(c[x+(aL*232&-1)+112+(_<<2)>>2]|0)|0;K=4595}else{K=4589}}while(0);do{if((K|0)==4589){K=0;ad=x+(aL*232&-1)+112+(_<<2)|0;if((a[O]&1)==0){aT=ac}else{c[1048+(_*12&-1)>>2]=c[ad>>2];aT=c[aJ>>2]|0}ai=-3-(c[ad>>2]|0)|0;if((aT|0)>0){c[47144+(ai<<2)>>2]=aT;aU=aT;aV=ai;break}if((aT|0)>=0){aS=ai;K=4595;break}c[47144+(ai<<2)>>2]=2147483647;aU=2147483647;aV=ai}}while(0);if((K|0)==4595){K=0;aJ=c[x+(aL*232&-1)+140+(aS<<2)>>2]|0;c[47144+(aS<<2)>>2]=aJ;aU=aJ;aV=aS}ao=+h[x+(aL*232&-1)+24+(_<<3)>>3];if(ao!=0.0){h[47240+(aV<<3)>>3]=ao;aW=ao}else{ao=+h[x+(aL*232&-1)+168+(aV<<3)>>3];h[47240+(aV<<3)>>3]=ao;aW=ao}ao=aW*+(aa(c[x+(aL*232&-1)+12+(_<<2)>>2]|0,c[x+(aL*232&-1)+152+(aV<<2)>>2]|0)|0);h[47240+(aV<<3)>>3]=ao;do{if((c[af>>2]|0)==0){if((c[ae>>2]|0)!=0){h[47176+(_<<3)>>3]=+h[x+(aL*232&-1)+200+(aV<<3)>>3];break}if((aU|0)>0){h[47176+(_<<3)>>3]=+(aU-1|0)*+P(+ao)*.5;break}else{h[47176+(_<<3)>>3]=0.0;break}}else{h[47176+(_<<3)>>3]=+h[x+(aL*232&-1)+56+(_<<3)>>3]}}while(0);aJ=c[af>>2]|0;if((aJ|0)==0){if((c[ae>>2]|0)==1){K=4608}else{K=4611}}else if((aJ|0)==1){K=4608}else{K=4611}do{if((K|0)==4608){K=0;if((aU|0)>0&ao<0.0){h[47264+(_<<3)>>3]=+(aU-1|0)*ao;break}else{h[47264+(_<<3)>>3]=0.0;break}}else if((K|0)==4611){K=0;if((aU|0)>0){h[47264+(_<<3)>>3]=+(aU-1|0)*ao*.5;break}else{h[47264+(_<<3)>>3]=0.0;break}}}while(0);_=_+1|0;}while((_|0)<3)}else{_=c[x+(aL*232&-1)+140>>2]|0;c[11786]=_;c[11787]=c[x+(aL*232&-1)+144>>2];if((_|0)==0){uf(-1,185128,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}_=x+(aL*232&-1)+12|0;h[5911]=aO*+(c[_>>2]|0);h[5912]=aP*+(c[_>>2]|0);_=x+(aL*232&-1)+16|0;h[5913]=aQ*+(c[_>>2]|0);h[5914]=aO*+(c[_>>2]|0);_=x+(aL*232&-1)+48|0;if((c[_>>2]|0)==0){aX=(+h[5946]+ +h[5944])*.5}else{aX=+h[x+(aL*232&-1)+56>>3]}h[5897]=aX;if((c[_>>2]|0)==0){aZ=(+h[5947]+ +h[5945])*.5}else{aZ=+h[x+(aL*232&-1)+64>>3]}h[5898]=aZ;if((c[_>>2]|0)==0){a$=0.0}else{a$=+h[x+(aL*232&-1)+72>>3]}h[5899]=a$;if((c[_>>2]|0)==1){a0=+h[5944]}else{a0=(+h[5946]+ +h[5944])*.5}h[5908]=a0;if((c[_>>2]|0)==1){a1=+h[5945]}else{a1=(+h[5947]+ +h[5945])*.5}h[5909]=a1;h[5910]=0.0;c[11802]=0}do{if(aK<<24>>24==0){if(+h[5908]!=+h[5897]){a2=1;break}if(+h[5909]!=+h[5898]){a2=1;break}a2=+h[5910]!=+h[5899]&1}else{a2=1}}while(0);a[47128]=a2;aK=x+(aL*232&-1)+224|0;_=c[aK>>2]|0;c[11800]=_;ae=c[12208]|0;c[11792]=a[47816+(ae>>>0<3?ae:3)|0]|0;ae=c[x+(aL*232&-1)+128>>2]|0;c[11790]=ae;a[47224]=0;a[47232]=0;c[7638]=-1;c[8800]=0;c[11946]=aL;if((_|0)!=0|(c[12204]|0)>0){break}if((a[47856]&1)==0){break}if((a[47584]&1)==0){break}if((a[47464]&1)!=0){break}_=c[11876]|0;af=c[11950]|0;if((_|0)>0){O=0;aJ=0;while(1){ac=((c[af+(aJ*12&-1)>>2]|0)+O|0)+(e[af+(aJ*12&-1)+8>>1]|0)|0;ai=aJ+1|0;if((ai|0)<(_|0)){O=ac;aJ=ai}else{a3=ac;break}}}else{a3=0}aJ=c[11786]|0;O=aa((aJ|0)<1?1:aJ,(c[af+(_*12&-1)>>2]|0)+a3|0);aJ=c[11787]|0;aL=aa(O,(aJ|0)<1?1:aJ);aJ=c[11788]|0;O=aa(aL,(aJ|0)<1?1:aJ)+ae|0;aJ=ut(O)|0;do{if((aJ|0)==0){gk();aL=ut(O)|0;if((aL|0)!=0){a4=aL;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=184632,v)|0);return 0}else{a4=aJ}}while(0);c[11800]=a4;c[aK>>2]=a4;aJ=cd(c[11800]|0,1,O|0,c[12892]|0)|0;if((aJ|0)==(O|0)){break}uh(-1,184408,(v=i,i=i+16|0,c[v>>2]=O,c[v+8>>2]=aJ,v)|0);a[47736]=1;y=-1;i=k;return y|0}}while(0);L6578:do{if(!(a[47736]|0)){a4=s;a3=s;a2=s|0;aU=s;aV=s;aS=f+8|0;aT=f+16|0;aR=t|0;aN=t+8|0;aJ=aN;ae=aN;aN=t+8|0;_=0;L6580:while(1){if(a[47224]|0){K=4629;break}if(a[47232]|0){K=4631;break}af=c[11790]|0;if((af|0)==0){a5=0}else{aL=c[11800]|0;if((aL|0)==0){if((eR(af)|0)!=0){y=-1;K=4966;break}}else{c[11800]=aL+af}c[11790]=0;a5=0}while(1){af=c[(c[11950]|0)+(a5*12&-1)>>2]|0;do{if((af|0)!=0){aL=c[11800]|0;if((aL|0)==0){if((eR(af)|0)==0){break}else{y=-1;K=4967;break L6580}}else{c[11800]=aL+af;break}}}while(0);if((a5|0)==(c[11876]|0)){K=4642;break}do{if((c[11858]|0)==0){af=c[11800]|0;aL=(c[11950]|0)+(a5*12&-1)+8|0;x=b[aL>>1]|0;if((af|0)==0){if((cd(ag|0,x&65535|0,1,c[12892]|0)|0)==1){break}else{K=4649;break L6580}}if(x<<16>>16==0){break}else{a6=0;a7=af}while(1){af=a7+1|0;c[11800]=af;a[ag+a6|0]=a[a7]|0;x=a6+1|0;if((x|0)<(e[aL>>1]|0|0)){a6=x;a7=af}else{break}}}else{a[ag]=0}}while(0);aL=c[11792]|0;af=c[11950]|0;x=e[af+(a5*12&-1)+8>>1]|0;do{if((aL-2|0)>>>0<2){ac=x-1|0;if((ac|0)>0){a9=0;ba=ac}else{break}do{ac=ag+a9|0;ai=a[ac]|0;ad=ag+ba|0;a[ac]=a[ad]|0;a[ad]=ai;a9=a9+1|0;ba=ba-1|0;}while((a9|0)<(ba|0))}}while(0);do{if((aL-1|0)>>>0<2){ai=x-1|0;if((ai|0)>0){bb=ai}else{break}do{ai=ag+(bb-1|0)|0;ad=a[ai]|0;ac=ag+bb|0;a[ai]=a[ac]|0;a[ac]=ad;bb=bb-2|0;}while((bb|0)>0)}}while(0);x=c[af+(a5*12&-1)+4>>2]|0;if((x|0)==0){aL=c[11952]|0;h[aL+(a5*24&-1)>>3]=+(a[ag]|0|0);bc=aL}else if((x|0)==1){aL=c[11952]|0;h[aL+(a5*24&-1)>>3]=+((d[ag]|0)>>>0);bc=aL}else if((x|0)==2){aL=c[11952]|0;h[aL+(a5*24&-1)>>3]=+(b[a4>>1]|0|0);bc=aL}else if((x|0)==3){aL=c[11952]|0;h[aL+(a5*24&-1)>>3]=+((e[a4>>1]|0)>>>0);bc=aL}else if((x|0)==4){aL=c[11952]|0;h[aL+(a5*24&-1)>>3]=+(c[a3>>2]|0);bc=aL}else if((x|0)==5){aL=c[11952]|0;h[aL+(a5*24&-1)>>3]=+((c[a3>>2]|0)>>>0>>>0);bc=aL}else if((x|0)==6){aL=c[11952]|0;h[aL+(a5*24&-1)>>3]=+(c[a3>>2]|0);bc=aL}else if((x|0)==7){aL=c[11952]|0;h[aL+(a5*24&-1)>>3]=+((c[a3>>2]|0)>>>0>>>0);bc=aL}else if((x|0)==10){aL=c[11952]|0;h[aL+(a5*24&-1)>>3]=+((c[a2>>2]|0)>>>0)+ +(c[a2+4>>2]|0)*4294967296.0;bc=aL}else if((x|0)==11){aL=c[11952]|0;h[aL+(a5*24&-1)>>3]=+((c[a2>>2]|0)>>>0)+ +((c[a2+4>>2]|0)>>>0)*4294967296.0;bc=aL}else if((x|0)==8){aL=c[11952]|0;h[aL+(a5*24&-1)>>3]=+g[aU>>2];bc=aL}else if((x|0)==9){x=c[11952]|0;h[x+(a5*24&-1)>>3]=+h[aV>>3];bc=x}else{K=4669;break L6580}c[bc+(a5*24&-1)+8>>2]=1;c[(c[11952]|0)+(a5*24&-1)+12>>2]=0;x=a[47544]|0;if((x&1)!=0){bd=x;break}a5=a5+1|0}if((K|0)==4642){K=0;bd=a[47544]|0}L6636:do{if((bd&1)==0){c[11942]=(c[7638]|0)+1;if((a5|0)==(c[11876]|0)){K=4702}else{K=4697;break L6580}}else{do{if((a[47464]&1)!=0){x=c[12224]|0;if(!((x|0)!=0|_)){h[5902]=+h[(c[11952]|0)+(a5*24&-1)>>3];bf=1;break L6636}if((c[12222]|x|c[12220]|0)!=0){break}x=c[11802]|0;aL=c[11786]|0;if((x|0)>=(aL|0)){break}ad=c[11784]|0;if((x|0)==0){ac=db(ad,aL<<2,183672)|0;aL=ac;c[11784]=aL;if((ac|0)==0){K=4682;break L6580}bg=c[11802]|0;bh=aL}else{bg=x;bh=ad}g[bh+(bg<<2)>>2]=+h[(c[11952]|0)+(a5*24&-1)>>3];ad=(c[11802]|0)+1|0;c[11802]=ad;bf=_&(ad|0)!=(c[11786]|0);break L6636}}while(0);c[11942]=~~+h[(c[11952]|0)+(a5*24&-1)>>3];af=c[11876]|0;if((af|0)>0){bi=af}else{K=4702;break}while(1){af=bi-1|0;if((bi|0)==1){ad=c[12224]|0;if((a[47464]&1)==0){bj=+(ad|0)}else{bj=+g[(c[11784]|0)+(ad<<2)>>2]}ad=c[11952]|0;h[ad+(af*24&-1)>>3]=bj;bk=ad}else if((bi|0)==2){if((a[47464]&1)==0){bl=+(c[12222]|0)}else{bl=+h[5902]}ad=c[11952]|0;h[ad+(af*24&-1)>>3]=bl;bk=ad}else{ad=c[11952]|0;h[ad+(af*24&-1)>>3]=+h[ad+(a5*24&-1)>>3];bk=ad}c[bk+(af*24&-1)+8>>2]=1;c[(c[11952]|0)+(af*24&-1)+12>>2]=0;if((af|0)>0){bi=af}else{K=4702;break}}}}while(0);do{if((K|0)==4702){K=0;af=c[12224]|0;ad=c[12222]|0;x=c[12220]|0;aL=af+1|0;c[12224]=aL;ac=c[11786]|0;do{if(!((ac|0)<1|(aL|0)<(ac|0))){c[12224]=0;ai=ad+1|0;c[12222]=ai;a[47224]=1;ax=c[11787]|0;if((ax|0)<0|(ai|0)<(ax|0)){break}c[12222]=0;ax=x+1|0;c[12220]=ax;ai=c[11788]|0;if((ai|0)<0|(ax|0)<(ai|0)){break}c[12220]=0;a[47232]=1;ai=(c[12170]|0)+1|0;c[12170]=ai;if((ai|0)<(c[11864]|0)){break}a[47736]=1}}while(0);ac=c[11946]|0;aL=c[11898]|0;if((ac|0)<(aL|0)|(ac|0)>(c[11762]|0)){bf=_;break}if(((ac-aL|0)%(c[11904]|0)&-1|0)!=0){bf=_;break}aL=c[8800]|0;ac=c[10808]|0;if((aL|0)<(ac|0)|(aL|0)>(c[8834]|0)){bf=_;break}if(((aL-ac|0)%(c[10874]|0)&-1|0)!=0){bf=_;break}ac=(c[7638]|0)+1|0;c[7638]=ac;aL=c[10806]|0;if((ac|0)<(aL|0)|(ac|0)>(c[8832]|0)){bf=_;break}if(((ac-aL|0)%(c[10872]|0)&-1|0)!=0){bf=_;break}c[11874]=c[11876];aL=c[11870]|0;ac=(aL|0)!=0?aL:7;aL=(ac|0)>(j|0)?j:ac;L6680:do{if((aL|0)>0){a1=+(x|0);a0=+(ad|0);a$=+(af|0);ac=0;L6682:while(1){ai=c[1048+(ac*12&-1)>>2]|0;ax=c[1056+(ac*12&-1)>>2]|0;do{if((ax|0)==0){if((ai|0)==(-5|0)){aH=c[(c[11944]|0)+12>>2]|0;if((aH|0)==400|(aH|0)==416){aZ=a1*+h[5907];h[f+(ac<<3)>>3]=aZ;bm=aZ;break}else{aZ=+h[c[11952]>>3];h[f+(ac<<3)>>3]=aZ;bm=aZ;break}}else if((ai|0)==(-4|0)){aZ=a0*+h[5906];h[f+(ac<<3)>>3]=aZ;bm=aZ;break}else if((ai|0)==(-3|0)){aZ=a$*+h[5905];h[f+(ac<<3)>>3]=aZ;bm=aZ;break}else if((ai|0)==(-2|0)){aZ=+(c[11946]|0);h[f+(ac<<3)>>3]=aZ;bm=aZ;break}else if((ai|0)==(-1|0)){aZ=+(c[8800]|0);h[f+(ac<<3)>>3]=aZ;bm=aZ;break}else if((ai|0)==0){aZ=+(c[11942]|0);h[f+(ac<<3)>>3]=aZ;bm=aZ;break}else{if((ai|0)<1){K=4738;break L6580}if((ai|0)>(c[11874]|0)){break L6682}aH=ai-1|0;aq=c[11952]|0;aF=c[aq+(aH*24&-1)+8>>2]|0;if((aF|0)==(-5|0)){y=-5;K=4971;break L6580}else if((aF|0)!=1){break L6682}aZ=+h[aq+(aH*24&-1)>>3];h[f+(ac<<3)>>3]=aZ;bm=aZ;break}}else{a[43504]=1;e4(ax,t);a[43504]=0;if((a[1960]&1)!=0){y=-2;K=4970;break L6580}aH=c[aR>>2]|0;if((aH|0)==3){aq=c[aJ>>2]|0;if((c[1052+(ac*12&-1)>>2]|0)==1){aF=(uA(aq|0)|0)+3|0;aG=ut(aF)|0;if((aG|0)==0){gk();p=ut(aF)|0;if((p|0)==0){K=4721;break L6580}else{bn=p}}else{bn=aG}a[bn]=34;aG=bn+1|0;uB(aG|0,aq|0);aG=bn+(uA(bn|0)|0)|0;w=34;a[aG]=w&255;w=w>>8;a[aG+1|0]=w&255;aG=47088+(ac<<2)|0;uu(c[aG>>2]|0);c[aG>>2]=bn;c[47056+(ac<<2)>>2]=bn}uu(aq);c[aR>>2]=1;bm=+h[f+(ac<<3)>>3];break}else if((aH|0)==1){bo=+(c[ae>>2]|0)}else if((aH|0)==2){bo=+h[aN>>3]}else{K=4726;break L6580}h[f+(ac<<3)>>3]=bo;bm=bo}}while(0);if((cg(+bm)|0)==0){if((a[47584]&1)==0){y=-2;K=4972;break L6580}}ax=ac+1|0;if((ax|0)<(aL|0)){ac=ax}else{bp=1;bq=ax;break L6680}}bp=(c[11870]|0)==0&1;bq=ac}else{bp=1;bq=0}}while(0);do{if((a[47128]&1)!=0){a$=+h[f>>3]- +h[5908];a0=+h[aS>>3]- +h[5909];a1=a$*+h[5911]+a0*+h[5912];h[f>>3]=a1;aZ=a$*+h[5913]+a0*+h[5914];h[aS>>3]=aZ;if((c[11856]|0)==2){a0=+h[aT>>3]- +h[5910];a$=a1*+h[5915]+aZ*+h[5916]+a0*+h[5917];h[f>>3]=a$;aX=a1*+h[5918]+aZ*+h[5919]+a0*+h[5920];h[aS>>3]=aX;h[aT>>3]=a1*+h[5921]+aZ*+h[5922]+a0*+h[5923];br=a$;bs=aX}else{br=a1;bs=aZ}h[f>>3]=br+ +h[5897];h[aS>>3]=bs+ +h[5898];if((c[11856]|0)!=2){break}h[aT>>3]=+h[5899]+ +h[aT>>3]}}while(0);if((bp|0)==0){bf=_}else{K=4752;break L6580}}}while(0);if(a[47736]|0){break L6578}else{_=bf}}if((K|0)==4629){a[47224]=0;c[7638]=-1;c[8800]=(c[8800]|0)+1;y=-3;i=k;return y|0}else if((K|0)==4631){a[47232]=0;c[8800]=0;y=-4;i=k;return y|0}else if((K|0)==4649){a[47736]=1;y=-1;i=k;return y|0}else if((K|0)==4669){uf(-1,184064,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((K|0)==4682){uf(-1,183240,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((K|0)==4697){if((cj(c[12892]|0)|0)==0){uf(-1,c[6942]|0,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}if((a5|0)!=0){uf(-1,182696,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}a[47736]=1;y=-1;i=k;return y|0}else if((K|0)==4721){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=181200,v)|0);return 0}else if((K|0)==4726){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((K|0)==4738){uf(-1,180832,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((K|0)==4752){_=c[11870]|0;if((c[11872]|0)>0){aT=u|0;aS=u+8|0;aN=_;while(1){ae=1052+(aN*12&-1)|0;do{if((c[ae>>2]|0)>2){aR=c[1056+(aN*12&-1)>>2]|0;if((aR|0)==0){break}a[43504]=1;e4(aR,u);a[43504]=0;aR=c[ae>>2]|0;if((aR|0)==4){bt=0;bu=6}else if((aR|0)==5){bt=1;bu=1}else if((aR|0)==6){bt=1;bu=5}else if((aR|0)==7){bt=2;bu=0}else if((aR|0)==8){bt=2;bu=3}else{bt=0;bu=2}if((c[aT>>2]|0)!=3){break}aR=c[aS>>2]|0;dp(bu,aR,+h[f+(bt<<3)>>3],-1);uu(aR);c[aT>>2]=1}}while(0);ae=aN+1|0;aR=c[11870]|0;if((ae|0)<((c[11872]|0)+aR|0)){aN=ae}else{bv=aR;break}}}else{bv=_}if((bv|0)==0|(bq|0)==(bv|0)|(bq|0)==(j|0)){y=bq;i=k;return y|0}else{uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=180528,v)|0);return 0}}else if((K|0)==4966){i=k;return y|0}else if((K|0)==4967){i=k;return y|0}else if((K|0)==4970){i=k;return y|0}else if((K|0)==4971){i=k;return y|0}else if((K|0)==4972){i=k;return y|0}}}while(0);a[47736]=1;y=-1;i=k;return y|0}function eD(b){b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,j=0;c=i;i=i+8|0;d=c|0;if((b|0)==0){e=0;i=c;return e|0}do{if((a[b]|0)==34){f=b+1|0;if((f|0)==0){g=0}else{g=bP(f|0)|0}a[g+(bk(g|0,132696)|0)|0]=0;h=g}else{f=a[47120]|0;if(f<<24>>24==0){j=bP(b|0)|0;a[j+(bk(j|0,84256)|0)|0]=0;h=j;break}else{j=d|0;a[j]=f;a[d+1|0]=34;a[d+2|0]=0;f=bP(b|0)|0;a[f+(bk(f|0,j|0)|0)|0]=0;h=f;break}}}while(0);ua(h);e=h;i=c;return e|0}function eE(b){b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0.0;d=i;i=i+8|0;e=d|0;f=e;if((cd(f|0,4,1,b|0)|0)!=1){if((cj(b|0)|0)==0){uf(-1,c[6942]|0,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0.0}else{uf(-1,74632,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0.0}}b=c[12208]|0;h=a[47816+(b>>>0<3?b:3)|0]|0;if((h-2|0)>>>0<2){b=0;j=3;do{k=f+b|0;l=a[k]|0;m=f+j|0;a[k]=a[m]|0;a[m]=l;b=b+1|0;j=j-1|0;}while((b|0)<(j|0))}if((h-1|0)>>>0>=2){n=+g[e>>2];i=d;return+n}h=f+2|0;j=a[h]|0;b=f+3|0;a[h]=a[b]|0;a[b]=j;j=a[f]|0;b=f+1|0;a[f]=a[b]|0;a[b]=j;n=+g[e>>2];i=d;return+n}function eF(b){b=b|0;var d=0,e=0,f=0,g=0,j=0.0,k=0;d=i;e=b+8|0;f=c[e>>2]|0;g=f-1|0;if((f|0)==0){f=c[6354]|0;if((f|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}j=+(c[11942]|0);k=f+1|0;c[6354]=k;c[14296+(k*24&-1)>>2]=2;h[14304+(k*24&-1)>>3]=j;h[14312+(k*24&-1)>>3]=0.0;i=d;return}do{if((g|0)<(c[11874]|0)){k=c[11952]|0;if((c[k+(g*24&-1)+8>>2]|0)!=1){break}f=c[6354]|0;if((f|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}j=+h[k+(g*24&-1)>>3];k=f+1|0;c[6354]=k;c[14296+(k*24&-1)>>2]=2;h[14304+(k*24&-1)>>3]=j;h[14312+(k*24&-1)>>3]=0.0;i=d;return}}while(0);a[1960]=1;g=c[6354]|0;if((g|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}k=g+1|0;c[6354]=k;g=14296+(k*24&-1)|0;k=b;c[g>>2]=c[k>>2];c[g+4>>2]=c[k+4>>2];c[g+8>>2]=c[k+8>>2];c[g+12>>2]=c[k+12>>2];c[g+16>>2]=c[k+16>>2];c[g+20>>2]=c[k+20>>2];if((c[b>>2]|0)!=3){i=d;return}b=c[e>>2]|0;if((b|0)==0){i=d;return}e=bP(b|0)|0;c[14304+((c[6354]|0)*24&-1)>>2]=e;i=d;return}function eG(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0.0,l=0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0;b=i;i=i+8|0;d=b|0;e=c[6354]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=e-1;f=14296+(e*24&-1)|0;g=c[f>>2]|0;j=c[f+4>>2]|0;f=14304+(e*24&-1)|0;k=+h[f>>3];l=c[f>>2]|0;h[d>>3]=k;m=+h[14312+(e*24&-1)>>3];e=l;l=e;if((a[43504]&1)==0){uf((c[13898]|0)-1|0,74216,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((g|0)==1){n=+(e|0);o=5045}else if((g|0)==2){n=k;o=5045}else if((g|0)==3){e=d;f=c[11874]|0;L6842:do{if((f|0)>0){p=0;q=f;while(1){r=c[(c[11952]|0)+(p*24&-1)+16>>2]|0;if((r|0)==0){s=q}else{if(ui(l,r+((a[r]|0)==34&1)|0)|0){break}s=c[11874]|0}r=p+1|0;if((r|0)<(s|0)){p=r;q=s}else{t=-9;break L6842}}q=p+1|0;if((c[11902]|0)!=0){t=q;break}r=c[(c[11952]|0)+(p*24&-1)+16>>2]|0;if((r|0)==0){u=0}else{u=bP(r|0)|0}c[11902]=u;t=q}else{t=-9}}while(0);uu(c[e>>2]|0);w=t;x=1}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((o|0)==5045){w=~~n;x=g}if((w|0)==(-2|0)){c[d>>2]=c[11946];g=c[6354]|0;if((g|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}o=g+1|0;c[6354]=o;g=14296+(o*24&-1)|0;c[g>>2]=1;c[g+4>>2]=j;h[14304+(o*24&-1)>>3]=+h[d>>3];h[14312+(o*24&-1)>>3]=m;i=b;return}else if((w|0)==(-1|0)){c[d>>2]=c[8800];o=c[6354]|0;if((o|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=o+1|0;c[6354]=g;o=14296+(g*24&-1)|0;c[o>>2]=1;c[o+4>>2]=j;h[14304+(g*24&-1)>>3]=+h[d>>3];h[14312+(g*24&-1)>>3]=m;i=b;return}else if((w|0)==0){n=+(c[11942]|0);h[d>>3]=n;g=c[6354]|0;if((g|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}o=g+1|0;c[6354]=o;g=14296+(o*24&-1)|0;c[g>>2]=2;c[g+4>>2]=j;h[14304+(o*24&-1)>>3]=n;h[14312+(o*24&-1)>>3]=0.0;i=b;return}else{do{if(!((w|0)<1|(w|0)>(c[11874]|0))){o=w-1|0;g=c[11952]|0;if((c[g+(o*24&-1)+8>>2]|0)!=1){break}n=+h[g+(o*24&-1)>>3];h[d>>3]=n;o=c[6354]|0;if((o|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=o+1|0;c[6354]=g;o=14296+(g*24&-1)|0;c[o>>2]=2;c[o+4>>2]=j;h[14304+(g*24&-1)>>3]=n;h[14312+(g*24&-1)>>3]=0.0;i=b;return}}while(0);a[1960]=1;w=c[6354]|0;if((w|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=w+1|0;c[6354]=g;w=14296+(g*24&-1)|0;c[w>>2]=x;c[w+4>>2]=j;j=c[d>>2]|0;h[14304+(g*24&-1)>>3]=+h[d>>3];h[14312+(g*24&-1)>>3]=m;g=j;if((x|0)!=3|(g|0)==0){i=b;return}x=bP(g|0)|0;c[14304+((c[6354]|0)*24&-1)>>2]=x;i=b;return}}function eH(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0.0,o=0,p=0.0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0;b=i;i=i+104|0;d=b|0;e=b+8|0;f=b+40|0;g=b+72|0;j=c[6354]|0;if((j|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=j-1;k=14296+(j*24&-1)|0;l=c[k>>2]|0;m=c[k+4>>2]|0;k=14304+(j*24&-1)|0;n=+h[k>>3];o=c[k>>2]|0;h[d>>3]=n;p=+h[14312+(j*24&-1)>>3];j=o;o=j;if((a[43504]&1)==0){q=c[13898]|0;r=q-1|0;uf(r,73448,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((a[47584]&1)!=0){q=c[13898]|0;r=q-1|0;uf(r,73448,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((l|0)==3){r=d;q=c[11874]|0;L6902:do{if((q|0)>0){k=0;s=q;while(1){t=c[(c[11952]|0)+(k*24&-1)+16>>2]|0;if((t|0)==0){u=s}else{if(ui(o,t+((a[t]|0)==34&1)|0)|0){break}u=c[11874]|0}t=k+1|0;if((t|0)<(u|0)){k=t;s=u}else{w=5088;break L6902}}s=k+1|0;if((c[11902]|0)==0){t=c[(c[11952]|0)+(k*24&-1)+16>>2]|0;if((t|0)==0){x=0}else{x=bP(t|0)|0}c[11902]=x}if((s|0)==-9){w=5088}else{y=s}}else{w=5088}}while(0);do{if((w|0)==5088){if((a[47040]&1)==0){y=-9;break}a[47040]=0;uh(-1,72840,(v=i,i=i+8|0,c[v>>2]=c[r>>2],v)|0);x=c[11874]|0;if((x|0)>0){z=0;A=x}else{y=-9;break}while(1){x=c[(c[11952]|0)+(z*24&-1)+16>>2]|0;do{if((x|0)==0){B=A}else{u=x+((a[x]|0)==34&1)|0;if((a_(o|0,u|0,uA(o|0)|0)|0)!=0){B=A;break}uh(-1,225080,(v=i,i=i+16|0,c[v>>2]=z+1,c[v+8>>2]=x,v)|0);B=c[11874]|0}}while(0);x=z+1|0;if((x|0)<(B|0)){z=x;A=B}else{y=-9;break}}}}while(0);uu(c[r>>2]|0);C=y;D=1}else if((l|0)==1){E=+(j|0);w=5097}else if((l|0)==2){E=n;w=5097}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((w|0)==5097){C=~~E;D=l}if((C|0)==(-2|0)){l=e|0;e=c[11946]|0;be(l|0,21e4,(v=i,i=i+8|0,c[v>>2]=e,v)|0);c[d>>2]=l;l=c[6354]|0;if((l|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=l+1|0;c[6354]=e;l=14296+(e*24&-1)|0;c[l>>2]=3;c[l+4>>2]=m;l=c[d>>2]|0;h[14304+(e*24&-1)>>3]=+h[d>>3];h[14312+(e*24&-1)>>3]=p;e=l;if((e|0)==0){i=b;return}l=bP(e|0)|0;c[14304+((c[6354]|0)*24&-1)>>2]=l;i=b;return}else if((C|0)==(-1|0)){l=f|0;be(l|0,21e4,(v=i,i=i+8|0,c[v>>2]=c[8800],v)|0);c[d>>2]=l;l=c[6354]|0;if((l|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=l+1|0;c[6354]=f;l=14296+(f*24&-1)|0;c[l>>2]=3;c[l+4>>2]=m;l=c[d>>2]|0;h[14304+(f*24&-1)>>3]=+h[d>>3];h[14312+(f*24&-1)>>3]=p;f=l;if((f|0)==0){i=b;return}l=bP(f|0)|0;c[14304+((c[6354]|0)*24&-1)>>2]=l;i=b;return}else if((C|0)==0){l=g|0;be(l|0,21e4,(v=i,i=i+8|0,c[v>>2]=c[11942],v)|0);c[d>>2]=l;l=c[6354]|0;if((l|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=l+1|0;c[6354]=g;l=14296+(g*24&-1)|0;c[l>>2]=3;c[l+4>>2]=m;l=c[d>>2]|0;h[14304+(g*24&-1)>>3]=+h[d>>3];h[14312+(g*24&-1)>>3]=p;g=l;if((g|0)==0){i=b;return}l=bP(g|0)|0;c[14304+((c[6354]|0)*24&-1)>>2]=l;i=b;return}else{if((C|0)<1|(C|0)>(c[11874]|0)){a[1960]=1;l=c[6354]|0;if((l|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=l+1|0;c[6354]=g;l=14296+(g*24&-1)|0;c[l>>2]=D;c[l+4>>2]=m;l=c[d>>2]|0;h[14304+(g*24&-1)>>3]=+h[d>>3];h[14312+(g*24&-1)>>3]=p;g=l;if((D|0)!=3|(g|0)==0){i=b;return}D=bP(g|0)|0;c[14304+((c[6354]|0)*24&-1)>>2]=D;i=b;return}else{D=eD(c[(c[11952]|0)+((C-1|0)*24&-1)+12>>2]|0)|0;c[d>>2]=D;C=c[6354]|0;if((C|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=C+1|0;c[6354]=g;C=14296+(g*24&-1)|0;c[C>>2]=3;c[C+4>>2]=m;m=c[d>>2]|0;h[14304+(g*24&-1)>>3]=+h[d>>3];h[14312+(g*24&-1)>>3]=p;g=m;if((g|0)!=0){m=bP(g|0)|0;c[14304+((c[6354]|0)*24&-1)>>2]=m}uu(D);i=b;return}}}function eI(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0.0,m=0,n=0.0,o=0.0,p=0;b=i;i=i+8|0;d=b|0;if((a[43504]&1)==0){uf((c[13898]|0)-1|0,223600,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=c[6354]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=e-1|0;c[6354]=f;g=14296+(e*24&-1)|0;j=c[g>>2]|0;k=c[g+4>>2]|0;g=14304+(e*24&-1)|0;l=+h[g>>3];m=c[g>>2]|0;h[d>>3]=l;n=+h[14312+(e*24&-1)>>3];e=m;if((j|0)==2){o=l;p=f}else if((j|0)==1){o=+(e|0);p=f}else if((j|0)==3){l=+uz(e,0);o=l;p=c[6354]|0}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[13488]=~~o;c[d>>2]=222976;if((p|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=p+1|0;c[6354]=e;p=14296+(e*24&-1)|0;c[p>>2]=3;c[p+4>>2]=k;k=c[d>>2]|0;h[14304+(e*24&-1)>>3]=+h[d>>3];h[14312+(e*24&-1)>>3]=n;e=k;if((e|0)==0){i=b;return}k=bP(e|0)|0;c[14304+((c[6354]|0)*24&-1)>>2]=k;i=b;return}function eJ(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0.0,n=0,o=0,p=0.0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,w=0;a=i;i=i+8|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=d-1|0;c[6354]=e;f=14296+(d*24&-1)|0;g=f|0;j=c[g>>2]|0;k=f+4|0;f=c[k>>2]|0;l=14304+(d*24&-1)|0;m=+h[l>>3];n=c[l>>2]|0;h[b>>3]=m;o=14312+(d*24&-1)|0;p=+h[o>>3];q=n;do{if((j|0)==2){r=+P(+m);s=+P(+p);if(p==0.0){t=r;break}if(r>s){u=s/r;t=r*+Q(+(u*u+1.0));break}else{u=r/s;t=s*+Q(+(u*u+1.0));break}}else if((j|0)==1){t=+(((q|0)>-1?q:-q|0)|0)}else{uf(-1,211136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);q=~~t;j=q-1|0;if((q|0)>0&(j|0)<(c[11874]|0)){w=(c[(c[11952]|0)+(j*24&-1)+8>>2]|0)==1&1}else{w=0}c[b>>2]=w;if((e|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{c[6354]=d;c[g>>2]=1;c[k>>2]=f;h[l>>3]=+h[b>>3];h[o>>3]=p;i=a;return}}function eK(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0,u=0,w=0,x=0;b=i;i=i+56|0;d=b|0;e=b+48|0;h[e>>3]=0.0;f=c[6354]|0;if((f|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=f-1|0;c[6354]=g;j=14296+(f*24&-1)|0;k=c[j>>2]|0;l=c[j+4>>2]|0;j=14304+(f*24&-1)|0;m=+h[j>>3];n=+h[14312+(f*24&-1)>>3];f=c[j>>2]|0;j=f;do{if((k|0)==1){o=+(((f|0)>-1?f:-f|0)|0)}else if((k|0)==2){p=+P(+m);q=+P(+n);if(n==0.0){o=p;break}if(p>q){r=q/p;o=p*+Q(+(r*r+1.0));break}else{r=p/q;o=q*+Q(+(r*r+1.0));break}}else{uf(-1,211136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);s=~~o;if((a[43504]&1)==0){uf((c[13898]|0)-1|0,222536,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}t=c[48840+(c[12902]<<2)>>2]|0;do{if((s|0)<1|(s|0)>(c[11874]|0)){u=g}else{w=c[(c[11952]|0)+((s-1|0)*24&-1)+12>>2]|0;if((w|0)==0){u=g;break}x=(t1(w,64813+(t*688&-1)|0,d,e)|0)==0;w=c[6354]|0;if(x){u=w;break}if((w|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}o=+h[e>>3];r=+t2(d)+o;x=w+1|0;c[6354]=x;w=14296+(x*24&-1)|0;c[w>>2]=2;c[w+4>>2]=l;h[14304+(x*24&-1)>>3]=r;h[14312+(x*24&-1)>>3]=0.0;i=b;return}}while(0);a[1960]=1;if((u|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}d=u+1|0;c[6354]=d;u=14296+(d*24&-1)|0;c[u>>2]=k;c[u+4>>2]=l;h[14304+(d*24&-1)>>3]=m;h[14312+(d*24&-1)>>3]=n;if((k|0)!=3|(f|0)==0){i=b;return}f=bP(j|0)|0;c[14304+((c[6354]|0)*24&-1)>>2]=f;i=b;return}function eL(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0;d=i;e=c[11902]|0;if((e|0)==0){i=d;return}if((c[b+12>>2]|0)==392&(c[9670]|0)==2){dp(2,e,+(c[b+280>>2]|0)+ +h[(c[b+276>>2]|0)+16>>3],-1);uu(c[11902]|0);c[11902]=0;i=d;return}f=b+16|0;g=c[f>>2]|0;do{if((g|0)!=0){if((a[b+21|0]&1)!=0){break}j=aQ(g|0,222976)|0;if((j|0)==0){i=d;return}k=uA(g|0)|0;l=(uA(e|0)|0)+k|0;k=ut(l)|0;do{if((k|0)==0){gk();m=ut(l)|0;if((m|0)!=0){n=m;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=221744,v)|0)}else{n=k}}while(0);a[j]=0;k=c[f>>2]|0;l=c[11902]|0;m=j+12|0;be(n|0,172512,(v=i,i=i+24|0,c[v>>2]=k,c[v+8>>2]=l,c[v+16>>2]=m,v)|0);uu(c[11902]|0);c[11902]=n}}while(0);if((a[b+22|0]&1)!=0){i=d;return}n=c[f>>2]|0;if((n|0)!=0){uu(n)}a[b+20|0]=a[36231]&1^1;c[f>>2]=c[11902];c[11902]=0;i=d;return}function eM(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0,s=0,t=0,u=0.0;d=i;i=i+48|0;e=d|0;f=d+24|0;g=c[13898]|0;j=g+1|0;c[13898]=j;k=(c[8272]|0)>(j|0);L7071:do{if(k){l=c[1054]|0;if((a[l+(j*40&-1)|0]&1)!=0){m=c[l+(j*40&-1)+36>>2]|0;n=l+(j*40&-1)+32|0;l=c[10036]|0;o=0;while(1){if((o|0)>=(m|0)){p=5212;break}if((a[l+((c[n>>2]|0)+o|0)|0]|0)==(a[o+199040|0]|0)){o=o+1|0}else{break}}do{if((p|0)==5212){if((o|0)!=1){break}c[13898]=g+2;n=is(f)|0;l=c[n>>2]|0;if((l|0)==2){q=+h[n+8>>3]}else if((l|0)==3){q=+uz(c[n+8>>2]|0,0)}else if((l|0)==1){q=+(c[n+8>>2]|0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}n=f|0;if((c[n>>2]|0)==3){uu(c[f+8>>2]|0);c[n>>2]=1}n=~~q;c[13488]=n;c[13898]=(c[13898]|0)+1;r=n;break L7071}}while(0);if(!k){p=5236;break}}o=c[1054]|0;n=(a[o+(j*40&-1)|0]&1)==0;do{if(!n){l=c[o+(j*40&-1)+36>>2]|0;m=o+(j*40&-1)+32|0;s=c[10036]|0;t=0;while(1){if((t|0)>=(l|0)){p=5226;break}if((a[s+((c[m>>2]|0)+t|0)|0]|0)==(a[t+103664|0]|0)){t=t+1|0}else{p=5227;break}}if((p|0)==5226){if((t|0)==1|n^1){p=5236;break L7071}else{break}}else if((p|0)==5227){if(n){break}else{p=5236;break L7071}}}}while(0);n=is(e)|0;o=c[n>>2]|0;if((o|0)==1){u=+(c[n+8>>2]|0)}else if((o|0)==2){u=+h[n+8>>3]}else if((o|0)==3){u=+uz(c[n+8>>2]|0,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}n=e|0;if((c[n>>2]|0)==3){uu(c[e+8>>2]|0);c[n>>2]=1}n=~~u;c[13488]=n;r=n}else{p=5236}}while(0);do{if((p|0)==5236){if((c[11870]|0)==1){e=c[262]|0;c[13488]=e;r=e;break}if((c[b+8>>2]|0)==3){e=c[268]|0;c[13488]=e;r=e;break}else{e=c[265]|0;c[13488]=e;r=e;break}}}while(0);if((r|0)!=-99){i=d;return}c[b+16>>2]=bP(222976)|0;i=d;return}function eN(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0,w=0,x=0.0,y=0.0,z=0;d=i;aI(214576,68,1,b|0);e=c[11862]|0;f=(e|0)==0;g=f?1:e;e=f?48440:c[12168]|0;aI(213904,15,1,b|0);f=c[12202]|0;if((f|0)>-1){j=c[48696+(f<<3)>>2]|0;aK(j|0,b|0)}else{aI(135560,4,1,b|0)}cf(b|0,212192,(v=i,i=i+8|0,c[v>>2]=c[47744+(c[12206]<<2)>>2],v)|0);j=c[11962]|0;cf(b|0,211640,(v=i,i=i+8|0,c[v>>2]=(j|0)!=0?j:135560,v)|0);if((g|0)>0){k=0}else{i=d;return}do{cf(b|0,211256,(v=i,i=i+8|0,c[v>>2]=k,v)|0);aI(210760,16,1,b|0);j=c[e+(k*232&-1)>>2]|0;do{if((j|0)<0){aI(210016,3,1,b|0);l=1}else{cf(b|0,21e4,(v=i,i=i+8|0,c[v>>2]=j,v)|0);f=c[e+(k*232&-1)+4>>2]|0;if((f|0)<=0){l=1;break}cf(b|0,209320,(v=i,i=i+8|0,c[v>>2]=f,v)|0);f=c[e+(k*232&-1)+8>>2]|0;if((f|0)<=0){l=2;break}cf(b|0,209320,(v=i,i=i+8|0,c[v>>2]=f,v)|0);l=3}}while(0);j=e+(k*232&-1)+124|0;cf(b|0,209120,(v=i,i=i+8|0,c[v>>2]=(a[j]&1)!=0?136424:136208,v)|0);do{if((a[j]&1)!=0){aI(207296,17,1,b|0);if((c[e+(k*232&-1)+12>>2]|0)==-1){aI(206608,6,1,b|0);m=0}else{m=1}f=l>>>0>1;L7143:do{if(f){if((c[e+(k*232&-1)+16>>2]|0)==-1){n=m?179864:86120;cf(b|0,205848,(v=i,i=i+8|0,c[v>>2]=n,v)|0);o=0}else{o=m}do{if((l|0)==3){if((c[e+(k*232&-1)+20>>2]|0)!=-1){p=1;break}n=o?179864:86120;cf(b|0,204712,(v=i,i=i+8|0,c[v>>2]=n,v)|0);q=1;r=5268;break L7143}else{p=0}}while(0);if(o){s=p;r=5267}else{q=p;r=5268}}else{if(m){s=0;r=5267;break}t=+h[e+(k*232&-1)+24>>3];cf(b|0,204152,(v=i,i=i+8|0,h[v>>3]=t,v)|0);u=0}}while(0);if((r|0)==5267){r=0;aI(204448,11,1,b|0);q=s;r=5268}do{if((r|0)==5268){r=0;t=+h[e+(k*232&-1)+24>>3];cf(b|0,204152,(v=i,i=i+8|0,h[v>>3]=t,v)|0);if(f){t=+h[e+(k*232&-1)+32>>3];cf(b|0,203944,(v=i,i=i+8|0,h[v>>3]=t,v)|0);if(!q){u=0;break}}else{if(!q){u=0;break}}t=+h[e+(k*232&-1)+40>>3];cf(b|0,203696,(v=i,i=i+8|0,h[v>>3]=t,v)|0);u=1}}while(0);n=e+(k*232&-1)+48|0;w=c[n>>2]|0;if((w|0)==1){aI(203456,13,1,b|0)}else if((w|0)==2){aI(203128,13,1,b|0)}if(((c[n>>2]|0)-1|0)>>>0<2){t=+h[e+(k*232&-1)+56>>3];x=+h[e+(k*232&-1)+64>>3];y=+h[e+(k*232&-1)+72>>3];cf(b|0,202912,(v=i,i=i+24|0,h[v>>3]=t,h[v+8>>3]=x,h[v+16>>3]=y,v)|0)}y=+h[e+(k*232&-1)+80>>3];cf(b|0,202576,(v=i,i=i+8|0,h[v>>3]=y,v)|0);y=+h[e+(k*232&-1)+88>>3];x=+h[e+(k*232&-1)+96>>3];t=+h[e+(k*232&-1)+104>>3];cf(b|0,201912,(v=i,i=i+24|0,h[v>>3]=y,h[v+8>>3]=x,h[v+16>>3]=t,v)|0);n=e+(k*232&-1)+112|0;w=0;while(1){if(w>>>0>=12){break}if((a_(n|0,48188+(w<<4)|0,12)|0)==0){r=5280;break}else{w=w+1|0}}if((r|0)==5280){r=0;aI(201312,12,1,b|0);n=(c[e+(k*232&-1)+8>>2]|0)!=0?132824:200424;z=c[48184+(w<<4)>>2]|0;cf(b|0,n|0,(v=i,i=i+8|0,c[v>>2]=z,v)|0)}cf(b|0,199512,(v=i,i=i+8|0,c[v>>2]=c[e+(k*232&-1)+128>>2],v)|0);if(f){z=c[e+(k*232&-1)+132>>2]|0;cf(b|0,199136,(v=i,i=i+8|0,c[v>>2]=z,v)|0)}if(!u){break}cf(b|0,198848,(v=i,i=i+8|0,c[v>>2]=c[e+(k*232&-1)+136>>2],v)|0)}}while(0);aF(10,b|0);k=k+1|0;}while((k|0)<(g|0));i=d;return}function eO(a){a=a|0;var d=0,f=0,g=0,h=0,j=0;d=i;aI(198008,82,1,a|0);f=0;do{aI(197576,3,1,a|0);g=48028+(f<<4)|0;if((b[g>>1]|0)!=0){h=48024+(f<<4)|0;j=0;do{cf(a|0,103640,(v=i,i=i+8|0,c[v>>2]=c[(c[h>>2]|0)+(j<<2)>>2],v)|0);j=j+1|0;}while((j|0)<(e[g>>1]|0|0))}cf(a|0,196376,(v=i,i=i+8|0,c[v>>2]=e[48036+(f<<4)>>1]|0,v)|0);f=f+1|0;}while(f>>>0<10);aI(195800,95,1,a|0);f=0;do{aI(197576,3,1,a|0);g=47868+(f<<4)|0;if((b[g>>1]|0)!=0){j=47864+(f<<4)|0;h=0;do{cf(a|0,103640,(v=i,i=i+8|0,c[v>>2]=c[(c[j>>2]|0)+(h<<2)>>2],v)|0);h=h+1|0;}while((h|0)<(e[g>>1]|0|0))}cf(a|0,194088,(v=i,i=i+8|0,c[v>>2]=e[47876+(f<<4)>>1]|0,v)|0);if((c[47872+(f<<4)>>2]|0)==12){aI(193568,40,1,a|0)}aF(10,a|0);f=f+1|0;}while(f>>>0<10);i=d;return}function eP(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0;b=i;d=(c[13898]|0)+1|0;c[13898]=d;if((d|0)>=(c[8272]|0)){uf(d,217808,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=c[1054]|0;L7206:do{if((a[e+(d*40&-1)|0]&1)!=0){f=c[e+(d*40&-1)+36>>2]|0;g=e+(d*40&-1)+32|0;h=c[10036]|0;j=0;while(1){if((j|0)>=(f|0)){break}if((a[h+((c[g>>2]|0)+j|0)|0]|0)==(a[j+103664|0]|0)){j=j+1|0}else{break L7206}}if((j|0)!=1){break}uf(d,217808,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);d=c[12172]|0;e=c[11864]|0;if((e|0)>0){g=0;h=e;while(1){e=d+(g*232&-1)+224|0;f=c[e>>2]|0;if((f|0)==0){k=h}else{uu(f);c[e>>2]=0;k=c[11864]|0}e=g+1|0;if((e|0)<(k|0)){g=e;h=k}else{break}}}c[11864]=0;if((c[12168]|0)==0){c[12204]=c[12200];c[12208]=0;k=c[12172]|0;do{if((c[11880]|0)<1){h=db(k,232,216568)|0;g=h;c[12172]=g;if((h|0)==0){c[11880]=0;uf(c[13898]|0,216112,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{c[11880]=1;l=c[11864]|0;m=g;break}}else{l=0;m=k}}while(0);uD(m+(l*232&-1)|0,48440,232);c[11864]=(c[11864]|0)+1}else{c[12204]=c[12202];c[12208]=c[12206];l=c[11862]|0;do{if((l|0)>(c[11880]|0)){m=db(c[12172]|0,l*232&-1,216568)|0;c[12172]=m;if((m|0)==0){c[11880]=0;uf(c[13898]|0,216112,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{c[11880]=l;break}}}while(0);m=c[12172]|0;k=c[11864]|0;if((l|0)>0){g=0;h=k;while(1){uD(m+(h*232&-1)|0,48440,232);d=(c[11864]|0)+1|0;c[11864]=d;e=g+1|0;if((e|0)<(l|0)){g=e;h=d}else{n=d;break}}}else{n=k}uD(m|0,c[12168]|0,n*232&-1)}c[11856]=0;eB(0,1);c[12202]=c[12204];c[12206]=c[12208];n=c[12168]|0;m=c[11862]|0;if((m|0)>0){k=0;h=m;while(1){m=n+(k*232&-1)+224|0;g=c[m>>2]|0;if((g|0)==0){o=h}else{uu(g);c[m>>2]=0;o=c[11862]|0}m=k+1|0;if((m|0)<(o|0)){k=m;h=o}else{break}}}c[11862]=0;o=c[11864]|0;do{if((o|0)>(c[11878]|0)){h=db(c[12168]|0,o*232&-1,216568)|0;c[12168]=h;if((h|0)==0){c[11878]=0;uf(c[13898]|0,216112,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{c[11878]=o;break}}}while(0);h=c[12168]|0;k=c[11862]|0;if((o|0)>0){p=0;q=k}else{r=k;s=h;t=c[12172]|0;u=t;w=r*232&-1;uD(s|0,u|0,w);i=b;return}while(1){uD(h+(q*232&-1)|0,48440,232);k=(c[11862]|0)+1|0;c[11862]=k;n=p+1|0;if((n|0)<(o|0)){p=n;q=k}else{r=k;break}}s=h;t=c[12172]|0;u=t;w=r*232&-1;uD(s|0,u|0,w);i=b;return}function eQ(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;d=i;e=c[11876]|0;if((e|0)>=(a|0)){i=d;return}if((e|0)>0){f=c[(c[11950]|0)+((e-1|0)*12&-1)+4>>2]|0}else{f=8}e=48036+(f<<4)|0;g=a;while(1){h=g+1|0;if((h|0)<=0){j=5346;break}k=c[11950]|0;if((c[11884]|0)<(h|0)){l=db(k,h*12&-1,215112)|0;c[11950]=l;c[11884]=h;m=l}else{m=k}c[m+(g*12&-1)>>2]=0;if((g|0)<=0){j=5350;break}k=c[11950]|0;if((c[11884]|0)<(g|0)){l=db(k,g*12&-1,215112)|0;c[11950]=l;c[11884]=g;n=l}else{n=k}k=g-1|0;c[n+(k*12&-1)+4>>2]=f;b[(c[11950]|0)+(k*12&-1)+8>>1]=b[e>>1]|0;if((k|0)>(c[11876]|0)){g=k}else{j=5354;break}}if((j|0)==5354){c[11876]=a;i=d;return}else if((j|0)==5350){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=215616,v)|0)}else if((j|0)==5346){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=215616,v)|0)}}function eR(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;i=i+8|0;e=d|0;do{if(a[47440]|0){f=b}else{if((a[30664]&1)!=0){f=b;break}if((cp(c[12892]|0,b|0,1)|0)==0){g=0;i=d;return g|0}if((cj(c[12892]|0)|0)==0){uf(-1,c[6942]|0,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}a[47736]=1;g=-1;i=d;return g|0}}while(0);while(1){if((f|0)==0){g=0;h=5372;break}if((cd(e|0,1,1,c[12892]|0)|0)==1){f=f-1|0}else{break}}if((h|0)==5372){i=d;return g|0}if((cj(c[12892]|0)|0)==0){uf(-1,c[6942]|0,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}a[47736]=1;g=-1;i=d;return g|0}function eS(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0.0,V=0,W=0,X=0,Y=0.0;b=i;i=i+80|0;d=b|0;e=b+24|0;f=b+48|0;g=b+72|0;j=g|0;k=i;i=i+4|0;i=i+7>>3<<3;l=c[13898]|0;if((c[8272]|0)<=(l|0)){m=c[10880]|0;uf(l,m,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}n=c[1054]|0;if((a[n+(l*40&-1)|0]&1)==0){m=c[10880]|0;uf(l,m,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}o=c[n+(l*40&-1)+36>>2]|0;p=n+(l*40&-1)+32|0;q=c[10036]|0;r=0;while(1){if((r|0)>=(o|0)){break}if((a[q+((c[p>>2]|0)+r|0)|0]|0)==(a[r+115e3|0]|0)){r=r+1|0}else{s=5462;break}}if((s|0)==5462){m=c[10880]|0;uf(l,m,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((r|0)!=1){m=c[10880]|0;uf(l,m,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}m=c[12172]|0;r=c[11864]|0;if((r|0)>0){p=0;q=r;while(1){r=m+(p*232&-1)+224|0;o=c[r>>2]|0;if((o|0)==0){t=q}else{uu(o);c[r>>2]=0;t=c[11864]|0}r=p+1|0;if((r|0)<(t|0)){p=r;q=t}else{break}}u=c[13898]|0;w=c[1054]|0}else{u=l;w=n}c[11864]=0;n=e|0;l=e+8|0;t=g|0;q=g+1|0;p=d|0;m=d+8|0;r=f|0;o=f+8|0;x=0;y=u;u=w;L7326:while(1){w=y+1|0;c[13898]=w;L7328:do{if((a[u+(w*40&-1)|0]&1)==0){z=x+1|0;A=c[11864]|0;if((z|0)>(A|0)){B=A+1|0;if((B|0)>(c[11880]|0)){C=db(c[12172]|0,B*232&-1,216568)|0;c[12172]=C;if((C|0)==0){s=5391;break L7326}c[11880]=B;D=c[11864]|0}else{D=A}uD((c[12172]|0)+(D*232&-1)|0,48440,232);c[11864]=(c[11864]|0)+1}A=is(e)|0;B=c[A>>2]|0;if((B|0)==2){E=+h[A+8>>3]}else if((B|0)==1){E=+(c[A+8>>2]|0)}else if((B|0)==3){E=+uz(c[A+8>>2]|0,0)}else{s=5398;break L7326}if((c[n>>2]|0)==3){uu(c[l>>2]|0);c[n>>2]=1}c[(c[12172]|0)+(((c[11864]|0)-1|0)*232&-1)>>2]=~~E;A=c[13898]|0;B=c[8272]|0;if((A|0)>=(B|0)){F=z;G=A;H=B;break}C=c[1054]|0;L7346:do{if((a[C+(A*40&-1)|0]&1)==0){I=c[10036]|0;J=C+(A*40&-1)+32|0;K=C+(A*40&-1)+36|0}else{L=C+(A*40&-1)+36|0;M=c[L>>2]|0;N=C+(A*40&-1)+32|0;O=c[10036]|0;P=0;while(1){if((P|0)>=(M|0)){break}if((a[O+((c[N>>2]|0)+P|0)|0]|0)==(a[P+103664|0]|0)){P=P+1|0}else{I=O;J=N;K=L;break L7346}}if((P|0)==1){F=z;G=A;H=B;break L7328}else{I=O;J=N;K=L}}}while(0);c[k>>2]=0;C=c[K>>2]|0;uD(j|0,I+(c[J>>2]|0)|0,(C|0)<5?C:5);a[g+((C|0)>5?5:C)|0]=0;if((a[t]|0)!=120){F=z;G=A;H=B;break}ca(q|0,21e4,(v=i,i=i+8|0,c[v>>2]=k,v)|0);c[(c[12172]|0)+(((c[11864]|0)-1|0)*232&-1)+4>>2]=c[k>>2];C=(c[13898]|0)+1|0;c[13898]=C;F=z;G=C;H=c[8272]|0}else{C=c[8272]|0;if((C|0)<=(w|0)){F=x;G=w;H=C;break}M=c[u+(w*40&-1)+36>>2]|0;Q=u+(w*40&-1)+32|0;R=c[10036]|0;S=0;while(1){if((S|0)>=(M|0)){break}if((a[R+((c[Q>>2]|0)+S|0)|0]|0)==(a[S+199040|0]|0)){S=S+1|0}else{F=x;G=w;H=C;break L7328}}if((S|0)!=1){F=x;G=w;H=C;break}c[13898]=y+2;Q=x+1|0;R=c[11864]|0;if((Q|0)>(R|0)){M=R+1|0;if((M|0)>(c[11880]|0)){z=db(c[12172]|0,M*232&-1,216568)|0;c[12172]=z;if((z|0)==0){s=5418;break L7326}c[11880]=M;T=c[11864]|0}else{T=R}uD((c[12172]|0)+(T*232&-1)|0,48440,232);c[11864]=(c[11864]|0)+1}R=is(d)|0;M=c[R>>2]|0;if((M|0)==1){U=+(c[R+8>>2]|0)}else if((M|0)==2){U=+h[R+8>>3]}else if((M|0)==3){U=+uz(c[R+8>>2]|0,0)}else{s=5425;break L7326}if((c[p>>2]|0)==3){uu(c[m>>2]|0);c[p>>2]=1}c[(c[12172]|0)+(((c[11864]|0)-1|0)*232&-1)>>2]=~~U;R=c[13898]|0;M=c[8272]|0;L7377:do{if((M|0)>(R|0)){z=c[1054]|0;if((a[z+(R*40&-1)|0]&1)==0){V=R;W=M;break}B=c[z+(R*40&-1)+36>>2]|0;A=z+(R*40&-1)+32|0;z=c[10036]|0;X=0;while(1){if((X|0)>=(B|0)){break}if((a[z+((c[A>>2]|0)+X|0)|0]|0)==(a[X+148464|0]|0)){X=X+1|0}else{V=R;W=M;break L7377}}if((X|0)!=1){V=R;W=M;break}c[13898]=R+1;A=is(f)|0;z=c[A>>2]|0;if((z|0)==1){Y=+(c[A+8>>2]|0)}else if((z|0)==2){Y=+h[A+8>>3]}else if((z|0)==3){Y=+uz(c[A+8>>2]|0,0)}else{s=5438;break L7326}if((c[r>>2]|0)==3){uu(c[o>>2]|0);c[r>>2]=1}c[(c[12172]|0)+(((c[11864]|0)-1|0)*232&-1)+4>>2]=~~Y;V=c[13898]|0;W=c[8272]|0}else{V=R;W=M}}while(0);if((W|0)<=(V|0)){s=5459;break L7326}M=c[1054]|0;if((a[M+(V*40&-1)|0]&1)==0){s=5460;break L7326}R=c[M+(V*40&-1)+36>>2]|0;C=M+(V*40&-1)+32|0;M=c[10036]|0;S=0;while(1){if((S|0)>=(R|0)){break}if((a[M+((c[C>>2]|0)+S|0)|0]|0)==(a[S+131272|0]|0)){S=S+1|0}else{s=5457;break L7326}}if((S|0)!=1){s=5458;break L7326}C=V+1|0;c[13898]=C;F=Q;G=C;H=W}}while(0);if((H|0)<=(G|0)){s=5465;break}w=c[1054]|0;if((a[w+(G*40&-1)|0]&1)==0){s=5466;break}C=c[w+(G*40&-1)+36>>2]|0;M=w+(G*40&-1)+32|0;R=c[10036]|0;A=0;while(1){if((A|0)>=(C|0)){break}if((a[R+((c[M>>2]|0)+A|0)|0]|0)==(a[A+183584|0]|0)){A=A+1|0}else{s=5467;break L7326}}if((A|0)==1){x=F;y=G;u=w}else{s=5468;break}}if((s|0)==5391){c[11880]=0;uf(c[13898]|0,216112,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((s|0)==5457){uf(V,148760,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((s|0)==5458){uf(V,148760,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((s|0)==5460){uf(V,148760,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((s|0)==5438){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((s|0)==5459){uf(V,148760,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((s|0)==5466){i=b;return}else if((s|0)==5467){i=b;return}else if((s|0)==5468){i=b;return}else if((s|0)==5418){c[11880]=0;uf(c[13898]|0,216112,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((s|0)==5425){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((s|0)==5398){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((s|0)==5465){i=b;return}}function eT(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0.0,X=0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0;e=i;i=i+80|0;f=e|0;g=e+24|0;j=e+48|0;k=e+72|0;l=c[13898]|0;m=c[8272]|0;if((m|0)<=(l|0)){n=c[10880]|0;uf(l,n,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}o=c[1054]|0;if((a[o+(l*40&-1)|0]&1)==0){n=c[10880]|0;uf(l,n,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}p=c[o+(l*40&-1)+36>>2]|0;q=o+(l*40&-1)+32|0;r=c[10036]|0;s=0;while(1){if((s|0)>=(p|0)){break}if((a[r+((c[q>>2]|0)+s|0)|0]|0)==(a[s+115e3|0]|0)){s=s+1|0}else{t=5660;break}}if((t|0)==5660){n=c[10880]|0;uf(l,n,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((s|0)!=1){n=c[10880]|0;uf(l,n,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}n=l+1|0;c[13898]=n;if((n|0)>=(m|0)){i=e;return}l=f|0;s=f+8|0;q=j|0;p=k|0;u=(b|0)==4?1:2;w=j+16|0;x=j;y=j+8|0;j=g|0;z=g+8|0;A=0;B=n;n=o;o=m;m=r;L7441:while(1){r=(a[n+(B*40&-1)|0]&1)==0;L7443:do{if(!r){C=c[n+(B*40&-1)+36>>2]|0;D=n+(B*40&-1)+32|0;E=0;while(1){if((E|0)>=(C|0)){break}if((a[m+((c[D>>2]|0)+E|0)|0]|0)==(a[E+103664|0]|0)){E=E+1|0}else{break L7443}}if((E|0)==1){t=5677;break L7441}}}while(0);if((b|0)==4|(b|0)==5|(b|0)==7){if((o|0)<=(B|0)|r){F=B;t=5651;break}D=c[n+(B*40&-1)+36>>2]|0;C=n+(B*40&-1)+32|0;G=0;while(1){if((G|0)>=(D|0)){break}if((a[m+((c[C>>2]|0)+G|0)|0]|0)==(a[G+199040|0]|0)){G=G+1|0}else{F=B;t=5652;break L7441}}if((G|0)!=1){F=B;t=5654;break}C=B+1|0;c[13898]=C;if((C|0)<(o|0)){H=q;I=1;J=0;K=C;L=o;M=n}else{F=C;t=5653;break}L7467:while(1){C=I;N=K;while(1){D=(a[M+(N*40&-1)|0]&1)==0;L7471:do{if(!D){r=c[M+(N*40&-1)+36>>2]|0;O=M+(N*40&-1)+32|0;P=c[10036]|0;Q=0;while(1){if((Q|0)>=(r|0)){break}if((a[P+((c[O>>2]|0)+Q|0)|0]|0)==(a[Q+103664|0]|0)){Q=Q+1|0}else{break L7471}}if((Q|0)==1){F=N;t=5656;break L7441}}}while(0);if(C){break}if(D|(L|0)<=(N|0)){t=5648;break L7441}R=c[M+(N*40&-1)+36>>2]|0;S=M+(N*40&-1)+32|0;T=c[10036]|0;O=0;while(1){if((O|0)>=(R|0)){break}if((a[T+((c[S>>2]|0)+O|0)|0]|0)==(a[O+148464|0]|0)){O=O+1|0}else{U=0;break L7467}}if((O|0)!=1){U=0;break L7467}D=N+1|0;c[13898]=D;if((D|0)<(L|0)){C=1;N=D}else{F=D;t=5655;break L7441}}V=J+1|0;if((V|0)>=4){t=5507;break L7441}C=is(g)|0;E=c[C>>2]|0;if((E|0)==1){W=+(c[C+8>>2]|0)}else if((E|0)==3){W=+uz(c[C+8>>2]|0,0)}else if((E|0)==2){W=+h[C+8>>3]}else{t=5502;break L7441}if((c[j>>2]|0)==3){uu(c[z>>2]|0);c[j>>2]=1}h[H>>3]=W;C=c[13898]|0;E=c[8272]|0;if((C|0)>=(E|0)){F=C;t=5657;break L7441}H=H+8|0;I=0;J=V;K=C;L=E;M=c[1054]|0}while(1){if((U|0)>=(R|0)){break}if((a[T+((c[S>>2]|0)+U|0)|0]|0)==(a[U+131272|0]|0)){U=U+1|0}else{t=5649;break L7441}}if((U|0)!=1){t=5647;break}G=N+1|0;c[13898]=G;if((J|0)==0){F=G;t=5650;break}else{X=J}}else if((b|0)==3|(b|0)==2){X=1}else{G=is(f)|0;E=c[G>>2]|0;if((E|0)==2){Y=+h[G+8>>3]}else if((E|0)==3){Y=+uz(c[G+8>>2]|0,0)}else if((E|0)==1){Y=+(c[G+8>>2]|0)}else{t=5522;break}if((c[l>>2]|0)==3){uu(c[s>>2]|0);c[l>>2]=1}h[q>>3]=Y;X=1}if((A|0)>=(c[11864]|0)){t=5528;break}do{if((b|0)==7){if((X|0)!=3){t=5615;break L7441}Z=+h[q>>3];_=+h[y>>3];$=+h[w>>3];if(Z*Z+_*_+$*$<2.220446049250313e-14){t=5617;break L7441}G=(c[12172]|0)+(A*232&-1)+88|0;c[G>>2]=c[x>>2];c[G+4>>2]=c[x+4>>2];c[G+8>>2]=c[x+8>>2];c[G+12>>2]=c[x+12>>2];c[G+16>>2]=c[x+16>>2];c[G+20>>2]=c[x+20>>2]}else if((b|0)==2){aa=c[13898]|0;G=c[1054]|0;E=c[G+(aa*40&-1)+36>>2]|0;C=(E|0)>3?3:E;E=c[10036]|0;D=c[G+(aa*40&-1)+32>>2]|0;G=0;while(1){P=G+1|0;a[k+G|0]=a[E+D|0]|0;if((P|0)==(C|0)){break}else{D=D+1|0;G=P}}a[k+C|0]=0;G=uA(p|0)|0;if((G|0)!=(b4(p|0,154840)|0)){t=5542;break L7441}if((cy(p|0,154104)|0)!=0){G=c[12172]|0;if((c[G+(A*232&-1)>>2]|0)==0){t=5546;break L7441}c[G+(A*232&-1)+12>>2]=d}if((cy(p|0,153744)|0)!=0){G=c[12172]|0;if((c[G+(A*232&-1)+4>>2]|0)==0){t=5550;break L7441}c[G+(A*232&-1)+16>>2]=d}if((cy(p|0,153360)|0)!=0){G=c[12172]|0;if((c[G+(A*232&-1)+8>>2]|0)==0){t=5554;break L7441}c[G+(A*232&-1)+20>>2]=d}c[13898]=(c[13898]|0)+1}else if((b|0)==1){G=c[12172]|0;if((c[G+(A*232&-1)>>2]|0)==0){t=5538;break L7441}$=+h[q>>3];if($==0.0){c[G+(A*232&-1)+12+(d<<2)>>2]=0;break}if($!=1.0){t=5537;break L7441}c[G+(A*232&-1)+12+(d<<2)>>2]=1}else if((b|0)==0){$=+h[q>>3];h[(c[12172]|0)+(A*232&-1)+24+(d<<3)>>3]=$;if($<=0.0){t=5531;break L7441}}else if((b|0)==3){G=c[12172]|0;if((c[G+(A*232&-1)>>2]|0)==0){if((c[G+(A*232&-1)+140>>2]|0)==0){t=5659;break L7441}}if((c[G+(A*232&-1)+4>>2]|0)==0){if((c[G+(A*232&-1)+144>>2]|0)==0){t=5658;break L7441}}do{if((c[G+(A*232&-1)+8>>2]|0)==0){if((c[G+(A*232&-1)+148>>2]|0)!=0){t=5564;break}D=c[13898]|0;E=(c[8272]|0)>(D|0);P=c[1054]|0;r=P+(D*40&-1)|0;ab=P+(D*40&-1)+36|0;ac=P+(D*40&-1)+32|0;D=c[10036]|0;P=c[12094]|0;if(!E){t=5668;break L7441}do{if((a[r]&1)==0){t=5629}else{ad=c[ab>>2]|0;ae=0;while(1){if((ae|0)>=(ad|0)){t=5580;break}if((a[D+((c[ac>>2]|0)+ae|0)|0]|0)==(a[P+ae|0]|0)){ae=ae+1|0}else{break}}if((t|0)==5580){t=0;if((a[P+ae|0]|0)==0){af=0;break}}if(E){t=5629}else{t=5666;break L7441}}}while(0);L7551:do{if((t|0)==5629){t=0;P=c[12098]|0;L7553:do{if((a[r]&1)!=0){O=c[ab>>2]|0;ad=0;while(1){if((ad|0)>=(O|0)){break}if((a[D+((c[ac>>2]|0)+ad|0)|0]|0)==(a[P+ad|0]|0)){ad=ad+1|0}else{break L7553}}if((a[P+ad|0]|0)==0){af=1;break L7551}}}while(0);P=c[12102]|0;if(!E){t=5669;break L7441}if((a[r]&1)!=0){ae=c[ab>>2]|0;O=0;while(1){if((O|0)>=(ae|0)){t=5639;break}if((a[D+((c[ac>>2]|0)+O|0)|0]|0)==(a[P+O|0]|0)){O=O+1|0}else{break}}if((t|0)==5639){t=0;if((a[P+O|0]|0)==0){af=2;break}}if(!E){t=5667;break L7441}}ae=c[12106]|0;if((a[r]&1)==0){t=5670;break L7441}Q=c[ab>>2]|0;ag=0;while(1){if((ag|0)>=(Q|0)){break}if((a[D+((c[ac>>2]|0)+ag|0)|0]|0)==(a[ae+ag|0]|0)){ag=ag+1|0}else{t=5665;break L7441}}if((a[ae+ag|0]|0)==0){af=3}else{t=5664;break L7441}}}while(0);ac=G+(A*232&-1)+112|0;D=48380+(af<<4)|0;c[ac>>2]=c[D>>2];c[ac+4>>2]=c[D+4>>2];c[ac+8>>2]=c[D+8>>2]}else{t=5564}}while(0);if((t|0)==5564){t=0;C=c[13898]|0;D=(c[8272]|0)>(C|0);ac=c[1054]|0;ab=ac+(C*40&-1)|0;r=ac+(C*40&-1)+36|0;E=ac+(C*40&-1)+32|0;C=c[10036]|0;ac=0;L7579:while(1){Q=c[48184+(ac<<4)>>2]|0;L7581:do{if(D){if((a[ab]&1)==0){break}O=c[r>>2]|0;P=0;while(1){if((P|0)>=(O|0)){break}if((a[C+((c[E>>2]|0)+P|0)|0]|0)==(a[Q+P|0]|0)){P=P+1|0}else{break L7581}}if((a[Q+P|0]|0)==0){t=5571;break L7579}}}while(0);Q=ac+1|0;if(Q>>>0<12){ac=Q}else{ah=Q;break}}if((t|0)==5571){t=0;E=G+(A*232&-1)+112|0;C=48188+(ac<<4)|0;c[E>>2]=c[C>>2];c[E+4>>2]=c[C+4>>2];c[E+8>>2]=c[C+8>>2];ah=ac}if((ah|0)==12){t=5574;break L7441}}C=G+(A*232&-1)+152|0;c[C>>2]=c[12148];c[C+4>>2]=c[48596>>2];c[C+8>>2]=c[48600>>2];c[13898]=(c[13898]|0)+1}else if((b|0)==4|(b|0)==5){c[(c[12172]|0)+(A*232&-1)+48>>2]=u;if((d|0)==2){if((X|0)!=3){t=5592;break L7441}}else if((d|0)==0){if((X|0)!=3){t=5594;break L7441}}else if((d|0)==1){if((X|0)!=2){t=5589;break L7441}h[w>>3]=0.0}else{t=5595;break L7441}C=(c[12172]|0)+(A*232&-1)+56|0;c[C>>2]=c[x>>2];c[C+4>>2]=c[x+4>>2];c[C+8>>2]=c[x+8>>2];c[C+12>>2]=c[x+12>>2];c[C+16>>2]=c[x+16>>2];c[C+20>>2]=c[x+20>>2]}else if((b|0)==8){$=+h[q>>3];c[(c[12172]|0)+(A*232&-1)+128>>2]=~~$;C=c[(c[12172]|0)+(A*232&-1)+128>>2]|0;if(+(C|0)!=$|(C|0)<0){t=5586;break L7441}}else if((b|0)==6){C=c[13898]|0;E=c[1054]|0;r=a[E+(C*40&-1)|0]|0;L7602:do{if((c[8272]|0)>(C|0)){if((r&1)==0){t=5604;break}ab=c[E+(C*40&-1)+36>>2]|0;D=E+(C*40&-1)+32|0;Q=c[10036]|0;O=0;while(1){if((O|0)>=(ab|0)){break}if((a[Q+((c[D>>2]|0)+O|0)|0]|0)==(a[O+99680|0]|0)){O=O+1|0}else{t=5604;break L7602}}if((O|0)!=2){t=5604;break}h[q>>3]=+h[q>>3]*3.141592653589793;c[13898]=C+1}else{t=5604}}while(0);L7610:do{if((t|0)==5604){t=0;G=c[E+(C*40&-1)+36>>2]|0;if(!((r&1)!=0&(G|0)>0)){break}ac=c[10036]|0;D=0;Q=0;ab=c[E+(C*40&-1)+32>>2]|0;while(1){if((a[D+123032|0]|0)==(a[ac+(D+ab|0)|0]|0)){ai=ab;aj=Q}else{if((D|0)!=1){break L7610}ai=ab-1|0;aj=1}ag=D+1|0;if((ag|0)<(aj+G|0)){D=ag;Q=aj;ab=ai}else{break}}if((aj|0)==0){if(!((D|0)==0|(D|0)==7)){break}}h[q>>3]=+h[q>>3]*.017453292519943295;c[13898]=C+1}}while(0);h[(c[12172]|0)+(A*232&-1)+80>>3]=+h[q>>3]}else{t=5619;break L7441}}while(0);C=c[13898]|0;E=c[8272]|0;if((E|0)<=(C|0)){t=5674;break}r=c[1054]|0;if((a[r+(C*40&-1)|0]&1)==0){t=5675;break}ab=c[r+(C*40&-1)+36>>2]|0;Q=r+(C*40&-1)+32|0;G=c[10036]|0;ac=0;while(1){if((ac|0)>=(ab|0)){break}if((a[G+((c[Q>>2]|0)+ac|0)|0]|0)==(a[ac+183584|0]|0)){ac=ac+1|0}else{t=5676;break L7441}}if((ac|0)!=1){t=5671;break}Q=C+1|0;c[13898]=Q;if((Q|0)<(E|0)){A=A+1|0;B=Q;n=r;o=E;m=G}else{t=5672;break}}if((t|0)==5649){uf(N,148888,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5650){uf(F,149968,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5651){uf(F,149968,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5652){uf(F,149968,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5542){uf(aa,154448,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5546){uf(aa,158792,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5528){uf(c[13898]|0,158272,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5574){uf(c[13898]|0,152504,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5592){uf(c[13898]|0,151520,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5615){uf(c[13898]|0,150440,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5531){uf((c[13898]|0)-2|0,156288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5554){uf(c[13898]|0,158792,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5550){uf(c[13898]|0,158792,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5647){uf(N,148888,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5648){uf(N,148888,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5594){uf(c[13898]|0,151168,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5595){uf(c[13898]|0,150960,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5666){ak=c[13898]|0;uf(ak,152080,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5667){ak=c[13898]|0;uf(ak,152080,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5668){ak=c[13898]|0;uf(ak,152080,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5669){ak=c[13898]|0;uf(ak,152080,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5537){uf((c[13898]|0)-1|0,155200,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5538){uf(c[13898]|0,158792,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5589){uf(c[13898]|0,151648,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5653){uf(F,149968,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5654){uf(F,149968,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5655){uf(F,149968,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5656){uf(F,149968,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5657){uf(F,149968,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5617){uf(c[13898]|0,150304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5619){uf(-1,150112,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5670){ak=c[13898]|0;uf(ak,152080,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5671){i=e;return}else if((t|0)==5672){i=e;return}else if((t|0)==5674){i=e;return}else if((t|0)==5675){i=e;return}else if((t|0)==5676){i=e;return}else if((t|0)==5586){uf(c[13898]|0,151928,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5502){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5522){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5507){uf(N-1|0,149640,(v=i,i=i+8|0,c[v>>2]=V,v)|0)}else if((t|0)==5664){ak=c[13898]|0;uf(ak,152080,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5665){ak=c[13898]|0;uf(ak,152080,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5658){al=c[13898]|0;uf(al,152856,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5659){al=c[13898]|0;uf(al,152856,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==5677){i=e;return}}function eU(d){d=d|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0;f=i;i=i+8|0;g=f|0;c[g>>2]=d;h=8;j=0;k=d;L7680:while(1){d=k;while(1){l=a[d]|0;if((l<<24>>24|0)==0|(l<<24>>24|0)==34|(l<<24>>24|0)==39){m=5681;break L7680}else if((l<<24>>24|0)==37){break}else if((l<<24>>24|0)!=32){m=5715;break L7680}l=d+1|0;c[g>>2]=l;d=l}l=d+1|0;c[g>>2]=l;n=a[l]|0;o=n<<24>>24==42;if(o){p=d+2|0;c[g>>2]=p;q=p;r=a[p]|0}else{q=l;r=n}if(((r<<24>>24)-48|0)>>>0<10){n=aE(q|0,g|0,10)|0;s=n;t=c[g>>2]|0}else{s=1;t=q}n=b[23918]|0;L7692:do{if(n<<16>>16==0){u=0;m=5710}else{l=c[11958]|0;p=0;while(1){w=b[l+(p<<4)+4>>1]|0;if(w<<16>>16==0){x=0}else{y=c[l+(p<<4)>>2]|0;z=0;while(1){A=c[y+(z<<2)>>2]|0;B=uA(A|0)|0;if((a_(t|0,A|0,B|0)|0)==0){A=t+B|0;if((aZ(163032,a[A]|0|0,5)|0)!=0){C=A;D=p;E=47832;F=l;break L7692}}A=z+1|0;if((A|0)<(w&65535|0)){z=A}else{x=A;break}}}z=p+1|0;if((z|0)<(n&65535|0)){p=z}else{u=x;m=5710;break}}}}while(0);L7704:do{if((m|0)==5710){m=0;n=b[23922]|0;if(n<<16>>16==0){G=0;H=u}else{d=c[11960]|0;p=0;while(1){l=b[d+(p<<4)+4>>1]|0;if(l<<16>>16==0){I=0}else{z=c[d+(p<<4)>>2]|0;w=0;while(1){y=c[z+(w<<2)>>2]|0;A=uA(y|0)|0;if((a_(t|0,y|0,A|0)|0)==0){y=t+A|0;if((aZ(163032,a[y]|0|0,5)|0)!=0){C=y;D=p;E=47840;F=d;break L7704}}y=w+1|0;if((y|0)<(l&65535|0)){w=y}else{I=y;break}}}w=p+1|0;if((w|0)<(n&65535|0)){p=w}else{G=w;H=I;break}}}if((G|0)!=(e[23922]|0|0)){h=h;j=j;k=t;continue L7680}if((H|0)==(e[(c[11960]|0)+(G-1<<4)+4>>1]|0|0)){m=5714;break L7680}else{h=h;j=j;k=t;continue L7680}}}while(0);c[g>>2]=C;if(o){p=c[11950]|0;if((p|0)==0){m=5706;break}n=aa(e[F+(D<<4)+12>>1]|0,s);d=p+(j*12&-1)|0;c[d>>2]=n+(c[d>>2]|0);h=h;j=j;k=C;continue}if((s|0)>0){J=j;K=0}else{h=h;j=j;k=C;continue}while(1){L=J+1|0;d=J+2|0;if((d|0)<=0){m=5697;break L7680}n=c[11950]|0;if((c[11884]|0)<(d|0)){p=db(n,d*12&-1,215112)|0;c[11950]=p;c[11884]=d;M=p}else{M=n}c[M+(L*12&-1)>>2]=0;n=c[(c[E>>2]|0)+(D<<4)+8>>2]|0;if((L|0)<=0){m=5701;break L7680}p=c[11950]|0;if((c[11884]|0)<(L|0)){d=db(p,L*12&-1,215112)|0;c[11950]=d;c[11884]=L;N=d}else{N=p}c[N+(J*12&-1)+4>>2]=n;b[(c[11950]|0)+(J*12&-1)+8>>1]=b[48036+(n<<4)>>1]|0;n=K+1|0;if((n|0)<(s|0)){J=L;K=n}else{break}}h=c[(c[E>>2]|0)+(D<<4)+8>>2]|0;j=L;k=C}if((m|0)==5706){uf(-1,162376,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((m|0)==5714){uf(c[13898]|0,160672,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((m|0)==5715){uf(c[13898]|0,159280,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((m|0)==5701){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=215616,v)|0)}else if((m|0)==5697){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=215616,v)|0)}else if((m|0)==5681){if((j|0)>=(c[11876]|0)){O=j;c[11876]=O;i=f;return}C=48036+(h<<4)|0;k=j;while(1){j=k+1|0;if((j|0)<=0){m=5717;break}L=c[11950]|0;if((c[11884]|0)<(j|0)){D=db(L,j*12&-1,215112)|0;c[11950]=D;c[11884]=j;P=D}else{P=L}c[P+(k*12&-1)>>2]=0;if((k|0)<=0){m=5721;break}L=c[11950]|0;if((c[11884]|0)<(k|0)){D=db(L,k*12&-1,215112)|0;c[11950]=D;c[11884]=k;Q=D}else{Q=L}L=k-1|0;c[Q+(L*12&-1)>>2]=0;D=c[11950]|0;if((c[11884]|0)<(k|0)){E=db(D,k*12&-1,215112)|0;c[11950]=E;c[11884]=k;R=E}else{R=D}c[R+(L*12&-1)+4>>2]=h;b[(c[11950]|0)+(L*12&-1)+8>>1]=b[C>>1]|0;if((j|0)<(c[11876]|0)){k=j}else{O=j;m=5735;break}}if((m|0)==5717){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=215616,v)|0)}else if((m|0)==5721){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=215616,v)|0)}else if((m|0)==5735){c[11876]=O;i=f;return}}}function eV(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0,E=0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0,L=0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0,R=0.0,S=0.0;b=i;do{if(a[34104]|0){if((a[37400]&1)==0){break}d=c[m>>2]|0;aI(144664,24,1,d|0)}}while(0);d=c[11854]|0;if((d|0)==1){e=5741}else if((d|0)==0){if((a6(c[8802]|0,c[8716]|0,c[12892]|0)|0)==0){f=0;i=b;return f|0}if(a[34104]|0){c[9354]=(c[9354]|0)+1;g=0}else{g=0}while(1){j=c[8802]|0;k=(uA(j+g|0)|0)+g|0;if((k|0)>0){l=j+(k-1|0)|0;if((a[l]|0)==10){e=5792;break}}n=c[8716]|0;if((n-k|0)>>>0<32){o=n<<1;c[8716]=o;p=db(j,o,84816)|0;c[8802]=p;q=p;r=c[8716]|0}else{q=j;r=n}if((a6(q+k|0,r-k|0,c[12892]|0)|0)==0){e=5796;break}else{g=k}}if((e|0)==5792){a[l]=0;f=c[8802]|0;i=b;return f|0}else if((e|0)==5796){f=c[8802]|0;i=b;return f|0}}else{s=d}if((e|0)==5741){e=c[11852]|0;d=c[6352]|0;if((e|0)>=(d|0)){f=0;i=b;return f|0}if((e|0)==0){if((a[32936]&1)!=0){uf(-1,144512,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}if((a[30528]&1)!=0){uf(-1,144512,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}if(+h[8256]==-8.988465674311579e+307){h[8256]=10.0}if(+h[8255]==8.988465674311579e+307){h[8255]=-10.0}l=c[200]|0;t=+h[64664+(l*688&-1)>>3];h[5960]=t;u=+h[64672+(l*688&-1)>>3];h[5961]=u;g=a[64788+(l*688&-1)|0]|0;do{if((g&1)==0){w=u;x=t}else{if(t>0.0&u>0.0){y=+_(+t);z=+h[64800+(l*688&-1)>>3];A=y/z;h[5960]=A;y=+_(+u)/z;h[5961]=y;w=y;x=A;break}else{uf(-1,218096,(v=i,i=i+8|0,c[v>>2]=56832+(l*24&-1),v)|0);return 0}}}while(0);u=(w-x)/+(d-1|0);h[5959]=u;B=x;C=u;D=l;E=g}else{g=c[200]|0;B=+h[5960];C=+h[5959];D=g;E=a[64788+(g*688&-1)|0]|0}u=B+ +(e|0)*C;if((E&1)==0){F=u}else{F=+Z(+(u*+h[64800+(D*688&-1)>>3]))}D=c[8802]|0;be(D|0,170912,(v=i,i=i+8|0,h[v>>3]=F,v)|0);c[11852]=(c[11852]|0)+1;s=c[11854]|0}if((s|0)==2){s=c[11852]|0;if((s|0)>=(c[11926]|0)&(s|0)>0){c[11852]=0;D=(c[11850]|0)+1|0;c[11850]=D;f=(D|0)<(c[11924]|0)?179864:0;i=b;return f|0}D=c[11850]|0;if((D|0)==0){if((c[6352]|0)<2|(c[6350]|0)<2|(c[9344]|0)<2|(c[9342]|0)<2){uf(-1,138240,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}dc(2,145296);dc(1,143440);F=+h[8255];E=a[66164]|0;do{if((E&1)==0){h[5957]=F;G=+h[8256];H=F}else{if(F<=0.0){uk(210984,(v=i,i=i+24|0,c[v>>2]=141960,c[v+8>>2]=56880,h[v+16>>3]=F,v)|0);return 0}u=+_(+F);C=+h[8272];B=u/C;h[5957]=B;u=+h[8256];if(u>0.0){G=+_(+u)/C;H=B;break}else{uk(210984,(v=i,i=i+24|0,c[v>>2]=141960,c[v+8>>2]=56880,h[v+16>>3]=u,v)|0);return 0}}}while(0);h[5958]=G;F=+h[8169];do{if((a[65476]&1)==0){h[5953]=F;I=+h[8170];J=F}else{if(F<=0.0){uk(210984,(v=i,i=i+24|0,c[v>>2]=140304,c[v+8>>2]=56856,h[v+16>>3]=F,v)|0);return 0}u=+_(+F);B=+h[8186];C=u/B;h[5953]=C;u=+h[8170];if(u>0.0){I=+_(+u)/B;J=C;break}else{uk(210984,(v=i,i=i+24|0,c[v>>2]=140304,c[v+8>>2]=56856,h[v+16>>3]=u,v)|0);return 0}}}while(0);h[5954]=I;e=(a[38984]&1)==0?c[6352]|0:c[9344]|0;F=(G-H)/+(e-1|0);h[5956]=F;c[11926]=e;e=c[9342]|0;G=(I-J)/+(e-1|0);h[5955]=G;c[11924]=e;K=c[11852]|0;L=c[11850]|0;M=H;N=F;O=I;P=G;Q=E}else{K=s;L=D;M=+h[5957];N=+h[5956];O=+h[5954];P=+h[5955];Q=a[66164]|0}G=M+N*+(K|0);N=O-P*+(L|0);L=c[8802]|0;if((Q&1)==0){R=G}else{R=+Z(+(G*+h[8272]))}if((a[65476]&1)==0){S=N}else{S=+Z(+(N*+h[8186]))}be(L|0,143424,(v=i,i=i+16|0,h[v>>3]=R,h[v+8>>3]=S,v)|0);c[11852]=(c[11852]|0)+1}f=c[8802]|0;i=b;return f|0}function eW(a){a=a|0;c[9340]=c[a>>2];return}function eX(b){b=b|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0;e=i;i=i+16|0;f=e|0;g=e+8|0;uE(47056,0,28);c[11874]=0;if((a[b]|0)==0){j=0;i=e;return j|0}else{k=b;l=0}while(1){b=c[11882]|0;do{if((b|0)<=(l|0)){m=(b|0)<20?b+20|0:b<<1;n=db(c[11952]|0,m*24&-1,180032)|0;c[11952]=n;o=c[11882]|0;if((o|0)>=(m|0)){break}h[n+(o*24&-1)>>3]=0.0;c[n+(o*24&-1)+16>>2]=0;o=(c[11882]|0)+1|0;c[11882]=o;if((o|0)<(m|0)){p=o}else{break}do{o=c[11952]|0;h[o+(p*24&-1)>>3]=0.0;c[o+(p*24&-1)+16>>2]=0;p=(c[11882]|0)+1|0;c[11882]=p;}while((p|0)<(m|0))}}while(0);c[(c[11952]|0)+((c[11874]|0)*24&-1)+12>>2]=k;b=c[11874]|0;do{if((b|0)==((c[262]|0)-1|0)){c[11764]=k;if((c[263]|0)!=1){q=b;break}c[(c[11952]|0)+(b*24&-1)+8>>2]=1;q=c[11874]|0}else{q=b}}while(0);do{if((q|0)==((c[265]|0)-1|0)){c[11765]=k;if((c[266]|0)!=1){r=q;break}c[(c[11952]|0)+(q*24&-1)+8>>2]=1;r=c[11874]|0}else{r=q}}while(0);do{if((r|0)==((c[268]|0)-1|0)){c[11766]=k;if((c[269]|0)!=1){s=r;break}c[(c[11952]|0)+(r*24&-1)+8>>2]=1;s=c[11874]|0}else{s=r}}while(0);do{if((s|0)==((c[271]|0)-1|0)){c[11767]=k;if((c[272]|0)!=1){t=s;break}c[(c[11952]|0)+(s*24&-1)+8>>2]=1;t=c[11874]|0}else{t=s}}while(0);do{if((t|0)==((c[274]|0)-1|0)){c[11768]=k;if((c[275]|0)!=1){u=t;break}c[(c[11952]|0)+(t*24&-1)+8>>2]=1;u=c[11874]|0}else{u=t}}while(0);do{if((u|0)==((c[277]|0)-1|0)){c[11769]=k;if((c[278]|0)!=1){v=u;break}c[(c[11952]|0)+(u*24&-1)+8>>2]=1;v=c[11874]|0}else{v=u}}while(0);do{if((v|0)==((c[280]|0)-1|0)){c[11770]=k;if((c[281]|0)!=1){break}c[(c[11952]|0)+(v*24&-1)+8>>2]=1}}while(0);b=a[k]|0;if(b<<24>>24!=34|(a[47120]|0)==0){w=k;x=0;y=b}else{b=k+1|0;c[(c[11952]|0)+((c[11874]|0)*24&-1)+12>>2]=b;w=b;x=1;y=a[b]|0}L7903:do{if(y<<24>>24==34){c[(c[11952]|0)+((c[11874]|0)*24&-1)+8>>2]=-5;c[(c[11952]|0)+((c[11874]|0)*24&-1)+8>>2]=-8;c[11874]=(c[11874]|0)+1;if(x){z=w}else{A=w;B=5850}}else{b=c[8528]|0;do{if((b|0)!=0){m=uA(b|0)|0;if((a_(w|0,b|0,m|0)|0)!=0){break}o=w+m|0;if((aM(d[o]|0|0)|0)==0){if((a[o]|0)!=0){break}}c[(c[11952]|0)+((c[11874]|0)*24&-1)+8>>2]=-5;C=+uz(133568,0);o=c[11874]|0;h[(c[11952]|0)+(o*24&-1)>>3]=C;c[11874]=o+1;if(x){A=w;B=5850;break L7903}else{z=w;break L7903}}}while(0);b=(c[11874]|0)+1|0;o=c[11870]|0;L7912:do{if((o|0)==0|a[43464]^1){B=5835}else{do{if((o|0)>0){if((c[262]|0)==(b|0)){B=5835;break L7912}if((o|0)<=1){D=w;break}if((c[265]|0)==(b|0)){B=5835;break L7912}if((o|0)<=2){D=w;break}if((c[268]|0)==(b|0)){B=5835;break L7912}if((o|0)<=3){D=w;break}if((c[271]|0)==(b|0)){B=5835;break L7912}if((o|0)<=4){D=w;break}if((c[274]|0)==(b|0)|(o|0)>5){B=5835;break L7912}else{D=w}}else{D=w}}while(0);while(1){m=(aM(d[D]|0|0)|0)!=0;E=a[D]|0;F=a[47120]|0;G=E<<24>>24!=F<<24>>24;if(!(m&G)){break}D=D+1|0}m=E<<24>>24==0?0:G&1;if(F<<24>>24==0|x^1){H=D;I=x;J=E}else{n=D;while(1){K=n+1|0;L=a[K]|0;if((L<<24>>24|0)==0|(L<<24>>24|0)==34){H=K;I=0;J=L;break}else{n=K}}}n=H;K=J;while(1){if((aM(K&255|0)|0)!=0){M=n;N=I;O=m;P=0;break L7912}L=a[n]|0;Q=n+1|0;if(L<<24>>24==0|L<<24>>24==(a[47120]|0)){M=n;N=I;O=m;P=0;break L7912}n=Q;K=a[Q]|0}}}while(0);if((B|0)==5835){B=0;C=+uz(w,f);h[(c[11952]|0)+((c[11874]|0)*24&-1)>>3]=C;o=c[f>>2]|0;M=w;N=x;O=(o|0)!=(w|0)&1;P=o-w|0}do{if((a[47712]&1)!=0&(O|0)==1){o=M+P|0;b=a[o]|0;if(!((b<<24>>24|0)==100|(b<<24>>24|0)==68|(b<<24>>24|0)==113|(b<<24>>24|0)==81)){R=1;break}a[o]=101;C=+uz(M,g);h[(c[11952]|0)+((c[11874]|0)*24&-1)>>3]=C;K=(c[g>>2]|0)!=(M|0)&1;a[o]=b;R=K}else{R=O}}while(0);c[(c[11952]|0)+((c[11874]|0)*24&-1)+8>>2]=(R|0)==1&1;K=(cg(+(+h[(c[11952]|0)+((c[11874]|0)*24&-1)>>3]))|0)==0;b=c[11874]|0;if(K){c[(c[11952]|0)+(b*24&-1)+8>>2]=0;c[11874]=(c[11874]|0)+1;if(N){A=M;B=5850;break}else{z=M;break}}else{c[11874]=b+1;if(N){A=M;B=5850;break}else{z=M;break}}}}while(0);if((B|0)==5850){while(1){B=0;b=A+1|0;K=a[b]|0;if((K<<24>>24|0)==0|(K<<24>>24|0)==34){z=b;break}else{A=b;B=5850}}}b=a[47120]|0;L7951:do{if(b<<24>>24==0){K=z;while(1){if((aM(d[K]|0|0)|0)!=0){S=K;break}if((a[K]|0)==0){S=K;break}K=K+1|0}while(1){if((aM(d[S]|0|0)|0)==0){T=S;break L7951}S=S+1|0}}else{K=z;while(1){U=a[K]|0;if(!(U<<24>>24!=0&U<<24>>24!=b<<24>>24)){break}K=K+1|0}if(U<<24>>24==b<<24>>24){V=K}else{T=K;break}while(1){o=V+1|0;n=a[o]|0;if(n<<24>>24==0){T=o;break L7951}if((aM(n&255|0)|0)==0){T=o;break L7951}if((a[o]|0)==(a[47120]|0)){T=o;break}else{V=o}}}}while(0);b=c[11874]|0;if((a[T]|0)==0){j=b;break}else{k=T;l=b}}i=e;return j|0}function eY(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0;d=i;i=i+24|0;e=d|0;f=(c[13898]|0)+2|0;c[13898]=f;g=c[1054]|0;L7970:do{if((a[g+(f*40&-1)|0]&1)!=0){j=c[10810]|0;L7972:do{if((j|0)!=0){k=(c[8272]|0)>(f|0);l=g+(f*40&-1)+36|0;m=g+(f*40&-1)+32|0;n=c[10036]|0;o=j;L7974:while(1){p=c[o+4>>2]|0;L7976:do{if(k){q=c[l>>2]|0;r=0;while(1){if((r|0)>=(q|0)){break}if((a[n+((c[m>>2]|0)+r|0)|0]|0)==(a[p+r|0]|0)){r=r+1|0}else{break L7976}}if((a[p+r|0]|0)==0){break L7974}}}while(0);p=c[o>>2]|0;if((p|0)==0){break L7972}else{o=p}}if((a[o+8|0]&1)!=0){break}if((c[o+16>>2]|0)==1){break L7970}}}while(0);it();j=c[18070]|0;m=db(j,c[j>>2]<<5|8,105624)|0;c[18070]=0;j=c[11870]|0;n=c[11872]|0;c[1056+((n+j|0)*12&-1)>>2]=m;a[43464]=0;s=1;t=c[13898]|0;u=j;w=n;x=t+1|0;c[13898]=x;y=w+u|0;z=1052+(y*12&-1)|0;c[z>>2]=b;A=1048+(y*12&-1)|0;c[A>>2]=s;B=w+1|0;c[11872]=B;i=d;return}}while(0);f=is(e)|0;g=c[f>>2]|0;if((g|0)==3){C=+uz(c[f+8>>2]|0,0)}else if((g|0)==2){C=+h[f+8>>3]}else if((g|0)==1){C=+(c[f+8>>2]|0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=e|0;if((c[f>>2]|0)==3){uu(c[e+8>>2]|0);c[f>>2]=1}f=~~C;e=c[11870]|0;g=c[11872]|0;c[1056+((g+e|0)*12&-1)>>2]=0;n=c[13898]|0;if((f|0)<1){uf(n,140472,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{s=f;t=n;u=e;w=g;x=t+1|0;c[13898]=x;y=w+u|0;z=1052+(y*12&-1)|0;c[z>>2]=b;A=1048+(y*12&-1)|0;c[A>>2]=s;B=w+1|0;c[11872]=B;i=d;return}}function eZ(a){a=a|0;var b=0;a=c[6354]|0;if((c[14296+(a*24&-1)>>2]|0)==1){b=14304+(a*24&-1)|0;c[b>>2]=(c[b>>2]|0)!=0&1;i=i;return}else{uf(-1,207704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}function e_(a){a=a|0;var b=0,d=0;b=i;d=c[6354]|0;if((c[14296+(d*24&-1)>>2]|0)!=1){uf(-1,207704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((c[14304+(d*24&-1)>>2]|0)==0){c[9340]=c[a>>2];i=b;return}if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-1;i=b;return}function e$(a){a=a|0;var b=0,d=0;b=i;d=c[6354]|0;if((c[14296+(d*24&-1)>>2]|0)!=1){uf(-1,207704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((c[14304+(d*24&-1)>>2]|0)!=0){c[9340]=c[a>>2];i=b;return}if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-1;i=b;return}function e0(a){a=a|0;var b=0,d=0;b=i;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-1;if((c[14296+(d*24&-1)>>2]|0)!=1){uf(-1,207704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((c[14304+(d*24&-1)>>2]|0)!=0){i=b;return}c[9340]=c[a>>2];i=b;return}function e1(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;if((a|0)==0){return}b=a|0;if((c[b>>2]|0)>0){d=0;do{e=a+8+(d<<5)|0;f=c[e>>2]|0;do{if((f|0)==1|(f|0)==31){g=a+8+(d<<5)+8|0;if((c[g>>2]|0)!=3){h=f;break}uu(c[a+8+(d<<5)+16>>2]|0);c[g>>2]=1;h=c[e>>2]|0}else{h=f}}while(0);if((h|0)==8){f=a+8+(d<<5)+8|0;e1(c[(c[f>>2]|0)+8>>2]|0);uu(c[f>>2]|0)}d=d+1|0;}while((d|0)<(c[b>>2]|0))}uu(a);return}function e2(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=c[10810]|0;if((e|0)==0){return}else{f=e}L8058:while(1){e=c[f+4>>2]|0;do{if(d){if((a_(b|0,e|0,uA(b|0)|0)|0)!=0){break}a[f+8|0]=1;g=f+16|0;if((c[g>>2]|0)!=3){break}uu(c[f+24>>2]|0);c[g>>2]=1}else{if((aY(b|0,e|0)|0)==0){break L8058}}}while(0);e=c[f>>2]|0;if((e|0)==0){h=5965;break}else{f=e}}if((h|0)==5965){return}a[f+8|0]=1;h=f+16|0;if((c[h>>2]|0)!=3){return}uu(c[f+24>>2]|0);c[h>>2]=1;return}function e3(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;e=e6(b)|0;if((e|0)==0){return}b=e+8|0;do{if((a[b]&1)==0){if((aY(c[e+24>>2]|0,d|0)|0)==0){return}f=e+16|0;if((c[f>>2]|0)!=3){break}uu(c[e+24>>2]|0);c[f>>2]=1}else{a[b]=0}}while(0);if((d|0)==0){g=0}else{g=bP(d|0)|0}c[e+16>>2]=3;c[e+24>>2]=g;return}function e4(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,t=0.0;e=i;f=1;g=0;j=i;i=i+168|0;c[j>>2]=0;while(1)switch(f|0){case 1:a[1960]=0;k=al(4)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return}r=s=0;c[k>>2]=0;c[6354]=-1;if((a[43504]&1)==0){f=3;break}else{f=2;break};case 2:if((a[47472]&1)==0){f=3;break}else{f=5;break};case 3:l=uL(42120,f,j)|0;f=27;break;case 27:if((l|0)==0){f=4;break}else{f=26;break};case 4:av(2,8,136);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return}r=s=0;f=5;break;case 5:n=c[9340]|0;o=0;f=6;break;case 6:if((o|0)<(c[b>>2]|0)){f=7;break}else{f=9;break};case 7:k=c[b+8+(o<<5)>>2]|0;c[9340]=1;am(c[41164+(k<<3)>>2]|0,b+8+(o<<5)+8|0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return}r=s=0;p=c[9340]|0;if((k-37|0)>>>0<4|(p|0)==1){o=p+o|0;f=6;break}else{f=8;break};case 8:ar(6,-1|0,113648,(v=i,i=i+8|0,c[v>>2]=206200,v)|0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return}r=s=0;case 9:c[9340]=n;if((a[43504]&1)==0){f=11;break}else{f=10;break};case 10:if((a[47472]&1)==0){f=11;break}else{f=12;break};case 11:av(2,8,0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return}r=s=0;f=12;break;case 12:p=al(4)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return}r=s=0;if((c[p>>2]|0)==33){f=14;break}else{f=13;break};case 13:p=al(4)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return}r=s=0;if((c[p>>2]|0)==34){f=14;break}else{f=15;break};case 14:a[1960]=1;f=26;break;case 15:if((a[1960]&1)==0){f=16;break}else{f=26;break};case 16:q=c[6354]|0;if((q|0)<0){f=17;break}else{f=18;break};case 17:ar(6,-1|0,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return}r=s=0;case 18:c[6354]=q-1;p=d;k=14296+(q*24&-1)|0;c[p>>2]=c[k>>2];c[p+4>>2]=c[k+4>>2];c[p+8>>2]=c[k+8>>2];c[p+12>>2]=c[k+12>>2];c[p+16>>2]=c[k+16>>2];c[p+20>>2]=c[k+20>>2];if((q|0)==0){f=20;break}else{f=19;break};case 19:au(4,209896,98,1,c[m>>2]|0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return}r=s=0;f=20;break;case 20:k=c[d>>2]|0;if((k|0)==1){f=21;break}else if((k|0)==2){f=22;break}else if((k|0)==3){t=0.0;f=24;break}else{f=23;break};case 21:t=+(c[d+8>>2]|0);f=24;break;case 22:t=+h[d+8>>3];f=24;break;case 23:ar(6,-1|0,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return}r=s=0;case 24:if(t>8.988465674311579e+307|t<-8.988465674311579e+307){f=25;break}else{f=26;break};case 25:a[1960]=1;f=26;break;case 26:i=e;return;case-1:if((g|0)==3){l=s;f=27}r=s=0;break}}function e5(b){b=b|0;aV(8,136);a[1960]=1;cv(42120|0,1)}function e6(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;e=43240;while(1){f=c[e>>2]|0;if((f|0)==0){break}if((aY(b|0,c[f+4>>2]|0)|0)==0){g=f;h=5992;break}else{e=f|0}}if((h|0)==5992){i=d;return g|0}h=ut(40)|0;do{if((h|0)==0){gk();f=ut(40)|0;if((f|0)!=0){j=f;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=213816,v)|0);return 0}else{j=h}}while(0);c[e>>2]=j;c[j>>2]=0;if((b|0)==0){k=0}else{k=bP(b|0)|0}c[(c[e>>2]|0)+4>>2]=k;a[(c[e>>2]|0)+8|0]=1;c[(c[e>>2]|0)+16>>2]=0;g=c[e>>2]|0;i=d;return g|0}function e7(b){b=b|0;var d=0,e=0,f=0.0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0;d=i;if((b|0)==3|(b|0)==2|(b|0)==0){e=6024}else if((b|0)==1){e8(2);e8(1);e8(6);e8(5);e8(0);e8(3);e8(8);e8(9);e8(10);f=+h[8685];j=e6(205392)|0;if((j|0)!=0){a[j+8|0]=0;c[j+16>>2]=2;h[j+24>>3]=f;h[j+32>>3]=0.0}f=+h[8701];j=e6(204792)|0;if((j|0)!=0){a[j+8|0]=0;c[j+16>>2]=2;h[j+24>>3]=f;h[j+32>>3]=0.0}j=c[16536]|0;f=+h[(c[3524]|0)+176>>3];k=e6(187496)|0;if((k|0)!=0){a[k+8|0]=0;c[k+16>>2]=1;c[k+24>>2]=~~(+(j|0)/f)}j=c[16537]|0;f=+h[(c[3524]|0)+176>>3];k=e6(186968)|0;if((k|0)!=0){a[k+8|0]=0;c[k+16>>2]=1;c[k+24>>2]=~~(+(j|0)/f)}j=c[16364]|0;f=+h[(c[3524]|0)+176>>3];k=e6(186448)|0;if((k|0)!=0){a[k+8|0]=0;c[k+16>>2]=1;c[k+24>>2]=~~(+(j|0)/f)}j=c[16365]|0;f=+h[(c[3524]|0)+176>>3];k=e6(185848)|0;if((k|0)!=0){a[k+8|0]=0;c[k+16>>2]=1;c[k+24>>2]=~~(+(j|0)/f)}j=c[13881]|0;k=e6(185384)|0;if((k|0)!=0){a[k+8|0]=0;c[k+16>>2]=1;c[k+24>>2]=j+1}j=c[13883]|0;k=e6(184936)|0;if((k|0)!=0){a[k+8|0]=0;c[k+16>>2]=1;c[k+24>>2]=j+1}j=a[37384]|0;k=e6(204536)|0;if((k|0)!=0){a[k+8|0]=0;c[k+16>>2]=1;c[k+24>>2]=(j&1^1)&255}j=a[37384]|0;k=e6(204264)|0;if((k|0)!=0){a[k+8|0]=0;c[k+16>>2]=1;c[k+24>>2]=j&1}j=c[5094]|0;k=e6(204008)|0;if((k|0)!=0){a[k+8|0]=0;c[k+16>>2]=1;c[k+24>>2]=(j|0)!=0&1}f=+g[3538];j=e6(196288)|0;if((j|0)!=0){a[j+8|0]=0;c[j+16>>2]=2;h[j+24>>3]=f;h[j+32>>3]=0.0}f=+g[3536];j=e6(195744)|0;if((j|0)!=0){a[j+8|0]=0;c[j+16>>2]=2;h[j+24>>3]=f;h[j+32>>3]=0.0}f=+g[3534];j=e6(148264)|0;if((j|0)!=0){a[j+8|0]=0;c[j+16>>2]=2;h[j+24>>3]=f;h[j+32>>3]=0.0}f=+g[3532];j=e6(148040)|0;if((j|0)==0){i=d;return}a[j+8|0]=0;c[j+16>>2]=2;h[j+24>>3]=f;h[j+32>>3]=0.0;i=d;return}do{if((e|0)==6024){j=c[3524]|0;L8156:do{if((j|0)==0){k=e6(202664)|0;if((k|0)==0){break}l=k+8|0;do{if((a[l]&1)==0){if((aY(c[k+24>>2]|0,225016)|0)==0){break L8156}m=k+16|0;if((c[m>>2]|0)!=3){n=m;break}uu(c[k+24>>2]|0);c[m>>2]=1;n=m}else{a[l]=0;n=k+16|0}}while(0);l=bP(225016)|0;c[n>>2]=3;c[k+24>>2]=l}else{e3(202664,c[j>>2]|0)}}while(0);j=e6(201560)|0;L8167:do{if((j|0)!=0){l=j+8|0;do{if((a[l]&1)==0){if((aY(c[j+24>>2]|0,13048)|0)==0){break L8167}m=j+16|0;if((c[m>>2]|0)!=3){o=m;break}uu(c[j+24>>2]|0);c[m>>2]=1;o=m}else{a[l]=0;o=j+16|0}}while(0);l=bP(13048)|0;c[o>>2]=3;c[j+24>>2]=l}}while(0);j=c[8244]|0;e3(200696,(j|0)!=0?j:179864);e3(199888,c[44936+(c[11252]<<2)>>2]|0);if((b|0)==3){p=43240}else if((b|0)==2){j=e6(199272)|0;if((j|0)==0){i=d;return}else{a[j+8|0]=0;c[j+16>>2]=1;c[j+24>>2]=1;break}}else{break}while(1){j=c[p>>2]|0;if((j|0)==0){e=6045;break}if((aY(198952,c[j+4>>2]|0)|0)==0){q=j;e=6049;break}else{p=j|0}}if((e|0)==6045){j=ut(40)|0;do{if((j|0)==0){gk();l=ut(40)|0;if((l|0)!=0){r=l;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=213816,v)|0)}else{r=j}}while(0);c[p>>2]=r;c[r>>2]=0;j=bP(198952)|0;c[(c[p>>2]|0)+4>>2]=j;a[(c[p>>2]|0)+8|0]=1;c[(c[p>>2]|0)+16>>2]=0;j=c[p>>2]|0;if((j|0)==0){s=43240}else{q=j;e=6049}}do{if((e|0)==6049){j=q+8|0;if((a[j]&1)==0){s=43240;break}a[j]=0;f=+uz(40152,0);c[q+16>>2]=2;h[q+24>>3]=f;h[q+32>>3]=0.0;s=43240}}while(0);while(1){j=c[s>>2]|0;if((j|0)==0){e=6053;break}if((aY(198528,c[j+4>>2]|0)|0)==0){t=j;e=6057;break}else{s=j|0}}if((e|0)==6053){j=ut(40)|0;do{if((j|0)==0){gk();l=ut(40)|0;if((l|0)!=0){u=l;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=213816,v)|0)}else{u=j}}while(0);c[s>>2]=u;c[u>>2]=0;j=bP(198528)|0;c[(c[s>>2]|0)+4>>2]=j;a[(c[s>>2]|0)+8|0]=1;c[(c[s>>2]|0)+16>>2]=0;j=c[s>>2]|0;if((j|0)==0){w=43240}else{t=j;e=6057}}L8202:do{if((e|0)==6057){if((a[t+8|0]&1)==0){w=43240;break}j=e6(198528)|0;if((j|0)==0){w=43240;break}l=j+8|0;do{if((a[l]&1)==0){if((aY(c[j+24>>2]|0,40160)|0)==0){w=43240;break L8202}k=j+16|0;if((c[k>>2]|0)!=3){x=k;break}uu(c[j+24>>2]|0);c[k>>2]=1;x=k}else{a[l]=0;x=j+16|0}}while(0);l=bP(40160)|0;c[x>>2]=3;c[j+24>>2]=l;w=43240}}while(0);while(1){l=c[w>>2]|0;if((l|0)==0){e=6067;break}if((aY(198248,c[l+4>>2]|0)|0)==0){y=l;e=6071;break}else{w=l|0}}if((e|0)==6067){l=ut(40)|0;do{if((l|0)==0){gk();k=ut(40)|0;if((k|0)!=0){z=k;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=213816,v)|0)}else{z=l}}while(0);c[w>>2]=z;c[z>>2]=0;l=bP(198248)|0;c[(c[w>>2]|0)+4>>2]=l;a[(c[w>>2]|0)+8|0]=1;c[(c[w>>2]|0)+16>>2]=0;l=c[w>>2]|0;if((l|0)!=0){y=l;e=6071}}do{if((e|0)==6071){if((a[y+8|0]&1)==0){break}e3(198248,c[13388]|0)}}while(0);l=e6(104120)|0;if((l|0)!=0){a[l+8|0]=0;c[l+16>>2]=1;c[l+24>>2]=0}l=e6(204536)|0;if((l|0)!=0){a[l+8|0]=0;c[l+16>>2]=1;c[l+24>>2]=0}l=e6(204264)|0;if((l|0)!=0){a[l+8|0]=0;c[l+16>>2]=1;c[l+24>>2]=0}l=lt()|0;e3(197288,l);uu(l);e3(199888,c[44936+(c[11252]<<2)>>2]|0);l=e6(196632)|0;if((l|0)!=0){a[l+8|0]=0;c[l+16>>2]=2;h[l+24>>3]=3.141592653589793;h[l+32>>3]=0.0}f=+uz(133568,0);l=e6(196016)|0;if((l|0)==0){break}a[l+8|0]=0;c[l+16>>2]=2;h[l+24>>3]=f;h[l+32>>3]=0.0}}while(0);L8239:do{if((b-3|0)>>>0<2){y=e6(199272)|0;if((y|0)!=0){a[y+8|0]=0;c[y+16>>2]=1;c[y+24>>2]=0}y=e6(137752)|0;if((y|0)==0){break}w=y+8|0;do{if((a[w]&1)==0){if((a[c[y+24>>2]|0]|0)==0){break L8239}z=y+16|0;if((c[z>>2]|0)!=3){A=z;break}uu(c[y+24>>2]|0);c[z>>2]=1;A=z}else{a[w]=0;A=y+16|0}}while(0);w=bP(179864)|0;c[A>>2]=3;c[y+24>>2]=w}}while(0);if((b|0)==5|(b|0)==3){e=6094}else if((b|0)!=6){i=d;return}do{if((e|0)==6094){A=ut(4096)|0;do{if((A|0)==0){gk();w=ut(4096)|0;if((w|0)!=0){B=w;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=193744,v)|0)}else{B=A}}while(0);bl(B|0,4096);e3(192848,B);uu(B);if((b|0)==6){break}i=d;return}}while(0);b=c[12900]|0;B=e6(191128)|0;if((B|0)==0){i=d;return}a[B+8|0]=0;c[B+16>>2]=1;c[B+24>>2]=b;i=d;return}function e8(b){b=b|0;var d=0,e=0,f=0.0,g=0.0,j=0.0,k=0.0,l=0.0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0.0;d=i;i=i+24|0;e=64788+(b*688&-1)|0;f=+h[64664+(b*688&-1)>>3];if((a[e]&1)==0){g=+h[64672+(b*688&-1)>>3];j=f}else{k=+h[64800+(b*688&-1)>>3];l=+Z(+(f*k));g=+Z(+(+h[64672+(b*688&-1)>>3]*k));j=l}m=(c[64656+(b*688&-1)>>2]&2|0)!=0&j>g;l=m?j:g;k=m?g:j;m=d|0;n=56832+(b*24&-1)|0;be(m|0,182200,(v=i,i=i+24|0,c[v>>2]=184544,c[v+8>>2]=n,c[v+16>>2]=184256,v)|0);o=a[m]|0;if(o<<24>>24!=0){p=m;q=o;do{a[p]=bC(q<<24>>24|0)&255;p=p+1|0;q=a[p]|0;}while(q<<24>>24!=0)}q=e6(m)|0;if((q|0)!=0){a[q+8|0]=0;c[q+16>>2]=2;h[q+24>>3]=k;h[q+32>>3]=0.0}be(m|0,182200,(v=i,i=i+24|0,c[v>>2]=184544,c[v+8>>2]=n,c[v+16>>2]=183776,v)|0);q=a[m]|0;if(q<<24>>24!=0){p=m;o=q;do{a[p]=bC(o<<24>>24|0)&255;p=p+1|0;o=a[p]|0;}while(o<<24>>24!=0)}o=e6(m)|0;if((o|0)!=0){a[o+8|0]=0;c[o+16>>2]=2;h[o+24>>3]=l;h[o+32>>3]=0.0}l=+h[64792+(b*688&-1)>>3];be(m|0,182200,(v=i,i=i+24|0,c[v>>2]=184544,c[v+8>>2]=n,c[v+16>>2]=183416,v)|0);o=a[m]|0;if(o<<24>>24!=0){p=m;q=o;do{a[p]=bC(q<<24>>24|0)&255;p=p+1|0;q=a[p]|0;}while(q<<24>>24!=0)}q=e6(m)|0;if((q|0)!=0){a[q+8|0]=0;c[q+16>>2]=2;h[q+24>>3]=l;h[q+32>>3]=0.0}if(b>>>0>=7){i=d;return}l=+h[64712+(b*688&-1)>>3];if((a[e]&1)==0){r=l}else{r=+Z(+(l*+h[64800+(b*688&-1)>>3]))}be(m|0,182200,(v=i,i=i+24|0,c[v>>2]=182880,c[v+8>>2]=n,c[v+16>>2]=184256,v)|0);q=a[m]|0;if(q<<24>>24!=0){p=m;o=q;do{a[p]=bC(o<<24>>24|0)&255;p=p+1|0;o=a[p]|0;}while(o<<24>>24!=0)}o=e6(m)|0;if((o|0)!=0){a[o+8|0]=0;c[o+16>>2]=2;h[o+24>>3]=r;h[o+32>>3]=0.0}r=+h[64720+(b*688&-1)>>3];if((a[e]&1)==0){s=r}else{s=+Z(+(r*+h[64800+(b*688&-1)>>3]))}be(m|0,182200,(v=i,i=i+24|0,c[v>>2]=182880,c[v+8>>2]=n,c[v+16>>2]=183776,v)|0);n=a[m]|0;if(n<<24>>24!=0){b=m;e=n;do{a[b]=bC(e<<24>>24|0)&255;b=b+1|0;e=a[b]|0;}while(e<<24>>24!=0)}e=e6(m)|0;if((e|0)==0){i=d;return}a[e+8|0]=0;c[e+16>>2]=2;h[e+24>>3]=s;h[e+32>>3]=0.0;i=d;return}function e9(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;i=i+16|0;d=c[6354]|0;if((d|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}e=d+1|0;c[6354]=e;d=14296+(e*24&-1)|0;c[d>>2]=3;c[14304+(e*24&-1)>>2]=a;f=d+12|0;d=b|0;c[f>>2]=c[d>>2];c[f+4>>2]=c[d+4>>2];c[f+8>>2]=c[d+8>>2];if((a|0)==0){g=e}else{e=bP(a|0)|0;a=c[6354]|0;c[14304+(a*24&-1)>>2]=e;g=a}if((g|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}a=g+1|0;c[6354]=a;g=14296+(a*24&-1)|0;c[g>>2]=1;c[14304+(a*24&-1)>>2]=-1;a=g+12|0;c[a>>2]=c[d>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];hb(0);d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else{c[6354]=d-1;i=b;return c[14304+(d*24&-1)>>2]|0}return 0}function fa(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;i=i+16|0;e=c[6354]|0;if((e|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}f=e+1|0;c[6354]=f;e=14296+(f*24&-1)|0;c[e>>2]=3;c[14304+(f*24&-1)>>2]=a;g=e+12|0;e=d|0;c[g>>2]=c[e>>2];c[g+4>>2]=c[e+4>>2];c[g+8>>2]=c[e+8>>2];if((a|0)==0){h=f}else{f=bP(a|0)|0;a=c[6354]|0;c[14304+(a*24&-1)>>2]=f;h=a}if((h|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}a=h+1|0;c[6354]=a;h=14296+(a*24&-1)|0;c[h>>2]=1;c[14304+(a*24&-1)>>2]=b;b=h+12|0;c[b>>2]=c[e>>2];c[b+4>>2]=c[e+4>>2];c[b+8>>2]=c[e+8>>2];hb(0);e=c[6354]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else{c[6354]=e-1;i=d;return c[14304+(e*24&-1)>>2]|0}return 0}function fb(){var b=0,d=0;uD(42280,101104,9);b=a8(42280,0)|0;while(1){d=b-1|0;if((a[d]|0)==10){b=d}else{break}}d=b;w=10;a[d]=w&255;w=w>>8;a[d+1|0]=w&255;aK(42280,c[m>>2]|0);d=b+1|0;w=10;a[d]=w&255;w=w>>8;a[d+1|0]=w&255;d=c[8762]|0;if((d|0)!=0){cf(d|0,146328,(v=i,i=i+8|0,c[v>>2]=42280,v)|0);d=c[8762]|0;az(d|0);c[8762]=0}d=c[10062]|0;if((d|0)!=0){e1(d);c[10062]=0}aV(2,4);aV(13,1);uf(-1,130168,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}function fc(d,e){d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0.0,O=0,P=0.0,Q=0,R=0.0,S=0,T=0,U=0;f=i;i=i+968|0;g=f|0;j=f+256|0;k=f+512|0;l=f+576|0;m=f+704|0;n=f+960|0;o=j|0;do{if((e|0)==0){p=6169}else{if((a[e]|0)==0){p=6169;break}q=m|0;uF(q|0,d|0,256);if((uA(d|0)|0)>>>0<256){r=e;break}a[m+255|0]=0;r=e}}while(0);do{if((p|0)==6169){e=m|0;uB(e|0,d|0);q=m+(uA(e|0)|0)|0;a[q]=a[214408]|0;a[q+1|0]=a[214409|0]|0;a[q+2|0]=a[214410|0]|0;a[q+3|0]=a[214411|0]|0;a[q+4|0]=a[214412|0]|0;if((b8(d|0,e|0)|0)==0){r=d;break}be(42289,213616,(v=i,i=i+16|0,c[v>>2]=d,c[v+8>>2]=e,v)|0);fb()}}while(0);d=m|0;e=g|0;g=(uA(d|0)|0)-1|0;q=m+g|0;L8361:do{if((g|0)<0){s=q}else{m=q;while(1){t=a[m]|0;if((t<<24>>24|0)==92|(t<<24>>24|0)==47|(t<<24>>24|0)==58){s=m;break L8361}t=m-1|0;if(t>>>0>>0){s=t;break}else{m=t}}}}while(0);uB(e|0,s+1|0);s=hA(d,193632)|0;if((s|0)==0){be(42289,101576,(v=i,i=i+8|0,c[v>>2]=d,v)|0);fb()}d=bF(r|0,137896)|0;if((d|0)==0){be(42289,89920,(v=i,i=i+8|0,c[v>>2]=r,v)|0);fb()}L8372:do{if((a6(o|0,256,s|0)|0)!=0){r=l|0;q=l;g=l+126|0;m=k|0;t=k+63|0;u=0;L8374:while(1){w=o;while(1){x=a[w]|0;if((x<<24>>24|0)==35|(x<<24>>24|0)==0){aK(o|0,d|0);if((a6(o|0,256,s|0)|0)==0){break L8372}else{w=o;continue}}else if((x<<24>>24|0)==32|(x<<24>>24|0)==9|(x<<24>>24|0)==10){w=w+1|0;continue}else{break}}w=a8(o|0,35)|0;if((w|0)==0){b[q>>1]=10;y=o}else{uF(r|0,w|0,127);if((uA(w|0)|0)>>>0>=127){a[g]=0}a[w]=0;y=o}while(1){w=a[y]|0;if((w<<24>>24|0)==10|(w<<24>>24|0)==0){z=0;A=u;B=o;break}else if(!((w<<24>>24|0)==32|(w<<24>>24|0)==9|(w<<24>>24|0)==61)){p=6190;break}y=y+1|0}if((p|0)==6190){p=0;w=cy(y|0,213208)|0;if((w|0)==0){C=y+(uA(y|0)|0)|0}else{C=w}w=a[C]|0;a[C]=0;z=y;A=w;B=C+1|0}w=a[z]|0;if(w<<24>>24!=0){x=z;D=w;do{if((bs(D&255|0)|0)==0){if((a[x]|0)!=95){p=6244;break L8374}}x=x+1|0;D=a[x]|0;}while(D<<24>>24!=0)}if((uA(z|0)|0)>>>0>50){p=6243;break}uF(m|0,z|0,64);if((uA(z|0)|0)>>>0>=64){a[t]=0}if(A<<24>>24==61){E=B}else{D=a8(B|0,61)|0;if((D|0)==0){p=6203;break}E=D+1|0}D=E;while(1){x=a[D]|0;if((x<<24>>24|0)==10|(x<<24>>24|0)==0){F=0;G=A;H=E;break}else if(!((x<<24>>24|0)==32|(x<<24>>24|0)==9|(x<<24>>24|0)==61)){p=6208;break}D=D+1|0}if((p|0)==6208){p=0;x=cy(D|0,213208)|0;if((x|0)==0){I=D+(uA(D|0)|0)|0}else{I=x}x=a[I]|0;a[I]=0;F=D;G=x;H=I+1|0}if((ca(F|0,148448,(v=i,i=i+8|0,c[v>>2]=n,v)|0)|0)==0){p=6212;break}else{J=H}while(1){x=a[J]|0;if((x<<24>>24|0)==10|(x<<24>>24|0)==0){K=G;break}else if(!((x<<24>>24|0)==32|(x<<24>>24|0)==9|(x<<24>>24|0)==61)){p=6215;break}J=J+1|0}if((p|0)==6215){p=0;D=cy(J|0,213208)|0;if((D|0)==0){L=J+(uA(J|0)|0)|0}else{L=D}D=a[L]|0;a[L]=0;if((J|0)==0){K=D}else{p=6218;break}}D=43240;while(1){M=c[D>>2]|0;if((M|0)==0){p=6221;break}if((aY(m|0,c[M+4>>2]|0)|0)==0){p=6223;break}else{D=M|0}}if((p|0)==6223){p=0;D=c[M+16>>2]|0;if((D|0)==1){N=+(c[M+24>>2]|0)}else if((D|0)==3){N=+uz(c[M+24>>2]|0,0)}else if((D|0)==2){N=+h[M+24>>3]}else{p=6227;break}h[n>>3]=N;if(N==0.0){O=43240;p=6229}else{P=N}}else if((p|0)==6221){p=0;h[n>>3]=0.0;O=43240;p=6229}if((p|0)==6229){while(1){p=0;Q=c[O>>2]|0;if((Q|0)==0){R=0.0;break}if((aY(m|0,c[Q+4>>2]|0)|0)==0){p=6231;break}else{O=Q|0;p=6229}}do{if((p|0)==6231){p=0;if((c[Q+16>>2]|0)!=1){R=0.0;break}R=+(c[Q+24>>2]|0)}}while(0);h[n>>3]=R;P=R}be(o|0,170912,(v=i,i=i+8|0,h[v>>3]=P,v)|0);do{if((a8(o|0,46)|0)==0){if((a8(o|0,101)|0)!=0){break}D=j+(uA(o|0)|0)|0;a[D]=a[119960]|0;a[D+1|0]=a[119961|0]|0;a[D+2|0]=a[119962|0]|0}}while(0);cf(d|0,209168,(v=i,i=i+24|0,c[v>>2]=m,c[v+8>>2]=o,c[v+16>>2]=r,v)|0);if((a6(o|0,256,s|0)|0)==0){break L8372}else{u=K}}if((p|0)==6243){S=az(d|0)|0;T=az(s|0)|0;U=be(42289,80408,(v=i,i=i+8|0,c[v>>2]=e,v)|0)|0;fb()}else if((p|0)==6203){az(d|0);az(s|0);be(42289,80408,(v=i,i=i+8|0,c[v>>2]=e,v)|0);fb()}else if((p|0)==6212){az(d|0);az(s|0);be(42289,80408,(v=i,i=i+8|0,c[v>>2]=e,v)|0);fb()}else if((p|0)==6244){S=az(d|0)|0;T=az(s|0)|0;U=be(42289,80408,(v=i,i=i+8|0,c[v>>2]=e,v)|0)|0;fb()}else if((p|0)==6227){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((p|0)==6218){az(d|0);az(s|0);be(42289,80408,(v=i,i=i+8|0,c[v>>2]=e,v)|0);fb()}}}while(0);if((az(d|0)|0)!=0){uD(42289,203968,24);fb()}if((az(s|0)|0)==0){i=f;return}else{uD(42289,203968,24);fb()}}function fd(){var b=0,e=0,f=0,g=0,j=0,k=0,l=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0.0,B=0.0,C=0,D=0.0,E=0.0,F=0,G=0.0,H=0,I=0.0,J=0.0,K=0.0,L=0,M=0.0,N=0.0,R=0.0,S=0,T=0.0,U=0.0,V=0.0,W=0,X=0.0,Y=0.0,Z=0.0,$=0.0,ab=0.0,ac=0.0,ad=0.0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0.0,aq=0,ar=0,as=0,at=0,au=0.0,av=0,aw=0.0,ax=0,ay=0,aA=0,aB=0,aC=0,aD=0,aE=0,aG=0,aH=0,aJ=0,aL=0,aM=0,aN=0,aO=0,aP=0,aR=0,aS=0,aU=0.0,aW=0,aX=0,aZ=0,a_=0,a$=0,a0=0,a2=0,a3=0,a4=0,a5=0,a7=0,a9=0,ba=0,bb=0.0,bc=0,bd=0,bf=0,bg=0,bh=0,bi=0,bj=0,bk=0,bl=0,bm=0,bn=0,bo=0,bp=0,bq=0,br=0,bt=0,bu=0,bv=0,bw=0,bx=0,by=0,bz=0,bB=0,bC=0.0,bE=0,bG=0.0,bH=0.0,bI=0.0,bK=0,bL=0.0,bM=0,bN=0.0,bQ=0,bR=0,bS=0.0,bT=0,bV=0.0,bW=0.0,bX=0.0,bY=0,bZ=0,b_=0,b$=0,b0=0,b1=0,b2=0,b3=0,b4=0,b5=0,b6=0.0;b=i;i=i+320|0;e=b|0;f=b+8|0;g=b+16|0;j=b+40|0;k=b+88|0;l=b+136|0;n=b+216|0;p=b+240|0;q=b+272|0;r=q;s=i;i=i+56|0;t=i;i=i+4|0;i=i+7>>3<<3;u=i;i=i+688|0;w=i;i=i+8|0;x=i;i=i+1025|0;i=i+7>>3<<3;uE(p|0,-1|0,28);y=(c[13898]|0)+1|0;c[13898]=y;z=c[16507]|0;c[16506]=z;if((z&3|0)==0){A=+h[8258];B=+h[8257];if(A>3];if((a[66164]&1)==0){G=0.0}else{G=+_(+(+h[8271]))}h[8272]=G;h[8261]=8.988465674311579e+307;h[8262]=-8.988465674311579e+307;C=c[16335]|0;c[16334]=C;if((C&3|0)==0){G=+h[8172];D=+h[8171];if(G>3];if((a[65476]&1)==0){K=0.0}else{K=+_(+(+h[8185]))}h[8186]=K;h[8175]=8.988465674311579e+307;h[8176]=-8.988465674311579e+307;H=c[17539]|0;c[17538]=H;if((H&3|0)==0){K=+h[8774];I=+h[8773];if(K>3];if((a[70292]&1)==0){R=0.0}else{R=+_(+(+h[8787]))}h[8788]=R;h[8777]=8.988465674311579e+307;h[8778]=-8.988465674311579e+307;L=c[17711]|0;c[17710]=L;if((L&3|0)==0){R=+h[8860];M=+h[8859];if(R>3];if((a[70980]&1)==0){V=0.0}else{V=+_(+(+h[8873]))}h[8874]=V;h[8863]=8.988465674311579e+307;h[8864]=-8.988465674311579e+307;S=c[17883]|0;c[17882]=S;if((S&3|0)==0){V=+h[8946];T=+h[8945];if(V>3];if((a[71668]&1)==0){Z=0.0}else{Z=+_(+(+h[8959]))}h[8960]=Z;h[8949]=8.988465674311579e+307;h[8950]=-8.988465674311579e+307;W=c[16163]|0;c[16162]=W;do{if((W&3|0)==0){Z=+h[8086];X=+h[8085];if(Z>=X){$=X;ab=Z;F=6281;break}h[8083]=Z;ac=X}else{$=+h[8085];ab=+h[8086];F=6281}}while(0);if((F|0)==6281){h[8083]=(W&1|0)==0?$:8.988465674311579e+307;ac=(W&2|0)==0?ab:-8.988465674311579e+307}h[8084]=ac;if((a[64788]&1)==0){ad=0.0}else{ad=+_(+(+h[8099]))}h[8100]=ad;h[8089]=8.988465674311579e+307;h[8090]=-8.988465674311579e+307;c[200]=2;c[144]=1;c[34]=0;L8524:do{if((c[8272]|0)>(y|0)){W=u;S=p+24|0;L=-1;H=0;C=y;while(1){z=c[1054]|0;if((a[z+(C*40&-1)|0]&1)==0){ae=L;af=H;ag=C;break L8524}ah=c[z+(C*40&-1)+36>>2]|0;ai=z+(C*40&-1)+32|0;z=c[10036]|0;aj=0;while(1){if((aj|0)>=(ah|0)){break}if((a[z+((c[ai>>2]|0)+aj|0)|0]|0)==(a[aj+78280|0]|0)){aj=aj+1|0}else{ae=L;af=H;ag=C;break L8524}}if((aj|0)!=1){ae=L;af=H;ag=C;break L8524}if((H|0)>5){break}ai=c[42584+(H<<2)>>2]|0;uD(W|0,64648+(ai*688&-1)|0,688);c[S>>2]=c[p+(ai<<2)>>2];c[p+(H<<2)>>2]=dr(ai,-1)|0;ai=c[13898]|0;z=H+1|0;if((c[8272]|0)>(ai|0)){L=ai;H=z;C=ai}else{ae=ai;af=z;ag=ai;break L8524}}uf(C,192712,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{ae=-1;af=0;ag=y}}while(0);y=c[10062]|0;if((y|0)!=0){e1(y);c[10062]=0}c[11670]=40240;uB(42608,24544);uB(42659,24595);y=0;do{H=c[p+(y<<2)>>2]|0;if((H|0)>-1){L=c[1054]|0;S=c[L+(H*40&-1)+36>>2]|0;W=(S|0)>49?49:S;S=c[10036]|0;ai=c[L+(H*40&-1)+32>>2]|0;H=0;while(1){L=H+1|0;a[55600+(y*51&-1)+H|0]=a[S+ai|0]|0;if((L|0)==(W|0)){break}else{ai=ai+1|0;H=L}}a[55600+(y*51&-1)+W|0]=0}else{uB(55600+(y*51&-1)|0,42608+(y*51&-1)|0)}y=y+1|0;}while((y|0)<5);it();y=c[18070]|0;H=db(y,c[y>>2]<<5|8,105624)|0;c[18070]=0;c[10062]=H;c[11670]=0;H=c[13898]|0;if((H|0)>=(c[8272]|0)){ak=H;uf(ak,205112,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}y=c[1054]|0;L8553:do{if((a[y+(H*40&-1)|0]&1)!=0){ai=c[y+(H*40&-1)+36>>2]|0;S=y+(H*40&-1)+32|0;C=c[10036]|0;L=0;while(1){if((L|0)>=(ai|0)){break}if((a[C+((c[S>>2]|0)+L|0)|0]|0)==(a[L+103664|0]|0)){L=L+1|0}else{break L8553}}if((L|0)==1){ak=H}else{break}uf(ak,205112,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);a[14176]=1;is(n);a[14176]=0;if((c[n>>2]|0)!=3){c[13898]=H;ak=H;uf(ak,205112,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}y=c[n+8>>2]|0;if((y|0)==0){ak=c[13898]|0;uf(ak,205112,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[11856]=0;c[13486]=ey(y,7,0)|0;uu(y);y=c[13486]|0;if((y|0)<0){uf(-1,120240,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((y|0)==1){uf(c[13898]|0,174456,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}ak=(y|0)<3?1:y-2|0;c[8304]=ak;if((c[64808+((c[200]|0)*688&-1)>>2]|0)==1&(y|0)<2){uf(c[13898]|0,84448,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((c[64808+((c[144]|0)*688&-1)>>2]|0)==1&(y|0)<1){uf(c[13898]|0,106024,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((ak|0)>0){y=(ak|0)>1?ak:1;uD(48840,42584,y<<2);al=y}else{al=0}c[48840+(al<<2)>>2]=0;c[48840+(al+1<<2)>>2]=99;al=c[p+4>>2]|0;if((al|0)>-1&(ak|0)==1){uf(al,159352,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}al=ak+1|0;if((af|0)>(al|0)){uf(ae,152936,(v=i,i=i+8|0,c[v>>2]=ak,v)|0)}if((af|0)==(al|0)&(ak|0)<5){ak=af-1|0;af=c[42584+(ak<<2)>>2]|0;al=64648+(af*688&-1)|0;ae=al|0;y=c[34]|0;c[64648+(y*688&-1)>>2]=c[ae>>2];n=c[ae>>2]|0;if((n&1|0)==0){h[64664+(y*688&-1)>>3]=+h[64664+(af*688&-1)>>3];am=c[ae>>2]|0}else{am=n}if((am&2|0)==0){h[64672+(y*688&-1)>>3]=+h[64672+(af*688&-1)>>3]}uD(al|0,u|0,688);c[p+(ak<<2)>>2]=c[p+24>>2]}p=c[13898]|0;ak=43240;while(1){an=c[ak>>2]|0;if((an|0)==0){ao=43240;break}if((aY(214968,c[an+4>>2]|0)|0)==0){F=6337;break}else{ak=an|0}}do{if((F|0)==6337){ak=c[an+16>>2]|0;if((ak|0)==2){ap=+h[an+24>>3]}else if((ak|0)==3){ap=+uz(c[an+24>>2]|0,0)}else if((ak|0)==1){ap=+(c[an+24>>2]|0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if(!(ap<1.0&ap>0.0)){ao=43240;break}h[5479]=ap;ao=43240}}while(0);while(1){aq=c[ao>>2]|0;if((aq|0)==0){ar=0;break}if((aY(215432,c[aq+4>>2]|0)|0)==0){F=6346;break}else{ao=aq|0}}do{if((F|0)==6346){if((c[aq+16>>2]|0)!=1){ar=0;break}ar=c[aq+24>>2]|0}}while(0);c[8708]=ar;ar=43240;while(1){as=c[ar>>2]|0;if((as|0)==0){at=43240;break}if((aY(215960,c[as+4>>2]|0)|0)==0){F=6351;break}else{ar=as|0}}do{if((F|0)==6351){ar=c[as+16>>2]|0;if((ar|0)==1){au=+(c[as+24>>2]|0)}else if((ar|0)==2){au=+h[as+24>>3]}else if((ar|0)==3){au=+uz(c[as+24>>2]|0,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if(au<=0.0){at=43240;break}h[1782]=au;bD(150480,(v=i,i=i+8|0,h[v>>3]=au,v)|0);at=43240}}while(0);while(1){av=c[at>>2]|0;if((av|0)==0){break}if((aY(216424,c[av+4>>2]|0)|0)==0){F=6360;break}else{at=av|0}}do{if((F|0)==6360){at=c[av+16>>2]|0;if((at|0)==1){aw=+(c[av+24>>2]|0)}else if((at|0)==2){aw=+h[av+24>>3]}else if((at|0)==3){aw=+uz(c[av+24>>2]|0,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if(aw<=0.0){break}h[4485]=aw;h[4484]=aw;bD(148576,(v=i,i=i+8|0,h[v>>3]=aw,v)|0)}}while(0);uu(c[10638]|0);c[10638]=0;av=bU(217040)|0;if((av|0)!=0){c[10638]=bP(av|0)|0}av=fg()|0;at=c[8762]|0;do{if((at|0)==0){as=bF(av|0,205056)|0;c[8762]=as;if((as|0)!=0){ax=as;break}be(42289,144360,(v=i,i=i+8|0,c[v>>2]=av,v)|0);fb()}else{ax=at}}while(0);if((av|0)==0){ay=ax}else{uu(av);ay=c[8762]|0}aI(142744,82,1,ay|0);cG(t|0);ay=c[8762]|0;av=aT(t|0)|0;cf(ay|0,141312,(v=i,i=i+8|0,c[v>>2]=av,v)|0);av=p-1|0;p=c[1054]|0;ay=(c[p+(av*40&-1)+36>>2]|0)+(c[p+(av*40&-1)+32>>2]|0)|0;av=db(0,(ay+1|0)-(c[p+(H*40&-1)+32>>2]|0)|0,116456)|0;p=c[(c[1054]|0)+(H*40&-1)+32>>2]|0;L8653:do{if((p|0)<(ay|0)){t=p;ax=av;while(1){at=a[(c[10036]|0)+t|0]|0;if(at<<24>>24==0){aA=ax;break L8653}as=ax+1|0;a[ax]=at;at=t+1|0;if((at|0)<(ay|0)){t=at;ax=as}else{aA=as;break}}}else{aA=av}}while(0);a[aA]=0;cf(c[8762]|0,139528,(v=i,i=i+8|0,c[v>>2]=av,v)|0);aI(137608,17,1,c[8762]|0);uu(av);L8658:do{if((c[8304]|0)>0){av=0;while(1){aA=c[13486]|0;ay=c[8762]|0;if((av|0)>=(aA-1|0)){aB=ay;aC=aA;break L8658}cf(ay|0,135712,(v=i,i=i+8|0,c[v>>2]=55600+(av*51&-1),v)|0);ay=av+1|0;if((ay|0)<(c[8304]|0)){av=ay}else{F=6378;break}}}else{F=6378}}while(0);if((F|0)==6378){aB=c[8762]|0;aC=c[13486]|0}cf(aB|0,((aC|0)<3?134160:132576)|0,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);aC=c[8304]|0;if((aC|0)<0){aD=aC}else{aB=l|0;l=0;av=0;ay=aC;while(1){if((c[64648+(l*688&-1)>>2]&3|0)==3){aE=ay}else{aC=c[8762]|0;if((av|0)==0){aG=77416}else{aG=55600+(av*51&-1)|0}cf(aC|0,220408,(v=i,i=i+8|0,c[v>>2]=aG,v)|0);aA=64648+(l*688&-1)|0;do{if((c[aA>>2]&1|0)==0){if((c[64808+(l*688&-1)>>2]|0)==1){aF(34,aC|0);p=64813+(l*688&-1)|0;aw=+h[64664+(l*688&-1)>>3];t3(k,aw);au=aw- +O(+aw);t4(aB,80,p,k,au);aK(aB|0,aC|0);aF(34,aC|0);break}else{au=+h[64664+(l*688&-1)>>3];cf(aC|0,92736,(v=i,i=i+8|0,h[v>>3]=au,v)|0);break}}else{aF(42,aC|0)}}while(0);aI(223968,3,1,aC|0);do{if((c[aA>>2]&2|0)==0){if((c[64808+(l*688&-1)>>2]|0)==1){aF(34,aC|0);p=64813+(l*688&-1)|0;au=+h[64672+(l*688&-1)>>3];t3(j,au);aw=au- +O(+au);t4(aB,80,p,j,aw);aK(aB|0,aC|0);aF(34,aC|0);break}else{aw=+h[64672+(l*688&-1)>>3];cf(aC|0,92736,(v=i,i=i+8|0,h[v>>3]=aw,v)|0);break}}else{aF(42,aC|0)}}while(0);aI(89968,2,1,aC|0);aE=c[8304]|0}aA=av+1|0;if((aA|0)>(aE|0)){aD=aE;break}else{l=c[42584+(av<<2)>>2]|0;av=aA;ay=aE}}}c[8718]=2048;do{if((aD<<11|0)<1){c[10636]=0;aH=2048;F=6405}else{aE=aD<<14;ay=ut(aE)|0;do{if((ay|0)==0){gk();av=ut(aE)|0;if((av|0)!=0){aJ=av;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=215008,v)|0)}else{aJ=ay}}while(0);ay=c[8718]|0;c[10636]=aJ;if((ay|0)>=1){aH=ay;F=6405;break}c[10634]=0;aL=0}}while(0);do{if((F|0)==6405){aJ=aH<<3;aD=ut(aJ)|0;do{if((aD|0)==0){gk();ay=ut(aJ)|0;if((ay|0)!=0){aM=ay;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=215008,v)|0)}else{aM=aD}}while(0);aD=c[8718]|0;c[10634]=aM;if((aD|0)<1){aL=0;break}aJ=aD<<3;aD=ut(aJ)|0;do{if((aD|0)==0){gk();ay=ut(aJ)|0;if((ay|0)!=0){aN=ay;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=215008,v)|0)}else{aN=aD}}while(0);aL=aN}}while(0);c[10878]=aL;c[8306]=0;uE(r|0,0,48);r=c[8270]|0;do{if((r|0)!=0){if((aY(r|0,139696)|0)==0){break}bA(4,r|0)}}while(0);r=s|0;aL=eC(r,7)|0;L8714:do{if((aL|0)==-1){aO=0}else{aN=q|0;aM=s+8|0;aH=0;aD=aL;while(1){aJ=c[8718]|0;if((c[8306]|0)>=(aJ|0)){ay=(aJ*3&-1|0)/2&-1;c[8718]=ay;aJ=aa(c[8304]|0,ay);if((aJ|0)<1){F=6420;break}ay=db(c[10636]|0,aJ<<3,215008)|0;c[10636]=ay;if((ay|0)==0){F=6711;break}ay=c[8718]|0;if((ay|0)<1){F=6423;break}aJ=db(c[10634]|0,ay<<3,215008)|0;c[10634]=aJ;if((aJ|0)==0){F=6714;break}aJ=c[8718]|0;if((aJ|0)<1){F=6426;break}ay=db(c[10878]|0,aJ<<3,215008)|0;c[10878]=ay;if((ay|0)==0){F=6716;break}ay=c[m>>2]|0;aJ=c[8718]|0;cf(ay|0,127672,(v=i,i=i+8|0,c[v>>2]=aJ,v)|0)}if((aD|0)==1){h[aM>>3]=+h[r>>3];h[r>>3]=+(c[11942]|0);F=6434}else if((aD|0)==(-5|0)|(aD|0)==(-2|0)|(aD|0)==(-3|0)|(aD|0)==(-4|0)){aP=aH}else if((aD|0)==0){F=6432;break}else{F=6434}L8729:do{if((F|0)==6434){F=0;aJ=aH+1|0;ay=c[8304]|0;L8731:do{if((ay|0)>0){aE=aa(ay,c[8306]|0);aC=c[10636]|0;av=0;while(1){aR=c[42584+(av<<2)>>2]|0;l=c[64648+(aR*688&-1)>>2]|0;if((l&1|0)==0){if(+h[s+(av<<3)>>3]<+h[64664+(aR*688&-1)>>3]){F=6438;break}}aw=+h[s+(av<<3)>>3];if((l&2|0)==0){if(aw>+h[64672+(aR*688&-1)>>3]){F=6441;break}}h[aC+(aE+av<<3)>>3]=aw;l=av+1|0;if((l|0)<(ay|0)){av=l}else{aS=l;break L8731}}if((F|0)==6441){F=0;av=q+(aR<<2)|0;c[av>>2]=(c[av>>2]|0)+1;aP=aJ;break L8729}else if((F|0)==6438){F=0;av=q+(aR<<2)|0;c[av>>2]=(c[av>>2]|0)+1;aP=aJ;break L8729}}else{aS=0}}while(0);ay=c[16162]|0;do{if((ay&1|0)==0){if(+h[s+(aS<<3)>>3]>=+h[8083]){break}c[aN>>2]=(c[aN>>2]|0)+1;aP=aJ;break L8729}}while(0);aw=+h[s+(aS<<3)>>3];if((ay&2|0)==0&aw>+h[8084]){c[aN>>2]=(c[aN>>2]|0)+1;aP=aJ;break}av=c[8306]|0;h[(c[10634]|0)+(av<<3)>>3]=aw;if((c[13486]|0)>2){aU=+h[s+(aS+1<<3)>>3]}else{aU=1.0}c[8306]=av+1;h[(c[10878]|0)+(av<<3)>>3]=aU;aP=aJ}}while(0);aj=eC(r,7)|0;if((aj|0)==-1){aO=aP;break L8714}else{aH=aP;aD=aj}}if((F|0)==6423){c[10634]=0;ez();aW=c[8718]|0;aX=be(42289,128848,(v=i,i=i+8|0,c[v>>2]=aW,v)|0)|0;fb()}else if((F|0)==6420){c[10636]=0;ez();aW=c[8718]|0;aX=be(42289,128848,(v=i,i=i+8|0,c[v>>2]=aW,v)|0)|0;fb()}else if((F|0)==6426){c[10878]=0;ez();aW=c[8718]|0;aX=be(42289,128848,(v=i,i=i+8|0,c[v>>2]=aW,v)|0)|0;fb()}else if((F|0)==6711){ez();aW=c[8718]|0;aX=be(42289,128848,(v=i,i=i+8|0,c[v>>2]=aW,v)|0)|0;fb()}else if((F|0)==6714){ez();aW=c[8718]|0;aX=be(42289,128848,(v=i,i=i+8|0,c[v>>2]=aW,v)|0)|0;fb()}else if((F|0)==6716){ez();aW=c[8718]|0;aX=be(42289,128848,(v=i,i=i+8|0,c[v>>2]=aW,v)|0)|0;fb()}else if((F|0)==6432){be(42289,126384,(v=i,i=i+8|0,c[v>>2]=c[11900],v)|0);fb()}}}while(0);ez();aW=c[8270]|0;do{if((aW|0)!=0){if((aY(aW|0,139696)|0)==0){break}bA(4,139696)}}while(0);aW=c[8306]|0;if((aW|0)<2){bD(125344,(v=i,i=i+8|0,c[v>>2]=aO,v)|0);aO=0;do{aX=c[42584+(aO<<2)>>2]|0;aP=c[q+(aX<<2)>>2]|0;do{if((aP|0)!=0){if((aO|0)<5){aZ=55600+(aO*51&-1)|0}else{aZ=77416}bD(124088,(v=i,i=i+16|0,c[v>>2]=aP,c[v+8>>2]=aZ,v)|0);r=64648+(aX*688&-1)|0;if((c[r>>2]&1|0)==0){aU=+h[64664+(aX*688&-1)>>3];bD(121384,(v=i,i=i+8|0,h[v>>3]=aU,v)|0)}else{bD(122672,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((c[r>>2]&2|0)==0){aU=+h[64672+(aX*688&-1)>>3];bD(116464,(v=i,i=i+8|0,h[v>>3]=aU,v)|0);break}else{bJ(14192);break}}}while(0);aO=aO+1|0;}while((aO|0)<6);uD(42289,115544,16);fb()}aO=aa(c[8304]|0,aW);do{if((aO|0)<1){c[10636]=0;a_=aW;F=6471}else{aZ=db(c[10636]|0,aO<<3,215008)|0;q=c[8306]|0;c[10636]=aZ;if((q|0)>=1){a_=q;F=6471;break}c[10634]=0;a$=0;a0=q}}while(0);do{if((F|0)==6471){aO=db(c[10634]|0,a_<<3,215008)|0;aW=c[8306]|0;c[10634]=aO;if((aW|0)<1){a$=0;a0=aW;break}aO=db(c[10878]|0,aW<<3,215008)|0;a$=aO;a0=c[8306]|0}}while(0);c[10878]=a$;cf(c[8762]|0,114744,(v=i,i=i+8|0,c[v>>2]=a0,v)|0);if((c[13486]|0)<3){a0=c[8762]|0;aI(113544,54,1,a0|0)}a0=H-1|0;H=c[1054]|0;a$=(c[H+(a0*40&-1)+36>>2]|0)+(c[H+(a0*40&-1)+32>>2]|0)|0;a0=db(0,(a$+1|0)-(c[H+(ag*40&-1)+32>>2]|0)|0,116456)|0;H=c[(c[1054]|0)+(ag*40&-1)+32>>2]|0;L8802:do{if((H|0)<(a$|0)){ag=H;a_=a0;while(1){aO=a[(c[10036]|0)+ag|0]|0;if(aO<<24>>24==0){a2=a_;break L8802}aW=a_+1|0;a[a_]=aO;aO=ag+1|0;if((aO|0)<(a$|0)){ag=aO;a_=aW}else{a2=aW;break}}}else{a2=a0}}while(0);a[a2]=0;cf(c[8762]|0,108456,(v=i,i=i+8|0,c[v>>2]=a0,v)|0);uu(a0);c[8714]=32;a0=c[13898]|0;a2=a0+1|0;c[13898]=a2;if((c[8272]|0)<=(a0|0)){uf(a2,106560,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}a$=c[1054]|0;if((a[a$+(a0*40&-1)|0]&1)==0){uf(a2,106560,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}H=c[a$+(a0*40&-1)+36>>2]|0;a_=a$+(a0*40&-1)+32|0;a0=c[10036]|0;a$=0;while(1){if((a$|0)>=(H|0)){break}if((a[a0+((c[a_>>2]|0)+a$|0)|0]|0)==(a[a$+107456|0]|0)){a$=a$+1|0}else{F=6705;break}}if((F|0)==6705){uf(a2,106560,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((a$|0)!=3){uf(a2,106560,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}a2=ut(256)|0;do{if((a2|0)==0){gk();a$=ut(256)|0;if((a$|0)!=0){a3=a$;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=215008,v)|0)}else{a3=a2}}while(0);a2=((c[8714]|0)*51&-1)+51|0;c[18130]=a3;a3=ut(a2)|0;do{if((a3|0)==0){gk();a$=ut(a2)|0;if((a$|0)!=0){a4=a$;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=105592,v)|0)}else{a4=a3}}while(0);c[8236]=a4;c[8302]=0;a4=c[13898]|0;a3=c[1054]|0;a2=(a[a3+(a4*40&-1)|0]&1)==0;if(a2){F=6493}else{a$=a[(c[10036]|0)+(c[a3+(a4*40&-1)+32>>2]|0)|0]|0;if((a$<<24>>24|0)==39|(a$<<24>>24|0)==34){F=6503}else{F=6493}}L8832:do{if((F|0)==6493){a$=c[10810]|0;L8834:do{if((a$|0)!=0){a_=c[8272]|0;a0=a3+(a4*40&-1)+36|0;H=a3+(a4*40&-1)+32|0;ag=c[10036]|0;aW=a$;L8836:while(1){aO=c[aW+4>>2]|0;L8838:do{if(!((a_|0)<=(a4|0)|a2)){q=c[a0>>2]|0;aZ=0;while(1){if((aZ|0)>=(q|0)){break}if((a[ag+((c[H>>2]|0)+aZ|0)|0]|0)==(a[aO+aZ|0]|0)){aZ=aZ+1|0}else{break L8838}}if((a[aO+aZ|0]|0)==0){break L8836}}}while(0);aO=c[aW>>2]|0;if((aO|0)==0){break L8834}else{aW=aO}}if((a[aW+8|0]&1)!=0){break}if((c[aW+16>>2]|0)==3){F=6503;break L8832}}}while(0);a$=c[8762]|0;aI(99808,60,1,a$|0);a$=c[13898]|0;H=c[1054]|0;L8848:while(1){if((a[H+(a$*40&-1)|0]&1)==0){F=6725;break}ag=(bO(d[(c[10036]|0)+(c[H+(a$*40&-1)+32>>2]|0)|0]|0|0)|0)==0;a0=c[1054]|0;if(ag){if((a[(c[10036]|0)+(c[a0+(a$*40&-1)+32>>2]|0)|0]|0)!=95){F=6726;break}}ag=(c[8236]|0)+((c[8302]|0)*51&-1)|0;a_=c[13898]|0;aO=c[a0+(a_*40&-1)+32>>2]|0;aJ=c[a0+(a_*40&-1)+36>>2]|0;a_=((aJ|0)>50?50:aJ)+aO|0;L8854:do{if((aO|0)<(a_|0)){aJ=ag;a0=aO;while(1){ay=a[(c[10036]|0)+a0|0]|0;if(ay<<24>>24==0){a5=aJ;break L8854}q=aJ+1|0;a[aJ]=ay;ay=a0+1|0;if((ay|0)<(a_|0)){aJ=q;a0=ay}else{a5=q;break}}}else{a5=ag}}while(0);a[a5]=0;ag=c[8302]|0;a_=c[8714]|0;if((ag|0)<(a_|0)){a7=ag;a9=c[8236]|0}else{ag=a_*3&-1;a_=(ag|0)/2&-1;c[8714]=a_;if((ag|0)<2){F=6577;break}ag=db(c[18130]|0,a_<<3,215008)|0;c[18130]=ag;if((ag|0)==0){F=6728;break}ag=db(c[8236]|0,((c[8714]|0)*51&-1)+51|0,101064)|0;a_=ag;c[8236]=a_;if((ag|0)==0){F=6729;break}a7=c[8302]|0;a9=a_}a_=a9+(a7*51&-1)|0;ag=43240;while(1){ba=c[ag>>2]|0;if((ba|0)==0){F=6592;break}if((aY(a_|0,c[ba+4>>2]|0)|0)==0){F=6585;break}else{ag=ba|0}}do{if((F|0)==6585){F=0;ag=ba+8|0;if((a[ag]&1)!=0){a[ag]=0;c[ba+16>>2]=2;h[ba+24>>3]=1.0;h[ba+32>>3]=0.0;bb=1.0;break}ag=ba+16|0;aO=c[ag>>2]|0;if((aO|0)==2){bb=+h[ba+24>>3];break}else if((aO|0)==1){aU=+(c[ba+24>>2]|0);c[ag>>2]=2;h[ba+24>>3]=aU;h[ba+32>>3]=0.0;bb=aU;break}else if((aO|0)==3){bb=+uz(c[ba+24>>2]|0,0);break}else{F=6591;break L8848}}else if((F|0)==6592){F=0;aO=e6(a_)|0;c[aO+16>>2]=2;h[aO+24>>3]=1.0;h[aO+32>>3]=0.0;a[aO+8|0]=0;bb=1.0}}while(0);a_=c[8302]|0;h[(c[18130]|0)+(a_<<3)>>3]=bb;aO=a_+1|0;c[8302]=aO;a_=c[13898]|0;ag=a_+1|0;c[13898]=ag;if((c[8272]|0)<=(ag|0)){bc=aO;break L8832}aW=c[1054]|0;if((a[aW+(ag*40&-1)|0]&1)==0){bc=aO;break L8832}a0=c[aW+(ag*40&-1)+36>>2]|0;aJ=aW+(ag*40&-1)+32|0;ag=c[10036]|0;q=0;while(1){if((q|0)>=(a0|0)){break}if((a[ag+((c[aJ>>2]|0)+q|0)|0]|0)==(a[q+148464|0]|0)){q=q+1|0}else{bc=aO;break L8832}}if((q|0)!=1){bc=aO;break L8832}aJ=a_+2|0;c[13898]=aJ;if((aJ|0)==0){bc=aO;break L8832}else{a$=aJ;H=aW}}if((F|0)==6725){uD(42289,99416,23);fb()}else if((F|0)==6726){uD(42289,99416,23);fb()}else if((F|0)==6728){uD(42289,100336,43);fb()}else if((F|0)==6729){uD(42289,100336,43);fb()}else if((F|0)==6591){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((F|0)==6577){c[18130]=0;uD(42289,100336,43);fb()}}}while(0);if((F|0)==6503){uu(c[10644]|0);ba=c[13898]|0;L8897:do{if((ba|0)<(c[8272]|0)){a7=c[1054]|0;L8899:do{if((a[a7+(ba*40&-1)|0]&1)!=0){a9=c[a7+(ba*40&-1)+36>>2]|0;a5=a7+(ba*40&-1)+32|0;a2=c[10036]|0;a4=0;while(1){if((a4|0)>=(a9|0)){break}if((a[a2+((c[a5>>2]|0)+a4|0)|0]|0)==(a[a4+103664|0]|0)){a4=a4+1|0}else{break L8899}}if((a4|0)==1){bd=0;break L8897}}}while(0);a[14176]=1;is(g);a[14176]=0;if((c[g>>2]|0)==3){bd=c[g+8>>2]|0;break}else{c[13898]=ba;bd=0;break}}else{bd=0}}while(0);c[10644]=bd;ba=c[8762]|0;cf(ba|0,104576,(v=i,i=i+8|0,c[v>>2]=bd,v)|0);bd=hA(c[10644]|0,193632)|0;if((bd|0)==0){ba=c[10644]|0;be(42289,104048,(v=i,i=i+8|0,c[v>>2]=ba,v)|0);fb()}ba=x|0;L8913:do{if((a6(ba|0,1025,bd|0)|0)!=0){x=0;L8914:while(1){L8916:while(1){g=aQ(ba|0,221168)|0;if((g|0)==0){bf=0}else{a[g]=0;g=c[8762]|0;cf(g|0,103672,(v=i,i=i+8|0,c[v>>2]=ba,v)|0);bf=1}g=a8(ba|0,35)|0;if((g|0)==0){bg=ba}else{a[g]=0;bg=ba}while(1){g=a[bg]|0;if((g<<24>>24|0)==35|(g<<24>>24|0)==0){break}else if(!((g<<24>>24|0)==32|(g<<24>>24|0)==9|(g<<24>>24|0)==10)){bh=ba;break L8916}bg=bg+1|0}if((a6(ba|0,1025,bd|0)|0)==0){break L8913}}while(1){a4=a[bh]|0;if((a4<<24>>24|0)==10|(a4<<24>>24|0)==0){bi=0;bj=ba;bk=x;break}else if(!((a4<<24>>24|0)==32|(a4<<24>>24|0)==9|(a4<<24>>24|0)==61)){F=6525;break}bh=bh+1|0}if((F|0)==6525){F=0;a4=cy(bh|0,213208)|0;if((a4|0)==0){bl=bh+(uA(bh|0)|0)|0}else{bl=a4}a4=a[bl]|0;a[bl]=0;bi=bh;bj=bl+1|0;bk=a4}a4=a[bi]|0;if(a4<<24>>24!=0){g=bi;a7=a4;do{if((bs(a7&255|0)|0)==0){if((a[g]|0)!=95){F=6720;break L8914}}g=g+1|0;a7=a[g]|0;}while(a7<<24>>24!=0)}if((uA(bi|0)|0)>>>0>50){F=6719;break}a7=c[8302]|0;g=c[8236]|0;uF(g+(a7*51&-1)|0,bi|0,51);if((uA(bi|0)|0)>>>0>=51){a[g+(a7*51&-1)+50|0]=0}if(bk<<24>>24==61){bm=bj}else{a7=a8(bj|0,61)|0;if((a7|0)==0){F=6538;break}bm=a7+1|0}a7=bm;while(1){g=a[a7]|0;if((g<<24>>24|0)==10|(g<<24>>24|0)==0){bn=0;bo=bm;bp=bk;break}else if(!((g<<24>>24|0)==32|(g<<24>>24|0)==9|(g<<24>>24|0)==61)){F=6543;break}a7=a7+1|0}if((F|0)==6543){F=0;g=cy(a7|0,213208)|0;if((g|0)==0){bq=a7+(uA(a7|0)|0)|0}else{bq=g}g=a[bq]|0;a[bq]=0;bn=a7;bo=bq+1|0;bp=g}if((ca(bn|0,148448,(v=i,i=i+8|0,c[v>>2]=w,v)|0)|0)!=1){F=6547;break}if(bf){bb=+h[w>>3];g=e6((c[8236]|0)+((c[8302]|0)*51&-1)|0)|0;c[g+16>>2]=2;c[g+20>>2]=br;h[g+24>>3]=bb;h[g+32>>3]=0.0;a[g+8|0]=0;bt=bo}else{g=c[8302]|0;a4=c[8714]|0;if((g|0)<(a4|0)){bu=g}else{g=a4*3&-1;a4=(g|0)/2&-1;c[8714]=a4;if((g|0)<2){F=6552;break}g=db(c[18130]|0,a4<<3,215008)|0;c[18130]=g;if((g|0)==0){F=6709;break}g=db(c[8236]|0,((c[8714]|0)*51&-1)+51|0,101064)|0;c[8236]=g;if((g|0)==0){F=6710;break}bu=c[8302]|0}bb=+h[w>>3];c[8302]=bu+1;h[(c[18130]|0)+(bu<<3)>>3]=bb;bt=bo}while(1){g=a[bt]|0;if((g<<24>>24|0)==10|(g<<24>>24|0)==0){bv=bp;break}else if(!((g<<24>>24|0)==32|(g<<24>>24|0)==9|(g<<24>>24|0)==61)){F=6560;break}bt=bt+1|0}if((F|0)==6560){F=0;a7=cy(bt|0,213208)|0;if((a7|0)==0){bw=bt+(uA(bt|0)|0)|0}else{bw=a7}a7=a[bw]|0;a[bw]=0;if((bt|0)==0){bv=a7}else{F=6564;break}}if((a6(ba|0,1025,bd|0)|0)==0){break L8913}else{x=bv}}if((F|0)==6709){bx=az(bd|0)|0;uD(42289,100336,43);fb()}else if((F|0)==6710){bx=az(bd|0)|0;uD(42289,100336,43);fb()}else if((F|0)==6719){by=az(bd|0)|0;uD(42289,101704,31);fb()}else if((F|0)==6720){by=az(bd|0)|0;uD(42289,101704,31);fb()}else if((F|0)==6552){c[18130]=0;bx=az(bd|0)|0;uD(42289,100336,43);fb()}else if((F|0)==6547){az(bd|0);uD(42289,101704,31);fb()}else if((F|0)==6564){az(bd|0);uD(42289,101704,31);fb()}else if((F|0)==6538){az(bd|0);uD(42289,101704,31);fb()}}}while(0);az(bd|0);bc=c[8302]|0}if((bc|0)<1){bz=0;bB=bc}else{bd=db(c[18130]|0,bc<<3,215008)|0;bz=bd;bB=c[8302]|0}c[18130]=bz;c[8236]=db(c[8236]|0,(bB*51&-1)+51|0,105592)|0;bB=c[8306]|0;bz=c[8302]|0;if((bB|0)<(bz|0)){uD(42289,98280,56);fb()}if((bz|0)>0){bd=c[18130]|0;bc=0;do{bx=bd+(bc<<3)|0;if(+h[bx>>3]==0.0){h[bx>>3]=1.0e-30}bc=bc+1|0;}while((bc|0)<(bz|0))}if((bz|0)==0){uh(-1,97624,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{bc=c[18130]|0;h[e>>3]=1.0e+30;bd=hp(bz+bB|0,bz)|0;h[f>>3]=-1.0;aV(2,52);if((fh(bc,bd,e,f)|0)==1){uD(42289,96504,31);fb()}bb=+h[e>>3];aU=+h[f>>3];do{if((a[42560]&1)==0){bz=c[m>>2]|0;aw=bb-bb;if(bb>1.0e-30){bC=aw/bb}else{bC=0.0}au=+h[5479];cf(bz|0,224168,(v=i,i=i+56|0,c[v>>2]=0,h[v+8>>3]=bb,h[v+16>>3]=bC,h[v+24>>3]=aw,h[v+32>>3]=au,h[v+40>>3]=aU,c[v+48>>2]=222856,v)|0);if((c[8302]|0)>0){bE=0}else{bG=aw;break}while(1){au=+h[bc+(bE<<3)>>3];cf(bz|0,222224,(v=i,i=i+16|0,c[v>>2]=(c[8236]|0)+(bE*51&-1),h[v+8>>3]=au,v)|0);bB=bE+1|0;if((bB|0)<(c[8302]|0)){bE=bB}else{bG=aw;break}}}else{bG=bb-bb}}while(0);bE=c[8762]|0;if(bb>1.0e-30){bH=bG/bb}else{bH=0.0}bC=+h[5479];cf(bE|0,224168,(v=i,i=i+56|0,c[v>>2]=0,h[v+8>>3]=bb,h[v+16>>3]=bH,h[v+24>>3]=bG,h[v+32>>3]=bC,h[v+40>>3]=aU,c[v+48>>2]=222856,v)|0);if((c[8302]|0)>0){bz=0;do{bC=+h[bc+(bz<<3)>>3];cf(bE|0,222224,(v=i,i=i+16|0,c[v>>2]=(c[8236]|0)+(bz*51&-1),h[v+8>>3]=bC,v)|0);bz=bz+1|0;}while((bz|0)<(c[8302]|0))}bz=e6(96112)|0;a[bz+8|0]=0;c[bz+16>>2]=1;c[bz+24>>2]=0;a[1016]=0;bC=1.0e+30;bz=0;bE=2;bG=aU;L9027:while(1){if(a[51680]|0){aU=+h[e>>3];bB=c[m>>2]|0;bH=aU-bC;if(aU>1.0e-30){bI=bH/aU}else{bI=0.0}bb=+h[5479];bx=(bz|0)>0?223472:222856;cf(bB|0,224168,(v=i,i=i+56|0,c[v>>2]=bz,h[v+8>>3]=aU,h[v+16>>3]=bI,h[v+24>>3]=bH,h[v+32>>3]=bb,h[v+40>>3]=bG,c[v+48>>2]=bx,v)|0);if((c[8302]|0)>0){bx=0;do{bb=+h[bc+(bx<<3)>>3];cf(bB|0,222224,(v=i,i=i+16|0,c[v>>2]=(c[8236]|0)+(bx*51&-1),h[v+8>>3]=bb,v)|0);bx=bx+1|0;}while((bx|0)<(c[8302]|0))}a[51680]=0;while(1){aI(74040,49,1,c[m>>2]|0);bx=a1(c[o>>2]|0)|0;if((bx|0)==99|(bx|0)==67){break}else if((bx|0)==(-1|0)|(bx|0)==115|(bx|0)==83){F=6637;break L9027}else if(!((bx|0)==101|(bx|0)==69)){continue}bx=c[10638]|0;bB=(bx|0)!=0?bx:136352;cf(c[m>>2]|0,72672,(v=i,i=i+8|0,c[v>>2]=bB,v)|0);if((c[8302]|0)>0){bx=0;do{bb=+h[(c[18130]|0)+(bx<<3)>>3];by=e6((c[8236]|0)+(bx*51&-1)|0)|0;c[by+16>>2]=2;h[by+24>>3]=bb;h[by+32>>3]=0.0;a[by+8|0]=0;bx=bx+1|0;}while((bx|0)<(c[8302]|0))}if((bB|0)==0){bK=0}else{bK=bP(bB|0)|0}dL(bK)}aI(73232,9,1,c[m>>2]|0)}if((bE|0)==2){bL=+h[e>>3];bM=bz+1|0}else{bL=bC;bM=bz}bx=fh(bc,bd,e,f)|0;if((bx|0)==1){bN=bL;bQ=bM;bR=1;break}else if((bx|0)==2){do{if((a[42560]&1)==0){bb=+h[e>>3];bH=+h[f>>3];by=c[m>>2]|0;aU=bb-bL;if(bb>1.0e-30){bS=aU/bb}else{bS=0.0}aw=+h[5479];bv=(bM|0)>0?223472:222856;cf(by|0,224168,(v=i,i=i+56|0,c[v>>2]=bM,h[v+8>>3]=bb,h[v+16>>3]=bS,h[v+24>>3]=aU,h[v+32>>3]=aw,h[v+40>>3]=bH,c[v+48>>2]=bv,v)|0);if((c[8302]|0)>0){bT=0}else{bV=bH;break}while(1){aw=+h[bc+(bT<<3)>>3];cf(by|0,222224,(v=i,i=i+16|0,c[v>>2]=(c[8236]|0)+(bT*51&-1),h[v+8>>3]=aw,v)|0);bv=bT+1|0;if((bv|0)<(c[8302]|0)){bT=bv}else{bV=bH;break}}}else{bV=+h[f>>3]}}while(0);if(bV<1.0e20){bW=bV}else{bN=bL;bQ=bM;bR=2;break}}else{bH=+h[f>>3];if(bH<1.0e20){bW=bH}else{bN=bL;bQ=bM;bR=bx;break}}by=c[8708]|0;if((by|0)!=0&(bM|0)>(by|0)){bN=bL;bQ=bM;bR=bx;break}if((bx|0)==3){bC=bL;bz=bM;bE=3;bG=bW;continue}bH=+h[e>>3];aw=bL-bH;if(bH>1.0e-30){bX=aw/bH}else{bX=aw}if(bX>+h[5479]){bC=bL;bz=bM;bE=bx;bG=bW}else{bN=bL;bQ=bM;bR=bx;break}}if((F|0)==6637){bM=c[m>>2]|0;aI(73744,5,1,bM|0);a[1016]=1;bN=bC;bQ=bz;bR=bE}aV(2,4);aV(13,1);bE=c[8708]|0;do{if((bE|0)>0&(bQ|0)>(bE|0)){fe(95552,(v=i,i=i+8|0,c[v>>2]=bE,v)|0)}else{if(a[1016]|0){fe(95160,(v=i,i=i+8|0,c[v>>2]=bQ,v)|0);break}else{fe(94448,(v=i,i=i+8|0,c[v>>2]=bQ,v)|0);bz=e6(96112)|0;a[bz+8|0]=0;c[bz+16>>2]=1;c[bz+24>>2]=1;break}}}while(0);bC=+h[e>>3];fe(93944,(v=i,i=i+8|0,h[v>>3]=bC,v)|0);bL=bC-bN;if(bC>1.0e-30){fe(93376,(v=i,i=i+8|0,h[v>>3]=bL/bC,v)|0)}else{fe(92448,(v=i,i=i+8|0,h[v>>3]=bL,v)|0)}if((bR|0)==1){uD(42289,96504,31);fb()}bR=c[8302]|0;if((a[42568]&1)!=0&(bR|0)>0){bQ=0;while(1){fi((c[8236]|0)+(bQ*51&-1)|0,0.0);bE=bQ+1|0;bz=c[8302]|0;if((bE|0)<(bz|0)){bQ=bE}else{bY=bz;break}}}else{bY=bR}bR=c[8306]|0;L9092:do{if((bR|0)==(bY|0)){fe(91680,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);fe(90880,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);fe(90496,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);fe(89976,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);bQ=c[8302]|0;if((bQ|0)>0){bZ=0}else{b_=bQ;break}while(1){bL=+h[bc+(bZ<<3)>>3];fe(89304,(v=i,i=i+16|0,c[v>>2]=(c[8236]|0)+(bZ*51&-1),h[v+8>>3]=bL,v)|0);bQ=bZ+1|0;bz=c[8302]|0;if((bQ|0)<(bz|0)){bZ=bQ}else{b_=bz;break}}}else{if(bC<1.0e-30){fe(88552,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);fe(90496,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);fe(89976,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);bx=c[8302]|0;if((bx|0)>0){b$=0}else{b_=bx;break}while(1){bL=+h[bc+(b$<<3)>>3];fe(89304,(v=i,i=i+16|0,c[v>>2]=(c[8236]|0)+(b$*51&-1),h[v+8>>3]=bL,v)|0);bx=b$+1|0;bz=c[8302]|0;if((bx|0)<(bz|0)){b$=bx}else{b_=bz;break L9092}}}bz=bR-bY|0;bL=bC/+(bz|0);bN=+Q(+bL);fe(87584,(v=i,i=i+8|0,c[v>>2]=bz,v)|0);fe(86752,(v=i,i=i+8|0,h[v>>3]=bN,v)|0);fe(85792,(v=i,i=i+8|0,h[v>>3]=bL,v)|0);bx=e6(84600)|0;a[bx+8|0]=0;c[bx+16>>2]=1;c[bx+24>>2]=bz;bz=e6(84088)|0;a[bz+8|0]=0;c[bz+16>>2]=2;h[bz+24>>3]=bN;h[bz+32>>3]=0.0;bz=e6(83096)|0;a[bz+8|0]=0;c[bz+16>>2]=2;h[bz+24>>3]=bC;h[bz+32>>3]=0.0;hr(bd,0,0,0,c[8306]|0,c[8302]|0,0);bz=c[8306]|0;hs(bd,bd+(bz<<2)|0,c[8302]|0);bx=c[8302]|0;do{if((bx|0)<1){b0=bx;b1=0;b2=0}else{bQ=bx<<3;bE=ut(bQ)|0;do{if((bE|0)==0){gk();bM=ut(bQ)|0;if((bM|0)!=0){b3=bM;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=215008,v)|0)}else{b3=bE}}while(0);bE=b3;bQ=c[8302]|0;if((bQ|0)>0){b4=0}else{b0=bQ;b1=0;b2=bE;break}while(1){bN=+h[(c[bd+(b4+bz<<2)>>2]|0)+(b4<<3)>>3];if(bN<=0.0){F=6678;break}h[bE+(b4<<3)>>3]=+Q(+bN);bM=b4+1|0;if((bM|0)<(bQ|0)){b4=bM}else{b5=0;break}}if((F|0)==6678){uD(42289,81952,66);fb()}while(1){bM=bE+(b5<<3)|0;bT=bd+(b5+bz<<2)|0;bK=0;do{by=(c[bT>>2]|0)+(bK<<3)|0;h[by>>3]=+h[by>>3]/(+h[bM>>3]*+h[bE+(bK<<3)>>3]);bK=bK+1|0;}while((bK|0)<=(b5|0));bK=b5+1|0;if((bK|0)<(bQ|0)){b5=bK}else{b0=bQ;b1=1;b2=bE;break}}}}while(0);bN=+Q(+(bC/+((c[8306]|0)-b0|0)));h[e>>3]=bN;if(b1){bx=0;do{bE=b2+(bx<<3)|0;h[bE>>3]=bN*+h[bE>>3];bx=bx+1|0;}while((bx|0)<(b0|0))}fe(80552,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);fe(79488,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);if((c[8302]|0)>0){bx=0;do{bN=+h[bc+(bx<<3)>>3];bE=+P(+bN)<1.0e-30;bQ=b2+(bx<<3)|0;bL=+h[bQ>>3];if(bE){b6=0.0}else{b6=+P(+(bL*100.0/bN))}fe(78752,(v=i,i=i+40|0,c[v>>2]=(c[8236]|0)+(bx*51&-1),h[v+8>>3]=bN,c[v+16>>2]=78264,h[v+24>>3]=bL,h[v+32>>3]=b6,v)|0);if((a[42568]&1)!=0){fi((c[8236]|0)+(bx*51&-1)|0,+h[bQ>>3])}bx=bx+1|0;}while((bx|0)<(c[8302]|0))}fe(77728,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);fe(77224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);if((c[8302]|0)>0){bx=0;do{fe(76616,(v=i,i=i+8|0,c[v>>2]=(c[8236]|0)+(bx*51&-1),v)|0);bx=bx+1|0;}while((bx|0)<(c[8302]|0))}fe(140136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);if((c[8302]|0)>0){bx=0;do{fe(75944,(v=i,i=i+8|0,c[v>>2]=(c[8236]|0)+(bx*51&-1),v)|0);bQ=bd+(bx+bz<<2)|0;bE=0;do{fe(75392,(v=i,i=i+8|0,h[v>>3]=+h[(c[bQ>>2]|0)+(bE<<3)>>3],v)|0);bE=bE+1|0;}while((bE|0)<=(bx|0));fe(140136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);bx=bx+1|0;}while((bx|0)<(c[8302]|0))}uu(b2);b_=c[8302]|0}}while(0);b2=b_-1|0;b6=+h[bc+(b2<<3)>>3];b_=e6((c[8236]|0)+(b2*51&-1)|0)|0;c[b_+16>>2]=2;h[b_+24>>3]=b6;h[b_+32>>3]=0.0;a[b_+8|0]=0;h[f>>3]=-2.0;fh(bc,bd,e,f);uu(c[bd>>2]|0);uu(bd)}az(c[8762]|0);c[8762]=0;uu(c[10636]|0);uu(c[10634]|0);uu(c[10878]|0);uu(c[18130]|0);uu(c[8236]|0);bd=c[10062]|0;if((bd|0)!=0){e1(bd);c[10062]=0}bd=c[10036]|0;uF(35352,bd|0,512);if((uA(bd|0)|0)>>>0<512){i=b;return}a[35863]=0;i=b;return}function fe(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;i=i+16|0;f=e|0;g=f|0;h=f;c[h>>2]=d;c[h+4>>2]=0;if((a[42560]&1)==0){f=c[m>>2]|0;bX(f|0,b|0,g|0)}c[h>>2]=d;c[h+4>>2]=0;bX(c[8762]|0,b|0,g|0);i=e;return}function ff(b){b=b|0;aV(2,52);a[51680]=1;return}function fg(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0;b=i;d=c[10568]|0;if((d|0)!=0){e=bP(d|0)|0;i=b;return e|0}d=bU(236952)|0;do{if((d|0)!=0){if((a[d]|0)==0){break}f=a[d+((uA(d|0)|0)-1|0)|0]|0;if(!((f<<24>>24|0)==47|(f<<24>>24|0)==92)){e=bP(d|0)|0;i=b;return e|0}f=(uA(d|0)|0)+8|0;g=ut(f)|0;do{if((g|0)==0){gk();h=ut(f)|0;if((h|0)!=0){j=h;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=97072,v)|0);return 0}else{j=g}}while(0);uB(j|0,d|0);g=j+(uA(j|0)|0)|0;f=g|0;w=779381094;a[f]=w&255;w=w>>8;a[f+1|0]=w&255;w=w>>8;a[f+2|0]=w&255;w=w>>8;a[f+3|0]=w&255;f=g+4|0;w=6778732;a[f]=w&255;w=w>>8;a[f+1|0]=w&255;w=w>>8;a[f+2|0]=w&255;w=w>>8;a[f+3|0]=w&255;e=j;i=b;return e|0}}while(0);e=bP(42264)|0;i=b;return e|0}function fh(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0.0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0.0,A=0.0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,R=0,S=0,T=0.0,U=0,V=0.0,W=0.0,X=0.0,Y=0;g=i;i=i+8|0;j=g|0;k=+h[f>>3];if(k!=-1.0){if(k==-2.0){uu(c[8730]|0);uu(c[8720]|0);uu(c[8728]|0);uu(c[8724]|0);uu(c[8726]|0);l=c[8722]|0;uu(c[l>>2]|0);uu(l);n=0;i=g;return n|0}l=c[8306]|0;o=c[8302]|0;if((o+l|0)>0){p=0;q=o;while(1){uD(c[(c[8722]|0)+(p<<2)>>2]|0,c[d+(p<<2)>>2]|0,q<<3);o=p+1|0;r=c[8306]|0;s=c[8302]|0;if((o|0)<(s+r|0)){p=o;q=s}else{t=r;break}}}else{t=l}uD(c[8720]|0,c[8730]|0,t<<3);t=c[8302]|0;if((t|0)>0){l=c[8306]|0;q=c[8722]|0;p=c[8720]|0;r=0;while(1){s=l+r|0;h[(c[q+(s<<2)>>2]|0)+(r<<3)>>3]=+h[f>>3];h[p+(s<<3)>>3]=0.0;s=r+1|0;if((s|0)<(t|0)){r=s}else{u=q;w=p;x=l;break}}}else{u=c[8722]|0;w=c[8720]|0;x=c[8306]|0}hr(u,w,c[8728]|0,c[8726]|0,x+t|0,t,1);t=c[8302]|0;if((t|0)>0){x=c[8728]|0;w=c[8724]|0;u=0;while(1){h[w+(u<<3)>>3]=+h[b+(u<<3)>>3]+ +h[x+(u<<3)>>3];l=u+1|0;if((l|0)<(t|0)){u=l}else{y=w;break}}}else{y=c[8724]|0}fj(y,c[8722]|0,c[8720]|0,j);k=+h[j>>3];if(k>=+h[e>>3]){if((a[42560]&1)==0){j=c[m>>2]|0;aF(42,j|0)}h[f>>3]=+h[4484]*+h[f>>3];n=3;i=g;return n|0}z=+h[f>>3];if(z>1.0e-20){if((a[42560]&1)==0){j=c[m>>2]|0;aF(47,j|0);A=+h[f>>3]}else{A=z}h[f>>3]=A/+h[4485]}h[e>>3]=k;if((c[8306]|0)>0){j=0;do{uD(c[d+(j<<2)>>2]|0,c[(c[8722]|0)+(j<<2)>>2]|0,c[8302]<<3);h[(c[8730]|0)+(j<<3)>>3]=+h[(c[8720]|0)+(j<<3)>>3];j=j+1|0;}while((j|0)<(c[8306]|0))}j=c[8302]|0;if((j|0)<=0){n=2;i=g;return n|0}y=c[8724]|0;w=0;while(1){h[b+(w<<3)>>3]=+h[y+(w<<3)>>3];u=w+1|0;if((u|0)<(j|0)){w=u}else{n=2;break}}i=g;return n|0}w=c[8302]|0;if((w|0)<1){B=0;C=w}else{j=w<<3;w=ut(j)|0;do{if((w|0)==0){gk();y=ut(j)|0;if((y|0)!=0){D=y;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=215008,v)|0);return 0}else{D=w}}while(0);B=D;C=c[8302]|0}c[8724]=B;B=c[8306]|0;D=C+B|0;if((D|0)<1){E=0;F=B;G=C}else{C=D<<3;D=ut(C)|0;do{if((D|0)==0){gk();B=ut(C)|0;if((B|0)!=0){H=B;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=215008,v)|0);return 0}else{H=D}}while(0);E=H;F=c[8306]|0;G=c[8302]|0}c[8730]=E;E=G+F|0;if((E|0)<1){I=0;J=G}else{G=E<<3;E=ut(G)|0;do{if((E|0)==0){gk();F=ut(G)|0;if((F|0)!=0){K=F;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=215008,v)|0);return 0}else{K=E}}while(0);I=K;J=c[8302]|0}c[8720]=I;if((J|0)<1){L=0;M=J}else{I=J<<3;J=ut(I)|0;do{if((J|0)==0){gk();K=ut(I)|0;if((K|0)!=0){N=K;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=215008,v)|0);return 0}else{N=J}}while(0);L=N;M=c[8302]|0}c[8728]=L;L=c[8306]|0;N=M+L|0;if((N|0)<1){O=0;P=L;R=M}else{M=N<<3;N=ut(M)|0;do{if((N|0)==0){gk();L=ut(M)|0;if((L|0)!=0){S=L;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=215008,v)|0);return 0}else{S=N}}while(0);O=S;P=c[8306]|0;R=c[8302]|0}c[8726]=O;c[8722]=hp(R+P|0,R)|0;fj(b,d,c[8730]|0,e);k=+h[1782];if(k!=0.0){T=k;U=c[8302]|0}else{h[f>>3]=0.0;e=c[8306]|0;b=c[8302]|0;if((e|0)>0){R=0;k=0.0;while(1){if((b|0)>0){P=d+(R<<2)|0;O=0;A=k;while(1){z=+h[(c[P>>2]|0)+(O<<3)>>3];V=A+z*z;h[f>>3]=V;S=O+1|0;if((S|0)<(b|0)){O=S;A=V}else{W=V;break}}}else{W=k}O=R+1|0;if((O|0)<(e|0)){R=O;k=W}else{X=W;break}}}else{X=0.0}T=+Q(+(X/+(e|0)/+(b|0)));U=b}h[f>>3]=T;if((U|0)>0){Y=0}else{n=0;i=g;return n|0}while(1){if((Y|0)>0){f=c[8306]|0;b=0;do{h[(c[d+(f+Y<<2)>>2]|0)+(b<<3)>>3]=0.0;h[(c[d+(f+b<<2)>>2]|0)+(Y<<3)>>3]=0.0;b=b+1|0;}while((b|0)<(Y|0))}b=Y+1|0;if((b|0)<(U|0)){Y=b}else{n=0;break}}i=g;return n|0}function fi(b,d){b=b|0;d=+d;var e=0,f=0,g=0,j=0,k=0;e=i;f=(uA(b|0)|0)+5|0;g=ut(f)|0;do{if((g|0)==0){gk();j=ut(f)|0;if((j|0)!=0){k=j;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=179864,v)|0)}else{k=g}}while(0);be(k|0,74544,(v=i,i=i+8|0,c[v>>2]=b,v)|0);b=e6(k)|0;c[b+16>>2]=2;h[b+24>>3]=d;h[b+32>>3]=0.0;a[b+8|0]=0;uu(k);i=e;return}function fj(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0,t=0;f=i;h[e>>3]=0.0;g=c[8306]|0;if((g|0)<1){j=0}else{k=g<<3;g=ut(k)|0;do{if((g|0)==0){gk();l=ut(k)|0;if((l|0)!=0){m=l;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=215008,v)|0)}else{m=g}}while(0);j=m}m=c[8302]|0;if((m|0)<1){n=0}else{g=m<<3;m=ut(g)|0;do{if((m|0)==0){gk();k=ut(g)|0;if((k|0)!=0){o=k;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=215008,v)|0)}else{o=m}}while(0);n=o}o=n;fk(a,d);m=c[8302]|0;if((m|0)>0){g=0;while(1){h[n+(g<<3)>>3]=+h[a+(g<<3)>>3];k=g+1|0;if((k|0)<(m|0)){g=k}else{p=0;break}}do{g=a+(p<<3)|0;q=+h[g>>3];r=+P(+q)<1.0e-30?1.0e-30:q;m=n+(p<<3)|0;h[m>>3]=r*1.001;fk(n,j);k=c[8306]|0;if((k|0)>0){q=r*.001;l=0;do{h[(c[b+(l<<2)>>2]|0)+(p<<3)>>3]=(+h[j+(l<<3)>>3]- +h[d+(l<<3)>>3])/q;l=l+1|0;}while((l|0)<(k|0))}h[m>>3]=+h[g>>3];p=p+1|0;}while((p|0)<(c[8302]|0))}uu(j);uu(o);o=c[8306]|0;if((o|0)<=0){i=f;return}j=c[10634]|0;p=c[10878]|0;n=c[8302]|0;a=0;do{k=d+(a<<3)|0;l=p+(a<<3)|0;q=(+h[k>>3]- +h[j+(a<<3)>>3])/+h[l>>3];h[k>>3]=q;h[e>>3]=+h[e>>3]+q*q;if((n|0)>0){k=b+(a<<2)|0;s=0;do{t=(c[k>>2]|0)+(s<<3)|0;h[t>>3]=+h[t>>3]/+h[l>>3];s=s+1|0;}while((s|0)<(n|0))}a=a+1|0;}while((a|0)<(o|0));i=f;return}function fk(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0.0,o=0,p=0,q=0,r=0.0,s=0,t=0.0;e=i;i=i+24|0;f=e|0;if((c[8302]|0)>0){g=f|0;j=f+8|0;k=f+16|0;l=f;m=0;do{n=+h[b+(m<<3)>>3];c[g>>2]=2;h[j>>3]=n;h[k>>3]=0.0;o=e6((c[8236]|0)+(m*51&-1)|0)|0;p=o+16|0;c[p>>2]=c[l>>2];c[p+4>>2]=c[l+4>>2];c[p+8>>2]=c[l+8>>2];c[p+12>>2]=c[l+12>>2];c[p+16>>2]=c[l+16>>2];c[p+20>>2]=c[l+20>>2];a[o+8|0]=0;m=m+1|0;}while((m|0)<(c[8302]|0))}if((c[8306]|0)<=0){i=e;return}m=f|0;l=f+8|0;k=l;j=f+8|0;g=l;l=0;L9333:while(1){b=0;do{o=55600+(b*51&-1)|0;L9337:do{if((a[(e6(o)|0)+8|0]&1)==0){p=43240;while(1){q=c[p>>2]|0;if((q|0)==0){r=0.0;break L9337}if((aY(o|0,c[q+4>>2]|0)|0)==0){break}else{p=q|0}}p=c[q+16>>2]|0;if((p|0)==3){r=+uz(c[q+24>>2]|0,0);break}else if((p|0)==1){r=+(c[q+24>>2]|0);break}else if((p|0)==2){r=+h[q+24>>3];break}else{s=6863;break L9333}}else{r=0.0}}while(0);c[40264+(b*24&-1)>>2]=2;h[40272+(b*24&-1)>>3]=r;h[40280+(b*24&-1)>>3]=0.0;b=b+1|0;}while((b|0)<5);b=c[8304]|0;if((b|0)>0){o=c[10636]|0;p=0;do{n=+h[o+(aa(b,l)+p<<3)>>3];c[40264+(p*24&-1)>>2]=2;h[40272+(p*24&-1)>>3]=n;h[40280+(p*24&-1)>>3]=0.0;p=p+1|0;}while((p|0)<(b|0))}e4(c[10062]|0,f);if((a[1960]&1)!=0){s=6869;break}b=c[m>>2]|0;if((b|0)==2){t=+h[j>>3]}else if((b|0)==3){t=+uz(c[g>>2]|0,0)}else if((b|0)==1){t=+(c[k>>2]|0)}else{s=6874;break}h[d+(l<<3)>>3]=t;b=l+1|0;if((b|0)<(c[8306]|0)){l=b}else{s=6877;break}}if((s|0)==6869){uD(42289,221560,43);fb()}else if((s|0)==6874){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((s|0)==6877){i=e;return}else if((s|0)==6863){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}function fl(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;f=i;i=i+32|0;g=f|0;h=f+16|0;j=c[a>>2]|0;k=c[b>>2]|0;l=c[13542]|0;if((l|0)==0){m=0;n=0;o=0}else{p=c[l>>2]|0;q=(p|0)>(j|0)&1;r=c[l+4>>2]|0;s=(r|0)<(j|0)?q|2:q;q=c[l+8>>2]|0;t=(q|0)>(k|0)?s|4:s;s=c[l+12>>2]|0;u=c[d>>2]|0;v=c[e>>2]|0;w=(p|0)>(u|0)&1;p=(r|0)<(u|0)?w|2:w;w=(q|0)>(v|0)?p|4:p;m=(s|0)<(v|0)?w|8:w;n=(s|0)<(k|0)?t|8:t;o=l}l=(n|0)!=0;t=l^1;s=(m|0)==0;if(s&t){x=1;i=f;return x|0}if((m&n|0)!=0){x=0;i=f;return x|0}n=c[d>>2]|0;m=n-j|0;w=c[e>>2]|0;v=w-k|0;do{if((w|0)==(k|0)){y=0;z=k}else{p=c[o+8>>2]|0;q=((aa(p-w|0,m)|0)/(v|0)&-1)+n|0;u=c[o>>2]|0;do{if((q|0)<(u|0)){A=0}else{if((q|0)>(c[o+4>>2]|0)){A=0;break}c[g>>2]=q;c[h>>2]=p;A=1}}while(0);p=o+12|0;q=n+((aa((c[p>>2]|0)-w|0,m)|0)/(v|0)&-1)|0;if((q|0)<(u|0)){y=A;z=w;break}if((q|0)>(c[o+4>>2]|0)){y=A;z=w;break}c[g+(A<<2)>>2]=q;c[h+(A<<2)>>2]=c[p>>2];y=A+1|0;z=w}}while(0);do{if((n|0)==(j|0)){B=y;C=j}else{w=c[o>>2]|0;A=z+((aa(w-n|0,v)|0)/(m|0)&-1)|0;p=o+8|0;q=c[p>>2]|0;do{if((A|0)<(q|0)){D=y;E=q}else{if((A|0)>(c[o+12>>2]|0)){D=y;E=q;break}c[g+(y<<2)>>2]=w;c[h+(y<<2)>>2]=A;D=y+1|0;E=c[p>>2]|0}}while(0);p=c[o+4>>2]|0;A=z+((aa(p-n|0,v)|0)/(m|0)&-1)|0;if((A|0)<(E|0)){B=D;C=n;break}if((A|0)>(c[o+12>>2]|0)){B=D;C=n;break}c[g+(D<<2)>>2]=p;c[h+(D<<2)>>2]=A;B=D+1|0;C=n}}while(0);if((B|0)<2){x=0;i=f;return x|0}B=(j|0)<(C|0);n=B?C:j;D=B?j:C;B=(k|0)<(z|0);o=B?z:k;E=B?k:z;L9395:do{if(s|t){B=c[g>>2]|0;if(l){y=aa(C-B|0,m);A=c[h>>2]|0;if((aa(z-A|0,v)+y|0)>0){c[a>>2]=B;c[b>>2]=A;break}else{c[a>>2]=c[g+4>>2];c[b>>2]=c[h+4>>2];break}}else{A=aa(B-j|0,m);y=c[h>>2]|0;if((aa(y-k|0,v)+A|0)>0){c[d>>2]=B;c[e>>2]=y;break}else{c[d>>2]=c[g+4>>2];c[e>>2]=c[h+4>>2];break}}}else{y=c[g+4>>2]|0;B=c[g>>2]|0;A=(aa(y-B|0,m)|0)<0;p=c[h+4>>2]|0;w=c[h>>2]|0;do{if(!A){if((aa(p-w|0,v)|0)<0){break}c[a>>2]=B;c[b>>2]=w;c[d>>2]=y;c[e>>2]=p;break L9395}}while(0);c[a>>2]=y;c[b>>2]=p;c[d>>2]=B;c[e>>2]=w}}while(0);v=c[a>>2]|0;if((v|0)<(D|0)|(v|0)>(n|0)){x=0;i=f;return x|0}v=c[d>>2]|0;if((v|0)<(D|0)|(v|0)>(n|0)){x=0;i=f;return x|0}n=c[b>>2]|0;if((n|0)<(E|0)|(n|0)>(o|0)){x=0;i=f;return x|0}else{x=c[e>>2]|0;i=f;return((x|0)<=(o|0)&(x|0)>=(E|0))<<31>>31|0}return 0}function fm(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;g=i;i=i+32|0;h=g|0;j=g+8|0;k=g+16|0;l=g+24|0;c[h>>2]=a;c[j>>2]=b;c[k>>2]=d;c[l>>2]=e;m=c[3524]|0;n=c[13542]|0;if((n|0)==0){o=1;p=f}else{q=c[n>>2]|0;r=(q|0)>(a|0)&1;s=c[n+4>>2]|0;t=(s|0)<(a|0)?r|2:r;r=c[n+8>>2]|0;a=(r|0)>(b|0)?t|4:t;t=c[n+12>>2]|0;n=(q|0)>(d|0)&1;q=(s|0)<(d|0)?n|2:n;n=(r|0)>(e|0)?q|4:q;o=(((t|0)<(e|0)?n|8:n)|0)==0;p=(((t|0)<(b|0)?a|8:a)|0)==0?f:f&-3}fl(h,j,k,l);cI[c[m+84>>2]&63](c[h>>2]|0,c[j>>2]|0,c[k>>2]|0,c[l>>2]|0,o?p:p&-2);i=g;return}function fn(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0;e=i;i=i+104|0;f=e|0;g=e+16|0;j=e+32|0;k=e+48|0;l=c[b>>2]|0;if((l|0)==2){m=c[b+4>>2]|0;n=43280;while(1){o=c[n>>2]|0;if((o|0)==0){p=6930;break}if((c[o+4>>2]|0)==(m|0)){p=6928;break}else{n=o|0}}do{if((p|0)==6930){n=c[8798]|0;q=(n|0)>0;r=m;L9433:while(1){s=43264;while(1){t=c[s>>2]|0;if((t|0)==0){break}if((c[t+4>>2]|0)==(r|0)){break L9433}else{s=t|0}}u=r-1|0;if(!((r|0)>(n|0)&q)){p=6940;break}r=((u|0)%(n|0)&-1)+1|0}if((p|0)==6940){c[k+4>>2]=u;c[k+40>>2]=1;c[k+44>>2]=u;c[k+8>>2]=u;break}n=k;q=t+8|0;c[n>>2]=c[q>>2];c[n+4>>2]=c[q+4>>2];c[n+8>>2]=c[q+8>>2];c[n+12>>2]=c[q+12>>2];c[n+16>>2]=c[q+16>>2];c[n+20>>2]=c[q+20>>2];c[n+24>>2]=c[q+24>>2];c[n+28>>2]=c[q+28>>2];c[n+32>>2]=c[q+32>>2];c[n+36>>2]=c[q+36>>2];c[n+40>>2]=c[q+40>>2];c[n+44>>2]=c[q+44>>2];c[n+48>>2]=c[q+48>>2];c[n+52>>2]=c[q+52>>2];if((c[(c[3524]|0)+96>>2]&1024|0)!=0){c[k+4>>2]=r;a[k+32|0]=0;break}if((a[k+32|0]&1)!=0){break}c[k+40>>2]=1;c[k+44>>2]=c[k+4>>2]}else if((p|0)==6928){q=k;n=o+8|0;c[q>>2]=c[n>>2];c[q+4>>2]=c[n+4>>2];c[q+8>>2]=c[n+8>>2];c[q+12>>2]=c[n+12>>2];c[q+16>>2]=c[n+16>>2];c[q+20>>2]=c[n+20>>2];c[q+24>>2]=c[n+24>>2];c[q+28>>2]=c[n+28>>2];c[q+32>>2]=c[n+32>>2];c[q+36>>2]=c[n+36>>2];c[q+40>>2]=c[n+40>>2];c[q+44>>2]=c[n+44>>2];c[q+48>>2]=c[n+48>>2];c[q+52>>2]=c[n+52>>2];if((a[k+32|0]&1)!=0){break}c[k+40>>2]=1;c[k+44>>2]=c[k+4>>2]}}while(0);o=k+40|0;v=o;w=c[o>>2]|0}else{v=b;w=l}do{if((w|0)==0){cM[c[d+64>>2]&511](-2);i=e;return}else if((w|0)==1){l=c[d+144>>2]|0;if((l|0)==0){cM[c[d+64>>2]&511](c[v+4>>2]|0);i=e;return}else{cM[l&511](v);i=e;return}}else if((w|0)==3){l=c[d+144>>2]|0;if((l|0)==0){break}cM[l&511](v);i=e;return}}while(0);do{if(a[31104]|0){if((c[d+144>>2]|0)==0){break}if((w|0)==6){x=+h[v+8>>3];l=c[34]|0;b=(a[66852]&1)==0;do{if((a[64788+(l*688&-1)|0]&1)==0){if(b){y=x;break}if(x>0.0){z=+_(+x);y=z/+h[8358];break}else{y=+h[8341];break}}else{if(b){y=+Z(+(x*+h[64800+(l*688&-1)>>3]));break}if(+h[64792+(l*688&-1)>>3]==+h[8357]){y=x;break}y=x*+h[64800+(l*688&-1)>>3]/+h[8358]}}while(0);x=+h[8341];do{if(x>2]|0)==0){i=e;return}c[f>>2]=5;h[f+8>>3]=A;c[f+4>>2]=0;cM[c[l>>2]&511](f);i=e;return}else if((w|0)==4){x=+h[v+8>>3];B=+h[8341];do{if(B>2]|0)==0){i=e;return}c[g>>2]=5;h[g+8>>3]=C;c[g+4>>2]=0;cM[c[l>>2]&511](g);i=e;return}else if((w|0)==5){B=+h[v+8>>3];if((a[20668]|0)==112){E=B}else{E=1.0-B}l=(c[3524]|0)+144|0;if((c[l>>2]|0)==0){i=e;return}c[j>>2]=5;h[j+8>>3]=E;c[j+4>>2]=0;cM[c[l>>2]&511](j);i=e;return}else{i=e;return}}}while(0);cM[c[d+64>>2]&511](-2);i=e;return}function fo(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0;g=i;i=i+32|0;j=g|0;k=g+8|0;l=g+16|0;m=g+24|0;if((c[b+88>>2]|0)==0){c[e>>2]=0;n=0}else{c[e>>2]=~~(+h[3817]*+((c[d+28>>2]|0)>>>0>>>0)*.5);n=~~(+h[3817]*+((c[d+24>>2]|0)>>>0>>>0)*.5)}c[f>>2]=n;n=b+144|0;if((a[37384]&1)==0){fN(n,l,m,91736);c[e>>2]=(c[e>>2]|0)+~~+h[l>>3];o=(c[f>>2]|0)+~~+h[m>>3]|0;c[f>>2]=o;i=g;return}else{fx(n,j,k,91736);c[e>>2]=(c[e>>2]|0)+(c[j>>2]|0);o=(c[f>>2]|0)+(c[k>>2]|0)|0;c[f>>2]=o;i=g;return}}function fp(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0;f=i;i=i+48|0;g=f|0;j=f+16|0;k=f+32|0;l=f+40|0;fn(e+72|0,c[3524]|0);m=a[e+184|0]&1;do{if(m<<24>>24!=0){if((a[37456]&1)!=0){break}a[37456]=1;n=c[(c[3524]|0)+88>>2]|0;if((n|0)==0){break}cO[n&255](179864)}}while(0);a[37456]=m;fo(e,c[3524]|0,k,l);m=e+52|0;n=c[m>>2]|0;do{if((n|0)==0){o=7011}else{if((cO[c[(c[3524]|0)+72>>2]&255](n)|0)==0){o=7011;break}ln((c[k>>2]|0)+b|0,(c[l>>2]|0)+d|0,c[e+60>>2]|0,c[e+48>>2]|0,0,c[m>>2]|0,c[e+64>>2]|0);p=c[(c[3524]|0)+72>>2]|0;cO[p&255](0)}}while(0);if((o|0)==7011){ln((c[k>>2]|0)+b|0,(c[l>>2]|0)+d|0,c[e+60>>2]|0,c[e+48>>2]|0,0,0,c[e+64>>2]|0)}if((c[e+88>>2]|0)==0){a[37456]=0;i=f;return}l=c[3524]|0;do{if((c[l+96>>2]&128|0)==0){if((b|0)<=0){a[37456]=0;i=f;return}if(!((c[l+8>>2]|0)>>>0>b>>>0&(d|0)>0)){a[37456]=0;i=f;return}if((c[l+12>>2]|0)>>>0>d>>>0){break}a[37456]=0;i=f;return}}while(0);k=g;m=e+128|0;c[k>>2]=c[m>>2];c[k+4>>2]=c[m+4>>2];c[k+8>>2]=c[m+8>>2];c[k+12>>2]=c[m+12>>2];m=c[e+92>>2]|0;q=+h[e+112>>3];k=c[l+92>>2]|0;if(q<0.0){cK[k&63](+h[3817])}else{cK[k&63](q)}cK[c[(c[3524]|0)+112>>2]&63](+h[e+104>>3]);k=c[(c[3524]|0)+64>>2]|0;if((m|0)<-5){cM[k&511](-2)}else{cM[k&511](m)}k=c[3524]|0;do{if((a[e+120|0]&1)==0){if((c[k+96>>2]&1024|0)!=0){r=k;break}c[g>>2]=1;c[g+4>>2]=m;o=7026}else{o=7026}}while(0);if((o|0)==7026){fn(g,k);r=c[3524]|0}cR[c[r+80>>2]&127](b,d,c[e+96>>2]|0);e=j;c[e>>2]=c[14084];c[e+4>>2]=c[56340>>2];c[e+8>>2]=c[56344>>2];c[e+12>>2]=c[56348>>2];e=c[14075]|0;do{if((c[14074]|0)!=0){q=+h[7040];d=c[(c[3524]|0)+92>>2]|0;if(q<0.0){cK[d&63](+h[3817]);break}else{cK[d&63](q);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[7039]);d=c[(c[3524]|0)+64>>2]|0;if((e|0)<-5){cM[d&511](-2)}else{cM[d&511](e)}d=c[3524]|0;do{if((a[56328]&1)==0){if((c[d+96>>2]&1024|0)==0){c[j>>2]=1;c[j+4>>2]=e;break}else{a[37456]=0;i=f;return}}}while(0);fn(j,d);a[37456]=0;i=f;return}function fq(a,b){a=+a;b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0.0,l=0.0,n=0,o=0.0,p=0.0,q=0.0,r=0,s=0.0,t=0.0,u=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0;d=i;ft(a,b);if((c[5163]|0)==103){i=d;return}e=c[5174]|0;if((e|0)==104){f=b|0;g=b+8|0;a=+h[g>>3];j=b+16|0;k=+h[j>>3];if(a==0.0){h[j>>3]=k;h[g>>3]=k;h[f>>3]=k;i=d;return}l=+h[f>>3]*6.0;n=~~+O(+l);o=l- +(n|0);l=k*(1.0-a);p=k*(1.0-a*o);q=k*(1.0-a*(1.0-o));r=(n|0)%6&-1;if((r|0)==1){h[f>>3]=p;h[g>>3]=k;h[j>>3]=l;i=d;return}else if((r|0)==0){h[f>>3]=k;h[g>>3]=q;h[j>>3]=l;i=d;return}else if((r|0)==4){h[f>>3]=q;h[g>>3]=l;h[j>>3]=k;i=d;return}else if((r|0)==3){h[f>>3]=l;h[g>>3]=p;h[j>>3]=k;i=d;return}else if((r|0)==2){h[f>>3]=l;h[g>>3]=k;h[j>>3]=q;i=d;return}else{h[f>>3]=k;h[g>>3]=l;h[j>>3]=p;i=d;return}}else if((e|0)==121){j=b|0;p=+h[j>>3];g=b+8|0;l=+h[g>>3];f=b+16|0;k=+h[f>>3];q=p-l*.956+k*.621;do{if(q<0.0){s=0.0}else{if(q>1.0){s=1.0;break}s=q}}while(0);h[j>>3]=s;s=p-l*.272-k*.647;do{if(s<0.0){t=0.0}else{if(s>1.0){t=1.0;break}t=s}}while(0);h[g>>3]=t;t=p-l*1.105-k*1.702;do{if(t<0.0){u=0.0}else{if(t>1.0){u=1.0;break}u=t}}while(0);h[f>>3]=u;i=d;return}else if((e|0)==99){f=b|0;g=b+8|0;u=+h[g>>3];j=b+16|0;t=+h[j>>3];k=1.0- +h[f>>3];do{if(k<0.0){w=0.0}else{if(k>1.0){w=1.0;break}w=k}}while(0);h[f>>3]=w;w=1.0-u;do{if(w<0.0){x=0.0}else{if(w>1.0){x=1.0;break}x=w}}while(0);h[g>>3]=x;x=1.0-t;do{if(x<0.0){y=0.0}else{if(x>1.0){y=1.0;break}y=x}}while(0);h[j>>3]=y;i=d;return}else if((e|0)==120){j=b|0;y=+h[j>>3];g=b+8|0;x=+h[g>>3];f=b+16|0;t=+h[f>>3];w=y*1.91-x*.5338-t*.2891;do{if(w<0.0){z=0.0}else{if(w>1.0){z=1.0;break}z=w}}while(0);h[j>>3]=z;z=y*-.9844+x*1.999-t*.0279;do{if(z<0.0){A=0.0}else{if(z>1.0){A=1.0;break}A=z}}while(0);h[g>>3]=A;A=y*.0585-x*.1187-t*.9017;do{if(A<0.0){B=0.0}else{if(A>1.0){B=1.0;break}B=A}}while(0);h[f>>3]=B;i=d;return}else if((e|0)==114){i=d;return}else{cf(c[m>>2]|0,91064,(v=i,i=i+24|0,c[v>>2]=179392,c[v+8>>2]=310,c[v+16>>2]=e<<24>>24,v)|0);i=d;return}}function fr(b,d){b=+b;d=d|0;var e=0,f=0,g=0,j=0.0,k=0.0,l=0,m=0,n=0,o=0.0,p=0,q=0.0,r=0,s=0.0;e=i;i=i+24|0;f=e|0;g=c[5168]|0;L9652:do{if((g|0)==0){j=b}else{k=+O(+(+(g|0)*b))/+(g-1|0);if((c[5163]|0)!=100){j=k;break}l=c[5172]|0;if((l|0)<3&k==0.0){j=k;break}m=c[5173]|0;n=0;o=k;while(1){if((n|0)>=(l|0)){j=o;break L9652}k=+h[m+(n<<5)>>3];p=n+1|0;q=+h[m+(p<<5)>>3];r=q>b;do{if(k<=b&r){if(!(oq)){s=o;break}s=(k+q)*.5}else{s=o}}while(0);if(r){j=s;break}else{n=p;o=s}}}}while(0);fq(j,f);j=+h[f+8>>3];s=+h[f+16>>3];a[d|0]=~~(+h[f>>3]*255.0+.5);a[d+1|0]=~~(j*255.0+.5);a[d+2|0]=~~(s*255.0+.5);i=e;return}function fs(a,b,d,e){a=a|0;b=b|0;d=+d;e=e|0;var f=0,g=0,j=0.0,k=0,l=0,m=0,n=0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0,w=0,x=0,y=0,z=0.0,A=0.0,B=0,C=0,D=0,E=0,F=0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,Q=0.0,R=0.0,S=0.0,T=0,U=0,V=0,W=0,X=0,Y=0;a=i;i=i+24|0;f=a|0;g=(b|0)<1?2e3:b;j=d>0.0?d:.003;b=ut(1600)|0;k=b;l=ut(2400)|0;m=l;ft(0.0,m);h[b>>3]=0.0;n=b+8|0;c[n>>2]=c[l>>2];c[n+4>>2]=c[l+4>>2];c[n+8>>2]=c[l+8>>2];c[n+12>>2]=c[l+12>>2];c[n+16>>2]=c[l+16>>2];c[n+20>>2]=c[l+20>>2];d=+(g|0);ft(1.0/d,l+24|0);do{if((g|0)>0){l=0;o=0.0;n=50;b=k;p=100;q=m;r=1;while(1){s=q;t=p;u=o;v=2;while(1){w=v+l|0;if((w|0)>(g|0)){x=s;y=t;z=u;break}A=+(w|0)/d;if((v|0)==(t|0)){B=v+50|0;C=uv(s,B<<5)|0;D=B}else{C=s;D=t}B=C+(v*24&-1)|0;ft(A,B);E=v-2|0;F=v-1|0;G=+h[C+(E*24&-1)>>3];H=+h[C+(E*24&-1)+8>>3];I=+h[C+(E*24&-1)+16>>3];J=+h[C+(F*24&-1)>>3];K=+h[C+(F*24&-1)+8>>3];L=+h[C+(F*24&-1)+16>>3];M=+h[B>>3];N=+h[C+(v*24&-1)+8>>3];O=+h[C+(v*24&-1)+16>>3];if(GM){x=C;y=D;z=A;break}if(HN){x=C;y=D;z=A;break}if(IO){x=C;y=D;z=A;break}if(G>J&JK&KL&L>3];I=+h[C+8>>3];K=+h[C+16>>3];H=+(v|0);J=(M-L)/H;M=(N-I)/H;N=(O-K)/H;H=0.0;B=1;while(1){if((B|0)>=(v|0)){Q=H;break}O=+(B|0);G=+P(+(L+J*O- +h[C+(B*24&-1)>>3]));R=+P(+(I+M*O- +h[C+(B*24&-1)+8>>3]));S=+P(+(K+N*O- +h[C+(B*24&-1)+16>>3]));O=G>H?G:H;G=R>O?R:O;O=S>G?S:G;if(Oj){x=C;y=D;z=A;break}else{s=C;t=D;u=A;v=v+1|0}}if((r|0)==(n|0)){t=r+25|0;T=uv(b,t<<5)|0;U=t}else{T=b;U=n}h[T+(r<<5)>>3]=z;t=T+(r<<5)+8|0;s=x+((v-1|0)*24&-1)|0;c[t>>2]=c[s>>2];c[t+4>>2]=c[s+4>>2];c[t+8>>2]=c[s+8>>2];c[t+12>>2]=c[s+12>>2];c[t+16>>2]=c[s+16>>2];c[t+20>>2]=c[s+20>>2];V=r+1|0;t=x;c[t>>2]=c[s>>2];c[t+4>>2]=c[s+4>>2];c[t+8>>2]=c[s+8>>2];c[t+12>>2]=c[s+12>>2];c[t+16>>2]=c[s+16>>2];c[t+20>>2]=c[s+20>>2];s=x+24|0;t=x+(v*24&-1)|0;c[s>>2]=c[t>>2];c[s+4>>2]=c[t+4>>2];c[s+8>>2]=c[t+8>>2];c[s+12>>2]=c[t+12>>2];c[s+16>>2]=c[t+16>>2];c[s+20>>2]=c[t+20>>2];if((w|0)<(g|0)){l=w;o=z;n=U;b=T;p=y;q=x;r=V}else{break}}ft(1.0,f);if((V|0)!=(U|0)){W=T;X=V;Y=x;break}W=uv(T,(V<<5)+32|0)|0;X=V;Y=x}else{ft(1.0,f);W=k;X=1;Y=m}}while(0);h[W+(X<<5)>>3]=1.0;m=W+(X<<5)+8|0;k=f;c[m>>2]=c[k>>2];c[m+4>>2]=c[k+4>>2];c[m+8>>2]=c[k+8>>2];c[m+12>>2]=c[k+12>>2];c[m+16>>2]=c[k+16>>2];c[m+20>>2]=c[k+20>>2];uu(Y);c[e>>2]=X+1;i=a;return W|0}function ft(b,d){b=+b;d=d|0;var e=0,f=0,g=0.0,j=0,k=0.0,l=0.0,n=0.0,o=0.0,p=0,q=0.0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0;e=i;i=i+24|0;f=e|0;do{if(b<0.0){g=0.0}else{if(b<=1.0){g=b;break}g=1.0}}while(0);j=c[5163]|0;if((j|0)==99){b=(+h[2706]/3.0+g*+h[2707])*6.283185307179586;k=+h[2705];if(k!=1.0){l=+R(+g,+(1.0/k))}else{l=g}k=(1.0-l)*l*+h[2708]*.5;n=+S(+b);o=+T(+b);b=l+k*(n*-.14861+o*1.78277);p=d|0;h[p>>3]=b;q=l+k*(n*-.29227-o*.90649);r=d+8|0;h[r>>3]=q;o=l+n*1.97294*k;s=d+16|0;h[s>>3]=o;do{if(b>1.0){h[p>>3]=1.0}else{if(b>=0.0){break}h[p>>3]=0.0}}while(0);do{if(q>1.0){h[r>>3]=1.0}else{if(q>=0.0){break}h[r>>3]=0.0}}while(0);if(o>1.0){h[s>>3]=1.0;i=e;return}if(o>=0.0){i=e;return}h[s>>3]=0.0;i=e;return}else if((j|0)==100){if(g<0.0){h[d>>3]=+h[(c[5173]|0)+8>>3];h[d+8>>3]=+h[(c[5173]|0)+16>>3];h[d+16>>3]=+h[(c[5173]|0)+24>>3];i=e;return}s=c[5172]|0;if(g>1.0){r=s-1|0;h[d>>3]=+h[(c[5173]|0)+(r<<5)+8>>3];h[d+8>>3]=+h[(c[5173]|0)+(r<<5)+16>>3];h[d+16>>3]=+h[(c[5173]|0)+(r<<5)+24>>3];i=e;return}L9731:do{if((s|0)>1){r=c[5173]|0;p=0;t=s-1|0;L9733:while(1){u=p;while(1){if((u|0)==(t|0)){w=t;x=r;break L9731}y=(u+t|0)/2&-1;if(+h[r+(y<<5)>>3]>3];if(o==g){h[d>>3]=+h[s>>3];h[d+8>>3]=+h[x+(w<<5)+16>>3];h[d+16>>3]=+h[x+(w<<5)+24>>3];i=e;return}else{t=w-1|0;q=+h[x+(t<<5)>>3];b=(g-q)/(o-q);q=+h[x+(t<<5)+8>>3];h[d>>3]=q+b*(+h[s>>3]-q);q=+h[x+(t<<5)+16>>3];h[d+8>>3]=q+b*(+h[x+(w<<5)+16>>3]-q);q=+h[x+(t<<5)+24>>3];h[d+16>>3]=q+b*(+h[x+(w<<5)+24>>3]-q);i=e;return}}else if((j|0)==114){h[d>>3]=+fu(c[5164]|0,g);h[d+8>>3]=+fu(c[5165]|0,g);h[d+16>>3]=+fu(c[5166]|0,g);i=e;return}else if((j|0)==102){c[5182]=2;h[2592]=g;h[2593]=0.0;e4(c[5178]|0,f);if((a[1960]&1)!=0){uf(-1,86464,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}w=f|0;x=c[w>>2]|0;if((x|0)==1){z=+(c[f+8>>2]|0)}else if((x|0)==3){z=+uz(c[f+8>>2]|0,0)}else if((x|0)==2){z=+h[f+8>>3]}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if(z<0.0){A=0.0}else{A=z>1.0?1.0:z}c[5260]=2;h[2631]=g;h[2632]=0.0;e4(c[5256]|0,f);if((a[1960]&1)!=0){uf(-1,85592,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}x=c[w>>2]|0;if((x|0)==3){B=+uz(c[f+8>>2]|0,0)}else if((x|0)==1){B=+(c[f+8>>2]|0)}else if((x|0)==2){B=+h[f+8>>3]}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if(B<0.0){C=0.0}else{C=B>1.0?1.0:B}c[5338]=2;h[2670]=g;h[2671]=0.0;e4(c[5334]|0,f);if((a[1960]&1)!=0){uf(-1,84488,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}x=c[w>>2]|0;if((x|0)==1){D=+(c[f+8>>2]|0)}else if((x|0)==3){D=+uz(c[f+8>>2]|0,0)}else if((x|0)==2){D=+h[f+8>>3]}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if(D<0.0){E=0.0}else{E=D>1.0?1.0:D}h[d>>3]=A;h[d+8>>3]=C;h[d+16>>3]=E;i=e;return}else if((j|0)==103){E=+R(+g,+(1.0/+h[2705]));h[d+16>>3]=E;h[d+8>>3]=E;h[d>>3]=E;i=e;return}else{cf(c[m>>2]|0,87488,(v=i,i=i+24|0,c[v>>2]=179392,c[v+8>>2]=272,c[v+16>>2]=j<<24>>24,v)|0);i=e;return}}function fu(a,b){a=a|0;b=+b;var d=0,e=0.0,f=0,g=0.0,h=0.0;d=i;if((a|0)<0){e=1.0-b;f=-a|0}else{e=b;f=a}do{if((f|0)==18){g=+P(+(+S(+(e*360.0*.017453292519943295))))}else if((f|0)==33){g=+P(+(e*2.0+-.5))}else if((f|0)==0){h=0.0;i=d;return+h}else if((f|0)==25){g=+P(+(e*3.0+-2.0))}else if((f|0)==10){g=+S(+(e*90.0*.017453292519943295))}else if((f|0)==2){h=1.0;i=d;return+h}else if((f|0)==11){g=+P(+(e+-.5))}else if((f|0)==31){if(e<=.42){h=0.0;i=d;return+h}if(e<.92){g=e*2.0+-.84;break}else{h=1.0;i=d;return+h}}else if((f|0)==15){g=+T(+(e*360.0*.017453292519943295))}else if((f|0)==16){g=+S(+(e*360.0*.017453292519943295))}else if((f|0)==26){g=e*1.5+-.5}else if((f|0)==21){g=e*3.0}else if((f|0)==14){g=+P(+(+S(+(e*180.0*.017453292519943295))))}else if((f|0)==19){g=+P(+(+T(+(e*720.0*.017453292519943295))))}else if((f|0)==20){g=+P(+(+S(+(e*720.0*.017453292519943295))))}else if((f|0)==23){g=e*3.0+-2.0}else if((f|0)==24){g=+P(+(e*3.0+-1.0))}else if((f|0)==28){g=+P(+(e*1.5+-.5))}else if((f|0)==3){g=e}else if((f|0)==22){g=e*3.0+-1.0}else if((f|0)==29){g=+P(+(e*1.5+-1.0))}else if((f|0)==27){g=e*1.5+-1.0}else if((f|0)==1){h=.5;i=d;return+h}else if((f|0)==30){if(e<=.25){h=0.0;i=d;return+h}if(e<.57){g=e/.32+-.78125;break}else{h=1.0;i=d;return+h}}else if((f|0)==34){g=e*2.0}else if((f|0)==35){g=e*2.0+-.5}else if((f|0)==5){g=e*e*e}else if((f|0)==6){g=e*e*e*e}else if((f|0)==9){g=+T(+(e*90.0*.017453292519943295))}else if((f|0)==36){g=e*2.0+-1.0}else if((f|0)==4){g=e*e}else if((f|0)==12){b=e*2.0+-1.0;g=b*b}else if((f|0)==32){if(e<=.42){g=e*4.0;break}if(e>.92){g=e/.08-11.5;break}else{g=e*-2.0+1.84;break}}else if((f|0)==7){g=+Q(+e)}else if((f|0)==13){g=+T(+(e*180.0*.017453292519943295))}else if((f|0)==8){g=+Q(+(+Q(+e)))}else if((f|0)==17){g=+P(+(+T(+(e*360.0*.017453292519943295))))}else{cf(c[m>>2]|0,143136,(v=i,i=i+8|0,c[v>>2]=(c[5162]|0)-1,v)|0);bd(1);return 0.0}}while(0);if(g<=0.0){h=0.0;i=d;return+h}h=g<1.0?g:1.0;i=d;return+h}function fv(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,Q=0,R=0,U=0,V=0,W=0,X=0,Y=0,$=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0,aA=0,aB=0,aC=0,aD=0,aE=0,aF=0,aG=0,aH=0,aJ=0.0,aK=0.0,aL=0.0,aM=0.0,aO=0.0,aP=0,aQ=0,aR=0.0,aS=0.0,aT=0.0,aU=0.0,aV=0.0,aW=0.0,aX=0,aY=0,aZ=0,a_=0.0,a$=0,a0=0,a1=0.0,a2=0.0,a3=0,a4=0.0,a5=0,a6=0,a7=0,a9=0,ba=0,bb=0,bc=0,bd=0,be=0,bf=0,bg=0,bh=0,bi=0,bj=0,bk=0,bl=0,bm=0,bn=0,bo=0,bp=0,bq=0,br=0,bs=0,bt=0,bu=0,bv=0,bx=0,by=0,bz=0,bA=0,bB=0.0,bC=0,bD=0,bE=0,bF=0,bG=0,bH=0,bI=0,bJ=0,bK=0,bL=0,bM=0,bN=0,bO=0,bP=0,bQ=0,bR=0,bS=0,bT=0,bU=0,bV=0,bW=0,bX=0.0,bY=0,bZ=0,b_=0.0,b$=0.0,b0=0.0,b1=0.0,b2=0.0,b3=0.0,b5=0.0,b6=0.0,b7=0.0,b8=0,b9=0,ca=0,cb=0.0,cc=0.0,cd=0.0,ce=0.0,cf=0.0,cg=0,ch=0,ci=0.0,cj=0,ck=0.0,cl=0.0,cm=0.0,cn=0.0,co=0.0,cp=0.0,cq=0.0,cr=0.0,cs=0.0,ct=0.0,cu=0.0,cv=0.0,cw=0.0,cx=0.0,cy=0.0,cz=0.0,cA=0.0,cB=0,cC=0,cD=0.0,cE=0,cF=0,cH=0,cI=0.0,cJ=0,cL=0,cP=0,cQ=0,cT=0,cU=0,cV=0,cW=0,cX=0,cY=0,cZ=0,c_=0,c$=0,c0=0,c1=0,c2=0,c3=0,c4=0,c5=0,c6=0.0,c7=0.0,c8=0,c9=0,da=0,db=0,dc=0,dd=0,de=0,df=0,dg=0,dh=0,di=0,dj=0.0,dk=0.0,dl=0,dm=0.0,dn=0,dp=0,dq=0.0,dr=0,ds=0,dt=0,du=0,dv=0,dw=0.0,dx=0.0,dy=0,dA=0,dB=0,dC=0,dE=0,dF=0,dG=0,dH=0,dI=0,dJ=0,dK=0,dL=0,dM=0,dN=0,dO=0,dP=0,dQ=0.0,dR=0.0,dS=0,dT=0,dU=0,dV=0,dW=0.0,dX=0,dY=0,dZ=0,d_=0;f=i;i=i+1992|0;j=f|0;k=f+48|0;l=f+96|0;n=f+104|0;o=f+112|0;p=f+120|0;q=f+128|0;r=f+144|0;s=f+160|0;t=f+168|0;u=f+176|0;w=f+184|0;x=f+192|0;y=f+200|0;z=f+208|0;A=f+216|0;B=f+224|0;C=f+240|0;D=f+256|0;E=f+264|0;F=f+272|0;G=f+312|0;H=f+328|0;I=f+336|0;J=f+344|0;K=f+384|0;L=f+400|0;M=f+424|0;N=f+432|0;O=f+440|0;Q=f+448|0;R=f+456|0;U=f+464|0;V=f+472|0;W=f+480|0;X=f+488|0;Y=f+496|0;$=f+504|0;ab=f+512|0;ac=f+520|0;ad=f+528|0;ae=f+536|0;af=f+544|0;ag=f+552|0;ah=f+560|0;ai=f+568|0;aj=f+576|0;ak=f+584|0;al=f+600|0;am=f+608|0;an=f+616|0;ao=f+624|0;ap=f+632|0;aq=f+648|0;ar=f+664|0;as=f+672|0;at=f+680|0;au=f+688|0;av=f+696|0;aw=f+704|0;ax=f+712|0;ay=f+728|0;az=f+736|0;aA=f+864|0;aB=f+872|0;aC=f+880|0;aD=f+1912|0;aE=f+1920|0;aF=f+1928|0;aG=f+1936|0;aH=c[3524]|0;aJ=+g[3536]*.017453292519943295;aK=+S(+aJ);aL=+T(+aJ);uE(3136,0,24);uE(3176,0,32);h[401]=1.0;uE(3216,0,32);h[406]=1.0;h[391]=aK;aJ=-0.0-aL;h[392]=aJ;h[395]=aL;h[396]=aK;aL=+g[3538]*.017453292519943295;aM=+S(+aL);aO=+T(+aL);aL=-0.0-aO;aP=az;aQ=0;aR=aK;aK=aJ;aJ=0.0;aS=0.0;while(1){aT=aK*0.0;aU=aJ*0.0;aV=aS*0.0;h[az+(aQ<<5)>>3]=aR+0.0+aT+aU+aV;aW=aR*0.0+0.0;h[az+(aQ<<5)+8>>3]=aW+aM*aK+aO*aJ+aV;h[az+(aQ<<5)+16>>3]=aW+aK*aL+aM*aJ+aV;h[az+(aQ<<5)+24>>3]=aS+(aW+aT+aU);aX=aQ+1|0;if((aX|0)>=4){break}aQ=aX;aR=+h[3128+(aX<<5)>>3];aK=+h[3136+(aX<<5)>>3];aJ=+h[3144+(aX<<5)>>3];aS=+h[3152+(aX<<5)>>3]}c[782]=c[aP>>2];c[783]=c[aP+4>>2];c[784]=c[aP+8>>2];c[785]=c[aP+12>>2];c[786]=c[aP+16>>2];c[787]=c[aP+20>>2];c[788]=c[aP+24>>2];c[789]=c[aP+28>>2];aQ=az+32|0;c[790]=c[aQ>>2];c[3164>>2]=c[aQ+4>>2];c[3168>>2]=c[aQ+8>>2];c[3172>>2]=c[aQ+12>>2];c[3176>>2]=c[aQ+16>>2];c[3180>>2]=c[aQ+20>>2];c[3184>>2]=c[aQ+24>>2];c[3188>>2]=c[aQ+28>>2];aX=az+64|0;c[798]=c[aX>>2];c[3196>>2]=c[aX+4>>2];c[3200>>2]=c[aX+8>>2];c[3204>>2]=c[aX+12>>2];c[3208>>2]=c[aX+16>>2];c[3212>>2]=c[aX+20>>2];c[3216>>2]=c[aX+24>>2];c[3220>>2]=c[aX+28>>2];aY=az+96|0;c[806]=c[aY>>2];c[3228>>2]=c[aY+4>>2];c[3232>>2]=c[aY+8>>2];c[3236>>2]=c[aY+12>>2];c[3240>>2]=c[aY+16>>2];c[3244>>2]=c[aY+20>>2];c[3248>>2]=c[aY+24>>2];c[3252>>2]=c[aY+28>>2];aS=+g[3534]*.5;aZ=0;do{aJ=+h[3128+(aZ<<5)>>3];aK=+h[3136+(aZ<<5)>>3];aR=aK*0.0;aM=+h[3144+(aZ<<5)>>3];aL=aM*0.0;aO=+h[3152+(aZ<<5)>>3];aU=aO*0.0;h[az+(aZ<<5)>>3]=aS*aJ+0.0+aR+aL+aU;aT=aJ*0.0+0.0;h[az+(aZ<<5)+8>>3]=aT+aS*aK+aL+aU;aK=aT+aR;h[az+(aZ<<5)+16>>3]=aK+aS*aM+aU;h[az+(aZ<<5)+24>>3]=aO+(aK+aL);aZ=aZ+1|0;}while((aZ|0)<4);c[782]=c[aP>>2];c[783]=c[aP+4>>2];c[784]=c[aP+8>>2];c[785]=c[aP+12>>2];c[786]=c[aP+16>>2];c[787]=c[aP+20>>2];c[788]=c[aP+24>>2];c[789]=c[aP+28>>2];c[790]=c[aQ>>2];c[3164>>2]=c[aQ+4>>2];c[3168>>2]=c[aQ+8>>2];c[3172>>2]=c[aQ+12>>2];c[3176>>2]=c[aQ+16>>2];c[3180>>2]=c[aQ+20>>2];c[3184>>2]=c[aQ+24>>2];c[3188>>2]=c[aQ+28>>2];c[798]=c[aX>>2];c[3196>>2]=c[aX+4>>2];c[3200>>2]=c[aX+8>>2];c[3204>>2]=c[aX+12>>2];c[3208>>2]=c[aX+16>>2];c[3212>>2]=c[aX+20>>2];c[3216>>2]=c[aX+24>>2];c[3220>>2]=c[aX+28>>2];c[806]=c[aY>>2];c[3228>>2]=c[aY+4>>2];c[3232>>2]=c[aY+8>>2];c[3236>>2]=c[aY+12>>2];c[3240>>2]=c[aY+16>>2];c[3244>>2]=c[aY+20>>2];c[3248>>2]=c[aY+24>>2];c[3252>>2]=c[aY+28>>2];if((a[30528]&1)!=0){uk(83256,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}do{if((a[624]&1)==0){aY=c[34]|0;aS=+h[64664+(aY*688&-1)>>3];a_=aS-(+h[64672+(aY*688&-1)>>3]-aS)*+h[77]}else{aS=+h[77];if((a[64788]&1)==0){a_=aS;break}aL=+_(+aS);a_=aL/+h[8100]}}while(0);h[7076]=a_;aY=c[200]|0;L9870:do{if((c[64916+(aY*688&-1)>>2]|0)==0){if((c[64916+((c[144]|0)*688&-1)>>2]|0)==0){a$=0}else{a0=7282;break}while(1){if(a$>>>0>=8){break}if((a[65036+(a$*688&-1)|0]&1)!=0){a0=7282;break L9870}if((a[65037+(a$*688&-1)|0]&1)==0){a$=a$+1|0}else{a0=7282;break L9870}}aX=c[34]|0;aL=+h[64664+(aX*688&-1)>>3];h[5279]=aL;aS=+h[64672+(aX*688&-1)>>3];h[6915]=aS;a1=aL;a2=aS}else{a0=7282}}while(0);do{if((a0|0)==7282){a$=c[34]|0;aS=+h[64664+(a$*688&-1)>>3];if((c[64656+(a$*688&-1)>>2]&2|0)==0){h[5279]=aS>3];h[6915]=aL>a_?aL:a_;a1=aS;a2=aL;break}else{h[5279]=aS>a_?aS:a_;aL=+h[64672+(a$*688&-1)>>3];h[6915]=aL>3]==+h[64672+(aY*688&-1)>>3]){uk(175032,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}aY=c[144]|0;if(+h[64664+(aY*688&-1)>>3]==+h[64672+(aY*688&-1)>>3]){uk(141592,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if(a1==a2){uk(126608,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((a[14080]&1)==0){lk()}do{if(a[14088]|0){if((a[33512]&1)==0){break}if(!(a[13032]|0)){break}aY=c[(c[3524]|0)+104>>2]|0;if((aY|0)!=0){cS[aY&511]()}a[13032]=0}else{cS[c[(c[3524]|0)+52>>2]&511]();a[14088]=1}}while(0);cM[c[(c[3524]|0)+168>>2]&511](0);aY=c[3524]|0;if((c[aY+96>>2]&16|0)!=0){c[7271]=-1}c[13880]=0;c[13881]=(c[aY+8>>2]|0)-1;c[13882]=0;c[13883]=(c[aY+12>>2]|0)-1;a[25280]=0;cM[c[aY+168>>2]&511](1);aY=c[3524]|0;c[1100]=0;a$=aY+24|0;aX=aY+28|0;a2=+h[4524];if(a2<0.0){a3=0;a4=+h[3817]}else{a1=+h[3817];a3=~~(a2*+((c[aY+20>>2]|0)>>>0>>>0)+a1*+((c[aX>>2]|0)>>>0>>>0));a4=a1}c[9002]=a3;a1=+h[4525];a3=~~(a1*a4*+((c[a$>>2]|0)>>>0>>>0)*1.25);c[9022]=a3;aQ=aY+16|0;aP=c[aQ>>2]|0;if(a3>>>0>>0){c[9022]=~~(a1*+(aP>>>0>>>0))}aP=(d|0)>0;if(aP){a3=0;aZ=0;az=0;a5=b;while(1){a6=c[a5+16>>2]|0;do{if((a6|0)==0){a7=aZ;a9=a3}else{if((a[a6]|0)==0){a7=aZ;a9=a3;break}if((a[a5+22|0]&1)!=0){a7=aZ;a9=a3;break}ba=lp(a6)|0;a7=(ba|0)>(aZ|0)?ba:aZ;a9=a3+1|0}}while(0);do{if((c[11690]|0)==0){bb=a7;bc=a9}else{a6=a[35888]|0;if((a6&1)==0){bb=a7;bc=a9;break}ba=c[a5+256>>2]|0;if((ba|0)==0){bb=a7;bc=a9;break}else{bd=0;be=0;bf=ba;bg=a6}while(1){do{if((bg&1)==0){bh=be;bi=bd}else{if((a[bf+8|0]|0)==0){bh=be;bi=bd;break}a6=bf+9|0;ba=lp(a6)|0;bj=b4(a6|0,73808)|0;a6=ba-bj|0;bh=((ba|0)!=(bj|0)&1)+be|0;bi=(a6|0)>(bd|0)?a6:bd}}while(0);a6=c[bf>>2]|0;if((a6|0)==0){break}bd=bi;be=bh;bf=a6;bg=a[35888]|0}bb=(bi|0)>(a7|0)?bi:a7;bc=bh+a9|0}}while(0);a6=az+1|0;if((a6|0)<(d|0)){a3=bc;aZ=bb;az=a6;a5=c[a5>>2]|0}else{bk=bc;bl=bb;break}}}else{bk=0;bl=0}c[6962]=bk;c[8712]=bl;a1=+(ga(36288,ay)|0);bl=~~(a1-(+h[4524]+2.0));a1=+(c[ay>>2]|0);h[4487]=a1;bk=c[8712]|0;if((bl|0)>(bk|0)){c[8712]=bl;bm=bl}else{bm=bk}bk=bm+4|0;bm=aY+20|0;bl=aa(bk,c[bm>>2]|0);bb=c[9002]|0;bc=bl+bb|0;c[9028]=bc;bl=c[8786]|0;a5=(bl|0)==3;a4=+h[4395];do{if(a5){az=~~(a4*+((c[aY+8>>2]|0)>>>0>>>0)+.5);c[7938]=az;bn=az}else{az=c[bm>>2]|0;if(a4<0.0){aZ=(c[aX>>2]|0)+(az<<1)|0;c[7938]=aZ;bn=aZ;break}else{aZ=~~(a4*+(az>>>0>>>0)+.5);c[7938]=aZ;bn=aZ;break}}}while(0);aZ=c[6598]|0;az=(aZ|0)==3;if(az){bo=~~(+h[3301]*+((c[aY+8>>2]|0)>>>0>>>0)+.5)}else{bo=~~(+g[178]*+((c[aY+8>>2]|0)>>>0>>>0)- +(c[bm>>2]<<1>>>0>>>0)- +((c[aX>>2]|0)>>>0>>>0))}c[7939]=bo;a3=c[6962]|0;c[9014]=a3;c[9024]=1;a9=c[9339]|0;bh=(a9|0)>0;if((a3|0)>(a9|0)&bh){c[9014]=a9;a7=((a3-1|0)/(a9|0)&-1)+1|0;c[9024]=a7;bp=a9;bq=a7}else{bp=a3;bq=1}a7=a[36120]&1;bi=a7<<24>>24==0;do{if(bi){br=bp;bs=bc;bt=bq}else{if(!(((c[9031]|0)-1|0)>>>0<2&(c[9032]|0)==1)){br=bp;bs=bc;bt=bq;break}if((a3|0)>0){bg=bo-bn|0;bf=(bg>>>0)/((aa(c[bm>>2]|0,bk)+bb|0)>>>0)>>>0;be=a3-1|0;bd=((be|0)/(((bf|0)==0?1:bf)|0)&-1)+1|0;bf=(bd|0)>(a9|0)&bh?a9:bd;c[9014]=bf;bd=((be|0)/(bf|0)&-1)+1|0;c[9024]=bd;be=(bg|0)/(bd|0)&-1;c[9028]=be;br=bf;bs=be;bt=bd;break}else{c[9028]=0;c[9024]=0;c[9014]=0;br=0;bs=0;bt=0;break}}}while(0);bb=(c[14100]|0)==3;do{if(bb){bk=~~(+h[7052]*+((c[aY+12>>2]|0)>>>0>>>0)+.5);c[7940]=bk;bu=bk}else{a4=+h[7052];bk=c[aQ>>2]|0;if((c[5094]|0)!=0&a4>=0.0){bq=~~(a4*+(bk>>>0>>>0));c[7940]=bq;bu=bq;break}else{bq=~~(+(bk>>>0>>>0)*2.5+1.0);c[7940]=bq;bu=bq;break}}}while(0);do{if(a7<<24>>24!=0&(br|0)!=0){if(!(((c[9031]|0)-1|0)>>>0<2&(c[9032]|0)==1)){bv=bu;break}a4=+(aa(c[9022]|0,br)|0);bq=~~(+(bu|0)+(a4+a1*+((c[aQ>>2]|0)>>>0>>>0)));c[7940]=bq;bv=bq}else{bv=bu}}while(0);bu=c[1119]|0;L9970:do{if((bu|0)!=0){br=(c[1100]|0)+1|0;c[1100]=br;c[ay>>2]=0;a7=a[bu]|0;if(a7<<24>>24==0){break}else{bx=1;by=br;bz=a7}while(1){if(bz<<24>>24==92){a7=by+1|0;c[1100]=a7;bA=a7}else{bA=by}c[ay>>2]=bx;if(bx>>>0>=(uA(bu|0)|0)>>>0){break L9970}a7=a[bu+bx|0]|0;bx=bx+1|0;by=bA;bz=a7}}}while(0);bz=(c[1066]|0)==3;if(bz){bB=+h[535]*+((c[aY+12>>2]|0)>>>0>>>0)+.5}else{bB=+g[38]*+((c[aY+12>>2]|0)>>>0>>>0)- +((c[aQ>>2]|0)>>>0>>>0)*(+(c[1100]|0)+1.5)+-1.0}bA=~~bB;c[7941]=bA;do{if(bi){bC=bn;bD=bl;bE=aZ;bF=bo}else{by=c[9031]|0;if((by|0)==0){a0=7360}else if((by|0)==1|(by|0)==2){if((c[9032]|0)==3){a0=7360}else{bG=bt}}else{bG=bt}do{if((a0|0)==7360){bx=~~(+(((((bA-bv|0)>>>0)/((c[aQ>>2]|0)>>>0)>>>0)-1|0)>>>0>>>0)-a1);bu=(bx|0)>(a9|0)&bh?a9:bx;bx=(bu|0)==0?1:bu;c[ay>>2]=bx;if((a3|0)<=(bx|0)){bG=bt;break}bu=a3-1|0;a7=((bu|0)/(bx|0)&-1)+1|0;c[9024]=a7;c[9014]=((bu|0)/(a7|0)&-1)+1;bG=a7}}while(0);a7=by-1|0;bu=c[9032]|0;bx=(bu|0)!=3|a7>>>0>1;if(bx|az){bH=bx?aZ:3;bI=bo}else{bx=c[bm>>2]|0;br=((bo-bs|0)-aa(bG-1|0,bs)|0)+(bx<<1)|0;c[7939]=br;bH=aZ;bI=br}if(!(a7>>>0<2&(bu|0)==2)){bC=bn;bD=bl;bE=bH;bF=bI;break}if(a5){bC=bn;bD=3;bE=bH;bF=bI;break}bu=c[bm>>2]|0;a7=((bs+bn|0)+aa(bG-1|0,bs)|0)-(bu<<1)|0;c[7938]=a7;bC=a7;bD=bl;bE=bH;bF=bI}}while(0);bI=(c[5094]|0)==0;bH=c[18072]|0;do{if(bI&(bH|0)>0){bl=bA-bv|0;bs=bF-bC|0;if((bl|0)>(bs|0)){bG=(bl-bs|0)/2&-1;bn=bG+bv|0;c[7940]=bn;bm=bA-bG|0;c[7941]=bm;bJ=bF;bK=bC;bL=bm;bM=bn;break}else{bn=(bs-bl|0)/2&-1;bl=bn+bC|0;c[7938]=bl;bs=bF-bn|0;c[7939]=bs;bJ=bs;bK=bl;bL=bA;bM=bv;break}}else{bJ=bF;bK=bC;bL=bA;bM=bv}}while(0);bv=(bD|0)==3;if(bv){bN=bK}else{bD=~~(+(bK|0)+ +((c[aY+8>>2]|0)>>>0>>>0)*+g[184]);c[7938]=bD;bN=bD}bD=(bE|0)==3;if(bD){bO=bJ}else{bE=~~(+(bJ|0)+ +((c[aY+8>>2]|0)>>>0>>>0)*+g[184]);c[7939]=bE;bO=bE}if(bz){bP=bL}else{bE=~~(+(bL|0)+ +((c[aY+12>>2]|0)>>>0>>>0)*+g[44]);c[7941]=bE;bP=bE}if(bb){bQ=bM}else{bE=~~(+(bM|0)+ +((c[aY+12>>2]|0)>>>0>>>0)*+g[44]);c[7940]=bE;bQ=bE}bE=(bO+bN|0)/2&-1;c[186]=bE;aY=(bQ+bP|0)/2&-1;c[46]=aY;bM=bO-bN|0;bL=(bM<<2|0)/7&-1;c[180]=bL;bJ=bP-bQ|0;bK=(bJ<<2|0)/7&-1;c[40]=bK;if(bz|bb){bb=~~(+(bJ|0)/+g[3534]);c[40]=bb;bR=bb}else{bR=bK}if(bD|bv){bv=~~(+(bM|0)/+g[3534]);c[180]=bv;bS=bv}else{bS=bL}if((bR|0)==0){c[40]=1;bT=1}else{bT=bR}if((bS|0)==0){c[180]=1;bU=1}else{bU=bS}do{if(bI){if((c[(c[3524]|0)+96>>2]&128|0)==0){c[13542]=55520;bV=bU;bW=bT;break}else{c[13542]=0;bV=bU;bW=bT;break}}else{a1=+g[18074];do{if(a1!=0.0){do{if(a1<0.0){bS=c[200]|0;bB=+h[64672+(bS*688&-1)>>3]- +h[64664+(bS*688&-1)>>3];if(bB==0.0){a0=7392;break}bS=c[144]|0;bX=(-0.0-a1)*+P(+((+h[64672+(bS*688&-1)>>3]- +h[64664+(bS*688&-1)>>3])/bB))}else{a0=7392}}while(0);if((a0|0)==7392){bX=a1}if(!(bX>=.01&bX<=100.0)){bY=bU;bZ=bT;break}bB=+(bT|0);a4=+(bU|0);a2=bX*+((c[a$>>2]|0)>>>0>>>0)/+((c[aX>>2]|0)>>>0>>>0);if(bB/a4>a2){bS=~~(a4*a2);c[40]=bS;bY=bU;bZ=bS;break}else{bS=~~(bB/a2);c[180]=bS;bY=bS;bZ=bT;break}}else{bY=bU;bZ=bT}}while(0);c[13542]=31752;bV=bY;bW=bZ}}while(0);c[16536]=bN;c[16537]=bO;c[16364]=bQ;c[16365]=bP;bX=+h[5279];a1=+h[6915];c[16192]=~~bX;c[16193]=~~a1;a2=a1-bX;a1=2.0/a2*+g[3532];h[2]=a1;bP=c[144]|0;bB=+h[64664+(bP*688&-1)>>3];a4=2.0/(+h[64672+(bP*688&-1)>>3]-bB);h[21]=a4;bP=c[200]|0;a_=+h[64664+(bP*688&-1)>>3];aL=2.0/(+h[64672+(bP*688&-1)>>3]-a_);h[91]=aL;h[12]=0.0;h[68]=0.0;h[96]=0.0;do{if((bH|0)>1){do{if(a4>aL){aS=1.0-aL/a4;h[68]=aS;h[21]=aL;b_=aL;b$=0.0;b0=aL;b1=aS}else{if(aL<=a4){b_=aL;b$=0.0;b0=a4;b1=0.0;break}aS=1.0-a4/aL;h[96]=aS;h[91]=a4;b_=a4;b$=aS;b0=a4;b1=0.0}}while(0);if((bH|0)<=2){b2=a1;b3=b_;b5=b$;b6=b0;b7=b1;break}h[2]=b_;b2=b_;b3=b_;b5=b$;b6=b0;b7=b1}else{b2=a1;b3=aL;b5=0.0;b6=a4;b7=0.0}}while(0);a4=b2*a2*-.5+1.0;h[12]=a4;if(!bI){a2=+h[8255];aL=+h[8169];a1=(a2-a_)*b3+b5+-1.0;b1=(aL-bB)*b6+b7+-1.0;b0=a4+(0.0-bX)*b2+-1.0;b2=+h[403];bX=+h[391];a4=+h[395];b$=b0*+h[399];b_=+h[404];aS=+h[392];aK=+h[396];aO=b0*+h[400];aU=+h[406];aM=+h[394];aR=+h[398];aT=b0*+h[402];b0=aU+a1*aM+b1*aR+aT;aJ=b0==0.0?1.0e-5:b0;b0=+(bV|0);bV=~~((b2+a1*bX+b1*a4+b$)/aJ*b0)+bE|0;aW=+(bW|0);bW=~~((b_+a1*aS+b1*aK+aO)/aJ*aW)+aY|0;aJ=+h[8256];b1=+h[8170];a1=b5+b3*(aJ-a_)+-1.0;a_=b7+b6*(b1-bB)+-1.0;bB=aT+(aU+aM*a1+aR*a_);aR=bB==0.0?1.0e-5:bB;bI=~~(b0*((b$+(b2+bX*a1+a4*a_))/aR))+bE|0;bE=~~(aW*((aO+(b_+aS*a1+aK*a_))/aR))+aY|0;h[8269]=+(bI-bV|0)/(aJ-a2);h[8183]=+(bE-bW|0)/(b1-aL);c[16536]=bV;c[16537]=bI;c[16364]=bW;c[16365]=bE}bE=(e|0)!=0;if(!bE){do{if(a[31104]|0){if((dz()|0)!=0){b8=0;break}b8=(c[(c[3524]|0)+144>>2]|0)!=0&1}else{b8=0}}while(0);a[55536]=b8}fO(c[10818]|0,-1,3);b8=ax;c[b8>>2]=c[14084];c[b8+4>>2]=c[56340>>2];c[b8+8>>2]=c[56344>>2];c[b8+12>>2]=c[56348>>2];b8=c[14075]|0;do{if((c[14074]|0)!=0){aL=+h[7040];e=c[(c[3524]|0)+92>>2]|0;if(aL<0.0){cK[e&63](+h[3817]);break}else{cK[e&63](aL);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[7039]);e=c[(c[3524]|0)+64>>2]|0;if((b8|0)<-5){cM[e&511](-2)}else{cM[e&511](b8)}e=c[3524]|0;do{if((a[56328]&1)==0){if((c[e+96>>2]&1024|0)!=0){break}c[ax>>2]=1;c[ax+4>>2]=b8;a0=7425}else{a0=7425}}while(0);if((a0|0)==7425){fn(ax,e)}e=~~(+g[3536]/90.0);ax=c[200]|0;if((e+1&2|0)==0){aL=+h[64664+(ax*688&-1)>>3];h[14]=aL;b1=+h[64672+(ax*688&-1)>>3];h[3305]=b1;b8=c[144]|0;a2=+h[64672+(b8*688&-1)>>3];h[7088]=a2;b9=64664+(b8*688&-1)|0;ca=b8;cb=aL;cc=a2;cd=b1}else{b1=+h[64672+(ax*688&-1)>>3];h[14]=b1;a2=+h[64664+(ax*688&-1)>>3];h[3305]=a2;ax=c[144]|0;aL=+h[64664+(ax*688&-1)>>3];h[7088]=aL;b9=64672+(ax*688&-1)|0;ca=ax;cb=a2;cc=aL;cd=b1}b1=+h[b9>>3];h[5263]=b1;if((e&2|0)==0){h[13]=+h[64664+(ca*688&-1)>>3];ce=cd;cf=cb;cg=64672+(ca*688&-1)|0}else{h[13]=+h[64672+(ca*688&-1)>>3];ce=cb;cf=cd;cg=64664+(ca*688&-1)|0}h[3304]=+h[cg>>3];h[7089]=cf;h[5264]=ce;cg=+g[3538]>90.0;h[69]=cg?cf:ce;h[97]=cg?cc:b1;do{if((a[38984]&1)==0&(c[10026]|0)==0){fw(b,d,0,0)}else{if(!((c[5094]|0)!=0&(c[14088]|0)==0)){break}fw(b,d,3,0)}}while(0);if((a[38984]&1)==0&(c[10026]|0)==-1){fw(b,d,2,0)}cg=(c[5094]|0)==0;if(cg){b1=+h[7076];ca=c[200]|0;cc=+h[64664+(ca*688&-1)>>3];ce=+h[91];cf=+h[96];cd=(+h[14]-cc)*ce+cf+-1.0;e=c[144]|0;cb=+h[64664+(e*688&-1)>>3];aL=+h[21];a2=+h[68];aJ=(+h[13]-cb)*aL+a2+-1.0;aR=+h[5279];a_=+h[2];aK=+h[12];a1=(b1-aR)*a_+aK+-1.0;aS=+h[403];b_=+h[391];aO=+h[395];aW=+h[399];a4=a1*aW;bX=+h[406];b2=+h[394];b$=+h[398];b0=+h[402];bB=a1*b0;a1=bX+cd*b2+aJ*b$+bB;b9=c[180]|0;aM=+(b9|0);ax=c[186]|0;b8=~~((aS+cd*b_+aJ*aO+a4)/(a1==0.0?1.0e-5:a1)*aM)+ax|0;a1=cf+ce*(+h[7089]-cc)+-1.0;aJ=a2+aL*(+h[7088]-cb)+-1.0;cd=bB+(bX+b2*a1+b$*aJ);bW=~~(aM*((a4+(aS+b_*a1+aO*aJ))/(cd==0.0?1.0e-5:cd)))+ax|0;cd=cf+ce*(+h[3305]-cc)+-1.0;aJ=a2+aL*(+h[3304]-cb)+-1.0;a1=bB+(bX+b2*cd+b$*aJ);bI=~~(aM*((a4+(aS+b_*cd+aO*aJ))/(a1==0.0?1.0e-5:a1)))+ax|0;c[7938]=(b8|0)<(bW|0)?b8:bW;c[7939]=(bW|0)>(bI|0)?bW:bI;ch=ca;ci=cc;cj=e;ck=cb;cl=b1;cm=ce;cn=cf;co=aL;cp=a2;cq=aR;cr=a_;cs=aK;ct=aS;cu=b_;cv=aO;cw=aW;cx=bX;cy=b2;cz=b$;cA=b0;cB=b9;cC=ax}else{ax=c[200]|0;b0=+h[64664+(ax*688&-1)>>3];b9=c[144]|0;b$=+h[64664+(b9*688&-1)>>3];b2=+h[7076];bX=+h[91];aW=+h[96];aO=(b0-b0)*bX+aW+-1.0;b_=+h[21];aS=+h[68];aK=(b$-b$)*b_+aS+-1.0;a_=+h[5279];aR=+h[2];a2=+h[12];aL=(b2-a_)*aR+a2+-1.0;cf=+h[403];ce=+h[391];b1=+h[395];cb=+h[399];cc=aL*cb;a1=+h[404];aJ=+h[392];cd=+h[396];a4=aL*+h[400];aM=+h[406];bB=+h[394];aU=+h[398];aT=+h[402];b6=aL*aT;aL=aM+aO*bB+aK*aU+b6;b7=aL==0.0?1.0e-5:aL;e=c[180]|0;aL=+(e|0);ca=c[186]|0;b3=+(c[40]|0);bI=c[46]|0;b5=aW+bX*(+h[64672+(ax*688&-1)>>3]-b0)+-1.0;aV=aS+b_*(+h[64672+(b9*688&-1)>>3]-b$)+-1.0;cD=b6+(aM+bB*b5+aU*aV);b6=cD==0.0?1.0e-5:cD;c[7938]=~~((cf+aO*ce+aK*b1+cc)/b7*aL)+ca;c[7939]=~~(aL*((cc+(cf+ce*b5+b1*aV))/b6))+ca;c[7940]=~~(b3*((a4+(a1+aJ*b5+cd*aV))/b6))+bI;c[7941]=~~((a1+aO*aJ+aK*cd+a4)/b7*b3)+bI;ch=ax;ci=b0;cj=b9;ck=b$;cl=b2;cm=bX;cn=aW;co=b_;cp=aS;cq=a_;cr=aR;cs=a2;ct=cf;cu=ce;cv=b1;cw=cb;cx=aM;cy=bB;cz=aU;cA=aT;cB=e;cC=ca}if((c[1119]|0)!=0){if(cg){fx(4560,aA,aB,109288);cg=(c[aA>>2]|0)+(((c[7939]|0)+(c[7938]|0)|0)/2&-1)|0;ca=(c[aB>>2]|0)+(c[7941]|0)|0;cE=cg;cF=ca+aa(c[aH+20>>2]|0,c[1100]|0)|0}else{if((c[64916+(ch*688&-1)>>2]&4|0)==0){cH=0}else{ca=~~(+((c[(c[3524]|0)+24>>2]|0)>>>0>>>0)*+h[65056+(ch*688&-1)>>3]*((a[65072+(ch*688&-1)|0]&1)!=0?-1.0:1.0));cH=(ca|0)<0?0:ca}aT=(ci-ci)*cm+cn+-1.0;aU=(ck-ck)*co+cp+-1.0;bB=(cl-cq)*cr+cs+-1.0;cs=bB*cw;cw=bB*cA;cA=cx+aT*cy+aU*cz+cw;cr=cA==0.0?1.0e-5:cA;cA=+(cB|0);cB=~~((+h[404]+aT*+h[392]+aU*+h[396]+bB*+h[400])/cr*+(c[40]|0));ca=c[46]|0;bB=cn+cm*(+h[64672+(ch*688&-1)>>3]-ci)+-1.0;ci=cp+co*(+h[64672+(cj*688&-1)>>3]-ck)+-1.0;ck=cw+(cx+cy*bB+cz*ci);fx(4560,aA,aB,109288);cE=(c[aA>>2]|0)+(((~~(cA*((cs+(ct+cu*bB+cv*ci))/(ck==0.0?1.0e-5:ck)))+~~((ct+aT*cu+aU*cv+cs)/cr*cA)|0)+(cC<<1)|0)/2&-1)|0;cF=~~(+(((ca+cH|0)+cB|0)+(c[aB>>2]|0)|0)+ +((c[aH+16>>2]|0)>>>0>>>0)*(+(c[1100]|0)+1.0+-.5))}aB=a[4600]&1;do{if(aB<<24>>24!=0){if((a[37456]&1)!=0){break}a[37456]=1;cB=c[(c[3524]|0)+88>>2]|0;if((cB|0)==0){break}cO[cB&255](179864)}}while(0);a[37456]=aB;fn(4488,aH);ln(cE,cF,c[1119]|0,1,0,0,c[1120]|0);if((c[1122]|0)!=0){cM[c[aH+64>>2]&511](-2)}a[37456]=0}L10120:do{if((c[1183]|0)!=0){fx(4816,aE,aF,109288);cF=c[aH+16>>2]|0;cE=(c[aE>>2]|0)+cF|0;if((c[1166]|0)==0){cI=+((((c[7941]|0)-cF|0)+(c[aF>>2]|0)|0)>>>0>>>0)}else{cI=+(cF>>>0>>>0)+(+g[44]*+h[64672+((c[144]|0)*688&-1)>>3]+ +(c[aF>>2]|0))}cF=~~cI;cG(aD|0);aB=aC|0;cB=c[1183]|0;cH=aN(aD|0)|0;bw(aB|0,1024,cB|0,cH|0);do{if((c[1164]|0)!=0){cH=aH+72|0;if((cO[c[cH>>2]&255](-270)|0)==0){break}cB=c[1184]|0;if((c[1166]|0)==0){ln(cE,cF,aB,2,0,-270,cB)}else{ln(cE,cF,aB,0,0,-270,cB)}cB=c[cH>>2]|0;cO[cB&255](0);break L10120}}while(0);cB=c[1184]|0;if((c[1166]|0)==0){ln(cE,cF,aB,0,0,0,cB);break}else{ln(cE,cF,aB,0,2,0,cB);break}}}while(0);do{if(!bE){if((a[55536]&1)==0){break}if(!(a[31104]|0)){break}if(!((a[54016]|0)!=110&(c[13506]|0)==0)){break}dD(2)}}while(0);fO(c[10818]|0,0,3);aD=c[10822]|0;aC=c[(c[3524]|0)+92>>2]|0;if((aC|0)!=0){cK[aC&63](+h[3817])}if((aD|0)!=0){aC=aD;do{if((c[aC+56>>2]|0)==0){fK(aC+8|0,at,au,202256);fp(~~+h[at>>3],~~+h[au>>3],aC)}aC=c[aC>>2]|0;}while((aC|0)!=0)}fy(0);cM[c[(c[3524]|0)+168>>2]&511](2);do{if((a[38984]&1)!=0){if((a[46752]&1)==0|bE){break}gs();c[225]=0;c[11605]=0;c[7625]=0}}while(0);if((a[36229]&1)==0){c[9010]=0;aC=c[9002]|0;c[9006]=aC;au=aH+20|0;at=c[8712]|0;c[8990]=aa(at+1|0,-(c[au>>2]|0)|0);c[8986]=-(c[au>>2]|0);aD=~~(+((c[au>>2]|0)>>>0>>>0)*(+h[4526]+ +(at+2|0)));c[8998]=aD;at=aC+(c[au>>2]|0)|0;c[8994]=at;cJ=0;cL=aC;cP=aD;cQ=at}else{at=c[9002]|0;aD=-at|0;c[9010]=aD;c[9006]=0;aC=aH+20|0;c[8990]=c[aC>>2];au=c[8712]|0;c[8986]=aa(au+1|0,c[aC>>2]|0);aF=~~(+((c[aC>>2]|0)>>>0>>>0)*(+(au+2|0)+ +h[4526]));c[8994]=aF;au=at+(c[aC>>2]|0)|0;c[8998]=au;cJ=aD;cL=0;cP=au;cQ=aF}c[9018]=(cL+cJ|0)/2&-1;cJ=c[9031]|0;L10163:do{if((a[36120]&1)==0){cT=0;cU=cP;a0=7507}else{do{if((cJ|0)==0){a0=7493}else if((cJ|0)==3){a0=7508;break L10163}else{if((c[9032]|0)!=1){a0=7493;break}cL=c[6962]|0;if((cL|0)<=0){cV=0;cW=cP;cX=c[aH+16>>2]|0;break}aF=c[7938]|0;au=(c[7939]|0)-aF|0;aD=(au|0)/(c[9028]|0)&-1;aC=(aD|0)<1?1:aD;c[9024]=aC;aD=cL-1|0;cL=(aD+aC|0)/(aC|0)&-1;c[9014]=cL;aC=c[9339]|0;if((cL|0)>(aC|0)&(aC|0)>0){c[9014]=aC;cY=aC}else{cY=cL}cL=(aD+cY|0)/(cY|0)&-1;c[9024]=cL;c[9028]=(au|0)/(cL|0)&-1;aD=aa(au,cP);au=((aD|0)/(aa(cQ+cP|0,cL)|0)&-1)+aF|0;cI=+g[44]*+((c[aH+12>>2]|0)>>>0>>>0);cA=cI+ +(aa(c[9022]|0,cY)|0);aF=c[aH+16>>2]|0;cV=~~(cA+(+h[4487]+2.0)*+(aF>>>0>>>0));cW=au;cX=aF}}while(0);L10174:do{if((a0|0)==7493){if((c[9044]|0)==0){aB=c[aH+16>>2]|0;cZ=((c[7941]|0)-(c[aH+24>>2]|0)|0)-aB|0;c_=aB}else{aB=(c[aH+24>>2]|0)+(c[7940]|0)|0;cA=+((aB+aa(c[9014]|0,c[9022]|0)|0)>>>0>>>0);aB=c[aH+16>>2]|0;cZ=~~(cA+ +h[4487]*+(aB>>>0>>>0));c_=aB}aB=(cJ|0)!=0;cF=c[9032]|0;if(aB&(cF|0)==3){cV=cZ;cW=((c[aH+28>>2]|0)+(c[7939]|0)|0)+cP|0;cX=c_;break}if(aB&(cF|0)==2){cV=cZ;cW=(c[aH+20>>2]<<1)+cP|0;cX=c_;break}if((c[9045]|0)==0){cV=cZ;cW=((c[aH+28>>2]|0)+(c[7938]|0)|0)+cP|0;cX=c_;break}do{if((c[6598]|0)==3){if((cJ-1|0)>>>0>=2){break}cV=cZ;cW=(((c[7939]|0)-cQ|0)+(c[9028]|0)|0)-(c[aH+20>>2]<<1)|0;cX=c_;break L10174}}while(0);cF=(c[7939]|0)-cQ|0;cV=cZ;cW=cF-aa((c[9024]|0)-1|0,c[9028]|0)|0;cX=c_}}while(0);c[56]=~~(+(cV|0)- +h[4487]*+(cX>>>0>>>0));cT=cV;cU=cW;a0=7507}}while(0);if((a0|0)==7507){if((cJ|0)==3){a0=7508}else{c$=cT;c0=cU;c1=cQ;c2=cP}}if((a0|0)==7508){fK(36136,ar,as,128552);c$=~~+h[as>>3];c0=~~+h[ar>>3];c1=c[8994]|0;c2=c[8998]|0}ar=(c1+c0|0)+aa((c[9024]|0)-1|0,c[9028]|0)|0;c[9335]=ar;c1=c0-c2|0;c[9334]=c1;cA=+(c$|0);c2=aH+16|0;c[9337]=~~(cA+ +((c[c2>>2]|0)>>>0>>>0)*+h[4487]);c[9336]=c$-aa(c[9014]|0,c[9022]|0);if((c1|0)<0){c[9334]=0;c3=0}else{c3=c1}c1=a[36120]|0;if((c1&1)==0|(a[36288]|0)==0){c4=c$;c5=c1}else{if((c[9330]|0)==3&+h[4666]<0.0){fn(36272,aH)}else{fn(37320,aH)}c1=aH+96|0;if((c[c1>>2]&32|0)==0){c6=0.0}else{c6=(a8(36288,94)|0)==0?0.0:.51}ln((c3+ar|0)/2&-1,~~(+(c[9337]|0)-(c6*.5+.5)*+((c[c2>>2]|0)>>>0>>>0)),36288,1,0,0,c[9329]|0);do{if((c[c1>>2]&32|0)==0){c7=c6}else{if((a8(36288,95)|0)==0){c7=c6;break}c7=c6+.3}}while(0);h[4487]=c7+ +h[4487];c6=c7*+((c[c2>>2]|0)>>>0>>>0);c[9336]=~~(+(c[9336]|0)-c6);cM[c[aH+64>>2]&511](-2);c4=~~(cA-c6);c5=a[36120]|0}c1=c[9059]|0;do{if((c5&1)!=0&(c1|0)>-3){ar=c[9336]|0;if((c[9337]|0)==(ar|0)){c8=c4;break}c3=~~(+h[4527]*.5*+((c[c2>>2]|0)>>>0>>>0));c[9336]=ar-(c3<<1);ar=c4-c3|0;c3=aq;c[c3>>2]=c[9068];c[c3+4>>2]=c[36276>>2];c[c3+8>>2]=c[36280>>2];c[c3+12>>2]=c[36284>>2];do{if((c[9058]|0)!=0){c6=+h[4532];c3=c[(c[3524]|0)+92>>2]|0;if(c6<0.0){cK[c3&63](+h[3817]);break}else{cK[c3&63](c6);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[4531]);c3=c[(c[3524]|0)+64>>2]|0;if((c1|0)<-5){cM[c3&511](-2)}else{cM[c3&511](c1)}c3=c[3524]|0;do{if((a[36264]&1)==0){if((c[c3+96>>2]&1024|0)!=0){c9=c3;break}c[aq>>2]=1;c[aq+4>>2]=c1;a0=7533}else{a0=7533}}while(0);if((a0|0)==7533){fn(aq,c3);c9=c[3524]|0}c$=c[c9+172>>2]|0;if((c$|0)!=0){cM[c$&511](0)}c$=aH+56|0;cN[c[c$>>2]&255](c[9334]|0,c[9336]|0);as=aH+60|0;cN[c[as>>2]&255](c[9334]|0,c[9337]|0);cN[c[as>>2]&255](c[9335]|0,c[9337]|0);cN[c[as>>2]&255](c[9335]|0,c[9336]|0);cN[c[as>>2]&255](c[9334]|0,c[9336]|0);cP=c[(c[3524]|0)+172>>2]|0;if((cP|0)!=0){cM[cP&511](1)}cN[c[c$>>2]&255](c[9334]|0,~~(+(c[9337]|0)- +h[4487]*+((c[c2>>2]|0)>>>0>>>0)));cN[c[as>>2]&255](c[9335]|0,~~(+(c[9337]|0)- +h[4487]*+((c[c2>>2]|0)>>>0>>>0)));c8=ar}else{c8=c4}}while(0);do{if((a[38984]&1)!=0&(c[9744]|0)==0){if((a[46752]&1)==0|bE){break}cM[c[(c[3524]|0)+168>>2]&511](6);gv(b,d);cM[c[(c[3524]|0)+168>>2]&511](7)}}while(0);c4=c8-((c[9022]|0)/2&-1)|0;c[56]=c4;do{if((d|0)==1){if((c[b+252>>2]|0)!=1){break}if((a[55536]&1)==0){break}if(!((c[b+12>>2]|0)==352|(c[7662]|0)==1)){break}c8=c[m>>2]|0;aI(94544,137,1,c8|0)}}while(0);if((c[11690]|0)==0&(a[55536]&1)!=0&(a[30641]|0)==100){c8=c[6952]|0;if((c8|0)!=0){uu(c8)}c[6952]=0;c[18084]=0;c[12904]=0;da=1}else{da=0}L10258:do{if(!(bE|aP^1)){c8=ap;c2=ap|0;c9=ap+4|0;aq=aG;c1=aG+4|0;c5=C;as=aG+40|0;c$=as;cP=aG|0;cQ=aG+16|0;cU=aG+32|0;cT=C|0;cJ=C+4|0;cW=aH+64|0;cV=B;cX=B|0;c_=B+4|0;cZ=aG+24|0;cY=j|0;cF=j+8|0;aB=j+16|0;cE=j+32|0;aF=j+40|0;au=k|0;cL=k+8|0;aD=k+16|0;aC=k+32|0;at=k+40|0;aE=aG+40|0;cB=r|0;cH=r+8|0;ca=r+4|0;cC=aG+44|0;aA=aG+48|0;cj=q;ch=q|0;cg=q+4|0;e=ak|0;b9=ak+4|0;ax=ak+8|0;bI=L|0;bW=K;b8=L+7|0;bV=K|0;aY=K+4|0;bH=J;bP=J+4|0;bQ=J+8|0;bO=J+16|0;bN=J|0;bZ=G;bY=G|0;bT=G+4|0;bU=F;aX=F+4|0;a$=F+8|0;by=F+16|0;bS=F|0;bR=c0;bL=c4;bv=0;bM=b;bD=1;while(1){if((a[55536]&1)==0){db=0}else{db=(a[bM+56|0]&1)!=0}if((c[bM+8>>2]|0)==4){dc=bv;dd=bL;de=bR}else{cM[c[(c[3524]|0)+168>>2]&511](6);if((a[55536]&1)!=0&(c[7662]|0)==1){i5(bM)}do{if((a[36120]&1)==0){df=0}else{bK=bM+16|0;bb=c[bK>>2]|0;if((bb|0)==0){df=0;break}if((a[bb]|0)==0){df=0;break}if((a[bM+22|0]&1)!=0){df=0;break}if((c[9330]|0)==0){cM[c[cW>>2]&511](-2)}else{fn(37320,aH)}bb=a[bM+20|0]&1;do{if(bb<<24>>24!=0){if((a[37456]&1)!=0){break}a[37456]=1;bJ=c[(c[3524]|0)+88>>2]|0;if((bJ|0)==0){break}cO[bJ&255](179864)}}while(0);a[37456]=bb;fz(bR,bL,c[bK>>2]|0);a[37456]=0;df=1}}while(0);bJ=bM+24|0;bz=bM+64|0;c[c8>>2]=c[bz>>2];c[c8+4>>2]=c[bz+4>>2];c[c8+8>>2]=c[bz+8>>2];c[c8+12>>2]=c[bz+12>>2];bz=c[bM+28>>2]|0;bA=bJ|0;do{if((c[bA>>2]|0)!=0){c6=+h[bM+48>>3];bC=c[(c[3524]|0)+92>>2]|0;if(c6<0.0){cK[bC&63](+h[3817]);break}else{cK[bC&63](c6);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[bM+40>>3]);bC=c[(c[3524]|0)+64>>2]|0;if((bz|0)<-5){cM[bC&511](-2)}else{cM[bC&511](bz)}bC=bM+56|0;bF=c[3524]|0;do{if((a[bC]&1)==0){if((c[bF+96>>2]&1024|0)!=0){break}c[c2>>2]=1;c[c9>>2]=bz;a0=7580}else{a0=7580}}while(0);if((a0|0)==7580){a0=0;fn(ap,bF)}bz=bM+12|0;bl=c[bz>>2]|0;L10301:do{if((bl|0)==64){if((a[46752]&1)==0){break}if((a[bM+238|0]&1)!=0){break}c[bM+32>>2]=-1;c[bA>>2]=1;do{if(df){if((a[bC]&1)!=0){fD(bM,bR,bL,-1);break}bs=c[13542]|0;bn=c[3524]|0;c[13542]=(c[bn+96>>2]&128|0)==0?55520:0;cM[c[bn+168>>2]&511](8);bn=(c[9018]|0)+bR|0;bm=c[13542]|0;if((bm|0)==0){a0=7690}else{bG=(c[bm>>2]|0)>(bn|0)&1;a5=(c[bm+4>>2]|0)<(bn|0)?bG|2:bG;bG=(c[bm+8>>2]|0)>(bL|0)?a5|4:a5;if((((c[bm+12>>2]|0)<(bL|0)?bG|8:bG)|0)==0){a0=7690}}if((a0|0)==7690){a0=0;cR[c[(c[3524]|0)+80>>2]&127](bn,bL,-1)}cM[c[(c[3524]|0)+168>>2]&511](9);c[13542]=bs}}while(0);if((a[38984]&1)!=0){if((a[bM+236|0]&1)==0){break}}fE(bM,-1)}else if((bl|0)==225){do{if(df){if((a[bC]&1)!=0){fA(bM,bR,bL);break}bK=c[13542]|0;bb=c[3524]|0;c[13542]=(c[bb+96>>2]&128|0)==0?55520:0;cM[c[bb+168>>2]&511](8);bb=(c[9006]|0)+bR|0;c[M>>2]=(c[9010]|0)+bR;c[N>>2]=bL;c[O>>2]=bb;c[Q>>2]=bL;bb=c[3524]|0;if((fl(M,N,O,Q)|0)!=0){cN[c[bb+56>>2]&255](c[M>>2]|0,c[N>>2]|0);cN[c[bb+60>>2]&255](c[O>>2]|0,c[Q>>2]|0)}cM[c[(c[3524]|0)+168>>2]&511](9);c[13542]=bK}}while(0);if((a[38984]&1)!=0){if((a[bM+236|0]&1)==0){break}}bK=bM+260|0;bb=c[bK>>2]|0;bs=c[bb+12>>2]|0;bn=c[(c[bb>>2]|0)+12>>2]|0;bb=c[bM+88>>2]|0;bG=c[bM+92>>2]|0;c6=+h[bM+104>>3];cA=+h[bM+112>>3];bm=a[bM+120|0]|0;uD(bI|0,bM+121|0,23);a5=c[bM+144>>2]|0;c7=+h[bM+152>>3];aZ=c[bM+160>>2]|0;cI=+h[bM+168>>3];cr=+h[bM+176>>3];bo=c[bM+184>>2]|0;uD(bW|0,b8|0,16);do{if((bb|0)!=0){az=c[(c[3524]|0)+92>>2]|0;if(cA<0.0){cK[az&63](+h[3817]);break}else{cK[az&63](cA);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](c6);bb=c[(c[3524]|0)+64>>2]|0;if((bG|0)<-5){cM[bb&511](-2)}else{cM[bb&511](bG)}bb=c[3524]|0;do{if((bm&1)==0){if((c[bb+96>>2]&1024|0)!=0){break}c[bV>>2]=1;c[aY>>2]=bG;a0=7713}else{a0=7713}}while(0);if((a0|0)==7713){a0=0;fn(K,bb)}bG=c[200]|0;h[64776+(bG*688&-1)>>3]=+((c[7939]|0)-(c[7938]|0)|0)/(+h[64672+(bG*688&-1)>>3]- +h[64664+(bG*688&-1)>>3]);c[12912]=bo;c[12910]=0;if(c7>0.0){uE(bH|0,0,40);c[bP>>2]=2;c[bQ>>2]=2;h[bO>>3]=c7;c[bN>>2]=aZ;fN(J,H,I,123984);h[6458]=cI;h[6457]=cr;c[12910]=~~+h[H>>3]}if((c[(c[bK>>2]|0)+8>>2]|0)<=0){break}bG=bM+80|0;bm=a5;az=0;while(1){a3=bs+(az<<6)|0;bt=a3|0;do{if((c[bt>>2]|0)==2){dg=bm}else{ay=bn+(az<<6)|0;if((c[ay>>2]|0)==2){dg=bm;break}do{if((c[bG>>2]|0)==-3){a9=~~+h[bs+(az<<6)+32>>3];bh=43296;while(1){dh=c[bh>>2]|0;if((dh|0)==0){a0=7724;break}if((c[dh+4>>2]|0)==(a9|0)){a0=7725;break}else{bh=dh|0}}do{if((a0|0)==7724){a0=0;uD(bI|0,51521,23);uh(-1,79128,(v=i,i=i+8|0,c[v>>2]=a9,v)|0);uD(bZ|0,b8|0,16);di=0;dj=90.0;dk=15.0;dl=0;dm=0.0;dn=1;dp=0;dq=1.0;dr=-2}else if((a0|0)==7725){a0=0;bh=c[dh+16>>2]|0;aQ=c[dh+20>>2]|0;c6=+h[dh+32>>3];cA=+h[dh+40>>3];bi=a[dh+48|0]|0;uD(bI|0,dh+49|0,23);a7=c[dh+72>>2]|0;cs=+h[dh+80>>3];bu=c[dh+88>>2]|0;cv=+h[dh+96>>3];aU=+h[dh+104>>3];br=c[dh+112>>2]|0;uD(bZ|0,b8|0,16);if((bh|0)==0){di=br;dj=aU;dk=cv;dl=bu;dm=cs;dn=a7;dp=bi;dq=c6;dr=aQ;break}bh=c[(c[3524]|0)+92>>2]|0;if(cA<0.0){cK[bh&63](+h[3817]);di=br;dj=aU;dk=cv;dl=bu;dm=cs;dn=a7;dp=bi;dq=c6;dr=aQ;break}else{cK[bh&63](cA);di=br;dj=aU;dk=cv;dl=bu;dm=cs;dn=a7;dp=bi;dq=c6;dr=aQ;break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](dq);a9=c[(c[3524]|0)+64>>2]|0;if((dr|0)<-5){cM[a9&511](-2)}else{cM[a9&511](dr)}a9=c[3524]|0;do{if((dp&1)==0){if((c[a9+96>>2]&1024|0)!=0){break}c[bY>>2]=1;c[bT>>2]=dr;a0=7735}else{a0=7735}}while(0);if((a0|0)==7735){a0=0;fn(G,a9)}c[12912]=di;c[12910]=0;if(dm<=0.0){ds=dn;break}uE(bU|0,0,40);c[aX>>2]=2;c[a$>>2]=2;h[by>>3]=dm;c[bS>>2]=dl;fN(F,D,E,123984);h[6458]=dk;h[6457]=dj;c[12910]=~~+h[D>>3];ds=dn}else{fL(bM,a3);ds=bm}}while(0);if((c[bt>>2]|0)!=0){dg=ds;break}if((c[ay>>2]|0)!=0){dg=ds;break}c6=+h[64664+((c[200]|0)*688&-1)>>3];cs=+h[91];cv=+h[96];aU=(+h[bs+(az<<6)+8>>3]-c6)*cs+cv+-1.0;cA=+h[64664+((c[144]|0)*688&-1)>>3];cu=+h[21];aT=+h[68];ct=(+h[bs+(az<<6)+16>>3]-cA)*cu+aT+-1.0;ck=+h[5279];ci=+h[2];bB=+h[12];cz=(+h[bs+(az<<6)+24>>3]-ck)*ci+bB+-1.0;cy=+h[403];cx=+h[391];cw=+h[395];co=+h[399];cp=+h[404];cm=+h[392];cn=+h[396];cq=+h[400];cl=+h[406];aM=+h[394];cb=+h[398];b1=+h[402];ce=cl+aU*aM+ct*cb+cz*b1;cf=ce==0.0?1.0e-5:ce;ce=+(c[180]|0);aQ=c[186]|0;a2=+(c[40]|0);bi=c[46]|0;aR=cv+cs*(+h[bn+(az<<6)+8>>3]-c6)+-1.0;c6=aT+cu*(+h[bn+(az<<6)+16>>3]-cA)+-1.0;cA=bB+ci*(+h[bn+(az<<6)+24>>3]-ck)+-1.0;ck=cl+aM*aR+cb*c6+b1*cA;b1=ck==0.0?1.0e-5:ck;fm(~~((cy+aU*cx+ct*cw+cz*co)/cf*ce)+aQ|0,~~((cp+aU*cm+ct*cn+cz*cq)/cf*a2)+bi|0,~~(ce*((cy+cx*aR+cw*c6+co*cA)/b1))+aQ|0,~~(a2*((cp+cm*aR+cn*c6+cq*cA)/b1))+bi|0,ds);dg=ds}}while(0);bt=az+1|0;if((bt|0)<(c[(c[bK>>2]|0)+8>>2]|0)){bm=dg;az=bt}else{break}}}else if((bl|0)==416){c[bM+228>>2]=1;f3(bM,0)}else if((bl|0)==432){c[bM+228>>2]=2;f3(bM,0)}else if((bl|0)==295|(bl|0)==279|(bl|0)==311|(bl|0)==102|(bl|0)==86|(bl|0)==118|(bl|0)==137|(bl|0)==169|(bl|0)==252|(bl|0)==474|(bl|0)==257|(bl|0)==457|(bl|0)==489|(bl|0)==18){if((a[46752]&1)==0){break}if((a[bM+238|0]&1)!=0){break}do{if(df){az=c[bM+32>>2]|0;if((a[bC]&1)!=0){fD(bM,bR,bL,az);break}bm=c[13542]|0;bK=c[3524]|0;c[13542]=(c[bK+96>>2]&128|0)==0?55520:0;cM[c[bK+168>>2]&511](8);bK=(c[9018]|0)+bR|0;bn=c[13542]|0;if((bn|0)==0){a0=7655}else{bs=(c[bn>>2]|0)>(bK|0)&1;bG=(c[bn+4>>2]|0)<(bK|0)?bs|2:bs;bs=(c[bn+8>>2]|0)>(bL|0)?bG|4:bG;if((((c[bn+12>>2]|0)<(bL|0)?bs|8:bs)|0)==0){a0=7655}}if((a0|0)==7655){a0=0;cR[c[(c[3524]|0)+80>>2]&127](bK,bL,az)}cM[c[(c[3524]|0)+168>>2]&511](9);c[13542]=bm}}while(0);if((a[38984]&1)!=0){if((a[bM+236|0]&1)==0){break}}fE(bM,c[bM+32>>2]|0)}else if((bl|0)==368){if((a[38984]&1)!=0){if((a[bM+236|0]&1)==0){break}}bm=c[c[bM+224>>2]>>2]|0;az=c[(c[3524]|0)+92>>2]|0;if((az|0)!=0){cK[az&63](+h[3817])}if((bm|0)==0){break}else{dt=bm}do{L10414:do{if((c[dt+56>>2]|0)==99){cr=(+h[dt+24>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;cI=(+h[dt+32>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;c7=(+h[dt+40>>3]- +h[5279])*+h[2]+ +h[12]+-1.0;b1=+h[406]+cr*+h[394]+cI*+h[398]+c7*+h[402];cA=b1==0.0?1.0e-5:b1;bm=~~((+h[403]+cr*+h[391]+cI*+h[395]+c7*+h[399])/cA*+(c[180]|0))+(c[186]|0)|0;az=~~((+h[404]+cr*+h[392]+cI*+h[396]+c7*+h[400])/cA*+(c[40]|0))+(c[46]|0)|0;do{if((c[5094]|0)!=0){bK=c[13542]|0;if((bK|0)==0){break}bs=(c[bK>>2]|0)>(bm|0)&1;bn=(c[bK+4>>2]|0)<(bm|0)?bs|2:bs;bs=(c[bK+8>>2]|0)>(az|0)?bn|4:bn;if((((c[bK+12>>2]|0)<(az|0)?bs|8:bs)|0)!=0){break L10414}}}while(0);fp(bm,az,dt)}}while(0);dt=c[dt>>2]|0;}while((dt|0)!=0)}else if((bl|0)==400){c[bM+228>>2]=0;f3(bM,0)}else if((bl|0)==352){if((a[46752]&1)==0){break}if((a[bM+238|0]&1)!=0){break}if(!((a[55536]&1)!=0&(c[7662]|0)!=1)){break}i5(bM);if(da){break}i3()}else if((bl|0)==153|(bl|0)==345|(bl|0)==33){if(df){ay=c[13542]|0;bs=c[3524]|0;c[13542]=(c[bs+96>>2]&128|0)==0?55520:0;cM[c[bs+168>>2]&511](8);bs=(c[9006]|0)+bR|0;c[al>>2]=(c[9010]|0)+bR;c[am>>2]=bL;c[an>>2]=bs;c[ao>>2]=bL;bs=c[3524]|0;if((fl(al,am,an,ao)|0)!=0){cN[c[bs+56>>2]&255](c[al>>2]|0,c[am>>2]|0);cN[c[bs+60>>2]&255](c[an>>2]|0,c[ao>>2]|0)}cM[c[(c[3524]|0)+168>>2]&511](9);c[13542]=ay}do{if((a[38984]&1)!=0){if((a[46752]&1)==0){break}if((a[bM+238|0]&1)==0){break L10301}}}while(0);ay=c[bM+260>>2]|0;bs=c[bM+64>>2]|0;do{if((a[55536]&1)==0){du=0}else{if((a[bM+239|0]&1)==0){du=0;break}du=+h[bM+72>>3]<0.0}}while(0);do{if(!((bs|0)!=3|du)){bK=c[bM+68>>2]|0;bn=(c[3524]|0)+144|0;if((c[bn>>2]|0)==0){break}c[e>>2]=3;c[b9>>2]=bK;h[ax>>3]=0.0;cM[c[bn>>2]&511](ak)}}while(0);if((ay|0)==0){break}else{dv=ay}do{bs=c[dv+12>>2]|0;bn=dv+8|0;if((c[bn>>2]|0)>0){bK=0;do{bG=bs+(bK<<6)|0;fL(bM,bG);a5=c[bG>>2]|0;L10451:do{if((a5|0)==0){cA=+h[bs+(bK<<6)+24>>3];c7=(+h[bs+(bK<<6)+8>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;cI=(+h[bs+(bK<<6)+16>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;cr=+h[5279];b1=+h[2];cq=+h[12];c6=(cA-cr)*b1+cq+-1.0;cn=+h[403]+c7*+h[391]+cI*+h[395];aR=+h[399];cm=+h[404]+c7*+h[392]+cI*+h[396];cp=+h[400];a2=+h[406]+c7*+h[394]+cI*+h[398];cI=+h[402];c7=a2+c6*cI;co=c7==0.0?1.0e-5:c7;c7=+(c[180]|0);bG=c[186]|0;aZ=~~((cn+c6*aR)/co*c7)+bG|0;cw=+(c[40]|0);bo=c[46]|0;bb=~~((cm+c6*cp)/co*cw)+bo|0;bt=c[34]|0;co=+h[64664+(bt*688&-1)>>3];c6=+h[64672+(bt*688&-1)>>3];if(co0.0|c6<0.0){a0=7602}else{a0=7601}}else{if(c6>0.0|co<0.0){a0=7602}else{a0=7601}}do{if((a0|0)==7601){a0=0;cx=(0.0-cr)*b1+cq+-1.0;cy=a2+cx*cI;ce=cy==0.0?1.0e-5:cy;dw=(cm+cx*cp)/ce;dx=(cn+cx*aR)/ce}else if((a0|0)==7602){a0=0;if(cA>0.0){if(co<0.0|co>cA){a0=7606}else{a0=7605}}else{if(co0.0){a0=7606}else{a0=7605}}if((a0|0)==7605){a0=0;ce=cq+b1*(co-cr)+-1.0;cx=a2+cI*ce;cy=cx==0.0?1.0e-5:cx;dw=(cm+cp*ce)/cy;dx=(cn+aR*ce)/cy;break}else if((a0|0)==7606){a0=0;cy=cq+b1*(c6-cr)+-1.0;ce=a2+cI*cy;cx=ce==0.0?1.0e-5:ce;dw=(cm+cp*cy)/cx;dx=(cn+aR*cy)/cx;break}}}while(0);a9=~~(cw*dw)+bo|0;bt=~~(c7*dx)+bG|0;c[8490]=bt;c[8488]=a9;c[ac>>2]=bt;c[ad>>2]=a9;c[ae>>2]=aZ;c[af>>2]=bb;a9=c[3524]|0;if((fl(ac,ad,ae,af)|0)!=0){cN[c[a9+56>>2]&255](c[ac>>2]|0,c[ad>>2]|0);cN[c[a9+60>>2]&255](c[ae>>2]|0,c[af>>2]|0)}c[8490]=aZ;c[8488]=bb}else if((a5|0)==1){a9=c[200]|0;aR=+h[64664+(a9*688&-1)>>3];cn=+h[64672+(a9*688&-1)>>3];cp=+h[bs+(bK<<6)+8>>3];if(aRcn){break}}else{if(cpaR){break}}a9=c[144]|0;cn=+h[64664+(a9*688&-1)>>3];cm=+h[64672+(a9*688&-1)>>3];cI=+h[bs+(bK<<6)+16>>3];if(cncm){break}}else{if(cIcn){break}}a9=c[34]|0;cm=+h[64664+(a9*688&-1)>>3];a2=+h[64672+(a9*688&-1)>>3];if(cm0.0|a2<0.0){a0=7624}else{a0=7619}}else{if(a2>0.0|cm<0.0){a0=7624}else{a0=7619}}do{if((a0|0)==7619){a0=0;cr=(cp-aR)*+h[91]+ +h[96]+-1.0;c6=(cI-cn)*+h[21]+ +h[68]+-1.0;b1=+h[5279];cq=+h[2];co=+h[12];cA=(0.0-b1)*cq+co+-1.0;cx=+h[403]+cr*+h[391]+c6*+h[395];cy=+h[399];ce=+h[404]+cr*+h[392]+c6*+h[396];cf=+h[400];cz=+h[406]+cr*+h[394]+c6*+h[398];c6=+h[402];cr=cz+cA*c6;ct=cr==0.0?1.0e-5:cr;cr=+(c[180]|0);a9=c[186]|0;bt=~~((cx+cA*cy)/ct*cr)+a9|0;aU=+(c[40]|0);a3=c[46]|0;bi=~~((ce+cA*cf)/ct*aU)+a3|0;ct=+h[bs+(bK<<6)+24>>3];if(ct>0.0){if(cm<=ct&cm>=0.0&cm!=0.0&cm!=ct){a0=7622}else{a0=7623}}else{if(cm<=0.0&cm>=ct&cm!=0.0&cm!=ct){a0=7622}else{a0=7623}}if((a0|0)==7622){a0=0;ct=(cm-b1)*cq+co+-1.0;cA=cz+ct*c6;ck=cA==0.0?1.0e-5:cA;dy=bi;dA=bt;dB=~~(aU*((ce+ct*cf)/ck))+a3|0;dC=~~(cr*((cx+ct*cy)/ck))+a9|0;break}else if((a0|0)==7623){a0=0;ck=(a2-b1)*cq+co+-1.0;co=cz+ck*c6;c6=co==0.0?1.0e-5:co;dy=bi;dA=bt;dB=~~(aU*((ce+ck*cf)/c6))+a3|0;dC=~~(cr*((cx+ck*cy)/c6))+a9|0;break}}else if((a0|0)==7624){a0=0;c6=+h[bs+(bK<<6)+24>>3];if(c6>0.0){if(cm<0.0|cm>c6){break L10451}if(a2<0.0|a2>c6){break L10451}}else{if(cm0.0){break L10451}if(a20.0){break L10451}}c6=(cp-aR)*+h[91]+ +h[96]+-1.0;cy=(cI-cn)*+h[21]+ +h[68]+-1.0;ck=+h[5279];cx=+h[2];cr=+h[12];cf=(a2-ck)*cx+cr+-1.0;ce=+h[403]+c6*+h[391]+cy*+h[395];aU=+h[399];co=+h[404]+c6*+h[392]+cy*+h[396];cz=+h[400];cq=+h[406]+c6*+h[394]+cy*+h[398];cy=+h[402];c6=cq+cf*cy;b1=c6==0.0?1.0e-5:c6;c6=+(c[180]|0);a9=c[186]|0;ct=+(c[40]|0);a3=c[46]|0;cA=cr+cx*(cm-ck)+-1.0;ck=cq+cA*cy;cy=ck==0.0?1.0e-5:ck;dy=~~(ct*((co+cA*cz)/cy))+a3|0;dA=~~(c6*((ce+cA*aU)/cy))+a9|0;dB=~~((co+cf*cz)/b1*ct)+a3|0;dC=~~((ce+cf*aU)/b1*c6)+a9|0}}while(0);c[8490]=dA;c[8488]=dy;c[ag>>2]=dA;c[ah>>2]=dy;c[ai>>2]=dC;c[aj>>2]=dB;bb=c[3524]|0;if((fl(ag,ah,ai,aj)|0)!=0){cN[c[bb+56>>2]&255](c[ag>>2]|0,c[ah>>2]|0);cN[c[bb+60>>2]&255](c[ai>>2]|0,c[aj>>2]|0)}c[8490]=dC;c[8488]=dB}}while(0);bK=bK+1|0;}while((bK|0)<(c[bn>>2]|0))}dv=c[dv>>2]|0;}while((dv|0)!=0)}else if((bl|0)==51){if((a[46752]&1)==0){break}if((a[bM+238|0]&1)!=0){break}do{if(df){if((a[bC]&1)!=0){fA(bM,bR,bL);break}ay=c[13542]|0;bn=c[3524]|0;c[13542]=(c[bn+96>>2]&128|0)==0?55520:0;cM[c[bn+168>>2]&511](8);bn=(c[9006]|0)+bR|0;c[R>>2]=(c[9010]|0)+bR;c[U>>2]=bL;c[V>>2]=bn;c[W>>2]=bL;bn=c[3524]|0;if((fl(R,U,V,W)|0)!=0){cN[c[bn+56>>2]&255](c[R>>2]|0,c[U>>2]|0);cN[c[bn+60>>2]&255](c[V>>2]|0,c[W>>2]|0)}cM[c[(c[3524]|0)+168>>2]&511](9);c[13542]=ay}}while(0);if((a[38984]&1)==0){a0=7670}else{if((a[bM+236|0]&1)!=0){a0=7670}}do{if((a0|0)==7670){a0=0;if(db){fB(bM);break}else{fC(bM);break}}}while(0);do{if(df){ay=c[bM+32>>2]|0;if((a[bC]&1)!=0){fD(bM,bR,bL,ay);break}bn=c[13542]|0;bK=c[3524]|0;c[13542]=(c[bK+96>>2]&128|0)==0?55520:0;cM[c[bK+168>>2]&511](8);bK=(c[9018]|0)+bR|0;bs=c[13542]|0;if((bs|0)==0){a0=7678}else{a5=(c[bs>>2]|0)>(bK|0)&1;az=(c[bs+4>>2]|0)<(bK|0)?a5|2:a5;a5=(c[bs+8>>2]|0)>(bL|0)?az|4:az;if((((c[bs+12>>2]|0)<(bL|0)?a5|8:a5)|0)==0){a0=7678}}if((a0|0)==7678){a0=0;cR[c[(c[3524]|0)+80>>2]&127](bK,bL,ay)}cM[c[(c[3524]|0)+168>>2]&511](9);c[13542]=bn}}while(0);if((a[38984]&1)!=0){if((a[bM+236|0]&1)==0){break}}fE(bM,c[bM+32>>2]|0)}else if((bl|0)==177|(bl|0)==184|(bl|0)==193|(bl|0)==209|(bl|0)==1){if((a[46752]&1)==0){break}if((a[bM+238|0]&1)!=0){break}do{if(df){if((a[bC]&1)!=0){fA(bM,bR,bL);break}bn=c[13542]|0;ay=c[3524]|0;c[13542]=(c[ay+96>>2]&128|0)==0?55520:0;cM[c[ay+168>>2]&511](8);ay=(c[9006]|0)+bR|0;c[X>>2]=(c[9010]|0)+bR;c[Y>>2]=bL;c[$>>2]=ay;c[ab>>2]=bL;ay=c[3524]|0;if((fl(X,Y,$,ab)|0)!=0){cN[c[ay+56>>2]&255](c[X>>2]|0,c[Y>>2]|0);cN[c[ay+60>>2]&255](c[$>>2]|0,c[ab>>2]|0)}cM[c[(c[3524]|0)+168>>2]&511](9);c[13542]=bn}}while(0);if((a[38984]&1)!=0){if((a[bM+236|0]&1)==0){break}}if(db){fB(bM);break}else{fC(bM);break}}}while(0);do{if(df){bC=bv+1|0;if((bC|0)<(c[9014]|0)){dE=bC;dF=bL-(c[9022]|0)|0;dG=bR;break}else{dE=0;dF=c[56]|0;dG=(c[9028]|0)+bR|0;break}}else{dE=bv;dF=bL;dG=bR}}while(0);do{if((c[11690]|0)==0){dH=dE;dI=dF;dJ=dG}else{bC=c[bM+256>>2]|0;if((bC|0)==0){dH=dE;dI=dF;dJ=dG;break}bl=bJ;c[aq>>2]=c[bl>>2];c[aq+4>>2]=c[bl+4>>2];c[aq+8>>2]=c[bl+8>>2];c[aq+12>>2]=c[bl+12>>2];c[aq+16>>2]=c[bl+16>>2];c[aq+20>>2]=c[bl+20>>2];c[aq+24>>2]=c[bl+24>>2];c[aq+28>>2]=c[bl+28>>2];c[aq+32>>2]=c[bl+32>>2];c[aq+36>>2]=c[bl+36>>2];c[aq+40>>2]=c[bl+40>>2];c[aq+44>>2]=c[bl+44>>2];c[aq+48>>2]=c[bl+48>>2];c[aq+52>>2]=c[bl+52>>2];bl=(a[38984]&1)+(c[c1>>2]|0)|0;c[c1>>2]=bl;c[c5>>2]=c[c$>>2];c[c5+4>>2]=c[c$+4>>2];c[c5+8>>2]=c[c$+8>>2];c[c5+12>>2]=c[c$+12>>2];do{if((c[cP>>2]|0)!=0){cm=+h[cZ>>3];bA=c[(c[3524]|0)+92>>2]|0;if(cm<0.0){cK[bA&63](+h[3817]);break}else{cK[bA&63](cm);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[cQ>>3]);bA=c[(c[3524]|0)+64>>2]|0;if((bl|0)<-5){cM[bA&511](-2)}else{cM[bA&511](bl)}bA=c[3524]|0;do{if((a[cU]&1)==0){if((c[bA+96>>2]&1024|0)!=0){break}c[cT>>2]=1;c[cJ>>2]=bl;a0=7778}else{a0=7778}}while(0);if((a0|0)==7778){a0=0;fn(C,bA)}do{if((a[36120]&1)==0){dK=dE;dL=dF;dM=dG}else{bl=bM+16|0;bF=c[bl>>2]|0;if((bF|0)==0){dK=dE;dL=dF;dM=dG;break}if((a[bF]|0)==0){dK=dE;dL=dF;dM=dG;break}if((a[bM+22|0]&1)!=0){dK=dE;dL=dF;dM=dG;break}if((a[46752]&1)!=0){dK=dE;dL=dF;dM=dG;break}if((a[35888]&1)!=0){dK=dE;dL=dF;dM=dG;break}cM[c[cW>>2]&511](-2);fz(dG,dF,c[bl>>2]|0);c[cV>>2]=c[c$>>2];c[cV+4>>2]=c[c$+4>>2];c[cV+8>>2]=c[c$+8>>2];c[cV+12>>2]=c[c$+12>>2];bl=c[c1>>2]|0;do{if((c[cP>>2]|0)!=0){cm=+h[cZ>>3];bF=c[(c[3524]|0)+92>>2]|0;if(cm<0.0){cK[bF&63](+h[3817]);break}else{cK[bF&63](cm);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[cQ>>3]);bF=c[(c[3524]|0)+64>>2]|0;if((bl|0)<-5){cM[bF&511](-2)}else{cM[bF&511](bl)}bF=c[3524]|0;do{if((a[cU]&1)==0){if((c[bF+96>>2]&1024|0)!=0){break}c[cX>>2]=1;c[c_>>2]=bl;a0=7795}else{a0=7795}}while(0);if((a0|0)==7795){a0=0;fn(B,bF)}bl=c[bz>>2]|0;if((bl|0)==33|(bl|0)==1|(bl|0)==153|(bl|0)==345|(bl|0)==225|(bl|0)==177|(bl|0)==193|(bl|0)==209){bn=c[13542]|0;ay=c[3524]|0;c[13542]=(c[ay+96>>2]&128|0)==0?55520:0;cM[c[ay+168>>2]&511](8);ay=(c[9006]|0)+dG|0;c[x>>2]=(c[9010]|0)+dG;c[y>>2]=dF;c[z>>2]=ay;c[A>>2]=dF;ay=c[3524]|0;if((fl(x,y,z,A)|0)!=0){cN[c[ay+56>>2]&255](c[x>>2]|0,c[y>>2]|0);cN[c[ay+60>>2]&255](c[z>>2]|0,c[A>>2]|0)}cM[c[(c[3524]|0)+168>>2]&511](9);c[13542]=bn}else if((bl|0)==295|(bl|0)==279|(bl|0)==311|(bl|0)==102|(bl|0)==86|(bl|0)==118|(bl|0)==169|(bl|0)==137|(bl|0)==252|(bl|0)==474|(bl|0)==257|(bl|0)==457|(bl|0)==489|(bl|0)==18){bn=c[bM+32>>2]|0;ay=c[13542]|0;bK=c[3524]|0;c[13542]=(c[bK+96>>2]&128|0)==0?55520:0;cM[c[bK+168>>2]&511](8);bK=(c[9018]|0)+dG|0;a5=c[13542]|0;if((a5|0)==0){a0=7802}else{bs=(c[a5>>2]|0)>(bK|0)&1;az=(c[a5+4>>2]|0)<(bK|0)?bs|2:bs;bs=(c[a5+8>>2]|0)>(dF|0)?az|4:az;if((((c[a5+12>>2]|0)<(dF|0)?bs|8:bs)|0)==0){a0=7802}}if((a0|0)==7802){a0=0;cR[c[(c[3524]|0)+80>>2]&127](bK,dF,bn)}cM[c[(c[3524]|0)+168>>2]&511](9);c[13542]=ay}else if((bl|0)==51){ay=c[13542]|0;bn=c[3524]|0;c[13542]=(c[bn+96>>2]&128|0)==0?55520:0;cM[c[bn+168>>2]&511](8);bn=(c[9006]|0)+dG|0;c[s>>2]=(c[9010]|0)+dG;c[t>>2]=dF;c[u>>2]=bn;c[w>>2]=dF;bn=c[3524]|0;if((fl(s,t,u,w)|0)!=0){cN[c[bn+56>>2]&255](c[s>>2]|0,c[t>>2]|0);cN[c[bn+60>>2]&255](c[u>>2]|0,c[w>>2]|0)}cM[c[(c[3524]|0)+168>>2]&511](9);c[13542]=ay}else if((bl|0)==64){bl=c[13542]|0;ay=c[3524]|0;c[13542]=(c[ay+96>>2]&128|0)==0?55520:0;cM[c[ay+168>>2]&511](8);ay=(c[9018]|0)+dG|0;bn=c[13542]|0;if((bn|0)==0){a0=7809}else{bK=(c[bn>>2]|0)>(ay|0)&1;bs=(c[bn+4>>2]|0)<(ay|0)?bK|2:bK;bK=(c[bn+8>>2]|0)>(dF|0)?bs|4:bs;if((((c[bn+12>>2]|0)<(dF|0)?bK|8:bK)|0)==0){a0=7809}}if((a0|0)==7809){a0=0;cR[c[(c[3524]|0)+80>>2]&127](ay,dF,-1)}cM[c[(c[3524]|0)+168>>2]&511](9);c[13542]=bl}bl=dE+1|0;if((bl|0)<(c[9014]|0)){dK=bl;dL=dF-(c[9022]|0)|0;dM=dG;break}else{dK=0;dL=c[56]|0;dM=(c[9028]|0)+dG|0;break}}}while(0);bA=bM+22|0;bl=bM+32|0;ay=dM;bK=dL;bn=dK;bs=bC;while(1){do{if((a[35888]&1)==0){dN=bn;dO=bK;dP=ay}else{if((a[bs+8|0]|0)==0){dN=bn;dO=bK;dP=ay;break}do{if((a[36120]&1)!=0){if((a[bA]&1)!=0){break}cM[c[cW>>2]&511](-2);fz(ay,bK,bs+9|0)}}while(0);do{if(db){if((c[aE>>2]|0)!=6){a0=7839;break}cm=+h[bs+48>>3];a5=c[34]|0;az=(a[66852]&1)==0;do{if((a[64788+(a5*688&-1)|0]&1)==0){if(az){dQ=cm;break}if(cm>0.0){a2=+_(+cm);dQ=a2/+h[8358];break}else{dQ=+h[8341];break}}else{if(az){dQ=+Z(+(cm*+h[64800+(a5*688&-1)>>3]));break}if(+h[64792+(a5*688&-1)>>3]==+h[8357]){dQ=cm;break}dQ=cm*+h[64800+(a5*688&-1)>>3]/+h[8358]}}while(0);cm=+h[8341];do{if(cm>2]|0)==0){break}c[cB>>2]=5;h[cH>>3]=dR;c[ca>>2]=0;cM[c[a5>>2]&511](r)}else{a0=7839}}while(0);do{if((a0|0)==7839){a0=0;cm=+h[aA>>3];a5=c[c1>>2]|0;if((a5|0)==-6){c[c1>>2]=0;a[cU]=1;dS=0}else{dS=a5}L10667:do{if((a[30080]&1)==0){a0=7855}else{if((a[35888]&1)==0){a0=7855;break}a5=dS+1|0;c[c1>>2]=a5;az=dS+2|0;bm=43280;while(1){dT=c[bm>>2]|0;if((dT|0)==0){break}if((c[dT+4>>2]|0)==(az|0)){a0=7846;break}else{bm=dT|0}}if((a0|0)==7846){a0=0;bm=(a[dT+40|0]&1)==0;dU=bm?1:c[dT+48>>2]|0;dV=bm?c[dT+12>>2]|0:c[dT+52>>2]|0;dW=+h[dT+56>>3];dX=a5;break}bm=c[8798]|0;bb=(bm|0)>0;aZ=az;L10676:while(1){bG=43264;while(1){dY=c[bG>>2]|0;if((dY|0)==0){break}if((c[dY+4>>2]|0)==(aZ|0)){break L10676}else{bG=dY|0}}bG=aZ-1|0;if(!((aZ|0)>(bm|0)&bb)){dU=1;dV=bG;dW=cm;dX=a5;break L10667}aZ=((bG|0)%(bm|0)&-1)+1|0}bm=c[dY+48>>2]|0;aZ=c[dY+52>>2]|0;cn=+h[dY+56>>3];if((c[(c[3524]|0)+96>>2]&1024|0)!=0){dU=bm;dV=aZ;dW=cn;dX=a5;break}bb=(a[dY+40|0]&1)==0;dU=bb?1:bm;dV=bb?c[dY+12>>2]|0:aZ;dW=cn;dX=a5}}while(0);L10685:do{if((a0|0)==7855){a0=0;aZ=dS+1|0;c[c1>>2]=aZ;bb=c[8798]|0;bm=(bb|0)>0;az=dS+2|0;L10687:while(1){bG=43264;while(1){dZ=c[bG>>2]|0;if((dZ|0)==0){break}if((c[dZ+4>>2]|0)==(az|0)){break L10687}else{bG=dZ|0}}bG=az-1|0;if(!((az|0)>(bb|0)&bm)){dU=1;dV=bG;dW=cm;dX=aZ;break L10685}az=((bG|0)%(bb|0)&-1)+1|0}bb=c[dZ+48>>2]|0;az=c[dZ+52>>2]|0;cn=+h[dZ+56>>3];if((c[(c[3524]|0)+96>>2]&1024|0)!=0){dU=bb;dV=az;dW=cn;dX=aZ;break}bm=(a[dZ+40|0]&1)==0;dU=bm?1:bb;dV=bm?c[dZ+12>>2]|0:az;dW=cn;dX=aZ}}while(0);c[aE>>2]=dU;c[cC>>2]=dV;h[aA>>3]=dW;c[cj>>2]=c[c$>>2];c[cj+4>>2]=c[c$+4>>2];c[cj+8>>2]=c[c$+8>>2];c[cj+12>>2]=c[c$+12>>2];do{if((c[cP>>2]|0)!=0){cm=+h[cZ>>3];az=c[(c[3524]|0)+92>>2]|0;if(cm<0.0){cK[az&63](+h[3817]);break}else{cK[az&63](cm);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[cQ>>3]);az=c[(c[3524]|0)+64>>2]|0;if((dX|0)<-5){cM[az&511](-2)}else{cM[az&511](dX)}az=c[3524]|0;if((a[cU]&1)==0){if((c[az+96>>2]&1024|0)!=0){break}c[ch>>2]=1;c[cg>>2]=dX}fn(q,az)}}while(0);if((a[36120]&1)==0){dN=bn;dO=bK;dP=ay;break}if((a[bA]&1)!=0){dN=bn;dO=bK;dP=ay;break}az=c[bz>>2]|0;if((az|0)==33|(az|0)==1|(az|0)==51|(az|0)==153|(az|0)==345|(az|0)==225|(az|0)==177|(az|0)==193|(az|0)==209|(az|0)==352){bm=c[13542]|0;bb=c[3524]|0;c[13542]=(c[bb+96>>2]&128|0)==0?55520:0;cM[c[bb+168>>2]&511](8);bb=(c[9006]|0)+ay|0;c[l>>2]=(c[9010]|0)+ay;c[n>>2]=bK;c[o>>2]=bb;c[p>>2]=bK;bb=c[3524]|0;if((fl(l,n,o,p)|0)!=0){cN[c[bb+56>>2]&255](c[l>>2]|0,c[n>>2]|0);cN[c[bb+60>>2]&255](c[o>>2]|0,c[p>>2]|0)}cM[c[(c[3524]|0)+168>>2]&511](9);c[13542]=bm}else if((az|0)==295|(az|0)==279|(az|0)==311|(az|0)==102|(az|0)==86|(az|0)==118|(az|0)==169|(az|0)==137|(az|0)==252|(az|0)==474|(az|0)==257|(az|0)==457|(az|0)==489|(az|0)==18){bm=c[bl>>2]|0;bb=c[13542]|0;a5=c[3524]|0;c[13542]=(c[a5+96>>2]&128|0)==0?55520:0;cM[c[a5+168>>2]&511](8);a5=(c[9018]|0)+ay|0;bG=c[13542]|0;if((bG|0)==0){a0=7882}else{bo=(c[bG>>2]|0)>(a5|0)&1;a9=(c[bG+4>>2]|0)<(a5|0)?bo|2:bo;bo=(c[bG+8>>2]|0)>(bK|0)?a9|4:a9;if((((c[bG+12>>2]|0)<(bK|0)?bo|8:bo)|0)==0){a0=7882}}if((a0|0)==7882){a0=0;cR[c[(c[3524]|0)+80>>2]&127](a5,bK,bm)}cM[c[(c[3524]|0)+168>>2]&511](9);c[13542]=bb}else if((az|0)==64){az=c[13542]|0;bb=c[3524]|0;c[13542]=(c[bb+96>>2]&128|0)==0?55520:0;cM[c[bb+168>>2]&511](8);bb=(c[9018]|0)+ay|0;bm=c[13542]|0;if((bm|0)==0){a0=7886}else{a5=(c[bm>>2]|0)>(bb|0)&1;bo=(c[bm+4>>2]|0)<(bb|0)?a5|2:a5;a5=(c[bm+8>>2]|0)>(bK|0)?bo|4:bo;if((((c[bm+12>>2]|0)<(bK|0)?a5|8:a5)|0)==0){a0=7886}}if((a0|0)==7886){a0=0;cR[c[(c[3524]|0)+80>>2]&127](bb,bK,-1)}cM[c[(c[3524]|0)+168>>2]&511](9);c[13542]=az}az=bn+1|0;if((az|0)<(c[9014]|0)){dN=az;dO=bK-(c[9022]|0)|0;dP=ay;break}else{dN=0;dO=c[56]|0;dP=(c[9028]|0)+ay|0;break}}}while(0);bF=c[bz>>2]|0;do{if((bF|0)==153|(bF|0)==345|(bF|0)==225|(bF|0)==33){if((c[11690]&2|0)==0){fG(bs,aG);break}az=bs+44|0;if((c[az>>2]|0)<=0){break}bb=bs+4|0;a5=0;do{bm=c[bb>>2]|0;bo=bm+(a5<<6)+24|0;cm=+h[bo>>3];cn=(+h[bm+(a5<<6)+8>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;a2=(+h[bm+(a5<<6)+16>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;cI=+h[5279];aR=+h[2];cp=+h[12];c7=(cm-cI)*aR+cp+-1.0;cw=+h[403]+cn*+h[391]+a2*+h[395];c6=+h[399];b1=+h[404]+cn*+h[392]+a2*+h[396];aU=+h[400];cf=+h[405]+cn*+h[393]+a2*+h[397];ce=+h[401];ct=+h[406]+cn*+h[394]+a2*+h[398];a2=+h[402];cn=ct+c7*a2;cz=cn==0.0?1.0e-5:cn;h[cY>>3]=(cw+c7*c6)/cz;h[cF>>3]=(b1+c7*aU)/cz;h[aB>>3]=(cf+c7*ce)/cz;h[cE>>3]=cm;c[aF>>2]=0;cm=(0.0-cI)*aR+cp+-1.0;cp=ct+cm*a2;a2=cp==0.0?1.0e-5:cp;h[au>>3]=(cw+cm*c6)/a2;h[cL>>3]=(b1+cm*aU)/a2;h[aD>>3]=(cf+cm*ce)/a2;h[aC>>3]=0.0;c[at>>2]=0;h[aC>>3]=+h[bo>>3];do{if((a[38984]&1)==0){a0=7898}else{if((a[46752]&1)==0){a0=7898;break}gt(j,k,aG)}}while(0);if((a0|0)==7898){a0=0;un(j,k,aG,as)}a5=a5+1|0;}while((a5|0)<(c[az>>2]|0))}else if((bF|0)==177|(bF|0)==193|(bF|0)==209|(bF|0)==1|(bF|0)==352){fF(bs,aG)}else if((bF|0)==51){fF(bs,aG);a0=7903}else if((bF|0)==295|(bF|0)==279|(bF|0)==311|(bF|0)==102|(bF|0)==86|(bF|0)==118|(bF|0)==169|(bF|0)==137|(bF|0)==252|(bF|0)==257|(bF|0)==457|(bF|0)==489|(bF|0)==64|(bF|0)==18){a0=7903}}while(0);if((a0|0)==7903){a0=0;fG(bs,aG)}bF=c[bs>>2]|0;if((bF|0)==0){dH=dN;dI=dO;dJ=dP;break}else{ay=dP;bK=dO;bn=dN;bs=bF}}}}while(0);cM[c[(c[3524]|0)+168>>2]&511](7);dc=dH;dd=dI;de=dJ}if((bD|0)>=(d|0)){break L10258}bR=de;bL=dd;bv=dc;bM=c[bM>>2]|0;bD=bD+1|0}}}while(0);if(da){i3()}da=a[38984]|0;do{if((da&1)!=0&(c[9744]|0)==1){if((a[46752]&1)==0|bE){d_=da;break}cM[c[(c[3524]|0)+168>>2]&511](6);gv(b,d);cM[c[(c[3524]|0)+168>>2]&511](7);d_=a[38984]|0}else{d_=da}}while(0);da=c[10026]|0;do{if((d_&1)!=0|(da|0)==1){fw(b,d,0,1)}else{if((da|0)!=-1){break}fw(b,d,1,1)}}while(0);if((c[5094]|0)!=0&(c[14088]|0)==1){fw(b,d,3,1)}do{if(!bE){if((a[55536]&1)==0){break}if(!(a[31104]|0)){break}if(!((a[54016]|0)!=110&(c[13506]|0)==1)){break}dD(2)}}while(0);fO(c[10818]|0,1,3);bE=c[10822]|0;d=c[(c[3524]|0)+92>>2]|0;if((d|0)!=0){cK[d&63](+h[3817])}if((bE|0)!=0){d=bE;do{if((c[d+56>>2]|0)==1){fK(d+8|0,av,aw,202256);fp(~~+h[av>>3],~~+h[aw>>3],d)}d=c[d>>2]|0;}while((d|0)!=0)}fy(1);d=c[200]|0;dW=+h[64664+(d*688&-1)>>3];aw=c[144]|0;dR=+h[64664+(aw*688&-1)>>3];dQ=+h[91];dx=+h[96];dw=(dW-dW)*dQ+dx+-1.0;dj=+h[21];dk=+h[68];dm=(dR-dR)*dj+dk+-1.0;dq=(+h[7076]- +h[5279])*+h[2]+ +h[12]+-1.0;a2=+h[403];ce=+h[391];cm=a2+dw*ce;cf=+h[395];aU=dm*cf;b1=dq*+h[399];c6=+h[404];cw=+h[392];cp=c6+dw*cw;ct=+h[396];aR=dm*ct;cI=dq*+h[400];cz=+h[406];c7=+h[394];cn=cz+dw*c7;dw=+h[398];co=dm*dw;dm=dq*+h[402];dq=cn+co+dm;cy=dq==0.0?1.0e-5:dq;dq=+(c[180]|0);av=c[186]|0;bE=~~((cm+aU+b1)/cy*dq)+av|0;cA=+(c[40]|0);b=c[46]|0;da=~~((cp+aR+cI)/cy*cA)+b|0;c[18064]=bE;c[18062]=da;cy=(+h[64672+(d*688&-1)>>3]-dW)*dQ+dx+-1.0;dx=cz+cy*c7+co+dm;co=dx==0.0?1.0e-5:dx;c[18060]=(~~((a2+cy*ce+aU+b1)/co*dq)+av|0)-bE;c[18058]=(~~((c6+cy*cw+aR+cI)/co*cA)+b|0)-da;co=(+h[64672+(aw*688&-1)>>3]-dR)*dj+dk+-1.0;dk=cn+co*dw+dm;dm=dk==0.0?1.0e-5:dk;c[18056]=(~~((cm+co*cf+b1)/dm*dq)+av|0)-bE;c[18054]=(~~((cp+co*ct+cI)/dm*cA)+b|0)-da;do{if(a[31104]|0){da=c[(c[3524]|0)+140>>2]|0;if((da|0)==0){break}cS[da&511]()}}while(0);lh();if((a[38984]&1)==0){i=f;return}if((a[46752]&1)==0){i=f;return}uu(c[7628]|0);c[7628]=0;c[7624]=0;c[7625]=0;uu(c[11608]|0);c[11608]=0;c[11604]=0;c[11605]=0;uu(c[228]|0);c[228]=0;c[224]=0;c[225]=0;i=f;return}function fw(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Z=0,_=0,$=0,aa=0.0,ab=0,ac=0,ad=0.0,ae=0.0,af=0.0,ag=0.0,ah=0,ai=0.0,aj=0.0,ak=0.0,al=0.0,am=0.0,an=0.0,ao=0.0,ap=0.0,aq=0.0,ar=0.0,as=0.0,at=0.0,au=0.0,av=0.0,aw=0.0,ax=0.0,ay=0.0,az=0.0,aA=0.0,aB=0.0,aC=0.0,aD=0.0,aE=0,aF=0,aG=0.0,aH=0.0,aI=0.0,aJ=0.0,aK=0.0,aL=0.0,aM=0.0,aN=0.0,aO=0.0,aP=0.0,aQ=0.0,aR=0.0,aS=0.0,aT=0.0,aU=0.0,aV=0.0,aW=0.0,aX=0.0,aY=0.0,aZ=0.0,a_=0,a$=0,a0=0,a1=0,a2=0,a3=0,a4=0,a5=0,a6=0,a7=0,a9=0,ba=0,bb=0,bc=0,bd=0,be=0,bf=0,bg=0,bh=0,bi=0,bj=0,bk=0,bl=0,bm=0.0,bn=0.0,bo=0,bp=0.0,bq=0.0,br=0.0,bs=0,bt=0.0,bu=0.0,bv=0.0,bw=0,bx=0,by=0,bz=0.0,bA=0,bB=0,bC=0,bD=0.0,bE=0.0,bF=0.0,bG=0,bH=0.0,bI=0.0,bJ=0,bK=0,bL=0.0,bM=0.0,bN=0.0,bO=0,bP=0,bQ=0,bR=0,bS=0,bT=0.0,bU=0.0,bV=0.0,bW=0.0,bX=0,bY=0,bZ=0,b_=0,b$=0,b0=0,b1=0,b2=0,b3=0;j=i;i=i+1392|0;k=j|0;l=j+16|0;m=j+32|0;n=j+80|0;o=j+128|0;p=j+176|0;q=j+224|0;r=j+272|0;s=j+320|0;t=j+368|0;u=j+416|0;v=j+464|0;w=j+512|0;x=j+560|0;y=j+608|0;z=j+640|0;A=j+672|0;B=j+720|0;C=j+768|0;D=j+816|0;E=j+864|0;F=j+912|0;G=j+960|0;H=j+1008|0;I=j+1056|0;J=j+1064|0;K=j+1072|0;L=j+1080|0;M=j+1088|0;N=j+1136|0;Q=j+1184|0;R=j+1232|0;S=j+1280|0;T=j+1328|0;U=j+1376|0;V=j+1384|0;W=c[3524]|0;X=c[13542]|0;Z=c[11692]|0;_=(Z|0)!=0;L10803:do{if(_&(c[5094]|0)!=0){if((c[14088]|0)!=(f|0)){break}$=l;c[$>>2]=c[14084];c[$+4>>2]=c[56340>>2];c[$+8>>2]=c[56344>>2];c[$+12>>2]=c[56348>>2];$=c[14075]|0;do{if((c[14074]|0)!=0){aa=+h[7040];ab=c[W+92>>2]|0;if(aa<0.0){cK[ab&63](+h[3817]);break}else{cK[ab&63](aa);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[7039]);ab=c[(c[3524]|0)+64>>2]|0;if(($|0)<-5){cM[ab&511](-2)}else{cM[ab&511]($)}ab=c[3524]|0;do{if((a[56328]&1)==0){if((c[ab+96>>2]&1024|0)!=0){break}c[l>>2]=1;c[l+4>>2]=$;ac=7953}else{ac=7953}}while(0);if((ac|0)==7953){fn(l,ab)}do{if((c[11692]&15|0)==15){$=c[(c[3524]|0)+172>>2]|0;if(($|0)==0){break}cM[$&511](0)}}while(0);aa=(+h[14]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;ad=(+h[13]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;ae=(+h[7076]- +h[5279])*+h[2]+ +h[12]+-1.0;af=+h[406]+aa*+h[394]+ad*+h[398]+ae*+h[402];ag=af==0.0?1.0e-5:af;cN[c[(c[3524]|0)+56>>2]&255](~~((+h[403]+aa*+h[391]+ad*+h[395]+ae*+h[399])/ag*+(c[180]|0))+(c[186]|0)|0,~~((+h[404]+aa*+h[392]+ad*+h[396]+ae*+h[400])/ag*+(c[40]|0))+(c[46]|0)|0);ag=(+h[7089]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;ae=(+h[7088]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;ad=(+h[7076]- +h[5279])*+h[2]+ +h[12]+-1.0;aa=+h[406]+ag*+h[394]+ae*+h[398]+ad*+h[402];af=aa==0.0?1.0e-5:aa;ab=~~((+h[403]+ag*+h[391]+ae*+h[395]+ad*+h[399])/af*+(c[180]|0))+(c[186]|0)|0;$=~~((+h[404]+ag*+h[392]+ae*+h[396]+ad*+h[400])/af*+(c[40]|0))+(c[46]|0)|0;ah=c[3524]|0;if((c[11692]&2|0)==0){cN[c[ah+56>>2]&255](ab,$)}else{cN[c[ah+60>>2]&255](ab,$)}af=(+h[3305]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;ad=(+h[3304]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;ae=(+h[7076]- +h[5279])*+h[2]+ +h[12]+-1.0;ag=+h[406]+af*+h[394]+ad*+h[398]+ae*+h[402];aa=ag==0.0?1.0e-5:ag;$=~~((+h[403]+af*+h[391]+ad*+h[395]+ae*+h[399])/aa*+(c[180]|0))+(c[186]|0)|0;ab=~~((+h[404]+af*+h[392]+ad*+h[396]+ae*+h[400])/aa*+(c[40]|0))+(c[46]|0)|0;ah=c[3524]|0;if((c[11692]&8|0)==0){cN[c[ah+56>>2]&255]($,ab)}else{cN[c[ah+60>>2]&255]($,ab)}aa=(+h[5264]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;ae=(+h[5263]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;ad=(+h[7076]- +h[5279])*+h[2]+ +h[12]+-1.0;af=+h[406]+aa*+h[394]+ae*+h[398]+ad*+h[402];ag=af==0.0?1.0e-5:af;ab=~~((+h[403]+aa*+h[391]+ae*+h[395]+ad*+h[399])/ag*+(c[180]|0))+(c[186]|0)|0;$=~~((+h[404]+aa*+h[392]+ae*+h[396]+ad*+h[400])/ag*+(c[40]|0))+(c[46]|0)|0;ah=c[3524]|0;if((c[11692]&4|0)==0){cN[c[ah+56>>2]&255](ab,$)}else{cN[c[ah+60>>2]&255](ab,$)}ag=(+h[14]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;ad=(+h[13]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;ae=(+h[7076]- +h[5279])*+h[2]+ +h[12]+-1.0;aa=+h[406]+ag*+h[394]+ad*+h[398]+ae*+h[402];af=aa==0.0?1.0e-5:aa;$=~~((+h[403]+ag*+h[391]+ad*+h[395]+ae*+h[399])/af*+(c[180]|0))+(c[186]|0)|0;ab=~~((+h[404]+ag*+h[392]+ad*+h[396]+ae*+h[400])/af*+(c[40]|0))+(c[46]|0)|0;ah=c[3524]|0;if((c[11692]&1|0)==0){cN[c[ah+56>>2]&255]($,ab)}else{cN[c[ah+60>>2]&255]($,ab)}if((c[11692]&15|0)!=15){break}ab=c[(c[3524]|0)+172>>2]|0;if((ab|0)==0){break}cM[ab&511](1)}else{if(!_){break}af=+h[7076];ae=+h[64664+((c[200]|0)*688&-1)>>3];ad=+h[91];ag=+h[96];aa=(+h[14]-ae)*ad+ag+-1.0;ai=+h[64664+((c[144]|0)*688&-1)>>3];aj=+h[21];ak=+h[68];al=(+h[13]-ai)*aj+ak+-1.0;am=(af- +h[5279])*+h[2]+ +h[12]+-1.0;an=+h[403];ao=+h[391];ap=+h[395];aq=am*+h[399];ar=+h[404];as=+h[392];at=+h[396];au=am*+h[400];av=+h[405];aw=+h[393];ax=+h[397];ay=am*+h[401];az=+h[406];aA=+h[394];aB=+h[398];aC=am*+h[402];am=az+aa*aA+al*aB+aC;aD=am==0.0?1.0e-5:am;h[m>>3]=(an+aa*ao+al*ap+aq)/aD;h[m+8>>3]=(ar+aa*as+al*at+au)/aD;h[m+16>>3]=(av+aa*aw+al*ax+ay)/aD;h[m+32>>3]=af;c[m+40>>2]=0;aD=(+h[7089]-ae)*ad+ag+-1.0;al=(+h[7088]-ai)*aj+ak+-1.0;aa=az+aD*aA+al*aB+aC;am=aa==0.0?1.0e-5:aa;h[n>>3]=(an+aD*ao+al*ap+aq)/am;h[n+8>>3]=(ar+aD*as+al*at+au)/am;h[n+16>>3]=(av+aD*aw+al*ax+ay)/am;h[n+32>>3]=af;c[n+40>>2]=0;am=(+h[3305]-ae)*ad+ag+-1.0;al=(+h[3304]-ai)*aj+ak+-1.0;aD=az+am*aA+al*aB+aC;aa=aD==0.0?1.0e-5:aD;h[o>>3]=(an+am*ao+al*ap+aq)/aa;h[o+8>>3]=(ar+am*as+al*at+au)/aa;h[o+16>>3]=(av+am*aw+al*ax+ay)/aa;h[o+32>>3]=af;c[o+40>>2]=0;aa=(+h[5264]-ae)*ad+ag+-1.0;ag=(+h[5263]-ai)*aj+ak+-1.0;ak=az+aa*aA+ag*aB+aC;aC=ak==0.0?1.0e-5:ak;h[p>>3]=(an+aa*ao+ag*ap+aq)/aC;h[p+8>>3]=(ar+aa*as+ag*at+au)/aC;h[p+16>>3]=(av+aa*aw+ag*ax+ay)/aC;h[p+32>>3]=af;c[p+40>>2]=0;ab=(e|0)!=2;do{if(ab){L10808:do{if((Z&4|0)!=0){do{if((a[38984]&1)!=0){if((a[46752]&1)==0){break}gt(o,p,56296);break L10808}}while(0);un(o,p,56296,56336)}}while(0);L10815:do{if((c[11692]&1|0)!=0){do{if((a[38984]&1)!=0){if((a[46752]&1)==0){break}gt(m,p,56296);break L10815}}while(0);un(m,p,56296,56336)}}while(0);if((e|0)==1){aE=0;break}aF=c[11692]|0;ac=7986}else{aF=Z;ac=7986}}while(0);L10823:do{if((ac|0)==7986){L10825:do{if((aF&2|0)!=0){do{if((a[38984]&1)!=0){if((a[46752]&1)==0){break}gt(m,n,56296);break L10825}}while(0);un(m,n,56296,56336)}}while(0);if((c[11692]&8|0)==0){aE=1;break}do{if((a[38984]&1)!=0){if((a[46752]&1)==0){break}gt(o,n,56296);aE=1;break L10823}}while(0);un(o,n,56296,56336);aE=1}}while(0);do{if((a[46752]&1)==0){if((c[11690]&2|0)!=0){break}if((c[7662]|0)!=1){break L10803}if((cy(30632,213264)|0)==0){break L10803}}}while(0);af=+h[5279];$=c[200]|0;aC=+h[64664+($*688&-1)>>3];ay=+h[14]-aC;ax=+h[91];ag=+h[96];aw=ay*ax+ag+-1.0;ah=c[144]|0;aa=+h[64664+(ah*688&-1)>>3];av=+h[13]-aa;au=+h[21];at=+h[68];as=av*au+at+-1.0;ar=+h[2];aq=+h[12];ap=(af-af)*ar+aq+-1.0;ao=+h[403];an=+h[391];ak=+h[395];aB=ao+aw*an+as*ak;aA=+h[399];az=ap*aA;aj=+h[404];ai=+h[392];ad=+h[396];ae=aj+aw*ai+as*ad;al=+h[400];am=ap*al;aD=+h[405];aG=+h[393];aH=+h[397];aI=aD+aw*aG+as*aH;aJ=+h[401];aK=ap*aJ;aL=+h[406];aM=+h[394];aN=+h[398];aO=aL+aw*aM+as*aN;as=+h[402];aw=ap*as;ap=aO+aw;aP=ap==0.0?1.0e-5:ap;h[q>>3]=(aB+az)/aP;h[q+8>>3]=(ae+am)/aP;h[q+16>>3]=(aI+aK)/aP;h[q+32>>3]=af;c[q+40>>2]=0;aP=+h[7089]-aC;ap=aP*ax+ag+-1.0;aQ=+h[7088]-aa;aR=aQ*au+at+-1.0;aS=ao+ap*an+aR*ak;aT=aj+ap*ai+aR*ad;aU=aD+ap*aG+aR*aH;aV=aL+ap*aM+aR*aN;aR=aV+aw;ap=aR==0.0?1.0e-5:aR;h[r>>3]=(aS+az)/ap;h[r+8>>3]=(aT+am)/ap;h[r+16>>3]=(aU+aK)/ap;h[r+32>>3]=af;c[r+40>>2]=0;ap=(+h[3305]-aC)*ax+ag+-1.0;aR=(+h[3304]-aa)*au+at+-1.0;aW=ao+ap*an+aR*ak;aX=aj+ap*ai+aR*ad;aY=aD+ap*aG+aR*aH;aZ=aL+ap*aM+aR*aN;aR=aZ+aw;ap=aR==0.0?1.0e-5:aR;h[s>>3]=(aW+az)/ap;h[s+8>>3]=(aX+am)/ap;h[s+16>>3]=(aY+aK)/ap;h[s+32>>3]=af;c[s+40>>2]=0;ap=(+h[5264]-aC)*ax+ag+-1.0;ag=(+h[5263]-aa)*au+at+-1.0;at=ao+ap*an+ag*ak;ak=aj+ap*ai+ag*ad;ad=aD+ap*aG+ag*aH;aH=aL+ap*aM+ag*aN;aN=aH+aw;aw=aN==0.0?1.0e-5:aN;h[t>>3]=(at+az)/aw;h[t+8>>3]=(ak+am)/aw;h[t+16>>3]=(ad+aK)/aw;h[t+32>>3]=af;c[t+40>>2]=0;aw=+h[6915];aK=(aw-af)*ar+aq+-1.0;am=aK*aA;az=aK*al;aN=aK*aJ;ag=aK*as;aK=aO+ag;aM=aK==0.0?1.0e-5:aK;h[u>>3]=(aB+am)/aM;h[u+8>>3]=(ae+az)/aM;h[u+16>>3]=(aI+aN)/aM;h[u+32>>3]=aw;c[u+40>>2]=0;aM=aV+ag;aV=aM==0.0?1.0e-5:aM;h[v>>3]=(aS+am)/aV;h[v+8>>3]=(aT+az)/aV;h[v+16>>3]=(aU+aN)/aV;h[v+32>>3]=aw;c[v+40>>2]=0;aV=aZ+ag;aZ=aV==0.0?1.0e-5:aV;h[w>>3]=(aW+am)/aZ;h[w+8>>3]=(aX+az)/aZ;h[w+16>>3]=(aY+aN)/aZ;h[w+32>>3]=aw;c[w+40>>2]=0;aZ=aH+ag;ag=aZ==0.0?1.0e-5:aZ;h[x>>3]=(at+am)/ag;h[x+8>>3]=(ak+az)/ag;h[x+16>>3]=(ad+aN)/ag;h[x+32>>3]=aw;c[x+40>>2]=0;a_=c[11692]|0;L10843:do{if((a_&240|0)==240){L10965:do{if(aE){do{if((a[38984]&1)==0){ac=8005}else{if((a[46752]&1)==0){ac=8005;break}gt(q,u,56296)}}while(0);if((ac|0)==8005){un(q,u,56296,56336)}do{if((a[38984]&1)==0){ac=8009}else{if((a[46752]&1)==0){ac=8009;break}gt(r,v,56296)}}while(0);if((ac|0)==8009){un(r,v,56296,56336)}do{if((a[38984]&1)!=0){if((a[46752]&1)==0){break}gt(s,w,56296);break L10965}}while(0);un(s,w,56296,56336)}}while(0);if(!ab){break}do{if((a[38984]&1)!=0){if((a[46752]&1)==0){break}gt(t,x,56296);break L10843}}while(0);un(t,x,56296,56336)}else{aw=+h[64672+($*688&-1)>>3];ag=aw-aC;a$=~~(ay/ag+.1);aN=+h[64672+(ah*688&-1)>>3];ad=aN-aa;a0=~~(av/ad+.1);a1=~~(aP/ag+.1);a2=~~(aQ/ad+.1);az=+h[7076];h[y+24>>3]=az;h[y+16>>3]=az;h[y+8>>3]=az;h[y>>3]=az;h[z+24>>3]=az;h[z+16>>3]=az;h[z+8>>3]=az;h[z>>3]=az;if((d|0)>0){a3=b;a4=d;while(1){a5=a4-1|0;a6=c[a3+260>>2]|0;a7=c[a3+8>>2]|0;do{if((a7|0)==3){if((c[a3+244>>2]|0)==0){break}a9=a3+252|0;ac=8023}else if((a7|0)!=4){a9=37368;ac=8023}}while(0);do{if((ac|0)==8023){ac=0;a7=c[a9>>2]|0;ba=c[a6+8>>2]|0;bb=c[a6+12>>2]|0;bc=c[bb>>2]|0;do{if((bc|0)==0){az=+h[bb+8>>3];ak=az-aC;am=+P(+ak);at=+h[11];if(am>=at){if(+P(+(az-aw))>=at){break}}az=+h[bb+16>>3];am=az-aa;if(+P(+am)>=at){if(+P(+(az-aN))>=at){break}}bd=~~(ak/(aw-aC)+.1);be=~~(am/ad+.1);bf=y+(bd<<4)+(be<<3)|0;am=+h[bb+24>>3];if(+h[bf>>3]>3]=am}bf=z+(bd<<4)+(be<<3)|0;if(+h[bf>>3]<=am){break}h[bf>>3]=am}}while(0);bf=ba-1|0;do{if((c[bb+(bf<<6)>>2]|0)==0){am=+h[bb+(bf<<6)+8>>3];ak=am-aC;at=+P(+ak);az=+h[11];if(at>=az){if(+P(+(am-aw))>=az){break}}am=+h[bb+(bf<<6)+16>>3];at=am-aa;if(+P(+at)>=az){if(+P(+(am-aN))>=az){break}}be=~~(ak/(aw-aC)+.1);bd=~~(at/ad+.1);bg=y+(be<<4)+(bd<<3)|0;at=+h[bb+(bf<<6)+24>>3];if(+h[bg>>3]>3]=at}bg=z+(be<<4)+(bd<<3)|0;if(+h[bg>>3]<=at){break}h[bg>>3]=at}}while(0);ba=a7-1|0;if((ba|0)==0){bh=a6;bi=bb;bj=bc}else{bg=a6;bd=ba;do{bg=c[bg>>2]|0;bd=bd-1|0;}while((bd|0)!=0);bd=c[bg+12>>2]|0;bh=bg;bi=bd;bj=c[bd>>2]|0}bd=bh+12|0;do{if((bj|0)==0){at=+h[bi+8>>3];ak=at-aC;az=+P(+ak);am=+h[11];if(az>=am){if(+P(+(at-aw))>=am){break}}at=+h[bi+16>>3];az=at-aa;if(+P(+az)>=am){if(+P(+(at-aN))>=am){break}}bc=~~(ak/(aw-aC)+.1);bb=~~(az/ad+.1);a7=y+(bc<<4)+(bb<<3)|0;az=+h[bi+24>>3];if(+h[a7>>3]>3]=az}a7=z+(bc<<4)+(bb<<3)|0;if(+h[a7>>3]<=az){break}h[a7>>3]=az}}while(0);bg=c[bd>>2]|0;if((c[bg+(bf<<6)>>2]|0)!=0){break}az=+h[bg+(bf<<6)+8>>3];ak=az-aC;am=+P(+ak);at=+h[11];if(am>=at){if(+P(+(az-aw))>=at){break}}az=+h[bg+(bf<<6)+16>>3];am=az-aa;if(+P(+am)>=at){if(+P(+(az-aN))>=at){break}}a7=~~(ak/ag+.1);bb=~~(am/ad+.1);bc=y+(a7<<4)+(bb<<3)|0;am=+h[bg+(bf<<6)+24>>3];if(+h[bc>>3]>3]=am}bc=z+(a7<<4)+(bb<<3)|0;if(+h[bc>>3]<=am){break}h[bc>>3]=am}}while(0);if((a5|0)>0){a3=c[a3>>2]|0;a4=a5}else{break}}}L10910:do{if(aE){L10912:do{if((a_&16|0)==0){ad=+h[y+(a$<<4)+(a0<<3)>>3];ag=+h[z+(a$<<4)+(a0<<3)>>3];if(ad==ag){break}aN=(ag-af)*ar+aq+-1.0;aw=aO+aN*as;am=aw==0.0?1.0e-5:aw;h[A>>3]=(aB+aN*aA)/am;h[A+8>>3]=(ae+aN*al)/am;h[A+16>>3]=(aI+aN*aJ)/am;h[A+32>>3]=ag;c[A+40>>2]=0;ag=(ad-af)*ar+aq+-1.0;am=aO+ag*as;aN=am==0.0?1.0e-5:am;h[B>>3]=(aB+ag*aA)/aN;h[B+8>>3]=(ae+ag*al)/aN;h[B+16>>3]=(aI+ag*aJ)/aN;h[B+32>>3]=ad;c[B+40>>2]=0;do{if((a[38984]&1)!=0){if((a[46752]&1)==0){break}gt(A,B,56296);break L10912}}while(0);un(A,B,56296,56336)}else{do{if((a[38984]&1)!=0){if((a[46752]&1)==0){break}gt(q,u,56296);break L10912}}while(0);un(q,u,56296,56336)}}while(0);L10925:do{if((c[11692]&32|0)==0){ad=+h[y+(a1<<4)+(a2<<3)>>3];aN=+h[z+(a1<<4)+(a2<<3)>>3];if(ad==aN){break}ag=(+h[7089]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;am=(+h[7088]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;aw=+h[5279];ak=+h[2];at=+h[12];az=(aN-aw)*ak+at+-1.0;aZ=+h[403]+ag*+h[391]+am*+h[395];aH=+h[399];aY=+h[404]+ag*+h[392]+am*+h[396];aX=+h[400];aW=+h[405]+ag*+h[393]+am*+h[397];aV=+h[401];aU=+h[406]+ag*+h[394]+am*+h[398];am=+h[402];ag=aU+az*am;aT=ag==0.0?1.0e-5:ag;h[C>>3]=(aZ+az*aH)/aT;h[C+8>>3]=(aY+az*aX)/aT;h[C+16>>3]=(aW+az*aV)/aT;h[C+32>>3]=aN;c[C+40>>2]=0;aN=(ad-aw)*ak+at+-1.0;at=aU+aN*am;am=at==0.0?1.0e-5:at;h[D>>3]=(aZ+aN*aH)/am;h[D+8>>3]=(aY+aN*aX)/am;h[D+16>>3]=(aW+aN*aV)/am;h[D+32>>3]=ad;c[D+40>>2]=0;do{if((a[38984]&1)!=0){if((a[46752]&1)==0){break}gt(C,D,56296);break L10925}}while(0);un(C,D,56296,56336)}else{do{if((a[38984]&1)!=0){if((a[46752]&1)==0){break}gt(r,v,56296);break L10925}}while(0);un(r,v,56296,56336)}}while(0);if((c[11692]&64|0)!=0){do{if((a[38984]&1)!=0){if((a[46752]&1)==0){break}gt(s,w,56296);break L10910}}while(0);un(s,w,56296,56336);break}a5=1-a0|0;bf=1-a$|0;ad=+h[y+(bf<<4)+(a5<<3)>>3];am=+h[z+(bf<<4)+(a5<<3)>>3];if(ad==am){break}aV=(+h[3305]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;aN=(+h[3304]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;aW=+h[5279];aX=+h[2];aY=+h[12];aH=(am-aW)*aX+aY+-1.0;aZ=+h[403]+aV*+h[391]+aN*+h[395];at=+h[399];aU=+h[404]+aV*+h[392]+aN*+h[396];ak=+h[400];aw=+h[405]+aV*+h[393]+aN*+h[397];aT=+h[401];az=+h[406]+aV*+h[394]+aN*+h[398];aN=+h[402];aV=az+aH*aN;ag=aV==0.0?1.0e-5:aV;h[E>>3]=(aZ+aH*at)/ag;h[E+8>>3]=(aU+aH*ak)/ag;h[E+16>>3]=(aw+aH*aT)/ag;h[E+32>>3]=am;c[E+40>>2]=0;am=(ad-aW)*aX+aY+-1.0;aY=az+am*aN;aN=aY==0.0?1.0e-5:aY;h[F>>3]=(aZ+am*at)/aN;h[F+8>>3]=(aU+am*ak)/aN;h[F+16>>3]=(aw+am*aT)/aN;h[F+32>>3]=ad;c[F+40>>2]=0;do{if((a[38984]&1)!=0){if((a[46752]&1)==0){break}gt(E,F,56296);break L10910}}while(0);un(E,F,56296,56336)}}while(0);if(!ab){break}if((c[11692]&128|0)!=0){do{if((a[38984]&1)!=0){if((a[46752]&1)==0){break}gt(t,x,56296);break L10843}}while(0);un(t,x,56296,56336);break}a$=1-a2|0;a0=1-a1|0;ad=+h[y+(a0<<4)+(a$<<3)>>3];aN=+h[z+(a0<<4)+(a$<<3)>>3];if(ad==aN){break}aT=(+h[5264]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;am=(+h[5263]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;aw=+h[5279];ak=+h[2];aU=+h[12];at=(aN-aw)*ak+aU+-1.0;aZ=+h[403]+aT*+h[391]+am*+h[395];aY=+h[399];az=+h[404]+aT*+h[392]+am*+h[396];aX=+h[400];aW=+h[405]+aT*+h[393]+am*+h[397];ag=+h[401];aH=+h[406]+aT*+h[394]+am*+h[398];am=+h[402];aT=aH+at*am;aV=aT==0.0?1.0e-5:aT;h[G>>3]=(aZ+at*aY)/aV;h[G+8>>3]=(az+at*aX)/aV;h[G+16>>3]=(aW+at*ag)/aV;h[G+32>>3]=aN;c[G+40>>2]=0;aN=(ad-aw)*ak+aU+-1.0;aU=aH+aN*am;am=aU==0.0?1.0e-5:aU;h[H>>3]=(aZ+aN*aY)/am;h[H+8>>3]=(az+aN*aX)/am;h[H+16>>3]=(aW+aN*ag)/am;h[H+32>>3]=ad;c[H+40>>2]=0;do{if((a[38984]&1)!=0){if((a[46752]&1)==0){break}gt(G,H,56296);break L10843}}while(0);un(G,H,56296,56336)}}while(0);L10990:do{if(aE){L10992:do{if((c[11692]&256|0)!=0){do{if((a[38984]&1)!=0){if((a[46752]&1)==0){break}gt(u,v,56296);break L10992}}while(0);un(u,v,56296,56336)}}while(0);if((c[11692]&512|0)==0){break}do{if((a[38984]&1)!=0){if((a[46752]&1)==0){break}gt(w,v,56296);break L10990}}while(0);un(w,v,56296,56336)}}while(0);if(!ab){break}L11006:do{if((c[11692]&1024|0)!=0){do{if((a[38984]&1)!=0){if((a[46752]&1)==0){break}gt(u,x,56296);break L11006}}while(0);un(u,x,56296,56336)}}while(0);if((c[11692]&2048|0)==0){break}do{if((a[38984]&1)!=0){if((a[46752]&1)==0){break}gt(w,x,56296);break L10803}}while(0);un(w,x,56296,56336)}}while(0);do{if((c[5094]|0)==0){if((e|0)!=3){break}i=j;return}else{x=c[10026]|0;if((((x|0)>-1?x:-x|0)|0)!=(f|0)|(e|0)==3){i=j;return}else{c[13542]=0;break}}}while(0);f=c[200]|0;x=(c[64916+(f*688&-1)>>2]|0)==0;if(x){if((c[65140+(f*688&-1)>>2]|0)!=0){ac=8133}}else{ac=8133}L11069:do{if((ac|0)==8133){w=c[144]|0;aJ=+h[64664+(w*688&-1)>>3];aI=+h[97];al=aJ+ +h[64672+(w*688&-1)>>3]-aI;ae=+h[64664+(f*688&-1)>>3];aA=(+h[64672+(f*688&-1)>>3]+ae)*.5;aB=+h[96]+ +h[91]*(aA-ae)+-1.0;ae=+h[21];as=+h[68];aO=(aI-aJ)*ae+as+-1.0;aI=(+h[7076]- +h[5279])*+h[2]+ +h[12]+-1.0;aq=+h[403]+aB*+h[391];ar=+h[395];af=aI*+h[399];aa=+h[404]+aB*+h[392];aC=+h[396];aQ=aI*+h[400];aP=+h[405]+aB*+h[393];av=+h[397];ay=aI*+h[401];ad=+h[406]+aB*+h[394];aB=+h[398];am=aI*+h[402];aI=ad+aO*aB+am;ag=aI==0.0?1.0e-5:aI;aI=(al-aJ)*ae+as+-1.0;as=ad+aI*aB+am;am=as==0.0?1.0e-5:as;as=+(c[40]|0);h[695]=((aq+aI*ar+af)/am-(aq+aO*ar+af)/ag)/as;h[694]=((aa+aI*aC+aQ)/am-(aa+aO*aC+aQ)/ag)/as;h[693]=((aP+aI*av+ay)/am-(aP+aO*av+ay)/ag)/as;as=+g[3538];if(as>90.0|(e|0)==1){if(as<=90.0|(e|0)==2|x){bk=f}else{ac=8136}}else{if(x){bk=f}else{ac=8136}}if((ac|0)==8136){de(2,10);bk=c[200]|0}if((c[65140+(bk*688&-1)>>2]|0)==0){break}as=+g[3538];do{if(as>90.0|(e|0)==2){if(as>90.0){w=c[5094]|0;if((e|0)!=1|(w|0)!=0){bl=w;ac=8144;break}else{break L11069}}if((c[5094]|0)==0){break L11069}bm=+h[97];ac=8145}else{bl=c[5094]|0;ac=8144}}while(0);do{if((ac|0)==8144){as=+h[97];if((bl|0)!=0){bm=as;ac=8145;break}ag=(as-al)*.25;do{if((c[65084+(bk*688&-1)>>2]|0)==-3){ay=+h[64664+(bk*688&-1)>>3];av=+h[91];aO=+h[96];aP=(ay-ay)*av+aO+-1.0;am=(as- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;aI=(+h[7076]- +h[5279])*+h[2]+ +h[12]+-1.0;aQ=+h[403];aC=+h[391];aa=am*+h[395];af=aI*+h[399];ar=+h[404];aq=+h[392];aB=am*+h[396];ad=aI*+h[400];ae=+h[406];aJ=+h[394];aN=am*+h[398];am=aI*+h[402];aI=ae+aP*aJ+aN+am;aW=aI==0.0?1.0e-5:aI;aI=+(c[180]|0);w=c[186]|0;aX=+(c[40]|0);u=c[46]|0;az=aO+av*(+h[64672+(bk*688&-1)>>3]-ay)+-1.0;ay=am+(aN+(ae+aJ*az));aJ=ay==0.0?1.0e-5:ay;ay=+Y(+(+(~~(aX*((ad+(aB+(ar+aq*az)))/aJ))+u|0)- +(~~((ar+aP*aq+aB+ad)/aW*aX)+u|0)),+(+(~~(aI*((af+(aa+(aQ+aC*az)))/aJ))+w|0)- +(~~((aQ+aP*aC+aa+af)/aW*aI)+w|0)))/.017453292519943295;if(ay>0.0){bn=ay+.5}else{bn=ay+-.5}w=~~+O(+bn);ay=ag*.5;if(ay<=0.0){bo=w;bp=ay;break}bo=w+180|0;bp=ay}else{bo=0;bp=ag}}while(0);if((c[64916+(bk*688&-1)>>2]&2|0)==0){ag=(aA- +h[64664+(bk*688&-1)>>3])*+h[91]+ +h[96]+-1.0;ay=(bp+as- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;aI=(+h[7076]- +h[5279])*+h[2]+ +h[12]+-1.0;aW=+h[406]+ag*+h[394]+ay*+h[398]+aI*+h[402];af=aW==0.0?1.0e-5:aW;bq=(+h[403]+ag*+h[391]+ay*+h[395]+aI*+h[399])/af;br=(+h[404]+ag*+h[392]+ay*+h[396]+aI*+h[400])/af;bs=a[65072+(bk*688&-1)|0]|0}else{w=a[65072+(bk*688&-1)|0]|0;if((w&1)==0){bt=-0.0-bp}else{bt=bp}af=(aA- +h[64664+(bk*688&-1)>>3])*+h[91]+ +h[96]+-1.0;aI=(bt*.5- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;ay=(+h[7076]- +h[5279])*+h[2]+ +h[12]+-1.0;ag=+h[406]+af*+h[394]+aI*+h[398]+ay*+h[402];aW=ag==0.0?1.0e-5:ag;bq=(+h[403]+af*+h[391]+aI*+h[395]+ay*+h[399])/aW;br=(+h[404]+af*+h[392]+aI*+h[396]+ay*+h[400])/aW;bs=w}if((bs&1)==0){aW=+h[65056+(bk*688&-1)>>3];ay=+((c[W+24>>2]|0)>>>0>>>0);bu=bq- +h[695]*aW*ay;bv=br-ay*aW*+h[694]}else{bu=bq;bv=br}bw=bo;bx=~~(bu*+(c[180]|0))+(c[186]|0)|0;by=~~(bv*+(c[40]|0))+(c[46]|0)|0}}while(0);if((ac|0)==8145){al=(aA- +h[64664+(bk*688&-1)>>3])*+h[91]+ +h[96]+-1.0;aW=(bm- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;ay=(+h[7076]- +h[5279])*+h[2]+ +h[12]+-1.0;aI=+h[406]+al*+h[394]+aW*+h[398]+ay*+h[402];af=aI==0.0?1.0e-5:aI;aI=+h[694];ag=+((c[W+16>>2]|0)>>>0>>>0);aa=(+h[404]+al*+h[392]+aW*+h[396]+ay*+h[400])/af-aI*ag;if((a[65072+(bk*688&-1)|0]&1)==0){bz=aa- +h[65056+(bk*688&-1)>>3]*aI*+((c[W+24>>2]|0)>>>0>>>0)}else{bz=aa}bw=c[65132+(bk*688&-1)>>2]|0;bx=~~((+h[403]+al*+h[391]+aW*+h[395]+ay*+h[399])/af*+(c[180]|0))+(c[186]|0)|0;by=(~~(bz*+(c[40]|0))+(c[46]|0)|0)-~~(ag*1.5)|0}fx(65224+(bk*688&-1)|0,I,J,207600);w=(c[I>>2]|0)+bx|0;u=(c[J>>2]|0)+by|0;v=c[200]|0;aE=a[65264+(v*688&-1)|0]&1;do{if(aE<<24>>24==0){bA=v}else{if((a[37456]&1)!=0){bA=v;break}a[37456]=1;H=c[(c[3524]|0)+88>>2]|0;if((H|0)==0){bA=v;break}cO[H&255](179864);bA=c[200]|0}}while(0);a[37456]=aE;fn(65152+(bA*688&-1)|0,W);do{if((bw|0)==0){ac=8169}else{if((cO[c[(c[3524]|0)+72>>2]&255](bw)|0)==0){ac=8169;break}v=c[200]|0;ln(w,u,c[65140+(v*688&-1)>>2]|0,1,0,bw,c[65144+(v*688&-1)>>2]|0);v=c[(c[3524]|0)+72>>2]|0;cO[v&255](0)}}while(0);if((ac|0)==8169){aE=c[200]|0;ln(w,u,c[65140+(aE*688&-1)>>2]|0,1,0,0,c[65144+(aE*688&-1)>>2]|0)}if((c[65152+((c[200]|0)*688&-1)>>2]|0)!=0){cM[c[W+64>>2]&511](-2)}a[37456]=0}}while(0);bw=c[144]|0;bA=(c[64916+(bw*688&-1)>>2]|0)==0;if(bA){if((c[65140+(bw*688&-1)>>2]|0)!=0){ac=8175}}else{ac=8175}L11129:do{if((ac|0)==8175){by=c[200]|0;bz=+h[64664+(by*688&-1)>>3];bm=+h[69];bv=bz+ +h[64672+(by*688&-1)>>3]-bm;bu=+h[64664+(bw*688&-1)>>3];br=(+h[64672+(bw*688&-1)>>3]+bu)*.5;bq=+h[91];bt=+h[96];bp=(bm-bz)*bq+bt+-1.0;bm=(br-bu)*+h[21]+ +h[68]+-1.0;bu=(+h[7076]- +h[5279])*+h[2]+ +h[12]+-1.0;bn=+h[403];aA=+h[391];ag=bm*+h[395];af=bu*+h[399];ay=+h[404];aW=+h[392];al=bm*+h[396];aa=bu*+h[400];aI=+h[405];aC=+h[393];aP=bm*+h[397];aQ=bu*+h[401];aJ=+h[406];az=+h[394];aX=bm*+h[398];bm=bu*+h[402];bu=aJ+bp*az+aX+bm;ad=bu==0.0?1.0e-5:bu;bu=(bv-bz)*bq+bt+-1.0;bt=aJ+bu*az+aX+bm;bm=bt==0.0?1.0e-5:bt;bt=+(c[180]|0);h[695]=((bn+bu*aA+ag+af)/bm-(bn+bp*aA+ag+af)/ad)/bt;h[694]=((ay+bu*aW+al+aa)/bm-(ay+bp*aW+al+aa)/ad)/bt;h[693]=((aI+bu*aC+aP+aQ)/bm-(aI+bp*aC+aP+aQ)/ad)/bt;bt=+g[3538];if(bt>90.0|(e|0)==1){if(bt<=90.0|(e|0)==2|bA){bB=bw}else{ac=8178}}else{if(bA){bB=bw}else{ac=8178}}if((ac|0)==8178){de(1,12);bB=c[144]|0}if((c[65140+(bB*688&-1)>>2]|0)==0){break}bt=+g[3538];do{if(bt>90.0|(e|0)==2){if(bt>90.0){by=c[5094]|0;if((e|0)!=1|(by|0)!=0){bC=by;ac=8186;break}else{break L11129}}if((c[5094]|0)==0){break L11129}bD=+h[69];ac=8187}else{bC=c[5094]|0;ac=8186}}while(0);do{if((ac|0)==8186){bt=+h[69];if((bC|0)!=0){bD=bt;ac=8187;break}ad=(bv-bt)*.25;do{if((c[65084+(bB*688&-1)>>2]|0)==-3){aQ=+h[64664+(bB*688&-1)>>3];aP=(bt- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;aC=+h[21];bp=+h[68];aI=(aQ-aQ)*aC+bp+-1.0;bm=(+h[7076]- +h[5279])*+h[2]+ +h[12]+-1.0;bu=+h[403]+aP*+h[391];aa=+h[395];al=bm*+h[399];aW=+h[404]+aP*+h[392];ay=+h[396];af=bm*+h[400];ag=+h[406]+aP*+h[394];aP=+h[398];aA=bm*+h[402];bm=ag+aI*aP+aA;bn=bm==0.0?1.0e-5:bm;bm=+(c[180]|0);u=c[186]|0;aX=+(c[40]|0);w=c[46]|0;az=bp+aC*(+h[64672+(bB*688&-1)>>3]-aQ)+-1.0;aQ=aA+(ag+aP*az);aP=aQ==0.0?1.0e-5:aQ;aQ=+Y(+(+(~~(aX*((af+(aW+ay*az))/aP))+w|0)- +(~~((aW+aI*ay+af)/bn*aX)+w|0)),+(+(~~(bm*((al+(bu+aa*az))/aP))+u|0)- +(~~((bu+aI*aa+al)/bn*bm)+u|0)))/.017453292519943295;if(aQ>0.0){bE=aQ+.5}else{bE=aQ+-.5}u=~~+O(+bE);aQ=ad*.5;if(aQ<=0.0){bF=aQ;bG=u;break}bF=aQ;bG=u+180|0}else{bF=ad;bG=0}}while(0);if((c[64916+(bB*688&-1)>>2]&2|0)==0){u=c[200]|0;ad=(bt-bF- +h[64664+(u*688&-1)>>3])*+h[91]+ +h[96]+-1.0;as=(br- +h[64664+(bB*688&-1)>>3])*+h[21]+ +h[68]+-1.0;aQ=(+h[7076]- +h[5279])*+h[2]+ +h[12]+-1.0;bm=+h[406]+ad*+h[394]+as*+h[398]+aQ*+h[402];bn=bm==0.0?1.0e-5:bm;bH=(+h[403]+ad*+h[391]+as*+h[395]+aQ*+h[399])/bn;bI=(+h[404]+ad*+h[392]+as*+h[396]+aQ*+h[400])/bn;bJ=u;bK=a[65072+(u*688&-1)|0]|0}else{u=c[200]|0;w=a[65072+(u*688&-1)|0]|0;if((w&1)==0){bL=bF}else{bL=-0.0-bF}bn=(bL*.5- +h[64664+(u*688&-1)>>3])*+h[91]+ +h[96]+-1.0;aQ=(br- +h[64664+(bB*688&-1)>>3])*+h[21]+ +h[68]+-1.0;as=(+h[7076]- +h[5279])*+h[2]+ +h[12]+-1.0;ad=+h[406]+bn*+h[394]+aQ*+h[398]+as*+h[402];bm=ad==0.0?1.0e-5:ad;bH=(+h[403]+bn*+h[391]+aQ*+h[395]+as*+h[399])/bm;bI=(+h[404]+bn*+h[392]+aQ*+h[396]+as*+h[400])/bm;bJ=u;bK=w}if((bK&1)==0){bm=+h[65056+(bJ*688&-1)>>3];as=+((c[W+28>>2]|0)>>>0>>>0);bM=bH- +h[695]*bm*as;bN=bI-as*bm*+h[694]}else{bM=bH;bN=bI}bO=bG;bP=0;bQ=~~(bN*+(c[40]|0))+(c[46]|0)|0;bR=~~(bM*+(c[180]|0))+(c[186]|0)|0;bS=bB}}while(0);if((ac|0)==8187){w=c[200]|0;bv=+h[64664+(w*688&-1)>>3];bm=+h[91];as=+h[96];aQ=(bD-bv)*bm+as+-1.0;bn=+h[64664+(bB*688&-1)>>3];ad=+h[21];al=+h[68];aa=(br-bn)*ad+al+-1.0;aI=(+h[7076]- +h[5279])*+h[2]+ +h[12]+-1.0;bu=+h[403];aP=+h[391];az=+h[395];aX=aI*+h[399];af=+h[404];ay=+h[392];aW=+h[396];ag=aI*+h[400];aA=+h[406];aC=+h[394];bp=+h[398];aJ=aI*+h[402];aI=aA+aQ*aC+aa*bp+aJ;bq=aI==0.0?1.0e-5:aI;aI=(bu+aQ*aP+aa*az+aX)/bq;bz=(af+aQ*ay+aa*aW+ag)/bq;u=c[64916+(bB*688&-1)>>2]|0;do{if((u&2|0)==0){bT=aI;bU=bz}else{if((a[64788+(w*688&-1)|0]&1)!=0){bT=aI;bU=bz;break}bq=+h[64672+(w*688&-1)>>3];if(bv0.0|bq<0.0){bT=aI;bU=bz;break}}else{if(bq>0.0|bv<0.0){bT=aI;bU=bz;break}}bq=(0.0-bv)*bm+as+-1.0;aa=(bD-bn)*ad+al+-1.0;aQ=aA+bq*aC+aa*bp+aJ;aB=aQ==0.0?1.0e-5:aQ;bT=(bu+bq*aP+aa*az+aX)/aB;bU=(af+bq*ay+aa*aW+ag)/aB}}while(0);ag=+h[695];by=W+20|0;aW=bT-ag*+((c[by>>2]|0)>>>0>>>0);if((a[65072+(w*688&-1)|0]&1)==0){bV=aW- +h[65056+(w*688&-1)>>3]*ag*+((c[W+28>>2]|0)>>>0>>>0)}else{bV=aW}J=~~(bV*+(c[180]|0))+(c[186]|0)|0;bx=~~(bU*+(c[40]|0))+(c[46]|0)|0;c[216]=0;if((u&1|0)==0){bW=.5;bX=bB}else{c[216]=0;de(1,14);bW=+(c[216]|0)+.5;bX=c[144]|0}bO=c[65132+(bX*688&-1)>>2]|0;bP=2;bQ=bx;bR=J-~~(bW*+((c[by>>2]|0)>>>0>>>0))|0;bS=bX}fx(65224+(bS*688&-1)|0,K,L,207600);by=(c[K>>2]|0)+bR|0;J=(c[L>>2]|0)+bQ|0;bx=c[144]|0;I=a[65264+(bx*688&-1)|0]&1;do{if(I<<24>>24==0){bY=bx}else{if((a[37456]&1)!=0){bY=bx;break}a[37456]=1;bk=c[(c[3524]|0)+88>>2]|0;if((bk|0)==0){bY=bx;break}cO[bk&255](179864);bY=c[144]|0}}while(0);a[37456]=I;fn(65152+(bY*688&-1)|0,W);do{if((bO|0)==0){ac=8219}else{if((cO[c[(c[3524]|0)+72>>2]&255](bO)|0)==0){ac=8219;break}bx=c[144]|0;ln(by,J,c[65140+(bx*688&-1)>>2]|0,1,bP,bO,c[65144+(bx*688&-1)>>2]|0);bx=c[(c[3524]|0)+72>>2]|0;cO[bx&255](0)}}while(0);if((ac|0)==8219){I=c[144]|0;ln(by,J,c[65140+(I*688&-1)>>2]|0,1,bP,0,c[65144+(I*688&-1)>>2]|0)}if((c[65152+((c[144]|0)*688&-1)>>2]|0)!=0){cM[c[W+64>>2]&511](-2)}a[37456]=0}}while(0);L11198:do{if((c[64916+((c[34]|0)*688&-1)>>2]|0)!=0){if(!((e|0)!=1&(c[5094]|0)==0)){break}do{if((a[46752]&1)==0){if((c[11690]&2|0)!=0){break}if((a8(30632,115)|0)==0){break L11198}}}while(0);de(0,6)}}while(0);e=c[144]|0;L11206:do{if((c[65284+(e*688&-1)>>2]|0)>-3){J=c[200]|0;if((a[64788+(J*688&-1)|0]&1)!=0){break}bW=+h[64664+(J*688&-1)>>3];bU=+h[64672+(J*688&-1)>>3];if(bW0.0|bU<0.0){break}}else{if(bU>0.0|bW<0.0){break}}bU=+h[64664+(e*688&-1)>>3];bV=+h[7076];bT=(0.0-bW)*+h[91]+ +h[96]+-1.0;bW=+h[21];bD=+h[68];bM=(bU-bU)*bW+bD+-1.0;bN=(bV- +h[5279])*+h[2]+ +h[12]+-1.0;bI=+h[403]+bT*+h[391];bH=+h[395];bL=bN*+h[399];bF=+h[404]+bT*+h[392];bE=+h[396];aW=bN*+h[400];ag=+h[405]+bT*+h[393];ay=+h[397];af=bN*+h[401];aX=+h[406]+bT*+h[394];bT=+h[398];az=bN*+h[402];bN=aX+bM*bT+az;aP=bN==0.0?1.0e-5:bN;h[M>>3]=(bI+bM*bH+bL)/aP;h[M+8>>3]=(bF+bM*bE+aW)/aP;h[M+16>>3]=(ag+bM*ay+af)/aP;h[M+32>>3]=bV;c[M+40>>2]=0;aP=(+h[64672+(e*688&-1)>>3]-bU)*bW+bD+-1.0;bD=aX+aP*bT+az;az=bD==0.0?1.0e-5:bD;h[N>>3]=(bI+aP*bH+bL)/az;h[N+8>>3]=(bF+aP*bE+aW)/az;h[N+16>>3]=(ag+aP*ay+af)/az;h[N+32>>3]=bV;c[N+40>>2]=0;J=65280+(e*688&-1)|0;do{if((a[38984]&1)!=0){if((a[46752]&1)==0){break}gt(M,N,J);break L11206}}while(0);un(M,N,J,65320+(e*688&-1)|0)}}while(0);e=c[34]|0;L11218:do{if((c[65284+(e*688&-1)>>2]|0)>-3){N=c[200]|0;if((a[64788+(N*688&-1)|0]&1)!=0){break}bV=+h[64664+(N*688&-1)>>3];az=+h[64672+(N*688&-1)>>3];if(bV0.0|az<0.0){break}}else{if(az>0.0|bV<0.0){break}}az=+h[64664+(e*688&-1)>>3];af=(0.0-bV)*+h[91]+ +h[96]+-1.0;bV=(0.0- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;ay=+h[5279];aP=+h[2];ag=+h[12];aW=(az-ay)*aP+ag+-1.0;bE=+h[403]+af*+h[391]+bV*+h[395];bF=+h[399];bL=+h[404]+af*+h[392]+bV*+h[396];bH=+h[400];bI=+h[405]+af*+h[393]+bV*+h[397];bD=+h[401];bT=+h[406]+af*+h[394]+bV*+h[398];bV=+h[402];af=bT+aW*bV;aX=af==0.0?1.0e-5:af;h[Q>>3]=(bE+aW*bF)/aX;h[Q+8>>3]=(bL+aW*bH)/aX;h[Q+16>>3]=(bI+aW*bD)/aX;h[Q+32>>3]=az;c[Q+40>>2]=0;az=+h[64672+(e*688&-1)>>3];aX=(az-ay)*aP+ag+-1.0;ag=bT+aX*bV;bV=ag==0.0?1.0e-5:ag;h[R>>3]=(bE+aX*bF)/bV;h[R+8>>3]=(bL+aX*bH)/bV;h[R+16>>3]=(bI+aX*bD)/bV;h[R+32>>3]=az;c[R+40>>2]=0;N=65280+(e*688&-1)|0;do{if((a[38984]&1)!=0){if((a[46752]&1)==0){break}gt(Q,R,N);break L11218}}while(0);un(Q,R,N,65320+(e*688&-1)|0)}}while(0);e=c[200]|0;R=c[65284+(e*688&-1)>>2]|0;L11230:do{if((R|0)>-3){Q=c[144]|0;if((a[64788+(Q*688&-1)|0]&1)!=0){break}az=+h[64664+(Q*688&-1)>>3];bV=+h[64672+(Q*688&-1)>>3];if(az0.0|bV<0.0){break}}else{if(bV>0.0|az<0.0){break}}Q=k;J=65320+(e*688&-1)|0;c[Q>>2]=c[J>>2];c[Q+4>>2]=c[J+4>>2];c[Q+8>>2]=c[J+8>>2];c[Q+12>>2]=c[J+12>>2];do{if((c[65280+(e*688&-1)>>2]|0)!=0){az=+h[65304+(e*688&-1)>>3];J=c[(c[3524]|0)+92>>2]|0;if(az<0.0){cK[J&63](+h[3817]);break}else{cK[J&63](az);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[65296+(e*688&-1)>>3]);N=c[(c[3524]|0)+64>>2]|0;if((R|0)<-5){cM[N&511](-2)}else{cM[N&511](R)}N=c[3524]|0;do{if((a[65312+(e*688&-1)|0]&1)==0){if((c[N+96>>2]&1024|0)!=0){break}c[k>>2]=1;c[k+4>>2]=R;ac=8262}else{ac=8262}}while(0);if((ac|0)==8262){fn(k,N)}J=c[200]|0;az=+h[64664+(J*688&-1)>>3];bV=+h[7076];bD=+h[91];aX=+h[96];bI=(az-az)*bD+aX+-1.0;bH=(0.0- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;bL=(bV- +h[5279])*+h[2]+ +h[12]+-1.0;bF=+h[403];bE=+h[391];ag=bH*+h[395];bT=bL*+h[399];aP=+h[404];ay=+h[392];aW=bH*+h[396];af=bL*+h[400];bW=+h[405];bU=+h[393];bM=bH*+h[397];bN=bL*+h[401];bu=+h[406];aJ=+h[394];bp=bH*+h[398];bH=bL*+h[402];bL=bu+bI*aJ+bp+bH;aC=bL==0.0?1.0e-5:bL;h[S>>3]=(bF+bI*bE+ag+bT)/aC;h[S+8>>3]=(aP+bI*ay+aW+af)/aC;h[S+16>>3]=(bW+bI*bU+bM+bN)/aC;h[S+32>>3]=bV;c[S+40>>2]=0;aC=(+h[64672+(J*688&-1)>>3]-az)*bD+aX+-1.0;aX=bu+aC*aJ+bp+bH;bH=aX==0.0?1.0e-5:aX;h[T>>3]=(bF+aC*bE+ag+bT)/bH;h[T+8>>3]=(aP+aC*ay+aW+af)/bH;h[T+16>>3]=(bW+aC*bU+bM+bN)/bH;h[T+32>>3]=bV;c[T+40>>2]=0;Q=65280+(J*688&-1)|0;do{if((a[38984]&1)!=0){if((a[46752]&1)==0){break}gt(S,T,Q);break L11230}}while(0);un(S,T,Q,65320+(J*688&-1)|0)}}while(0);T=c[34]|0;S=c[5094]|0;if((c[65140+(T*688&-1)>>2]|0)!=0&(S|0)==0){do{if((a[46752]&1)==0){if((c[11690]&2|0)!=0){break}if((cy(30632,213264)|0)!=0){break}i=j;return}}while(0);bV=(+h[64672+(T*688&-1)>>3]+ +h[64664+(T*688&-1)>>3])*.5;if((c[64916+(T*688&-1)>>2]&2|0)==0){bH=(+h[14]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;bN=(+h[13]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;bM=(bV- +h[5279])*+h[2]+ +h[12]+-1.0;bU=+h[406]+bH*+h[394]+bN*+h[398]+bM*+h[402];aC=bU==0.0?1.0e-5:bU;bZ=1;b_=(~~((+h[403]+bH*+h[391]+bN*+h[395]+bM*+h[399])/aC*+(c[180]|0))+(c[186]|0)|0)+((c[W+20>>2]|0)*-7&-1)|0;b$=~~((+h[404]+bH*+h[392]+bN*+h[396]+bM*+h[400])/aC*+(c[40]|0))+(c[46]|0)|0}else{aC=(0.0- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;bM=(0.0- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;bN=(bV- +h[5279])*+h[2]+ +h[12]+-1.0;bV=+h[406]+aC*+h[394]+bM*+h[398]+bN*+h[402];bH=bV==0.0?1.0e-5:bV;bZ=2;b_=(~~((+h[403]+aC*+h[391]+bM*+h[395]+bN*+h[399])/bH*+(c[180]|0))+(c[186]|0)|0)+((c[W+20>>2]|0)*-5&-1)|0;b$=~~((+h[404]+aC*+h[392]+bM*+h[396]+bN*+h[400])/bH*+(c[40]|0))+(c[46]|0)|0}fx(65224+(T*688&-1)|0,U,V,207600);T=(c[U>>2]|0)+b_|0;b_=(c[V>>2]|0)+b$|0;b$=c[34]|0;V=a[65264+(b$*688&-1)|0]&1;do{if(V<<24>>24==0){b0=b$}else{if((a[37456]&1)!=0){b0=b$;break}a[37456]=1;U=c[(c[3524]|0)+88>>2]|0;if((U|0)==0){b0=b$;break}cO[U&255](179864);b0=c[34]|0}}while(0);a[37456]=V;fn(65152+(b0*688&-1)|0,W);b0=c[34]|0;V=65132+(b0*688&-1)|0;if((c[65084+(b0*688&-1)>>2]|0)==-3){c[V>>2]=-270;b1=-270;ac=8281}else{b$=c[V>>2]|0;if((b$|0)==0){b2=b0;ac=8283}else{b1=b$;ac=8281}}do{if((ac|0)==8281){b$=(cO[c[(c[3524]|0)+72>>2]&255](b1)|0)==0;b0=c[34]|0;if(b$){b2=b0;ac=8283;break}ln(T,b_,c[65140+(b0*688&-1)>>2]|0,bZ,0,c[65132+(b0*688&-1)>>2]|0,c[65144+(b0*688&-1)>>2]|0);b0=c[(c[3524]|0)+72>>2]|0;cO[b0&255](0)}}while(0);if((ac|0)==8283){ln(T,b_,c[65140+(b2*688&-1)>>2]|0,bZ,0,0,c[65144+(b2*688&-1)>>2]|0)}if((c[65152+((c[34]|0)*688&-1)>>2]|0)!=0){cM[c[W+64>>2]&511](-2)}a[37456]=0;b3=c[5094]|0}else{b3=S}if((b3|0)==0){i=j;return}c[13542]=X;i=j;return}function fx(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0.0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0.0,v=0.0;f=i;i=i+24|0;g=f|0;j=f+8|0;k=f+16|0;h[g>>3]=+h[a+16>>3];h[j>>3]=+h[a+24>>3];h[k>>3]=+h[a+32>>3];l=(fM(a,e,g,j,k)|0)==0;m=+h[g>>3];if(!l){c[b>>2]=~~m;n=~~+h[j>>3];c[d>>2]=n;i=f;return}o=(m- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;m=(+h[j>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;p=(+h[k>>3]- +h[5279])*+h[2]+ +h[12]+-1.0;q=+h[406]+o*+h[394]+m*+h[398]+p*+h[402];r=q==0.0?1.0e-5:q;l=~~((+h[404]+o*+h[392]+m*+h[396]+p*+h[400])/r*+(c[40]|0))+(c[46]|0)|0;c[b>>2]=~~((+h[403]+o*+h[391]+m*+h[395]+p*+h[399])/r*+(c[180]|0))+(c[186]|0);c[d>>2]=l;if((c[a>>2]|0)==2){s=+h[64664+((c[200]|0)*688&-1)>>3]}else{s=0.0}h[g>>3]=s;g=(c[5094]|0)!=0;do{if((c[a+4>>2]|0)==2){l=c[144]|0;if(g){t=64672+(l*688&-1)|0}else{t=64664+(l*688&-1)|0}u=+h[t>>3]}else{if(!g){u=0.0;break}u=+h[64672+((c[144]|0)*688&-1)>>3]}}while(0);h[j>>3]=u;if((c[a+8>>2]|0)==2){v=+h[64664+((c[34]|0)*688&-1)>>3]}else{v=0.0}h[k>>3]=v;r=(s- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;s=(u- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;u=(v- +h[5279])*+h[2]+ +h[12]+-1.0;v=+h[406]+r*+h[394]+s*+h[398]+u*+h[402];p=v==0.0?1.0e-5:v;k=~~((+h[404]+r*+h[392]+s*+h[396]+u*+h[400])/p*+(c[40]|0));a=c[46]|0;c[b>>2]=(c[b>>2]|0)-(~~((+h[403]+r*+h[391]+s*+h[395]+u*+h[399])/p*+(c[180]|0))+(c[186]|0)|0);n=(c[d>>2]|0)-(k+a|0)|0;c[d>>2]=n;i=f;return}function fy(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0.0,I=0;d=i;i=i+120|0;e=d|0;f=d+8|0;g=d+16|0;j=d+56|0;k=d+72|0;l=d+80|0;m=d+88|0;n=d+96|0;o=d+104|0;p=d+112|0;q=c[13542]|0;c[13542]=(c[(c[3524]|0)+96>>2]&128|0)==0?55520:0;r=c[10826]|0;if((r|0)==0){c[13542]=q;i=d;return}s=j;t=j|0;u=j+4|0;v=g;w=g+4|0;x=g+8|0;y=g+16|0;z=g|0;A=r;do{if((c[A+100>>2]|0)==(b|0)){fK(A+8|0,m,n,123984);r=~~+h[m>>3];B=~~+h[n>>3];C=A+48|0;if((a[A+88|0]&1)==0){fK(C,k,l,123984);D=~~+h[k>>3];c[o>>2]=D;E=~~+h[l>>3];c[p>>2]=E;F=D;G=E}else{fx(C,o,p,123984);C=(c[o>>2]|0)+r|0;c[o>>2]=C;E=(c[p>>2]|0)+B|0;c[p>>2]=E;F=C;G=E}E=A+144|0;c[s>>2]=c[E>>2];c[s+4>>2]=c[E+4>>2];c[s+8>>2]=c[E+8>>2];c[s+12>>2]=c[E+12>>2];E=c[A+108>>2]|0;do{if((c[A+104>>2]|0)!=0){H=+h[A+128>>3];C=c[(c[3524]|0)+92>>2]|0;if(H<0.0){cK[C&63](+h[3817]);break}else{cK[C&63](H);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[A+120>>3]);C=c[(c[3524]|0)+64>>2]|0;if((E|0)<-5){cM[C&511](-2)}else{cM[C&511](E)}C=c[3524]|0;do{if((a[A+136|0]&1)==0){if((c[C+96>>2]&1024|0)!=0){break}c[t>>2]=1;c[u>>2]=E;I=8328}else{I=8328}}while(0);if((I|0)==8328){I=0;fn(j,C)}E=c[200]|0;h[64776+(E*688&-1)>>3]=+((c[7939]|0)-(c[7938]|0)|0)/(+h[64672+(E*688&-1)>>3]- +h[64664+(E*688&-1)>>3]);c[12912]=c[A+200>>2];c[12910]=0;H=+h[A+168>>3];if(H>0.0){uE(v|0,0,40);c[w>>2]=2;c[x>>2]=2;h[y>>3]=H;c[z>>2]=c[A+176>>2];fN(g,e,f,123984);h[6458]=+h[A+184>>3];h[6457]=+h[A+192>>3];c[12910]=~~+h[e>>3]}fm(r,B,F,G,c[A+160>>2]|0)}A=c[A>>2]|0;}while((A|0)!=0);c[13542]=q;i=d;return}function fz(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;cM[c[(c[3524]|0)+168>>2]&511](8);e=c[(c[3524]|0)+76>>2]|0;do{if((c[9046]|0)!=0|(c[9031]|0)==3){if((cO[e&255](2)|0)==0){f=(c[8986]|0)+a|0;g=c[(c[3524]|0)+20>>2]|0;h=f-aa(lp(d)|0,g)|0;cR[c[(c[3524]|0)+68>>2]&127](h,b,d);break}else{cR[c[(c[3524]|0)+68>>2]&127]((c[8986]|0)+a|0,b,d);break}}else{cO[e&255](0);cR[c[(c[3524]|0)+68>>2]&127]((c[8990]|0)+a|0,b,d)}}while(0);cM[c[(c[3524]|0)+168>>2]&511](9);return}function fA(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0.0,y=0.0,z=0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0,U=0.0,V=0,W=0,X=0;f=i;i=i+96|0;g=f|0;j=f+8|0;k=f+16|0;l=f+24|0;m=f+32|0;n=f+48|0;o=f+64|0;p=f+72|0;q=f+80|0;r=f+88|0;s=c[9006]|0;t=c[9010]|0;u=s-t|0;v=(u|0)>-1?u:-u|0;w=(v|0)>24?24:v;v=s+d|0;x=+(w|0);y=+(u|0)/x;u=t+d|0;t=b+64|0;s=c[t>>2]|0;if((s|0)==1){z=8345}else if((s|0)==3){if(+h[b+72>>3]>=0.0){z=8345}}else if((s|0)==2){if((c[b+28>>2]|0)!=-6){z=8345}}if((z|0)==8345){fn(t,c[3524]|0);t=c[13542]|0;z=c[3524]|0;c[13542]=(c[z+96>>2]&128|0)==0?55520:0;cM[c[z+168>>2]&511](8);z=(c[9006]|0)+d|0;c[o>>2]=(c[9010]|0)+d;c[p>>2]=e;c[q>>2]=z;c[r>>2]=e;z=c[3524]|0;if((fl(o,p,q,r)|0)!=0){cN[c[z+56>>2]&255](c[o>>2]|0,c[p>>2]|0);cN[c[z+60>>2]&255](c[q>>2]|0,c[r>>2]|0)}cM[c[(c[3524]|0)+168>>2]&511](9);c[13542]=t;i=f;return}t=(a[b+239|0]&1)==0;r=c[b+260>>2]|0;if((r|0)==0){i=f;return}q=c[b+252>>2]|0;b=0;z=r;A=-8.988465674311579e+307;B=-8.988465674311579e+307;C=8.988465674311579e+307;while(1){if((b|0)>=(q|0)){D=B;E=C;break}r=c[z+12>>2]|0;p=c[z+8>>2]|0;if((p|0)>0){o=0;F=A;G=B;H=C;while(1){do{if((c[r+(o<<6)>>2]|0)==0){if(t){I=r+(o<<6)+24|0}else{I=r+(o<<6)+32|0}J=+h[I>>3];d=J>2]|0;if((o|0)==0){D=Q;E=R;break}else{b=b+1|0;z=o;A=P;B=Q;C=R}}if(E>D){i=f;return}R=+h[8341];C=E>R?E:R;E=+h[8342];Q=D>24==112&1|0);T=z;break}D=(C-R)/(E-R);z=a[20668]|0;if(z<<24>>24==112){S=D;T=112;break}S=1.0-D;T=z}else{z=a[20668]|0;S=+(z<<24>>24!=112&1|0);T=z}}while(0);do{if(R>24==112&1|0);break}C=(Q-R)/(E-R);if(T<<24>>24==112){U=C;break}U=1.0-C}else{U=+(T<<24>>24!=112&1|0)}}while(0);R=(U-S)/x;if((c[9031]|0)==3){c[8490]=u;c[8488]=e}else{cN[c[(c[3524]|0)+56>>2]&255](u,e)}if((w|0)<1){i=f;return}T=m|0;z=m+8|0;b=m+4|0;I=n|0;t=n+8|0;q=n+4|0;o=u;p=1;while(1){if((p|0)==(w|0)){r=c[3524]|0;d=r+144|0;if((c[d>>2]|0)==0){V=r}else{c[T>>2]=5;h[z>>3]=U;c[b>>2]=0;cM[c[d>>2]&511](m);V=c[3524]|0}cN[c[V+56>>2]&255](o,e);W=v}else{x=+(p|0);d=c[3524]|0;r=d+144|0;if((c[r>>2]|0)==0){X=d}else{c[I>>2]=5;h[t>>3]=S+R*x;c[q>>2]=0;cM[c[r>>2]&511](n);X=c[3524]|0}cN[c[X+56>>2]&255](o,e);W=~~(y*x+.5)+u|0}if((c[9031]|0)==3){r=c[8488]|0;c[g>>2]=c[8490];c[j>>2]=r;c[k>>2]=W;c[l>>2]=e;r=c[3524]|0;if((fl(g,j,k,l)|0)!=0){cN[c[r+56>>2]&255](c[g>>2]|0,c[j>>2]|0);cN[c[r+60>>2]&255](c[k>>2]|0,c[l>>2]|0)}c[8490]=W;c[8488]=e}else{cN[c[(c[3524]|0)+60>>2]&255](W,e)}r=p+1|0;if((r|0)>(w|0)){break}else{o=W;p=r}}i=f;return}function fB(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0,at=0.0,au=0.0,av=0.0,aw=0.0,ax=0.0,ay=0.0,az=0,aA=0,aB=0,aC=0,aD=0,aE=0,aF=0.0,aG=0.0,aH=0.0,aI=0.0,aJ=0.0,aK=0.0,aL=0.0,aM=0,aN=0,aO=0,aP=0.0,aQ=0.0,aR=0.0,aS=0.0,aT=0.0,aU=0.0,aV=0.0,aW=0.0,aX=0.0,aY=0.0,aZ=0.0,a_=0,a$=0,a0=0,a1=0,a2=0.0,a3=0.0,a4=0.0,a5=0.0,a6=0.0,a7=0.0,a8=0.0,a9=0.0,ba=0.0,bb=0.0,bc=0.0,bd=0,be=0.0,bf=0.0,bg=0.0,bh=0.0,bi=0.0,bj=0.0,bk=0.0,bl=0.0,bm=0.0,bn=0.0,bo=0.0,bp=0.0,bq=0.0,br=0.0,bs=0.0,bt=0.0,bu=0.0,bv=0.0,bw=0.0,bx=0.0,by=0.0,bz=0.0,bA=0.0,bB=0.0,bC=0.0,bD=0.0,bE=0.0,bF=0.0,bG=0.0,bH=0.0,bI=0.0,bJ=0.0,bK=0,bL=0,bM=0;d=i;i=i+208|0;e=d|0;f=d+8|0;g=d+16|0;j=d+24|0;k=d+32|0;l=d+48|0;m=d+56|0;n=d+64|0;o=d+72|0;p=d+80|0;q=d+96|0;r=d+104|0;s=d+112|0;t=d+120|0;u=d+128|0;w=d+144|0;x=d+152|0;y=d+160|0;z=d+168|0;A=d+176|0;B=d+192|0;C=d+200|0;D=C;E=i;i=i+8|0;F=E;G=i;i=i+8|0;H=i;i=i+8|0;I=i;i=i+8|0;J=i;i=i+16|0;K=i;i=i+16|0;L=i;i=i+16|0;c[C>>2]=0;c[C+4>>2]=0;c[E>>2]=0;c[E+4>>2]=0;M=a[b+239|0]|0;N=b+64|0;O=c[N>>2]|0;if((O|0)==3){fn(N,c[3524]|0);fC(b);i=d;return}else if((O|0)==2){fC(b);i=d;return}else{do{if((c[b+244>>2]|0)!=0){if((a[38984]&1)==0){break}i=d;return}}while(0);O=B|0;N=B+4|0;P=F+4|0;Q=D+4|0;R=b+260|0;S=b+252|0;i4(c[R>>2]|0,c[S>>2]|0,O,C);C=c[S>>2]|0;c[E>>2]=C;E=c[R>>2]|0;if((C|0)>0){R=0;S=E;while(1){b=R+1|0;T=c[S>>2]|0;if((b|0)<(C|0)){R=b;S=T}else{U=T;break}}}else{U=E}do{if((U|0)==0){V=8408}else{E=U;S=0;do{S=S+1|0;E=c[E>>2]|0;}while((E|0)!=0);if((S|0)<=0){V=8408;break}c[P>>2]=S;i4(U,S,N,Q)}}while(0);if((V|0)==8408){c[N>>2]=0}Q=(M&1)==0;M=A|0;U=A+8|0;P=A+4|0;E=u|0;R=u+8|0;C=u+4|0;T=p|0;b=p+8|0;W=p+4|0;X=J|0;Y=K|0;$=L|0;aa=J+8|0;J=K+8|0;K=L+8|0;L=k|0;ab=k+8|0;ac=k+4|0;ad=0;L11450:do{ae=(c[D+(ad<<2)>>2]|0)==0;af=ae?1:-1;ag=c[F+(ad<<2)>>2]|0;L11452:do{if((ag|0)>0){ah=c[B+(ad<<2)>>2]|0;ai=(ah|0)==0;aj=0;ak=0;do{if(ai){break L11452}al=c[ah+(aj<<2)>>2]|0;am=c[al+8>>2]|0;ak=ae?ak:am-1|0;an=c[al+12>>2]|0;ao=al+8|0;if((am|0)>0){am=2;al=0;ap=ak;while(1){aq=an+(ap<<6)|0;ar=c[aq>>2]|0;do{if((ar|0)==0){as=an+(ap<<6)+24|0;at=+h[as>>3];au=(+h[an+(ap<<6)+8>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;av=(+h[an+(ap<<6)+16>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;aw=(at- +h[5279])*+h[2]+ +h[12]+-1.0;ax=+h[406]+au*+h[394]+av*+h[398]+aw*+h[402];ay=ax==0.0?1.0e-5:ax;az=~~((+h[403]+au*+h[391]+av*+h[395]+aw*+h[399])/ay*+(c[180]|0))+(c[186]|0)|0;aA=~~((+h[404]+au*+h[392]+av*+h[396]+aw*+h[400])/ay*+(c[40]|0))+(c[46]|0)|0;if((am|0)==0){aB=ap-af|0;if(Q){ay=+h[an+(aB<<6)+24>>3];aC=c[34]|0;aD=(a[64788+(aC*688&-1)|0]&1)==0;aE=(a[66852]&1)==0;do{if(aD){if(aE){aF=at;aG=ay;break}if(ay>0.0){aw=+_(+ay);aH=aw/+h[8358];V=8428;break}else{aI=+h[8341];V=8427;break}}else{if(aE){aI=+Z(+(ay*+h[64800+(aC*688&-1)>>3]));V=8427;break}if(+h[64792+(aC*688&-1)>>3]==+h[8357]){aJ=ay;V=8434;break}aJ=ay*+h[64800+(aC*688&-1)>>3]/+h[8358];V=8434}}while(0);do{if((V|0)==8427){V=0;if(aD){aH=aI;V=8428;break}if(!aE){aJ=aI;V=8434;break}aF=+Z(+(at*+h[64800+(aC*688&-1)>>3]));aG=aI}}while(0);do{if((V|0)==8428){V=0;if(aE){aF=at;aG=aH;break}if(at>0.0){ay=+_(+at);aF=ay/+h[8358];aG=aH;break}else{aF=+h[8341];aG=aH;break}}else if((V|0)==8434){V=0;if(+h[64792+(aC*688&-1)>>3]==+h[8357]){aF=at;aG=aJ;break}aF=at*+h[64800+(aC*688&-1)>>3]/+h[8358];aG=aJ}}while(0);aK=aG+aF}else{aK=+h[an+(aB<<6)+32>>3]+ +h[an+(ap<<6)+32>>3]}at=aK*.5;ay=+h[8341];do{if(ay>2]|0)==0){aM=aB}else{c[M>>2]=5;h[U>>3]=aL;c[P>>2]=0;cM[c[aC>>2]&511](A);aM=c[3524]|0}aC=c[8488]|0;c[w>>2]=c[8490];c[x>>2]=aC;c[y>>2]=az;c[z>>2]=aA;if((fl(w,x,y,z)|0)!=0){cN[c[aM+56>>2]&255](c[w>>2]|0,c[x>>2]|0);cN[c[aM+60>>2]&255](c[y>>2]|0,c[z>>2]|0)}c[8490]=az;c[8488]=aA;break}else if((am|0)==1){if((a[54160]&1)==0){c[8490]=az;c[8488]=aA;break}aC=ap-af|0;ul(an,aC,ap,G,H,I);ay=(+h[G>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;at=(+h[H>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;av=(+h[I>>3]- +h[5279])*+h[2]+ +h[12]+-1.0;aw=+h[406]+ay*+h[394]+at*+h[398]+av*+h[402];au=aw==0.0?1.0e-5:aw;aB=~~((+h[403]+ay*+h[391]+at*+h[395]+av*+h[399])/au*+(c[180]|0))+(c[186]|0)|0;aE=~~((+h[404]+ay*+h[392]+at*+h[396]+av*+h[400])/au*+(c[40]|0))+(c[46]|0)|0;c[8490]=aB;c[8488]=aE;if(Q){au=+h[an+(aC<<6)+24>>3];aD=c[34]|0;aN=(a[64788+(aD*688&-1)|0]&1)==0;aO=(a[66852]&1)==0;L11513:do{if(aN){do{if(aO){aP=au}else{if(au>0.0){av=+_(+au);aP=av/+h[8358];break}else{aQ=+h[8341];V=8463;break L11513}}}while(0);aR=aP;aS=+h[as>>3];V=8464}else{if(aO){aQ=+Z(+(au*+h[64800+(aD*688&-1)>>3]));V=8463;break}if(+h[64792+(aD*688&-1)>>3]==+h[8357]){aT=au}else{aT=au*+h[64800+(aD*688&-1)>>3]/+h[8358]}aU=aT;aV=+h[as>>3];V=8465}}while(0);if((V|0)==8463){V=0;au=+h[as>>3];if(aN){aR=aQ;aS=au;V=8464}else{aU=aQ;aV=au;V=8465}}do{if((V|0)==8464){V=0;if(aO){aW=aS;aX=aR;break}if(aS>0.0){au=+_(+aS);aW=au/+h[8358];aX=aR;break}else{aW=+h[8341];aX=aR;break}}else if((V|0)==8465){V=0;if(aO){aW=+Z(+(aV*+h[64800+(aD*688&-1)>>3]));aX=aU;break}if(+h[64792+(aD*688&-1)>>3]==+h[8357]){aW=aV;aX=aU;break}aW=aV*+h[64800+(aD*688&-1)>>3]/+h[8358];aX=aU}}while(0);aY=aX+aW}else{aY=+h[an+(aC<<6)+32>>3]+ +h[an+(ap<<6)+32>>3]}au=aY*.5;av=+h[8341];do{if(av>2]|0)==0){a_=aB;a$=aE;a0=aC}else{c[E>>2]=5;h[R>>3]=aZ;c[C>>2]=0;cM[c[aD>>2]&511](u);a_=c[8490]|0;a$=c[8488]|0;a0=c[3524]|0}c[q>>2]=a_;c[r>>2]=a$;c[s>>2]=az;c[t>>2]=aA;if((fl(q,r,s,t)|0)!=0){cN[c[a0+56>>2]&255](c[q>>2]|0,c[r>>2]|0);cN[c[a0+60>>2]&255](c[s>>2]|0,c[t>>2]|0)}c[8490]=az;c[8488]=aA;break}else{c[8490]=az;c[8488]=aA;break}}else if((ar|0)==1){if((am|0)==0){if((a[54160]&1)==0){break}aD=ap-af|0;ul(an,aD,ap,G,H,I);av=(+h[G>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;au=(+h[H>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;ay=(+h[I>>3]- +h[5279])*+h[2]+ +h[12]+-1.0;at=+h[406]+av*+h[394]+au*+h[398]+ay*+h[402];aw=at==0.0?1.0e-5:at;aC=~~((+h[403]+av*+h[391]+au*+h[395]+ay*+h[399])/aw*+(c[180]|0))+(c[186]|0)|0;aO=~~((+h[404]+av*+h[392]+au*+h[396]+ay*+h[400])/aw*+(c[40]|0))+(c[46]|0)|0;if(Q){aw=+h[an+(aD<<6)+24>>3];aN=c[34]|0;as=(a[64788+(aN*688&-1)|0]&1)==0;a1=(a[66852]&1)==0;L11565:do{if(as){do{if(a1){a2=aw}else{if(aw>0.0){ay=+_(+aw);a2=ay/+h[8358];break}else{a3=+h[8341];V=8500;break L11565}}}while(0);a4=a2;a5=+h[an+(ap<<6)+24>>3];V=8501}else{if(a1){a3=+Z(+(aw*+h[64800+(aN*688&-1)>>3]));V=8500;break}if(+h[64792+(aN*688&-1)>>3]==+h[8357]){a6=aw}else{a6=aw*+h[64800+(aN*688&-1)>>3]/+h[8358]}a7=a6;a8=+h[an+(ap<<6)+24>>3];V=8502}}while(0);if((V|0)==8500){V=0;aw=+h[an+(ap<<6)+24>>3];if(as){a4=a3;a5=aw;V=8501}else{a7=a3;a8=aw;V=8502}}do{if((V|0)==8501){V=0;if(a1){a9=a5;ba=a4;break}if(a5>0.0){aw=+_(+a5);a9=aw/+h[8358];ba=a4;break}else{a9=+h[8341];ba=a4;break}}else if((V|0)==8502){V=0;if(a1){a9=+Z(+(a8*+h[64800+(aN*688&-1)>>3]));ba=a7;break}if(+h[64792+(aN*688&-1)>>3]==+h[8357]){a9=a8;ba=a7;break}a9=a8*+h[64800+(aN*688&-1)>>3]/+h[8358];ba=a7}}while(0);bb=ba+a9}else{bb=+h[an+(aD<<6)+32>>3]+ +h[an+(ap<<6)+32>>3]}aw=bb*.5;ay=+h[8341];do{if(ay>2]|0)==0){bd=aD}else{c[T>>2]=5;h[b>>3]=bc;c[W>>2]=0;cM[c[aN>>2]&511](p);bd=c[3524]|0}aN=c[8488]|0;c[l>>2]=c[8490];c[m>>2]=aN;c[n>>2]=aC;c[o>>2]=aO;if((fl(l,m,n,o)|0)!=0){cN[c[bd+56>>2]&255](c[l>>2]|0,c[m>>2]|0);cN[c[bd+60>>2]&255](c[n>>2]|0,c[o>>2]|0)}c[8490]=aC;c[8488]=aO;break}else if((am|0)!=1){break}if((a[54152]&1)==0){break}aN=ap-af|0;if(!(um(an,aN,ap,X,Y,$)|0)){break}ay=+h[64664+((c[200]|0)*688&-1)>>3];aw=+h[91];av=+h[96];au=(+h[X>>3]-ay)*aw+av+-1.0;at=+h[64664+((c[144]|0)*688&-1)>>3];ax=+h[21];be=+h[68];bf=(+h[Y>>3]-at)*ax+be+-1.0;bg=+h[5279];bh=+h[2];bi=+h[12];bj=(+h[$>>3]-bg)*bh+bi+-1.0;bk=+h[403];bl=+h[391];bm=+h[395];bn=+h[399];bo=+h[404];bp=+h[392];bq=+h[396];br=+h[400];bs=+h[406];bt=+h[394];bu=+h[398];bv=+h[402];bw=bs+au*bt+bf*bu+bj*bv;bx=bw==0.0?1.0e-5:bw;bw=+(c[180]|0);aD=c[186]|0;a1=~~((bk+au*bl+bf*bm+bj*bn)/bx*bw)+aD|0;by=+(c[40]|0);as=c[46]|0;aA=~~((bo+au*bp+bf*bq+bj*br)/bx*by)+as|0;bx=av+aw*(+h[aa>>3]-ay)+-1.0;ay=be+ax*(+h[J>>3]-at)+-1.0;at=bi+bh*(+h[K>>3]-bg)+-1.0;bg=bs+bt*bx+bu*ay+bv*at;bv=bg==0.0?1.0e-5:bg;az=~~(bw*((bk+bl*bx+bm*ay+bn*at)/bv))+aD|0;aD=~~(by*((bo+bp*bx+bq*ay+br*at)/bv))+as|0;c[8490]=a1;c[8488]=aA;if(Q){bv=+h[an+(aN<<6)+24>>3];as=c[34]|0;aE=(a[64788+(as*688&-1)|0]&1)==0;aB=(a[66852]&1)==0;L11615:do{if(aE){do{if(aB){bz=bv}else{if(bv>0.0){at=+_(+bv);bz=at/+h[8358];break}else{bA=+h[8341];V=8536;break L11615}}}while(0);bB=bz;bC=+h[an+(ap<<6)+24>>3];V=8537}else{if(aB){bA=+Z(+(bv*+h[64800+(as*688&-1)>>3]));V=8536;break}if(+h[64792+(as*688&-1)>>3]==+h[8357]){bD=bv}else{bD=bv*+h[64800+(as*688&-1)>>3]/+h[8358]}bE=bD;bF=+h[an+(ap<<6)+24>>3];V=8538}}while(0);if((V|0)==8536){V=0;bv=+h[an+(ap<<6)+24>>3];if(aE){bB=bA;bC=bv;V=8537}else{bE=bA;bF=bv;V=8538}}do{if((V|0)==8537){V=0;if(aB){bG=bC;bH=bB;break}if(bC>0.0){bv=+_(+bC);bG=bv/+h[8358];bH=bB;break}else{bG=+h[8341];bH=bB;break}}else if((V|0)==8538){V=0;if(aB){bG=+Z(+(bF*+h[64800+(as*688&-1)>>3]));bH=bE;break}if(+h[64792+(as*688&-1)>>3]==+h[8357]){bG=bF;bH=bE;break}bG=bF*+h[64800+(as*688&-1)>>3]/+h[8358];bH=bE}}while(0);bI=bH+bG}else{bI=+h[an+(aN<<6)+32>>3]+ +h[an+(ap<<6)+32>>3]}bv=bI*.5;at=+h[8341];do{if(at>2]|0)==0){bK=a1;bL=aA;bM=aN}else{c[L>>2]=5;h[ab>>3]=bJ;c[ac>>2]=0;cM[c[as>>2]&511](k);bK=c[8490]|0;bL=c[8488]|0;bM=c[3524]|0}c[e>>2]=bK;c[f>>2]=bL;c[g>>2]=az;c[j>>2]=aD;if((fl(e,f,g,j)|0)!=0){cN[c[bM+56>>2]&255](c[e>>2]|0,c[f>>2]|0);cN[c[bM+60>>2]&255](c[g>>2]|0,c[j>>2]|0)}c[8490]=az;c[8488]=aD}else if((ar|0)!=2){V=8557;break L11450}}while(0);ar=al+1|0;if((ar|0)<(c[ao>>2]|0)){am=c[aq>>2]|0;al=ar;ap=ap+af|0}else{break}}}aj=aj+1|0;}while((aj|0)<(ag|0))}}while(0);ad=ad+1|0;}while((ad|0)<2);if((V|0)==8557){uk(203224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}V=c[O>>2]|0;if((V|0)!=0){uu(V)}V=c[N>>2]|0;if((V|0)==0){i=d;return}uu(V);i=d;return}}function fC(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0.0,Z=0,_=0,$=0,aa=0,ab=0.0,ac=0.0,ad=0.0,ae=0.0,af=0.0,ag=0.0,ah=0.0,ai=0.0,aj=0.0,ak=0.0,al=0.0,am=0.0,an=0.0,ao=0.0,ap=0.0,aq=0.0,ar=0.0,as=0.0,at=0.0,au=0.0,av=0.0,aw=0.0,ax=0,ay=0;d=i;i=i+216|0;e=d|0;f=d+8|0;g=d+16|0;j=d+24|0;k=d+32|0;l=d+40|0;m=d+48|0;n=d+56|0;o=d+64|0;p=d+72|0;q=d+80|0;r=d+88|0;s=d+96|0;t=d+104|0;u=d+112|0;w=d+120|0;x=d+128|0;y=d+144|0;z=d+152|0;A=d+160|0;B=d+168|0;C=d+184|0;D=d+200|0;E=c[b+260>>2]|0;do{if((c[b+244>>2]|0)!=0){if((a[38984]&1)==0){break}i=d;return}}while(0);do{if((a[b+239|0]&1)==0){F=0}else{if((c[b+64>>2]|0)!=3){F=0;break}F=+h[b+72>>3]<0.0}}while(0);if((E|0)==0){i=d;return}G=x|0;H=x+4|0;I=x+8|0;J=B|0;K=C|0;L=D|0;M=B+8|0;B=C+8|0;C=D+8|0;D=b+64|0;N=D|0;O=b+68|0;b=E;L11686:while(1){E=c[b+12>>2]|0;P=b+8|0;if((c[P>>2]|0)>0){Q=0;R=2;while(1){do{if(F){S=(c[3524]|0)+144|0;if((c[S>>2]|0)==0){break}T=~~+h[E+(Q<<6)+32>>3];c[G>>2]=3;c[H>>2]=T;h[I>>3]=0.0;cM[c[S>>2]&511](x)}else{if((c[N>>2]|0)!=2){break}c[O>>2]=~~+h[E+(Q<<6)+32>>3];fn(D,c[3524]|0)}}while(0);S=E+(Q<<6)|0;T=c[S>>2]|0;do{if((T|0)==0){U=(+h[E+(Q<<6)+8>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;V=(+h[E+(Q<<6)+16>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;W=(+h[E+(Q<<6)+24>>3]- +h[5279])*+h[2]+ +h[12]+-1.0;X=+h[406]+U*+h[394]+V*+h[398]+W*+h[402];Y=X==0.0?1.0e-5:X;Z=~~((+h[403]+U*+h[391]+V*+h[395]+W*+h[399])/Y*+(c[180]|0))+(c[186]|0)|0;_=~~((+h[404]+U*+h[392]+V*+h[396]+W*+h[400])/Y*+(c[40]|0))+(c[46]|0)|0;if((R|0)==0){$=c[8488]|0;c[s>>2]=c[8490];c[t>>2]=$;c[u>>2]=Z;c[w>>2]=_;$=c[3524]|0;if((fl(s,t,u,w)|0)!=0){cN[c[$+56>>2]&255](c[s>>2]|0,c[t>>2]|0);cN[c[$+60>>2]&255](c[u>>2]|0,c[w>>2]|0)}c[8490]=Z;c[8488]=_;break}else if((R|0)==1){if((a[54160]&1)==0){c[8490]=Z;c[8488]=_;break}ul(E,Q-1|0,Q,y,z,A);Y=(+h[y>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;W=(+h[z>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;V=(+h[A>>3]- +h[5279])*+h[2]+ +h[12]+-1.0;U=+h[406]+Y*+h[394]+W*+h[398]+V*+h[402];X=U==0.0?1.0e-5:U;$=~~((+h[403]+Y*+h[391]+W*+h[395]+V*+h[399])/X*+(c[180]|0))+(c[186]|0)|0;aa=~~((+h[404]+Y*+h[392]+W*+h[396]+V*+h[400])/X*+(c[40]|0))+(c[46]|0)|0;c[8490]=$;c[8488]=aa;c[k>>2]=$;c[l>>2]=aa;c[m>>2]=Z;c[n>>2]=_;aa=c[3524]|0;if((fl(k,l,m,n)|0)!=0){cN[c[aa+56>>2]&255](c[k>>2]|0,c[l>>2]|0);cN[c[aa+60>>2]&255](c[m>>2]|0,c[n>>2]|0)}c[8490]=Z;c[8488]=_;break}else{c[8490]=Z;c[8488]=_;break}}else if((T|0)==1){if((R|0)==0){if((a[54160]&1)==0){break}ul(E,Q-1|0,Q,y,z,A);X=(+h[y>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;V=(+h[z>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;W=(+h[A>>3]- +h[5279])*+h[2]+ +h[12]+-1.0;Y=+h[406]+X*+h[394]+V*+h[398]+W*+h[402];U=Y==0.0?1.0e-5:Y;_=~~((+h[403]+X*+h[391]+V*+h[395]+W*+h[399])/U*+(c[180]|0))+(c[186]|0)|0;Z=~~((+h[404]+X*+h[392]+V*+h[396]+W*+h[400])/U*+(c[40]|0))+(c[46]|0)|0;aa=c[8488]|0;c[e>>2]=c[8490];c[f>>2]=aa;c[g>>2]=_;c[j>>2]=Z;aa=c[3524]|0;if((fl(e,f,g,j)|0)!=0){cN[c[aa+56>>2]&255](c[e>>2]|0,c[f>>2]|0);cN[c[aa+60>>2]&255](c[g>>2]|0,c[j>>2]|0)}c[8490]=_;c[8488]=Z;break}else if((R|0)!=1){break}if((a[54152]&1)==0){break}if(!(um(E,Q-1|0,Q,J,K,L)|0)){break}U=+h[64664+((c[200]|0)*688&-1)>>3];W=+h[91];V=+h[96];X=(+h[J>>3]-U)*W+V+-1.0;Y=+h[64664+((c[144]|0)*688&-1)>>3];ab=+h[21];ac=+h[68];ad=(+h[K>>3]-Y)*ab+ac+-1.0;ae=+h[5279];af=+h[2];ag=+h[12];ah=(+h[L>>3]-ae)*af+ag+-1.0;ai=+h[403];aj=+h[391];ak=+h[395];al=+h[399];am=+h[404];an=+h[392];ao=+h[396];ap=+h[400];aq=+h[406];ar=+h[394];as=+h[398];at=+h[402];au=aq+X*ar+ad*as+ah*at;av=au==0.0?1.0e-5:au;au=+(c[180]|0);Z=c[186]|0;_=~~((ai+X*aj+ad*ak+ah*al)/av*au)+Z|0;aw=+(c[40]|0);aa=c[46]|0;$=~~((am+X*an+ad*ao+ah*ap)/av*aw)+aa|0;av=V+W*(+h[M>>3]-U)+-1.0;U=ac+ab*(+h[B>>3]-Y)+-1.0;Y=ag+af*(+h[C>>3]-ae)+-1.0;ae=aq+ar*av+as*U+at*Y;at=ae==0.0?1.0e-5:ae;ax=~~(au*((ai+aj*av+ak*U+al*Y)/at))+Z|0;Z=~~(aw*((am+an*av+ao*U+ap*Y)/at))+aa|0;c[8490]=_;c[8488]=$;c[o>>2]=_;c[p>>2]=$;c[q>>2]=ax;c[r>>2]=Z;$=c[3524]|0;if((fl(o,p,q,r)|0)!=0){cN[c[$+56>>2]&255](c[o>>2]|0,c[p>>2]|0);cN[c[$+60>>2]&255](c[q>>2]|0,c[r>>2]|0)}c[8490]=ax;c[8488]=Z}else if((T|0)!=2){ay=8605;break L11686}}while(0);T=Q+1|0;if((T|0)<(c[P>>2]|0)){Q=T;R=c[S>>2]|0}else{break}}}R=c[b>>2]|0;if((R|0)==0){ay=8611;break}else{b=R}}if((ay|0)==8605){uk(203224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ay|0)==8611){i=d;return}}function fD(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0,w=0,x=0.0,y=0.0,z=0.0,A=0.0,B=0,C=0.0,D=0.0,E=0.0,F=0,G=0.0,H=0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0,S=0.0,T=0.0,U=0;g=i;i=i+16|0;j=g|0;k=c[13542]|0;l=c[9006]|0;m=l+d|0;n=c[9010]|0;o=n+d|0;p=b+64|0;q=c[p>>2]|0;r=c[3524]|0;if((f|0)==-1){s=1.0}else{s=((+h[3817]+-1.0)*.5+1.0)*3.0}t=+(l-n|0);n=~~(t/(+((c[r+20>>2]|0)>>>0>>>0)*s)+.5);l=(n|0)<2?2:n;s=+(l|0);u=t/s;if((q|0)==1){v=8617}else if((q|0)==3){if(+h[b+72>>3]>=0.0){v=8617}}else if((q|0)==2){if((c[b+28>>2]|0)!=-6){v=8617}}if((v|0)==8617){fn(p,r);p=c[13542]|0;q=c[3524]|0;c[13542]=(c[q+96>>2]&128|0)==0?55520:0;cM[c[q+168>>2]&511](8);q=(c[9018]|0)+d|0;d=c[13542]|0;if((d|0)==0){v=8619}else{n=(c[d>>2]|0)>(q|0)&1;w=(c[d+4>>2]|0)<(q|0)?n|2:n;n=(c[d+8>>2]|0)>(e|0)?w|4:w;if((((c[d+12>>2]|0)<(e|0)?n|8:n)|0)==0){v=8619}}if((v|0)==8619){cR[c[(c[3524]|0)+80>>2]&127](q,e,f)}cM[c[(c[3524]|0)+168>>2]&511](9);c[13542]=p;i=g;return}p=(a[b+239|0]&1)==0;q=c[b+260>>2]|0;if((q|0)==0){i=g;return}n=c[b+252>>2]|0;b=0;d=q;t=-8.988465674311579e+307;x=-8.988465674311579e+307;y=8.988465674311579e+307;while(1){if((b|0)>=(n|0)){z=x;A=y;break}q=c[d+12>>2]|0;w=c[d+8>>2]|0;if((w|0)>0){B=0;C=t;D=x;E=y;while(1){do{if((c[q+(B<<6)>>2]|0)==0){if(p){F=q+(B<<6)+24|0}else{F=q+(B<<6)+32|0}G=+h[F>>3];H=G>2]|0;if((B|0)==0){z=O;A=P;break}else{b=b+1|0;d=B;t=N;x=O;y=P}}if(A>z){i=g;return}P=+h[8341];y=A>P?A:P;A=+h[8342];O=z>24==112&1|0);R=d;break}z=(y-P)/(A-P);d=a[20668]|0;if(d<<24>>24==112){Q=z;R=112;break}Q=1.0-z;R=d}else{d=a[20668]|0;Q=+(d<<24>>24!=112&1|0);R=d}}while(0);do{if(P>24==112&1|0);break}y=(O-P)/(A-P);if(R<<24>>24==112){S=y;break}S=1.0-y}else{S=+(R<<24>>24!=112&1|0)}}while(0);P=(S-Q)/s;c[13542]=(c[r+96>>2]&128|0)==0?55520:0;if((l|0)>=0){r=j|0;R=j+8|0;d=j+4|0;b=0;do{F=(b|0)==(l|0);if(F){T=S}else{T=Q+P*+(b|0)}p=(c[3524]|0)+144|0;if((c[p>>2]|0)!=0){c[r>>2]=5;h[R>>3]=T;c[d>>2]=0;cM[c[p>>2]&511](j)}p=(b|0)==0;if(p|F){U=p?o:m}else{U=~~(u*+(b|0)+.5)+o|0}p=c[13542]|0;if((p|0)==0){v=8657}else{F=(c[p>>2]|0)>(U|0)&1;n=(c[p+4>>2]|0)<(U|0)?F|2:F;F=(c[p+8>>2]|0)>(e|0)?n|4:n;if((((c[p+12>>2]|0)<(e|0)?F|8:F)|0)==0){v=8657}}if((v|0)==8657){v=0;cR[c[(c[3524]|0)+80>>2]&127](U,e,f)}b=b+1|0;}while((b|0)<=(l|0))}c[13542]=k;i=g;return}function fE(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0,H=0,I=0,J=0,K=0,L=0;e=i;i=i+16|0;f=e|0;g=c[3524]|0;j=c[b+260>>2]|0;if((j|0)==0){i=e;return}k=b+64|0;l=b+239|0;m=b+72|0;n=b+68|0;o=f|0;p=f+4|0;q=f+8|0;r=b+12|0;s=g+80|0;t=b+48|0;u=g+92|0;g=j;do{j=(c[k>>2]|0)==3;if((a[l]&1)!=0&j){v=+h[m>>3]<0.0}else{v=0}do{if(!(v|j^1)){w=c[n>>2]|0;x=(c[3524]|0)+144|0;if((c[x>>2]|0)==0){break}c[o>>2]=3;c[p>>2]=w;h[q>>3]=0.0;cM[c[x>>2]&511](f)}}while(0);j=g+8|0;x=c[j>>2]|0;if((x|0)>0){w=g+12|0;y=0;z=x;while(1){x=c[w>>2]|0;A=x+(y<<6)|0;do{if((c[A>>2]|0)==0){B=(+h[x+(y<<6)+8>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;C=(+h[x+(y<<6)+16>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;D=(+h[x+(y<<6)+24>>3]- +h[5279])*+h[2]+ +h[12]+-1.0;E=+h[406]+B*+h[394]+C*+h[398]+D*+h[402];F=E==0.0?1.0e-5:E;G=~~((+h[403]+B*+h[391]+C*+h[395]+D*+h[399])/F*+(c[180]|0))+(c[186]|0)|0;H=~~((+h[404]+B*+h[392]+C*+h[396]+D*+h[400])/F*+(c[40]|0))+(c[46]|0)|0;I=c[13542]|0;if((I|0)!=0){J=(c[I>>2]|0)>(G|0)&1;K=(c[I+4>>2]|0)<(G|0)?J|2:J;J=(c[I+8>>2]|0)>(H|0)?K|4:K;if((((c[I+12>>2]|0)<(H|0)?J|8:J)|0)!=0){L=z;break}}fL(b,A);J=c[r>>2]|0;do{if((J|0)==18|(J|0)==51){if(+h[t>>3]!=-3.0){break}cK[c[u>>2]&63](+h[3817]*+h[x+(y<<6)+48>>3])}}while(0);cR[c[s>>2]&127](G,H,d);L=c[j>>2]|0}else{L=z}}while(0);x=y+1|0;if((x|0)<(L|0)){y=x;z=L}else{break}}}g=c[g>>2]|0;}while((g|0)!=0);i=e;return}function fF(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;e=i;i=i+48|0;f=e|0;g=c[13542]|0;if((c[5094]|0)!=0){c[13542]=31752}j=c[11690]|0;if((j&2|0)==0){k=j}else{j=b+4|0;l=c[j>>2]|0;m=+h[l+24>>3];n=(+h[l+8>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;o=(+h[l+16>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;p=(m- +h[5279])*+h[2]+ +h[12]+-1.0;q=+h[404]+n*+h[392]+o*+h[396]+p*+h[400];r=+h[405]+n*+h[393]+o*+h[397]+p*+h[401];s=+h[406]+n*+h[394]+o*+h[398]+p*+h[402];t=s==0.0?1.0e-5:s;s=(+h[403]+n*+h[391]+o*+h[395]+p*+h[399])/t;l=f|0;h[l>>3]=s;p=q/t;u=f+8|0;h[u>>3]=p;q=r/t;v=f+16|0;h[v>>3]=q;w=f+32|0;h[w>>3]=m;x=f+40|0;c[x>>2]=0;if((a[38984]&1)==0){y=f;c[7612]=c[y>>2];c[7613]=c[y+4>>2];c[7614]=c[y+8>>2];c[7615]=c[y+12>>2];c[7616]=c[y+16>>2];c[7617]=c[y+20>>2];c[7618]=c[y+24>>2];c[7619]=c[y+28>>2];c[7620]=c[y+32>>2];c[7621]=c[y+36>>2];c[7622]=c[y+40>>2];c[7623]=c[y+44>>2];z=8695}else{if(q==-2.0){y=f;c[7612]=c[y>>2];c[7613]=c[y+4>>2];c[7614]=c[y+8>>2];c[7615]=c[y+12>>2];c[7616]=c[y+16>>2];c[7617]=c[y+20>>2];c[7618]=c[y+24>>2];c[7619]=c[y+28>>2];c[7620]=c[y+32>>2];c[7621]=c[y+36>>2];c[7622]=c[y+40>>2];c[7623]=c[y+44>>2]}else{h[v>>3]=q+.01;y=f;c[7612]=c[y>>2];c[7613]=c[y+4>>2];c[7614]=c[y+8>>2];c[7615]=c[y+12>>2];c[7616]=c[y+16>>2];c[7617]=c[y+20>>2];c[7618]=c[y+24>>2];c[7619]=c[y+28>>2];c[7620]=c[y+32>>2];c[7621]=c[y+36>>2];c[7622]=c[y+40>>2];c[7623]=c[y+44>>2]}if((a[46752]&1)==0){z=8695}}if((z|0)==8695){cN[c[(c[3524]|0)+56>>2]&255](~~(s*+(c[180]|0))+(c[186]|0)|0,~~(p*+(c[40]|0))+(c[46]|0)|0)}y=b+44|0;if((c[y>>2]|0)>1){A=1;do{B=c[j>>2]|0;p=+h[B+(A<<6)+24>>3];s=(+h[B+(A<<6)+8>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;q=(+h[B+(A<<6)+16>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;m=(p- +h[5279])*+h[2]+ +h[12]+-1.0;t=+h[404]+s*+h[392]+q*+h[396]+m*+h[400];r=+h[405]+s*+h[393]+q*+h[397]+m*+h[401];o=+h[406]+s*+h[394]+q*+h[398]+m*+h[402];n=o==0.0?1.0e-5:o;h[l>>3]=(+h[403]+s*+h[391]+q*+h[395]+m*+h[399])/n;h[u>>3]=t/n;t=r/n;h[v>>3]=t;h[w>>3]=p;c[x>>2]=0;if(!((a[38984]&1)==0|t==-2.0)){h[v>>3]=t+.01}up(f,d);A=A+1|0;}while((A|0)<(c[y>>2]|0))}k=c[11690]|0}do{if((k&1|0)!=0){y=b+4|0;A=c[y>>2]|0;t=+h[7076];p=(+h[A+8>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;n=(+h[A+16>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;r=(t- +h[5279])*+h[2]+ +h[12]+-1.0;m=+h[404]+p*+h[392]+n*+h[396]+r*+h[400];q=+h[405]+p*+h[393]+n*+h[397]+r*+h[401];s=+h[406]+p*+h[394]+n*+h[398]+r*+h[402];o=s==0.0?1.0e-5:s;s=(+h[403]+p*+h[391]+n*+h[395]+r*+h[399])/o;v=f|0;h[v>>3]=s;r=m/o;x=f+8|0;h[x>>3]=r;w=f+16|0;h[w>>3]=q/o;u=f+32|0;h[u>>3]=t;l=f+40|0;c[l>>2]=0;h[u>>3]=+h[A+24>>3];A=f;c[7612]=c[A>>2];c[7613]=c[A+4>>2];c[7614]=c[A+8>>2];c[7615]=c[A+12>>2];c[7616]=c[A+16>>2];c[7617]=c[A+20>>2];c[7618]=c[A+24>>2];c[7619]=c[A+28>>2];c[7620]=c[A+32>>2];c[7621]=c[A+36>>2];c[7622]=c[A+40>>2];c[7623]=c[A+44>>2];if((a[38984]&1)==0){z=8704}else{if((a[46752]&1)==0){z=8704}}if((z|0)==8704){cN[c[(c[3524]|0)+56>>2]&255](~~(s*+(c[180]|0))+(c[186]|0)|0,~~(r*+(c[40]|0))+(c[46]|0)|0)}A=b+44|0;if((c[A>>2]|0)>1){C=1}else{break}do{j=c[y>>2]|0;r=+h[7076];s=(+h[j+(C<<6)+8>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;t=(+h[j+(C<<6)+16>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;o=(r- +h[5279])*+h[2]+ +h[12]+-1.0;q=+h[404]+s*+h[392]+t*+h[396]+o*+h[400];m=+h[405]+s*+h[393]+t*+h[397]+o*+h[401];n=+h[406]+s*+h[394]+t*+h[398]+o*+h[402];p=n==0.0?1.0e-5:n;h[v>>3]=(+h[403]+s*+h[391]+t*+h[395]+o*+h[399])/p;h[x>>3]=q/p;h[w>>3]=m/p;h[u>>3]=r;c[l>>2]=0;h[u>>3]=+h[j+(C<<6)+24>>3];up(f,d);C=C+1|0;}while((C|0)<(c[A>>2]|0))}}while(0);if((c[5094]|0)==0){i=e;return}c[13542]=g;i=e;return}function fG(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0;e=i;i=i+48|0;f=e|0;g=c[11690]|0;do{if((g&2|0)==0){j=g}else{k=b+44|0;if((c[k>>2]|0)<=0){j=g;break}l=b+4|0;m=f|0;n=f+8|0;o=f+16|0;p=f+32|0;q=f+40|0;r=0;do{s=c[l>>2]|0;t=+h[s+(r<<6)+24>>3];u=(+h[s+(r<<6)+8>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;v=(+h[s+(r<<6)+16>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;w=(t- +h[5279])*+h[2]+ +h[12]+-1.0;x=+h[404]+u*+h[392]+v*+h[396]+w*+h[400];y=+h[405]+u*+h[393]+v*+h[397]+w*+h[401];z=+h[406]+u*+h[394]+v*+h[398]+w*+h[402];A=z==0.0?1.0e-5:z;h[m>>3]=(+h[403]+u*+h[391]+v*+h[395]+w*+h[399])/A;h[n>>3]=x/A;x=y/A;h[o>>3]=x;h[p>>3]=t;c[q>>2]=0;if(!((a[38984]&1)==0|x==-2.0)){h[o>>3]=x+.01}uo(f,d);r=r+1|0;}while((r|0)<(c[k>>2]|0));j=c[11690]|0}}while(0);if((j&1|0)==0){i=e;return}j=b+44|0;if((c[j>>2]|0)<=0){i=e;return}g=b+4|0;b=f|0;k=f+8|0;r=f+16|0;o=f+32|0;q=f+40|0;p=0;do{n=c[g>>2]|0;x=(+h[n+(p<<6)+8>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;t=(+h[n+(p<<6)+16>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;A=(+h[7076]- +h[5279])*+h[2]+ +h[12]+-1.0;y=+h[404]+x*+h[392]+t*+h[396]+A*+h[400];w=+h[405]+x*+h[393]+t*+h[397]+A*+h[401];v=+h[406]+x*+h[394]+t*+h[398]+A*+h[402];u=v==0.0?1.0e-5:v;h[b>>3]=(+h[403]+x*+h[391]+t*+h[395]+A*+h[399])/u;h[k>>3]=y/u;h[r>>3]=w/u;c[q>>2]=0;h[o>>3]=+h[n+(p<<6)+24>>3];uo(f,d);p=p+1|0;}while((p|0)<(c[j>>2]|0));i=e;return}function fH(b,d,e,f,g){b=b|0;d=+d;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,Q=0,R=0,S=0,T=0.0,U=0.0,V=0,W=0,X=0;j=i;i=i+144|0;k=f;f=i;i=i+56|0;uD(f,k,56);k=j|0;l=j+16|0;m=j+32|0;n=j+80|0;o=j+128|0;p=j+136|0;q=(e|0)!=0;if(q){r=65056+(b*688&-1)|0}else{r=65064+(b*688&-1)|0}s=65072+(b*688&-1)|0;t=+h[r>>3]*((a[s]&1)!=0?1.0:-1.0);r=c[144]|0;u=+h[64664+(r*688&-1)>>3];v=+h[97];w=u+ +h[64672+(r*688&-1)>>3]-v;r=c[3524]|0;x=+h[7076];y=c[200]|0;z=(d- +h[64664+(y*688&-1)>>3])*+h[91]+ +h[96]+-1.0;A=(v-u)*+h[21]+ +h[68]+-1.0;u=(x- +h[5279])*+h[2]+ +h[12]+-1.0;v=+h[404]+z*+h[392]+A*+h[396]+u*+h[400];B=+h[405]+z*+h[393]+A*+h[397]+u*+h[401];C=+h[406]+z*+h[394]+A*+h[398]+u*+h[402];D=C==0.0?1.0e-5:C;E=m|0;h[E>>3]=(+h[403]+z*+h[391]+A*+h[395]+u*+h[399])/D;F=m+8|0;h[F>>3]=v/D;G=m+16|0;h[G>>3]=B/D;H=m+32|0;h[H>>3]=x;I=m+40|0;c[I>>2]=0;if((c[f+4>>2]|0)>-3){J=r+168|0;cM[c[J>>2]&511](3);x=+h[7076];D=(d- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;B=(w- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;v=(x- +h[5279])*+h[2]+ +h[12]+-1.0;u=+h[404]+D*+h[392]+B*+h[396]+v*+h[400];A=+h[405]+D*+h[393]+B*+h[397]+v*+h[401];z=+h[406]+D*+h[394]+B*+h[398]+v*+h[402];C=z==0.0?1.0e-5:z;h[n>>3]=(+h[403]+D*+h[391]+B*+h[395]+v*+h[399])/C;h[n+8>>3]=u/C;h[n+16>>3]=A/C;h[n+32>>3]=x;c[n+40>>2]=0;do{if((a[38984]&1)==0){K=8734}else{if((a[46752]&1)==0){K=8734;break}gt(m,n,f)}}while(0);if((K|0)==8734){un(m,n,f,f+40|0)}cM[c[J>>2]&511](4);L=c[200]|0}else{L=y}do{if((c[64916+(L*688&-1)>>2]&2|0)!=0){y=c[144]|0;if((a[64788+(y*688&-1)|0]&1)!=0){break}x=+h[64664+(y*688&-1)>>3];C=+h[64672+(y*688&-1)>>3];if(x0.0|C<0.0){break}}else{if(C>0.0|x<0.0){break}}C=+h[7076];A=(d- +h[64664+(L*688&-1)>>3])*+h[91]+ +h[96]+-1.0;u=(0.0-x)*+h[21]+ +h[68]+-1.0;x=(C- +h[5279])*+h[2]+ +h[12]+-1.0;v=+h[404]+A*+h[392]+u*+h[396]+x*+h[400];B=+h[405]+A*+h[393]+u*+h[397]+x*+h[401];D=+h[406]+A*+h[394]+u*+h[398]+x*+h[402];z=D==0.0?1.0e-5:D;h[E>>3]=(+h[403]+A*+h[391]+u*+h[395]+x*+h[399])/z;h[F>>3]=v/z;h[G>>3]=B/z;h[H>>3]=C;c[I>>2]=0}}while(0);L=r+24|0;y=n|0;h[y>>3]=+h[E>>3]+t*+h[695]*+((c[L>>2]|0)>>>0>>>0);J=n+8|0;h[J>>3]=+h[F>>3]+t*+h[694]*+((c[L>>2]|0)>>>0>>>0);f=n+16|0;h[f>>3]=+h[G>>3]+t*+h[693]*+((c[L>>2]|0)>>>0>>>0);M=n+32|0;h[M>>3]=+h[H>>3];do{if((a[38984]&1)==0){K=8745}else{if((a[46752]&1)==0){K=8745;break}gt(m,n,56296)}}while(0);if((K|0)==8745){un(m,n,56296,56336)}N=l;c[N>>2]=c[14084];c[N+4>>2]=c[56340>>2];c[N+8>>2]=c[56344>>2];c[N+12>>2]=c[56348>>2];N=c[14075]|0;do{if((c[14074]|0)!=0){C=+h[7040];O=c[(c[3524]|0)+92>>2]|0;if(C<0.0){cK[O&63](+h[3817]);break}else{cK[O&63](C);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[7039]);O=c[(c[3524]|0)+64>>2]|0;if((N|0)<-5){cM[O&511](-2)}else{cM[O&511](N)}O=c[3524]|0;do{if((a[56328]&1)==0){if((c[O+96>>2]&1024|0)!=0){break}c[l>>2]=1;c[l+4>>2]=N;K=8756}else{K=8756}}while(0);if((K|0)==8756){fn(l,O)}do{if(q){L11938:do{if((g|0)==0){Q=e}else{O=c[200]|0;C=+h[64672+(O*688&-1)>>3]- +h[64664+(O*688&-1)>>3];O=g;while(1){if(+P(+((d- +h[O>>3])/C))<=.001){Q=0;break L11938}l=c[O+16>>2]|0;if((l|0)==0){Q=e;break}else{O=l}}}}while(0);fx(64984+(b*688&-1)|0,o,p,99744);C=+h[695];z=+(c[180]|0);B=C*z;if(B<-.9){R=0}else{R=B<.9?1:2}O=c[5094]|0;do{if((O|0)==0){S=R}else{if((a[65272+(b*688&-1)|0]&1)==0){S=R;break}S=c[65128+(b*688&-1)>>2]|0}}while(0);B=+h[E>>3]-C*+((c[r+20>>2]|0)>>>0>>>0);h[y>>3]=B;v=+h[694];x=+h[F>>3]-v*+((c[r+16>>2]|0)>>>0>>>0);h[J>>3]=x;if((a[s]&1)==0){u=+h[65056+(b*688&-1)>>3];A=B-u*C*+((c[L>>2]|0)>>>0>>>0);h[y>>3]=A;D=x-u*v*+((c[L>>2]|0)>>>0>>>0);h[J>>3]=D;T=A;U=D}else{T=B;U=x}l=~~(T*z)+(c[186]|0)|0;N=~~(U*+(c[40]|0))+(c[46]|0)|0;V=64928+(b*688&-1)|0;if((c[V>>2]|0)==0){W=O}else{fn(V,r);W=c[5094]|0}V=c[65032+(b*688&-1)>>2]|0;if((W|0)==0|(V|0)==0){K=8773}else{if((cO[c[(c[3524]|0)+72>>2]&255](V)|0)==0){K=8773}else{X=V}}if((K|0)==8773){X=0}ln(l+(c[o>>2]|0)|0,N+(c[p>>2]|0)|0,Q,S,0,X,c[64924+(b*688&-1)>>2]|0);N=c[(c[3524]|0)+72>>2]|0;cO[N&255](0);N=k;c[N>>2]=c[14084];c[N+4>>2]=c[56340>>2];c[N+8>>2]=c[56344>>2];c[N+12>>2]=c[56348>>2];N=c[14075]|0;do{if((c[14074]|0)!=0){x=+h[7040];l=c[(c[3524]|0)+92>>2]|0;if(x<0.0){cK[l&63](+h[3817]);break}else{cK[l&63](x);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[7039]);O=c[(c[3524]|0)+64>>2]|0;if((N|0)<-5){cM[O&511](-2)}else{cM[O&511](N)}O=c[3524]|0;if((a[56328]&1)==0){if((c[O+96>>2]&1024|0)!=0){break}c[k>>2]=1;c[k+4>>2]=N}fn(k,O)}}while(0);k=c[200]|0;if((c[64916+(k*688&-1)>>2]&4|0)==0){i=j;return}U=+h[7076];T=(d- +h[64664+(k*688&-1)>>3])*+h[91]+ +h[96]+-1.0;d=(w- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;w=(U- +h[5279])*+h[2]+ +h[12]+-1.0;z=+h[404]+T*+h[392]+d*+h[396]+w*+h[400];C=+h[405]+T*+h[393]+d*+h[397]+w*+h[401];x=+h[406]+T*+h[394]+d*+h[398]+w*+h[402];B=x==0.0?1.0e-5:x;x=(+h[403]+T*+h[391]+d*+h[395]+w*+h[399])/B;h[E>>3]=x;w=z/B;h[F>>3]=w;z=C/B;h[G>>3]=z;h[H>>3]=U;c[I>>2]=0;h[y>>3]=x-t*+h[695]*+((c[L>>2]|0)>>>0>>>0);h[J>>3]=w-t*+h[694]*+((c[L>>2]|0)>>>0>>>0);h[f>>3]=z-t*+h[693]*+((c[L>>2]|0)>>>0>>>0);h[M>>3]=U;do{if((a[38984]&1)!=0){if((a[46752]&1)==0){break}gt(m,n,56296);i=j;return}}while(0);un(m,n,56296,56336);i=j;return}function fI(b,d,e,f,g){b=b|0;d=+d;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0,z=0.0,A=0.0,B=0.0,C=0.0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,Q=0,R=0,S=0.0,T=0.0,U=0,V=0.0,W=0,X=0.0,Y=0,Z=0,_=0,$=0;j=i;i=i+128|0;k=f;f=i;i=i+56|0;uD(f,k,56);k=j|0;l=j+16|0;m=j+64|0;n=j+112|0;o=j+120|0;p=(e|0)!=0;if(p){q=65056+(b*688&-1)|0}else{q=65064+(b*688&-1)|0}r=65072+(b*688&-1)|0;s=+h[q>>3]*((a[r]&1)!=0?1.0:-1.0);q=c[200]|0;t=+h[64664+(q*688&-1)>>3];u=+h[69];v=t+ +h[64672+(q*688&-1)>>3]-u;q=c[3524]|0;w=+h[7076];x=(u-t)*+h[91]+ +h[96]+-1.0;y=c[144]|0;t=(d- +h[64664+(y*688&-1)>>3])*+h[21]+ +h[68]+-1.0;u=(w- +h[5279])*+h[2]+ +h[12]+-1.0;z=+h[404]+x*+h[392]+t*+h[396]+u*+h[400];A=+h[405]+x*+h[393]+t*+h[397]+u*+h[401];B=+h[406]+x*+h[394]+t*+h[398]+u*+h[402];C=B==0.0?1.0e-5:B;D=l|0;h[D>>3]=(+h[403]+x*+h[391]+t*+h[395]+u*+h[399])/C;E=l+8|0;h[E>>3]=z/C;F=l+16|0;h[F>>3]=A/C;G=l+32|0;h[G>>3]=w;H=l+40|0;c[H>>2]=0;if((c[f+4>>2]|0)>-3){I=q+168|0;cM[c[I>>2]&511](3);w=+h[7076];C=(v- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;A=(d- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;z=(w- +h[5279])*+h[2]+ +h[12]+-1.0;u=+h[404]+C*+h[392]+A*+h[396]+z*+h[400];t=+h[405]+C*+h[393]+A*+h[397]+z*+h[401];x=+h[406]+C*+h[394]+A*+h[398]+z*+h[402];B=x==0.0?1.0e-5:x;h[m>>3]=(+h[403]+C*+h[391]+A*+h[395]+z*+h[399])/B;h[m+8>>3]=u/B;h[m+16>>3]=t/B;h[m+32>>3]=w;c[m+40>>2]=0;do{if((a[38984]&1)==0){J=8801}else{if((a[46752]&1)==0){J=8801;break}gt(l,m,f)}}while(0);if((J|0)==8801){un(l,m,f,f+40|0)}cM[c[I>>2]&511](4);K=c[144]|0}else{K=y}do{if((c[64916+(K*688&-1)>>2]&2|0)!=0){y=c[200]|0;if((a[64788+(y*688&-1)|0]&1)!=0){break}w=+h[64664+(y*688&-1)>>3];B=+h[64672+(y*688&-1)>>3];if(w0.0|B<0.0){break}}else{if(B>0.0|w<0.0){break}}B=+h[7076];t=(0.0-w)*+h[91]+ +h[96]+-1.0;w=(d- +h[64664+(K*688&-1)>>3])*+h[21]+ +h[68]+-1.0;u=(B- +h[5279])*+h[2]+ +h[12]+-1.0;z=+h[404]+t*+h[392]+w*+h[396]+u*+h[400];A=+h[405]+t*+h[393]+w*+h[397]+u*+h[401];C=+h[406]+t*+h[394]+w*+h[398]+u*+h[402];x=C==0.0?1.0e-5:C;h[D>>3]=(+h[403]+t*+h[391]+w*+h[395]+u*+h[399])/x;h[E>>3]=z/x;h[F>>3]=A/x;h[G>>3]=B;c[H>>2]=0}}while(0);K=q+28|0;y=m|0;h[y>>3]=+h[D>>3]+s*+h[695]*+((c[K>>2]|0)>>>0>>>0);I=m+8|0;h[I>>3]=+h[E>>3]+s*+h[694]*+((c[K>>2]|0)>>>0>>>0);f=m+16|0;h[f>>3]=+h[F>>3]+s*+h[693]*+((c[K>>2]|0)>>>0>>>0);L=m+32|0;h[L>>3]=+h[G>>3];do{if((a[38984]&1)==0){J=8812}else{if((a[46752]&1)==0){J=8812;break}gt(l,m,56296)}}while(0);if((J|0)==8812){un(l,m,56296,56336)}do{if(p){L12016:do{if((g|0)==0){M=e}else{N=c[144]|0;B=+h[64672+(N*688&-1)>>3]- +h[64664+(N*688&-1)>>3];N=g;while(1){if(+P(+((d- +h[N>>3])/B))<=.001){M=0;break L12016}O=c[N+16>>2]|0;if((O|0)==0){M=e;break}else{N=O}}}}while(0);fx(64984+(b*688&-1)|0,n,o,94352);B=+h[695];N=c[180]|0;x=B*+(N|0);if(x<-.9){Q=0}else{Q=x<.9?1:2}O=c[5094]|0;do{if((O|0)==0){R=Q}else{if((a[65272+(b*688&-1)|0]&1)==0){R=Q;break}R=c[65128+(b*688&-1)>>2]|0}}while(0);x=+h[D>>3]-B*+((c[q+20>>2]|0)>>>0>>>0);h[y>>3]=x;A=+h[694];z=+h[E>>3]-A*+((c[q+16>>2]|0)>>>0>>>0);h[I>>3]=z;if((a[r]&1)==0){u=+h[65056+(b*688&-1)>>3];w=x-u*B*+((c[K>>2]|0)>>>0>>>0);h[y>>3]=w;t=z-u*A*+((c[q+24>>2]|0)>>>0>>>0);h[I>>3]=t;S=w;T=t}else{S=x;T=z}U=64928+(b*688&-1)|0;if((c[U>>2]|0)==0){V=S;W=N;X=T;Y=O}else{fn(U,q);V=+h[y>>3];W=c[180]|0;X=+h[I>>3];Y=c[5094]|0}U=~~(V*+(W|0))+(c[186]|0)|0;Z=~~(X*+(c[40]|0))+(c[46]|0)|0;_=c[65032+(b*688&-1)>>2]|0;if((Y|0)==0|(_|0)==0){J=8829}else{if((cO[c[(c[3524]|0)+72>>2]&255](_)|0)==0){J=8829}else{$=_}}if((J|0)==8829){$=0}ln(U+(c[n>>2]|0)|0,Z+(c[o>>2]|0)|0,M,R,0,$,c[64924+(b*688&-1)>>2]|0);Z=c[(c[3524]|0)+72>>2]|0;cO[Z&255](0);Z=k;c[Z>>2]=c[14084];c[Z+4>>2]=c[56340>>2];c[Z+8>>2]=c[56344>>2];c[Z+12>>2]=c[56348>>2];Z=c[14075]|0;do{if((c[14074]|0)!=0){z=+h[7040];U=c[(c[3524]|0)+92>>2]|0;if(z<0.0){cK[U&63](+h[3817]);break}else{cK[U&63](z);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[7039]);O=c[(c[3524]|0)+64>>2]|0;if((Z|0)<-5){cM[O&511](-2)}else{cM[O&511](Z)}O=c[3524]|0;if((a[56328]&1)==0){if((c[O+96>>2]&1024|0)!=0){break}c[k>>2]=1;c[k+4>>2]=Z}fn(k,O)}}while(0);k=c[144]|0;if((c[64916+(k*688&-1)>>2]&4|0)==0){i=j;return}X=+h[7076];V=(v- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;v=(d- +h[64664+(k*688&-1)>>3])*+h[21]+ +h[68]+-1.0;d=(X- +h[5279])*+h[2]+ +h[12]+-1.0;T=+h[404]+V*+h[392]+v*+h[396]+d*+h[400];S=+h[405]+V*+h[393]+v*+h[397]+d*+h[401];B=+h[406]+V*+h[394]+v*+h[398]+d*+h[402];z=B==0.0?1.0e-5:B;B=(+h[403]+V*+h[391]+v*+h[395]+d*+h[399])/z;h[D>>3]=B;d=T/z;h[E>>3]=d;T=S/z;h[F>>3]=T;h[G>>3]=X;c[H>>2]=0;h[y>>3]=B-s*+h[695]*+((c[K>>2]|0)>>>0>>>0);h[I>>3]=d-s*+h[694]*+((c[K>>2]|0)>>>0>>>0);h[f>>3]=T-s*+h[693]*+((c[K>>2]|0)>>>0>>>0);h[L>>3]=X;do{if((a[38984]&1)!=0){if((a[46752]&1)==0){break}gt(l,m,56296);i=j;return}}while(0);un(l,m,56296,56336);i=j;return}function fJ(b,d,e,f,g){b=b|0;d=+d;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0.0,Z=0,_=0,$=0,aa=0,ab=0,ac=0.0,ad=0.0,ae=0.0,af=0.0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0;j=i;i=i+176|0;k=f;f=i;i=i+56|0;uD(f,k,56);k=j|0;l=j+16|0;m=j+64|0;n=j+112|0;o=j+160|0;p=j+168|0;q=(e|0)!=0;if(q){r=65056+(b*688&-1)|0}else{r=65064+(b*688&-1)|0}s=65072+(b*688&-1)|0;t=c[3524]|0;u=~~(+((c[t+28>>2]|0)>>>0>>>0)*+h[r>>3]*((a[s]&1)!=0?1.0:-1.0));if((c[64916+(b*688&-1)>>2]&2|0)==0){v=(+h[14]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;w=(+h[13]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;x=(d- +h[5279])*+h[2]+ +h[12]+-1.0;y=+h[404]+v*+h[392]+w*+h[396]+x*+h[400];z=+h[405]+v*+h[393]+w*+h[397]+x*+h[401];A=+h[406]+v*+h[394]+w*+h[398]+x*+h[402];B=A==0.0?1.0e-5:A;A=(+h[403]+v*+h[391]+w*+h[395]+x*+h[399])/B;h[l>>3]=A;x=y/B;h[l+8>>3]=x;y=z/B;h[l+16>>3]=y;h[l+32>>3]=d;c[l+40>>2]=0;C=A;D=x;E=y}else{y=(0.0- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;x=(0.0- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;A=(d- +h[5279])*+h[2]+ +h[12]+-1.0;B=+h[404]+y*+h[392]+x*+h[396]+A*+h[400];z=+h[405]+y*+h[393]+x*+h[397]+A*+h[401];w=+h[406]+y*+h[394]+x*+h[398]+A*+h[402];v=w==0.0?1.0e-5:w;w=(+h[403]+y*+h[391]+x*+h[395]+A*+h[399])/v;h[l>>3]=w;A=B/v;h[l+8>>3]=A;B=z/v;h[l+16>>3]=B;h[l+32>>3]=d;c[l+40>>2]=0;C=w;D=A;E=B}if((c[f+4>>2]|0)>-3){r=t+168|0;cM[c[r>>2]&511](3);B=+h[64664+((c[200]|0)*688&-1)>>3];A=+h[91];w=+h[96];v=(+h[7089]-B)*A+w+-1.0;z=+h[64664+((c[144]|0)*688&-1)>>3];x=+h[21];y=+h[68];F=(+h[7088]-z)*x+y+-1.0;G=(d- +h[5279])*+h[2]+ +h[12]+-1.0;H=+h[403];I=+h[391];J=+h[395];K=G*+h[399];L=+h[404];M=+h[392];N=+h[396];O=G*+h[400];Q=+h[405];R=+h[393];S=+h[397];T=G*+h[401];U=+h[406];V=+h[394];W=+h[398];X=G*+h[402];G=U+v*V+F*W+X;Y=G==0.0?1.0e-5:G;t=m|0;h[t>>3]=(H+v*I+F*J+K)/Y;Z=m+8|0;h[Z>>3]=(L+v*M+F*N+O)/Y;_=m+16|0;h[_>>3]=(Q+v*R+F*S+T)/Y;$=m+32|0;h[$>>3]=d;c[m+40>>2]=0;Y=(+h[3305]-B)*A+w+-1.0;w=(+h[3304]-z)*x+y+-1.0;y=U+Y*V+w*W+X;X=y==0.0?1.0e-5:y;h[n>>3]=(H+Y*I+w*J+K)/X;h[n+8>>3]=(L+Y*M+w*N+O)/X;h[n+16>>3]=(Q+Y*R+w*S+T)/X;h[n+32>>3]=d;c[n+40>>2]=0;do{if((a[38984]&1)==0){aa=8861}else{if((a[46752]&1)==0){aa=8861;break}gt(l,m,f)}}while(0);if((aa|0)==8861){un(l,m,f,f+40|0)}do{if((a[38984]&1)==0){aa=8865}else{if((a[46752]&1)==0){aa=8865;break}gt(m,n,f)}}while(0);if((aa|0)==8865){un(m,n,f,f+40|0)}cM[c[r>>2]&511](4);r=l|0;f=l+8|0;n=l+16|0;ab=l+32|0;ac=+h[r>>3];ad=+h[f>>3];ae=+h[n>>3];af=+h[ab>>3];ag=r;ah=t;ai=f;aj=Z;ak=n;al=_;am=ab;an=$}else{ac=C;ad=D;ae=E;af=d;ag=l|0;ah=m|0;ai=l+8|0;aj=m+8|0;ak=l+16|0;al=m+16|0;am=l+32|0;an=m+32|0}E=+(u|0);h[ah>>3]=ac+E/+(c[180]|0);h[aj>>3]=ad;h[al>>3]=ae;h[an>>3]=af;do{if((a[38984]&1)==0){aa=8870}else{if((a[46752]&1)==0){aa=8870;break}gt(l,m,56296)}}while(0);if((aa|0)==8870){un(l,m,56296,56336)}do{if(q){L12097:do{if((g|0)==0){ao=e}else{u=c[34]|0;af=+h[64672+(u*688&-1)>>3]- +h[64664+(u*688&-1)>>3];u=g;while(1){if(+P(+((d- +h[u>>3])/af))<=.001){ao=0;break L12097}$=c[u+16>>2]|0;if(($|0)==0){ao=e;break}else{u=$}}}}while(0);fx(64984+(b*688&-1)|0,o,p,73288);u=~~(+h[ai>>3]*+(c[40]|0))+(c[46]|0)|0;$=c[3524]|0;ab=c[$+28>>2]|0;_=(~~(+h[ag>>3]*+(c[180]|0))+(c[186]|0)|0)-(ab<<1)|0;if((a[s]&1)==0){ap=~~(+(_>>>0>>>0)- +(ab>>>0>>>0)*+h[65056+(b*688&-1)>>3])}else{ap=_}_=64928+(b*688&-1)|0;ab=c[_>>2]|0;if((ab|0)==6){h[64936+(b*688&-1)>>3]=d;aa=8880}else if((ab|0)!=0){aa=8880}if((aa|0)==8880){fn(_,$)}ln((c[o>>2]|0)+ap|0,u+(c[p>>2]|0)|0,ao,2,1,0,c[64924+(b*688&-1)>>2]|0);u=k;c[u>>2]=c[14084];c[u+4>>2]=c[56340>>2];c[u+8>>2]=c[56344>>2];c[u+12>>2]=c[56348>>2];u=c[14075]|0;do{if((c[14074]|0)!=0){af=+h[7040];$=c[(c[3524]|0)+92>>2]|0;if(af<0.0){cK[$&63](+h[3817]);break}else{cK[$&63](af);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[7039]);$=c[(c[3524]|0)+64>>2]|0;if((u|0)<-5){cM[$&511](-2)}else{cM[$&511](u)}$=c[3524]|0;if((a[56328]&1)==0){if((c[$+96>>2]&1024|0)!=0){break}c[k>>2]=1;c[k+4>>2]=u}fn(k,$)}}while(0);if((c[64916+((c[34]|0)*688&-1)>>2]&4|0)==0){i=j;return}af=(+h[3305]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;ae=(+h[3304]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;ad=(d- +h[5279])*+h[2]+ +h[12]+-1.0;ac=+h[404]+af*+h[392]+ae*+h[396]+ad*+h[400];D=+h[405]+af*+h[393]+ae*+h[397]+ad*+h[401];C=+h[406]+af*+h[394]+ae*+h[398]+ad*+h[402];X=C==0.0?1.0e-5:C;C=(+h[403]+af*+h[391]+ae*+h[395]+ad*+h[399])/X;h[ag>>3]=C;ad=ac/X;h[ai>>3]=ad;ac=D/X;h[ak>>3]=ac;h[am>>3]=d;c[l+40>>2]=0;h[ah>>3]=C-E/+(c[180]|0);h[aj>>3]=ad;h[al>>3]=ac;h[an>>3]=d;do{if((a[38984]&1)!=0){if((a[46752]&1)==0){break}gt(l,m,56296);i=j;return}}while(0);un(l,m,56296,56336);i=j;return}function fK(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0;f=i;i=i+24|0;g=f|0;j=f+8|0;k=f+16|0;h[g>>3]=+h[a+16>>3];h[j>>3]=+h[a+24>>3];h[k>>3]=+h[a+32>>3];l=(fM(a,e,g,j,k)|0)==0;m=+h[g>>3];if(l){n=(m- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;o=(+h[j>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;p=(+h[k>>3]- +h[5279])*+h[2]+ +h[12]+-1.0;q=+h[406]+n*+h[394]+o*+h[398]+p*+h[402];r=q==0.0?1.0e-5:q;q=(+h[404]+n*+h[392]+o*+h[396]+p*+h[400])/r;h[b>>3]=+(~~((+h[403]+n*+h[391]+o*+h[395]+p*+h[399])/r*+(c[180]|0))+(c[186]|0)|0);s=+(~~(q*+(c[40]|0))+(c[46]|0)|0);h[d>>3]=s;i=f;return}else{h[b>>3]=m;s=+h[j>>3];h[d>>3]=s;i=f;return}}function fL(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0,s=0.0,t=0.0;e=i;i=i+48|0;f=e|0;g=e+16|0;j=e+32|0;k=b+64|0;l=c[k>>2]|0;if((l|0)==6|(l|0)==0){if((a[55536]&1)==0){i=e;return}if((a[b+56|0]&1)==0){i=e;return}if((a[b+239|0]&1)!=0){m=+h[d+32>>3];n=+h[8341];do{if(n>2]|0)==0){i=e;return}c[g>>2]=5;h[g+8>>3]=p;c[g+4>>2]=0;cM[c[r>>2]&511](g);i=e;return}p=+h[d+24>>3];g=c[34]|0;r=(a[66852]&1)==0;do{if((a[64788+(g*688&-1)|0]&1)==0){if(r){s=p;break}if(p>0.0){n=+_(+p);s=n/+h[8358];break}else{s=+h[8341];break}}else{if(r){s=+Z(+(p*+h[64800+(g*688&-1)>>3]));break}if(+h[64792+(g*688&-1)>>3]==+h[8357]){s=p;break}s=p*+h[64800+(g*688&-1)>>3]/+h[8358]}}while(0);p=+h[8341];do{if(p>2]|0)==0){i=e;return}c[f>>2]=5;h[f+8>>3]=t;c[f+4>>2]=0;cM[c[g>>2]&511](f);i=e;return}else if((l|0)==3){if((a[b+239|0]&1)==0){i=e;return}f=(c[3524]|0)+144|0;if((c[f>>2]|0)==0){i=e;return}g=~~+h[d+32>>3];c[j>>2]=3;c[j+4>>2]=g;h[j+8>>3]=0.0;cM[c[f>>2]&511](j);i=e;return}else if((l|0)==2){c[b+68>>2]=~~+h[d+32>>3];fn(k,c[3524]|0);i=e;return}else{i=e;return}}function fM(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0,w=0,x=0.0,y=0,z=0,A=0,B=0.0;j=i;k=c[b>>2]|0;if((k|0)==4){h[e>>3]=+h[e>>3]*+((c[(c[3524]|0)+20>>2]|0)>>>0>>>0)+.5;l=0;m=1;n=0}else if((k|0)==2){o=c[200]|0;p=+h[64664+(o*688&-1)>>3];h[e>>3]=p+ +h[e>>3]*(+h[64672+(o*688&-1)>>3]-p);l=1;m=0;n=0}else if((k|0)==3){h[e>>3]=+h[e>>3]*+(((c[(c[3524]|0)+8>>2]|0)-1|0)>>>0>>>0)+.5;l=0;m=0;n=1}else if((k|0)==0|(k|0)==1){p=+h[e>>3];do{if((a[66164]&1)==0){q=p}else{if(p>0.0){r=+_(+p);q=r/+h[8272];break}else{uk(210984,(v=i,i=i+24|0,c[v>>2]=d,c[v+8>>2]=56880,h[v+16>>3]=p,v)|0);return 0}}}while(0);h[e>>3]=q;l=1;m=0;n=0}else{l=0;m=0;n=0}e=c[b+4>>2]|0;if((e|0)==2){k=c[144]|0;if((c[5094]|0)==0){q=+h[64664+(k*688&-1)>>3];s=q+ +h[f>>3]*(+h[64672+(k*688&-1)>>3]-q)}else{q=+h[64672+(k*688&-1)>>3];s=q- +h[f>>3]*(q- +h[64664+(k*688&-1)>>3])}h[f>>3]=s;t=1;u=m;w=n}else if((e|0)==4){h[f>>3]=+h[f>>3]*+((c[(c[3524]|0)+16>>2]|0)>>>0>>>0)+.5;t=l;u=1;w=n}else if((e|0)==0|(e|0)==1){s=+h[f>>3];do{if((a[65476]&1)==0){x=s}else{if(s>0.0){q=+_(+s);x=q/+h[8186];break}else{uk(210984,(v=i,i=i+24|0,c[v>>2]=d,c[v+8>>2]=56856,h[v+16>>3]=s,v)|0);return 0}}}while(0);h[f>>3]=x;t=1;u=m;w=n}else if((e|0)==3){h[f>>3]=+h[f>>3]*+(((c[(c[3524]|0)+12>>2]|0)-1|0)>>>0>>>0)+.5;t=l;u=m;w=1}else{t=l;u=m;w=n}n=c[b+8>>2]|0;if((n|0)==2){b=c[34]|0;x=+h[64664+(b*688&-1)>>3];h[g>>3]=x+ +h[g>>3]*(+h[64672+(b*688&-1)>>3]-x);y=1;z=u;A=w}else if((n|0)==4){y=t;z=1;A=w}else if((n|0)==0|(n|0)==1){x=+h[g>>3];do{if((a[64788]&1)==0){B=x}else{if(x>0.0){s=+_(+x);B=s/+h[8100];break}else{uk(210984,(v=i,i=i+24|0,c[v>>2]=d,c[v+8>>2]=56832,h[v+16>>3]=x,v)|0);return 0}}}while(0);h[g>>3]=B;y=1;z=u;A=w}else if((n|0)==3){y=t;z=u;A=1}else{y=t;z=u;A=w}w=A|z;if(y&w){uk(218688,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else{i=j;return w&1|0}return 0}function fN(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0;g=i;j=c[b>>2]|0;if((j|0)==2){h[d>>3]=+h[b+16>>3]*+((c[7939]|0)-(c[7938]|0)|0)}else if((j|0)==3){h[d>>3]=+h[b+16>>3]*+(((c[(c[3524]|0)+8>>2]|0)-1|0)>>>0>>>0)}else if((j|0)==4){h[d>>3]=+h[b+16>>3]*+((c[(c[3524]|0)+20>>2]|0)>>>0>>>0)}else if((j|0)==0){k=+h[b+16>>3];do{if((a[66164]&1)==0){l=k}else{if(k>0.0){m=+_(+k);l=m/+h[8272];break}else{uk(210984,(v=i,i=i+24|0,c[v>>2]=f,c[v+8>>2]=56880,h[v+16>>3]=k,v)|0)}}}while(0);h[d>>3]=l*+h[8269]}else if((j|0)==1){l=+h[b+16>>3];do{if((a[68916]&1)==0){n=l}else{if(l>0.0){k=+_(+l);n=k/+h[8616];break}else{uk(210984,(v=i,i=i+24|0,c[v>>2]=f,c[v+8>>2]=56976,h[v+16>>3]=l,v)|0)}}}while(0);h[d>>3]=n*+h[8613]}d=c[b+4>>2]|0;if((d|0)==4){h[e>>3]=+h[b+24>>3]*+((c[(c[3524]|0)+16>>2]|0)>>>0>>>0);i=g;return}else if((d|0)==1){n=+h[b+24>>3];do{if((a[68228]&1)==0){o=n}else{if(n>0.0){l=+_(+n);o=l/+h[8530];break}else{uk(210984,(v=i,i=i+24|0,c[v>>2]=f,c[v+8>>2]=56952,h[v+16>>3]=n,v)|0)}}}while(0);h[e>>3]=o*+h[8527];i=g;return}else if((d|0)==0){o=+h[b+24>>3];do{if((a[65476]&1)==0){p=o}else{if(o>0.0){n=+_(+o);p=n/+h[8186];break}else{uk(210984,(v=i,i=i+24|0,c[v>>2]=f,c[v+8>>2]=56856,h[v+16>>3]=o,v)|0)}}}while(0);h[e>>3]=p*+h[8183];i=g;return}else if((d|0)==2){h[e>>3]=+h[b+24>>3]*+((c[7941]|0)-(c[7940]|0)|0);i=g;return}else if((d|0)==3){h[e>>3]=+h[b+24>>3]*+(((c[(c[3524]|0)+12>>2]|0)-1|0)>>>0>>>0);i=g;return}else{i=g;return}}function fO(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0.0,X=0.0,Y=0,Z=0,_=0,$=0.0,aa=0.0,ab=0,ac=0,ad=0,ae=0,af=0.0,ag=0.0,ah=0.0,ai=0.0,aj=0,ak=0,al=0.0,am=0.0,an=0.0,ao=0.0,ap=0,aq=0.0,ar=0.0,as=0.0,at=0.0,au=0,av=0.0,aw=0.0,ax=0.0,ay=0.0,az=0.0,aA=0.0,aB=0.0,aC=0.0,aD=0.0,aE=0.0,aF=0,aG=0,aH=0,aI=0,aJ=0,aK=0,aL=0,aM=0,aN=0.0,aO=0.0,aP=0,aQ=0.0,aR=0;f=i;i=i+224|0;g=f|0;j=f+16|0;k=f+32|0;l=f+48|0;m=f+64|0;n=f+72|0;o=f+80|0;p=f+88|0;q=f+96|0;r=f+120|0;s=f+128|0;t=f+136|0;u=f+144|0;v=f+152|0;w=f+160|0;x=f+168|0;y=f+192|0;z=f+200|0;A=f+208|0;B=f+216|0;if((b|0)==0){i=f;return}C=x|0;D=(e|0)==2;E=k;F=x+7|0;x=k|0;G=k+4|0;H=j;I=j|0;J=j+4|0;K=g;L=g|0;M=g+4|0;N=q|0;O=l;P=q+7|0;q=l|0;Q=l+4|0;R=b;do{L12294:do{if((c[R+8>>2]|0)==(d|0)){b=R+52|0;S=c[b>>2]|0;do{if((S|0)==-7){if((c[R+12>>2]|0)!=1){T=9026;break}U=c[12302]|0;V=c[12303]|0;W=+h[6153];X=+h[6154];Y=a[49240]|0;uD(C|0,49241,23);Z=U;_=V;$=W;aa=X;ab=Y}else{T=9026}}while(0);if((T|0)==9026){T=0;Y=c[R+48>>2]|0;X=+h[R+64>>3];W=+h[R+72>>3];V=a[R+80|0]|0;uD(C|0,R+81|0,23);Z=Y;_=S;$=X;aa=W;ab=V}V=R+16|0;Y=V|0;if((c[Y>>2]|0)==3){if((c[R+12>>2]|0)==1){ac=49176}else{T=9029}}else{T=9029}if((T|0)==9029){T=0;ac=V}U=c[ac>>2]|0;if((U|0)==1|(U|0)==4){ad=(c[ac+4>>2]<<4&65520)+U|0}else if((U|0)==2|(U|0)==5){ad=(c[ac+8>>2]<<4&65520)+U|0}else{ad=0}U=c[R+12>>2]|0;if((U|0)==1){do{if((c[R+104>>2]|0)==1){ae=R+112|0;do{if(D){T=9089}else{if((c[ae>>2]|0)==3){T=9089;break}if((c[5094]|0)==0){break L12294}fK(ae,m,n,173728);fx(R+152|0,t,u,173728);W=+(c[t>>2]|0);h[r>>3]=W;X=+(c[u>>2]|0);h[s>>3]=X;af=W;ag=X}}while(0);if((T|0)==9089){T=0;fR(ae,m,n,173728);fN(R+152|0,r,s,173728);af=+h[r>>3];ag=+h[s>>3]}X=+h[m>>3]-af*.5;h[m>>3]=X;W=+h[n>>3]-ag*.5;h[n>>3]=W;ah=af+X;h[o>>3]=ah;ai=ag+W;h[p>>3]=ai;aj=(c[R+156>>2]|0)>>>0<2;ak=(c[R+152>>2]|0)>>>0<2;al=ah;am=X;an=ai;ao=W}else{ap=R+192|0;do{if(D){T=9096}else{if((c[ap>>2]|0)==3){if((c[R+232>>2]|0)==3){T=9096;break}}if((c[5094]|0)==0){break L12294}fK(ap,m,n,173728);fK(R+232|0,o,p,173728)}}while(0);if((T|0)==9096){T=0;fR(ap,m,n,173728);fR(R+232|0,o,p,173728)}W=+h[m>>3];ai=+h[o>>3];if(W>ai){h[m>>3]=ai;h[o>>3]=W;aq=W;ar=ai}else{aq=ai;ar=W}W=+h[n>>3];ai=+h[p>>3];if(W>ai){h[n>>3]=ai;h[p>>3]=W;as=W;at=ai}else{as=ai;at=W}if((c[R+192>>2]|0)==3){au=0}else{au=(c[R+232>>2]|0)!=3}if((c[R+196>>2]|0)==3){aj=0;ak=au;al=aq;am=ar;an=as;ao=at;break}aj=(c[R+236>>2]|0)!=3;ak=au;al=aq;am=ar;an=as;ao=at}}while(0);S=c[13542]|0;if((S|0)==0){av=al;aw=am;ax=an;ay=ao}else{do{if(ak){W=+(c[S>>2]|0);if(am>3]=W;az=W}else{az=am}W=+(c[S+4>>2]|0);if(al<=W){aA=az;aB=al;break}h[o>>3]=W;aA=az;aB=W}else{aA=am;aB=al}}while(0);do{if(aj){W=+(c[S+8>>2]|0);if(ao>3]=W;aC=W}else{aC=ao}W=+(c[S+12>>2]|0);if(an<=W){aD=aC;aE=an;break}h[p>>3]=W;aD=aC;aE=W}else{aD=ao;aE=an}}while(0);if(aA>aB|aD>aE){break}else{av=aB;aw=aA;ax=aE;ay=aD}}S=~~(av-aw);ae=~~(ax-ay);aF=~~aw;aG=~~ay;if((S|0)==0|(ae|0)==0){break}aH=c[b>>2]|0;if((aH|0)==-7){aI=c[12302]|0;aJ=c[12303]|0;W=+h[6153];ai=+h[6154];aK=a[49240]|0;uD(N|0,49241,23);aL=aI;aM=aJ;aN=W;aO=ai;aP=aK}else{aK=c[R+48>>2]|0;ai=+h[R+64>>3];W=+h[R+72>>3];aJ=a[R+80|0]|0;uD(N|0,R+81|0,23);aL=aK;aM=aH;aN=ai;aO=W;aP=aJ}if(aN>0.0){aQ=+h[R+64>>3]}else{aQ=aN}aJ=(c[Y>>2]|0)==3?49176:V;uD(O|0,P|0,16);do{if((aL|0)!=0){aH=c[(c[3524]|0)+92>>2]|0;if(aO<0.0){cK[aH&63](+h[3817]);break}else{cK[aH&63](aO);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](aQ);V=c[(c[3524]|0)+64>>2]|0;if((aM|0)<-5){cM[V&511](-2)}else{cM[V&511](aM)}V=c[3524]|0;do{if((aP&1)==0){if((c[V+96>>2]&1024|0)!=0){break}c[q>>2]=1;c[Q>>2]=aM;T=9135}else{T=9135}}while(0);if((T|0)==9135){T=0;fn(l,V)}Y=c[aJ>>2]|0;if((Y|0)==1|(Y|0)==4){aR=aJ+4|0;T=9139}else if((Y|0)==2|(Y|0)==5){aR=aJ+8|0;T=9139}do{if((T|0)==9139){T=0;b=(c[aR>>2]<<4&65520)+Y|0;if((b|0)==0){break}aH=c[(c[3524]|0)+108>>2]|0;if((aH|0)==0){break}cI[aH&63](b,aF,aG,S,ae)}}while(0);if(!(hG(aJ)|0)){break}cN[c[(c[3524]|0)+56>>2]&255](aF,aG);Y=ae+aG|0;cN[c[(c[3524]|0)+60>>2]&255](aF,Y);V=S+aF|0;cN[c[(c[3524]|0)+60>>2]&255](V,Y);cN[c[(c[3524]|0)+60>>2]&255](V,aG);cN[c[(c[3524]|0)+60>>2]&255](aF,aG);break}else if((U|0)==2){V=c[13542]|0;Y=R+112|0;do{if(D){T=9036}else{if((c[Y>>2]|0)==3){T=9036;break}if((c[5094]|0)==0){break L12294}fK(Y,v,w,173728);fx(R+152|0,A,B,173728);h[y>>3]=+(c[A>>2]|0)}}while(0);if((T|0)==9036){T=0;fR(Y,v,w,173728);fN(R+152|0,y,z,173728)}uD(E|0,F|0,16);do{if((Z|0)!=0){aG=c[(c[3524]|0)+92>>2]|0;if(aa<0.0){cK[aG&63](+h[3817]);break}else{cK[aG&63](aa);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63]($);Y=c[(c[3524]|0)+64>>2]|0;if((_|0)<-5){cM[Y&511](-2)}else{cM[Y&511](_)}Y=c[3524]|0;do{if((ab&1)==0){if((c[Y+96>>2]&1024|0)!=0){break}c[x>>2]=1;c[G>>2]=_;T=9049}else{T=9049}}while(0);if((T|0)==9049){T=0;fn(k,Y)}do{if((c[R+112>>2]|0)==3){if((c[R+116>>2]|0)!=3){break}c[13542]=55520}}while(0);Y=R+192|0;aG=R+200|0;lq(~~+h[v>>3],~~+h[w>>3],+h[y>>3],+h[Y>>3],+h[aG>>3],ad);if(hG(ac)|0){lq(~~+h[v>>3],~~+h[w>>3],+h[y>>3],+h[Y>>3],+h[aG>>3],0)}c[13542]=V;break}else if((U|0)==3){uD(H|0,F|0,16);do{if((Z|0)!=0){aG=c[(c[3524]|0)+92>>2]|0;if(aa<0.0){cK[aG&63](+h[3817]);break}else{cK[aG&63](aa);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63]($);V=c[(c[3524]|0)+64>>2]|0;if((_|0)<-5){cM[V&511](-2)}else{cM[V&511](_)}V=c[3524]|0;do{if((ab&1)==0){if((c[V+96>>2]&1024|0)!=0){break}c[I>>2]=1;c[J>>2]=_;T=9066}else{T=9066}}while(0);if((T|0)==9066){T=0;fn(j,V)}if(D){fP(2,R+104|0,ad,1)}else{if((c[5094]|0)==0){break}fP(3,R+104|0,ad,1)}if(!(hG(ac)|0)){break}fP(e,R+104|0,0,1);break}else if((U|0)==4){uD(K|0,F|0,16);do{if((Z|0)!=0){aG=c[(c[3524]|0)+92>>2]|0;if(aa<0.0){cK[aG&63](+h[3817]);break}else{cK[aG&63](aa);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63]($);U=c[(c[3524]|0)+64>>2]|0;if((_|0)<-5){cM[U&511](-2)}else{cM[U&511](_)}U=c[3524]|0;do{if((ab&1)==0){if((c[U+96>>2]&1024|0)!=0){break}c[L>>2]=1;c[M>>2]=_;T=9083}else{T=9083}}while(0);if((T|0)==9083){T=0;fn(g,U)}V=R+104|0;fQ(e,V,ad);if(!(hG(ac)|0)){break}fQ(e,V,0);break}else{break}}}while(0);R=c[R>>2]|0;}while((R|0)!=0);i=f;return}function fP(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0.0,w=0.0,x=0.0,y=0.0,z=0,A=0,B=0.0,C=0.0,D=0.0,E=0.0,F=0,G=0,H=0,I=0.0,J=0.0,K=0;f=i;i=i+1568|0;g=f|0;j=f+8|0;k=f+16|0;l=f+24|0;m=f+32|0;n=f+1472|0;o=f+1480|0;p=f+1488|0;q=f+1496|0;r=f+1504|0;s=f+1512|0;t=f+1520|0;u=f+1528|0;v=+h[b+88>>3]*.017453292519943295;w=+S(+v);x=+T(+v);v=+h[b+64>>3]*.5;y=+h[b+72>>3]*.5;z=u;A=b+48|0;c[z>>2]=c[A>>2];c[z+4>>2]=c[A+4>>2];c[z+8>>2]=c[A+8>>2];c[z+12>>2]=c[A+12>>2];c[z+16>>2]=c[A+16>>2];c[z+20>>2]=c[A+20>>2];c[z+24>>2]=c[A+24>>2];c[z+28>>2]=c[A+28>>2];c[z+32>>2]=c[A+32>>2];c[z+36>>2]=c[A+36>>2];A=c[3524]|0;B=+((c[A+24>>2]|0)>>>0>>>0)/+((c[A+28>>2]|0)>>>0>>>0);do{if(e){A=b+8|0;if((a|0)==2){fR(A,n,o,73152);break}else{fK(A,n,o,73152);break}}else{h[n>>3]=+h[b+24>>3];h[o>>3]=+h[b+32>>3]}}while(0);c[m+8>>2]=d;C=w*v;D=x*y;A=u+16|0;E=x*v;v=w*y;z=u+24|0;F=(a|0)==2;a=b|0;b=n;G=o;y=0.0;H=0;while(1){w=+S(+y);x=+T(+y);I=C*w-D*x;h[A>>3]=I;J=E*w+v*x;h[z>>3]=J;do{if(e){K=c[a>>2]|0;if(F){if((K|0)==2){fN(u,r,q,73152);h[z>>3]=+h[A>>3];fN(u,r,p,73152);break}else if((K|0)==0){fN(u,p,q,73152);break}else if((K|0)==1){fN(u,p,r,73152);h[A>>3]=+h[z>>3];fN(u,q,r,73152);break}else{break}}else{if((K|0)==2){fx(u,s,t,73152);h[q>>3]=+(c[t>>2]|0);h[z>>3]=+h[A>>3];fx(u,t,s,73152);h[p>>3]=+(c[s>>2]|0);break}else if((K|0)==0){fx(u,s,t,73152);h[p>>3]=+(c[s>>2]|0);h[q>>3]=+(c[t>>2]|0);break}else if((K|0)==1){fx(u,s,t,73152);h[p>>3]=+(c[s>>2]|0);h[A>>3]=+h[z>>3];fx(u,t,s,73152);h[q>>3]=+(c[t>>2]|0);break}else{break}}}else{h[p>>3]=I;h[q>>3]=J}}while(0);K=m+(H*12&-1)|0;c[K>>2]=~~(+h[n>>3]+ +h[p>>3]);J=+h[o>>3];I=+h[q>>3];if(e){c[m+(H*12&-1)+4>>2]=~~(J+I)}else{c[m+(H*12&-1)+4>>2]=~~(J+B*I)}fl(b,G,K,m+(H*12&-1)+4|0);K=H+1|0;if((K|0)<73){y=y+.08726646259971647;H=K}else{break}}H=m|0;if((d|0)!=0){d=c[(c[3524]|0)+148>>2]|0;if((d|0)==0){i=f;return}cN[d&255](72,H);i=f;return}H=0;while(1){d=c[m+(H*12&-1)+4>>2]|0;G=H+1|0;b=c[m+(G*12&-1)>>2]|0;e=c[m+(G*12&-1)+4>>2]|0;c[g>>2]=c[m+(H*12&-1)>>2];c[j>>2]=d;c[k>>2]=b;c[l>>2]=e;e=c[3524]|0;if((fl(g,j,k,l)|0)!=0){cN[c[e+56>>2]&255](c[g>>2]|0,c[j>>2]|0);cN[c[e+60>>2]&255](c[k>>2]|0,c[l>>2]|0)}if((G|0)<72){H=G}else{break}}i=f;return}function fQ(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0;e=i;i=i+112|0;f=e|0;g=e+8|0;j=e+16|0;k=e+24|0;l=e+32|0;m=e+40|0;n=e+48|0;o=e+56|0;p=e+64|0;q=e+72|0;r=e+80|0;s=e+88|0;t=e+96|0;u=c[13542]|0;v=b+4|0;if((c[v>>2]|0)==0){i=e;return}w=b|0;b=c[w>>2]|0;if((b|0)<2){i=e;return}c[11720]=db(c[11720]|0,b*12&-1,218624)|0;c[11722]=db(c[11722]|0,(c[w>>2]|0)*24&-1,218624)|0;do{if((c[w>>2]|0)>0){b=(a|0)==3;x=0;y=0;z=c[v>>2]|0;while(1){A=z+(y*40&-1)|0;B=c[11720]|0;C=B+(y*12&-1)|0;D=B+(y*12&-1)+4|0;if(b){fK(A,r,s,213112);c[C>>2]=~~+h[r>>3];c[D>>2]=~~+h[s>>3]}else{fR(A,p,q,213112);c[C>>2]=~~+h[p>>3];c[D>>2]=~~+h[q>>3]}D=c[v>>2]|0;C=c[D+(y*40&-1)>>2]|0;if((C|0)==3){E=9189}else{if((c[D+(y*40&-1)+4>>2]|0)==3){E=9189}else{F=x}}if((E|0)==9189){E=0;F=1}if((C|0)==2){E=9192}else{if((c[D+(y*40&-1)+4>>2]|0)==2){E=9192}else{G=F}}if((E|0)==9192){E=0;G=1}C=y+1|0;if((C|0)<(c[w>>2]|0)){x=G;y=C;z=D}else{break}}if(!G){H=y;break}c[13542]=55520;H=y}else{H=-1}}while(0);G=c[3524]|0;do{if((c[G+148>>2]|0)==0|(d|0)==0){w=c[G+172>>2]|0;if((w|0)!=0){cM[w&511](0)}w=c[11720]|0;F=c[w>>2]|0;do{if((H|0)>0){v=0;q=w;p=F;do{s=c[q+(v*12&-1)+4>>2]|0;v=v+1|0;r=c[q+(v*12&-1)>>2]|0;a=c[q+(v*12&-1)+4>>2]|0;c[l>>2]=p;c[m>>2]=s;c[n>>2]=r;c[o>>2]=a;a=c[3524]|0;if((fl(l,m,n,o)|0)!=0){cN[c[a+56>>2]&255](c[l>>2]|0,c[m>>2]|0);cN[c[a+60>>2]&255](c[n>>2]|0,c[o>>2]|0)}q=c[11720]|0;p=c[q+(v*12&-1)>>2]|0}while((v|0)<(H|0));v=c[q>>2]|0;if((p|0)==(v|0)){I=v;J=q;K=H;E=9216;break}L=c[q+(H*12&-1)+4>>2]|0;M=c[q+4>>2]|0;N=q;O=v;P=H;E=9217}else{I=F;J=w;K=0;E=9216}}while(0);if((E|0)==9216){w=c[J+(K*12&-1)+4>>2]|0;F=c[J+4>>2]|0;if((w|0)!=(F|0)){L=w;M=F;N=J;O=I;P=K;E=9217}}do{if((E|0)==9217){c[f>>2]=c[N+(P*12&-1)>>2];c[g>>2]=L;c[j>>2]=O;c[k>>2]=M;F=c[3524]|0;if((fl(f,g,j,k)|0)==0){break}cN[c[F+56>>2]&255](c[f>>2]|0,c[g>>2]|0);cN[c[F+60>>2]&255](c[j>>2]|0,c[k>>2]|0)}}while(0);F=c[(c[3524]|0)+172>>2]|0;if((F|0)==0){break}cM[F&511](1)}else{F=t;w=1;y=0;v=0;L12560:while(1){Q=w;R=v;while(1){if((R|0)>=(H|0)){break L12560}a=c[11720]|0;r=(c[11722]|0)+(y*12&-1)|0;s=a+(R*12&-1)|0;c[r>>2]=c[s>>2];c[r+4>>2]=c[s+4>>2];c[r+8>>2]=c[s+8>>2];S=R+1|0;s=a+(S*12&-1)|0;c[F>>2]=c[s>>2];c[F+4>>2]=c[s+4>>2];c[F+8>>2]=c[s+8>>2];T=fl(a+(R*12&-1)|0,a+(R*12&-1)+4|0,a+(S*12&-1)|0,a+(S*12&-1)+4|0)|0;if((T|0)==0){Q=0;R=S}else{break}}q=((T|0)>0&1)+y|0;if((T|0)>=0){w=T;y=q;v=S;continue}p=c[11722]|0;a=c[11720]|0;s=p+(q*12&-1)|0;r=a+(R*12&-1)|0;c[s>>2]=c[r>>2];c[s+4>>2]=c[r+4>>2];c[s+8>>2]=c[r+8>>2];r=p+((q+1|0)*12&-1)|0;p=a+(S*12&-1)|0;c[r>>2]=c[p>>2];c[r+4>>2]=c[p+4>>2];c[r+8>>2]=c[p+8>>2];c[p>>2]=c[F>>2];c[p+4>>2]=c[F+4>>2];c[p+8>>2]=c[F+8>>2];w=T;y=q+2|0;v=S}if((Q|0)==1){v=c[11722]|0;w=v+(y*12&-1)|0;F=(c[11720]|0)+(R*12&-1)|0;c[w>>2]=c[F>>2];c[w+4>>2]=c[F+4>>2];c[w+8>>2]=c[F+8>>2];U=y+1|0;V=v}else{U=y;V=c[11722]|0}c[V+8>>2]=d;cN[c[(c[3524]|0)+148>>2]&255](U,c[11722]|0)}}while(0);c[13542]=u;i=e;return}function fR(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0;g=i;j=c[b>>2]|0;if((j|0)==4){h[d>>3]=+h[b+16>>3]*+((c[(c[3524]|0)+20>>2]|0)>>>0>>>0)}else if((j|0)==2){k=c[7938]|0;h[d>>3]=+(k|0)+ +h[b+16>>3]*+((c[7939]|0)-k|0)}else if((j|0)==1){l=+h[b+16>>3];do{if((a[68916]&1)==0){m=l}else{if(l>0.0){n=+_(+l);m=n/+h[8616];break}else{uk(210984,(v=i,i=i+24|0,c[v>>2]=f,c[v+8>>2]=56976,h[v+16>>3]=l,v)|0)}}}while(0);h[d>>3]=+(~~(+(c[17224]|0)+(m- +h[8599])*+h[8613]+.5)|0)}else if((j|0)==3){h[d>>3]=+h[b+16>>3]*+(((c[(c[3524]|0)+8>>2]|0)-1|0)>>>0>>>0)}else if((j|0)==0){m=+h[b+16>>3];do{if((a[66164]&1)==0){o=m}else{if(m>0.0){l=+_(+m);o=l/+h[8272];break}else{uk(210984,(v=i,i=i+24|0,c[v>>2]=f,c[v+8>>2]=56880,h[v+16>>3]=m,v)|0)}}}while(0);h[d>>3]=+(~~(+(c[16536]|0)+(o- +h[8255])*+h[8269]+.5)|0)}j=c[b+4>>2]|0;if((j|0)==2){k=c[7940]|0;h[e>>3]=+(k|0)+ +h[b+24>>3]*+((c[7941]|0)-k|0)}else if((j|0)==3){h[e>>3]=+h[b+24>>3]*+(((c[(c[3524]|0)+12>>2]|0)-1|0)>>>0>>>0)}else if((j|0)==1){o=+h[b+24>>3];do{if((a[68228]&1)==0){p=o}else{if(o>0.0){m=+_(+o);p=m/+h[8530];break}else{uk(210984,(v=i,i=i+24|0,c[v>>2]=f,c[v+8>>2]=56952,h[v+16>>3]=o,v)|0)}}}while(0);h[e>>3]=+(~~(+(c[17052]|0)+(p- +h[8513])*+h[8527]+.5)|0)}else if((j|0)==0){p=+h[b+24>>3];do{if((a[65476]&1)==0){q=p}else{if(p>0.0){o=+_(+p);q=o/+h[8186];break}else{uk(210984,(v=i,i=i+24|0,c[v>>2]=f,c[v+8>>2]=56856,h[v+16>>3]=p,v)|0)}}}while(0);h[e>>3]=+(~~(+(c[16364]|0)+(q- +h[8169])*+h[8183]+.5)|0)}else if((j|0)==4){h[e>>3]=+h[b+24>>3]*+((c[(c[3524]|0)+16>>2]|0)>>>0>>>0)}h[d>>3]=+h[d>>3]+.5;h[e>>3]=+h[e>>3]+.5;i=g;return}function fS(b,d){b=b|0;d=d|0;var e=0,f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,Q=0,R=0,U=0,V=0,W=0,X=0,Y=0,Z=0,$=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0,aA=0,aB=0,aC=0,aD=0,aE=0,aF=0,aG=0,aH=0,aI=0,aJ=0,aK=0,aL=0,aM=0,aO=0,aP=0,aQ=0,aR=0,aS=0,aT=0,aU=0,aV=0,aW=0,aX=0,aY=0,aZ=0,a_=0,a$=0,a0=0,a1=0,a2=0,a3=0,a4=0,a5=0.0,a6=0.0,a7=0.0,a8=0.0,a9=0.0,ba=0.0,bb=0.0,bc=0.0,bd=0.0,be=0.0,bf=0.0,bg=0.0,bh=0,bi=0,bj=0,bk=0,bl=0,bm=0,bn=0,bo=0,bp=0,bq=0,br=0,bs=0,bt=0,bu=0,bv=0,bx=0,by=0,bz=0,bA=0,bB=0,bC=0,bD=0.0,bE=0.0,bF=0,bG=0,bH=0,bI=0,bJ=0,bK=0,bL=0,bN=0,bO=0,bP=0,bQ=0,bR=0,bS=0,bT=0,bU=0,bV=0,bW=0,bX=0,bY=0,bZ=0,b_=0,b$=0,b0=0,b1=0,b2=0,b3=0,b4=0,b5=0,b6=0,b7=0,b8=0,b9=0,ca=0,cb=0,cc=0,cd=0,ce=0,cf=0,cg=0,ch=0,ci=0,cj=0,ck=0,cl=0,cm=0,cn=0,co=0,cp=0,cq=0,cr=0,cs=0.0,ct=0.0,cu=0,cv=0,cw=0,cx=0,cz=0,cA=0.0,cB=0,cC=0.0,cD=0,cE=0,cF=0.0,cH=0.0,cJ=0.0,cL=0,cP=0,cQ=0,cT=0,cU=0,cV=0,cW=0,cX=0,cY=0,cZ=0,c_=0,c$=0,c0=0,c1=0,c2=0,c3=0,c4=0,c5=0,c6=0,c7=0,c8=0,c9=0,da=0,df=0,dh=0,di=0,dj=0,dl=0,dm=0,dn=0,dp=0,dq=0,dr=0.0,ds=0.0,dt=0.0,du=0.0,dv=0.0,dw=0.0,dx=0.0,dy=0.0,dA=0,dB=0,dC=0,dE=0,dF=0,dG=0,dH=0,dI=0,dJ=0.0,dK=0.0,dL=0,dM=0,dN=0,dO=0,dP=0,dQ=0,dR=0,dS=0,dT=0,dU=0,dV=0.0,dW=0.0,dX=0.0,dY=0.0,dZ=0.0,d_=0,d$=0,d0=0,d1=0.0,d2=0.0,d3=0,d4=0,d5=0.0,d6=0.0,d7=0.0,d8=0.0,d9=0.0,ea=0,eb=0,ec=0,ed=0,ee=0,ef=0.0,eg=0.0,eh=0,ei=0.0,ej=0,ek=0,el=0.0,em=0,en=0,eo=0,ep=0,eq=0,er=0,es=0.0,et=0,eu=0,ev=0.0,ew=0.0,ex=0,ey=0,ez=0.0,eA=0.0,eB=0.0,eC=0,eD=0,eE=0,eF=0.0,eG=0,eH=0,eI=0,eJ=0,eK=0.0,eL=0.0,eM=0.0,eN=0,eO=0.0,eP=0.0,eQ=0.0,eR=0.0,eS=0.0,eT=0,eU=0.0,eV=0.0,eW=0,eX=0,eY=0.0,eZ=0.0,e_=0,e$=0,e0=0,e1=0,e2=0,e3=0,e4=0,e5=0,e6=0,e7=0,e8=0,e9=0,fa=0,fb=0.0,fc=0,fd=0,fe=0,ff=0,fg=0,fh=0.0,fi=0.0,fj=0;e=i;i=i+1424|0;f=e|0;j=e+8|0;k=e+16|0;l=e+24|0;m=e+32|0;n=e+40|0;o=e+48|0;p=e+56|0;q=e+64|0;r=e+80|0;s=e+352|0;t=e+368|0;u=e+384|0;w=e+392|0;x=e+400|0;y=e+416|0;z=e+424|0;A=e+432|0;B=e+496|0;C=e+504|0;D=e+512|0;E=e+552|0;F=e+568|0;G=e+576|0;H=e+584|0;I=e+624|0;J=e+640|0;K=e+768|0;L=e+776|0;M=e+784|0;N=e+808|0;O=e+816|0;Q=e+824|0;R=e+840|0;U=e+856|0;V=e+864|0;W=e+880|0;X=e+888|0;Y=e+896|0;Z=e+904|0;$=e+912|0;ab=e+920|0;ac=e+928|0;ad=e+936|0;ae=e+944|0;af=e+952|0;ag=e+960|0;ah=e+968|0;ai=e+976|0;aj=e+984|0;ak=e+992|0;al=e+1008|0;am=e+1016|0;an=e+1024|0;ao=e+1032|0;ap=e+1040|0;aq=e+1048|0;ar=e+1056|0;as=e+1064|0;at=e+1072|0;au=e+1080|0;av=e+1088|0;aw=e+1096|0;ax=e+1104|0;ay=e+1112|0;az=e+1120|0;aA=e+1128|0;aB=e+1136|0;aC=e+1144|0;aD=e+1152|0;aE=e+1160|0;aF=e+1168|0;aG=e+1176|0;aH=e+1184|0;aI=e+1192|0;aJ=e+1200|0;aK=e+1208|0;aL=e+1216|0;aM=e+1224|0;aO=e+1232|0;aP=e+1240|0;aQ=e+1248|0;aR=e+1256|0;aS=e+1264|0;aT=e+1272|0;aU=e+1280|0;aV=e+1288|0;aW=e+1296|0;aX=e+1304|0;aY=e+1312|0;aZ=e+1320|0;a_=e+1328|0;a$=e+1336|0;a0=e+1344|0;a1=e+1352|0;a2=e+1360|0;a3=e+1368|0;a4=c[3524]|0;c[aS>>2]=0;c[aT>>2]=0;c[200]=2;c[144]=1;if((c[14091]|0)==2){a5=+P(+(+h[8170]- +h[8169]));a6=a5*+h[7048]}else{a6=+h[7048]}if((c[1057]|0)==2){a5=+P(+(+h[8170]- +h[8169]));a7=a5*+h[531]}else{a7=+h[531]}if((c[8764]|0)==2){a5=+P(+(+h[8256]- +h[8255]));a8=a5*+h[4384]}else{a8=+h[4384]}if((c[6588]|0)==2){a5=+P(+(+h[8256]- +h[8255]));a9=a5*+h[3296]}else{a9=+h[3296]}a5=+h[8169];ba=+h[8170];if(a5>3<<3,c[v>>2]=0,v)|0)}if(bd==be){uf(-1,124848,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}lk();if((a[14080]&1)==0){lk()}do{if(a[14088]|0){if((a[33512]&1)==0){break}if(!(a[13032]|0)){break}bh=c[(c[3524]|0)+104>>2]|0;if((bh|0)!=0){cS[bh&511]()}a[13032]=0}else{cS[c[(c[3524]|0)+52>>2]&511]();a[14088]=1}}while(0);cM[c[(c[3524]|0)+168>>2]&511](0);bh=c[3524]|0;if((c[bh+96>>2]&16|0)!=0){c[7271]=-1}c[13880]=0;c[13881]=(c[bh+8>>2]|0)-1;c[13882]=0;c[13883]=(c[bh+12>>2]|0)-1;i6(0,1);c[ap>>2]=0;c[aq>>2]=0;c[ar>>2]=0;bh=c[3524]|0;bi=bh+72|0;bj=(cO[c[bi>>2]&255](-270)|0)!=0;bk=bj?c[1164]|0:0;bl=c[16602]|0;bm=c[17290]|0;bn=bj?c[16430]|0:0;bo=bj?c[17118]|0:0;a[35184]=a[36120]&1;c[1098]=0;c[206]=0;c[188]=0;c[148]=0;c[48]=0;c[174]=0;bp=c[1119]|0;if((bp|0)!=0){ga(bp,4392)}bp=c[16629]|0;if((bp|0)!=0){ga(bp,752)}do{if((c[(c[3524]|0)+96>>2]&32|0)!=0){bp=c[16629]|0;if((bp|0)==0){break}if((cy(bp|0,137224)|0)==0){break}c[188]=(c[188]|0)+1}}while(0);bp=c[17317]|0;if((bp|0)!=0){ga(bp,824)}bp=c[16457]|0;if((bp|0)!=0){ga(bp,192)}bp=c[17145]|0;if((bp|0)!=0){ga(bp,592)}do{if((c[16573]|0)!=0){ga(66240,696);if((c[174]|0)!=0|(c[16580]|0)==0){break}c[174]=1}}while(0);if((c[17261]|0)!=0){ga(68992,808)}if((c[16401]|0)!=0){ga(65552,ap)}if((c[17089]|0)!=0){ga(68304,aq)}bp=c[1183]|0;if((bp|0)!=0){ga(bp,ar)}if((c[1098]|0)==0){bq=0}else{fN(4560,as,at,135256);be=+(aa((c[1098]|0)+1|0,c[bh+16>>2]|0)>>>0>>>0);bq=~~(+h[at>>3]+be)}do{if((c[206]|0)==0){br=0;bs=c[17261]|0;bt=9319}else{fN(69352,au,av,135256);at=c[bh+16>>2]|0;be=+(aa(at,c[206]|0)>>>0>>>0);as=~~(+h[av>>3]+be);bp=c[17261]|0;if((bp|0)!=0){br=as;bs=bp;bt=9319;break}bu=0;bv=~~(+(at>>>0>>>0)*.5+ +(as|0));bx=1}}while(0);do{if((bt|0)==9319){if((bs&1|0)==0){bu=0;bv=br;bx=1;break}bu=aa(c[bh+16>>2]|0,c[202]|0);bv=br;bx=0}}while(0);do{if((a[69200]&1)==0){if(bx){if((c[16573]&5|0)!=5){by=0;break}}by=~~(+((c[bh+24>>2]|0)>>>0>>>0)*+h[8648])}else{by=0}}while(0);if((c[1183]|0)==0|(c[1166]|0)!=0){bz=0}else{fN(4816,aw,ax,135256);be=+(aa((c[ar>>2]|0)+2|0,c[bh+16>>2]|0)>>>0>>>0);bz=~~(+h[ax>>3]+be)}if((c[16457]|0)==0|bj){bA=0}else{fN(65912,ay,az,135256);be=+(aa(c[bh+16>>2]|0,c[48]|0)>>>0>>>0);bA=~~(+h[az>>3]+be)}if((c[17145]|0)==0|bj){bB=0}else{fN(68664,aA,aB,135256);be=+(aa(c[bh+16>>2]|0,c[148]|0)>>>0>>>0);bB=~~(+h[aB>>3]+be)}be=+g[38]+ +g[44];aB=bh+12|0;aA=~~(be*+(((c[aB>>2]|0)-1|0)>>>0>>>0)+.5);c[7941]=aA;bd=+h[535];do{if((c[1066]|0)==3){c[7941]=~~(bd*+(((c[aB>>2]|0)-1|0)>>>0>>>0))}else{if(bd>=0.0){c[7941]=aA-~~(bd*+((c[bh+16>>2]|0)>>>0>>>0)+.5);break}az=bv+bq|0;ay=bA+bz|0;ax=(ay|0)>(az|0)?ay:az;az=(by+bu|0)+((bB|0)>(ax|0)?bB:ax)|0;if((az|0)>(by|0)){bC=(c[bh+16>>2]|0)+az|0}else{bC=az}az=aA-bC|0;c[7941]=az;if((az|0)!=(~~(be*+(((c[aB>>2]|0)-1|0)>>>0>>>0)+.5)|0)){break}c[7941]=az-(c[bh+20>>2]<<1)}}while(0);if((c[8786]|0)==3){bD=+h[4395]*+((c[bh+8>>2]|0)>>>0>>>0)}else{be=+h[4395];bD=+g[184]*+((c[bh+8>>2]|0)>>>0>>>0)+ +((c[bh+20>>2]|0)>>>0>>>0)*(be>=0.0?be:1.0)}c[7938]=~~bD;if((c[6598]|0)==3){bE=+h[3301]*+(((c[bh+8>>2]|0)-1|0)>>>0>>>0)}else{bD=+h[3301];bE=(+g[178]+ +g[184])*+(((c[bh+8>>2]|0)-1|0)>>>0>>>0)- +((c[bh+20>>2]|0)>>>0>>>0)*(bD>=0.0?bD:2.0)}c[7939]=~~bE;bC=c[16573]|0;if((bC&2|0)==0){bF=0;bt=9351}else{bE=+h[8169];bD=+h[8170];if(bE0.0|bD<0.0){bt=9349}else{bG=0}}else{if(bD>0.0|bE<0.0){bt=9349}else{bG=0}}if((bt|0)==9349){bG=1}if(+P(+(bE/(bD-bE)))<.05){bt=9352}else{bF=bG;bt=9351}}if((bt|0)==9351){if((bC&1|0)!=0|bF){bt=9352}else{bH=0}}if((bt|0)==9352){bH=aa((c[174]|0)+1|0,c[bh+16>>2]|0)}do{if((a[66448]&1)==0){if((bC&1|0)==0){if((c[17261]&5|0)!=5){bI=0;break}}bI=~~(+((c[bh+24>>2]|0)>>>0>>>0)*+h[8304])}else{bI=0}}while(0);do{if((c[188]|0)==0){bJ=0}else{fN(66600,aC,aD,135256);bE=+((c[bh+16>>2]|0)>>>0>>>0);bC=~~(bE*(+(c[188]|0)+.2)- +h[aD>>3]);if((c[16573]|0)!=0){bJ=bC;break}bJ=~~(bE*.5+ +(bC|0))}}while(0);if((c[1183]|0)!=0&(c[1166]|0)!=0){fN(4816,aE,aF,135256);bE=+(aa(c[bh+16>>2]|0,c[ar>>2]|0)>>>0>>>0);bK=~~(bE- +h[aF>>3])}else{bK=0}bE=+g[44];aF=~~(bE*+((c[aB>>2]|0)>>>0>>>0));c[7940]=aF;bD=+h[7052];do{if((c[14100]|0)==3){c[7940]=~~(bD*+((c[aB>>2]|0)>>>0>>>0))}else{if(bD>=0.0){c[7940]=~~(+(aF|0)+(bD*+((c[bh+16>>2]|0)>>>0>>>0)+.5));break}aE=(((bI+bH|0)+((bJ|0)>0?bJ:0)|0)+((bK|0)>0?bK:0)|0)+aF|0;c[7940]=aE;if((aE|0)!=(~~(bE*+((c[aB>>2]|0)>>>0>>>0))|0)){break}c[7940]=(c[bh+20>>2]<<1)+aE}}while(0);L12774:do{if((a[35184]&1)==0){bL=1;bN=0}else{bE=+h[3817];aF=~~(bE*+((c[bh+28>>2]|0)>>>0>>>0));c[8240]=aF;aE=~~(bE*+((c[bh+24>>2]|0)>>>0>>>0));c[8242]=aE;bE=+h[4524];if(bE<0.0){bO=0}else{bO=~~(+(aF|0)+bE*+((c[bh+20>>2]|0)>>>0>>>0))}c[9e3]=bO;bE=+h[4525];aF=~~(+(aE|0)*1.25*bE);c[9020]=aF;aE=bh+16|0;aD=c[aE>>2]|0;if(aF>>>0>>0){aC=~~(bE*+(aD>>>0>>>0));c[9020]=aC;bP=aC}else{bP=aF}if((bP|0)==0){c[9020]=1}if((d|0)>0){aF=0;aC=0;aD=0;bC=0;bF=b;while(1){bG=bF+16|0;aA=c[bG>>2]|0;do{if((aA|0)==0){bQ=aD;bR=aF}else{if((a[bF+22|0]&1)!=0){bQ=aD;bR=aF;break}az=a[bF+20|0]&1;do{if(az<<24>>24==0){bS=aA}else{if((a[37456]&1)!=0){bS=aA;break}a[37456]=1;ax=c[(c[3524]|0)+88>>2]|0;if((ax|0)==0){bS=aA;break}cO[ax&255](179864);bS=c[bG>>2]|0}}while(0);a[37456]=az;ax=lp(bS)|0;if((ax|0)==0){bT=aD;bU=aF}else{bT=aD+1|0;bU=(ax|0)>(aF|0)?ax:aF}a[37456]=0;bQ=bT;bR=bU}}while(0);bG=bF+12|0;aA=c[bG>>2]|0;ax=(aA|0)==392;if(ax&(bC|0)==392){bV=((c[bF+280>>2]|0)==0&(bQ|0)>1&1)+bQ|0}else{bV=bQ}do{if(ax){ay=c[bF+224>>2]|0;if((ay|0)==0){bW=bV;bX=bR;bY=392;break}aw=c[ay>>2]|0;if((aw|0)==0){bW=bV;bX=bR;bY=392;break}else{bZ=bR;b_=bV;b$=aw}do{b_=b_+1|0;aw=c[b$+60>>2]|0;if((aw|0)==0){b0=0}else{b0=lp(aw)|0}bZ=(b0|0)>(bZ|0)?b0:bZ;b$=c[b$>>2]|0;}while((b$|0)!=0);bW=b_;bX=bZ;bY=c[bG>>2]|0}else{bW=bV;bX=bR;bY=aA}}while(0);aA=aC+1|0;if((aA|0)<(d|0)){aF=bX;aC=aA;aD=bW;bC=bY;bF=c[bF>>2]|0}else{b1=bX;b2=bW;break}}}else{b1=0;b2=0}c[6960]=b2;c[8710]=b1;bF=ga(36288,aG)|0;bC=~~(+(bF|0)-(+h[4524]+2.0));bF=c[8710]|0;aD=(c[9047]|0)==1;if((bC|0)<=(bF|0)|aD){b3=bF}else{c[8710]=bC;b3=bC}bE=+(c[aG>>2]|0);h[4488]=bE;if((a[36229]&1)==0){c[9008]=0;bC=c[9e3]|0;c[9004]=bC;bF=bh+20|0;aC=~~(+((c[bF>>2]|0)>>>0>>>0)*(+(b3+1|0)+ +h[4526]));c[8988]=-aC;c[8984]=-(c[bF>>2]|0);c[8996]=aC;b4=(c[bF>>2]|0)+bC|0;b5=0;b6=bC;b7=aC}else{aC=c[9e3]|0;bC=-aC|0;c[9008]=bC;c[9004]=0;bF=bh+20|0;c[8988]=c[bF>>2];aF=~~(+((c[bF>>2]|0)>>>0>>>0)*(+(b3+1|0)+ +h[4526]));c[8984]=aF;aA=(c[bF>>2]|0)+aC|0;c[8996]=aA;b4=aF;b5=bC;b6=0;b7=aA}c[8992]=b4;c[9016]=(b5+b6|0)/2&-1;aA=b4+b7|0;c[9026]=aA;bC=c[6960]|0;c[9012]=bC;do{if(aD){aF=(c[7939]|0)-(c[7938]|0)|0;aC=(aF|0)/(aA|0)&-1;bF=c[9338]|0;bG=(bF|0)>0&(aC|0)>(bF|0)?bF:aC;if((bG|0)==0){c[9026]=aF;b8=1;b9=1;ca=aF}else{b8=0;b9=bG;ca=aA}bG=bC-1|0;aF=(bG+b9|0)/(b9|0)&-1;c[9012]=aF;if((aF|0)==0){cb=1}else{cb=(bG+aF|0)/(aF|0)&-1}bG=(cb|0)==0;cc=bG|b8<<24>>24!=0;cd=bG?1:cb;ce=aF;cf=ca}else{bD=+((c[aE>>2]|0)>>>0>>>0);aF=(~~(+((c[7941]|0)-(c[7940]|0)|0)- +h[4527]*bD-(bE+1.0)*bD)|0)/(c[9020]|0)&-1;bG=c[9339]|0;aC=(bG|0)>0&(aF|0)>(bG|0)?bG:aF;aF=(aC|0)==0;bG=aF?1:aC;if((bC|0)<=(bG|0)){cc=aF;cd=1;ce=bC;cf=aA;break}aC=bC-1|0;bF=(bG+aC|0)/(bG|0)&-1;bG=(bF|0)==0;ax=bG?1:bF;bF=(ax+aC|0)/(ax|0)&-1;c[9012]=bF;cc=bG|aF;cd=ax;ce=bF;cf=aA}}while(0);aA=c[9031]|0;if((aA|0)==1){if((c[9045]|0)!=1|(c[9044]|0)!=1){bt=9410}else{bt=9421}}else if((aA|0)==2){bt=9410}else{bt=9421}do{if((bt|0)==9410){aA=c[9032]|0;if((aA|0)==1&+h[7052]<0.0){bC=aa(c[9020]|0,ce);bD=+((c[aE>>2]|0)>>>0>>>0);aD=(((c[7940]|0)+bC|0)+~~((bE+1.0)*bD)|0)+~~(bD*+h[4527])|0;if((aD|0)>(c[7941]|0)){cg=0;break}c[7940]=aD;if(cc){cg=0;break}else{bL=cd;bN=0;break L12774}}if((aA|0)==0&+h[535]<0.0){aD=aa(c[9020]|0,ce);bD=+((c[aE>>2]|0)>>>0>>>0);bC=(((c[7941]|0)-aD|0)-~~((bE+1.0)*bD)|0)+~~(bD*+h[4527])|0;if((bC|0)<(c[7940]|0)){cg=0;break}c[7941]=bC;if(cc){cg=0;break}else{bL=cd;bN=0;break L12774}}if((aA|0)==2&+h[4395]<0.0){bC=aa(cd,cf);aD=c[7938]|0;bF=(aD+bC|0)>(c[7939]|0);ax=bF?0:bC;c[7938]=ax+aD;if(bF|cc){cg=ax;break}else{bL=cd;bN=ax;break L12774}}if(!((aA|0)==3&+h[3301]<0.0)){bt=9421;break}aA=aa(cd,cf);ax=(c[7939]|0)-aA|0;if((ax|0)<(c[7938]|0)){cg=0;break}c[7939]=ax;if(cc){cg=0}else{bL=cd;bN=0;break L12774}}}while(0);if((bt|0)==9421){if(cc){cg=0}else{bL=cd;bN=0;break}}uh(-1,133720,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);bL=cd;bN=cg}}while(0);dd(1,20);dd(5,20);do{if(a[31104]|0){dk();dc(3,132208);if((a[54016]|0)==110){break}dd(3,20)}}while(0);cg=c[16401]|0;if((cg&2|0)==0){ch=0;bt=9432}else{bE=+h[8255];bD=+h[8256];if(bE0.0|bD<0.0){bt=9430}else{ci=0}}else{if(bD>0.0|bE<0.0){bt=9430}else{ci=0}}if((bt|0)==9430){ci=1}if(+P(+(bE/(bD-bE)))<.1){bt=9433}else{ch=ci;bt=9432}}if((bt|0)==9432){if((cg&1|0)!=0|ch){bt=9433}else{cj=0}}do{if((bt|0)==9433){if((bn|0)==0){c[216]=0;de(1,14);cj=aa((c[216]|0)+2|0,c[bh+20>>2]|0);break}else{cj=aa((c[ap>>2]|0)+2|0,c[bh+16>>2]|0);break}}}while(0);do{if((a[65760]&1)==0){if((c[16401]&1|0)==0){if((c[17089]&5|0)!=5){ck=0;break}}ck=~~(+((c[bh+28>>2]|0)>>>0>>>0)*+h[8218])}else{ck=0}}while(0);ap=bj^1;do{if((c[16457]|0)==0|ap){cl=0}else{fN(65912,aH,aI,135256);bj=c[bh+16>>2]|0;bE=+(aa(bj,c[48]|0)>>>0>>>0);ch=~~(bE- +h[aH>>3]);if((c[16401]|0)!=0){cl=ch;break}cl=~~(+(bj>>>0>>>0)*.5+ +(ch|0))}}while(0);aH=(bk|0)==0;if((c[1183]|0)==0|aH){cm=0}else{fN(4816,aJ,aK,135256);cm=~~((+(c[ar>>2]|0)+1.5)*+((c[bh+16>>2]|0)>>>0>>>0)- +h[aJ>>3])}if(+h[4395]<0.0){aJ=(bN|0)<(cm|0)?cm:bN;bN=bh+8|0;ar=ck+cj|0;c[7938]=(((aJ|0)<(cl|0)?cl:aJ)+ar|0)+~~(+g[184]*+((c[bN>>2]|0)>>>0>>>0));fN(4816,aL,aM,135256);aM=c[7938]|0;do{if(aH){aJ=~~+h[aL>>3];if((aM-ar|0)>=(-aJ|0)){cn=aM;break}aK=ar-aJ|0;c[7938]=aK;cn=aK}else{cn=aM}}while(0);aM=bh+20|0;if((cn|0)==(~~(+((c[bN>>2]|0)>>>0>>>0)*+g[184])|0)){bN=(c[aM>>2]<<1)+cn|0;c[7938]=bN;co=bN}else{co=cn}c[7938]=~~(+(co|0)+ +((c[aM>>2]|0)>>>0>>>0)*.5)}do{if((c[17089]&1|0)==0){cp=0}else{if((bo|0)==0){c[216]=0;de(5,14);cp=aa((c[216]|0)+2|0,c[bh+20>>2]|0);break}else{cp=aa((c[aq>>2]|0)+2|0,c[bh+16>>2]|0);break}}}while(0);aq=c[16580]|0;do{if((aq|0)==0){cq=0}else{aM=c[7939]|0;co=c[7938]|0;h[8269]=+(aM-co|0)/(+h[8256]- +h[8255]);c[16536]=co;c[16537]=aM;co=aq;cn=aM;L12904:while(1){aM=c[co+8>>2]|0;do{if((aM|0)==0){cr=cn}else{bE=+(lp(aM)|0);bN=c[16602]|0;bD=bE*+S(+(+(bN|0)*.017453292519943295));ar=~~(bD*+((c[(c[3524]|0)+20>>2]|0)>>>0>>>0));bD=+h[8257];bE=+h[8258];cs=+h[co>>3];if(bDbE){cr=cn;break}}else{if(csbD){cr=cn;break}}if((a[66164]&1)==0){ct=cs}else{if(cs<=0.0){bt=9464;break L12904}bD=+_(+cs);ct=bD/+h[8272]}if((bN|0)==0){cu=(ar|0)/2&-1}else{cu=ar}bD=+(~~(+(c[16536]|0)+(ct- +h[8255])*+h[8269]+.5)|0)+ +(cu|0);if(+(cn|0)>=bD){cr=cn;break}cr=~~bD}}while(0);aM=c[co+16>>2]|0;if((aM|0)==0){break}else{co=aM;cn=cr}}if((bt|0)==9464){uk(210984,(v=i,i=i+24|0,c[v>>2]=130992,c[v+8>>2]=56880,h[v+16>>3]=cs,v)|0)}cn=cr-(c[7939]|0)|0;co=(c[(c[3524]|0)+8>>2]|0)>>>2;if(cn>>>0<=co>>>0){cq=cn;break}uh(-1,129936,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);cq=co}}while(0);do{if((a[68512]&1)==0){if((c[17089]&1|0)==0){if((c[16401]&5|0)!=5){cv=0;break}}cv=~~(+((c[bh+28>>2]|0)>>>0>>>0)*+h[8562])}else{cv=0}}while(0);do{if((c[17145]|0)==0|ap){cw=0}else{fN(68664,aO,aP,135256);cr=c[bh+16>>2]|0;cs=+(aa(cr,c[148]|0)>>>0>>>0);cu=~~(+h[aO>>3]+cs);if((c[17089]|0)!=0){cw=cu;break}cw=~~(+(cr>>>0>>>0)*.5+ +(cu|0))}}while(0);do{if((c[6598]|0)!=3){aO=a[54016]|0;if(a[31104]&aO<<24>>24!=110){if(!((aO<<24>>24|0)==110|(aO<<24>>24|0)==117)){aO=c[7939]|0;aP=~~(+(aO|0)- +(aO-(c[7938]|0)|0)*.1);c[7939]=aP;c[7939]=aP+((c[bh+20>>2]|0)*-3&-1)}c[13507]=0}if(+h[3301]>=0.0){break}aP=c[7939]|0;c[13507]=aP;aO=(((cw|0)>0?-cw|0:0)-(cv+cp|0)|0)+aP|0;c[7939]=aO;cu=bh+20|0;cs=(+g[178]+ +g[184])*+(((c[bh+8>>2]|0)-1|0)>>>0>>>0)- +(c[cu>>2]<<1>>>0>>>0);if(+(aO|0)>cs){cr=~~cs;c[7939]=cr;cx=cr}else{cx=aO}c[13507]=aP-cx;aP=c[(c[3524]|0)+8>>2]|0;if((aP-cx|0)>>>0>>0){aO=aP-cq|0;c[7939]=aO;cz=aO}else{cz=cx}c[7939]=~~(+(cz|0)- +((c[cu>>2]|0)>>>0>>>0))}}while(0);dd(2,20);dd(6,20);if((a[30528]&1)!=0){dd(7,10)}cs=+g[18074];do{if(cs!=0.0){do{if(cs<0.0){cz=c[200]|0;ct=+h[64672+(cz*688&-1)>>3]- +h[64664+(cz*688&-1)>>3];if(ct==0.0){bt=9497;break}cz=c[144]|0;cA=(-0.0-cs)*+P(+((+h[64672+(cz*688&-1)>>3]- +h[64664+(cz*688&-1)>>3])/ct))}else{bt=9497}}while(0);if((bt|0)==9497){cA=cs}if(!(cA>=.01&cA<=100.0)){break}cz=c[7941]|0;cx=c[7940]|0;cq=cz-cx|0;ct=+(cq|0);cu=c[7939]|0;aO=c[7938]|0;aP=cu-aO|0;bD=+(aP|0);bE=cA*+((c[bh+24>>2]|0)>>>0>>>0)/+((c[bh+28>>2]|0)>>>0>>>0);if(ct/bD>bE){cr=~~(bD*bE);if((c[14100]|0)==3){c[7941]=cr+cx;break}if((c[1066]|0)==3){c[7940]=cz-cr;break}else{aq=(cq-cr|0)/2&-1;c[7940]=aq+cx;c[7941]=cz-aq;break}}else{aq=~~(ct/bE);if((c[8786]|0)==3){c[7939]=aq+aO;break}if((c[6598]|0)==3){c[7938]=cu-aq;break}else{cz=(aP-aq|0)/2&-1;c[7938]=cz+aO;c[7939]=cu-cz;break}}}}while(0);cz=(bm|0)==0|ap;do{if((c[17261]&1|0)==0|cz){cB=bu}else{cA=+T(+(+(c[17290]|0)*.017453292519943295));bm=c[17314]|0;if((bm|0)==2){cC=cA*-1.0}else if((bm|0)==1){cC=+P(+cA)*.5}else{cC=cA}c[216]=0;de(6,14);bm=+h[535]<0.0;if(bm){c[7941]=(c[7941]|0)+bu}if(cC>0.0){cD=~~(+(bu|0)+cC*+(aa(c[216]|0,c[bh+20>>2]|0)|0))}else{cD=bu}if(!bm){cB=cD;break}c[7941]=(c[7941]|0)-cD;cB=cD}}while(0);cD=(bl|0)==0|ap;do{if((c[16573]&1|0)==0|cD){cE=bH}else{bl=c[16602]|0;do{if((bl|0)==(-270|0)){if((a[66648]&1)!=0){cF=-1.0;bt=9525;break}c[16626]=2;cH=-1.0;bt=9526}else if((bl|0)==90){cF=-1.0;bt=9525}else{cF=-0.0- +T(+(+(bl|0)*.017453292519943295));bt=9525}}while(0);if((bt|0)==9525){if((c[16626]|0)==2){cH=cF;bt=9526}else{cJ=cF}}if((bt|0)==9526){cJ=cH*-1.0}c[216]=0;de(2,14);bl=+h[7052]<0.0;if(bl){c[7940]=(c[7940]|0)-bH}if(cJ>0.0){cC=cJ*+(aa(c[216]|0,c[bh+20>>2]|0)|0);cL=~~(+((c[bh+16>>2]|0)>>>0>>>0)+cC)}else{cL=bH}if(!bl){cE=cL;break}c[7940]=(c[7940]|0)+cL;cE=cL}}while(0);cL=c[7941]|0;bH=c[7940]|0;if((cL|0)<(bH|0)){c[7941]=bH;c[7940]=cL;cP=bH;cQ=cL}else{cP=cL;cQ=bH}bH=((by+bv|0)+cB|0)+cP|0;c[208]=bH;do{if((cB|0)==0){cT=bH}else{if((bv|bq|0)==0){cT=bH;break}cL=(c[bh+16>>2]|0)+bH|0;c[208]=cL;cT=cL}}while(0);bH=cT+bq|0;c[1102]=bH;cT=((bA+by|0)+cB|0)+cP|0;c[50]=cT;c[150]=((bB+by|0)+cB|0)+cP;bB=bJ+bI|0;cL=bh+16|0;bl=~~(+(cQ-(cE+bB|0)|0)+ +((c[cL>>2]|0)>>>0>>>0)*(+(c[188]|0)+.2));c[190]=bl;bu=c[7938]|0;bm=(bu-ck|0)-cj|0;c[52]=bm;if(!((c[16457]|0)==0|ap)){c[52]=bm-cl}cl=(cv+cp|0)+(c[7939]|0)|0;c[152]=cl;if(!((c[17145]|0)==0|ap)){c[152]=(cl+cw|0)-aa(c[cL>>2]|0,c[148]|0)}cw=(bk|0)!=0;bk=(c[1166]|0)!=0;do{if(cw){if(bk){cU=(bJ-bK|0)+bl|0;bt=9551;break}else{c[1216]=(bz-(bv+bq|0)|0)+bH;bt=9552;break}}else{if(bk){c[1216]=(cQ-((bK+bB|0)+cE|0)|0)+(c[cL>>2]|0);bt=9553;break}if((bA|0)>0){c[1216]=cT+bz;bt=9553;break}else{cU=(((bz+by|0)+cB|0)+cP|0)+(c[bh+20>>2]|0)|0;bt=9551;break}}}while(0);if((bt|0)==9551){c[1216]=cU;if(cw){bt=9552}else{bt=9553}}if((bt|0)==9553){fN(4816,aQ,aR,135256);aR=c[7938]|0;cV=(aR-(ck+cj|0)|0)+~~+h[aQ>>3]|0;cW=c[7940]|0;cX=c[7941]|0;cY=aR}else if((bt|0)==9552){cV=bu-((ck+cj|0)+cm|0)|0;cW=cQ;cX=cP;cY=bu}c[1218]=cV;cV=bh+20|0;c[176]=(cW-bI|0)-(c[(cD?cL:cV)>>2]|0);if(cz){cZ=cB}else{cZ=c[cV>>2]|0}c[204]=(cX+by|0)+cZ;if((bn|0)==0){c_=c[cV>>2]|0}else{c_=cj-(c[cL>>2]|0)|0}c[36]=(cY-ck|0)-c_;c[146]=((c[7939]|0)+cv|0)+(c[((bo|0)==0?cV:cL)>>2]|0);cO[c[bi>>2]&255](0);bi=c[7941]|0;bo=c[7940]|0;cJ=+(bi-bo|0);h[8183]=cJ/(+h[8170]- +h[8169]);h[8527]=cJ/(+h[8514]- +h[8513]);cv=c[7939]|0;c_=c[7938]|0;cJ=+(cv-c_|0);h[8269]=cJ/(+h[8256]- +h[8255]);h[8613]=cJ/(+h[8600]- +h[8599]);c[16536]=c_;c[16537]=cv;c[16364]=bo;c[16365]=bi;c[17224]=c_;c[17225]=cv;c[17052]=bo;c[17053]=bi;ck=aa(c[9026]|0,bL);cJ=+((c[cL>>2]|0)>>>0>>>0);cH=+h[4488]*cJ;cL=~~(cH+ +(aa(c[9020]|0,c[9012]|0)|0));bL=cL+~~(cJ*+h[4527])|0;cL=c[9031]|0;do{if((cL|0)==1){if((c[9044]|0)==1&(c[9045]|0)==1){bt=9564}else{bt=9570}}else if((cL|0)==0){cY=c[9044]|0;if((cY|0)==0){cj=bi-(c[bh+24>>2]|0)|0;c[9337]=cj;c[9336]=cj-bL;bt=9565;break}else if((cY|0)==2){cY=(c[bh+24>>2]|0)+bo|0;c[9336]=cY;c[9337]=cY+bL;bt=9565;break}else{bt=9564;break}}else{if((cL-1|0)>>>0<2){bt=9570;break}fR(36136,an,ao,128552);cY=~~+h[an>>3];cj=~~+h[ao>>3];c[9334]=cY;bn=c[9045]|0;if((bn|0)==1){cZ=cY-((ck|0)/2&-1)|0;c[9334]=cZ;c$=cZ}else if((bn|0)==2){bn=cY-ck|0;c[9334]=bn;c$=bn}else{c$=cY}c[9335]=c$+ck;c[9337]=cj;cY=c[9044]|0;if((cY|0)==1){bn=((bL|0)/2&-1)+cj|0;c[9337]=bn;c0=bn}else if((cY|0)==2){cY=cj+bL|0;c[9337]=cY;c0=cY}else{c0=cj}c[9336]=c0-bL;c1=c[7939]|0;c2=c[7938]|0}}while(0);L13067:do{if((bt|0)==9564){c0=(bL|0)/2&-1;c$=(bo+bi|0)/2&-1;c[9336]=c$-c0;c[9337]=c$+c0;bt=9565}else if((bt|0)==9570){c0=c[9032]|0;do{if((c0|0)==0){c$=~~((+g[38]+ +g[44])*+((c[aB>>2]|0)>>>0>>>0)- +((c[bh+24>>2]|0)>>>0>>>0));c[9337]=c$;c[9336]=c$-bL}else if((c0|0)==1){c$=~~(+g[44]*+((c[aB>>2]|0)>>>0>>>0)+ +((c[bh+24>>2]|0)>>>0>>>0));c[9336]=c$;c[9337]=c$+bL}else{c$=c[9044]|0;if((c$|0)==0){c[9337]=bi;c[9336]=bi-bL}else if((c$|0)==1){c$=(bL|0)/2&-1;ao=(bo+bi|0)/2&-1;c[9336]=ao-c$;c[9337]=ao+c$}else{c[9336]=bo;c[9337]=bL+bo}if((c0|0)==2){c$=~~(+g[184]*+((c[bh+8>>2]|0)>>>0>>>0)+ +((c[cV>>2]|0)>>>0>>>0));c[9334]=c$;c[9335]=c$+ck;c1=cv;c2=c_;break L13067}else if((c0|0)==3){c$=~~((+g[178]+ +g[184])*+(((c[bh+8>>2]|0)-1|0)>>>0>>>0)- +((c[cV>>2]|0)>>>0>>>0));c[9335]=c$;c[9334]=c$-ck;c1=cv;c2=c_;break L13067}else{break}}}while(0);c0=c[9045]|0;if((c0|0)==0){c[9334]=c_;c[9335]=ck+c_;c1=cv;c2=c_;break}else if((c0|0)==1){c0=(ck|0)/2&-1;c$=(c_+cv|0)/2&-1;c[9334]=c$-c0;c[9335]=c$+c0;c1=cv;c2=c_;break}else{c[9335]=cv;c[9334]=cv-ck;c1=cv;c2=c_;break}}}while(0);do{if((bt|0)==9565){bh=c[9045]|0;if((bh|0)==0){bo=(c[cV>>2]|0)+c_|0;c[9334]=bo;c[9335]=bo+ck;c1=cv;c2=c_;break}else if((bh|0)==2){bh=cv-(c[cV>>2]|0)|0;c[9335]=bh;c[9334]=bh-ck;c1=cv;c2=c_;break}else{bh=(ck|0)/2&-1;bo=(c_+cv|0)/2&-1;c[9334]=bo-bh;c[9335]=bo+bh;c1=cv;c2=c_;break}}}while(0);c[13542]=31752;if((c1|0)<(c2|0)){bt=9593}else{if((c[7941]|0)<(c[7940]|0)){bt=9593}}if((bt|0)==9593){uh(-1,127328,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if(a[31104]|0){dz()}fO(c[10818]|0,-1,2);a[25280]=0;cM[c[(c[3524]|0)+168>>2]&511](1);c2=c[10026]|0;if((c2|0)==(-1|0)|(c2|0)==0){fT();c3=c[10026]|0}else{c3=c2}if((c3|0)==(-1|0)|(c3|0)==0){c[200]=2;c[144]=1;dg(2,1);dg(1,2);c[200]=6;c[144]=5;dg(6,5);dg(5,6)}if((c[11692]|0)!=0){fU()}if((c[16457]|0)!=0){c3=a[65952]&1;do{if(c3<<24>>24!=0){if((a[37456]&1)!=0){break}a[37456]=1;c2=c[(c[3524]|0)+88>>2]|0;if((c2|0)==0){break}cO[c2&255](179864)}}while(0);a[37456]=c3;fn(65840,a4);c3=a4+72|0;if((cO[c[c3>>2]&255](c[16455]|0)|0)==0){ln(c[52]|0,c[50]|0,c[16457]|0,0,0,0,c[16458]|0)}else{fN(65912,aU,aV,141e3);ln(((c[a4+16>>2]|0)>>>1)+(c[52]|0)|0,~~(+(((c[7940]|0)+(c[7941]|0)|0)/2&-1|0)+ +h[aV>>3]),c[16457]|0,1,0,c[16455]|0,c[16458]|0);aV=c[c3>>2]|0;cO[aV&255](0)}if((c[16460]|0)!=0){cM[c[a4+64>>2]&511](-2)}a[37456]=0}if((c[17145]|0)!=0){aV=a[68704]&1;do{if(aV<<24>>24!=0){if((a[37456]&1)!=0){break}a[37456]=1;c3=c[(c[3524]|0)+88>>2]|0;if((c3|0)==0){break}cO[c3&255](179864)}}while(0);a[37456]=aV;fn(68592,a4);aV=a4+72|0;if((cO[c[aV>>2]&255](c[17143]|0)|0)==0){ln(c[152]|0,c[150]|0,c[17145]|0,2,0,0,c[17146]|0)}else{fN(68664,aW,aX,141e3);ln(((c[152]|0)-1|0)+((c[a4+16>>2]|0)>>>1)|0,~~(+(((c[7940]|0)+(c[7941]|0)|0)/2&-1|0)+ +h[aX>>3]),c[17145]|0,1,0,c[17143]|0,c[17146]|0);aX=c[aV>>2]|0;cO[aX&255](0)}if((c[17148]|0)!=0){cM[c[a4+64>>2]&511](-2)}a[37456]=0}if((c[16629]|0)!=0){fN(66600,aY,aZ,141e3);aZ=~~(+(((c[7938]|0)+(c[7939]|0)|0)/2&-1|0)+ +h[aY>>3]);aY=(c[190]|0)-((c[a4+16>>2]|0)>>>1)|0;aX=a[66640]&1;do{if(aX<<24>>24!=0){if((a[37456]&1)!=0){break}a[37456]=1;aV=c[(c[3524]|0)+88>>2]|0;if((aV|0)==0){break}cO[aV&255](179864)}}while(0);a[37456]=aX;fn(66528,a4);ln(aZ,aY,c[16629]|0,1,0,0,c[16630]|0);if((c[16632]|0)!=0){cM[c[a4+64>>2]&511](-2)}a[37456]=0}if((c[1119]|0)!=0){fN(4560,a_,a$,141e3);a$=~~(+(((c[7939]|0)+(c[7938]|0)|0)/2&-1|0)+ +h[a_>>3]);a_=(c[1102]|0)-((c[a4+16>>2]|0)>>>1)|0;aY=a[4600]&1;do{if(aY<<24>>24!=0){if((a[37456]&1)!=0){break}a[37456]=1;aZ=c[(c[3524]|0)+88>>2]|0;if((aZ|0)==0){break}cO[aZ&255](179864)}}while(0);a[37456]=aY;fn(4488,a4);ln(a$,a_,c[1119]|0,1,0,0,c[1120]|0);if((c[1122]|0)!=0){cM[c[a4+64>>2]&511](-2)}a[37456]=0}if((c[17317]|0)!=0){fN(69352,a0,a1,141e3);a1=~~(+(((c[7938]|0)+(c[7939]|0)|0)/2&-1|0)+ +h[a0>>3]);a0=((c[208]|0)-1|0)-((c[a4+16>>2]|0)>>>1)|0;a_=a[69392]&1;do{if(a_<<24>>24!=0){if((a[37456]&1)!=0){break}a[37456]=1;a$=c[(c[3524]|0)+88>>2]|0;if((a$|0)==0){break}cO[a$&255](179864)}}while(0);a[37456]=a_;fn(69280,a4);ln(a1,a0,c[17317]|0,1,0,0,c[17318]|0);if((c[17320]|0)!=0){cM[c[a4+64>>2]&511](-2)}a[37456]=0}if((c[1183]|0)!=0){a0=c[1218]|0;a1=c[1216]|0;cG(a2|0);a_=ut(1025)|0;do{if((a_|0)==0){gk();a$=ut(1025)|0;if((a$|0)!=0){c4=a$;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=126240,v)|0)}else{c4=a_}}while(0);a_=c[1183]|0;a$=aN(a2|0)|0;bw(c4|0,1024,a_|0,a$|0);do{if((c[1164]|0)==0){bt=9658}else{a$=a4+72|0;if((cO[c[a$>>2]&255](-270)|0)==0){bt=9658;break}a_=((c[a4+16>>2]|0)>>>1)+a0|0;a2=c[1184]|0;if((c[1166]|0)==0){ln(a_,a1,c4,2,0,-270,a2)}else{ln(a_,a1,c4,0,0,-270,a2)}a2=c[a$>>2]|0;cO[a2&255](0)}}while(0);do{if((bt|0)==9658){a2=a1-((c[a4+16>>2]|0)>>>1)|0;a$=c[1184]|0;if((c[1166]|0)==0){ln(a0,a2,c4,0,0,0,a$);break}else{ln(a0,a2,c4,0,2,0,a$);break}}}while(0);uu(c4)}do{if(a[31104]&(a[54016]|0)!=110){if(!((c[(c[3524]|0)+144>>2]|0)!=0&(c[13506]|0)==0)){break}dD(1)}}while(0);fO(c[10818]|0,0,2);c4=c[10822]|0;a0=c[(c[3524]|0)+92>>2]|0;if((a0|0)!=0){cK[a0&63](+h[3817])}if((c4|0)!=0){a0=c4;do{if((c[a0+56>>2]|0)==0){fR(a0+8|0,al,am,202256);fp(~~+h[al>>3],~~+h[am>>3],a0)}a0=c[a0>>2]|0;}while((a0|0)!=0)}fV(0);cM[c[(c[3524]|0)+168>>2]&511](2);if((a[35184]&1)!=0){fW(0,aS,aT)}a0=a4+168|0;am=(d|0)>0;al=ak;c4=ak|0;a1=ak+4|0;a$=a3;a3=a4+144|0;a2=a4+92|0;a_=a4+80|0;aY=s;aZ=s|0;aX=s+4|0;aV=V;aW=V|0;c3=V+4|0;aU=Q|0;c2=R|0;c1=Q+8|0;Q=R+8|0;R=J;c_=M|0;cv=I;ck=M+7|0;M=I|0;cV=I+4|0;bh=H;bo=H+4|0;bL=H+8|0;bi=H+16|0;aB=H|0;c0=J|0;c$=J|0;ao=J+72|0;an=J+80|0;cL=E;cj=E|0;cY=E+4|0;bn=D;cZ=D+4|0;by=D+8|0;cX=D+16|0;cB=D|0;cz=J+64|0;cD=J+8|0;bI=J+16|0;J=A+8|0;cW=A+40|0;bu=A+32|0;cP=A|0;cQ=A+16|0;cm=A+24|0;aR=A+48|0;aQ=A+56|0;cw=x;cU=x|0;bz=x+4|0;cT=t;bA=t|0;cE=t+4|0;bB=0;bK=0;L13212:while(1){cM[c[a0>>2]&511](10);bk=a[35184]|0;if(am){bH=0;bq=bB;bv=b;bl=0;bJ=bk;while(1){cM[c[(c[3524]|0)+168>>2]&511](6);cl=bv+304|0;c[200]=c[cl>>2];ap=bv+308|0;c[144]=c[ap>>2];cp=bv+24|0;bm=bv+64|0;c[al>>2]=c[bm>>2];c[al+4>>2]=c[bm+4>>2];c[al+8>>2]=c[bm+8>>2];c[al+12>>2]=c[bm+12>>2];cu=bv+28|0;aO=c[cu>>2]|0;aq=cp|0;do{if((c[aq>>2]|0)!=0){cJ=+h[bv+48>>3];aP=c[(c[3524]|0)+92>>2]|0;if(cJ<0.0){cK[aP&63](+h[3817]);break}else{cK[aP&63](cJ);break}}}while(0);aP=bv+40|0;cK[c[(c[3524]|0)+112>>2]&63](+h[aP>>3]);cx=c[(c[3524]|0)+64>>2]|0;if((aO|0)<-5){cM[cx&511](-2)}else{cM[cx&511](aO)}cx=bv+56|0;cr=c[3524]|0;do{if((a[cx]&1)==0){if((c[cr+96>>2]&1024|0)!=0){break}c[c4>>2]=1;c[a1>>2]=aO;bt=9686}else{bt=9686}}while(0);if((bt|0)==9686){bt=0;fn(ak,cr)}aO=bv+12|0;do{if((c[aO>>2]|0)==392){if((a[30080]&1)==0){c5=1}else{lK(cp,(c[cu>>2]|0)+1|0);c5=(c[aO>>2]|0)==392}if(!(c5&(bH|0)==392)){c6=bq;break}if((c[bv+280>>2]|0)!=0){c6=bq;break}cq=c[aT>>2]|0;co=c[54]|0;if((cq|0)==(co|0)){c6=bq;break}cn=bq+1|0;if((cn|0)<(c[9012]|0)){c[aT>>2]=cq-(c[9020]|0);c6=cn;break}else{c[aT>>2]=co;c[aS>>2]=(c[aS>>2]|0)+(c[9026]|0);c6=0;break}}else{c6=bq}}while(0);do{if((c[aO>>2]|0)==392&(c[9670]|0)==2){cr=bv+224|0;co=c[cr>>2]|0;if((co|0)==0){c7=0;c8=c6;break}if(!bK){if((a[36228]&1)!=0){c7=0;c8=c6;break}}cn=cp;c[a$>>2]=c[cn>>2];c[a$+4>>2]=c[cn+4>>2];c[a$+8>>2]=c[cn+8>>2];c[a$+12>>2]=c[cn+12>>2];c[a$+16>>2]=c[cn+16>>2];c[a$+20>>2]=c[cn+20>>2];c[a$+24>>2]=c[cn+24>>2];c[a$+28>>2]=c[cn+28>>2];c[a$+32>>2]=c[cn+32>>2];c[a$+36>>2]=c[cn+36>>2];c[a$+40>>2]=c[cn+40>>2];c[a$+44>>2]=c[cn+44>>2];c[a$+48>>2]=c[cn+48>>2];c[a$+52>>2]=c[cn+52>>2];cq=c[co>>2]|0;if((cq|0)==0){c9=c6;da=co}else{co=bv+200|0;aM=bv+64|0;ar=bv+68|0;bN=bv+32|0;aL=c6;aH=cq;while(1){cq=aH+4|0;c[cu>>2]=c[cq>>2];c[co>>2]=c[cq>>2];aK=aH+60|0;if((c[aK>>2]|0)!=0){aJ=(c[cq>>2]|0)+1|0;do{if((a[30080]&1)==0){cq=c[aq>>2]|0;aI=c[8798]|0;ch=(aI|0)>0;bj=aJ;L13260:while(1){cg=43264;while(1){df=c[cg>>2]|0;if((df|0)==0){break}if((c[df+4>>2]|0)==(bj|0)){break L13260}else{cg=df|0}}dh=bj-1|0;if(!((bj|0)>(aI|0)&ch)){bt=9715;break}bj=((dh|0)%(aI|0)&-1)+1|0}if((bt|0)==9715){bt=0;c[cu>>2]=dh;c[aM>>2]=1;c[ar>>2]=dh;c[bN>>2]=dh;break}aI=df+8|0;c[cn>>2]=c[aI>>2];c[cn+4>>2]=c[aI+4>>2];c[cn+8>>2]=c[aI+8>>2];c[cn+12>>2]=c[aI+12>>2];c[cn+16>>2]=c[aI+16>>2];c[cn+20>>2]=c[aI+20>>2];c[cn+24>>2]=c[aI+24>>2];c[cn+28>>2]=c[aI+28>>2];c[cn+32>>2]=c[aI+32>>2];c[cn+36>>2]=c[aI+36>>2];c[cn+40>>2]=c[aI+40>>2];c[cn+44>>2]=c[aI+44>>2];c[cn+48>>2]=c[aI+48>>2];c[cn+52>>2]=c[aI+52>>2];c[aq>>2]=cq;if((c[(c[3524]|0)+96>>2]&1024|0)!=0){c[cu>>2]=bj;a[cx]=0;break}if((a[cx]&1)!=0){break}c[aM>>2]=1;c[ar>>2]=c[cu>>2]}else{lK(cp,aJ)}}while(0);fY(bv,c[aK>>2]|0,a4,c[aS>>2]|0,c[aT>>2]|0)}aJ=aL+1|0;if((aJ|0)<(c[9012]|0)){c[aT>>2]=(c[aT>>2]|0)-(c[9020]|0);di=aJ}else{c[aT>>2]=c[54];c[aS>>2]=(c[aS>>2]|0)+(c[9026]|0);di=0}aJ=c[aH>>2]|0;if((aJ|0)==0){break}else{aL=di;aH=aJ}}c9=di;da=c[cr>>2]|0}aH=c[da+64>>2]|0;if((aH|0)==0){dj=da}else{uu(aH);dj=da}while(1){aL=c[dj+60>>2]|0;if((aL|0)!=0){uu(aL)}aL=c[dj+64>>2]|0;if(!((aL|0)==0|(aL|0)==(aH|0))){uu(aL)}aL=c[dj>>2]|0;uu(dj);if((aL|0)==0){break}else{dj=aL}}c[cr>>2]=0;c[cn>>2]=c[a$>>2];c[cn+4>>2]=c[a$+4>>2];c[cn+8>>2]=c[a$+8>>2];c[cn+12>>2]=c[a$+12>>2];c[cn+16>>2]=c[a$+16>>2];c[cn+20>>2]=c[a$+20>>2];c[cn+24>>2]=c[a$+24>>2];c[cn+28>>2]=c[a$+28>>2];c[cn+32>>2]=c[a$+32>>2];c[cn+36>>2]=c[a$+36>>2];c[cn+40>>2]=c[a$+40>>2];c[cn+44>>2]=c[a$+44>>2];c[cn+48>>2]=c[a$+48>>2];c[cn+52>>2]=c[a$+52>>2];c7=0;c8=c9}else{aH=bv+16|0;aL=c[aH>>2]|0;if((aL|0)!=0){if((a[aL]|0)==0){c7=0;c8=c6;break}}if((c[bv+8>>2]|0)==4){c7=0;c8=c6;break}if(!bK){if((a[36228]&1)!=0){c7=(bJ&1)!=0;c8=c6;break}}aL=a[bv+20|0]&1;do{if(aL<<24>>24!=0){if((a[37456]&1)!=0){break}a[37456]=1;ar=c[(c[3524]|0)+88>>2]|0;if((ar|0)==0){break}cO[ar&255](179864)}}while(0);a[37456]=aL;cn=bJ&1;do{if(cn<<24>>24==0){dl=c6}else{cr=c[aH>>2]|0;if((cr|0)==0){dl=c6;break}if((a[bv+22|0]&1)!=0){dl=c6;break}if((a[36230]&1)==0){dm=cr;dn=c[aT>>2]|0}else{cr=(((c[54]|0)+(c[9336]|0)|0)+((c[9020]|0)/2&-1)|0)-(c[aT>>2]|0)|0;c[aT>>2]=cr;dm=c[aH>>2]|0;dn=cr}fY(bv,dm,a4,c[aS>>2]|0,dn);dl=c6+1|0}}while(0);a[37456]=0;c7=cn<<24>>24!=0;c8=dl}}while(0);cp=bv+23|0;aH=a[cp]|0;L13316:do{if(!((aH&1)==0|bK)){aL=bv+300|0;if((c[aL>>2]|0)<=0){break}cr=bv+320|0;ar=0;aM=aH;while(1){do{if((aM&1)!=0){c[(c[cr>>2]|0)+(ar<<6)>>2]=0;bN=c[cl>>2]|0;cJ=+h[64664+(bN*688&-1)>>3];cH=+h[64672+(bN*688&-1)>>3];bN=c[cr>>2]|0;cF=+h[bN+(ar<<6)+8>>3];if(cJcH){bt=9754}else{dp=bN}}else{if(cFcJ){bt=9754}else{dp=bN}}if((bt|0)==9754){bt=0;c[bN+(ar<<6)>>2]=1;dp=c[cr>>2]|0}bN=c[ap>>2]|0;cJ=+h[64664+(bN*688&-1)>>3];cF=+h[64672+(bN*688&-1)>>3];cH=+h[dp+(ar<<6)+16>>3];if(cJcF)){break}}else{if(!(cHcJ)){break}}c[dp+(ar<<6)>>2]=1}}while(0);aK=ar+1|0;if((aK|0)>=(c[aL>>2]|0)){break L13316}ar=aK;aM=a[cp]|0}}}while(0);cp=bv+8|0;do{if(!((c[cp>>2]|0)==4|bK)){aH=c[aO>>2]|0;if((aH|0)==18){fZ(bv);break}else if((aH|0)==51){fX(bv);fZ(bv);break}else if((aH|0)==64){aM=bv+300|0;ar=c[aM>>2]|0;if((ar|0)<=0){break}aL=bv+320|0;cr=bv+316|0;cn=(c[3524]|0)+80|0;aK=0;bN=ar;while(1){ar=c[aL>>2]|0;if((c[ar+(aK<<6)>>2]|0)==0){co=c[200]|0;aJ=~~(+(c[64768+(co*688&-1)>>2]|0)+(+h[ar+(aK<<6)+8>>3]- +h[64664+(co*688&-1)>>3])*+h[64776+(co*688&-1)>>3]+.5);co=c[144]|0;aI=~~(+(c[64768+(co*688&-1)>>2]|0)+(+h[ar+(aK<<6)+16>>3]- +h[64664+(co*688&-1)>>3])*+h[64776+(co*688&-1)>>3]+.5);co=(c[cr>>2]|0)+(aK<<3)|0;f9(bv,co);cR[c[cn>>2]&127](aJ,aI,-1);dq=c[aM>>2]|0}else{dq=bN}aI=aK+1|0;if((aI|0)<(dq|0)){aK=aI;bN=dq}else{break}}}else if((aH|0)==295|(aH|0)==279|(aH|0)==311){fX(bv);f_(bv);fZ(bv);break}else if((aH|0)==102|(aH|0)==86|(aH|0)==118){f_(bv);fZ(bv);break}else if((aH|0)==137|(aH|0)==153){f$(bv,c[64784+((c[144]|0)*688&-1)>>2]|0);break}else if((aH|0)==392){if((c[14156]|0)==1){f$(bv,c[64784+((c[144]|0)*688&-1)>>2]|0)}do{if((c[9670]|0)==4){cK[c[(c[3524]|0)+112>>2]&63](+h[4840]);if(!(hG(49488)|0)){cM[c[(c[3524]|0)+64>>2]&511](c[cu>>2]|0)}f_(bv);c[aV>>2]=c[bm>>2];c[aV+4>>2]=c[bm+4>>2];c[aV+8>>2]=c[bm+8>>2];c[aV+12>>2]=c[bm+12>>2];bN=c[cu>>2]|0;do{if((c[aq>>2]|0)!=0){cJ=+h[bv+48>>3];aK=c[(c[3524]|0)+92>>2]|0;if(cJ<0.0){cK[aK&63](+h[3817]);break}else{cK[aK&63](cJ);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[aP>>3]);aK=c[(c[3524]|0)+64>>2]|0;if((bN|0)<-5){cM[aK&511](-2)}else{cM[aK&511](bN)}aK=c[3524]|0;if((a[cx]&1)==0){if((c[aK+96>>2]&1024|0)!=0){break}c[aW>>2]=1;c[c3>>2]=bN}fn(V,aK)}}while(0);if((c[14156]|0)==1){break}f$(bv,c[64784+((c[144]|0)*688&-1)>>2]|0);break}else if((aH|0)==33){aK=c[64784+((c[200]|0)*688&-1)>>2]|0;aM=c[64784+((c[144]|0)*688&-1)>>2]|0;cn=bv+300|0;if((c[cn>>2]|0)<=0){break}cr=bv+320|0;aL=bv+316|0;aI=0;do{aJ=c[cr>>2]|0;L13380:do{if((c[aJ+(aI<<6)>>2]|0)!=2){co=c[200]|0;do{if((a[30528]&1)==0){cJ=+h[64664+(co*688&-1)>>3];cH=+h[64672+(co*688&-1)>>3];cF=+h[aJ+(aI<<6)+8>>3];if(cJcH){break L13380}else{dr=cF;ds=cJ;break}}else{if(cFcJ){break L13380}else{dr=cF;ds=cJ;break}}}else{dr=+h[aJ+(aI<<6)+8>>3];ds=+h[64664+(co*688&-1)>>3]}}while(0);bj=~~(+(c[64768+(co*688&-1)>>2]|0)+(dr-ds)*+h[64776+(co*688&-1)>>3]+.5);cq=c[144]|0;ar=~~(+(c[64768+(cq*688&-1)>>2]|0)+(+h[aJ+(aI<<6)+16>>3]- +h[64664+(cq*688&-1)>>3])*+h[64776+(cq*688&-1)>>3]+.5);cq=(c[aL>>2]|0)+(aI<<3)|0;f9(bv,cq);if((a[30528]&1)==0){c[ac>>2]=bj;c[ad>>2]=aM;c[ae>>2]=bj;c[af>>2]=ar;cq=c[3524]|0;if((fl(ac,ad,ae,af)|0)==0){break}cN[c[cq+56>>2]&255](c[ac>>2]|0,c[ad>>2]|0);cN[c[cq+60>>2]&255](c[ae>>2]|0,c[af>>2]|0);break}else{c[ag>>2]=aK;c[ah>>2]=aM;c[ai>>2]=bj;c[aj>>2]=ar;ar=c[3524]|0;if((fl(ag,ah,ai,aj)|0)==0){break}cN[c[ar+56>>2]&255](c[ag>>2]|0,c[ah>>2]|0);cN[c[ar+60>>2]&255](c[ai>>2]|0,c[aj>>2]|0);break}}}while(0);aI=aI+1|0;}while((aI|0)<(c[cn>>2]|0))}else if((aH|0)==169){if((c[14156]|0)!=1){f_(bv)}f$(bv,c[64784+((c[144]|0)*688&-1)>>2]|0);if((c[14156]|0)!=1){break}f_(bv);break}else if((aH|0)==345){cn=bv+244|0;aI=c[cn>>2]|0;if((aI|0)==13){f0(bv);break}else if((aI|0)==10){f0(bv);break}else{aI=c[3524]|0;c[U>>2]=0;if((c[aI+148>>2]|0)==0){fX(bv)}else{aI=bv+240|0;do{if((c[aI>>2]|0)==0){aM=aI;if((c[cp>>2]|0)==1){c[aM>>2]=c[10858];c[aM+4>>2]=c[10859];c[aM+8>>2]=c[10860];c[aM+12>>2]=c[10861];c[aM+16>>2]=c[10862];c[aM+20>>2]=c[10863];c[aM+24>>2]=c[10864];c[aM+28>>2]=c[10865];break}else{c[aM>>2]=c[10850];c[aM+4>>2]=c[10851];c[aM+8>>2]=c[10852];c[aM+12>>2]=c[10853];c[aM+16>>2]=c[10854];c[aM+20>>2]=c[10855];c[aM+24>>2]=c[10856];c[aM+28>>2]=c[10857];break}}}while(0);aI=c[cn>>2]|0;do{if((aI|0)==5){aM=bv+248|0;cJ=+h[aM>>3];cF=+h[8255];if(cJ>3]=cF;dt=cF}else{dt=cJ}cJ=+h[8256];if(dt<=cJ){break}h[aM>>3]=cJ}else if((aI|0)==7){aM=bv+248|0;cJ=+h[aM>>3];cF=+h[8599];if(cJ>3]=cF;du=cF}else{du=cJ}cJ=+h[8600];if(du<=cJ){break}h[aM>>3]=cJ}else if((aI|0)==6){aM=bv+248|0;cJ=+h[aM>>3];cF=+h[8169];if(cJ>3]=cF;dv=cF}else{dv=cJ}cJ=+h[8170];if(dv<=cJ){break}h[aM>>3]=cJ}else if((aI|0)==8){aM=bv+248|0;cJ=+h[aM>>3];cF=+h[8513];if(cJ>3]=cF;dw=cF}else{dw=cJ}cJ=+h[8514];if(dw<=cJ){break}h[aM>>3]=cJ}else if((aI|0)==9){aM=bv+248|0;cJ=+h[aM>>3];cF=+h[8255];if(cJ>3]=cF;dx=cF}else{dx=cJ}cJ=+h[8256];if(dx>cJ){h[aM>>3]=cJ}aM=bv+256|0;cJ=+h[aM>>3];cF=+h[8169];if(cJ>3]=cF;dy=cF}else{dy=cJ}cJ=+h[8170];if(dy<=cJ){break}h[aM>>3]=cJ}}while(0);aM=bv+300|0;if((c[aM>>2]|0)>0){aK=bv+320|0;aL=bv+264|0;cr=bv+248|0;aJ=2;bN=0;ar=0;bj=0;cq=0;ch=0;cg=2;while(1){ci=c[7934]|0;if((cg|0)>=(ci|0)){cd=ci+128|0;c[7934]=cd;c[7936]=db(c[7936]|0,cd*12&-1,140784)|0}cd=c[aK>>2]|0;ci=c[cd+(ch<<6)>>2]|0;L13454:do{if((ci|0)==1){cc=(c[cn>>2]|0)==0;if(cc){bt=10021}else{if((a[54152]&1)==0){dA=bj;dB=ar}else{bt=10021}}if((bt|0)==10021){bt=0;cf=c[200]|0;ce=~~(+(c[64768+(cf*688&-1)>>2]|0)+(+h[cd+(ch<<6)+8>>3]- +h[64664+(cf*688&-1)>>3])*+h[64776+(cf*688&-1)>>3]+.5);cf=c[144]|0;ca=~~(+(c[64768+(cf*688&-1)>>2]|0)+(+h[cd+(ch<<6)+16>>3]- +h[64664+(cf*688&-1)>>3])*+h[64776+(cf*688&-1)>>3]+.5);cf=c[13542]|0;if((cf|0)==0){dC=0}else{cb=(c[cf>>2]|0)>(ce|0)&1;b8=(c[cf+4>>2]|0)<(ce|0)?cb|2:cb;cb=(c[cf+8>>2]|0)>(ca|0)?b8|4:b8;dC=(c[cf+12>>2]|0)<(ca|0)?cb|8:cb}cb=dC&3;ca=dC&12;dA=(cb|0)==0?bj:cb;dB=(ca|0)==0?ar:ca}if((aJ|0)==0){if(!((a[54160]&1)!=0|cc)){if((a[54152]&1)==0){dE=cq;dF=dA;dG=dB;dH=bN;break}}ca=gb(cd,ch,N,O)|0;cb=c[200]|0;c[(c[7936]|0)+((c[U>>2]|0)*12&-1)>>2]=~~(+(c[64768+(cb*688&-1)>>2]|0)+(+h[N>>3]- +h[64664+(cb*688&-1)>>3])*+h[64776+(cb*688&-1)>>3]+.5);cb=c[144]|0;cf=~~(+(c[64768+(cb*688&-1)>>2]|0)+(+h[O>>3]- +h[64664+(cb*688&-1)>>3])*+h[64776+(cb*688&-1)>>3]+.5);cb=c[U>>2]|0;c[U>>2]=cb+1;c[(c[7936]|0)+(cb*12&-1)+4>>2]=cf;dE=cq;dF=dA;dG=dB;dH=ca;break}else if((aJ|0)!=1){dE=cq;dF=dA;dG=dB;dH=bN;break}if(!cc){if((a[54152]&1)==0){dE=cq;dF=dA;dG=dB;dH=bN;break}}if(!(gc(cd,ch,aU,c2)|0)){dE=cq;dF=dA;dG=dB;dH=bN;break}cc=c[200]|0;cJ=+h[aU>>3];c[(c[7936]|0)+((c[U>>2]|0)*12&-1)>>2]=~~(+(c[64768+(cc*688&-1)>>2]|0)+(cJ- +h[64664+(cc*688&-1)>>3])*+h[64776+(cc*688&-1)>>3]+.5);cc=c[144]|0;cF=+h[c2>>3];ca=~~(+(c[64768+(cc*688&-1)>>2]|0)+(cF- +h[64664+(cc*688&-1)>>3])*+h[64776+(cc*688&-1)>>3]+.5);cc=c[U>>2]|0;c[U>>2]=cc+1;c[(c[7936]|0)+(cc*12&-1)+4>>2]=ca;ca=c[aK>>2]|0;cc=ca+(ch<<6)+8|0;cH=+h[cc>>3];cC=+h[ca+(ch<<6)+16>>3];cA=+h[c1>>3];h[cc>>3]=cA;cs=+h[Q>>3];h[(c[aK>>2]|0)+(ch<<6)+16>>3]=cs;cc=gb(c[aK>>2]|0,ch,N,O)|0;h[(c[aK>>2]|0)+(ch<<6)+8>>3]=cH;h[(c[aK>>2]|0)+(ch<<6)+16>>3]=cC;do{if((bN|0)==0){dI=cc}else{if((cc|0)==(bN|0)){dI=cq;break}gi(c[7936]|0,U,bN,cc,dB,dA);dI=cq}}while(0);cc=c[200]|0;c[(c[7936]|0)+((c[U>>2]|0)*12&-1)>>2]=~~(+(c[64768+(cc*688&-1)>>2]|0)+(cA- +h[64664+(cc*688&-1)>>3])*+h[64776+(cc*688&-1)>>3]+.5);cc=c[144]|0;co=~~(+(c[64768+(cc*688&-1)>>2]|0)+(cs- +h[64664+(cc*688&-1)>>3])*+h[64776+(cc*688&-1)>>3]+.5);cc=c[U>>2]|0;c[U>>2]=cc+1;c[(c[7936]|0)+(cc*12&-1)+4>>2]=co;co=ch-1|0;cc=c[aK>>2]|0;ca=cc+(co<<6)+8|0;cC=+h[ca>>3];cH=+h[cc+(co<<6)+16>>3];h[ca>>3]=cJ;h[(c[aK>>2]|0)+(co<<6)+16>>3]=cF;ca=gb(c[aK>>2]|0,ch,N,O)|0;h[(c[aK>>2]|0)+(co<<6)+8>>3]=cC;h[(c[aK>>2]|0)+(co<<6)+16>>3]=cH;dE=dI;dF=dA;dG=dB;dH=ca}else if((ci|0)==2){if((aJ|0)==2){dE=cq;dF=bj;dG=ar;dH=bN;break}if(!((cq|0)==0|(cq|0)==(bN|0))){gi(c[7936]|0,U,bN,cq,ar,bj)}gj(c[U>>2]|0,c[7936]|0,bv);c[U>>2]=0;dE=0;dF=bj;dG=ar;dH=0}else if((ci|0)==0){ca=c[200]|0;cH=+(c[64768+(ca*688&-1)>>2]|0);cC=+h[cd+(ch<<6)+8>>3];bE=+h[64664+(ca*688&-1)>>3];ct=+h[64776+(ca*688&-1)>>3];ca=~~(cH+(cC-bE)*ct+.5);co=c[144]|0;bD=+h[cd+(ch<<6)+16>>3];cc=~~(+(c[64768+(co*688&-1)>>2]|0)+(bD- +h[64664+(co*688&-1)>>3])*+h[64776+(co*688&-1)>>3]+.5);if((aJ|0)==0){do{if((c[aL>>2]|0)!=0){co=c[cn>>2]|0;if((co|0)==5|(co|0)==7){be=+h[cr>>3];cf=ch-1|0;bd=be- +h[cd+(cf<<6)+8>>3];bg=be-cC;if(bg*bd>=0.0){break}bf=+h[cd+(cf<<6)+16>>3];h[N>>3]=be;dJ=bf+bd*(bD-bf)/(bd-bg);dK=be}else if((co|0)==6|(co|0)==8){be=+h[cr>>3];co=ch-1|0;bg=be- +h[cd+(co<<6)+16>>3];bd=be-bD;bf=+h[cd+(co<<6)+8>>3];if(bd*bg>=0.0){break}a7=bf+bg*(cC-bf)/(bg-bd);h[N>>3]=a7;dJ=be;dK=a7}else{break}h[O>>3]=dJ;c[(c[7936]|0)+((c[U>>2]|0)*12&-1)>>2]=~~(cH+ct*(dK-bE)+.5);co=c[144]|0;cf=~~(+(c[64768+(co*688&-1)>>2]|0)+(dJ- +h[64664+(co*688&-1)>>3])*+h[64776+(co*688&-1)>>3]+.5);co=c[U>>2]|0;c[U>>2]=co+1;c[(c[7936]|0)+(co*12&-1)+4>>2]=cf;gj(c[U>>2]|0,c[7936]|0,bv);c[U>>2]=0;cf=c[200]|0;c[c[7936]>>2]=~~(+(c[64768+(cf*688&-1)>>2]|0)+(dK- +h[64664+(cf*688&-1)>>3])*+h[64776+(cf*688&-1)>>3]+.5);cf=c[144]|0;co=~~(+(c[64768+(cf*688&-1)>>2]|0)+(dJ- +h[64664+(cf*688&-1)>>3])*+h[64776+(cf*688&-1)>>3]+.5);cf=c[U>>2]|0;c[U>>2]=cf+1;c[(c[7936]|0)+(cf*12&-1)+4>>2]=co}}while(0);c[(c[7936]|0)+((c[U>>2]|0)*12&-1)>>2]=ca;co=c[U>>2]|0;c[U>>2]=co+1;c[(c[7936]|0)+(co*12&-1)+4>>2]=cc;dE=cq;dF=bj;dG=ar;dH=bN;break}else if((aJ|0)==1){do{if((c[cn>>2]|0)!=0){if((a[54152]&1)!=0){break}co=(a[54160]&1)==0;gj(c[U>>2]|0,c[7936]|0,bv);c[U>>2]=0;if(co){c[c[7936]>>2]=ca;co=c[U>>2]|0;c[U>>2]=co+1;c[(c[7936]|0)+(co*12&-1)+4>>2]=cc;dE=cq;dF=bj;dG=ar;dH=bN;break L13454}else{co=c[aK>>2]|0;gb(co,ch,N,O);co=c[200]|0;c[(c[7936]|0)+((c[U>>2]|0)*12&-1)>>2]=~~(+(c[64768+(co*688&-1)>>2]|0)+(+h[N>>3]- +h[64664+(co*688&-1)>>3])*+h[64776+(co*688&-1)>>3]+.5);co=c[144]|0;cf=~~(+(c[64768+(co*688&-1)>>2]|0)+(+h[O>>3]- +h[64664+(co*688&-1)>>3])*+h[64776+(co*688&-1)>>3]+.5);co=c[U>>2]|0;c[U>>2]=co+1;c[(c[7936]|0)+(co*12&-1)+4>>2]=cf;c[(c[7936]|0)+((c[U>>2]|0)*12&-1)>>2]=ca;cf=c[U>>2]|0;c[U>>2]=cf+1;c[(c[7936]|0)+(cf*12&-1)+4>>2]=cc;dE=cq;dF=bj;dG=ar;dH=bN;break L13454}}}while(0);cf=gb(cd,ch,N,O)|0;do{if((bN|0)==0){dL=cf}else{if((cf|0)==(bN|0)){dL=cq;break}gi(c[7936]|0,U,bN,cf,ar,bj);dL=cq}}while(0);cf=c[200]|0;c[(c[7936]|0)+((c[U>>2]|0)*12&-1)>>2]=~~(+(c[64768+(cf*688&-1)>>2]|0)+(+h[N>>3]- +h[64664+(cf*688&-1)>>3])*+h[64776+(cf*688&-1)>>3]+.5);cf=c[144]|0;co=~~(+(c[64768+(cf*688&-1)>>2]|0)+(+h[O>>3]- +h[64664+(cf*688&-1)>>3])*+h[64776+(cf*688&-1)>>3]+.5);cf=c[U>>2]|0;c[U>>2]=cf+1;c[(c[7936]|0)+(cf*12&-1)+4>>2]=co;c[(c[7936]|0)+((c[U>>2]|0)*12&-1)>>2]=ca;co=c[U>>2]|0;c[U>>2]=co+1;c[(c[7936]|0)+(co*12&-1)+4>>2]=cc;dE=dL;dF=bj;dG=ar;dH=bN;break}else{gj(c[U>>2]|0,c[7936]|0,bv);c[U>>2]=0;c[c[7936]>>2]=ca;co=c[U>>2]|0;c[U>>2]=co+1;c[(c[7936]|0)+(co*12&-1)+4>>2]=cc;c[(c[7936]|0)+((c[U>>2]|0)*12&-1)>>2]=ca;co=c[U>>2]|0;c[U>>2]=co+1;c[(c[7936]|0)+(co*12&-1)+4>>2]=cc;dE=cq;dF=bj;dG=ar;dH=bN;break}}else{dE=cq;dF=bj;dG=ar;dH=bN}}while(0);cd=ch+1|0;if((cd|0)>=(c[aM>>2]|0)){break}aJ=c[(c[aK>>2]|0)+(ch<<6)>>2]|0;bN=dH;ar=dG;bj=dF;cq=dE;ch=cd;cg=(c[U>>2]|0)+2|0}dM=dH;dN=dG;dO=dF;dP=dE;dQ=c[cn>>2]|0}else{dM=0;dN=0;dO=0;dP=0;dQ=aI}if((dQ|0)==0){if(!((dP|0)==0|(dP|0)==(dM|0))){bt=10045}}else{if(!((a[54152]&1)==0|(dP|0)==0|(dP|0)==(dM|0))){bt=10045}}if((bt|0)==10045){bt=0;gi(c[7936]|0,U,dM,dP,dN,dO)}gj(c[U>>2]|0,c[7936]|0,bv)}if(!(hG(bv+192|0)|0)){break}fX(bv);break}}else if((aH|0)==193){cg=c[3524]|0;ch=bv+300|0;if((c[ch>>2]|0)<=0){break}cq=bv+320|0;bj=cg+56|0;ar=cg+60|0;cg=0;bN=0;aK=0;aJ=2;aM=c[cq>>2]|0;while(1){cr=c[aM+(aK<<6)>>2]|0;if((cr|0)==0){aL=c[200]|0;cd=~~(+(c[64768+(aL*688&-1)>>2]|0)+(+h[aM+(aK<<6)+8>>3]- +h[64664+(aL*688&-1)>>3])*+h[64776+(aL*688&-1)>>3]+.5);aL=c[144]|0;ci=~~(+(c[64768+(aL*688&-1)>>2]|0)+(+h[aM+(aK<<6)+16>>3]- +h[64664+(aL*688&-1)>>3])*+h[64776+(aL*688&-1)>>3]+.5);do{if((aJ|0)==0){cN[c[ar>>2]&255](cg,ci);cN[c[ar>>2]&255](cd,ci)}else if((aJ|0)==1){if((a[54160]&1)==0){break}gf(aM,aK,Y,Z);aL=c[200]|0;co=~~(+(c[64768+(aL*688&-1)>>2]|0)+(+h[Y>>3]- +h[64664+(aL*688&-1)>>3])*+h[64776+(aL*688&-1)>>3]+.5);aL=c[144]|0;cN[c[bj>>2]&255](co,~~(+(c[64768+(aL*688&-1)>>2]|0)+(+h[Z>>3]- +h[64664+(aL*688&-1)>>3])*+h[64776+(aL*688&-1)>>3]+.5));cN[c[ar>>2]&255](co,ci);cN[c[ar>>2]&255](cd,ci)}}while(0);cN[c[bj>>2]&255](cd,ci);dR=ci;dS=cd}else if((cr|0)==1){L13532:do{if((aJ|0)==0){if((a[54160]&1)==0){dT=bN;dU=cg;break}gf(aM,aK,Y,Z);co=c[200]|0;aL=~~(+(c[64768+(co*688&-1)>>2]|0)+(+h[Y>>3]- +h[64664+(co*688&-1)>>3])*+h[64776+(co*688&-1)>>3]+.5);co=c[144]|0;cf=~~(+(c[64768+(co*688&-1)>>2]|0)+(+h[Z>>3]- +h[64664+(co*688&-1)>>3])*+h[64776+(co*688&-1)>>3]+.5);cN[c[ar>>2]&255](cg,cf);cN[c[ar>>2]&255](aL,cf);dT=cf;dU=aL}else if((aJ|0)==1){if((a[54152]&1)==0){dT=bN;dU=cg;break}aL=aK-1|0;bE=+h[aM+(aL<<6)+8>>3];ct=+h[aM+(aL<<6)+16>>3];cH=+h[aM+(aK<<6)+8>>3];cC=+h[aM+(aK<<6)+16>>3];aL=c[200]|0;bD=+h[64664+(aL*688&-1)>>3];if((bE>cH?bE:cH)>3];if((bEcF){dT=bN;dU=cg;break}cf=c[144]|0;cJ=+h[64664+(cf*688&-1)>>3];if((ct>cC?ct:cC)>3];if((ctcs){dT=bN;dU=cg;break}co=cJcs){bt=9876}else{bt=9880}}else{if(cCcJ){bt=9876}else{bt=9881}}if((bt|0)==9876){bt=0;if(bDcF){dT=bN;dU=cg;break}}else{if(bEbD){dT=bN;dU=cg;break}}if(co){bt=9880}else{bt=9881}}if((bt|0)==9880){bt=0;if(cCcs){bt=9900}else{bt=9882}}else if((bt|0)==9881){bt=0;if(cCcJ){bt=9901}else{bt=9882}}do{if((bt|0)==9882){bt=0;cb=bDcF){bt=9899}}else{if(bEbD){bt=9899}}if((bt|0)==9899){bt=0;if(co){bt=9900;break}else{bt=9901;break}}do{if(co){if(ct>cs){dV=cs;break}if(ct>=cJ){dV=ct;break}dV=cJ}else{if(ct>cJ){dV=cJ;break}if(ct>=cs){dV=ct;break}dV=cs}}while(0);if(cb){if(cH>cF){dW=dV;dX=cC;dY=bE;dZ=cF;break}if(cH>=bD){dW=dV;dX=cC;dY=bE;dZ=cH;break}dW=dV;dX=cC;dY=bE;dZ=bD;break}else{if(cH>bD){dW=dV;dX=cC;dY=bE;dZ=bD;break}if(cH>=cF){dW=dV;dX=cC;dY=bE;dZ=cH;break}dW=dV;dX=cC;dY=bE;dZ=cF;break}}}while(0);if((bt|0)==9900){bt=0;if(cCcs){bt=9902}else{dW=cC;dX=cC;dY=bD;dZ=cF}}else if((bt|0)==9901){bt=0;if(cCcJ){bt=9902}else{dW=cC;dX=cC;dY=bD;dZ=cF}}do{if((bt|0)==9902){bt=0;if(bDcF){dT=bN;dU=cg;break L13532}else{dW=cJ;dX=cs;dY=bE;dZ=bE;break}}else{if(bEbD){dT=bN;dU=cg;break L13532}else{dW=cJ;dX=cs;dY=bE;dZ=bE;break}}}}while(0);bE=+(c[64768+(aL*688&-1)>>2]|0);cs=+h[64776+(aL*688&-1)>>3];co=~~(bE+(dY-bD)*cs+.5);cF=+(c[64768+(cf*688&-1)>>2]|0);cC=+h[64776+(cf*688&-1)>>3];cc=~~(bE+(dZ-bD)*cs+.5);ca=~~(cF+(dX-cJ)*cC+.5);cN[c[bj>>2]&255](co,~~(cF+(dW-cJ)*cC+.5));cN[c[ar>>2]&255](co,ca);cN[c[ar>>2]&255](cc,ca);dT=ca;dU=cc}else{dT=bN;dU=cg}}while(0);cN[c[bj>>2]&255](dU,dT);dR=dT;dS=dU}else{dR=bN;dS=cg}cr=c[cq>>2]|0;cd=c[cr+(aK<<6)>>2]|0;ci=aK+1|0;if((ci|0)<(c[ch>>2]|0)){cg=dS;bN=dR;aK=ci;aJ=cd;aM=cr}else{break}}}else if((aH|0)==1){fX(bv);break}else if((aH|0)==177|(aH|0)==184){aM=c[3524]|0;do{if((aH&8|0)==0){d_=0;d$=0}else{if((c[aM+108>>2]|0)==0){d_=0;d$=0;break}aJ=c[bv+192>>2]|0;if((aJ|0)==1|(aJ|0)==4){d0=(c[bv+196>>2]<<4&65520)+aJ|0}else if((aJ|0)==2|(aJ|0)==5){d0=(c[bv+200>>2]<<4&65520)+aJ|0}else{d0=0}aJ=c[144]|0;do{if((a[64788+(aJ*688&-1)|0]&1)==0){h[ab>>3]=0.0;cC=+h[64664+(aJ*688&-1)>>3];cF=+h[64672+(aJ*688&-1)>>3];if(cC>3]=cF;d1=cF;d2=cC;break}if(cC<=0.0){d1=0.0;d2=cC;break}h[ab>>3]=cC;d1=cC;d2=cC;break}else{if(cC<0.0){h[ab>>3]=cC;d1=cC;d2=cC;break}if(cF<=0.0){d1=0.0;d2=cC;break}h[ab>>3]=cF;d1=cF;d2=cC;break}}else{cC=+h[64664+(aJ*688&-1)>>3];h[ab>>3]=cC;d1=cC;d2=cC}}while(0);d_=d0;d$=~~(+(c[64768+(aJ*688&-1)>>2]|0)+(d1-d2)*+h[64776+(aJ*688&-1)>>3]+.5)}}while(0);aK=bv+300|0;if((c[aK>>2]|0)<=0){break}bN=bv+320|0;cg=aM+56|0;ch=(d_|0)==0;cq=aM+60|0;bj=aM+108|0;ar=0;aI=0;cn=0;cr=2;cd=c[bN>>2]|0;while(1){ci=c[cd+(cn<<6)>>2]|0;if((ci|0)==1){L13617:do{if((cr|0)==0){if((a[54160]&1)==0){d3=aI;d4=ar;break}gg(cd,cn,$,ab);cc=c[200]|0;ca=~~(+(c[64768+(cc*688&-1)>>2]|0)+(+h[$>>3]- +h[64664+(cc*688&-1)>>3])*+h[64776+(cc*688&-1)>>3]+.5);cc=c[144]|0;co=~~(+(c[64768+(cc*688&-1)>>2]|0)+(+h[ab>>3]- +h[64664+(cc*688&-1)>>3])*+h[64776+(cc*688&-1)>>3]+.5);if(ch){cN[c[cq>>2]&255](ca,aI);cN[c[cq>>2]&255](ca,co);d3=co;d4=ca;break}else{cI[c[bj>>2]&63](d_,ar,d$,ca-ar|0,aI-d$|0);d3=co;d4=ca;break}}else if((cr|0)==1){if((a[54152]&1)==0){d3=aI;d4=ar;break}ca=cn-1|0;cC=+h[cd+(ca<<6)+8>>3];cF=+h[cd+(ca<<6)+16>>3];cs=+h[cd+(cn<<6)+8>>3];bE=+h[cd+(cn<<6)+16>>3];ca=c[200]|0;cH=+h[64664+(ca*688&-1)>>3];if((cC>cs?cC:cs)>3];if((cCct){d3=aI;d4=ar;break}co=c[144]|0;cA=+h[64664+(co*688&-1)>>3];if((cF>bE?cF:bE)>3];if((cFa7){d3=aI;d4=ar;break}cc=cAa7){bt=9824}else{bt=9828}}else{if(cFcA){bt=9824}else{bt=9829}}if((bt|0)==9824){bt=0;if(cHct){d3=aI;d4=ar;break}}else{if(cscH){d3=aI;d4=ar;break}}if(cc){bt=9828}else{bt=9829}}if((bt|0)==9828){bt=0;if(cFa7){bt=9847}else{bt=9830}}else if((bt|0)==9829){bt=0;if(cFcA){bt=9848}else{bt=9830}}do{if((bt|0)==9830){bt=0;do{if(cHct){bt=9846;break}if(cC>ct){d5=ct;break}if(cC>=cH){d5=cC;break}d5=cH}else{if(cscH){bt=9846;break}if(cC>cH){d5=cH;break}if(cC>=ct){d5=cC;break}d5=ct}}while(0);if((bt|0)==9846){bt=0;if(cc){bt=9847;break}else{bt=9848;break}}if(cc){if(bE>a7){d6=cF;d7=a7;d8=d5;d9=cs;break}if(bE>=cA){d6=cF;d7=bE;d8=d5;d9=cs;break}d6=cF;d7=cA;d8=d5;d9=cs;break}else{if(bE>cA){d6=cF;d7=cA;d8=d5;d9=cs;break}if(bE>=a7){d6=cF;d7=bE;d8=d5;d9=cs;break}d6=cF;d7=a7;d8=d5;d9=cs;break}}}while(0);if((bt|0)==9847){bt=0;if(cFa7){bt=9849}else{d6=cF;d7=cF;d8=cH;d9=ct}}else if((bt|0)==9848){bt=0;if(cFcA){bt=9849}else{d6=cF;d7=cF;d8=cH;d9=ct}}do{if((bt|0)==9849){bt=0;if(cHct){d3=aI;d4=ar;break L13617}else{d6=cA;d7=a7;d8=cs;d9=cs;break}}else{if(cCcH){d3=aI;d4=ar;break L13617}else{d6=cA;d7=a7;d8=cs;d9=cs;break}}}}while(0);cs=+(c[64768+(ca*688&-1)>>2]|0);a7=+h[64776+(ca*688&-1)>>3];cc=~~(cs+(d8-cH)*a7+.5);cC=+(c[64768+(co*688&-1)>>2]|0);ct=+h[64776+(co*688&-1)>>3];cf=~~(cC+(d6-cA)*ct+.5);aL=~~(cs+(d9-cH)*a7+.5);cb=~~(cC+(d7-cA)*ct+.5);if(ch){cN[c[cg>>2]&255](cc,cf);cN[c[cq>>2]&255](aL,cf);cN[c[cq>>2]&255](aL,cb);d3=cb;d4=aL;break}else{cI[c[bj>>2]&63](d_,cc,d$,aL-cc|0,cf-d$|0);d3=cb;d4=aL;break}}else{d3=aI;d4=ar}}while(0);cN[c[cg>>2]&255](d4,d3);ea=d3;eb=d4}else if((ci|0)==0){aJ=c[200]|0;aL=~~(+(c[64768+(aJ*688&-1)>>2]|0)+(+h[cd+(cn<<6)+8>>3]- +h[64664+(aJ*688&-1)>>3])*+h[64776+(aJ*688&-1)>>3]+.5);aJ=c[144]|0;cb=~~(+(c[64768+(aJ*688&-1)>>2]|0)+(+h[cd+(cn<<6)+16>>3]- +h[64664+(aJ*688&-1)>>3])*+h[64776+(aJ*688&-1)>>3]+.5);do{if((cr|0)==1){if((a[54160]&1)==0){break}gg(cd,cn,$,ab);aJ=c[200]|0;cf=~~(+(c[64768+(aJ*688&-1)>>2]|0)+(+h[$>>3]- +h[64664+(aJ*688&-1)>>3])*+h[64776+(aJ*688&-1)>>3]+.5);aJ=c[144]|0;cc=~~(+(c[64768+(aJ*688&-1)>>2]|0)+(+h[ab>>3]- +h[64664+(aJ*688&-1)>>3])*+h[64776+(aJ*688&-1)>>3]+.5);if(ch){cN[c[cg>>2]&255](cf,cc);cN[c[cq>>2]&255](aL,cc);cN[c[cq>>2]&255](aL,cb);break}aJ=cc-d$|0;b8=c[bj>>2]|0;ce=aL-cf|0;if((aJ|0)<0){cI[b8&63](d_,cf,cc,ce,d$-cc|0);break}else{cI[b8&63](d_,cf,d$,ce,aJ);break}}else if((cr|0)==0){if(ch){cN[c[cq>>2]&255](aL,aI);cN[c[cq>>2]&255](aL,cb);break}aJ=aI-d$|0;ce=c[bj>>2]|0;cf=aL-ar|0;if((aJ|0)<0){cI[ce&63](d_,ar,aI,cf,d$-aI|0);break}else{cI[ce&63](d_,ar,d$,cf,aJ);break}}}while(0);cN[c[cg>>2]&255](aL,cb);ea=cb;eb=aL}else{ea=aI;eb=ar}ci=c[bN>>2]|0;aJ=c[ci+(cn<<6)>>2]|0;cf=cn+1|0;if((cf|0)<(c[aK>>2]|0)){ar=eb;aI=ea;cn=cf;cr=aJ;cd=ci}else{break}}}else if((aH|0)==225){cd=c[3524]|0;cr=c[bv+88>>2]|0;cn=c[bv+92>>2]|0;ct=+h[bv+104>>3];cC=+h[bv+112>>3];aI=a[bv+120|0]|0;uD(c_|0,bv+121|0,23);ar=c[bv+144>>2]|0;a7=+h[bv+152>>3];aK=c[bv+160>>2]|0;cs=+h[bv+168>>3];cF=+h[bv+176>>3];bN=c[bv+184>>2]|0;uD(cv|0,ck|0,16);do{if((cr|0)!=0){cg=c[cd+92>>2]|0;if(cC<0.0){cK[cg&63](+h[3817]);break}else{cK[cg&63](cC);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](ct);cr=c[(c[3524]|0)+64>>2]|0;if((cn|0)<-5){cM[cr&511](-2)}else{cM[cr&511](cn)}cr=c[3524]|0;do{if((aI&1)==0){if((c[cr+96>>2]&1024|0)!=0){break}c[M>>2]=1;c[cV>>2]=cn;bt=10059}else{bt=10059}}while(0);if((bt|0)==10059){bt=0;fn(I,cr)}c[12912]=bN;c[12910]=0;if(a7>0.0){uE(bh|0,0,40);c[bo>>2]=2;c[bL>>2]=2;h[bi>>3]=a7;c[aB>>2]=aK;fN(H,F,G,123984);h[6458]=cs;h[6457]=cF;c[12910]=~~+h[F>>3]}cn=bv+300|0;if((c[cn>>2]|0)<=0){break}aI=bv+320|0;cg=bv+80|0;bj=bv+316|0;cq=cd+84|0;ch=ar;aM=0;while(1){ci=c[aI>>2]|0;uD(R|0,ci+(aM<<6)|0,64);aJ=c[c$>>2]|0;L13717:do{if((aJ|0)==2){ec=ch}else{ct=+h[ci+(aM<<6)+56>>3];h[ao>>3]=ct;cC=+h[ci+(aM<<6)+40>>3];h[an>>3]=cC;do{if((c[cg>>2]|0)==-3){cf=~~+h[ci+(aM<<6)+24>>3];ce=43296;while(1){ed=c[ce>>2]|0;if((ed|0)==0){bt=10069;break}if((c[ed+4>>2]|0)==(cf|0)){bt=10070;break}else{ce=ed|0}}do{if((bt|0)==10069){bt=0;uD(c_|0,51521,23);uh(-1,79128,(v=i,i=i+8|0,c[v>>2]=cf,v)|0);uD(cL|0,ck|0,16);ee=0;ef=90.0;eg=15.0;eh=0;ei=0.0;ej=1;ek=0;el=1.0;em=-2}else if((bt|0)==10070){bt=0;ce=c[ed+16>>2]|0;b8=c[ed+20>>2]|0;bE=+h[ed+32>>3];cJ=+h[ed+40>>3];cc=a[ed+48|0]|0;uD(c_|0,ed+49|0,23);b9=c[ed+72>>2]|0;bD=+h[ed+80>>3];b7=c[ed+88>>2]|0;be=+h[ed+96>>3];bd=+h[ed+104>>3];b4=c[ed+112>>2]|0;uD(cL|0,ck|0,16);if((ce|0)==0){ee=b4;ef=bd;eg=be;eh=b7;ei=bD;ej=b9;ek=cc;el=bE;em=b8;break}ce=c[(c[3524]|0)+92>>2]|0;if(cJ<0.0){cK[ce&63](+h[3817]);ee=b4;ef=bd;eg=be;eh=b7;ei=bD;ej=b9;ek=cc;el=bE;em=b8;break}else{cK[ce&63](cJ);ee=b4;ef=bd;eg=be;eh=b7;ei=bD;ej=b9;ek=cc;el=bE;em=b8;break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](el);cf=c[(c[3524]|0)+64>>2]|0;if((em|0)<-5){cM[cf&511](-2)}else{cM[cf&511](em)}cf=c[3524]|0;do{if((ek&1)==0){if((c[cf+96>>2]&1024|0)!=0){break}c[cj>>2]=1;c[cY>>2]=em;bt=10080}else{bt=10080}}while(0);if((bt|0)==10080){bt=0;fn(E,cf)}c[12912]=ee;c[12910]=0;if(ei<=0.0){en=ej;break}uE(bn|0,0,40);c[cZ>>2]=2;c[by>>2]=2;h[cX>>3]=ei;c[cB>>2]=eh;fN(D,B,C,123984);h[6458]=eg;h[6457]=ef;c[12910]=~~+h[B>>3];en=ej}else{en=ch}}while(0);co=(c[bj>>2]|0)+(aM<<3)|0;f9(bv,co);co=c[200]|0;cA=+h[64664+(co*688&-1)>>3];cH=+h[64672+(co*688&-1)>>3];if(cAcH)){bt=10086}}else{if(!(ctcA)){bt=10086}}do{if((bt|0)==10086){bt=0;ca=c[144]|0;cH=+h[64664+(ca*688&-1)>>3];bE=+h[64672+(ca*688&-1)>>3];if(cHbE){break}}else{if(cCcH){break}}c[cz>>2]=0;bE=+(c[64768+(co*688&-1)>>2]|0);bD=+h[64776+(co*688&-1)>>3];b8=~~(bE+(ct-cA)*bD+.5);be=+(c[64768+(ca*688&-1)>>2]|0);bd=+h[64776+(ca*688&-1)>>3];ca=~~(be+(cC-cH)*bd+.5);if((aJ|0)==0){cI[c[cq>>2]&63](~~(bE+bD*(+h[cD>>3]-cA)+.5),~~(be+bd*(+h[bI>>3]-cH)+.5),b8,ca,en);ec=en;break L13717}else if((aJ|0)!=1){ec=en;break L13717}if((a[54160]&1)==0){ec=en;break L13717}gb(c0,1,K,L);cc=c[200]|0;b9=~~(+(c[64768+(cc*688&-1)>>2]|0)+(+h[K>>3]- +h[64664+(cc*688&-1)>>3])*+h[64776+(cc*688&-1)>>3]+.5);cc=c[144]|0;b7=~~(+(c[64768+(cc*688&-1)>>2]|0)+(+h[L>>3]- +h[64664+(cc*688&-1)>>3])*+h[64776+(cc*688&-1)>>3]+.5);cc=c[cq>>2]|0;if((en&1|0)==0){cI[cc&63](b9,b7,b8,ca,0);ec=en;break L13717}else{cI[cc&63](b9,b7,b8,ca,1);ec=en;break L13717}}}while(0);c[cz>>2]=1;if((aJ|0)==1){if((a[54152]&1)==0){ec=en;break}if(!(gc(c0,1,aU,c2)|0)){ec=en;break}ca=c[200]|0;cC=+(c[64768+(ca*688&-1)>>2]|0);ct=+h[64664+(ca*688&-1)>>3];cH=+h[64776+(ca*688&-1)>>3];ca=c[144]|0;bd=+(c[64768+(ca*688&-1)>>2]|0);be=+h[64664+(ca*688&-1)>>3];bD=+h[64776+(ca*688&-1)>>3];cI[c[cq>>2]&63](~~(cC+(+h[aU>>3]-ct)*cH+.5),~~(bd+(+h[c2>>3]-be)*bD+.5),~~(cC+cH*(+h[c1>>3]-ct)+.5),~~(bd+bD*(+h[Q>>3]-be)+.5),0);ec=en;break}else if((aJ|0)!=0){ec=en;break}if((a[54160]&1)==0){ec=en;break}ca=~~(+(c[64768+(co*688&-1)>>2]|0)+(+h[cD>>3]-cA)*+h[64776+(co*688&-1)>>3]+.5);b8=c[144]|0;b7=~~(+(c[64768+(b8*688&-1)>>2]|0)+(+h[bI>>3]- +h[64664+(b8*688&-1)>>3])*+h[64776+(b8*688&-1)>>3]+.5);gb(c0,1,K,L);b8=c[200]|0;b9=~~(+(c[64768+(b8*688&-1)>>2]|0)+(+h[K>>3]- +h[64664+(b8*688&-1)>>3])*+h[64776+(b8*688&-1)>>3]+.5);b8=c[144]|0;cc=~~(+(c[64768+(b8*688&-1)>>2]|0)+(+h[L>>3]- +h[64664+(b8*688&-1)>>3])*+h[64776+(b8*688&-1)>>3]+.5);b8=c[cq>>2]|0;if((en&2|0)==0){cI[b8&63](ca,b7,b9,cc,0);ec=en;break}else{cI[b8&63](b9,cc,ca,b7,2);ec=en;break}}}while(0);aJ=aM+1|0;if((aJ|0)<(c[cn>>2]|0)){ch=ec;aM=aJ}else{break}}}else if((aH|0)==209){aM=c[3524]|0;ch=bv+300|0;cn=c[ch>>2]|0;if((cn|0)<=0){break}cq=bv+320|0;bj=c[cq>>2]|0;cg=0;aI=0;do{aI=((c[bj+(cg<<6)>>2]|0)>>>0<2&1)+aI|0;cg=cg+1|0;}while((cg|0)<(cn|0));if((aI|0)<2){break}cn=aI<<2;cg=ut(cn)|0;if((cg|0)==0){gk();bj=ut(cn)|0;if((bj|0)==0){bt=9914;break L13212}else{eo=bj}}else{eo=cg}cg=eo;bj=c[ch>>2]|0;if((bj|0)>0){cn=0;ar=0;cd=bj;while(1){if((c[(c[cq>>2]|0)+(cn<<6)>>2]|0)>>>0<2){c[cg+(ar<<2)>>2]=cn;ep=ar+1|0;eq=c[ch>>2]|0}else{ep=ar;eq=cd}bj=cn+1|0;if((bj|0)<(eq|0)){cn=bj;ar=ep;cd=eq}else{er=ep;break}}}else{er=0}c[9732]=bv;bM(eo|0,er|0,4,30);c[9732]=0;cd=c[144]|0;cF=+h[64664+(cd*688&-1)>>3];if((a[64788+(cd*688&-1)|0]&1)==0){es=0.0}else{cs=+h[64672+(cd*688&-1)>>3];es=cF>2]|0;cn=c[cq>>2]|0;cs=(+h[cn+(ar<<6)+8>>3]*3.0- +h[cn+(c[eo+4>>2]<<6)+8>>3])*.5;ch=c[200]|0;aI=~~(+(c[64768+(ch*688&-1)>>2]|0)+(cs- +h[64664+(ch*688&-1)>>3])*+h[64776+(ch*688&-1)>>3]+.5);c[W>>2]=aI;ch=~~(+(c[64768+(cd*688&-1)>>2]|0)+(es-cF)*+h[64776+(cd*688&-1)>>3]+.5);c[X>>2]=ch;cd=c[13542]|0;if((cd|0)==0){bt=9923}else{bj=(c[cd>>2]|0)>(aI|0)&1;aK=(c[cd+4>>2]|0)<(aI|0)?bj|2:bj;bj=(c[cd+8>>2]|0)>(ch|0)?aK|4:aK;if((((c[cd+12>>2]|0)<(ch|0)?bj|8:bj)|0)==0){bt=9923}else{et=ar;eu=cn}}if((bt|0)==9923){bt=0;cN[c[aM+56>>2]&255](aI,ch);et=c[cg>>2]|0;eu=c[cq>>2]|0}ch=er-1|0;cF=+h[eu+(et<<6)+16>>3];if((ch|0)>0){a7=cs;be=es;aI=1;cn=et;ar=eu;bD=cF;while(1){ev=(a[64788+((c[144]|0)*688&-1)|0]&1)!=0&bD>3]+ +h[ar+(c[bj>>2]<<6)+8>>3])*.5;gd(W,X,a7,be,ev);ge(W,X,a7,ew,ev);ex=c[bj>>2]|0;ey=c[cq>>2]|0;ez=+h[ey+(ex<<6)+16>>3];if((aI|0)>=(ch|0)){break}a7=ew;be=ev;aI=aI+1|0;cn=ex;ar=ey;bD=ez}eA=ew;eB=ev;eC=er-2|0;eD=ex;eE=ey;eF=ez}else{eA=cs;eB=es;eC=-1;eD=et;eE=eu;eF=cF}bD=(+h[eE+(eD<<6)+8>>3]*3.0- +h[eE+(c[cg+(eC<<2)>>2]<<6)+8>>3])*.5;gd(W,X,eA,eB,eF);ge(W,X,eA,bD,eF);gd(W,X,bD,eF,es);uu(eo);break}else if((aH|0)==257){f1(bv);break}else if((aH|0)==252){f2(bv);break}else if((aH|0)==474){ar=bv+320|0;cn=c[ar>>2]|0;aI=c[bv+288>>2]|0;ch=(aI|0)==0?1:aI;aI=bv+300|0;cq=c[aI>>2]|0;if((ch|0)<=0){break}aM=(ch|0)>1;bj=(cq|0)>0;cd=bv+292|0;aK=bv+48|0;bN=bv+32|0;bD=0.0;be=0.0;cr=0;aJ=cq;while(1){if(aM){c[aI>>2]=cq;do{if((a[56292]&1)==0){eG=cr}else{ci=c[cd>>2]|0;if((ci|0)==0){eG=cr;break}eG=c[ci+(cr<<2)>>2]|0}}while(0);ci=c[ar>>2]|0;if(bj){a7=+(eG|0);aL=0;cb=ci;while(1){h[cb+(aL<<6)+16>>3]=+h[cb+(aL<<6)+40>>3];c[(c[ar>>2]|0)+(aL<<6)>>2]=0;b7=c[ar>>2]|0;if(+h[b7+(aL<<6)+32>>3]!=a7){c[b7+(aL<<6)>>2]=2;h[(c[ar>>2]|0)+(aL<<6)+16>>3]=8.988465674311579e+307;eH=c[ar>>2]|0}else{eH=b7}b7=aL+1|0;if((b7|0)<(cq|0)){aL=b7;cb=eH}else{eI=eH;break}}}else{eI=ci}bM(eI|0,cq|0,64,12);cb=c[ar>>2]|0;aL=cq;while(1){b7=aL-1|0;if((c[cb+(b7<<6)>>2]|0)==2){aL=b7}else{break}}c[aI>>2]=aL;eJ=aL}else{eJ=aJ}if((eJ|0)<4){h[J>>3]=+h[(c[ar>>2]|0)+8>>3]+ +(cr|0)*+h[7035];h[cW>>3]=-8.988465674311579e+307;h[bu>>3]=8.988465674311579e+307;eK=be;eL=bD}else{if((eJ&1|0)==0){cb=(eJ|0)/2&-1;ci=c[ar>>2]|0;eM=(+h[ci+(cb-1<<6)+16>>3]+ +h[ci+(cb<<6)+16>>3])*.5;eN=ci}else{ci=c[ar>>2]|0;eM=+h[ci+(((eJ-1|0)/2&-1)<<6)+16>>3];eN=ci}if((eJ&3|0)==0){ci=(eJ|0)/4&-1;cb=eJ-ci|0;eO=(+h[eN+(cb<<6)+16>>3]+ +h[eN+(cb-1<<6)+16>>3])*.5;eP=(+h[eN+(ci-1<<6)+16>>3]+ +h[eN+(ci<<6)+16>>3])*.5}else{ci=(eJ+3|0)/4&-1;eO=+h[eN+(eJ-ci<<6)+16>>3];eP=+h[eN+(ci-1<<6)+16>>3]}L13836:do{if((c[14062]|0)==0){a7=(eO-eP)*+h[7032];bd=eP-a7;ci=0;while(1){if((ci|0)>=(eJ|0)){eQ=bd;break}ct=+h[eN+(ci<<6)+16>>3];if(ct>3];if(cA>bd){ci=co}else{eR=eQ;eS=cA;eT=eN;break}}}else{bd=+(eJ|0);a7=+h[7032];ci=0;co=eJ-1|0;cA=be;ct=bD;cb=eN;L13846:while(1){b7=1-ci|0;ca=co;cH=cA;cC=ct;cc=cb;while(1){if(+(b7+ca|0)/bd>3];eV=+h[cc+(ci<<6)+16>>3];bE=eU-eM;cJ=eM-eV;L13851:do{if(bE>3]==+h[eN+(b9-2<<6)+16>>3]){b9=b4;b8=eN}else{eW=b4;eX=eN;break}}}}while(0);if(bE>cJ){ca=eW;cH=eV;cC=eU;cc=eX}else{break}}cc=ci+1|0;while(1){if((cc|0)>=(eW|0)){ci=cc;co=eW;cA=eV;ct=eU;cb=eX;continue L13846}ca=cc+1|0;if(+h[eX+(cc<<6)+16>>3]==+h[eX+(ca<<6)+16>>3]){cc=ca}else{ci=cc;co=eW;cA=eV;ct=eU;cb=eX;continue L13846}}}}}while(0);c[cP>>2]=0;ct=+h[eT+8>>3];if((c[cp>>2]|0)==0){h[J>>3]=(ct+ +h[eT+(eJ-1<<6)+8>>3])*.5;eY=+h[7035];eZ=+(cr|0)}else{cA=+h[7035];a7=+(cr|0);h[J>>3]=ct+a7*cA;eY=cA;eZ=a7}h[cQ>>3]=eP;h[cm>>3]=eO;h[bu>>3]=eR;h[cW>>3]=eS;h[aR>>3]=+h[eT+48>>3]+eZ*eY;h[aQ>>3]=eM;c[ar>>2]=A;c[aI>>2]=1;if((c[14068]|0)==257){f1(bv)}else{f2(bv)}c[ar>>2]=cn;c[aI>>2]=eJ;eK=eR;eL=eS}do{if((a[56264]&1)==0){e_=eJ}else{c[8240]=~~(+h[aK>>3]*+((c[(c[3524]|0)+28>>2]|0)>>>0>>>0));aL=c[aI>>2]|0;if((aL|0)>0){e$=0;e0=aL}else{e_=aL;break}while(1){aL=c[ar>>2]|0;a7=+h[aL+(e$<<6)+16>>3];if(a7<+h[bu>>3]){bt=10156}else{if(a7>+h[cW>>3]){bt=10156}else{e1=e0}}do{if((bt|0)==10156){bt=0;if((c[aL+(e$<<6)>>2]|0)!=0){e1=e0;break}cb=c[200]|0;co=~~(+(c[64768+(cb*688&-1)>>2]|0)+(+h[J>>3]- +h[64664+(cb*688&-1)>>3])*+h[64776+(cb*688&-1)>>3]+.5);cb=c[144]|0;ci=~~(+(c[64768+(cb*688&-1)>>2]|0)+(a7- +h[64664+(cb*688&-1)>>3])*+h[64776+(cb*688&-1)>>3]+.5);if((a[54144]&1)!=0){cb=c[8240]|0;if((co|0)<(cb+(c[7938]|0)|0)){e1=e0;break}cc=c[8242]|0;if((ci|0)<(cc+(c[7940]|0)|0)){e1=e0;break}if((co|0)>((c[7939]|0)-cb|0)){e1=e0;break}if((ci|0)>((c[7941]|0)-cc|0)){e1=e0;break}}L13885:do{if((e$|0)<1){e2=co}else{cc=c[8240]|0;cb=1;ca=co;while(1){if(a7!=+h[aL+(e$-cb<<6)+16>>3]){e2=ca;break L13885}b7=aa((cb&1|0)==0?-cb|0:cb,cc)+ca|0;cf=cb+1|0;if((e$|0)<(cf|0)){e2=b7;break}else{cb=cf;ca=b7}}}}while(0);cR[c[(c[3524]|0)+80>>2]&127](e2,ci,c[bN>>2]|0);e1=c[aI>>2]|0}}while(0);aL=e$+1|0;if((aL|0)<(e1|0)){e$=aL;e0=e1}else{e_=e1;break}}}}while(0);aL=cr+1|0;if((aL|0)<(ch|0)){bD=eL;be=eK;cr=aL;aJ=e_}else{break}}}else if((aH|0)==352){uh(-1,108328,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);break}else if((aH|0)==368){aJ=c[c[bv+224>>2]>>2]|0;cr=c[(c[3524]|0)+92>>2]|0;if((cr|0)!=0){cK[cr&63](+h[3817])}if((aJ|0)==0){break}else{e3=aJ}do{L13900:do{if((c[e3+56>>2]|0)==99){aJ=c[200]|0;be=+h[e3+24>>3];cr=c[144]|0;bD=+h[e3+32>>3];ch=~~(+(c[64768+(cr*688&-1)>>2]|0)+(bD- +h[64664+(cr*688&-1)>>3])*+h[64776+(cr*688&-1)>>3]+.5);cr=~~(+(c[64768+(aJ*688&-1)>>2]|0)+(be- +h[64664+(aJ*688&-1)>>3])*+h[64776+(aJ*688&-1)>>3]+.5);aJ=c[e3+8>>2]|0;do{if((aJ|0)==0){cF=+h[8255];cs=+h[8256];if(cFcs){break L13900}else{break}}else{if(becF){break L13900}else{break}}}else if((aJ|0)==1){cF=+h[8599];cs=+h[8600];if(cFcs){break L13900}else{break}}else{if(becF){break L13900}else{break}}}}while(0);aJ=c[e3+12>>2]|0;do{if((aJ|0)==0){be=+h[8169];cF=+h[8170];if(becF){break L13900}else{break}}else{if(bDbe){break L13900}else{break}}}else if((aJ|0)==1){be=+h[8513];cF=+h[8514];if(becF){break L13900}else{break}}else{if(bDbe){break L13900}else{break}}}}while(0);fp(cr,ch,e3)}}while(0);e3=c[e3>>2]|0;}while((e3|0)!=0)}else if((aH|0)==400){c[bv+228>>2]=0;f3(bv,0);break}else if((aH|0)==416){c[bv+228>>2]=1;f3(bv,0);break}else if((aH|0)==432){c[bv+228>>2]=2;f3(bv,0);break}else if((aH|0)==457){aJ=bv+192|0;aI=c[aJ>>2]|0;if((aI|0)==1|(aI|0)==4){e4=(c[bv+196>>2]<<4&65520)+aI|0}else if((aI|0)==2|(aI|0)==5){e4=(c[bv+200>>2]<<4&65520)+aI|0}else{e4=0}if((c[bv+208>>2]|0)==1){if((c[bv+212>>2]|0)==-3){e5=0}else{bt=10198}}else{bt=10198}if((bt|0)==10198){bt=0;e5=1}aI=bv+300|0;if((c[aI>>2]|0)<=0){break}bN=bv+320|0;ar=bv+316|0;aK=e5^1;cn=bv+24|0;cq=bv+48|0;bj=0;do{cd=c[bN>>2]|0;do{if((c[cd+(bj<<6)>>2]|0)==0){aM=c[200]|0;bD=+(c[64768+(aM*688&-1)>>2]|0);be=+h[64664+(aM*688&-1)>>3];cF=+h[64776+(aM*688&-1)>>3];aM=~~(bD+(+h[cd+(bj<<6)+8>>3]-be)*cF+.5);cg=c[144]|0;aL=~~(+(c[64768+(cg*688&-1)>>2]|0)+(+h[cd+(bj<<6)+16>>3]- +h[64664+(cg*688&-1)>>3])*+h[64776+(cg*688&-1)>>3]+.5);h[y>>3]=+(aM-~~(bD+cF*(+h[cd+(bj<<6)+48>>3]-be)+.5)|0);if(+h[cd+(bj<<6)+24>>3]==-1.0){fN(50952,y,z,184696);e6=c[bN>>2]|0}else{e6=cd}be=+h[e6+(bj<<6)+32>>3];cF=+h[e6+(bj<<6)+56>>3];do{if(!(f9(bv,(c[ar>>2]|0)+(bj<<3)|0)|aK)){c[cw>>2]=c[bm>>2];c[cw+4>>2]=c[bm+4>>2];c[cw+8>>2]=c[bm+8>>2];c[cw+12>>2]=c[bm+12>>2];cg=c[cu>>2]|0;do{if((c[cn>>2]|0)!=0){bD=+h[cq>>3];co=c[(c[3524]|0)+92>>2]|0;if(bD<0.0){cK[co&63](+h[3817]);break}else{cK[co&63](bD);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[aP>>3]);co=c[(c[3524]|0)+64>>2]|0;if((cg|0)<-5){cM[co&511](-2)}else{cM[co&511](cg)}co=c[3524]|0;if((a[cx]&1)==0){if((c[co+96>>2]&1024|0)!=0){break}c[cU>>2]=1;c[bz>>2]=cg}fn(x,co)}}while(0);bD=+h[y>>3];lq(aM,aL,bD,be,cF,e4);if(!e5){break}hG(aJ);lq(aM,aL,bD,be,cF,0)}}while(0);bj=bj+1|0;}while((bj|0)<(c[aI>>2]|0))}else if((aH|0)==489){aI=ut(96)|0;if((aI|0)==0){gk();bj=ut(96)|0;if((bj|0)==0){bt=10221;break L13212}else{e7=bj}}else{e7=aI}aI=e7;bj=bv+192|0;aJ=c[bj>>2]|0;if((aJ|0)==1|(aJ|0)==4){e8=(c[bv+196>>2]<<4&65520)+aJ|0}else if((aJ|0)==2|(aJ|0)==5){e8=(c[bv+200>>2]<<4&65520)+aJ|0}else{e8=0}if((c[bv+208>>2]|0)==1){if((c[bv+212>>2]|0)==-3){e9=0}else{bt=10227}}else{bt=10227}if((bt|0)==10227){bt=0;e9=1}aJ=e7+48|0;cq=aJ;c[aJ>>2]=(c[cl>>2]|0)==6&1;c[e7+52>>2]=(c[ap>>2]|0)==5&1;aJ=e7;c[aJ>>2]=c[bv+272>>2];cn=bv+300|0;if((c[cn>>2]|0)>0){aK=bv+320|0;ar=e7+24|0;bN=e7+32|0;cd=e7+64|0;ch=e7+72|0;cr=e7+88|0;co=bv+316|0;ca=e9^1;cb=bv+24|0;cc=bv+48|0;b7=0;do{cf=c[aK>>2]|0;do{if((c[cf+(b7<<6)>>2]|0)==0){b8=c[200]|0;h[ar>>3]=+(~~(+(c[64768+(b8*688&-1)>>2]|0)+(+h[cf+(b7<<6)+8>>3]- +h[64664+(b8*688&-1)>>3])*+h[64776+(b8*688&-1)>>3]+.5)|0);b8=c[144]|0;h[bN>>3]=+(~~(+(c[64768+(b8*688&-1)>>2]|0)+(+h[(c[aK>>2]|0)+(b7<<6)+16>>3]- +h[64664+(b8*688&-1)>>3])*+h[64776+(b8*688&-1)>>3]+.5)|0);h[cd>>3]=+h[(c[aK>>2]|0)+(b7<<6)+48>>3];h[ch>>3]=+h[(c[aK>>2]|0)+(b7<<6)+56>>3];b8=c[aJ>>2]|0;if((b8|0)==0){fN(cq,u,w,73152);h[cd>>3]=+h[u>>3];h[ch>>3]=+h[w>>3]}else if((b8|0)==1){fN(cq,u,w,73152);bD=+h[u>>3];h[cd>>3]=+h[ch>>3];fN(cq,w,u,73152);h[cd>>3]=bD;h[ch>>3]=+h[w>>3]}else if((b8|0)==2){fN(cq,u,w,73152);bD=+h[w>>3];h[ch>>3]=+h[cd>>3];fN(cq,w,u,73152);h[cd>>3]=+h[u>>3];h[ch>>3]=bD}b8=c[aK>>2]|0;bD=+h[b8+(b7<<6)+24>>3];if(bD>-1.0){fa=b8;fb=bD}else{fN(49672,cd,ch,73152);b8=c[aK>>2]|0;fa=b8;fb=+h[b8+(b7<<6)+24>>3]}if(fb==-2.0){fc=49712}else{fc=fa+(b7<<6)+32|0}h[cr>>3]=+h[fc>>3];do{if(!(f9(bv,(c[co>>2]|0)+(b7<<3)|0)|ca)){c[cT>>2]=c[bm>>2];c[cT+4>>2]=c[bm+4>>2];c[cT+8>>2]=c[bm+8>>2];c[cT+12>>2]=c[bm+12>>2];b8=c[cu>>2]|0;do{if((c[cb>>2]|0)!=0){bD=+h[cc>>3];b9=c[(c[3524]|0)+92>>2]|0;if(bD<0.0){cK[b9&63](+h[3817]);break}else{cK[b9&63](bD);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[aP>>3]);cg=c[(c[3524]|0)+64>>2]|0;if((b8|0)<-5){cM[cg&511](-2)}else{cM[cg&511](b8)}cg=c[3524]|0;if((a[cx]&1)==0){if((c[cg+96>>2]&1024|0)!=0){break}c[bA>>2]=1;c[cE>>2]=b8}fn(t,cg)}}while(0);fP(2,aI,e8,0);if(!e9){break}hG(bj);fP(2,aI,0,0)}}while(0);b7=b7+1|0;}while((b7|0)<(c[cn>>2]|0))}uu(e7);break}else{break}}}while(0);do{if(((a[36228]&1)==0|bK)&c7){if((c[bv+16>>2]|0)==0){fd=c8;break}if((a[bv+22|0]&1)!=0){fd=c8;break}ap=c[aO>>2]|0;if((ap|0)==51){do{if((c[bv+36>>2]|0)<0){cl=c[a3>>2]|0;if((cl|0)!=0){cM[cl&511](56688)}cK[c[a2>>2]&63](+h[3817]*+h[3818]);cR[c[a_>>2]&127]((c[9016]|0)+(c[aS>>2]|0)|0,c[aT>>2]|0,6);c[aY>>2]=c[bm>>2];c[aY+4>>2]=c[bm+4>>2];c[aY+8>>2]=c[bm+8>>2];c[aY+12>>2]=c[bm+12>>2];cl=c[cu>>2]|0;do{if((c[aq>>2]|0)!=0){cF=+h[bv+48>>3];cp=c[(c[3524]|0)+92>>2]|0;if(cF<0.0){cK[cp&63](+h[3817]);break}else{cK[cp&63](cF);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[aP>>3]);cp=c[(c[3524]|0)+64>>2]|0;if((cl|0)<-5){cM[cp&511](-2)}else{cM[cp&511](cl)}cp=c[3524]|0;if((a[cx]&1)==0){if((c[cp+96>>2]&1024|0)!=0){break}c[aZ>>2]=1;c[aX>>2]=cl}fn(s,cp)}}while(0);fe=c[aO>>2]|0}else{fe=ap}do{if((fe|0)==64){cp=(c[9016]|0)+(c[aS>>2]|0)|0;cn=c[aT>>2]|0;b7=c[3524]|0;if((c[b7+96>>2]&128|0)==0){if((cp|0)<=0){break}if(!((c[b7+8>>2]|0)>>>0>cp>>>0&(cn|0)>0)){break}if((c[b7+12>>2]|0)>>>0<=cn>>>0){break}}cR[c[a_>>2]&127](cp,cn,-1)}else if((fe|0)!=474){if((fe&2|0)==0){break}if(+h[bv+48>>3]==-3.0){cK[c[a2>>2]&63](+h[3817])}cM[c[a0>>2]&511](8);cn=(c[9016]|0)+(c[aS>>2]|0)|0;cp=c[aT>>2]|0;b7=c[3524]|0;do{if((c[b7+96>>2]&128|0)==0){if((cn|0)<=0){break}if(!((c[b7+8>>2]|0)>>>0>cn>>>0&(cp|0)>0)){break}if((c[b7+12>>2]|0)>>>0>cp>>>0){bt=10287}}else{bt=10287}}while(0);if((bt|0)==10287){bt=0;cR[c[a_>>2]&127](cn,cp,c[bv+32>>2]|0)}cM[c[a0>>2]&511](9)}}while(0);if((a[36230]&1)!=0){c[aT>>2]=(((c[54]|0)+(c[9336]|0)|0)+((c[9020]|0)/2&-1)|0)-(c[aT>>2]|0)}if((c8|0)<(c[9012]|0)){c[aT>>2]=(c[aT>>2]|0)-(c[9020]|0);fd=c8;break}else{c[aT>>2]=c[54];c[aS>>2]=(c[aS>>2]|0)+(c[9026]|0);fd=0;break}}else{fd=c8}}while(0);cM[c[(c[3524]|0)+168>>2]&511](7);cx=bl+1|0;aP=a[35184]|0;if((cx|0)<(d|0)){bH=c[aO>>2]|0;bq=fd;bv=c[bv>>2]|0;bl=cx;bJ=aP}else{ff=fd;fg=aP;break}}}else{ff=bB;fg=bk}if((fg&1)==0){bt=10298;break}if((a[36228]&1)==0|bK){bt=10298;break}fW(1,aS,aT);bB=ff;bK=1}if((bt|0)==9914){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=142288,v)|0)}else if((bt|0)==10221){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=148064,v)|0)}else if((bt|0)==10298){if((c[10026]|0)==1){fT()}do{if((a[30528]&1)!=0){if((a[27776]&1)==0){break}uD(r|0,31816,272);bK=c[200]|0;fb=+(c[64768+(bK*688&-1)>>2]|0);eK=+h[64664+(bK*688&-1)>>3];eL=+h[64776+(bK*688&-1)>>3];bK=~~(fb+(0.0-eK)*eL+.5);ff=c[144]|0;bB=~~(+(c[64768+(ff*688&-1)>>2]|0)+(0.0- +h[64664+(ff*688&-1)>>3])*+h[64776+(ff*688&-1)>>3]+.5);eS=(c[17366]&2|0)==0?+h[8688]:+h[8686];if((a[69604]&1)==0){fh=+h[8687];fi=eS}else{eR=+_(+eS);eS=+h[8702];fh=+_(+(+h[8687]))/eS;fi=eR/eS}ff=~~(fb+eL*(fi-fh-eK)+.5);aT=q;c[aT>>2]=c[14084];c[aT+4>>2]=c[56340>>2];c[aT+8>>2]=c[56344>>2];c[aT+12>>2]=c[56348>>2];aT=c[14075]|0;do{if((c[14074]|0)!=0){eK=+h[7040];aS=c[(c[3524]|0)+92>>2]|0;if(eK<0.0){cK[aS&63](+h[3817]);break}else{cK[aS&63](eK);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[7039]);bk=c[(c[3524]|0)+64>>2]|0;if((aT|0)<-5){cM[bk&511](-2)}else{cM[bk&511](aT)}bk=c[3524]|0;do{if((a[56328]&1)==0){if((c[bk+96>>2]&1024|0)!=0){fj=bk;break}c[q>>2]=1;c[q+4>>2]=aT;bt=10315}else{bt=10315}}while(0);if((bt|0)==10315){fn(q,bk);fj=c[3524]|0}c[m>>2]=bK;c[n>>2]=bB;c[o>>2]=ff;c[p>>2]=bB;if((fl(m,n,o,p)|0)!=0){cN[c[fj+56>>2]&255](c[m>>2]|0,c[n>>2]|0);cN[c[fj+60>>2]&255](c[o>>2]|0,c[p>>2]|0)}if(!((c[17366]&1|0)==0&+h[8687]!=0.0)){break}fO(r,1,2)}}while(0);if((c[10026]|0)==1){c[200]=2;c[144]=1;dg(2,1);dg(1,2);c[200]=6;c[144]=5;dg(6,5);dg(5,6)}if((c[11692]|0)!=0&(c[14088]|0)==1){fU()}do{if(a[31104]&(a[54016]|0)!=110){if(!((c[(c[3524]|0)+144>>2]|0)!=0&(c[13506]|0)==1)){break}dD(1)}}while(0);fO(c[10818]|0,1,2);r=c[10822]|0;p=c[(c[3524]|0)+92>>2]|0;if((p|0)!=0){cK[p&63](+h[3817])}if((r|0)!=0){p=r;do{if((c[p+56>>2]|0)==1){fR(p+8|0,k,l,202256);fp(~~+h[k>>3],~~+h[l>>3],p)}p=c[p>>2]|0;}while((p|0)!=0)}p=c[9682]|0;if((p|0)!=0){l=p;do{p=l+116|0;k=c[p>>2]|0;do{if((k|0)!=0){if((a[k]|0)==0){break}fN(38880,f,j,149952);r=c[200]|0;o=~~(+(c[64768+(r*688&-1)>>2]|0)+ +h[64776+(r*688&-1)>>3]*((+h[l+16>>3]+ +h[l+24>>3])*.5- +h[64664+(r*688&-1)>>3])+.5)+~~+h[f>>3]|0;r=c[3524]|0;fj=~~(+((c[190]|0)>>>0>>>0)+(+(~~+h[j>>3]|0)+ +((c[r+16>>2]|0)>>>0>>>0)*.25));n=l+128|0;fn(n,r);ln(o,fj,c[p>>2]|0,1,2,0,c[l+120>>2]|0);if((c[n>>2]|0)==0){break}cM[c[(c[3524]|0)+64>>2]&511](-2)}}while(0);l=c[l+48>>2]|0;}while((l|0)!=0)}fV(1);if(!(a[31104]|0)){lh();i=e;return}l=c[(c[3524]|0)+140>>2]|0;if((l|0)==0){lh();i=e;return}cS[l&511]();lh();i=e;return}}function fT(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0.0,o=0,p=0,q=0.0,r=0.0,s=0.0;b=i;i=i+64|0;d=b|0;e=b+8|0;f=b+16|0;g=b+24|0;j=b+32|0;k=b+48|0;l=c[3524]|0;m=k;c[m>>2]=c[14084];c[m+4>>2]=c[56340>>2];c[m+8>>2]=c[56344>>2];c[m+12>>2]=c[56348>>2];m=c[14075]|0;do{if((c[14074]|0)!=0){n=+h[7040];o=c[l+92>>2]|0;if(n<0.0){cK[o&63](+h[3817]);break}else{cK[o&63](n);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[7039]);o=c[(c[3524]|0)+64>>2]|0;if((m|0)<-5){cM[o&511](-2)}else{cM[o&511](m)}o=c[3524]|0;do{if((a[56328]&1)==0){if((c[o+96>>2]&1024|0)!=0){break}c[k>>2]=1;c[k+4>>2]=m;p=10357}else{p=10357}}while(0);if((p|0)==10357){fn(k,o)}h[4483]=0.0;c[200]=2;c[144]=1;df(1,144,2,4);df(2,704,1,2);c[200]=6;c[144]=5;df(5,584,6,4);df(6,816,5,2);c[200]=2;c[144]=1;if(!((a[30528]&1)==0|(c[17433]|0)==0)){o=~~(+(c[16364]|0)+(0.0- +h[8169])*+h[8183]+.5);c[1394]=o;c[1396]=o;c[1392]=o-(c[l+16>>2]|0);o=c[17462]|0;c[6586]=o;do{if((o|0)==0){c[1398]=1}else{if((cO[c[l+72>>2]&255](o)|0)==0){break}c[1398]=(c[6586]|0)==-270?2:0}}while(0);if((a[70088]&1)!=0){c[1398]=c[17486]}de(7,2);o=c[l+72>>2]|0;cO[o&255](0)}if(+h[3815]==0.0){i=b;return}o=c[200]|0;l=~~(+(c[64768+(o*688&-1)>>2]|0)+(0.0- +h[64664+(o*688&-1)>>3])*+h[64776+(o*688&-1)>>3]+.5);o=c[144]|0;k=~~(+(c[64768+(o*688&-1)>>2]|0)+(0.0- +h[64664+(o*688&-1)>>3])*+h[64776+(o*688&-1)>>3]+.5);o=j;c[o>>2]=c[10022];c[o+4>>2]=c[40092>>2];c[o+8>>2]=c[40096>>2];c[o+12>>2]=c[40100>>2];o=c[10013]|0;do{if((c[10012]|0)!=0){n=+h[5009];m=c[(c[3524]|0)+92>>2]|0;if(n<0.0){cK[m&63](+h[3817]);break}else{cK[m&63](n);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[5008]);m=c[(c[3524]|0)+64>>2]|0;if((o|0)<-5){cM[m&511](-2)}else{cM[m&511](o)}m=c[3524]|0;do{if((a[40080]&1)==0){if((c[m+96>>2]&1024|0)!=0){break}c[j>>2]=1;c[j+4>>2]=o;p=10377}else{p=10377}}while(0);if((p|0)==10377){fn(j,m)}n=0.0;while(1){m=c[200]|0;q=+(c[64768+(m*688&-1)>>2]|0);r=+h[4483];s=r*+S(+n);j=~~(q+(s- +h[64664+(m*688&-1)>>3])*+h[64776+(m*688&-1)>>3]+.5);m=c[144]|0;s=+(c[64768+(m*688&-1)>>2]|0);q=r*+T(+n);p=~~(s+(q- +h[64664+(m*688&-1)>>3])*+h[64776+(m*688&-1)>>3]+.5);c[d>>2]=l;c[e>>2]=k;c[f>>2]=j;c[g>>2]=p;p=c[3524]|0;if((fl(d,e,f,g)|0)!=0){cN[c[p+56>>2]&255](c[d>>2]|0,c[e>>2]|0);cN[c[p+60>>2]&255](c[f>>2]|0,c[g>>2]|0)}if(n>=6.29){break}n=n+ +h[3815]}i=b;return}function fU(){var b=0,d=0,e=0,f=0.0,g=0,j=0,k=0.0,l=0.0;b=i;i=i+16|0;d=b|0;e=d;c[e>>2]=c[14084];c[e+4>>2]=c[56340>>2];c[e+8>>2]=c[56344>>2];c[e+12>>2]=c[56348>>2];e=c[14075]|0;do{if((c[14074]|0)!=0){f=+h[7040];g=c[(c[3524]|0)+92>>2]|0;if(f<0.0){cK[g&63](+h[3817]);break}else{cK[g&63](f);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[7039]);g=c[(c[3524]|0)+64>>2]|0;if((e|0)<-5){cM[g&511](-2)}else{cM[g&511](e)}g=c[3524]|0;do{if((a[56328]&1)==0){if((c[g+96>>2]&1024|0)!=0){break}c[d>>2]=1;c[d+4>>2]=e;j=10396}else{j=10396}}while(0);if((j|0)==10396){fn(d,g)}do{if((c[11692]&15|0)==15){g=c[(c[3524]|0)+172>>2]|0;if((g|0)==0){break}cM[g&511](0)}}while(0);cN[c[(c[3524]|0)+56>>2]&255](c[7938]|0,c[7941]|0);do{if((c[11692]&2|0)==0){cN[c[(c[3524]|0)+56>>2]&255](c[7938]|0,c[7940]|0)}else{if((a[65712]&1)==0){cN[c[(c[3524]|0)+60>>2]&255](c[7938]|0,c[7940]|0);break}else{f=+(c[16364]|0);k=+h[8169];l=+h[8183];g=~~(f+l*(+h[8175]-k)+.5);cN[c[(c[3524]|0)+56>>2]&255](c[7938]|0,~~(f+(+h[8176]-k)*l+.5));cN[c[(c[3524]|0)+60>>2]&255](c[7938]|0,g);cN[c[(c[3524]|0)+56>>2]&255](c[7938]|0,c[7940]|0);break}}}while(0);do{if((c[11692]&1|0)==0){cN[c[(c[3524]|0)+56>>2]&255](c[7939]|0,c[7940]|0)}else{if((a[66400]&1)==0){cN[c[(c[3524]|0)+60>>2]&255](c[7939]|0,c[7940]|0);break}else{l=+(c[16536]|0);k=+h[8255];f=+h[8269];g=~~(l+(+h[8262]-k)*f+.5);cN[c[(c[3524]|0)+56>>2]&255](~~(l+f*(+h[8261]-k)+.5),c[7940]|0);cN[c[(c[3524]|0)+60>>2]&255](g,c[7940]|0);cN[c[(c[3524]|0)+56>>2]&255](c[7939]|0,c[7940]|0);break}}}while(0);do{if((c[11692]&8|0)==0){cN[c[(c[3524]|0)+56>>2]&255](c[7939]|0,c[7941]|0)}else{if((a[68464]&1)==0){cN[c[(c[3524]|0)+60>>2]&255](c[7939]|0,c[7941]|0);break}else{k=+(c[17052]|0);f=+h[8513];l=+h[8527];g=~~(k+l*(+h[8519]-f)+.5);cN[c[(c[3524]|0)+56>>2]&255](c[7939]|0,~~(k+(+h[8520]-f)*l+.5));cN[c[(c[3524]|0)+60>>2]&255](c[7939]|0,g);cN[c[(c[3524]|0)+56>>2]&255](c[7939]|0,c[7940]|0);break}}}while(0);do{if((c[11692]&4|0)==0){cN[c[(c[3524]|0)+56>>2]&255](c[7938]|0,c[7941]|0)}else{if((a[69152]&1)==0){cN[c[(c[3524]|0)+60>>2]&255](c[7938]|0,c[7941]|0);break}else{l=+(c[17224]|0);f=+h[8599];k=+h[8613];g=~~(l+(+h[8606]-f)*k+.5);cN[c[(c[3524]|0)+56>>2]&255](~~(l+k*(+h[8605]-f)+.5),c[7941]|0);cN[c[(c[3524]|0)+60>>2]&255](g,c[7941]|0);cN[c[(c[3524]|0)+56>>2]&255](c[7939]|0,c[7941]|0);break}}}while(0);if((c[11692]&15|0)!=15){i=b;return}g=c[(c[3524]|0)+172>>2]|0;if((g|0)==0){i=b;return}cM[g&511](1);i=b;return}function fV(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0.0,B=0.0,C=0,D=0,E=0.0,F=0.0,G=0,H=0,I=0,J=0;d=i;i=i+120|0;e=d|0;f=d+16|0;g=d+24|0;j=d+32|0;k=d+72|0;l=d+88|0;m=d+96|0;n=d+104|0;o=d+112|0;p=c[13542]|0;c[13542]=(c[(c[3524]|0)+96>>2]&128|0)==0?55520:0;q=c[10826]|0;if((q|0)!=0){r=k;s=k|0;t=k+4|0;u=j;v=j+4|0;w=j+8|0;x=j+16|0;y=j|0;z=q;do{if((c[z+100>>2]|0)==(b|0)){fR(z+8|0,l,m,123984);A=+h[l>>3];q=~~A;B=+h[m>>3];C=~~B;D=z+48|0;if((a[z+88|0]&1)==0){fR(D,n,o,123984);E=+h[o>>3];F=+h[n>>3]}else{fN(D,n,o,123984);E=B+ +h[o>>3];F=A+ +h[n>>3]}D=~~F;G=~~E;H=z+144|0;c[r>>2]=c[H>>2];c[r+4>>2]=c[H+4>>2];c[r+8>>2]=c[H+8>>2];c[r+12>>2]=c[H+12>>2];H=c[z+108>>2]|0;do{if((c[z+104>>2]|0)!=0){A=+h[z+128>>3];I=c[(c[3524]|0)+92>>2]|0;if(A<0.0){cK[I&63](+h[3817]);break}else{cK[I&63](A);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[z+120>>3]);I=c[(c[3524]|0)+64>>2]|0;if((H|0)<-5){cM[I&511](-2)}else{cM[I&511](H)}I=c[3524]|0;do{if((a[z+136|0]&1)==0){if((c[I+96>>2]&1024|0)!=0){break}c[s>>2]=1;c[t>>2]=H;J=10443}else{J=10443}}while(0);if((J|0)==10443){J=0;fn(k,I)}c[12912]=c[z+200>>2];c[12910]=0;A=+h[z+168>>3];if(A>0.0){uE(u|0,0,40);c[v>>2]=2;c[w>>2]=2;h[x>>3]=A;c[y>>2]=c[z+176>>2];fN(j,f,g,123984);h[6458]=+h[z+184>>3];h[6457]=+h[z+192>>3];c[12910]=~~+h[f>>3]}fm(q,C,D,G,c[z+160>>2]|0)}z=c[z>>2]|0;}while((z|0)!=0)}z=e;c[z>>2]=c[14084];c[z+4>>2]=c[56340>>2];c[z+8>>2]=c[56344>>2];c[z+12>>2]=c[56348>>2];z=c[14075]|0;do{if((c[14074]|0)!=0){E=+h[7040];f=c[(c[3524]|0)+92>>2]|0;if(E<0.0){cK[f&63](+h[3817]);break}else{cK[f&63](E);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[7039]);f=c[(c[3524]|0)+64>>2]|0;if((z|0)<-5){cM[f&511](-2)}else{cM[f&511](z)}f=c[3524]|0;do{if((a[56328]&1)==0){if((c[f+96>>2]&1024|0)==0){c[e>>2]=1;c[e+4>>2]=z;break}else{c[13542]=p;i=d;return}}}while(0);fn(e,f);c[13542]=p;i=d;return}function fW(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0.0,K=0.0,L=0,M=0,N=0,O=0,P=0.0,Q=0,R=0,S=0.0,T=0,U=0;f=i;i=i+176|0;g=f|0;j=f+8|0;k=f+16|0;l=f+24|0;m=f+32|0;n=f+40|0;o=f+48|0;p=f+56|0;q=f+64|0;r=f+72|0;s=f+80|0;t=f+88|0;u=f+96|0;v=f+104|0;w=f+112|0;x=f+120|0;y=f+128|0;z=f+136|0;A=f+144|0;B=f+152|0;C=f+160|0;D=c[3524]|0;E=(c[8996]|0)+(c[9334]|0)|0;F=c[9337]|0;do{if(b){G=D+108|0;if((c[G>>2]|0)==0){break}H=c[9336]|0;if((a[36288]|0)==0){I=H}else{do{if((c[D+96>>2]&32|0)==0){J=0.0}else{K=(a8(36288,94)|0)==0?0.0:.51;if((a8(36288,95)|0)==0){J=K;break}J=K+.3}}while(0);I=~~(+(H|0)-J*+((c[D+16>>2]|0)>>>0>>>0))}cM[c[D+144>>2]&511](56688);L=c[9334]|0;cI[c[G>>2]&63](1601,L,I,(c[9335]|0)-L|0,(c[9337]|0)-I|0)}}while(0);if((a[36288]|0)==0){M=F;N=c[D+16>>2]|0}else{I=((c[9335]|0)+(c[9334]|0)|0)/2&-1;L=D+96|0;O=c[L>>2]|0;if((O&32|0)==0){P=0.0}else{P=(a8(36288,94)|0)==0?0.0:.51}if(b){Q=10476}else{if((a[36228]&1)==0){Q=10476}else{R=O}}if((Q|0)==10476){if((c[9330]|0)==3&+h[4666]<0.0){fn(36272,D)}else{fn(37320,D)}ln(I,~~(+(F|0)-(P*.5+.5)*+((c[D+16>>2]|0)>>>0>>>0)),36288,1,0,0,c[9329]|0);cM[c[D+64>>2]&511](-2);R=c[L>>2]|0}do{if((R&32|0)==0){S=P}else{if((a8(36288,95)|0)==0){S=P;break}S=P+.3}}while(0);P=S+ +h[4488];h[4488]=P;R=D+16|0;c[9336]=~~(+(c[9336]|0)-S*+((c[R>>2]|0)>>>0>>>0));L=c[R>>2]|0;M=~~(+(F|0)- +(L>>>0>>>0)*P);N=L}L=D+16|0;D=(M-~~(+h[4527]*.5*+(N>>>0>>>0))|0)+((c[9020]|0)/-2&-1)|0;c[54]=D;N=c[9059]|0;if((N|0)<=-3){c[d>>2]=E;c[e>>2]=D;i=f;return}M=c[13542]|0;F=c[3524]|0;c[13542]=(c[F+96>>2]&128|0)==0?55520:0;R=C;c[R>>2]=c[9068];c[R+4>>2]=c[36276>>2];c[R+8>>2]=c[36280>>2];c[R+12>>2]=c[36284>>2];do{if((c[9058]|0)!=0){P=+h[4532];R=c[F+92>>2]|0;if(P<0.0){cK[R&63](+h[3817]);break}else{cK[R&63](P);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[4531]);F=c[(c[3524]|0)+64>>2]|0;if((N|0)<-5){cM[F&511](-2)}else{cM[F&511](N)}F=c[3524]|0;do{if((a[36264]&1)==0){if((c[F+96>>2]&1024|0)!=0){T=F;break}c[C>>2]=1;c[C+4>>2]=N;Q=10495}else{Q=10495}}while(0);if((Q|0)==10495){fn(C,F);T=c[3524]|0}F=c[T+172>>2]|0;if((F|0)==0){U=T}else{cM[F&511](0);U=c[3524]|0}F=c[9334]|0;T=c[9336]|0;C=c[9337]|0;c[y>>2]=F;c[z>>2]=T;c[A>>2]=F;c[B>>2]=C;if((fl(y,z,A,B)|0)!=0){cN[c[U+56>>2]&255](c[y>>2]|0,c[z>>2]|0);cN[c[U+60>>2]&255](c[A>>2]|0,c[B>>2]|0)}B=c[9337]|0;A=c[9335]|0;c[u>>2]=c[9334];c[v>>2]=B;c[w>>2]=A;c[x>>2]=B;B=c[3524]|0;if((fl(u,v,w,x)|0)!=0){cN[c[B+56>>2]&255](c[u>>2]|0,c[v>>2]|0);cN[c[B+60>>2]&255](c[w>>2]|0,c[x>>2]|0)}x=c[9335]|0;w=c[9337]|0;B=c[9336]|0;c[q>>2]=x;c[r>>2]=w;c[s>>2]=x;c[t>>2]=B;B=c[3524]|0;if((fl(q,r,s,t)|0)!=0){cN[c[B+56>>2]&255](c[q>>2]|0,c[r>>2]|0);cN[c[B+60>>2]&255](c[s>>2]|0,c[t>>2]|0)}t=c[9336]|0;s=c[9334]|0;c[m>>2]=c[9335];c[n>>2]=t;c[o>>2]=s;c[p>>2]=t;t=c[3524]|0;if((fl(m,n,o,p)|0)!=0){cN[c[t+56>>2]&255](c[m>>2]|0,c[n>>2]|0);cN[c[t+60>>2]&255](c[o>>2]|0,c[p>>2]|0)}p=c[(c[3524]|0)+172>>2]|0;if((p|0)!=0){cM[p&511](1)}do{if((a[36288]|0)!=0){p=~~(+(c[9337]|0)- +h[4488]*+((c[L>>2]|0)>>>0>>>0));o=c[9335]|0;c[g>>2]=c[9334];c[j>>2]=p;c[k>>2]=o;c[l>>2]=p;p=c[3524]|0;if((fl(g,j,k,l)|0)==0){break}cN[c[p+56>>2]&255](c[g>>2]|0,c[j>>2]|0);cN[c[p+60>>2]&255](c[k>>2]|0,c[l>>2]|0)}}while(0);c[13542]=M;c[d>>2]=E;c[e>>2]=D;i=f;return}function fX(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;d=i;i=i+48|0;e=d|0;f=d+8|0;g=d+16|0;j=d+32|0;k=c[3524]|0;l=b+300|0;if((c[l>>2]|0)<=0){i=d;return}m=b+316|0;n=b+320|0;o=k+56|0;p=k+60|0;k=g|0;q=j|0;r=g+8|0;g=j+8|0;j=0;s=2;do{f9(b,(c[m>>2]|0)+(j<<3)|0);t=c[n>>2]|0;u=c[t+(j<<6)>>2]|0;do{if((u|0)==0){v=c[200]|0;w=~~(+(c[64768+(v*688&-1)>>2]|0)+(+h[t+(j<<6)+8>>3]- +h[64664+(v*688&-1)>>3])*+h[64776+(v*688&-1)>>3]+.5);v=c[144]|0;x=~~(+(c[64768+(v*688&-1)>>2]|0)+(+h[t+(j<<6)+16>>3]- +h[64664+(v*688&-1)>>3])*+h[64776+(v*688&-1)>>3]+.5);if((s|0)==0){cN[c[p>>2]&255](w,x);break}else if((s|0)==1){if((a[54160]&1)==0){cN[c[o>>2]&255](w,x);break}else{gb(t,j,e,f);v=c[200]|0;y=c[144]|0;cN[c[o>>2]&255](~~(+(c[64768+(v*688&-1)>>2]|0)+(+h[e>>3]- +h[64664+(v*688&-1)>>3])*+h[64776+(v*688&-1)>>3]+.5),~~(+(c[64768+(y*688&-1)>>2]|0)+(+h[f>>3]- +h[64664+(y*688&-1)>>3])*+h[64776+(y*688&-1)>>3]+.5));cN[c[p>>2]&255](w,x);break}}else{cN[c[o>>2]&255](w,x);cN[c[p>>2]&255](w,x);break}}else if((u|0)==1){if((s|0)==0){if((a[54160]&1)==0){break}gb(t,j,e,f);x=c[200]|0;w=c[144]|0;cN[c[p>>2]&255](~~(+(c[64768+(x*688&-1)>>2]|0)+(+h[e>>3]- +h[64664+(x*688&-1)>>3])*+h[64776+(x*688&-1)>>3]+.5),~~(+(c[64768+(w*688&-1)>>2]|0)+(+h[f>>3]- +h[64664+(w*688&-1)>>3])*+h[64776+(w*688&-1)>>3]+.5));break}else if((s|0)!=1){break}if((a[54152]&1)==0){break}if(!(gc(t,j,k,q)|0)){break}w=c[200]|0;x=c[144]|0;cN[c[o>>2]&255](~~(+(c[64768+(w*688&-1)>>2]|0)+(+h[k>>3]- +h[64664+(w*688&-1)>>3])*+h[64776+(w*688&-1)>>3]+.5),~~(+(c[64768+(x*688&-1)>>2]|0)+(+h[q>>3]- +h[64664+(x*688&-1)>>3])*+h[64776+(x*688&-1)>>3]+.5));x=c[200]|0;w=c[144]|0;cN[c[p>>2]&255](~~(+(c[64768+(x*688&-1)>>2]|0)+(+h[r>>3]- +h[64664+(x*688&-1)>>3])*+h[64776+(x*688&-1)>>3]+.5),~~(+(c[64768+(w*688&-1)>>2]|0)+(+h[g>>3]- +h[64664+(w*688&-1)>>3])*+h[64776+(w*688&-1)>>3]+.5))}}while(0);s=c[(c[n>>2]|0)+(j<<6)>>2]|0;j=j+1|0;}while((j|0)<(c[l>>2]|0));i=d;return}function fY(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0.0,an=0;j=i;i=i+280|0;k=j|0;l=j+8|0;m=j+16|0;n=j+24|0;o=j+32|0;p=j+40|0;q=j+48|0;r=j+56|0;s=j+64|0;t=j+72|0;u=j+80|0;w=j+88|0;x=j+96|0;y=j+104|0;z=j+112|0;A=j+152|0;B=j+160|0;C=j+168|0;D=j+176|0;E=j+184|0;F=j+192|0;G=j+200|0;H=j+208|0;I=j+216|0;J=j+224|0;K=j+232|0;L=j+240|0;M=j+248|0;N=j+256|0;O=j+264|0;P=j+272|0;Q=c[13542]|0;c[13542]=(c[(c[3524]|0)+96>>2]&128|0)==0?55520:0;R=e+168|0;cM[c[R>>2]&511](8);S=c[9330]|0;if((S|0)==0){cM[c[e+64>>2]&511](-2)}else if((S|0)!=7){fn(37320,e)}L14405:do{if((c[9046]|0)==0){ln((c[8988]|0)+f|0,g,d,0,0,0,c[9329]|0)}else{S=(cO[c[e+76>>2]&255](2)|0)==0;T=(c[8984]|0)+f|0;if(!S){ln(T,g,d,2,0,0,c[9329]|0);break}S=c[e+20>>2]|0;U=T-aa(lp(d)|0,S)|0;do{if(((c[9031]|0)-1|0)>>>0>=2){S=c[7938]|0;T=c[7939]|0;if((S|0)<(T|0)){if((U|0)<(S|0)|(U|0)>(T|0)){break L14405}else{break}}else{if((U|0)<(T|0)|(U|0)>(S|0)){break L14405}else{break}}}}while(0);ln(U,g,d,0,0,0,c[9329]|0)}}while(0);d=e+64|0;S=b+28|0;cM[c[d>>2]&511](c[S>>2]|0);T=b+56|0;if((a[T]&1)!=0){fn(b+64|0,e)}V=b+12|0;W=c[V>>2]|0;do{if((W&8|0)==0){X=10585}else{Y=c[e+108>>2]|0;if((Y|0)==0){X=10585;break}Z=b+192|0;_=Z|0;$=c[_>>2]|0;if(($|0)==1|($|0)==4){ab=(c[b+196>>2]<<4&65520)+$|0}else if(($|0)==2|($|0)==5){ab=(c[b+200>>2]<<4&65520)+$|0}else{ab=0}$=c[9008]|0;ac=$+f|0;ad=c[9020]|0;ae=(ad|0)/4&-1;af=g-ae|0;ag=c[9004]|0;ah=ag-$|0;ai=(ad|0)/2&-1;ad=(ag|0)==($|0);if(!((W|0)!=457|ad)){lq((c[9016]|0)+f|0,g,+(ae|0),0.0,360.0,ab);break}if(!((W|0)!=489|ad)){ae=ut(96)|0;do{if((ae|0)==0){gk();$=ut(96)|0;if(($|0)!=0){aj=$;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=151888,v)|0)}else{aj=ae}}while(0);h[aj+24>>3]=+((c[9016]|0)+f|0);h[aj+32>>3]=+(g|0);h[aj+64>>3]=+((ah<<1>>>0)/3>>>0>>>0>>>0);h[aj+72>>3]=+(ai>>>0>>>0);h[aj+88>>3]=0.0;fP(2,aj,ab,0);uu(aj);break}if(ad){break}ae=(ab|0)==0;if(ae){ak=W}else{cI[Y&63](ab,ac,af,ah,ai);ak=c[V>>2]|0}do{if((ak|0)==252){if((c[b+208>>2]|0)!=1){X=10566;break}if((c[b+212>>2]|0)==-3|ae){X=10568}else{X=10567}}else{X=10566}}while(0);if((X|0)==10566){if(ae){X=10568}else{X=10567}}if((X|0)==10567){if(hG(Z)|0){X=10568}}do{if((X|0)==10568){ai=c[3524]|0;ah=c[ai+172>>2]|0;if((ah|0)==0){al=ai}else{cM[ah&511](0);al=c[3524]|0}ah=g-((c[9020]|0)/4&-1)|0;ai=(c[9004]|0)+f|0;c[M>>2]=(c[9008]|0)+f;c[N>>2]=ah;c[O>>2]=ai;c[P>>2]=ah;if((fl(M,N,O,P)|0)!=0){cN[c[al+56>>2]&255](c[M>>2]|0,c[N>>2]|0);cN[c[al+60>>2]&255](c[O>>2]|0,c[P>>2]|0)}ah=(c[9004]|0)+f|0;ai=(c[9020]|0)/4&-1;c[I>>2]=ah;c[J>>2]=g-ai;c[K>>2]=ah;c[L>>2]=ai+g;ai=c[3524]|0;if((fl(I,J,K,L)|0)!=0){cN[c[ai+56>>2]&255](c[I>>2]|0,c[J>>2]|0);cN[c[ai+60>>2]&255](c[K>>2]|0,c[L>>2]|0)}ai=((c[9020]|0)/4&-1)+g|0;ah=(c[9008]|0)+f|0;c[E>>2]=(c[9004]|0)+f;c[F>>2]=ai;c[G>>2]=ah;c[H>>2]=ai;ai=c[3524]|0;if((fl(E,F,G,H)|0)!=0){cN[c[ai+56>>2]&255](c[E>>2]|0,c[F>>2]|0);cN[c[ai+60>>2]&255](c[G>>2]|0,c[H>>2]|0)}ai=(c[9008]|0)+f|0;ah=(c[9020]|0)/4&-1;c[A>>2]=ai;c[B>>2]=ah+g;c[C>>2]=ai;c[D>>2]=g-ah;ah=c[3524]|0;if((fl(A,B,C,D)|0)!=0){cN[c[ah+56>>2]&255](c[A>>2]|0,c[B>>2]|0);cN[c[ah+60>>2]&255](c[C>>2]|0,c[D>>2]|0)}ah=c[(c[3524]|0)+172>>2]|0;if((ah|0)==0){break}cM[ah&511](1)}}while(0);Z=c[_>>2]|0;if((Z|0)==0|(Z|0)==3){break}if((c[b+208>>2]|0)==1){if((c[b+212>>2]|0)==-3){break}}cM[c[d>>2]&511](c[S>>2]|0);if((a[T]&1)==0){break}fn(b+64|0,e)}}while(0);L14473:do{if((X|0)==10585){do{if((W|0)==225){if((c[e+84>>2]|0)==0){break}c[12912]=c[b+184>>2];c[12910]=0;am=+h[b+152>>3];if(am>0.0){uE(z|0,0,40);c[z+4>>2]=2;c[z+8>>2]=2;h[z+16>>3]=am;c[z>>2]=c[b+160>>2];fN(z,x,y,123984);h[6458]=+h[b+168>>3];h[6457]=+h[b+176>>3];c[12910]=~~+h[x>>3]}c[12910]=-1;fm((c[9008]|0)+f|0,g,(c[9004]|0)+f|0,g,c[b+144>>2]|0);break L14473}else{if((W&1|0)!=0){break}if((W&4|0)==0){break L14473}if((c[b+8>>2]|0)!=1){break L14473}}}while(0);_=(c[9004]|0)+f|0;c[s>>2]=(c[9008]|0)+f;c[t>>2]=g;c[u>>2]=_;c[w>>2]=g;_=c[3524]|0;if((fl(s,t,u,w)|0)==0){break}cN[c[_+56>>2]&255](c[s>>2]|0,c[t>>2]|0);cN[c[_+60>>2]&255](c[u>>2]|0,c[w>>2]|0)}}while(0);if((c[b+8>>2]|0)!=1){an=c[R>>2]|0;cM[an&511](9);c[13542]=Q;i=j;return}b=c[V>>2]|0;if((b&4|0)==0){an=c[R>>2]|0;cM[an&511](9);c[13542]=Q;i=j;return}if(!((b|0)!=252&+h[7077]>0.0)){an=c[R>>2]|0;cM[an&511](9);c[13542]=Q;i=j;return}b=(c[9008]|0)+f|0;V=e+28|0;e=c[V>>2]|0;w=e>>>0>3?e>>>1:1;c[o>>2]=b;c[p>>2]=w+g;c[q>>2]=b;c[r>>2]=g-w;w=c[3524]|0;if((fl(o,p,q,r)|0)!=0){cN[c[w+56>>2]&255](c[o>>2]|0,c[p>>2]|0);cN[c[w+60>>2]&255](c[q>>2]|0,c[r>>2]|0)}r=(c[9004]|0)+f|0;f=c[V>>2]|0;V=f>>>0>3?f>>>1:1;c[k>>2]=r;c[l>>2]=V+g;c[m>>2]=r;c[n>>2]=g-V;V=c[3524]|0;if((fl(k,l,m,n)|0)==0){an=c[R>>2]|0;cM[an&511](9);c[13542]=Q;i=j;return}cN[c[V+56>>2]&255](c[k>>2]|0,c[l>>2]|0);cN[c[V+60>>2]&255](c[m>>2]|0,c[n>>2]|0);an=c[R>>2]|0;cM[an&511](9);c[13542]=Q;i=j;return}function fZ(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0.0;d=i;i=i+16|0;e=d|0;f=c[b+36>>2]|0;g=c[3524]|0;j=b+300|0;k=c[j>>2]|0;if((k|0)<=0){i=d;return}l=b+12|0;m=(f|0)==0;n=b+320|0;o=(f|0)<0;p=g+144|0;q=g+92|0;r=g+80|0;g=e;s=b+64|0;t=b+28|0;u=b+24|0;v=b+40|0;w=b+56|0;x=e|0;y=e+4|0;z=b+48|0;A=b+316|0;B=b+32|0;C=0;D=k;while(1){k=c[l>>2]|0;if((k|0)!=51|m){E=10612}else{if(((C|0)%(f|0)&-1|0)==0){E=10612}else{F=D}}do{if((E|0)==10612){E=0;G=c[n>>2]|0;if((c[G+(C<<6)>>2]|0)!=0){F=D;break}H=c[200]|0;I=~~(+(c[64768+(H*688&-1)>>2]|0)+(+h[G+(C<<6)+8>>3]- +h[64664+(H*688&-1)>>3])*+h[64776+(H*688&-1)>>3]+.5);H=c[144]|0;J=~~(+(c[64768+(H*688&-1)>>2]|0)+(+h[G+(C<<6)+16>>3]- +h[64664+(H*688&-1)>>3])*+h[64776+(H*688&-1)>>3]+.5);if((a[54144]&1)!=0){H=c[8240]|0;if((I|0)<(H+(c[7938]|0)|0)){F=D;break}K=c[8242]|0;if((J|0)<(K+(c[7940]|0)|0)){F=D;break}if((I|0)>((c[7939]|0)-H|0)){F=D;break}if((J|0)>((c[7941]|0)-K|0)){F=D;break}}do{if((k|0)==18|(k|0)==51){if(+h[z>>3]==-3.0){cK[c[q>>2]&63](+h[3817]*+h[G+(C<<6)+24>>3]);L=c[l>>2]|0}else{L=k}if(!((L|0)==51&o)){break}K=c[p>>2]|0;if((K|0)!=0){cM[K&511](56688)}cK[c[q>>2]&63](+h[3817]*+h[3818]);cR[c[r>>2]&127](I,J,6);c[g>>2]=c[s>>2];c[g+4>>2]=c[s+4>>2];c[g+8>>2]=c[s+8>>2];c[g+12>>2]=c[s+12>>2];K=c[t>>2]|0;do{if((c[u>>2]|0)!=0){M=+h[z>>3];H=c[(c[3524]|0)+92>>2]|0;if(M<0.0){cK[H&63](+h[3817]);break}else{cK[H&63](M);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[v>>3]);H=c[(c[3524]|0)+64>>2]|0;if((K|0)<-5){cM[H&511](-2)}else{cM[H&511](K)}H=c[3524]|0;if((a[w]&1)==0){if((c[H+96>>2]&1024|0)!=0){break}c[x>>2]=1;c[y>>2]=K}fn(e,H)}}while(0);G=(c[A>>2]|0)+(C<<3)|0;f9(b,G);cR[c[r>>2]&127](I,J,c[B>>2]|0);F=c[j>>2]|0}}while(0);k=C+1|0;if((k|0)<(F|0)){C=k;D=F}else{break}}i=d;return}function f_(b){b=b|0;var d=0,e=0,f=0.0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0,u=0,v=0.0,w=0.0,x=0,y=0,z=0,A=0,B=0,C=0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0,P=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0.0,_=0,$=0,ab=0.0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0.0,an=0,ao=0,ap=0.0,aq=0,ar=0,as=0,at=0,au=0,av=0.0,aw=0,ax=0,ay=0,az=0.0,aA=0,aB=0,aC=0,aD=0,aE=0.0;d=c[3524]|0;e=c[d+28>>2]|0;if(e>>>0>3){f=+(e>>>1|0)}else{f=1.0}e=b+12|0;g=c[e>>2]|0;do{if((g|0)==102|(g|0)==118|(g|0)==169|(g|0)==295|(g|0)==311|(g|0)==392|(g|0)==345){i=b+300|0;if((c[i>>2]|0)<=0){j=g;break}k=b+320|0;l=b+276|0;m=b+280|0;n=b+316|0;o=d+108|0;p=b+192|0;q=d+56|0;r=d+60|0;s=0.0;t=0;while(1){u=c[k>>2]|0;L14555:do{if((c[u+(t<<6)>>2]|0)==2){v=s}else{w=+h[u+(t<<6)+8>>3];x=c[e>>2]|0;y=(x|0)==392;if(y){z=c[l>>2]|0;A=c[9671]|0;B=A+(c[z+8>>2]|0)|0;C=aa(B-1|0,t-1|0);D=+(B|0);E=(+h[u+(t<<6)+56>>3]- +h[u+(t<<6)+48>>3])/(D*2.0);F=(+((A|0)/2&-1|0)+(w+ +(C+(c[m>>2]|0)|0)))/D+(+h[z+16>>3]+.5)}else{E=s;F=w}z=c[200]|0;w=+h[64664+(z*688&-1)>>3];D=+h[64672+(z*688&-1)>>3];C=wD){v=E;break}}else{if(Fw){v=E;break}}G=+(c[64768+(z*688&-1)>>2]|0);H=+h[64776+(z*688&-1)>>3];z=~~(G+(F-w)*H+.5);I=+h[u+(t<<6)+16>>3];A=c[144]|0;J=+h[64664+(A*688&-1)>>3];K=+h[64672+(A*688&-1)>>3];B=JK){v=E;break}}else{if(IJ){v=E;break}}L=+(c[64768+(A*688&-1)>>2]|0);M=+h[64776+(A*688&-1)>>3];A=~~(L+(I-J)*M+.5);I=+h[u+(t<<6)+40>>3];N=+h[u+(t<<6)+32>>3];do{if(B){if(I>3];Z=+h[u+(t<<6)+48>>3];do{if(y){ac=~~(G+(F-E-w)*H+.5);ad=~~(G+(F+E-w)*H+.5)}else{do{if(C){if(I>2]|0)+(t<<3)|0;f9(b,B);if((c[e>>2]|0)!=169){ac=ao;ad=an;break}if((c[o>>2]|0)==0){ac=ao;ad=an;break}hG(p);ac=ao;ad=an}}while(0);if((a[30528]&1)==0){cN[c[q>>2]&255](z,_);cN[c[r>>2]&255](z,$);H=+h[7077];if(H<0.0){cN[c[q>>2]&255](ac,_);cN[c[r>>2]&255](ad,_);cN[c[q>>2]&255](ac,$);cN[c[r>>2]&255](ad,$);v=E;break}if(H<=0.0){v=E;break}G=+(z>>>0>>>0);cN[c[q>>2]&255](~~(G-f*H),_);cN[c[r>>2]&255](~~(G+f*+h[7077]),_);cN[c[q>>2]&255](~~(G-f*+h[7077]),$);cN[c[r>>2]&255](~~(G+f*+h[7077]),$);v=E;break}x=ad-ac|0;C=aa(x,x);x=$-_|0;G=+((C+aa(x,x)|0)>>>0>>>0);H=+h[3817];if(G<=f*H*f*H*4.5){v=E;break}x=c[q>>2]|0;if((ac|0)==(ad|0)){cN[x&255](z,_);H=+(A>>>0>>>0);cN[c[r>>2]&255](z,~~(H-f*+h[3817]));cN[c[q>>2]&255](z,~~(H+f*+h[3817]));cN[c[r>>2]&255](z,$)}else{cN[x&255](ac,_);cN[c[r>>2]&255](ad,$)}H=+h[7077];if(H<=0.0){v=E;break}G=+(ac>>>0>>>0);w=+(ad>>>0>>>0);D=+($>>>0>>>0);Z=+(_>>>0>>>0);I=(G-w)/(D-Z+1.0e-10);M=+Q(+(I*I+1.0));L=f*H/M;H=G+L;J=G-L;cN[c[q>>2]&255](~~H,~~(Z+I*(H-G)));cN[c[r>>2]&255](~~J,~~(Z+I*(J-G)));G=f*+h[7077]/M;M=w+G;J=w-G;cN[c[q>>2]&255](~~M,~~(D+I*(M-w)));cN[c[r>>2]&255](~~J,~~(D+I*(J-w)));v=E}}while(0);u=t+1|0;if((u|0)<(c[i>>2]|0)){s=v;t=u}else{break}}j=c[e>>2]|0}else{j=g}}while(0);if(!((j|0)==86|(j|0)==118|(j|0)==279|(j|0)==311)){return}j=b+300|0;if((c[j>>2]|0)<=0){return}g=b+320|0;e=b+316|0;_=d+56|0;$=d+60|0;d=0;do{ad=c[g>>2]|0;do{if((c[ad+(d<<6)>>2]|0)!=2){v=+h[ad+(d<<6)+16>>3];ac=c[144]|0;E=+h[64664+(ac*688&-1)>>3];ap=+h[64672+(ac*688&-1)>>3];if(Eap){break}}else{if(vE){break}}an=~~(+(c[64768+(ac*688&-1)>>2]|0)+(v-E)*+h[64776+(ac*688&-1)>>3]+.5);E=+h[ad+(d<<6)+56>>3];v=+h[ad+(d<<6)+48>>3];ac=c[200]|0;ap=+h[64664+(ac*688&-1)>>3];F=+h[64672+(ac*688&-1)>>3];do{if(ap>2]|0;ab=+h[64776+(ac*688&-1)>>3];ak=~~(+(ao|0)+(E-ap)*ab+.5);if(as){av=ab;aw=ao;ax=ak;R=10732}else{ay=0;az=ab;aA=ao;aB=ak;R=10733}}else if((R|0)==10729){R=0;ab=F-ap;ak=c[64768+(ac*688&-1)>>2]|0;s=+(ak|0);if((E-F)*ab<0.0){w=+h[64776+(ac*688&-1)>>3];ao=~~(s+(ap-ap)*w+.5);if(at){av=w;aw=ak;ax=ao;R=10732;break}else{ay=1;az=w;aA=ak;aB=ao;R=10733;break}}else{w=+h[64776+(ac*688&-1)>>3];ao=~~(s+ab*w+.5);if(at){av=w;aw=ak;ax=ao;R=10732;break}else{ay=1;az=w;aA=ak;aB=ao;R=10733;break}}}}while(0);if((R|0)==10732){R=0;aC=~~(+(aw|0)+(v-ap)*av+.5);aD=ax}else if((R|0)==10733){R=0;E=F-ap;if((v-F)*E<0.0){aE=ap-ap}else{aE=E}ac=~~(+(aA|0)+aE*az+.5);if((ac|0)==(aB|0)&ay){break}else{aC=ac;aD=aB}}ac=(c[e>>2]|0)+(d<<3)|0;f9(b,ac);cN[c[_>>2]&255](aC,an);cN[c[$>>2]&255](aD,an);E=+h[7077];if(E<=0.0){break}w=+(an>>>0>>>0);cN[c[_>>2]&255](aC,~~(w-f*E));cN[c[$>>2]&255](aC,~~(w+f*+h[7077]));cN[c[_>>2]&255](aD,~~(w-f*+h[7077]));cN[c[$>>2]&255](aD,~~(w+f*+h[7077]))}}while(0);d=d+1|0;}while((d|0)<(c[j>>2]|0));return}function f$(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0.0,V=0,W=0,X=0,Y=0.0,Z=0.0,_=0,$=0.0,ab=0.0,ac=0.0,ad=0.0,ae=0,af=0.0,ag=0.0,ah=0.0,ai=0,aj=0.0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0.0,ar=0.0,as=0.0,at=0.0,au=0.0,av=0.0,aw=0.0,ax=0.0,ay=0,az=0,aA=0,aB=0,aC=0,aD=0,aE=0,aF=0,aG=0,aH=0,aI=0,aJ=0,aK=0.0,aL=0.0,aM=0.0,aN=0.0,aO=0.0,aP=0.0,aQ=0.0,aR=0.0,aS=0.0,aT=0,aU=0.0,aV=0,aW=0,aX=0;e=i;i=i+112|0;f=e|0;g=e+56|0;j=c[3524]|0;k=b+12|0;l=b+300|0;do{if((c[k>>2]|0)==392){m=c[l>>2]|0;n=c[9670]|0;do{if((n|0)==1){if((c[b+280>>2]|0)!=0){break}c[3572]=0}else if((n|0)==2){c[3572]=0}}while(0);n=c[3568]|0;if((n|0)!=0){if((c[3572]|0)>=(m|0)){break}o=db(n,m<<6,91376)|0;c[3568]=o;n=c[3572]|0;if((n|0)<(m|0)){p=n;while(1){n=p+1|0;uE(o+(p<<6)+32|0,0,16);if((n|0)<(m|0)){p=n}else{break}}}c[3572]=m;break}p=m<<6;o=ut(p)|0;do{if((o|0)==0){gk();n=ut(p)|0;if((n|0)!=0){q=n;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=91376,v)|0)}else{q=o}}while(0);o=q;c[3568]=o;if((m|0)>0){p=0;while(1){n=p+1|0;uE(o+(p<<6)+32|0,0,16);if((n|0)<(m|0)){p=n}else{break}}}c[3572]=m}}while(0);q=c[l>>2]|0;if((q|0)<=0){i=e;return}p=b+320|0;o=b+276|0;n=g|0;r=g+4|0;s=g+40|0;t=g+44|0;u=g+8|0;w=g+40|0;x=g;y=g+32|0;g=b+200|0;z=f|0;A=f+4|0;B=f+40|0;C=f+44|0;D=f+8|0;E=f;F=f+32|0;G=f+40|0;f=b+280|0;H=b+192|0;I=H|0;J=j+56|0;K=j+60|0;L=j+108|0;M=b+208|0;N=j+64|0;O=b+28|0;P=b+56|0;Q=b+64|0;R=b+196|0;S=b+316|0;T=2;U=0.0;V=0;W=d;d=c[p>>2]|0;X=q;while(1){L14718:do{if((c[d+(V<<6)>>2]|0)>>>0<2){if(+h[d+(V<<6)+24>>3]<0.0){q=(T|0)==2;Y=+h[7030];do{if(q){if(Y<=0.0){Z=0.0;break}if((a[56232]&1)==0){Z=0.0;break}Z=Y*-.5}else{if(Y<0.0){Z=(+h[d+(V-1<<6)+8>>3]- +h[d+(V<<6)+8>>3])*.5;break}if((a[56232]&1)==0){Z=Y*(+h[d+(V-1<<6)+8>>3]- +h[d+(V<<6)+8>>3])*.5;break}else{Z=Y*-.5;break}}}while(0);do{if((V|0)<(X-1|0)){_=V+1|0;if((c[d+(_<<6)>>2]|0)==2){$=-0.0-Z;break}if(Y<0.0){$=(+h[d+(_<<6)+8>>3]- +h[d+(V<<6)+8>>3])*.5;break}if((a[56232]&1)==0){$=Y*(+h[d+(_<<6)+8>>3]- +h[d+(V<<6)+8>>3])*.5;break}else{$=Y*.5;break}}else{$=-0.0-Z}}while(0);if(q){ab=-0.0-$}else{ab=Z}Y=+h[d+(V<<6)+8>>3];ac=ab+Y;ad=$+Y}else{ac=+h[d+(V<<6)+48>>3];ad=+h[d+(V<<6)+56>>3]}_=c[k>>2]|0;if((_|0)==137){Y=+h[d+(V<<6)+32>>3];ae=c[144]|0;af=+h[64664+(ae*688&-1)>>3];ag=+h[64672+(ae*688&-1)>>3];do{if(afag){ah=ag;break}if(Y>=af){ah=Y;break}ah=af}else{if(Y>af){ah=af;break}if(Y>=ag){ah=Y;break}ah=ag}}while(0);ai=~~(+(c[64768+(ae*688&-1)>>2]|0)+(ah-af)*+h[64776+(ae*688&-1)>>3]+.5);aj=ah;ak=d+(V<<6)+40|0}else{ai=W;aj=U;ak=d+(V<<6)+16|0}ag=+h[ak>>3];do{if((_|0)==392){q=c[o>>2]|0;al=c[q+32>>2]|0;am=((al|0)>0?al:0)+V|0;al=c[9670]|0;if((al|0)==3|(al|0)==4){an=c[9671]|0;ao=an+(c[q+8>>2]|0)|0;ap=aa(ao-1|0,~~+h[d+(V<<6)+8>>3]-1|0);Y=+(ap+(c[f>>2]|0)|0);aq=+((an|0)/2&-1|0);ar=+(ao|0);as=+h[q+16>>3]+.5;at=(aq+(ac+Y))/ar+as;au=aj;av=(aq+(ad+Y))/ar+as;aw=ag;break}else if((al|0)==2){as=+h[q+16>>3];ar=+h[7030]*.5;Y=+(c[f>>2]|0);aq=as-ar+Y;ax=as+ar+Y;if((a[30080]&1)==0){ao=c[n>>2]|0;an=c[8798]|0;ap=(an|0)>0;ay=am;L14771:while(1){az=43264;while(1){aA=c[az>>2]|0;if((aA|0)==0){break}if((c[aA+4>>2]|0)==(ay|0)){aB=10821;break L14771}else{az=aA|0}}aC=ay-1|0;if(!((ay|0)>(an|0)&ap)){aB=10827;break}ay=((aC|0)%(an|0)&-1)+1|0}do{if((aB|0)==10821){aB=0;an=aA+8|0;c[x>>2]=c[an>>2];c[x+4>>2]=c[an+4>>2];c[x+8>>2]=c[an+8>>2];c[x+12>>2]=c[an+12>>2];c[x+16>>2]=c[an+16>>2];c[x+20>>2]=c[an+20>>2];c[x+24>>2]=c[an+24>>2];c[x+28>>2]=c[an+28>>2];c[x+32>>2]=c[an+32>>2];c[x+36>>2]=c[an+36>>2];c[x+40>>2]=c[an+40>>2];c[x+44>>2]=c[an+44>>2];c[x+48>>2]=c[an+48>>2];c[x+52>>2]=c[an+52>>2];c[n>>2]=ao;an=c[3524]|0;if((c[an+96>>2]&1024|0)!=0){c[r>>2]=ay;a[y]=0;aD=an;break}if((a[y]&1)!=0){aD=an;break}c[s>>2]=1;c[t>>2]=c[r>>2];aD=an}else if((aB|0)==10827){aB=0;c[r>>2]=aC;c[s>>2]=1;c[t>>2]=aC;c[u>>2]=aC;aD=c[3524]|0}}while(0);fn(w,aD)}else{ay=am+1|0;ao=c[z>>2]|0;an=43280;while(1){aE=c[an>>2]|0;if((aE|0)==0){aB=10805;break}if((c[aE+4>>2]|0)==(ay|0)){aB=10803;break}else{an=aE|0}}do{if((aB|0)==10803){aB=0;an=aE+8|0;c[E>>2]=c[an>>2];c[E+4>>2]=c[an+4>>2];c[E+8>>2]=c[an+8>>2];c[E+12>>2]=c[an+12>>2];c[E+16>>2]=c[an+16>>2];c[E+20>>2]=c[an+20>>2];c[E+24>>2]=c[an+24>>2];c[E+28>>2]=c[an+28>>2];c[E+32>>2]=c[an+32>>2];c[E+36>>2]=c[an+36>>2];c[E+40>>2]=c[an+40>>2];c[E+44>>2]=c[an+44>>2];c[E+48>>2]=c[an+48>>2];c[E+52>>2]=c[an+52>>2];c[z>>2]=ao;if((a[F]&1)!=0){break}c[B>>2]=1;c[C>>2]=c[A>>2]}else if((aB|0)==10805){aB=0;an=c[8798]|0;ap=(an|0)>0;az=ay;L14794:while(1){aF=43264;while(1){aG=c[aF>>2]|0;if((aG|0)==0){break}if((c[aG+4>>2]|0)==(az|0)){break L14794}else{aF=aG|0}}aH=az-1|0;if(!((az|0)>(an|0)&ap)){aB=10815;break}az=((aH|0)%(an|0)&-1)+1|0}if((aB|0)==10815){aB=0;c[A>>2]=aH;c[B>>2]=1;c[C>>2]=aH;c[D>>2]=aH;break}an=aG+8|0;c[E>>2]=c[an>>2];c[E+4>>2]=c[an+4>>2];c[E+8>>2]=c[an+8>>2];c[E+12>>2]=c[an+12>>2];c[E+16>>2]=c[an+16>>2];c[E+20>>2]=c[an+20>>2];c[E+24>>2]=c[an+24>>2];c[E+28>>2]=c[an+28>>2];c[E+32>>2]=c[an+32>>2];c[E+36>>2]=c[an+36>>2];c[E+40>>2]=c[an+40>>2];c[E+44>>2]=c[an+44>>2];c[E+48>>2]=c[an+48>>2];c[E+52>>2]=c[an+52>>2];c[z>>2]=ao;if((c[(c[3524]|0)+96>>2]&1024|0)!=0){c[A>>2]=az;a[F]=0;break}if((a[F]&1)!=0){break}c[B>>2]=1;c[C>>2]=c[A>>2]}}while(0);fn(G,c[3524]|0)}c[g>>2]=am;aI=0;aJ=c[p>>2]|0;aK=ax;aL=aq}else if((al|0)==1){Y=+h[q+16>>3];aI=V;aJ=d;aK=ad+Y;aL=ac+Y}else{at=ac;au=aj;av=ad;aw=ag;break}Y=+h[aJ+(V<<6)+16>>3];ao=c[3568]|0;if(Y<0.0){ay=ao+(aI<<6)+32|0;ar=+h[ay>>3];h[ay>>3]=Y+ar;aM=ar}else{ay=ao+(aI<<6)+40|0;ar=+h[ay>>3];h[ay>>3]=Y+ar;aM=ar}ar=ag+aM;ay=c[144]|0;Y=+h[64664+(ay*688&-1)>>3];as=+h[64672+(ay*688&-1)>>3];ay=YY){aB=10835}else{aN=aM}}if((aB|0)==10835){aB=0;aN=Y}if(!(ay&aN>as)){if(!(as>3];af=+h[64672+(_*688&-1)>>3];do{if(agaf){aO=af;break}if(aw>=ag){aO=aw;break}aO=ag}else{if(aw>ag){aO=ag;break}if(aw>=af){aO=aw;break}aO=af}}while(0);ae=c[200]|0;ar=+h[64664+(ae*688&-1)>>3];as=+h[64672+(ae*688&-1)>>3];do{if(aras){aP=as}else{if(av>=ar){aP=av;break}aP=ar}}while(0);if(at>as){aQ=as;aR=aP;break}if(at>=ar){aQ=at;aR=aP;break}aQ=ar;aR=aP}else{do{if(av>ar){aS=ar}else{if(av>=as){aS=av;break}aS=as}}while(0);if(at>ar){aQ=ar;aR=aS;break}if(at>=as){aQ=at;aR=aS;break}aQ=as;aR=aS}}while(0);if(aR==aQ){if(aR==ar|aR==as){aT=ai;aU=au;break}}aq=+(c[64768+(ae*688&-1)>>2]|0);ax=+h[64776+(ae*688&-1)>>3];q=~~(aq+(aQ-ar)*ax+.5);al=~~(aq+(aR-ar)*ax+.5);ax=+(c[64768+(_*688&-1)>>2]|0);aq=+h[64776+(_*688&-1)>>3];am=~~(ax+(aO-ag)*aq+.5);if((ai|0)==(am|0)){if(aO==ag|aO==af){aT=ai;aU=au;break}}ay=c[k>>2]|0;do{if((ay|0)==153|(ay|0)==137|(ay|0)==169){ao=(c[S>>2]|0)+(V<<3)|0;f9(b,ao);aV=ai}else if((ay|0)==392){if(((c[9670]|0)-1|0)>>>0>=2){aV=ai;break}aV=~~(ax+(au-ag)*aq+.5)}else{aV=ai}}while(0);ay=c[I>>2]|0;do{if((ay|0)!=0){_=c[L>>2]|0;if((_|0)==0){break}ae=al-q|0;ao=am-aV|0;an=(ae|0)<0;ap=an?al:q;aF=(an?q-al|0:ae)+1|0;ae=(ao|0)<0;an=ae?am:aV;aW=(ae?aV-am|0:ao)+1|0;if((ay|0)==1|(ay|0)==4){aX=(c[R>>2]<<4&65520)+ay|0}else if((ay|0)==2|(ay|0)==5){aX=(c[g>>2]<<4&65520)+ay|0}else{aX=0}cI[_&63](aX,ap,an,aF,aW);if(!(hG(H)|0)){aT=ai;aU=au;break L14718}}}while(0);ay=c[(c[3524]|0)+172>>2]|0;if((ay|0)!=0){cM[ay&511](0)}cN[c[J>>2]&255](q,aV);cN[c[K>>2]&255](q,am);cN[c[K>>2]&255](al,am);cN[c[K>>2]&255](al,aV);cN[c[K>>2]&255](q,aV);ay=c[(c[3524]|0)+172>>2]|0;if((ay|0)!=0){cM[ay&511](1)}if((c[L>>2]|0)==0){aT=ai;aU=au;break}if((c[M>>2]|0)==0){aT=ai;aU=au;break}cM[c[N>>2]&511](c[O>>2]|0);if((a[P]&1)==0){aT=ai;aU=au;break}fn(Q,j);aT=ai;aU=au}else{aT=W;aU=U}}while(0);m=c[p>>2]|0;ay=V+1|0;aW=c[l>>2]|0;if((ay|0)<(aW|0)){T=c[m+(V<<6)>>2]|0;U=aU;V=ay;W=aT;d=m;X=aW}else{break}}i=e;return}function f0(b){b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0;if((c[(c[3524]|0)+148>>2]|0)==0){f_(b);return}d=b+300|0;if(((c[d>>2]|0)-1|0)<=0){return}e=b+320|0;f=0;while(1){g=c[e>>2]|0;i=f+1|0;do{if((c[g+(f<<6)>>2]|0)!=2){if((c[g+(i<<6)>>2]|0)==2){break}j=+h[g+(f<<6)+8>>3];k=+h[g+(f<<6)+56>>3];l=+h[g+(f<<6)+16>>3];m=+h[g+(f<<6)+40>>3];n=+h[g+(i<<6)+8>>3];o=+h[g+(i<<6)+56>>3];p=+h[g+(i<<6)+16>>3];q=+h[g+(i<<6)+40>>3];if((a[30528]&1)==0){r=m-l;if(r*(q-p)<0.0){s=p-q;t=(n*r+j*s)/(r+s);s=m+(q-m)*(t-j)/(n-j);gh(j,k,l,m,t,t,s,s,b);gh(t,t,s,s,n,o,p,q,b);break}else{gh(j,k,l,m,n,o,p,q,b);break}}else{s=(p-l)/(n-j);t=(q-m)/(o-k);r=l-j*s;u=(m-k*t-r)/(s-t);t=r+s*u;if((j-u)*(u-n)>0.0){gh(j,k,l,m,u,u,t,t,b);gh(u,u,t,t,n,o,p,q,b);break}else{gh(j,k,l,m,n,o,p,q,b);break}}}}while(0);if((i|0)<((c[d>>2]|0)-1|0)){f=i}else{break}}return}function f1(a){a=a|0;var b=0,d=0,e=0,f=0.0,g=0,i=0,j=0,k=0,l=0,m=0.0,n=0,o=0.0,p=0.0,q=0,r=0.0,s=0.0,t=0.0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0.0,C=0,D=0.0,E=0,F=0,G=0,H=0.0,I=0,J=0,K=0.0,L=0.0,M=0.0,N=0,O=0;b=c[3524]|0;d=c[b+28>>2]|0;e=d>>>0<8;if(e){f=e?1.0:0.0}else{f=+(d>>>2|0)}d=a+300|0;if((c[d>>2]|0)<=0){return}e=a+320|0;g=a+316|0;i=b+56|0;j=b+60|0;b=a+12|0;k=0;do{l=c[e>>2]|0;do{if((c[l+(k<<6)>>2]|0)!=2){m=+h[l+(k<<6)+8>>3];n=c[200]|0;o=+h[64664+(n*688&-1)>>3];p=+h[64672+(n*688&-1)>>3];if(op){break}}else{if(mo){break}}q=~~(+(c[64768+(n*688&-1)>>2]|0)+(m-o)*+h[64776+(n*688&-1)>>3]+.5);o=+h[l+(k<<6)+40>>3];m=+h[l+(k<<6)+32>>3];p=+h[l+(k<<6)+24>>3];r=+h[l+(k<<6)+16>>3];n=c[144]|0;s=+h[64664+(n*688&-1)>>3];t=+h[64672+(n*688&-1)>>3];do{if(s>2]|0;B=+h[64776+(n*688&-1)>>3];C=~~(+(x|0)+(o-s)*B+.5);if(y){D=B;E=x;F=C;w=10925}else{G=0;H=B;I=x;J=C;w=10926}}else if((w|0)==10922){w=0;B=t-s;C=c[64768+(n*688&-1)>>2]|0;K=+(C|0);if((o-t)*B<0.0){L=+h[64776+(n*688&-1)>>3];x=~~(K+(s-s)*L+.5);if(z){D=L;E=C;F=x;w=10925;break}else{G=1;H=L;I=C;J=x;w=10926;break}}else{L=+h[64776+(n*688&-1)>>3];x=~~(K+B*L+.5);if(z){D=L;E=C;F=x;w=10925;break}else{G=1;H=L;I=C;J=x;w=10926;break}}}}while(0);if((w|0)==10926){w=0;o=t-s;if((m-t)*o<0.0){M=s-s}else{M=o}n=~~(+(I|0)+M*H+.5);if((n|0)==(J|0)&G){break}else{N=n;O=J}}else if((w|0)==10925){w=0;N=~~(+(E|0)+(m-s)*D+.5);O=F}n=(c[g>>2]|0)+(k<<3)|0;f9(a,n);cN[c[i>>2]&255](q,N);cN[c[j>>2]&255](q,O);o=+(q>>>0>>>0);n=c[144]|0;cN[c[i>>2]&255](~~(o-f*+h[7077]),~~(+(c[64768+(n*688&-1)>>2]|0)+(r- +h[64664+(n*688&-1)>>3])*+h[64776+(n*688&-1)>>3]+.5));n=c[144]|0;cN[c[j>>2]&255](q,~~(+(c[64768+(n*688&-1)>>2]|0)+(r- +h[64664+(n*688&-1)>>3])*+h[64776+(n*688&-1)>>3]+.5));n=c[144]|0;cN[c[i>>2]&255](~~(o+f*+h[7077]),~~(+(c[64768+(n*688&-1)>>2]|0)+(p- +h[64664+(n*688&-1)>>3])*+h[64776+(n*688&-1)>>3]+.5));n=c[144]|0;cN[c[j>>2]&255](q,~~(+(c[64768+(n*688&-1)>>2]|0)+(p- +h[64664+(n*688&-1)>>3])*+h[64776+(n*688&-1)>>3]+.5));if((c[b>>2]|0)!=474){break}n=c[144]|0;x=~~(+(c[64768+(n*688&-1)>>2]|0)+(+h[(c[e>>2]|0)+(k<<6)+56>>3]- +h[64664+(n*688&-1)>>3])*+h[64776+(n*688&-1)>>3]+.5);cN[c[i>>2]&255](~~(o-f*+h[7077]),x);cN[c[j>>2]&255](~~(o+f*+h[7077]),x)}}while(0);k=k+1|0;}while((k|0)<(c[d>>2]|0));return}function f2(b){b=b|0;var d=0,e=0,f=0,g=0.0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0.0,I=0.0,J=0.0,K=0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0,S=0.0,T=0.0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0.0,ab=0,ac=0,ad=0.0,ae=0,af=0,ag=0,ah=0.0,ai=0,aj=0,ak=0.0,al=0.0,am=0.0,an=0,ao=0,ap=0,aq=0.0,ar=0,as=0,at=0.0,au=0.0,av=0.0,aw=0.0,ax=0.0,ay=0.0,az=0.0,aA=0.0,aB=0.0,aC=0.0,aD=0.0,aE=0.0,aF=0.0,aG=0.0,aH=0,aI=0,aJ=0,aK=0,aL=0.0,aM=0.0,aN=0,aO=0,aP=0.0,aQ=0,aR=0,aS=0.0,aT=0,aU=0,aV=0,aW=0;d=c[3524]|0;e=c[d+28>>2]|0;f=e>>>0<8;if(f){g=f?1.0:0.0}else{g=+(e>>>2|0)}e=b+300|0;f=c[e>>2]|0;if((f|0)<=0){return}i=b+320|0;j=b+192|0;k=b+208|0;l=d+64|0;m=b+28|0;n=b+56|0;o=b+64|0;p=b+316|0;q=d+56|0;r=d+60|0;s=b+12|0;t=b+144|0;u=b+152|0;v=j|0;w=d+108|0;x=b+196|0;y=b+200|0;z=b+212|0;A=2;B=0;C=c[i>>2]|0;D=f;while(1){do{if((c[C+(B<<6)>>2]|0)==2){E=A;F=C;G=D}else{H=+h[C+(B<<6)+8>>3];f=c[200]|0;I=+h[64664+(f*688&-1)>>3];J=+h[64672+(f*688&-1)>>3];K=IJ){E=A;F=C;G=D;break}}else{if(HI){E=A;F=C;G=D;break}}L=+(c[64768+(f*688&-1)>>2]|0);M=+h[64776+(f*688&-1)>>3];f=~~(L+(H-I)*M+.5);N=+h[C+(B<<6)+40>>3];O=+h[C+(B<<6)+32>>3];P=+h[C+(B<<6)+24>>3];Q=+h[C+(B<<6)+16>>3];R=N>3];N=+h[64672+(R*688&-1)>>3];U=O>2]|0;aa=+h[64776+(R*688&-1)>>3];ab=~~(+(Y|0)+(S-O)*aa+.5);if(Z){ac=1;ad=aa;ae=Y;af=ab;X=10957}else{ag=1;ah=aa;ai=Y;aj=ab;X=10958}}else if((X|0)==10954){X=0;aa=N-O;ab=c[64768+(R*688&-1)>>2]|0;ak=+(ab|0);if((S-N)*aa<0.0){al=+h[64776+(R*688&-1)>>3];Y=~~(ak+(O-O)*al+.5);if(_){ac=0;ad=al;ae=ab;af=Y;X=10957;break}else{ag=0;ah=al;ai=ab;aj=Y;X=10958;break}}else{al=+h[64776+(R*688&-1)>>3];Y=~~(ak+aa*al+.5);if(_){ac=0;ad=al;ae=ab;af=Y;X=10957;break}else{ag=0;ah=al;ai=ab;aj=Y;X=10958;break}}}}while(0);if((X|0)==10958){X=0;S=N-O;if((T-N)*S<0.0){am=O-O}else{am=S}R=~~(+(ai|0)+am*ah+.5);if((R|0)==(aj|0)&(ag^1)){E=A;F=C;G=D;break}else{an=R;ao=0;ap=ag;aq=ah;ar=ai;as=aj}}else if((X|0)==10957){X=0;an=~~(+(ae|0)+(T-O)*ad+.5);ao=1;ap=ac;aq=ad;ar=ae;as=af}S=+h[C+(B<<6)+48>>3];do{if(S!=H){al=H*2.0-S;do{if(K){do{if(al>J){at=J}else{if(al>=I){at=al;break}at=I}}while(0);if(S>J){au=J;av=at;break}if(S>=I){au=S;av=at;break}au=I;av=at}else{do{if(al>I){aw=I}else{if(al>=J){aw=al;break}aw=J}}while(0);if(S>I){au=I;av=aw;break}if(S>=J){au=S;av=aw;break}au=J;av=aw}}while(0);ax=L+(au-I)*M+.5;ay=L+(av-I)*M+.5}else{if((c[s>>2]|0)==474){al=+h[7030];if((a[56232]&1)!=0&al>0.0){az=al*.5}else{az=.25}ax=L+(H-az-I)*M+.5;ay=L+(H+az-I)*M+.5;break}al=+h[7030];if(al<0.0){aa=+(f|0);ak=g*+h[7077];ax=aa-ak;ay=aa+ak;break}ak=al*-.5;R=(A|0)==2;do{if(R){aA=ak}else{if((a[56232]&1)!=0){aA=ak;break}aA=al*(+h[C+(B-1<<6)+8>>3]-H)*.5}}while(0);ak=-0.0-aA;do{if((B|0)<(D-1|0)){Y=B+1|0;if((c[C+(Y<<6)>>2]|0)==2){aB=ak;break}if((a[56232]&1)==0){aB=(+h[C+(Y<<6)+8>>3]-H)*al*.5;break}else{aB=al*.5;break}}else{aB=ak}}while(0);if(R){aC=-0.0-aB}else{aC=aA}ak=H+aC;al=H+aB;do{if(K){do{if(al>J){aD=J}else{if(al>=I){aD=al;break}aD=I}}while(0);if(ak>J){aE=J;aF=aD;break}if(ak>=I){aE=ak;aF=aD;break}aE=I;aF=aD}else{do{if(al>I){aG=I}else{if(al>=J){aG=al;break}aG=J}}while(0);if(ak>I){aE=I;aF=aG;break}if(ak>=J){aE=ak;aF=aG;break}aE=J;aF=aG}}while(0);ax=L+(aE-I)*M+.5;ay=L+(aF-I)*M+.5}}while(0);K=~~ax;R=~~ay;do{if((R-K&1|0)==0){aH=R;aI=f}else{Y=R+1|0;ab=(((f-K|0)>(Y-f|0))<<31>>31)+f|0;if((ab-K|0)>=(Y-ab|0)){aH=Y;aI=ab;break}aH=Y;aI=ab+1|0}}while(0);do{if(U){if(QN){aL=N}else{if(Q>=O){aL=Q;break}aL=O}}while(0);if(P>N){aM=N;aN=aK;aO=aJ;aP=aL;break}if(P>=O){aM=P;aN=aK;aO=aJ;aP=aL;break}aM=O;aN=aK;aO=aJ;aP=aL}else{if(QO){aS=O}else{if(Q>=N){aS=Q;break}aS=N}}while(0);if(P>O){aM=O;aN=aR;aO=aQ;aP=aS;break}if(P>=N){aM=P;aN=aR;aO=aQ;aP=aS;break}aM=N;aN=aR;aO=aQ;aP=aS}}while(0);N=+(ar|0);U=~~(N+(aP-O)*aq+.5);f=~~(N+(aM-O)*aq+.5);R=(U|0)<(f|0);ab=R?U:f;Y=R?f:U;U=(ab|0)==(Y|0)&((aO|aN)^1);f=c[k>>2]|0;if((f|0)==1){if((c[z>>2]|0)!=-3){X=11032}}else if((f|0)!=0){X=11032}do{if((X|0)==11032){X=0;cM[c[l>>2]&511](c[m>>2]|0);if((a[n]&1)==0){break}fn(o,d)}}while(0);f=(c[p>>2]|0)+(B<<3)|0;f9(b,f);do{if(!((c[(c[3524]|0)+108>>2]|0)==0|U)){f=c[v>>2]|0;if((f|0)==2|(f|0)==5){aT=(c[y>>2]<<4&65520)+f|0}else if((f|0)==1|(f|0)==4){aT=(c[x>>2]<<4&65520)+f|0}else{aT=0}if(!((aT|0)!=0|aP>aM)){break}if((aT|0)==0){aU=(c[s>>2]|0)==474?0:1601}else{aU=aT}cI[c[w>>2]&63](aU,K,ab,aH-K|0,Y-ab|0);f=c[v>>2]|0;if((f|0)==2|(f|0)==5){aV=y}else if((f|0)==1|(f|0)==4){aV=x}else{break}if((c[aV>>2]<<4&65520|0)==(-f|0)){break}hG(j)}}while(0);cN[c[q>>2]&255](aI,an);cN[c[r>>2]&255](aI,ab);cN[c[q>>2]&255](aI,Y);cN[c[r>>2]&255](aI,as);do{if(!U){f=c[(c[3524]|0)+172>>2]|0;if((f|0)!=0){cM[f&511](0)}f=c[144]|0;cN[c[q>>2]&255](K,~~(+(c[64768+(f*688&-1)>>2]|0)+(aP- +h[64664+(f*688&-1)>>3])*+h[64776+(f*688&-1)>>3]+.5));f=c[144]|0;cN[c[r>>2]&255](aH,~~(+(c[64768+(f*688&-1)>>2]|0)+(aP- +h[64664+(f*688&-1)>>3])*+h[64776+(f*688&-1)>>3]+.5));f=c[144]|0;cN[c[r>>2]&255](aH,~~(+(c[64768+(f*688&-1)>>2]|0)+(aM- +h[64664+(f*688&-1)>>3])*+h[64776+(f*688&-1)>>3]+.5));f=c[144]|0;cN[c[r>>2]&255](K,~~(+(c[64768+(f*688&-1)>>2]|0)+(aM- +h[64664+(f*688&-1)>>3])*+h[64776+(f*688&-1)>>3]+.5));f=c[144]|0;cN[c[r>>2]&255](K,~~(+(c[64768+(f*688&-1)>>2]|0)+(aP- +h[64664+(f*688&-1)>>3])*+h[64776+(f*688&-1)>>3]+.5));f=c[(c[3524]|0)+172>>2]|0;if((f|0)==0){break}cM[f&511](1)}}while(0);do{if((c[s>>2]|0)==474){O=+h[7077];if(O<0.0){aW=0;X=11056;break}aW=~~(+(aH-K|0)*.5-O*+((c[(c[3524]|0)+28>>2]|0)>>>0>>>0));X=11056}else{if((c[t>>2]|0)!=3){break}O=+h[u>>3];if(O<=0.0){aW=0;X=11056;break}aW=~~(+(aH-K|0)*(1.0-O)*.5);X=11056}}while(0);do{if((X|0)==11056){X=0;if(ap){cN[c[q>>2]&255](aW+K|0,as);cN[c[r>>2]&255](aH-aW|0,as)}if(!ao){break}cN[c[q>>2]&255](aW+K|0,an);cN[c[r>>2]&255](aH-aW|0,an)}}while(0);if((c[s>>2]|0)==474){U=c[144]|0;f=~~(+(c[64768+(U*688&-1)>>2]|0)+(+h[(c[i>>2]|0)+(B<<6)+56>>3]- +h[64664+(U*688&-1)>>3])*+h[64776+(U*688&-1)>>3]+.5);cN[c[q>>2]&255](K,f);cN[c[r>>2]&255](aH,f)}do{if(aP>aM){if((c[(c[3524]|0)+108>>2]|0)!=0){break}cN[c[q>>2]&255](aI,ab);cN[c[r>>2]&255](aI,Y);f=(aI+K|0)/2&-1;cN[c[q>>2]&255](f,ab);cN[c[r>>2]&255](f,Y);f=(aH+aI|0)/2&-1;cN[c[q>>2]&255](f,ab);cN[c[r>>2]&255](f,Y)}}while(0);Y=c[i>>2]|0;E=c[Y+(B<<6)>>2]|0;F=Y;G=c[e>>2]|0}}while(0);Y=B+1|0;if((Y|0)<(G|0)){A=E;B=Y;C=F;D=G}else{break}}return}function f3(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0,$=0,ab=0.0,ac=0.0,ad=0.0,ae=0.0,af=0.0,ag=0.0,ah=0,ai=0.0,aj=0,ak=0.0,al=0,am=0,an=0.0,ao=0.0,ap=0,aq=0.0,ar=0.0,as=0.0,at=0.0,au=0,av=0,aw=0.0,ax=0.0,ay=0,az=0.0,aA=0.0,aB=0.0,aC=0,aD=0.0,aE=0.0,aF=0.0,aG=0.0,aH=0.0,aI=0.0,aJ=0.0,aK=0.0,aL=0.0,aM=0.0,aN=0.0,aO=0,aP=0,aQ=0.0,aR=0,aS=0,aT=0,aU=0,aV=0,aW=0,aX=0,aY=0,aZ=0,a_=0,a$=0,a0=0,a1=0,a2=0,a3=0,a4=0.0,a5=0.0,a6=0.0,a7=0.0,a8=0,a9=0,ba=0,bb=0,bc=0,bd=0,be=0,bf=0,bg=0,bh=0,bi=0,bj=0,bk=0,bl=0,bm=0,bn=0,bo=0,bp=0.0,bq=0.0,br=0.0,bs=0.0,bt=0,bu=0,bv=0,bw=0,bx=0,by=0,bz=0.0,bA=0.0,bB=0.0,bC=0.0,bD=0.0,bE=0.0,bF=0.0,bG=0.0,bH=0.0,bI=0.0,bJ=0.0,bK=0.0,bL=0.0,bM=0.0,bN=0.0,bO=0.0,bP=0.0,bQ=0.0,bR=0.0,bS=0.0,bT=0.0,bU=0.0,bV=0.0,bW=0.0,bX=0.0,bY=0.0,bZ=0.0,b_=0,b$=0,b0=0,b1=0.0,b2=0.0,b3=0,b4=0,b5=0.0,b6=0.0,b7=0,b8=0.0,b9=0,ca=0.0,cb=0;e=i;i=i+256|0;f=e|0;g=e+16|0;j=e+32|0;k=e+48|0;l=e+96|0;m=e+192|0;uE(j|0,-1|0,16);n=((c[b+8>>2]|0)-2|0)>>>0<2;if(n){o=c[b+260>>2]|0;p=o+12|0;q=o+8|0}else{p=b+320|0;q=b+300|0}o=c[p>>2]|0;p=c[q>>2]|0;q=c[b+228>>2]|0;if((p|0)<1){uh(-1,207376,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);i=e;return}if((p|0)<4){uh(-1,203152,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);i=e;return}r=c[200]|0;s=a[64788+(r*688&-1)|0]|0;t=(s&1)==0;L15142:do{if(n){do{if(t){u=c[144]|0;if((a[64788+(u*688&-1)|0]&1)!=0){break}if((a[64788+((c[34]|0)*688&-1)|0]&1)!=0){break}w=+h[64664+(r*688&-1)>>3];x=+h[91];y=+h[96];z=(+h[o+8>>3]-w)*x+y+-1.0;A=+h[64664+(u*688&-1)>>3];B=+h[21];C=+h[68];D=(+h[o+16>>3]-A)*B+C+-1.0;E=+h[5279];F=+h[2];G=+h[12];H=(+h[o+24>>3]-E)*F+G+-1.0;I=+h[403];J=+h[391];K=+h[395];L=+h[399];M=+h[404];N=+h[392];O=+h[396];Q=+h[400];R=+h[406];S=+h[394];T=+h[398];U=+h[402];V=R+z*S+D*T+H*U;W=V==0.0?1.0e-5:V;V=+(c[180]|0);u=c[186]|0;X=+(c[40]|0);Y=c[46]|0;$=p-1|0;ab=y+x*(+h[o+($<<6)+8>>3]-w)+-1.0;w=C+B*(+h[o+($<<6)+16>>3]-A)+-1.0;A=G+F*(+h[o+($<<6)+24>>3]-E)+-1.0;E=R+S*ab+T*w+U*A;U=E==0.0?1.0e-5:E;ac=+(~~(V*((I+J*ab+K*w+L*A)/U))+u|0);ad=+(~~(X*((M+N*ab+O*w+Q*A)/U))+Y|0);ae=+(~~((I+z*J+D*K+H*L)/W*V)+u|0);af=+(~~((M+z*N+D*O+H*Q)/W*X)+Y|0);break L15142}}while(0);uh(-1,198096,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);i=e;return}else{do{if(t){if((a[64788+((c[144]|0)*688&-1)|0]&1)!=0){break}Y=p-1|0;ac=+h[o+(Y<<6)+8>>3];ad=+h[o+(Y<<6)+16>>3];ae=+h[o+8>>3];af=+h[o+16>>3];break L15142}}while(0);Y=c[b+304>>2]|0;u=(a[64788+(Y*688&-1)|0]&1)==0;X=+h[o+8>>3];if(u){ag=X}else{ag=+Z(+(X*+h[64800+(Y*688&-1)>>3]))}$=c[b+308>>2]|0;ah=(a[64788+($*688&-1)|0]&1)==0;X=+h[o+16>>3];if(ah){ai=X}else{ai=+Z(+(X*+h[64800+($*688&-1)>>3]))}aj=p-1|0;X=+h[o+(aj<<6)+8>>3];if(u){ak=X}else{ak=+Z(+(X*+h[64800+(Y*688&-1)>>3]))}X=+h[o+(aj<<6)+16>>3];if(ah){ac=ak;ad=X;ae=ag;af=ai;break}ac=ak;ad=+Z(+(X*+h[64800+($*688&-1)>>3]));ae=ag;af=ai}}while(0);ai=af-ad;ag=ac-ae;L15166:do{if((p|0)>1){t=64664+(r*688&-1)|0;ak=+h[91];X=+h[96];$=c[144]|0;ah=64664+($*688&-1)|0;W=+h[21];Q=+h[68];H=+h[5279];O=+h[2];D=+h[12];N=+h[403];z=+h[391];M=+h[395];V=+h[399];L=+h[404];K=+h[392];J=+h[396];I=+h[400];U=+h[406];A=+h[394];w=+h[398];ab=+h[402];E=+(c[180]|0);aj=c[186]|0;T=+(c[40]|0);Y=c[46]|0;u=64788+($*688&-1)|0;$=b+304|0;al=b+308|0;S=ag;R=ai;F=-0.0-(ae*ai+af*ag);am=1;L15168:while(1){L15170:do{if(n){G=(+h[o+(am<<6)+8>>3]- +h[t>>3])*ak+X+-1.0;B=(+h[o+(am<<6)+16>>3]- +h[ah>>3])*W+Q+-1.0;C=(+h[o+(am<<6)+24>>3]-H)*O+D+-1.0;x=U+G*A+B*w+C*ab;y=x==0.0?1.0e-5:x;an=+(~~((N+G*z+B*M+C*V)/y*E)+aj|0);ao=+(~~((L+G*K+B*J+C*I)/y*T)+Y|0)}else{do{if((s&1)==0){if((a[u]&1)!=0){break}an=+h[o+(am<<6)+8>>3];ao=+h[o+(am<<6)+16>>3];break L15170}}while(0);ap=c[$>>2]|0;y=+h[o+(am<<6)+8>>3];if((a[64788+(ap*688&-1)|0]&1)==0){aq=y}else{aq=+Z(+(y*+h[64800+(ap*688&-1)>>3]))}ap=c[al>>2]|0;y=+h[o+(am<<6)+16>>3];if((a[64788+(ap*688&-1)|0]&1)==0){an=aq;ao=y;break}an=aq;ao=+Z(+(y*+h[64800+(ap*688&-1)>>3]))}}while(0);ap=F+(S*ao+R*an)<0.0;do{if((am|0)==1){if(!ap){ar=F;as=R;at=S;break}ar=-0.0-F;as=-0.0-R;at=-0.0-S}else{if(ap){break L15168}else{ar=F;as=R;at=S}}}while(0);ap=am+1|0;if((ap|0)<(p|0)){S=at;R=as;F=ar;am=ap}else{au=11111;break L15166}}if((am|0)==(p|0)){au=11111}else{av=am}}else{au=11111}}while(0);if((au|0)==11111){uh(-1,186832,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);av=p}s=(p|0)/(av|0)&-1;if(+(s|0)!=+(p|0)/+(av|0)){uh(-1,181552,(v=i,i=i+16|0,c[v>>2]=p,c[v+8>>2]=av,v)|0);i=e;return}c[j>>2]=0;r=av-1|0;c[j+4>>2]=r;c[j+12>>2]=p-1;al=p-av|0;c[j+8>>2]=al;L15195:do{if(n){$=c[200]|0;ar=(+h[o+(r<<6)+8>>3]- +h[64664+($*688&-1)>>3])*+h[91]+ +h[96]+-1.0;as=(+h[o+(r<<6)+16>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;at=(+h[o+(r<<6)+24>>3]- +h[5279])*+h[2]+ +h[12]+-1.0;an=+h[406]+ar*+h[394]+as*+h[398]+at*+h[402];ao=an==0.0?1.0e-5:an;aw=+(~~((+h[403]+ar*+h[391]+as*+h[395]+at*+h[399])/ao*+(c[180]|0))+(c[186]|0)|0);ax=+(~~((+h[404]+ar*+h[392]+as*+h[396]+at*+h[400])/ao*+(c[40]|0))+(c[46]|0)|0);ay=$}else{$=c[200]|0;do{if((a[64788+($*688&-1)|0]&1)==0){if((a[64788+((c[144]|0)*688&-1)|0]&1)!=0){break}aw=+h[o+(r<<6)+8>>3];ax=+h[o+(r<<6)+16>>3];ay=$;break L15195}}while(0);am=c[b+304>>2]|0;ao=+h[o+(r<<6)+8>>3];if((a[64788+(am*688&-1)|0]&1)==0){az=ao}else{az=+Z(+(ao*+h[64800+(am*688&-1)>>3]))}am=c[b+308>>2]|0;ao=+h[o+(r<<6)+16>>3];if((a[64788+(am*688&-1)|0]&1)==0){aw=az;ax=ao;ay=$;break}aw=az;ax=+Z(+(ao*+h[64800+(am*688&-1)>>3]));ay=$}}while(0);az=+(r|0);ao=(aw-ae)/az;ae=(ax-af)/az;am=s-1|0;af=+(am|0);at=(ac-aw)/af;aw=(ad-ax)/af;if(d){ax=+(r<<1|0);ad=+(am<<1|0);am=b+304|0;d=b+308|0;u=b+23|0;Y=0;do{do{if((a[64788+(ay*688&-1)|0]&1)==0){if((a[64788+((c[144]|0)*688&-1)|0]&1)!=0){au=11127;break}aj=c[j+(Y<<2)>>2]|0;ac=+h[o+(aj<<6)+8>>3];as=+h[o+(aj<<6)+16>>3];aj=c[j+(((5-Y|0)%4&-1)<<2)>>2]|0;ah=c[j+(((Y+2|0)%4&-1)<<2)>>2]|0;aA=ac-(+h[o+(aj<<6)+8>>3]-ac)/ax-(+h[o+(ah<<6)+8>>3]-ac)/ad;aB=as-(+h[o+(aj<<6)+16>>3]-as)/ax-(+h[o+(ah<<6)+16>>3]-as)/ad;aC=c[am>>2]|0}else{au=11127}}while(0);if((au|0)==11127){au=0;$=c[am>>2]|0;ah=(a[64788+($*688&-1)|0]&1)==0;as=+h[o+(Y<<6)+8>>3];if(ah){aD=as}else{aD=+Z(+(as*+h[64800+($*688&-1)>>3]))}aj=c[d>>2]|0;t=(a[64788+(aj*688&-1)|0]&1)==0;ac=+h[o+(Y<<6)+16>>3];if(t){aE=ac}else{aE=+Z(+(ac*+h[64800+(aj*688&-1)>>3]))}ap=(5-Y|0)%4&-1;ar=+h[o+(ap<<6)+8>>3];if(ah){aF=as;aG=ar}else{an=+h[64800+($*688&-1)>>3];aq=+Z(+(ar*an));aF=+Z(+(as*an));aG=aq}aq=+h[o+(ap<<6)+16>>3];if(t){aH=ac;aI=aq}else{an=+h[64800+(aj*688&-1)>>3];ar=+Z(+(aq*an));aH=+Z(+(ac*an));aI=ar}ap=(Y+2|0)%4&-1;ar=+h[o+(ap<<6)+8>>3];if(ah){aJ=as;aK=ar}else{an=+h[64800+($*688&-1)>>3];aq=+Z(+(ar*an));aJ=+Z(+(as*an));aK=aq}aq=+h[o+(ap<<6)+16>>3];if(t){aL=ac;aM=aq}else{an=+h[64800+(aj*688&-1)>>3];as=+Z(+(aq*an));aL=+Z(+(ac*an));aM=as}aA=aD-(aG-aF)/ax-(aK-aJ)/ad;aB=aE-(aI-aH)/ax-(aM-aL)/ad;aC=$}L15235:do{if((aC|0)!=99){if(!(aA>-8.988465674311579e+307&aA<8.988465674311579e+307)){break}if((a[64788+(aC*688&-1)|0]&1)==0){aN=aA}else{if(aA<=0.0){break}as=+_(+aA);aN=as/+h[64800+(aC*688&-1)>>3]}if((a[u]&1)!=0|(aC|0)<0){break}$=64712+(aC*688&-1)|0;if(aN<+h[$>>3]){h[$>>3]=aN;aO=c[am>>2]|0}else{aO=aC}$=64664+(aO*688&-1)|0;do{if(aN<+h[$>>3]){if((c[64648+(aO*688&-1)>>2]&1|0)==0){break L15235}if((c[64728+(aO*688&-1)>>2]&1|0)==0){h[$>>3]=aN;break}as=+h[64736+(aO*688&-1)>>3];if(as>aN){h[$>>3]=as;break L15235}else{h[$>>3]=aN;break}}}while(0);$=c[am>>2]|0;aj=64720+($*688&-1)|0;if(aN>+h[aj>>3]){h[aj>>3]=aN;aP=c[am>>2]|0}else{aP=$}$=64672+(aP*688&-1)|0;if(aN<=+h[$>>3]){break}if((c[64648+(aP*688&-1)>>2]&2|0)==0){break}if((c[64732+(aP*688&-1)>>2]&2|0)==0){h[$>>3]=aN;break}as=+h[64760+(aP*688&-1)>>3];if(as>3]=as;break}else{h[$>>3]=aN;break}}}while(0);$=c[d>>2]|0;L15268:do{if(($|0)!=99){if(!(aB>-8.988465674311579e+307&aB<8.988465674311579e+307)){break}if((a[64788+($*688&-1)|0]&1)==0){aQ=aB}else{if(aB<=0.0){break}as=+_(+aB);aQ=as/+h[64800+($*688&-1)>>3]}if((a[u]&1)!=0|($|0)<0){break}aj=64712+($*688&-1)|0;if(aQ<+h[aj>>3]){h[aj>>3]=aQ;aR=c[d>>2]|0}else{aR=$}aj=64664+(aR*688&-1)|0;do{if(aQ<+h[aj>>3]){if((c[64648+(aR*688&-1)>>2]&1|0)==0){break L15268}if((c[64728+(aR*688&-1)>>2]&1|0)==0){h[aj>>3]=aQ;break}as=+h[64736+(aR*688&-1)>>3];if(as>aQ){h[aj>>3]=as;break L15268}else{h[aj>>3]=aQ;break}}}while(0);aj=c[d>>2]|0;t=64720+(aj*688&-1)|0;if(aQ>+h[t>>3]){h[t>>3]=aQ;aS=c[d>>2]|0}else{aS=aj}aj=64672+(aS*688&-1)|0;if(aQ<=+h[aj>>3]){break}if((c[64648+(aS*688&-1)>>2]&2|0)==0){break}if((c[64732+(aS*688&-1)>>2]&2|0)==0){h[aj>>3]=aQ;break}as=+h[64760+(aS*688&-1)>>3];if(as>3]=as;break}else{h[aj>>3]=aQ;break}}}while(0);Y=Y+1|0;}while((Y|0)<4);i=e;return}aQ=+P(+ao);aB=+P(+at);do{if(aQ>>0<2){if((c[(c[3524]|0)+144>>2]|0)!=0){break}i=e;return}}while(0);if(!d){aV=aU;aW=0;aX=aS;aY=ay;break}aV=(c[(c[3524]|0)+96>>2]&512|0)==0|aU;aW=1;aX=aS;aY=ay}}while(0);ay=(a[64788+(aY*688&-1)|0]&1)==0;if(ay){if((a[64788+((c[144]|0)*688&-1)|0]&1)==0){aZ=aV}else{au=11205}}else{au=11205}if((au|0)==11205){aZ=1}aV=c[64652+(aY*688&-1)>>2]|0;if((aV&1|0)==0){a_=64680+(aY*688&-1)|0}else{a_=64664+(aY*688&-1)|0}aN=+h[a_>>3];if((aV&2|0)==0){a$=64688+(aY*688&-1)|0}else{a$=64672+(aY*688&-1)|0}aA=+h[a$>>3];a$=c[144]|0;aV=c[64652+(a$*688&-1)>>2]|0;if((aV&1|0)==0){a0=64680+(a$*688&-1)|0}else{a0=64664+(a$*688&-1)|0}ad=+h[a0>>3];if((aV&2|0)==0){a1=64688+(a$*688&-1)|0}else{a1=64672+(a$*688&-1)|0}aL=+h[a1>>3];if(n){a1=c[34]|0;aV=c[64652+(a1*688&-1)>>2]|0;if((aV&1|0)==0){a2=64680+(a1*688&-1)|0}else{a2=64664+(a1*688&-1)|0}if((aV&2|0)==0){a3=64688+(a1*688&-1)|0}else{a3=64672+(a1*688&-1)|0}a4=+h[a3>>3];a5=+h[a2>>3]}else{a4=0.0;a5=0.0}do{if(aT){if((c[(c[3524]|0)+152>>2]|0)==0|aZ){break}if(n){a6=1.0;a7=1.0}else{a6=+h[64776+(aY*688&-1)>>3]>0.0?1.0:-1.0;a7=+h[64776+(a$*688&-1)>>3]>0.0?1.0:-1.0}if(aQ>aB){a2=aw*a7>0.0;a3=ao*a6>0.0;a1=aa(a2?s:1,av)-(a3?av:1)|0;aV=-av|0;a8=av;a9=a3?1:-1;ba=(a3?aV:av)+(a2?aV:av)|0;bb=a1;bc=aa(s,av)}else{a1=at*a6>0.0;aV=ae*a7>0.0;a2=aa(a1?1:s,av)-(aV?1:av)|0;a3=aa(s,av);a8=s;a9=a1?av:-av|0;ba=aa(a3,a1?-1:1)+(aV?-1:1)|0;bb=a2;bc=a3}if(aX){bd=bc*3&-1}else{bd=aW?bc<<2:bc}a3=bd<<3;a2=ut(a3)|0;do{if((a2|0)==0){gk();aV=ut(a3)|0;if((aV|0)!=0){be=aV;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=177456,v)|0)}else{be=a2}}while(0);a2=be;aM=+h[o+8>>3];ax=((aM- +h[o+(r<<6)+8>>3])/az+(aM- +h[o+(al<<6)+8>>3])/af)*.5;aM=+h[o+16>>3];aH=((aM- +h[o+(r<<6)+16>>3])/az+(aM- +h[o+(al<<6)+16>>3])/af)*.5;aM=+h[o+24>>3];aI=((aM- +h[o+(r<<6)+24>>3])/az+(aM- +h[o+(al<<6)+24>>3])/af)*.5;do{if((p|0)>0){a3=aN>3];aE=+h[o+(a_<<6)+16>>3];aJ=+h[o+(a_<<6)+24>>3];aK=aM-ax;aF=ax+aM;aM=aE-aH;aG=aH+aE;aE=aJ-aI;aD=aI+aJ;do{if(a3){if(!(aKaA)){au=11246;break}if(aFaA){au=11257}else{au=11246}}else{if(!(aKaN)){au=11246;break}if(aFaN){au=11257}else{au=11246}}}while(0);L15382:do{if((au|0)==11246){au=0;do{if(aS){if(!(aMaL)){break}if(aGaL){au=11257;break L15382}}else{if(!(aMad)){break}if(aGad){au=11257;break L15382}}}while(0);if(!n){au=11273;break}if(d){if(!(aEa4)){au=11273;break}if(aDa4){au=11257;break}else{au=11273;break}}else{if(!(aEa5)){au=11273;break}if(aDa5){au=11257;break}else{au=11273;break}}}}while(0);L15396:do{if((au|0)==11257){au=0;do{if(aKaF)){break}if(aAaF){bf=aP;bg=u;bh=aR;bi=aU;bj=a0;bk=a1;break L15396}}else{if(!(aNaK)){break}if(aAaK){bf=aP;bg=u;bh=aR;bi=aU;bj=a0;bk=a1;break L15396}}}while(0);do{if(aMaG)){break}if(aLaG){bf=aP;bg=u;bh=aR;bi=aU;bj=a0;bk=a1;break L15396}}else{if(!(adaM)){break}if(aLaM){bf=aP;bg=u;bh=aR;bi=aU;bj=a0;bk=a1;break L15396}}}while(0);if(!n){au=11273;break}if(aEaD)){au=11273;break}if(a4aD){bf=aP;bg=u;bh=aR;bi=aU;bj=a0;bk=a1;break}else{au=11273;break}}else{if(!(a5aE)){au=11273;break}if(a4aE){bf=aP;bg=u;bh=aR;bi=aU;bj=a0;bk=a1;break}else{au=11273;break}}}}while(0);do{if((au|0)==11273){au=0;if((aP|0)<0){bl=a_;bm=1;bn=1;bo=0}else{aO=((u|0)==0&1)+a0|0;aC=u+1|0;if((aO|0)!=1&(aC|0)>(a1|0)){au=11275;break L15375}else{bl=aP;bm=aC;bn=aO;bo=a1}}if(Y){aE=+h[o+(a_<<6)+32>>3];aD=+h[8341];do{if(aD>3]=bp;bf=bl;bg=bm;bh=a_;bi=aU+1|0;bj=bn;bk=bo;break}aD=+h[o+(a_<<6)+40>>3];aE=+h[8341];do{if(aE>3]=bq;aE=+h[o+(a_<<6)+48>>3];aD=+h[8341];do{if(aD>3]=br;aD=+h[o+(a_<<6)+56>>3];aE=+h[8341];do{if(aE>3]=bs;if(!aW){bf=bl;bg=bm;bh=a_;bi=aO;bj=bn;bk=bo;break}h[a2+(aO<<3)>>3]=+h[o+(a_<<6)+32>>3];bf=bl;bg=bm;bh=a_;bi=aU+4|0;bj=bn;bk=bo}}while(0);aO=a_+a9|0;j=aV-1|0;if((j|0)==0){if((bk|0)==0){bt=bg}else{if((bg|0)<1|(bg|0)==(bk|0)){bt=bk}else{au=11307;break}}bu=0;bv=aO+ba|0;bw=bt;bx=a8}else{bu=bg;bv=aO;bw=bk;bx=j}j=am+1|0;if((j|0)<(p|0)){aV=bx;a1=bw;a0=bj;a_=bv;aU=bi;aR=bh;u=bu;aP=bf;am=j}else{au=11310;break}}if((au|0)==11307){uh(-1,169296,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);i=e;return}else if((au|0)==11310){if(!((bw|0)>0&(bj|0)>0)){break}if(n){aE=+h[64664+((c[200]|0)*688&-1)>>3];aD=+h[91];aM=+h[96];aG=(+h[o+(bf<<6)+8>>3]-aE)*aD+aM+-1.0;aK=+h[64664+((c[144]|0)*688&-1)>>3];aF=+h[21];aJ=+h[68];as=(+h[o+(bf<<6)+16>>3]-aK)*aF+aJ+-1.0;an=+h[5279];ac=+h[2];aq=+h[12];ar=(+h[o+(bf<<6)+24>>3]-an)*ac+aq+-1.0;ag=+h[403];ai=+h[391];F=+h[395];R=+h[399];S=+h[404];T=+h[392];I=+h[396];J=+h[400];K=+h[406];L=+h[394];E=+h[398];V=+h[402];M=K+aG*L+as*E+ar*V;z=M==0.0?1.0e-5:M;M=+(c[180]|0);am=c[186]|0;N=+(c[40]|0);aP=c[46]|0;ab=+P(+(ao+at))*.5;c[k>>2]=~~(+(~~((ag+aG*ai+as*F+ar*R)/z*M)+am|0)-ab);w=+P(+(ae+aw))*.5;c[k+4>>2]=~~(w+ +(~~((S+aG*T+as*I+ar*J)/z*N)+aP|0));z=(+h[o+(bh<<6)+8>>3]-aE)*aD+aM+-1.0;ar=(+h[o+(bh<<6)+16>>3]-aK)*aF+aJ+-1.0;as=(+h[o+(bh<<6)+24>>3]-an)*ac+aq+-1.0;aG=K+z*L+ar*E+as*V;A=aG==0.0?1.0e-5:aG;c[k+12>>2]=~~(ab+ +(~~((ag+z*ai+ar*F+as*R)/A*M)+am|0));c[k+16>>2]=~~(+(~~((S+z*T+ar*I+as*J)/A*N)+aP|0)-w);w=(aN-aE)*aD+aM+-1.0;A=(ad-aK)*aF+aJ+-1.0;as=(a5-an)*ac+aq+-1.0;ar=K+w*L+A*E+as*V;z=ar==0.0?1.0e-5:ar;c[k+24>>2]=~~((ag+w*ai+A*F+as*R)/z*M)+am;c[k+28>>2]=~~((S+w*T+A*I+as*J)/z*N)+aP;z=(aA-aE)*aD+aM+-1.0;aM=(aL-aK)*aF+aJ+-1.0;aJ=(a4-an)*ac+aq+-1.0;aq=K+z*L+aM*E+aJ*V;V=aq==0.0?1.0e-5:aq;c[k+36>>2]=~~((ag+z*ai+aM*F+aJ*R)/V*M)+am;c[k+40>>2]=~~((S+z*T+aM*I+aJ*J)/V*N)+aP}else{aP=c[200]|0;N=+(c[64768+(aP*688&-1)>>2]|0);V=+h[o+(bf<<6)+8>>3];J=a6*+P(+ax);aJ=+h[64664+(aP*688&-1)>>3];I=+h[64776+(aP*688&-1)>>3];c[k>>2]=~~(N+I*(V-J-aJ)+.5);aP=c[144]|0;V=+(c[64768+(aP*688&-1)>>2]|0);aM=+h[o+(bf<<6)+16>>3];T=a7*+P(+aH);z=+h[64664+(aP*688&-1)>>3];S=+h[64776+(aP*688&-1)>>3];c[k+4>>2]=~~(V+S*(aM+T-z)+.5);c[k+12>>2]=~~(N+(J+ +h[o+(bh<<6)+8>>3]-aJ)*I+.5);c[k+16>>2]=~~(V+(+h[o+(bh<<6)+16>>3]-T-z)*S+.5);c[k+24>>2]=~~(N+(aN-aJ)*I+.5);c[k+28>>2]=~~(V+(aL-z)*S+.5);c[k+36>>2]=~~(N+(aA-aJ)*I+.5);c[k+40>>2]=~~(V+(ad-z)*S+.5)}cI[c[(c[3524]|0)+152>>2]&63](bw,bj,a2,k|0,q);break}else if((au|0)==11275){uh(-1,172960,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);i=e;return}}}while(0);uu(be);i=e;return}}while(0);if(ay){by=(a[64788+(a$*688&-1)|0]&1)!=0}else{by=1}if((c[(c[3524]|0)+148>>2]|0)==0){uf(-1,156360,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if(by){a$=c[b+304>>2]|0;ay=(a[64788+(a$*688&-1)|0]&1)==0;a7=+h[o+(r<<6)+8>>3];if(ay){a6=+h[o+8>>3];bz=a6;bA=a7;bB=a6}else{a6=+h[64800+(a$*688&-1)>>3];aw=+Z(+(a7*a6));a7=+h[o+8>>3];bz=+Z(+(a7*a6));bA=aw;bB=a7}be=c[b+308>>2]|0;q=(a[64788+(be*688&-1)|0]&1)==0;a7=+h[o+(r<<6)+16>>3];if(q){aw=+h[o+16>>3];bC=aw;bD=a7;bE=aw}else{aw=+h[64800+(be*688&-1)>>3];a6=+Z(+(a7*aw));a7=+h[o+16>>3];bC=+Z(+(a7*aw));bD=a6;bE=a7}k=c[b+312>>2]|0;bj=(a[64788+(k*688&-1)|0]&1)==0;a7=+h[o+(r<<6)+24>>3];if(bj){a6=+h[o+24>>3];bF=a6;bG=a7;bH=a6}else{a6=+h[64800+(k*688&-1)>>3];aw=+Z(+(a7*a6));a7=+h[o+24>>3];bF=+Z(+(a7*a6));bG=aw;bH=a7}a7=+h[o+(al<<6)+8>>3];if(ay){bI=bB;bJ=a7}else{aw=+h[64800+(a$*688&-1)>>3];a6=+Z(+(a7*aw));bI=+Z(+(bB*aw));bJ=a6}a6=+h[o+(al<<6)+16>>3];if(q){bK=bE;bL=a6}else{aw=+h[64800+(be*688&-1)>>3];bB=+Z(+(a6*aw));bK=+Z(+(bE*aw));bL=bB}bB=+h[o+(al<<6)+24>>3];if(bj){bM=bH;bN=bB}else{aw=+h[64800+(k*688&-1)>>3];bE=+Z(+(bB*aw));bM=+Z(+(bH*aw));bN=bE}bO=bA-bz;bP=bD-bC;bQ=bG-bF;bR=bJ-bI;bS=bL-bK;bT=bN-bM}else{bM=+h[o+8>>3];bN=+h[o+16>>3];bK=+h[o+24>>3];bO=+h[o+(r<<6)+8>>3]-bM;bP=+h[o+(r<<6)+16>>3]-bN;bQ=+h[o+(r<<6)+24>>3]-bK;bR=+h[o+(al<<6)+8>>3]-bM;bS=+h[o+(al<<6)+16>>3]-bN;bT=+h[o+(al<<6)+24>>3]-bK}bK=bO/az;bO=bP/az;bP=bQ/az;az=bR/af;bR=bS/af;bS=bT/af;af=(bK+az)*.5;bT=(bO+bR)*.5;bQ=(bP+bS)*.5;bN=(bK-az)*.5;bM=(bO-bR)*.5;bL=(bP-bS)*.5;if((s|0)<=0){i=e;return}al=b+304|0;r=o+8|0;k=b+308|0;bj=o+16|0;be=b+312|0;b=o+24|0;q=(av|0)>0;a$=l|0;ay=l+8|0;bw=l+16|0;bh=l+24|0;bf=l+32|0;bu=l+40|0;bi=l+48|0;bv=l+56|0;bx=l+64|0;p=l+72|0;bk=l+80|0;bg=l+88|0;a8=aN>2]|0;bI=+h[r>>3];if((a[64788+(aR*688&-1)|0]&1)==0){bU=bI}else{bU=+Z(+(bI*+h[64800+(aR*688&-1)>>3]))}bI=+(am|0);aR=c[k>>2]|0;bJ=+h[bj>>3];if((a[64788+(aR*688&-1)|0]&1)==0){bV=bJ}else{bV=+Z(+(bJ*+h[64800+(aR*688&-1)>>3]))}aR=c[be>>2]|0;bJ=+h[b>>3];if((a[64788+(aR*688&-1)|0]&1)==0){bW=bJ}else{bW=+Z(+(bJ*+h[64800+(aR*688&-1)>>3]))}bX=bS*bI+bW;bY=bR*bI+bV;bZ=az*bI+bU}else{bI=+(am|0);bX=bS*bI+ +h[b>>3];bY=bR*bI+ +h[bj>>3];bZ=az*bI+ +h[r>>3]}if(q){aR=u;aU=0;while(1){do{if(aW){bI=+h[o+(aR<<6)+32>>3];if(bI==0.0){break}if(bI>=128.0){au=11354;break}if((c[(c[3524]|0)+96>>2]&512|0)!=0){au=11354}}else{au=11354}}while(0);L15534:do{if((au|0)==11354){au=0;bI=+(aU|0);bJ=bZ+bK*bI;bF=bY+bO*bI;bG=bX+bP*bI;bI=af+bJ;h[a$>>3]=bI;h[ay>>3]=bT+bF;h[bw>>3]=bQ+bG;h[bh>>3]=bN+bJ;h[bf>>3]=bM+bF;h[bu>>3]=bL+bG;h[bi>>3]=bJ-af;h[bv>>3]=bF-bT;h[bx>>3]=bG-bQ;h[p>>3]=bJ-bN;h[bk>>3]=bF-bM;h[bg>>3]=bG-bL;a_=(c[5094]|0)!=0|a9;a0=0;a1=0;bG=bI;while(1){if(a8){if(bGaA){b_=a0}else{au=11358}}else{if(bGaN){b_=a0}else{au=11358}}do{if((au|0)==11358){au=0;bI=+h[l+(a1*24&-1)+8>>3];if(bt){if(bIaL){b_=a0;break}}else{if(bIad){b_=a0;break}}bI=+h[l+(a1*24&-1)+16>>3];if(ba){if(!(bI<=a4&bI>=a5|a_)){b_=a0;break}}else{if(!(bI<=a5&bI>=a4|a_)){b_=a0;break}}b_=a0+1|0}}while(0);aC=a1+1|0;if((aC|0)>=4){break}a0=b_;a1=aC;bG=+h[l+(aC*24&-1)>>3]}if((b_|0)<=0){break}c[bn>>2]=3;a1=(b_|0)<4;a0=0;do{do{if(n){bG=(+h[l+(a0*24&-1)>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;bI=(+h[l+(a0*24&-1)+8>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;bF=(+h[l+(a0*24&-1)+16>>3]- +h[5279])*+h[2]+ +h[12]+-1.0;bJ=+h[406]+bG*+h[394]+bI*+h[398]+bF*+h[402];bC=bJ==0.0?1.0e-5:bJ;a_=~~((+h[403]+bG*+h[391]+bI*+h[395]+bF*+h[399])/bC*+(c[180]|0))+(c[186]|0)|0;aC=~~((+h[404]+bG*+h[392]+bI*+h[396]+bF*+h[400])/bC*+(c[40]|0))+(c[46]|0)|0;c[m+(a0*12&-1)>>2]=a_;c[m+(a0*12&-1)+4>>2]=aC;b$=a_;b0=aC}else{aC=c[200]|0;bC=+(c[64768+(aC*688&-1)>>2]|0);if(!by){a_=~~(bC+(+h[l+(a0*24&-1)>>3]- +h[64664+(aC*688&-1)>>3])*+h[64776+(aC*688&-1)>>3]+.5);c[m+(a0*12&-1)>>2]=a_;aV=c[144]|0;d=~~(+(c[64768+(aV*688&-1)>>2]|0)+(+h[l+(a0*24&-1)+8>>3]- +h[64664+(aV*688&-1)>>3])*+h[64776+(aV*688&-1)>>3]+.5);c[m+(a0*12&-1)+4>>2]=d;b$=a_;b0=d;break}bF=+h[l+(a0*24&-1)>>3];if((a[64788+(aC*688&-1)|0]&1)==0){b1=bF}else{bI=+_(+bF);b1=bI/+h[64800+(aC*688&-1)>>3]}d=~~(bC+(b1- +h[64664+(aC*688&-1)>>3])*+h[64776+(aC*688&-1)>>3]+.5);c[m+(a0*12&-1)>>2]=d;aC=c[144]|0;bC=+(c[64768+(aC*688&-1)>>2]|0);bI=+h[l+(a0*24&-1)+8>>3];if((a[64788+(aC*688&-1)|0]&1)==0){b2=bI}else{bF=+_(+bI);b2=bF/+h[64800+(aC*688&-1)>>3]}a_=~~(bC+(b2- +h[64664+(aC*688&-1)>>3])*+h[64776+(aC*688&-1)>>3]+.5);c[m+(a0*12&-1)+4>>2]=a_;b$=d;b0=a_}}while(0);do{if(aT){if(!((c[(c[3524]|0)+108>>2]|0)!=0&a1)){break}a_=m+(a0*12&-1)|0;d=c[13542]|0;aC=c[d>>2]|0;if((b$|0)<(aC|0)){c[a_>>2]=aC;b3=aC}else{b3=b$}aC=c[d+4>>2]|0;if((b3|0)>(aC|0)){c[a_>>2]=aC}aC=m+(a0*12&-1)+4|0;a_=c[d+12>>2]|0;if((b0|0)>(a_|0)){c[aC>>2]=a_;b4=a_}else{b4=b0}a_=c[d+8>>2]|0;if((b4|0)>=(a_|0)){break}c[aC>>2]=a_}}while(0);a0=a0+1|0;}while((a0|0)<4);do{if(Y){if((c[o+(aR<<6)>>2]|0)==2){break L15534}a0=o+(aR<<6)+32|0;if((cg(+(+h[a0>>3]))|0)==0){break L15534}bC=+h[a0>>3];bF=+h[8341];do{if(bF>2]|0)==0){break}c[bm>>2]=5;h[bl>>3]=b5;c[bb>>2]=0;cM[c[a0>>2]&511](f)}else{bF=+h[o+(aR<<6)+40>>3];bC=+h[8341];do{if(bC>24==112&1|0);b7=a0;break}bI=(bF-bC)/(bG-bC);a0=a[20668]|0;if(a0<<24>>24==112){b6=bI;b7=112;break}b6=1.0-bI;b7=a0}else{a0=a[20668]|0;b6=+(a0<<24>>24!=112&1|0);b7=a0}}while(0);a0=~~(b6*255.0+.5);bF=+h[o+(aR<<6)+48>>3];do{if(bC>24==112&1|0);b9=b7;break}bG=(bF-bC)/(bI-bC);if(b7<<24>>24==112){b8=bG;b9=112;break}b8=1.0-bG;b9=b7}else{b8=+(b7<<24>>24!=112&1|0);b9=b7}}while(0);a1=~~(b8*255.0+.5);bF=+h[o+(aR<<6)+56>>3];do{if(bC>24==112&1|0);break}bI=(bF-bC)/(bG-bC);if(b9<<24>>24==112){ca=bI;break}ca=1.0-bI}else{ca=+(b9<<24>>24!=112&1|0)}}while(0);a_=(c[3524]|0)+144|0;if((c[a_>>2]|0)==0){break}c[aZ>>2]=3;c[a2>>2]=((a1<<8)+(a0<<16)|0)+~~(ca*255.0+.5);h[aP>>3]=0.0;cM[c[a_>>2]&511](g)}}while(0);do{if(aW){a_=~~(+h[o+(aR<<6)+32>>3]*100.0/255.0);if((a_|0)==0){break L15534}if((c[(c[3524]|0)+96>>2]&512|0)==0){break}c[bn>>2]=a_<<4|4}}while(0);a_=c[3524]|0;do{if(aT){aC=c[a_+108>>2]|0;if((aC|0)==0){break}d=c[bd>>2]|0;aV=c[bc>>2]|0;aS=c[aX>>2]|0;a3=c[aY>>2]|0;j=aV-d|0;aO=a3-aS|0;cI[aC&63](c[bn>>2]|0,(d|0)<(aV|0)?d:aV,(aS|0)<(a3|0)?aS:a3,(j|0)>-1?j:-j|0,(aO|0)>-1?aO:-aO|0);break L15534}}while(0);cN[c[a_+148>>2]&255](4,bo)}}while(0);aO=aU+1|0;if((aO|0)<(av|0)){aR=aR+1|0;aU=aO}else{break}}cb=av+u|0}else{cb=u}aU=am+1|0;if((aU|0)<(s|0)){am=aU;u=cb}else{break}}i=e;return}function f4(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0.0,g=0;d=c[(c[9732]|0)+320>>2]|0;e=+h[d+(c[a>>2]<<6)+8>>3];f=+h[d+(c[b>>2]<<6)+8>>3];if(ef&1;return g|0}function f5(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0;c=+h[a+16>>3];d=+h[b+16>>3];if(c>d){e=1;return e|0}e=(c>31;return e|0}function f6(b,d,e,f,g){b=b|0;d=+d;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0,w=0,x=0.0,y=0.0,z=0,A=0,B=0,C=0,D=0.0,E=0.0,F=0.0,G=0,H=0,I=0,J=0.0,K=0.0,L=0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0;j=i;i=i+96|0;k=f;f=i;i=i+56|0;uD(f,k,56);k=j|0;l=j+16|0;m=j+32|0;n=j+40|0;o=j+48|0;p=j+56|0;q=j+64|0;r=j+80|0;s=j+88|0;t=c[3524]|0;u=+(aa(c[t+24>>2]|0,c[1400]|0)|0);if((e|0)==0){v=65064+(b*688&-1)|0}else{v=65056+(b*688&-1)|0}w=~~(u*+h[v>>3]);v=c[200]|0;u=+(c[64768+(v*688&-1)>>2]|0);x=+h[64664+(v*688&-1)>>3];y=+h[64776+(v*688&-1)>>3];v=~~(u+(d-x)*y+.5);L15653:do{if((g|0)==0){z=e}else{A=(a[64788+(b*688&-1)|0]&1)==0;B=64800+(b*688&-1)|0;C=g;while(1){D=+h[C>>3];if(A){E=D}else{F=+_(+D);E=F/+h[B>>3]}G=~~(u+(E-x)*y+.5)-v|0;if((((G|0)>-1?G:-G|0)|0)<3){z=0;break L15653}G=c[C+16>>2]|0;if((G|0)==0){z=e;break}else{C=G}}}}while(0);e=c[f+4>>2]|0;if((e|0)>-3){g=t+168|0;cM[c[g>>2]&511](3);C=q;B=f+40|0;c[C>>2]=c[B>>2];c[C+4>>2]=c[B+4>>2];c[C+8>>2]=c[B+8>>2];c[C+12>>2]=c[B+12>>2];do{if((c[f>>2]|0)!=0){y=+h[f+24>>3];B=c[(c[3524]|0)+92>>2]|0;if(y<0.0){cK[B&63](+h[3817]);break}else{cK[B&63](y);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[f+16>>3]);B=c[(c[3524]|0)+64>>2]|0;if((e|0)<-5){cM[B&511](-2)}else{cM[B&511](e)}B=c[3524]|0;do{if((a[f+32|0]&1)==0){if((c[B+96>>2]&1024|0)!=0){break}c[q>>2]=1;c[q+4>>2]=e;H=11474}else{H=11474}}while(0);if((H|0)==11474){fn(q,B)}L15680:do{if(+h[3815]!=0.0){B=c[200]|0;q=c[64768+(B*688&-1)>>2]|0;y=+h[64664+(B*688&-1)>>3];x=+h[64776+(B*688&-1)>>3];B=~~(+(q|0)+(d-y)*x+.5);e=c[144]|0;f=c[64768+(e*688&-1)>>2]|0;E=+h[64664+(e*688&-1)>>3];u=+h[64776+(e*688&-1)>>3];e=~~(+(f|0)+(0.0-E)*u+.5);F=+h[4483];do{if(F=D){break}h[4483]=D}}while(0);C=2;A=B;G=e;F=0.0;D=d;I=q;J=y;K=x;L=f;M=E;N=u;while(1){O=D*.9950041652780258-F*.09983341664682815;P=F*.9950041652780258+D*.09983341664682815;Q=~~(+(I|0)+(O-J)*K+.5);R=~~(+(L|0)+(P-M)*N+.5);c[m>>2]=A;c[n>>2]=G;c[o>>2]=Q;c[p>>2]=R;S=c[3524]|0;if((fl(m,n,o,p)|0)!=0){cN[c[S+56>>2]&255](c[m>>2]|0,c[n>>2]|0);cN[c[S+60>>2]&255](c[o>>2]|0,c[p>>2]|0)}if((C|0)>=64){break L15680}S=c[200]|0;T=c[144]|0;C=C+1|0;A=Q;G=R;F=P;D=O;I=c[64768+(S*688&-1)>>2]|0;J=+h[64664+(S*688&-1)>>3];K=+h[64776+(S*688&-1)>>3];L=c[64768+(T*688&-1)>>2]|0;M=+h[64664+(T*688&-1)>>3];N=+h[64776+(T*688&-1)>>3]}}else{do{if((a[35184]&1)!=0&(v|0)<(c[9335]|0)&(v|0)>(c[9334]|0)){L=c[9337]|0;I=c[7940]|0;if((L|0)<=(I|0)){U=I;break}G=c[9336]|0;A=c[7941]|0;if((G|0)>=(A|0)){U=I;break}if((G|0)>(I|0)){cN[c[t+56>>2]&255](v,I);cN[c[t+60>>2]&255](v,c[9336]|0);V=c[9337]|0;W=c[7941]|0}else{V=L;W=A}if((V|0)>=(W|0)){break L15680}cN[c[t+56>>2]&255](v,V);cN[c[t+60>>2]&255](v,c[7941]|0);break L15680}else{U=c[7940]|0}}while(0);cN[c[t+56>>2]&255](v,U);cN[c[t+60>>2]&255](v,c[7941]|0)}}while(0);U=l;c[U>>2]=c[14084];c[U+4>>2]=c[56340>>2];c[U+8>>2]=c[56344>>2];c[U+12>>2]=c[56348>>2];U=c[14075]|0;do{if((c[14074]|0)!=0){d=+h[7040];V=c[(c[3524]|0)+92>>2]|0;if(d<0.0){cK[V&63](+h[3817]);break}else{cK[V&63](d);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[7039]);V=c[(c[3524]|0)+64>>2]|0;if((U|0)<-5){cM[V&511](-2)}else{cM[V&511](U)}V=c[3524]|0;do{if((a[56328]&1)==0){if((c[V+96>>2]&1024|0)!=0){break}c[l>>2]=1;c[l+4>>2]=U;H=11504}else{H=11504}}while(0);if((H|0)==11504){fn(l,V)}cM[c[g>>2]&511](4)}g=t+56|0;cN[c[g>>2]&255](v,c[1394]|0);V=t+60|0;cN[c[V>>2]&255](v,(c[1394]|0)+w|0);l=c[1396]|0;if((l|0)>-1){cN[c[g>>2]&255](v,l);cN[c[V>>2]&255](v,(c[1396]|0)-w|0)}if((z|0)==0){i=j;return}fN(64984+(b*688&-1)|0,r,s,99744);w=64928+(b*688&-1)|0;if((c[w>>2]|0)!=0){fn(w,t)}ln(~~+h[r>>3]+v|0,~~+h[s>>3]+(c[1392]|0)|0,z,c[1398]|0,c[1384]|0,c[6586]|0,c[64924+(b*688&-1)>>2]|0);b=k;c[b>>2]=c[14084];c[b+4>>2]=c[56340>>2];c[b+8>>2]=c[56344>>2];c[b+12>>2]=c[56348>>2];b=c[14075]|0;do{if((c[14074]|0)!=0){d=+h[7040];z=c[(c[3524]|0)+92>>2]|0;if(d<0.0){cK[z&63](+h[3817]);break}else{cK[z&63](d);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[7039]);z=c[(c[3524]|0)+64>>2]|0;if((b|0)<-5){cM[z&511](-2)}else{cM[z&511](b)}z=c[3524]|0;do{if((a[56328]&1)==0){if((c[z+96>>2]&1024|0)==0){c[k>>2]=1;c[k+4>>2]=b;break}else{i=j;return}}}while(0);fn(k,z);i=j;return}function f7(b,d,e,f,g){b=b|0;d=+d;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0,w=0,x=0.0,y=0.0,z=0,A=0,B=0,C=0,D=0.0,E=0.0,F=0.0,G=0,H=0,I=0.0,J=0.0,K=0,L=0,M=0,N=0;j=i;i=i+96|0;k=f;f=i;i=i+56|0;uD(f,k,56);k=j|0;l=j+16|0;m=j+32|0;n=j+40|0;o=j+48|0;p=j+56|0;q=j+64|0;r=j+80|0;s=j+88|0;t=c[3524]|0;u=+(aa(c[t+28>>2]|0,c[1400]|0)|0);if((e|0)==0){v=65064+(b*688&-1)|0}else{v=65056+(b*688&-1)|0}w=~~(u*+h[v>>3]);v=c[144]|0;u=+(c[64768+(v*688&-1)>>2]|0);x=+h[64664+(v*688&-1)>>3];y=+h[64776+(v*688&-1)>>3];v=~~(u+(d-x)*y+.5);L15753:do{if((g|0)==0){z=e}else{A=(a[64788+(b*688&-1)|0]&1)==0;B=64800+(b*688&-1)|0;C=g;while(1){D=+h[C>>3];if(A){E=D}else{F=+_(+D);E=F/+h[B>>3]}G=~~(u+(E-x)*y+.5)-v|0;if((((G|0)>-1?G:-G|0)|0)<3){z=0;break L15753}G=c[C+16>>2]|0;if((G|0)==0){z=e;break}else{C=G}}}}while(0);e=c[f+4>>2]|0;if((e|0)>-3){g=t+168|0;cM[c[g>>2]&511](3);C=q;B=f+40|0;c[C>>2]=c[B>>2];c[C+4>>2]=c[B+4>>2];c[C+8>>2]=c[B+8>>2];c[C+12>>2]=c[B+12>>2];do{if((c[f>>2]|0)!=0){y=+h[f+24>>3];B=c[(c[3524]|0)+92>>2]|0;if(y<0.0){cK[B&63](+h[3817]);break}else{cK[B&63](y);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[f+16>>3]);B=c[(c[3524]|0)+64>>2]|0;if((e|0)<-5){cM[B&511](-2)}else{cM[B&511](e)}B=c[3524]|0;do{if((a[f+32|0]&1)==0){if((c[B+96>>2]&1024|0)!=0){break}c[q>>2]=1;c[q+4>>2]=e;H=11546}else{H=11546}}while(0);if((H|0)==11546){fn(q,B)}L15780:do{if(+h[3815]!=0.0){y=+h[4483];do{if(y=x){break}h[4483]=x}}while(0);B=c[200]|0;q=c[64768+(B*688&-1)>>2]|0;y=+h[64664+(B*688&-1)>>3];x=+h[64776+(B*688&-1)>>3];B=~~(+(q|0)+(0.0-y)*x+.5);e=c[144]|0;f=c[64768+(e*688&-1)>>2]|0;E=+h[64664+(e*688&-1)>>3];u=+h[64776+(e*688&-1)>>3];e=~~(+(f|0)+(d-E)*u+.5);c[8490]=B;c[8488]=e;F=d;D=0.0;C=2;A=B;B=e;e=q;I=y;y=x;q=f;x=E;E=u;while(1){u=D*.9950041652780258-F*.09983341664682815;J=F*.9950041652780258+D*.09983341664682815;f=~~(+(e|0)+(u-I)*y+.5);G=~~(+(q|0)+(J-x)*E+.5);c[m>>2]=A;c[n>>2]=B;c[o>>2]=f;c[p>>2]=G;K=c[3524]|0;if((fl(m,n,o,p)|0)!=0){cN[c[K+56>>2]&255](c[m>>2]|0,c[n>>2]|0);cN[c[K+60>>2]&255](c[o>>2]|0,c[p>>2]|0)}c[8490]=f;c[8488]=G;if((C|0)>=64){break L15780}K=c[200]|0;L=c[144]|0;F=J;D=u;C=C+1|0;A=f;B=G;e=c[64768+(K*688&-1)>>2]|0;I=+h[64664+(K*688&-1)>>3];y=+h[64776+(K*688&-1)>>3];q=c[64768+(L*688&-1)>>2]|0;x=+h[64664+(L*688&-1)>>3];E=+h[64776+(L*688&-1)>>3]}}else{do{if((a[35184]&1)!=0&(v|0)<(c[9337]|0)&(v|0)>(c[9336]|0)){q=c[9334]|0;e=c[7939]|0;if((q|0)>=(e|0)){break}B=c[9335]|0;A=c[7938]|0;if((B|0)<=(A|0)){break}if((q|0)>(A|0)){cN[c[t+56>>2]&255](A,v);cN[c[t+60>>2]&255](c[9334]|0,v);M=c[9335]|0;N=c[7939]|0}else{M=B;N=e}if((M|0)>=(N|0)){break L15780}cN[c[t+56>>2]&255](M,v);cN[c[t+60>>2]&255](c[7939]|0,v);break L15780}}while(0);cN[c[t+56>>2]&255](c[7938]|0,v);cN[c[t+60>>2]&255](c[7939]|0,v)}}while(0);M=l;c[M>>2]=c[14084];c[M+4>>2]=c[56340>>2];c[M+8>>2]=c[56344>>2];c[M+12>>2]=c[56348>>2];M=c[14075]|0;do{if((c[14074]|0)!=0){d=+h[7040];N=c[(c[3524]|0)+92>>2]|0;if(d<0.0){cK[N&63](+h[3817]);break}else{cK[N&63](d);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[7039]);N=c[(c[3524]|0)+64>>2]|0;if((M|0)<-5){cM[N&511](-2)}else{cM[N&511](M)}N=c[3524]|0;do{if((a[56328]&1)==0){if((c[N+96>>2]&1024|0)!=0){break}c[l>>2]=1;c[l+4>>2]=M;H=11575}else{H=11575}}while(0);if((H|0)==11575){fn(l,N)}cM[c[g>>2]&511](4)}g=t+56|0;cN[c[g>>2]&255](c[1394]|0,v);N=t+60|0;cN[c[N>>2]&255]((c[1394]|0)+w|0,v);l=c[1396]|0;if((l|0)>-1){cN[c[g>>2]&255](l,v);cN[c[N>>2]&255]((c[1396]|0)-w|0,v)}if((z|0)==0){i=j;return}fN(64984+(b*688&-1)|0,r,s,94352);w=64928+(b*688&-1)|0;if((c[w>>2]|0)!=0){fn(w,t)}ln(~~+h[r>>3]+(c[1392]|0)|0,~~+h[s>>3]+v|0,z,c[1398]|0,c[1384]|0,c[6586]|0,c[64924+(b*688&-1)>>2]|0);b=k;c[b>>2]=c[14084];c[b+4>>2]=c[56340>>2];c[b+8>>2]=c[56344>>2];c[b+12>>2]=c[56348>>2];b=c[14075]|0;do{if((c[14074]|0)!=0){d=+h[7040];z=c[(c[3524]|0)+92>>2]|0;if(d<0.0){cK[z&63](+h[3817]);break}else{cK[z&63](d);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[7039]);z=c[(c[3524]|0)+64>>2]|0;if((b|0)<-5){cM[z&511](-2)}else{cM[z&511](b)}z=c[3524]|0;do{if((a[56328]&1)==0){if((c[z+96>>2]&1024|0)==0){c[k>>2]=1;c[k+4>>2]=b;break}else{i=j;return}}}while(0);fn(k,z);i=j;return}function f8(a){a=a|0;var b=0;if((a|0)==0){return}b=c[a+116>>2]|0;if((b|0)!=0){uu(b)}b=a+48|0;a=c[b>>2]|0;if((a|0)==0){return}else{f8(a);uu(c[b>>2]|0);c[b>>2]=0;return}}function f9(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0,w=0;e=i;i=i+88|0;f=e|0;g=e+16|0;j=e+32|0;if((c[b+316>>2]|0)==0){k=0;i=e;return k|0}l=c[b+64>>2]|0;if(+h[b+72>>3]<0.0&(l|0)==3){m=(c[3524]|0)+144|0;if((c[m>>2]|0)==0){k=1;i=e;return k|0}n=~~+h[d>>3];c[g>>2]=3;c[g+4>>2]=n;h[g+8>>3]=0.0;cM[c[m>>2]&511](g);k=1;i=e;return k|0}if((l|0)==6){o=+h[d>>3];p=+h[8341];do{if(p>2]|0)==0){k=1;i=e;return k|0}c[f>>2]=5;h[f+8>>3]=r;c[f+4>>2]=0;cM[c[l>>2]&511](f);k=1;i=e;return k|0}if((c[b+28>>2]|0)!=-6){k=0;i=e;return k|0}b=~~+h[d>>3];d=43280;while(1){t=c[d>>2]|0;if((t|0)==0){u=11624;break}if((c[t+4>>2]|0)==(b|0)){u=11622;break}else{d=t|0}}do{if((u|0)==11624){d=c[8798]|0;f=(d|0)>0;l=b;L15891:while(1){g=43264;while(1){v=c[g>>2]|0;if((v|0)==0){break}if((c[v+4>>2]|0)==(l|0)){break L15891}else{g=v|0}}w=l-1|0;if(!((l|0)>(d|0)&f)){u=11634;break}l=((w|0)%(d|0)&-1)+1|0}if((u|0)==11634){c[j+4>>2]=w;c[j+40>>2]=1;c[j+44>>2]=w;c[j+8>>2]=w;break}d=j;f=v+8|0;c[d>>2]=c[f>>2];c[d+4>>2]=c[f+4>>2];c[d+8>>2]=c[f+8>>2];c[d+12>>2]=c[f+12>>2];c[d+16>>2]=c[f+16>>2];c[d+20>>2]=c[f+20>>2];c[d+24>>2]=c[f+24>>2];c[d+28>>2]=c[f+28>>2];c[d+32>>2]=c[f+32>>2];c[d+36>>2]=c[f+36>>2];c[d+40>>2]=c[f+40>>2];c[d+44>>2]=c[f+44>>2];c[d+48>>2]=c[f+48>>2];c[d+52>>2]=c[f+52>>2];if((c[(c[3524]|0)+96>>2]&1024|0)!=0){c[j+4>>2]=l;a[j+32|0]=0;break}if((a[j+32|0]&1)!=0){break}c[j+40>>2]=1;c[j+44>>2]=c[j+4>>2]}else if((u|0)==11622){f=j;d=t+8|0;c[f>>2]=c[d>>2];c[f+4>>2]=c[d+4>>2];c[f+8>>2]=c[d+8>>2];c[f+12>>2]=c[d+12>>2];c[f+16>>2]=c[d+16>>2];c[f+20>>2]=c[d+20>>2];c[f+24>>2]=c[d+24>>2];c[f+28>>2]=c[d+28>>2];c[f+32>>2]=c[d+32>>2];c[f+36>>2]=c[d+36>>2];c[f+40>>2]=c[d+40>>2];c[f+44>>2]=c[d+44>>2];c[f+48>>2]=c[d+48>>2];c[f+52>>2]=c[d+52>>2];if((a[j+32|0]&1)!=0){break}c[j+40>>2]=1;c[j+44>>2]=c[j+4>>2]}}while(0);fn(j+40|0,c[3524]|0);k=1;i=e;return k|0}function ga(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;e=i;do{if((b|0)!=0){if((a[b]|0)==0){break}f=(uA(b|0)|0)+2|0;g=ut(f)|0;do{if((g|0)==0){gk();h=ut(f)|0;if((h|0)!=0){j=h;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=87472,v)|0);return 0}else{j=g}}while(0);uB(j|0,b|0);g=j+(uA(j|0)|0)|0;w=10;a[g]=w&255;w=w>>8;a[g+1|0]=w&255;g=a8(j|0,10)|0;if((g|0)==0){k=0;l=0}else{f=j;h=0;m=0;n=g;while(1){a[n]=0;g=lp(f)|0;o=(g|0)>(h|0)?g:h;if((g|m|0)==0){if((a[b]|0)==10){p=11654}else{q=m}}else{p=11654}if((p|0)==11654){p=0;q=m+1|0}g=n+1|0;r=a8(g|0,10)|0;if((r|0)==0){k=o;l=q;break}else{f=g;h=o;m=q;n=r}}}if((d|0)!=0){c[d>>2]=l}uu(j);s=k;i=e;return s|0}}while(0);if((d|0)==0){s=0;i=e;return s|0}c[d>>2]=0;s=0;i=e;return s|0}function gb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0;f=b-1|0;g=+h[a+(f<<6)+8>>3];i=+h[a+(f<<6)+16>>3];j=+h[a+(b<<6)+8>>3];k=+h[a+(b<<6)+16>>3];f=(c[a+(b<<6)>>2]|0)==0;l=f?j:g;m=f?k:i;n=f?g:j;j=f?i:k;f=n==-8.988465674311579e+307;b=j==-8.988465674311579e+307;if(f|b){h[d>>3]=l;h[e>>3]=m;if(!f){h[e>>3]=+h[64664+((c[144]|0)*688&-1)>>3];o=4;return o|0}if(b){o=5;return o|0}h[d>>3]=+h[64664+((c[200]|0)*688&-1)>>3];o=1;return o|0}do{if(m==j){h[e>>3]=m;b=l>3];do{if(b){if(!(kn)){p=11674;break}q=+h[64664+(f*688&-1)>>3];p=11677}else{if(!(kl)){p=11674;break}r=+h[64664+(f*688&-1)>>3];p=11678}}while(0);do{if((p|0)==11674){if(k==l){i=+h[64664+(f*688&-1)>>3];if(b){q=i;p=11677;break}else{r=i;p=11678;break}}h[d>>3]=k;o=2;return o|0}}while(0);if((p|0)==11677){if(qn){break}else{s=q}}else if((p|0)==11678){if(rl){break}else{s=r}}if(s==l){break}h[d>>3]=s;o=1;return o|0}else{if(l==n){h[d>>3]=l;b=m>3];do{if(b){if(!(kj)){p=11687;break}t=+h[64664+(f*688&-1)>>3];p=11690}else{if(!(km)){p=11687;break}u=+h[64664+(f*688&-1)>>3];p=11691}}while(0);do{if((p|0)==11687){if(k==m){i=+h[64664+(f*688&-1)>>3];if(b){t=i;p=11690;break}else{u=i;p=11691;break}}h[e>>3]=k;o=8;return o|0}}while(0);if((p|0)==11691){if(um){break}else{v=u}}else if((p|0)==11690){if(tj){break}else{v=t}}if(v==m){break}h[e>>3]=v;o=4;return o|0}b=m>3];do{if(b){if(!(kj)){p=11699;break}w=+h[64672+(f*688&-1)>>3];p=11705}else{if(!(km)){p=11699;break}x=+h[64672+(f*688&-1)>>3];p=11706}}while(0);if((p|0)==11699){do{if(k!=m&k!=j){i=l+(k-m)*((n-l)/(j-m));y=c[200]|0;g=+h[64664+(y*688&-1)>>3];z=+h[64672+(y*688&-1)>>3];if(gz){break}}else{if(ig){break}}h[d>>3]=i;h[e>>3]=+h[a>>3];o=4;return o|0}}while(0);i=+h[64672+(f*688&-1)>>3];if(b){w=i;p=11705}else{x=i;p=11706}}if((p|0)==11706){if(xm){A=x}else{B=x;p=11707}}else if((p|0)==11705){if(wj){A=w}else{B=w;p=11707}}do{if((p|0)==11707){a=64672+(f*688&-1)|0;if(!(B!=m&B!=j)){A=B;break}i=l+(B-m)*((n-l)/(j-m));y=c[200]|0;g=+h[64664+(y*688&-1)>>3];z=+h[64672+(y*688&-1)>>3];if(gz){A=B;break}}else{if(ig){A=B;break}}h[d>>3]=i;h[e>>3]=+h[a>>3];o=8;return o|0}}while(0);f=l>3];do{if(f){if(!(in)){p=11717;break}C=+h[64672+(b*688&-1)>>3];p=11723}else{if(!(il)){p=11717;break}D=+h[64672+(b*688&-1)>>3];p=11724}}while(0);if((p|0)==11717){do{if(i!=l&i!=n){g=m+(i-l)*((j-m)/(n-l));if(kA){break}}else{if(gk){break}}h[d>>3]=i;h[e>>3]=g;o=1;return o|0}}while(0);i=+h[64672+(b*688&-1)>>3];if(f){C=i;p=11723}else{D=i;p=11724}}if((p|0)==11724){if(Dl){break}else{E=D}}else if((p|0)==11723){if(Cn){break}else{E=C}}if(!(E!=l&E!=n)){break}i=m+(E-l)*((j-m)/(n-l));if(kA){break}}else{if(ik){break}}h[d>>3]=E;h[e>>3]=i;o=2;return o|0}}while(0);h[d>>3]=l;h[e>>3]=m;o=0;return o|0}function gc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0.0,i=0.0,j=0.0,k=0.0,l=0,m=0,n=0.0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0;f=b-1|0;g=+h[a+(f<<6)+8>>3];i=+h[a+(f<<6)+16>>3];j=+h[a+(b<<6)+8>>3];k=+h[a+(b<<6)+16>>3];b=g==-8.988465674311579e+307;a=j==-8.988465674311579e+307;f=i==-8.988465674311579e+307;l=k==-8.988465674311579e+307;if((((a?b?2:1:b&1)+(f&1)|0)+(l&1)|0)>1){m=0;return m|0}if(a|b){n=b?k:i;a=c[200]|0;o=64672+(a*688&-1)|0;p=+h[o>>3];q=+h[64664+(a*688&-1)>>3];if((b?j:g)<=(p>q?p:q)){m=0;return m|0}b=c[144]|0;p=+h[64664+(b*688&-1)>>3];r=+h[64672+(b*688&-1)>>3];do{if(pr){m=0}else{break}return m|0}else{if(np){m=0}else{break}return m|0}}while(0);h[d>>3]=q;h[e>>3]=n;h[d+8>>3]=+h[o>>3];h[e+8>>3]=n;m=1;return m|0}if(l|f){n=f?j:g;l=c[144]|0;o=64664+(l*688&-1)|0;q=+h[o>>3];b=64672+(l*688&-1)|0;p=+h[b>>3];if((f?k:i)<=(q>p?q:p)){m=0;return m|0}f=c[200]|0;p=+h[64664+(f*688&-1)>>3];q=+h[64672+(f*688&-1)>>3];do{if(pq){m=0}else{break}return m|0}else{if(np){m=0}else{break}return m|0}}while(0);h[d>>3]=n;h[e>>3]=+h[o>>3];h[d+8>>3]=n;h[e+8>>3]=+h[b>>3];m=1;return m|0}b=g==j;o=i==k;if(b&o){m=0;return m|0}if(b){b=c[200]|0;n=+h[64664+(b*688&-1)>>3];p=+h[64672+(b*688&-1)>>3];do{if(np){m=0}else{break}return m|0}else{if(gn){m=0}else{break}return m|0}}while(0);b=c[144]|0;f=64664+(b*688&-1)|0;n=+h[f>>3];do{if(ik){m=0}else{break}return m|0}else{if(ni){m=0}else{break}return m|0}}while(0);h[d>>3]=g;h[e>>3]=+h[f>>3];h[d+8>>3]=g;h[e+8>>3]=+h[64672+(b*688&-1)>>3];m=1;return m|0}if(o){o=c[144]|0;n=+h[64664+(o*688&-1)>>3];p=+h[64672+(o*688&-1)>>3];do{if(np){m=0}else{break}return m|0}else{if(in){m=0}else{break}return m|0}}while(0);o=c[200]|0;n=+h[64664+(o*688&-1)>>3];do{if(gj){m=0}else{break}return m|0}else{if(ng){m=0}else{break}return m|0}}while(0);h[d>>3]=n;h[e>>3]=i;h[d+8>>3]=+h[64672+(o*688&-1)>>3];h[e+8>>3]=i;m=1;return m|0}else{o=c[200]|0;b=64664+(o*688&-1)|0;n=j-g;j=(+h[b>>3]-g)/n;f=64672+(o*688&-1)|0;p=(+h[f>>3]-g)/n;o=j>p;q=o?j:p;r=o?p:j;o=c[144]|0;l=64664+(o*688&-1)|0;j=k-i;k=(+h[l>>3]-i)/j;a=64672+(o*688&-1)|0;p=(+h[a>>3]-i)/j;o=k>p;s=o?k:p;t=o?p:k;k=r>t?r:t;t=k>0.0?k:0.0;k=qs){m=0;return m|0}h[d>>3]=g+n*t;h[e>>3]=i+j*t;h[d+8>>3]=g+n*s;h[e+8>>3]=i+j*s;s=+h[b>>3];j=+h[f>>3];i=(j-s)*1.0e-5;n=s-i;s=j+i;i=+h[d>>3];if(ns)){u=11778}}else{if(!(in)){u=11778}}do{if((u|0)==11778){n=+h[l>>3];i=+h[a>>3];s=(i-n)*1.0e-5;j=n-s;n=i+s;s=+h[e>>3];if(jn){break}else{m=1}return m|0}else{if(sj){break}else{m=1}return m|0}}}while(0);m=0;return m|0}return 0}function gd(a,b,d,e,f){a=a|0;b=b|0;d=+d;e=+e;f=+f;var g=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0.0;g=i;i=i+24|0;j=g|0;k=g+8|0;l=g+16|0;m=c[3524]|0;n=c[200]|0;c[j>>2]=~~(+(c[64768+(n*688&-1)>>2]|0)+(d- +h[64664+(n*688&-1)>>3])*+h[64776+(n*688&-1)>>3]+.5);n=c[144]|0;d=+(c[64768+(n*688&-1)>>2]|0);o=+h[64664+(n*688&-1)>>3];p=+h[64776+(n*688&-1)>>3];c[k>>2]=~~(d+(e-o)*p+.5);c[l>>2]=~~(d+(f-o)*p+.5);if((fl(j,k,j,l)|0)==0){i=g;return}n=c[j>>2]|0;cN[c[m+56>>2]&255](n,c[k>>2]|0);k=c[l>>2]|0;cN[c[m+60>>2]&255](n,k);c[a>>2]=n;c[b>>2]=k;i=g;return}function ge(a,b,d,e,f){a=a|0;b=b|0;d=+d;e=+e;f=+f;var g=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0.0,q=0.0;g=i;i=i+24|0;j=g|0;k=g+8|0;l=g+16|0;m=c[3524]|0;n=c[200]|0;o=+(c[64768+(n*688&-1)>>2]|0);p=+h[64664+(n*688&-1)>>3];q=+h[64776+(n*688&-1)>>3];c[j>>2]=~~(o+(d-p)*q+.5);c[k>>2]=~~(o+(e-p)*q+.5);n=c[144]|0;c[l>>2]=~~(+(c[64768+(n*688&-1)>>2]|0)+(f- +h[64664+(n*688&-1)>>3])*+h[64776+(n*688&-1)>>3]+.5);if((fl(j,l,k,l)|0)==0){i=g;return}n=c[l>>2]|0;cN[c[m+56>>2]&255](c[j>>2]|0,n);j=c[k>>2]|0;cN[c[m+60>>2]&255](j,n);c[a>>2]=j;c[b>>2]=n;i=g;return}function gf(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0,o=0.0,p=0.0,q=0.0,r=0.0;f=b-1|0;g=+h[a+(f<<6)+8>>3];i=+h[a+(f<<6)+16>>3];j=+h[a+(b<<6)+8>>3];k=+h[a+(b<<6)+16>>3];if((c[a+(b<<6)>>2]|0)==0){b=c[200]|0;a=64664+(b*688&-1)|0;l=+h[a>>3];f=64672+(b*688&-1)|0;m=+h[f>>3];if(lm){n=11829}else{n=11821}}else{if(gl){n=11829}else{n=11821}}if((n|0)==11829){h[e>>3]=k;l=+h[a>>3];m=+h[f>>3];do{if(lm){o=m;break}if(j>=l){o=j;break}o=l}else{if(j>l){o=l;break}if(j>=m){o=j;break}o=m}}while(0);h[d>>3]=o;return}else if((n|0)==11821){h[d>>3]=g;f=c[144]|0;o=+h[64664+(f*688&-1)>>3];m=+h[64672+(f*688&-1)>>3];do{if(om){p=m;break}if(i>=o){p=i;break}p=o}else{if(i>o){p=o;break}if(i>=m){p=i;break}p=m}}while(0);h[e>>3]=p;return}}else{f=c[144]|0;a=64664+(f*688&-1)|0;p=+h[a>>3];b=64672+(f*688&-1)|0;m=+h[b>>3];if(pm){n=11848}else{n=11840}}else{if(kp){n=11848}else{n=11840}}if((n|0)==11840){h[e>>3]=k;f=c[200]|0;p=+h[64664+(f*688&-1)>>3];m=+h[64672+(f*688&-1)>>3];do{if(pm){q=m;break}if(j>=p){q=j;break}q=p}else{if(j>p){q=p;break}if(j>=m){q=j;break}q=m}}while(0);h[d>>3]=q;return}else if((n|0)==11848){h[d>>3]=g;g=+h[a>>3];q=+h[b>>3];do{if(gq){r=q;break}if(k>=g){r=k;break}r=g}else{if(k>g){r=g;break}if(k>=q){r=k;break}r=q}}while(0);h[e>>3]=r;return}}}function gg(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0,o=0.0,p=0.0,q=0.0,r=0.0;f=b-1|0;g=+h[a+(f<<6)+8>>3];i=+h[a+(f<<6)+16>>3];j=+h[a+(b<<6)+8>>3];k=+h[a+(b<<6)+16>>3];if((c[a+(b<<6)>>2]|0)==0){b=c[144]|0;a=64664+(b*688&-1)|0;l=+h[a>>3];f=64672+(b*688&-1)|0;m=+h[f>>3];if(lm){n=11873}else{n=11865}}else{if(il){n=11873}else{n=11865}}if((n|0)==11865){h[e>>3]=i;b=c[200]|0;l=+h[64664+(b*688&-1)>>3];m=+h[64672+(b*688&-1)>>3];do{if(lm){o=m;break}if(g>=l){o=g;break}o=l}else{if(g>l){o=l;break}if(g>=m){o=g;break}o=m}}while(0);h[d>>3]=o;return}else if((n|0)==11873){h[d>>3]=j;o=+h[a>>3];m=+h[f>>3];do{if(om){p=m;break}if(i>=o){p=i;break}p=o}else{if(i>o){p=o;break}if(i>=m){p=i;break}p=m}}while(0);h[e>>3]=p;return}}else{f=c[200]|0;a=64664+(f*688&-1)|0;p=+h[a>>3];b=64672+(f*688&-1)|0;m=+h[b>>3];if(pm){n=11892}else{n=11884}}else{if(jp){n=11892}else{n=11884}}if((n|0)==11892){h[e>>3]=i;i=+h[a>>3];p=+h[b>>3];do{if(ip){q=p;break}if(j>=i){q=j;break}q=i}else{if(j>i){q=i;break}if(j>=p){q=j;break}q=p}}while(0);h[d>>3]=q;return}else if((n|0)==11884){h[d>>3]=j;d=c[144]|0;j=+h[64664+(d*688&-1)>>3];q=+h[64672+(d*688&-1)>>3];do{if(jq){r=q;break}if(k>=j){r=k;break}r=j}else{if(k>j){r=j;break}if(k>=q){r=k;break}r=q}}while(0);h[e>>3]=r;return}}}function gh(b,d,e,f,g,j,k,l,m){b=+b;d=+d;e=+e;f=+f;g=+g;j=+j;k=+k;l=+l;m=m|0;var n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0,C=0.0,D=0.0,E=0.0,F=0.0,G=0,H=0,I=0.0,J=0.0,K=0,L=0,M=0.0;n=i;i=i+224|0;o=n|0;p=n+96|0;q=c[m+304>>2]|0;r=+h[64664+(q*688&-1)>>3];s=+h[64672+(q*688&-1)>>3];t=rs?r:s;do{if(tb|ug|ub|tg|tb){r=t-b;v=t;w=(k-e)*r/s+e;x=(l-f)*r/s+f}else{v=b;w=e;x=f}if(u>2]|0;k=+h[64664+(B*688&-1)>>3];g=+h[64672+(B*688&-1)>>3];s=kg?k:g;if(wf&x>f&z>f&A>f){i=n;return}B=c[200]|0;g=+(c[64768+(B*688&-1)>>2]|0);k=+h[64664+(B*688&-1)>>3];u=+h[64776+(B*688&-1)>>3];e=+(~~(g+(v-k)*u+.5)|0);h[p>>3]=e;B=c[144]|0;b=+(c[64768+(B*688&-1)>>2]|0);r=+h[64664+(B*688&-1)>>3];t=+h[64776+(B*688&-1)>>3];C=+(~~(b+(w-r)*t+.5)|0);h[p+8>>3]=C;D=+(~~(g+((q?v:d)-k)*u+.5)|0);h[p+16>>3]=D;d=+(~~(b+(x-r)*t+.5)|0);h[p+24>>3]=d;E=s-x;F=s-A;if(E!=F&E*F<0.0){h[p+40>>3]=+(~~(b+(s-r)*t+.5)|0);h[p+32>>3]=+(~~(g+(v+l*E/(E-F)-k)*u+.5)|0);G=3}else{G=2}F=f-x;E=f-A;if(F!=E&F*E<0.0){h[p+(G<<4)+8>>3]=+(~~(b+(f-r)*t+.5)|0);h[p+(G<<4)>>3]=+(~~(g+(v+l*F/(F-E)-k)*u+.5)|0);H=G+1|0}else{H=G}E=+(~~(g+((q?y:j)-k)*u+.5)|0);h[p+(H<<4)>>3]=E;j=+(~~(b+(A-r)*t+.5)|0);G=H+1|0;h[p+(H<<4)+8>>3]=j;F=+(~~(g+(y-k)*u+.5)|0);h[p+(G<<4)>>3]=F;y=+(~~(b+(z-r)*t+.5)|0);B=H+2|0;h[p+(G<<4)+8>>3]=y;I=s-w;J=s-z;if(I!=J&I*J<0.0){h[p+(B<<4)+8>>3]=+(~~(b+(s-r)*t+.5)|0);h[p+(B<<4)>>3]=+(~~(g+(v+l*I/(I-J)-k)*u+.5)|0);K=H+3|0}else{K=B}J=f-w;I=f-z;if(J!=I&J*I<0.0){h[p+(K<<4)+8>>3]=+(~~(b+(f-r)*t+.5)|0);h[p+(K<<4)>>3]=+(~~(g+(v+l*J/(J-I)-k)*u+.5)|0);L=K+1|0}else{L=K}if((L|0)>0){K=~~(b+(s-r)*t+.5);B=~~(b+(f-r)*t+.5);H=(K|0)<(B|0);f=+(B|0);s=+(K|0);K=0;do{c[o+(K*12&-1)>>2]=~~+h[p+(K<<4)>>3];B=p+(K<<4)+8|0;I=+h[B>>3];do{if(H){if(I>f){h[B>>3]=f;M=f;break}if(I>=s){M=I;break}h[B>>3]=s;M=s}else{if(I>s){h[B>>3]=s;M=s;break}if(I>=f){M=I;break}h[B>>3]=f;M=f}}while(0);c[o+(K*12&-1)+4>>2]=~~M;K=K+1|0;}while((K|0)<(L|0))}if(q){c[o+(L*12&-1)>>2]=x-w+(A-z)<0.0&1}else{z=+(~~(g+(0.0-k)*u+.5)|0);u=+(~~(b+(0.0-r)*t+.5)|0);t=e-z;e=C-u;C=D-z;D=d-u;d=F-z;F=y-u;y=E-z;z=j-u;c[o+(L*12&-1)>>2]=C*C+D*D-(t*t+e*e)+(y*y+z*z-(d*d+F*F))<0.0&1}gj(L,o|0,m);i=n;return}function gi(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0,k=0.0,l=0.0,m=0.0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0;i=e|d;if((i|0)==12){j=(g&1|0)!=0;g=c[200]|0;if(j){k=+h[64664+(g*688&-1)>>3];l=(k-k)*+h[64776+(g*688&-1)>>3]}else{l=(+h[64672+(g*688&-1)>>3]- +h[64664+(g*688&-1)>>3])*+h[64776+(g*688&-1)>>3]}c[a+((c[b>>2]|0)*12&-1)>>2]=~~(+(c[64768+(g*688&-1)>>2]|0)+l+.5);g=c[144]|0;if((d&8|0)==0){l=+h[64664+(g*688&-1)>>3];m=(l-l)*+h[64776+(g*688&-1)>>3]}else{m=(+h[64672+(g*688&-1)>>3]- +h[64664+(g*688&-1)>>3])*+h[64776+(g*688&-1)>>3]}n=~~(+(c[64768+(g*688&-1)>>2]|0)+m+.5);g=c[b>>2]|0;c[b>>2]=g+1;c[a+(g*12&-1)+4>>2]=n;n=c[200]|0;if(j){m=+h[64664+(n*688&-1)>>3];o=(m-m)*+h[64776+(n*688&-1)>>3]}else{o=(+h[64672+(n*688&-1)>>3]- +h[64664+(n*688&-1)>>3])*+h[64776+(n*688&-1)>>3]}c[a+((c[b>>2]|0)*12&-1)>>2]=~~(+(c[64768+(n*688&-1)>>2]|0)+o+.5);n=c[144]|0;if((e&8|0)==0){o=+h[64664+(n*688&-1)>>3];p=(o-o)*+h[64776+(n*688&-1)>>3]}else{p=(+h[64672+(n*688&-1)>>3]- +h[64664+(n*688&-1)>>3])*+h[64776+(n*688&-1)>>3]}j=~~(+(c[64768+(n*688&-1)>>2]|0)+p+.5);n=c[b>>2]|0;c[b>>2]=n+1;c[a+(n*12&-1)+4>>2]=j;return}else if((i|0)==3){j=c[200]|0;if((d&1|0)==0){q=(+h[64672+(j*688&-1)>>3]- +h[64664+(j*688&-1)>>3])*+h[64776+(j*688&-1)>>3]}else{p=+h[64664+(j*688&-1)>>3];q=(p-p)*+h[64776+(j*688&-1)>>3]}c[a+((c[b>>2]|0)*12&-1)>>2]=~~(+(c[64768+(j*688&-1)>>2]|0)+q+.5);j=(f&8|0)!=0;f=c[144]|0;if(j){r=(+h[64672+(f*688&-1)>>3]- +h[64664+(f*688&-1)>>3])*+h[64776+(f*688&-1)>>3]}else{q=+h[64664+(f*688&-1)>>3];r=(q-q)*+h[64776+(f*688&-1)>>3]}d=~~(+(c[64768+(f*688&-1)>>2]|0)+r+.5);f=c[b>>2]|0;c[b>>2]=f+1;c[a+(f*12&-1)+4>>2]=d;d=c[200]|0;if((e&1|0)==0){s=(+h[64672+(d*688&-1)>>3]- +h[64664+(d*688&-1)>>3])*+h[64776+(d*688&-1)>>3]}else{r=+h[64664+(d*688&-1)>>3];s=(r-r)*+h[64776+(d*688&-1)>>3]}c[a+((c[b>>2]|0)*12&-1)>>2]=~~(+(c[64768+(d*688&-1)>>2]|0)+s+.5);d=c[144]|0;if(j){t=(+h[64672+(d*688&-1)>>3]- +h[64664+(d*688&-1)>>3])*+h[64776+(d*688&-1)>>3]}else{s=+h[64664+(d*688&-1)>>3];t=(s-s)*+h[64776+(d*688&-1)>>3]}j=~~(+(c[64768+(d*688&-1)>>2]|0)+t+.5);d=c[b>>2]|0;c[b>>2]=d+1;c[a+(d*12&-1)+4>>2]=j;return}else{j=c[200]|0;if((i&1|0)==0){u=(+h[64672+(j*688&-1)>>3]- +h[64664+(j*688&-1)>>3])*+h[64776+(j*688&-1)>>3]}else{t=+h[64664+(j*688&-1)>>3];u=(t-t)*+h[64776+(j*688&-1)>>3]}c[a+((c[b>>2]|0)*12&-1)>>2]=~~(+(c[64768+(j*688&-1)>>2]|0)+u+.5);j=c[144]|0;if((i&8|0)==0){u=+h[64664+(j*688&-1)>>3];v=(u-u)*+h[64776+(j*688&-1)>>3]}else{v=(+h[64672+(j*688&-1)>>3]- +h[64664+(j*688&-1)>>3])*+h[64776+(j*688&-1)>>3]}i=~~(+(c[64768+(j*688&-1)>>2]|0)+v+.5);j=c[b>>2]|0;c[b>>2]=j+1;c[a+(j*12&-1)+4>>2]=i;return}}function gj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;if((a|0)<1){return}e=c[d+244>>2]|0;do{if((e|0)==9){f=c[200]|0;c[b+(a*12&-1)>>2]=~~(+(c[64768+(f*688&-1)>>2]|0)+(+h[d+248>>3]- +h[64664+(f*688&-1)>>3])*+h[64776+(f*688&-1)>>3]+.5);f=c[144]|0;c[b+(a*12&-1)+4>>2]=~~(+(c[64768+(f*688&-1)>>2]|0)+(+h[d+256>>3]- +h[64664+(f*688&-1)>>3])*+h[64776+(f*688&-1)>>3]+.5);g=a+1|0}else if((e|0)==1){c[b+(a*12&-1)>>2]=c[b+((a-1|0)*12&-1)>>2];f=a+1|0;c[b+(f*12&-1)>>2]=c[b>>2];i=c[16364]|0;c[b+(f*12&-1)+4>>2]=i;c[b+(a*12&-1)+4>>2]=i;g=a+2|0}else if((e|0)==4){c[b+(a*12&-1)+4>>2]=c[b+((a-1|0)*12&-1)+4>>2];i=a+1|0;c[b+(i*12&-1)+4>>2]=c[b+4>>2];f=c[16537]|0;c[b+(i*12&-1)>>2]=f;c[b+(a*12&-1)>>2]=f;g=a+2|0}else if((e|0)==5|(e|0)==7){f=c[200]|0;i=~~(+(c[64768+(f*688&-1)>>2]|0)+(+h[d+248>>3]- +h[64664+(f*688&-1)>>3])*+h[64776+(f*688&-1)>>3]+.5);f=a+1|0;c[b+(f*12&-1)>>2]=i;c[b+(a*12&-1)>>2]=i;c[b+(a*12&-1)+4>>2]=c[b+((a-1|0)*12&-1)+4>>2];c[b+(f*12&-1)+4>>2]=c[b+4>>2];if((a|0)>0){f=0;j=0;while(1){k=((c[b+(j*12&-1)>>2]|0)+f|0)-i|0;l=j+1|0;if((l|0)<(a|0)){f=k;j=l}else{m=k;break}}}else{m=0}n=a+2|0;o=m;p=12004}else if((e|0)==3){c[b+(a*12&-1)>>2]=c[b+((a-1|0)*12&-1)>>2];j=a+1|0;c[b+(j*12&-1)>>2]=c[b>>2];f=c[16365]|0;c[b+(j*12&-1)+4>>2]=f;c[b+(a*12&-1)+4>>2]=f;g=a+2|0}else if((e|0)==6|(e|0)==8){f=c[144]|0;j=~~(+(c[64768+(f*688&-1)>>2]|0)+(+h[d+248>>3]- +h[64664+(f*688&-1)>>3])*+h[64776+(f*688&-1)>>3]+.5);f=a+1|0;c[b+(f*12&-1)+4>>2]=j;c[b+(a*12&-1)+4>>2]=j;c[b+(a*12&-1)>>2]=c[b+((a-1|0)*12&-1)>>2];c[b+(f*12&-1)>>2]=c[b>>2];if((a|0)>0){f=0;i=0;while(1){k=((c[b+(i*12&-1)+4>>2]|0)+f|0)-j|0;l=i+1|0;if((l|0)<(a|0)){f=k;i=l}else{q=k;break}}}else{q=0}n=a+2|0;o=q;p=12004}else if((e|0)==2){c[b+(a*12&-1)+4>>2]=c[b+((a-1|0)*12&-1)+4>>2];i=a+1|0;c[b+(i*12&-1)+4>>2]=c[b+4>>2];f=c[16536]|0;c[b+(i*12&-1)>>2]=f;c[b+(a*12&-1)>>2]=f;g=a+2|0}else if((e|0)==10|(e|0)==13){f=(c[b+(a*12&-1)>>2]|0)>0?1:-1;if((c[d+192>>2]|0)!=4){n=a;o=f;p=12004;break}i=b+24|0;j=c[i>>2]|0;k=(j|0)<(c[b>>2]|0)?-1:1;if((a|0)<=3){n=a;o=f;p=12004;break}l=b+36|0;r=c[l>>2]|0;if((j|0)==(r|0)){s=j-k|0;c[i>>2]=s;c[l>>2]=s;n=a;o=f;p=12004;break}if((a|0)<=4){n=a;o=f;p=12004;break}s=b+48|0;if((r|0)!=(c[s>>2]|0)){n=a;o=f;p=12004;break}i=r-k|0;c[l>>2]=i;c[s>>2]=i;n=a;o=f;p=12004}else{g=a}}while(0);do{if((p|0)==12004){a=c[d+264>>2]|0;if((a|0)>0&(o|0)<0){return}if(!((a|0)<0&(o|0)>0)){g=n;break}return}}while(0);n=c[d+192>>2]|0;if((n|0)==1|(n|0)==4){t=(c[d+196>>2]<<4&65520)+n|0}else if((n|0)==2|(n|0)==5){t=(c[d+200>>2]<<4&65520)+n|0}else{t=0}c[b+8>>2]=t;cN[c[(c[3524]|0)+148>>2]&255](g,b);return}function gk(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;b=c[8978]|0;if((b|0)==0){return}if((c[8982]|0)>0){d=0;e=b;while(1){uu(c[e+(d<<4)>>2]|0);f=c[8978]|0;do{if((a[f+(d<<4)+12|0]&1)==0){g=f}else{h=c[f+(d<<4)+8>>2]|0;if((h|0)==0){g=f;break}else{i=h}while(1){uu(c[i>>2]|0);h=c[i+4>>2]|0;uu(i);if((h|0)==0){break}else{i=h}}g=c[8978]|0}}while(0);f=d+1|0;if((f|0)<(c[8982]|0)){d=f;e=g}else{j=g;break}}}else{j=b}uu(j);c[8978]=0;c[8982]=0;return}function gl(a,b){a=a|0;b=b|0;return aY(c[a>>2]|0,c[b>>2]|0)|0}function gm(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0;f=i;i=i+2048|0;g=f|0;h=f+1024|0;c[b0()>>2]=0;if((a_(39e3,d|0,1024)|0)!=0){gk()}do{if((c[8978]|0)==0){j=h|0;k=bF(d|0,193632)|0;c[9748]=k;if((k|0)==0){l=-1;i=f;return l|0}n=(a6(j|0,1023,k|0)|0)!=0;if(!(n&(a[j]|0)==63)){l=-1;i=f;return l|0}L16406:do{if((cj(c[9748]|0)|0)==0){n=h+1|0;k=1;p=0;q=0;L16408:while(1){if((a[j]|0)==63){a[h+(uA(n|0)|0)|0]=0;r=ut(20)|0;if((r|0)==0){gk();s=ut(20)|0;if((s|0)==0){t=12038;break}else{u=s}}else{u=r}r=u;c[u>>2]=bP(n|0)|0;c[u+16>>2]=c[8980];c[8980]=r;c[8982]=(c[8982]|0)+1;a[u+12|0]=k;c[u+8>>2]=0;c[u+4>>2]=0;s=bc(c[9748]|0)|0;if((a6(j|0,1023,c[9748]|0)|0)==0){x=s;y=r}else{k=0;p=s;q=r;continue}}else{x=p;y=q}r=ut(8)|0;if((r|0)==0){gk();s=ut(8)|0;if((s|0)==0){t=12042;break}else{z=s}}else{z=r}r=z;c[z>>2]=bP(j|0)|0;c[z+4>>2]=0;s=(a6(j|0,1023,c[9748]|0)|0)==0;if(s|(a[j]|0)==63){A=y}else{s=r;while(1){B=ut(8)|0;if((B|0)==0){gk();C=ut(8)|0;if((C|0)==0){t=12046;break L16408}else{D=C}}else{D=B}B=D;c[D>>2]=bP(j|0)|0;c[D+4>>2]=0;c[s+4>>2]=B;C=(a6(j|0,1023,c[9748]|0)|0)==0;if(C|(a[j]|0)==63){A=y;break}else{s=B}}}while(1){c[A+4>>2]=x;c[A+8>>2]=r;E=c[A+16>>2]|0;if((a[A+12|0]&1)!=0|(E|0)==0){break}else{A=E}}if((cj(c[9748]|0)|0)==0){k=1;p=x;q=E}else{break L16406}}if((t|0)==12038){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=197768,v)|0);return 0}else if((t|0)==12042){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=202984,v)|0);return 0}else if((t|0)==12046){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=202984,v)|0);return 0}}}while(0);j=c[9748]|0;az(j|0);j=(c[8982]<<4)+16|0;q=ut(j)|0;do{if((q|0)==0){gk();p=ut(j)|0;if((p|0)!=0){F=p;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=206864,v)|0);return 0}else{F=q}}while(0);q=F;c[8978]=q;j=c[8980]|0;if((j|0)==0){G=q}else{p=j;j=0;k=q;while(1){c[k+(j<<4)>>2]=c[p>>2];c[(c[8978]|0)+(j<<4)+4>>2]=c[p+4>>2];c[(c[8978]|0)+(j<<4)+8>>2]=c[p+8>>2];a[(c[8978]|0)+(j<<4)+12|0]=a[p+12|0]&1;q=c[p+16>>2]|0;uu(p);if((q|0)==0){break}p=q;j=j+1|0;k=c[8978]|0}G=c[8978]|0}c[G+(c[8982]<<4)>>2]=0;c[(c[8978]|0)+(c[8982]<<4)+4>>2]=0;c[(c[8978]|0)+(c[8982]<<4)+8>>2]=0;bM(c[8978]|0,c[8982]|0,16,32);uF(39e3,d|0,1024);if((uA(d|0)|0)>>>0<1024){break}a[40023]=0}}while(0);d=c[8978]|0;G=d|0;F=c[G>>2]|0;if((F|0)==0){l=1;i=f;return l|0}E=bk(b|0,73808)|0;x=d;d=G;G=F;L16448:while(1){if((a_(b|0,G|0,E|0)|0)==0){do{if((a[G+E|0]|0)==0){H=G}else{F=x+16|0;A=F|0;y=c[A>>2]|0;if((y|0)==0){H=G;break}else{I=G;J=0;K=F;L=A;M=y}L16454:while(1){y=I+E|0;A=K;F=L;D=M;while(1){if((a_(G|0,D|0,E|0)|0)!=0){break L16454}if((a_(D|0,I|0,(bk(y|0,73808)|0)+E|0)|0)!=0){break}z=A+16|0;u=z|0;k=c[u>>2]|0;if((k|0)==0){break L16454}else{A=z;F=u;D=k}}if(J){N=D}else{y=c[m>>2]|0;cf(y|0,72704,(v=i,i=i+16|0,c[v>>2]=E,c[v+8>>2]=G,v)|0);y=c[m>>2]|0;cf(y|0,123448,(v=i,i=i+8|0,c[v>>2]=I,v)|0);N=c[F>>2]|0}cf(c[m>>2]|0,123448,(v=i,i=i+8|0,c[v>>2]=N,v)|0);y=A+16|0;k=y|0;u=c[k>>2]|0;if((u|0)==0){O=45032;break L16448}else{I=c[F>>2]|0;J=1;K=y;L=k;M=u}}if(J){O=45032;break L16448}H=c[d>>2]|0}}while(0);u=uA(H|0)|0;if((u|0)==(E|0)){P=E}else{k=u-E|0;y=(uA(b|0)|0)+k|0;if(y>>>0>>0){Q=H}else{z=y;do{a[b+z|0]=a[b+(z-k|0)|0]|0;z=z-1|0;}while(z>>>0>=E>>>0);Q=c[d>>2]|0}uF(b|0,Q|0,u|0);P=u}if((a[b+P|0]|0)!=32){t=12080;break}z=P+1|0;R=x-16|0;S=(bk(b+z|0,73808)|0)+z|0}else{R=x;S=E}z=R+16|0;k=z|0;y=c[k>>2]|0;if((y|0)==0){l=1;t=12159;break}else{E=S;x=z;d=k;G=y}}if((t|0)==12159){i=f;return l|0}do{if((t|0)==12080){if((x|0)==0){l=1}else{O=x;break}i=f;return l|0}}while(0);x=O+8|0;if((c[x>>2]|0)==0){l=0;i=f;return l|0}gq();G=(e|0)==0;if(G){t=12084}else{if((a[e]&1)==0){t=12084}}do{if((t|0)==12084){d=c[x>>2]|0;if((d|0)==0){break}else{T=d}do{d=c[T>>2]|0;S=c[8250]|0;if((S|0)==(c[m>>2]|0)){if((c[8238]|0)<((c[6318]|0)-2|0)){U=S}else{aI(125440,23,1,S|0);do{E=a1(c[o>>2]|0)|0}while(!((E|0)==(-1|0)|(E|0)==10));c[8238]=0;U=c[m>>2]|0}aK(d|0,U|0);c[8238]=(c[8238]|0)+1}else{aK(d|0,S|0)}T=c[T+4>>2]|0;}while((T|0)!=0)}}while(0);T=h|0;a[T]=0;U=O|0;x=c[U>>2]|0;u=uA(x|0)|0;E=O+16|0;R=c[E>>2]|0;do{if((R|0)==0){V=0}else{b=(u|0)==0;P=u+1|0;Q=O;H=0;J=0;M=0;L=E;K=R;I=x;L16505:while(1){N=(J|0)==0;y=Q;k=L;z=K;while(1){if((a_(z|0,I|0,u|0)|0)!=0){W=H;X=M;break L16505}j=z+u|0;if(b){if((a[y+28|0]&1)!=0){Y=j;t=12102}}else{if((a[j]|0)!=32){W=H;X=M;break L16505}Y=z+P|0;t=12102}if((t|0)==12102){t=0;if(N){break}if((a_(Y|0,J|0,bk(Y|0,73808)|0)|0)!=0){break}}j=k+16|0;p=c[j>>2]|0;if((p|0)==0){W=H;X=M;break L16505}else{y=k;k=j;z=p}}if((H|0)==0){if(b){uD(T|0,77784,25)}else{uD(T|0,94064,26);ck(T|0,I|0,996);z=h+(uA(T|0)|0)|0;a[z]=a[86832]|0;a[z+1|0]=a[86833|0]|0;a[z+2|0]=a[86834|0]|0}z=c[8250]|0;y=c[m>>2]|0;if((z|0)==(y|0)){if((c[8238]|0)<((c[6318]|0)-2|0)){Z=z}else{aI(125440,23,1,z|0);do{z=a1(c[o>>2]|0)|0}while(!((z|0)==(-1|0)|(z|0)==10));c[8238]=0;Z=c[m>>2]|0}aK(T|0,Z|0);c[8238]=(c[8238]|0)+1}else{aK(T|0,y|0)}a[T]=0;_=1}else{_=H}z=M+1|0;c[g+(M<<2)>>2]=Y;N=k+16|0;S=c[N>>2]|0;if((S|0)==0){W=_;X=z;break}Q=k;H=_;J=Y;M=z;L=N;K=S;I=c[U>>2]|0}if((X|0)>0){$=0;aa=0;ab=0}else{V=W;break}while(1){I=c[g+($<<2)>>2]|0;K=bk(I|0,73808)|0;L=(ab|0)==0?4:aa;if((L|0)>0){M=0;do{J=h+(uA(T|0)|0)|0;w=32;a[J]=w&255;w=w>>8;a[J+1|0]=w&255;M=M+1|0;}while((M|0)<(L|0))}ck(T|0,I|0,K|0);L=18-K|0;if((L|0)<1){M=((K-18|0)>>>0)/18>>>0;ac=(36-K|0)+(M*18&-1)|0;ad=(ab+1|0)+M|0}else{ac=L;ad=ab}L=ad+1|0;if((L|0)>3){M=h+(uA(T|0)|0)|0;w=10;a[M]=w&255;w=w>>8;a[M+1|0]=w&255;M=c[8250]|0;k=c[m>>2]|0;if((M|0)==(k|0)){if((c[8238]|0)<((c[6318]|0)-2|0)){ae=M}else{aI(125440,23,1,M|0);do{M=a1(c[o>>2]|0)|0}while(!((M|0)==(-1|0)|(M|0)==10));c[8238]=0;ae=c[m>>2]|0}aK(T|0,ae|0);c[8238]=(c[8238]|0)+1}else{aK(T|0,k|0)}a[T]=0;af=0}else{af=L}K=$+1|0;if((K|0)<(X|0)){$=K;aa=ac;ab=af}else{break}}if(!((W|0)>0&(af|0)>0)){V=W;break}K=h+(uA(T|0)|0)|0;w=10;a[K]=w&255;w=w>>8;a[K+1|0]=w&255;K=c[8250]|0;I=c[m>>2]|0;if((K|0)!=(I|0)){aK(T|0,I|0);V=W;break}if((c[8238]|0)<((c[6318]|0)-2|0)){ag=K}else{aI(125440,23,1,K|0);do{K=a1(c[o>>2]|0)|0}while(!((K|0)==(-1|0)|(K|0)==10));c[8238]=0;ag=c[m>>2]|0}aK(T|0,ag|0);c[8238]=(c[8238]|0)+1;V=W}}while(0);if(!G){a[e]=(V|0)!=0&1}V=c[8250]|0;e=c[m>>2]|0;if((V|0)==(e|0)){if((c[8238]|0)<((c[6318]|0)-2|0)){ah=V}else{aI(125440,23,1,V|0);do{V=a1(c[o>>2]|0)|0}while(!((V|0)==(-1|0)|(V|0)==10));c[8238]=0;ah=c[m>>2]|0}aF(10,ah|0);c[8238]=(c[8238]|0)+1}else{aF(10,e|0)}e=c[8250]|0;if((e|0)==(c[m>>2]|0)){l=0;i=f;return l|0}a2(e|0);l=0;i=f;return l|0}function gn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,g=0;d=c[11608]|0;e=c[228]|0;f=+h[e+((c[d+((c[a>>2]|0)*20&-1)+4>>2]|0)*48&-1)+16>>3]- +h[e+((c[d+((c[b>>2]|0)*20&-1)+4>>2]|0)*48&-1)+16>>3];if(f<-1.0e-5){g=-1;return g|0}g=f>1.0e-5&1;return g|0}function go(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0;d=c[7628]|0;e=+h[d+((c[a>>2]|0)*104&-1)+56>>3]- +h[d+((c[b>>2]|0)*104&-1)+56>>3];if(e<-1.0e-5){f=-1;return f|0}f=e>1.0e-5&1;return f|0}function gp(){var b=0,d=0,e=0;b=i;cf(c[m>>2]|0,125144,(v=i,i=i+8|0,c[v>>2]=(c[9744]|0)==0?150704:150856,v)|0);d=c[9734]|0;e=c[9738]|0;cf(c[m>>2]|0,93824,(v=i,i=i+24|0,c[v>>2]=c[9742],c[v+8>>2]=d,c[v+16>>2]=e,v)|0);e=c[9738]|0;if((e|0)==2){d=c[m>>2]|0;aI(77648,56,1,d|0)}else if((e|0)==1){aI(86680,65,1,c[m>>2]|0)}else if((e|0)==3){aI(72584,61,1,c[m>>2]|0)}else{aI(218160,60,1,c[m>>2]|0)}e=a[38960]|0?211688:179864;cf(c[m>>2]|0,212512,(v=i,i=i+16|0,c[v>>2]=a[38944]|0?211688:179864,c[v+8>>2]=e,v)|0);i=b;return}function gq(){var b=0,d=0,e=0,f=0,g=0;b=i;d=bU(75160)|0;do{if((d|0)!=0){if((a[d]|0)==0){break}if(!(a[14168]|0)){uf(-1,145320,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=bt(d|0,137896)|0;c[8250]=e;if((e|0)==0){break}i=b;return}}while(0);c[8250]=c[m>>2];d=bU(139752)|0;if((d|0)==0){f=12184}else{e=aE(d|0,0,0)|0;if((e|0)<3){f=12184}else{g=e}}if((f|0)==12184){g=24}c[6318]=g;c[8238]=0;i=b;return}function gr(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0.0,P=0.0,Q=0.0;b=i;i=i+72|0;d=b|0;e=b+24|0;f=b+48|0;g=c[13898]|0;j=c[8272]|0;if((g|0)>=(j|0)){i=b;return}k=e|0;l=e+8|0;m=d|0;n=d+8|0;o=f|0;p=f+8|0;q=g;g=j;L16625:while(1){r=c[1054]|0;j=(a[r+(q*40&-1)|0]&1)==0;s=c[r+(q*40&-1)+36>>2]|0;L16627:do{if(j){t=c[10036]|0;u=r+(q*40&-1)+32|0}else{w=r+(q*40&-1)+32|0;x=c[10036]|0;y=0;while(1){if((y|0)>=(s|0)){break}if((a[x+((c[w>>2]|0)+y|0)|0]|0)==(a[y+103664|0]|0)){y=y+1|0}else{t=x;u=w;break L16627}}if((y|0)==1){z=12257;break L16625}else{t=x;u=w}}}while(0);A=c[u>>2]|0;B=(s|0)>0;C=24304;D=153928;L16635:while(1){L16637:do{if(!j){if(B){E=0;F=0;G=A;while(1){H=a[D+E|0]|0;if(H<<24>>24==(a[t+(E+G|0)|0]|0)){I=G;J=F}else{if(H<<24>>24!=36){break L16637}I=G-1|0;J=1}K=E+1|0;if((K|0)<(J+s|0)){E=K;F=J;G=I}else{break}}if((J|0)==0){L=K}else{M=C;break L16635}}else{L=0}G=a[D+L|0]|0;if((G<<24>>24|0)==36|(G<<24>>24|0)==0){M=C;break L16635}}}while(0);w=C+8|0;x=c[w>>2]|0;if((x|0)==0){M=w;break}else{C=w;D=x}}D=c[M+4>>2]|0;if((D|0)==0){z=12247;break}else if((D|0)==1){z=12208;break}else if((D|0)==3){c[9742]=0;N=q}else if((D|0)==6){c[9738]=3;N=q}else if((D|0)==2){c[13898]=q+1;C=is(e)|0;s=c[C>>2]|0;if((s|0)==3){O=+uz(c[C+8>>2]|0,0)}else if((s|0)==2){O=+h[C+8>>3]}else if((s|0)==1){O=+(c[C+8>>2]|0)}else{z=12219;break}if((c[k>>2]|0)==3){uu(c[l>>2]|0);c[k>>2]=1}c[9742]=~~O;C=(c[13898]|0)-1|0;c[13898]=C;N=C}else if((D|0)==5){c[13898]=q+1;C=is(f)|0;s=c[C>>2]|0;if((s|0)==2){P=+h[C+8>>3]}else if((s|0)==1){P=+(c[C+8>>2]|0)}else if((s|0)==3){P=+uz(c[C+8>>2]|0,0)}else{z=12236;break}if((c[o>>2]|0)==3){uu(c[p>>2]|0);c[o>>2]=1}C=~~P;c[9738]=(C-1|0)>>>0>2?3:C;C=(c[13898]|0)-1|0;c[13898]=C;N=C}else if((D|0)==7){a[38944]=0;N=q}else if((D|0)==8){a[38944]=1;N=q}else if((D|0)==12){c[9744]=0;N=q}else if((D|0)==11){c[9744]=1;N=q}else if((D|0)==9){a[38960]=0;N=q}else if((D|0)==10){a[38960]=1;N=q}else if((D|0)==4){c[13898]=q+1;D=is(d)|0;C=c[D>>2]|0;if((C|0)==1){Q=+(c[D+8>>2]|0)}else if((C|0)==2){Q=+h[D+8>>3]}else if((C|0)==3){Q=+uz(c[D+8>>2]|0,0)}else{z=12228;break}if((c[m>>2]|0)==3){uu(c[n>>2]|0);c[m>>2]=1}c[9734]=~~Q;D=(c[13898]|0)-1|0;c[13898]=D;N=D}else{N=q}D=N+1|0;c[13898]=D;C=c[8272]|0;if((D|0)<(C|0)){q=D;g=C}else{z=12255;break}}if((z|0)==12257){i=b;return}else if((z|0)==12247){uf(q,139344,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==12208){c[9742]=1;c[9734]=3;c[9738]=1;a[38944]=0;a[38960]=0;c[9744]=0;N=q+1|0;c[13898]=N;if((N|0)>=(g|0)){i=b;return}if((a[r+(N*40&-1)|0]&1)==0){uf(N,170328,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=c[r+(N*40&-1)+36>>2]|0;q=r+(N*40&-1)+32|0;r=0;while(1){if((r|0)>=(g|0)){break}if((a[t+((c[q>>2]|0)+r|0)|0]|0)==(a[r+103664|0]|0)){r=r+1|0}else{z=12251;break}}if((z|0)==12251){uf(N,170328,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((r|0)==1){i=b;return}else{uf(N,170328,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}else if((z|0)==12255){i=b;return}else if((z|0)==12228){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==12219){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==12236){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}function gs(){var a=0,b=0,d=0,e=0,f=0,g=0;a=i;if((c[9738]|0)<1){c[9738]=3}c[228]=0;b=ut(4800)|0;do{if((b|0)==0){gk();d=ut(4800)|0;if((d|0)!=0){e=d;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=129728,v)|0)}else{e=b}}while(0);c[228]=e;c[224]=100;c[225]=0;c[226]=100;c[227]=48;c[11608]=0;e=ut(2e3)|0;do{if((e|0)==0){gk();b=ut(2e3)|0;if((b|0)!=0){f=b;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=129728,v)|0)}else{f=e}}while(0);c[11608]=f;c[11604]=100;c[11605]=0;c[11606]=100;c[11607]=20;c[7628]=0;f=ut(10400)|0;if((f|0)!=0){g=f;c[7628]=g;c[7624]=100;c[7625]=0;c[7626]=100;c[7627]=104;i=a;return}gk();f=ut(10400)|0;if((f|0)==0){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=129728,v)|0)}else{g=f;c[7628]=g;c[7624]=100;c[7625]=0;c[7626]=100;c[7627]=104;i=a;return}}function gt(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;e=i;i=i+8|0;f=e|0;if((c[7625]|0)==0){un(a,b,d,d+40|0);i=e;return}g=c[228]|0;if((g|0)==0){uk(132480,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}j=c[225]|0;k=c[224]|0;do{if((j|0)<(k|0)){l=j;m=g}else{n=(c[226]|0)+k|0;if((n|0)==0){uu(g);c[228]=0;c[224]=0;c[225]=0;l=0;m=0;break}else{o=db(g,aa(c[227]|0,n),150384)|0;c[228]=o;c[224]=n;l=c[225]|0;m=o;break}}}while(0);c[225]=l+1;g=m;m=g+(l*48&-1)|0;k=a;c[m>>2]=c[k>>2];c[m+4>>2]=c[k+4>>2];c[m+8>>2]=c[k+8>>2];c[m+12>>2]=c[k+12>>2];c[m+16>>2]=c[k+16>>2];c[m+20>>2]=c[k+20>>2];c[m+24>>2]=c[k+24>>2];c[m+28>>2]=c[k+28>>2];c[m+32>>2]=c[k+32>>2];c[m+36>>2]=c[k+36>>2];c[m+40>>2]=c[k+40>>2];c[m+44>>2]=c[k+44>>2];k=(b|0)!=0;m=g+(l*48&-1)+24|0;if(k){c[m>>2]=0;g=c[228]|0;if((g|0)==0){uk(132480,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}a=c[225]|0;j=c[224]|0;do{if((a|0)<(j|0)){p=a;q=g}else{o=(c[226]|0)+j|0;if((o|0)==0){uu(g);c[228]=0;c[224]=0;c[225]=0;p=0;q=0;break}else{n=db(g,aa(c[227]|0,o),150384)|0;c[228]=n;c[224]=o;p=c[225]|0;q=n;break}}}while(0);c[225]=p+1;g=q;q=g+(p*48&-1)|0;j=b;c[q>>2]=c[j>>2];c[q+4>>2]=c[j+4>>2];c[q+8>>2]=c[j+8>>2];c[q+12>>2]=c[j+12>>2];c[q+16>>2]=c[j+16>>2];c[q+20>>2]=c[j+20>>2];c[q+24>>2]=c[j+24>>2];c[q+28>>2]=c[j+28>>2];c[q+32>>2]=c[j+32>>2];c[q+36>>2]=c[j+36>>2];c[q+40>>2]=c[j+40>>2];c[q+44>>2]=c[j+44>>2];c[g+(p*48&-1)+24>>2]=0;r=p}else{c[m>>2]=d;r=l}m=c[d+4>>2]|0;p=c[11608]|0;if((p|0)==0){uk(132480,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=c[11605]|0;j=c[11604]|0;do{if((g|0)<(j|0)){s=p;t=g}else{q=(c[11606]|0)+j|0;if((q|0)==0){uu(p);c[11608]=0;c[11604]=0;c[11605]=0;s=0;t=0;break}else{b=db(p,aa(c[11607]|0,q),150384)|0;c[11608]=b;c[11604]=q;s=b;t=c[11605]|0;break}}}while(0);p=c[11607]|0;c[11605]=t+1;j=aa(p,t);t=s+j|0;p=c[228]|0;g=s+(j+8|0)|0;c[g>>2]=m;c[s+(j+12|0)>>2]=d;c[s+(j+16|0)>>2]=-1;m=t;do{if(+h[p+(l*48&-1)+16>>3]<+h[p+(r*48&-1)+16>>3]){c[m>>2]=r;c[s+(j+4|0)>>2]=l;if((c[d+8>>2]|0)!=-10){break}c[g>>2]=-11}else{c[m>>2]=l;c[s+(j+4|0)>>2]=r;if((c[d+8>>2]|0)!=-10){break}c[g>>2]=-10}}while(0);g=c[11608]|0;d=(t-g|0)/20&-1;c[f>>2]=c[8022];t=g;gu(d,c[t+(d*20&-1)>>2]|0,c[t+(d*20&-1)+4>>2]|0,f);if((c[11608]|0)==0){uk(119400,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=c[11605]|0;if((f|0)!=0){c[11605]=f-1}if((c[228]|0)==0){uk(119400,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=c[225]|0;if((f|0)==0){u=0}else{d=f-1|0;c[225]=d;u=d}if((u|0)==0|k^1){i=e;return}c[225]=u-1;i=e;return}function gu(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0,w=0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ab=0.0,ac=0.0,ad=0.0,ae=0.0,af=0.0,ag=0.0,ah=0.0,ai=0.0,aj=0.0,ak=0.0,al=0.0,am=0.0,an=0.0,ao=0.0,ap=0,aq=0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0.0,ay=0,az=0,aA=0,aB=0,aC=0,aD=0,aE=0;f=i;i=i+56|0;g=f|0;j=f+8|0;k=c[228]|0;l=k;m=l+(b*48&-1)|0;n=l+(d*48&-1)|0;o=+h[l+(b*48&-1)+16>>3]>+h[l+(d*48&-1)+16>>3];d=o?n:m;l=o?m:n;n=k;m=(l-n|0)/48&-1;o=(d-n|0)/48&-1;p=+h[d+16>>3];q=+h[l>>3];r=+h[d>>3];n=q>r;s=+h[l+8>>3];t=+h[d+8>>3];b=s>t;u=c[225]|0;w=c[e>>2]|0;do{if((w|0)>-1){x=j|0;y=p;z=b?s:t;A=b?t:s;B=n?q:r;C=n?r:q;D=d;E=l;F=o;G=m;H=w;L16789:while(1){I=c[7628]|0;J=I+(H*104&-1)|0;L16791:do{if(+h[I+(H*104&-1)+24>>3]>3]>B){K=G;L=F;M=E;N=D;O=C;P=B;Q=A;R=z;S=y;break}if(+h[I+(H*104&-1)+40>>3]>3]>z){K=G;L=F;M=E;N=D;O=C;P=B;Q=A;R=z;S=y;break}T=+h[I+(H*104&-1)+56>>3];if(T=p){K=G;L=F;M=E;N=D;O=C;P=B;Q=A;R=z;S=y;break}c[e>>2]=H;K=G;L=F;M=E;N=D;O=C;P=B;Q=A;R=z;S=y;break}U=c[J>>2]|0;V=c[11608]|0;W=c[V+(a*20&-1)>>2]|0;do{if((U|0)==(W|0)){X=12326}else{Y=c[I+(H*104&-1)+4>>2]|0;if((Y|0)==(W|0)){X=12326;break}Z=c[I+(H*104&-1)+8>>2]|0;if((Z|0)==(W|0)){X=12326}else{_=Y;$=Z}}}while(0);if((X|0)==12326){X=0;W=c[V+(a*20&-1)+4>>2]|0;if((U|0)==(W|0)){K=G;L=F;M=E;N=D;O=C;P=B;Q=A;R=z;S=y;break}Z=c[I+(H*104&-1)+4>>2]|0;if((Z|0)==(W|0)){K=G;L=F;M=E;N=D;O=C;P=B;Q=A;R=z;S=y;break}Y=c[I+(H*104&-1)+8>>2]|0;if((Y|0)==(W|0)){K=G;L=F;M=E;N=D;O=C;P=B;Q=A;R=z;S=y;break}else{_=Z;$=Y}}aa=c[228]|0;Y=aa;Z=E|0;T=+h[Z>>3];W=E+8|0;ab=+h[W>>3];ac=+h[E+16>>3];ad=+h[I+(H*104&-1)+64>>3];ae=+h[I+(H*104&-1)+72>>3];af=+h[I+(H*104&-1)+80>>3];ag=+h[I+(H*104&-1)+88>>3]+(T*ad+ab*ae+ac*af);if(ag==0.0){ah=0.0}else{ah=ag/(ad*(T- +h[D>>3])+ae*(ab- +h[D+8>>3])+af*(ac- +h[D+16>>3]))}ac=+h[Z>>3];af=+h[W>>3];ab=+h[Y+(U*48&-1)>>3];ae=+h[Y+(U*48&-1)+8>>3];T=+h[Y+(_*48&-1)>>3];ad=+h[Y+(_*48&-1)+8>>3];ag=T-ab;ai=ad-ae;aj=(af-ae)*ag-(ac-ab)*ai;if(aj==0.0){ak=0.0}else{ak=aj/(ai*(+h[D>>3]-ac)-ag*(+h[D+8>>3]-af))}af=+h[Z>>3];ag=+h[W>>3];ac=+h[Y+($*48&-1)>>3];ai=+h[Y+($*48&-1)+8>>3];aj=ac-T;al=ai-ad;am=(ag-ad)*aj-(af-T)*al;if(am==0.0){an=0.0}else{an=am/(al*(+h[D>>3]-af)-aj*(+h[D+8>>3]-ag))}ag=+h[Z>>3];aj=+h[W>>3];af=ab-ac;ab=ae-ai;ae=(aj-ai)*af-(ag-ac)*ab;if(ae==0.0){ao=0.0}else{ao=ae/(ab*(+h[D>>3]-ag)-af*(+h[D+8>>3]-aj))}h[x>>3]=0.0;if(ah>0.0&ah<1.0){h[j+8>>3]=ah;ap=2}else{ap=1}if(ak>0.0&ak<1.0){h[j+(ap<<3)>>3]=ak;aq=ap+1|0}else{aq=ap}if(an>0.0&an<1.0){h[j+(aq<<3)>>3]=an;ar=aq+1|0}else{ar=aq}if(ao>0.0&ao<1.0){h[j+(ar<<3)>>3]=ao;as=ar+1|0}else{as=ar}h[j+(as<<3)>>3]=1.0;L16832:do{if((as|0)>1){W=1;while(1){Z=W+1|0;Y=(Z|0)<(as|0);if(!Y){at=0;break L16832}au=j+(W<<3)|0;av=Z;do{aj=+h[au>>3];aw=j+(av<<3)|0;af=+h[aw>>3];if(aj>af){h[au>>3]=af;h[aw>>3]=aj}av=av+1|0;}while((av|0)<(as|0));if(Y){W=Z}else{at=0;break}}}else{at=0}}while(0);while(1){if((at|0)>=(as|0)){K=G;L=F;M=E;N=D;O=C;P=B;Q=A;R=z;S=y;break L16791}ax=+h[j+(at<<3)>>3];ay=gB(E,D,ax,J)|0;if((ay|0)==0){at=at+1|0}else{az=0;aA=at;break}}while(1){if((aA|0)>=(as|0)){break}U=aA+1|0;V=gB(E,D,+h[j+(U<<3)>>3],J)|0;if((V|0)==0){break}else{az=V;aA=U}}if((at|0)==(aA|0)){K=G;L=F;M=E;N=D;O=C;P=B;Q=A;R=z;S=y;break}if((ay|0)==2&(az|0)==2){K=G;L=F;M=E;N=D;O=C;P=B;Q=A;R=z;S=y;break}U=(aA|0)==(as|0);if((at|0)==0){if(U){break L16789}V=gC(G,F,+h[j+(aA<<3)>>3])|0;W=c[228]|0;av=W;au=av+(V*48&-1)|0;aw=av+(F*48&-1)|0;aB=+h[av+(V*48&-1)+16>>3]>+h[av+(F*48&-1)+16>>3];av=aB?aw:au;V=aB?au:aw;aw=W;aj=+h[V>>3];af=+h[av>>3];W=aj>af;ag=+h[V+8>>3];ab=+h[av+8>>3];au=ag>ab;K=(V-aw|0)/48&-1;L=(av-aw|0)/48&-1;M=V;N=av;O=W?af:aj;P=W?aj:af;Q=au?ab:ag;R=au?ag:ab;S=+h[av+16>>3];break}av=gC(G,F,ax)|0;if(U){U=c[228]|0;au=U;W=au+(G*48&-1)|0;V=au+(av*48&-1)|0;aw=+h[au+(G*48&-1)+16>>3]>+h[au+(av*48&-1)+16>>3];au=aw?V:W;aB=aw?W:V;V=U;ab=+h[aB>>3];ag=+h[au>>3];U=ab>ag;af=+h[aB+8>>3];aj=+h[au+8>>3];W=af>aj;K=(aB-V|0)/48&-1;L=(au-V|0)/48&-1;M=aB;N=au;O=U?ag:ab;P=U?ab:ag;Q=W?aj:af;R=W?af:aj;S=+h[au+16>>3];break}au=gC(G,F,+h[j+(aA<<3)>>3])|0;if((au|0)==(G|0)){K=G;L=F;M=E;N=D;O=C;P=B;Q=A;R=z;S=y;break}c[g>>2]=c[(c[7628]|0)+(H*104&-1)+100>>2];gu(a,au,F,g);au=c[228]|0;W=au;U=W+(G*48&-1)|0;aB=W+(av*48&-1)|0;V=+h[W+(G*48&-1)+16>>3]>+h[W+(av*48&-1)+16>>3];av=V?aB:U;W=V?U:aB;aB=au;aj=+h[W>>3];af=+h[av>>3];au=aj>af;ag=+h[W+8>>3];ab=+h[av+8>>3];U=ag>ab;K=(W-aB|0)/48&-1;L=(av-aB|0)/48&-1;M=W;N=av;O=au?af:aj;P=au?aj:af;Q=U?ab:ag;R=U?ag:ab;S=+h[av+16>>3]}}while(0);J=c[I+(H*104&-1)+100>>2]|0;if((J|0)>-1){y=S;z=R;A=Q;B=P;C=O;D=N;E=M;F=L;G=K;H=J}else{X=12367;break}}if((X|0)==12367){aC=L;aD=K;aE=c[228]|0;break}H=c[225]|0;if((H|0)<=(u|0)){i=f;return}G=(aa|0)==0;F=H;while(1){if(G){X=12358;break}if((F|0)==0){if((u|0)<0){F=0;continue}else{X=12385;break}}else{H=F-1|0;c[225]=H;if((H|0)>(u|0)){F=H;continue}else{X=12382;break}}}if((X|0)==12358){uk(119400,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((X|0)==12385){i=f;return}else if((X|0)==12382){i=f;return}}else{aC=o;aD=m;aE=k}}while(0);k=aE;gw((c[11608]|0)+(a*20&-1)|0,k+(aD*48&-1)|0,k+(aC*48&-1)|0);aC=c[225]|0;if((aC|0)<=(u|0)){i=f;return}k=(c[228]|0)==0;aD=aC;while(1){if(k){X=12372;break}if((aD|0)==0){if((u|0)<0){aD=0;continue}else{X=12386;break}}else{aC=aD-1|0;c[225]=aC;if((aC|0)>(u|0)){aD=aC;continue}else{X=12384;break}}}if((X|0)==12384){i=f;return}else if((X|0)==12386){i=f;return}else if((X|0)==12372){uk(119400,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}function gv(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0.0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0,aA=0,aB=0.0,aC=0.0,aD=0.0,aE=0.0,aF=0.0,aG=0.0,aH=0.0,aI=0,aJ=0,aK=0,aL=0,aM=0,aN=0,aO=0,aP=0,aQ=0,aR=0,aS=0,aT=0,aU=0,aV=0.0,aW=0,aX=0.0,aY=0,aZ=0,a_=0,a$=0,a0=0,a1=0,a2=0,a3=0,a4=0,a5=0,a6=0,a7=0,a8=0,a9=0,ba=0,bb=0,bc=0,bd=0,be=0;e=i;i=i+128|0;f=e|0;g=e+8|0;j=e+16|0;k=e+56|0;l=e+120|0;do{if((d|0)>0){m=0;n=0;o=0;p=-1;q=0;r=b;L16892:while(1){s=c[r+8>>2]|0;do{if((s|0)==4){t=p;u=o;w=n;x=m}else{y=c[r+260>>2]|0;z=c[y+8>>2]|0;if((a[r+236|0]&1)!=0){t=p;u=o;w=n;x=m;break}A=(z|0)>(p|0)?z:p;do{if((s|0)==2){if((y|0)==0){B=0}else{C=0;D=y;while(1){E=C+1|0;F=c[D>>2]|0;if((F|0)==0){B=E;break}else{C=E;D=F}}}G=B;H=aa(B,z)}else if((s|0)==3){D=c[r+252>>2]|0;if((c[r+244>>2]|0)!=0){G=D;H=aa(D,z);break}if((c[r+12>>2]|0)==225){G=D;H=z;break}if((y|0)==0){G=D;H=0;break}C=c[y>>2]|0;if((C|0)==0){G=D;H=z;break}else{I=z;J=C}while(1){C=I+(c[J+8>>2]|0)|0;F=c[J>>2]|0;if((F|0)==0){G=D;H=C;break}else{I=C;J=F}}}else{K=12401;break L16892}}while(0);y=c[r+12>>2]|0;if((y|0)==153|(y|0)==345|(y|0)==33|(y|0)==225){t=A;u=(H<<1)+o|0;w=H+n|0;x=m;break}else if((y|0)==352|(y|0)==51|(y|0)==177|(y|0)==193|(y|0)==209|(y|0)==1){y=H+o|0;D=(H-G|0)+n|0;if((c[r+244>>2]|0)==0){t=A;u=y;w=D;x=m;break}t=A;u=y;w=(((-(z<<1)|1)-G|0)+(H<<1)|0)+D|0;x=aa((G<<1)-2|0,z-1|0)+m|0;break}else{t=A;u=H+o|0;w=H+n|0;x=m;break}}}while(0);s=q+1|0;if((s|0)<(d|0)){m=x;n=w;o=u;p=t;q=s;r=c[r>>2]|0}else{break}}if((K|0)==12401){uk(164696,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((t|0)<1){break}r=c[228]|0;if((r|0)==0){uk(203872,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((u|0)==0){uu(r);c[228]=0;c[224]=0;c[225]=0}else{c[228]=db(r,aa(c[227]|0,u),150384)|0;c[224]=u}r=c[11608]|0;if((r|0)==0){uk(203872,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((w|0)==0){uu(r);c[11608]=0;c[11604]=0;c[11605]=0}else{c[11608]=db(r,aa(c[11607]|0,w),150384)|0;c[11604]=w}r=c[7628]|0;if((r|0)==0){uk(203872,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((x|0)==0){uu(r);c[7628]=0;c[7624]=0;c[7625]=0}else{c[7628]=db(r,aa(c[7627]|0,x),150384)|0;c[7624]=x}r=t<<3;q=ut(r)|0;do{if((q|0)==0){gk();p=ut(r)|0;if((p|0)!=0){L=p;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=155272,v)|0)}else{L=q}}while(0);q=L;p=ut(r)|0;do{if((p|0)==0){gk();o=ut(r)|0;if((o|0)!=0){M=o;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=151696,v)|0)}else{M=p}}while(0);p=M;r=t*12&-1;o=ut(r)|0;do{if((o|0)==0){gk();n=ut(r)|0;if((n|0)!=0){N=n;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=149768,v)|0)}else{N=o}}while(0);o=N;n=ut(r)|0;do{if((n|0)==0){gk();m=ut(r)|0;if((m|0)!=0){O=m;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=147944,v)|0)}else{O=n}}while(0);n=j;r=j+4|0;m=j+8|0;s=j+16|0;D=j|0;y=k|0;F=k+8|0;C=k+16|0;E=k+24|0;P=k+32|0;Q=O;R=o;S=p;T=q;U=0;V=b;L16959:while(1){W=a[V+239|0]|0;X=V+24|0;L16961:do{if((c[V+8>>2]|0)==4){Y=T;Z=S;_=R;$=Q}else{ab=V+260|0;ac=c[(c[ab>>2]|0)+8>>2]|0;if((a[V+236|0]&1)!=0){Y=T;Z=S;_=R;$=Q;break}ad=c[V+240>>2]|0;ae=(ad|0)==-9;af=V+12|0;ag=c[af>>2]|0;ah=(ag|0)==352;ai=ah?-3:ae?-8:(c[9742]|0)+ad|0;aj=ah?-3:ae?-8:ad;do{if((ag|0)==225){c[V+32>>2]=-10;ad=V+152|0;if((c[V+144>>2]|0)==0){h[ad>>3]=1.0;h[V+168>>3]=0.0}ae=c[200]|0;h[64776+(ae*688&-1)>>3]=+((c[7939]|0)-(c[7938]|0)|0)/(+h[64672+(ae*688&-1)>>3]- +h[64664+(ae*688&-1)>>3]);c[12912]=c[V+184>>2];c[12910]=0;ak=+h[ad>>3];if(ak<=0.0){break}uE(n|0,0,40);c[r>>2]=2;c[m>>2]=2;h[s>>3]=ak;c[D>>2]=c[V+160>>2];fN(j,f,g,123984);h[6458]=+h[V+168>>3];h[6457]=+h[V+176>>3];c[12910]=~~+h[f>>3]}}while(0);ag=c[ab>>2]|0;if((c[V+244>>2]|0)!=0){if((c[ag+8>>2]|0)>0){A=0;do{z=A*3&-1;c[R+(z+2<<2)>>2]=-3;c[R+(z+1<<2)>>2]=-3;c[R+(z<<2)>>2]=-3;z=A<<1;c[T+((z|1)<<2)>>2]=-3;c[T+(z<<2)>>2]=-3;A=A+1|0;al=c[ab>>2]|0;}while((A|0)<(c[al+8>>2]|0));if((al|0)==0){Y=T;Z=S;_=R;$=Q;break}else{am=al}}else{am=ag}A=(W&1)!=0;ab=V+68|0;z=am;ad=Q;ae=R;ah=S;an=T;ao=0;while(1){ap=c[z+12>>2]|0;aq=z+8|0;if((c[aq>>2]|0)>0){ar=(ao|0)>0;as=0;do{at=ap+(as<<6)|0;au=c[228]|0;if((au|0)==0){K=12531;break L16959}av=c[225]|0;aw=c[224]|0;do{if((av|0)<(aw|0)){ax=au;ay=av}else{az=(c[226]|0)+aw|0;if((az|0)==0){uu(au);c[228]=0;c[224]=0;c[225]=0;ax=0;ay=0;break}else{aA=db(au,aa(c[227]|0,az),150384)|0;c[228]=aA;c[224]=az;ax=aA;ay=c[225]|0;break}}}while(0);au=c[227]|0;c[225]=ay+1;aw=aa(au,ay);au=ax+aw|0;c[ax+(aw+24|0)>>2]=X;av=at|0;if((c[av>>2]|0)<(c[9738]|0)){aA=ap+(as<<6)+24|0;ak=+h[aA>>3];aB=(+h[ap+(as<<6)+8>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;aC=(+h[ap+(as<<6)+16>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;aD=(ak- +h[5279])*+h[2]+ +h[12]+-1.0;aE=+h[404]+aB*+h[392]+aC*+h[396]+aD*+h[400];aF=+h[405]+aB*+h[393]+aC*+h[397]+aD*+h[401];aG=+h[406]+aB*+h[394]+aC*+h[398]+aD*+h[402];aH=aG==0.0?1.0e-5:aG;h[au>>3]=(+h[403]+aB*+h[391]+aC*+h[395]+aD*+h[399])/aH;h[ax+(aw+8|0)>>3]=aE/aH;h[ax+(aw+16|0)>>3]=aF/aH;az=ax+(aw+32|0)|0;h[az>>3]=ak;c[ax+(aw+40|0)>>2]=0;if(A){h[az>>3]=+h[ap+(as<<6)+32>>3];c[ab>>2]=-6}else{h[az>>3]=+h[aA>>3]}c[ax+(aw+44|0)>>2]=at;aI=(au-(c[228]|0)|0)/48&-1}else{h[ax+(aw+16|0)>>3]=-2.0;aI=-1}aw=as*3&-1;au=ad+(aw+2<<2)|0;c[au>>2]=-3;aA=ad+(aw+1<<2)|0;c[aA>>2]=-3;az=ad+(aw<<2)|0;c[az>>2]=-3;aJ=as<<1;aK=ah+((aJ|1)<<2)|0;c[aK>>2]=-3;aL=ah+(aJ<<2)|0;c[aL>>2]=-3;aM=c[af>>2]|0;do{if((aM|0)==352|(aM|0)==51|(aM|0)==177|(aM|0)==193|(aM|0)==209|(aM|0)==1){if((as|0)<=0){if(!(ar&(aI|0)>-1)){break}c[aA>>2]=gy(aI,1,ac,X,aj)|0;break}if((aI|0)<0){if(!(ar&(a[38944]^1))){break}aN=gy((c[225]|0)-1|0,3,ac,X,aj)|0;c[au>>2]=aN;if((aN|0)<=-2){break}aO=gz((c[225]|0)-1|0,3,ac)|0;aP=as-1|0;gA(aN,c[ad+((aP*3&-1)+1<<2)>>2]|0,aO,c[ah+((aP<<1|1)<<2)>>2]|0,aj,ai);gA(aN,c[ae+(aw<<2)>>2]|0,aO,c[an+(aJ<<2)>>2]|0,aj,ai);break}aO=gy(aI,0,ac,X,aj)|0;c[az>>2]=aO;if(!ar){break}aN=gy(aI,1,ac,X,aj)|0;c[aA>>2]=aN;aP=gy(aI,2,ac,X,aj)|0;c[au>>2]=aP;aQ=(aO|0)>-2;if((aP|0)>-2){if(aQ){aR=gz(aI,2,ac)|0;c[aL>>2]=aR;aS=as-1|0;gA(aO,c[ad+((aS*3&-1)+1<<2)>>2]|0,aR,c[ah+((aS<<1|1)<<2)>>2]|0,aj,ai)}if((aN|0)>-2){aS=gz(aI,0,ac)|0;c[aK>>2]=aS;gA(aN,c[ae+(aw<<2)>>2]|0,aS,c[an+(aJ<<2)>>2]|0,aj,ai)}gA(aP,aP,c[aL>>2]|0,c[aK>>2]|0,aj,ai);break}else{if(!aQ){break}if(!((aN|0)>-2&(a[38944]^1))){break}aQ=gy(aI,3,ac,X,aj)|0;c[au>>2]=aQ;if((aQ|0)<=-2){break}aP=gz(aI,1,ac)|0;c[aK>>2]=aP;c[aL>>2]=aP;if((a[(c[7628]|0)+(aP*104&-1)+96|0]&1)!=0){break}c[(c[11608]|0)+(aQ*20&-1)+8>>2]=ai;c[(c[11608]|0)+(aN*20&-1)+8>>2]=ai;c[(c[11608]|0)+(aO*20&-1)+8>>2]=ai;break}}else if((aM|0)==153|(aM|0)==345|(aM|0)==33){if((aI|0)<0){break}aO=ap+(as<<6)+24|0;ak=+h[aO>>3];h[aO>>3]=(aM|0)==33?0.0:+h[8083];aN=c[228]|0;if((aN|0)==0){K=12564;break L16959}aQ=c[225]|0;aP=c[224]|0;do{if((aQ|0)<(aP|0)){aT=aN;aU=aQ}else{aS=(c[226]|0)+aP|0;if((aS|0)==0){uu(aN);c[228]=0;c[224]=0;c[225]=0;aT=0;aU=0;break}else{aR=db(aN,aa(c[227]|0,aS),150384)|0;c[228]=aR;c[224]=aS;aT=aR;aU=c[225]|0;break}}}while(0);aN=c[227]|0;c[225]=aU+1;aP=aa(aN,aU);aN=aT+aP|0;c[aT+(aP+24|0)>>2]=X;if((c[av>>2]|0)>=(c[9738]|0)){h[aT+(aP+16|0)>>3]=-2.0;h[aO>>3]=ak;break}aH=+h[aO>>3];aF=(+h[ap+(as<<6)+8>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;aE=(+h[ap+(as<<6)+16>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;aD=(aH- +h[5279])*+h[2]+ +h[12]+-1.0;aC=+h[404]+aF*+h[392]+aE*+h[396]+aD*+h[400];aB=+h[405]+aF*+h[393]+aE*+h[397]+aD*+h[401];aG=+h[406]+aF*+h[394]+aE*+h[398]+aD*+h[402];aV=aG==0.0?1.0e-5:aG;h[aN>>3]=(+h[403]+aF*+h[391]+aE*+h[395]+aD*+h[399])/aV;h[aT+(aP+8|0)>>3]=aC/aV;h[aT+(aP+16|0)>>3]=aB/aV;aQ=aT+(aP+32|0)|0;h[aQ>>3]=aH;c[aT+(aP+40|0)>>2]=0;if(A){h[aQ>>3]=+h[ap+(as<<6)+32>>3];c[ab>>2]=-6}else{h[aQ>>3]=+h[aO>>3]}c[aT+(aP+44|0)>>2]=at;aP=aN-(c[228]|0)|0;h[aO>>3]=ak;if((aP|0)<=0){break}gy((aP|0)/48&-1,4,0,X,aj)}else{if((aI|0)<0){break}gy(aI,5,ac,X,aj)}}while(0);as=as+1|0;}while((as|0)<(c[aq>>2]|0))}aq=c[z>>2]|0;if((aq|0)==0){Y=ah;Z=an;_=ad;$=ae;break L16961}else{as=ah;ap=ad;ad=ae;ah=an;z=aq;ao=ao+1|0;an=as;ae=ap}}}if((ag|0)==0){Y=T;Z=S;_=R;$=Q;break}ae=X|0;an=V+224|0;ao=W&1;z=ao<<24>>24==0;ah=ao<<24>>24!=0;ao=V+68|0;ad=ag;while(1){ab=c[ad+12>>2]|0;do{if((c[af>>2]|0)==368){c[ae>>2]=1;c[y>>2]=0;A=c[c[an>>2]>>2]|0;if((A|0)==0){break}else{aW=A}do{h[F>>3]=+h[aW+24>>3];h[C>>3]=+h[aW+32>>3];h[E>>3]=+h[aW+40>>3];if((c[aW+72>>2]|0)==6){aX=+h[aW+80>>3]}else{aX=+(c[aW+76>>2]|0)}h[P>>3]=aX;A=c[228]|0;if((A|0)==0){K=12456;break L16959}ai=c[225]|0;ap=c[224]|0;do{if((ai|0)<(ap|0)){aY=A;aZ=ai}else{as=(c[226]|0)+ap|0;if((as|0)==0){uu(A);c[228]=0;c[224]=0;c[225]=0;aY=0;aZ=0;break}else{aq=db(A,aa(c[227]|0,as),150384)|0;c[228]=aq;c[224]=as;aY=aq;aZ=c[225]|0;break}}}while(0);A=c[227]|0;c[225]=aZ+1;ap=aa(A,aZ);A=aY+ap|0;c[aY+(ap+24|0)>>2]=X;do{if((c[y>>2]|0)<(c[9738]|0)){ak=+h[E>>3];aH=(+h[F>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;aV=(+h[C>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;aB=(ak- +h[5279])*+h[2]+ +h[12]+-1.0;aC=+h[404]+aH*+h[392]+aV*+h[396]+aB*+h[400];aD=+h[405]+aH*+h[393]+aV*+h[397]+aB*+h[401];aE=+h[406]+aH*+h[394]+aV*+h[398]+aB*+h[402];aF=aE==0.0?1.0e-5:aE;h[A>>3]=(+h[403]+aH*+h[391]+aV*+h[395]+aB*+h[399])/aF;h[aY+(ap+8|0)>>3]=aC/aF;h[aY+(ap+16|0)>>3]=aD/aF;ai=aY+(ap+32|0)|0;h[ai>>3]=ak;c[aY+(ap+40|0)>>2]=0;if(z){h[ai>>3]=+h[E>>3]}else{h[ai>>3]=+h[P>>3];c[ao>>2]=-6}c[aY+(ap+44|0)>>2]=k;ai=c[228]|0;aO=A-ai|0;aq=(aO|0)/48&-1;if((aO|0)<0){break}c[ai+(aq*48&-1)+40>>2]=aW;gy(aq,5,ac,X,aj)}else{h[aY+(ap+16|0)>>3]=-2.0}}while(0);aW=c[aW>>2]|0;}while((aW|0)!=0)}else{ap=ad+8|0;if((c[ap>>2]|0)<=0){break}A=ad|0;aq=-1;ai=0;while(1){aO=ab+(ai<<6)|0;as=c[228]|0;if((as|0)==0){K=12470;break L16959}ar=c[225]|0;at=c[224]|0;do{if((ar|0)<(at|0)){a_=as;a$=ar}else{av=(c[226]|0)+at|0;if((av|0)==0){uu(as);c[228]=0;c[224]=0;c[225]=0;a_=0;a$=0;break}else{aM=db(as,aa(c[227]|0,av),150384)|0;c[228]=aM;c[224]=av;a_=aM;a$=c[225]|0;break}}}while(0);as=c[227]|0;c[225]=a$+1;at=aa(as,a$);as=a_+at|0;c[a_+(at+24|0)>>2]=X;ar=aO|0;if((c[ar>>2]|0)<(c[9738]|0)){aM=ab+(ai<<6)+24|0;ak=+h[aM>>3];aF=(+h[ab+(ai<<6)+8>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;aD=(+h[ab+(ai<<6)+16>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;aC=(ak- +h[5279])*+h[2]+ +h[12]+-1.0;aB=+h[404]+aF*+h[392]+aD*+h[396]+aC*+h[400];aV=+h[405]+aF*+h[393]+aD*+h[397]+aC*+h[401];aH=+h[406]+aF*+h[394]+aD*+h[398]+aC*+h[402];aE=aH==0.0?1.0e-5:aH;h[as>>3]=(+h[403]+aF*+h[391]+aD*+h[395]+aC*+h[399])/aE;h[a_+(at+8|0)>>3]=aB/aE;h[a_+(at+16|0)>>3]=aV/aE;av=a_+(at+32|0)|0;h[av>>3]=ak;c[a_+(at+40|0)>>2]=0;if(ah){h[av>>3]=+h[ab+(ai<<6)+32>>3];c[ao>>2]=-6}else{h[av>>3]=+h[aM>>3]}c[a_+(at+44|0)>>2]=aO;a0=(as-(c[228]|0)|0)/48&-1}else{h[a_+(at+16|0)>>3]=-2.0;a0=-1}do{if((c[af>>2]|0)==225){at=c[(c[A>>2]|0)+12>>2]|0;as=at+(ai<<6)|0;aM=c[228]|0;if((aM|0)==0){K=12483;break L16959}av=c[225]|0;aL=c[224]|0;do{if((av|0)<(aL|0)){a1=aM;a2=av}else{aK=(c[226]|0)+aL|0;if((aK|0)==0){uu(aM);c[228]=0;c[224]=0;c[225]=0;a1=0;a2=0;break}else{au=db(aM,aa(c[227]|0,aK),150384)|0;c[228]=au;c[224]=aK;a1=au;a2=c[225]|0;break}}}while(0);aM=c[227]|0;c[225]=a2+1;aL=aa(aM,a2);c[a1+(aL+24|0)>>2]=0;if((c[as>>2]|0)<(c[9738]|0)){aM=at+(ai<<6)+24|0;ak=+h[aM>>3];aE=(+h[at+(ai<<6)+8>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;aV=(+h[at+(ai<<6)+16>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;aB=(ak- +h[5279])*+h[2]+ +h[12]+-1.0;aC=+h[404]+aE*+h[392]+aV*+h[396]+aB*+h[400];aD=+h[405]+aE*+h[393]+aV*+h[397]+aB*+h[401];aF=+h[406]+aE*+h[394]+aV*+h[398]+aB*+h[402];aH=aF==0.0?1.0e-5:aF;h[a1+aL>>3]=(+h[403]+aE*+h[391]+aV*+h[395]+aB*+h[399])/aH;h[a1+(aL+8|0)>>3]=aC/aH;h[a1+(aL+16|0)>>3]=aD/aH;av=a1+(aL+32|0)|0;h[av>>3]=ak;c[a1+(aL+40|0)>>2]=0;h[av>>3]=+h[aM>>3];c[a1+(aL+44|0)>>2]=as;break}else{h[a1+(aL+16|0)>>3]=-2.0;break}}}while(0);do{if((a0|0)>=0){aL=c[af>>2]|0;if((aL|0)==225){gy(a0,6,0,X,aj);break}else if((aL|0)==153|(aL|0)==345){aM=ab+(ai<<6)+24|0;ak=+h[aM>>3];h[aM>>3]=+h[8083];av=c[228]|0;if((av|0)==0){K=12497;break L16959}au=c[225]|0;aK=c[224]|0;do{if((au|0)<(aK|0)){a3=av;a4=au}else{aJ=(c[226]|0)+aK|0;if((aJ|0)==0){uu(av);c[228]=0;c[224]=0;c[225]=0;a3=0;a4=0;break}else{aw=db(av,aa(c[227]|0,aJ),150384)|0;c[228]=aw;c[224]=aJ;a3=aw;a4=c[225]|0;break}}}while(0);av=c[227]|0;c[225]=a4+1;aK=aa(av,a4);av=a3+aK|0;c[a3+(aK+24|0)>>2]=X;if((c[ar>>2]|0)>=(c[9738]|0)){h[a3+(aK+16|0)>>3]=-2.0;h[aM>>3]=ak;break}aH=+h[aM>>3];aD=(+h[ab+(ai<<6)+8>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;aC=(+h[ab+(ai<<6)+16>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;aB=(aH- +h[5279])*+h[2]+ +h[12]+-1.0;aV=+h[404]+aD*+h[392]+aC*+h[396]+aB*+h[400];aE=+h[405]+aD*+h[393]+aC*+h[397]+aB*+h[401];aF=+h[406]+aD*+h[394]+aC*+h[398]+aB*+h[402];aG=aF==0.0?1.0e-5:aF;h[av>>3]=(+h[403]+aD*+h[391]+aC*+h[395]+aB*+h[399])/aG;h[a3+(aK+8|0)>>3]=aV/aG;h[a3+(aK+16|0)>>3]=aE/aG;au=a3+(aK+32|0)|0;h[au>>3]=aH;c[a3+(aK+40|0)>>2]=0;if(ah){h[au>>3]=+h[ab+(ai<<6)+32>>3];c[ao>>2]=-6}else{h[au>>3]=+h[aM>>3]}c[a3+(aK+44|0)>>2]=aO;aK=av-(c[228]|0)|0;h[aM>>3]=ak;if((aK|0)<=0){break}gy((aK|0)/48&-1,4,0,X,aj);break}else if((aL|0)==33){aK=ab+(ai<<6)+24|0;aH=+h[aK>>3];h[aK>>3]=0.0;av=c[228]|0;if((av|0)==0){K=12510;break L16959}au=c[225]|0;as=c[224]|0;do{if((au|0)<(as|0)){a5=av;a6=au}else{at=(c[226]|0)+as|0;if((at|0)==0){uu(av);c[228]=0;c[224]=0;c[225]=0;a5=0;a6=0;break}else{aw=db(av,aa(c[227]|0,at),150384)|0;c[228]=aw;c[224]=at;a5=aw;a6=c[225]|0;break}}}while(0);av=c[227]|0;c[225]=a6+1;as=aa(av,a6);av=a5+as|0;c[a5+(as+24|0)>>2]=X;if((c[ar>>2]|0)>=(c[9738]|0)){h[a5+(as+16|0)>>3]=-2.0;h[aK>>3]=aH;break}ak=+h[aK>>3];aG=(+h[ab+(ai<<6)+8>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;aE=(+h[ab+(ai<<6)+16>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;aV=(ak- +h[5279])*+h[2]+ +h[12]+-1.0;aB=+h[404]+aG*+h[392]+aE*+h[396]+aV*+h[400];aC=+h[405]+aG*+h[393]+aE*+h[397]+aV*+h[401];aD=+h[406]+aG*+h[394]+aE*+h[398]+aV*+h[402];aF=aD==0.0?1.0e-5:aD;h[av>>3]=(+h[403]+aG*+h[391]+aE*+h[395]+aV*+h[399])/aF;h[a5+(as+8|0)>>3]=aB/aF;h[a5+(as+16|0)>>3]=aC/aF;au=a5+(as+32|0)|0;h[au>>3]=ak;c[a5+(as+40|0)>>2]=0;if(ah){h[au>>3]=+h[ab+(ai<<6)+32>>3];c[ao>>2]=-6}else{h[au>>3]=+h[aK>>3]}c[a5+(as+44|0)>>2]=aO;as=av-(c[228]|0)|0;h[aK>>3]=aH;if((as|0)<=0){break}gy((as|0)/48&-1,4,0,X,aj);break}else if((aL|0)==352|(aL|0)==51|(aL|0)==177|(aL|0)==193|(aL|0)==209|(aL|0)==1){if((aq|0)<=-1){break}gy(a0,0,0,X,aj);break}else{gy(a0,5,ac,X,aj);break}}}while(0);aO=ai+1|0;if((aO|0)<(c[ap>>2]|0)){aq=a0;ai=aO}else{break}}}}while(0);ab=c[ad>>2]|0;if((ab|0)==0){Y=T;Z=S;_=R;$=Q;break}else{ad=ab}}}}while(0);X=U+1|0;if((X|0)<(d|0)){Q=$;R=_;S=Z;T=Y;U=X;V=c[V>>2]|0}else{K=12581;break}}if((K|0)==12497){uk(132480,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((K|0)==12510){uk(132480,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((K|0)==12581){uu(Z);uu(Y);uu($);uu(_);break}else if((K|0)==12470){uk(132480,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((K|0)==12483){uk(132480,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((K|0)==12456){uk(132480,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((K|0)==12531){uk(132480,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((K|0)==12564){uk(132480,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);K=c[11605]|0;if((K|0)==0){uu(c[7628]|0);c[7628]=0;c[7624]=0;c[7625]=0;uu(c[11608]|0);c[11608]=0;c[11604]=0;c[11605]=0;uu(c[228]|0);c[228]=0;c[224]=0;c[225]=0;uk(176896,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}_=(c[7625]|0)==0;$=K<<2;K=ut($)|0;do{if((K|0)==0){gk();Y=ut($)|0;if((Y|0)!=0){a7=Y;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=168848,v)|0)}else{a7=K}}while(0);K=a7;$=c[11605]|0;if(($|0)>0){Y=0;while(1){c[K+(Y<<2)>>2]=Y;Z=Y+1|0;d=c[11605]|0;if((Z|0)<(d|0)){Y=Z}else{a8=d;break}}}else{a8=$}bM(a7|0,a8|0,4,6);a8=(c[11608]|0)+((c[K>>2]|0)*20&-1)|0;if((c[11605]|0)>1){$=1;Y=a8;while(1){d=K+($<<2)|0;c[Y+16>>2]=c[d>>2];Z=(c[11608]|0)+((c[d>>2]|0)*20&-1)|0;d=$+1|0;if((d|0)<(c[11605]|0)){$=d;Y=Z}else{a9=Z;break}}}else{a9=a8}c[a9+16>>2]=-1;c[11566]=c[K>>2];uu(a7);if(_){_=c[11566]|0;if((_|0)<=-1){i=e;return}a7=_;_=c[11608]|0;do{K=_;a9=K+(a7*20&-1)|0;a8=c[228]|0;gw(a9,a8+((c[a9>>2]|0)*48&-1)|0,a8+((c[K+(a7*20&-1)+4>>2]|0)*48&-1)|0);_=c[11608]|0;a7=c[_+((c[11566]|0)*20&-1)+16>>2]|0;c[11566]=a7;}while((a7|0)>-1);i=e;return}a7=c[7625]|0;if((a7|0)!=0){_=a7<<2;a7=ut(_)|0;do{if((a7|0)==0){gk();K=ut(_)|0;if((K|0)!=0){ba=K;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=172600,v)|0)}else{ba=a7}}while(0);a7=ba;_=c[7625]|0;if((_|0)>0){K=0;while(1){c[a7+(K<<2)>>2]=K;a8=K+1|0;a9=c[7625]|0;if((a8|0)<(a9|0)){K=a8}else{bb=a9;break}}}else{bb=_}bM(ba|0,bb|0,4,14);bb=(c[7628]|0)+((c[a7>>2]|0)*104&-1)|0;if((c[7625]|0)>1){_=1;K=bb;while(1){a9=a7+(_<<2)|0;c[K+100>>2]=c[a9>>2];a8=(c[7628]|0)+((c[a9>>2]|0)*104&-1)|0;a9=_+1|0;if((a9|0)<(c[7625]|0)){_=a9;K=a8}else{bc=a8;break}}}else{bc=bb}c[bc+100>>2]=-1;c[8022]=c[a7>>2];uu(ba)}c[l>>2]=c[8022];ba=c[11566]|0;if((ba|0)<=-1){i=e;return}a7=ba;ba=c[11608]|0;while(1){bc=ba;if((c[bc+(a7*20&-1)+8>>2]|0)==-3){bd=a7;be=ba}else{gu(a7,c[bc+(a7*20&-1)>>2]|0,c[bc+(a7*20&-1)+4>>2]|0,l);bd=c[11566]|0;be=c[11608]|0}bc=c[be+(bd*20&-1)+16>>2]|0;c[11566]=bc;if((bc|0)>-1){a7=bc;ba=be}else{break}}i=e;return}function gw(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;f=i;i=i+72|0;g=f|0;j=f+16|0;k=b+12|0;l=c[k>>2]|0;m=g;n=l+40|0;c[m>>2]=c[n>>2];c[m+4>>2]=c[n+4>>2];c[m+8>>2]=c[n+8>>2];c[m+12>>2]=c[n+12>>2];n=j;o=l;c[n>>2]=c[o>>2];c[n+4>>2]=c[o+4>>2];c[n+8>>2]=c[o+8>>2];c[n+12>>2]=c[o+12>>2];c[n+16>>2]=c[o+16>>2];c[n+20>>2]=c[o+20>>2];c[n+24>>2]=c[o+24>>2];c[n+28>>2]=c[o+28>>2];c[n+32>>2]=c[o+32>>2];c[n+36>>2]=c[o+36>>2];c[n+40>>2]=c[o+40>>2];c[n+44>>2]=c[o+44>>2];c[n+48>>2]=c[o+48>>2];c[n+52>>2]=c[o+52>>2];p=j+8|0;q=((c[p>>2]|0)+11|0)>>>0<2;if(q){if((c[b+8>>2]|0)==-11){r=e}else{s=12616}}else{s=12616}if((s|0)==12616){r=d}t=~~+h[r+32>>3];do{if((c[g>>2]|0)==3){if((c[g+4>>2]|0)==-6){c[j+44>>2]=t;s=12651;break}if((c[b+8>>2]|0)==-8){s=12651;break}if((l|0)!=56296){s=12623;break}c[j+44>>2]=t}else{s=12623}}while(0);do{if((s|0)==12623){r=j+4|0;if((c[r>>2]|0)==-6){u=j|0;v=c[u>>2]|0;w=c[8798]|0;x=(w|0)>0;y=t;L17222:while(1){z=43264;while(1){A=c[z>>2]|0;if((A|0)==0){break}if((c[A+4>>2]|0)==(y|0)){break L17222}else{z=A|0}}B=y-1|0;if(!((y|0)>(w|0)&x)){s=12634;break}y=((B|0)%(w|0)&-1)+1|0}if((s|0)==12634){c[r>>2]=B;c[j+40>>2]=1;c[j+44>>2]=B;c[p>>2]=B;s=12651;break}w=A+8|0;c[n>>2]=c[w>>2];c[n+4>>2]=c[w+4>>2];c[n+8>>2]=c[w+8>>2];c[n+12>>2]=c[w+12>>2];c[n+16>>2]=c[w+16>>2];c[n+20>>2]=c[w+20>>2];c[n+24>>2]=c[w+24>>2];c[n+28>>2]=c[w+28>>2];c[n+32>>2]=c[w+32>>2];c[n+36>>2]=c[w+36>>2];c[n+40>>2]=c[w+40>>2];c[n+44>>2]=c[w+44>>2];c[n+48>>2]=c[w+48>>2];c[n+52>>2]=c[w+52>>2];c[u>>2]=v;if((c[(c[3524]|0)+96>>2]&1024|0)!=0){c[r>>2]=y;a[j+32|0]=0;s=12651;break}if((a[j+32|0]&1)!=0){s=12651;break}c[j+40>>2]=1;c[j+44>>2]=c[r>>2];s=12651;break}if(q){c[p>>2]=c[b+8>>2];break}if((c[9742]|0)==0){break}if((c[l+40>>2]|0)==6){break}w=j|0;x=c[w>>2]|0;z=c[8798]|0;C=(z|0)>0;D=c[b+8>>2]|0;L17242:while(1){E=D+1|0;F=43264;while(1){G=c[F>>2]|0;if((G|0)==0){break}if((c[G+4>>2]|0)==(E|0)){s=12643;break L17242}else{F=G|0}}if(!((E|0)>(z|0)&C)){s=12649;break}D=(D|0)%(z|0)&-1}do{if((s|0)==12643){z=G+8|0;c[n>>2]=c[z>>2];c[n+4>>2]=c[z+4>>2];c[n+8>>2]=c[z+8>>2];c[n+12>>2]=c[z+12>>2];c[n+16>>2]=c[z+16>>2];c[n+20>>2]=c[z+20>>2];c[n+24>>2]=c[z+24>>2];c[n+28>>2]=c[z+28>>2];c[n+32>>2]=c[z+32>>2];c[n+36>>2]=c[z+36>>2];c[n+40>>2]=c[z+40>>2];c[n+44>>2]=c[z+44>>2];c[n+48>>2]=c[z+48>>2];c[n+52>>2]=c[z+52>>2];c[w>>2]=x;if((c[(c[3524]|0)+96>>2]&1024|0)!=0){c[r>>2]=E;a[j+32|0]=0;break}if((a[j+32|0]&1)!=0){break}c[j+40>>2]=1;c[j+44>>2]=c[r>>2]}else if((s|0)==12649){c[r>>2]=D;c[j+40>>2]=1;c[j+44>>2]=D;c[p>>2]=D}}while(0);D=j+40|0;c[m>>2]=c[D>>2];c[m+4>>2]=c[D+4>>2];c[m+8>>2]=c[D+8>>2];c[m+12>>2]=c[D+12>>2];s=12651}}while(0);do{if((s|0)==12651){E=j+40|0;c[m>>2]=c[E>>2];c[m+4>>2]=c[E+4>>2];c[m+8>>2]=c[E+8>>2];c[m+12>>2]=c[E+12>>2];c[n>>2]=c[o>>2];c[n+4>>2]=c[o+4>>2];c[n+8>>2]=c[o+8>>2];c[n+12>>2]=c[o+12>>2];c[n+16>>2]=c[o+16>>2];c[n+20>>2]=c[o+20>>2];c[n+24>>2]=c[o+24>>2];c[n+28>>2]=c[o+28>>2];c[n+32>>2]=c[o+32>>2];c[n+36>>2]=c[o+36>>2];c[E>>2]=c[m>>2];c[E+4>>2]=c[m+4>>2];c[E+8>>2]=c[m+8>>2];c[E+12>>2]=c[m+12>>2];a[j+32|0]=1;if(!q){break}c[p>>2]=c[b+8>>2]}}while(0);un(d,e,j,g);if((c[c[k>>2]>>2]|0)==0){i=f;return}gx(d);gx(e);i=f;return}function gx(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0.0,H=0.0,I=0;d=i;i=i+120|0;e=d|0;f=d+16|0;g=d+32|0;j=d+48|0;k=d+64|0;l=~~(+h[b>>3]*+(c[180]|0))+(c[186]|0)|0;m=~~(+h[b+8>>3]*+(c[40]|0))+(c[46]|0)|0;n=b+24|0;o=c[n>>2]|0;if((o|0)==0){i=d;return}if((c[o+8>>2]|0)<=-2){i=d;return}p=c[13542]|0;do{if((p|0)!=0){q=(c[p>>2]|0)>(l|0)&1;r=(c[p+4>>2]|0)<(l|0)?q|2:q;q=(c[p+8>>2]|0)>(m|0)?r|4:r;if((((c[p+12>>2]|0)<(m|0)?q|8:q)|0)==0){break}i=d;return}}while(0);p=c[b+40>>2]|0;if((p|0)!=0){fp(l,m,p);c[n>>2]=0;i=d;return}p=c[o+40>>2]|0;do{if((p|0)==6){s=+h[b+32>>3];q=c[34]|0;r=(a[66852]&1)==0;do{if((a[64788+(q*688&-1)|0]&1)==0){if(r){t=s;break}if(s>0.0){u=+_(+s);t=u/+h[8358];break}else{t=+h[8341];break}}else{if(r){t=+Z(+(s*+h[64800+(q*688&-1)>>3]));break}if(+h[64792+(q*688&-1)>>3]==+h[8357]){t=s;break}t=s*+h[64800+(q*688&-1)>>3]/+h[8358]}}while(0);s=+h[8341];do{if(s>2]|0)==0){break}c[f>>2]=5;h[f+8>>3]=v;c[f+4>>2]=0;cM[c[q>>2]&511](f)}else if((p|0)==2){if((c[o+44>>2]|0)!=-6){break}q=k;r=o;c[q>>2]=c[r>>2];c[q+4>>2]=c[r+4>>2];c[q+8>>2]=c[r+8>>2];c[q+12>>2]=c[r+12>>2];c[q+16>>2]=c[r+16>>2];c[q+20>>2]=c[r+20>>2];c[q+24>>2]=c[r+24>>2];c[q+28>>2]=c[r+28>>2];c[q+32>>2]=c[r+32>>2];c[q+36>>2]=c[r+36>>2];c[q+40>>2]=c[r+40>>2];c[q+44>>2]=c[r+44>>2];c[q+48>>2]=c[r+48>>2];c[q+52>>2]=c[r+52>>2];r=k|0;x=c[r>>2]|0;y=c[8798]|0;z=(y|0)>0;A=~~+h[b+32>>3];L17305:while(1){B=43264;while(1){C=c[B>>2]|0;if((C|0)==0){break}if((c[C+4>>2]|0)==(A|0)){D=12670;break L17305}else{B=C|0}}E=A-1|0;if(!((A|0)>(y|0)&z)){D=12676;break}A=((E|0)%(y|0)&-1)+1|0}do{if((D|0)==12670){y=C+8|0;c[q>>2]=c[y>>2];c[q+4>>2]=c[y+4>>2];c[q+8>>2]=c[y+8>>2];c[q+12>>2]=c[y+12>>2];c[q+16>>2]=c[y+16>>2];c[q+20>>2]=c[y+20>>2];c[q+24>>2]=c[y+24>>2];c[q+28>>2]=c[y+28>>2];c[q+32>>2]=c[y+32>>2];c[q+36>>2]=c[y+36>>2];c[q+40>>2]=c[y+40>>2];c[q+44>>2]=c[y+44>>2];c[q+48>>2]=c[y+48>>2];c[q+52>>2]=c[y+52>>2];c[r>>2]=x;y=c[3524]|0;if((c[y+96>>2]&1024|0)!=0){c[k+4>>2]=A;a[k+32|0]=0;F=y;break}if((a[k+32|0]&1)!=0){F=y;break}c[k+40>>2]=1;c[k+44>>2]=c[k+4>>2];F=y}else if((D|0)==12676){c[k+4>>2]=E;c[k+40>>2]=1;c[k+44>>2]=E;c[k+8>>2]=E;F=c[3524]|0}}while(0);fn(k+40|0,F)}else if((p|0)==3){if((c[o+44>>2]|0)==-6){A=(c[3524]|0)+144|0;if((c[A>>2]|0)==0){break}x=~~+h[b+32>>3];c[j>>2]=3;c[j+4>>2]=x;h[j+8>>3]=0.0;cM[c[A>>2]&511](j);break}else{A=c[o+44>>2]|0;x=(c[3524]|0)+144|0;if((c[x>>2]|0)==0){break}c[g>>2]=3;c[g+4>>2]=A;h[g+8>>3]=0.0;cM[c[x>>2]&511](g);break}}else if((p|0)==4){s=+h[b+32>>3];w=+h[8341];do{if(w>2]|0)==0){break}c[e>>2]=5;h[e+8>>3]=G;c[e+4>>2]=0;cM[c[x>>2]&511](e)}}while(0);e=c[n>>2]|0;if(+h[e+24>>3]==-3.0){cK[c[(c[3524]|0)+92>>2]&63](+h[3817]*+h[(c[b+44>>2]|0)+48>>3]);I=c[n>>2]|0}else{I=e}cR[c[(c[3524]|0)+80>>2]&127](l,m,c[I+8>>2]|0);c[n>>2]=0;i=d;return}function gy(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;g=i;j=c[228]|0;k=j;l=k+(a*48&-1)|0;m=1<>>1;o=k+((a-d|0)*48&-1)|0;p=k+((a-1|0)*48&-1)|0}else if((b|0)==4){n=0;o=k+((a-1|0)*48&-1)|0;p=l}else if((b|0)==2){n=m;o=k+(((a-1|0)-d|0)*48&-1)|0;p=l}else if((b|0)==1){n=m;o=k+((a-d|0)*48&-1)|0;p=l}else{n=m;o=0;p=l}l=(o-j|0)/48&-1;if(+h[p+16>>3]==-2.0){q=-2;i=g;return q|0}if(+h[o+16>>3]==-2.0){q=-2;i=g;return q|0}if((n|0)==0){r=f}else{r=(c[9734]&n|0)==0?-3:f}f=c[11608]|0;if((f|0)==0){uk(132480,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}n=c[11605]|0;o=c[11604]|0;do{if((n|0)<(o|0)){s=f;t=n}else{p=(c[11606]|0)+o|0;if((p|0)==0){uu(f);c[11608]=0;c[11604]=0;c[11605]=0;s=0;t=0;break}else{j=db(f,aa(c[11607]|0,p),150384)|0;c[11608]=j;c[11604]=p;s=j;t=c[11605]|0;break}}}while(0);f=c[11607]|0;c[11605]=t+1;o=aa(f,t);t=s+o|0;f=c[228]|0;n=s+(o+8|0)|0;c[n>>2]=r;c[s+(o+12|0)>>2]=e;c[s+(o+16|0)>>2]=-1;r=t;do{if(+h[f+(a*48&-1)+16>>3]<+h[f+(l*48&-1)+16>>3]){c[r>>2]=l;c[s+(o+4|0)>>2]=a;if((c[e+8>>2]|0)!=-10){break}c[n>>2]=-11}else{c[r>>2]=a;c[s+(o+4|0)>>2]=l;if((c[e+8>>2]|0)!=-10){break}c[n>>2]=-10}}while(0);q=(t-(c[11608]|0)|0)/20&-1;i=g;return q|0}function gz(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,j=0,k=0,l=0,m=0,n=0.0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,w=0.0,x=0.0,y=0.0,z=0,A=0,B=0,C=0,D=0.0,E=0.0,F=0,G=0.0,H=0.0,I=0,J=0.0,K=0.0,L=0,M=0.0,N=0.0,O=0,R=0.0,S=0.0,T=0,U=0.0,V=0.0,W=0,X=0.0,Y=0,Z=0.0,_=0.0,$=0.0,ab=0,ac=0,ad=0.0,ae=0.0,af=0.0,ag=0.0,ah=0.0,ai=0,aj=0.0;f=i;if((d|0)==2){j=b-1|0;k=j-e|0;l=j;m=b}else if((d|0)==0){j=b-e|0;k=j;l=j-1|0;m=b}else if((d|0)==3){j=b-1|0;k=b-e|0;l=j-e|0;m=j}else if((d|0)==1){k=b-e|0;l=b-1|0;m=b}else{k=0;l=0;m=0}b=c[228]|0;n=+h[b+(m*48&-1)+16>>3];if(n==-2.0){o=-2;i=f;return o|0}p=+h[b+(l*48&-1)+16>>3];if(p==-2.0){o=-2;i=f;return o|0}q=+h[b+(k*48&-1)+16>>3];if(q==-2.0){o=-2;i=f;return o|0}r=+h[b+(m*48&-1)>>3];s=+h[b+(l*48&-1)>>3];t=+P(+(r-s));u=+h[b+(m*48&-1)+8>>3];w=+h[b+(l*48&-1)+8>>3];x=t+ +P(+(u-w));if(x+ +P(+(n-p))+-1.0e-5<=0.0){o=-2;i=f;return o|0}x=+h[b+(k*48&-1)>>3];t=+P(+(s-x));s=+h[b+(k*48&-1)+8>>3];y=t+ +P(+(w-s));if(y+ +P(+(p-q))+-1.0e-5<=0.0){o=-2;i=f;return o|0}p=+P(+(x-r));r=p+ +P(+(s-u));if(r+ +P(+(q-n))+-1.0e-5<=0.0){o=-2;i=f;return o|0}b=c[7628]|0;if((b|0)==0){uk(132480,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}e=c[7625]|0;d=c[7624]|0;do{if((e|0)<(d|0)){z=b;A=e}else{j=(c[7626]|0)+d|0;if((j|0)==0){uu(b);c[7628]=0;c[7624]=0;c[7625]=0;z=0;A=0;break}else{B=db(b,aa(c[7627]|0,j),150384)|0;c[7628]=B;c[7624]=j;z=B;A=c[7625]|0;break}}}while(0);b=c[7627]|0;c[7625]=A+1;d=aa(b,A);A=z+d|0;c[A>>2]=m;c[z+(d+4|0)>>2]=l;c[z+(d+8|0)>>2]=k;c[z+(d+100|0)>>2]=-1;n=+h[(c[228]|0)+(m*48&-1)>>3];b=z+(d+16|0)|0;h[b>>3]=n;e=c[228]|0;q=+h[e+(l*48&-1)>>3];if(q>3]=q;C=c[228]|0;D=q}else{C=e;D=n}n=+h[C+(k*48&-1)>>3];if(n>3]=n;E=n}else{E=D}b=A;D=+g[3534];n=-0.0-D;if(E>3];C=z+(d+32|0)|0;h[C>>3]=E;e=c[228]|0;q=+h[e+(l*48&-1)+8>>3];if(q>3]=q;F=c[228]|0;G=q}else{F=e;G=E}E=+h[F+(k*48&-1)+8>>3];if(E>3]=E;H=E}else{H=G}if(H>3];C=z+(d+48|0)|0;h[C>>3]=H;F=c[228]|0;G=+h[F+(l*48&-1)+16>>3];if(G>3]=G;I=c[228]|0;J=G}else{I=F;J=H}H=+h[I+(k*48&-1)+16>>3];if(H>3]=H;K=H}else{K=J}if(K>3];C=z+(d+24|0)|0;h[C>>3]=n;I=c[228]|0;K=+h[I+(l*48&-1)>>3];if(K>n){h[C>>3]=K;L=c[228]|0;M=K}else{L=I;M=n}n=+h[L+(k*48&-1)>>3];if(n>M){h[C>>3]=n;N=n}else{N=M}M=D;if(N>M){a[46904]=1}N=+h[(c[228]|0)+(m*48&-1)+8>>3];C=z+(d+40|0)|0;h[C>>3]=N;L=c[228]|0;D=+h[L+(l*48&-1)+8>>3];if(D>N){h[C>>3]=D;O=c[228]|0;R=D}else{O=L;R=N}N=+h[O+(k*48&-1)+8>>3];if(N>R){h[C>>3]=N;S=N}else{S=R}if(S>M){a[46904]=1}S=+h[(c[228]|0)+(m*48&-1)+16>>3];C=z+(d+56|0)|0;h[C>>3]=S;O=c[228]|0;R=+h[O+(l*48&-1)+16>>3];if(R>S){h[C>>3]=R;T=c[228]|0;U=R}else{T=O;U=S}S=+h[T+(k*48&-1)+16>>3];if(S>U){h[C>>3]=S;V=S}else{V=U}if(V>M){a[46904]=1}C=z+(d+64|0)|0;T=c[228]|0;O=T+(k*48&-1)+8|0;L=T+(m*48&-1)+8|0;I=T+(k*48&-1)+16|0;F=T+(m*48&-1)+16|0;M=(+h[O>>3]- +h[L>>3])*(+h[I>>3]+ +h[F>>3]);h[C>>3]=M;e=T+(k*48&-1)|0;B=T+(m*48&-1)|0;V=(+h[I>>3]- +h[F>>3])*(+h[e>>3]+ +h[B>>3]);I=z+(d+72|0)|0;h[I>>3]=V;U=(+h[e>>3]- +h[B>>3])*(+h[O>>3]+ +h[L>>3]);O=z+(d+80|0)|0;h[O>>3]=U;e=c[228]|0;T=e+(l*48&-1)|0;j=e+(l*48&-1)+8|0;W=e+(l*48&-1)+16|0;S=M+(+h[L>>3]- +h[j>>3])*(+h[F>>3]+ +h[W>>3]);h[C>>3]=S;l=T|0;M=V+(+h[F>>3]- +h[W>>3])*(+h[B>>3]+ +h[l>>3]);h[I>>3]=M;V=U+(+h[B>>3]- +h[l>>3])*(+h[L>>3]+ +h[j>>3]);h[O>>3]=V;L=c[228]|0;B=L+(k*48&-1)|0;F=L+(k*48&-1)+8|0;e=L+(k*48&-1)+16|0;U=S+(+h[j>>3]- +h[F>>3])*(+h[W>>3]+ +h[e>>3]);h[C>>3]=U;k=B|0;S=M+(+h[W>>3]- +h[e>>3])*(+h[l>>3]+ +h[k>>3]);h[I>>3]=S;M=V+(+h[l>>3]- +h[k>>3])*(+h[j>>3]+ +h[F>>3]);h[O>>3]=M;V=+Q(+(U*U+S*S+M*M));if(V+-1.0e-5>0.0){X=V;Y=T;Z=M;_=U;$=S}else{T=c[228]|0;F=T+(m*48&-1)|0;j=F|0;k=T+(m*48&-1)+8|0;l=T+(m*48&-1)+16|0;m=1;e=B;while(1){if((m|0)>=3){ab=12789;break}B=c[b+(m<<2)>>2]|0;W=T+(B*48&-1)|0;S=+h[j>>3];U=+P(+(S- +h[W>>3]));M=+h[k>>3];V=U+ +P(+(M- +h[T+(B*48&-1)+8>>3]));U=+h[l>>3];if(V+ +P(+(U- +h[T+(B*48&-1)+16>>3]))+-1.0e-5>0.0){ac=W;ad=S;ae=M;af=U;break}else{m=m+1|0;e=W}}if((ab|0)==12789){ac=e;ad=+h[j>>3];ae=+h[k>>3];af=+h[l>>3]}e=ac+8|0;U=+h[e>>3];if(+P(+(ae-U))<1.0e-5){ag=ae+1.0;ah=ad}else{ag=ae;ah=ad+1.0}ab=ac+16|0;ad=+h[ab>>3];M=ag*(af-ad)+((af-af)*U+ae*(ad-af));h[C>>3]=M;m=ac|0;ad=+h[m>>3];ae=+h[j>>3];U=af*(ae-ad)+(+h[l>>3]*(ad-ah)+ +h[ab>>3]*(ah-ae));h[I>>3]=U;ae=+h[e>>3];ad=+h[k>>3];af=ah*(ad-ae)+(+h[j>>3]*(ae-ag)+ +h[m>>3]*(ag-ad));h[O>>3]=af;X=+Q(+(M*M+U*U+af*af));Y=F;Z=af;_=M;$=U}if(Z<0.0){ai=0;aj=X*-1.0}else{ai=1;aj=X}X=_/aj;h[C>>3]=X;_=$/aj;h[I>>3]=_;$=Z/aj;h[O>>3]=$;h[z+(d+88|0)>>3]=+h[Y>>3]*(-0.0-X)-_*+h[Y+8>>3]-$*+h[Y+16>>3];a[z+(d+96|0)|0]=ai;o=(A-(c[7628]|0)|0)/104&-1;i=f;return o|0}function gA(b,d,e,f,g,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;k=i;if((e|0)<=-2){i=k;return}l=(f|0)<-1?e:f;f=c[7628]|0;m=(a[f+(l*104&-1)+96|0]&1)<<1|a[f+(e*104&-1)+96|0]&1;do{if((m|0)==0){f=c[11608]|0;n=f+(b*20&-1)+8|0;if((c[n>>2]|0)==-3){o=f}else{c[n>>2]=j;o=c[11608]|0}n=o+(d*20&-1)+8|0;if((c[n>>2]|0)==-3){i=k;return}c[n>>2]=j;i=k;return}else if((m|0)==2){n=(c[11608]|0)+(b*20&-1)+8|0;if((c[n>>2]|0)==-3){break}c[n>>2]=j}else if((m|0)!=1){i=k;return}}while(0);m=c[11608]|0;do{if(!((b|0)==(d|0)&(a[38960]^1))){if((c[m+(d*20&-1)+8>>2]|0)!=-3){break}i=k;return}}while(0);b=m;m=c[b+(d*20&-1)>>2]|0;o=c[b+(d*20&-1)+4>>2]|0;n=c[7628]|0;f=c[n+(e*104&-1)>>2]|0;p=c[n+(e*104&-1)+4>>2]|0;do{if((f|0)==(m|0)){q=c[n+(e*104&-1)+8>>2]|0;if((p|0)==(o|0)){r=q;break}r=(q|0)==(o|0)?p:-1}else{if((p|0)==(m|0)){q=c[n+(e*104&-1)+8>>2]|0;if((f|0)==(o|0)){r=q;break}r=(q|0)==(o|0)?f:-1;break}if((c[n+(e*104&-1)+8>>2]|0)!=(m|0)){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=143816,v)|0)}if((f|0)==(o|0)){r=p;break}r=(p|0)==(o|0)?f:-1}}while(0);if((r|0)<=-1){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=143816,v)|0)}f=c[228]|0;if(+h[n+(l*104&-1)+88>>3]+(+h[f+(r*48&-1)>>3]*+h[n+(l*104&-1)+64>>3]+ +h[f+(r*48&-1)+8>>3]*+h[n+(l*104&-1)+72>>3]+ +h[f+(r*48&-1)+16>>3]*+h[n+(l*104&-1)+80>>3])>0.0){c[b+(d*20&-1)+8>>2]=(a[n+(e*104&-1)+96|0]&1)!=0?g:j;i=k;return}else{c[b+(d*20&-1)+8>>2]=(a[n+(l*104&-1)+96|0]&1)!=0?g:j;i=k;return}}function gB(a,b,d,e){a=a|0;b=b|0;d=+d;e=e|0;var f=0.0,g=0,i=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0;f=+h[e+80>>3];if(f==0.0){g=0;return g|0}i=c[228]|0;j=c[e>>2]|0;k=c[e+4>>2]|0;l=c[e+8>>2]|0;m=+h[a>>3];n=m+(+h[b>>3]-m)*d;m=+h[a+8>>3];o=m+(+h[b+8>>3]-m)*d;m=+h[a+16>>3];p=m+(+h[b+16>>3]-m)*d;d=+h[i+(j*48&-1)>>3];m=+h[i+(j*48&-1)+8>>3];q=+h[i+(k*48&-1)>>3];r=+h[i+(k*48&-1)+8>>3];s=(o-m)*(q-d)-(n-d)*(r-m);t=+h[i+(l*48&-1)>>3];u=+h[i+(l*48&-1)+8>>3];v=(o-r)*(t-q)-(n-q)*(u-r);r=(d-t)*(o-u)-(n-t)*(m-u);do{if(s<-1.0e-5|v<-1.0e-5|r<-1.0e-5){if(s+-1.0e-5>0.0){g=0;return g|0}if(v+-1.0e-5>0.0){g=0;return g|0}if(r+-1.0e-5>0.0){g=0}else{break}return g|0}}while(0);r=(-0.0-(+h[e+88>>3]+(n*+h[e+64>>3]+o*+h[e+72>>3])))/f;if(r>3<<3,c[v>>2]=0,v)|0);return 0}g=c[225]|0;j=c[224]|0;do{if((g|0)<(j|0)){k=f;l=g}else{m=(c[226]|0)+j|0;if((m|0)==0){uu(f);c[228]=0;c[224]=0;c[225]=0;k=0;l=0;break}else{n=db(f,aa(c[227]|0,m),150384)|0;c[228]=n;c[224]=m;k=n;l=c[225]|0;break}}}while(0);f=c[227]|0;c[225]=l+1;j=aa(f,l);l=k+j|0;f=k;o=+h[f+(a*48&-1)>>3];p=o+(+h[f+(b*48&-1)>>3]-o)*d;h[l>>3]=p;f=c[228]|0;o=+h[f+(a*48&-1)+8>>3];q=o+(+h[f+(b*48&-1)+8>>3]-o)*d;h[k+(j+8|0)>>3]=q;f=c[228]|0;o=+h[f+(a*48&-1)+16>>3];r=o+(+h[f+(b*48&-1)+16>>3]-o)*d;h[k+(j+16|0)>>3]=r;f=c[228]|0;o=+h[f+(a*48&-1)+32>>3];h[k+(j+32|0)>>3]=o+(+h[f+(b*48&-1)+32>>3]-o)*d;c[k+(j+24|0)>>2]=0;j=c[228]|0;k=j;d=+P(+(p- +h[k+(a*48&-1)>>3]));o=d+ +P(+(q- +h[k+(a*48&-1)+8>>3]));if(o+ +P(+(r- +h[k+(a*48&-1)+16>>3]))+-1.0e-5<=0.0){if((j|0)==0){uk(119400,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}f=c[225]|0;if((f|0)==0){s=a;i=e;return s|0}c[225]=f-1;s=a;i=e;return s|0}o=+P(+(p- +h[k+(b*48&-1)>>3]));p=o+ +P(+(q- +h[k+(b*48&-1)+8>>3]));if(p+ +P(+(r- +h[k+(b*48&-1)+16>>3]))+-1.0e-5>0.0){s=(l-j|0)/48&-1;i=e;return s|0}j=c[225]|0;if((j|0)==0){s=b;i=e;return s|0}c[225]=j-1;s=b;i=e;return s|0}function gD(b){b=b|0;var d=0,e=0,f=0,g=0;d=i;e=c[b>>2]|0;if((a[e+8|0]&1)!=0){uf(-1,72648,(v=i,i=i+8|0,c[v>>2]=c[e+4>>2],v)|0)}b=e+16|0;f=c[6354]|0;if((f|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=f+1|0;c[6354]=g;f=14296+(g*24&-1)|0;g=b;c[f>>2]=c[g>>2];c[f+4>>2]=c[g+4>>2];c[f+8>>2]=c[g+8>>2];c[f+12>>2]=c[g+12>>2];c[f+16>>2]=c[g+16>>2];c[f+20>>2]=c[g+20>>2];if((c[b>>2]|0)!=3){i=d;return}b=c[e+24>>2]|0;if((b|0)==0){i=d;return}e=bP(b|0)|0;c[14304+((c[6354]|0)*24&-1)>>2]=e;i=d;return}function gE(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[6354]|0;if((d|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=d+1|0;c[6354]=e;d=14296+(e*24&-1)|0;e=a;c[d>>2]=c[e>>2];c[d+4>>2]=c[e+4>>2];c[d+8>>2]=c[e+8>>2];c[d+12>>2]=c[e+12>>2];c[d+16>>2]=c[e+16>>2];c[d+20>>2]=c[e+20>>2];if((c[a>>2]|0)!=3){i=b;return}e=c[a+8>>2]|0;if((e|0)==0){i=b;return}a=bP(e|0)|0;c[14304+((c[6354]|0)*24&-1)>>2]=a;i=b;return}function gF(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=c[a>>2]|0;a=d+24|0;e=c[6354]|0;if((e|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=e+1|0;c[6354]=f;e=14296+(f*24&-1)|0;f=a;c[e>>2]=c[f>>2];c[e+4>>2]=c[f+4>>2];c[e+8>>2]=c[f+8>>2];c[e+12>>2]=c[f+12>>2];c[e+16>>2]=c[f+16>>2];c[e+20>>2]=c[f+20>>2];if((c[a>>2]|0)!=3){i=b;return}a=c[d+32>>2]|0;if((a|0)==0){i=b;return}d=bP(a|0)|0;c[14304+((c[6354]|0)*24&-1)>>2]=d;i=b;return}function gG(a){a=a|0;var b=0;a=i;b=c[6354]|0;if((b|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=b-1;if((c[14296+(b*24&-1)>>2]|0)!=3){i=a;return}uu(c[14304+(b*24&-1)>>2]|0);i=a;return}function gH(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=c[a>>2]|0;a=d+48|0;e=c[6354]|0;if((e|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=e+1|0;c[6354]=f;e=14296+(f*24&-1)|0;f=a;c[e>>2]=c[f>>2];c[e+4>>2]=c[f+4>>2];c[e+8>>2]=c[f+8>>2];c[e+12>>2]=c[f+12>>2];c[e+16>>2]=c[f+16>>2];c[e+20>>2]=c[f+20>>2];if((c[a>>2]|0)!=3){i=b;return}a=c[d+56>>2]|0;if((a|0)==0){i=b;return}d=bP(a|0)|0;c[14304+((c[6354]|0)*24&-1)>>2]=d;i=b;return}function gI(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=d-1|0;c[6354]=e;f=c[14304+(d*24&-1)>>2]|0;g=c[a>>2]|0;a=g+24+(f*24&-1)|0;if((e|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d;e=14296+(d*24&-1)|0;d=a;c[e>>2]=c[d>>2];c[e+4>>2]=c[d+4>>2];c[e+8>>2]=c[d+8>>2];c[e+12>>2]=c[d+12>>2];c[e+16>>2]=c[d+16>>2];c[e+20>>2]=c[d+20>>2];if((c[a>>2]|0)!=3){i=b;return}a=c[g+24+(f*24&-1)+8>>2]|0;if((a|0)==0){i=b;return}f=bP(a|0)|0;c[14304+((c[6354]|0)*24&-1)>>2]=f;i=b;return}function gJ(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;b=i;i=i+24|0;d=c[a>>2]|0;a=d+8|0;if((c[a>>2]|0)==0){uf(-1,168872,(v=i,i=i+8|0,c[v>>2]=c[d+4>>2],v)|0)}e=d+24|0;f=b|0;g=e;c[f>>2]=c[g>>2];c[f+4>>2]=c[g+4>>2];c[f+8>>2]=c[g+8>>2];c[f+12>>2]=c[g+12>>2];c[f+16>>2]=c[g+16>>2];c[f+20>>2]=c[g+20>>2];h=c[6354]|0;if((h|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=h-1;j=14296+(h*24&-1)|0;c[g>>2]=c[j>>2];c[g+4>>2]=c[j+4>>2];c[g+8>>2]=c[j+8>>2];c[g+12>>2]=c[j+12>>2];c[g+16>>2]=c[j+16>>2];c[g+20>>2]=c[j+20>>2];j=c[d+16>>2]|0;if((j|0)!=1){uf(-1,138760,(v=i,i=i+16|0,c[v>>2]=c[d+4>>2],c[v+8>>2]=j,v)|0)}j=c[6932]|0;c[6932]=j+1;if((j|0)>250){uf(-1,137088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}j=c[a>>2]|0;a=c[9340]|0;h=c[j>>2]|0;k=0;while(1){if((k|0)>=(h|0)){break}l=c[j+8+(k<<5)>>2]|0;c[9340]=1;cM[c[41164+(l<<3)>>2]&511](j+8+(k<<5)+8|0);m=c[9340]|0;if((l-37|0)>>>0<4|(m|0)==1){k=m+k|0}else{n=12954;break}}if((n|0)==12954){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=206200,v)|0)}c[9340]=a;a=e|0;if((c[a>>2]|0)!=3){c[g>>2]=c[f>>2];c[g+4>>2]=c[f+4>>2];c[g+8>>2]=c[f+8>>2];c[g+12>>2]=c[f+12>>2];c[g+16>>2]=c[f+16>>2];c[g+20>>2]=c[f+20>>2];o=c[6932]|0;p=o-1|0;c[6932]=p;i=b;return}uu(c[d+32>>2]|0);c[a>>2]=1;c[g>>2]=c[f>>2];c[g+4>>2]=c[f+4>>2];c[g+8>>2]=c[f+8>>2];c[g+12>>2]=c[f+12>>2];c[g+16>>2]=c[f+16>>2];c[g+20>>2]=c[f+20>>2];o=c[6932]|0;p=o-1|0;c[6932]=p;i=b;return}function gK(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;b=i;i=i+288|0;d=b|0;e=c[a>>2]|0;a=e+8|0;if((c[a>>2]|0)==0){uf(-1,168872,(v=i,i=i+8|0,c[v>>2]=c[e+4>>2],v)|0)}f=d;g=e+24|0;c[f>>2]=c[g>>2];c[f+4>>2]=c[g+4>>2];c[f+8>>2]=c[g+8>>2];c[f+12>>2]=c[g+12>>2];c[f+16>>2]=c[g+16>>2];c[f+20>>2]=c[g+20>>2];f=d+24|0;h=e+48|0;c[f>>2]=c[h>>2];c[f+4>>2]=c[h+4>>2];c[f+8>>2]=c[h+8>>2];c[f+12>>2]=c[h+12>>2];c[f+16>>2]=c[h+16>>2];c[f+20>>2]=c[h+20>>2];h=d+48|0;f=e+72|0;c[h>>2]=c[f>>2];c[h+4>>2]=c[f+4>>2];c[h+8>>2]=c[f+8>>2];c[h+12>>2]=c[f+12>>2];c[h+16>>2]=c[f+16>>2];c[h+20>>2]=c[f+20>>2];f=d+72|0;h=e+96|0;c[f>>2]=c[h>>2];c[f+4>>2]=c[h+4>>2];c[f+8>>2]=c[h+8>>2];c[f+12>>2]=c[h+12>>2];c[f+16>>2]=c[h+16>>2];c[f+20>>2]=c[h+20>>2];h=d+96|0;f=e+120|0;c[h>>2]=c[f>>2];c[h+4>>2]=c[f+4>>2];c[h+8>>2]=c[f+8>>2];c[h+12>>2]=c[f+12>>2];c[h+16>>2]=c[f+16>>2];c[h+20>>2]=c[f+20>>2];f=d+120|0;h=e+144|0;c[f>>2]=c[h>>2];c[f+4>>2]=c[h+4>>2];c[f+8>>2]=c[h+8>>2];c[f+12>>2]=c[h+12>>2];c[f+16>>2]=c[h+16>>2];c[f+20>>2]=c[h+20>>2];h=d+144|0;f=e+168|0;c[h>>2]=c[f>>2];c[h+4>>2]=c[f+4>>2];c[h+8>>2]=c[f+8>>2];c[h+12>>2]=c[f+12>>2];c[h+16>>2]=c[f+16>>2];c[h+20>>2]=c[f+20>>2];f=d+168|0;h=e+192|0;c[f>>2]=c[h>>2];c[f+4>>2]=c[h+4>>2];c[f+8>>2]=c[h+8>>2];c[f+12>>2]=c[h+12>>2];c[f+16>>2]=c[h+16>>2];c[f+20>>2]=c[h+20>>2];h=d+192|0;f=e+216|0;c[h>>2]=c[f>>2];c[h+4>>2]=c[f+4>>2];c[h+8>>2]=c[f+8>>2];c[h+12>>2]=c[f+12>>2];c[h+16>>2]=c[f+16>>2];c[h+20>>2]=c[f+20>>2];f=d+216|0;h=e+240|0;c[f>>2]=c[h>>2];c[f+4>>2]=c[h+4>>2];c[f+8>>2]=c[h+8>>2];c[f+12>>2]=c[h+12>>2];c[f+16>>2]=c[h+16>>2];c[f+20>>2]=c[h+20>>2];h=d+240|0;f=e+264|0;c[h>>2]=c[f>>2];c[h+4>>2]=c[f+4>>2];c[h+8>>2]=c[f+8>>2];c[h+12>>2]=c[f+12>>2];c[h+16>>2]=c[f+16>>2];c[h+20>>2]=c[f+20>>2];f=d+264|0;h=e+288|0;c[f>>2]=c[h>>2];c[f+4>>2]=c[h+4>>2];c[f+8>>2]=c[h+8>>2];c[f+12>>2]=c[h+12>>2];c[f+16>>2]=c[h+16>>2];c[f+20>>2]=c[h+20>>2];h=c[6354]|0;if((h|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=h-1|0;c[6354]=f;j=c[14304+(h*24&-1)>>2]|0;h=c[e+16>>2]|0;if((j|0)!=(h|0)){uf(-1,123608,(v=i,i=i+24|0,c[v>>2]=c[e+4>>2],c[v+8>>2]=h,c[v+16>>2]=(h|0)==1?0:115,v)|0)}L17671:do{if((j|0)>12){h=j-12|0;if((h|0)>0){k=0;l=f}else{m=11;n=f;o=12972;break}while(1){if((l|0)<0){break}p=l-1|0;c[6354]=p;q=14296+(l*24&-1)|0;c[g>>2]=c[q>>2];c[g+4>>2]=c[q+4>>2];c[g+8>>2]=c[q+8>>2];c[g+12>>2]=c[q+12>>2];c[g+16>>2]=c[q+16>>2];c[g+20>>2]=c[q+20>>2];q=k+1|0;if((q|0)<(h|0)){k=q;l=p}else{m=11;n=p;o=12972;break L17671}}uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h=j-1|0;if((h|0)>-1){m=h;n=f;o=12972}}}while(0);L17678:do{if((o|0)==12972){while(1){o=0;if((n|0)<0){break}f=n-1|0;c[6354]=f;j=e+24+(m*24&-1)|0;l=14296+(n*24&-1)|0;c[j>>2]=c[l>>2];c[j+4>>2]=c[l+4>>2];c[j+8>>2]=c[l+8>>2];c[j+12>>2]=c[l+12>>2];c[j+16>>2]=c[l+16>>2];c[j+20>>2]=c[l+20>>2];if((m|0)>0){m=m-1|0;n=f;o=12972}else{break L17678}}uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);n=c[6932]|0;c[6932]=n+1;if((n|0)>250){uf(-1,137088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}n=c[a>>2]|0;a=c[9340]|0;m=c[n>>2]|0;f=0;while(1){if((f|0)>=(m|0)){break}l=c[n+8+(f<<5)>>2]|0;c[9340]=1;cM[c[41164+(l<<3)>>2]&511](n+8+(f<<5)+8|0);j=c[9340]|0;if((l-37|0)>>>0<4|(j|0)==1){f=j+f|0}else{o=12980;break}}if((o|0)==12980){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=206200,v)|0)}c[9340]=a;c[6932]=(c[6932]|0)-1;a=0;do{o=e+24+(a*24&-1)|0;f=o|0;if((c[f>>2]|0)==3){uu(c[e+24+(a*24&-1)+8>>2]|0);c[f>>2]=1}f=o;o=d+(a*24&-1)|0;c[f>>2]=c[o>>2];c[f+4>>2]=c[o+4>>2];c[f+8>>2]=c[o+8>>2];c[f+12>>2]=c[o+12>>2];c[f+16>>2]=c[o+16>>2];c[f+20>>2]=c[o+20>>2];a=a+1|0;}while((a|0)<12);i=b;return}function gL(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0,t=0.0,u=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0,D=0.0,E=0.0,F=0.0;d=i;e=c[6354]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=e-1|0;c[6354]=f;g=c[14296+(e*24&-1)>>2]|0;j=c[14304+(e*24&-1)>>2]|0;if((f|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}k=e-2|0;c[6354]=k;l=c[14304+(f*24&-1)>>2]|0;if((k|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}m=c[14296+(f*24&-1)>>2]|0;c[6354]=e-3;e=c[14304+(k*24&-1)>>2]|0;if(!((m|0)==1&(g|0)==1)){uf(-1,106264,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((c[14296+(k*24&-1)>>2]|0)==3){n=43240}else{uf(-1,98792,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}while(1){o=c[n>>2]|0;if((o|0)==0){p=12998;break}if((aY(e|0,c[o+4>>2]|0)|0)==0){break}else{n=o|0}}if((p|0)==12998){uf(-1,93136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}a[o+8|0]=0;n=c[b>>2]|0;if((n|0)==0){uf(-1,85336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}L17723:do{if((l|0)>(j|0)){q=0.0;r=0.0;s=0}else{b=o+16|0;k=o+24|0;g=n+8|0;t=0.0;m=l;u=0.0;L17725:while(1){c[b>>2]=1;c[k>>2]=m;f=c[g>>2]|0;w=c[9340]|0;x=c[f>>2]|0;y=0;while(1){if((y|0)>=(x|0)){break}z=c[f+8+(y<<5)>>2]|0;c[9340]=1;cM[c[41164+(z<<3)>>2]&511](f+8+(y<<5)+8|0);A=c[9340]|0;if((z-37|0)>>>0<4|(A|0)==1){y=A+y|0}else{p=13006;break L17725}}c[9340]=w;y=c[6354]|0;if((y|0)<0){p=13008;break}c[6354]=y-1;f=14296+(y*24&-1)|0;x=c[f>>2]|0;A=c[f+4>>2]|0;f=14304+(y*24&-1)|0;B=c[f>>2]|0;if((x|0)==2){C=+h[14312+(y*24&-1)>>3];D=+h[f>>3]}else if((x|0)==3){p=13013;break}else if((x|0)==1){C=0.0;D=+(B|0)}else{p=13011;break}E=u+D;F=t+C;x=m+1|0;if((x|0)>(j|0)){q=F;r=E;s=A;break L17723}else{t=F;m=x;u=E}}if((p|0)==13013){m=B;uz(m,0);uh(-1,212704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);uf(-1,212032,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((p|0)==13011){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((p|0)==13006){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=206200,v)|0)}else if((p|0)==13008){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);uu(e);e=c[6354]|0;if((e|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{p=e+1|0;c[6354]=p;e=14296+(p*24&-1)|0;c[e>>2]=2;c[e+4>>2]=s;h[14304+(p*24&-1)>>3]=r;h[14312+(p*24&-1)>>3]=q;i=d;return}}function gM(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;a=i;i=i+16|0;b=c[6354]|0;if((b|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}d=b-1|0;c[6354]=d;e=14296+(b*24&-1)|0;f=e;g=e|0;e=c[g>>2]|0;h=f+4|0;j=c[h>>2]|0;k=14304+(b*24&-1)|0;l=c[k>>2]|0;m=f+12|0;f=a|0;c[f>>2]=c[m>>2];c[f+4>>2]=c[m+4>>2];c[f+8>>2]=c[m+8>>2];if((e|0)!=1){uf(-1,207704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((d|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{c[6354]=b;c[g>>2]=1;c[h>>2]=j;c[k>>2]=(l|0)==0&1;c[m>>2]=c[f>>2];c[m+4>>2]=c[f+4>>2];c[m+8>>2]=c[f+8>>2];i=a;return}}function gN(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;a=i;i=i+16|0;b=c[6354]|0;if((b|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}d=b-1|0;c[6354]=d;e=14296+(b*24&-1)|0;f=e;g=e|0;e=c[g>>2]|0;h=f+4|0;j=c[h>>2]|0;k=14304+(b*24&-1)|0;l=c[k>>2]|0;m=f+12|0;f=a|0;c[f>>2]=c[m>>2];c[f+4>>2]=c[m+4>>2];c[f+8>>2]=c[m+8>>2];if((e|0)!=1){uf(-1,207704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((d|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{c[6354]=b;c[g>>2]=1;c[h>>2]=j;c[k>>2]=l^-1;c[m>>2]=c[f>>2];c[m+4>>2]=c[f+4>>2];c[m+8>>2]=c[f+8>>2];i=a;return}}function gO(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;a=i;i=i+16|0;b=c[6354]|0;if((b|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}d=b-1|0;c[6354]=d;e=c[14304+(b*24&-1)>>2]|0;if((c[14296+(b*24&-1)>>2]|0)!=1){uf(-1,207704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=b-2|0;c[6354]=f;b=14296+(d*24&-1)|0;g=b;h=b|0;b=c[h>>2]|0;j=g+4|0;k=c[j>>2]|0;l=14304+(d*24&-1)|0;m=c[l>>2]|0;n=g+12|0;g=a|0;c[g>>2]=c[n>>2];c[g+4>>2]=c[n+4>>2];c[g+8>>2]=c[n+8>>2];if((b|0)!=1){uf(-1,207704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((m|0)==0){o=(e|0)!=0&1}else{o=1}if((f|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{c[6354]=d;c[h>>2]=1;c[j>>2]=k;c[l>>2]=o;c[n>>2]=c[g>>2];c[n+4>>2]=c[g+4>>2];c[n+8>>2]=c[g+8>>2];i=a;return}}function gP(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;a=i;i=i+16|0;b=c[6354]|0;if((b|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}d=b-1|0;c[6354]=d;e=c[14304+(b*24&-1)>>2]|0;if((c[14296+(b*24&-1)>>2]|0)!=1){uf(-1,207704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=b-2|0;c[6354]=f;b=14296+(d*24&-1)|0;g=b;h=b|0;b=c[h>>2]|0;j=g+4|0;k=c[j>>2]|0;l=14304+(d*24&-1)|0;m=c[l>>2]|0;n=g+12|0;g=a|0;c[g>>2]=c[n>>2];c[g+4>>2]=c[n+4>>2];c[g+8>>2]=c[n+8>>2];if((b|0)!=1){uf(-1,207704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((m|0)==0){o=0}else{o=(e|0)!=0&1}if((f|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{c[6354]=d;c[h>>2]=1;c[j>>2]=k;c[l>>2]=o;c[n>>2]=c[g>>2];c[n+4>>2]=c[g+4>>2];c[n+8>>2]=c[g+8>>2];i=a;return}}function gQ(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;a=i;i=i+16|0;b=c[6354]|0;if((b|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}d=b-1|0;c[6354]=d;e=c[14304+(b*24&-1)>>2]|0;if((c[14296+(b*24&-1)>>2]|0)!=1){uf(-1,207704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=b-2|0;c[6354]=f;b=14296+(d*24&-1)|0;g=b;h=b|0;b=c[h>>2]|0;j=g+4|0;k=c[j>>2]|0;l=14304+(d*24&-1)|0;m=c[l>>2]|0;n=g+12|0;g=a|0;c[g>>2]=c[n>>2];c[g+4>>2]=c[n+4>>2];c[g+8>>2]=c[n+8>>2];if((b|0)!=1){uf(-1,207704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((f|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{c[6354]=d;c[h>>2]=1;c[j>>2]=k;c[l>>2]=m|e;c[n>>2]=c[g>>2];c[n+4>>2]=c[g+4>>2];c[n+8>>2]=c[g+8>>2];i=a;return}}function gR(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;a=i;i=i+16|0;b=c[6354]|0;if((b|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}d=b-1|0;c[6354]=d;e=c[14304+(b*24&-1)>>2]|0;if((c[14296+(b*24&-1)>>2]|0)!=1){uf(-1,207704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=b-2|0;c[6354]=f;b=14296+(d*24&-1)|0;g=b;h=b|0;b=c[h>>2]|0;j=g+4|0;k=c[j>>2]|0;l=14304+(d*24&-1)|0;m=c[l>>2]|0;n=g+12|0;g=a|0;c[g>>2]=c[n>>2];c[g+4>>2]=c[n+4>>2];c[g+8>>2]=c[n+8>>2];if((b|0)!=1){uf(-1,207704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((f|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{c[6354]=d;c[h>>2]=1;c[j>>2]=k;c[l>>2]=m^e;c[n>>2]=c[g>>2];c[n+4>>2]=c[g+4>>2];c[n+8>>2]=c[g+8>>2];i=a;return}}function gS(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;a=i;i=i+16|0;b=c[6354]|0;if((b|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}d=b-1|0;c[6354]=d;e=c[14304+(b*24&-1)>>2]|0;if((c[14296+(b*24&-1)>>2]|0)!=1){uf(-1,207704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=b-2|0;c[6354]=f;b=14296+(d*24&-1)|0;g=b;h=b|0;b=c[h>>2]|0;j=g+4|0;k=c[j>>2]|0;l=14304+(d*24&-1)|0;m=c[l>>2]|0;n=g+12|0;g=a|0;c[g>>2]=c[n>>2];c[g+4>>2]=c[n+4>>2];c[g+8>>2]=c[n+8>>2];if((b|0)!=1){uf(-1,207704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((f|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{c[6354]=d;c[h>>2]=1;c[j>>2]=k;c[l>>2]=m&e;c[n>>2]=c[g>>2];c[n+4>>2]=c[g+4>>2];c[n+8>>2]=c[g+8>>2];i=a;return}}function gT(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0.0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0,s=0,t=0.0,u=0,w=0;a=i;i=i+16|0;b=a|0;d=a+8|0;e=c[6354]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=e-1|0;c[6354]=f;g=14296+(e*24&-1)|0;j=c[g>>2]|0;k=c[g+4>>2]|0;g=14304+(e*24&-1)|0;l=+h[g>>3];m=c[g>>2]|0;h[d>>3]=l;n=+h[14312+(e*24&-1)>>3];e=m;m=e;do{if((j|0)==3){o=+uz(m,b);g=(m|0)==(c[b>>2]|0);uu(m);if(g){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[d>>3]=o;p=0.0;q=o;r=c[6354]|0;s=13099;break}}else{if((j|0)==2){p=n;q=l;r=f;s=13099;break}else if((j|0)==1){c[d>>2]=-e;t=n;u=1;w=f;break}else{uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);if((s|0)==13099){h[d>>3]=-0.0-q;t=-0.0-p;u=2;w=r}if((w|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{r=w+1|0;c[6354]=r;w=14296+(r*24&-1)|0;c[w>>2]=u;c[w+4>>2]=k;h[14304+(r*24&-1)>>3]=+h[d>>3];h[14312+(r*24&-1)>>3]=t;i=a;return}}function gU(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,l=0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0.0,s=0,t=0.0,u=0,w=0.0,x=0.0,y=0,z=0,A=0.0;a=i;i=i+24|0;b=a|0;d=a+8|0;e=a+16|0;f=c[6354]|0;if((f|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=f-1|0;c[6354]=g;j=c[14296+(f*24&-1)>>2]|0;l=14304+(f*24&-1)|0;m=+h[l>>3];n=+h[14312+(f*24&-1)>>3];f=c[l>>2]|0;l=f;do{if((j|0)==3){o=+uz(l,d);p=(l|0)==(c[d>>2]|0);uu(l);if(p){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[k>>3]=o;q=2;r=0.0;s=c[6354]|0;t=o;u=c[k>>2]|0;break}}else{q=j;r=n;s=g;t=m;u=f}}while(0);if((s|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=s-1;f=14296+(s*24&-1)|0;g=c[f>>2]|0;j=c[f+4>>2]|0;f=14304+(s*24&-1)|0;m=+h[f>>3];l=c[f>>2]|0;h[e>>3]=m;n=+h[14312+(s*24&-1)>>3];s=l;l=s;do{if((g|0)==3){o=+uz(l,b);f=(l|0)==(c[b>>2]|0);uu(l);if(f){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[e>>3]=o;w=0.0;x=o;y=13122;break}}else{if((g|0)==2){w=n;x=m;y=13122;break}else if((g|0)!=1){uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((q|0)==1){z=(s|0)==(u|0)&1;A=n;break}else if((q|0)==2){if(+(s|0)!=t){z=0;A=n;break}z=r==0.0&1;A=n;break}else{uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);do{if((y|0)==13122){if((q|0)==1){if(+(u|0)!=x){z=0;A=w;break}z=w==0.0&1;A=w;break}else if((q|0)==2){if(x!=t){z=0;A=w;break}z=w==r&1;A=w;break}else{uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);c[e>>2]=z;z=c[6354]|0;if((z|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{q=z+1|0;c[6354]=q;z=14296+(q*24&-1)|0;c[z>>2]=1;c[z+4>>2]=j;h[14304+(q*24&-1)>>3]=+h[e>>3];h[14312+(q*24&-1)>>3]=A;i=a;return}}function gV(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,l=0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0.0,s=0,t=0.0,u=0,w=0.0,x=0.0,y=0,z=0,A=0.0;a=i;i=i+24|0;b=a|0;d=a+8|0;e=a+16|0;f=c[6354]|0;if((f|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=f-1|0;c[6354]=g;j=c[14296+(f*24&-1)>>2]|0;l=14304+(f*24&-1)|0;m=+h[l>>3];n=+h[14312+(f*24&-1)>>3];f=c[l>>2]|0;l=f;do{if((j|0)==3){o=+uz(l,d);p=(l|0)==(c[d>>2]|0);uu(l);if(p){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[k>>3]=o;q=2;r=0.0;s=c[6354]|0;t=o;u=c[k>>2]|0;break}}else{q=j;r=n;s=g;t=m;u=f}}while(0);if((s|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=s-1;f=14296+(s*24&-1)|0;g=c[f>>2]|0;j=c[f+4>>2]|0;f=14304+(s*24&-1)|0;m=+h[f>>3];l=c[f>>2]|0;h[e>>3]=m;n=+h[14312+(s*24&-1)>>3];s=l;l=s;do{if((g|0)==3){o=+uz(l,b);f=(l|0)==(c[b>>2]|0);uu(l);if(f){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[e>>3]=o;w=0.0;x=o;y=13150;break}}else{if((g|0)==2){w=n;x=m;y=13150;break}else if((g|0)!=1){uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((q|0)==2){if(+(s|0)!=t){z=1;A=n;break}z=r!=0.0&1;A=n;break}else if((q|0)==1){z=(s|0)!=(u|0)&1;A=n;break}else{uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);do{if((y|0)==13150){if((q|0)==2){if(x!=t){z=1;A=w;break}z=w!=r&1;A=w;break}else if((q|0)==1){if(+(u|0)!=x){z=1;A=w;break}z=w!=0.0&1;A=w;break}else{uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);c[e>>2]=z;z=c[6354]|0;if((z|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{u=z+1|0;c[6354]=u;z=14296+(u*24&-1)|0;c[z>>2]=1;c[z+4>>2]=j;h[14304+(u*24&-1)>>3]=+h[e>>3];h[14312+(u*24&-1)>>3]=A;i=a;return}}function gW(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,l=0,m=0.0,n=0.0,o=0,p=0,q=0,r=0.0,s=0,t=0.0,u=0.0,w=0.0,x=0,y=0,z=0.0;a=i;i=i+24|0;b=a|0;d=a+8|0;e=a+16|0;f=c[6354]|0;if((f|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=f-1|0;c[6354]=g;j=c[14296+(f*24&-1)>>2]|0;l=14304+(f*24&-1)|0;m=+h[l>>3];f=c[l>>2]|0;l=f;do{if((j|0)==3){n=+uz(l,d);o=(l|0)==(c[d>>2]|0);uu(l);if(o){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[k>>3]=n;p=2;q=c[6354]|0;r=n;s=c[k>>2]|0;break}}else{p=j;q=g;r=m;s=f}}while(0);if((q|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=q-1;f=14296+(q*24&-1)|0;g=c[f>>2]|0;j=c[f+4>>2]|0;f=14304+(q*24&-1)|0;m=+h[f>>3];l=c[f>>2]|0;h[e>>3]=m;n=+h[14312+(q*24&-1)>>3];q=l;l=q;do{if((g|0)==3){t=+uz(l,b);f=(l|0)==(c[b>>2]|0);uu(l);if(f){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[e>>3]=t;u=0.0;w=t;x=13177;break}}else{if((g|0)==2){u=n;w=m;x=13177;break}else if((g|0)!=1){uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((p|0)==2){y=+(q|0)>r;z=n;break}else if((p|0)==1){y=(q|0)>(s|0);z=n;break}else{uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);do{if((x|0)==13177){if((p|0)==1){y=w>+(s|0);z=u;break}else if((p|0)==2){y=w>r;z=u;break}else{uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);c[e>>2]=y&1;y=c[6354]|0;if((y|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{p=y+1|0;c[6354]=p;y=14296+(p*24&-1)|0;c[y>>2]=1;c[y+4>>2]=j;h[14304+(p*24&-1)>>3]=+h[e>>3];h[14312+(p*24&-1)>>3]=z;i=a;return}}function gX(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,l=0,m=0.0,n=0.0,o=0,p=0,q=0,r=0.0,s=0,t=0.0,u=0.0,w=0.0,x=0,y=0,z=0.0;a=i;i=i+24|0;b=a|0;d=a+8|0;e=a+16|0;f=c[6354]|0;if((f|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=f-1|0;c[6354]=g;j=c[14296+(f*24&-1)>>2]|0;l=14304+(f*24&-1)|0;m=+h[l>>3];f=c[l>>2]|0;l=f;do{if((j|0)==3){n=+uz(l,d);o=(l|0)==(c[d>>2]|0);uu(l);if(o){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[k>>3]=n;p=2;q=c[6354]|0;r=n;s=c[k>>2]|0;break}}else{p=j;q=g;r=m;s=f}}while(0);if((q|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=q-1;f=14296+(q*24&-1)|0;g=c[f>>2]|0;j=c[f+4>>2]|0;f=14304+(q*24&-1)|0;m=+h[f>>3];l=c[f>>2]|0;h[e>>3]=m;n=+h[14312+(q*24&-1)>>3];q=l;l=q;do{if((g|0)==3){t=+uz(l,b);f=(l|0)==(c[b>>2]|0);uu(l);if(f){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[e>>3]=t;u=0.0;w=t;x=13202;break}}else{if((g|0)==2){u=n;w=m;x=13202;break}else if((g|0)!=1){uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((p|0)==1){y=(q|0)<(s|0);z=n;break}else if((p|0)==2){y=+(q|0)>3<<3,c[v>>2]=0,v)|0)}}}while(0);do{if((x|0)==13202){if((p|0)==2){y=w>3<<3,c[v>>2]=0,v)|0)}}}while(0);c[e>>2]=y&1;y=c[6354]|0;if((y|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{s=y+1|0;c[6354]=s;y=14296+(s*24&-1)|0;c[y>>2]=1;c[y+4>>2]=j;h[14304+(s*24&-1)>>3]=+h[e>>3];h[14312+(s*24&-1)>>3]=z;i=a;return}}function gY(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,l=0,m=0.0,n=0.0,o=0,p=0,q=0,r=0.0,s=0,t=0.0,u=0.0,w=0.0,x=0,y=0,z=0.0;a=i;i=i+24|0;b=a|0;d=a+8|0;e=a+16|0;f=c[6354]|0;if((f|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=f-1|0;c[6354]=g;j=c[14296+(f*24&-1)>>2]|0;l=14304+(f*24&-1)|0;m=+h[l>>3];f=c[l>>2]|0;l=f;do{if((j|0)==3){n=+uz(l,d);o=(l|0)==(c[d>>2]|0);uu(l);if(o){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[k>>3]=n;p=2;q=c[6354]|0;r=n;s=c[k>>2]|0;break}}else{p=j;q=g;r=m;s=f}}while(0);if((q|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=q-1;f=14296+(q*24&-1)|0;g=c[f>>2]|0;j=c[f+4>>2]|0;f=14304+(q*24&-1)|0;m=+h[f>>3];l=c[f>>2]|0;h[e>>3]=m;n=+h[14312+(q*24&-1)>>3];q=l;l=q;do{if((g|0)==3){t=+uz(l,b);f=(l|0)==(c[b>>2]|0);uu(l);if(f){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[e>>3]=t;u=0.0;w=t;x=13227;break}}else{if((g|0)==2){u=n;w=m;x=13227;break}else if((g|0)!=1){uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((p|0)==2){y=+(q|0)>=r;z=n;break}else if((p|0)==1){y=(q|0)>=(s|0);z=n;break}else{uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);do{if((x|0)==13227){if((p|0)==1){y=w>=+(s|0);z=u;break}else if((p|0)==2){y=w>=r;z=u;break}else{uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);c[e>>2]=y&1;y=c[6354]|0;if((y|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{p=y+1|0;c[6354]=p;y=14296+(p*24&-1)|0;c[y>>2]=1;c[y+4>>2]=j;h[14304+(p*24&-1)>>3]=+h[e>>3];h[14312+(p*24&-1)>>3]=z;i=a;return}}function gZ(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,l=0,m=0.0,n=0.0,o=0,p=0,q=0,r=0.0,s=0,t=0.0,u=0.0,w=0.0,x=0,y=0,z=0.0;a=i;i=i+24|0;b=a|0;d=a+8|0;e=a+16|0;f=c[6354]|0;if((f|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=f-1|0;c[6354]=g;j=c[14296+(f*24&-1)>>2]|0;l=14304+(f*24&-1)|0;m=+h[l>>3];f=c[l>>2]|0;l=f;do{if((j|0)==3){n=+uz(l,d);o=(l|0)==(c[d>>2]|0);uu(l);if(o){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[k>>3]=n;p=2;q=c[6354]|0;r=n;s=c[k>>2]|0;break}}else{p=j;q=g;r=m;s=f}}while(0);if((q|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=q-1;f=14296+(q*24&-1)|0;g=c[f>>2]|0;j=c[f+4>>2]|0;f=14304+(q*24&-1)|0;m=+h[f>>3];l=c[f>>2]|0;h[e>>3]=m;n=+h[14312+(q*24&-1)>>3];q=l;l=q;do{if((g|0)==3){t=+uz(l,b);f=(l|0)==(c[b>>2]|0);uu(l);if(f){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[e>>3]=t;u=0.0;w=t;x=13252;break}}else{if((g|0)==2){u=n;w=m;x=13252;break}else if((g|0)!=1){uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((p|0)==1){y=(q|0)<=(s|0);z=n;break}else if((p|0)==2){y=+(q|0)<=r;z=n;break}else{uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);do{if((x|0)==13252){if((p|0)==2){y=w<=r;z=u;break}else if((p|0)==1){y=w<=+(s|0);z=u;break}else{uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);c[e>>2]=y&1;y=c[6354]|0;if((y|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{s=y+1|0;c[6354]=s;y=14296+(s*24&-1)|0;c[y>>2]=1;c[y+4>>2]=j;h[14304+(s*24&-1)>>3]=+h[e>>3];h[14312+(s*24&-1)>>3]=z;i=a;return}}function g_(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,l=0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0.0,s=0,t=0.0,u=0,w=0.0,x=0.0,y=0,z=0,A=0.0;a=i;i=i+24|0;b=a|0;d=a+8|0;e=a+16|0;f=c[6354]|0;if((f|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=f-1|0;c[6354]=g;j=c[14296+(f*24&-1)>>2]|0;l=14304+(f*24&-1)|0;m=+h[l>>3];n=+h[14312+(f*24&-1)>>3];f=c[l>>2]|0;l=f;do{if((j|0)==3){o=+uz(l,d);p=(l|0)==(c[d>>2]|0);uu(l);if(p){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[k>>3]=o;q=2;r=0.0;s=c[6354]|0;t=o;u=c[k>>2]|0;break}}else{q=j;r=n;s=g;t=m;u=f}}while(0);if((s|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=s-1;f=c[14296+(s*24&-1)>>2]|0;g=14304+(s*24&-1)|0;m=+h[g>>3];j=c[g>>2]|0;g=j;do{if((f|0)==3){n=+uz(g,b);l=(g|0)==(c[b>>2]|0);uu(g);if(!l){w=0.0;x=n;y=13276;break}uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{if((f|0)==2){w=+h[14312+(s*24&-1)>>3];x=m;y=13276;break}else if((f|0)!=1){uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((q|0)==1){c[e>>2]=u+j;z=1;A=0.0;break}else if((q|0)==2){h[e>>3]=+(j|0)+t;z=2;A=r;break}else{uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);do{if((y|0)==13276){if((q|0)==2){h[e>>3]=x+t;z=2;A=r+w;break}else if((q|0)==1){h[e>>3]=+(u|0)+x;z=2;A=w;break}else{uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);u=c[6354]|0;if((u|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{q=u+1|0;c[6354]=q;c[14296+(q*24&-1)>>2]=z;h[14304+(q*24&-1)>>3]=+h[e>>3];h[14312+(q*24&-1)>>3]=A;i=a;return}}function g$(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,l=0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0.0,s=0,t=0.0,u=0,w=0.0,x=0.0,y=0,z=0,A=0.0;a=i;i=i+24|0;b=a|0;d=a+8|0;e=a+16|0;f=c[6354]|0;if((f|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=f-1|0;c[6354]=g;j=c[14296+(f*24&-1)>>2]|0;l=14304+(f*24&-1)|0;m=+h[l>>3];n=+h[14312+(f*24&-1)>>3];f=c[l>>2]|0;l=f;do{if((j|0)==3){o=+uz(l,d);p=(l|0)==(c[d>>2]|0);uu(l);if(p){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[k>>3]=o;q=2;r=0.0;s=c[6354]|0;t=o;u=c[k>>2]|0;break}}else{q=j;r=n;s=g;t=m;u=f}}while(0);if((s|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=s-1;f=c[14296+(s*24&-1)>>2]|0;g=14304+(s*24&-1)|0;m=+h[g>>3];j=c[g>>2]|0;g=j;do{if((f|0)==3){n=+uz(g,b);l=(g|0)==(c[b>>2]|0);uu(g);if(!l){w=0.0;x=n;y=17;break}uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{if((f|0)==2){w=+h[14312+(s*24&-1)>>3];x=m;y=17;break}else if((f|0)!=1){uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((q|0)==1){c[e>>2]=j-u;z=1;A=0.0;break}else if((q|0)==2){h[e>>3]=+(j|0)-t;z=2;A=-0.0-r;break}else{uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);do{if((y|0)==17){if((q|0)==1){h[e>>3]=x- +(u|0);z=2;A=w;break}else if((q|0)==2){h[e>>3]=x-t;z=2;A=w-r;break}else{uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);q=c[6354]|0;if((q|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{u=q+1|0;c[6354]=u;c[14296+(u*24&-1)>>2]=z;h[14304+(u*24&-1)>>3]=+h[e>>3];h[14312+(u*24&-1)>>3]=A;i=a;return}}function g0(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,l=0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0.0,s=0,t=0.0,u=0,w=0.0,x=0.0,y=0,z=0,A=0.0;a=i;i=i+24|0;b=a|0;d=a+8|0;e=a+16|0;f=c[6354]|0;if((f|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=f-1|0;c[6354]=g;j=c[14296+(f*24&-1)>>2]|0;l=14304+(f*24&-1)|0;m=+h[l>>3];n=+h[14312+(f*24&-1)>>3];f=c[l>>2]|0;l=f;do{if((j|0)==3){o=+uz(l,d);p=(l|0)==(c[d>>2]|0);uu(l);if(p){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[k>>3]=o;q=2;r=0.0;s=c[6354]|0;t=o;u=c[k>>2]|0;break}}else{q=j;r=n;s=g;t=m;u=f}}while(0);if((s|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=s-1;f=c[14296+(s*24&-1)>>2]|0;g=14304+(s*24&-1)|0;m=+h[g>>3];j=c[g>>2]|0;g=j;do{if((f|0)==3){n=+uz(g,b);l=(g|0)==(c[b>>2]|0);uu(g);if(!l){w=0.0;x=n;y=43;break}uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{if((f|0)==2){w=+h[14312+(s*24&-1)>>3];x=m;y=43;break}else if((f|0)!=1){uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((q|0)==1){n=+(j|0)*+(u|0);if(+P(+n)<2147483647.0){c[e>>2]=aa(u,j);z=1;A=0.0;break}else{h[e>>3]=n;z=2;A=0.0;break}}else if((q|0)==2){n=+(j|0);h[e>>3]=n*t;z=2;A=r*n;break}else{uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);do{if((y|0)==43){if((q|0)==1){m=+(u|0);h[e>>3]=m*x;z=2;A=w*m;break}else if((q|0)==2){h[e>>3]=x*t-r*w;z=2;A=r*x+w*t;break}else{uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);q=c[6354]|0;if((q|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{u=q+1|0;c[6354]=u;c[14296+(u*24&-1)>>2]=z;h[14304+(u*24&-1)>>3]=+h[e>>3];h[14312+(u*24&-1)>>3]=A;i=a;return}}function g1(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0.0,t=0,u=0.0,w=0,x=0.0,y=0.0,z=0,A=0,B=0.0;b=i;i=i+24|0;d=b|0;e=b+8|0;f=b+16|0;g=c[6354]|0;if((g|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}j=g-1|0;c[6354]=j;l=c[14296+(g*24&-1)>>2]|0;m=14304+(g*24&-1)|0;n=+h[m>>3];o=+h[14312+(g*24&-1)>>3];g=c[m>>2]|0;m=g;do{if((l|0)==3){p=+uz(m,e);q=(m|0)==(c[e>>2]|0);uu(m);if(q){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[k>>3]=p;r=2;s=0.0;t=c[6354]|0;u=p;w=c[k>>2]|0;break}}else{r=l;s=o;t=j;u=n;w=g}}while(0);if((t|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=t-1;g=c[14296+(t*24&-1)>>2]|0;j=14304+(t*24&-1)|0;n=+h[j>>3];l=c[j>>2]|0;j=l;do{if((g|0)==3){o=+uz(j,d);m=(j|0)==(c[d>>2]|0);uu(j);if(!m){x=0.0;y=o;z=71;break}uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{if((g|0)==2){x=+h[14312+(t*24&-1)>>3];y=n;z=71;break}else if((g|0)!=1){uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((r|0)==1){if((w|0)==0){c[f>>2]=0;a[1960]=1;A=1;B=0.0;break}else{c[f>>2]=(l|0)/(w|0)&-1;A=1;B=0.0;break}}else if((r|0)==2){o=s*s+u*u;if(o!=0.0){h[f>>3]=u*+(l|0)/o;A=2;B=s*+(-l|0)/o;break}else{h[f>>3]=0.0;a[1960]=1;A=2;B=0.0;break}}else{uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);do{if((z|0)==71){if((r|0)==1){if((w|0)==0){h[f>>3]=0.0;a[1960]=1;A=2;B=0.0;break}else{n=+(w|0);h[f>>3]=y/n;A=2;B=x/n;break}}else if((r|0)==2){n=s*s+u*u;if(n!=0.0){h[f>>3]=(s*x+u*y)/n;A=2;B=(x*u-s*y)/n;break}else{h[f>>3]=0.0;a[1960]=1;A=2;B=0.0;break}}else{uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);r=c[6354]|0;if((r|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{w=r+1|0;c[6354]=w;c[14296+(w*24&-1)>>2]=A;h[14304+(w*24&-1)>>3]=+h[f>>3];h[14312+(w*24&-1)>>3]=B;i=b;return}}function g2(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,l=0,m=0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0.0,x=0;b=i;i=i+24|0;d=b|0;e=b+8|0;f=b+16|0;g=c[6354]|0;if((g|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}j=g-1|0;c[6354]=j;l=c[14296+(g*24&-1)>>2]|0;m=c[14304+(g*24&-1)>>2]|0;g=m;do{if((l|0)==3){n=+uz(g,e);o=(g|0)==(c[e>>2]|0);uu(g);if(o){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[k>>3]=n;p=2;q=c[6354]|0;r=c[k>>2]|0;break}}else{p=l;q=j;r=m}}while(0);if((q|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}m=q-1|0;c[6354]=m;j=14296+(q*24&-1)|0;l=j|0;g=c[l>>2]|0;e=j+4|0;j=c[e>>2]|0;o=14304+(q*24&-1)|0;s=c[o>>2]|0;h[f>>3]=+h[o>>3];t=14312+(q*24&-1)|0;n=+h[t>>3];u=s;s=u;if((g|0)==3){w=+uz(s,d);x=(s|0)==(c[d>>2]|0);uu(s);if(x){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}h[f>>3]=w;uf(-1,224848,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if(!((g|0)==1&(p|0)==1)){uf(-1,224848,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}p=f;if((r|0)==0){c[p>>2]=0;if((m|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=q;c[l>>2]=1;c[e>>2]=j;h[o>>3]=+h[f>>3];h[t>>3]=n;a[1960]=1;i=b;return}else{c[p>>2]=(u|0)%(r|0)&-1;if((m|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=q;c[l>>2]=1;c[e>>2]=j;h[o>>3]=+h[f>>3];h[t>>3]=n;i=b;return}}function g3(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0.0,t=0,u=0.0,w=0,x=0.0,y=0.0,z=0,A=0,B=0.0,C=0,D=0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,U=0.0,V=0.0;b=i;i=i+24|0;d=b|0;e=b+8|0;f=b+16|0;g=c[6354]|0;if((g|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}j=g-1|0;c[6354]=j;l=c[14296+(g*24&-1)>>2]|0;m=14304+(g*24&-1)|0;n=+h[m>>3];o=+h[14312+(g*24&-1)>>3];g=c[m>>2]|0;m=g;do{if((l|0)==3){p=+uz(m,e);q=(m|0)==(c[e>>2]|0);uu(m);if(q){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[k>>3]=p;r=2;s=0.0;t=c[6354]|0;u=p;w=c[k>>2]|0;break}}else{r=l;s=o;t=j;u=n;w=g}}while(0);if((t|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=t-1;g=c[14296+(t*24&-1)>>2]|0;j=14304+(t*24&-1)|0;n=+h[j>>3];l=c[j>>2]|0;j=l;do{if((g|0)==3){o=+uz(j,d);m=(j|0)==(c[d>>2]|0);uu(j);if(!m){x=0.0;y=o;z=143;break}uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{if((g|0)==2){x=+h[14312+(t*24&-1)>>3];y=n;z=143;break}else if((g|0)!=1){uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((r|0)==1){if((l|0)==0){if((w|0)<0){a[1960]=1}c[f>>2]=(w|0)==0&1;A=1;B=0.0;break}o=+R(+(+(l|0)),+(+(w|0)));if(o>2147483647.0|(w|0)<0){h[f>>3]=o;A=2;B=0.0;break}if((w|0)>0){m=0;e=1;while(1){q=aa(l,e);C=m+1|0;if((C|0)<(w|0)){m=C;e=q}else{D=q;break}}}else{D=1}c[f>>2]=D;A=1;B=0.0;break}else if((r|0)==2){if((l|0)==0){if(s!=0.0|u<0.0){a[1960]=1}h[f>>3]=u==0.0?1.0:0.0;A=2;B=0.0;break}o=+R(+(+(((l|0)>-1?l:-l|0)|0)),+(+P(+u)));do{if(u<0.0){if(o!=0.0){E=1.0/o;break}else{a[1960]=1;E=o;break}}else{E=o}}while(0);o=((l|0)>-1?0.0:3.141592653589793)*(-0.0-s);if(o<-706.893623549172){F=0.0}else{F=+Z(+o)}o=E*F;e=(l|0)>-1;p=u*(e?0.0:3.141592653589793)+s*+_(+(+((e?l:-l|0)|0)));G=o*+S(+p);H=o*+T(+p);h[f>>3]=G;A=2;B=H;break}else{uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);do{if((z|0)==143){if((r|0)==1){if(x==0.0){F=+R(+y,+(+(((w|0)>-1?w:-w|0)|0)));do{if((w|0)<0){if(F!=0.0){I=1.0/F;break}else{a[1960]=1;I=F;break}}else{I=F}}while(0);h[f>>3]=I;A=2;B=0.0;break}F=+P(+y);E=+P(+x);if(F>E){n=E/F;J=F*+Q(+(n*n+1.0))}else{n=F/E;J=E*+Q(+(n*n+1.0))}n=+R(+J,+(+(((w|0)>-1?w:-w|0)|0)));do{if((w|0)<0){if(n!=0.0){K=1.0/n;break}else{a[1960]=1;K=n;break}}else{K=n}}while(0);n=+Y(+x,+y)*+(w|0);E=K*+S(+n);F=K*+T(+n);h[f>>3]=E;A=2;B=F;break}else if((r|0)==2){l=x==0.0;if(y==0.0&l){if(s!=0.0|u<0.0){a[1960]=1}h[f>>3]=u==0.0?1.0:0.0;A=2;B=0.0;break}F=+P(+y);E=+P(+x);do{if(l){L=F}else{if(F>E){n=E/F;L=F*+Q(+(n*n+1.0));break}else{n=F/E;L=E*+Q(+(n*n+1.0));break}}}while(0);n=+R(+L,+(+P(+u)));do{if(u<0.0){if(n!=0.0){M=1.0/n;break}else{a[1960]=1;M=n;break}}else{M=n}}while(0);if(l){N=y<0.0?3.141592653589793:0.0}else{N=+Y(+x,+y)}n=N*(-0.0-s);if(n<-706.893623549172){O=0.0}else{O=+Z(+n)}n=M*O;do{if(l){U=F;V=u*(y<0.0?3.141592653589793:0.0)}else{H=u*+Y(+x,+y);if(F>E){G=E/F;U=F*+Q(+(G*G+1.0));V=H;break}else{G=F/E;U=E*+Q(+(G*G+1.0));V=H;break}}}while(0);E=V+s*+_(+U);F=n*+S(+E);H=n*+T(+E);h[f>>3]=F;A=2;B=H;break}else{uf(-1,77088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);r=c[6354]|0;if((r|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{w=r+1|0;c[6354]=w;c[14296+(w*24&-1)>>2]=A;h[14304+(w*24&-1)>>3]=+h[f>>3];h[14312+(w*24&-1)>>3]=B;i=b;return}}function g4(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0.0;a=i;i=i+8|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=d-1|0;c[6354]=e;f=14296+(d*24&-1)|0;g=f|0;j=c[g>>2]|0;k=f+4|0;f=c[k>>2]|0;l=14304+(d*24&-1)|0;m=c[l>>2]|0;n=m;if((j|0)==3){uz(n,b);o=(n|0)==(c[b>>2]|0);uu(n);if(o){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{uf(-1,217536,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}if((j|0)!=1){uf(-1,217536,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((m|0)>1){j=m;p=1.0;while(1){q=p*+(j|0);m=j-1|0;if((m|0)>1){j=m;p=q}else{r=q;break}}}else{r=1.0}if((e|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{c[6354]=d;c[g>>2]=2;c[k>>2]=f;h[l>>3]=r;h[14312+(d*24&-1)>>3]=0.0;i=a;return}}function g5(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;a=i;i=i+16|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=d-1|0;c[6354]=e;f=c[14296+(d*24&-1)>>2]|0;g=c[14304+(d*24&-1)>>2]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-2;d=c[14296+(e*24&-1)>>2]|0;h=c[14304+(e*24&-1)>>2]|0;if((f|0)==1){e=ut(32)|0;do{if((e|0)==0){gk();j=ut(32)|0;if((j|0)!=0){k=j;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=211880,v)|0)}else{k=e}}while(0);e=k;a0(k|0,32,21e4,(v=i,i=i+8|0,c[v>>2]=g,v)|0);l=3;m=e}else{l=f;m=g}if(!((d|0)==3&(l|0)==3)){uf(-1,202496,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}l=m;m=uc(h,l)|0;uu(h);uu(l);l=c[6354]|0;if((l|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}h=l+1|0;c[6354]=h;l=14296+(h*24&-1)|0;d=l;c[l>>2]=3;c[d+4>>2]=n;c[14304+(h*24&-1)>>2]=m;h=d+12|0;d=b|0;c[h>>2]=c[d>>2];c[h+4>>2]=c[d+4>>2];c[h+8>>2]=c[d+8>>2];if((m|0)==0){uu(m);i=a;return}d=bP(m|0)|0;c[14304+((c[6354]|0)*24&-1)>>2]=d;uu(m);i=a;return}function g6(a){a=a|0;var b=0,d=0,e=0,f=0;a=i;i=i+16|0;b=c[6354]|0;if((b|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}d=b-1|0;c[6354]=d;e=c[14304+(b*24&-1)>>2]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=c[14296+(b*24&-1)>>2]|0;c[6354]=b-2;b=c[14304+(d*24&-1)>>2]|0;if(!((c[14296+(d*24&-1)>>2]|0)==3&(f|0)==3)){uf(-1,202496,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=aY(b|0,e|0)|0;uu(b);uu(e);e=c[6354]|0;if((e|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{b=e+1|0;c[6354]=b;e=14296+(b*24&-1)|0;c[e>>2]=1;c[14304+(b*24&-1)>>2]=(f|0)==0&1;f=e+12|0;e=a|0;c[f>>2]=c[e>>2];c[f+4>>2]=c[e+4>>2];c[f+8>>2]=c[e+8>>2];i=a;return}}function g7(a){a=a|0;var b=0,d=0,e=0,f=0;a=i;i=i+16|0;b=c[6354]|0;if((b|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}d=b-1|0;c[6354]=d;e=c[14304+(b*24&-1)>>2]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=c[14296+(b*24&-1)>>2]|0;c[6354]=b-2;b=c[14304+(d*24&-1)>>2]|0;if(!((c[14296+(d*24&-1)>>2]|0)==3&(f|0)==3)){uf(-1,202496,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=aY(b|0,e|0)|0;uu(b);uu(e);e=c[6354]|0;if((e|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{b=e+1|0;c[6354]=b;e=14296+(b*24&-1)|0;c[e>>2]=1;c[14304+(b*24&-1)>>2]=(f|0)!=0&1;f=e+12|0;e=a|0;c[f>>2]=c[e>>2];c[f+4>>2]=c[e+4>>2];c[f+8>>2]=c[e+8>>2];i=a;return}}function g8(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;b=i;i=i+16|0;d=b|0;e=c[6354]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=e-1;f=c[14304+(e*24&-1)>>2]|0;if((c[14296+(e*24&-1)>>2]|0)!=3){uf(-1,197056,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}do{if((c[11252]|0)==15){e=a[f]|0;if(e<<24>>24==0){g=0;break}else{h=0;j=0;k=e}while(1){e=((k&-64)<<24>>24!=-128&1)+j|0;l=h+1|0;m=a[f+l|0]|0;if(m<<24>>24==0){g=e;break}else{h=l;j=e;k=m}}}else{g=uA(f|0)|0}}while(0);uu(f);f=c[6354]|0;if((f|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{k=f+1|0;c[6354]=k;f=14296+(k*24&-1)|0;c[f>>2]=1;c[14304+(k*24&-1)>>2]=g;g=f+12|0;f=d|0;c[g>>2]=c[f>>2];c[g+4>>2]=c[f+4>>2];c[g+8>>2]=c[f+8>>2];i=b;return}}function g9(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;a=i;i=i+16|0;b=c[6354]|0;if((b|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}d=b-1|0;c[6354]=d;e=c[14304+(b*24&-1)>>2]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=c[14296+(b*24&-1)>>2]|0;c[6354]=b-2;b=c[14304+(d*24&-1)>>2]|0;if((f|0)!=3){uf(-1,185704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((c[14296+(d*24&-1)>>2]|0)!=3){uf(-1,185704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}d=aQ(b|0,e|0)|0;if((d|0)==0){g=0}else{g=(1-b|0)+d|0}uu(e);uu(b);b=c[6354]|0;if((b|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{e=b+1|0;c[6354]=e;b=14296+(e*24&-1)|0;c[b>>2]=1;c[14304+(e*24&-1)>>2]=g;g=b+12|0;b=a|0;c[g>>2]=c[b>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];i=a;return}}function ha(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0;b=i;i=i+16|0;d=b|0;e=c[6354]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=e-1|0;c[6354]=f;g=c[14296+(e*24&-1)>>2]|0;h=c[14304+(e*24&-1)>>2]|0;if((f|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}j=e-2|0;c[6354]=j;k=c[14304+(f*24&-1)>>2]|0;if((j|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}l=c[14296+(f*24&-1)>>2]|0;f=e-3|0;c[6354]=f;m=c[14304+(j*24&-1)>>2]|0;if(!((g|0)==1&(l|0)==1)){uf(-1,180448,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((c[14296+(j*24&-1)>>2]|0)!=3){uf(-1,176264,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}j=(c[11252]|0)==15;do{if(j){l=a[m]|0;if(l<<24>>24==0){n=0;break}else{o=0;p=0;q=l}while(1){l=((q&-64)<<24>>24!=-128&1)+p|0;g=o+1|0;r=a[m+g|0]|0;if(r<<24>>24==0){n=l;break}else{o=g;p=l;q=r}}}else{n=uA(m|0)|0}}while(0);do{if(h>>>0>n>>>0){if(!j){s=uA(m|0)|0;break}q=a[m]|0;if(q<<24>>24==0){s=0;break}else{t=0;u=0;w=q}while(1){q=((w&-64)<<24>>24!=-128&1)+u|0;p=t+1|0;o=a[m+p|0]|0;if(o<<24>>24==0){s=q;break}else{t=p;u=q;w=o}}}else{s=h}}while(0);h=(k|0)<1?1:k;if((h|0)>(s|0)){if((f|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=e-2|0;c[6354]=f;e=14296+(f*24&-1)|0;c[e>>2]=3;c[14304+(f*24&-1)>>2]=179864;f=e+12|0;e=d|0;c[f>>2]=c[e>>2];c[f+4>>2]=c[e+4>>2];c[f+8>>2]=c[e+8>>2];e=bP(179864)|0;c[14304+((c[6354]|0)*24&-1)>>2]=e;uu(m);i=b;return}e=h-1|0;L406:do{if(j){if((e|0)<1){x=m}else{h=a[m]|0;L411:do{if(h<<24>>24==0){y=m}else{f=0;k=0;w=m;u=h;while(1){if((u&-64)<<24>>24==-128){z=k}else{if((k|0)==(e|0)){y=w;break L411}else{z=k+1|0}}t=f+1|0;n=m+t|0;o=a[n]|0;if(o<<24>>24==0){y=n;break}else{f=t;k=z;w=n;u=o}}}}while(0);if(j){x=y}else{A=y;B=297;break}}if((s|0)<1){C=m;D=x;break}h=a[m]|0;if(h<<24>>24==0){C=m;D=x;break}else{E=0;F=0;G=m;H=h}while(1){if((H&-64)<<24>>24==-128){I=F}else{if((F|0)==(s|0)){C=G;D=x;break L406}else{I=F+1|0}}h=E+1|0;u=m+h|0;w=a[u]|0;if(w<<24>>24==0){C=u;D=x;break}else{E=h;F=I;G=u;H=w}}}else{A=m+e|0;B=297}}while(0);if((B|0)==297){C=m+s|0;D=A}a[C]=0;C=c[6354]|0;if((C|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}A=C+1|0;c[6354]=A;C=14296+(A*24&-1)|0;s=C;c[C>>2]=3;c[s+4>>2]=J;c[14304+(A*24&-1)>>2]=D;A=s+12|0;s=d|0;c[A>>2]=c[s>>2];c[A+4>>2]=c[s+4>>2];c[A+8>>2]=c[s+8>>2];if((D|0)==0){uu(m);i=b;return}s=bP(D|0)|0;c[14304+((c[6354]|0)*24&-1)>>2]=s;uu(m);i=b;return}function hb(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0;b=i;i=i+16|0;d=b|0;e=c[6354]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=e-1|0;c[6354]=f;g=c[14304+(e*24&-1)>>2]|0;if((c[14296+(e*24&-1)>>2]|0)!=1){uf(-1,168392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((f|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=e-2;e=c[14304+(f*24&-1)>>2]|0;if((c[14296+(f*24&-1)>>2]|0)==3){h=e;j=0;k=179864}else{uf(-1,164176,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}while(1){f=a[h]|0;if(f<<24>>24==0){l=j;m=k;break}else{n=h;o=f}while(1){f=n+1|0;if((aM(o<<24>>24|0)|0)==0){break}n=f;o=a[f]|0}f=a[n]|0;if(f<<24>>24==0){l=j;m=k;break}p=j+1|0;q=(p|0)==(g|0);if(q){r=n}else{r=k}s=n;t=f;while(1){if(t<<24>>24==0){break}f=s+1|0;if((aM(t<<24>>24|0)|0)!=0){break}s=f;t=a[f]|0}if(q){u=325;break}else{h=s;j=p;k=r}}if((u|0)==325){a[s]=0;l=g;m=r}r=(g|0)<0?l:m;m=g>>31&-2;g=c[6354]|0;if((g|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}l=g+1|0;c[6354]=l;g=14296+(l*24&-1)|0;s=g;c[g>>2]=m+3;c[s+4>>2]=w;c[14304+(l*24&-1)>>2]=r;l=s+12|0;s=d|0;c[l>>2]=c[s>>2];c[l+4>>2]=c[s+4>>2];c[l+8>>2]=c[s+8>>2];if((m|0)!=0|(r|0)==0){uu(e);i=b;return}m=bP(r|0)|0;c[14304+((c[6354]|0)*24&-1)>>2]=m;uu(e);i=b;return}function hc(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0.0,Z=0.0,_=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0;b=i;i=i+256|0;d=b|0;e=b+240|0;f=c[6354]|0;if((f|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=f-1;g=c[14304+(f*24&-1)>>2]|0;if((g|0)>10){f=g*24&-1;j=ut(f)|0;do{if((j|0)==0){gk();k=ut(f)|0;if((k|0)!=0){l=k;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=154800,v)|0)}else{l=j}}while(0);m=l}else{m=d|0}l=(g|0)>0;L484:do{if(l){j=0;f=c[6354]|0;while(1){if((f|0)<0){break}k=f-1|0;c[6354]=k;n=m+(j*24&-1)|0;o=14296+(f*24&-1)|0;c[n>>2]=c[o>>2];c[n+4>>2]=c[o+4>>2];c[n+8>>2]=c[o+8>>2];c[n+12>>2]=c[o+12>>2];c[n+16>>2]=c[o+16>>2];c[n+20>>2]=c[o+20>>2];o=j+1|0;if((o|0)<(g|0)){j=o;f=k}else{break L484}}uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);f=g-1|0;if((c[m+(f*24&-1)>>2]|0)!=3){uf(-1,151464,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}j=m+(f*24&-1)+8|0;k=(uA(c[j>>2]|0)|0)+80|0;o=ut(k)|0;do{if((o|0)==0){gk();n=ut(k)|0;if((n|0)!=0){p=n;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=149624,v)|0)}else{p=o}}while(0);o=c[j>>2]|0;j=bk(o|0,191528)|0;uF(p|0,o|0,j|0);n=o+j|0;o=p+j|0;q=c[8270]|0;do{if((q|0)!=0){if((aY(q|0,139696)|0)==0){break}bA(4,q|0)}}while(0);L502:do{if((f|0)>0){q=o;r=n;s=j;t=k;u=p;w=g-2|0;L504:while(1){x=m+(w*24&-1)|0;y=q;z=t;A=u;while(1){B=y;C=r;D=a[r]|0;L508:while(1){if(D<<24>>24==0){E=B;F=A;break L502}G=C+1|0;H=a[G]|0;if(H<<24>>24==0){I=B;J=C;K=z;L=A;M=D;N=393;break L502}if((a_(C|0,143664,2)|0)==0){O=G;P=B;Q=H}else{break}while(1){H=O+1|0;R=P+1|0;a[P]=Q;S=a[H]|0;if((S<<24>>24|0)==0|(S<<24>>24|0)==37){B=R;C=H;D=S;continue L508}else{O=H;P=R;Q=S}}}T=C+((bk(G|0,191528)|0)+1|0)|0;D=a[T]|0;a[T]=0;if((a[C]|0)!=37){N=363;break L504}S=bk(C|0,20296)|0;R=bk(C|0,20304)|0;H=bk(C|0,20320)|0;U=bk(C|0,20328)|0;if((U|0)<(H|0)&(U|0)<(R|0)&(U|0)<(S|0)){N=365;break L504}do{if((S|0)<(R|0)&(S|0)<(H|0)){if((c[x>>2]|0)!=3){N=372;break L504}b0();U=(z-B|0)+A|0;V=c[m+(w*24&-1)+8>>2]|0;a0(B|0,U|0,C|0,(v=i,i=i+8|0,c[v>>2]=V,v)|0)}else{if((R|0)<(H|0)){W=2}else{if(H>>>0<(uA(C|0)|0)>>>0){W=1}else{N=369;break L504}}V=x|0;if((c[V>>2]|0)==3){N=374;break L504}b0();if((W|0)==2){U=(z-B|0)+A|0;X=c[V>>2]|0;if((X|0)==1){Y=+(c[m+(w*24&-1)+8>>2]|0)}else if((X|0)==2){Y=+h[m+(w*24&-1)+8>>3]}else if((X|0)==3){Y=+uz(c[m+(w*24&-1)+8>>2]|0,0)}else{N=386;break L504}a0(B|0,U|0,C|0,(v=i,i=i+8|0,h[v>>3]=Y,v)|0);break}else if((W|0)==1){U=(z-B|0)+A|0;X=c[V>>2]|0;if((X|0)==1){Z=+(c[m+(w*24&-1)+8>>2]|0)}else if((X|0)==2){Z=+h[m+(w*24&-1)+8>>3]}else if((X|0)==3){Z=+uz(c[m+(w*24&-1)+8>>2]|0,0)}else{N=380;break L504}a0(B|0,U|0,C|0,(v=i,i=i+8|0,c[v>>2]=~~Z,v)|0);break}else{N=388;break L504}}}while(0);a[T]=D;_=uA(A|0)|0;if(_>>>0<(z-2|0)>>>0){break}C=z<<1;B=db(A,C,149624)|0;y=B+s|0;z=C;A=B}y=A+_|0;if((w|0)>0){q=y;r=T;s=_;t=z;u=A;w=w-1|0}else{$=y;aa=T;ab=z;ac=A;N=392;break L502}}if((N|0)==369){uf(-1,106184,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((N|0)==372){uf(-1,142064,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((N|0)==386){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((N|0)==388){uf(-1,138488,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((N|0)==363){uf(-1,108e3,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((N|0)==365){uf(-1,107040,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((N|0)==374){uf(-1,140392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((N|0)==380){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}else{$=o;aa=n;ab=k;ac=p;N=392}}while(0);if((N|0)==392){I=$;J=aa;K=ab;L=ac;M=a[aa]|0;N=393}L552:do{if((N|0)==393){if(M<<24>>24==0){E=I;F=L;break}aa=I;ac=J;ab=(K-I|0)+L|0;$=M;while(1){p=ab-1|0;if((p|0)<=0){E=aa;F=L;break L552}if($<<24>>24==37){k=ac+1|0;n=(a[k]|0)==37?k:ac;ad=n;ae=a[n]|0}else{ad=ac;ae=$}n=ad+1|0;k=aa+1|0;a[aa]=ae;o=a[n]|0;if(o<<24>>24==0){E=k;F=L;break}else{aa=k;ac=n;ab=p;$=o}}}}while(0);a[E]=0;E=c[6354]|0;if((E|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}L=E+1|0;c[6354]=L;E=14296+(L*24&-1)|0;ae=E;c[E>>2]=3;c[ae+4>>2]=af;c[14304+(L*24&-1)>>2]=F;L=ae+12|0;ae=e|0;c[L>>2]=c[ae>>2];c[L+4>>2]=c[ae+4>>2];c[L+8>>2]=c[ae+8>>2];if((F|0)!=0){ae=bP(F|0)|0;c[14304+((c[6354]|0)*24&-1)>>2]=ae}uu(F);if(l){l=0;do{F=m+(l*24&-1)|0;if((c[F>>2]|0)==3){uu(c[m+(l*24&-1)+8>>2]|0);c[F>>2]=1}l=l+1|0;}while((l|0)<(g|0))}if((m|0)!=(d|0)){uu(m)}m=c[8270]|0;if((m|0)==0){i=b;return}if((aY(m|0,139696)|0)==0){i=b;return}bA(4,139696);i=b;return}function hd(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0.0,k=0,l=0,m=0,n=0,o=0.0;a=i;i=i+16|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=d-1|0;c[6354]=e;f=c[14296+(d*24&-1)>>2]|0;g=14304+(d*24&-1)|0;j=+h[g>>3];k=c[g>>2]|0;g=k;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-2;d=c[14304+(e*24&-1)>>2]|0;if((c[14296+(e*24&-1)>>2]|0)!=3){uf(-1,136912,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=(uA(d|0)|0)+80|0;l=ut(e)|0;do{if((l|0)==0){gk();m=ut(e)|0;if((m|0)!=0){n=m;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=134920,v)|0)}else{n=l}}while(0);if((f|0)==1){o=+(k|0)}else if((f|0)==3){o=+uz(g,0)}else if((f|0)==2){o=j}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}ud(n,e,d,10.0,o);e=c[6354]|0;if((e|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=e+1|0;c[6354]=f;e=14296+(f*24&-1)|0;c[e>>2]=3;c[14304+(f*24&-1)>>2]=n;f=e+12|0;e=b|0;c[f>>2]=c[e>>2];c[f+4>>2]=c[e+4>>2];c[f+8>>2]=c[e+8>>2];if((n|0)==0){uu(d);uu(n);i=a;return}e=bP(n|0)|0;c[14304+((c[6354]|0)*24&-1)>>2]=e;uu(d);uu(n);i=a;return}function he(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0.0,n=0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0.0;b=i;i=i+56|0;d=b|0;e=b+48|0;f=c[6354]|0;if((f|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=f-1|0;c[6354]=g;j=14296+(f*24&-1)|0;k=c[j>>2]|0;l=c[j+4>>2]|0;j=14304+(f*24&-1)|0;m=+h[j>>3];n=c[j>>2]|0;h[e>>3]=m;o=+h[14312+(f*24&-1)>>3];j=n;n=j;if((g|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=f-2;f=c[14304+(g*24&-1)>>2]|0;if((c[14296+(g*24&-1)>>2]|0)!=3){uf(-1,133408,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=uA(f|0)|0;p=g+1|0;q=g+2|0;g=ut(q)|0;do{if((g|0)==0){gk();r=ut(q)|0;if((r|0)!=0){s=r;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=132008,v)|0)}else{s=g}}while(0);uF(s|0,f|0,p|0);ck(s|0,73808,p|0);g=(p<<1)+80|0;p=ut(g)|0;do{if((p|0)==0){gk();q=ut(g)|0;if((q|0)!=0){t=q;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=129704,v)|0)}else{t=p}}while(0);if((k|0)==1){u=+(j|0)}else if((k|0)==3){u=+uz(n,0)}else if((k|0)==2){u=m}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}t3(d,u);j=t4(t,g,s,d,u- +O(+u))|0;if(!((j|0)!=0&(j|0)<(g|0))){uf(-1,128368,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=t+(j-1|0)|0;if((a[g]|0)!=32){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=125936,v)|0)}a[g]=0;if((k|0)==3){uu(n)}uu(f);uu(s);c[e>>2]=t;s=c[6354]|0;if((s|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=s+1|0;c[6354]=f;s=14296+(f*24&-1)|0;c[s>>2]=3;c[s+4>>2]=l;l=c[e>>2]|0;h[14304+(f*24&-1)>>3]=+h[e>>3];h[14312+(f*24&-1)>>3]=o;f=l;if((f|0)==0){uu(t);i=b;return}l=bP(f|0)|0;c[14304+((c[6354]|0)*24&-1)>>2]=l;uu(t);i=b;return}function hf(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0.0,o=0.0;a=i;i=i+56|0;b=a|0;d=a+48|0;h[d>>3]=0.0;e=c[6354]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=e-1|0;c[6354]=f;g=14296+(e*24&-1)|0;j=c[g+4>>2]|0;k=c[14304+(e*24&-1)>>2]|0;l=k;if((f|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}m=c[g>>2]|0;c[6354]=e-2;e=c[14304+(f*24&-1)>>2]|0;if(!((c[14296+(f*24&-1)>>2]|0)==3&(m|0)==3)){uf(-1,124672,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((e|0)==0|(k|0)==0){uf(-1,123472,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}t1(l,e,b,d);n=+t2(b);o=+h[d>>3];uu(l);uu(e);e=c[6354]|0;if((e|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{l=e+1|0;c[6354]=l;e=14296+(l*24&-1)|0;c[e>>2]=2;c[e+4>>2]=j;h[14304+(l*24&-1)>>3]=n+o;h[14312+(l*24&-1)>>3]=0.0;i=a;return}}function hg(a){a=a|0;var b=0,d=0,e=0,f=0,g=0.0,j=0,k=0,l=0,m=0,n=0.0,o=0,p=0,q=0.0,r=0,s=0,t=0;a=i;i=i+16|0;b=a|0;d=a+8|0;bV(d|0,0);e=d|0;f=~~(+(c[e>>2]|0)+-946684800.0);c[e>>2]=f;g=+(c[d+4>>2]|0)/1.0e6+ +(f|0);f=c[6354]|0;if((f|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}d=f-1|0;c[6354]=d;e=14296+(f*24&-1)|0;j=e|0;k=c[j>>2]|0;l=e+4|0;e=c[l>>2]|0;m=14304+(f*24&-1)|0;n=+h[m>>3];o=c[m>>2]|0;h[b>>3]=n;p=14312+(f*24&-1)|0;q=+h[p>>3];r=o;o=r;if((k|0)==3){if((d|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=f;c[j>>2]=3;c[l>>2]=e;h[m>>3]=n;h[p>>3]=q;if((r|0)==0){s=f}else{r=bP(o|0)|0;o=c[6354]|0;c[14304+(o*24&-1)>>2]=r;s=o}if((s|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}o=s+1|0;c[6354]=o;s=14296+(o*24&-1)|0;c[s>>2]=2;c[s+4>>2]=t;h[14304+(o*24&-1)>>3]=g;h[14312+(o*24&-1)>>3]=0.0;he(0);i=a;return}else if((k|0)==2){h[b>>3]=g;if((d|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=f;c[j>>2]=2;c[l>>2]=e;h[m>>3]=g;h[p>>3]=0.0;i=a;return}else if((k|0)==1){c[b>>2]=~~g;if((d|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=f;c[j>>2]=1;c[l>>2]=e;h[m>>3]=+h[b>>3];h[p>>3]=q;i=a;return}else{uf(-1,122096,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}function hh(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;b=i;i=i+24|0;d=b|0;e=b+16|0;f=c[6354]|0;if((f|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=f-1;g=c[14304+(f*24&-1)>>2]|0;if((c[14296+(f*24&-1)>>2]|0)!=3){uf(-1,120384,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=eo(g,e)|0;h=e6(119096)|0;if((h|0)!=0){a[h+8|0]=0;c[h+16>>2]=1;c[h+24>>2]=f}f=c[e>>2]|0;e=uA(f|0)|0;do{if((e|0)>0){h=f+(e-1|0)|0;if((a[h]|0)!=10){break}a[h]=0}}while(0);e=c[6354]|0;if((e|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}h=e+1|0;c[6354]=h;e=14296+(h*24&-1)|0;c[e>>2]=3;c[14304+(h*24&-1)>>2]=f;h=e+12|0;e=d|0;c[h>>2]=c[e>>2];c[h+4>>2]=c[e+4>>2];c[h+8>>2]=c[e+8>>2];if((f|0)==0){uu(f);uu(g);i=b;return}e=bP(f|0)|0;c[14304+((c[6354]|0)*24&-1)>>2]=e;uu(f);uu(g);i=b;return}function hi(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;b=i;i=i+16|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=d-1|0;c[6354]=e;f=14296+(d*24&-1)|0;g=f;h=c[f>>2]|0;f=c[g+4>>2]|0;j=c[14304+(d*24&-1)>>2]|0;k=g+12|0;g=b|0;c[g>>2]=c[k>>2];c[g+4>>2]=c[k+4>>2];c[g+8>>2]=c[k+8>>2];if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-2;d=c[14304+(e*24&-1)>>2]|0;if((c[14296+(e*24&-1)>>2]|0)!=3){uf(-1,111072,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((a_(d|0,167320,6)|0)==0){uf(-1,114320,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((a_(d|0,126208,6)|0)==0){uf(-1,114320,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=e6(d)|0;uu(d);d=e+8|0;k=e+16|0;do{if((a[d]&1)==0){if((c[k>>2]|0)!=3){break}uu(c[e+24>>2]|0);c[k>>2]=1}}while(0);c[k>>2]=h;k=e;c[k+20>>2]=f;c[e+24>>2]=j;e=k+28|0;c[e>>2]=c[g>>2];c[e+4>>2]=c[g+4>>2];c[e+8>>2]=c[g+8>>2];a[d]=0;d=c[6354]|0;if((d|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=d+1|0;c[6354]=e;d=14296+(e*24&-1)|0;k=d;c[d>>2]=h;c[k+4>>2]=f;c[14304+(e*24&-1)>>2]=j;e=k+12|0;c[e>>2]=c[g>>2];c[e+4>>2]=c[g+4>>2];c[e+8>>2]=c[g+8>>2];if((h|0)!=3|(j|0)==0){i=b;return}h=bP(j|0)|0;c[14304+((c[6354]|0)*24&-1)>>2]=h;i=b;return}function hj(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0,t=0,u=0.0,w=0,x=0,y=0,z=0.0,A=0,B=0,C=0.0;b=i;i=i+24|0;d=b+16|0;e=c[6354]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=c[10810]|0;g=e-1|0;c[6354]=g;j=14296+(e*24&-1)|0;k=j;l=j|0;j=c[l>>2]|0;m=k+4|0;n=c[m>>2]|0;o=14304+(e*24&-1)|0;p=c[o>>2]|0;q=k+12|0;k=b|0;c[k>>2]=c[q>>2];c[k+4>>2]=c[q+4>>2];c[k+8>>2]=c[q+8>>2];if((j|0)!=3){if((g|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=e;c[l>>2]=j;c[m>>2]=n;c[o>>2]=p;c[q>>2]=c[k>>2];c[q+4>>2]=c[k+4>>2];c[q+8>>2]=c[k+8>>2];i=b;return}L752:do{if((f|0)==0){r=0.0;s=0;t=548}else{k=f;while(1){if((aY(c[k+4>>2]|0,p|0)|0)==0){break}q=c[k>>2]|0;if((q|0)==0){r=0.0;s=0;t=548;break L752}else{k=q}}q=c[k+16>>2]|0;o=c[k+20>>2]|0;n=k+24|0;m=c[n>>2]|0;h[d>>3]=+h[n>>3];u=+h[k+32>>3];n=m;m=n;if((a[k+8|0]&1)!=0){r=u;s=o;t=548;break}if((q|0)==3){if((n|0)==0){w=0}else{w=bP(m|0)|0}c[d>>2]=w;x=3}else{x=q}uu(p);if((k|0)==0){y=o;z=u;t=550}else{A=x;B=o;C=u}}}while(0);if((t|0)==548){uu(p);y=s;z=r;t=550}if((t|0)==550){h[d>>3]=+uz(133568,0);A=2;B=y;C=z}y=c[6354]|0;if((y|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}t=y+1|0;c[6354]=t;y=14296+(t*24&-1)|0;c[y>>2]=A;c[y+4>>2]=B;B=c[d>>2]|0;h[14304+(t*24&-1)>>3]=+h[d>>3];h[14312+(t*24&-1)>>3]=C;t=B;if((A|0)!=3|(t|0)==0){i=b;return}A=bP(t|0)|0;c[14304+((c[6354]|0)*24&-1)>>2]=A;i=b;return}function hk(b){b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0,s=0,t=0.0,u=0.0,v=0.0,w=0.0,x=0,y=0,z=0,A=0.0,B=0.0,C=0,D=0,E=0,F=0.0,G=0.0,H=0.0,I=0.0,J=0,K=0,L=0,M=0.0,N=0.0,O=0,P=0,Q=0,R=0,S=0,T=0.0,U=0,V=0.0,W=0,X=0.0,Y=0.0,$=0.0,aa=0.0,ab=0.0,ac=0.0,ad=0.0,ae=0.0,af=0,ag=0.0,ah=0.0,ai=0.0,aj=0.0;d=b+320|0;e=b+300|0;f=c[e>>2]|0;g=0;i=0;while(1){L779:do{if((i|0)<(f|0)){j=c[d>>2]|0;k=i;while(1){if((c[j+(k<<6)>>2]|0)!=2){l=k;break L779}m=k+1|0;if((m|0)<(f|0)){k=m}else{l=m;break}}}else{l=i}}while(0);k=0;while(1){n=k+l|0;if((n|0)>=(f|0)){break}if((c[(c[d>>2]|0)+(n<<6)>>2]|0)==2){break}else{k=k+1|0}}if((k|0)>0){g=g+1|0;i=n}else{break}}n=b+284|0;if((c[n>>2]|0)==9){if((g|0)>0){o=0;p=0;q=0.0}else{return}while(1){L796:do{if((o|0)<(f|0)){i=c[d>>2]|0;l=o;while(1){if((c[i+(l<<6)>>2]|0)!=2){r=l;break L796}j=l+1|0;if((j|0)<(f|0)){l=j}else{r=j;break}}}else{r=o}}while(0);k=0;while(1){s=k+r|0;if((s|0)>=(f|0)){break}if((c[(c[d>>2]|0)+(s<<6)>>2]|0)==2){break}else{k=k+1|0}}if((k|0)>0){l=c[d>>2]|0;i=r;t=q;while(1){if((c[l+(i<<6)>>2]|0)==2){u=t}else{u=t+ +h[l+(i<<6)+16>>3]}j=i+1|0;if((j|0)<(s|0)){i=j;t=u}else{v=u;break}}}else{v=q}i=p+1|0;if((i|0)<(g|0)){o=(r+1|0)+k|0;p=i;q=v}else{w=v;break}}}else{w=0.0}if((g|0)<=0){return}p=b+304|0;r=b+308|0;b=0;o=1;s=f;while(1){L820:do{if((b|0)<(s|0)){f=c[d>>2]|0;i=b;while(1){if((c[f+(i<<6)>>2]|0)!=2){x=i;break L820}l=i+1|0;if((l|0)<(s|0)){i=l}else{x=l;break}}}else{x=b}}while(0);k=0;while(1){y=k+x|0;if((y|0)>=(s|0)){break}if((c[(c[d>>2]|0)+(y<<6)>>2]|0)==2){break}else{k=k+1|0}}i=c[n>>2]|0;do{if((i|0)==7){if((k|0)>0){z=x;A=0.0}else{break}while(1){f=c[d>>2]|0;if((c[f+(z<<6)>>2]|0)==2){B=A}else{l=f+(z<<6)+16|0;v=A+ +h[l>>3];h[l>>3]=v;B=v}l=z+1|0;if((l|0)<(y|0)){z=l;A=B}else{break}}C=c[n>>2]|0;D=598}else{C=i;D=598}}while(0);do{if((D|0)==598){D=0;if((C|0)==9&(k|0)>0){E=x;F=0.0}else{break}while(1){i=c[d>>2]|0;if((c[i+(E<<6)>>2]|0)==2){G=F}else{l=i+(E<<6)+16|0;v=F+ +h[l>>3];h[l>>3]=v/w;G=v}l=E+1|0;if((l|0)<(y|0)){E=l;F=G}else{break}}}}while(0);l=c[p>>2]|0;i=c[r>>2]|0;f=64788+(l*688&-1)|0;j=64664+(l*688&-1)|0;v=+h[j>>3];if((a[f]&1)==0){m=64672+(l*688&-1)|0;H=+h[m>>3];I=v;J=m}else{q=+_(+v);v=+h[64800+(l*688&-1)>>3];m=64672+(l*688&-1)|0;H=+_(+(+h[m>>3]))/v;I=q/v;J=m}m=64788+(i*688&-1)|0;K=64664+(i*688&-1)|0;v=+h[K>>3];if((a[m]&1)==0){L=64672+(i*688&-1)|0;M=+h[L>>3];N=v;O=L}else{q=+_(+v);v=+h[64800+(i*688&-1)>>3];L=64672+(i*688&-1)|0;M=+_(+(+h[L>>3]))/v;N=q/v;O=L}L=c[d>>2]|0;do{if((k|0)>0){P=64648+(l*688&-1)|0;Q=64648+(i*688&-1)|0;v=M;q=N;u=H;t=I;R=0;while(1){S=R+x|0;T=+h[L+(S<<6)+8>>3];U=L+(S<<6)+16|0;V=+h[U>>3];W=L+(S<<6)|0;c[W>>2]=0;if(T>2]&1|0)==0){X=t;D=614}else{Y=T;D=612}}else{Y=t;D=612}L860:do{if((D|0)==612){D=0;if(T>u){if((c[P>>2]&2|0)==0){X=Y;D=614;break}else{$=T}}else{$=u}h[U>>3]=V;do{if(V>2]&1|0)!=0){aa=V;break}c[W>>2]=1;ab=q;ac=v;ad=$;ae=Y;break L860}else{aa=q}}while(0);if(V<=v){ab=aa;ac=v;ad=$;ae=Y;break}if((c[Q>>2]&2|0)!=0){ab=aa;ac=V;ad=$;ae=Y;break}c[W>>2]=1;ab=aa;ac=v;ad=$;ae=Y}}while(0);if((D|0)==614){D=0;c[W>>2]=1;h[U>>3]=V;ab=q;ac=v;ad=u;ae=X}h[L+(S<<6)+56>>3]=T;h[L+(S<<6)+48>>3]=T;h[L+(S<<6)+40>>3]=V;h[L+(S<<6)+32>>3]=V;h[L+(S<<6)+24>>3]=-1.0;af=R+1|0;if((af|0)<(k|0)){v=ac;q=ab;u=ad;t=ae;R=af}else{break}}if(ad>H){if((a[f]&1)==0){ag=ad}else{ag=+Z(+(ad*+h[64800+(l*688&-1)>>3]))}h[J>>3]=ag}if(ae>3]))}h[j>>3]=ah}if(ac>M){if((a[m]&1)==0){ai=ac}else{ai=+Z(+(ac*+h[64800+(i*688&-1)>>3]))}h[O>>3]=ai}if(ab>=N){break}if((a[m]&1)==0){aj=ab}else{aj=+Z(+(ab*+h[64800+(i*688&-1)>>3]))}h[K>>3]=aj}}while(0);if((o|0)>=(g|0)){break}b=(x+1|0)+k|0;o=o+1|0;s=c[e>>2]|0}return}function hl(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0.0,$=0.0,ab=0,ac=0,ad=0.0,ae=0,af=0,ag=0.0,ah=0,ai=0.0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0.0,aq=0.0,ar=0,as=0.0,at=0.0,au=0.0,av=0.0,aw=0.0,ax=0.0,ay=0,az=0.0,aA=0.0,aB=0,aC=0,aD=0,aE=0,aF=0,aG=0,aH=0,aI=0.0,aJ=0.0,aK=0.0,aL=0.0,aM=0,aN=0.0,aO=0.0,aP=0.0,aQ=0.0,aR=0.0,aS=0.0,aT=0.0,aU=0.0,aV=0.0,aW=0.0,aX=0.0,aY=0.0,aZ=0.0,a_=0.0,a$=0.0,a0=0.0,a1=0.0,a2=0.0,a3=0.0,a4=0.0,a5=0.0,a6=0.0,a7=0.0,a8=0.0,a9=0.0,ba=0.0,bb=0.0,bc=0.0,bd=0.0,be=0.0,bf=0.0,bg=0.0,bh=0.0,bi=0.0,bj=0.0,bk=0.0,bl=0.0,bm=0.0,bn=0.0,bo=0.0,bp=0.0,bq=0.0,br=0,bs=0,bt=0,bu=0;d=i;e=b+320|0;f=b+300|0;g=c[f>>2]|0;j=0;k=0;while(1){L903:do{if((k|0)<(g|0)){l=c[e>>2]|0;m=k;while(1){if((c[l+(m<<6)>>2]|0)!=2){n=m;break L903}o=m+1|0;if((o|0)<(g|0)){m=o}else{n=o;break}}}else{n=k}}while(0);m=0;while(1){p=m+n|0;if((p|0)>=(g|0)){break}if((c[(c[e>>2]|0)+(p<<6)>>2]|0)==2){break}else{m=m+1|0}}if((m|0)>0){j=j+1|0;k=p}else{break}}p=aa(j<<6,(c[6352]|0)+1|0);k=ut(p)|0;do{if((k|0)==0){gk();g=ut(p)|0;if((g|0)!=0){q=g;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=215872,v)|0)}else{q=k}}while(0);k=q;if((j|0)<=0){r=c[e>>2]|0;s=r;uu(s);c[e>>2]=k;t=c[6352]|0;u=t+1|0;w=aa(u,j);x=b+296|0;c[x>>2]=w;y=w-1|0;c[f>>2]=y;i=d;return}q=b+284|0;p=b+304|0;g=b+308|0;n=0;l=0;L921:while(1){o=c[f>>2]|0;L923:do{if((n|0)<(o|0)){z=c[e>>2]|0;A=n;while(1){if((c[z+(A<<6)>>2]|0)!=2){B=A;break L923}C=A+1|0;if((C|0)<(o|0)){A=C}else{B=C;break}}}else{B=n}}while(0);m=0;while(1){D=m+B|0;if((D|0)>=(o|0)){break}if((c[(c[e>>2]|0)+(D<<6)>>2]|0)==2){break}else{m=m+1|0}}o=c[q>>2]|0;do{if((o|0)==1){c[200]=c[p>>2];c[144]=c[g>>2];A=m<<5;z=ut(A)|0;if((z|0)==0){gk();C=ut(A)|0;if((C|0)==0){E=727;break L921}else{F=C}}else{F=z}z=F;if((m|0)<4){E=729;break L921}C=c[e>>2]|0;A=0;while(1){if((A|0)>=(m|0)){break}if(+h[C+(A+B<<6)+24>>3]>0.0){A=A+1|0}else{E=733;break L921}}A=m-2|0;G=A*40&-1;H=ut(G)|0;if((H|0)==0){gk();I=ut(G)|0;if((I|0)==0){E=736;break L921}else{J=I}}else{J=H}H=J;I=A<<3;K=ut(I)|0;if((K|0)==0){gk();L=ut(I)|0;if((L|0)==0){E=739;break L921}else{M=L}}else{M=K}K=M;L=ut(I)|0;if((L|0)==0){gk();N=ut(I)|0;if((N|0)==0){E=742;break L921}else{O=N}}else{O=L}L=O;N=m-1|0;I=N<<3;P=ut(I)|0;if((P|0)==0){gk();S=ut(I)|0;if((S|0)==0){E=745;break L921}else{T=S}}else{T=P}P=T;S=m<<3;I=ut(S)|0;if((I|0)==0){gk();U=ut(S)|0;if((U|0)==0){E=748;break L921}else{V=U}}else{V=I}I=V;U=ut(S)|0;if((U|0)==0){gk();W=ut(S)|0;if((W|0)==0){E=751;break L921}else{X=W}}else{X=U}U=X;W=c[200]|0;S=64788+(W*688&-1)|0;Y=+h[C+(B<<6)+8>>3];if((a[S]&1)==0){$=Y}else{$=+Z(+(Y*+h[64800+(W*688&-1)>>3]))}h[I>>3]=$;ab=c[144]|0;ac=64788+(ab*688&-1)|0;Y=+h[C+(B<<6)+16>>3];if((a[ac]&1)==0){ad=Y}else{ad=+Z(+(Y*+h[64800+(ab*688&-1)>>3]))}h[U>>3]=ad;if((m|0)>1){ae=64800+(ab*688&-1)|0;ab=64800+(W*688&-1)|0;W=1;do{af=W+B|0;Y=+h[C+(af<<6)+8>>3];if((a[S]&1)==0){ag=Y}else{ag=+Z(+(Y*+h[ab>>3]))}ah=I+(W<<3)|0;h[ah>>3]=ag;Y=+h[C+(af<<6)+16>>3];if((a[ac]&1)==0){ai=Y}else{ai=+Z(+(Y*+h[ae>>3]))}h[U+(W<<3)>>3]=ai;af=W-1|0;h[P+(af<<3)>>3]=+h[ah>>3]- +h[I+(af<<3)>>3];W=W+1|0;}while((W|0)<(m|0))}W=m-3|0;if((W|0)>=0){I=m-4|0;ae=m-5|0;ac=0;while(1){ab=ac+2|0;S=ac+1|0;Y=+h[U+(S<<3)>>3];af=P+(S<<3)|0;ah=P+(ac<<3)|0;h[K+(ac<<3)>>3]=((+h[U+(ab<<3)>>3]-Y)/+h[af>>3]-(Y- +h[U+(ac<<3)>>3])/+h[ah>>3])*3.0;do{if((ac|0)<2){h[H+(ac*40&-1)>>3]=0.0;if((ac|0)<1){h[H+(ac*40&-1)+8>>3]=0.0;aj=C+(ac+B<<6)+24|0;ak=C+(S+B<<6)+24|0;break}else{al=C+(ac+B<<6)+24|0;am=P+(ac-1<<3)|0;E=770;break}}else{an=C+(ac+B<<6)+24|0;ao=P+(ac-1<<3)|0;h[H+(ac*40&-1)>>3]=6.0/+h[an>>3]/+h[ao>>3]/+h[ah>>3];al=an;am=ao;E=770}}while(0);if((E|0)==770){E=0;Y=+h[ah>>3];ap=1.0/Y;ao=C+(S+B<<6)+24|0;h[H+(ac*40&-1)+8>>3]=Y-6.0/+h[al>>3]/Y*(1.0/+h[am>>3]+ap)-6.0/+h[ao>>3]/Y*(ap+1.0/+h[af>>3]);aj=al;ak=ao}ap=+h[ah>>3];Y=+h[af>>3];aq=1.0/ap+1.0/Y;ao=C+(ab+B<<6)+24|0;h[H+(ac*40&-1)+16>>3]=(ap+Y)*2.0+6.0/+h[aj>>3]/ap/ap+aq*6.0/+h[ak>>3]*aq+6.0/+h[ao>>3]/Y/Y;if((ac|0)>(I|0)){h[H+(ac*40&-1)+24>>3]=0.0}else{Y=+h[af>>3];aq=1.0/Y;h[H+(ac*40&-1)+24>>3]=Y-6.0/+h[ak>>3]/Y*(1.0/+h[ah>>3]+aq)-6.0/+h[ao>>3]/Y*(aq+1.0/+h[P+(ab<<3)>>3])}if((ac|0)>(ae|0)){h[H+(ac*40&-1)+32>>3]=0.0}else{h[H+(ac*40&-1)+32>>3]=6.0/+h[ao>>3]/+h[af>>3]/+h[P+(ab<<3)>>3]}if((S|0)>(W|0)){break}else{ac=S}}}ac=G+40|0;ae=ut(ac)|0;if((ae|0)==0){gk();I=ut(ac)|0;if((I|0)==0){E=780;break L921}else{ar=I}}else{ar=ae}ae=ar;aq=+h[J+16>>3];I=ar;h[I>>3]=aq;if(aq==0.0){E=782;break L921}Y=+h[J+24>>3]/aq;h[ar+8>>3]=Y;ap=+h[J+32>>3]/aq;h[ar+16>>3]=ap;as=+h[J+48>>3];h[ar+64>>3]=as;at=+h[J+56>>3]-Y*as;h[ar+40>>3]=at;if(at==0.0){E=784;break L921}au=(+h[J+64>>3]-ap*as)/at;h[ar+48>>3]=au;h[ar+56>>3]=+h[J+72>>3]/at;if((A|0)>2){ac=2;at=Y;Y=ap;ap=au;while(1){ao=H+(ac*40&-1)|0;au=+h[H+(ac*40&-1)+8>>3]-at*+h[ao>>3];h[ae+(ac*40&-1)+24>>3]=au;as=+h[H+(ac*40&-1)+16>>3]-Y*+h[ao>>3]-ap*au;h[ae+(ac*40&-1)>>3]=as;if(as==0.0){E=787;break L921}av=+h[ae+((ac-1|0)*40&-1)+16>>3];aw=(+h[H+(ac*40&-1)+24>>3]-au*av)/as;h[ae+(ac*40&-1)+8>>3]=aw;h[ae+(ac*40&-1)+16>>3]=+h[H+(ac*40&-1)+32>>3]/as;ao=ac+1|0;if((ao|0)<(A|0)){ac=ao;at=ap;Y=av;ap=aw}else{break}}ax=+h[I>>3]}else{ax=aq}h[ar+32>>3]=0.0;ap=+h[K>>3]/ax;h[ar+72>>3]=ap;if((A|0)>1){ac=1;Y=0.0;at=ap;while(1){ap=(+h[K+(ac<<3)>>3]-Y*+h[H+(ac*40&-1)>>3]-at*+h[ae+(ac*40&-1)+24>>3])/+h[ae+(ac*40&-1)>>3];G=ac+1|0;h[ae+(G*40&-1)+32>>3]=ap;if((G|0)<(A|0)){ac=G;Y=at;at=ap}else{break}}}at=+h[ae+(A*40&-1)+32>>3];h[L+(W<<3)>>3]=at;ac=m-4|0;Y=+h[ae+(W*40&-1)+32>>3]-at*+h[ae+(ac*40&-1)+8>>3];h[L+(ac<<3)>>3]=Y;H=m-5|0;L1015:do{if((H|0)>-1){aq=+h[ae+(ac*40&-1)+32>>3]-Y*+h[ae+(H*40&-1)+8>>3]-at*+h[ae+(H*40&-1)+16>>3];h[L+(H<<3)>>3]=aq;if((H|0)<=0){break}K=m-6|0;ap=+h[ae+(H*40&-1)+32>>3]-aq*+h[ae+(K*40&-1)+8>>3]-Y*+h[ae+(K*40&-1)+16>>3];h[L+(K<<3)>>3]=ap;if((K|0)>0){ay=K;az=ap;aA=aq}else{break}while(1){K=ay-1|0;aq=+h[ae+(ay*40&-1)+32>>3]-az*+h[ae+(K*40&-1)+8>>3]-aA*+h[ae+(K*40&-1)+16>>3];h[L+(K<<3)>>3]=aq;if((K|0)<=0){break L1015}ap=+h[L+(ay<<3)>>3];ay=K;az=aq;aA=ap}}}while(0);uu(ar);ae=F+16|0;h[ae>>3]=0.0;H=(A|0)<1;if(!H){ac=1;do{h[z+(ac<<5)+16>>3]=+h[L+(ac-1<<3)>>3];ac=ac+1|0;}while((ac|0)<=(A|0))}h[z+(N<<5)+16>>3]=0.0;Y=+h[ae>>3];at=+h[F+48>>3];ac=F;h[ac>>3]=+h[U>>3]+2.0/+h[C+(B<<6)+24>>3]/+h[P>>3]*(Y-at);if(!H){L=1;ap=Y;aq=at;while(1){at=+h[P+(L-1<<3)>>3];aw=+h[P+(L<<3)>>3];W=L+1|0;av=+h[z+(W<<5)+16>>3];h[z+(L<<5)>>3]=+h[U+(L<<3)>>3]-2.0/+h[C+(L+B<<6)+24>>3]*(av/aw+(ap/at-aq*(1.0/at+1.0/aw)));if((W|0)>(A|0)){break}else{L=W;ap=aq;aq=av}}}h[z+(N<<5)>>3]=+h[U+(N<<3)>>3]-2.0/+h[C+(N+B<<6)+24>>3]/+h[P+(A<<3)>>3]*+h[z+(A<<5)+16>>3];if((A|0)>=0){L=0;aq=+h[ac>>3];ap=Y;while(1){H=L+1|0;av=+h[z+(H<<5)>>3];ae=P+(L<<3)|0;aw=+h[ae>>3];at=+h[z+(H<<5)+16>>3];h[z+(L<<5)+8>>3]=(av-aq)/aw-aw/3.0*(ap*2.0+at);h[z+(L<<5)+24>>3]=(at-ap)/3.0/+h[ae>>3];if((H|0)>(A|0)){break}else{L=H;aq=av;ap=at}}}uu(T);uu(O);uu(M);uu(J);uu(V);uu(X);ho(b,z,B,m,k+(aa((c[6352]|0)+1|0,l)<<6)|0);uu(F)}else if((o|0)==3){c[200]=c[p>>2];c[144]=c[g>>2];if((m|0)<3){E=667;break L921}L=c[e>>2]|0;A=m<<5;P=ut(A)|0;if((P|0)==0){gk();ac=ut(A)|0;if((ac|0)==0){E=670;break L921}else{aB=ac}}else{aB=P}P=aB;ac=m-2|0;A=ac*24&-1;N=ut(A)|0;if((N|0)==0){gk();C=ut(A)|0;if((C|0)==0){E=673;break L921}else{aC=C}}else{aC=N}N=aC;C=ac<<3;A=ut(C)|0;if((A|0)==0){gk();U=ut(C)|0;if((U|0)==0){E=676;break L921}else{aD=U}}else{aD=A}A=aD;U=ut(C)|0;if((U|0)==0){gk();H=ut(C)|0;if((H|0)==0){E=679;break L921}else{aE=H}}else{aE=U}U=aE;H=m-1|0;C=H<<3;ae=ut(C)|0;if((ae|0)==0){gk();W=ut(C)|0;if((W|0)==0){E=682;break L921}else{aF=W}}else{aF=ae}ae=aF;W=m<<3;C=ut(W)|0;if((C|0)==0){gk();S=ut(W)|0;if((S|0)==0){E=685;break L921}else{aG=S}}else{aG=C}C=aG;S=ut(W)|0;if((S|0)==0){gk();ab=ut(W)|0;if((ab|0)==0){E=688;break L921}else{aH=ab}}else{aH=S}S=aH;ab=c[200]|0;W=64788+(ab*688&-1)|0;ap=+h[L+(B<<6)+8>>3];if((a[W]&1)==0){aI=ap}else{aI=+Z(+(ap*+h[64800+(ab*688&-1)>>3]))}h[C>>3]=aI;af=c[144]|0;ah=64788+(af*688&-1)|0;ap=+h[L+(B<<6)+16>>3];if((a[ah]&1)==0){aJ=ap}else{aJ=+Z(+(ap*+h[64800+(af*688&-1)>>3]))}h[S>>3]=aJ;if((m|0)>1){K=64800+(af*688&-1)|0;af=64800+(ab*688&-1)|0;ab=1;do{I=ab+B|0;ap=+h[L+(I<<6)+8>>3];if((a[W]&1)==0){aK=ap}else{aK=+Z(+(ap*+h[af>>3]))}G=C+(ab<<3)|0;h[G>>3]=aK;ap=+h[L+(I<<6)+16>>3];if((a[ah]&1)==0){aL=ap}else{aL=+Z(+(ap*+h[K>>3]))}h[S+(ab<<3)>>3]=aL;I=ab-1|0;h[ae+(I<<3)>>3]=+h[G>>3]- +h[C+(I<<3)>>3];ab=ab+1|0;}while((ab|0)<(m|0))}ab=m-3|0;if((ab|0)>=0){C=m-4|0;K=0;while(1){ah=K+1|0;ap=+h[S+(ah<<3)>>3];L=ae+(ah<<3)|0;af=ae+(K<<3)|0;h[A+(K<<3)>>3]=((+h[S+(K+2<<3)>>3]-ap)/+h[L>>3]-(ap- +h[S+(K<<3)>>3])/+h[af>>3])*3.0;if((K|0)<1){h[N+(K*24&-1)>>3]=0.0}else{h[N+(K*24&-1)>>3]=+h[af>>3]}h[N+(K*24&-1)+8>>3]=(+h[af>>3]+ +h[L>>3])*2.0;if((K|0)>(C|0)){h[N+(K*24&-1)+16>>3]=0.0}else{h[N+(K*24&-1)+16>>3]=+h[L>>3]}if((ah|0)>(ab|0)){break}else{K=ah}}}if((ac|0)>1){K=1;do{C=K-1|0;ap=+h[N+(C*24&-1)+8>>3];if(ap==0.0){E=898;break L921}aq=+h[N+(K*24&-1)>>3]/ap;ah=N+(K*24&-1)+8|0;h[ah>>3]=+h[ah>>3]-aq*+h[N+(C*24&-1)+16>>3];ah=A+(K<<3)|0;h[ah>>3]=+h[ah>>3]-aq*+h[A+(C<<3)>>3];K=K+1|0;}while((K|0)<(ac|0))}aq=+h[N+(ab*24&-1)+8>>3];if(aq==0.0){E=899;break L921}ap=+h[A+(ab<<3)>>3]/aq;h[U+(ab<<3)>>3]=ap;K=m-4|0;if((K|0)>-1){C=K;aq=ap;while(1){ap=+h[N+(C*24&-1)+8>>3];if(ap==0.0){E=900;break L921}Y=(+h[A+(C<<3)>>3]-aq*+h[N+(C*24&-1)+16>>3])/ap;h[U+(C<<3)>>3]=Y;if((C|0)>0){C=C-1|0;aq=Y}else{break}}}C=aB+16|0;h[C>>3]=0.0;if((ac|0)>=1){N=1;do{h[P+(N<<5)+16>>3]=+h[U+(N-1<<3)>>3];N=N+1|0;}while((N|0)<=(ac|0))}h[P+(H<<5)+16>>3]=0.0;if((H|0)>=0){N=0;do{h[P+(N<<5)>>3]=+h[S+(N<<3)>>3];N=N+1|0;}while((N|0)<=(H|0))}if((ac|0)>=0){H=0;aq=+h[aB>>3];Y=+h[C>>3];while(1){N=H+1|0;ap=+h[P+(N<<5)>>3];S=ae+(H<<3)|0;at=+h[S>>3];av=+h[P+(N<<5)+16>>3];h[P+(H<<5)+8>>3]=(ap-aq)/at-at/3.0*(Y*2.0+av);h[P+(H<<5)+24>>3]=(av-Y)/3.0/+h[S>>3];if((N|0)>(ac|0)){break}else{H=N;aq=ap;Y=av}}}uu(aF);uu(aE);uu(aD);uu(aC);uu(aG);uu(aH);ho(b,P,B,m,k+(aa((c[6352]|0)+1|0,l)<<6)|0);uu(aB)}else if((o|0)==2|(o|0)==4){H=m<<3;ac=ut(H)|0;if((ac|0)==0){gk();ae=ut(H)|0;if((ae|0)==0){E=808;break L921}else{aM=ae}}else{aM=ac}ac=aM;ae=m-1|0;H=(ae|0)/2&-1;h[ac>>3]=0.0;if((ae|0)>1){C=0;Y=0.0;while(1){N=C+1|0;aq=Y+ +_(+(+(ae-C|0)/+(N|0)));h[ac+(N<<3)>>3]=aq;if((N|0)<(H|0)){C=N;Y=aq}else{break}}}if((ae|0)>=(H|0)){C=ae;do{h[ac+(C<<3)>>3]=+h[ac+(ae-C<<3)>>3];C=C-1|0;}while((C|0)>=(H|0))}H=c[6352]|0;C=aa(H+1|0,l);P=c[p>>2]|0;c[200]=P;N=c[g>>2]|0;c[144]=N;Y=+h[64664+(P*688&-1)>>3];if((a[64788+(P*688&-1)|0]&1)==0){aN=+h[64672+(P*688&-1)>>3];aO=Y}else{aq=+_(+Y);Y=+h[64800+(P*688&-1)>>3];aN=+_(+(+h[64672+(P*688&-1)>>3]))/Y;aO=aq/Y}Y=+h[64664+(N*688&-1)>>3];if((a[64788+(N*688&-1)|0]&1)==0){aP=+h[64672+(N*688&-1)>>3];aQ=Y}else{aq=+_(+Y);Y=+h[64800+(N*688&-1)>>3];aP=+_(+(+h[64672+(N*688&-1)>>3]))/Y;aQ=aq/Y}do{if((H|0)>0){N=ae+B|0;Y=+(ae>>>0>>>0);aq=aP;av=aQ;ap=aN;at=aO;P=0;S=H;while(1){aw=+(P|0)/+(S-1|0);U=c[e>>2]|0;do{if(aw==0.0){aR=+h[U+(B<<6)+16>>3];aS=+h[U+(B<<6)+8>>3]}else{if(aw==1.0){aR=+h[U+(N<<6)+16>>3];aS=+h[U+(N<<6)+8>>3];break}as=+_(+(1.0-aw));au=Y*as;aT=+_(+aw)-as;as=0.0;aU=0.0;A=0;while(1){aV=+Z(+(aT*+(A>>>0>>>0)+(au+ +h[ac+(A<<3)>>3])));ab=A+B|0;aW=aU+aV*+h[U+(ab<<6)+8>>3];aX=as+aV*+h[U+(ab<<6)+16>>3];ab=A+1|0;if(ab>>>0>ae>>>0){aR=aX;aS=aW;break}else{as=aX;aU=aW;A=ab}}}}while(0);U=P+C|0;A=k+(U<<6)|0;c[A>>2]=0;h[k+(U<<6)+8>>3]=aS;if(aS>2]&1|0)==0){aY=at;E=831}else{aZ=aS;E=829}}else{aZ=at;E=829}L1147:do{if((E|0)==829){E=0;if(aS>ap){if((c[64648+((c[200]|0)*688&-1)>>2]&2|0)==0){aY=aZ;E=831;break}else{a_=aS}}else{a_=ap}h[k+(U<<6)+16>>3]=aR;do{if(aR>2]&1|0)!=0){a$=aR;break}c[A>>2]=1;a0=av;a1=aq;a2=a_;a3=aZ;break L1147}else{a$=av}}while(0);if(aR<=aq){a0=a$;a1=aq;a2=a_;a3=aZ;break}if((c[64648+((c[144]|0)*688&-1)>>2]&2|0)!=0){a0=a$;a1=aR;a2=a_;a3=aZ;break}c[A>>2]=1;a0=a$;a1=aq;a2=a_;a3=aZ}}while(0);if((E|0)==831){E=0;c[A>>2]=1;h[k+(U<<6)+16>>3]=aR;a0=av;a1=aq;a2=ap;a3=aY}h[k+(U<<6)+56>>3]=aS;h[k+(U<<6)+48>>3]=aS;h[k+(U<<6)+40>>3]=aR;h[k+(U<<6)+32>>3]=aR;h[k+(U<<6)+24>>3]=-1.0;ab=P+1|0;K=c[6352]|0;if((ab|0)<(K|0)){aq=a1;av=a0;ap=a2;at=a3;P=ab;S=K}else{break}}if(a2>aN){S=c[200]|0;if((a[64788+(S*688&-1)|0]&1)==0){a4=a2}else{a4=+Z(+(a2*+h[64800+(S*688&-1)>>3]))}h[64672+(S*688&-1)>>3]=a4}if(a3>3]))}h[64664+(S*688&-1)>>3]=a5}if(a1>aP){S=c[144]|0;if((a[64788+(S*688&-1)|0]&1)==0){a6=a1}else{a6=+Z(+(a1*+h[64800+(S*688&-1)>>3]))}h[64672+(S*688&-1)>>3]=a6}if(a0>=aQ){break}S=c[144]|0;if((a[64788+(S*688&-1)|0]&1)==0){a7=a0}else{a7=+Z(+(a0*+h[64800+(S*688&-1)>>3]))}h[64664+(S*688&-1)>>3]=a7}}while(0);uu(aM)}else if((o|0)==8){C=c[6352]|0;ae=aa(C+1|0,l);ac=c[p>>2]|0;c[200]=ac;H=c[g>>2]|0;c[144]=H;at=+h[64664+(ac*688&-1)>>3];if((a[64788+(ac*688&-1)|0]&1)==0){a8=+h[64672+(ac*688&-1)>>3];a9=at}else{ap=+_(+at);at=+h[64800+(ac*688&-1)>>3];a8=+_(+(+h[64672+(ac*688&-1)>>3]))/at;a9=ap/at}at=+h[64664+(H*688&-1)>>3];if((a[64788+(H*688&-1)|0]&1)==0){ba=+h[64672+(H*688&-1)>>3];bb=at}else{ap=+_(+at);at=+h[64800+(H*688&-1)>>3];ba=+_(+(+h[64672+(H*688&-1)>>3]))/at;bb=ap/at}if((C|0)<=0){break}H=m-1|0;at=+(m|0);ap=4.0/(at*3.0);av=ba;aq=bb;Y=a8;aw=a9;ac=0;S=C;while(1){C=S-1|0;P=c[e>>2]|0;aU=0.0;as=0.0;au=1.7976931348623157e+308;aT=-1.7976931348623157e+308;N=0;do{aW=+h[P+(N+B<<6)+8>>3];aU=aU+aW;as=as+aW*aW;au=aWaT?aW:aT;N=N+1|0;}while(N>>>0<=H>>>0);aW=aU/at;aX=+Q(+(as/at-aW*aW));aW=aX*+R(+ap,.2);aX=au+(aT-au)*(+(ac|0)/+(C|0));aV=0.0;N=0;do{K=N+B|0;bc=+h[P+(K<<6)+24>>3];bd=bc>0.0?bc:aW;bc=(aX- +h[P+(K<<6)+8>>3])/bd;be=+h[P+(K<<6)+16>>3];aV=aV+be*+Z(+(bc*bc*-.5))/bd;N=N+1|0;}while(N>>>0<=H>>>0);aW=aV/2.5066282746310002;N=ac+ae|0;P=k+(N<<6)|0;c[P>>2]=0;h[k+(N<<6)+8>>3]=aX;if(aX>2]&1|0)==0){bf=aw;E=872}else{bg=aX;E=870}}else{bg=aw;E=870}L1205:do{if((E|0)==870){E=0;if(aX>Y){if((c[64648+((c[200]|0)*688&-1)>>2]&2|0)==0){bf=bg;E=872;break}else{bh=aX}}else{bh=Y}h[k+(N<<6)+16>>3]=aW;do{if(aW>2]&1|0)!=0){bi=aW;break}c[P>>2]=1;bj=aq;bk=av;bl=bh;bm=bg;break L1205}else{bi=aq}}while(0);if(aW<=av){bj=bi;bk=av;bl=bh;bm=bg;break}if((c[64648+((c[144]|0)*688&-1)>>2]&2|0)!=0){bj=bi;bk=aW;bl=bh;bm=bg;break}c[P>>2]=1;bj=bi;bk=av;bl=bh;bm=bg}}while(0);if((E|0)==872){E=0;c[P>>2]=1;h[k+(N<<6)+16>>3]=aW;bj=aq;bk=av;bl=Y;bm=bf}h[k+(N<<6)+56>>3]=aX;h[k+(N<<6)+48>>3]=aX;h[k+(N<<6)+40>>3]=aW;h[k+(N<<6)+32>>3]=aW;h[k+(N<<6)+24>>3]=-1.0;U=ac+1|0;A=c[6352]|0;if((U|0)<(A|0)){av=bk;aq=bj;Y=bl;aw=bm;ac=U;S=A}else{break}}if(bl>a8){S=c[200]|0;if((a[64788+(S*688&-1)|0]&1)==0){bn=bl}else{bn=+Z(+(bl*+h[64800+(S*688&-1)>>3]))}h[64672+(S*688&-1)>>3]=bn}if(bm>3]))}h[64664+(S*688&-1)>>3]=bo}if(bk>ba){S=c[144]|0;if((a[64788+(S*688&-1)|0]&1)==0){bp=bk}else{bp=+Z(+(bk*+h[64800+(S*688&-1)>>3]))}h[64672+(S*688&-1)>>3]=bp}if(bj>=bb){break}S=c[144]|0;if((a[64788+(S*688&-1)|0]&1)==0){bq=bj}else{bq=+Z(+(bj*+h[64800+(S*688&-1)>>3]))}h[64664+(S*688&-1)>>3]=bq}}while(0);m=l+1|0;c[k+(aa((c[6352]|0)+1|0,m)-1<<6)>>2]=2;if((m|0)<(j|0)){n=D;l=m}else{E=905;break}}if((E|0)==727){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=163872,v)|0)}else if((E|0)==729){uf(c[b+4>>2]|0,136680,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((E|0)==733){uf(c[b+4>>2]|0,123304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((E|0)==736){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=106104,v)|0)}else if((E|0)==673){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=106104,v)|0)}else if((E|0)==676){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=98688,v)|0)}else if((E|0)==739){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=98688,v)|0)}else if((E|0)==742){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=93064,v)|0)}else if((E|0)==745){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=85160,v)|0)}else if((E|0)==748){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=77016,v)|0)}else if((E|0)==751){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=224768,v)|0)}else if((E|0)==688){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=224768,v)|0)}else if((E|0)==679){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=93064,v)|0)}else if((E|0)==682){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=85160,v)|0)}else if((E|0)==685){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=77016,v)|0)}else if((E|0)==667){uf(c[b+4>>2]|0,202432,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((E|0)==670){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=163872,v)|0)}else if((E|0)==780){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=211832,v)|0)}else if((E|0)==782){uu(ar);uu(T);uu(O);uu(M);uu(J);uu(V);uu(X);br=b+4|0;bs=c[br>>2]|0;uf(bs,217416,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((E|0)==784){uu(ar);uu(T);uu(O);uu(M);uu(J);uu(V);uu(X);br=b+4|0;bs=c[br>>2]|0;uf(bs,217416,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((E|0)==787){uu(ar);uu(T);uu(O);uu(M);uu(J);uu(V);uu(X);br=b+4|0;bs=c[br>>2]|0;uf(bs,217416,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((E|0)==808){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=217128,v)|0)}else if((E|0)==898){uu(aF);uu(aE);uu(aD);uu(aC);uu(aG);uu(aH);bt=b+4|0;bu=c[bt>>2]|0;uf(bu,196920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((E|0)==899){uu(aF);uu(aE);uu(aD);uu(aC);uu(aG);uu(aH);bt=b+4|0;bu=c[bt>>2]|0;uf(bu,196920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((E|0)==900){uu(aF);uu(aE);uu(aD);uu(aC);uu(aG);uu(aH);bt=b+4|0;bu=c[bt>>2]|0;uf(bu,196920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((E|0)==905){r=c[e>>2]|0;s=r;uu(s);c[e>>2]=k;t=c[6352]|0;u=t+1|0;w=aa(u,j);x=b+296|0;c[x>>2]=w;y=w-1|0;c[f>>2]=y;i=d;return}}function hm(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0;c=+h[a+8>>3];d=+h[b+8>>3];if(c>d){e=1;return e|0}e=(c>31;return e|0}function hn(b){b=b|0;var d=0,e=0,f=0,g=0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0,I=0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0,R=0,S=0,T=0.0,U=0,V=0.0,W=0.0,X=0.0,Y=0.0,_=0,$=0,aa=0.0,ab=0.0,ac=0.0,ad=0,ae=0.0,af=0.0,ag=0.0,ah=0.0;c[200]=c[b+304>>2];c[144]=c[b+308>>2];d=b+320|0;e=b+300|0;f=b+284|0;g=0;i=0.0;j=0.0;k=0.0;l=0.0;m=0.0;n=0.0;o=0.0;p=0;q=0;while(1){r=c[e>>2]|0;L1281:do{if((q|0)<(r|0)){s=c[d>>2]|0;t=q;while(1){if((c[s+(t<<6)>>2]|0)!=2){u=t;break L1281}v=t+1|0;if((v|0)<(r|0)){t=v}else{u=v;break}}}else{u=q}}while(0);t=0;while(1){w=t+u|0;if((w|0)>=(r|0)){break}if((c[(c[d>>2]|0)+(w<<6)>>2]|0)==2){break}else{t=t+1|0}}if((t|0)>0){x=u;y=p;z=0;A=o;B=n;C=m;D=l;E=k;F=j;G=i;H=g}else{break}while(1){r=c[d>>2]|0;s=c[r+(x<<6)>>2]|0;do{if((s|0)==2){I=H;J=G;K=F;L=E;M=D;N=C;O=B;P=A;Q=z;R=y;S=x}else{T=+h[r+(x<<6)+8>>3];if((z|0)==0){I=(s|0)==0;J=+h[r+(x<<6)+24>>3];K=+h[r+(x<<6)+32>>3];L=+h[r+(x<<6)+40>>3];M=+h[r+(x<<6)+48>>3];N=+h[r+(x<<6)+56>>3];O=+h[r+(x<<6)+16>>3];P=T;Q=1;R=y;S=x;break}if(T==A){I=(s|0)==0&H;J=G+ +h[r+(x<<6)+24>>3];K=F+ +h[r+(x<<6)+32>>3];L=E+ +h[r+(x<<6)+40>>3];M=D+ +h[r+(x<<6)+48>>3];N=C+ +h[r+(x<<6)+56>>3];O=B+ +h[r+(x<<6)+16>>3];P=A;Q=z+1|0;R=y;S=x;break}h[r+(y<<6)+8>>3]=A;v=c[f>>2]|0;if((v|0)==6|(v|0)==7|(v|0)==9){U=1}else{U=z}T=+(U|0);V=B/T;h[(c[d>>2]|0)+(y<<6)+16>>3]=V;h[(c[d>>2]|0)+(y<<6)+56>>3]=C/T;h[(c[d>>2]|0)+(y<<6)+48>>3]=D/T;h[(c[d>>2]|0)+(y<<6)+40>>3]=E/T;h[(c[d>>2]|0)+(y<<6)+32>>3]=F/T;h[(c[d>>2]|0)+(y<<6)+24>>3]=G/T;c[(c[d>>2]|0)+(y<<6)>>2]=0;L1304:do{if(H){W=V;X=A}else{v=c[200]|0;do{if((a[64788+(v*688&-1)|0]&1)==0){Y=A}else{if(A>-8.988465674311579e+307){Y=+Z(+(A*+h[64800+(v*688&-1)>>3]));break}else{c[(c[d>>2]|0)+(y<<6)>>2]=1;W=V;X=A;break L1304}}}while(0);if(Y<+h[64664+(v*688&-1)>>3]){if((c[64648+(v*688&-1)>>2]&1|0)!=0){_=934}}else{_=934}do{if((_|0)==934){_=0;if(Y>+h[64672+(v*688&-1)>>3]){if((c[64648+(v*688&-1)>>2]&2|0)==0){break}}$=c[144]|0;do{if((a[64788+($*688&-1)|0]&1)==0){aa=V}else{if(V>-8.988465674311579e+307){aa=+Z(+(V*+h[64800+($*688&-1)>>3]));break}else{c[(c[d>>2]|0)+(y<<6)>>2]=1;W=V;X=Y;break L1304}}}while(0);if(aa<+h[64664+($*688&-1)>>3]){if((c[64648+($*688&-1)>>2]&1|0)!=0){_=943}}else{_=943}if((_|0)==943){_=0;if(aa<=+h[64672+($*688&-1)>>3]){W=aa;X=Y;break L1304}if((c[64648+($*688&-1)>>2]&2|0)!=0){W=aa;X=Y;break L1304}}c[(c[d>>2]|0)+(y<<6)>>2]=1;W=aa;X=Y;break L1304}}while(0);c[(c[d>>2]|0)+(y<<6)>>2]=1;W=V;X=Y}}while(0);I=H;J=G;K=F;L=E;M=D;N=C;O=W;P=X;Q=0;R=y+1|0;S=x-1|0}}while(0);r=S+1|0;if((r|0)<(w|0)){x=r;y=R;z=Q;A=P;B=O;C=N;D=M;E=L;F=K;G=J;H=I}else{break}}if((Q|0)==0){ab=O;ac=P;ad=R}else{h[(c[d>>2]|0)+(R<<6)+8>>3]=P;V=((c[f>>2]|0)-6|0)>>>0<2?1.0:+(Q|0);T=O/V;h[(c[d>>2]|0)+(R<<6)+16>>3]=T;h[(c[d>>2]|0)+(R<<6)+56>>3]=N/V;h[(c[d>>2]|0)+(R<<6)+48>>3]=M/V;h[(c[d>>2]|0)+(R<<6)+40>>3]=L/V;h[(c[d>>2]|0)+(R<<6)+32>>3]=K/V;h[(c[d>>2]|0)+(R<<6)+24>>3]=J/V;c[(c[d>>2]|0)+(R<<6)>>2]=0;L1337:do{if(I){ae=T;af=P}else{t=c[200]|0;do{if((a[64788+(t*688&-1)|0]&1)==0){ag=P}else{if(P>-8.988465674311579e+307){ag=+Z(+(P*+h[64800+(t*688&-1)>>3]));break}else{c[(c[d>>2]|0)+(R<<6)>>2]=1;ae=T;af=P;break L1337}}}while(0);if(ag<+h[64664+(t*688&-1)>>3]){if((c[64648+(t*688&-1)>>2]&1|0)!=0){_=956}}else{_=956}do{if((_|0)==956){_=0;if(ag>+h[64672+(t*688&-1)>>3]){if((c[64648+(t*688&-1)>>2]&2|0)==0){break}}r=c[144]|0;do{if((a[64788+(r*688&-1)|0]&1)==0){ah=T}else{if(T>-8.988465674311579e+307){ah=+Z(+(T*+h[64800+(r*688&-1)>>3]));break}else{c[(c[d>>2]|0)+(R<<6)>>2]=1;ae=T;af=ag;break L1337}}}while(0);if(ah<+h[64664+(r*688&-1)>>3]){if((c[64648+(r*688&-1)>>2]&1|0)!=0){_=965}}else{_=965}if((_|0)==965){_=0;if(ah<=+h[64672+(r*688&-1)>>3]){ae=ah;af=ag;break L1337}if((c[64648+(r*688&-1)>>2]&2|0)!=0){ae=ah;af=ag;break L1337}}c[(c[d>>2]|0)+(R<<6)>>2]=1;ae=ah;af=ag;break L1337}}while(0);c[(c[d>>2]|0)+(R<<6)>>2]=1;ae=T;af=ag}}while(0);ab=ae;ac=af;ad=R+1|0}if((ad|0)>=(c[e>>2]|0)){g=I;i=J;j=K;k=L;l=M;m=N;n=ab;o=ac;p=ad;q=w;continue}c[(c[d>>2]|0)+(ad<<6)>>2]=2;g=I;i=J;j=K;k=L;l=M;m=N;n=ab;o=ac;p=ad+1|0;q=w}c[e>>2]=p;iR(b,p);return}function ho(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,w=0.0,x=0.0,y=0.0,z=0,A=0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0,Q=0.0,R=0.0,S=0.0,T=0.0;j=i;k=c[b+304>>2]|0;c[200]=k;l=c[b+308>>2]|0;c[144]=l;m=+h[64664+(k*688&-1)>>3];if((a[64788+(k*688&-1)|0]&1)==0){n=+h[64672+(k*688&-1)>>3];o=m}else{p=+_(+m);m=+h[64800+(k*688&-1)>>3];n=+_(+(+h[64672+(k*688&-1)>>3]))/m;o=p/m}m=+h[64664+(l*688&-1)>>3];if((a[64788+(l*688&-1)|0]&1)==0){q=+h[64672+(l*688&-1)>>3];r=m}else{p=+_(+m);m=+h[64800+(l*688&-1)>>3];q=+_(+(+h[64672+(l*688&-1)>>3]))/m;r=p/m}l=c[b+320>>2]|0;m=+h[l+(e<<6)+8>>3];p=m>o?m:o;m=+h[l+((e-1|0)+f<<6)+8>>3];s=m=s){uf(c[b+4>>2]|0,205704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}b=c[6352]|0;m=(s-p)/+(b-1|0);if((b|0)<=0){i=j;return}b=f-2|0;s=r-(q-r);t=n;u=r;w=q;x=o;f=0;k=0;while(1){y=p+m*+(k|0);z=f;while(1){A=z+1|0;if(y>=+h[l+(A+e<<6)+8>>3]&(z|0)<(b|0)){z=A}else{break}}A=c[200]|0;if((a[64788+(A*688&-1)|0]&1)==0){B=+h[l+(z+e<<6)+8>>3];C=y}else{D=+Z(+(y*+h[64800+(A*688&-1)>>3]));B=+Z(+(+h[l+(z+e<<6)+8>>3]*+h[64800+(A*688&-1)>>3]));C=D}D=C-B;E=+h[d+(z<<5)>>3]+D*(+h[d+(z<<5)+8>>3]+D*(+h[d+(z<<5)+24>>3]*D+ +h[d+(z<<5)+16>>3]));A=c[144]|0;do{if((a[64788+(A*688&-1)|0]&1)==0){F=E}else{if(E<=0.0){F=s;break}D=+_(+E);F=D/+h[64800+(A*688&-1)>>3]}}while(0);A=g+(k<<6)|0;c[A>>2]=0;h[g+(k<<6)+8>>3]=y;do{if(y>2]&1|0)!=0){G=y;H=993;break}I=x;H=996}else{G=x;H=993}}while(0);L1400:do{if((H|0)==993){H=0;do{if(y>t){if((c[64648+((c[200]|0)*688&-1)>>2]&2|0)!=0){J=y;break}I=G;H=996;break L1400}else{J=t}}while(0);h[g+(k<<6)+16>>3]=F;do{if(F>2]&1|0)!=0){K=F;break}c[A>>2]=1;L=w;M=u;N=J;O=G;break L1400}else{K=u}}while(0);if(F<=w){L=w;M=K;N=J;O=G;break}if((c[64648+((c[144]|0)*688&-1)>>2]&2|0)!=0){L=F;M=K;N=J;O=G;break}c[A>>2]=1;L=w;M=K;N=J;O=G}}while(0);if((H|0)==996){H=0;c[A>>2]=1;h[g+(k<<6)+16>>3]=F;L=w;M=u;N=t;O=I}h[g+(k<<6)+56>>3]=y;h[g+(k<<6)+48>>3]=y;h[g+(k<<6)+40>>3]=F;h[g+(k<<6)+32>>3]=F;h[g+(k<<6)+24>>3]=-1.0;P=k+1|0;if((P|0)<(c[6352]|0)){t=N;u=M;w=L;x=O;f=z;k=P}else{break}}if(N>n){k=c[200]|0;if((a[64788+(k*688&-1)|0]&1)==0){Q=N}else{Q=+Z(+(N*+h[64800+(k*688&-1)>>3]))}h[64672+(k*688&-1)>>3]=Q}if(O>3]))}h[64664+(k*688&-1)>>3]=R}if(L>q){k=c[144]|0;if((a[64788+(k*688&-1)|0]&1)==0){S=L}else{S=+Z(+(L*+h[64800+(k*688&-1)>>3]))}h[64672+(k*688&-1)>>3]=S}if(M>=r){i=j;return}k=c[144]|0;if((a[64788+(k*688&-1)|0]&1)==0){T=M}else{T=+Z(+(M*+h[64800+(k*688&-1)>>3]))}h[64664+(k*688&-1)>>3]=T;i=j;return}function hp(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;d=i;if((a|0)<1|(b|0)<1){e=0;i=d;return e|0}f=a<<2;g=ut(f)|0;do{if((g|0)==0){gk();h=ut(f)|0;if((h|0)!=0){j=h;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=217072,v)|0);return 0}else{j=g}}while(0);g=j;j=aa(a<<3,b);f=ut(j)|0;do{if((f|0)==0){gk();h=ut(j)|0;if((h|0)!=0){k=h;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=163832,v)|0);return 0}else{k=f}}while(0);f=k;c[g>>2]=f;if((a|0)>1){l=1;m=f}else{e=g;i=d;return e|0}while(1){f=m+(b<<3)|0;c[g+(l<<2)>>2]=f;k=l+1|0;if((k|0)<(a|0)){l=k;m=f}else{e=g;break}}i=d;return e|0}function hq(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,l=0.0,m=0,n=0.0,o=0,p=0,q=0.0,r=0,s=0,t=0.0,u=0,v=0,w=0,x=0.0;f=(b|0)>0;if(f){g=-1;i=0;j=a}else{return}while(1){k=e+(c[d+(i<<2)>>2]<<3)|0;l=+h[k>>3];m=e+(i<<3)|0;h[k>>3]=+h[m>>3];do{if((g|0)>-1){k=i-1|0;if((g|0)>(k|0)){n=l;o=g;break}p=g;q=l;r=e+(g<<3)|0;s=(c[j>>2]|0)+(g<<3)|0;while(1){t=q- +h[s>>3]*+h[r>>3];u=p+1|0;if((u|0)>(k|0)){n=t;o=g;break}else{p=u;q=t;r=r+8|0;s=s+8|0}}}else{if(l==0.0){n=l;o=g;break}n=l;o=i}}while(0);h[m>>3]=n;s=i+1|0;if((s|0)<(b|0)){g=o;i=s;j=j+4|0}else{break}}if(f){v=a+(b<<2)|0;w=b}else{return}while(1){a=v-4|0;f=w-1|0;j=e+(f<<3)|0;L1476:do{if((w|0)<(b|0)){i=w;o=e+(w<<3)|0;g=(c[a>>2]|0)+(w<<3)|0;n=+h[j>>3];while(1){l=n- +h[g>>3]*+h[o>>3];h[j>>3]=l;d=i+1|0;if((d|0)>=(b|0)){x=l;break L1476}i=d;o=o+8|0;g=g+8|0;n=l}}else{x=+h[j>>3]}}while(0);h[j>>3]=x/+h[(c[a>>2]|0)+(f<<3)>>3];if((f|0)>0){v=a;w=f}else{break}}return}function hr(a,b,d,e,f,g,j){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0,w=0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0,J=0,K=0.0,L=0.0,M=0.0,N=0.0;k=i;l=(g|0)>0;L1485:do{if(l){m=(b|0)==0;n=0;L1487:while(1){o=n+1|0;if((o|0)<(f|0)){p=a+(n<<2)|0;q=(o|0)<(g|0);r=b+(n<<3)|0;s=o;do{t=a+(s<<2)|0;u=+h[(c[t>>2]|0)+(n<<3)>>3];do{if(u!=0.0){w=(c[p>>2]|0)+(n<<3)|0;x=+h[w>>3];y=+P(+x);do{if(y<+P(+u)*2.220446049250313e-16){z=1.0;A=1.0;B=0.0;C=-0.0-u}else{if(x>0.0){D=1.0}else{D=+((x<0.0)<<31>>31|0)}E=D*+Q(+(x*x+u*u));if(E==0.0){break L1487}F=x/E;G=(-0.0-u)/E;if(+P(+G)0.0){H=1.0}else{H=+((G<0.0)<<31>>31|0)}z=H/F;A=G;B=F;C=E}}while(0);h[w>>3]=C;h[(c[t>>2]|0)+(n<<3)>>3]=z;if(q){I=o;do{y=+h[(c[p>>2]|0)+(I<<3)>>3];J=(c[t>>2]|0)+(I<<3)|0;E=+h[J>>3];h[J>>3]=A*y+B*E;h[(c[p>>2]|0)+(I<<3)>>3]=B*y-A*E;I=I+1|0;}while((I|0)<(g|0))}if(m){break}E=+h[r>>3];I=b+(s<<3)|0;y=+h[I>>3];h[I>>3]=A*E+B*y;h[r>>3]=B*E-A*y}}while(0);s=s+1|0;}while((s|0)<(f|0))}if((o|0)<(g|0)){n=o}else{break L1485}}be(42289,136640,(v=i,i=i+16|0,h[v>>3]=x,h[v+8>>3]=u,v)|0);fb()}}while(0);if((b|0)==0){i=k;return}n=g-1|0;L1519:do{if(l){m=n;while(1){u=+h[b+(m<<3)>>3];h[e+(m<<3)>>3]=0.0;s=m+1|0;r=c[a+(m<<2)>>2]|0;if((s|0)<(g|0)){x=u;p=s;while(1){A=x+ +h[r+(p<<3)>>3]*+h[d+(p<<3)>>3];s=p+1|0;if((s|0)<(g|0)){x=A;p=s}else{K=A;break}}}else{K=u}x=+h[r+(m<<3)>>3];if(x==0.0){break}h[d+(m<<3)>>3]=(-0.0-K)/x;if((m|0)>0){m=m-1|0}else{break L1519}}uD(42289,123272,28);fb()}}while(0);if((g|0)<(f|0)){d=g;do{h[e+(d<<3)>>3]=+h[b+(d<<3)>>3];d=d+1|0;}while((d|0)<(f|0))}if((j|0)==0|l^1){i=k;return}l=(f|0)>0;j=n;while(1){if(l){n=e+(j<<3)|0;d=f;do{d=d-1|0;K=+h[(c[a+(d<<2)>>2]|0)+(j<<3)>>3];do{if(K==1.0){L=1.0;M=0.0}else{x=+P(+K);if(x<1.0){L=K;M=+Q(+(1.0-K*K));break}A=1.0/x;if(K>0.0){N=1.0}else{N=+((K<0.0)<<31>>31|0)}L=N*+Q(+(1.0-A*A));M=A}}while(0);K=+h[n>>3];r=e+(d<<3)|0;u=+h[r>>3];h[r>>3]=K*(-0.0-L)+M*u;h[n>>3]=M*K+L*u;}while((d|0)>0)}if((j|0)>0){j=j-1|0}else{break}}i=k;return}function hs(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0;e=0;while(1){if((e|0)>=(d|0)){break}f=b+(e<<2)|0;g=c[f>>2]|0;if((e|0)>0){i=0;j=g;while(1){h[j+(i<<3)>>3]=0.0;k=i+1|0;l=c[f>>2]|0;if((k|0)<(e|0)){i=k;j=l}else{m=l;break}}}else{m=g}h[m+(e<<3)>>3]=1.0;if(+h[(c[a+(e<<2)>>2]|0)+(e<<3)>>3]!=0.0){e=e+1|0}else{n=1108;break}}if((n|0)==1108){uD(42289,106064,30);fb()}n=(d|0)>0;if(n){o=0}else{return}do{e=o;do{m=(c[b+(e<<2)>>2]|0)+(o<<3)|0;p=+h[m>>3];if((o|0)<(e|0)){j=o;q=p;while(1){r=q- +h[(c[a+(j<<2)>>2]|0)+(e<<3)>>3]*+h[(c[b+(j<<2)>>2]|0)+(o<<3)>>3];i=j+1|0;if((i|0)<(e|0)){j=i;q=r}else{s=r;break}}}else{s=p}h[m>>3]=s/+h[(c[a+(e<<2)>>2]|0)+(e<<3)>>3];e=e+1|0;}while((e|0)<(d|0));o=o+1|0;}while((o|0)<(d|0));if(!n){return}n=d-1|0;o=0;do{if((n|0)>=(o|0)){e=d;g=n;while(1){j=(c[b+(g<<2)>>2]|0)+(o<<3)|0;s=+h[j>>3];i=c[a+(g<<2)>>2]|0;if((e|0)<(d|0)){f=e;q=s;while(1){r=q- +h[i+(f<<3)>>3]*+h[(c[b+(f<<2)>>2]|0)+(o<<3)>>3];l=f+1|0;if((l|0)<(d|0)){f=l;q=r}else{t=r;break}}}else{t=s}h[j>>3]=t/+h[i+(g<<3)>>3];f=g-1|0;if((f|0)<(o|0)){break}else{e=g;g=f}}}o=o+1|0;}while((o|0)<(d|0));return}function ht(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0,t=0.0,u=0,w=0,x=0,y=0,z=0.0,A=0,B=0,C=0,D=0.0,E=0,F=0.0,G=0,H=0,I=0;f=i;if((b|0)<1){h[e>>3]=1.0;g=0;j=g;uu(j);i=f;return}k=b<<3;l=ut(k)|0;do{if((l|0)==0){gk();m=ut(k)|0;if((m|0)!=0){n=m;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=215008,v)|0)}else{n=l}}while(0);l=n;h[e>>3]=1.0;n=a+(b<<2)|0;k=a;m=l;while(1){o=c[k>>2]|0;p=o+(b<<3)|0;q=o;r=0.0;L1601:while(1){o=q;while(1){if(o>>>0>=p>>>0){break L1601}s=o+8|0;t=+P(+(+h[o>>3]));if(t>r){q=s;r=t;continue L1601}else{o=s}}}if(r==0.0){u=1137;break}h[m>>3]=1.0/r;q=k+4|0;if(q>>>0>>0){k=q;m=m+8|0}else{break}}if((u|0)==1137){uf(-1,98640,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}u=b-1|0;m=a;k=0;n=-1;while(1){q=(k|0)>0;if(q){p=0;do{o=a+(p<<2)|0;s=c[o>>2]|0;w=s+(k<<3)|0;L1616:do{if((p|0)>0){x=0;t=+h[w>>3];y=s;while(1){z=t- +h[y+(x<<3)>>3]*+h[(c[a+(x<<2)>>2]|0)+(k<<3)>>3];h[w>>3]=z;A=x+1|0;if((A|0)>=(p|0)){break L1616}x=A;t=z;y=c[o>>2]|0}}}while(0);p=p+1|0;}while((p|0)<(k|0))}p=l+(k<<3)|0;r=0.0;o=p;w=n;s=k;while(1){y=a+(s<<2)|0;x=c[y>>2]|0;A=x+(k<<3)|0;t=+h[A>>3];L1625:do{if(q){B=0;z=t;C=x;while(1){D=z- +h[C+(B<<3)>>3]*+h[(c[a+(B<<2)>>2]|0)+(k<<3)>>3];h[A>>3]=D;E=B+1|0;if((E|0)>=(k|0)){F=D;break L1625}B=E;z=D;C=c[y>>2]|0}}else{F=t}}while(0);t=+h[o>>3];z=t*+P(+F);y=z>2]|0;o=c[m>>2]|0;while(1){r=+h[w>>3];h[w>>3]=+h[o>>3];h[o>>3]=r;q=s+1|0;if((q|0)<(b|0)){s=q;w=w+8|0;o=o+8|0}else{break}}h[e>>3]=-0.0- +h[e>>3];h[l+(G<<3)>>3]=+h[p>>3]}c[d+(k<<2)>>2]=G;o=(c[m>>2]|0)+(k<<3)|0;if(+h[o>>3]==0.0){h[o>>3]=1.0e-30}do{if((k|0)==(u|0)){H=k+1|0}else{r=1.0/+h[(c[m>>2]|0)+(k<<3)>>3];o=k+1|0;if((o|0)<(b|0)){I=o}else{H=o;break}while(1){w=(c[a+(I<<2)>>2]|0)+(k<<3)|0;h[w>>3]=r*+h[w>>3];w=I+1|0;if((w|0)<(b|0)){I=w}else{H=o;break}}}}while(0);if((H|0)<(b|0)){m=m+4|0;k=H;n=G}else{g=l;break}}j=g;uu(j);i=f;return}function hu(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0;b=i;d=ut(16)|0;do{if((d|0)==0){gk();e=ut(16)|0;if((e|0)!=0){f=e;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=213800,v)|0);return 0}else{f=d}}while(0);d=f;c[f+4>>2]=(a|0)<0?0:a;c[f+8>>2]=0;if((a|0)<=0){c[f+12>>2]=0;g=f;c[g>>2]=0;i=b;return d|0}e=a<<6;a=ut(e)|0;do{if((a|0)==0){gk();h=ut(e)|0;if((h|0)!=0){j=h;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=217008,v)|0);return 0}else{j=a}}while(0);c[f+12>>2]=j;uE(j|0,0,e|0);g=f;c[g>>2]=0;i=b;return d|0}function hv(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;e=a+4|0;if((c[e>>2]|0)==(b|0)){i=d;return}f=a+12|0;a=c[f>>2]|0;g=(a|0)==0;if((b|0)<=0){if(!g){uu(a)}c[f>>2]=0;c[e>>2]=0;i=d;return}do{if(g){h=b<<6;j=ut(h)|0;if((j|0)!=0){k=j;break}gk();j=ut(h)|0;if((j|0)!=0){k=j;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=217008,v)|0)}else{k=db(a,b<<6,214200)|0}}while(0);a=k;c[f>>2]=a;f=c[e>>2]|0;if((f|0)<(b|0)){uE(a+(f<<6)|0,0,b-f<<6|0)}c[e>>2]=b;i=d;return}function hw(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0;f=i;hx(b,d,0);a[46896]=e&1;if((b|0)==0){uj(-1,76976,(v=i,i=i+16|0,c[v>>2]=e?224760:217408,c[v+8>>2]=d,v)|0)}if((c[o>>2]|0)==(b|0)){a[37400]=1;do{}while((dI()|0)==0);g=hy()|0;i=f;return}c[13896]=0;if(e){c[13896]=0;d=c[13898]|0;h=c[8272]|0;L1694:do{if((d|0)<(h|0)){j=d;k=h;while(1){l=c[1054]|0;m=(a[l+(j*40&-1)|0]&1)==0;L1697:do{if(!m){n=c[l+(j*40&-1)+36>>2]|0;p=l+(j*40&-1)+32|0;q=c[10036]|0;r=0;while(1){if((r|0)>=(n|0)){break}if((a[q+((c[p>>2]|0)+r|0)|0]|0)==(a[r+103664|0]|0)){r=r+1|0}else{break L1697}}if((r|0)==1){s=k;t=j;break L1694}}}while(0);p=c[13896]|0;if((p|0)>=10){s=k;t=j;break L1694}do{if(m){c[13896]=p+1;u=55544+(p<<2)|0;w=l+(j*40&-1)+32|0;x=1212}else{q=l+(j*40&-1)+32|0;n=a[(c[10036]|0)+(c[q>>2]|0)|0]|0;if(n<<24>>24==39){c[13896]=p+1;y=55544+(p<<2)|0}else{c[13896]=p+1;z=55544+(p<<2)|0;if(n<<24>>24==34){y=z}else{u=z;w=q;x=1212;break}}ub(y,j,j)}}while(0);if((x|0)==1212){x=0;p=c[l+(j*40&-1)+36>>2]|0;m=p+(c[w>>2]|0)|0;q=db(c[u>>2]|0,p+1|0,116456)|0;c[u>>2]=q;p=c[(c[1054]|0)+(j*40&-1)+32>>2]|0;L1714:do{if((p|0)<(m|0)){z=p;n=q;while(1){A=a[(c[10036]|0)+z|0]|0;if(A<<24>>24==0){B=n;break L1714}C=n+1|0;a[n]=A;A=z+1|0;if((A|0)<(m|0)){z=A;n=C}else{B=C;break}}}else{B=q}}while(0);a[B]=0}q=(c[13898]|0)+1|0;c[13898]=q;m=c[8272]|0;if((q|0)<(m|0)){j=q;k=m}else{s=m;t=q;break}}}else{s=h;t=d}}while(0);do{if((t|0)<(s|0)){d=c[1054]|0;if((a[d+(t*40&-1)|0]&1)==0){D=t+1|0;c[13898]=D;uf(D,221400,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}h=c[d+(t*40&-1)+36>>2]|0;B=d+(t*40&-1)+32|0;d=c[10036]|0;u=0;while(1){if((u|0)>=(h|0)){break}if((a[d+((c[B>>2]|0)+u|0)|0]|0)==(a[u+103664|0]|0)){u=u+1|0}else{x=1274;break}}if((x|0)==1274){D=t+1|0;c[13898]=D;uf(D,221400,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((u|0)==1){break}D=t+1|0;c[13898]=D;uf(D,221400,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);c[(c[8804]|0)+44>>2]=t}c[9354]=0;a[37400]=0;L1735:while(1){t=0;D=c[10034]|0;s=c[10036]|0;L1737:while(1){if((a6(s+t|0,D|0,b|0)|0)==0){x=1228;break}c[9354]=(c[9354]|0)+1;B=c[10036]|0;d=uA(B|0)|0;h=d-1|0;w=B+h|0;B=a[w]|0;do{if(B<<24>>24==10){a[w]=0;y=(h|0)>0?d-2|0:h;k=(c[10036]|0)+y|0;j=a[k]|0;if(j<<24>>24!=13){E=y;F=j;x=1234;break}a[k]=0;k=(((y|0)>0)<<31>>31)+y|0;E=k;F=a[(c[10036]|0)+k|0]|0;x=1234}else{if((d+1|0)<(D|0)){E=h;F=B;x=1234;break}dG();G=((1-d|0)-1|0)+(c[10034]|0)|0;H=d}}while(0);do{if((x|0)==1234){x=0;if(F<<24>>24==92){G=(c[10034]|0)-E|0;H=E;break}if((a[43472]&1)!=0){dK()}d=jl(40144,40136)|0;c[8272]=d;B=(c[10036]|0)+(c[(c[1054]|0)+(d*40&-1)+32>>2]|0)|0;if((a[B]|0)==35){a[B]=0}B=c[12918]|0;if((B|0)<0){x=1242;break L1735}if((B|0)<=0){x=1244;break L1737}if((E+4|0)>>>0>(c[10034]|0)>>>0){dG()}B=c[10036]|0;d=B+(uA(B|0)|0)|0;a[d]=a[125976]|0;a[d+1|0]=a[125977|0]|0;a[d+2|0]=a[125978|0]|0;d=uA(c[10036]|0)|0;G=(c[10034]|0)-d|0;H=d}}while(0);d=c[10036]|0;if(0){I=0;J=d;break}else{t=H;D=G;s=d}}if((x|0)==1244){x=0;I=0;J=c[10036]|0}else if((x|0)==1228){x=0;a[(c[10036]|0)+t|0]=0;I=1;J=c[10036]|0}if((a[J]|0)==0){K=I}else{if(e){s=bP(J|0)|0;a[c[10036]|0]=0;D=0;u=s;while(1){d=a[u]|0;if((d<<24>>24|0)==36){B=u+1|0;L=a[B]|0;do{if((L|0)==35){h=c[13896]|0;if(h>>>0>=10){x=1255;break L1735}be(43480,98608,(v=i,i=i+8|0,c[v>>2]=h,v)|0);M=43480}else if((L|0)==36){M=180784}else{h=L-48|0;if(h>>>0>=10){x=1260;break L1735}if((h|0)>=(c[13896]|0)){M=179864;break}M=c[55544+(h<<2)>>2]|0}}while(0);h=uA(M|0)|0;w=h+1|0;if(((c[10034]|0)-D|0)>>>0>>0){do{dG();}while(((c[10034]|0)-D|0)>>>0>>0)}w=(c[10036]|0)+D|0;uB(w|0,M|0);N=h+D|0;O=B}else if((d<<24>>24|0)==0){break}else{w=D+1|0;if(w>>>0>(c[10034]|0)>>>0){dG();P=a[u]|0}else{P=d}a[(c[10036]|0)+D|0]=P;N=w;O=u}D=N;u=O+1|0}if((D+1|0)>>>0>(c[10034]|0)>>>0){dG()}a[(c[10036]|0)+D|0]=0;uu(s)}a[25280]=0;K=(dJ()|0)==0?I:1}if((K|0)!=0){x=1276;break}}if((x|0)==1255){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=105968,v)|0)}else if((x|0)==1260){uf(-1,85080,(v=i,i=i+8|0,c[v>>2]=L,v)|0)}else if((x|0)==1242){uf(-1,211816,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((x|0)==1276){g=hy()|0;i=f;return}}function hx(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;f=i;g=ut(96)|0;do{if((g|0)==0){gk();h=ut(96)|0;if((h|0)!=0){j=h;break}if((b|0)==0){k=c[13898]|0;uf(k,196888,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}az(b|0);k=c[13898]|0;uf(k,196888,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{j=g}}while(0);c[j>>2]=b;c[j+4>>2]=d;c[j+8>>2]=e;a[j+12|0]=a[37400]&1;c[j+16>>2]=c[9354];a[j+13|0]=a[46896]&1;c[j+52>>2]=c[13896];c[j+56>>2]=c[13886];c[13886]=0;c[j+60>>2]=c[13887];c[13887]=0;c[j+64>>2]=c[13888];c[13888]=0;c[j+68>>2]=c[13889];c[13889]=0;c[j+72>>2]=c[13890];c[13890]=0;c[j+76>>2]=c[13891];c[13891]=0;c[j+80>>2]=c[13892];c[13892]=0;c[j+84>>2]=c[13893];c[13893]=0;c[j+88>>2]=c[13894];c[13894]=0;c[j+92>>2]=c[13895];c[13895]=0;e=j;d=c[8804]|0;do{if((d|0)==0){c[j+20>>2]=0}else{b=(c[d+20>>2]|0)+1|0;c[j+20>>2]=b;if((b|0)<=250){break}uf(-1,185608,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);c[j+24>>2]=c[9368];a[j+28|0]=a[37464]&1;a[j+29|0]=a[37480]&1;c[j+44>>2]=c[13898];c[j+40>>2]=c[8272];d=((c[8272]|0)*40&-1)+40|0;b=ut(d)|0;do{if((b|0)==0){gk();g=ut(d)|0;if((g|0)!=0){l=g;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=180384,v)|0)}else{l=b}}while(0);c[j+36>>2]=l;uD(l|0,c[1054]|0,((c[8272]|0)*40&-1)+40|0);l=c[10036]|0;if((l|0)==0){m=0;n=j+32|0;o=n;c[o>>2]=m;p=c[8804]|0;q=j+48|0;r=q;c[r>>2]=p;c[8804]=e;i=f;return}m=bP(l|0)|0;n=j+32|0;o=n;c[o>>2]=m;p=c[8804]|0;q=j+48|0;r=q;c[r>>2]=p;c[8804]=e;i=f;return}function hy(){var b=0,d=0,e=0,f=0,g=0,h=0;b=i;d=c[8804]|0;if((d|0)==0){e=0;i=b;return e|0}f=c[d>>2]|0;L1827:do{if(!((f|0)==0|(f|0)==(c[o>>2]|0))){g=c[d+4>>2]|0;do{if((g|0)!=0){if((a[g]|0)!=60){break}a2(f|0);break L1827}}while(0);az(f|0)}}while(0);f=c[13886]|0;if((f|0)!=0){uu(f)}c[13886]=c[d+56>>2];f=c[13887]|0;if((f|0)!=0){uu(f)}c[13887]=c[d+60>>2];f=c[13888]|0;if((f|0)!=0){uu(f)}c[13888]=c[d+64>>2];f=c[13889]|0;if((f|0)!=0){uu(f)}c[13889]=c[d+68>>2];f=c[13890]|0;if((f|0)!=0){uu(f)}c[13890]=c[d+72>>2];f=c[13891]|0;if((f|0)!=0){uu(f)}c[13891]=c[d+76>>2];f=c[13892]|0;if((f|0)!=0){uu(f)}c[13892]=c[d+80>>2];f=c[13893]|0;if((f|0)!=0){uu(f)}c[13893]=c[d+84>>2];f=c[13894]|0;if((f|0)!=0){uu(f)}c[13894]=c[d+88>>2];f=c[13895]|0;if((f|0)!=0){uu(f)}c[13895]=c[d+92>>2];c[13896]=c[d+52>>2];a[46896]=a[d+13|0]&1;a[37400]=a[d+12|0]&1;c[9354]=c[d+16>>2];c[9368]=c[d+24>>2];a[37480]=a[d+29|0]&1;a[37464]=a[d+28|0]&1;f=d+36|0;do{if((c[f>>2]|0)!=0){g=d+40|0;c[8272]=c[g>>2];c[13898]=c[d+44>>2];h=(c[g>>2]|0)+1|0;if((c[1052]|0)<(h|0)){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=202392,v)|0);return 0}else{uD(c[1054]|0,c[f>>2]|0,h*40&-1);uu(c[f>>2]|0);break}}}while(0);f=d+32|0;h=c[f>>2]|0;if((h|0)!=0){g=c[10036]|0;uB(g|0,h|0);uu(c[f>>2]|0)}uu(c[d+4>>2]|0);uu(c[d+8>>2]|0);c[8804]=c[d+48>>2];uu(d);e=1;i=b;return e|0}function hz(a){a=a|0;var b=0,d=0,e=0;b=i;if((c[3524]|0)==0){if((a|0)==0){i=b;return}d=c[m>>2]|0;aI(154728,34,1,d|0);i=b;return}uu(c[6958]|0);uu(c[6956]|0);d=c[c[3524]>>2]|0;if((d|0)==0){e=0}else{e=bP(d|0)|0}c[6958]=e;e=bP(13048)|0;c[6956]=e;if((a|0)==0){i=b;return}cf(c[m>>2]|0,164104,(v=i,i=i+16|0,c[v>>2]=c[6958],c[v+8>>2]=e,v)|0);i=b;return}function hA(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;e=i;L1890:do{if((a[b]|0)==60){if(!(a[14168]|0)){uf(-1,145320,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}f=bt(b+1|0,193632)|0;if((f|0)==0){g=0}else{h=f;break}i=e;return g|0}else{f=bF(b|0,d|0)|0;if((f|0)==0){j=0}else{h=f;break}while(1){f=c[8776]|0;if((f|0)==0){break}k=c[8774]|0;do{if((k|0)==0){c[8774]=f;l=c[8778]|0;if((l|0)!=0){m=f;n=l;break}l=c[8780]|0;c[8778]=l;m=f;n=l}else{l=k+((uA(k|0)|0)+1|0)|0;c[8774]=l;m=l;n=c[8778]|0}}while(0);if(m>>>0>=n>>>0){o=1356;break}if((m|0)==0){break}k=uA(m|0)|0;p=db(j,(k+2|0)+(uA(b|0)|0)|0,172208)|0;uB(p|0,m|0);k=uA(p|0)|0;f=(k|0)==0?0:k-1|0;k=a[p+f|0]|0;if(!((k<<24>>24|0)==47|(k<<24>>24|0)==0)){a[p+(f+1|0)|0]=47;a[p+(f+2|0)|0]=0}uC(p|0,b|0);q=bF(p|0,d|0)|0;if((q|0)==0){j=p}else{o=1361;break}}if((o|0)==1356){c[8774]=0;c[8778]=0}else if((o|0)==1361){uu(p);f=c[8776]|0;if((f|0)==0){h=q;break}while(1){k=c[8774]|0;do{if((k|0)==0){c[8774]=f;l=c[8778]|0;if((l|0)!=0){r=f;s=l;break}l=c[8780]|0;c[8778]=l;r=f;s=l}else{l=k+((uA(k|0)|0)+1|0)|0;c[8774]=l;r=l;s=c[8778]|0}}while(0);if(r>>>0>=s>>>0){break}if((r|0)==0|(f|0)==0){h=q;break L1890}}c[8774]=0;c[8778]=0;h=q;break}if((j|0)==0){h=0;break}uu(j);h=0}}while(0);g=h;i=e;return g|0}function hB(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;if((a[b]|0)==60){uj(-1,168312,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}L1930:do{if((bF(b|0,193632)|0)==0){e=ur(8,0)|0;if((e|0)==0){f=0;break}else{g=e}while(1){h=bP(g|0)|0;e=h+((uA(h|0)|0)-1|0)|0;if((a[e]|0)==33){a[e]=0;j=1}else{j=0}k=hC(h,b,j)|0;if((k|0)!=0){break}uu(h);e=ur(8,0)|0;if((e|0)==0){f=0;break L1930}else{g=e}}do{}while((ur(8,0)|0)!=0);uu(h);f=k}else{if((b|0)==0){f=0;break}f=bP(b|0)|0}}while(0);i=d;return f|0}function hC(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;f=i;i=i+72|0;g=f|0;h=uA(b|0)|0;j=(h+2|0)+(uA(d|0)|0)|0;h=ut(j)|0;do{if((h|0)==0){gk();k=ut(j)|0;if((k|0)!=0){l=k;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=223784,v)|0);return 0}else{l=h}}while(0);uB(l|0,b|0);h=uA(l|0)|0;j=(h|0)==0?0:h-1|0;h=a[l+j|0]|0;if(!((h<<24>>24|0)==47|(h<<24>>24|0)==0)){a[l+(j+1|0)|0]=47;a[l+(j+2|0)|0]=0}uC(l|0,d|0);j=bF(l|0,193632)|0;if((j|0)!=0){az(j|0);m=l;i=f;return m|0}uu(l);if(!e){m=0;i=f;return m|0}e=aW(b|0)|0;if((e|0)==0){m=0;i=f;return m|0}l=a3(e|0)|0;L1962:do{if((l|0)==0){n=0}else{j=g+8|0;h=l;while(1){k=uA(b|0)|0;o=h+4|0;p=(k+2|0)+(uA(o|0)|0)|0;k=ut(p)|0;if((k|0)==0){gk();q=ut(p)|0;if((q|0)==0){break}else{r=q}}else{r=k}uB(r|0,b|0);k=uA(r|0)|0;q=(k|0)==0?0:k-1|0;k=a[r+q|0]|0;if(!((k<<24>>24|0)==47|(k<<24>>24|0)==0)){a[r+(q+1|0)|0]=47;a[r+(q+2|0)|0]=0}uC(r|0,o|0);cu(r|0,g|0);do{if((c[j>>2]&61440|0)==16384){if((aY(o|0,202200)|0)==0){break}if((aY(o|0,221856)|0)==0){break}q=hC(r,d,1)|0;if((q|0)!=0){n=q;break L1962}}}while(0);uu(r);o=a3(e|0)|0;if((o|0)==0){n=0;break L1962}else{h=o}}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=223216,v)|0);return 0}}while(0);bR(e|0);m=n;i=f;return m|0}function hD(){var b=0,d=0,e=0,f=0,g=0,h=0;b=i;d=c[6958]|0;if((d|0)==0){e=c[m>>2]|0;aI(145512,32,1,e|0);i=b;return}e=(uA(d|0)|0)+11|0;d=c[6956]|0;if((d|0)==0){f=e}else{g=d;while(1){d=a[g]|0;if((d<<24>>24|0)==92|(d<<24>>24|0)==10){a[g]=32}else if((d<<24>>24|0)==0){break}g=g+1|0}f=(uA(c[6956]|0)|0)+e|0}e=ut(f)|0;do{if((e|0)==0){gk();g=ut(f)|0;if((g|0)!=0){h=g;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=216216,v)|0)}else{h=e}}while(0);e=a[37400]&1;a[37400]=0;f=c[6956]|0;be(h|0,149608,(v=i,i=i+16|0,c[v>>2]=c[6958],c[v+8>>2]=(f|0)!=0?f:179864,v)|0);dL(h);a[37400]=e;if(e<<24>>24==0){i=b;return}e=(a[13048]|0)!=0?13048:179864;cf(c[m>>2]|0,147624,(v=i,i=i+16|0,c[v>>2]=c[c[3524]>>2],c[v+8>>2]=e,v)|0);i=b;return}function hE(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0.0,N=0.0;d=i;i=i+48|0;e=d|0;f=d+24|0;g=c[13898]|0;j=c[1054]|0;k=c[j+(g*40&-1)+36>>2]|0;l=c[j+(g*40&-1)+32>>2]|0;m=(a[j+(g*40&-1)|0]&1)==0;g=(k|0)>0;j=c[10036]|0;n=43320;o=108448;L2002:while(1){L2004:do{if(!m){if(g){p=0;q=0;r=l;while(1){s=a[o+p|0]|0;if(s<<24>>24==(a[j+(p+r|0)|0]|0)){t=r;u=q}else{if(s<<24>>24!=36){break L2004}t=r-1|0;u=1}w=p+1|0;if((w|0)<(u+k|0)){p=w;q=u;r=t}else{break}}if((u|0)==0){x=w}else{y=n;break L2002}}else{x=0}r=a[o+x|0]|0;if((r<<24>>24|0)==36|(r<<24>>24|0)==0){y=n;break L2002}}}while(0);r=n+8|0;q=c[r>>2]|0;if((q|0)==0){y=r;break}else{n=r;o=q}}o=c[y+4>>2]|0;do{if((o|0)==11){c[b+24>>2]=1;y=(c[13898]|0)+1|0;c[13898]=y;n=c[1054]|0;x=c[n+(y*40&-1)+36>>2]|0;w=c[n+(y*40&-1)+32>>2]|0;u=(a[n+(y*40&-1)|0]&1)==0;y=(x|0)>0;n=c[10036]|0;t=43320;k=108448;L2019:while(1){L2021:do{if(!u){if(y){j=0;l=0;g=w;while(1){m=a[k+j|0]|0;if(m<<24>>24==(a[n+(j+g|0)|0]|0)){z=g;A=l}else{if(m<<24>>24!=36){break L2021}z=g-1|0;A=1}B=j+1|0;if((B|0)<(A+x|0)){j=B;l=A;g=z}else{break}}if((A|0)==0){C=B}else{D=t;break L2019}}else{C=0}g=a[k+C|0]|0;if((g<<24>>24|0)==36|(g<<24>>24|0)==0){D=t;break L2019}}}while(0);g=t+8|0;l=c[g>>2]|0;if((l|0)==0){D=g;break}else{t=g;k=l}}E=c[D+4>>2]|0}else{k=b+24|0;if((o|0)!=12){c[k>>2]=0;E=o;break}c[k>>2]=-1;k=(c[13898]|0)+1|0;c[13898]=k;t=c[1054]|0;x=c[t+(k*40&-1)+36>>2]|0;n=c[t+(k*40&-1)+32>>2]|0;w=(a[t+(k*40&-1)|0]&1)==0;k=(x|0)>0;t=c[10036]|0;y=43320;u=108448;L2038:while(1){L2040:do{if(!w){if(k){l=0;g=0;j=n;while(1){m=a[u+l|0]|0;if(m<<24>>24==(a[t+(l+j|0)|0]|0)){F=j;G=g}else{if(m<<24>>24!=36){break L2040}F=j-1|0;G=1}H=l+1|0;if((H|0)<(G+x|0)){l=H;g=G;j=F}else{break}}if((G|0)==0){I=H}else{J=y;break L2038}}else{I=0}j=a[u+I|0]|0;if((j<<24>>24|0)==36|(j<<24>>24|0)==0){J=y;break L2038}}}while(0);j=y+8|0;g=c[j>>2]|0;if((g|0)==0){J=j;break}else{y=j;u=g}}E=c[J+4>>2]|0}}while(0);J=b|0;if((E|0)==-1){c[J>>2]=0;i=d;return}c[J>>2]=1;c[13898]=(c[13898]|0)+1;J=b+4|0;c[J>>2]=E;I=b+8|0;h[I>>3]=0.0;H=c[13898]|0;if((c[8272]|0)<=(H|0)){i=d;return}G=c[1054]|0;if((a[G+(H*40&-1)|0]&1)==0){i=d;return}F=c[G+(H*40&-1)+36>>2]|0;o=G+(H*40&-1)+32|0;G=c[10036]|0;D=0;while(1){if((D|0)>=(F|0)){break}if((a[G+((c[o>>2]|0)+D|0)|0]|0)==(a[D+115e3|0]|0)){D=D+1|0}else{K=1504;break}}if((K|0)==1504){i=d;return}if((D|0)!=1){i=d;return}if((E|0)<9){c[J>>2]=E+4;L=c[13898]|0}else{L=H}c[13898]=L+1;L=is(e)|0;H=c[L>>2]|0;if((H|0)==1){M=+(c[L+8>>2]|0)}else if((H|0)==2){M=+h[L+8>>3]}else if((H|0)==3){M=+uz(c[L+8>>2]|0,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}L=e|0;if((c[L>>2]|0)==3){uu(c[e+8>>2]|0);c[L>>2]=1}h[I>>3]=M;if((E|0)!=9){i=d;return}E=c[13898]|0;if((c[8272]|0)<=(E|0)){uf(E,138448,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}I=c[1054]|0;if((a[I+(E*40&-1)|0]&1)==0){uf(E,138448,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}L=c[I+(E*40&-1)+36>>2]|0;e=I+(E*40&-1)+32|0;I=c[10036]|0;H=0;while(1){if((H|0)>=(L|0)){break}if((a[I+((c[e>>2]|0)+H|0)|0]|0)==(a[H+148464|0]|0)){H=H+1|0}else{K=1507;break}}if((K|0)==1507){uf(E,138448,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((H|0)!=1){uf(E,138448,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[13898]=E+1;E=is(f)|0;H=c[E>>2]|0;if((H|0)==1){N=+(c[E+8>>2]|0)}else if((H|0)==2){N=+h[E+8>>3]}else if((H|0)==3){N=+uz(c[E+8>>2]|0,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}E=f|0;if((c[E>>2]|0)==3){uu(c[f+8>>2]|0);c[E>>2]=1}h[b+16>>3]=N;i=d;return}function hF(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0.0;d=i;if((c[a>>2]|0)==0){i=d;return}e=c[a+24>>2]|0;if((e|0)!=0){f=(e|0)>0?136888:134896;aI(f|0,6,1,b|0)}f=c[a+4>>2]|0;if((f|0)==0){aI(133384,6,1,b|0);i=d;return}if((f|0)<5){e=c[43320+(f<<3)>>2]|0;aK(e|0,b|0);i=d;return}if((f|0)<9){e=c[43320+(f-4<<3)>>2]|0;g=+h[a+8>>3];cf(b|0,131984,(v=i,i=i+16|0,c[v>>2]=e,h[v+8>>3]=g,v)|0);i=d;return}if((f|0)!=9){i=d;return}g=+h[a+16>>3];cf(b|0,130704,(v=i,i=i+16|0,h[v>>3]=+h[a+8>>3],h[v+8>>3]=g,v)|0);i=d;return}function hG(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=i;i=i+56|0;e=d|0;f=e+40|0;g=f;h=b+16|0;c[g>>2]=c[h>>2];c[g+4>>2]=c[h+4>>2];c[g+8>>2]=c[h+8>>2];c[g+12>>2]=c[h+12>>2];h=f|0;g=c[h>>2]|0;if((g|0)==1){b=e+44|0;j=c[b>>2]|0;if((j|0)==-3){k=0;i=d;return k|0}l=c[8798]|0;m=(l|0)>0;n=j;L2142:while(1){o=n+1|0;j=43264;while(1){p=c[j>>2]|0;if((p|0)==0){break}if((c[p+4>>2]|0)==(o|0)){q=1535;break L2142}else{j=p|0}}if(!((o|0)>(l|0)&m)){q=1541;break}n=(n|0)%(l|0)&-1}do{if((q|0)==1535){l=e;m=p+8|0;c[l>>2]=c[m>>2];c[l+4>>2]=c[m+4>>2];c[l+8>>2]=c[m+8>>2];c[l+12>>2]=c[m+12>>2];c[l+16>>2]=c[m+16>>2];c[l+20>>2]=c[m+20>>2];c[l+24>>2]=c[m+24>>2];c[l+28>>2]=c[m+28>>2];c[l+32>>2]=c[m+32>>2];c[l+36>>2]=c[m+36>>2];c[l+40>>2]=c[m+40>>2];c[l+44>>2]=c[m+44>>2];c[l+48>>2]=c[m+48>>2];c[l+52>>2]=c[m+52>>2];if((c[(c[3524]|0)+96>>2]&1024|0)!=0){c[e+4>>2]=o;a[e+32|0]=0;break}if((a[e+32|0]&1)!=0){break}c[e+40>>2]=1;c[b>>2]=c[e+4>>2]}else if((q|0)==1541){c[e+4>>2]=n;c[e+40>>2]=1;c[b>>2]=n;c[e+8>>2]=n}}while(0);r=c[h>>2]|0}else{r=g}if((r|0)==0){k=1;i=d;return k|0}fn(f,c[3524]|0);k=1;i=d;return k|0} -function hH(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0.0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0,aA=0,aB=0,aC=0,aD=0,aE=0,aF=0,aG=0,aH=0,aI=0,aJ=0,aK=0,aL=0,aM=0,aN=0,aO=0,aP=0,aQ=0,aR=0.0,aS=0,aT=0,aU=0,aV=0,aW=0,aX=0,aY=0,aZ=0,a_=0,a$=0,a0=0,a1=0,a2=0.0,a3=0,a4=0,a5=0,a6=0,a7=0,a8=0,a9=0,ba=0,bb=0,bc=0,bd=0,be=0,bf=0.0,bg=0,bh=0,bi=0,bj=0,bk=0,bl=0,bm=0,bn=0,bo=0.0,bp=0.0,bq=0.0,br=0,bs=0,bt=0,bu=0,bv=0,bw=0,bx=0,by=0.0,bz=0.0,bA=0,bB=0,bC=0,bD=0.0,bE=0.0,bF=0;f=i;i=i+272|0;g=f|0;j=f+24|0;k=f+48|0;l=f+72|0;m=f+96|0;n=f+120|0;o=f+144|0;p=f+168|0;q=f+192|0;r=f+216|0;s=r;t=b;c[s>>2]=c[t>>2];c[s+4>>2]=c[t+4>>2];c[s+8>>2]=c[t+8>>2];c[s+12>>2]=c[t+12>>2];c[s+16>>2]=c[t+16>>2];c[s+20>>2]=c[t+20>>2];c[s+24>>2]=c[t+24>>2];c[s+28>>2]=c[t+28>>2];c[s+32>>2]=c[t+32>>2];c[s+36>>2]=c[t+36>>2];c[s+40>>2]=c[t+40>>2];c[s+44>>2]=c[t+44>>2];c[s+48>>2]=c[t+48>>2];c[s+52>>2]=c[t+52>>2];L2163:do{if(d){s=c[13898]|0;u=c[1054]|0;w=c[u+(s*40&-1)+36>>2]|0;x=c[u+(s*40&-1)+32>>2]|0;y=(a[u+(s*40&-1)|0]&1)==0;L2165:do{if((w|0)>0&(y^1)){u=c[10036]|0;z=0;A=0;B=x;while(1){if((a[z+73824|0]|0)==(a[u+(z+B|0)|0]|0)){C=B;D=A}else{if((z|0)!=5){E=1558;break L2165}C=B-1|0;D=1}F=z+1|0;if((F|0)<(D+w|0)){z=F;A=D;B=C}else{break}}if((D|0)!=0){break}if(!((z|0)==4|(z|0)==9)){E=1558}}else{E=1558}}while(0);if((E|0)==1558){if((c[8272]|0)<=(s|0)|y){break}B=c[10036]|0;A=0;while(1){if((A|0)>=(w|0)){break}if((a[B+(x+A|0)|0]|0)==(a[A+72816|0]|0)){A=A+1|0}else{break L2163}}if((A|0)!=2){break}}c[13898]=s+1;x=is(p)|0;B=c[x>>2]|0;if((B|0)==3){G=+uz(c[x+8>>2]|0,0)}else if((B|0)==1){G=+(c[x+8>>2]|0)}else if((B|0)==2){G=+h[x+8>>3]}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}x=p|0;if((c[x>>2]|0)==3){uu(c[p+8>>2]|0);c[x>>2]=1}lK(b,~~G)}}while(0);p=c[13898]|0;D=c[8272]|0;L2193:do{if((p|0)<(D|0)){C=n|0;x=n+8|0;B=r+12|0;w=q|0;y=q+8|0;u=m|0;F=m+8|0;H=r+24|0;I=g|0;J=g+8|0;K=r+8|0;L=j|0;M=j+8|0;N=r+16|0;O=r+32|0;P=r+40|0;Q=r+44|0;R=l|0;S=l+8|0;T=r+48|0;U=k|0;V=k+8|0;W=r+4|0;X=r+40|0;Y=o|0;Z=o+8|0;_=b+4|0;$=d^1;aa=b|0;ab=b+40|0;ac=b+44|0;ad=b+8|0;ae=b+32|0;G=0.0;af=0;ag=0;ah=0;ai=0;aj=0;ak=0;al=0;am=p;an=D;L2195:while(1){ao=c[1054]|0;ap=(a[ao+(am*40&-1)|0]&1)==0;aq=c[ao+(am*40&-1)+36>>2]|0;ar=ao+(am*40&-1)+32|0;L2197:do{if(ap){as=c[ar>>2]|0;E=1587}else{at=c[10036]|0;au=0;while(1){if((au|0)>=(aq|0)){E=1578;break}if((a[at+((c[ar>>2]|0)+au|0)|0]|0)==(a[au+103664|0]|0)){au=au+1|0}else{break}}if((E|0)==1578){E=0;if((au|0)==1){av=al;aw=aj;ax=ai;ay=ah;az=ag;aA=af;aB=ak;aC=am;break L2193}}at=c[ar>>2]|0;if(!((aq|0)>0&(ap^1))){as=at;E=1587;break}aD=c[10036]|0;aE=0;aF=0;aG=at;while(1){if((a[aE+139232|0]|0)==(a[aD+(aE+aG|0)|0]|0)){aH=aG;aI=aF}else{if((aE|0)!=5){as=at;E=1587;break L2197}aH=aG-1|0;aI=1}aJ=aE+1|0;if((aJ|0)<(aI+aq|0)){aE=aJ;aF=aI;aG=aH}else{break}}if((aI|0)!=0){E=1592;break}if((aE|0)==4|(aE|0)==8){E=1592}else{as=at;E=1587}}}while(0);L2215:do{if((E|0)==1587){E=0;if((an|0)<=(am|0)|ap){aK=al;aL=ag;aM=af;break}ar=c[10036]|0;z=0;while(1){if((z|0)>=(aq|0)){break}if((a[ar+(as+z|0)|0]|0)==(a[z+225056|0]|0)){z=z+1|0}else{aK=al;aL=ag;aM=af;break L2215}}if((z|0)==2){E=1592}else{aK=al;aL=ag;aM=af}}}while(0);L2222:do{if((E|0)==1592){E=0;aq=af+1|0;if((af|0)!=0){av=al;aw=aj;ax=ai;ay=ah;az=ag;aA=aq;aB=ak;aC=am;break L2193}ap=am+1|0;c[13898]=ap;ar=c[ao+(ap*40&-1)+36>>2]|0;at=c[ao+(ap*40&-1)+32>>2]|0;aE=(a[ao+(ap*40&-1)|0]&1)==0;L2225:do{if((ar|0)>0&(aE^1)){aG=c[10036]|0;aF=0;aD=0;au=at;while(1){if((a[aF+123456|0]|0)==(a[aG+(aF+au|0)|0]|0)){aN=au;aO=aD}else{if((aF|0)!=3){break}aN=au-1|0;aO=1}aJ=aF+1|0;if((aJ|0)<(aO+ar|0)){aF=aJ;aD=aO;au=aN}else{E=1599;break}}do{if((E|0)==1599){E=0;if((aO|0)==0){if(!((aF|0)==2|(aF|0)==8)){break}}au=ag+1|0;if((ag|0)!=0){av=al;aw=aj;ax=ai;ay=ah;az=au;aA=aq;aB=ak;aC=ap;break L2193}c[13898]=am;hI(X,3);a[O]=1;aK=al;aL=au;aM=aq;break L2222}}while(0);if(!((ar|0)>0&(aE^1))){break}aF=c[10036]|0;au=0;aD=0;aG=at;while(1){if((a[au+205488|0]|0)==(a[aF+(au+aG|0)|0]|0)){aP=aG;aQ=aD}else{if((au|0)!=3){break L2225}aP=aG-1|0;aQ=1}aJ=au+1|0;if((aJ|0)<(aQ+ar|0)){au=aJ;aD=aQ;aG=aP}else{break}}if((aQ|0)==0){if(!((au|0)==2|(au|0)==7)){break}}aG=ag+1|0;if((ag|0)!=0){av=al;aw=aj;ax=ai;ay=ah;az=aG;aA=aq;aB=ak;aC=ap;break L2193}c[13898]=am;hI(X,6);a[O]=1;aK=al;aL=aG;aM=aq;break L2222}}while(0);L2253:do{if(!((an|0)<=(ap|0)|aE)){z=c[10036]|0;aG=0;while(1){if((aG|0)>=(ar|0)){break}if((a[z+(at+aG|0)|0]|0)==(a[aG+120376|0]|0)){aG=aG+1|0}else{break L2253}}if((aG|0)!=4){break}c[t>>2]=c[14158];c[t+4>>2]=c[14159];c[t+8>>2]=c[14160];c[t+12>>2]=c[14161];c[t+16>>2]=c[14162];c[t+20>>2]=c[14163];c[t+24>>2]=c[14164];c[t+28>>2]=c[14165];c[t+32>>2]=c[14166];c[t+36>>2]=c[14167];c[t+40>>2]=c[14168];c[t+44>>2]=c[14169];c[t+48>>2]=c[14170];c[t+52>>2]=c[14171];c[13898]=(c[13898]|0)+1;aK=al;aL=ag;aM=aq;break L2222}}while(0);at=is(o)|0;ar=c[at>>2]|0;if((ar|0)==1){aR=+(c[at+8>>2]|0)}else if((ar|0)==2){aR=+h[at+8>>3]}else if((ar|0)==3){aR=+uz(c[at+8>>2]|0,0)}else{E=1623;break L2195}if((c[Y>>2]|0)==3){uu(c[Z>>2]|0);c[Y>>2]=1}at=~~aR;c[_>>2]=at-1;if(!((a[30080]&1)==0|$)){lK(b,at);aK=at;aL=ag;aM=aq;break}ar=c[aa>>2]|0;aE=c[8798]|0;ap=(aE|0)>0;z=at;L2272:while(1){au=43264;while(1){aS=c[au>>2]|0;if((aS|0)==0){break}if((c[aS+4>>2]|0)==(z|0)){break L2272}else{au=aS|0}}aT=z-1|0;if(!((z|0)>(aE|0)&ap)){E=1638;break}z=((aT|0)%(aE|0)&-1)+1|0}if((E|0)==1638){E=0;c[_>>2]=aT;c[ab>>2]=1;c[ac>>2]=aT;c[ad>>2]=aT;aK=at;aL=ag;aM=aq;break}aE=aS+8|0;c[t>>2]=c[aE>>2];c[t+4>>2]=c[aE+4>>2];c[t+8>>2]=c[aE+8>>2];c[t+12>>2]=c[aE+12>>2];c[t+16>>2]=c[aE+16>>2];c[t+20>>2]=c[aE+20>>2];c[t+24>>2]=c[aE+24>>2];c[t+28>>2]=c[aE+28>>2];c[t+32>>2]=c[aE+32>>2];c[t+36>>2]=c[aE+36>>2];c[t+40>>2]=c[aE+40>>2];c[t+44>>2]=c[aE+44>>2];c[t+48>>2]=c[aE+48>>2];c[t+52>>2]=c[aE+52>>2];c[aa>>2]=ar;if((c[(c[3524]|0)+96>>2]&1024|0)!=0){c[_>>2]=z;a[ae]=0;aK=at;aL=ag;aM=aq;break}if((a[ae]&1)!=0){aK=at;aL=ag;aM=aq;break}c[ab>>2]=1;c[ac>>2]=c[_>>2];aK=at;aL=ag;aM=aq}}while(0);ao=c[13898]|0;aE=c[1054]|0;ap=c[aE+(ao*40&-1)+36>>2]|0;au=c[aE+(ao*40&-1)+32>>2]|0;aG=(a[aE+(ao*40&-1)|0]&1)==0;L2287:do{if((ap|0)>0&(aG^1)){aD=c[10036]|0;aF=0;aJ=0;aU=au;while(1){if((a[aF+205488|0]|0)==(a[aD+(aF+aU|0)|0]|0)){aV=aU;aW=aJ}else{if((aF|0)!=3){E=1650;break L2287}aV=aU-1|0;aW=1}aX=aF+1|0;if((aX|0)<(aW+ap|0)){aF=aX;aJ=aW;aU=aV}else{break}}if((aW|0)==0){if(!((aF|0)==2|(aF|0)==7)){E=1650;break}}aU=aL+1|0;if((aL|0)!=0){av=aK;aw=aj;ax=ai;ay=ah;az=aU;aA=aM;aB=ak;aC=ao;break L2193}c[13898]=ao-1;hI(X,6);a[O]=1;aY=ak;aZ=aj;a_=ai;a$=ah;a0=aU;a1=aM;a2=G}else{E=1650}}while(0);L2300:do{if((E|0)==1650){E=0;aU=c[8272]|0;aJ=(aU|0)>(ao|0);L2302:do{if(aJ){if(aG){av=aK;aw=aj;ax=ai;ay=ah;az=aL;aA=aM;aB=ak;aC=ao;break L2193}aD=c[10036]|0;aq=0;while(1){if((aq|0)>=(ap|0)){break}if((a[aD+(au+aq|0)|0]|0)==(a[aq+119088|0]|0)){aq=aq+1|0}else{E=1656;break L2302}}if((aq|0)!=2){E=1656}}else{E=1656}}while(0);L2309:do{if((E|0)==1656){E=0;L2311:do{if((ap|0)>0&(aG^1)){aF=c[10036]|0;aD=0;at=0;z=au;while(1){if((a[aD+116144|0]|0)==(a[aF+(aD+z|0)|0]|0)){a3=z;a4=at}else{if((aD|0)!=5){break L2311}a3=z-1|0;a4=1}ar=aD+1|0;if((ar|0)<(a4+ap|0)){aD=ar;at=a4;z=a3}else{break}}if((a4|0)!=0){break L2309}if((aD|0)==4|(aD|0)==9){break L2309}}}while(0);L2322:do{if(aJ){if(aG){E=1746;break}aq=c[10036]|0;z=0;while(1){if((z|0)>=(ap|0)){break}if((a[aq+(au+z|0)|0]|0)==(a[z+179168|0]|0)){z=z+1|0}else{E=1670;break L2322}}if((z|0)==2){break L2309}else{E=1670}}else{E=1670}}while(0);L2329:do{if((E|0)==1670){E=0;if(!((ap|0)>0&(aG^1))){E=1746;break}aq=c[10036]|0;aD=0;at=0;aF=au;while(1){if((a[aD+178592|0]|0)==(a[aq+(aD+aF|0)|0]|0)){a5=aF;a6=at}else{if((aD|0)!=5){break}a5=aF-1|0;a6=1}ar=aD+1|0;if((ar|0)<(a6+ap|0)){aD=ar;at=a6;aF=a5}else{E=1676;break}}if((E|0)==1676){E=0;if((a6|0)!=0){break L2309}if((aD|0)==4|(aD|0)==9){break L2309}}if(!((ap|0)>0&(aG^1))){E=1746;break}aF=c[10036]|0;at=0;aq=0;z=au;while(1){if((a[at+128400|0]|0)==(a[aF+(at+z|0)|0]|0)){a7=z;a8=aq}else{if((at|0)!=5){E=1746;break L2329}a7=z-1|0;a8=1}ar=at+1|0;if((ar|0)<(a8+ap|0)){at=ar;aq=a8;z=a7}else{break}}if((a8|0)!=0){break}if(!((at|0)==4|(at|0)==9)){E=1746}}}while(0);L2351:do{if((E|0)==1746){E=0;L2353:do{if(aJ){if(aG){av=aK;aw=aj;ax=ai;ay=ah;az=aL;aA=aM;aB=ak;aC=ao;break L2193}z=c[10036]|0;aq=0;while(1){if((aq|0)>=(ap|0)){E=1751;break}if((a[z+(au+aq|0)|0]|0)==(a[aq+128296|0]|0)){aq=aq+1|0}else{break}}if((E|0)==1751){E=0;if((aq|0)==2){break L2351}}if(!aJ){break}if(aG){av=aK;aw=aj;ax=ai;ay=ah;az=aL;aA=aM;aB=ak;aC=ao;break L2193}z=c[10036]|0;aF=0;while(1){if((aF|0)>=(ap|0)){break}if((a[z+(au+aF|0)|0]|0)==(a[aF+120376|0]|0)){aF=aF+1|0}else{break L2353}}if((aF|0)!=4){break}z=aM+1|0;if((aM|0)!=0){av=aK;aw=aj;ax=ai;ay=ah;az=aL;aA=z;aB=ak;aC=ao;break L2193}c[13898]=ao+1;c[t>>2]=c[14158];c[t+4>>2]=c[14159];c[t+8>>2]=c[14160];c[t+12>>2]=c[14161];c[t+16>>2]=c[14162];c[t+20>>2]=c[14163];c[t+24>>2]=c[14164];c[t+28>>2]=c[14165];c[t+32>>2]=c[14166];c[t+36>>2]=c[14167];c[t+40>>2]=c[14168];c[t+44>>2]=c[14169];c[t+48>>2]=c[14170];c[t+52>>2]=c[14171];aY=ak;aZ=aj;a_=ai;a$=ah;a0=aL;a1=z;a2=G;break L2300}}while(0);L2371:do{if((ap|0)>0&(aG^1)){at=c[10036]|0;z=0;aq=0;aD=au;while(1){if((a[z+139064|0]|0)==(a[at+(z+aD|0)|0]|0)){a9=aD;ba=aq}else{if((z|0)!=6){E=1778;break L2371}a9=aD-1|0;ba=1}ar=z+1|0;if((ar|0)<(ba+ap|0)){z=ar;aq=ba;aD=a9}else{break}}if((ba|0)!=0){break}if(!((z|0)==5|(z|0)==9)){E=1778}}else{E=1778}}while(0);L2381:do{if((E|0)==1778){E=0;L2383:do{if(aJ){if(aG){av=aK;aw=aj;ax=ai;ay=ah;az=aL;aA=aM;aB=ak;aC=ao;break L2193}aD=c[10036]|0;aq=0;while(1){if((aq|0)>=(ap|0)){break}if((a[aD+(au+aq|0)|0]|0)==(a[aq+205624|0]|0)){aq=aq+1|0}else{break L2383}}if((aq|0)==2){break L2381}}}while(0);L2391:do{if((ap|0)>0&(aG^1)){z=c[10036]|0;aD=0;at=0;aF=au;while(1){if((a[aD+103928|0]|0)==(a[z+(aD+aF|0)|0]|0)){bb=aF;bc=at}else{if((aD|0)!=6){E=1803;break L2391}bb=aF-1|0;bc=1}ar=aD+1|0;if((ar|0)<(bc+ap|0)){aD=ar;at=bc;aF=bb}else{break}}if((bc|0)!=0){break}if(!((aD|0)==5|(aD|0)==9)){E=1803}}else{E=1803}}while(0);L2401:do{if((E|0)==1803){E=0;L2403:do{if(aJ){if(aG){E=1847;break}aF=c[10036]|0;at=0;while(1){if((at|0)>=(ap|0)){break}if((a[aF+(au+at|0)|0]|0)==(a[at+103560|0]|0)){at=at+1|0}else{E=1839;break L2403}}if((at|0)==2){break L2401}else{E=1839}}else{E=1839}}while(0);L2410:do{if((E|0)==1839){E=0;if(!((ap|0)>0&(aG^1))){E=1847;break}aD=c[10036]|0;aF=0;z=0;aq=au;while(1){if((a[aF+100112|0]|0)==(a[aD+(aF+aq|0)|0]|0)){bd=aq;be=z}else{if((aF|0)!=6){E=1847;break L2410}bd=aq-1|0;be=1}ar=aF+1|0;if((ar|0)<(be+ap|0)){aF=ar;z=be;aq=bd}else{break}}if((be|0)!=0){break}if(!((aF|0)==5|(aF|0)==13)){E=1847}}}while(0);if((E|0)==1847){E=0;if(!aJ){av=aK;aw=aj;ax=ai;ay=ah;az=aL;aA=aM;aB=ak;aC=ao;break L2193}if(aG){av=aK;aw=aj;ax=ai;ay=ah;az=aL;aA=aM;aB=ak;aC=ao;break L2193}aq=c[10036]|0;z=0;while(1){if((z|0)>=(ap|0)){break}if((a[aq+(au+z|0)|0]|0)==(a[z+99680|0]|0)){z=z+1|0}else{av=aK;aw=aj;ax=ai;ay=ah;az=aL;aA=aM;aB=ak;aC=ao;break L2193}}if((z|0)!=2){av=aK;aw=aj;ax=ai;ay=ah;az=aL;aA=aM;aB=ak;aC=ao;break L2193}}aq=ao+1|0;c[13898]=aq;if(!e){uh(aq,99224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);aq=is(q)|0;aD=c[aq>>2]|0;if((aD|0)==3){at=c[aq+8>>2]|0;uz(at,0)}else if(!((aD|0)==1|(aD|0)==2)){E=1864;break L2195}if((c[w>>2]|0)!=3){aY=ak;aZ=aj;a_=ai;a$=ah;a0=aL;a1=aM;a2=G;break L2300}uu(c[y>>2]|0);c[w>>2]=1;aY=ak;aZ=aj;a_=ai;a$=ah;a0=aL;a1=aM;a2=G;break L2300}aD=is(n)|0;at=c[aD>>2]|0;if((at|0)==2){bf=+h[aD+8>>3]}else if((at|0)==3){bf=+uz(c[aD+8>>2]|0,0)}else if((at|0)==1){bf=+(c[aD+8>>2]|0)}else{E=1858;break L2195}if((c[C>>2]|0)==3){uu(c[x>>2]|0);c[C>>2]=1}c[B>>2]=~~bf;aY=1;aZ=aj;a_=ai;a$=ah;a0=aL;a1=aM;a2=G;break L2300}}while(0);if(!e){uh(ao,100856,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);c[13898]=(c[13898]|0)+2;aY=ak;aZ=aj;a_=ai;a$=ah;a0=aL;a1=aM;a2=G;break L2300}aD=aj+1|0;if((aj|0)!=0){av=aK;aw=aD;ax=ai;ay=ah;az=aL;aA=aM;aB=ak;aC=ao;break L2193}at=ao+1|0;c[13898]=at;aq=c[aE+(at*40&-1)+36>>2]|0;ar=c[aE+(at*40&-1)+32>>2]|0;aX=(a[aE+(at*40&-1)|0]&1)==0;L2450:do{if((aq|0)>0&(aX^1)){at=c[10036]|0;bg=0;bh=0;bi=ar;while(1){if((a[bg+111056|0]|0)==(a[at+(bg+bi|0)|0]|0)){bj=bi;bk=bh}else{if((bg|0)!=3){break}bj=bi-1|0;bk=1}bl=bg+1|0;if((bl|0)<(bk+aq|0)){bg=bl;bh=bk;bi=bj}else{E=1817;break}}do{if((E|0)==1817){E=0;if((bk|0)==0){if(!((bg|0)==2|(bg|0)==8)){break}}h[H>>3]=-3.0;c[13898]=ao+2;aY=ak;aZ=aD;a_=ai;a$=ah;a0=aL;a1=aM;a2=G;break L2300}}while(0);if(!((aq|0)>0&(aX^1))){break}bg=c[10036]|0;bi=0;bh=0;at=ar;while(1){if((a[bi+184456|0]|0)==(a[bg+(bi+at|0)|0]|0)){bm=at;bn=bh}else{if((bi|0)!=3){break L2450}bm=at-1|0;bn=1}z=bi+1|0;if((z|0)<(bn+aq|0)){bi=z;bh=bn;at=bm}else{break}}if((bn|0)==0){if(!((bi|0)==2|(bi|0)==7)){break}}h[H>>3]=-2.0;c[13898]=ao+2;aY=ak;aZ=aD;a_=ai;a$=ah;a0=aL;a1=aM;a2=G;break L2300}}while(0);aq=is(m)|0;ar=c[aq>>2]|0;if((ar|0)==1){bo=+(c[aq+8>>2]|0)}else if((ar|0)==2){bo=+h[aq+8>>3]}else if((ar|0)==3){bo=+uz(c[aq+8>>2]|0,0)}else{E=1833;break L2195}if((c[u>>2]|0)==3){uu(c[F>>2]|0);c[u>>2]=1}h[H>>3]=bo;if(bo>=0.0){aY=ak;aZ=aD;a_=ai;a$=ah;a0=aL;a1=aM;a2=G;break L2300}h[H>>3]=0.0;aY=ak;aZ=aD;a_=ai;a$=ah;a0=aL;a1=aM;a2=G;break L2300}}while(0);if(!e){uh(ao,104432,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);c[13898]=(c[13898]|0)+2;aY=ak;aZ=aj;a_=ai;a$=ah;a0=aL;a1=aM;a2=G;break L2300}aq=ai+1|0;if((ai|0)!=0){av=aK;aw=aj;ax=aq;ay=ah;az=aL;aA=aM;aB=ak;aC=ao;break L2193}c[13898]=ao+1;ar=is(g)|0;aX=c[ar>>2]|0;if((aX|0)==1){bp=+(c[ar+8>>2]|0)}else if((aX|0)==2){bp=+h[ar+8>>3]}else if((aX|0)==3){bp=+uz(c[ar+8>>2]|0,0)}else{E=1790;break L2195}if((c[I>>2]|0)==3){uu(c[J>>2]|0);c[I>>2]=1}c[K>>2]=~~bp-1;aY=ak;aZ=aj;a_=aq;a$=ah;a0=aL;a1=aM;a2=G;break L2300}}while(0);aq=ah+1|0;if((ah|0)!=0){av=aK;aw=aj;ax=ai;ay=aq;az=aL;aA=aM;aB=ak;aC=ao;break L2193}c[13898]=ao+1;ar=is(j)|0;aX=c[ar>>2]|0;if((aX|0)==1){bq=+(c[ar+8>>2]|0)}else if((aX|0)==2){bq=+h[ar+8>>3]}else if((aX|0)==3){bq=+uz(c[ar+8>>2]|0,0)}else{E=1757;break L2195}if((c[L>>2]|0)==3){uu(c[M>>2]|0);c[L>>2]=1}h[N>>3]=bq;if(bq>=0.0){aY=ak;aZ=aj;a_=ai;a$=aq;a0=aL;a1=aM;a2=G;break L2300}h[N>>3]=0.0;aY=ak;aZ=aj;a_=ai;a$=aq;a0=aL;a1=aM;a2=G;break L2300}}while(0);a[O]=1;aJ=aL+1|0;if((aL|0)!=0){av=aK;aw=aj;ax=ai;ay=ah;az=aJ;aA=aM;aB=ak;aC=ao;break L2193}aq=ao+1|0;c[13898]=aq;ar=c[aE+(aq*40&-1)+36>>2]|0;aX=c[aE+(aq*40&-1)+32>>2]|0;at=(a[aE+(aq*40&-1)|0]&1)==0;L2511:do{if((ar|0)>0&(at^1)){bh=c[10036]|0;bg=0;z=0;bl=aX;while(1){if((a[bg+123456|0]|0)==(a[bh+(bg+bl|0)|0]|0)){br=bl;bs=z}else{if((bg|0)!=3){break}br=bl-1|0;bs=1}bt=bg+1|0;if((bt|0)<(bs+ar|0)){bg=bt;z=bs;bl=br}else{E=1685;break}}do{if((E|0)==1685){E=0;if((bs|0)==0){if(!((bg|0)==8|(bg|0)==2)){break}}c[13898]=ao;hI(X,3);aY=ak;aZ=aj;a_=ai;a$=ah;a0=aJ;a1=aM;a2=G;break L2300}}while(0);if(!((ar|0)>0&(at^1))){break}bg=c[10036]|0;bl=0;z=0;bh=aX;while(1){if((a[bl+205488|0]|0)==(a[bg+(bl+bh|0)|0]|0)){bu=bh;bv=z}else{if((bl|0)!=3){break L2511}bu=bh-1|0;bv=1}bt=bl+1|0;if((bt|0)<(bv+ar|0)){bl=bt;z=bv;bh=bu}else{break}}if((bv|0)==0){if(!((bl|0)==7|(bl|0)==2)){break}}c[13898]=ao;hI(X,6);aY=ak;aZ=aj;a_=ai;a$=ah;a0=aJ;a1=aM;a2=G;break L2300}}while(0);L2537:do{if((aU|0)>(aq|0)){if(at){break}bh=c[10036]|0;z=0;while(1){if((z|0)>=(ar|0)){break}if((a[bh+(aX+z|0)|0]|0)==(a[z+120376|0]|0)){z=z+1|0}else{E=1704;break L2537}}if((z|0)!=4){E=1704;break}c[P>>2]=1;c[Q>>2]=-4;c[13898]=ao+2;aY=ak;aZ=aj;a_=ai;a$=ah;a0=aJ;a1=aM;a2=G;break L2300}else{E=1704}}while(0);L2545:do{if((E|0)==1704){E=0;if(!((ar|0)>0&(at^1))){break}aq=c[10036]|0;aU=0;bh=0;bl=aX;while(1){if((a[aU+111056|0]|0)==(a[aq+(aU+bl|0)|0]|0)){bw=bl;bx=bh}else{if((aU|0)!=3){break L2545}bw=bl-1|0;bx=1}bg=aU+1|0;if((bg|0)<(bx+ar|0)){aU=bg;bh=bx;bl=bw}else{break}}if((bx|0)==0){if(!((aU|0)==2|(aU|0)==8)){break}}c[13898]=ao+2;c[W>>2]=-6;c[P>>2]=2;aY=ak;aZ=aj;a_=ai;a$=ah;a0=aJ;a1=aM;a2=G;break L2300}}while(0);if(!d){c[P>>2]=1;ar=is(k)|0;aX=c[ar>>2]|0;if((aX|0)==1){by=+(c[ar+8>>2]|0)}else if((aX|0)==2){by=+h[ar+8>>3]}else if((aX|0)==3){by=+uz(c[ar+8>>2]|0,0)}else{E=1734;break L2195}if((c[U>>2]|0)==3){uu(c[V>>2]|0);c[U>>2]=1}c[Q>>2]=~~by-1;aY=ak;aZ=aj;a_=ai;a$=ah;a0=aJ;a1=aM;a2=G;break}ar=is(l)|0;aX=c[ar>>2]|0;if((aX|0)==1){bz=+(c[ar+8>>2]|0)}else if((aX|0)==2){bz=+h[ar+8>>3]}else if((aX|0)==3){bz=+uz(c[ar+8>>2]|0,0)}else{E=1718;break L2195}if((c[R>>2]|0)==3){uu(c[S>>2]|0);c[R>>2]=1}ar=c[8798]|0;aX=(ar|0)>0;at=~~bz;L2578:while(1){bl=43264;while(1){bA=c[bl>>2]|0;if((bA|0)==0){break}if((c[bA+4>>2]|0)==(at|0)){E=1725;break L2578}else{bl=bA|0}}bl=at-1|0;if(!((at|0)>(ar|0)&aX)){bB=1;bC=bl;bD=G;break}at=((bl|0)%(ar|0)&-1)+1|0}do{if((E|0)==1725){E=0;ar=c[bA+48>>2]|0;at=c[bA+52>>2]|0;bE=+h[bA+56>>3];if((c[(c[3524]|0)+96>>2]&1024|0)!=0){bB=ar;bC=at;bD=bE;break}aX=(a[bA+40|0]&1)==0;bB=aX?1:ar;bC=aX?c[bA+12>>2]|0:at;bD=bE}}while(0);c[P>>2]=bB;c[Q>>2]=bC;h[T>>3]=bD;aY=ak;aZ=aj;a_=ai;a$=ah;a0=aJ;a1=aM;a2=bD}}while(0);ao=c[13898]|0;aE=c[8272]|0;if((ao|0)<(aE|0)){G=a2;af=a1;ag=a0;ah=a$;ai=a_;aj=aZ;ak=aY;al=aK;am=ao;an=aE}else{av=aK;aw=aZ;ax=a_;ay=a$;az=a0;aA=a1;aB=aY;aC=ao;break L2193}}if((E|0)==1757){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((E|0)==1623){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((E|0)==1718){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((E|0)==1858){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((E|0)==1864){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((E|0)==1790){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((E|0)==1734){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((E|0)==1833){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}}else{av=0;aw=0;ax=0;ay=0;az=0;aA=0;aB=0;aC=p}}while(0);if((aA|0)>1|(az|0)>1|(ay|0)>1|(ax|0)>1|(aw|0)>1){uf(aC,98720,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}if((az|0)==0){bF=av}else{av=b+40|0;az=r+40|0;c[av>>2]=c[az>>2];c[av+4>>2]=c[az+4>>2];c[av+8>>2]=c[az+8>>2];c[av+12>>2]=c[az+12>>2];a[b+32|0]=a[r+32|0]&1;bF=-8}if((ay|0)!=0){h[b+16>>3]=+h[r+16>>3]}if((ax|0)!=0){c[b+8>>2]=c[r+8>>2]}if((aw|0)!=0){h[b+24>>3]=+h[r+24>>3]}if((aB|0)!=0){c[b+12>>2]=c[r+12>>2]}if((c[r+4>>2]|0)!=-6){i=f;return bF|0}c[b+4>>2]=-6;i=f;return bF|0}function hI(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0.0,T=0,U=0,V=0.0,W=0.0,X=0,Y=0;e=i;i=i+96|0;f=e|0;g=e+24|0;j=e+48|0;k=e+72|0;l=c[13898]|0;m=l+1|0;c[13898]=m;n=c[8272]|0;if((m|0)>=(n|0)){uf(m,92096,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}o=c[1054]|0;p=(a[o+(m*40&-1)|0]&1)==0;q=c[o+(m*40&-1)+36>>2]|0;r=o+(m*40&-1)+32|0;L2626:do{if(p){s=c[r>>2]|0}else{t=c[10036]|0;u=0;while(1){if((u|0)>=(q|0)){w=1890;break}if((a[t+((c[r>>2]|0)+u|0)|0]|0)==(a[u+103664|0]|0)){u=u+1|0}else{break}}do{if((w|0)==1890){if((u|0)!=1){break}uf(m,92096,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);u=c[r>>2]|0;if(p){s=u;break}if((q|0)>0){t=c[10036]|0;x=0;y=0;z=u;while(1){if((a[x+184456|0]|0)==(a[t+(x+z|0)|0]|0)){A=z;B=y}else{if((x|0)!=3){break}A=z-1|0;B=1}C=x+1|0;if((C|0)<(B+q|0)){x=C;y=B;z=A}else{w=1899;break}}do{if((w|0)==1899){if((B|0)==0){if(!((x|0)==7|(x|0)==2)){break}}c[13898]=l+2;c[b>>2]=0;i=e;return}}while(0);if(p){s=u;break}}x=c[10036]|0;z=0;while(1){if((z|0)>=(q|0)){w=1906;break}if((a[x+(u+z|0)|0]|0)==(a[z+120376|0]|0)){z=z+1|0}else{break}}do{if((w|0)==1906){if((z|0)!=4){break}c[13898]=l+2;c[b>>2]=1;c[b+4>>2]=-4;i=e;return}}while(0);if(p){s=u;break}z=c[10036]|0;x=0;while(1){if((x|0)>=(q|0)){break}if((a[z+(u+x|0)|0]|0)==(a[x+225056|0]|0)){x=x+1|0}else{s=u;break L2626}}if((x|0)!=2){s=u;break}y=l+2|0;c[13898]=y;if((y|0)>=(n|0)){uf(y,91408,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}L2669:do{if((a[o+(y*40&-1)|0]&1)!=0){t=c[o+(y*40&-1)+36>>2]|0;C=o+(y*40&-1)+32|0;D=0;while(1){if((D|0)>=(t|0)){break}if((a[z+((c[C>>2]|0)+D|0)|0]|0)==(a[D+103664|0]|0)){D=D+1|0}else{break L2669}}if((D|0)!=1){break}uf(y,91408,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);y=b|0;c[y>>2]=1;z=is(j)|0;u=c[z>>2]|0;if((u|0)==1){E=+(c[z+8>>2]|0)}else if((u|0)==2){E=+h[z+8>>3]}else if((u|0)==3){E=+uz(c[z+8>>2]|0,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}z=j|0;if((c[z>>2]|0)==3){uu(c[j+8>>2]|0);c[z>>2]=1}z=~~E-1|0;c[b+4>>2]=z;if((z|0)>=-4){i=e;return}c[y>>2]=0;uh(c[13898]|0,90768,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);i=e;return}}while(0);if((d|0)<2){c[b>>2]=0;uf(c[13898]|0,90352,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}L2695:do{if(!p){j=c[10036]|0;B=0;while(1){if((B|0)>=(q|0)){w=1935;break}if((a[j+(s+B|0)|0]|0)==(a[B+72816|0]|0)){B=B+1|0}else{w=1936;break}}if((w|0)==1935){if((B|0)!=2){w=1936}}do{if((w|0)==1936){if(!((q|0)>0&(p^1))){break L2695}j=c[10036]|0;A=0;r=0;y=s;while(1){if((a[A+73824|0]|0)==(a[j+(A+y|0)|0]|0)){F=y;G=r}else{if((A|0)!=5){break}F=y-1|0;G=1}z=A+1|0;if((z|0)<(G+q|0)){A=z;r=G;y=F}else{w=1942;break}}if((w|0)==1942){if((G|0)!=0){break}if((A|0)==4|(A|0)==9){break}}if(p){break L2695}L2716:do{if((q|0)>0){y=c[10036]|0;r=0;j=0;D=s;while(1){if((a[r+123456|0]|0)==(a[y+(r+D|0)|0]|0)){H=D;I=j}else{if((r|0)!=3){break L2716}H=D-1|0;I=1}z=r+1|0;if((z|0)<(I+q|0)){r=z;j=I;D=H}else{break}}if((I|0)==0){if(!((r|0)==8|(r|0)==2)){break}}c[13898]=l+2;c[b>>2]=3;D=c[13898]|0;j=c[1054]|0;y=c[j+(D*40&-1)+36>>2]|0;z=c[j+(D*40&-1)+32>>2]|0;L2728:do{if((a[j+(D*40&-1)|0]&1)==0){w=1970}else{if((y|0)<=0){J=b+8|0;break}u=c[10036]|0;x=0;C=0;t=z;while(1){if((a[x+111056|0]|0)==(a[u+(x+t|0)|0]|0)){K=t;L=C}else{if((x|0)!=3){w=1970;break L2728}K=t-1|0;L=1}M=x+1|0;if((M|0)<(L+y|0)){x=M;C=L;t=K}else{break}}if((L|0)!=0|(M|0)==3){N=b+8|0}else{t=b+8|0;if((M|0)==9){N=t}else{J=t;break}}h[N>>3]=-1.0;c[13898]=(c[13898]|0)+1;i=e;return}}while(0);if((w|0)==1970){J=b+8|0}h[J>>3]=0.0;c[b+4>>2]=hK()|0;i=e;return}}while(0);if(!((q|0)>0&(p^1))){break L2695}A=c[10036]|0;y=0;z=0;D=s;while(1){if((a[y+205488|0]|0)==(a[A+(y+D|0)|0]|0)){O=D;P=z}else{if((y|0)!=3){break L2695}O=D-1|0;P=1}j=y+1|0;if((j|0)<(P+q|0)){y=j;z=P;D=O}else{break}}if((P|0)==0){if(!((y|0)==2|(y|0)==7)){break L2695}}D=l+2|0;c[13898]=D;z=(n|0)>(D|0);L2761:do{if(z){if((a[o+(D*40&-1)|0]&1)!=0){A=c[o+(D*40&-1)+36>>2]|0;j=o+(D*40&-1)+32|0;r=c[10036]|0;t=0;while(1){if((t|0)>=(A|0)){w=1988;break}if((a[r+((c[j>>2]|0)+t|0)|0]|0)==(a[t+77416|0]|0)){t=t+1|0}else{break}}do{if((w|0)==1988){if((t|0)!=1){break}j=b|0;if((d|0)<=5){c[j>>2]=0;uf(c[13898]|0,89200,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[j>>2]=6;c[13898]=(c[13898]|0)+1;i=e;return}}while(0);if(!z){w=1993;break}}t=a[o+(D*40&-1)|0]|0;if((t&1)==0){Q=t;break}j=c[o+(D*40&-1)+36>>2]|0;r=o+(D*40&-1)+32|0;A=c[10036]|0;C=0;while(1){if((C|0)>=(j|0)){break}if((a[A+((c[r>>2]|0)+C|0)|0]|0)==(a[C+88416|0]|0)){C=C+1|0}else{Q=t;break L2761}}if((C|0)!=2){Q=t;break}c[b>>2]=4;r=(c[13898]|0)+1|0;c[13898]=r;if((r|0)>=(c[8272]|0)){uf(r,87312,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}A=c[1054]|0;L2786:do{if((a[A+(r*40&-1)|0]&1)!=0){j=c[A+(r*40&-1)+36>>2]|0;x=A+(r*40&-1)+32|0;u=c[10036]|0;R=0;while(1){if((R|0)>=(j|0)){break}if((a[u+((c[x>>2]|0)+R|0)|0]|0)==(a[R+103664|0]|0)){R=R+1|0}else{break L2786}}if((R|0)!=1){break}uf(r,87312,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);r=is(f)|0;A=c[r>>2]|0;if((A|0)==1){S=+(c[r+8>>2]|0)}else if((A|0)==2){S=+h[r+8>>3]}else if((A|0)==3){S=+uz(c[r+8>>2]|0,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}r=f|0;if((c[r>>2]|0)==3){uu(c[f+8>>2]|0);c[r>>2]=1}h[b+8>>3]=S;i=e;return}else{w=1993}}while(0);if((w|0)==1993){Q=a[o+(D*40&-1)|0]|0}z=c[o+(D*40&-1)+36>>2]|0;L2807:do{if((Q&1)!=0&(z|0)>0){y=c[10036]|0;r=0;A=0;t=c[o+(D*40&-1)+32>>2]|0;while(1){if((a[r+204616|0]|0)==(a[y+(r+t|0)|0]|0)){T=t;U=A}else{if((r|0)!=4){break L2807}T=t-1|0;U=1}C=r+1|0;if((C|0)<(U+z|0)){r=C;A=U;t=T}else{break}}if((U|0)==0){if(!((r|0)==3|(r|0)==8)){break}}c[b>>2]=5;t=(c[13898]|0)+1|0;c[13898]=t;if((t|0)>=(c[8272]|0)){uf(t,85200,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}A=c[1054]|0;L2822:do{if((a[A+(t*40&-1)|0]&1)!=0){y=c[A+(t*40&-1)+36>>2]|0;C=A+(t*40&-1)+32|0;x=c[10036]|0;u=0;while(1){if((u|0)>=(y|0)){break}if((a[x+((c[C>>2]|0)+u|0)|0]|0)==(a[u+103664|0]|0)){u=u+1|0}else{break L2822}}if((u|0)!=1){break}uf(t,85200,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);t=is(k)|0;A=c[t>>2]|0;if((A|0)==1){V=+(c[t+8>>2]|0)}else if((A|0)==2){V=+h[t+8>>3]}else if((A|0)==3){V=+uz(c[t+8>>2]|0,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}t=k|0;if((c[t>>2]|0)==3){uu(c[k+8>>2]|0);c[t>>2]=1}h[b+8>>3]=V;if(V<0.0|V>1.0){uf(c[13898]|0,84296,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{i=e;return}}}while(0);if((d|0)<=5){i=e;return}c[b>>2]=6;i=e;return}}while(0);c[13898]=l+2;c[b>>2]=2;B=is(g)|0;z=c[B>>2]|0;if((z|0)==1){W=+(c[B+8>>2]|0)}else if((z|0)==2){W=+h[B+8>>3]}else if((z|0)==3){W=+uz(c[B+8>>2]|0,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}B=g|0;if((c[B>>2]|0)==3){uu(c[g+8>>2]|0);c[B>>2]=1}c[b+4>>2]=~~W;i=e;return}}while(0);if(!((q|0)>0&(((d|0)<7|p)^1))){uf(m,83704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}p=c[10036]|0;d=0;g=0;l=s;while(1){if((a[d+111056|0]|0)==(a[p+(d+l|0)|0]|0)){X=l;Y=g}else{if((d|0)!=3){w=2058;break}X=l-1|0;Y=1}s=d+1|0;if((s|0)<(Y+q|0)){d=s;g=Y;l=X}else{break}}if((w|0)==2058){uf(m,83704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}do{if((Y|0)==0){if((d|0)==2|(d|0)==8){break}uf(m,83704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);c[b>>2]=7;c[13898]=(c[13898]|0)+1;i=e;return}function hJ(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0.0,as=0,at=0,au=0,av=0.0,aw=0.0;j=i;i=i+72|0;k=g;g=i;i=i+16|0;c[g>>2]=c[k>>2];c[g+4>>2]=c[k+4>>2];c[g+8>>2]=c[k+8>>2];c[g+12>>2]=c[k+12>>2];k=j|0;l=j+24|0;m=j+48|0;n=b|0;c[n>>2]=d;d=b+4|0;c[d>>2]=e;e=b+8|0;c[e>>2]=f;f=b+16|0;o=f;p=g;c[o>>2]=c[p>>2];c[o+4>>2]=c[p+4>>2];c[o+8>>2]=c[p+8>>2];c[o+12>>2]=c[p+12>>2];p=c[13898]|0;o=c[8272]|0;if((p|0)>=(o|0)){i=j;return}g=c[1054]|0;q=(a[g+(p*40&-1)|0]&1)==0;if(q){i=j;return}r=c[g+(p*40&-1)+36>>2]|0;s=g+(p*40&-1)+32|0;t=c[10036]|0;u=0;while(1){if((u|0)>=(r|0)){w=2080;break}if((a[t+((c[s>>2]|0)+u|0)|0]|0)==(a[u+103664|0]|0)){u=u+1|0}else{w=2081;break}}do{if((w|0)==2080){if(!((u|0)==1|q)){break}i=j;return}else if((w|0)==2081){if(!q){break}i=j;return}}while(0);u=c[g+(p*40&-1)+36>>2]|0;s=g+(p*40&-1)+32|0;t=c[10036]|0;r=0;while(1){if((r|0)>=(u|0)){w=2085;break}if((a[t+((c[s>>2]|0)+r|0)|0]|0)==(a[r+116360|0]|0)){r=r+1|0}else{w=2086;break}}if((w|0)==2085){if((r|0)!=2){w=2086}}do{if((w|0)==2086){r=c[g+(p*40&-1)+36>>2]|0;if(!((r|0)>0&(q^1))){i=j;return}s=c[10036]|0;t=0;u=0;x=c[g+(p*40&-1)+32>>2]|0;while(1){if((a[t+121984|0]|0)==(a[s+(t+x|0)|0]|0)){y=x;z=u}else{if((t|0)!=4){w=2253;break}y=x-1|0;z=1}A=t+1|0;if((A|0)<(z+r|0)){t=A;u=z;x=y}else{break}}if((w|0)==2253){i=j;return}if((z|0)!=0){break}if((t|0)==3|(t|0)==9){break}i=j;return}}while(0);z=p+1|0;c[13898]=z;if((z|0)>=(o|0)){i=j;return}o=l|0;p=l+8|0;y=m|0;q=m+8|0;x=f|0;u=b+20|0;b=k|0;r=k+8|0;s=0;A=0;B=0;C=z;z=g;L2917:while(1){g=a[z+(C*40&-1)|0]|0;D=(g&1)==0;E=c[z+(C*40&-1)+36>>2]|0;F=z+(C*40&-1)+32|0;L2919:do{if(D){G=B;H=C;I=E;J=c[F>>2]|0;K=g}else{L=c[10036]|0;M=0;while(1){if((M|0)>=(E|0)){w=2101;break}if((a[L+((c[F>>2]|0)+M|0)|0]|0)==(a[M+103664|0]|0)){M=M+1|0}else{break}}if((w|0)==2101){w=0;if((M|0)==1){w=2256;break L2917}}L=c[F>>2]|0;if(!((E|0)>0&(D^1))){G=B;H=C;I=E;J=L;K=g;break}N=c[10036]|0;O=0;P=0;Q=L;while(1){if((a[O+96808|0]|0)==(a[N+(O+Q|0)|0]|0)){R=Q;S=P}else{if((O|0)!=5){G=B;H=C;I=E;J=L;K=g;break L2919}R=Q-1|0;S=1}T=O+1|0;if((T|0)<(S+E|0)){O=T;P=S;Q=R}else{break}}if((S|0)==0){if(!((O|0)==4|(O|0)==11)){G=B;H=C;I=E;J=L;K=g;break}}Q=C+1|0;c[13898]=Q;G=1;H=Q;I=c[z+(Q*40&-1)+36>>2]|0;J=c[z+(Q*40&-1)+32>>2]|0;K=a[z+(Q*40&-1)|0]|0}}while(0);g=(K&1)==0;L2940:do{if((I|0)>0&(g^1)){E=c[10036]|0;D=0;F=0;t=J;while(1){if((a[D+96336|0]|0)==(a[E+(D+t|0)|0]|0)){U=t;V=F}else{if((D|0)!=1){break}U=t-1|0;V=1}Q=D+1|0;if((Q|0)<(V+I|0)){D=Q;F=V;t=U}else{w=2117;break}}do{if((w|0)==2117){w=0;if((V|0)==0){if(!((D|0)==0|(D|0)==5)){break}}c[n>>2]=0;t=(c[13898]|0)+1|0;c[13898]=t;W=s;X=t;break L2940}}while(0);if(g){W=s;X=H;break}L2955:do{if((I|0)>0){D=c[10036]|0;t=0;F=0;E=J;while(1){if((a[t+115496|0]|0)==(a[D+(t+E|0)|0]|0)){Y=E;Z=F}else{if((t|0)!=1){break L2955}Y=E-1|0;Z=1}L=t+1|0;if((L|0)<(Z+I|0)){t=L;F=Z;E=Y}else{break}}if((Z|0)==0){if(!((t|0)==0|(t|0)==5)){break}}c[n>>2]=G?4:1;E=(c[13898]|0)+1|0;c[13898]=E;W=1;X=E;break L2940}}while(0);if(!((I|0)>0&(g^1))){W=s;X=H;break}E=c[10036]|0;F=0;D=0;L=J;while(1){if((a[F+95432|0]|0)==(a[E+(F+L|0)|0]|0)){_=L;$=D}else{if((F|0)!=1){W=s;X=H;break L2940}_=L-1|0;$=1}O=F+1|0;if((O|0)<($+I|0)){F=O;D=$;L=_}else{break}}if(($|0)==0){if(!((F|0)==0|(F|0)==7)){W=s;X=H;break}}c[n>>2]=G?5:2;L=(c[13898]|0)+1|0;c[13898]=L;W=1;X=L}else{W=s;X=H}}while(0);L2980:do{if((X|0)<(c[8272]|0)){g=c[1054]|0;L=(a[g+(X*40&-1)|0]&1)==0;D=c[g+(X*40&-1)+36>>2]|0;E=g+(X*40&-1)+32|0;L2982:do{if(L){aa=c[E>>2]|0}else{g=c[10036]|0;O=0;while(1){if((O|0)>=(D|0)){w=2145;break}if((a[g+((c[E>>2]|0)+O|0)|0]|0)==(a[O+103664|0]|0)){O=O+1|0}else{break}}if((w|0)==2145){w=0;if((O|0)==1){ab=A;break L2980}}g=c[E>>2]|0;if(!((D|0)>0&(L^1))){aa=g;break}t=c[10036]|0;Q=0;P=0;N=g;while(1){if((a[Q+141136|0]|0)==(a[t+(Q+N|0)|0]|0)){ac=N;ad=P}else{if((Q|0)!=2){break}ac=N-1|0;ad=1}M=Q+1|0;if((M|0)<(ad+D|0)){Q=M;P=ad;N=ac}else{w=2152;break}}do{if((w|0)==2152){w=0;if((ad|0)==0){if(!((Q|0)==1|(Q|0)==6)){break}}c[x>>2]=0;N=c[13898]|0;P=N+1|0;c[13898]=P;t=c[8272]|0;O=(t|0)>(P|0);M=c[1054]|0;T=a[M+(P*40&-1)|0]|0;L3003:do{if(O){if((T&1)==0){w=2160;break}ae=c[M+(P*40&-1)+36>>2]|0;af=M+(P*40&-1)+32|0;ag=c[10036]|0;ah=0;while(1){if((ah|0)>=(ae|0)){break}if((a[ag+((c[af>>2]|0)+ah|0)|0]|0)==(a[ah+202112|0]|0)){ah=ah+1|0}else{w=2160;break L3003}}if((ah|0)!=1){w=2160}}else{w=2160}}while(0);do{if((w|0)==2160){w=0;if((T&1)==0){break}af=c[M+(P*40&-1)+36>>2]|0;ag=M+(P*40&-1)+32|0;L3013:do{if((t|0)>(P|0)){ae=c[10036]|0;ai=0;while(1){if((ai|0)>=(af|0)){break}if((a[ae+((c[ag>>2]|0)+ai|0)|0]|0)==(a[ai+119088|0]|0)){ai=ai+1|0}else{w=2174;break L3013}}if((ai|0)!=2){w=2174}}else{w=2174}}while(0);L3019:do{if((w|0)==2174){w=0;ah=c[ag>>2]|0;L3021:do{if((af|0)>0){ae=c[10036]|0;aj=0;ak=0;al=ah;while(1){if((a[aj+116144|0]|0)==(a[ae+(aj+al|0)|0]|0)){am=al;an=ak}else{if((aj|0)!=5){break L3021}am=al-1|0;an=1}ao=aj+1|0;if((ao|0)<(an+af|0)){aj=ao;ak=an;al=am}else{break}}if((an|0)!=0){break L3019}if((aj|0)==4|(aj|0)==9){break L3019}}}while(0);L3032:do{if(O){ai=c[10036]|0;al=0;while(1){if((al|0)>=(af|0)){w=2187;break}if((a[ai+(ah+al|0)|0]|0)==(a[al+93664|0]|0)){al=al+1|0}else{break}}if((w|0)==2187){w=0;if((al|0)==3){break}}if(!O){w=2193;break}ai=c[10036]|0;aj=0;while(1){if((aj|0)>=(af|0)){break}if((a[ai+(ah+aj|0)|0]|0)==(a[aj+225056|0]|0)){aj=aj+1|0}else{w=2193;break L3032}}if((aj|0)!=2){w=2193}}else{w=2193}}while(0);do{if((w|0)==2193){w=0;if((af|0)<=0){ab=A;break L2980}ai=c[10036]|0;al=0;ak=0;ae=ah;while(1){if((a[al+139232|0]|0)==(a[ai+(al+ae|0)|0]|0)){ap=ae;aq=ak}else{if((al|0)!=5){ab=A;break L2980}ap=ae-1|0;aq=1}ao=al+1|0;if((ao|0)<(aq+af|0)){al=ao;ak=aq;ae=ap}else{break}}if((aq|0)!=0){break}if(!((al|0)==4|(al|0)==8)){ab=A;break L2980}}}while(0);c[13898]=N;hI(f,6);ab=A;break L2980}}while(0);hI(f,6);ab=A;break L2980}}while(0);c[x>>2]=1;N=is(k)|0;O=c[N>>2]|0;if((O|0)==1){ar=+(c[N+8>>2]|0)}else if((O|0)==2){ar=+h[N+8>>3]}else if((O|0)==3){ar=+uz(c[N+8>>2]|0,0)}else{w=2165;break L2917}if((c[b>>2]|0)==3){uu(c[r>>2]|0);c[b>>2]=1}c[u>>2]=~~ar-1;ab=A;break L2980}}while(0);if(!((D|0)>0&(L^1))){aa=g;break}Q=c[10036]|0;N=0;O=0;P=g;while(1){if((a[N+140856|0]|0)==(a[Q+(N+P|0)|0]|0)){as=P;at=O}else{if((N|0)!=4){aa=g;break L2982}as=P-1|0;at=1}t=N+1|0;if((t|0)<(at+D|0)){N=t;O=at;P=as}else{break}}if((at|0)==0){if(!((N|0)==3|(N|0)==8)){aa=g;break}}c[x>>2]=1;c[u>>2]=-3;c[13898]=(c[13898]|0)+1;ab=A;break L2980}}while(0);if(A|W^1){w=2258;break L2917}L3081:do{if(!L){E=c[10810]|0;if((E|0)==0){w=2259;break L2917}F=c[10036]|0;P=E;while(1){O=c[P+4>>2]|0;Q=0;while(1){if((Q|0)>=(D|0)){w=2220;break}if((a[F+(aa+Q|0)|0]|0)==(a[O+Q|0]|0)){Q=Q+1|0}else{break}}if((w|0)==2220){w=0;if((a[O+Q|0]|0)==0){w=2221;break}}t=c[P>>2]|0;if((t|0)==0){au=E;break}else{P=t}}do{if((w|0)==2221){w=0;if((a[P+8|0]&1)!=0){au=E;break}if((c[P+16>>2]|0)==1){break L3081}else{au=E}}}while(0);while(1){E=c[au+4>>2]|0;P=0;while(1){if((P|0)>=(D|0)){w=2227;break}if((a[F+(aa+P|0)|0]|0)==(a[E+P|0]|0)){P=P+1|0}else{break}}if((w|0)==2227){w=0;if((a[E+P|0]|0)==0){break}}Q=c[au>>2]|0;if((Q|0)==0){w=2261;break L2917}else{au=Q}}if((a[au+8|0]&1)!=0){w=2260;break L2917}if((c[au+16>>2]|0)!=2){w=2262;break L2917}}}while(0);D=c[n>>2]|0;if((D|0)==1|(D|0)==4){L=is(l)|0;F=c[L>>2]|0;if((F|0)==1){av=+(c[L+8>>2]|0)}else if((F|0)==2){av=+h[L+8>>3]}else if((F|0)==3){av=+uz(c[L+8>>2]|0,0)}else{w=2236;break L2917}if((c[o>>2]|0)==3){uu(c[p>>2]|0);c[o>>2]=1}L=~~(av*100.0+.5);F=(L|0)<0?0:L;c[d>>2]=(F|0)>100?100:F;ab=1;break}else if((D|0)==2|(D|0)==5){D=is(m)|0;F=c[D>>2]|0;if((F|0)==1){aw=+(c[D+8>>2]|0)}else if((F|0)==2){aw=+h[D+8>>3]}else if((F|0)==3){aw=+uz(c[D+8>>2]|0,0)}else{w=2244;break L2917}if((c[y>>2]|0)==3){uu(c[q>>2]|0);c[y>>2]=1}D=~~aw;c[e>>2]=(D|0)<0?0:D;ab=1;break}else{ab=0;break}}else{ab=A}}while(0);D=c[13898]|0;if((D|0)>=(c[8272]|0)){w=2257;break}s=W;A=ab;B=G;C=D;z=c[1054]|0}if((w|0)==2256){i=j;return}else if((w|0)==2257){i=j;return}else if((w|0)==2258){i=j;return}else if((w|0)==2259){i=j;return}else if((w|0)==2165){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((w|0)==2236){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((w|0)==2244){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((w|0)==2260){i=j;return}else if((w|0)==2261){i=j;return}else if((w|0)==2262){i=j;return}}function hK(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0.0;b=i;i=i+56|0;d=b|0;e=b+24|0;f=b+48|0;c[f>>2]=-2;g=c[13898]|0;j=c[1054]|0;k=c[j+(g*40&-1)+36>>2]|0;L3139:do{if((a[j+(g*40&-1)|0]&1)!=0&(k|0)>0){l=c[10036]|0;m=0;n=0;o=c[j+(g*40&-1)+32>>2]|0;while(1){if((a[m+123456|0]|0)==(a[l+(m+o|0)|0]|0)){p=o;q=n}else{if((m|0)!=3){r=g;break L3139}p=o-1|0;q=1}s=m+1|0;if((s|0)<(q+k|0)){m=s;n=q;o=p}else{break}}if((q|0)==0){if(!((m|0)==2|(m|0)==8)){r=g;break}}o=g-1|0;n=c[j+(o*40&-1)+36>>2]|0;if(!((a[j+(o*40&-1)|0]&1)!=0&(n|0)>0)){r=g;break}l=c[10036]|0;s=0;t=0;u=c[j+(o*40&-1)+32>>2]|0;while(1){if((a[s+170936|0]|0)==(a[l+(s+u|0)|0]|0)){w=u;x=t}else{if((s|0)!=4){r=g;break L3139}w=u-1|0;x=1}o=s+1|0;if((o|0)<(x+n|0)){s=o;t=x;u=w}else{break}}if((x|0)==0){if(!((s|0)==3|(s|0)==10)){r=g;break}}u=g+1|0;c[13898]=u;r=u}else{r=g}}while(0);L3163:do{if((r|0)<(c[8272]|0)){L3165:do{if((a[j+(r*40&-1)|0]&1)!=0){g=c[j+(r*40&-1)+36>>2]|0;x=j+(r*40&-1)+32|0;w=c[10036]|0;q=0;while(1){if((q|0)>=(g|0)){break}if((a[w+((c[x>>2]|0)+q|0)|0]|0)==(a[q+103664|0]|0)){q=q+1|0}else{break L3165}}if((q|0)==1){break L3163}}}while(0);a[14176]=1;is(d);a[14176]=0;if((c[d>>2]|0)!=3){c[13898]=r;break}s=c[d+8>>2]|0;if((s|0)==0){break}x=c[7642]|0;w=c[x>>2]|0;do{if((w|0)==0){c[f>>2]=-1;y=2296}else{g=0;p=-1;k=w;while(1){if((aY(s|0,k|0)|0)==0){z=g;break}u=(a_(s|0,k|0,uA(k|0)|0)|0)==0&(p|0)<0?g:p;t=g+1|0;n=c[x+(t<<3)>>2]|0;if((n|0)==0){z=u;break}else{g=t;p=u;k=n}}c[f>>2]=z;if((z|0)<=-1){y=2296;break}c[f>>2]=c[x+(z<<3)+4>>2]}}while(0);if((y|0)==2296){ca(s|0,81360,(v=i,i=i+8|0,c[v>>2]=f,v)|0)}uu(s);x=c[f>>2]|0;if((x|0)==-2){uf(c[13898]|0,79872,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else{A=x;i=b;return A|0}}}while(0);y=is(e)|0;z=c[y>>2]|0;if((z|0)==1){B=+(c[y+8>>2]|0)}else if((z|0)==2){B=+h[y+8>>3]}else if((z|0)==3){B=+uz(c[y+8>>2]|0,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}y=e|0;if((c[y>>2]|0)==3){uu(c[e+8>>2]|0);c[y>>2]=1}y=~~B;c[f>>2]=y;A=y;i=b;return A|0}function hL(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0.0;e=i;i=i+64|0;f=e|0;g=e+24|0;j=c[13898]|0;L3201:do{if(d){k=c[1054]|0;l=c[k+(j*40&-1)+36>>2]|0;m=c[k+(j*40&-1)+32>>2]|0;n=(a[k+(j*40&-1)|0]&1)==0;L3204:do{if((l|0)>0&(n^1)){o=c[10036]|0;p=0;q=0;r=m;while(1){if((a[p+78616|0]|0)==(a[o+(p+r|0)|0]|0)){s=r;t=q}else{if((p|0)!=6){u=2320;break L3204}s=r-1|0;t=1}w=p+1|0;if((w|0)<(t+l|0)){p=w;q=t;r=s}else{break}}if((t|0)!=0){break}if(!((p|0)==5|(p|0)==10)){u=2320}}else{u=2320}}while(0);if((u|0)==2320){r=c[8272]|0;if((r|0)<=(j|0)|n){x=r;break}q=c[10036]|0;o=0;while(1){if((o|0)>=(l|0)){break}if((a[q+(m+o|0)|0]|0)==(a[o+124464|0]|0)){o=o+1|0}else{x=r;break L3201}}if((o|0)!=2){x=r;break}}m=j+1|0;c[13898]=m;q=c[k+(m*40&-1)+36>>2]|0;L3222:do{if((a[k+(m*40&-1)|0]&1)!=0&(q|0)>0){l=c[10036]|0;n=0;w=0;y=c[k+(m*40&-1)+32>>2]|0;while(1){if((a[n+111056|0]|0)==(a[l+(n+y|0)|0]|0)){z=y;A=w}else{if((n|0)!=3){break L3222}z=y-1|0;A=1}B=n+1|0;if((B|0)<(A+q|0)){n=B;w=A;y=z}else{break}}if((A|0)==0){if(!((n|0)==2|(n|0)==8)){break}}c[b>>2]=-3;c[13898]=(c[13898]|0)+1;i=e;return}}while(0);q=is(f)|0;m=c[q>>2]|0;if((m|0)==3){C=+uz(c[q+8>>2]|0,0)}else if((m|0)==2){C=+h[q+8>>3]}else if((m|0)==1){C=+(c[q+8>>2]|0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}q=f|0;if((c[q>>2]|0)==3){uu(c[f+8>>2]|0);c[q>>2]=1}q=~~C;m=43296;while(1){D=c[m>>2]|0;if((D|0)==0){u=2347;break}if((c[D+4>>2]|0)==(q|0)){u=2346;break}else{m=D|0}}if((u|0)==2346){uD(b|0,D+8|0,112);i=e;return}else if((u|0)==2347){c[b>>2]=-1;c[b+4>>2]=0;m=b+8|0;c[m>>2]=c[12872];c[m+4>>2]=c[12873];c[m+8>>2]=c[12874];c[m+12>>2]=c[12875];c[m+16>>2]=c[12876];c[m+20>>2]=c[12877];c[m+24>>2]=c[12878];c[m+28>>2]=c[12879];c[m+32>>2]=c[12880];c[m+36>>2]=c[12881];c[m+40>>2]=c[12882];c[m+44>>2]=c[12883];c[m+48>>2]=c[12884];c[m+52>>2]=c[12885];c[b+64>>2]=1;h[b+72>>3]=0.0;c[b+80>>2]=0;h[b+88>>3]=15.0;h[b+96>>3]=90.0;c[b+104>>2]=0;uh(-1,79128,(v=i,i=i+8|0,c[v>>2]=q,v)|0);i=e;return}}else{x=c[8272]|0}}while(0);L3254:do{if((j|0)<(x|0)){D=b+64|0;f=g+8|0;A=g+4|0;z=g|0;t=g+16|0;s=b+72|0;d=b+80|0;m=g+24|0;k=b+88|0;r=g+32|0;o=b+96|0;y=b+4|0;w=b+8|0;l=b+104|0;p=0;B=0;E=0;F=0;G=0;H=j;I=x;L3256:while(1){J=c[1054]|0;K=(a[J+(H*40&-1)|0]&1)==0;L3258:do{if(!K){L=c[J+(H*40&-1)+36>>2]|0;M=J+(H*40&-1)+32|0;N=c[10036]|0;O=0;while(1){if((O|0)>=(L|0)){break}if((a[N+((c[M>>2]|0)+O|0)|0]|0)==(a[O+103664|0]|0)){O=O+1|0}else{break L3258}}if((O|0)==1){P=G;Q=F;R=E;S=B;T=p;U=H;break L3254}}}while(0);n=(I|0)>(H|0);L3265:do{if(n){do{if(!K){M=c[J+(H*40&-1)+36>>2]|0;N=J+(H*40&-1)+32|0;L=c[10036]|0;V=0;while(1){if((V|0)>=(M|0)){u=2358;break}if((a[L+((c[N>>2]|0)+V|0)|0]|0)==(a[V+150816|0]|0)){V=V+1|0}else{break}}do{if((u|0)==2358){u=0;if((V|0)!=6){break}N=B+1|0;if((B|0)!=0){P=G;Q=F;R=E;S=N;T=p;U=H;break L3254}c[13898]=H+1;c[D>>2]=0;W=G;X=F;Y=E;Z=N;_=p;break L3265}}while(0);if(!n){u=2387;break L3265}if(K){break}V=c[J+(H*40&-1)+36>>2]|0;N=J+(H*40&-1)+32|0;L=c[10036]|0;M=0;while(1){if((M|0)>=(V|0)){u=2367;break}if((a[L+((c[N>>2]|0)+M|0)|0]|0)==(a[M+148912|0]|0)){M=M+1|0}else{break}}do{if((u|0)==2367){u=0;if((M|0)!=4){break}N=B+1|0;if((B|0)!=0){P=G;Q=F;R=E;S=N;T=p;U=H;break L3254}c[13898]=H+1;c[D>>2]=1;W=G;X=F;Y=E;Z=N;_=p;break L3265}}while(0);if(!n){u=2387;break L3265}if(K){break}M=c[J+(H*40&-1)+36>>2]|0;N=J+(H*40&-1)+32|0;L=c[10036]|0;V=0;while(1){if((V|0)>=(M|0)){u=2375;break}if((a[L+((c[N>>2]|0)+V|0)|0]|0)==(a[V+146928|0]|0)){V=V+1|0}else{break}}do{if((u|0)==2375){u=0;if((V|0)!=8){break}N=B+1|0;if((B|0)!=0){P=G;Q=F;R=E;S=N;T=p;U=H;break L3254}c[13898]=H+1;c[D>>2]=2;W=G;X=F;Y=E;Z=N;_=p;break L3265}}while(0);if(!n){u=2387;break L3265}if(K){break}V=c[J+(H*40&-1)+36>>2]|0;N=J+(H*40&-1)+32|0;L=c[10036]|0;M=0;while(1){if((M|0)>=(V|0)){break}if((a[L+((c[N>>2]|0)+M|0)|0]|0)==(a[M+144768|0]|0)){M=M+1|0}else{u=2387;break L3265}}if((M|0)!=5){u=2387;break L3265}N=B+1|0;if((B|0)!=0){P=G;Q=F;R=E;S=N;T=p;U=H;break L3254}c[13898]=H+1;c[D>>2]=3;W=G;X=F;Y=E;Z=N;_=p;break L3265}}while(0);$=c[J+(H*40&-1)+36>>2]|0;aa=c[J+(H*40&-1)+32>>2]|0;u=2397}else{u=2387}}while(0);L3306:do{if((u|0)==2387){u=0;O=c[J+(H*40&-1)+36>>2]|0;N=c[J+(H*40&-1)+32>>2]|0;if(!((O|0)>0&(K^1))){ab=O;ac=N;u=2415;break}L=c[10036]|0;V=0;ad=0;ae=N;while(1){if((a[V+75200|0]|0)==(a[L+(V+ae|0)|0]|0)){af=ae;ag=ad}else{if((V|0)!=4){$=O;aa=N;u=2397;break L3306}af=ae-1|0;ag=1}ah=V+1|0;if((ah|0)<(ag+O|0)){V=ah;ad=ag;ae=af}else{break}}if((ag|0)==0){if(!((V|0)==3|(V|0)==6)){$=O;aa=N;u=2397;break}}ae=F+1|0;if((F|0)!=0){P=G;Q=ae;R=E;S=B;T=p;U=H;break L3254}c[13898]=H+1;c[l>>2]=2;W=G;X=ae;Y=E;Z=B;_=p}}while(0);L3320:do{if((u|0)==2397){u=0;if(K){ab=$;ac=aa;u=2415;break}L3323:do{if(($|0)>0){ae=c[10036]|0;ad=0;do{if((a[ad+127904|0]|0)!=(a[ae+(ad+aa|0)|0]|0)){break L3323}ad=ad+1|0;}while((ad|0)<($|0));if((ad|0)!=5){break}ae=F+1|0;if((F|0)!=0){P=G;Q=ae;R=E;S=B;T=p;U=H;break L3254}c[13898]=H+1;c[l>>2]=1;W=G;X=ae;Y=E;Z=B;_=p;break L3320}}while(0);if(!(($|0)>0&(K^1))){ab=$;ac=aa;u=2415;break}N=c[10036]|0;O=0;V=0;ae=aa;while(1){if((a[O+74368|0]|0)==(a[N+(O+ae|0)|0]|0)){ai=ae;aj=V}else{if((O|0)!=6){ab=$;ac=aa;u=2415;break L3320}ai=ae-1|0;aj=1}M=O+1|0;if((M|0)<(aj+$|0)){O=M;V=aj;ae=ai}else{break}}if((aj|0)==0){if(!((O|0)==5|(O|0)==8)){ab=$;ac=aa;u=2415;break}}ae=F+1|0;if((F|0)!=0){P=G;Q=ae;R=E;S=B;T=p;U=H;break L3254}c[13898]=H+1;c[l>>2]=0;W=G;X=ae;Y=E;Z=B;_=p}}while(0);L3344:do{if((u|0)==2415){u=0;L3346:do{if(!(K|n^1)){ae=c[10036]|0;V=0;while(1){if((V|0)>=(ab|0)){u=2419;break}if((a[ae+(ac+V|0)|0]|0)==(a[V+130496|0]|0)){V=V+1|0}else{break}}do{if((u|0)==2419){u=0;if((V|0)!=4){break}ad=E+1|0;if((E|0)!=0){P=G;Q=F;R=ad;S=B;T=p;U=H;break L3254}c[f>>2]=0;c[A>>2]=0;c[z>>2]=0;ak=H+1|0;c[13898]=ak;if((ak|0)>=(I|0)){u=2454;break L3256}L3356:do{if((a[J+(ak*40&-1)|0]&1)!=0){N=c[J+(ak*40&-1)+36>>2]|0;M=J+(ak*40&-1)+32|0;L=0;while(1){if((L|0)>=(N|0)){break}if((a[ae+((c[M>>2]|0)+L|0)|0]|0)==(a[L+103664|0]|0)){L=L+1|0}else{break L3356}}if((L|0)==1){u=2453;break L3256}}}while(0);dl(g,0);h[s>>3]=+h[t>>3];c[d>>2]=c[z>>2];C=+h[m>>3];h[k>>3]=C;al=+h[r>>3];h[o>>3]=al;if(al>C){W=G;X=F;Y=ad;Z=B;_=p;break L3344}h[o>>3]=90.0;W=G;X=F;Y=ad;Z=B;_=p;break L3344}}while(0);if(K|n^1){break}ae=c[10036]|0;V=0;while(1){if((V|0)>=(ab|0)){u=2434;break}if((a[ae+(ac+V|0)|0]|0)==(a[V+150704|0]|0)){V=V+1|0}else{break}}do{if((u|0)==2434){u=0;if((V|0)!=4){break}ae=G+1|0;if((G|0)!=0){P=ae;Q=F;R=E;S=B;T=p;U=H;break L3254}c[13898]=H+1;c[y>>2]=0;W=ae;X=F;Y=E;Z=B;_=p;break L3344}}while(0);if(K|n^1){break}V=c[10036]|0;ae=0;while(1){if((ae|0)>=(ab|0)){break}if((a[V+(ac+ae|0)|0]|0)==(a[ae+150856|0]|0)){ae=ae+1|0}else{break L3346}}if((ae|0)!=5){break}V=G+1|0;if((G|0)!=0){P=V;Q=F;R=E;S=B;T=p;U=H;break L3254}c[13898]=H+1;c[y>>2]=1;W=V;X=F;Y=E;Z=B;_=p;break L3344}}while(0);hH(w,1,0);O=c[13898]|0;if((H|0)==(O|0)){P=G;Q=F;R=E;S=B;T=p;U=H;break L3254}V=p+1|0;if((p|0)==0){W=G;X=F;Y=E;Z=B;_=V}else{P=G;Q=F;R=E;S=B;T=V;U=O;break L3254}}}while(0);n=c[13898]|0;K=c[8272]|0;if((n|0)<(K|0)){p=_;B=Z;E=Y;F=X;G=W;H=n;I=K}else{P=W;Q=X;R=Y;S=Z;T=_;U=n;break L3254}}if((u|0)==2453){uf(ak,73632,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==2454){uf(ak,73632,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}else{P=0;Q=0;R=0;S=0;T=0;U=j}}while(0);if((P|0)>1|(T|0)>1|(S|0)>1|(R|0)>1|(Q|0)>1){uf(U,98720,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{i=e;return}}function hM(){var b=0,d=0,e=0,f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,x=0,y=0,z=0,A=0.0,B=0.0,C=0.0,D=0.0,E=0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Z=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0.0,af=0,ag=0.0,ah=0,ai=0.0,aj=0.0;b=i;i=i+1032|0;d=b|0;e=b+48|0;f=b+96|0;j=b+144|0;k=b+192|0;l=b+448|0;m=b+520|0;n=b+776|0;o=m|0;p=n|0;if((a[14080]&1)==0){i=b;return}L3395:do{if((c[8496]|0)==0){a[o]=0}else{do{if((a[37384]&1)!=0){if(+P(+(+aX(+(+g[3536]),90.0)))<.1){if(+P(+(+aX(+(+g[3538]),180.0)))<.1){break}}a[p]=0;q=n+(uA(p|0)|0)|0;a[q]=a[147088]|0;a[q+1|0]=a[147089|0]|0;a[q+2|0]=a[147090|0]|0;a[q+3|0]=a[147091|0]|0;a[q+4|0]=a[147092|0]|0;a[q+5|0]=a[147093|0]|0;a[q+6|0]=a[147094|0]|0;q=c[8503]|0;uC(p|0,q|0);q=n+(uA(p|0)|0)|0;a[q]=a[86120]|0;a[q+1|0]=a[86121|0]|0;a[q+2|0]=a[86122|0]|0;q=c[8503]|0;uC(p|0,q|0);uD(n+(uA(p|0)|0)|0,146840,11);q=c[8503]|0;uC(p|0,q|0);q=n+(uA(p|0)|0)|0;a[q]=a[86120]|0;a[q+1|0]=a[86121|0]|0;a[q+2|0]=a[86122|0]|0;q=c[8503]|0;uC(p|0,q|0);r=+g[3538];s=+g[3536];t=+g[3534];u=+g[3532];be(o|0,p|0,(v=i,i=i+32|0,h[v>>3]=r,h[v+8>>3]=s,h[v+16>>3]=t,h[v+24>>3]=u,v)|0);break L3395}}while(0);do{if((c[17261]&3|0)==0){if((c[17089]&3|0)!=0){break}q=iq(o,+h[3470],+h[3468],c[8506]|0,c[8510]|0)|0;if((a[26192]&1)==0){break L3395}u=+h[3470];t=+h[3468];x=k|0;y=l|0;uD(x|0,236632,255);z=c[8503]|0;uC(x|0,z|0);z=k+(uA(x|0)|0)|0;a[z]=a[86120]|0;a[z+1|0]=a[86121|0]|0;a[z+2|0]=a[86122|0]|0;z=c[8503]|0;uC(x|0,z|0);uD(k+(uA(x|0)|0)|0,145e3,14);z=c[8503]|0;uC(x|0,z|0);z=k+(uA(x|0)|0)|0;a[z]=a[86120]|0;a[z+1|0]=a[86121|0]|0;a[z+2|0]=a[86122|0]|0;z=c[8503]|0;uC(x|0,z|0);s=+h[3275];do{if((a[66164]&1)==0){A=u-s}else{if(s==0.0){A=99999.0;break}A=u/s}}while(0);r=+h[3276];do{if((a[65476]&1)==0){B=t-r}else{if(r==0.0){B=99999.0;break}B=t/r}}while(0);be(q|0,x|0,(v=i,i=i+32|0,h[v>>3]=s,h[v+8>>3]=r,h[v+16>>3]=A,h[v+24>>3]=B,v)|0);if((c[8500]|0)==0){break L3395}z=(a[66164]&1)==0;if(z){C=u}else{D=+_(+u);C=D/+h[8272]}E=(a[65476]&1)==0;if(E){F=t}else{D=+_(+t);F=D/+h[8186]}D=+h[3275];if(z){G=D}else{H=+_(+D);G=H/+h[8272]}H=+h[3276];if(E){I=H}else{D=+_(+H);I=D/+h[8186]}a[x]=0;E=k+(uA(x|0)|0)|0;a[E]=a[126656]|0;a[E+1|0]=a[126657|0]|0;a[E+2|0]=a[126658|0]|0;E=c[8503]|0;uC(x|0,E|0);D=C-G;H=F-I;J=+Q(+(D*D+H*H));if((c[8500]|0)==1){K=+Y(+H,+D)*57.29577951308232;uD(k+(uA(x|0)|0)|0,144496,13);L=K}else{if(D==0.0){M=H>0.0?8.988465674311579e+307:-8.988465674311579e+307}else{M=H/D}E=k+(uA(x|0)|0)|0;z=c[8503]|0;be(E|0,144344,(v=i,i=i+8|0,c[v>>2]=z,v)|0);L=M}be(y|0,x|0,(v=i,i=i+16|0,h[v>>3]=J,h[v+8>>3]=L,v)|0);uC(q|0,y|0);break L3395}}while(0);if((c[16573]&3|0)==0){N=o}else{z=m+2|0;a[o]=a[146632]|0;a[o+1|0]=a[146633|0]|0;a[o+2|0]=a[146634|0]|0;J=+h[3470];if(J<8.988465674311579e+307){if((c[16546]|0)==1){E=c9(2)|0;R=a8(E|0,10)|0;if((R|0)!=0){S=R;do{a[S]=32;S=a8(E|0,10)|0;}while((S|0)!=0)}D=+h[3470];t3(j,D);H=D- +O(+D);t4(z,40,E,j,H)}else{S=c[8503]|0;be(z|0,S|0,(v=i,i=i+8|0,h[v>>3]=J,v)|0)}T=m+((uA(z|0)|0)+2|0)|0}else{T=z}a[T]=32;N=T+1|0}if((c[16401]&3|0)==0){U=N}else{S=N+2|0;a[N]=a[146472]|0;a[N+1|0]=a[146473|0]|0;a[N+2|0]=a[146474|0]|0;H=+h[3468];if(H<8.988465674311579e+307){if((c[16374]|0)==1){R=c9(1)|0;V=a8(R|0,10)|0;if((V|0)!=0){W=V;do{a[W]=32;W=a8(R|0,10)|0;}while((W|0)!=0)}J=+h[3468];t3(f,J);D=J- +O(+J);t4(S,40,R,f,D)}else{W=c[8503]|0;be(S|0,W|0,(v=i,i=i+8|0,h[v>>3]=H,v)|0)}X=N+((uA(S|0)|0)+2|0)|0}else{X=S}a[X]=32;U=X+1|0}if((c[17261]&3|0)==0){Z=U}else{W=U+3|0;z=U;w=4010616;a[z]=w&255;w=w>>8;a[z+1|0]=w&255;w=w>>8;a[z+2|0]=w&255;w=w>>8;a[z+3|0]=w&255;D=+h[3469];if(D<8.988465674311579e+307){if((c[17234]|0)==1){z=c9(6)|0;E=a8(z|0,10)|0;if((E|0)!=0){V=E;do{a[V]=32;V=a8(z|0,10)|0;}while((V|0)!=0)}H=+h[3469];t3(e,H);J=H- +O(+H);t4(W,40,z,e,J)}else{V=c[8503]|0;be(W|0,V|0,(v=i,i=i+8|0,h[v>>3]=D,v)|0)}$=U+((uA(W|0)|0)+3|0)|0}else{$=W}a[$]=32;Z=$+1|0}if((c[17089]&3|0)==0){aa=Z}else{V=Z+3|0;S=Z;w=4010617;a[S]=w&255;w=w>>8;a[S+1|0]=w&255;w=w>>8;a[S+2|0]=w&255;w=w>>8;a[S+3|0]=w&255;J=+h[3467];if(J<8.988465674311579e+307){if((c[17062]|0)==1){S=c9(5)|0;R=a8(S|0,10)|0;if((R|0)!=0){E=R;do{a[E]=32;E=a8(S|0,10)|0;}while((E|0)!=0)}D=+h[3467];t3(d,D);H=D- +O(+D);t4(V,40,S,d,H)}else{E=c[8503]|0;be(V|0,E|0,(v=i,i=i+8|0,h[v>>3]=J,v)|0)}ab=Z+((uA(V|0)|0)+3|0)|0}else{ab=V}a[ab]=32;aa=ab+1|0}do{if((a[26192]&1)==0){ac=aa}else{if((c[16573]&3|0)==0){ad=aa}else{E=aa;w=4028516;a[E]=w&255;w=w>>8;a[E+1|0]=w&255;w=w>>8;a[E+2|0]=w&255;w=w>>8;a[E+3|0]=w&255;E=aa+3|0;W=c[8503]|0;do{if((a[66164]&1)==0){ae=+h[3470]- +h[3275]}else{H=+h[3275];if(H==0.0){ae=99999.0;break}ae=+h[3470]/H}}while(0);be(E|0,W|0,(v=i,i=i+8|0,h[v>>3]=ae,v)|0);ad=aa+(uA(aa|0)|0)|0}if((c[16401]&3|0)==0){af=ad}else{y=ad;w=4028772;a[y]=w&255;w=w>>8;a[y+1|0]=w&255;w=w>>8;a[y+2|0]=w&255;w=w>>8;a[y+3|0]=w&255;y=ad+3|0;q=c[8503]|0;do{if((a[65476]&1)==0){ag=+h[3468]- +h[3276]}else{t=+h[3276];if(t==0.0){ag=99999.0;break}ag=+h[3468]/t}}while(0);be(y|0,q|0,(v=i,i=i+8|0,h[v>>3]=ag,v)|0);af=ad+(uA(ad|0)|0)|0}if((c[17261]&3|0)==0){ah=af}else{a[af]=a[145552]|0;a[af+1|0]=a[145553|0]|0;a[af+2|0]=a[145554|0]|0;a[af+3|0]=a[145555|0]|0;a[af+4|0]=a[145556|0]|0;W=af+4|0;E=c[8503]|0;do{if((a[68916]&1)==0){ai=+h[3469]- +h[3277]}else{t=+h[3277];if(t==0.0){ai=99999.0;break}ai=+h[3469]/t}}while(0);be(W|0,E|0,(v=i,i=i+8|0,h[v>>3]=ai,v)|0);ah=af+(uA(af|0)|0)|0}if((c[17089]&3|0)==0){ac=ah;break}a[ah]=a[145256]|0;a[ah+1|0]=a[145257|0]|0;a[ah+2|0]=a[145258|0]|0;a[ah+3|0]=a[145259|0]|0;a[ah+4|0]=a[145260|0]|0;q=ah+4|0;y=c[8503]|0;do{if((a[68228]&1)==0){aj=+h[3467]- +h[3278]}else{t=+h[3278];if(t==0.0){aj=99999.0;break}aj=+h[3467]/t}}while(0);be(q|0,y|0,(v=i,i=i+8|0,h[v>>3]=aj,v)|0);ac=ah+(uA(ah|0)|0)|0}}while(0);a[ac-1|0]=0}}while(0);ac=c[(c[3524]|0)+120>>2]|0;if((ac|0)==0){i=b;return}cN[ac&255](0,o);i=b;return}function hN(b,d,e,f,g,i){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0.0,l=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0.0;j=(a[37384]&1)==0;do{if(j){if((c[7939]|0)==(c[7938]|0)){h[g>>3]=8.988465674311579e+307;h[e>>3]=8.988465674311579e+307}else{k=+(b|0);h[e>>3]=(k- +(c[16536]|0))/+h[8269]+ +h[8255];h[g>>3]=(k- +(c[17224]|0))/+h[8613]+ +h[8599]}if((c[7941]|0)==(c[7940]|0)){h[i>>3]=8.988465674311579e+307;h[f>>3]=8.988465674311579e+307;break}else{k=+(d|0);h[f>>3]=(k- +(c[16364]|0))/+h[8183]+ +h[8169];h[i>>3]=(k- +(c[17052]|0))/+h[8527]+ +h[8513];break}}else{l=b-(c[18064]|0)|0;m=d-(c[18062]|0)|0;n=c[18060]|0;o=c[18058]|0;do{if((((n|0)>-1?n:-n|0)|0)>(((o|0)>-1?o:-o|0)|0)){k=+h[8255];h[e>>3]=k+ +(l|0)/+(n|0)*(+h[8256]-k)}else{if((o|0)==0){h[e>>3]=8.988465674311579e+307;break}else{k=+h[8255];h[e>>3]=k+ +(m|0)/+(o|0)*(+h[8256]-k);break}}}while(0);o=c[18056]|0;n=c[18054]|0;do{if((((o|0)>-1?o:-o|0)|0)>(((n|0)>-1?n:-n|0)|0)){k=+h[8169];h[f>>3]=k+ +(l|0)/+(o|0)*(+h[8170]-k)}else{if((n|0)==0){h[f>>3]=8.988465674311579e+307;break}else{k=+h[8169];h[f>>3]=k+ +(m|0)/+(n|0)*(+h[8170]-k);break}}}while(0);h[i>>3]=8.988465674311579e+307;h[g>>3]=8.988465674311579e+307}}while(0);k=+h[e>>3];if((a[66164]&1)==0){p=k}else{p=+Z(+(k*+h[8272]))}h[e>>3]=p;p=+h[f>>3];if((a[65476]&1)==0){q=p}else{q=+Z(+(p*+h[8186]))}h[f>>3]=q;if(!j){return}q=+h[g>>3];if((a[68916]&1)==0){r=q}else{r=+Z(+(q*+h[8616]))}h[g>>3]=r;r=+h[i>>3];if((a[68228]&1)==0){s=r}else{s=+Z(+(r*+h[8530]))}h[i>>3]=s;return}function hO(b){b=b|0;var d=0,e=0;c[8512]=0;c[14056]=0;do{if((b|0)!=0){if(!(a[21856]|0)){break}d=c[(c[3524]|0)+128>>2]|0;if((d|0)!=0){cR[d&127](0,0,0)}a[21856]=0;if((c[8501]|0)==0){break}d=c[m>>2]|0;aI(147352,19,1,d|0)}}while(0);d=c[3524]|0;do{if((d|0)!=0){e=c[d+128>>2]|0;if((e|0)==0){break}cR[e&127](0,0,0);if((c[8498]|0)==0){break}e=c[(c[3524]|0)+120>>2]|0;if((e|0)==0){break}cN[e&255](1,179864);cN[c[(c[3524]|0)+120>>2]&255](2,179864)}}while(0);do{if((c[8026]|0)!=0){c[8026]=0;d=c[3524]|0;if((d|0)==0){break}e=c[d>>2]|0;if((a_(222936,e|0,3)|0)!=0){if((a_(163e3,e|0,3)|0)!=0){break}}e=c[o>>2]|0;b6(10,e|0)}}while(0);if((b|0)==1){return}c[b+12>>2]=1062;c[b+16>>2]=0;hQ(b,1);return}function hP(b){b=b|0;var d=0;if((b|0)==0){d=147656;return d|0}if(!(a[21856]|0)){d=0;return d|0}b=c[(c[3524]|0)+128>>2]|0;if((b|0)!=0){cR[b&127](0,0,0)}a[21856]=0;if((c[8501]|0)==0){d=0;return d|0}aI(147352,19,1,c[m>>2]|0);d=0;return d|0}function hQ(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;e=i;f=c[b+12>>2]|0;g=c[b+16>>2]|0;h=c[b+4>>2]|0;j=c[b+8>>2]|0;if((c[14128]|0)==0){hS()}k=c[8512]|0;do{if((k&1|0)==0){l=f;n=k&255}else{if((f&255|0)!=0){l=f;n=k&255;break}o=bC(f|0)|0;l=o;n=c[8512]&255}}while(0);if(!((l|0)<1|(c[8026]&8|0)==0|d^1)){ir(+(h|0),+(j|0),0,l);i=e;return}f=c[14128]|0;if((f|0)==0){i=e;return}k=(g&1|0)==0;g=b+20|0;o=f;L3631:while(1){do{if((l|0)==(c[o+4>>2]|0)){if(((a[o+8|0]^n)&6)!=0){break}f=e6(147896)|0;if((f|0)!=0){a[f+8|0]=0;p=c[g>>2]|0;c[f+16>>2]=1;c[f+24>>2]=p}if((a[o+20|0]&1)!=0){q=o+12|0;if((c[q>>2]|0)!=0){r=2635;break L3631}}if(!d){r=2655;break L3631}if(k){s=c[o+12>>2]|0;if((s|0)!=0){r=2644;break L3631}}p=c[o+16>>2]|0;if((p|0)==0){f=c[m>>2]|0;cf(f|0,123008,(v=i,i=i+16|0,c[v>>2]=105800,c[v+8>>2]=1370,v)|0);break}else{cO[p&255](b);break}}}while(0);p=c[o+24>>2]|0;if((p|0)==0){r=2652;break}else{o=p}}if((r|0)==2635){if(d){ir(+(h|0),+(j|0),0,l)}else{ir(0.0,0.0,0,l)}l=c[q>>2]|0;if((l|0)==0){t=0}else{t=bP(l|0)|0}dL(t);c[b>>2]=3;i=e;return}else if((r|0)==2655){i=e;return}else if((r|0)==2644){dL(bP(s|0)|0);i=e;return}else if((r|0)==2652){i=e;return}}function hR(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;i=i+32|0;g=f|0;if((c[14128]|0)==0){hS()}do{if((d|0)==0){hT(b)}else{hV(b,d,0);if(!e){break}if((hZ(g,b)|0)==0){break}h=c[14128]|0;if((h|0)==0){break}j=c[g+4>>2]|0;k=a[g+8|0]|0;l=h;do{do{if((j|0)==(c[l+4>>2]|0)){if(((a[l+8|0]^k)&6)!=0){break}a[l+20|0]=1}}while(0);l=c[l+24>>2]|0;}while((l|0)!=0)}}while(0);if((b|0)==0){i=f;return}uu(b);i=f;return}function hS(){var a=0,b=0,d=0;a=c[14128]|0;if((a|0)!=0){b=a;while(1){a=b+12|0;d=c[a>>2]|0;if((d|0)!=0){uu(d);c[a>>2]=0}a=c[b+24>>2]|0;uu(b);if((a|0)==0){break}else{b=a}}}c[14128]=0;hV(205056,0,182);hV(204680,0,172);hV(204424,0,14);hV(204128,0,120);hV(203920,0,40);hV(203672,0,86);hV(203432,0,104);hV(164840,0,156);hV(193632,0,122);hV(170288,0,66);hV(170224,0,100);hV(40160,0,32);hV(170216,0,202);hV(170208,0,92);hV(174448,0,44);hV(169624,0,78);hV(198400,0,196);hV(197952,0,206);hV(122560,0,150);hV(164216,0,46);hV(151360,0,134);hV(178184,0,174);hV(147552,0,24);hV(83696,0,74);return}function hT(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;i=i+48|0;e=d|0;if((c[14128]|0)==0){hS()}if((b|0)==0){f=d+32|0;uD(f|0,56584,12);g=c[m>>2]|0;aF(10,g|0);g=c[m>>2]|0;cf(g|0,f|0,(v=i,i=i+16|0,c[v>>2]=79120,c[v+8>>2]=78520,v)|0);g=c[m>>2]|0;cf(g|0,f|0,(v=i,i=i+16|0,c[v>>2]=78176,c[v+8>>2]=77480,v)|0);g=c[m>>2]|0;cf(g|0,f|0,(v=i,i=i+16|0,c[v>>2]=179864,c[v+8>>2]=77024,v)|0);g=c[m>>2]|0;cf(g|0,f|0,(v=i,i=i+16|0,c[v>>2]=76336,c[v+8>>2]=75728,v)|0);g=c[m>>2]|0;cf(g|0,f|0,(v=i,i=i+16|0,c[v>>2]=75192,c[v+8>>2]=74816,v)|0);g=c[m>>2]|0;cf(g|0,f|0,(v=i,i=i+16|0,c[v>>2]=74352,c[v+8>>2]=73928,v)|0);g=c[m>>2]|0;cf(g|0,f|0,(v=i,i=i+16|0,c[v>>2]=73616,c[v+8>>2]=72992,v)|0);g=c[m>>2]|0;cf(g|0,f|0,(v=i,i=i+16|0,c[v>>2]=225216,c[v+8>>2]=224776,v)|0);g=c[m>>2]|0;cf(g|0,f|0,(v=i,i=i+16|0,c[v>>2]=223768,c[v+8>>2]=223184,v)|0);g=c[m>>2]|0;cf(g|0,f|0,(v=i,i=i+16|0,c[v>>2]=222680,c[v+8>>2]=221840,v)|0);g=c[m>>2]|0;cf(g|0,f|0,(v=i,i=i+16|0,c[v>>2]=221376,c[v+8>>2]=220792,v)|0);g=c[m>>2]|0;cf(g|0,f|0,(v=i,i=i+16|0,c[v>>2]=219032,c[v+8>>2]=218520,v)|0);g=c[m>>2]|0;cf(g|0,f|0,(v=i,i=i+16|0,c[v>>2]=217968,c[v+8>>2]=217472,v)|0);g=c[m>>2]|0;cf(g|0,f|0,(v=i,i=i+16|0,c[v>>2]=216736,c[v+8>>2]=216288,v)|0);g=c[m>>2]|0;cf(g|0,f|0,(v=i,i=i+16|0,c[v>>2]=215744,c[v+8>>2]=215256,v)|0);g=c[m>>2]|0;cf(g|0,f|0,(v=i,i=i+16|0,c[v>>2]=214784,c[v+8>>2]=214224,v)|0);f=c[m>>2]|0;aF(10,f|0);f=c[m>>2]|0;cf(f|0,213488,(v=i,i=i+16|0,c[v>>2]=212928,c[v+8>>2]=212352,v)|0);f=c[m>>2]|0;cf(f|0,211856,(v=i,i=i+16|0,c[v>>2]=211392,c[v+8>>2]=210904,v)|0);f=c[m>>2]|0;aF(10,f|0);f=c[14128]|0;if((f|0)!=0){g=f;do{h$(g);g=c[g+24>>2]|0;}while((g|0)!=0)}g=c[m>>2]|0;aF(10,g|0);g=c[m>>2]|0;aI(210240,67,1,g|0);g=c[m>>2]|0;aF(10,g|0);i=d;return}if((hZ(e,b)|0)==0){i=d;return}b=c[14128]|0;if((b|0)==0){i=d;return}g=c[e+4>>2]|0;f=a[e+8|0]|0;e=b;while(1){if((g|0)==(c[e+4>>2]|0)){if(((a[e+8|0]^f)&6)==0){break}}b=c[e+24>>2]|0;if((b|0)==0){h=2693;break}else{e=b}}if((h|0)==2693){i=d;return}h$(e);i=d;return}function hU(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0;f=i;if(!((b|0)!=0&(c[6928]|0)!=0)){dP();i=f;return}g=c[200]|0;do{if((a[64788+(g*688&-1)|0]&1)==0){j=2704}else{k=c[64652+(g*688&-1)>>2]|0;if((k&1|0)==0){if(+h[64680+(g*688&-1)>>3]<=0.0){break}}if((k&2|0)!=0){j=2704;break}if(+h[64688+(g*688&-1)>>3]>0.0){j=2704}}}while(0);L3731:do{if((j|0)==2704){g=c[144]|0;do{if((a[64788+(g*688&-1)|0]&1)!=0){k=c[64652+(g*688&-1)>>2]|0;if((k&1|0)==0){if(+h[64680+(g*688&-1)>>3]<=0.0){break L3731}}if((k&2|0)!=0){break}if(+h[64688+(g*688&-1)>>3]<=0.0){break L3731}}}while(0);g=c[34]|0;do{if((a[64788+(g*688&-1)|0]&1)!=0){k=c[64652+(g*688&-1)>>2]|0;if((k&1|0)==0){if(+h[64680+(g*688&-1)>>3]<=0.0){break L3731}}if((k&2|0)!=0){break}if(+h[64688+(g*688&-1)>>3]<=0.0){break L3731}}}while(0);if((a[66852]&1)!=0){g=c[16679]|0;if(!((g&1|0)!=0|+h[8343]>0.0)){break}if(!((g&2|0)!=0|+h[8344]>0.0)){break}}fv(b,d,e);i=f;return}}while(0);uk(164960,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}function hV(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;f=i;g=ut(28)|0;do{if((g|0)==0){gk();h=ut(28)|0;if((h|0)!=0){j=h;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=81336,v)|0)}else{j=g}}while(0);g=j;if((hZ(g,b)|0)==0){uu(j);i=f;return}b=c[14128]|0;do{if((b|0)==0){c[14128]=g;k=g}else{h=c[j+4>>2]|0;l=j+8|0;m=b;while(1){if((h|0)==(c[m+4>>2]|0)){if(((a[m+8|0]^a[l])&6)==0){break}}n=c[m+24>>2]|0;if((n|0)==0){o=2741;break}else{m=n}}if((o|0)==2741){c[(c[b>>2]|0)+24>>2]=g;c[j>>2]=c[c[14128]>>2];k=c[14128]|0;break}do{if((d|0)==0){c[m+16>>2]=e}else{if((a[d]|0)==0){h_(m);break}l=m+12|0;h=c[l>>2]|0;if((h|0)!=0){uu(h);c[l>>2]=0}c[l>>2]=d}}while(0);uu(j);i=f;return}}while(0);c[k>>2]=g;c[j+24>>2]=0;a[j+20|0]=0;if((d|0)==0){c[j+16>>2]=e;i=f;return}if((a[d]|0)==0){h_(g);i=f;return}else{c[j+12>>2]=d;i=f;return}}function hW(){var b=0,d=0,e=0,f=0.0,g=0,j=0.0,k=0.0,l=0,m=0.0,n=0,o=0,p=0.0;b=i;i=i+8|0;d=b|0;e=c[(c[3524]|0)+124>>2]|0;if((e|0)==0){i=b;return}if((a[26192]&1)==0){i=b;return}cN[e&255](-1,-1);if((a[37384]&1)==0){e=(a[66164]&1)!=0;f=+h[3275];if(e&f<0.0){g=-1}else{if(e){j=+_(+f);k=j/+h[8272]}else{k=f}g=~~(+(c[16536]|0)+(k- +h[8255])*+h[8269]+.5)}c[6558]=g;e=(a[65476]&1)!=0;k=+h[3276];if(e&k<0.0){l=-1}else{if(e){f=+_(+k);m=f/+h[8186]}else{m=k}l=~~(+(c[16364]|0)+(m- +h[8169])*+h[8183]+.5)}c[6559]=l;hN(g,l,d,d,26216,26224);n=c[6558]|0;o=c[6559]|0}else{h[d>>3]=1.0;m=(+h[3275]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;k=(+h[3276]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;f=(1.0- +h[5279])*+h[2]+ +h[12]+-1.0;j=+h[406]+m*+h[394]+k*+h[398]+f*+h[402];p=j==0.0?1.0e-5:j;d=~~((+h[403]+m*+h[391]+k*+h[395]+f*+h[399])/p*+(c[180]|0))+(c[186]|0)|0;l=~~((+h[404]+m*+h[392]+k*+h[396]+f*+h[400])/p*+(c[40]|0))+(c[46]|0)|0;c[6558]=d;c[6559]=l;n=d;o=l}cN[c[(c[3524]|0)+124>>2]&255](n,o);i=b;return}function hX(b){b=b|0;var d=0,e=0,f=0,i=0,j=0,k=0.0;if((b|0)==0){d=76768;return d|0}e=c[3524]|0;f=e+124|0;if((c[f>>2]|0)==0){d=0;return d|0}do{if((a[26192]&1)==0){if((a[37384]&1)!=0){if(+P(+(+aX(+(+g[3536]),90.0)))>=.1){break}if(+P(+(+aX(+(+g[3538]),180.0)))>=.1){break}}a[26192]=1;i=c[b+4>>2]|0;c[6558]=i;j=c[b+8>>2]|0;c[6559]=j;hN(i,j,26200,26208,26216,26224);cN[c[(c[3524]|0)+124>>2]&255](c[6558]|0,c[6559]|0);j=e6(98488)|0;if((j|0)!=0){a[j+8|0]=0;k=+h[3275];c[j+16>>2]=2;h[j+24>>3]=k;h[j+32>>3]=0.0}j=e6(92688)|0;if((j|0)!=0){a[j+8|0]=0;k=+h[3276];c[j+16>>2]=2;h[j+24>>3]=k;h[j+32>>3]=0.0}if((c[8501]|0)==0){break}j=c[m>>2]|0;aI(224616,18,1,j|0)}else{a[26192]=0;do{if((e|0)!=0){j=c[f>>2]|0;if((j|0)==0){break}cN[j&255](-1,-1)}}while(0);j=e6(98488)|0;if((j|0)!=0){a[j+8|0]=1}j=e6(92688)|0;if((j|0)!=0){a[j+8|0]=1}if((c[8501]|0)==0){break}j=c[m>>2]|0;aI(84792,19,1,j|0);if((c[8501]|0)==0){break}j=c[m>>2]|0;aI(84792,19,1,j|0)}}while(0);hM();d=0;return d|0}function hY(b){b=b|0;var d=0,e=0,f=0,g=0;d=c[7772]|0;if((b-1|0)>>>0>=2){e=d;return e|0}do{if((d|0)!=(b|0)){if((a[26192]&1)==0){break}a[26192]=0;f=c[3524]|0;do{if((f|0)!=0){g=c[f+124>>2]|0;if((g|0)==0){break}cN[g&255](-1,-1)}}while(0);f=e6(98488)|0;if((f|0)!=0){a[f+8|0]=1}f=e6(92688)|0;if((f|0)!=0){a[f+8|0]=1}if((c[8501]|0)==0){break}f=c[m>>2]|0;aI(84792,19,1,f|0)}}while(0);c[7772]=b;e=b;return e|0}function hZ(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0;e=i;f=b+4|0;c[f>>2]=-1;g=b+8|0;a[g]=0;c[b+12>>2]=0;c[b+16>>2]=0;c[b>>2]=0;c[b+24>>2]=0;if((d|0)==0){h=0;i=e;return h|0}else{j=d;k=-1;l=0}L3876:while(1){b=a[j]|0;if(b<<24>>24==0){n=k;o=2836;break}L3879:do{if((uJ(j|0,217264,4)|0)==0){p=l|4;a[g]=p;q=j+4|0;r=k;s=p}else{if((uJ(j|0,211672,5)|0)==0){p=l|2;a[g]=p;q=j+5|0;r=k;s=p;break}L3884:do{if((aY(j|0,87296)|0)==0){t=0;o=2824}else{p=(a_(j|0,87296,9)|0)!=0;if((aY(j|0,86224)|0)==0){t=1;o=2824;break}u=(a_(j|0,86224,3)|0)==0&p?1:p<<31>>31;if((aY(j|0,85184)|0)==0){t=2;o=2824;break}p=(a_(j|0,85184,8)|0)==0&(u|0)<0?2:u;if((aY(j|0,84288)|0)==0){t=3;o=2824;break}u=(a_(j|0,84288,6)|0)==0&(p|0)<0?3:p;if((aY(j|0,83696)|0)==0){t=4;o=2824;break}p=(a_(j|0,83696,6)|0)==0&(u|0)<0?4:u;if((aY(j|0,82728)|0)==0){t=5;o=2824;break}u=(a_(j|0,82728,6)|0)==0&(p|0)<0?5:p;if((u|0)>-1){t=u;o=2824;break}else{w=20384}while(1){u=c[w>>2]|0;if((u|0)==0){break L3884}if((aY(j|0,u|0)|0)==0){break}else{w=w+4|0}}x=(w-20384>>2)+1e3|0;y=uA(j|0)|0;o=2832}}while(0);if((o|0)==2824){o=0;u=uA(c[960+(t<<3)>>2]|0)|0;x=c[964+(t<<3)>>2]|0;y=u;o=2832}do{if((o|0)==2832){o=0;if((x|0)==-1){break}c[f>>2]=x;q=j+y|0;r=x;s=l;break L3879}}while(0);u=j+1|0;p=b<<24>>24;c[f>>2]=p;z=a[u]|0;if((z<<24>>24|0)==0|(z<<24>>24|0)==45){q=u;r=p;s=l}else{o=2835;break L3876}}}while(0);if((q|0)==0){n=r;o=2836;break}else{j=q;k=r;l=s}}if((o|0)==2836){h=(n|0)!=-1&1;i=e;return h|0}else if((o|0)==2835){cf(c[m>>2]|0,205504,(v=i,i=i+8|0,c[v>>2]=d,v)|0);h=0;i=e;return h|0}return 0}function h_(a){a=a|0;var b=0,d=0,e=0,f=0;if((a|0)==0){return}if((c[a+16>>2]|0)!=0){b=a+12|0;d=c[b>>2]|0;if((d|0)==0){return}uu(d);c[b>>2]=0;return}b=a|0;d=c[b>>2]|0;e=a+24|0;if((d|0)==0){f=0}else{c[d+24>>2]=c[e>>2];f=c[b>>2]|0}b=c[e>>2]|0;if((b|0)==0){c[c[14128]>>2]=f}else{c[b>>2]=f}f=a+12|0;b=c[f>>2]|0;if((b|0)!=0){uu(b);c[f>>2]=0}do{if((c[14128]|0)==(a|0)){f=c[e>>2]|0;c[14128]=f;if((f|0)==0){break}b=c[f>>2]|0;if((b|0)==0){break}c[b+24>>2]=0}}while(0);uu(a);return}function h$(d){d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,n=0,o=0;e=i;i=i+8|0;f=e|0;g=c[m>>2]|0;h=f;a[56520]=0;do{if((d|0)!=0){j=d+8|0;k=a[j]|0;if((k&2)==0){l=k}else{a[56520]=a[206584]|0;a[56521|0]=a[206585|0]|0;a[56522|0]=a[206586|0]|0;a[56523|0]=a[206587|0]|0;a[56524|0]=a[206588|0]|0;a[56525|0]=a[206589|0]|0;l=a[j]|0}if((l&4)!=0){j=56520+(uA(56520)|0)|0;a[j]=a[205752]|0;a[j+1|0]=a[205753|0]|0;a[j+2|0]=a[205754|0]|0;a[j+3|0]=a[205755|0]|0;a[j+4|0]=a[205756|0]|0;a[j+5|0]=a[205757|0]|0;a[j+6|0]=a[205758|0]|0}j=c[d+4>>2]|0;if((j-1001|0)>>>0<63){k=c[20384+(j-1e3<<2)>>2]|0;uC(56520,k|0);break}else{n=0}while(1){if((n|0)==6){o=2872;break}if((c[964+(n<<3)>>2]|0)==(j|0)){o=2871;break}else{n=n+1|0}}if((o|0)==2871){k=c[960+(n<<3)>>2]|0;uC(56520,k|0);break}else if((o|0)==2872){b[f>>1]=0;a[h]=j&255;uC(56520,h|0);break}}}while(0);cf(g|0,209560,(v=i,i=i+8|0,c[v>>2]=56520,v)|0);cf(c[m>>2]|0,209048,(v=i,i=i+8|0,c[v>>2]=(a[d+20|0]&1)!=0?42:32,v)|0);g=c[d+12>>2]|0;if((g|0)!=0){h=c[m>>2]|0;cf(h|0,208640,(v=i,i=i+8|0,c[v>>2]=g,v)|0);i=e;return}g=c[d+16>>2]|0;d=c[m>>2]|0;if((g|0)==0){cf(d|0,207152,(v=i,i=i+16|0,c[v>>2]=105800,c[v+8>>2]=2288,v)|0);i=e;return}else{h=cO[g&255](0)|0;cf(d|0,154696,(v=i,i=i+8|0,c[v>>2]=h,v)|0);i=e;return}}function h0(a){a=a|0;var b=0;if((a|0)==0){b=165760}else{dM(165400);b=0}return b|0}function h1(b){b=b|0;var d=0,e=0,f=0,g=0;if((b|0)==0){d=166224;return d|0}b=c[11692]|0;e=c[260]|0;do{if((b|0)==0){if((e|0)==0){f=0;g=2889;break}c[11692]=e}else{f=e;g=2889}}while(0);do{if((g|0)==2889){if((b|0)==(f|0)&(b|0)!=31){c[11692]=31;break}if((a[37384]&1)!=0&(b|0)==31){c[11692]=4095;break}else{c[11692]=0;break}}}while(0);dM(179864);d=0;return d|0}function h2(a){a=a|0;var b=0;if((a|0)==0){b=166576}else{dM(179864);b=0}return b|0}function h3(b){b=b|0;var c=0,d=0,e=0;if((b|0)==0){c=167768;return c|0}else{d=0}while(1){if(d>>>0>=8){e=2905;break}if((a[65036+(d*688&-1)|0]&1)!=0){e=2906;break}if((a[65037+(d*688&-1)|0]&1)==0){d=d+1|0}else{e=2906;break}}if((e|0)==2906){dM(166984);c=0;return c|0}else if((e|0)==2905){dM(196824);c=0;return c|0}return 0}function h4(b){b=b|0;var d=0;if((b|0)==0){d=168352;return d|0}aF(10,c[m>>2]|0);hT(0);if((a[37400]&1)==0){d=0;return d|0}aI(105808,9,1,c[m>>2]|0);aD(c[m>>2]|0);d=0;return d|0}function h5(b){b=b|0;var d=0,e=0,f=0;d=i;if((b|0)==0){e=169176;i=d;return e|0}if((a[872]&1)!=0){uh(-1,168720,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);e=0;i=d;return e|0}b=c[8494]|0;do{if((c[13528]|0)<(b|0)&(b|0)<(c[13529]|0)){f=c[8492]|0;if(!((c[13530]|0)<(f|0)&(f|0)<(c[13531]|0))){break}dM((a[66852]&1)!=0?173736:173264);e=0;i=d;return e|0}}while(0);if((a[37384]&1)==0|(c[5094]|0)!=0){dM((a[65476]&1)!=0?171552:171296);e=0;i=d;return e|0}else{dM((a[64788+((c[34]|0)*688&-1)|0]&1)!=0?172888:172496);e=0;i=d;return e|0}return 0}function h6(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;if((b|0)==0){d=174336;return d|0}b=c[8494]|0;do{if((c[13528]|0)<(b|0)&(b|0)<(c[13529]|0)){e=c[8492]|0;if(!((c[13530]|0)<(e|0)&(e|0)<(c[13531]|0))){break}dM((a[66852]&1)!=0?173736:173264);d=0;return d|0}}while(0);if(!((a[37384]&1)==0|(c[5094]|0)!=0)){dM((a[64788+((c[34]|0)*688&-1)|0]&1)!=0?172888:172496);d=0;return d|0}e=c[8492]|0;f=c[7940]|0;g=c[7941]|0;h=(g-f|0)/4&-1;i=c[7938]|0;if((e|0)<(h+f|0)){j=c[7939]|0;k=(b|0)>(i|0)&(b|0)<(j|0);l=j}else{k=0;l=c[7939]|0}j=(l-i|0)/4&-1;if((b|0)<(j+i|0)){m=(e|0)>(f|0)&(e|0)<(g|0)}else{m=0}if((e|0)>(g-h|0)){n=(b|0)>(i|0)&(b|0)<(l|0)}else{n=0}if((b|0)>(l-j|0)){o=(e|0)>(f|0)&(e|0)<(g|0)}else{o=0}if(k){dL(bP(((a[66164]&1)!=0?172224:171904)|0)|0)}if(m){dL(bP(((a[65476]&1)!=0?171552:171296)|0)|0)}g=c[5094]|0;if((g|0)!=0|n^1){p=g}else{dL(bP(((a[68916]&1)!=0?170840:170464)|0)|0);p=c[5094]|0}if(!((p|0)!=0|o^1)){dL(bP(((a[68228]&1)!=0?170088:169608)|0)|0)}do{if(!k){if((c[5094]|0)!=0&(m^1)){dM((a[64788+((c[34]|0)*688&-1)|0]&1)!=0?172888:172496)}if(m|n|o){break}else{d=0}return d|0}}while(0);dM(179864);d=0;return d|0}function h7(a){a=a|0;var b=0;if((a|0)==0){b=175488;return b|0}do{if((c[8496]|0)==0){c[8496]=1;if((c[8501]|0)==0){break}a=c[m>>2]|0;aI(174984,18,1,a|0)}else{c[8496]=0;if((c[8501]|0)==0){break}a=c[m>>2]|0;aI(174688,19,1,a|0)}}while(0);hM();b=0;return b|0}function h8(b){b=b|0;var d=0,e=0,f=0,g=0;d=i;if((b|0)==0){e=175784;i=d;return e|0}b=c[8506]|0;f=b-1|0;c[8506]=f;g=c[8510]|0;do{if((f|0)!=7|(g|0)!=0){if((f|0)>7){c[8506]=1;break}if((f|0)>=1){break}c[8506]=7;if((g|0)!=0){break}if((a[30528]&1)!=0){break}c[8506]=6}else{if((a[30528]&1)!=0){break}c[8506]=6}}while(0);hM();if((c[8501]|0)==0){e=0;i=d;return e|0}g=c[8506]|0;cf(c[m>>2]|0,176192,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=g,v)|0);e=0;i=d;return e|0}function h9(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;if((b|0)==0){e=176776;i=d;return e|0}b=c[8506]|0;f=b+1|0;c[8506]=f;g=c[8510]|0;do{if((f|0)!=7|(g|0)!=0){if((f|0)>7){h=2998;break}if((b|0)>=0){break}c[8506]=7;if((g|0)!=0){break}if((a[30528]&1)!=0){break}c[8506]=6}else{if((a[30528]&1)!=0){break}c[8506]=8;h=2998}}while(0);if((h|0)==2998){c[8506]=1}hM();if((c[8501]|0)==0){e=0;i=d;return e|0}h=c[8506]|0;cf(c[m>>2]|0,176192,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=h,v)|0);e=0;i=d;return e|0}function ia(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;if((a|0)==0){d=177368;i=b;return d|0}a=c[13532]|0;e=a-1|0;c[13532]=e;f=c[13534]|0;do{if((e|0)!=7|(f|0)!=0){if((e|0)>7){c[13532]=0;g=0;break}if((e|0)>=0){g=e;break}c[13532]=7;if((f|0)!=0){g=7;break}c[13532]=6;g=6}else{c[13532]=6;g=6}}while(0);if((c[8501]|0)==0){d=0;i=b;return d|0}cf(c[m>>2]|0,177616,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=g,v)|0);d=0;i=b;return d|0}function ib(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;if((a|0)==0){d=177920;i=b;return d|0}a=c[13532]|0;e=a+1|0;c[13532]=e;f=c[13534]|0;do{if((e|0)!=7|(f|0)!=0){if((e|0)>7){g=3027;break}if((e|0)>=0){h=e;break}c[13532]=7;if((f|0)!=0){h=7;break}c[13532]=6;h=6}else{c[13532]=8;g=3027}}while(0);if((g|0)==3027){c[13532]=0;h=0}if((c[8501]|0)==0){d=0;i=b;return d|0}cf(c[m>>2]|0,177616,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=h,v)|0);d=0;i=b;return d|0}function ic(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;if((a|0)==0){d=179216;i=b;return d|0}e=(c[8500]|0)+1|0;f=(e|0)>2?0:e;c[8500]=f;cR[c[(c[3524]|0)+128>>2]&127]((f|0)!=0?-3:-4,c[a+4>>2]|0,c[a+8>>2]|0);hM();if((c[8501]|0)==0){d=0;i=b;return d|0}cf(c[m>>2]|0,178656,(v=i,i=i+8|0,c[v>>2]=(c[8500]|0)!=0?179864:178216,v)|0);d=0;i=b;return d|0}function id(a){a=a|0;var b=0;if((a|0)==0){b=180400;return b|0}do{if((c[8501]|0)==0){c[8501]=1}else{a=c[m>>2]|0;aI(179928,49,1,a|0);a=(c[8501]|0)==0;c[8501]=a&1;if(a){break}else{b=0}return b|0}}while(0);aI(179616,39,1,c[m>>2]|0);b=0;return b|0}function ie(a){a=a|0;var b=0,c=0.0;do{if((a|0)==0){b=183160}else{c=+g[18074];if(c==0.0){dM(182624);b=0;break}if(c==1.0){dM(181152);b=0;break}else{dM(180792);b=0;break}}}while(0);return b|0}function ig(a){a=a|0;var b=0,d=0,e=0;if((a|0)==0){b=183976;return b|0}a=c[6]|0;do{if((a|0)==0){d=3063}else{e=c[a+72>>2]|0;if((e|0)==0){d=3063;break}ip(e)}}while(0);if((d|0)==3063){d=c[m>>2]|0;aF(7,d|0)}if((c[8501]|0)==0){b=0;return b|0}aI(183608,11,1,c[m>>2]|0);b=0;return b|0}function ih(a){a=a|0;var b=0,d=0,e=0;if((a|0)==0){b=184736;return b|0}a=c[6]|0;do{if((a|0)==0){d=3074}else{e=c[a+68>>2]|0;if((e|0)==0){d=3074;break}ip(e)}}while(0);if((d|0)==3074){d=c[m>>2]|0;aF(7,d|0)}if((c[8501]|0)==0){b=0;return b|0}aI(184360,15,1,c[m>>2]|0);b=0;return b|0}function ii(a){a=a|0;var b=0,d=0;if((a|0)==0){b=187240;return b|0}a=c[8]|0;if((a|0)==0|(c[6]|0)==(a|0)){d=c[m>>2]|0;aF(7,d|0)}else{ip(a)}if((c[8501]|0)==0){b=0;return b|0}aI(186768,8,1,c[m>>2]|0);b=0;return b|0}function ij(b){b=b|0;var c=0;do{if((b|0)==0){c=189200}else{if((a[37384]&1)==0){c=0;break}io(0,-1);c=0}}while(0);return c|0}function ik(b){b=b|0;var c=0;do{if((b|0)==0){c=191536}else{if((a[37384]&1)==0){c=0;break}io(1,0);c=0}}while(0);return c|0}function il(b){b=b|0;var c=0;do{if((b|0)==0){c=193488}else{if((a[37384]&1)==0){c=0;break}io(0,1);c=0}}while(0);return c|0}function im(b){b=b|0;var c=0;do{if((b|0)==0){c=196952}else{if((a[37384]&1)==0){c=0;break}io(-1,0);c=0}}while(0);return c|0}function io(b,d){b=b|0;d=d|0;var e=0,f=0,j=0,k=0.0,l=0.0,n=0.0;e=i;if((c[8512]&1|0)==0){f=d;j=b}else{f=d*10&-1;j=b*10&-1}do{if((j|0)!=0){k=+(j|0)+ +g[3538];if(k<0.0){l=k+360.0}else{l=k}g[3538]=l;if(l<=360.0){break}g[3538]=l+-360.0}}while(0);do{if((f|0)!=0){l=+(f|0)+ +g[3536];if(l<0.0){n=l+360.0}else{n=l}g[3536]=n;if(n<=360.0){break}g[3536]=n+-360.0}}while(0);do{if((f|j|0)!=0){n=+g[3538];b=e6(196288)|0;if((b|0)!=0){a[b+8|0]=0;c[b+16>>2]=2;h[b+24>>3]=n;h[b+32>>3]=0.0}n=+g[3536];b=e6(195744)|0;if((b|0)==0){break}a[b+8|0]=0;c[b+16>>2]=2;h[b+24>>3]=n;h[b+32>>3]=0.0}}while(0);if((c[8501]|0)!=0){j=c[m>>2]|0;n=+g[3538];l=+g[3536];cf(j|0,193976,(v=i,i=i+16|0,h[v>>3]=n,h[v+8>>3]=l,v)|0)}hU(c[10828]|0,c[7952]|0,0);do{if((a[37384]&1)!=0){if(+P(+(+aX(+(+g[3536]),90.0)))>=.1){i=e;return}if(+P(+(+aX(+(+g[3538]),180.0)))<.1){break}i=e;return}}while(0);if((c[(c[3524]|0)+120>>2]|0)==0){i=e;return}hN(c[8494]|0,c[8492]|0,27760,27744,27752,27736);hM();i=e;return}function ip(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,n=0.0,o=0.0,p=0.0,q=0.0;d=i;i=i+1024|0;e=d|0;if((a[37384]&1)==0){f=0}else{f=(c[5094]|0)==1}g=c[6]|0;do{if((g|0)==0){j=0}else{h[g>>3]=+h[8257];h[g+16>>3]=+h[8258];h[g+32>>3]=+h[8601];h[g+48>>3]=+h[8602];c[g+64>>2]=f&1;if(f){k=c[6]|0;h[k+8>>3]=+h[8172];h[k+24>>3]=+h[8171];h[k+40>>3]=+h[8516];h[k+56>>3]=+h[8515];j=k;break}else{k=c[6]|0;h[k+8>>3]=+h[8171];h[k+24>>3]=+h[8172];h[k+40>>3]=+h[8515];h[k+56>>3]=+h[8516];j=k;break}}}while(0);g=c[8]|0;if(!((j|0)!=(g|0)|(g|0)==(b|0))){uD(57080,64648,7568);c[16506]=0;c[16334]=0;c[17194]=0;c[17022]=0}c[6]=b;if((b|0)==0){b=c[m>>2]|0;aF(7,b|0);i=d;return}cM[c[(c[3524]|0)+168>>2]&511](11);b=c[6]|0;if(f){l=(c[b+64>>2]|0)!=0}else{l=0}g=e|0;n=+h[b+16>>3];j=b+24|0;k=b+8|0;o=+h[(l?j:k)>>3];p=+h[(l?k:j)>>3];be(g|0,186136,(v=i,i=i+32|0,h[v>>3]=+h[b>>3],h[v+8>>3]=n,h[v+16>>3]=o,h[v+24>>3]=p,v)|0);if((a[37384]&1)==0){b=e+(uA(g|0)|0)|0;e=c[6]|0;p=+h[e+32>>3];o=+h[e+48>>3];n=+h[e+40>>3];q=+h[e+56>>3];be(b|0,185640,(v=i,i=i+32|0,h[v>>3]=p,h[v+8>>3]=o,h[v+16>>3]=n,h[v+24>>3]=q,v)|0)}do{if((c[6]|0)==(c[8]|0)){b=0;do{uD(57512+(b*688&-1)|0,65080+(b*688&-1)|0,192);c[57376+(b*688&-1)>>2]=c[64944+(b*688&-1)>>2];c[57356+(b*688&-1)>>2]=c[64924+(b*688&-1)>>2];b=b+1|0;}while((b|0)<11);uD(64648,57080,7568);a[g]=0;if((a[872]&1)==0){break}b=c[6928]|0;if((b|0)==2){dO();i=d;return}if(!(f&(b|0)==3)){break}dO();i=d;return}else{a[37408]=1}}while(0);dM(g);a[37408]=0;i=d;return}function iq(b,d,e,f,g){b=b|0;d=+d;e=+e;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,x=0,y=0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0;j=i;i=i+1080|0;k=j|0;l=j+48|0;m=j+312|0;n=j+568|0;o=j+824|0;if((f-4|0)>>>0<3|(f|0)==3){p=m|0;uE(p|0,0,255);a[p]=91;a[m+1|0]=37;a[m+2|0]=115;a[m+3|0]=44;a[m+4|0]=32;q=c[8503]|0;uC(p|0,q|0);q=m+(uA(p|0)|0)|0;w=93;a[q]=w&255;w=w>>8;a[q+1|0]=w&255;q=j+56|0;c[l>>2]=~~(d+946684800.0);m=bm(l|0)|0;if((f|0)==4){l=c[m+12>>2]|0;r=(c[m+16>>2]|0)+1|0;s=c[m+20>>2]|0;t=((s|0)<69?2e3:1900)+s|0;be(q|0,151152,(v=i,i=i+24|0,c[v>>2]=l,c[v+8>>2]=r,c[v+16>>2]=t,v)|0)}else if((f|0)==3){t3(k,d);t4(q,255,66189,k,d- +O(+d))}else if((f|0)==6){k=(c[m+16>>2]|0)+1|0;t=c[m+20>>2]|0;r=c[m+8>>2]|0;l=c[m+4>>2]|0;be(q|0,150792,(v=i,i=i+40|0,c[v>>2]=c[m+12>>2],c[v+8>>2]=k,c[v+16>>2]=((t|0)<69?2e3:1900)+t,c[v+24>>2]=r,c[v+32>>2]=l,v)|0)}else if((f|0)==5){l=c[m+4>>2]|0;be(q|0,150944,(v=i,i=i+16|0,c[v>>2]=c[m+8>>2],c[v+8>>2]=l,v)|0)}else{be(q|0,c[8503]|0,(v=i,i=i+8|0,h[v>>3]=d,v)|0)}be(b|0,p|0,(v=i,i=i+16|0,c[v>>2]=q,h[v+8>>3]=e,v)|0);u=b;x=uA(u|0)|0;y=u+x|0;i=j;return y|0}do{if((f|0)==1){a[632]=0;q=c[8503]|0;ck(632,q|0,30);q=632+(uA(632)|0)|0;a[q]=a[86120]|0;a[q+1|0]=a[86121|0]|0;a[q+2|0]=a[86122|0]|0;q=c[8503]|0;ck(632,q|0,30);be(b|0,632,(v=i,i=i+16|0,h[v>>3]=d,h[v+8>>3]=e,v)|0);u=b;x=uA(u|0)|0;y=u+x|0;i=j;return y|0}else if((f|0)==2){z=+h[8256]- +h[8255];A=+h[8170]- +h[8169];if(z!=0.0){q=n|0;uE(q|0,0,255);a[q]=47;p=c[8503]|0;uC(q|0,p|0);B=(d- +h[8255])/z;be(b|0,q|0,(v=i,i=i+8|0,h[v>>3]=B,v)|0)}else{uD(b|0,152448,13)}q=b+(uA(b|0)|0)|0;if(A!=0.0){p=o|0;uE(p|0,0,255);a[p]=44;a[o+1|0]=32;l=c[8503]|0;uC(p|0,l|0);l=o+(uA(p|0)|0)|0;w=47;a[l]=w&255;w=w>>8;a[l+1|0]=w&255;B=(e- +h[8169])/A;be(q|0,p|0,(v=i,i=i+8|0,h[v>>3]=B,v)|0);u=q;x=uA(u|0)|0;y=u+x|0;i=j;return y|0}else{uD(q|0,151872,15);u=q;x=uA(u|0)|0;y=u+x|0;i=j;return y|0}}else if((f|0)==7){q=(g|0)!=0;p=a[30528]|0;if(!q){if((p&1)==0){break}}if((p&1)==0){be(b|0,g|0,(v=i,i=i+16|0,h[v>>3]=d,h[v+8>>3]=e,v)|0);u=b;x=uA(u|0)|0;y=u+x|0;i=j;return y|0}B=(c[17366]&1|0)==0?+h[8687]:0.0;A=+Y(+e,+d);p=(a[69604]&1)==0;z=d/+S(+A);if(p){C=B+z}else{D=+_(+B);B=+h[8702];C=+Z(+(B*(z+D/B)))}if(q){B=A/+h[9040];be(b|0,g|0,(v=i,i=i+16|0,h[v>>3]=B,h[v+8>>3]=C,v)|0);u=b;x=uA(u|0)|0;y=u+x|0;i=j;return y|0}else{q=b;p=q|0;w=1634496368;a[p]=w&255;w=w>>8;a[p+1|0]=w&255;w=w>>8;a[p+2|0]=w&255;w=w>>8;a[p+3|0]=w&255;p=q+4|0;w=2112114;a[p]=w&255;w=w>>8;a[p+1|0]=w&255;w=w>>8;a[p+2|0]=w&255;w=w>>8;a[p+3|0]=w&255;p=b+(uA(b|0)|0)|0;a[632]=0;q=c[8503]|0;ck(632,q|0,30);q=632+(uA(632)|0)|0;a[q]=a[86120]|0;a[q+1|0]=a[86121|0]|0;a[q+2|0]=a[86122|0]|0;q=c[8503]|0;ck(632,q|0,30);B=A/+h[9040];be(p|0,632,(v=i,i=i+16|0,h[v>>3]=B,h[v+8>>3]=C,v)|0);u=p;x=uA(u|0)|0;y=u+x|0;i=j;return y|0}}}while(0);a[632]=0;ck(632,c[8503]|0,30);g=632+(uA(632)|0)|0;a[g]=a[86120]|0;a[g+1|0]=a[86121|0]|0;a[g+2|0]=a[86122|0]|0;ck(632,c[8503]|0,30);be(b|0,632,(v=i,i=i+16|0,h[v>>3]=d,h[v+8>>3]=e,v)|0);u=b;x=uA(u|0)|0;y=u+x|0;i=j;return y|0}function ir(b,d,e,f){b=+b;d=+d;e=e|0;f=f|0;var g=0,j=0,k=0,l=0;g=i;hN(~~b,~~d,27760,27744,27752,27736);j=e6(164136)|0;if((j|0)!=0){a[j+8|0]=e&1^1;c[j+16>>2]=1;c[j+24>>2]=e?f:-1}e=e6(163432)|0;if((e|0)!=0){a[e+8|0]=0;c[e+16>>2]=1;c[e+24>>2]=f}e=e6(162952)|0;if((e|0)!=0){j=ut(2)|0;do{if((j|0)==0){gk();k=ut(2)|0;if((k|0)!=0){l=k;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=162328,v)|0)}else{l=j}}while(0);a[l]=f&255;a[l+1|0]=0;f=e+8|0;j=e+16|0;do{if((a[f]&1)==0){if((c[j>>2]|0)!=3){break}uu(c[e+24>>2]|0);c[j>>2]=1}}while(0);a[f]=0;c[j>>2]=3;c[e+24>>2]=l}l=e6(159824)|0;if((l|0)!=0){a[l+8|0]=0;d=+h[3470];c[l+16>>2]=2;h[l+24>>3]=d;h[l+32>>3]=0.0}l=e6(159208)|0;if((l|0)!=0){a[l+8|0]=0;d=+h[3468];c[l+16>>2]=2;h[l+24>>3]=d;h[l+32>>3]=0.0}l=e6(158720)|0;if((l|0)!=0){a[l+8|0]=0;d=+h[3469];c[l+16>>2]=2;h[l+24>>3]=d;h[l+32>>3]=0.0}l=e6(158096)|0;if((l|0)!=0){a[l+8|0]=0;d=+h[3467];c[l+16>>2]=2;h[l+24>>3]=d;h[l+32>>3]=0.0}l=e6(156232)|0;if((l|0)!=0){a[l+8|0]=0;e=c[8512]&1;c[l+16>>2]=1;c[l+24>>2]=e}e=e6(155120)|0;if((e|0)!=0){a[e+8|0]=0;l=c[8512]&4;c[e+16>>2]=1;c[e+24>>2]=l}l=e6(154768)|0;if((l|0)==0){i=g;return}a[l+8|0]=0;e=c[8512]&2;c[l+16>>2]=1;c[l+24>>2]=e;i=g;return}function is(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;e=c[13898]|0;if((e|0)>=(c[8272]|0)){uf(e,214888,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}f=c[1054]|0;L4406:do{if((a[f+(e*40&-1)|0]&1)!=0){g=c[f+(e*40&-1)+36>>2]|0;h=f+(e*40&-1)+32|0;j=c[10036]|0;k=0;while(1){if((k|0)>=(g|0)){break}if((a[j+((c[h>>2]|0)+k|0)|0]|0)==(a[k+103664|0]|0)){k=k+1|0}else{break L4406}}if((k|0)!=1){break}uf(e,214888,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}}while(0);c[11670]=0;e4(it()|0,b);if((a[1960]&1)==0){i=d;return b|0}else{uf(e,159392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}return 0}function it(){var a=0,b=0,d=0,e=0,f=0;a=i;b=c[18070]|0;if((b|0)!=0){e1(b)}b=ut(4808)|0;do{if((b|0)==0){gk();d=ut(4808)|0;if((d|0)!=0){e=d;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=122712,v)|0);return 0}else{e=b}}while(0);c[18070]=e;uE(e|0,0,4808);c[18066]=150;c[8230]=0;if((iy()|0)!=0){f=c[18070]|0;i=a;return f|0}c[8230]=(c[8230]|0)+1;iz();iC();c[8230]=(c[8230]|0)-1;f=c[18070]|0;i=a;return f|0}function iu(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=i;i=i+48|0;e=d|0;f=d+24|0;uu(c[3546]|0);c[3546]=0;g=(b|0)!=0;if(g){c[b>>2]=0}h=c[13898]|0;if((h|0)>=(c[8272]|0)){uf(h,135720,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}j=c[1054]|0;k=(a[j+(h*40&-1)|0]&1)==0;do{if(!k){l=c[j+(h*40&-1)+36>>2]|0;m=j+(h*40&-1)+32|0;n=c[10036]|0;o=0;while(1){if((o|0)>=(l|0)){p=3259;break}if((a[n+((c[m>>2]|0)+o|0)|0]|0)==(a[o+103664|0]|0)){o=o+1|0}else{break}}do{if((p|0)==3259){if((o|0)!=1){break}uf(h,135720,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}}while(0);if(k){break}o=c[j+(h*40&-1)+32>>2]|0;m=c[10036]|0;n=a[m+o|0]|0;if(!((n<<24>>24|0)==39|(n<<24>>24|0)==34)){break}n=c[j+(h*40&-1)+36>>2]|0;l=0;while(1){if((l|0)>=(n|0)){p=3266;break}if((a[m+(o+l|0)|0]|0)==(a[l+103664|0]|0)){l=l+1|0}else{p=3267;break}}if((p|0)==3266){if((l|0)==1){q=0}else{p=3267}}do{if((p|0)==3267){a[14176]=1;is(e);a[14176]=0;if((c[e>>2]|0)==3){q=c[e+8>>2]|0;break}else{c[13898]=h;q=0;break}}}while(0);c[3546]=q;r=q;i=d;return r|0}}while(0);it();q=c[18070]|0;h=c[q>>2]|0;e=0;while(1){if((e|0)>=(h|0)){p=3274;break}j=c[q+8+(e<<5)>>2]|0;if((j-2|0)>>>0<3|(j|0)==8){break}else{e=e+1|0}}do{if((p|0)==3274){e4(q,f);if((a[1960]&1)!=0){break}if((c[f>>2]|0)!=3){break}c[3546]=c[f+8>>2]}}while(0);if(g){c[b>>2]=c[18070]}r=c[3546]|0;i=d;return r|0}function iv(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0;d=i;e=c[10812]|0;f=c[8272]|0;L4473:do{if((e|0)==0){g=43248;h=c[1054]|0;j=c[10036]|0}else{k=(f|0)>(b|0);l=c[1054]|0;m=l+(b*40&-1)|0;n=l+(b*40&-1)+36|0;o=l+(b*40&-1)+32|0;p=c[10036]|0;q=e;L4475:while(1){r=c[q+4>>2]|0;L4477:do{if(k){if((a[m]&1)==0){break}s=c[n>>2]|0;t=0;while(1){if((t|0)>=(s|0)){break}if((a[p+((c[o>>2]|0)+t|0)|0]|0)==(a[r+t|0]|0)){t=t+1|0}else{break L4477}}if((a[r+t|0]|0)==0){u=q;break L4475}}}while(0);r=q|0;s=c[r>>2]|0;if((s|0)==0){g=r;h=l;j=p;break L4473}else{q=s}}i=d;return u|0}}while(0);e=(f|0)>(b|0);f=h+(b*40&-1)|0;q=h+(b*40&-1)+36|0;p=h+(b*40&-1)+32|0;h=41;L4488:while(1){l=c[41160+(h<<3)>>2]|0;L4490:do{if(e){if((a[f]&1)==0){break}o=c[q>>2]|0;n=0;while(1){if((n|0)>=(o|0)){break}if((a[j+((c[p>>2]|0)+n|0)|0]|0)==(a[l+n|0]|0)){n=n+1|0}else{break L4490}}if((a[l+n|0]|0)==0){w=3303;break L4488}}}while(0);l=h+1|0;if((l|0)==117){break}else{h=l}}do{if((w|0)==3303){if((h|0)==0){break}uh(b,92536,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);h=ut(312)|0;do{if((h|0)==0){gk();w=ut(312)|0;if((w|0)!=0){x=w;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=144328,v)|0);return 0}else{x=h}}while(0);c[g>>2]=x;c[x>>2]=0;c[(c[g>>2]|0)+12>>2]=0;c[(c[g>>2]|0)+8>>2]=0;x=(c[(c[1054]|0)+(b*40&-1)+36>>2]|0)+1|0;h=ut(x)|0;do{if((h|0)==0){gk();w=ut(x)|0;if((w|0)!=0){y=w;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=76632,v)|0);return 0}else{y=h}}while(0);c[(c[g>>2]|0)+4>>2]=y;y=c[(c[g>>2]|0)+4>>2]|0;h=c[1054]|0;x=c[h+(b*40&-1)+36>>2]|0;w=c[h+(b*40&-1)+32>>2]|0;b=0;while(1){h=b+1|0;a[y+b|0]=a[(c[10036]|0)+w|0]|0;if((h|0)==(x|0)){break}else{w=w+1|0;b=h}}a[y+x|0]=0;x=c[g>>2]|0;c[x+24>>2]=1;c[x+32>>2]=0;x=c[g>>2]|0;c[x+48>>2]=1;c[x+56>>2]=0;x=c[g>>2]|0;c[x+72>>2]=1;c[x+80>>2]=0;x=c[g>>2]|0;c[x+96>>2]=1;c[x+104>>2]=0;x=c[g>>2]|0;c[x+120>>2]=1;c[x+128>>2]=0;x=c[g>>2]|0;c[x+144>>2]=1;c[x+152>>2]=0;x=c[g>>2]|0;c[x+168>>2]=1;c[x+176>>2]=0;x=c[g>>2]|0;c[x+192>>2]=1;c[x+200>>2]=0;x=c[g>>2]|0;c[x+216>>2]=1;c[x+224>>2]=0;x=c[g>>2]|0;c[x+240>>2]=1;c[x+248>>2]=0;x=c[g>>2]|0;c[x+264>>2]=1;c[x+272>>2]=0;x=c[g>>2]|0;c[x+288>>2]=1;c[x+296>>2]=0;u=c[g>>2]|0;i=d;return u|0}function iw(){var b=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0.0,Q=0,R=0,S=0,T=0.0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0.0,$=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0;b=i;i=i+152|0;e=b|0;f=b+24|0;g=b+48|0;j=b+72|0;k=b+96|0;l=c[13898]|0;m=c[8272]|0;if((m|0)<=(l|0)){n=0;i=b;return n|0}o=k|0;p=j|0;q=j+8|0;r=g|0;s=g+8|0;t=f|0;u=f+8|0;w=e|0;x=e+8|0;y=0;z=0;A=l;l=m;L4518:while(1){m=A;B=l;while(1){C=c[1054]|0;if((a[C+(m*40&-1)|0]&1)==0){n=y;D=3435;break L4518}E=c[C+(m*40&-1)+36>>2]|0;F=C+(m*40&-1)+32|0;G=c[10036]|0;H=0;while(1){if((H|0)>=(E|0)){break}if((a[G+((c[F>>2]|0)+H|0)|0]|0)==(a[H+217064|0]|0)){H=H+1|0}else{n=y;D=3438;break L4518}}if((H|0)!=3){n=y;D=3436;break L4518}F=m+1|0;E=m+2|0;c[13898]=E;if((B|0)<=(F|0)){I=E;D=3452;break L4518}if((a[C+(F*40&-1)|0]&1)==0){I=E;D=3455;break L4518}J=c[C+(F*40&-1)+36>>2]|0;K=C+(F*40&-1)+32|0;F=0;while(1){if((F|0)>=(J|0)){break}if((a[G+((c[K>>2]|0)+F|0)|0]|0)==(a[F+78280|0]|0)){F=F+1|0}else{I=E;D=3456;break L4518}}if((F|0)!=1){I=E;D=3454;break L4518}if((a[C+(E*40&-1)|0]&1)==0){I=E;D=3457;break L4518}K=(bO(d[G+(c[C+(E*40&-1)+32>>2]|0)|0]|0|0)|0)==0;J=c[1054]|0;if(K){K=c[10036]|0;if((a[K+(c[J+(E*40&-1)+32>>2]|0)|0]|0)==95){L=K}else{D=3335;break L4518}}else{L=c[10036]|0}K=c[13898]|0;c[13898]=K+1;H=c[J+(K*40&-1)+36>>2]|0;M=(H|0)>49?49:H;H=c[J+(K*40&-1)+32>>2]|0;K=0;while(1){J=K+1|0;a[k+K|0]=a[L+H|0]|0;if((J|0)==(M|0)){break}else{H=H+1|0;K=J}}a[k+M|0]=0;N=e6(o)|0;K=c[13898]|0;H=c[8272]|0;E=(H|0)>(K|0);L4543:do{if(E){C=c[1054]|0;if((a[C+(K*40&-1)|0]&1)==0){D=3344;break}G=c[C+(K*40&-1)+36>>2]|0;F=C+(K*40&-1)+32|0;C=c[10036]|0;J=0;while(1){if((J|0)>=(G|0)){break}if((a[C+((c[F>>2]|0)+J|0)|0]|0)==(a[J+115e3|0]|0)){J=J+1|0}else{D=3344;break L4543}}F=K+1|0;c[13898]=F;if((J|0)!=1){O=F;D=3392;break}F=is(j)|0;C=c[F>>2]|0;if((C|0)==1){P=+(c[F+8>>2]|0)}else if((C|0)==2){P=+h[F+8>>3]}else if((C|0)==3){P=+uz(c[F+8>>2]|0,0)}else{D=3350;break L4518}if((c[p>>2]|0)==3){uu(c[q>>2]|0);c[p>>2]=1}F=~~P;Q=c[13898]|0;c[13898]=Q+1;if((c[8272]|0)<=(Q|0)){D=3447;break L4518}C=c[1054]|0;if((a[C+(Q*40&-1)|0]&1)==0){D=3445;break L4518}G=c[C+(Q*40&-1)+36>>2]|0;R=C+(Q*40&-1)+32|0;C=c[10036]|0;S=0;while(1){if((S|0)>=(G|0)){break}if((a[C+((c[R>>2]|0)+S|0)|0]|0)==(a[S+183584|0]|0)){S=S+1|0}else{D=3444;break L4518}}if((S|0)!=1){D=3446;break L4518}R=is(g)|0;C=c[R>>2]|0;if((C|0)==1){T=+(c[R+8>>2]|0)}else if((C|0)==2){T=+h[R+8>>3]}else if((C|0)==3){T=+uz(c[R+8>>2]|0,0)}else{D=3364;break L4518}if((c[r>>2]|0)==3){uu(c[s>>2]|0);c[r>>2]=1}R=~~T;C=c[13898]|0;G=c[8272]|0;L4574:do{if((G|0)>(C|0)){J=c[1054]|0;if((a[J+(C*40&-1)|0]&1)==0){U=1;V=C;W=G;break}X=c[J+(C*40&-1)+36>>2]|0;Y=J+(C*40&-1)+32|0;J=c[10036]|0;Z=0;while(1){if((Z|0)>=(X|0)){break}if((a[J+((c[Y>>2]|0)+Z|0)|0]|0)==(a[Z+183584|0]|0)){Z=Z+1|0}else{U=1;V=C;W=G;break L4574}}if((Z|0)!=1){U=1;V=C;W=G;break}c[13898]=C+1;Y=is(f)|0;J=c[Y>>2]|0;if((J|0)==1){_=+(c[Y+8>>2]|0)}else if((J|0)==2){_=+h[Y+8>>3]}else if((J|0)==3){_=+uz(c[Y+8>>2]|0,0)}else{D=3377;break L4518}if((c[t>>2]|0)==3){uu(c[u>>2]|0);c[t>>2]=1}U=~~_;V=c[13898]|0;W=c[8272]|0}else{U=1;V=C;W=G}}while(0);c[13898]=V+1;if((W|0)<=(V|0)){D=3458;break L4518}G=c[1054]|0;if((a[G+(V*40&-1)|0]&1)==0){D=3459;break L4518}C=c[G+(V*40&-1)+36>>2]|0;S=G+(V*40&-1)+32|0;G=c[10036]|0;Y=0;while(1){if((Y|0)>=(C|0)){break}if((a[G+((c[S>>2]|0)+Y|0)|0]|0)==(a[Y+78864|0]|0)){Y=Y+1|0}else{D=3460;break L4518}}if((Y|0)!=1){D=3461;break L4518}S=N+8|0;G=N+16|0;do{if((a[S]&1)==0){if((c[G>>2]|0)!=3){break}uu(c[N+24>>2]|0);c[G>>2]=1}}while(0);c[G>>2]=1;c[N+24>>2]=F;a[S]=0;$=U;ab=R;ac=F;ad=0}else{D=3344}}while(0);if((D|0)==3344){D=0;M=K+1|0;c[13898]=M;O=M;D=3392}if((D|0)==3392){D=0;if(!E){D=3441;break L4518}M=c[1054]|0;if((a[M+(K*40&-1)|0]&1)==0){D=3442;break L4518}Y=c[M+(K*40&-1)+36>>2]|0;C=M+(K*40&-1)+32|0;J=c[10036]|0;X=0;while(1){if((X|0)>=(Y|0)){break}if((a[J+((c[C>>2]|0)+X|0)|0]|0)==(a[X+145600|0]|0)){X=X+1|0}else{D=3443;break L4518}}if((X|0)!=2){D=3440;break L4518}if((O|0)>=(H|0)){ae=O;D=3462;break L4518}L4614:do{if((a[M+(O*40&-1)|0]&1)!=0){C=c[M+(O*40&-1)+36>>2]|0;Y=M+(O*40&-1)+32|0;K=0;while(1){if((K|0)>=(C|0)){break}if((a[J+((c[Y>>2]|0)+K|0)|0]|0)==(a[K+103664|0]|0)){K=K+1|0}else{break L4614}}if((K|0)==1){ae=O;D=3463;break L4518}}}while(0);a[14176]=1;is(e);a[14176]=0;if((c[w>>2]|0)!=3){D=3405;break L4518}J=c[x>>2]|0;af=c[13898]|0;if((J|0)==0){ae=af;D=3465;break L4518}c[13898]=af+1;if((c[8272]|0)<=(af|0)){D=3450;break L4518}M=c[1054]|0;if((a[M+(af*40&-1)|0]&1)==0){D=3451;break L4518}H=c[M+(af*40&-1)+36>>2]|0;X=M+(af*40&-1)+32|0;M=c[10036]|0;Y=0;while(1){if((Y|0)>=(H|0)){break}if((a[M+((c[X>>2]|0)+Y|0)|0]|0)==(a[Y+78864|0]|0)){Y=Y+1|0}else{D=3448;break L4518}}if((Y|0)!=1){D=3449;break L4518}X=e9(J)|0;M=N+8|0;H=N+16|0;do{if((a[M]&1)==0){if((c[H>>2]|0)!=3){break}uu(c[N+24>>2]|0);c[H>>2]=1}}while(0);Y=fa(J,1)|0;c[H>>2]=3;c[N+24>>2]=Y;a[M]=0;$=1;ab=X;ac=1;ad=J}if((N|0)==0){ag=0}else{ag=aa(ab-ac|0,$)>>>31&255}if(!(($|0)==0|(ac|0)==(ab|0))){Y=ab-ac|0;if((((Y|0)>-1?Y:-Y|0)|0)>=((($|0)>-1?$:-$|0)|0)){break}}Y=c[13898]|0;C=c[8272]|0;if((C|0)>(Y|0)){m=Y;B=C}else{n=y;D=3437;break L4518}}B=ut(40)|0;if((B|0)==0){gk();m=ut(40)|0;if((m|0)==0){D=3427;break}else{ah=m}}else{ah=B}B=ah;c[ah+8>>2]=N;c[ah+12>>2]=ad;c[ah+16>>2]=ac;c[ah+20>>2]=ab;c[ah+24>>2]=$;c[ah+28>>2]=ac;c[ah>>2]=0;m=ah+4|0;c[m>>2]=0;uE(ah+32|0,0,7);if((z|0)==0){ai=B}else{C=y+4|0;c[c[C>>2]>>2]=B;c[m>>2]=c[C>>2];ai=y}c[ai+4>>2]=B;B=ai+38|0;if((a[B]&1)==0){a[B]=ag}B=c[13898]|0;C=c[8272]|0;if((C|0)>(B|0)){y=ai;z=z+1|0;A=B;l=C}else{n=ai;D=3434;break}}if((D|0)==3455){aj=I-1|0;uf(aj,224336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3456){aj=I-1|0;uf(aj,224336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3457){aj=I-1|0;uf(aj,224336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3458){uf(V,224336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3459){uf(V,224336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3460){uf(V,224336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3461){uf(V,224336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3462){ak=ae-1|0;uf(ak,224336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3463){ak=ae-1|0;uf(ak,224336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3465){ak=ae-1|0;uf(ak,224336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3427){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=180144,v)|0);return 0}else if((D|0)==3434){i=b;return n|0}else if((D|0)==3435){i=b;return n|0}else if((D|0)==3436){i=b;return n|0}else if((D|0)==3437){i=b;return n|0}else if((D|0)==3438){i=b;return n|0}else if((D|0)==3440){al=O-1|0;uf(al,224336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3335){I=c[13898]|0;aj=I-1|0;uf(aj,224336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3364){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3350){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3377){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3441){al=O-1|0;uf(al,224336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3442){al=O-1|0;uf(al,224336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3443){al=O-1|0;uf(al,224336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3444){uf(Q,224336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3445){uf(Q,224336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3446){uf(Q,224336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3447){uf(Q,224336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3448){uf(af,224336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3449){uf(af,224336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3450){uf(af,224336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3451){uf(af,224336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3452){aj=I-1|0;uf(aj,224336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3454){aj=I-1|0;uf(aj,224336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((D|0)==3405){c[13898]=O;ae=O;ak=ae-1|0;uf(ak,224336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}return 0}function ix(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;if((b|0)==0){d=0;return d|0}if((a[b+38|0]&1)!=0){d=0;return d|0}e=c[b+4>>2]|0;if((e|0)==0){d=0;return d|0}f=b+37|0;g=a[f]|0;L4699:do{if((g&1)!=0|(e|0)==(b|0)){h=e;i=g}else{j=e;k=g;while(1){l=j+36|0;if((a[l]&1)==0){h=j;i=k;break L4699}m=c[j+16>>2]|0;n=j+28|0;c[n>>2]=m;a[l]=0;l=j+12|0;o=j+8|0;p=(c[o>>2]|0)+24|0;if((c[l>>2]|0)==0){c[p>>2]=m}else{uu(c[p>>2]|0);p=fa(c[l>>2]|0,c[n>>2]|0)|0;c[(c[o>>2]|0)+24>>2]=p}p=c[j+4>>2]|0;o=a[f]|0;if((o&1)!=0|(p|0)==(b|0)){h=p;i=o;break}else{j=p;k=o}}}}while(0);g=h+8|0;if((c[g>>2]|0)==0){c[h+32>>2]=0;d=0;return d|0}e=b+32|0;c[e>>2]=(c[e>>2]|0)+1;if((i&1)==0){i=h+28|0;c[i>>2]=(c[i>>2]|0)+(c[h+24>>2]|0)}i=h+12|0;if((c[i>>2]|0)==0){c[(c[g>>2]|0)+24>>2]=c[h+28>>2]}else{uu(c[(c[g>>2]|0)+24>>2]|0);e=fa(c[i>>2]|0,c[h+28>>2]|0)|0;c[(c[g>>2]|0)+24>>2]=e}e=c[h+24>>2]|0;a[h+36|0]=aa(((c[h+20>>2]|0)-(c[h+28>>2]|0)|0)-e|0,e)>>>31&255;e=b;b=0;while(1){if(b){q=1}else{q=(a[e+36|0]&1)==0}h=c[e>>2]|0;if((h|0)==0){break}else{e=h;b=q}}if(q){d=1;return d|0}if((a[f]&1)!=0){d=0;return d|0}a[f]=1;d=1;return d|0}function iy(){var b=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;b=c[13898]|0;e=c[1054]|0;if((a[e+(b*40&-1)|0]&1)==0){f=0;return f|0}do{if((bO(d[(c[10036]|0)+(c[e+(b*40&-1)+32>>2]|0)|0]|0|0)|0)==0){if((a[(c[10036]|0)+(c[(c[1054]|0)+(b*40&-1)+32>>2]|0)|0]|0)==95){break}else{f=0}return f|0}}while(0);b=(c[13898]|0)+1|0;if((c[8272]|0)<=(b|0)){f=0;return f|0}e=c[1054]|0;if((a[e+(b*40&-1)|0]&1)==0){f=0;return f|0}g=c[e+(b*40&-1)+36>>2]|0;h=e+(b*40&-1)+32|0;b=c[10036]|0;e=0;while(1){if((e|0)>=(g|0)){break}if((a[b+((c[h>>2]|0)+e|0)|0]|0)==(a[e+115e3|0]|0)){e=e+1|0}else{f=0;i=3519;break}}if((i|0)==3519){return f|0}if((e|0)!=1){f=0;return f|0}e=c[18070]|0;i=c[e>>2]|0;h=c[18066]|0;if((i|0)<(h|0)){j=e;k=i}else{i=db(e,(h<<5)+4808|0,168072)|0;h=i;c[18070]=h;c[18066]=(c[18066]|0)+150;j=h;k=c[i>>2]|0}c[j+8+(k<<5)>>2]=1;k=c[18070]|0;j=c[k>>2]|0;c[k>>2]=j+1;k=c[18070]|0;i=c[13898]|0;h=c[1054]|0;e=c[h+(i*40&-1)+36>>2]|0;b=e+(c[h+(i*40&-1)+32>>2]|0)|0;h=db(0,e+1|0,116456)|0;e=c[(c[1054]|0)+(i*40&-1)+32>>2]|0;L4758:do{if((e|0)<(b|0)){i=e;g=h;while(1){l=a[(c[10036]|0)+i|0]|0;if(l<<24>>24==0){m=g;break L4758}n=g+1|0;a[g]=l;l=i+1|0;if((l|0)<(b|0)){i=l;g=n}else{m=n;break}}}else{m=h}}while(0);a[m]=0;c[k+8+(j<<5)+8>>2]=3;c[k+8+(j<<5)+16>>2]=h;c[13898]=(c[13898]|0)+2;if((iy()|0)==0){c[8230]=(c[8230]|0)+1;iz();iC();c[8230]=(c[8230]|0)-1}h=c[18070]|0;j=c[h>>2]|0;k=c[18066]|0;if((j|0)<(k|0)){o=h;p=j}else{j=db(h,(k<<5)+4808|0,168072)|0;k=j;c[18070]=k;c[18066]=(c[18066]|0)+150;o=k;p=c[j>>2]|0}c[o+8+(p<<5)>>2]=36;p=c[18070]|0;c[p>>2]=(c[p>>2]|0)+1;f=1;return f|0}function iz(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;iA();b=c[13898]|0;if((c[8272]|0)>(b|0)){d=b}else{return}L4773:while(1){b=c[1054]|0;if((a[b+(d*40&-1)|0]&1)==0){e=3540;break}f=c[b+(d*40&-1)+36>>2]|0;g=b+(d*40&-1)+32|0;b=c[10036]|0;h=0;while(1){if((h|0)>=(f|0)){break}if((a[b+((c[g>>2]|0)+h|0)|0]|0)==(a[h+163800|0]|0)){h=h+1|0}else{e=3539;break L4773}}if((h|0)!=2){e=3538;break}c[13898]=d+1;g=c[18070]|0;b=c[g>>2]|0;f=c[18066]|0;if((b|0)<(f|0)){i=g;j=b}else{k=db(g,(f<<5)+4808|0,168072)|0;f=k;c[18070]=f;c[18066]=(c[18066]|0)+150;i=f;j=c[k>>2]|0}c[i+8+(j<<5)>>2]=39;k=c[18070]|0;c[k>>2]=(c[k>>2]|0)+1;iA();k=c[18070]|0;c[k+8+(b<<5)+8>>2]=(c[k>>2]|0)-b;b=c[18070]|0;k=c[b>>2]|0;f=c[18066]|0;if((k|0)<(f|0)){l=b;m=k}else{k=db(b,(f<<5)+4808|0,168072)|0;f=k;c[18070]=f;c[18066]=(c[18066]|0)+150;l=f;m=c[k>>2]|0}c[l+8+(m<<5)>>2]=30;k=c[18070]|0;c[k>>2]=(c[k>>2]|0)+1;k=c[13898]|0;if((c[8272]|0)>(k|0)){d=k}else{e=3536;break}}if((e|0)==3539){return}else if((e|0)==3538){return}else if((e|0)==3536){return}else if((e|0)==3540){return}}function iA(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;iB();b=c[13898]|0;if((c[8272]|0)>(b|0)){d=b}else{return}L4795:while(1){b=c[1054]|0;if((a[b+(d*40&-1)|0]&1)==0){e=3555;break}f=c[b+(d*40&-1)+36>>2]|0;g=b+(d*40&-1)+32|0;b=c[10036]|0;h=0;while(1){if((h|0)>=(f|0)){break}if((a[b+((c[g>>2]|0)+h|0)|0]|0)==(a[h+154536|0]|0)){h=h+1|0}else{e=3556;break L4795}}if((h|0)!=2){e=3554;break}c[13898]=d+1;g=c[18070]|0;b=c[g>>2]|0;f=c[18066]|0;if((b|0)<(f|0)){i=g;j=b}else{k=db(g,(f<<5)+4808|0,168072)|0;f=k;c[18070]=f;c[18066]=(c[18066]|0)+150;i=f;j=c[k>>2]|0}c[i+8+(j<<5)>>2]=38;k=c[18070]|0;c[k>>2]=(c[k>>2]|0)+1;iB();k=c[18070]|0;c[k+8+(b<<5)+8>>2]=(c[k>>2]|0)-b;b=c[18070]|0;k=c[b>>2]|0;f=c[18066]|0;if((k|0)<(f|0)){l=b;m=k}else{k=db(b,(f<<5)+4808|0,168072)|0;f=k;c[18070]=f;c[18066]=(c[18066]|0)+150;l=f;m=c[k>>2]|0}c[l+8+(m<<5)>>2]=30;k=c[18070]|0;c[k>>2]=(c[k>>2]|0)+1;k=c[13898]|0;if((c[8272]|0)>(k|0)){d=k}else{e=3553;break}}if((e|0)==3554){return}else if((e|0)==3555){return}else if((e|0)==3553){return}else if((e|0)==3556){return}}function iB(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;iD();b=c[13898]|0;if((c[8272]|0)>(b|0)){d=b}else{return}L4817:while(1){b=c[1054]|0;if((a[b+(d*40&-1)|0]&1)==0){e=3572;break}f=c[b+(d*40&-1)+36>>2]|0;g=b+(d*40&-1)+32|0;b=c[10036]|0;h=0;while(1){if((h|0)>=(f|0)){break}if((a[b+((c[g>>2]|0)+h|0)|0]|0)==(a[h+151312|0]|0)){h=h+1|0}else{e=3571;break L4817}}if((h|0)!=1){e=3570;break}c[13898]=d+1;iD();g=c[18070]|0;b=c[g>>2]|0;f=c[18066]|0;if((b|0)<(f|0)){i=g;j=b}else{b=db(g,(f<<5)+4808|0,168072)|0;f=b;c[18070]=f;c[18066]=(c[18066]|0)+150;i=f;j=c[b>>2]|0}c[i+8+(j<<5)>>2]=14;b=c[18070]|0;c[b>>2]=(c[b>>2]|0)+1;b=c[13898]|0;if((c[8272]|0)>(b|0)){d=b}else{e=3568;break}}if((e|0)==3571){return}else if((e|0)==3572){return}else if((e|0)==3568){return}else if((e|0)==3570){return}}function iC(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;b=i;d=c[13898]|0;if((c[8272]|0)<=(d|0)){i=b;return}e=c[1054]|0;if((a[e+(d*40&-1)|0]&1)==0){i=b;return}f=c[e+(d*40&-1)+36>>2]|0;g=e+(d*40&-1)+32|0;e=c[10036]|0;h=0;while(1){if((h|0)>=(f|0)){break}if((a[e+((c[g>>2]|0)+h|0)|0]|0)==(a[h+216168|0]|0)){h=h+1|0}else{j=3603;break}}if((j|0)==3603){i=b;return}if((h|0)!=1){i=b;return}c[8230]=(c[8230]|0)-1;c[13898]=d+1;d=c[18070]|0;h=c[d>>2]|0;g=c[18066]|0;if((h|0)<(g|0)){k=d;l=h}else{e=db(d,(g<<5)+4808|0,168072)|0;g=e;c[18070]=g;c[18066]=(c[18066]|0)+150;k=g;l=c[e>>2]|0}c[k+8+(l<<5)>>2]=40;l=c[18070]|0;c[l>>2]=(c[l>>2]|0)+1;if((iy()|0)==0){c[8230]=(c[8230]|0)+1;iz();iC();c[8230]=(c[8230]|0)-1}l=c[13898]|0;if((c[8272]|0)<=(l|0)){uf(l,172040,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}k=c[1054]|0;if((a[k+(l*40&-1)|0]&1)==0){uf(l,172040,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=c[k+(l*40&-1)+36>>2]|0;g=k+(l*40&-1)+32|0;k=c[10036]|0;d=0;while(1){if((d|0)>=(e|0)){break}if((a[k+((c[g>>2]|0)+d|0)|0]|0)==(a[d+183584|0]|0)){d=d+1|0}else{j=3598;break}}if((j|0)==3598){uf(l,172040,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((d|0)!=1){uf(l,172040,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[13898]=l+1;l=c[18070]|0;d=c[l>>2]|0;j=c[18066]|0;if((d|0)<(j|0)){m=l;n=d}else{g=db(l,(j<<5)+4808|0,168072)|0;j=g;c[18070]=j;c[18066]=(c[18066]|0)+150;m=j;n=c[g>>2]|0}c[m+8+(n<<5)>>2]=37;n=c[18070]|0;c[n>>2]=(c[n>>2]|0)+1;n=c[18070]|0;c[n+8+(h<<5)+8>>2]=(c[n>>2]|0)-h;if((iy()|0)==0){c[8230]=(c[8230]|0)+1;iz();iC();c[8230]=(c[8230]|0)-1}h=c[18070]|0;c[h+8+(d<<5)+8>>2]=(c[h>>2]|0)-d;c[8230]=(c[8230]|0)+1;i=b;return}function iD(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;iE();b=c[13898]|0;if((c[8272]|0)>(b|0)){d=b}else{return}L4880:while(1){b=c[1054]|0;if((a[b+(d*40&-1)|0]&1)==0){e=3617;break}f=c[b+(d*40&-1)+36>>2]|0;g=b+(d*40&-1)+32|0;b=c[10036]|0;h=0;while(1){if((h|0)>=(f|0)){break}if((a[b+((c[g>>2]|0)+h|0)|0]|0)==(a[h+149504|0]|0)){h=h+1|0}else{e=3618;break L4880}}if((h|0)!=1){e=3616;break}c[13898]=d+1;iE();g=c[18070]|0;b=c[g>>2]|0;f=c[18066]|0;if((b|0)<(f|0)){i=g;j=b}else{b=db(g,(f<<5)+4808|0,168072)|0;f=b;c[18070]=f;c[18066]=(c[18066]|0)+150;i=f;j=c[b>>2]|0}c[i+8+(j<<5)>>2]=15;b=c[18070]|0;c[b>>2]=(c[b>>2]|0)+1;b=c[13898]|0;if((c[8272]|0)>(b|0)){d=b}else{e=3615;break}}if((e|0)==3616){return}else if((e|0)==3615){return}else if((e|0)==3618){return}else if((e|0)==3617){return}}function iE(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;iF();b=c[13898]|0;if((c[8272]|0)>(b|0)){d=b}else{return}L4899:while(1){b=c[1054]|0;if((a[b+(d*40&-1)|0]&1)==0){e=3632;break}f=c[b+(d*40&-1)+36>>2]|0;g=b+(d*40&-1)+32|0;b=c[10036]|0;h=0;while(1){if((h|0)>=(f|0)){break}if((a[b+((c[g>>2]|0)+h|0)|0]|0)==(a[h+147520|0]|0)){h=h+1|0}else{e=3630;break L4899}}if((h|0)!=1){e=3633;break}c[13898]=d+1;iF();g=c[18070]|0;b=c[g>>2]|0;f=c[18066]|0;if((b|0)<(f|0)){i=g;j=b}else{b=db(g,(f<<5)+4808|0,168072)|0;f=b;c[18070]=f;c[18066]=(c[18066]|0)+150;i=f;j=c[b>>2]|0}c[i+8+(j<<5)>>2]=16;b=c[18070]|0;c[b>>2]=(c[b>>2]|0)+1;b=c[13898]|0;if((c[8272]|0)>(b|0)){d=b}else{e=3634;break}}if((e|0)==3633){return}else if((e|0)==3632){return}else if((e|0)==3630){return}else if((e|0)==3634){return}}function iF(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;iI();iJ();iH();iG();L4916:while(1){b=c[13898]|0;d=(c[8272]|0)>(b|0);if(!d){e=3675;break}f=c[1054]|0;if((a[f+(b*40&-1)|0]&1)!=0){g=c[f+(b*40&-1)+36>>2]|0;h=f+(b*40&-1)+32|0;f=c[10036]|0;i=0;while(1){if((i|0)>=(g|0)){e=3641;break}if((a[f+((c[h>>2]|0)+i|0)|0]|0)==(a[i+145384|0]|0)){i=i+1|0}else{break}}do{if((e|0)==3641){e=0;if((i|0)!=2){break}c[13898]=b+1;iI();iJ();iH();iG();h=c[18070]|0;f=c[h>>2]|0;g=c[18066]|0;if((f|0)<(g|0)){j=h;k=f}else{f=db(h,(g<<5)+4808|0,168072)|0;g=f;c[18070]=g;c[18066]=(c[18066]|0)+150;j=g;k=c[f>>2]|0}c[j+8+(k<<5)>>2]=17;f=c[18070]|0;c[f>>2]=(c[f>>2]|0)+1;continue L4916}}while(0);if(!d){e=3674;break}}i=c[1054]|0;L4932:do{if((a[i+(b*40&-1)|0]&1)!=0){f=c[i+(b*40&-1)+36>>2]|0;g=i+(b*40&-1)+32|0;h=c[10036]|0;l=0;while(1){if((l|0)>=(f|0)){break}if((a[h+((c[g>>2]|0)+l|0)|0]|0)==(a[l+143464|0]|0)){l=l+1|0}else{break L4932}}if((l|0)!=2){break}c[13898]=b+1;iI();iJ();iH();iG();g=c[18070]|0;h=c[g>>2]|0;f=c[18066]|0;if((h|0)<(f|0)){m=g;n=h}else{h=db(g,(f<<5)+4808|0,168072)|0;f=h;c[18070]=f;c[18066]=(c[18066]|0)+150;m=f;n=c[h>>2]|0}c[m+8+(n<<5)>>2]=18;h=c[18070]|0;c[h>>2]=(c[h>>2]|0)+1;continue L4916}}while(0);if(!d){e=3673;break}i=c[1054]|0;if((a[i+(b*40&-1)|0]&1)!=0){h=c[i+(b*40&-1)+36>>2]|0;f=i+(b*40&-1)+32|0;i=c[10036]|0;g=0;while(1){if((g|0)>=(h|0)){e=3659;break}if((a[i+((c[f>>2]|0)+g|0)|0]|0)==(a[g+141992|0]|0)){g=g+1|0}else{break}}do{if((e|0)==3659){e=0;if((g|0)!=2){break}c[13898]=b+1;iI();iJ();iH();iG();f=c[18070]|0;i=c[f>>2]|0;h=c[18066]|0;if((i|0)<(h|0)){o=f;p=i}else{i=db(f,(h<<5)+4808|0,168072)|0;h=i;c[18070]=h;c[18066]=(c[18066]|0)+150;o=h;p=c[i>>2]|0}c[o+8+(p<<5)>>2]=33;i=c[18070]|0;c[i>>2]=(c[i>>2]|0)+1;continue L4916}}while(0);if(!d){e=3676;break}}g=c[1054]|0;if((a[g+(b*40&-1)|0]&1)==0){e=3677;break}i=c[g+(b*40&-1)+36>>2]|0;h=g+(b*40&-1)+32|0;g=c[10036]|0;f=0;while(1){if((f|0)>=(i|0)){break}if((a[g+((c[h>>2]|0)+f|0)|0]|0)==(a[f+140312|0]|0)){f=f+1|0}else{e=3678;break L4916}}if((f|0)!=2){e=3679;break}c[13898]=b+1;iI();iJ();iH();iG();h=c[18070]|0;g=c[h>>2]|0;i=c[18066]|0;if((g|0)<(i|0)){q=h;r=g}else{g=db(h,(i<<5)+4808|0,168072)|0;i=g;c[18070]=i;c[18066]=(c[18066]|0)+150;q=i;r=c[g>>2]|0}c[q+8+(r<<5)>>2]=34;g=c[18070]|0;c[g>>2]=(c[g>>2]|0)+1}if((e|0)==3679){return}else if((e|0)==3673){return}else if((e|0)==3674){return}else if((e|0)==3675){return}else if((e|0)==3676){return}else if((e|0)==3677){return}else if((e|0)==3678){return}}function iG(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;L4975:while(1){b=c[13898]|0;d=c[8272]|0;e=(d|0)>(b|0);if(!e){f=3726;break}g=c[1054]|0;if((a[g+(b*40&-1)|0]&1)!=0){h=c[g+(b*40&-1)+36>>2]|0;i=g+(b*40&-1)+32|0;g=c[10036]|0;j=0;while(1){if((j|0)>=(h|0)){f=3686;break}if((a[g+((c[i>>2]|0)+j|0)|0]|0)==(a[j+138304|0]|0)){j=j+1|0}else{break}}do{if((f|0)==3686){f=0;if((j|0)!=1){break}c[13898]=b+1;iI();iJ();iH();i=c[18070]|0;g=c[i>>2]|0;h=c[18066]|0;if((g|0)<(h|0)){k=i;l=g}else{g=db(i,(h<<5)+4808|0,168072)|0;h=g;c[18070]=h;c[18066]=(c[18066]|0)+150;k=h;l=c[g>>2]|0}c[k+8+(l<<5)>>2]=19;g=c[18070]|0;c[g>>2]=(c[g>>2]|0)+1;continue L4975}}while(0);if(!e){f=3729;break}}j=c[1054]|0;L4991:do{if((a[j+(b*40&-1)|0]&1)!=0){g=c[j+(b*40&-1)+36>>2]|0;h=j+(b*40&-1)+32|0;i=c[10036]|0;m=0;while(1){if((m|0)>=(g|0)){break}if((a[i+((c[h>>2]|0)+m|0)|0]|0)==(a[m+136608|0]|0)){m=m+1|0}else{break L4991}}if((m|0)!=1){break}h=b+1|0;L4998:do{if((a[25288]&1)!=0&(d|0)>(h|0)){if((a[j+(h*40&-1)|0]&1)==0){break}g=c[j+(h*40&-1)+36>>2]|0;n=j+(h*40&-1)+32|0;o=0;while(1){if((o|0)>=(g|0)){break}if((a[i+((c[n>>2]|0)+o|0)|0]|0)==(a[o+134808|0]|0)){o=o+1|0}else{break L4998}}if((o|0)==1){f=3728;break L4975}}}while(0);c[13898]=h;iI();iJ();iH();i=c[18070]|0;m=c[i>>2]|0;n=c[18066]|0;if((m|0)<(n|0)){p=i;q=m}else{m=db(i,(n<<5)+4808|0,168072)|0;n=m;c[18070]=n;c[18066]=(c[18066]|0)+150;p=n;q=c[m>>2]|0}c[p+8+(q<<5)>>2]=20;m=c[18070]|0;c[m>>2]=(c[m>>2]|0)+1;continue L4975}}while(0);if(!e){f=3730;break}j=c[1054]|0;if((a[j+(b*40&-1)|0]&1)!=0){d=c[j+(b*40&-1)+36>>2]|0;m=j+(b*40&-1)+32|0;j=c[10036]|0;n=0;while(1){if((n|0)>=(d|0)){f=3710;break}if((a[j+((c[m>>2]|0)+n|0)|0]|0)==(a[n+133312|0]|0)){n=n+1|0}else{break}}do{if((f|0)==3710){f=0;if((n|0)!=2){break}c[13898]=b+1;iI();iJ();iH();m=c[18070]|0;j=c[m>>2]|0;d=c[18066]|0;if((j|0)<(d|0)){r=m;s=j}else{j=db(m,(d<<5)+4808|0,168072)|0;d=j;c[18070]=d;c[18066]=(c[18066]|0)+150;r=d;s=c[j>>2]|0}c[r+8+(s<<5)>>2]=21;j=c[18070]|0;c[j>>2]=(c[j>>2]|0)+1;continue L4975}}while(0);if(!e){f=3727;break}}n=c[1054]|0;if((a[n+(b*40&-1)|0]&1)==0){f=3731;break}j=c[n+(b*40&-1)+36>>2]|0;d=n+(b*40&-1)+32|0;n=c[10036]|0;m=0;while(1){if((m|0)>=(j|0)){break}if((a[n+((c[d>>2]|0)+m|0)|0]|0)==(a[m+131928|0]|0)){m=m+1|0}else{f=3724;break L4975}}if((m|0)!=2){f=3725;break}c[13898]=b+1;iI();iJ();iH();d=c[18070]|0;n=c[d>>2]|0;j=c[18066]|0;if((n|0)<(j|0)){t=d;u=n}else{n=db(d,(j<<5)+4808|0,168072)|0;j=n;c[18070]=j;c[18066]=(c[18066]|0)+150;t=j;u=c[n>>2]|0}c[t+8+(u<<5)>>2]=22;n=c[18070]|0;c[n>>2]=(c[n>>2]|0)+1}if((f|0)==3726){return}else if((f|0)==3727){return}else if((f|0)==3728){return}else if((f|0)==3724){return}else if((f|0)==3725){return}else if((f|0)==3729){return}else if((f|0)==3730){return}else if((f|0)==3731){return}}function iH(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;L5043:while(1){b=c[13898]|0;d=(c[8272]|0)>(b|0);L5045:do{if(d){e=c[1054]|0;if((a[e+(b*40&-1)|0]&1)==0){break}f=c[e+(b*40&-1)+36>>2]|0;g=e+(b*40&-1)+32|0;e=c[10036]|0;h=0;while(1){if((h|0)>=(f|0)){break}if((a[e+((c[g>>2]|0)+h|0)|0]|0)==(a[h+202200|0]|0)){h=h+1|0}else{break L5045}}if((h|0)!=1){break}c[13898]=b+1;iI();iJ();g=c[18070]|0;e=c[g>>2]|0;f=c[18066]|0;if((e|0)<(f|0)){i=g;j=e}else{e=db(g,(f<<5)+4808|0,168072)|0;f=e;c[18070]=f;c[18066]=(c[18066]|0)+150;i=f;j=c[e>>2]|0}c[i+8+(j<<5)>>2]=32;e=c[18070]|0;c[e>>2]=(c[e>>2]|0)+1;continue L5043}}while(0);if(a[14176]&(c[8230]|0)==1|d^1){k=3763;break}e=c[1054]|0;if((a[e+(b*40&-1)|0]&1)!=0){f=c[e+(b*40&-1)+36>>2]|0;g=e+(b*40&-1)+32|0;e=c[10036]|0;l=0;while(1){if((l|0)>=(f|0)){k=3747;break}if((a[e+((c[g>>2]|0)+l|0)|0]|0)==(a[l+129568|0]|0)){l=l+1|0}else{break}}do{if((k|0)==3747){k=0;if((l|0)!=1){break}c[13898]=b+1;iI();iJ();g=c[18070]|0;e=c[g>>2]|0;f=c[18066]|0;if((e|0)<(f|0)){m=g;n=e}else{e=db(g,(f<<5)+4808|0,168072)|0;f=e;c[18070]=f;c[18066]=(c[18066]|0)+150;m=f;n=c[e>>2]|0}c[m+8+(n<<5)>>2]=23;e=c[18070]|0;c[e>>2]=(c[e>>2]|0)+1;continue L5043}}while(0);if(!d){k=3764;break}}l=c[1054]|0;if((a[l+(b*40&-1)|0]&1)==0){k=3765;break}e=c[l+(b*40&-1)+36>>2]|0;f=l+(b*40&-1)+32|0;l=c[10036]|0;g=0;while(1){if((g|0)>=(e|0)){break}if((a[l+((c[f>>2]|0)+g|0)|0]|0)==(a[g+202112|0]|0)){g=g+1|0}else{k=3761;break L5043}}if((g|0)!=1){k=3762;break}c[13898]=b+1;iI();iJ();f=c[18070]|0;l=c[f>>2]|0;e=c[18066]|0;if((l|0)<(e|0)){o=f;p=l}else{l=db(f,(e<<5)+4808|0,168072)|0;e=l;c[18070]=e;c[18066]=(c[18066]|0)+150;o=e;p=c[l>>2]|0}c[o+8+(p<<5)>>2]=24;l=c[18070]|0;c[l>>2]=(c[l>>2]|0)+1}if((k|0)==3762){return}else if((k|0)==3763){return}else if((k|0)==3761){return}else if((k|0)==3764){return}else if((k|0)==3765){return}}function iI(){var b=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0,aA=0,aB=0,aC=0,aD=0,aE=0,aF=0,aG=0,aH=0,aI=0,aJ=0,aK=0,aL=0,aM=0,aN=0,aO=0,aP=0;b=i;i=i+104|0;e=b|0;f=b+56|0;g=b+72|0;h=b+88|0;j=c[13898]|0;k=(c[8272]|0)>(j|0);L5087:do{if(k){l=c[1054]|0;if((a[l+(j*40&-1)|0]&1)!=0){m=c[l+(j*40&-1)+36>>2]|0;n=l+(j*40&-1)+32|0;l=c[10036]|0;o=0;while(1){if((o|0)>=(m|0)){p=3771;break}if((a[l+((c[n>>2]|0)+o|0)|0]|0)==(a[o+124624|0]|0)){o=o+1|0}else{break}}do{if((p|0)==3771){if((o|0)!=1){break}c[13898]=j+1;iI();n=c[18070]|0;l=c[n>>2]|0;m=c[18066]|0;if((l|0)<(m|0)){q=n;r=l}else{l=db(n,(m<<5)+4808|0,168072)|0;m=l;c[18070]=m;c[18066]=(c[18066]|0)+150;q=m;r=c[l>>2]|0}c[q+8+(r<<5)>>2]=9;l=c[18070]|0;c[l>>2]=(c[l>>2]|0)+1;i=b;return}}while(0);if(!k){break}}o=c[1054]|0;L5103:do{if((a[o+(j*40&-1)|0]&1)!=0){l=c[o+(j*40&-1)+36>>2]|0;m=o+(j*40&-1)+32|0;n=c[10036]|0;s=0;while(1){if((s|0)>=(l|0)){break}if((a[n+((c[m>>2]|0)+s|0)|0]|0)==(a[s+123264|0]|0)){s=s+1|0}else{break L5103}}if((s|0)!=1){break}c[13898]=j+1;iI();m=c[18070]|0;n=c[m>>2]|0;l=c[18066]|0;if((n|0)<(l|0)){t=m;u=n}else{n=db(m,(l<<5)+4808|0,168072)|0;l=n;c[18070]=l;c[18066]=(c[18066]|0)+150;t=l;u=c[n>>2]|0}c[t+8+(u<<5)>>2]=10;n=c[18070]|0;c[n>>2]=(c[n>>2]|0)+1;i=b;return}}while(0);if(!k){break}o=c[1054]|0;if((a[o+(j*40&-1)|0]&1)!=0){n=c[o+(j*40&-1)+36>>2]|0;l=o+(j*40&-1)+32|0;o=c[10036]|0;m=0;while(1){if((m|0)>=(n|0)){p=3789;break}if((a[o+((c[l>>2]|0)+m|0)|0]|0)==(a[m+202112|0]|0)){m=m+1|0}else{break}}do{if((p|0)==3789){if((m|0)!=1){break}c[13898]=j+1;iI();l=c[18070]|0;o=c[l>>2]|0;n=c[18066]|0;if((o|0)<(n|0)){w=l;x=o}else{o=db(l,(n<<5)+4808|0,168072)|0;n=o;c[18070]=n;c[18066]=(c[18066]|0)+150;w=n;x=c[o>>2]|0}c[w+8+(x<<5)>>2]=11;o=c[18070]|0;c[o>>2]=(c[o>>2]|0)+1;i=b;return}}while(0);if(!k){break}}m=c[1054]|0;if((a[m+(j*40&-1)|0]&1)==0){break}o=c[m+(j*40&-1)+36>>2]|0;n=m+(j*40&-1)+32|0;m=c[10036]|0;l=0;while(1){if((l|0)>=(o|0)){break}if((a[m+((c[n>>2]|0)+l|0)|0]|0)==(a[l+129568|0]|0)){l=l+1|0}else{break L5087}}if((l|0)!=1){break}c[13898]=j+1;iI();i=b;return}}while(0);x=f|0;f=g|0;g=h|0;L5138:do{if(k){h=c[1054]|0;if((a[h+(j*40&-1)|0]&1)!=0){w=c[h+(j*40&-1)+36>>2]|0;u=h+(j*40&-1)+32|0;h=c[10036]|0;t=0;while(1){if((t|0)>=(w|0)){p=3805;break}if((a[h+((c[u>>2]|0)+t|0)|0]|0)==(a[t+199040|0]|0)){t=t+1|0}else{break}}do{if((p|0)==3805){if((t|0)!=1){break}c[13898]=j+1;if((iy()|0)==0){c[8230]=(c[8230]|0)+1;iz();iC();c[8230]=(c[8230]|0)-1}u=c[13898]|0;h=c[8272]|0;L5151:do{if((h|0)>(u|0)){w=u;l=h;while(1){r=c[1054]|0;if((a[r+(w*40&-1)|0]&1)==0){y=w;z=l;break L5151}q=c[r+(w*40&-1)+36>>2]|0;n=r+(w*40&-1)+32|0;r=c[10036]|0;m=0;while(1){if((m|0)>=(q|0)){break}if((a[r+((c[n>>2]|0)+m|0)|0]|0)==(a[m+148464|0]|0)){m=m+1|0}else{y=w;z=l;break L5151}}if((m|0)!=1){y=w;z=l;break L5151}c[13898]=w+1;n=c[18070]|0;r=c[n>>2]|0;q=c[18066]|0;if((r|0)<(q|0)){A=n;B=r}else{r=db(n,(q<<5)+4808|0,168072)|0;q=r;c[18070]=q;c[18066]=(c[18066]|0)+150;A=q;B=c[r>>2]|0}c[A+8+(B<<5)>>2]=5;r=c[18070]|0;c[r>>2]=(c[r>>2]|0)+1;if((iy()|0)==0){c[8230]=(c[8230]|0)+1;iz();iC();c[8230]=(c[8230]|0)-1}r=c[13898]|0;q=c[8272]|0;if((q|0)>(r|0)){w=r;l=q}else{y=r;z=q;break}}}else{y=u;z=h}}while(0);if((z|0)<=(y|0)){uf(y,116056,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}h=c[1054]|0;if((a[h+(y*40&-1)|0]&1)==0){uf(y,116056,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}u=c[h+(y*40&-1)+36>>2]|0;s=h+(y*40&-1)+32|0;h=c[10036]|0;l=0;while(1){if((l|0)>=(u|0)){break}if((a[h+((c[s>>2]|0)+l|0)|0]|0)==(a[l+131272|0]|0)){l=l+1|0}else{p=4123;break}}if((p|0)==4123){uf(y,116056,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((l|0)==1){c[13898]=y+1;break L5138}else{uf(y,116056,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);if(!k){p=3828;break}}t=c[1054]|0;s=a[t+(j*40&-1)|0]|0;if((s&1)==0){C=t;D=s;p=3843;break}h=c[t+(j*40&-1)+36>>2]|0;u=t+(j*40&-1)+32|0;w=c[10036]|0;q=0;while(1){if((q|0)>=(h|0)){break}if((a[w+((c[u>>2]|0)+q|0)|0]|0)==(a[q+180784|0]|0)){q=q+1|0}else{C=t;D=s;p=3843;break L5138}}if((q|0)!=1){C=t;D=s;p=3843;break}u=j+1|0;c[13898]=u;if((a[t+(u*40&-1)|0]&1)!=0){uf(u,114232,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}w=j+2|0;c[13898]=w;h=t+(u*40&-1)+8|0;r=h;n=c[h>>2]|0;h=c[r+4>>2]|0;o=c[t+(u*40&-1)+16>>2]|0;u=r+12|0;c[x>>2]=c[u>>2];c[x+4>>2]=c[u+4>>2];c[x+8>>2]=c[u+8>>2];if((n|0)!=1|(o|0)<0){uf(w,110760,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((c[18068]|0)<(o|0)){c[18068]=o}w=c[18070]|0;n=c[w>>2]|0;u=c[18066]|0;if((n|0)<(u|0)){E=w;F=n}else{n=db(w,(u<<5)+4808|0,168072)|0;u=n;c[18070]=u;c[18066]=(c[18066]|0)+150;E=u;F=c[n>>2]|0}c[E+8+(F<<5)>>2]=31;n=c[18070]|0;u=c[n>>2]|0;c[n>>2]=u+1;n=c[18070]|0;w=n+8+(u<<5)+8|0;r=w;c[w>>2]=1;c[r+4>>2]=h;c[n+8+(u<<5)+16>>2]=o;o=r+12|0;c[o>>2]=c[x>>2];c[o+4>>2]=c[x+4>>2];c[o+8>>2]=c[x+8>>2]}else{p=3828}}while(0);if((p|0)==3828){x=c[1054]|0;C=x;D=a[x+(j*40&-1)|0]|0;p=3843}L5204:do{if((p|0)==3843){if((D&1)==0){x=c[18070]|0;F=c[x>>2]|0;E=c[18066]|0;if((F|0)<(E|0)){G=x;H=F}else{F=db(x,(E<<5)+4808|0,168072)|0;E=F;c[18070]=E;c[18066]=(c[18066]|0)+150;G=E;H=c[F>>2]|0}c[G+8+(H<<5)>>2]=1;F=c[18070]|0;E=c[F>>2]|0;c[F>>2]=E+1;F=(c[18070]|0)+8+(E<<5)+8|0;E=(c[1054]|0)+((c[13898]|0)*40&-1)+8|0;c[F>>2]=c[E>>2];c[F+4>>2]=c[E+4>>2];c[F+8>>2]=c[E+8>>2];c[F+12>>2]=c[E+12>>2];c[F+16>>2]=c[E+16>>2];c[F+20>>2]=c[E+20>>2];c[13898]=(c[13898]|0)+1;break}do{if((bO(d[(c[10036]|0)+(c[C+(j*40&-1)+32>>2]|0)|0]|0|0)|0)==0){E=c[1054]|0;F=c[10036]|0;x=c[13898]|0;if((a[F+(c[E+(j*40&-1)+32>>2]|0)|0]|0)==95){I=x;break}if((a[E+(x*40&-1)|0]&1)==0){uf(x,104392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}k=a[F+(c[E+(x*40&-1)+32>>2]|0)|0]|0;if(!((k<<24>>24|0)==39|(k<<24>>24|0)==34)){uf(x,104392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}x=c[18070]|0;k=c[x>>2]|0;E=c[18066]|0;if((k|0)<(E|0)){J=x;K=k}else{k=db(x,(E<<5)+4808|0,168072)|0;E=k;c[18070]=E;c[18066]=(c[18066]|0)+150;J=E;K=c[k>>2]|0}c[J+8+(K<<5)>>2]=1;k=c[18070]|0;E=c[k>>2]|0;c[k>>2]=E+1;k=c[18070]|0;c[k+8+(E<<5)+8>>2]=3;x=k+8+(E<<5)+16|0;c[x>>2]=0;E=c[13898]|0;ub(x,E,E);c[13898]=(c[13898]|0)+1;break L5204}else{I=c[13898]|0}}while(0);t=I+1|0;s=c[8272]|0;q=(s|0)>(t|0);L5226:do{if(q){E=c[1054]|0;if((a[E+(t*40&-1)|0]&1)==0){break}x=c[E+(t*40&-1)+36>>2]|0;k=E+(t*40&-1)+32|0;F=c[10036]|0;y=0;while(1){if((y|0)>=(x|0)){break}if((a[F+((c[k>>2]|0)+y|0)|0]|0)==(a[y+199040|0]|0)){y=y+1|0}else{break L5226}}if((y|0)!=1){break}k=(s|0)>(I|0);x=E+(I*40&-1)|0;l=E+(I*40&-1)+36|0;z=E+(I*40&-1)+32|0;B=41;L5234:while(1){A=c[41160+(B<<3)>>2]|0;L5236:do{if(k){if((a[x]&1)==0){break}o=c[l>>2]|0;r=0;while(1){if((r|0)>=(o|0)){break}if((a[F+((c[z>>2]|0)+r|0)|0]|0)==(a[A+r|0]|0)){r=r+1|0}else{break L5236}}if((a[A+r|0]|0)==0){L=B;break L5234}}}while(0);A=B+1|0;if((A|0)==117){L=0;break}else{B=A}}c[13898]=I+2;if((iy()|0)==0){c[8230]=(c[8230]|0)+1;iz();iC();c[8230]=(c[8230]|0)-1}B=c[13898]|0;z=c[8272]|0;F=(z|0)>(B|0);if((L|0)==0){L5250:do{if(F){l=c[1054]|0;x=a[l+(B*40&-1)|0]|0;if((x&1)==0){M=6;N=B;O=z;break}k=c[l+(B*40&-1)+36>>2]|0;E=l+(B*40&-1)+32|0;y=c[10036]|0;A=0;while(1){if((A|0)>=(k|0)){break}if((a[y+((c[E>>2]|0)+A|0)|0]|0)==(a[A+148464|0]|0)){A=A+1|0}else{M=6;N=B;O=z;break L5250}}if((A|0)==1){P=1;Q=B;R=l;S=x}else{M=6;N=B;O=z;break}L5257:while(1){if((S&1)==0){T=P;break}E=c[R+(Q*40&-1)+36>>2]|0;y=R+(Q*40&-1)+32|0;k=c[10036]|0;o=0;while(1){if((o|0)>=(E|0)){break}if((a[k+((c[y>>2]|0)+o|0)|0]|0)==(a[o+148464|0]|0)){o=o+1|0}else{T=P;break L5257}}if((o|0)!=1){T=P;break}y=P+1|0;c[13898]=Q+1;if((iy()|0)==0){c[8230]=(c[8230]|0)+1;iz();iC();c[8230]=(c[8230]|0)-1}k=c[13898]|0;if((c[8272]|0)<=(k|0)){T=y;break}E=c[1054]|0;P=y;Q=k;R=E;S=a[E+(k*40&-1)|0]|0}x=c[18070]|0;l=c[x>>2]|0;A=c[18066]|0;if((l|0)<(A|0)){U=x;V=l}else{l=db(x,(A<<5)+4808|0,168072)|0;A=l;c[18070]=A;c[18066]=(c[18066]|0)+150;U=A;V=c[l>>2]|0}c[U+8+(V<<5)>>2]=1;l=c[18070]|0;A=c[l>>2]|0;c[l>>2]=A+1;l=c[18070]|0;x=l+8+(A<<5)+8|0;c[x>>2]=1;c[l+8+(A<<5)+16>>2]=T;A=x+12|0;c[A>>2]=c[f>>2];c[A+4>>2]=c[f+4>>2];c[A+8>>2]=c[f+8>>2];M=7;N=c[13898]|0;O=c[8272]|0}else{M=6;N=B;O=z}}while(0);if((O|0)<=(N|0)){uf(N,116056,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}A=c[1054]|0;if((a[A+(N*40&-1)|0]&1)==0){uf(N,116056,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}x=c[A+(N*40&-1)+36>>2]|0;l=A+(N*40&-1)+32|0;A=c[10036]|0;k=0;while(1){if((k|0)>=(x|0)){break}if((a[A+((c[l>>2]|0)+k|0)|0]|0)==(a[k+131272|0]|0)){k=k+1|0}else{p=4154;break}}if((p|0)==4154){uf(N,116056,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((k|0)!=1){uf(N,116056,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[13898]=N+1;l=iv(I)|0;A=c[18070]|0;x=c[A>>2]|0;E=c[18066]|0;if((x|0)<(E|0)){W=A;X=x}else{x=db(A,(E<<5)+4808|0,168072)|0;E=x;c[18070]=E;c[18066]=(c[18066]|0)+150;W=E;X=c[x>>2]|0}c[W+8+(X<<5)>>2]=M;x=c[18070]|0;E=c[x>>2]|0;c[x>>2]=E+1;c[(c[18070]|0)+8+(E<<5)+8>>2]=l;break L5204}L5293:do{if(F){l=1;E=B;x=z;while(1){A=c[1054]|0;if((a[A+(E*40&-1)|0]&1)==0){Y=E;Z=l;_=x;break L5293}y=c[A+(E*40&-1)+36>>2]|0;r=A+(E*40&-1)+32|0;A=c[10036]|0;m=0;while(1){if((m|0)>=(y|0)){break}if((a[A+((c[r>>2]|0)+m|0)|0]|0)==(a[m+148464|0]|0)){m=m+1|0}else{Y=E;Z=l;_=x;break L5293}}if((m|0)!=1){Y=E;Z=l;_=x;break L5293}c[13898]=E+1;r=l+1|0;if((iy()|0)==0){c[8230]=(c[8230]|0)+1;iz();iC();c[8230]=(c[8230]|0)-1}A=c[13898]|0;y=c[8272]|0;if((y|0)>(A|0)){l=r;E=A;x=y}else{Y=A;Z=r;_=y;break}}}else{Y=B;Z=1;_=z}}while(0);if((_|0)<=(Y|0)){uf(Y,116056,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}z=c[1054]|0;if((a[z+(Y*40&-1)|0]&1)==0){uf(Y,116056,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}B=c[z+(Y*40&-1)+36>>2]|0;F=z+(Y*40&-1)+32|0;z=c[10036]|0;k=0;while(1){if((k|0)>=(B|0)){break}if((a[z+((c[F>>2]|0)+k|0)|0]|0)==(a[k+131272|0]|0)){k=k+1|0}else{p=4166;break}}if((p|0)==4166){uf(Y,116056,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((k|0)!=1){uf(Y,116056,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[13898]=Y+1;F=c[41160+(L<<3)>>2]|0;if((aY(F|0,107968)|0)==0){z=c[18070]|0;B=c[z>>2]|0;x=c[18066]|0;if((B|0)<(x|0)){$=z;aa=B}else{B=db(z,(x<<5)+4808|0,168072)|0;x=B;c[18070]=x;c[18066]=(c[18066]|0)+150;$=x;aa=c[B>>2]|0}c[$+8+(aa<<5)>>2]=1;B=c[18070]|0;x=c[B>>2]|0;c[B>>2]=x+1;B=c[18070]|0;z=B+8+(x<<5)+8|0;c[z>>2]=1;c[B+8+(x<<5)+16>>2]=Z;x=z+12|0;c[x>>2]=c[f>>2];c[x+4>>2]=c[f+4>>2];c[x+8>>2]=c[f+8>>2]}if((aY(F|0,106992)|0)==0){x=c[18070]|0;z=c[x>>2]|0;B=c[18066]|0;if((z|0)<(B|0)){ab=x;ac=z}else{z=db(x,(B<<5)+4808|0,168072)|0;B=z;c[18070]=B;c[18066]=(c[18066]|0)+150;ab=B;ac=c[z>>2]|0}c[ab+8+(ac<<5)>>2]=1;z=c[18070]|0;B=c[z>>2]|0;c[z>>2]=B+1;z=c[18070]|0;x=z+8+(B<<5)+8|0;c[x>>2]=1;c[z+8+(B<<5)+16>>2]=-1;B=x+12|0;c[B>>2]=c[f>>2];c[B+4>>2]=c[f+4>>2];c[B+8>>2]=c[f+8>>2]}B=(aY(F|0,106056)|0)==0;F=c[18070]|0;do{if(B){x=(c[F>>2]|0)-1|0;z=F+8+(x<<5)|0;E=c[z>>2]|0;if((E|0)==1){l=c[F+8+(x<<5)+8>>2]|0;if((l|0)==3){a[32928]=1;break}else if((l|0)!=1){break}l=c[F+8+(x<<5)+16>>2]|0;if((c[18068]|0)>=(l|0)){break}c[18068]=l;ad=c[z>>2]|0}else{ad=E}if((ad|0)!=0){break}E=c[F+8+(x<<5)+8>>2]|0;if((c[E+16>>2]|0)!=1){break}x=c[E+24>>2]|0;if((c[18068]|0)>=(x|0)){break}c[18068]=x}}while(0);B=c[F>>2]|0;k=c[18066]|0;if((B|0)<(k|0)){ae=F;af=B}else{B=db(F,(k<<5)+4808|0,168072)|0;k=B;c[18070]=k;c[18066]=(c[18066]|0)+150;ae=k;af=c[B>>2]|0}c[ae+8+(af<<5)>>2]=L;B=c[18070]|0;c[B>>2]=(c[B>>2]|0)+1;break L5204}}while(0);B=(s|0)>(I|0);L5350:do{if(B){k=c[1054]|0;if((a[k+(I*40&-1)|0]&1)==0){break}x=c[k+(I*40&-1)+36>>2]|0;E=k+(I*40&-1)+32|0;z=c[10036]|0;l=0;while(1){if((l|0)>=(x|0)){break}if((a[z+((c[E>>2]|0)+l|0)|0]|0)==(a[l+104152|0]|0)){l=l+1|0}else{break L5350}}if((l|0)!=3|q^1){break}if((a[k+(t*40&-1)|0]&1)==0){break}E=c[k+(t*40&-1)+36>>2]|0;x=k+(t*40&-1)+32|0;F=0;while(1){if((F|0)>=(E|0)){break}if((a[z+((c[x>>2]|0)+F|0)|0]|0)==(a[F+78280|0]|0)){F=F+1|0}else{break L5350}}if((F|0)!=1){break}x=I+2|0;c[13898]=x;if((a[k+(x*40&-1)|0]&1)==0){ag=x;uf(ag,100792,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}do{if((bO(d[z+(c[k+(x*40&-1)+32>>2]|0)|0]|0|0)|0)==0){E=c[1054]|0;l=c[13898]|0;if((a[(c[10036]|0)+(c[E+(x*40&-1)+32>>2]|0)|0]|0)==95){ah=l;ai=E;break}else{ag=l}uf(ag,100792,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{ah=c[13898]|0;ai=c[1054]|0}}while(0);x=c[ai+(ah*40&-1)+36>>2]|0;k=x+(c[ai+(ah*40&-1)+32>>2]|0)|0;z=db(0,x+1|0,116456)|0;x=c[(c[1054]|0)+(ah*40&-1)+32>>2]|0;L5372:do{if((x|0)<(k|0)){F=x;l=z;while(1){E=a[(c[10036]|0)+F|0]|0;if(E<<24>>24==0){aj=l;break L5372}y=l+1|0;a[l]=E;E=F+1|0;if((E|0)<(k|0)){F=E;l=y}else{aj=y;break}}}else{aj=z}}while(0);a[aj]=0;k=c[13898]|0;x=e|0;l=c[1054]|0;F=c[l+(k*40&-1)+36>>2]|0;y=(F|0)>49?49:F;F=c[10036]|0;E=c[l+(k*40&-1)+32>>2]|0;k=0;while(1){l=k+1|0;a[e+k|0]=a[F+E|0]|0;if((l|0)==(y|0)){break}else{E=E+1|0;k=l}}a[e+y|0]=0;e6(x);k=c[18070]|0;E=c[k>>2]|0;F=c[18066]|0;if((E|0)<(F|0)){ak=k;al=E}else{E=db(k,(F<<5)+4808|0,168072)|0;F=E;c[18070]=F;c[18066]=(c[18066]|0)+150;ak=F;al=c[E>>2]|0}c[ak+8+(al<<5)>>2]=1;E=c[18070]|0;F=c[E>>2]|0;c[E>>2]=F+1;E=c[18070]|0;c[E+8+(F<<5)+8>>2]=3;c[E+8+(F<<5)+16>>2]=z;F=c[13898]|0;E=F+1|0;c[13898]=E;if((c[8272]|0)<=(E|0)){uf(E,100792,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}k=c[1054]|0;if((a[k+(E*40&-1)|0]&1)==0){uf(E,100792,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}l=c[k+(E*40&-1)+36>>2]|0;r=k+(E*40&-1)+32|0;k=c[10036]|0;A=0;while(1){if((A|0)>=(l|0)){break}if((a[k+((c[r>>2]|0)+A|0)|0]|0)==(a[A+115e3|0]|0)){A=A+1|0}else{p=4127;break}}if((p|0)==4127){uf(E,100792,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((A|0)!=1){uf(E,100792,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[13898]=F+2;if((iy()|0)==0){c[8230]=(c[8230]|0)+1;iz();iC();c[8230]=(c[8230]|0)-1}r=c[13898]|0;if((c[8272]|0)<=(r|0)){uf(r,100792,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}k=c[1054]|0;if((a[k+(r*40&-1)|0]&1)==0){uf(r,100792,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}l=c[k+(r*40&-1)+36>>2]|0;z=k+(r*40&-1)+32|0;k=c[10036]|0;x=0;while(1){if((x|0)>=(l|0)){break}if((a[k+((c[z>>2]|0)+x|0)|0]|0)==(a[x+183584|0]|0)){x=x+1|0}else{p=4133;break}}if((p|0)==4133){uf(r,100792,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((x|0)!=1){uf(r,100792,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[13898]=r+1;if((iy()|0)==0){c[8230]=(c[8230]|0)+1;iz();iC();c[8230]=(c[8230]|0)-1}z=c[13898]|0;if((c[8272]|0)<=(z|0)){uf(z,100792,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}k=c[1054]|0;if((a[k+(z*40&-1)|0]&1)==0){uf(z,100792,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}l=c[k+(z*40&-1)+36>>2]|0;F=k+(z*40&-1)+32|0;k=c[10036]|0;E=0;while(1){if((E|0)>=(l|0)){break}if((a[k+((c[F>>2]|0)+E|0)|0]|0)==(a[E+78864|0]|0)){E=E+1|0}else{p=4162;break}}if((p|0)==4162){uf(z,100792,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((E|0)!=1){uf(z,100792,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[13898]=z+1;F=c[18070]|0;k=c[18066]|0;c[18070]=0;l=ut(312)|0;do{if((l|0)==0){gk();r=ut(312)|0;if((r|0)!=0){am=r;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=104152,v)|0)}else{am=l}}while(0);c[am>>2]=0;c[am+4>>2]=0;it();l=c[18070]|0;c[am+8>>2]=db(l,c[l>>2]<<5|8,105624)|0;c[am+12>>2]=0;c[am+16>>2]=0;c[am+24>>2]=1;c[am+32>>2]=0;c[am+48>>2]=1;c[am+56>>2]=0;c[am+72>>2]=1;c[am+80>>2]=0;c[am+96>>2]=1;c[am+104>>2]=0;c[am+120>>2]=1;c[am+128>>2]=0;c[am+144>>2]=1;c[am+152>>2]=0;c[am+168>>2]=1;c[am+176>>2]=0;c[am+192>>2]=1;c[am+200>>2]=0;c[am+216>>2]=1;c[am+224>>2]=0;c[am+240>>2]=1;c[am+248>>2]=0;c[am+264>>2]=1;c[am+272>>2]=0;c[am+288>>2]=1;c[am+296>>2]=0;c[18070]=F;c[18066]=k;l=c[F>>2]|0;if((l|0)<(k|0)){an=F;ao=l}else{l=db(F,(k<<5)+4808|0,168072)|0;z=l;c[18070]=z;c[18066]=(c[18066]|0)+150;an=z;ao=c[l>>2]|0}c[an+8+(ao<<5)>>2]=8;l=c[18070]|0;z=c[l>>2]|0;c[l>>2]=z+1;c[(c[18070]|0)+8+(z<<5)+8>>2]=am;break L5204}}while(0);q=c[11670]|0;if((q|0)==0){s=e|0;z=c[1054]|0;l=c[z+(I*40&-1)+36>>2]|0;E=(l|0)>49?49:l;l=c[10036]|0;r=c[z+(I*40&-1)+32>>2]|0;z=0;while(1){x=z+1|0;a[e+z|0]=a[l+r|0]|0;if((x|0)==(E|0)){break}else{r=r+1|0;z=x}}a[e+E|0]=0;z=e6(s)|0;r=c[18070]|0;l=c[r>>2]|0;x=c[18066]|0;if((l|0)<(x|0)){ap=r;aq=l}else{l=db(r,(x<<5)+4808|0,168072)|0;x=l;c[18070]=x;c[18066]=(c[18066]|0)+150;ap=x;aq=c[l>>2]|0}c[ap+8+(aq<<5)>>2]=0;l=c[18070]|0;x=c[l>>2]|0;c[l>>2]=x+1;c[(c[18070]|0)+8+(x<<5)+8>>2]=z;c[13898]=(c[13898]|0)+1;break}L5451:do{if(B){z=c[1054]|0;if((a[z+(I*40&-1)|0]&1)!=0){x=c[z+(I*40&-1)+36>>2]|0;l=z+(I*40&-1)+32|0;z=c[10036]|0;r=0;while(1){if((r|0)>=(x|0)){p=3992;break}if((a[z+((c[l>>2]|0)+r|0)|0]|0)==(a[r+55600|0]|0)){r=r+1|0}else{break}}do{if((p|0)==3992){if((a[r+55600|0]|0)!=0){break}c[13898]=t;l=c[18070]|0;z=c[l>>2]|0;x=c[18066]|0;if((z|0)<(x|0)){ar=l;as=z}else{z=db(l,(x<<5)+4808|0,168072)|0;x=z;c[18070]=x;c[18066]=(c[18066]|0)+150;ar=x;as=c[z>>2]|0}c[ar+8+(as<<5)>>2]=2;z=c[18070]|0;x=c[z>>2]|0;c[z>>2]=x+1;c[(c[18070]|0)+8+(x<<5)+8>>2]=q;break L5204}}while(0);if(!B){p=3997;break}}r=c[1054]|0;if((a[r+(I*40&-1)|0]&1)==0){at=r;break}x=c[r+(I*40&-1)+36>>2]|0;z=r+(I*40&-1)+32|0;l=c[10036]|0;k=0;while(1){if((k|0)>=(x|0)){break}if((a[l+((c[z>>2]|0)+k|0)|0]|0)==(a[k+55651|0]|0)){k=k+1|0}else{at=r;break L5451}}if((a[k+55651|0]|0)!=0){at=r;break}c[13898]=t;z=c[18070]|0;l=c[z>>2]|0;x=c[18066]|0;if((l|0)<(x|0)){au=z;av=l}else{l=db(z,(x<<5)+4808|0,168072)|0;x=l;c[18070]=x;c[18066]=(c[18066]|0)+150;au=x;av=c[l>>2]|0}c[au+8+(av<<5)>>2]=3;l=c[18070]|0;x=c[l>>2]|0;c[l>>2]=x+1;c[(c[18070]|0)+8+(x<<5)+8>>2]=q;break L5204}else{p=3997}}while(0);if((p|0)==3997){at=c[1054]|0}q=c[10036]|0;s=2;L5478:while(1){L5480:do{if(B){if((a[at+(I*40&-1)|0]&1)==0){break}E=c[at+(I*40&-1)+36>>2]|0;x=at+(I*40&-1)+32|0;l=0;while(1){if((l|0)>=(E|0)){break}if((a[q+((c[x>>2]|0)+l|0)|0]|0)==(a[55600+(s*51&-1)+l|0]|0)){l=l+1|0}else{break L5480}}if((a[55600+(s*51&-1)+l|0]|0)==0){p=4013;break L5478}}}while(0);r=s+1|0;if((r|0)<12){s=r}else{p=4019;break}}if((p|0)==4019){B=e|0;r=c[at+(I*40&-1)+36>>2]|0;k=(r|0)>49?49:r;r=c[at+(I*40&-1)+32>>2]|0;x=0;while(1){E=x+1|0;a[e+x|0]=a[q+r|0]|0;if((E|0)==(k|0)){break}else{r=r+1|0;x=E}}a[e+k|0]=0;x=e6(B)|0;r=c[18070]|0;q=c[r>>2]|0;E=c[18066]|0;if((q|0)<(E|0)){aw=r;ax=q}else{q=db(r,(E<<5)+4808|0,168072)|0;E=q;c[18070]=E;c[18066]=(c[18066]|0)+150;aw=E;ax=c[q>>2]|0}c[aw+8+(ax<<5)>>2]=0;q=c[18070]|0;E=c[q>>2]|0;c[q>>2]=E+1;c[(c[18070]|0)+8+(E<<5)+8>>2]=x;c[13898]=(c[13898]|0)+1;break}else if((p|0)==4013){c[13898]=t;x=c[18070]|0;E=c[x>>2]|0;q=c[18066]|0;if((E|0)<(q|0)){ay=x;az=E}else{E=db(x,(q<<5)+4808|0,168072)|0;q=E;c[18070]=q;c[18066]=(c[18066]|0)+150;ay=q;az=c[E>>2]|0}c[ay+8+(az<<5)>>2]=1;E=c[18070]|0;q=c[E>>2]|0;c[E>>2]=q+1;E=c[18070]|0;x=E+8+(q<<5)+8|0;c[x>>2]=1;c[E+8+(q<<5)+16>>2]=s;q=x+12|0;c[q>>2]=c[g>>2];c[q+4>>2]=c[g+4>>2];c[q+8>>2]=c[g+8>>2];q=c[11670]|0;x=c[18070]|0;E=c[x>>2]|0;r=c[18066]|0;if((E|0)<(r|0)){aA=x;aB=E}else{E=db(x,(r<<5)+4808|0,168072)|0;r=E;c[18070]=r;c[18066]=(c[18066]|0)+150;aA=r;aB=c[E>>2]|0}c[aA+8+(aB<<5)>>2]=4;E=c[18070]|0;r=c[E>>2]|0;c[E>>2]=r+1;c[(c[18070]|0)+8+(r<<5)+8>>2]=q;break}}}while(0);aB=c[13898]|0;aA=c[8272]|0;L5504:do{if((aA|0)>(aB|0)){g=aB;az=aA;while(1){ay=c[1054]|0;if((a[ay+(g*40&-1)|0]&1)==0){aC=g;aD=az;break L5504}ax=c[ay+(g*40&-1)+36>>2]|0;aw=ay+(g*40&-1)+32|0;ay=c[10036]|0;e=0;while(1){if((e|0)>=(ax|0)){break}if((a[ay+((c[aw>>2]|0)+e|0)|0]|0)==(a[e+124624|0]|0)){e=e+1|0}else{aC=g;aD=az;break L5504}}if((e|0)!=1){aC=g;aD=az;break L5504}c[13898]=g+1;aw=c[18070]|0;ay=c[aw>>2]|0;ax=c[18066]|0;if((ay|0)<(ax|0)){aE=aw;aF=ay}else{ay=db(aw,(ax<<5)+4808|0,168072)|0;ax=ay;c[18070]=ax;c[18066]=(c[18066]|0)+150;aE=ax;aF=c[ay>>2]|0}c[aE+8+(aF<<5)>>2]=29;ay=c[18070]|0;c[ay>>2]=(c[ay>>2]|0)+1;ay=c[13898]|0;ax=c[8272]|0;if((ax|0)>(ay|0)){g=ay;az=ax}else{aC=ay;aD=ax;break}}}else{aC=aB;aD=aA}}while(0);L5517:do{if((aD|0)>(aC|0)){aA=c[1054]|0;if((a[aA+(aC*40&-1)|0]&1)==0){aG=aC;aH=aD;break}aB=c[aA+(aC*40&-1)+36>>2]|0;aF=aA+(aC*40&-1)+32|0;aA=c[10036]|0;aE=0;while(1){if((aE|0)>=(aB|0)){break}if((a[aA+((c[aF>>2]|0)+aE|0)|0]|0)==(a[aE+103912|0]|0)){aE=aE+1|0}else{aG=aC;aH=aD;break L5517}}if((aE|0)!=2){aG=aC;aH=aD;break}c[13898]=aC+1;iI();aF=c[18070]|0;aA=c[aF>>2]|0;aB=c[18066]|0;if((aA|0)<(aB|0)){aI=aF;aJ=aA}else{aA=db(aF,(aB<<5)+4808|0,168072)|0;aB=aA;c[18070]=aB;c[18066]=(c[18066]|0)+150;aI=aB;aJ=c[aA>>2]|0}c[aI+8+(aJ<<5)>>2]=28;aA=c[18070]|0;c[aA>>2]=(c[aA>>2]|0)+1;aG=c[13898]|0;aH=c[8272]|0}else{aG=aC;aH=aD}}while(0);if((aH|0)<=(aG|0)){i=b;return}aD=c[1054]|0;if((a[aD+(aG*40&-1)|0]&1)==0){i=b;return}aC=c[aD+(aG*40&-1)+36>>2]|0;aJ=aD+(aG*40&-1)+32|0;aI=c[10036]|0;aA=0;while(1){if((aA|0)>=(aC|0)){break}if((a[aI+((c[aJ>>2]|0)+aA|0)|0]|0)==(a[aA+78280|0]|0)){aA=aA+1|0}else{p=4147;break}}if((p|0)==4147){i=b;return}if((aA|0)!=1){i=b;return}aA=aG+1|0;c[13898]=aA;aG=(aH|0)>(aA|0);L5544:do{if(aG){do{if((a[aD+(aA*40&-1)|0]&1)==0){p=4066}else{aH=c[aD+(aA*40&-1)+36>>2]|0;aJ=aD+(aA*40&-1)+32|0;aC=0;while(1){if((aC|0)>=(aH|0)){p=4064;break}if((a[aI+((c[aJ>>2]|0)+aC|0)|0]|0)==(a[aC+134808|0]|0)){aC=aC+1|0}else{break}}if((p|0)==4064){if((aC|0)==1){break}}if(aG){p=4066}else{p=4080;break L5544}}}while(0);if((p|0)==4066){if((a[aD+(aA*40&-1)|0]&1)==0){p=4080;break}aE=c[aD+(aA*40&-1)+36>>2]|0;aJ=aD+(aA*40&-1)+32|0;aH=0;while(1){if((aH|0)>=(aE|0)){break}if((a[aI+((c[aJ>>2]|0)+aH|0)|0]|0)==(a[aH+183584|0]|0)){aH=aH+1|0}else{p=4080;break L5544}}if((aH|0)!=1){p=4080;break}}aJ=c[18070]|0;aE=c[aJ>>2]|0;e=c[18066]|0;if((aE|0)<(e|0)){aK=aJ;aL=aE}else{aE=db(aJ,(e<<5)+4808|0,168072)|0;e=aE;c[18070]=e;c[18066]=(c[18066]|0)+150;aK=e;aL=c[aE>>2]|0}c[aK+8+(aL<<5)>>2]=1;aE=c[18070]|0;e=c[aE>>2]|0;c[aE>>2]=e+1;aE=c[18070]|0;c[aE+8+(e<<5)+8>>2]=1;c[aE+8+(e<<5)+16>>2]=1;e=c[13898]|0;if((c[8272]|0)<=(e|0)){break}aE=c[1054]|0;if((a[aE+(e*40&-1)|0]&1)==0){break}aJ=c[aE+(e*40&-1)+36>>2]|0;aB=aE+(e*40&-1)+32|0;aE=c[10036]|0;aF=0;while(1){if((aF|0)>=(aJ|0)){break}if((a[aE+((c[aB>>2]|0)+aF|0)|0]|0)==(a[aF+134808|0]|0)){aF=aF+1|0}else{break L5544}}if((aF|0)!=1){break}c[13898]=e+1}else{p=4080}}while(0);do{if((p|0)==4080){if((iy()|0)!=0){break}c[8230]=(c[8230]|0)+1;iz();iC();c[8230]=(c[8230]|0)-1}}while(0);aL=c[13898]|0;aK=c[8272]|0;if((aK|0)<=(aL|0)){uf(aL,103536,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}aI=c[1054]|0;if((a[aI+(aL*40&-1)|0]&1)==0){uf(aL,103536,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}aA=c[aI+(aL*40&-1)+36>>2]|0;aD=aI+(aL*40&-1)+32|0;aG=c[10036]|0;aB=0;while(1){if((aB|0)>=(aA|0)){break}if((a[aG+((c[aD>>2]|0)+aB|0)|0]|0)==(a[aB+183584|0]|0)){aB=aB+1|0}else{p=4137;break}}if((p|0)==4137){uf(aL,103536,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((aB|0)!=1){uf(aL,103536,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}aB=aL+1|0;c[13898]=aB;aL=(aK|0)>(aB|0);L5591:do{if(aL){do{if((a[aI+(aB*40&-1)|0]&1)==0){p=4096}else{aK=c[aI+(aB*40&-1)+36>>2]|0;aD=aI+(aB*40&-1)+32|0;aA=0;while(1){if((aA|0)>=(aK|0)){p=4094;break}if((a[aG+((c[aD>>2]|0)+aA|0)|0]|0)==(a[aA+134808|0]|0)){aA=aA+1|0}else{break}}if((p|0)==4094){if((aA|0)==1){break}}if(aL){p=4096}else{p=4110;break L5591}}}while(0);if((p|0)==4096){if((a[aI+(aB*40&-1)|0]&1)==0){p=4110;break}e=c[aI+(aB*40&-1)+36>>2]|0;aF=aI+(aB*40&-1)+32|0;aD=0;while(1){if((aD|0)>=(e|0)){break}if((a[aG+((c[aF>>2]|0)+aD|0)|0]|0)==(a[aD+78864|0]|0)){aD=aD+1|0}else{p=4110;break L5591}}if((aD|0)!=1){p=4110;break}}aF=c[18070]|0;e=c[aF>>2]|0;aK=c[18066]|0;if((e|0)<(aK|0)){aM=aF;aN=e}else{e=db(aF,(aK<<5)+4808|0,168072)|0;aK=e;c[18070]=aK;c[18066]=(c[18066]|0)+150;aM=aK;aN=c[e>>2]|0}c[aM+8+(aN<<5)>>2]=1;e=c[18070]|0;aK=c[e>>2]|0;c[e>>2]=aK+1;e=c[18070]|0;c[e+8+(aK<<5)+8>>2]=1;c[e+8+(aK<<5)+16>>2]=65535;aK=c[13898]|0;if((c[8272]|0)<=(aK|0)){break}e=c[1054]|0;if((a[e+(aK*40&-1)|0]&1)==0){break}aF=c[e+(aK*40&-1)+36>>2]|0;aC=e+(aK*40&-1)+32|0;e=c[10036]|0;aE=0;while(1){if((aE|0)>=(aF|0)){break}if((a[e+((c[aC>>2]|0)+aE|0)|0]|0)==(a[aE+134808|0]|0)){aE=aE+1|0}else{break L5591}}if((aE|0)!=1){break}c[13898]=aK+1}else{p=4110}}while(0);do{if((p|0)==4110){if((iy()|0)!=0){break}c[8230]=(c[8230]|0)+1;iz();iC();c[8230]=(c[8230]|0)-1}}while(0);aN=c[13898]|0;if((c[8272]|0)<=(aN|0)){uf(aN,101328,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}aM=c[1054]|0;if((a[aM+(aN*40&-1)|0]&1)==0){uf(aN,101328,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}aG=c[aM+(aN*40&-1)+36>>2]|0;aB=aM+(aN*40&-1)+32|0;aM=c[10036]|0;aI=0;while(1){if((aI|0)>=(aG|0)){break}if((a[aM+((c[aB>>2]|0)+aI|0)|0]|0)==(a[aI+78864|0]|0)){aI=aI+1|0}else{p=4141;break}}if((p|0)==4141){uf(aN,101328,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((aI|0)!=1){uf(aN,101328,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[13898]=aN+1;aN=c[18070]|0;aI=c[aN>>2]|0;p=c[18066]|0;if((aI|0)<(p|0)){aO=aN;aP=aI}else{aI=db(aN,(p<<5)+4808|0,168072)|0;p=aI;c[18070]=p;c[18066]=(c[18066]|0)+150;aO=p;aP=c[aI>>2]|0}c[aO+8+(aP<<5)>>2]=35;aP=c[18070]|0;c[aP>>2]=(c[aP>>2]|0)+1;i=b;return}function iJ(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;L5643:while(1){b=c[13898]|0;d=(c[8272]|0)>(b|0);if(!d){e=4202;break}f=c[1054]|0;if((a[f+(b*40&-1)|0]&1)!=0){g=c[f+(b*40&-1)+36>>2]|0;h=f+(b*40&-1)+32|0;f=c[10036]|0;i=0;while(1){if((i|0)>=(g|0)){e=4174;break}if((a[f+((c[h>>2]|0)+i|0)|0]|0)==(a[i+134808|0]|0)){i=i+1|0}else{break}}do{if((e|0)==4174){e=0;if((i|0)!=1){break}c[13898]=b+1;iI();h=c[18070]|0;f=c[h>>2]|0;g=c[18066]|0;if((f|0)<(g|0)){j=h;k=f}else{f=db(h,(g<<5)+4808|0,168072)|0;g=f;c[18070]=g;c[18066]=(c[18066]|0)+150;j=g;k=c[f>>2]|0}c[j+8+(k<<5)>>2]=25;f=c[18070]|0;c[f>>2]=(c[f>>2]|0)+1;continue L5643}}while(0);if(!d){e=4198;break}}i=c[1054]|0;L5659:do{if((a[i+(b*40&-1)|0]&1)!=0){f=c[i+(b*40&-1)+36>>2]|0;g=i+(b*40&-1)+32|0;h=c[10036]|0;l=0;while(1){if((l|0)>=(f|0)){break}if((a[h+((c[g>>2]|0)+l|0)|0]|0)==(a[l+126944|0]|0)){l=l+1|0}else{break L5659}}if((l|0)!=1){break}c[13898]=b+1;iI();g=c[18070]|0;h=c[g>>2]|0;f=c[18066]|0;if((h|0)<(f|0)){m=g;n=h}else{h=db(g,(f<<5)+4808|0,168072)|0;f=h;c[18070]=f;c[18066]=(c[18066]|0)+150;m=f;n=c[h>>2]|0}c[m+8+(n<<5)>>2]=26;h=c[18070]|0;c[h>>2]=(c[h>>2]|0)+1;continue L5643}}while(0);if(!d){e=4199;break}i=c[1054]|0;if((a[i+(b*40&-1)|0]&1)==0){e=4200;break}h=c[i+(b*40&-1)+36>>2]|0;f=i+(b*40&-1)+32|0;i=c[10036]|0;g=0;while(1){if((g|0)>=(h|0)){break}if((a[i+((c[f>>2]|0)+g|0)|0]|0)==(a[g+191528|0]|0)){g=g+1|0}else{e=4201;break L5643}}if((g|0)!=1){e=4197;break}c[13898]=b+1;iI();f=c[18070]|0;i=c[f>>2]|0;h=c[18066]|0;if((i|0)<(h|0)){o=f;p=i}else{i=db(f,(h<<5)+4808|0,168072)|0;h=i;c[18070]=h;c[18066]=(c[18066]|0)+150;o=h;p=c[i>>2]|0}c[o+8+(p<<5)>>2]=27;i=c[18070]|0;c[i>>2]=(c[i>>2]|0)+1}if((e|0)==4201){return}else if((e|0)==4202){return}else if((e|0)==4198){return}else if((e|0)==4197){return}else if((e|0)==4199){return}else if((e|0)==4200){return}}function iK(){var b=0,d=0;b=i;do{if((c[258]|0)==0){d=bU(172032)|0;if((d|0)!=0){c[258]=bP(d|0)|0;break}if((a[37400]&1)==0){break}uh(-1,168056,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);if((c[256]|0)!=0){i=b;return}d=bU(163792)|0;c[256]=bP(((d|0)==0?154528:d)|0)|0;i=b;return}function iL(){cv(53560|0,1)}function iM(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,p=0,q=0,t=0,u=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0;e=i;i=i+160|0;f=1;g=0;j=i;i=i+168|0;c[j>>2]=0;while(1)switch(f|0){case 1:k=e|0;if((b|0)>1){l=1;f=2;break}else{f=16;break};case 2:p=c[d+(l<<2)>>2]|0;if((p|0)==0){f=15;break}else{f=3;break};case 3:q=aw(8,p|0,183208)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;if((q|0)==0){f=5;break}else{f=4;break};case 4:q=aw(8,p|0,214328)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;if((q|0)==0){f=5;break}else{f=6;break};case 5:aw(26,158880,(v=i,i=i+16|0,c[v>>2]=40152,c[v+8>>2]=40160,v)|0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;t=0;f=81;break;case 6:q=aw(8,p|0,135600)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;if((q|0)==0){f=8;break}else{f=7;break};case 7:q=aw(8,p|0,122640)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;if((q|0)==0){f=8;break}else{f=9;break};case 8:aw(26,105384,(v=i,i=i+16|0,c[v>>2]=40152,c[v+8>>2]=40160,v)|0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;t=0;f=81;break;case 9:q=aq(2,p|0,98264,2)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;if((q|0)==0){f=11;break}else{f=10;break};case 10:q=aw(8,p|0,92432)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;if((q|0)==0){f=11;break}else{f=12;break};case 11:a[32096]=1;f=15;break;case 12:q=aq(2,p|0,84592,2)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;if((q|0)==0){f=14;break}else{f=13;break};case 13:q=aw(8,p|0,76592)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;if((q|0)==0){f=14;break}else{f=15;break};case 14:a[21672]=1;f=15;break;case 15:q=l+1|0;if((q|0)<(b|0)){l=q;f=2;break}else{f=16;break};case 16:an(88,c[m>>2]|0,0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;q=au(2,c[n>>2]|0,0,1,1024)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;if((q|0)==0){f=18;break}else{f=17;break};case 17:au(4,224136,28,1,c[m>>2]|0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;f=18;break;case 18:au(2,c[o>>2]|0,0,2,0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;c[10030]=c[n>>2];c[500]=2;h[251]=3.141592653589793;h[252]=0.0;q=ao(4,133568)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;c[506]=q;u=+av(4,133568,0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;c[q+16>>2]=2;h[q+24>>3]=u;h[q+32>>3]=0.0;a[(c[506]|0)+8|0]=0;as(384);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;as(44);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;q=ao(56,1)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;if((q|0)==0){f=19;break}else{w=q;f=21;break};case 19:as(424);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;q=ao(56,1)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;if((q|0)==0){f=20;break}else{w=q;f=21;break};case 20:ar(6,-1|0,225296,(v=i,i=i+8|0,c[v>>2]=116456,v)|0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;return 0;case 21:c[6924]=w;a[w]=0;a[37400]=0;as(108);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;if((c[3524]|0)==0){f=25;break}else{f=22;break};case 22:am(98,c[6958]|0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;am(98,c[6956]|0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;x=c[c[3524]>>2]|0;if((x|0)==0){y=0;f=24;break}else{f=23;break};case 23:q=ao(162,x|0)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;y=q;f=24;break;case 24:c[6958]=y;q=ao(162,13048)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;c[6956]=q;f=25;break;case 25:ao(102,92);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;q=ao(58,c[o>>2]|0)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;z=ao(18,q|0)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;a[37400]=(z|0)!=0&1;A=1;f=26;break;case 26:if((A|0)<(b|0)){f=27;break}else{f=30;break};case 27:B=c[d+(A<<2)>>2]|0;if((a[B]|0)==45){f=28;break}else{f=29;break};case 28:if((a[B+1|0]|0)==101){f=29;break}else{A=A+1|0;f=26;break};case 29:a[37400]=0;f=30;break;case 30:z=ao(108,k|0)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;if((z|0)>-1){f=31;break}else{f=32;break};case 31:aw(28,33040,k|0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;aw(28,33008,k+128|0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;f=32;break;case 32:if((a[37400]&1)==0){f=34;break}else{f=33;break};case 33:am(272,c[m>>2]|0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;f=35;break;case 34:am(272,0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;f=35;break;case 35:am(200,3);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;C=uL(53560,f,j)|0;f=82;break;case 82:if((C|0)==0){f=36;break}else{f=42;break};case 36:av(2,2,4);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;av(2,13,1);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;as(418);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;aw(24,1,0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;am(98,c[12908]|0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;aw(10,5,179864);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;aw(10,2,179864);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;D=aw(10,5,0)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;if((D|0)==0){E=0;f=38;break}else{f=37;break};case 37:z=ao(162,D|0)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;E=z;f=38;break;case 38:c[12908]=E;as(138);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;c[5162]=37;c[5164]=7;c[5165]=5;c[5166]=15;a[20668]=112;c[5172]=0;c[5173]=0;uE(20672,0,13);c[5174]=114;c[5334]=0;c[5256]=0;c[5178]=0;h[2705]=1.5;uD(54016,50688,112);am(92,0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;if((a[21672]&1)==0){f=39;break}else{f=40;break};case 39:am(98,0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;f=40;break;case 40:c[10062]=0;a[14168]=1;am(92,2);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;F=c[3524]|0;if((a[37400]&1)!=0&(F|0)!=0){f=41;break}else{G=0;f=48;break};case 41:aq(4,c[m>>2]|0,211496,(v=i,i=i+8|0,c[v>>2]=c[F>>2],v)|0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;G=0;f=48;break;case 42:if(a[14168]|0){f=44;break}else{f=43;break};case 43:a[14168]=1;au(4,205272,38,1,c[m>>2]|0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;f=44;break;case 44:H=a[37400]&1^1;f=45;break;case 45:z=al(2)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;if(z){f=45;break}else{f=46;break};case 46:I=H&255;if((a[37400]&1)==0){f=47;break}else{G=I;f=48;break};case 47:if((a[33232]&1)==0){f=49;break}else{G=I;f=48;break};case 48:z=b-1|0;if((z|0)>0){J=b;K=d;L=z;f=59;break}else{f=79;break};case 49:c[8026]=0;if((a[14080]&1)==0){f=58;break}else{f=50;break};case 50:if(a[13032]|0){f=51;break}else{f=54;break};case 51:M=c[(c[3524]|0)+104>>2]|0;if((M|0)==0){f=53;break}else{f=52;break};case 52:as(M|0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;f=53;break;case 53:a[13032]=0;f=54;break;case 54:if(a[14088]|0){f=55;break}else{f=56;break};case 55:as(c[(c[3524]|0)+44>>2]|0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;a[14088]=0;f=56;break;case 56:if((a[14080]&1)==0){f=58;break}else{f=57;break};case 57:as(c[(c[3524]|0)+40>>2]|0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;a[14080]=0;c[10028]=0;f=58;break;case 58:am(356,1);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;return 0;case 59:N=K+4|0;c[13898]=0;O=c[N>>2]|0;z=aq(2,O|0,98264,2)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;if((z|0)==0){P=N;Q=L;f=65;break}else{f=60;break};case 60:z=aw(8,O|0,92432)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;if((z|0)==0){P=N;Q=L;f=65;break}else{f=61;break};case 61:z=aw(8,O|0,202112)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;if((z|0)==0){f=62;break}else{f=66;break};case 62:a[37400]=1;f=63;break;case 63:z=al(6)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;if((z|0)==0){f=63;break}else{f=64;break};case 64:a[37400]=0;P=N;Q=L;f=65;break;case 65:z=Q-1|0;if((z|0)>0){J=Q;K=P;L=z;f=59;break}else{f=79;break};case 66:z=aw(8,O|0,196560)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;if((z|0)==0){f=67;break}else{f=72;break};case 67:R=J-2|0;S=K+8|0;if((R|0)<1){f=68;break}else{f=69;break};case 68:au(4,185336,31,1,c[m>>2]|0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;t=0;f=81;break;case 69:a[37400]=0;a[33232]=0;T=c[S>>2]|0;if((T|0)==0){U=0;f=71;break}else{f=70;break};case 70:z=ao(162,T|0)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;U=z;f=71;break;case 71:am(150,U|0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;P=S;Q=R;f=65;break;case 72:z=aq(2,O|0,84592,2)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;if((z|0)==0){P=N;Q=L;f=65;break}else{f=73;break};case 73:z=aw(8,O|0,76592)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;if((z|0)==0){P=N;Q=L;f=65;break}else{f=74;break};case 74:if((a[O]|0)==45){f=75;break}else{f=76;break};case 75:aq(4,c[m>>2]|0,180120,(v=i,i=i+8|0,c[v>>2]=O,v)|0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;P=N;Q=L;f=65;break;case 76:a[37400]=0;a[33232]=0;V=aw(20,O|0,193632)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;W=c[N>>2]|0;if((W|0)==0){X=0;f=78;break}else{f=77;break};case 77:z=ao(162,W|0)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;X=z;f=78;break;case 78:ar(76,V|0,X|0,0);if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;P=N;Q=L;f=65;break;case 79:if((a[33232]&1)==0){t=G;f=81;break}else{f=80;break};case 80:z=al(6)|0;if((r|0)!=0&(s|0)!=0){g=uM(c[r>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}r=s=0;if((z|0)==0){f=80;break}else{t=G;f=81;break};case 81:i=e;return t|0;case-1:if((g|0)==35){C=s;f=82}r=s=0;break}return 0}function iN(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=i;if((a[21672]&1)!=0){i=d;return}do{if((b|0)==1){e=0}else if((b|0)==0){f=ut(39)|0;do{if((f|0)==0){gk();g=ut(39)|0;if((g|0)!=0){h=g;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=141984,v)|0)}else{h=f}}while(0);uD(h|0,74944,29);f=uA(h|0)|0;g=(f|0)==0?0:f-1|0;f=a[h+g|0]|0;if(!((f<<24>>24|0)==47|(f<<24>>24|0)==0)){a[h+(g+1|0)|0]=47;a[h+(g+2|0)|0]=0}uD(h+(uA(h|0)|0)|0,138288,10);j=bF(h|0,193632)|0;k=h;l=4229}else{g=c[258]|0;if(!((b|0)==2&(g|0)!=0)){e=0;break}f=(uA(g|0)|0)+10|0;g=ut(f)|0;do{if((g|0)==0){gk();m=ut(f)|0;if((m|0)!=0){n=m;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=141984,v)|0)}else{n=g}}while(0);uB(n|0,c[258]|0);g=uA(n|0)|0;f=(g|0)==0?0:g-1|0;g=a[n+f|0]|0;if(!((g<<24>>24|0)==47|(g<<24>>24|0)==0)){a[n+(f+1|0)|0]=47;a[n+(f+2|0)|0]=0}uD(n+(uA(n|0)|0)|0,136592,9);j=bF(n|0,193632)|0;k=n;l=4229}}while(0);do{if((l|0)==4229){if((j|0)==0){e=k;break}n=(k|0)!=0?k:136592;if((n|0)==0){o=0}else{o=bP(n|0)|0}hw(j,o,0);if((c[3524]|0)==0){e=k;break}uu(c[6958]|0);uu(c[6956]|0);n=c[c[3524]>>2]|0;if((n|0)==0){p=0}else{p=bP(n|0)|0}c[6958]=p;c[6956]=bP(13048)|0;e=k}}while(0);uu(e);i=d;return}function iO(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;if((a|0)==0){return}else{b=a}while(1){a=c[b>>2]|0;d=b+16|0;uu(c[d>>2]|0);c[d>>2]=0;d=b+320|0;uu(c[d>>2]|0);c[d>>2]=0;d=b+316|0;uu(c[d>>2]|0);c[d>>2]=0;d=b+224|0;e=c[d>>2]|0;if((e|0)!=0){f=c[e+64>>2]|0;if((f|0)==0){g=e}else{uu(f);g=e}while(1){e=c[g+60>>2]|0;if((e|0)!=0){uu(e)}e=c[g+64>>2]|0;if(!((e|0)==0|(e|0)==(f|0))){uu(e)}e=c[g>>2]|0;uu(g);if((e|0)==0){break}else{g=e}}}c[d>>2]=0;f=b+292|0;uu(c[f>>2]|0);c[f>>2]=0;uu(b);if((a|0)==0){break}else{b=a}}return}function iP(b){b=b|0;aV(2,4);aV(8,0);c[8026]=0;do{if((a[14080]&1)!=0){if(a[13032]|0){b=c[(c[3524]|0)+104>>2]|0;if((b|0)!=0){cS[b&511]()}a[13032]=0}if(a[14088]|0){cS[c[(c[3524]|0)+44>>2]&511]();a[14088]=0}if((a[14080]&1)==0){break}cS[c[(c[3524]|0)+40>>2]&511]();a[14080]=0;c[10028]=0}}while(0);aF(10,c[m>>2]|0);iL()}function iQ(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=c[b>>2]|0;if((e|0)==0){uf(-1,151280,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((a[e]|0)!=126){i=d;return}if((a[e+1|0]|0)!=47){i=d;return}f=c[258]|0;if((f|0)==0){uh(-1,147480,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);i=d;return}else{g=uA(e|0)|0;h=db(e,(uA(f|0)|0)+g|0,149488)|0;c[b>>2]=h;uH(h+((uA(c[258]|0)|0)-1|0)|0,h|0,g+1|0);g=c[b>>2]|0;b=c[258]|0;uD(g|0,b|0,uA(b|0)|0);i=d;return}}function iR(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;e=a+296|0;if((c[e>>2]|0)==(b|0)){i=d;return}f=a+320|0;g=c[f>>2]|0;if((b|0)<=0){uu(g);c[f>>2]=0;c[e>>2]=0;h=a+316|0;uu(c[h>>2]|0);c[h>>2]=0;i=d;return}do{if((g|0)==0){h=b<<6;j=ut(h)|0;do{if((j|0)==0){gk();k=ut(h)|0;if((k|0)!=0){l=k;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=180104,v)|0)}else{l=j}}while(0);c[f>>2]=l}else{c[f>>2]=db(g,b<<6,214200)|0;j=a+316|0;h=c[j>>2]|0;if((h|0)==0){break}c[j>>2]=db(h,b<<3,158688)|0}}while(0);c[e>>2]=b;i=d;return}function iS(){var d=0,e=0,f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0,s=0,t=0,u=0,w=0;d=i;i=i+24|0;e=d|0;if((c[3524]|0)==0){uf(c[13898]|0,135392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}a[37384]=0;if(a[20368]|0){a[20368]=0;g[3538]=+g[5090];g[3536]=+g[5088];g[3534]=+g[5086];c[16336]=c[16336]^2;c[17024]=c[17024]^2}do{if((a[32936]&1)!=0){if((aY(24544,122560)|0)!=0){break}b[12272]=116}}while(0);c[16506]=c[16507];h[8255]=+h[8257];h[8256]=+h[8258];h[8261]=8.988465674311579e+307;h[8262]=-8.988465674311579e+307;f=c[16335]|0;c[16334]=f;h[8169]=(f&1|0)==0?+h[8171]:8.988465674311579e+307;h[8170]=(f&2|0)==0?+h[8172]:-8.988465674311579e+307;h[8175]=8.988465674311579e+307;h[8176]=-8.988465674311579e+307;c[17194]=c[17195];h[8599]=+h[8601];h[8600]=+h[8602];h[8605]=8.988465674311579e+307;h[8606]=-8.988465674311579e+307;f=c[17023]|0;c[17022]=f;h[8513]=(f&1|0)==0?+h[8515]:8.988465674311579e+307;h[8514]=(f&2|0)==0?+h[8516]:-8.988465674311579e+307;h[8519]=8.988465674311579e+307;h[8520]=-8.988465674311579e+307;c[17538]=c[17539];h[8771]=+h[8773];h[8772]=+h[8774];h[8777]=8.988465674311579e+307;h[8778]=-8.988465674311579e+307;f=c[17367]|0;c[17366]=f;h[8685]=(f&1|0)==0?+h[8687]:8.988465674311579e+307;h[8686]=(f&2|0)==0?+h[8688]:-8.988465674311579e+307;h[8691]=8.988465674311579e+307;h[8692]=-8.988465674311579e+307;f=c[16679]|0;c[16678]=f;h[8341]=(f&1|0)==0?+h[8343]:8.988465674311579e+307;h[8342]=(f&2|0)==0?+h[8344]:-8.988465674311579e+307;h[8347]=8.988465674311579e+307;h[8348]=-8.988465674311579e+307;L5811:do{if((a[37408]&1)!=0){f=c[13898]|0;if((c[8272]|0)>(f|0)){j=f}else{break}do{f=c[1054]|0;if((a[f+(j*40&-1)|0]&1)==0){break L5811}k=c[f+(j*40&-1)+36>>2]|0;l=f+(j*40&-1)+32|0;f=c[10036]|0;m=0;while(1){if((m|0)>=(k|0)){break}if((a[f+((c[l>>2]|0)+m|0)|0]|0)==(a[m+78280|0]|0)){m=m+1|0}else{break L5811}}if((m|0)!=1){break L5811}dn();j=c[13898]|0;}while((c[8272]|0)>(j|0))}}while(0);if((a[32936]&1)==0){n=(a[30528]&1)!=0?8:2}else{n=8}j=dr(n,-1)|0;if((a[32936]&1)==0){if((a[30528]&1)!=0){o=4309}}else{o=4309}if((o|0)==4309){dq(2)}do{if((c[16506]&3|0)==0){p=+h[8256];q=+h[8255];if(p>=q){o=4313;break}h[8255]=p;h[8256]=q;r=1}else{o=4313}}while(0);if((o|0)==4313){r=(c[16508]|0)>>>1&1}a[66036]=r;dq(1);do{if((c[16334]&3|0)==0){q=+h[8170];p=+h[8169];if(q>=p){o=4317;break}h[8169]=q;h[8170]=p;s=1}else{o=4317}}while(0);if((o|0)==4317){s=(c[16336]|0)>>>1&1}a[65348]=s;dq(6);do{if((c[17194]&3|0)==0){p=+h[8600];q=+h[8599];if(p>=q){o=4321;break}h[8599]=p;h[8600]=q;t=1}else{o=4321}}while(0);if((o|0)==4321){t=(c[17196]|0)>>>1&1}a[68788]=t;dq(5);do{if((c[17022]&3|0)==0){q=+h[8514];p=+h[8513];if(q>=p){o=4325;break}h[8513]=q;h[8514]=p;u=1}else{o=4325}}while(0);if((o|0)==4325){u=(c[17024]|0)>>>1&1}a[68100]=u;u=e;t=e+16|0;s=0;do{r=64944+(s*688&-1)|0;n=c[r>>2]|0;if((n|0)==0){o=4334}else{c[u>>2]=c[7254];c[u+4>>2]=c[7255];c[u+8>>2]=c[7256];c[u+12>>2]=c[7257];c[u+16>>2]=c[7258];c[u+20>>2]=c[7259];l=e;f=n;L5858:while(1){n=f;while(1){if((c[n+12>>2]|0)>=0){break}uu(c[n+8>>2]|0);k=c[n+16>>2]|0;uu(n);if((k|0)==0){w=l;break L5858}else{n=k}}c[l+16>>2]=n;m=c[n+16>>2]|0;if((m|0)==0){w=n;break}else{l=n;f=m}}c[w+16>>2]=0;f=c[t>>2]|0;c[r>>2]=f;if((f|0)==0){o=4334}}do{if((o|0)==4334){o=0;f=64920+(s*688&-1)|0;if((c[f>>2]|0)!=3){break}c[f>>2]=1}}while(0);s=s+1|0;}while((s|0)<11);if((j|0)<=-1){uB(55600,24544);iT();i=d;return}s=c[1054]|0;o=c[s+(j*40&-1)+36>>2]|0;t=(o|0)>49?49:o;o=c[10036]|0;w=c[s+(j*40&-1)+32>>2]|0;j=0;while(1){s=j+1|0;a[j+55600|0]=a[o+w|0]|0;if((s|0)==(t|0)){break}else{w=w+1|0;j=s}}a[t+55600|0]=0;iT();i=d;return}function iT(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,Q=0,U=0,V=0,W=0,X=0,Y=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0.0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0,aA=0,aB=0,aC=0,aD=0,aE=0,aF=0,aG=0,aH=0,aJ=0,aK=0,aL=0,aM=0,aN=0,aO=0,aP=0,aQ=0,aR=0,aS=0,aT=0,aU=0,aV=0,aW=0.0,aX=0,aZ=0,a$=0,a0=0,a1=0,a2=0,a3=0,a4=0,a5=0,a6=0,a7=0,a8=0,a9=0,ba=0,bb=0,bc=0,bd=0,be=0,bf=0,bg=0,bh=0,bi=0,bj=0,bk=0,bl=0,bm=0,bn=0,bo=0,bp=0,bq=0,br=0,bs=0,bt=0,bu=0,bv=0,bw=0,bx=0,by=0,bz=0,bB=0,bC=0,bD=0,bE=0,bF=0,bG=0,bH=0,bI=0,bJ=0,bK=0,bL=0,bN=0,bO=0,bQ=0,bR=0,bS=0,bT=0,bU=0,bV=0,bW=0,bX=0,bY=0,bZ=0,b_=0,b$=0,b0=0,b1=0,b2=0,b3=0,b4=0,b5=0,b6=0,b7=0,b8=0,b9=0,ca=0,cb=0,cc=0,cd=0,ce=0,cf=0,cg=0,ch=0,ci=0,cj=0,ck=0,cl=0,cm=0,cn=0,co=0,cp=0,cq=0,cr=0,cs=0,ct=0,cu=0,cv=0,cw=0,cx=0,cy=0,cz=0,cA=0,cB=0,cC=0,cD=0,cE=0,cF=0,cG=0,cH=0,cI=0,cJ=0,cK=0,cL=0,cM=0,cN=0,cO=0,cP=0,cQ=0,cR=0,cS=0,cT=0,cU=0,cV=0,cW=0,cX=0,cY=0,cZ=0,c_=0,c$=0,c0=0.0,c1=0,c2=0,c3=0,c4=0,c5=0,c6=0,c7=0,c8=0,c9=0,da=0,dd=0,de=0,df=0,dg=0,dh=0,di=0,dj=0,dk=0,dl=0,dm=0,dn=0,dq=0,dr=0,ds=0,dt=0,du=0,dv=0,dw=0,dx=0,dy=0,dz=0,dA=0,dB=0,dC=0,dD=0,dE=0,dF=0,dG=0,dH=0,dI=0,dJ=0,dK=0,dL=0,dM=0,dN=0,dO=0,dP=0,dQ=0,dR=0,dS=0,dU=0,dV=0,dW=0,dX=0,dY=0,dZ=0,d_=0,d$=0,d0=0,d1=0,d2=0,d3=0,d4=0,d5=0,d6=0,d7=0,d8=0,d9=0,ea=0,eb=0,ec=0,ed=0.0,ee=0.0,ef=0.0,eg=0.0,eh=0.0,ei=0.0,ej=0.0,ek=0,el=0.0,em=0.0,en=0.0,eo=0.0,ep=0.0,eq=0.0,er=0.0,es=0.0,et=0,eu=0,ev=0,ew=0,ex=0.0,eA=0,eB=0.0,eE=0.0,eF=0.0,eG=0.0,eH=0,eI=0,eJ=0,eK=0,eN=0.0,eO=0.0,eP=0,eQ=0,eR=0,eS=0.0,eT=0.0,eU=0,eV=0,eW=0,eX=0,eY=0,eZ=0,e_=0,e$=0,e0=0,e1=0,e2=0,e3=0,e5=0,e8=0.0,e9=0,fa=0,fb=0,fc=0,fd=0,fe=0,ff=0,fg=0,fh=0,fi=0,fj=0,fk=0,fl=0.0,fm=0,fn=0,fo=0,fp=0,fq=0,fr=0,fs=0,ft=0,fu=0,fv=0.0,fw=0,fx=0.0,fy=0.0,fz=0,fA=0,fB=0,fC=0,fD=0,fE=0.0,fF=0,fG=0,fH=0,fI=0,fJ=0,fK=0,fL=0,fM=0,fN=0,fO=0,fP=0,fQ=0,fR=0,fT=0.0,fU=0,fV=0,fW=0,fX=0,fY=0,fZ=0,f_=0,f$=0,f0=0,f1=0,f2=0,f4=0,f5=0,f6=0,f7=0,f9=0,ga=0,gb=0.0,gc=0.0,gd=0,ge=0,gf=0,gg=0,gh=0,gi=0,gj=0.0,gl=0.0,gm=0.0,gn=0.0,go=0,gp=0.0,gq=0.0,gr=0.0,gs=0.0,gt=0.0,gu=0.0,gv=0,gw=0.0,gx=0.0,gy=0.0,gz=0.0,gA=0,gB=0,gC=0.0,gD=0,gE=0,gF=0.0,gG=0,gH=0,gI=0.0,gJ=0,gK=0.0,gL=0,gM=0,gN=0,gO=0,gP=0,gQ=0,gR=0,gS=0,gT=0,gU=0,gV=0,gW=0,gX=0,gY=0,gZ=0,g_=0,g$=0,g0=0,g1=0,g2=0.0,g3=0,g4=0,g5=0,g6=0,g7=0,g8=0,g9=0,ha=0,hb=0,hc=0,hd=0,he=0.0,hf=0.0,hg=0,hh=0.0,hi=0.0,hj=0,hm=0,ho=0.0;b=i;i=i+512|0;d=b|0;e=b+8|0;f=b+96|0;g=b+120|0;j=b+144|0;k=b+216|0;l=b+240|0;n=b+264|0;o=b+288|0;p=b+336|0;q=b+368|0;r=b+424|0;s=b+480|0;t=b+488|0;u=c[13898]|0;h[4834]=0.0;f8(38680);w=c[3568]|0;if((w|0)!=0){uu(w)}c[3568]=0;w=o+20|0;c[w>>2]=0;x=o+24|0;c[x>>2]=0;y=o+4|0;c[y>>2]=0;z=o+8|0;c[z>>2]=0;A=c[10814]|0;if((A|0)!=0){iO(A)}c[10814]=0;A=c[12374]|0;a[872]=0;c[7774]=iw()|0;B=c[13898]|0;if((B|0)>=(c[8272]|0)){C=B;uf(C,105216,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}D=b+168|0;E=b+64|0;F=e|0;G=e+8|0;H=e+16|0;I=e+24|0;J=e+32|0;K=e+40|0;L=f|0;M=f+8|0;N=r+40|0;O=q;Q=q+4|0;U=q+16|0;V=q+24|0;W=q+8|0;X=q|0;Y=q+40|0;$=q+44|0;aa=q+32|0;ab=g|0;ac=j|0;ad=j+8|0;ae=b+192|0;af=p+8|0;ag=n|0;ah=n+8|0;ai=l|0;aj=l+8|0;ak=k|0;al=k+8|0;am=0;an=-5;ao=1;ap=-1;aq=0.0;ar=0;as=0;at=A;A=0;au=0;av=0;aw=0;ax=0;ay=43256;az=B;L5888:while(1){B=ar;aA=A;aB=az;L5890:while(1){aC=c[1054]|0;aD=(a[aC+(aB*40&-1)|0]&1)==0;L5892:do{if(!aD){aE=c[aC+(aB*40&-1)+36>>2]|0;aF=aC+(aB*40&-1)+32|0;aG=c[10036]|0;aH=0;while(1){if((aH|0)>=(aE|0)){break}if((a[aG+((c[aF>>2]|0)+aH|0)|0]|0)==(a[aH+103664|0]|0)){aH=aH+1|0}else{break L5892}}if((aH|0)==1){aJ=B;aK=aA;aL=am;aM=au;aN=ax;aO=aB;aP=4357;break L5888}}}while(0);if(au){aQ=B}else{aQ=aA?B:aB}aF=c[aC+(aB*40&-1)+36>>2]|0;L5902:do{if((aF|0)>0&(aD^1)){aG=c[10036]|0;aE=0;aR=0;aS=c[aC+(aB*40&-1)+32>>2]|0;while(1){if((a[aE+205224|0]|0)==(a[aG+(aE+aS|0)|0]|0)){aT=aS;aU=aR}else{if((aE|0)!=7){break L5902}aT=aS-1|0;aU=1}aV=aE+1|0;if((aV|0)<(aU+aF|0)){aE=aV;aR=aU;aS=aT}else{break}}if((aU|0)!=0){aP=4369;break L5890}if((aE|0)==12|(aE|0)==6){aP=4369;break L5890}}}while(0);if((t9(aB)|0)==0){aP=4446;break}dT();aF=c[13898]|0;aC=c[8272]|0;aD=(aC|0)>(aF|0);if(!aD){aJ=aQ;aK=1;aL=am;aM=au;aN=ax;aO=aF;aP=4357;break L5888}aS=c[1054]|0;if((a[aS+(aF*40&-1)|0]&1)==0){B=aQ;aA=1;aB=aF;continue}aR=c[aS+(aF*40&-1)+36>>2]|0;aG=aS+(aF*40&-1)+32|0;aS=c[10036]|0;aH=0;while(1){if((aH|0)>=(aR|0)){aP=4445;break}if((a[aS+((c[aG>>2]|0)+aH|0)|0]|0)==(a[aH+148464|0]|0)){aH=aH+1|0}else{break}}if((aP|0)==4445){aP=0;if((aH|0)==1){aW=aq;aX=ap;aZ=ao;a$=an;a0=aF;a1=aC;aP=5304;break}}if(aD){B=aQ;aA=1;aB=aF}else{aJ=aQ;aK=1;aL=am;aM=au;aN=ax;aO=aF;aP=4357;break L5888}}do{if((aP|0)==4446){aP=0;B=am+1|0;c[11670]=31424;aG=iu(0)|0;c[11670]=0;aS=(a[32936]&1)==0;aR=au^1;if((aG|0)==0){aV=aS?au:aR;a2=c[ay>>2]|0;a3=(c[6352]|0)+1|0;if((a2|0)==0){uE(D|0,0,24);a4=ut(328)|0;if((a4|0)==0){gk();a5=ut(328)|0;if((a5|0)==0){aP=4462;break L5888}else{a6=a5}}else{a6=a4}a4=a6;uE(a6|0,0,328);c[a6+296>>2]=(a3|0)<0?0:a3;if((a3|0)>0){a5=a3<<6;a7=ut(a5)|0;if((a7|0)==0){gk();a8=ut(a5)|0;if((a8|0)==0){aP=4466;break L5888}else{a9=a8}}else{a9=a7}c[a6+320>>2]=a9}c[a6+24>>2]=0;c[a6+28>>2]=-2;a7=a6+32|0;c[a7>>2]=0;c[a7+4>>2]=0;h[a6+40>>3]=1.0;h[a6+48>>3]=-2.0;a7=a6+56|0;c[a7>>2]=c[D>>2];c[a7+4>>2]=c[D+4>>2];c[a7+8>>2]=c[D+8>>2];c[a7+12>>2]=c[D+12>>2];c[a7+16>>2]=c[D+16>>2];c[a7+20>>2]=c[D+20>>2];c[a6+80>>2]=-1;c[a6+84>>2]=0;a7=a6+88|0;c[a7>>2]=c[12872];c[a7+4>>2]=c[12873];c[a7+8>>2]=c[12874];c[a7+12>>2]=c[12875];c[a7+16>>2]=c[12876];c[a7+20>>2]=c[12877];c[a7+24>>2]=c[12878];c[a7+28>>2]=c[12879];c[a7+32>>2]=c[12880];c[a7+36>>2]=c[12881];c[a7+40>>2]=c[12882];c[a7+44>>2]=c[12883];c[a7+48>>2]=c[12884];c[a7+52>>2]=c[12885];c[a6+144>>2]=1;h[a6+152>>3]=0.0;c[a6+160>>2]=0;h[a6+168>>3]=15.0;h[a6+176>>3]=90.0;c[a6+184>>2]=0;a7=a6+192|0;c[a7>>2]=c[12372];c[a7+4>>2]=c[12373];c[a7+8>>2]=c[12374];c[a7+12>>2]=c[12375];c[a7+16>>2]=c[12376];c[a7+20>>2]=c[12377];c[a7+24>>2]=c[12378];c[a7+28>>2]=c[12379];c[ay>>2]=a4;ba=a4}else{iR(a2,a3);ba=a2}c[ba+8>>2]=0;c[ba+12>>2]=c[10058];c[ba+240>>2]=0;a[ba+56|0]=0;a2=c[13898]|0;bb=ba;bc=1;bd=aV;be=a2-1|0;bf=0;bg=a2}else{if(!(aS|aR)){aP=4448;break L5888}aR=c[ay>>2]|0;if((aR|0)==0){uE(ae|0,0,24);aS=ut(328)|0;if((aS|0)==0){gk();a2=ut(328)|0;if((a2|0)==0){aP=4452;break L5888}else{bh=a2}}else{bh=aS}aS=bh;uE(bh|0,0,328);c[bh+296>>2]=100;a2=ut(6400)|0;if((a2|0)==0){gk();aV=ut(6400)|0;if((aV|0)==0){aP=4455;break L5888}else{bi=aV}}else{bi=a2}c[bh+320>>2]=bi;c[bh+24>>2]=0;c[bh+28>>2]=-2;a2=bh+32|0;c[a2>>2]=0;c[a2+4>>2]=0;h[bh+40>>3]=1.0;h[bh+48>>3]=-2.0;a2=bh+56|0;c[a2>>2]=c[ae>>2];c[a2+4>>2]=c[ae+4>>2];c[a2+8>>2]=c[ae+8>>2];c[a2+12>>2]=c[ae+12>>2];c[a2+16>>2]=c[ae+16>>2];c[a2+20>>2]=c[ae+20>>2];c[bh+80>>2]=-1;c[bh+84>>2]=0;a2=bh+88|0;c[a2>>2]=c[12872];c[a2+4>>2]=c[12873];c[a2+8>>2]=c[12874];c[a2+12>>2]=c[12875];c[a2+16>>2]=c[12876];c[a2+20>>2]=c[12877];c[a2+24>>2]=c[12878];c[a2+28>>2]=c[12879];c[a2+32>>2]=c[12880];c[a2+36>>2]=c[12881];c[a2+40>>2]=c[12882];c[a2+44>>2]=c[12883];c[a2+48>>2]=c[12884];c[a2+52>>2]=c[12885];c[bh+144>>2]=1;h[bh+152>>3]=0.0;c[bh+160>>2]=0;h[bh+168>>3]=15.0;h[bh+176>>3]=90.0;c[bh+184>>2]=0;a2=bh+192|0;c[a2>>2]=c[12372];c[a2+4>>2]=c[12373];c[a2+8>>2]=c[12374];c[a2+12>>2]=c[12375];c[a2+16>>2]=c[12376];c[a2+20>>2]=c[12377];c[a2+24>>2]=c[12378];c[a2+28>>2]=c[12379];c[ay>>2]=aS;bj=aS}else{bj=aR}c[bj+8>>2]=1;c[bj+12>>2]=c[12890];c[bj+284>>2]=0;c[bj+240>>2]=0;a[bj+56|0]=0;c[11856]=1;aR=ey(aG,7,bj)|0;aG=(c[13898]|0)-1|0;c[bj+4>>2]=aG;bb=bj;bc=ax;bd=au;be=aG;bf=aR;bg=c[13898]|0}c[200]=2;c[144]=1;aR=c[8272]|0;if((bg|0)<(aR|0)){aG=bb+12|0;aS=bb+144|0;a2=bb+152|0;aV=bb+80|0;a3=bb+80|0;a4=bb+84|0;a7=bb+88|0;a8=a7;a5=bb+160|0;bk=bb+168|0;bl=bb+176|0;bm=bb+184|0;bn=aw+1|0;bo=a7|0;bp=bb+92|0;bq=bb+128|0;br=bb+132|0;bs=bb+96|0;bt=bb+120|0;bu=bb+272|0;bv=bb+224|0;bw=bb+64|0;bx=bb+56|0;by=bb+192|0;bz=by|0;bB=bb+24|0;bC=bd^1;bD=bb+240|0;bE=bb+8|0;bF=bb+232|0;bG=bb+22|0;bH=(as|0)==0;bI=bb+20|0;bJ=bb+16|0;bK=bb+284|0;bL=0;bN=0;bO=0;bQ=0;bR=0;bS=0;bT=0;bU=0;bV=bg;bW=aR;L5954:while(1){aR=c[1054]|0;bX=(a[aR+(bV*40&-1)|0]&1)==0;bY=c[aR+(bV*40&-1)+36>>2]|0;bZ=aR+(bV*40&-1)+32|0;L5956:do{if(bX){b_=c[bZ>>2]|0;aP=4648}else{b$=c[10036]|0;b0=0;while(1){if((b0|0)>=(bY|0)){aP=4478;break}if((a[b$+((c[bZ>>2]|0)+b0|0)|0]|0)==(a[b0+103664|0]|0)){b0=b0+1|0}else{break}}if((aP|0)==4478){aP=0;if((b0|0)==1){b1=bS;b2=bR;b3=bO;break L5954}}b$=c[bZ>>2]|0;if(!((bY|0)>0&(bX^1))){b_=b$;aP=4648;break}b4=c[10036]|0;b5=0;b6=0;b7=b$;while(1){if((a[b5+168032|0]|0)==(a[b4+(b5+b7|0)|0]|0)){b8=b7;b9=b6}else{if((b5|0)!=1){break}b8=b7-1|0;b9=1}ca=b5+1|0;if((ca|0)<(b9+bY|0)){b5=ca;b6=b9;b7=b8}else{aP=4485;break}}do{if((aP|0)==4485){aP=0;if((b9|0)==0){if(!((b5|0)==0|(b5|0)==6)){break}}if(bL){cb=bV;aP=6078;break L5888}cc=bV+1|0;c[13898]=cc;b7=c[aR+(cc*40&-1)+36>>2]|0;b6=c[aR+(cc*40&-1)+32>>2]|0;b4=(a[aR+(cc*40&-1)|0]&1)==0;b0=(b7|0)>0;ca=c[10036]|0;cd=30960;ce=115840;L5978:while(1){L5980:do{if(!b4){if(b0){cf=0;cg=0;ch=b6;while(1){ci=a[ce+cf|0]|0;if(ci<<24>>24==(a[ca+(cf+ch|0)|0]|0)){cj=ch;ck=cg}else{if(ci<<24>>24!=36){break L5980}cj=ch-1|0;ck=1}cl=cf+1|0;if((cl|0)<(ck+b7|0)){cf=cl;cg=ck;ch=cj}else{break}}if((ck|0)==0){cm=cl}else{cn=cd;break L5978}}else{cm=0}ch=a[ce+cm|0]|0;if((ch<<24>>24|0)==36|(ch<<24>>24|0)==0){cn=cd;break L5978}}}while(0);ch=cd+8|0;cg=c[ch>>2]|0;if((cg|0)==0){cn=ch;break}else{cd=ch;ce=cg}}ce=c[cn+4>>2]|0;if((ce-1|0)>>>0>=9){aP=4501;break L5888}c[bK>>2]=ce;c[aG>>2]=1;c[13898]=(c[13898]|0)+1;co=bU;cp=bT;cq=bS;cr=bR;cs=bQ;ct=bO;cu=bN;cv=1;break L5956}}while(0);if(bX){b_=b$;aP=4648;break}L5996:do{if((bY|0)>0){b5=c[10036]|0;ce=0;cd=0;b7=b$;while(1){if((a[ce+154504|0]|0)==(a[b5+(ce+b7|0)|0]|0)){cw=b7;cx=cd}else{if((ce|0)!=2){aP=4511;break L5996}cw=b7-1|0;cx=1}ca=ce+1|0;if((ca|0)<(cx+bY|0)){ce=ca;cd=cx;b7=cw}else{break}}if((cx|0)!=0){break}if(!((ce|0)==1|(ce|0)==4)){aP=4511}}else{aP=4511}}while(0);do{if((aP|0)==4511){aP=0;if(!((bY|0)>0&(bX^1))){b_=b$;aP=4648;break L5956}b7=c[10036]|0;cd=0;b5=0;ca=b$;while(1){if((a[cd+116896|0]|0)==(a[b7+(cd+ca|0)|0]|0)){cy=ca;cz=b5}else{if((cd|0)!=2){break}cy=ca-1|0;cz=1}b6=cd+1|0;if((b6|0)<(cz+bY|0)){cd=b6;b5=cz;ca=cy}else{aP=4517;break}}if((aP|0)==4517){aP=0;if((cz|0)!=0){break}if((cd|0)==1|(cd|0)==4){break}}if(bX){b_=b$;aP=4648;break L5956}L6020:do{if((bY|0)>0){ca=c[10036]|0;b5=0;b7=0;ce=b$;while(1){if((a[b5+224032|0]|0)==(a[ca+(b5+ce|0)|0]|0)){cA=ce;cB=b7}else{if((b5|0)!=1){break L6020}cA=ce-1|0;cB=1}b6=b5+1|0;if((b6|0)<(cB+bY|0)){b5=b6;b7=cB;ce=cA}else{break}}if((cB|0)==0){if(!((b5|0)==0|(b5|0)==5)){break}}if(bO){cb=bV;aP=6075;break L5888}a[bI]=a[36231]&1^1;do{if((a[32936]&1)!=0){if(bd){aP=4546;break L5888}if(bH){break}a[as]=0}}while(0);b5=c[13898]|0;cC=b5+1|0;c[13898]=cC;ce=c[1054]|0;b7=c[ce+(cC*40&-1)+36>>2]|0;ca=c[ce+(cC*40&-1)+32>>2]|0;b6=ce+(cC*40&-1)|0;L6038:do{if((a[b6]&1)!=0&(b7|0)>0){b0=c[10036]|0;b4=0;cg=0;ch=ca;while(1){if((a[b4+137208|0]|0)==(a[b0+(b4+ch|0)|0]|0)){cD=ch;cE=cg}else{if((b4|0)!=3){break L6038}cD=ch-1|0;cE=1}cf=b4+1|0;if((cf|0)<(cE+b7|0)){b4=cf;cg=cE;ch=cD}else{break}}if((cE|0)==0){if(!((b4|0)==2|(b4|0)==12)){break}}ch=c[8272]|0;L6050:do{if((ch|0)>(cC|0)){cg=c[10036]|0;b0=0;while(1){if((b0|0)>=(b7|0)){break}if((a[cg+(ca+b0|0)|0]|0)==(a[b0+141968|0]|0)){b0=b0+1|0}else{break L6050}}if((b0|0)!=10){break}cf=b5+2|0;if((ch|0)<=(cf|0)){break}if((a[ce+(cf*40&-1)|0]&1)==0){break}ci=c[ce+(cf*40&-1)+36>>2]|0;cF=ce+(cf*40&-1)+32|0;cf=0;while(1){if((cf|0)>=(ci|0)){break}if((a[cg+((c[cF>>2]|0)+cf|0)|0]|0)==(a[cf+199040|0]|0)){cf=cf+1|0}else{break L6050}}if((cf|0)==1){break L6038}}}while(0);eM(bb);co=bU;cp=bT;cq=bS;cr=bR;cs=bQ;ct=1;cu=bN;cv=bL;break L5956}}while(0);a[43504]=1;if((cC|0)>=(c[8272]|0)){aP=4577;break L5888}L6066:do{if((a[b6]&1)!=0){ce=c[10036]|0;b5=0;while(1){if((b5|0)>=(b7|0)){break}if((a[ce+(ca+b5|0)|0]|0)==(a[b5+103664|0]|0)){b5=b5+1|0}else{break L6066}}if((b5|0)==1){aP=4577;break L5888}}}while(0);a[14176]=1;is(j);a[14176]=0;if((c[ac>>2]|0)!=3){aP=4576;break L5888}ca=c[ad>>2]|0;c[bJ>>2]=ca;if((ca|0)==0){aP=6068;break L5888}a[43504]=0;co=bU;cp=bT;cq=bS;cr=bR;cs=bQ;ct=1;cu=bN;cv=bL;break L5956}}while(0);if(!((bY|0)>0&(bX^1))){b_=b$;aP=4648;break L5956}cd=c[10036]|0;ca=0;b7=0;b6=b$;while(1){if((a[ca+202e3|0]|0)==(a[cd+(ca+b6|0)|0]|0)){cG=b6;cH=b7}else{if((ca|0)!=3){break}cG=b6-1|0;cH=1}ce=ca+1|0;if((ce|0)<(cH+bY|0)){ca=ce;b7=cH;b6=cG}else{aP=4587;break}}do{if((aP|0)==4587){aP=0;if((cH|0)==0){if(!((ca|0)==2|(ca|0)==7)){break}}if(bO){cb=bV;aP=6077;break L5888}b6=bV+1|0;c[13898]=b6;b7=(a[aR+(b6*40&-1)|0]&1)==0;if(b7){aP=4592}else{cd=c[10036]|0;ce=a[cd+(c[aR+(b6*40&-1)+32>>2]|0)|0]|0;if((ce<<24>>24|0)==39|(ce<<24>>24|0)==34){cI=cd;aP=4602}else{aP=4592}}L6091:do{if((aP|0)==4592){aP=0;cd=c[10810]|0;if((cd|0)==0){break}ce=aR+(b6*40&-1)+36|0;ch=aR+(b6*40&-1)+32|0;b4=c[10036]|0;cF=cd;L6094:while(1){cd=c[cF+4>>2]|0;L6096:do{if(!((bW|0)<=(b6|0)|b7)){cg=c[ce>>2]|0;ci=0;while(1){if((ci|0)>=(cg|0)){break}if((a[b4+((c[ch>>2]|0)+ci|0)|0]|0)==(a[cd+ci|0]|0)){ci=ci+1|0}else{break L6096}}if((a[cd+ci|0]|0)==0){break L6094}}}while(0);cd=c[cF>>2]|0;if((cd|0)==0){break L6091}else{cF=cd}}if((a[cF+8|0]&1)!=0){break}if((c[cF+16>>2]|0)==3){cI=b4;aP=4602}}}while(0);L6105:do{if((aP|0)==4602){aP=0;if((b6|0)>=(bW|0)){break}L6108:do{if(!b7){ch=c[aR+(b6*40&-1)+36>>2]|0;ce=aR+(b6*40&-1)+32|0;b5=0;while(1){if((b5|0)>=(ch|0)){break}if((a[cI+((c[ce>>2]|0)+b5|0)|0]|0)==(a[b5+103664|0]|0)){b5=b5+1|0}else{break L6108}}if((b5|0)==1){break L6105}}}while(0);a[14176]=1;is(g);a[14176]=0;if((c[ab>>2]|0)==3){break}c[13898]=b6}}while(0);a[bG]=1;if(bH){co=bU;cp=bT;cq=bS;cr=bR;cs=bQ;ct=1;cu=bN;cv=bL;break L5956}a[as]=0;co=bU;cp=bT;cq=bS;cr=bR;cs=bQ;ct=1;cu=bN;cv=bL;break L5956}}while(0);if(!((bY|0)>0&(bX^1))){b_=b$;aP=4648;break L5956}ca=c[10036]|0;b6=0;b7=0;b4=b$;while(1){if((a[b6+196448|0]|0)==(a[ca+(b6+b4|0)|0]|0)){cJ=b4;cK=b7}else{if((b6|0)!=1){b_=b$;aP=4648;break L5956}cJ=b4-1|0;cK=1}cF=b6+1|0;if((cF|0)<(cK+bY|0)){b6=cF;b7=cK;b4=cJ}else{break}}if((cK|0)==0){if(!((b6|0)==0|(b6|0)==4)){b_=b$;aP=4648;break L5956}}if(bQ){cb=bV;aP=6082;break L5888}if(!((a[32936]&1)==0|bC)){aP=4622;break L5888}b4=bV+1|0;c[13898]=b4;b7=c[aR+(b4*40&-1)+36>>2]|0;ca=c[aR+(b4*40&-1)+32>>2]|0;cF=(a[aR+(b4*40&-1)|0]&1)==0;b4=(b7|0)>0;ce=c[10036]|0;ch=30672;cd=116448;L6132:while(1){L6134:do{if(!cF){if(b4){cf=0;cg=0;b0=ca;while(1){cL=a[cd+cf|0]|0;if(cL<<24>>24==(a[ce+(cf+b0|0)|0]|0)){cM=b0;cN=cg}else{if(cL<<24>>24!=36){break L6134}cM=b0-1|0;cN=1}cO=cf+1|0;if((cO|0)<(cN+b7|0)){cf=cO;cg=cN;b0=cM}else{break}}if((cN|0)==0){cP=cO}else{cQ=ch;break L6132}}else{cP=0}b0=a[cd+cP|0]|0;if((b0<<24>>24|0)==36|(b0<<24>>24|0)==0){cQ=ch;break L6132}}}while(0);b0=ch+8|0;cg=c[b0>>2]|0;if((cg|0)==0){cQ=b0;break}else{ch=b0;cd=cg}}cd=c[cQ+4>>2]|0;cR=bV+2|0;c[13898]=cR;if((cd|0)==-1){aP=4634;break L5888}c[aG>>2]=cd;if((cd|0)==345){hE(bD);cS=c[aG>>2]|0}else{cS=cd}L6151:do{if((cS|0)==400|(cS|0)==416|(cS|0)==432){cd=c[13898]|0;if((c[8272]|0)<=(cd|0)){break}ch=c[1054]|0;if((a[ch+(cd*40&-1)|0]&1)==0){break}b7=c[ch+(cd*40&-1)+36>>2]|0;ce=ch+(cd*40&-1)+32|0;ch=c[10036]|0;ca=0;while(1){if((ca|0)>=(b7|0)){break}if((a[ch+((c[ce>>2]|0)+ca|0)|0]|0)==(a[ca+224816|0]|0)){ca=ca+1|0}else{break L6151}}if((ca|0)!=8){break}c[13898]=cd+1;a[bF]=1}}while(0);if((c[bE>>2]|0)!=0){co=bU;cp=bT;cq=bS;cr=bR;cs=1;ct=bO;cu=bN;cv=bL;break L5956}ce=c[aG>>2]|0;if(!((ce&4|0)!=0|(ce|0)==368)){co=bU;cp=bT;cq=bS;cr=bR;cs=1;ct=bO;cu=bN;cv=bL;break L5956}uh(c[13898]|0,131840,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);c[aG>>2]=18;co=bU;cp=bT;cq=bS;cr=bR;cs=1;ct=bO;cu=bN;cv=bL;break L5956}}while(0);if(bN){cb=bV;aP=6081;break L5888}if(!((a[32936]&1)==0|bC)){aP=4521;break L5888}cT=bV+1|0;c[13898]=cT;b$=c[aR+(cT*40&-1)+36>>2]|0;ce=c[aR+(cT*40&-1)+32>>2]|0;ch=(a[aR+(cT*40&-1)|0]&1)==0;b7=(b$|0)>0;b4=c[10036]|0;L6166:do{if(ch){aP=6064}else{L6168:do{if(b7){cF=0;while(1){if((a[cF+122952|0]|0)!=(a[b4+(cF+ce|0)|0]|0)){break L6168}b6=cF+1|0;if((b6|0)<(b$|0)){cF=b6}else{cU=b6;aP=4526;break}}}else{cU=0;aP=4526}}while(0);if((aP|0)==4526){aP=0;cF=a[cU+122952|0]|0;if((cF<<24>>24|0)==36|(cF<<24>>24|0)==0){cV=31768;break}}if(ch){aP=6064;break}L6176:do{if(b7){cF=0;while(1){if((a[cF+121816|0]|0)!=(a[b4+(cF+ce|0)|0]|0)){break L6176}cd=cF+1|0;if((cd|0)<(b$|0)){cF=cd}else{cW=cd;aP=6053;break}}}else{cW=0;aP=6053}}while(0);if((aP|0)==6053){aP=0;cF=a[cW+121816|0]|0;if((cF<<24>>24|0)==36|(cF<<24>>24|0)==0){cV=31776;break}}if(ch){aP=6064;break}L6184:do{if(b7){cF=0;while(1){if((a[cF+119872|0]|0)!=(a[b4+(cF+ce|0)|0]|0)){break L6184}cd=cF+1|0;if((cd|0)<(b$|0)){cF=cd}else{cX=cd;aP=6058;break}}}else{cX=0;aP=6058}}while(0);if((aP|0)==6058){aP=0;cF=a[cX+119872|0]|0;if((cF<<24>>24|0)==36|(cF<<24>>24|0)==0){cV=31784;break}}if(ch){aP=6064;break}if(b7){cF=0;while(1){if((a[cF+116712|0]|0)!=(a[b4+(cF+ce|0)|0]|0)){aP=6064;break L6166}cd=cF+1|0;if((cd|0)<(b$|0)){cF=cd}else{cY=cd;break}}}else{cY=0}cF=a[cY+116712|0]|0;if((cF<<24>>24|0)==36|(cF<<24>>24|0)==0){cV=31792}else{aP=6064}}}while(0);if((aP|0)==6064){aP=0;cV=31800}b$=c[cV+4>>2]|0;if((b$|0)==0){c[200]=2;c[144]=1;c[13898]=bV+2;co=bU;cp=bT;cq=bS;cr=bR;cs=bQ;ct=bO;cu=1;cv=bL;break}else if((b$|0)==1){c[200]=6;c[144]=5;c[13898]=bV+2;co=bU;cp=bT;cq=bS;cr=bR;cs=bQ;ct=bO;cu=1;cv=bL;break}else if((b$|0)==2){c[200]=2;c[144]=5;c[13898]=bV+2;co=bU;cp=bT;cq=bS;cr=bR;cs=bQ;ct=bO;cu=1;cv=bL;break}else if((b$|0)==3){c[200]=6;c[144]=1;c[13898]=bV+2;co=bU;cp=bT;cq=bS;cr=bR;cs=bQ;ct=bO;cu=1;cv=bL;break}else{aP=4533;break L5888}}}while(0);L6205:do{if((aP|0)==4648){aP=0;aR=c[aG>>2]|0;if((aR|0)==252){L6209:do{if((bY|0)>0&(bX^1)){bZ=c[10036]|0;aE=0;b$=0;ce=b_;while(1){if((a[aE+130576|0]|0)==(a[bZ+(aE+ce|0)|0]|0)){cZ=ce;c_=b$}else{if((aE|0)!=7){break L6209}cZ=ce-1|0;c_=1}b4=aE+1|0;if((b4|0)<(c_+bY|0)){aE=b4;b$=c_;ce=cZ}else{break}}if((c_|0)==0){if(!((aE|0)==6|(aE|0)==11)){break}}c[aS>>2]=3;ce=(c[13898]|0)+1|0;c[13898]=ce;b$=c[1054]|0;L6221:do{if((a[b$+(ce*40&-1)|0]&1)!=0){bZ=c[10810]|0;if((bZ|0)==0){break L6209}b4=(c[8272]|0)>(ce|0);b7=b$+(ce*40&-1)+36|0;ch=b$+(ce*40&-1)+32|0;cF=c[10036]|0;cd=bZ;L6224:while(1){ca=c[cd+4>>2]|0;L6226:do{if(b4){b6=c[b7>>2]|0;cg=0;while(1){if((cg|0)>=(b6|0)){break}if((a[cF+((c[ch>>2]|0)+cg|0)|0]|0)==(a[ca+cg|0]|0)){cg=cg+1|0}else{break L6226}}if((a[ca+cg|0]|0)==0){aP=4665;break L6224}}}while(0);ca=c[cd>>2]|0;if((ca|0)==0){c$=bZ;break}else{cd=ca}}do{if((aP|0)==4665){aP=0;if((a[cd+8|0]&1)!=0){c$=bZ;break}if((c[cd+16>>2]|0)==1){break L6221}else{c$=bZ}}}while(0);L6236:while(1){bZ=c[c$+4>>2]|0;L6238:do{if(b4){cd=c[b7>>2]|0;ca=0;while(1){if((ca|0)>=(cd|0)){break}if((a[cF+((c[ch>>2]|0)+ca|0)|0]|0)==(a[bZ+ca|0]|0)){ca=ca+1|0}else{break L6238}}if((a[bZ+ca|0]|0)==0){break L6236}}}while(0);bZ=c[c$>>2]|0;if((bZ|0)==0){break L6209}else{c$=bZ}}if((a[c$+8|0]&1)!=0){break L6209}if((c[c$+16>>2]|0)!=2){break L6209}}}while(0);ce=is(f)|0;b$=c[ce>>2]|0;if((b$|0)==1){c0=+(c[ce+8>>2]|0)}else if((b$|0)==2){c0=+h[ce+8>>3]}else if((b$|0)==3){c0=+uz(c[ce+8>>2]|0,0)}else{aP=4680;break L5888}if((c[L>>2]|0)==3){uu(c[M>>2]|0);c[L>>2]=1}h[a2>>3]=c0}}while(0);c1=c[aG>>2]|0}else{c1=aR}do{if((c1|0)==225){ce=c[13898]|0;do{if(!bR){c[a3>>2]=-1;c[a4>>2]=0;c[a8>>2]=c[12872];c[a8+4>>2]=c[12873];c[a8+8>>2]=c[12874];c[a8+12>>2]=c[12875];c[a8+16>>2]=c[12876];c[a8+20>>2]=c[12877];c[a8+24>>2]=c[12878];c[a8+28>>2]=c[12879];c[a8+32>>2]=c[12880];c[a8+36>>2]=c[12881];c[a8+40>>2]=c[12882];c[a8+44>>2]=c[12883];c[a8+48>>2]=c[12884];c[a8+52>>2]=c[12885];c[aS>>2]=1;h[a2>>3]=0.0;c[a5>>2]=0;h[bk>>3]=15.0;h[bl>>3]=90.0;c[bm>>2]=0;if((a[30080]&1)!=0){lK(a7,bn);break}b$=c[8798]|0;aE=(b$|0)>0;ch=bn;L6265:while(1){cF=43264;while(1){c2=c[cF>>2]|0;if((c2|0)==0){break}if((c[c2+4>>2]|0)==(ch|0)){break L6265}else{cF=c2|0}}c3=ch-1|0;if(!((ch|0)>(b$|0)&aE)){aP=4699;break}ch=((c3|0)%(b$|0)&-1)+1|0}if((aP|0)==4699){aP=0;c[bp>>2]=c3;c[bq>>2]=1;c[br>>2]=c3;c[bs>>2]=c3;break}b$=c2+8|0;c[a8>>2]=c[b$>>2];c[a8+4>>2]=c[b$+4>>2];c[a8+8>>2]=c[b$+8>>2];c[a8+12>>2]=c[b$+12>>2];c[a8+16>>2]=c[b$+16>>2];c[a8+20>>2]=c[b$+20>>2];c[a8+24>>2]=c[b$+24>>2];c[a8+28>>2]=c[b$+28>>2];c[a8+32>>2]=c[b$+32>>2];c[a8+36>>2]=c[b$+36>>2];c[a8+40>>2]=c[b$+40>>2];c[a8+44>>2]=c[b$+44>>2];c[a8+48>>2]=c[b$+48>>2];c[a8+52>>2]=c[b$+52>>2];c[bo>>2]=0;if((c[(c[3524]|0)+96>>2]&1024|0)!=0){c[bp>>2]=ch;a[bt]=0;break}if((a[bt]&1)!=0){break}c[bq>>2]=1;c[br>>2]=c[bp>>2]}}while(0);hL(aV,1);b$=c[13898]|0;if((ce|0)==(b$|0)){c4=c[aG>>2]|0;break}else{if(bR){cb=b$;aP=6076;break L5888}else{co=bU;cp=bT;cq=bS;cr=1;cs=bQ;ct=bO;cu=bN;cv=bL;break L6205}}}else{c4=c1}}while(0);aR=c[13898]|0;do{if((c4|0)==489){if(bU){c5=aR}else{c[bu>>2]=c[12406];c5=c[13898]|0}b$=c[1054]|0;aE=c[b$+(c5*40&-1)+36>>2]|0;L6289:do{if((a[b$+(c5*40&-1)|0]&1)!=0&(aE|0)>0){cF=c[10036]|0;b7=0;b4=0;bZ=c[b$+(c5*40&-1)+32>>2]|0;while(1){if((a[b7+211736|0]|0)==(a[cF+(b7+bZ|0)|0]|0)){c6=bZ;c7=b4}else{if((b7|0)!=4){c8=c5;break L6289}c6=bZ-1|0;c7=1}cd=b7+1|0;if((cd|0)<(c7+aE|0)){b7=cd;b4=c7;bZ=c6}else{break}}if((c7|0)==0){if(!((b7|0)==3|(b7|0)==5)){c8=c5;break}}c9=c5+1|0;c[13898]=c9;bZ=(c[8272]|0)>(c9|0);if(!bZ){aP=6074;break L5888}L6302:do{if((a[b$+(c9*40&-1)|0]&1)==0){aP=4722}else{b4=c[b$+(c9*40&-1)+36>>2]|0;cF=b$+(c9*40&-1)+32|0;ch=c[10036]|0;cd=0;while(1){if((cd|0)>=(b4|0)){aP=4719;break}if((a[ch+((c[cF>>2]|0)+cd|0)|0]|0)==(a[cd+150688|0]|0)){cd=cd+1|0}else{break}}do{if((aP|0)==4719){aP=0;if((cd|0)!=2){break}c[bu>>2]=0;break L6302}}while(0);if(bZ){aP=4722}else{aP=6071;break L5888}}}while(0);L6311:do{if((aP|0)==4722){aP=0;L6313:do{if((a[b$+(c9*40&-1)|0]&1)!=0){b7=c[b$+(c9*40&-1)+36>>2]|0;cd=b$+(c9*40&-1)+32|0;cF=c[10036]|0;ch=0;while(1){if((ch|0)>=(b7|0)){break}if((a[cF+((c[cd>>2]|0)+ch|0)|0]|0)==(a[ch+211336|0]|0)){ch=ch+1|0}else{break L6313}}if((ch|0)!=2){break}c[bu>>2]=1;break L6311}}while(0);if(!bZ){aP=6072;break L5888}if((a[b$+(c9*40&-1)|0]&1)==0){aP=6073;break L5888}cd=c[b$+(c9*40&-1)+36>>2]|0;cF=b$+(c9*40&-1)+32|0;b7=c[10036]|0;ca=0;while(1){if((ca|0)>=(cd|0)){break}if((a[b7+((c[cF>>2]|0)+ca|0)|0]|0)==(a[ca+210848|0]|0)){ca=ca+1|0}else{aP=6069;break L5888}}if((ca|0)!=2){aP=6070;break L5888}c[bu>>2]=2}}while(0);bZ=(c[13898]|0)+1|0;c[13898]=bZ;c8=bZ}else{c8=c5}}while(0);if((aR|0)==(c8|0)){da=c[aG>>2]|0;break}else{if(bU){cb=c8;aP=6079;break L5888}else{co=1;cp=bT;cq=bS;cr=bR;cs=bQ;ct=bO;cu=bN;cv=bL;break L6205}}}else{da=c4}}while(0);do{if((da|0)==368){b$=c[bv>>2]|0;if((b$|0)==0){uE(E|0,0,28);aE=ut(192)|0;if((aE|0)==0){gk();ce=ut(192)|0;if((ce|0)==0){aP=4744;break L5888}else{dd=ce}}else{dd=aE}c[dd>>2]=0;c[dd+4>>2]=-1;c[dd+72>>2]=0;c[dd+88>>2]=0;uE(dd+8|0,0,60);c[dd+96>>2]=1;c[dd+144>>2]=4;c[dd+148>>2]=4;c[dd+152>>2]=4;aE=dd+156|0;c[aE>>2]=c[E>>2];c[aE+4>>2]=c[E+4>>2];c[aE+8>>2]=c[E+8>>2];c[aE+12>>2]=c[E+12>>2];c[aE+16>>2]=c[E+16>>2];c[aE+20>>2]=c[E+20>>2];c[aE+24>>2]=c[E+24>>2];a[dd+184|0]=0;c[bv>>2]=dd;c[dd+48>>2]=1;c[(c[bv>>2]|0)+56>>2]=99;de=c[bv>>2]|0}else{de=b$}jw(de);b$=c[13898]|0;if((aR|0)==(b$|0)){break}if(bT){cb=b$;aP=6080;break L5888}else{co=bU;cp=1;cq=bS;cr=bR;cs=bQ;ct=bO;cu=bN;cv=bL;break L6205}}else{uE(O|0,0,56);h[U>>3]=1.0;h[V>>3]=-2.0;c[Q>>2]=aw;c[W>>2]=av;do{if((a[30080]&1)==0){b$=c[8798]|0;aE=(b$|0)>0;ce=bn;L6346:while(1){bZ=43264;while(1){df=c[bZ>>2]|0;if((df|0)==0){break}if((c[df+4>>2]|0)==(ce|0)){break L6346}else{bZ=df|0}}dg=ce-1|0;if(!((ce|0)>(b$|0)&aE)){aP=4774;break}ce=((dg|0)%(b$|0)&-1)+1|0}if((aP|0)==4774){aP=0;c[Q>>2]=dg;c[Y>>2]=1;c[$>>2]=dg;c[W>>2]=dg;break}b$=df+8|0;c[O>>2]=c[b$>>2];c[O+4>>2]=c[b$+4>>2];c[O+8>>2]=c[b$+8>>2];c[O+12>>2]=c[b$+12>>2];c[O+16>>2]=c[b$+16>>2];c[O+20>>2]=c[b$+20>>2];c[O+24>>2]=c[b$+24>>2];c[O+28>>2]=c[b$+28>>2];c[O+32>>2]=c[b$+32>>2];c[O+36>>2]=c[b$+36>>2];c[O+40>>2]=c[b$+40>>2];c[O+44>>2]=c[b$+44>>2];c[O+48>>2]=c[b$+48>>2];c[O+52>>2]=c[b$+52>>2];c[X>>2]=0;if((c[(c[3524]|0)+96>>2]&1024|0)!=0){c[Q>>2]=ce;a[aa]=0;break}if((a[aa]&1)!=0){break}c[Y>>2]=1;c[$>>2]=c[Q>>2]}else{b$=43280;while(1){dh=c[b$>>2]|0;if((dh|0)==0){break}if((c[dh+4>>2]|0)==(bn|0)){aP=4751;break}else{b$=dh|0}}if((aP|0)==4751){aP=0;b$=dh+8|0;c[O>>2]=c[b$>>2];c[O+4>>2]=c[b$+4>>2];c[O+8>>2]=c[b$+8>>2];c[O+12>>2]=c[b$+12>>2];c[O+16>>2]=c[b$+16>>2];c[O+20>>2]=c[b$+20>>2];c[O+24>>2]=c[b$+24>>2];c[O+28>>2]=c[b$+28>>2];c[O+32>>2]=c[b$+32>>2];c[O+36>>2]=c[b$+36>>2];c[O+40>>2]=c[b$+40>>2];c[O+44>>2]=c[b$+44>>2];c[O+48>>2]=c[b$+48>>2];c[O+52>>2]=c[b$+52>>2];c[X>>2]=0;if((a[aa]&1)!=0){break}c[Y>>2]=1;c[$>>2]=c[Q>>2];break}b$=c[8798]|0;ce=(b$|0)>0;aE=bn;L6367:while(1){bZ=43264;while(1){di=c[bZ>>2]|0;if((di|0)==0){break}if((c[di+4>>2]|0)==(aE|0)){break L6367}else{bZ=di|0}}dj=aE-1|0;if(!((aE|0)>(b$|0)&ce)){aP=4763;break}aE=((dj|0)%(b$|0)&-1)+1|0}if((aP|0)==4763){aP=0;c[Q>>2]=dj;c[Y>>2]=1;c[$>>2]=dj;c[W>>2]=dj;break}b$=di+8|0;c[O>>2]=c[b$>>2];c[O+4>>2]=c[b$+4>>2];c[O+8>>2]=c[b$+8>>2];c[O+12>>2]=c[b$+12>>2];c[O+16>>2]=c[b$+16>>2];c[O+20>>2]=c[b$+20>>2];c[O+24>>2]=c[b$+24>>2];c[O+28>>2]=c[b$+28>>2];c[O+32>>2]=c[b$+32>>2];c[O+36>>2]=c[b$+36>>2];c[O+40>>2]=c[b$+40>>2];c[O+44>>2]=c[b$+44>>2];c[O+48>>2]=c[b$+48>>2];c[O+52>>2]=c[b$+52>>2];c[X>>2]=0;if((c[(c[3524]|0)+96>>2]&1024|0)!=0){c[Q>>2]=aE;a[aa]=0;break}if((a[aa]&1)!=0){break}c[Y>>2]=1;c[$>>2]=c[Q>>2]}}while(0);b$=c[aG>>2]|0;if((b$|0)==474){c[W>>2]=c[14067];dk=c[aG>>2]|0}else{dk=b$}b$=(dk&2|0)!=0;hH(q,1,b$);b$=c[13898]|0;if((aR|0)==(b$|0)){break}if(bR){cb=b$;aP=6083;break L5888}c[bB>>2]=c[O>>2];c[bB+4>>2]=c[O+4>>2];c[bB+8>>2]=c[O+8>>2];c[bB+12>>2]=c[O+12>>2];c[bB+16>>2]=c[O+16>>2];c[bB+20>>2]=c[O+20>>2];c[bB+24>>2]=c[O+24>>2];c[bB+28>>2]=c[O+28>>2];c[bB+32>>2]=c[O+32>>2];c[bB+36>>2]=c[O+36>>2];c[bB+40>>2]=c[O+40>>2];c[bB+44>>2]=c[O+44>>2];c[bB+48>>2]=c[O+48>>2];c[bB+52>>2]=c[O+52>>2];co=bU;cp=bT;cq=bS;cr=1;cs=bQ;ct=bO;cu=bN;cv=bL;break L6205}}while(0);if((c[aG>>2]&8|0)==0){b1=bS;b2=bR;b3=bO;break L5954}b$=c[1054]|0;ce=a[b$+(aR*40&-1)|0]|0;L6389:do{if((c[8272]|0)>(aR|0)){if((ce&1)==0){aP=4787;break}bZ=c[b$+(aR*40&-1)+36>>2]|0;ca=b$+(aR*40&-1)+32|0;cF=c[10036]|0;b7=0;while(1){if((b7|0)>=(bZ|0)){break}if((a[cF+((c[ca>>2]|0)+b7|0)|0]|0)==(a[b7+116360|0]|0)){b7=b7+1|0}else{aP=4787;break L6389}}if((b7|0)==2){aP=4795}else{aP=4787}}else{aP=4787}}while(0);L6396:do{if((aP|0)==4787){aP=0;ca=c[b$+(aR*40&-1)+36>>2]|0;if(!((ce&1)!=0&(ca|0)>0)){dl=bS;break}cF=c[10036]|0;bZ=0;cd=0;b4=c[b$+(aR*40&-1)+32>>2]|0;while(1){if((a[bZ+121984|0]|0)==(a[cF+(bZ+b4|0)|0]|0)){dm=b4;dn=cd}else{if((bZ|0)!=4){dl=bS;break L6396}dm=b4-1|0;dn=1}cg=bZ+1|0;if((cg|0)<(dn+ca|0)){bZ=cg;cd=dn;b4=dm}else{break}}if((dn|0)!=0){aP=4795;break}if((bZ|0)==3|(bZ|0)==9){aP=4795}else{dl=bS}}}while(0);do{if((aP|0)==4795){aP=0;hJ(by,c[12372]|0,c[12373]|0,at,49504);if((c[aG>>2]|0)!=345){dl=1;break}if((c[bz>>2]|0)!=0){dl=1;break}c[bz>>2]=1;dl=1}}while(0);b$=c[13898]|0;ce=c[1054]|0;b4=a[ce+(b$*40&-1)|0]|0;L6412:do{if((c[8272]|0)>(b$|0)){if((b4&1)==0){aP=4804;break}cd=c[ce+(b$*40&-1)+36>>2]|0;ca=ce+(b$*40&-1)+32|0;cF=c[10036]|0;b7=0;while(1){if((b7|0)>=(cd|0)){break}if((a[cF+((c[ca>>2]|0)+b7|0)|0]|0)==(a[b7+179168|0]|0)){b7=b7+1|0}else{aP=4804;break L6412}}if((b7|0)==2){aP=4812}else{aP=4804}}else{aP=4804}}while(0);L6419:do{if((aP|0)==4804){aP=0;ca=c[ce+(b$*40&-1)+36>>2]|0;if(!((b4&1)!=0&(ca|0)>0)){dq=bR;dr=b$;break}cF=c[10036]|0;cd=0;bZ=0;cg=c[ce+(b$*40&-1)+32>>2]|0;while(1){if((a[cd+178592|0]|0)==(a[cF+(cd+cg|0)|0]|0)){ds=cg;dt=bZ}else{if((cd|0)!=5){dq=bR;dr=b$;break L6419}ds=cg-1|0;dt=1}b6=cd+1|0;if((b6|0)<(dt+ca|0)){cd=b6;bZ=dt;cg=ds}else{break}}if((dt|0)!=0){aP=4812;break}if((cd|0)==4|(cd|0)==9){aP=4812}else{dq=bR;dr=b$}}}while(0);if((aP|0)==4812){aP=0;hH(r,0,0);c[bw>>2]=c[N>>2];c[bw+4>>2]=c[N+4>>2];c[bw+8>>2]=c[N+8>>2];c[bw+12>>2]=c[N+12>>2];a[bx]=1;dq=1;dr=c[13898]|0}if((aR|0)==(dr|0)){b1=dl;b2=dq;b3=bO;break L5954}else{co=bU;cp=bT;cq=dl;cr=dq;cs=bQ;ct=bO;cu=bN;cv=bL}}}while(0);bY=c[13898]|0;bX=c[8272]|0;if((bY|0)<(bX|0)){bL=cv;bN=cu;bO=ct;bQ=cs;bR=cr;bS=cq;bT=cp;bU=co;bV=bY;bW=bX}else{b1=cq;b2=cr;b3=ct;break}}bW=bb+21|0;a[bW]=0;if(b3){du=as;dv=b2;dw=b1}else{dx=b2;dy=b1;dz=bW;aP=4816}}else{bW=bb+21|0;a[bW]=0;dx=0;dy=0;dz=bW;aP=4816}do{if((aP|0)==4816){aP=0;a[bb+20|0]=1;if((c[9056]|0)!=1){if((as|0)==0){du=0;dv=dx;dw=dy;break}a[as]=0;du=as;dv=dx;dw=dy;break}bW=bb+16|0;bU=c[1054]|0;bT=(c[bU+(be*40&-1)+36>>2]|0)+(c[bU+(be*40&-1)+32>>2]|0)|0;bS=db(c[bW>>2]|0,(bT+1|0)-(c[bU+(aQ*40&-1)+32>>2]|0)|0,116456)|0;c[bW>>2]=bS;bU=c[(c[1054]|0)+(aQ*40&-1)+32>>2]|0;L6441:do{if((bU|0)<(bT|0)){bR=bU;bQ=bS;while(1){bO=a[(c[10036]|0)+bR|0]|0;if(bO<<24>>24==0){dA=bQ;break L6441}bN=bQ+1|0;a[bQ]=bO;bO=bR+1|0;if((bO|0)<(bT|0)){bR=bO;bQ=bN}else{dA=bN;break}}}else{dA=bS}}while(0);a[dA]=0;if(bd){dB=c[bW>>2]|0}else{dB=as}a[dz]=1;du=dB;dv=dx;dw=dy}}while(0);bS=bb+12|0;bT=c[bS>>2]|0;do{if((bT|0)==225){if(dv){dC=bb+88|0}else{bU=bb+80|0;bQ=bb+88|0;bR=aw+1|0;do{if((a[30080]&1)==0){aR=bQ|0;bN=c[aR>>2]|0;bO=c[8798]|0;bL=(bO|0)>0;bx=bR;L6458:while(1){bw=43264;while(1){dD=c[bw>>2]|0;if((dD|0)==0){break}if((c[dD+4>>2]|0)==(bx|0)){break L6458}else{bw=dD|0}}dE=bx-1|0;if(!((bx|0)>(bO|0)&bL)){aP=4840;break}bx=((dE|0)%(bO|0)&-1)+1|0}if((aP|0)==4840){aP=0;c[bb+92>>2]=dE;c[bb+128>>2]=1;c[bb+132>>2]=dE;c[bb+96>>2]=dE;break}bO=bQ;bL=dD+8|0;c[bO>>2]=c[bL>>2];c[bO+4>>2]=c[bL+4>>2];c[bO+8>>2]=c[bL+8>>2];c[bO+12>>2]=c[bL+12>>2];c[bO+16>>2]=c[bL+16>>2];c[bO+20>>2]=c[bL+20>>2];c[bO+24>>2]=c[bL+24>>2];c[bO+28>>2]=c[bL+28>>2];c[bO+32>>2]=c[bL+32>>2];c[bO+36>>2]=c[bL+36>>2];c[bO+40>>2]=c[bL+40>>2];c[bO+44>>2]=c[bL+44>>2];c[bO+48>>2]=c[bL+48>>2];c[bO+52>>2]=c[bL+52>>2];c[aR>>2]=bN;if((c[(c[3524]|0)+96>>2]&1024|0)!=0){c[bb+92>>2]=bx;a[bb+120|0]=0;break}if((a[bb+120|0]&1)!=0){break}c[bb+128>>2]=1;c[bb+132>>2]=c[bb+92>>2]}else{lK(bQ,bR)}}while(0);hL(bU,1);dC=bQ}bR=bb+24|0;bW=dC;c[bR>>2]=c[bW>>2];c[bR+4>>2]=c[bW+4>>2];c[bR+8>>2]=c[bW+8>>2];c[bR+12>>2]=c[bW+12>>2];c[bR+16>>2]=c[bW+16>>2];c[bR+20>>2]=c[bW+20>>2];c[bR+24>>2]=c[bW+24>>2];c[bR+28>>2]=c[bW+28>>2];c[bR+32>>2]=c[bW+32>>2];c[bR+36>>2]=c[bW+36>>2];c[bR+40>>2]=c[bW+40>>2];c[bR+44>>2]=c[bW+44>>2];c[bR+48>>2]=c[bW+48>>2];c[bR+52>>2]=c[bW+52>>2];dF=1}else{if(dv){dF=1;break}bW=bb+24|0;bR=bb+28|0;c[bR>>2]=aw;h[bb+40>>3]=1.0;bL=bb+32|0;c[bL>>2]=av;h[bb+48>>3]=+h[3817];bO=bb+56|0;a[bO]=0;bw=aw+1|0;do{if((a[30080]&1)==0){cd=bW|0;bz=c[cd>>2]|0;aG=c[8798]|0;by=(aG|0)>0;bB=bw;L6479:while(1){bn=43264;while(1){dG=c[bn>>2]|0;if((dG|0)==0){break}if((c[dG+4>>2]|0)==(bB|0)){break L6479}else{bn=dG|0}}dH=bB-1|0;if(!((bB|0)>(aG|0)&by)){aP=4856;break}bB=((dH|0)%(aG|0)&-1)+1|0}if((aP|0)==4856){aP=0;c[bR>>2]=dH;c[bb+64>>2]=1;c[bb+68>>2]=dH;c[bL>>2]=dH;dI=bT;break}aG=bW;by=dG+8|0;c[aG>>2]=c[by>>2];c[aG+4>>2]=c[by+4>>2];c[aG+8>>2]=c[by+8>>2];c[aG+12>>2]=c[by+12>>2];c[aG+16>>2]=c[by+16>>2];c[aG+20>>2]=c[by+20>>2];c[aG+24>>2]=c[by+24>>2];c[aG+28>>2]=c[by+28>>2];c[aG+32>>2]=c[by+32>>2];c[aG+36>>2]=c[by+36>>2];c[aG+40>>2]=c[by+40>>2];c[aG+44>>2]=c[by+44>>2];c[aG+48>>2]=c[by+48>>2];c[aG+52>>2]=c[by+52>>2];c[cd>>2]=bz;if((c[(c[3524]|0)+96>>2]&1024|0)!=0){c[bR>>2]=bB;a[bO]=0;dI=bT;break}if((a[bO]&1)!=0){dI=bT;break}c[bb+64>>2]=1;c[bb+68>>2]=c[bR>>2];dI=bT}else{lK(bW,bw);dI=c[bS>>2]|0}}while(0);if((dI|0)==474){c[bL>>2]=c[14067]}bw=(dI&2|0)!=0;hH(bW,1,bw);dF=0}}while(0);bT=c[bS>>2]|0;bw=(bT&2|0)==0;if(!bw){c[bb+24>>2]=1}bR=bb+8|0;do{if(!((c[bR>>2]|0)!=0|bw)){bO=bb+48|0;if(+h[bO>>3]!=-3.0){break}h[bO>>3]=1.0}}while(0);if((a[30528]&1)!=0){if(!((bT|0)==1|(bT|0)==18|(bT|0)==33|(bT|0)==51|(bT|0)==64|(bT|0)==225|(bT|0)==345|(bT|0)==368|(bT|0)==457|(bT|0)==102|(bT|0)==295)){aP=4867;break L5888}}do{if((bT&8|0)==0){dJ=at;dK=bT}else{if(!dw){hJ(bb+192|0,c[12372]|0,c[12373]|0,at,49504)}bw=bb+192|0;bO=c[bw>>2]|0;if((bO|0)==2|(bO|0)==5){dL=(c[bb+200>>2]|0)+1|0}else{dL=at}bQ=c[bS>>2]|0;if((bQ|0)!=345){dJ=dL;dK=bQ;break}if((bO|0)!=0){dJ=dL;dK=345;break}c[bw>>2]=1;dJ=dL;dK=345}}while(0);bT=bb+304|0;c[bT>>2]=c[200];bw=bb+308|0;c[bw>>2]=c[144];if((dK|0)==368){bO=bb+224|0;bQ=c[bO>>2]|0;if((bQ|0)==0){uE(E|0,0,28);bU=ut(192)|0;if((bU|0)==0){gk();by=ut(192)|0;if((by|0)==0){aP=4880;break L5888}else{dM=by}}else{dM=bU}c[dM>>2]=0;c[dM+4>>2]=-1;c[dM+72>>2]=0;c[dM+88>>2]=0;uE(dM+8|0,0,60);c[dM+96>>2]=1;c[dM+144>>2]=4;c[dM+148>>2]=4;c[dM+152>>2]=4;bU=dM+156|0;c[bU>>2]=c[E>>2];c[bU+4>>2]=c[E+4>>2];c[bU+8>>2]=c[E+8>>2];c[bU+12>>2]=c[E+12>>2];c[bU+16>>2]=c[E+16>>2];c[bU+20>>2]=c[E+20>>2];c[bU+24>>2]=c[E+24>>2];a[dM+184|0]=0;c[bO>>2]=dM;c[dM+48>>2]=1;c[(c[bO>>2]|0)+56>>2]=99;dN=c[bO>>2]|0}else{dN=bQ}c[dN+8>>2]=(c[200]|0)==6&1;c[(c[bO>>2]|0)+12>>2]=(c[144]|0)==5&1;bQ=bb+64|0;bU=c[bO>>2]|0;bO=bQ;by=bU+72|0;c[bO>>2]=c[by>>2];c[bO+4>>2]=c[by+4>>2];c[bO+8>>2]=c[by+8>>2];c[bO+12>>2]=c[by+12>>2];by=bU+72|0;if((c[by>>2]|0)==7){c[bb+28>>2]=-6}do{if((c[bU+88>>2]|0)>0){aG=c[by>>2]|0;if((aG|0)==3){if(+h[bU+80>>3]<0.0){break}}else if((aG|0)==6|(aG|0)==7){break}aG=bU+128|0;bx=c[aG>>2]|0;do{if((bx|0)==3){if(+h[bU+136>>3]>=0.0){break}bN=aG;c[bO>>2]=c[bN>>2];c[bO+4>>2]=c[bN+4>>2];c[bO+8>>2]=c[bN+8>>2];c[bO+12>>2]=c[bN+12>>2];dO=c[bU+128>>2]|0;aP=4890}else{dO=bx;aP=4890}}while(0);do{if((aP|0)==4890){aP=0;if((dO|0)!=6){break}c[bQ>>2]=6}}while(0);if((c[bU+92>>2]|0)!=-6){break}c[bb+28>>2]=-6}}while(0);dP=c[bS>>2]|0}else{dP=dK}do{if((dP|0)==474){bU=bb+224|0;if((c[bU>>2]|0)!=0){dQ=474;dR=ap;break}uE(E|0,0,28);bQ=ut(192)|0;if((bQ|0)==0){gk();bO=ut(192)|0;if((bO|0)==0){aP=4899;break L5888}else{dS=bO}}else{dS=bQ}c[dS>>2]=0;c[dS+4>>2]=-1;c[dS+72>>2]=0;c[dS+88>>2]=0;uE(dS+8|0,0,60);c[dS+96>>2]=1;c[dS+144>>2]=4;c[dS+148>>2]=4;c[dS+152>>2]=4;bQ=dS+156|0;c[bQ>>2]=c[E>>2];c[bQ+4>>2]=c[E+4>>2];c[bQ+8>>2]=c[E+8>>2];c[bQ+12>>2]=c[E+12>>2];c[bQ+16>>2]=c[E+16>>2];c[bQ+20>>2]=c[E+20>>2];c[bQ+24>>2]=c[E+24>>2];a[dS+184|0]=0;c[bU>>2]=dS;dU=c[bS>>2]|0;aP=4901}else{dU=dP;aP=4901}}while(0);do{if((aP|0)==4901){aP=0;if((dU|0)==392){if((a[64788+((c[200]|0)*688&-1)|0]&1)!=0){aP=4903;break L5888}if(((c[9670]|0)-1|0)>>>0<2){if((a[64788+((c[144]|0)*688&-1)|0]&1)!=0){aP=4906;break L5888}}bU=ap+1|0;bQ=bb+280|0;c[bQ>>2]=bU;if((bU|0)==0){bO=ut(248)|0;if((bO|0)==0){gk();by=ut(248)|0;if((by|0)==0){aP=4910;break L5888}else{dV=by}}else{dV=bO}bO=dV;by=bb+276|0;c[by>>2]=bO;bx=c[9666]|0;aG=c[3568]|0;if((aG|0)!=0){uu(aG)}c[3568]=0;c[dV>>2]=c[9670];c[dV+4>>2]=c[9671];c[dV+8>>2]=c[9672];c[dV+12>>2]=c[9673];c[dV+16>>2]=c[9674];c[dV+20>>2]=c[9675];c[dV+24>>2]=c[9676];c[dV+28>>2]=c[9677];c[dV+32>>2]=c[9678];c[dV+36>>2]=c[9679];c[dV+40>>2]=c[9680];c[dV+44>>2]=c[9681];c[dV+48>>2]=c[9682];c[dV+52>>2]=c[9683];uE(dV+56|0,0,192);c[9682]=bO;c[dV+116>>2]=bx;c[9666]=0;h[(c[by>>2]|0)+16>>3]=aq;c[(c[by>>2]|0)+32>>2]=ao;c[(c[by>>2]|0)+36>>2]=an}else{by=c[9682]|0;c[bb+276>>2]=by;bx=by+8|0;c[bx>>2]=(c[bx>>2]|0)+1}bx=c[bb+276>>2]|0;do{if(!dF){by=c[bx+32>>2]|0;if((by|0)==-5){break}bO=bb+24|0;aG=bO|0;bW=c[aG>>2]|0;bL=c[8798]|0;bN=(bL|0)>0;aR=(c[bQ>>2]|0)+by|0;L6573:while(1){by=43264;while(1){dW=c[by>>2]|0;if((dW|0)==0){break}if((c[dW+4>>2]|0)==(aR|0)){break L6573}else{by=dW|0}}dX=aR-1|0;if(!((aR|0)>(bL|0)&bN)){aP=4928;break}aR=((dX|0)%(bL|0)&-1)+1|0}if((aP|0)==4928){aP=0;c[bb+28>>2]=dX;c[bb+64>>2]=1;c[bb+68>>2]=dX;c[bb+32>>2]=dX;break}bL=bO;bN=dW+8|0;c[bL>>2]=c[bN>>2];c[bL+4>>2]=c[bN+4>>2];c[bL+8>>2]=c[bN+8>>2];c[bL+12>>2]=c[bN+12>>2];c[bL+16>>2]=c[bN+16>>2];c[bL+20>>2]=c[bN+20>>2];c[bL+24>>2]=c[bN+24>>2];c[bL+28>>2]=c[bN+28>>2];c[bL+32>>2]=c[bN+32>>2];c[bL+36>>2]=c[bN+36>>2];c[bL+40>>2]=c[bN+40>>2];c[bL+44>>2]=c[bN+44>>2];c[bL+48>>2]=c[bN+48>>2];c[bL+52>>2]=c[bN+52>>2];c[aG>>2]=bW;if((c[(c[3524]|0)+96>>2]&1024|0)!=0){c[bb+28>>2]=aR;a[bb+56|0]=0;break}if((a[bb+56|0]&1)!=0){break}c[bb+64>>2]=1;c[bb+68>>2]=c[bb+28>>2]}}while(0);bN=c[bx+36>>2]|0;if((bN|0)!=-5){c[bb+200>>2]=(c[bQ>>2]|0)+bN}dY=bU;dZ=c[bS>>2]|0}else{dY=ap;dZ=dU}if((dZ|0)!=400){dQ=dZ;dR=dY;break}a[bb+56|0]=1;dQ=400;dR=dY}}while(0);do{if((c[bR>>2]|0)==1){if((bf|0)<0){c[bR>>2]=4;d_=aw+1|0;d$=(dQ>>>1&1)+av|0;break}bN=c[200]|0;bL=o+(bN<<2)|0;bB=c[bL>>2]|0;do{if((bB&1|0)==0){bz=c[64648+(bN*688&-1)>>2]|0;if((bz|0)==0){break}if((bz&1|0)!=0){h[64664+(bN*688&-1)>>3]=8.988465674311579e+307}if((bz&2|0)==0){break}h[64672+(bN*688&-1)>>3]=-8.988465674311579e+307}}while(0);if((c[64808+(bN*688&-1)>>2]|0)==1&(bf|0)<2){aP=4944;break L5888}bU=c[144]|0;if((c[64808+(bU*688&-1)>>2]|0)==1&(bf|0)<1){aP=4946;break L5888}c[12210]=bN;c[12211]=bU;c[bL>>2]=bB|1;bQ=o+(bU<<2)|0;c[bQ>>2]=c[bQ>>2]|1;aP=4950}else{if(!((a[32936]&1)==0|bd^1)){aP=4950;break}bQ=o+(c[200]<<2)|0;c[bQ>>2]=c[bQ>>2]|2;bQ=o+(c[144]<<2)|0;c[bQ>>2]=c[bQ>>2]|2;aP=4950}}while(0);do{if((aP|0)==4950){aP=0;do{if(bd){d0=aw;d1=av}else{bQ=c[bS>>2]|0;if((bQ|0)==400|(bQ|0)==416|(bQ|0)==432){d0=aw;d1=av;break}d0=aw+1|0;d1=(bQ>>>1&1)+av|0}}while(0);if((c[bR>>2]|0)!=1){d_=d0;d$=d1;break}d2=bb+4|0;bB=c[d2>>2]|0;bL=bb+316|0;do{if((c[bL>>2]|0)==0){bN=c[bb+64>>2]|0;do{if((bN|0)==3){if(+h[bb+72>>3]>=0.0){d3=0;break}d3=1}else{d3=0}}while(0);if(!((c[bb+284>>2]|0)==0&((c[bb+28>>2]|0)==-6|((bN|0)==6|d3)))){break}aR=c[bb+296>>2]<<3;bW=ut(aR)|0;if((bW|0)==0){gk();aG=ut(aR)|0;if((aG|0)==0){aP=4961;break L5888}else{d4=aG}}else{d4=bW}c[bL>>2]=d4}}while(0);bW=bb+312|0;c[bW>>2]=99;aG=c[11870]|0;if((aG|0)==1){c[12210]=c[12211]}aR=c[bS>>2]|0;do{if((aR|0)==311|(aR|0)==118|(aR|0)==137){if((aG|0)<=5){d5=4;d6=7;break}bO=c[12210]|0;c[12213]=bO;c[12212]=bO;bO=c[12211]|0;c[12215]=bO;c[12214]=bO;d5=4;d6=7}else if((aR|0)==257){c[bW>>2]=c[bw>>2];bO=c[12211]|0;c[12214]=bO;c[12213]=bO;c[12212]=bO;d5=5;d6=6}else if((aR|0)==474){c[272]=1;bO=c[273]|0;if((bO|0)==0){d5=2;d6=4;break}if((c[bO>>2]|0)!=2){d5=2;d6=4;break}bQ=bO+40|0;if((c[bQ>>2]|0)!=42){d5=2;d6=4;break}c[bQ>>2]=43;d5=2;d6=4}else if((aR|0)==252){c[bW>>2]=c[bw>>2];bQ=c[12211]|0;c[12214]=bQ;c[12213]=bQ;c[12212]=bQ;d5=5;d6=7}else if((aR|0)==169){if(!((aG|0)==4&+h[7030]==-2.0|(aG|0)>4)){d5=3;d6=6;break}bQ=c[12211]|0;c[12213]=bQ;c[12212]=bQ;d5=3;d6=6}else if((aR|0)==279|(aR|0)==86){if((aG|0)<=3){d5=3;d6=5;break}bQ=c[12210]|0;c[12213]=bQ;c[12212]=bQ;d5=3;d6=5}else if((aR|0)==295|(aR|0)==102){if((aG|0)<=3){d5=2;d6=5;break}bQ=c[12211]|0;c[12213]=bQ;c[12212]=bQ;d5=2;d6=5}else if((aR|0)==392){d5=1;d6=3}else if((aR|0)==153){d5=1;d6=4}else if((aR|0)==345){c[12212]=c[12211];d5=1;d6=3}else if((aR|0)==33|(aR|0)==1|(aR|0)==64){d5=1;d6=3}else if((aR|0)==368){c[269]=1;bQ=c[270]|0;if((bQ|0)==0){d5=3;d6=4;break}if((c[bQ>>2]|0)!=2){d5=3;d6=4;break}bO=bQ+40|0;if((c[bO>>2]|0)!=42){d5=3;d6=4;break}c[bO>>2]=43;d5=3;d6=4}else if((aR|0)==400){d5=3;d6=3}else if((aR|0)==416){d5=5;d6=6}else if((aR|0)==432){d5=6;d6=6}else if((aR|0)==457){d5=2;d6=6}else if((aR|0)==489){d5=2;d6=6}else if((aR|0)==18|(aR|0)==51){d5=1;d6=4}else if((aR|0)==225){d5=4;d6=5}else{d5=1;d6=2}}while(0);aR=bb+284|0;if((c[aR>>2]|0)==1){c[bW>>2]=0;c[12212]=0;d7=3}else{d7=d6}aG=c[11870]|0;if((aG|0)>(d7|0)){aP=4998;break L5888}if((aG|0)>0&(aG|0)<(d5|0)){aP=5e3;break L5888}aG=c[8270]|0;do{if((aG|0)!=0){if((aY(aG|0,139696)|0)==0){break}bA(4,aG|0)}}while(0);a[47040]=1;aG=eC(F,d7)|0;do{if((aG|0)==-1){d8=0;d9=0}else{bW=bb+296|0;bO=bb+320|0;bQ=bb+280|0;bU=bb+276|0;bx=bb+244|0;bz=bb+224|0;cd=bb+23|0;by=bb+288|0;bn=0;bv=0;bu=aG;while(1){if((bv|0)>=(c[bW>>2]|0)){iR(bb,(bv<<1)+1e3|0)}do{if((bu|0)>0){aV=bn+1|0;bp=c[bL>>2]|0;if((bp|0)==0){ea=bu;eb=aV;break}br=c[bS>>2]|0;if((br|0)==252|(br|0)==257){if((bu|0)<6){aP=5012;break L5888}}else if((br|0)==311|(br|0)==118|(br|0)==137){if(!((bu|0)==7|(bu|0)==5)){aP=5014;break L5888}}else if((br|0)==225){if((bu|0)<5){aP=5016;break L5888}}else if((br|0)==368|(br|0)==169|(br|0)==279|(br|0)==86|(br|0)==295|(br|0)==102){if((bu|0)<4){aP=5018;break L5888}}else if((br|0)==457){if((bu|0)==5|(bu|0)<3){aP=5020;break L5888}}else if((br|0)==489|(br|0)==153|(br|0)==18|(br|0)==51|(br|0)==33|(br|0)==1|(br|0)==64){if((bu|0)<3){aP=5022;break L5888}}br=bu-1|0;h[bp+(bv<<3)>>3]=+h[e+(br<<3)>>3];ea=br;eb=aV}else{ea=bu;eb=bn}}while(0);do{if((ea|0)==(-5|0)){if((c[bS>>2]|0)!=392){ec=bv;break}c[(c[bO>>2]|0)+(bv<<6)>>2]=2;ec=bv+1|0}else if((ea|0)==(-4|0)|(ea|0)==(-9|0)){ec=bv}else if((ea|0)==(-2|0)){c[(c[bO>>2]|0)+(bv<<6)>>2]=2;ec=bv+1|0}else if((ea|0)==(-3|0)){aV=c[bS>>2]|0;if((aV|0)==400|(aV|0)==416|(aV|0)==432){ec=bv;break}uD((c[bO>>2]|0)+(bv<<6)|0,56440,64);ec=bv+1|0}else if((ea|0)==(-6|0)){eL(bb);ec=bv}else if((ea|0)==(-7|0)){aI(115120,50,1,c[m>>2]|0);ec=bv}else if((ea|0)==0){aP=5034;break L5888}else if((ea|0)==1){h[G>>3]=+h[F>>3];h[F>>3]=+(c[11942]|0);aP=5036}else if((ea|0)==2){aP=5036}else if((ea|0)==3){if((c[aR>>2]|0)==1){ed=+h[F>>3];ee=+h[G>>3];iX(bb,bv,ed,ee,ed,ed,ee,ee,+h[H>>3]);ec=bv+1|0;break}aV=c[bS>>2]|0;if((aV|0)==392){if((c[9670]|0)==4){aP=5036;break}else{aP=5068}}else if((aV|0)==295|(aV|0)==102|(aV|0)==169){ee=+h[F>>3];ed=+h[G>>3];ef=+h[H>>3];iX(bb,bv,ee,ed,ee,ee,ed-ef,ed+ef,-1.0);ec=bv+1|0;break}else if((aV|0)==279|(aV|0)==86){ef=+h[F>>3];ed=+h[G>>3];ee=+h[H>>3];iX(bb,bv,ef,ed,ef-ee,ef+ee,ed,ed,0.0);ec=bv+1|0;break}else if((aV|0)==153){ed=+h[F>>3];ee=+h[G>>3];ef=+h[H>>3]*.5;iX(bb,bv,ed,ee,ed-ef,ed+ef,ee,ee,0.0);ec=bv+1|0;break}else if((aV|0)==368){ee=+h[F>>3];ef=+h[G>>3];iX(bb,bv,ee,ef,ee,ee,ef,ef,-1.0);br=(c[bO>>2]|0)+(bv<<6)|0;if((c[br>>2]|0)!=2){bp=c[bL>>2]|0;if((bp|0)==0){eg=0.0}else{eg=+h[bp+(bv<<3)>>3]}iW(c[bz>>2]|0,br,bv,c[11766]|0,eg)}ec=bv+1|0;break}else if((aV|0)==400){ef=+h[F>>3];ee=+h[G>>3];iX(bb,bv,ef,ee,ef,ef,ee,ee,+h[H>>3]);br=c[bO>>2]|0;bp=c[br+(bv<<6)>>2]|0;ee=+h[H>>3];L6717:do{if(ee>-8.988465674311579e+307&ee<8.988465674311579e+307){do{if((a[66852]&1)==0){h[br+(bv<<6)+32>>3]=ee}else{if(ee<0.0){h[br+(bv<<6)+32>>3]=ee;break L6717}if(ee==0.0){h[br+(bv<<6)+32>>3]=-8.988465674311579e+307;break L6717}else{ef=+_(+ee);h[br+(bv<<6)+32>>3]=ef/+h[8358];break}}}while(0);if(!((a[cd]&1)==0&(bp|0)==0)){break}ef=+h[H>>3];if(ef<+h[8347]){h[8347]=ef}do{if(ef<+h[8341]){if((c[16678]&1|0)==0){break L6717}if((c[16698]&1|0)==0){h[8341]=ef;break}ed=+h[8350];if(ed>ef){h[8341]=ed;break L6717}else{h[8341]=ef;break}}}while(0);if(ef>+h[8348]){h[8348]=ef}if(ef<=+h[8342]){break}if((c[16678]&2|0)==0){break}if((c[16699]&2|0)==0){h[8342]=ef;break}ed=+h[8353];if(ed>3]=ee}}while(0);ec=bv+1|0;break}else if((aV|0)==18|(aV|0)==51|(aV|0)==33|(aV|0)==1|(aV|0)==64){ee=+h[F>>3];ed=+h[G>>3];iX(bb,bv,ee,ed,ee,ee,ed,ed,+h[H>>3]);ec=bv+1|0;break}else if((aV|0)==474){ed=+h[F>>3];ee=+h[G>>3];eh=+h[H>>3];ei=eh*.5;iX(bb,bv,ed,ee,ed-ei,ed+ei,ee,ee,eh);ec=bv+1|0;break}else if((aV|0)==457){eh=+h[F>>3];ee=+h[H>>3];iX(bb,bv,eh,+h[G>>3],eh-ee,eh+ee,0.0,360.0,ee>=0.0?0.0:-1.0);ec=bv+1|0;break}else if((aV|0)==489){ee=+h[F>>3];eh=+h[G>>3];ei=+h[H>>3];ed=+P(+ei);iX(bb,bv,ee,eh,ed,ed,0.0,ei,ei>=0.0?0.0:-1.0);ec=bv+1|0;break}else if((aV|0)!=345){aP=5068}if((aP|0)==5068){aP=0;uh(bB,79800,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);c[bS>>2]=102}c[bx>>2]=13;ei=+h[F>>3];ed=+h[G>>3];iX(bb,bv,ei,ed,ei,ei,ed,+h[H>>3],-1.0);ec=bv+1|0}else if((ea|0)==4){br=c[bS>>2]|0;if((br|0)==137|(br|0)==311|(br|0)==118){ed=+h[F>>3];ei=+h[G>>3];eh=+h[H>>3];ee=+h[I>>3];iX(bb,bv,ed,ei,ed-eh,ed+eh,ei-ee,ei+ee,0.0);ec=bv+1|0;break}else if((br|0)==153){ee=+h[G>>3];iX(bb,bv,+h[F>>3],ee,+h[H>>3],+h[I>>3],ee,ee,0.0);ec=bv+1|0;break}else if((br|0)==279|(br|0)==86){ee=+h[G>>3];iX(bb,bv,+h[F>>3],ee,+h[H>>3],+h[I>>3],ee,ee,0.0);ec=bv+1|0;break}else if((br|0)==169){bp=bv+1|0;ee=+h[F>>3];ei=+h[G>>3];if(+h[7030]==-2.0){iX(bb,bv,ee,ei,ee,ee,+h[H>>3],+h[I>>3],-1.0);ec=bp;break}else{eh=+h[I>>3]*.5;ed=+h[H>>3];iX(bb,bv,ee,ei,ee-eh,ee+eh,ei-ed,ei+ed,0.0);ec=bp;break}}else if((br|0)==474){bp=bv+1|0;ed=+h[F>>3];ei=+h[G>>3];eh=+h[H>>3]*.5;ee=ed-eh;ej=ed+eh;aE=c[11767]|0;bq=c[by>>2]|0;L6774:do{if((aE|0)==0){ek=0}else{bt=c[bz>>2]|0;bo=eD(aE)|0;a8=uA(bo|0)|0;L6776:do{if((bt|0)!=0){bs=bt;while(1){a7=c[bs+60>>2]|0;if((a7|0)!=0){if((a_(bo|0,a7|0,a8|0)|0)==0){break}}a7=c[bs>>2]|0;if((a7|0)==0){break L6776}else{bs=a7}}uu(bo);ek=c[bs+4>>2]|0;break L6774}}while(0);c[by>>2]=bq+1;iW(c[bz>>2]|0,c[bO>>2]|0,bq,bo,0.0);uu(bo);ek=bq}}while(0);iX(bb,bv,ed,ei,ee,ej,+(ek|0),+h[G>>3],+h[H>>3]);ec=bp;break}else if((br|0)==225){ef=+h[F>>3];eh=+h[G>>3];iX(bb,bv,ef,eh,ef,ef+ +h[H>>3],eh,eh+ +h[I>>3],0.0);ec=bv+1|0;break}else if((br|0)==18|(br|0)==51|(br|0)==368){eh=+h[F>>3];ef=+h[G>>3];iX(bb,bv,eh,ef,eh,eh,ef,ef,+h[H>>3]);ec=bv+1|0;break}else if((br|0)==489){ef=+h[F>>3];eh=+h[G>>3];el=+h[H>>3];em=+P(+el);en=+h[I>>3];eo=+P(+en);if(el<0.0){ep=-1.0}else{ep=en>=0.0?0.0:-1.0}iX(bb,bv,ef,eh,em,eo,0.0,el,ep);ec=bv+1|0;break}else if(!((br|0)==295|(br|0)==102)){uh(bB,79024,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);c[bS>>2]=102}el=+h[F>>3];iX(bb,bv,el,+h[G>>3],el,el,+h[H>>3],+h[I>>3],-1.0);ec=bv+1|0}else if((ea|0)==5){bq=c[bS>>2]|0;if((bq|0)==257|(bq|0)==252){el=+h[F>>3];iX(bb,bv,el,+h[G>>3],el,el,+h[H>>3],+h[I>>3],+h[J>>3]);ec=bv+1|0;break}else if((bq|0)==225){el=+h[F>>3];eo=+h[G>>3];iX(bb,bv,el,eo,el,el+ +h[H>>3],eo,eo+ +h[I>>3],+h[J>>3]);ec=bv+1|0;break}else if((bq|0)==457){eo=+h[F>>3];el=+h[H>>3];iX(bb,bv,eo,+h[G>>3],eo-el,eo+el,+h[I>>3],+h[J>>3],el>=0.0?0.0:-1.0);ec=bv+1|0;break}else if((bq|0)==489){el=+h[F>>3];eo=+h[G>>3];em=+h[H>>3];eh=+P(+em);ef=+h[I>>3];en=+P(+ef);if(em<0.0){eq=-1.0}else{eq=ef>=0.0?0.0:-1.0}iX(bb,bv,el,eo,eh,en,+h[J>>3],em,eq);ec=bv+1|0;break}else if((bq|0)==416){aP=5148;break}else if((bq|0)!=169){uh(bB,78440,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);c[bS>>2]=169}em=+h[F>>3];en=+h[J>>3]*.5;iX(bb,bv,em,+h[G>>3],em-en,em+en,+h[H>>3],+h[I>>3],0.0);ec=bv+1|0}else if((ea|0)==7|(ea|0)==6){bq=c[bS>>2]|0;if((bq|0)==252){en=+h[F>>3];em=+h[K>>3];if(em>0.0){er=en-em*.5}else{er=en}iX(bb,bv,en,+h[G>>3],er,en,+h[H>>3],+h[I>>3],+h[J>>3]);ec=bv+1|0;break}else if((bq|0)==432|(bq|0)==416){aP=5148;break}else if(!((bq|0)==311|(bq|0)==118|(bq|0)==137)){uh(bB,78104,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);c[bS>>2]=118}iX(bb,bv,+h[F>>3],+h[G>>3],+h[H>>3],+h[I>>3],+h[J>>3],+h[K>>3],0.0);ec=bv+1|0}else{aP=5025;break L5888}}while(0);L6811:do{if((aP|0)==5036){aP=0;bq=c[bS>>2]|0;if((bq|0)!=392){en=+h[7030];do{if((bq|0)==153&en>0.0){if((a[56232]&1)==0){break}aE=c[bT>>2]|0;if((a[64788+(aE*688&-1)|0]&1)==0){em=+h[F>>3];eh=+h[G>>3];eo=en*.5;iX(bb,bv,em,eh,em-eo,eo+em,eh,eh,0.0);ec=bv+1|0;break L6811}else{eh=+h[64792+(aE*688&-1)>>3];em=+h[F>>3];eo=+h[G>>3];el=em*+R(+eh,+(en*-.5));iX(bb,bv,em,eo,el,em*+R(+eh,+(en*.5)),eo,eo,0.0);ec=bv+1|0;break L6811}}}while(0);if((bq|0)==457){en=+h[F>>3];iX(bb,bv,en,+h[G>>3],en,en,0.0,360.0,-1.0);ec=bv+1|0;break}else if((bq|0)==489){iX(bb,bv,+h[F>>3],+h[G>>3],0.0,0.0,0.0,0.0,-2.0);ec=bv+1|0;break}else if((bq|0)==102){en=+h[G>>3];h[H>>3]=en;ej=+h[F>>3];h[G>>3]=ej;ee=+(c[11942]|0);h[F>>3]=ee;iX(bb,bv,ee,ej,ee,ee,ej-en,en+ej,-1.0);ec=bv+1|0;break}else if((bq|0)==252|(bq|0)==257){uh(bB,81264,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);c[bS>>2]=18}ej=+h[F>>3];en=+h[G>>3];iX(bb,bv,ej,en,ej,ej,en,en,-1.0);ec=bv+1|0;break}br=c[9670]|0;if((br|0)==4){if((ea|0)==1){aP=5039;break L5888}else if((ea|0)==2){en=+h[F>>3];ej=+h[G>>3];h[I>>3]=en+ej;h[H>>3]=en-ej;es=en}else{h[I>>3]=+h[H>>3];h[H>>3]=+h[G>>3];es=+h[F>>3]}h[G>>3]=es;h[F>>3]=+(c[11942]|0)}else{if((ea|0)>1){aP=5044;break L5888}en=+h[G>>3];h[I>>3]=en;h[H>>3]=en}do{if((br|0)==2){en=+(c[bQ>>2]|0)+ +h[(c[bU>>2]|0)+16>>3];h[4834]=en;h[(c[bU>>2]|0)+24>>3]=en}else{en=+h[F>>3]+ +h[(c[bU>>2]|0)+16>>3];if(en<=+h[4834]){break}h[4834]=en;h[(c[bU>>2]|0)+24>>3]=en}}while(0);en=+h[7030];br=bv+1|0;ej=+h[F>>3];ee=+h[G>>3];if(en>0.0){ei=en*.5;iX(bb,bv,ej,ee,ej-ei,ej+ei,+h[H>>3],+h[I>>3],0.0);ec=br;break}else{iX(bb,bv,ej,ee,ej+-.5,ej+.5,+h[H>>3],+h[I>>3],0.0);ec=br;break}}else if((aP|0)==5148){aP=0;ej=+h[F>>3];ee=+h[G>>3];iX(bb,bv,ej,ee,ej,ej,ee,ee,+h[H>>3]);br=c[bO>>2]|0;h[br+(bv<<6)+40>>3]=+h[H>>3];h[br+(bv<<6)+48>>3]=+h[I>>3];h[br+(bv<<6)+56>>3]=+h[J>>3];h[br+(bv<<6)+32>>3]=+h[K>>3];ec=bv+1|0}}while(0);br=eC(F,d7)|0;if((br|0)==-1){break}else{bn=eb;bv=ec;bu=br}}if((ec|0)<=0){d8=ec;d9=eb;break}bu=ec-1|0;d8=(c[(c[bO>>2]|0)+(bu<<6)>>2]|0)==2?bu:ec;d9=eb}}while(0);bB=bb+300|0;c[bB>>2]=d8;iR(bb,d8);eL(bb);ez();bL=c[8270]|0;do{if((bL|0)!=0){if((aY(bL|0,139696)|0)==0){break}bA(4,139696)}}while(0);if((d9|0)==0){uh(-1,104952,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);c[bR>>2]=4;d_=d0;d$=d1;break}bL=c[bS>>2]|0;if((bL|0)==392){aG=c[9670]|0;L6860:do{if((aG|0)==1){if((c[64648+((c[bw>>2]|0)*688&-1)>>2]&2|0)==0){aP=5181;break}do{if((c[bb+280>>2]|0)==0){bu=c[3566]|0;if((bu|0)!=0){uu(bu)}bu=c[bB>>2]<<6;bv=ut(bu)|0;if((bv|0)==0){gk();bn=ut(bu)|0;if((bn|0)==0){aP=5164;break L5888}else{et=bn}}else{et=bv}bv=et;c[3566]=bv;c[3570]=0;if((c[bB>>2]|0)>0){eu=0}else{aP=5181;break L6860}while(1){bn=eu+1|0;uE(bv+(eu<<6)+32|0,0,16);c[3570]=bn;if((bn|0)<(c[bB>>2]|0)){eu=bn}else{ev=bn;break}}}else{bv=c[bB>>2]|0;bn=c[3570]|0;if((bv|0)<=(bn|0)){ev=bn;break}bn=db(c[3566]|0,bv<<6,91376)|0;c[3566]=bn;bv=c[3570]|0;if((bv|0)<(c[bB>>2]|0)){ew=bv}else{ev=bv;break}while(1){bv=ew+1|0;uE(bn+(ew<<6)+32|0,0,16);c[3570]=bv;if((bv|0)<(c[bB>>2]|0)){ew=bv}else{ev=bv;break}}}}while(0);if((ev|0)<=0){aP=5181;break}bO=bb+320|0;bn=0;while(1){bv=c[bO>>2]|0;do{if((c[bv+(bn<<6)>>2]|0)!=2){ee=+h[bv+(bn<<6)+16>>3];bu=c[3566]|0;if(ee<0.0){bU=bu+(bn<<6)+32|0;h[bU>>3]=ee+ +h[bU>>3];ex=+h[bu+(bn<<6)+40>>3]}else{bU=bu+(bn<<6)+40|0;ej=ee+ +h[bU>>3];h[bU>>3]=ej;ex=ej}bU=c[bw>>2]|0;bQ=64672+(bU*688&-1)|0;if(+h[bQ>>3]>3]=ex;eA=c[bw>>2]|0}else{eA=bU}bU=64664+(eA*688&-1)|0;ej=+h[bu+(bn<<6)+32>>3];if(+h[bU>>3]<=ej){break}h[bU>>3]=ej}}while(0);bv=bn+1|0;if((bv|0)<(ev|0)){bn=bv}else{aP=5181;break}}}else if((aG|0)==3|(aG|0)==4){aP=5181}else if((aG|0)==2){do{if((c[16507]|0)!=0){ej=+(c[bb+280>>2]|0)+(+h[(c[bb+276>>2]|0)+16>>3]+1.0);if(+h[8255]>-1.0){h[8255]=-1.0}if(+h[8256]==ej){break}h[8256]=ej}}while(0);bn=c[16335]|0;if((bn|0)==0){break}bO=c[bB>>2]|0;if((bO|0)>0){bv=c[bb+320>>2]|0;bU=0;ej=0.0;ee=0.0;while(1){do{if((c[bv+(bU<<6)>>2]|0)==2){eB=ee;eE=ej}else{ei=+h[bv+(bU<<6)+16>>3];if(ei<0.0){eB=ee;eE=ej+ei;break}else{eB=ee+ei;eE=ej;break}}}while(0);bu=bU+1|0;if((bu|0)<(bO|0)){bU=bu;ej=eE;ee=eB}else{eF=eE;eG=eB;break}}}else{eF=0.0;eG=0.0}do{if((bn&2|0)!=0){bU=64672+((c[bw>>2]|0)*688&-1)|0;if(+h[bU>>3]>=eG){break}h[bU>>3]=eG}}while(0);if((bn&1|0)==0){break}bU=64664+((c[bw>>2]|0)*688&-1)|0;if(+h[bU>>3]<=eF){break}h[bU>>3]=eF}}while(0);do{if((aP|0)==5181){aP=0;aG=c[16506]|0;if((aG|0)==0){break}do{if((aG&1|0)!=0){ee=+h[(c[bb+276>>2]|0)+16>>3]+-1.0;if(+h[8255]<=ee){break}h[8255]=ee}}while(0);if((aG&2|0)==0){break}bn=c[bb+320>>2]|0;bU=c[bB>>2]|0;while(1){eH=bU-1|0;if((c[bn+(eH<<6)>>2]|0)!=2){break}c[bB>>2]=eH;if((eH|0)==0){aP=5189;break L5888}else{bU=eH}}ee=+h[bn+(eH<<6)+8>>3]+(+h[(c[bb+276>>2]|0)+16>>3]+1.0);if(+h[8256]>=ee){break}h[8256]=ee}}while(0);eI=c[bS>>2]|0}else{eI=bL}do{if((eI|0)==153){bU=c[bB>>2]|0;aG=bU-1|0;if((aG|0)==0){break}bO=c[bT>>2]|0;bv=c[64648+(bO*688&-1)>>2]|0;do{if((bv&1|0)==0){eJ=bO;eK=bv}else{bu=c[bb+320>>2]|0;if((c[bu>>2]|0)==2){eJ=bO;eK=bv;break}if((c[bu+64>>2]|0)==2){eJ=bO;eK=bv;break}ee=+h[bu+8>>3];ej=ee-(+h[bu+72>>3]-ee)*.5;if((a[64788+(bO*688&-1)|0]&1)==0){eN=ej}else{eN=+Z(+(ej*+h[64800+(bO*688&-1)>>3]))}bu=64664+(bO*688&-1)|0;if(+h[bu>>3]<=eN){eJ=bO;eK=bv;break}h[bu>>3]=eN;bu=c[bT>>2]|0;eJ=bu;eK=c[64648+(bu*688&-1)>>2]|0}}while(0);if((eK&2|0)==0){break}bv=c[bb+320>>2]|0;if((c[bv+(aG<<6)>>2]|0)==2){break}bO=bU-2|0;if((c[bv+(bO<<6)>>2]|0)==2){break}ej=+h[bv+(aG<<6)+8>>3];ee=ej+(ej- +h[bv+(bO<<6)+8>>3])*.5;if((a[64788+(eJ*688&-1)|0]&1)==0){eO=ee}else{eO=+Z(+(ee*+h[64800+(eJ*688&-1)>>3]))}bO=64672+(eJ*688&-1)|0;if(+h[bO>>3]>=eO){break}h[bO>>3]=eO}}while(0);bL=c[bS>>2]|0;if((bL|0)==474){bO=c[bB>>2]|0;bv=bb+320|0;bn=c[bv>>2]|0;if((bO|0)>0){bu=0;bQ=bn;while(1){if((c[bQ+(bu<<6)>>2]|0)==2){h[bQ+(bu<<6)+16>>3]=8.988465674311579e+307;eP=c[bv>>2]|0}else{eP=bQ}bz=bu+1|0;if((bz|0)<(bO|0)){bu=bz;bQ=eP}else{eQ=eP;break}}}else{eQ=bn}bM(eQ|0,bO|0,64,12);bQ=c[bv>>2]|0;bu=bO;while(1){eR=bu-1|0;if((c[bQ+(eR<<6)>>2]|0)==2){bu=eR}else{break}}c[bB>>2]=bu;if((c[bQ>>2]|0)==2){aP=5236;break L5888}ee=+h[bQ+56>>3]- +h[bQ+48>>3];do{if(ee==0.0){ej=+h[7030];if(ej<=0.0){eS=.5;break}eT=(a[56232]&1)!=0?ej:.5;aP=5240}else{eT=ee;aP=5240}}while(0);do{if((aP|0)==5240){aP=0;if(eT>=0.0){eS=eT;break}eS=-0.0-eT}}while(0);bu=c[bT>>2]|0;do{if((c[64648+(bu*688&-1)>>2]&1|0)!=0){bO=64664+(bu*688&-1)|0;ee=+h[bO>>3];ej=+h[bQ+8>>3];if(ee>=ej){h[bO>>3]=ee-eS*1.5;break}if(ee>3]=ee-eS}}while(0);bQ=c[bT>>2]|0;do{if((c[64648+(bQ*688&-1)>>2]&2|0)!=0){bu=64672+(bQ*688&-1)|0;ee=+h[bu>>3];ej=+h[(c[bv>>2]|0)+(eR<<6)+8>>3];do{if(ee>ej){if(ee>eS+ej){break}h[bu>>3]=eS+ee}else{h[bu>>3]=eS*1.5+ee}}while(0);bu=c[bb+288>>2]|0;if((bu|0)<=1){break}aG=64672+((c[bT>>2]|0)*688&-1)|0;h[aG>>3]=+(bu-1|0)*+h[7035]+ +h[aG>>3]}}while(0);eU=c[bS>>2]|0}else{eU=bL}do{if((eU|0)==416|(eU|0)==432){bv=c[16678]|0;if((bv&1|0)!=0){h[8341]=0.0}if((bv&2|0)==0){break}h[8342]=255.0}}while(0);L6997:do{if((c[bS>>2]|0)==474){bL=bb+288|0;bv=c[bL>>2]|0;if((bv|0)<=0){break}do{if(!((a[56292]&1)==0|(bv|0)<2)){bQ=bb+224|0;aG=c[bQ>>2]|0;if((aG|0)==0){break}if((c[aG>>2]|0)==0){break}aG=bv<<2;bu=ut(aG)|0;if((bu|0)==0){gk();bU=ut(aG)|0;if((bU|0)==0){aP=5267;break L5888}else{eV=bU}}else{eV=bu}bu=eV;bU=c[bL>>2]<<2;aG=ut(bU)|0;if((aG|0)==0){gk();bO=ut(bU)|0;if((bO|0)==0){aP=5270;break L5888}else{eW=bO}}else{eW=aG}aG=eW;bO=c[bL>>2]|0;if((bO|0)>0){bU=0;bn=c[bQ>>2]|0;while(1){bz=c[bn>>2]|0;c[bu+(bU<<2)>>2]=bz;by=bU+1|0;bx=c[bL>>2]|0;if((by|0)<(bx|0)){bU=by;bn=bz}else{eX=bx;break}}}else{eX=bO}bM(eV|0,eX|0,4,22);if((c[bL>>2]|0)>0){bn=0;do{c[aG+(bn<<2)>>2]=c[(c[bu+(bn<<2)>>2]|0)+4>>2];bn=bn+1|0;}while((bn|0)<(c[bL>>2]|0))}bn=c[bu>>2]|0;c[c[bQ>>2]>>2]=bn;if(((c[bL>>2]|0)-1|0)>0){bO=bn;bU=0;while(1){bx=bU+1|0;bz=c[bu+(bx<<2)>>2]|0;c[bO>>2]=bz;if((bx|0)<((c[bL>>2]|0)-1|0)){bO=bz;bU=bx}else{eY=bz;break}}}else{eY=bn}c[eY>>2]=0;uu(eV);c[bb+292>>2]=aG}}while(0);bL=c[14072]|0;if((bL|0)==2){eZ=2}else if((bL|0)==0){break}else{eZ=(bL|0)==3?6:c[200]|0}bL=c[c[bb+224>>2]>>2]|0;if((bL|0)==0){break}bv=bb+320|0;bU=0;bO=bL;while(1){dp(eZ,c[bO+60>>2]|0,+h[(c[bv>>2]|0)+8>>3]+ +(bU|0)*+h[7035],-1);bL=c[bO>>2]|0;if((bL|0)==0){break L6997}bU=bU+1|0;bO=bL}}}while(0);bO=c[aR>>2]|0;if((bO|0)==5|(bO|0)==6|(bO|0)==7|(bO|0)==9|(bO|0)==3|(bO|0)==1|(bO|0)==4){bU=bb+320|0;bv=0;while(1){bL=c[bB>>2]|0;L7036:do{if((bv|0)<(bL|0)){bu=c[bU>>2]|0;bQ=bv;while(1){if((c[bu+(bQ<<6)>>2]|0)!=2){e_=bQ;break L7036}bz=bQ+1|0;if((bz|0)<(bL|0)){bQ=bz}else{e_=bz;break}}}else{e_=bv}}while(0);bQ=0;while(1){e$=bQ+e_|0;if((e$|0)>=(bL|0)){break}if((c[(c[bU>>2]|0)+(e$<<6)>>2]|0)==2){break}else{bQ=bQ+1|0}}if((bQ|0)<=0){break}bM((c[bU>>2]|0)+(e_<<6)|0,bQ|0,64,18);bv=e$}hn(bb);e0=c[aR>>2]|0}else{e0=bO}if((e0|0)==6|(e0|0)==7|(e0|0)==9){hk(bb)}else if((e0|0)==3|(e0|0)==1|(e0|0)==2|(e0|0)==4|(e0|0)==8){hl(bb)}bv=c[bS>>2]|0;if(!((bv|0)==400|(bv|0)==416|(bv|0)==432)){d_=d0;d$=d1;break}c[bb+228>>2]=0;f3(bb,1);d_=d0;d$=d1}}while(0);c[bb+4>>2]=c[13898];bS=bb|0;if(!bd){e1=B;e2=an;e3=ao;e5=dR;e8=aq;e9=du;fa=dJ;fb=0;fc=d$;fd=d_;fe=bc;ff=bS;fg=bb;aP=5313;break}fh=B;fi=an;fj=ao;fk=dR;fl=aq;fm=du;fn=dJ;fo=0;fp=d$;fq=d_;fr=bc;fs=bS;ft=c[13898]|0;fu=c[8272]|0;aP=5305}else if((aP|0)==4369){aP=0;c[13898]=aB+1;uu(c[9666]|0);c[9666]=0;ee=+h[4834];if(ee>0.0){fv=ee+2.0}else{fv=aq}c[af>>2]=-5;ee=fv;bS=aw+1|0;fw=c[13898]|0;while(1){L7062:do{if((c[8272]|0)>(fw|0)){bT=c[1054]|0;if((a[bT+(fw*40&-1)|0]&1)==0){fx=ee;break}bw=c[bT+(fw*40&-1)+36>>2]|0;bR=bT+(fw*40&-1)+32|0;bT=c[10036]|0;bv=0;while(1){if((bv|0)>=(bw|0)){break}if((a[bT+((c[bR>>2]|0)+bv|0)|0]|0)==(a[bv+95280|0]|0)){bv=bv+1|0}else{fx=ee;break L7062}}if((bv|0)!=2){fx=ee;break}c[13898]=fw+1;bR=is(n)|0;bT=c[bR>>2]|0;if((bT|0)==1){fy=+(c[bR+8>>2]|0)}else if((bT|0)==3){fy=+uz(c[bR+8>>2]|0,0)}else if((bT|0)==2){fy=+h[bR+8>>3]}else{aP=4382;break L5888}if((c[ag>>2]|0)!=3){fx=fy;break}uu(c[ah>>2]|0);c[ag>>2]=1;fx=fy}else{fx=ee}}while(0);L7077:do{if((c[9666]|0)==0){bO=c[13898]|0;aR=c[1054]|0;bR=(a[aR+(bO*40&-1)|0]&1)==0;if(bR){aP=4388}else{bT=c[10036]|0;bw=a[bT+(c[aR+(bO*40&-1)+32>>2]|0)|0]|0;if((bw<<24>>24|0)==39|(bw<<24>>24|0)==34){fz=bT}else{aP=4388}}if((aP|0)==4388){aP=0;bT=c[10810]|0;if((bT|0)==0){break}bw=c[8272]|0;bQ=aR+(bO*40&-1)+36|0;bU=aR+(bO*40&-1)+32|0;bB=c[10036]|0;bL=bT;L7084:while(1){bT=c[bL+4>>2]|0;L7086:do{if(!((bw|0)<=(bO|0)|bR)){bu=c[bQ>>2]|0;aG=0;while(1){if((aG|0)>=(bu|0)){break}if((a[bB+((c[bU>>2]|0)+aG|0)|0]|0)==(a[bT+aG|0]|0)){aG=aG+1|0}else{break L7086}}if((a[bT+aG|0]|0)==0){break L7084}}}while(0);bT=c[bL>>2]|0;if((bT|0)==0){break L7077}else{bL=bT}}if((a[bL+8|0]&1)!=0){break}if((c[bL+16>>2]|0)==3){fz=bB}else{break}}L7096:do{if((bO|0)<(c[8272]|0)){L7098:do{if(!bR){bU=c[aR+(bO*40&-1)+36>>2]|0;bQ=aR+(bO*40&-1)+32|0;bw=0;while(1){if((bw|0)>=(bU|0)){break}if((a[fz+((c[bQ>>2]|0)+bw|0)|0]|0)==(a[bw+103664|0]|0)){bw=bw+1|0}else{break L7098}}if((bw|0)==1){fA=0;break L7096}}}while(0);a[14176]=1;is(l);a[14176]=0;if((c[ai>>2]|0)==3){fA=c[aj>>2]|0;break}else{c[13898]=bO;fA=0;break}}else{fA=0}}while(0);c[9666]=fA}}while(0);bO=c[13898]|0;aR=c[1054]|0;bR=a[aR+(bO*40&-1)|0]|0;L7110:do{if((c[8272]|0)>(bO|0)){if((bR&1)==0){aP=4414;break}bB=c[aR+(bO*40&-1)+36>>2]|0;bL=aR+(bO*40&-1)+32|0;bQ=c[10036]|0;bU=0;while(1){if((bU|0)>=(bB|0)){break}if((a[bQ+((c[bL>>2]|0)+bU|0)|0]|0)==(a[bU+225056|0]|0)){bU=bU+1|0}else{aP=4414;break L7110}}if((bU|0)==2){aP=4422}else{aP=4414}}else{aP=4414}}while(0);L7117:do{if((aP|0)==4414){aP=0;bL=c[aR+(bO*40&-1)+36>>2]|0;if(!((bR&1)!=0&(bL|0)>0)){fB=bS;break}bQ=c[10036]|0;bB=0;aG=0;bv=c[aR+(bO*40&-1)+32>>2]|0;while(1){if((a[bB+139232|0]|0)==(a[bQ+(bB+bv|0)|0]|0)){fC=bv;fD=aG}else{if((bB|0)!=5){fB=bS;break L7117}fC=bv-1|0;fD=1}bT=bB+1|0;if((bT|0)<(fD+bL|0)){bB=bT;aG=fD;bv=fC}else{break}}if((fD|0)!=0){aP=4422;break}if((bB|0)==4|(bB|0)==8){aP=4422}else{fB=bS}}}while(0);if((aP|0)==4422){aP=0;c[13898]=bO+1;aR=is(k)|0;bR=c[aR>>2]|0;if((bR|0)==1){fE=+(c[aR+8>>2]|0)}else if((bR|0)==2){fE=+h[aR+8>>3]}else if((bR|0)==3){fE=+uz(c[aR+8>>2]|0,0)}else{aP=4426;break L5888}if((c[ak>>2]|0)==3){uu(c[al>>2]|0);c[ak>>2]=1}fB=~~fE}hJ(p,1,100,c[af>>2]|0,49504);aR=c[13898]|0;if((aR|0)==(fw|0)){break}else{ee=fx;bS=fB;fw=aR}}bS=c[af>>2]|0;B=c[8272]|0;if((B|0)<=(fw|0)){aP=6084;break L5888}aR=c[1054]|0;if((a[aR+(fw*40&-1)|0]&1)==0){aP=6085;break L5888}bR=c[aR+(fw*40&-1)+36>>2]|0;bv=aR+(fw*40&-1)+32|0;aR=c[10036]|0;aG=0;while(1){if((aG|0)>=(bR|0)){break}if((a[aR+((c[bv>>2]|0)+aG|0)|0]|0)==(a[aG+148464|0]|0)){aG=aG+1|0}else{aP=6086;break L5888}}if((aG|0)==1){aW=fx;aX=-1;aZ=fB;a$=bS;a0=fw;a1=B;aP=5304}else{aP=6087;break L5888}}}while(0);if((aP|0)==5304){aP=0;if(au){fh=am;fi=a$;fj=aZ;fk=aX;fl=aW;fm=as;fn=at;fo=aA;fp=av;fq=aw;fr=ax;fs=ay;ft=a0;fu=a1;aP=5305}else{e1=am;e2=a$;e3=aZ;e5=aX;e8=aW;e9=as;fa=at;fb=aA;fc=av;fd=aw;fe=ax;ff=ay;fg=0;aP=5313}}L7148:do{if((aP|0)==5305){aP=0;if((fu|0)<=(ft|0)){fF=fr;fG=1;fH=fo;fI=aQ;fJ=fh;aP=5328;break L5888}aB=c[1054]|0;if((a[aB+(ft*40&-1)|0]&1)==0){fF=fr;fG=1;fH=fo;fI=aQ;fJ=fh;aP=5328;break L5888}bv=c[aB+(ft*40&-1)+36>>2]|0;aR=aB+(ft*40&-1)+32|0;aB=c[10036]|0;bR=0;while(1){if((bR|0)>=(bv|0)){break}if((a[aB+((c[aR>>2]|0)+bR|0)|0]|0)==(a[bR+148464|0]|0)){bR=bR+1|0}else{fF=fr;fG=1;fH=fo;fI=aQ;fJ=fh;aP=5328;break L5888}}if((bR|0)!=1){fF=fr;fG=1;fH=fo;fI=aQ;fJ=fh;aP=5328;break L5888}aR=ft+1|0;c[13898]=aR;fK=fs;fL=fr;fM=fq;fN=fp;fO=1;fP=fo;fQ=fn;fR=fm;fT=fl;fU=fk;fV=fj;fW=fi;fX=fh;fY=aR}else if((aP|0)==5313){aP=0;aR=c[7774]|0;do{if((aR|0)==0){aP=5316}else{if((a[aR+38|0]&1)==0|(fg|0)==0){aP=5316;break}c[fg+8>>2]=4}}while(0);do{if((aP|0)==5316){aP=0;if(!(ix(aR)|0)){break}c[13898]=aQ;fK=ff;fL=fe;fM=fd;fN=fc;fO=0;fP=fb;fQ=fa;fR=e9;fT=e8;fU=e5;fV=e3;fW=e2;fX=e1;fY=aQ;break L7148}}while(0);aR=c[7774]|0;if((aR|0)!=0){bR=aR;while(1){aR=c[bR>>2]|0;uu(c[bR+12>>2]|0);uu(bR);if((aR|0)==0){break}else{bR=aR}}}c[7774]=0;bR=c[13898]|0;if((c[8272]|0)<=(bR|0)){aP=5327;break L5888}aR=c[1054]|0;if((a[aR+(bR*40&-1)|0]&1)==0){aP=5327;break L5888}aB=c[aR+(bR*40&-1)+36>>2]|0;bv=aR+(bR*40&-1)+32|0;aR=c[10036]|0;B=0;while(1){if((B|0)>=(aB|0)){break}if((a[aR+((c[bv>>2]|0)+B|0)|0]|0)==(a[B+148464|0]|0)){B=B+1|0}else{aP=5327;break L5888}}if((B|0)!=1){aP=5327;break L5888}c[13898]=bR+1;c[7774]=iw()|0;fK=ff;fL=fe;fM=fd;fN=fc;fO=0;fP=fb;fQ=fa;fR=e9;fT=e8;fU=e5;fV=e3;fW=e2;fX=e1;fY=c[13898]|0}}while(0);if((fY|0)<(c[8272]|0)){am=fX;an=fW;ao=fV;ap=fU;aq=fT;ar=aQ;as=fR;at=fQ;A=fP;au=fO;av=fN;aw=fM;ax=fL;ay=fK;az=fY}else{aJ=aQ;aK=fP;aL=fX;aM=fO;aN=fL;aO=fY;aP=4357;break}}do{if((aP|0)==4501){uf(cc,163648,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==4426){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==4357){if((aL|0)==0){C=aO}else{fF=aN;fG=aM;fH=aK;fI=aJ;fJ=aL;aP=5328;break}uf(C,105216,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==4680){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==4906){uf(c[13898]|0,110696,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==4910){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=107952,v)|0)}else if((aP|0)==4944){uf(c[13898]|0,84448,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==4946){uf(c[13898]|0,106024,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==4744){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=201712,v)|0)}else if((aP|0)==4867){uf(-1,115176,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==4880){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=201712,v)|0)}else if((aP|0)==4899){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=201712,v)|0)}else if((aP|0)==4903){uf(c[13898]|0,114152,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==4576){c[13898]=cC;aP=4577}else if((aP|0)==4634){uf(cR,143640,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==4466){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=180104,v)|0)}else if((aP|0)==4546){uf(c[13898]|0,216936,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==4455){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=180104,v)|0)}else if((aP|0)==4533){uf(cT,149448,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==4382){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==4521){uf(bV,92272,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==4622){uf(bV,133232,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==4462){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=77008,v)|0)}else if((aP|0)==4452){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=77008,v)|0)}else if((aP|0)==4448){uf(c[13898]|0,92272,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==4961){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=90328,v)|0)}else if((aP|0)==4998){uf(-1,89648,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==5e3){uf(-1,89152,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==5012){uf(-1,87256,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==5014){uf(-1,87256,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==5016){uf(-1,87256,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==5018){uf(-1,87256,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==5020){uf(-1,87256,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==5022){uf(-1,87256,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==5025){ez();fY=c[11900]|0;uf(c[13898]|0,86160,(v=i,i=i+16|0,c[v>>2]=ea,c[v+8>>2]=fY,v)|0)}else if((aP|0)==5034){ez();fY=c[11932]|0;uf(c[d2>>2]|0,116952,(v=i,i=i+16|0,c[v>>2]=c[11900],c[v+8>>2]=(fY|0)!=0?fY:179864,v)|0)}else if((aP|0)==5039){uf(c[13898]|0,83648,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==5044){uf(c[13898]|0,82688,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==5164){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=91376,v)|0)}else if((aP|0)==5189){uf(-1,90720,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==5236){uf(-1,92048,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==5267){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=93632,v)|0)}else if((aP|0)==5270){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=92920,v)|0)}else if((aP|0)==5327){if((a[32936]&1)==0){fZ=fe;f_=0;f$=fb;f0=aQ;f1=e1;aP=5331}else{f2=fe;f4=0;f5=fb;f6=aQ;f7=e1}}else if((aP|0)==6068){f9=c[13898]|0;uf(f9,205152,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==6069){uf(c9,210136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==6070){uf(c9,210136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==6071){uf(c9,210136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==6072){uf(c9,210136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==6073){uf(c9,210136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==6074){uf(c9,210136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==6075){uf(cb,163568,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==6076){uf(cb,163568,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==6077){uf(cb,163568,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==6078){uf(cb,163568,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==6079){uf(cb,163568,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==6080){uf(cb,163568,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==6081){uf(cb,163568,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==6082){uf(cb,163568,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==6083){uf(cb,163568,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==6084){uf(fw,175992,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==6085){uf(fw,175992,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==6086){uf(fw,175992,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==6087){uf(fw,175992,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);if((aP|0)==4577){c[bJ>>2]=0;f9=c[13898]|0;uf(f9,205152,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}do{if((aP|0)==5328){f9=(a[32936]&1)==0;if(f9|fG^1){if(f9){fZ=fF;f_=fG;f$=fH;f0=fI;f1=fJ;aP=5331;break}else{f2=fF;f4=fG;f5=fH;f6=fI;f7=fJ;break}}else{uf(-1,147440,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);do{if((aP|0)==5331){if((a[30528]&1)!=0){f2=fZ;f4=f_;f5=f$;f6=f0;f7=f1;break}do{if((fZ|0)!=0){if((c[z>>2]|0)==0){break}if(!(+h[8256]==-8.988465674311579e+307|+h[8255]==8.988465674311579e+307)){break}h[8255]=-10.0;h[8256]=10.0}}while(0);dc(2,145296);if((c[x>>2]&1|0)!=0){dc(6,103512);f2=fZ;f4=f_;f5=f$;f6=f0;f7=f1;break}fJ=c[17194]|0;if((fJ|0)==0){f2=fZ;f4=f_;f5=f$;f6=f0;f7=f1;break}if((fJ&1|0)!=0){h[8599]=+h[8255]}if((fJ&2|0)==0){f2=fZ;f4=f_;f5=f$;f6=f0;f7=f1;break}h[8600]=+h[8256];f2=fZ;f4=f_;f5=f$;f6=f0;f7=f1}}while(0);do{if((f2|0)==0){ga=f7}else{f1=(a[32936]&1)==0;if(f1){if((a[30528]&1)==0){aP=5357}else{aP=5346}}else{aP=5346}if((aP|0)==5346){do{if((c[z>>2]&1|0)==0){f0=c[16506]|0;if((f0&1|0)!=0){h[8255]=8.988465674311579e+307}if((f0&2|0)==0){break}h[8256]=-8.988465674311579e+307}}while(0);do{if((c[x>>2]&1|0)==0){f0=c[17194]|0;if((f0&1|0)!=0){h[8599]=8.988465674311579e+307}if((f0&2|0)==0){break}h[8600]=-8.988465674311579e+307}}while(0);if(f1){aP=5357}else{aP=5358}}if((aP|0)==5357){if((a[30528]&1)==0){gb=0.0;gc=0.0}else{aP=5358}}if((aP|0)==5358){fT=+h[8771];gb=(+h[8772]-fT)/+((c[6352]|0)-1|0);gc=fT}f0=c[10814]|0;c[13898]=u;c[7774]=iw()|0;f$=t|0;f_=t+8|0;fZ=f_;fJ=t+8|0;fI=f_;f_=t+16|0;fH=f0;fT=gb;f0=f4;fG=f5;fF=f6;aq=gc;f9=0;L7293:while(1){bJ=fG;fw=fF;L7295:while(1){cb=c[13898]|0;if(f0){gd=fw}else{gd=bJ?fw:cb}if((t9(cb)|0)==0){aP=5370;break}dT();cb=c[13898]|0;if((c[8272]|0)<=(cb|0)){bJ=1;fw=gd;continue}c9=c[1054]|0;if((a[c9+(cb*40&-1)|0]&1)==0){bJ=1;fw=gd;continue}e1=c[c9+(cb*40&-1)+36>>2]|0;aQ=c9+(cb*40&-1)+32|0;cb=c[10036]|0;c9=0;while(1){if((c9|0)>=(e1|0)){break}if((a[cb+((c[aQ>>2]|0)+c9|0)|0]|0)==(a[c9+148464|0]|0)){c9=c9+1|0}else{bJ=1;fw=gd;continue L7295}}if((c9|0)==1){aP=5664;break}else{bJ=1;fw=gd}}L7307:do{if((aP|0)==5370){aP=0;ge=c[13898]|0;if((ge|0)>=(c[8272]|0)){aP=5377;break L7293}fw=c[1054]|0;bR=fw+(ge*40&-1)|0;L7310:do{if((a[bR]&1)==0){gf=0}else{B=c[fw+(ge*40&-1)+36>>2]|0;aQ=fw+(ge*40&-1)+32|0;cb=c[10036]|0;e1=0;while(1){if((e1|0)>=(B|0)){break}if((a[cb+((c[aQ>>2]|0)+e1|0)|0]|0)==(a[e1+103664|0]|0)){e1=e1+1|0}else{gf=0;break L7310}}gf=(e1|0)==1}}while(0);if(gf|(fH|0)==0){aP=5377;break L7293}c9=fH+304|0;c[200]=c[c9>>2];c[144]=c[fH+308>>2];aQ=f9+1|0;c[11670]=31424;cb=c[fw+(ge*40&-1)+36>>2]|0;L7318:do{if((a[bR]&1)!=0&(cb|0)>0){B=c[10036]|0;bB=0;bO=0;fb=c[fw+(ge*40&-1)+32>>2]|0;while(1){if((a[bB+205224|0]|0)==(a[B+(bB+fb|0)|0]|0)){gg=fb;gh=bO}else{if((bB|0)!=7){aP=5386;break L7318}gg=fb-1|0;gh=1}fe=bB+1|0;if((fe|0)<(gh+cb|0)){bB=fe;bO=gh;fb=gg}else{break}}if((gh|0)!=0){break}if(!((bB|0)==6|(bB|0)==12)){aP=5386}}else{aP=5386}}while(0);do{if((aP|0)==5386){aP=0;if((iu(s)|0)!=0){break}cb=a[32936]&1;fw=f0^cb<<24>>24!=0;c[7858]=c[s>>2];do{if(cb<<24>>24==0){if((a[30528]&1)!=0){aP=5394;break}gi=c[200]|0;e8=+h[64664+(gi*688&-1)>>3];fl=+h[64672+(gi*688&-1)>>3];if((a[64788+(gi*688&-1)|0]&1)==0){gj=fl;gl=e8}else{if(!(e8>0.0&fl>0.0)){aP=5391;break L7293}aW=+_(+e8);e8=+h[64800+(gi*688&-1)>>3];gj=+_(+fl)/e8;gl=aW/e8}bR=c[6352]|0;gm=(gj-gl)/+(bR-1|0);gn=gl;go=bR}else{aP=5394}}while(0);if((aP|0)==5394){aP=0;gm=fT;gn=aq;go=c[6352]|0}if((go|0)>0){cb=fH+320|0;bB=fH+12|0;bR=fH+23|0;fb=fw^1;bO=fH+244|0;B=fH+248|0;e1=0;while(1){e8=gn+gm*+(e1|0);do{if(+P(+e8)<1.0e-9){if(+P(+gm)<=1.0e-6){gp=e8;break}gp=0.0}else{gp=e8}}while(0);do{if((a[32936]&1)==0){if((a[30528]&1)!=0){gq=gp;break}fe=c[200]|0;if((a[64788+(fe*688&-1)|0]&1)==0){gq=gp;break}gq=+Z(+(gp*+h[64800+(fe*688&-1)>>3]))}else{gq=gp}}while(0);c[7862]=2;h[3932]=gq;h[3933]=0.0;e4(c[7858]|0,t);L7354:do{if((a[1960]&1)==0){fe=c[f$>>2]|0;if((fe|0)==2){gr=+h[f_>>3]}else if((fe|0)==3){aP=5407;break L7293}else if((fe|0)==1){gr=0.0}else{aP=5408;break L7293}e8=+P(+gr);if(e8>+h[11]){aP=5410;break}uE((c[cb>>2]|0)+(e1<<6)|0,0,64);if((fe|0)==1){gs=+(c[fZ>>2]|0)}else if((fe|0)==2){gs=+h[fJ>>3]}else if((fe|0)==3){gs=+uz(c[fI>>2]|0,0)}else{aP=5415;break L7293}h[(c[cb>>2]|0)+(e1<<6)+24>>3]=-1.0;c[(c[cb>>2]|0)+(e1<<6)>>2]=0;if((a[32936]&1)!=0){h[(c[cb>>2]|0)+(e1<<6)+8>>3]=gp;h[(c[cb>>2]|0)+(e1<<6)+16>>3]=gs;if(+h[7030]<0.0){break}if((a[56232]&1)==0){break}h[(c[cb>>2]|0)+(e1<<6)+24>>3]=0.0;break}if((a[30528]&1)==0){h[(c[cb>>2]|0)+(e1<<6)+8>>3]=gp;fe=c[bB>>2]|0;if((fe|0)==153&+h[7030]>=0.0){L7374:do{if((a[56232]&1)!=0){h[(c[cb>>2]|0)+(e1<<6)+24>>3]=0.0;d2=c[c9>>2]|0;if((a[64788+(d2*688&-1)|0]&1)==0){e8=+h[7030]*.5;gt=gq+e8;gu=gq-e8}else{e8=+h[64792+(d2*688&-1)>>3];aW=+h[7030];fl=gq*+R(+e8,+(aW*-.5));gt=gq*+R(+e8,+(aW*.5));gu=fl}d2=c[200]|0;if((d2|0)==99){break}L7381:do{if(gu>-8.988465674311579e+307&gu<8.988465674311579e+307){do{if((a[64788+(d2*688&-1)|0]&1)==0){h[(c[cb>>2]|0)+(e1<<6)+48>>3]=gu}else{if(gu<0.0){break L7381}if(gu==0.0){h[(c[cb>>2]|0)+(e1<<6)+48>>3]=-8.988465674311579e+307;break L7381}else{fl=+_(+gu);h[(c[cb>>2]|0)+(e1<<6)+48>>3]=fl/+h[64800+(d2*688&-1)>>3];break}}}while(0);if((a[bR]&1)!=0|(d2|0)<0){break}bs=64712+(d2*688&-1)|0;if(gu<+h[bs>>3]){h[bs>>3]=gu}bs=64664+(d2*688&-1)|0;do{if(gu<+h[bs>>3]){if((c[64648+(d2*688&-1)>>2]&1|0)==0){break L7381}if((c[64728+(d2*688&-1)>>2]&1|0)==0){h[bs>>3]=gu;break}fl=+h[64736+(d2*688&-1)>>3];if(fl>gu){h[bs>>3]=fl;break L7381}else{h[bs>>3]=gu;break}}}while(0);bs=64720+(d2*688&-1)|0;if(gu>+h[bs>>3]){h[bs>>3]=gu}bs=64672+(d2*688&-1)|0;if(gu<=+h[bs>>3]){break}if((c[64648+(d2*688&-1)>>2]&2|0)==0){break}if((c[64732+(d2*688&-1)>>2]&2|0)==0){h[bs>>3]=gu;break}fl=+h[64760+(d2*688&-1)>>3];if(fl>3]=fl;break}else{h[bs>>3]=gu;break}}}while(0);if(!(gt>-8.988465674311579e+307><8.988465674311579e+307)){break}do{if((a[64788+(d2*688&-1)|0]&1)==0){h[(c[cb>>2]|0)+(e1<<6)+56>>3]=gt}else{if(gt<0.0){break L7374}if(gt==0.0){h[(c[cb>>2]|0)+(e1<<6)+56>>3]=-8.988465674311579e+307;break L7374}else{fl=+_(+gt);h[(c[cb>>2]|0)+(e1<<6)+56>>3]=fl/+h[64800+(d2*688&-1)>>3];break}}}while(0);if((a[bR]&1)!=0|(d2|0)<0){break}bo=64712+(d2*688&-1)|0;if(gt<+h[bo>>3]){h[bo>>3]=gt}bo=64664+(d2*688&-1)|0;do{if(gt<+h[bo>>3]){if((c[64648+(d2*688&-1)>>2]&1|0)==0){break L7374}if((c[64728+(d2*688&-1)>>2]&1|0)==0){h[bo>>3]=gt;break}fl=+h[64736+(d2*688&-1)>>3];if(fl>gt){h[bo>>3]=fl;break L7374}else{h[bo>>3]=gt;break}}}while(0);bo=64720+(d2*688&-1)|0;if(gt>+h[bo>>3]){h[bo>>3]=gt}bo=64672+(d2*688&-1)|0;if(gt<=+h[bo>>3]){break}if((c[64648+(d2*688&-1)>>2]&2|0)==0){break}if((c[64732+(d2*688&-1)>>2]&2|0)==0){h[bo>>3]=gt;break}fl=+h[64760+(d2*688&-1)>>3];if(fl>3]=fl;break}else{h[bo>>3]=gt;break}}}while(0);gv=c[bB>>2]|0}else{gv=fe}if((gv|0)==457){h[(c[cb>>2]|0)+(e1<<6)+24>>3]=-1.0;h[(c[cb>>2]|0)+(e1<<6)+32>>3]=0.0;h[(c[cb>>2]|0)+(e1<<6)+56>>3]=360.0}else if((gv|0)==489){h[(c[cb>>2]|0)+(e1<<6)+24>>3]=-1.0;h[(c[cb>>2]|0)+(e1<<6)+32>>3]=+h[6214]}if(fw){if((c[200]|0)!=0){break}}else{if((c[144]|0)==99){break}}if(!(gs>-8.988465674311579e+307&gs<8.988465674311579e+307)){c[(c[cb>>2]|0)+(e1<<6)>>2]=2;break}bw=c[200]|0;bo=fw?bw:c[144]|0;do{if((a[64788+(bo*688&-1)|0]&1)==0){h[(c[cb>>2]|0)+(e1<<6)+16>>3]=gs}else{if(gs<0.0){c[(c[cb>>2]|0)+(e1<<6)>>2]=2;break L7354}if(gs==0.0){h[(c[cb>>2]|0)+(e1<<6)+16>>3]=-8.988465674311579e+307;c[(c[cb>>2]|0)+(e1<<6)>>2]=1;break L7354}else{fl=+_(+gs);h[(c[cb>>2]|0)+(e1<<6)+16>>3]=fl/+h[64800+(bo*688&-1)>>3];break}}}while(0);if((a[bR]&1)!=0){break}if((c[(c[cb>>2]|0)+(e1<<6)>>2]|0)!=0){break}if(!((bw|0)==0|fb)){break}fe=64712+(bo*688&-1)|0;if(gs<+h[fe>>3]){h[fe>>3]=gs}fe=64664+(bo*688&-1)|0;do{if(gs<+h[fe>>3]){if((c[64648+(bo*688&-1)>>2]&1|0)==0){c[(c[cb>>2]|0)+(e1<<6)>>2]=1;break L7354}if((c[64728+(bo*688&-1)>>2]&1|0)==0){h[fe>>3]=gs;break}fl=+h[64736+(bo*688&-1)>>3];if(fl>gs){h[fe>>3]=fl;c[(c[cb>>2]|0)+(e1<<6)>>2]=1;break L7354}else{h[fe>>3]=gs;break}}}while(0);fe=64720+(bo*688&-1)|0;if(gs>+h[fe>>3]){h[fe>>3]=gs}fe=64672+(bo*688&-1)|0;if(gs<=+h[fe>>3]){break}if((c[64648+(bo*688&-1)>>2]&2|0)==0){c[(c[cb>>2]|0)+(e1<<6)>>2]=1;break}if((c[64732+(bo*688&-1)>>2]&2|0)==0){h[fe>>3]=gs;break}fl=+h[64760+(bo*688&-1)>>3];if(fl>3]=fl;c[(c[cb>>2]|0)+(e1<<6)>>2]=1;break}else{h[fe>>3]=gs;break}}do{if(gs>+h[8686]){if((c[17366]&2|0)==0){c[(c[cb>>2]|0)+(e1<<6)>>2]=1;break}else{h[8686]=gs;break}}}while(0);fl=+h[8685];do{if(gs>2]|0)==345){if((c[bO>>2]|0)!=10){break}fE=+h[B>>3];if(bo){gy=gw;gz=fE}else{fy=+_(+fE);fE=+h[8702];gy=+_(+gw)/fE;gz=fy/fE}fE=gz-gy;fy=fE*fl;fv=fE*fx;fe=c[200]|0;L7527:do{if((fe|0)!=99){if(!(fv>-8.988465674311579e+307&fv<8.988465674311579e+307)){c[(c[cb>>2]|0)+(e1<<6)>>2]=2;break L7354}do{if((a[64788+(fe*688&-1)|0]&1)==0){h[(c[cb>>2]|0)+(e1<<6)+56>>3]=fv}else{if(fv<0.0){c[(c[cb>>2]|0)+(e1<<6)>>2]=2;break L7354}if(fv==0.0){h[(c[cb>>2]|0)+(e1<<6)+56>>3]=-8.988465674311579e+307;c[(c[cb>>2]|0)+(e1<<6)>>2]=1;break L7527}else{fE=+_(+fv);h[(c[cb>>2]|0)+(e1<<6)+56>>3]=fE/+h[64800+(fe*688&-1)>>3];break}}}while(0);if((a[bR]&1)!=0){break}if((c[(c[cb>>2]|0)+(e1<<6)>>2]|0)!=0|(fe|0)<0){break}bw=64712+(fe*688&-1)|0;if(fv<+h[bw>>3]){h[bw>>3]=fv}bw=64664+(fe*688&-1)|0;do{if(fv<+h[bw>>3]){if((c[64648+(fe*688&-1)>>2]&1|0)==0){c[(c[cb>>2]|0)+(e1<<6)>>2]=1;break L7527}if((c[64728+(fe*688&-1)>>2]&1|0)==0){h[bw>>3]=fv;break}fE=+h[64736+(fe*688&-1)>>3];if(fE>fv){h[bw>>3]=fE;c[(c[cb>>2]|0)+(e1<<6)>>2]=1;break L7527}else{h[bw>>3]=fv;break}}}while(0);bw=64720+(fe*688&-1)|0;if(fv>+h[bw>>3]){h[bw>>3]=fv}bw=64672+(fe*688&-1)|0;if(fv<=+h[bw>>3]){break}if((c[64648+(fe*688&-1)>>2]&2|0)==0){c[(c[cb>>2]|0)+(e1<<6)>>2]=1;break}if((c[64732+(fe*688&-1)>>2]&2|0)==0){h[bw>>3]=fv;break}fE=+h[64760+(fe*688&-1)>>3];if(fE>3]=fE;c[(c[cb>>2]|0)+(e1<<6)>>2]=1;break}else{h[bw>>3]=fv;break}}}while(0);fe=c[144]|0;if((fe|0)==99){break}if(!(fy>-8.988465674311579e+307&fy<8.988465674311579e+307)){c[(c[cb>>2]|0)+(e1<<6)>>2]=2;break L7354}do{if((a[64788+(fe*688&-1)|0]&1)==0){h[(c[cb>>2]|0)+(e1<<6)+40>>3]=fy}else{if(fy<0.0){c[(c[cb>>2]|0)+(e1<<6)>>2]=2;break L7354}if(fy==0.0){h[(c[cb>>2]|0)+(e1<<6)+40>>3]=-8.988465674311579e+307;c[(c[cb>>2]|0)+(e1<<6)>>2]=1;break L7521}else{fv=+_(+fy);h[(c[cb>>2]|0)+(e1<<6)+40>>3]=fv/+h[64800+(fe*688&-1)>>3];break}}}while(0);if((a[bR]&1)!=0){break}if((c[(c[cb>>2]|0)+(e1<<6)>>2]|0)!=0|(fe|0)<0){break}d2=64712+(fe*688&-1)|0;if(fy<+h[d2>>3]){h[d2>>3]=fy}d2=64664+(fe*688&-1)|0;do{if(fy<+h[d2>>3]){if((c[64648+(fe*688&-1)>>2]&1|0)==0){c[(c[cb>>2]|0)+(e1<<6)>>2]=1;break L7521}if((c[64728+(fe*688&-1)>>2]&1|0)==0){h[d2>>3]=fy;break}fv=+h[64736+(fe*688&-1)>>3];if(fv>fy){h[d2>>3]=fv;c[(c[cb>>2]|0)+(e1<<6)>>2]=1;break L7521}else{h[d2>>3]=fy;break}}}while(0);d2=64720+(fe*688&-1)|0;if(fy>+h[d2>>3]){h[d2>>3]=fy}d2=64672+(fe*688&-1)|0;if(fy<=+h[d2>>3]){break}if((c[64648+(fe*688&-1)>>2]&2|0)==0){c[(c[cb>>2]|0)+(e1<<6)>>2]=1;break}if((c[64732+(fe*688&-1)>>2]&2|0)==0){h[d2>>3]=fy;break}fv=+h[64760+(fe*688&-1)>>3];if(fv>3]=fv;c[(c[cb>>2]|0)+(e1<<6)>>2]=1;break}else{h[d2>>3]=fy;break}}}while(0);bo=c[200]|0;L7618:do{if((bo|0)!=99){if(!(aW>-8.988465674311579e+307&aW<8.988465674311579e+307)){c[(c[cb>>2]|0)+(e1<<6)>>2]=2;break L7354}do{if((a[64788+(bo*688&-1)|0]&1)==0){h[(c[cb>>2]|0)+(e1<<6)+8>>3]=aW}else{if(aW<0.0){c[(c[cb>>2]|0)+(e1<<6)>>2]=2;break L7354}if(aW==0.0){h[(c[cb>>2]|0)+(e1<<6)+8>>3]=-8.988465674311579e+307;c[(c[cb>>2]|0)+(e1<<6)>>2]=1;break L7618}else{fx=+_(+aW);h[(c[cb>>2]|0)+(e1<<6)+8>>3]=fx/+h[64800+(bo*688&-1)>>3];break}}}while(0);if((a[bR]&1)!=0){break}if((c[(c[cb>>2]|0)+(e1<<6)>>2]|0)!=0|(bo|0)<0){break}fe=64712+(bo*688&-1)|0;if(aW<+h[fe>>3]){h[fe>>3]=aW}fe=64664+(bo*688&-1)|0;do{if(aW<+h[fe>>3]){if((c[64648+(bo*688&-1)>>2]&1|0)==0){c[(c[cb>>2]|0)+(e1<<6)>>2]=1;break L7618}if((c[64728+(bo*688&-1)>>2]&1|0)==0){h[fe>>3]=aW;break}fy=+h[64736+(bo*688&-1)>>3];if(fy>aW){h[fe>>3]=fy;c[(c[cb>>2]|0)+(e1<<6)>>2]=1;break L7618}else{h[fe>>3]=aW;break}}}while(0);fe=64720+(bo*688&-1)|0;if(aW>+h[fe>>3]){h[fe>>3]=aW}fe=64672+(bo*688&-1)|0;if(aW<=+h[fe>>3]){break}if((c[64648+(bo*688&-1)>>2]&2|0)==0){c[(c[cb>>2]|0)+(e1<<6)>>2]=1;break}if((c[64732+(bo*688&-1)>>2]&2|0)==0){h[fe>>3]=aW;break}fy=+h[64760+(bo*688&-1)>>3];if(fy>3]=fy;c[(c[cb>>2]|0)+(e1<<6)>>2]=1;break}else{h[fe>>3]=aW;break}}}while(0);bo=c[144]|0;if((bo|0)==99){break}if(!(e8>-8.988465674311579e+307&e8<8.988465674311579e+307)){c[(c[cb>>2]|0)+(e1<<6)>>2]=2;break}do{if((a[64788+(bo*688&-1)|0]&1)==0){h[(c[cb>>2]|0)+(e1<<6)+16>>3]=e8}else{if(e8<0.0){c[(c[cb>>2]|0)+(e1<<6)>>2]=2;break L7354}if(e8==0.0){h[(c[cb>>2]|0)+(e1<<6)+16>>3]=-8.988465674311579e+307;c[(c[cb>>2]|0)+(e1<<6)>>2]=1;break L7354}else{aW=+_(+e8);h[(c[cb>>2]|0)+(e1<<6)+16>>3]=aW/+h[64800+(bo*688&-1)>>3];break}}}while(0);if((a[bR]&1)!=0){break}if((c[(c[cb>>2]|0)+(e1<<6)>>2]|0)!=0|(bo|0)<0){break}fe=64712+(bo*688&-1)|0;if(e8<+h[fe>>3]){h[fe>>3]=e8}fe=64664+(bo*688&-1)|0;do{if(e8<+h[fe>>3]){if((c[64648+(bo*688&-1)>>2]&1|0)==0){c[(c[cb>>2]|0)+(e1<<6)>>2]=1;break L7354}if((c[64728+(bo*688&-1)>>2]&1|0)==0){h[fe>>3]=e8;break}aW=+h[64736+(bo*688&-1)>>3];if(aW>e8){h[fe>>3]=aW;c[(c[cb>>2]|0)+(e1<<6)>>2]=1;break L7354}else{h[fe>>3]=e8;break}}}while(0);fe=64720+(bo*688&-1)|0;if(e8>+h[fe>>3]){h[fe>>3]=e8}fe=64672+(bo*688&-1)|0;if(e8<=+h[fe>>3]){break}if((c[64648+(bo*688&-1)>>2]&2|0)==0){c[(c[cb>>2]|0)+(e1<<6)>>2]=1;break}if((c[64732+(bo*688&-1)>>2]&2|0)==0){h[fe>>3]=e8;break}aW=+h[64760+(bo*688&-1)>>3];if(aW>3]=aW;c[(c[cb>>2]|0)+(e1<<6)>>2]=1;break}else{h[fe>>3]=e8;break}}else{aP=5410}}while(0);if((aP|0)==5410){aP=0;c[(c[cb>>2]|0)+(e1<<6)>>2]=2}fe=e1+1|0;if((fe|0)<(c[6352]|0)){e1=fe}else{gA=fe;break}}}else{gA=0}c[fH+300>>2]=gA;c[13898]=c[fH+4>>2];e1=c[fH>>2]|0;if(fw){gB=aQ;gC=gn;gD=0;gE=1;gF=gm;gG=e1;break L7307}else{gH=aQ;gI=gn;gJ=0;gK=gm;gL=e1;aP=5665;break L7307}}}while(0);c[13898]=c[fH+4>>2];c9=c[fH>>2]|0;if(f0){gB=aQ;gC=aq;gD=0;gE=1;gF=fT;gG=c9}else{gH=aQ;gI=aq;gJ=0;gK=fT;gL=c9;aP=5665}}else if((aP|0)==5664){aP=0;if(f0){gB=f9;gC=aq;gD=bJ;gE=1;gF=fT;gG=fH}else{gH=f9;gI=aq;gJ=bJ;gK=fT;gL=fH;aP=5665}}}while(0);do{if((aP|0)==5665){aP=0;if(!(ix(c[7774]|0)|0)){gB=gH;gC=gI;gD=gJ;gE=0;gF=gK;gG=gL;break}c[13898]=gd;fH=gL;fT=gK;f0=0;fG=gJ;fF=gd;aq=gI;f9=gH;continue L7293}}while(0);bJ=c[7774]|0;if((bJ|0)!=0){c9=bJ;while(1){bJ=c[c9>>2]|0;uu(c[c9+12>>2]|0);uu(c9);if((bJ|0)==0){break}else{c9=bJ}}}c[7774]=0;c9=c[13898]|0;if((c[8272]|0)<=(c9|0)){gM=gB;break}bJ=c[1054]|0;if((a[bJ+(c9*40&-1)|0]&1)==0){gM=gB;break}e1=c[bJ+(c9*40&-1)+36>>2]|0;cb=bJ+(c9*40&-1)+32|0;bJ=c[10036]|0;bR=0;while(1){if((bR|0)>=(e1|0)){break}if((a[bJ+((c[cb>>2]|0)+bR|0)|0]|0)==(a[bR+148464|0]|0)){bR=bR+1|0}else{gM=gB;break L7293}}if((bR|0)!=1){gM=gB;break}c[13898]=c9+1;if(gE){fH=gG;fT=gF;f0=1;fG=gD;fF=gd;aq=gC;f9=gB;continue}c[7774]=iw()|0;fH=gG;fT=gF;f0=0;fG=gD;fF=gd;aq=gC;f9=gB}if((aP|0)==5377){uh(ge,136552,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);gM=f9}else if((aP|0)==5391){uf(-1,218096,(v=i,i=i+8|0,c[v>>2]=56832+(gi*24&-1),v)|0)}else if((aP|0)==5407){uh(-1,212704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);uf(-1,212032,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==5408){uf(-1,211552,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aP|0)==5415){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((a[32936]&1)==0){ga=gM;break}fF=c[10814]|0;c[d>>2]=fF;L7738:do{if((gM|0)<1){gN=d;gO=0;gP=gM}else{fG=d;f0=0;fH=fF;fI=1;fJ=gM;while(1){fZ=fG;f_=fH;f$=fI;while(1){gQ=f_|0;gR=c[gQ>>2]|0;if((c[f_+8>>2]|0)==0){break}f1=f$+1|0;if((f1|0)>(fJ|0)){gN=gQ;gO=f0;gP=fJ;break L7738}else{fZ=gQ;f_=gR;f$=f1}}aQ=fJ-1|0;f1=c[f_+300>>2]|0;cb=gR+300|0;if((f1|0)!=(c[cb>>2]|0)){break}if((f1|0)>0){f1=f_+320|0;bJ=gR+320|0;e1=gR+304|0;B=gR+308|0;bO=f_+23|0;bB=f_+304|0;fb=f_+308|0;fe=(a[30528]&1)==0;d2=0;do{L7750:do{if(fe){aq=+h[(c[f1>>2]|0)+(d2<<6)+16>>3];bw=c[bJ>>2]|0;fT=+h[bw+(d2<<6)+16>>3];aW=+h[7030];L7933:do{if(aW<0.0){aP=5874}else{if((a[56232]&1)==0){aP=5874;break}bs=c[e1>>2]|0;if((bs|0)==99){break}fy=aq-aW*.5;L7937:do{if(fy>-8.988465674311579e+307&fy<8.988465674311579e+307){do{if((a[64788+(bs*688&-1)|0]&1)==0){h[bw+(d2<<6)+48>>3]=fy}else{if(fy<0.0){aP=5845;break L7937}if(fy==0.0){h[bw+(d2<<6)+48>>3]=-8.988465674311579e+307;aP=5845;break L7937}else{fx=+_(+fy);h[bw+(d2<<6)+48>>3]=fx/+h[64800+(bs*688&-1)>>3];break}}}while(0);if((a[bO]&1)!=0){aP=5845;break}ea=c[e1>>2]|0;if((ea|0)<0){gS=ea;break}fx=aq- +h[7030]*.5;bV=64712+(ea*688&-1)|0;if(fx<+h[bV>>3]){h[bV>>3]=fx;gT=c[e1>>2]|0}else{gT=ea}ea=64664+(gT*688&-1)|0;do{if(fx<+h[ea>>3]){if((c[64648+(gT*688&-1)>>2]&1|0)==0){aP=5845;break L7937}if((c[64728+(gT*688&-1)>>2]&1|0)==0){h[ea>>3]=fx;break}fl=+h[64736+(gT*688&-1)>>3];if(fl>fx){h[ea>>3]=fl;aP=5845;break L7937}else{h[ea>>3]=fx;break}}}while(0);ea=c[e1>>2]|0;bV=64720+(ea*688&-1)|0;if(fx>+h[bV>>3]){h[bV>>3]=fx;gU=c[e1>>2]|0}else{gU=ea}ea=64672+(gU*688&-1)|0;if(fx<=+h[ea>>3]){gV=gU;aP=5846;break}if((c[64648+(gU*688&-1)>>2]&2|0)==0){aP=5845;break}if((c[64732+(gU*688&-1)>>2]&2|0)==0){h[ea>>3]=fx;aP=5845;break}fl=+h[64760+(gU*688&-1)>>3];if(fl>3]=fl;aP=5845;break}else{h[ea>>3]=fx;aP=5845;break}}else{aP=5845}}while(0);if((aP|0)==5845){aP=0;gV=c[e1>>2]|0;aP=5846}if((aP|0)==5846){aP=0;if((gV|0)==99){aP=5874;break}else{gS=gV}}fy=aq+ +h[7030]*.5;if(!(fy>-8.988465674311579e+307&fy<8.988465674311579e+307)){aP=5874;break}do{if((a[64788+(gS*688&-1)|0]&1)==0){h[(c[bJ>>2]|0)+(d2<<6)+56>>3]=fy}else{if(fy<0.0){aP=5874;break L7933}if(fy==0.0){h[(c[bJ>>2]|0)+(d2<<6)+56>>3]=-8.988465674311579e+307;aP=5874;break L7933}else{e8=+_(+fy);h[(c[bJ>>2]|0)+(d2<<6)+56>>3]=e8/+h[64800+(gS*688&-1)>>3];break}}}while(0);if((a[bO]&1)!=0){aP=5874;break}bs=c[e1>>2]|0;if((bs|0)<0){gW=bs;aP=5875;break}fy=aq+ +h[7030]*.5;bo=64712+(bs*688&-1)|0;if(fy<+h[bo>>3]){h[bo>>3]=fy;gX=c[e1>>2]|0}else{gX=bs}bs=64664+(gX*688&-1)|0;do{if(fy<+h[bs>>3]){if((c[64648+(gX*688&-1)>>2]&1|0)==0){aP=5874;break L7933}if((c[64728+(gX*688&-1)>>2]&1|0)==0){h[bs>>3]=fy;break}e8=+h[64736+(gX*688&-1)>>3];if(e8>fy){h[bs>>3]=e8;aP=5874;break L7933}else{h[bs>>3]=fy;break}}}while(0);bs=c[e1>>2]|0;bo=64720+(bs*688&-1)|0;if(fy>+h[bo>>3]){h[bo>>3]=fy;gY=c[e1>>2]|0}else{gY=bs}bs=64672+(gY*688&-1)|0;if(fy<=+h[bs>>3]){aP=5874;break}if((c[64648+(gY*688&-1)>>2]&2|0)==0){aP=5874;break}if((c[64732+(gY*688&-1)>>2]&2|0)==0){h[bs>>3]=fy;aP=5874;break}e8=+h[64760+(gY*688&-1)>>3];if(e8>3]=e8;aP=5874;break}else{h[bs>>3]=fy;aP=5874;break}}}while(0);if((aP|0)==5874){aP=0;bw=c[e1>>2]|0;if((bw|0)!=99){gW=bw;aP=5875}}L8015:do{if((aP|0)==5875){aP=0;if(!(aq>-8.988465674311579e+307&aq<8.988465674311579e+307)){c[(c[bJ>>2]|0)+(d2<<6)>>2]=2;break}do{if((a[64788+(gW*688&-1)|0]&1)==0){h[(c[bJ>>2]|0)+(d2<<6)+8>>3]=aq}else{if(aq<0.0){c[(c[bJ>>2]|0)+(d2<<6)>>2]=2;break L8015}if(aq==0.0){h[(c[bJ>>2]|0)+(d2<<6)+8>>3]=-8.988465674311579e+307;c[(c[bJ>>2]|0)+(d2<<6)>>2]=1;break L8015}else{aW=+_(+aq);h[(c[bJ>>2]|0)+(d2<<6)+8>>3]=aW/+h[64800+(gW*688&-1)>>3];break}}}while(0);if((a[bO]&1)!=0){break}if((c[(c[bJ>>2]|0)+(d2<<6)>>2]|0)!=0){break}bw=c[e1>>2]|0;if((bw|0)<0){break}bs=64712+(bw*688&-1)|0;if(aq<+h[bs>>3]){h[bs>>3]=aq;gZ=c[e1>>2]|0}else{gZ=bw}bw=64664+(gZ*688&-1)|0;do{if(aq<+h[bw>>3]){if((c[64648+(gZ*688&-1)>>2]&1|0)==0){c[(c[bJ>>2]|0)+(d2<<6)>>2]=1;break L8015}if((c[64728+(gZ*688&-1)>>2]&1|0)==0){h[bw>>3]=aq;break}fy=+h[64736+(gZ*688&-1)>>3];if(fy>aq){h[bw>>3]=fy;c[(c[bJ>>2]|0)+(d2<<6)>>2]=1;break L8015}else{h[bw>>3]=aq;break}}}while(0);bw=c[e1>>2]|0;bs=64720+(bw*688&-1)|0;if(aq>+h[bs>>3]){h[bs>>3]=aq;g_=c[e1>>2]|0}else{g_=bw}bw=64672+(g_*688&-1)|0;if(aq<=+h[bw>>3]){break}if((c[64648+(g_*688&-1)>>2]&2|0)==0){c[(c[bJ>>2]|0)+(d2<<6)>>2]=1;break}if((c[64732+(g_*688&-1)>>2]&2|0)==0){h[bw>>3]=aq;break}fy=+h[64760+(g_*688&-1)>>3];if(fy>3]=fy;c[(c[bJ>>2]|0)+(d2<<6)>>2]=1;break}else{h[bw>>3]=aq;break}}}while(0);bw=c[B>>2]|0;if((bw|0)==99){break}if(!(fT>-8.988465674311579e+307&fT<8.988465674311579e+307)){c[(c[bJ>>2]|0)+(d2<<6)>>2]=2;break}do{if((a[64788+(bw*688&-1)|0]&1)==0){h[(c[bJ>>2]|0)+(d2<<6)+16>>3]=fT}else{if(fT<0.0){c[(c[bJ>>2]|0)+(d2<<6)>>2]=2;break L7750}if(fT==0.0){h[(c[bJ>>2]|0)+(d2<<6)+16>>3]=-8.988465674311579e+307;c[(c[bJ>>2]|0)+(d2<<6)>>2]=1;break L7750}else{aq=+_(+fT);h[(c[bJ>>2]|0)+(d2<<6)+16>>3]=aq/+h[64800+(bw*688&-1)>>3];break}}}while(0);if((a[bO]&1)!=0){break}if((c[(c[bJ>>2]|0)+(d2<<6)>>2]|0)!=0){break}bw=c[B>>2]|0;if((bw|0)<0){break}bs=64712+(bw*688&-1)|0;if(fT<+h[bs>>3]){h[bs>>3]=fT;g$=c[B>>2]|0}else{g$=bw}bw=64664+(g$*688&-1)|0;do{if(fT<+h[bw>>3]){if((c[64648+(g$*688&-1)>>2]&1|0)==0){c[(c[bJ>>2]|0)+(d2<<6)>>2]=1;break L7750}if((c[64728+(g$*688&-1)>>2]&1|0)==0){h[bw>>3]=fT;break}aq=+h[64736+(g$*688&-1)>>3];if(aq>fT){h[bw>>3]=aq;c[(c[bJ>>2]|0)+(d2<<6)>>2]=1;break L7750}else{h[bw>>3]=fT;break}}}while(0);bw=c[B>>2]|0;bs=64720+(bw*688&-1)|0;if(fT>+h[bs>>3]){h[bs>>3]=fT;g0=c[B>>2]|0}else{g0=bw}bw=64672+(g0*688&-1)|0;if(fT<=+h[bw>>3]){break}if((c[64648+(g0*688&-1)>>2]&2|0)==0){c[(c[bJ>>2]|0)+(d2<<6)>>2]=1;break}if((c[64732+(g0*688&-1)>>2]&2|0)==0){h[bw>>3]=fT;break}aq=+h[64760+(g0*688&-1)>>3];if(aq>3]=aq;c[(c[bJ>>2]|0)+(d2<<6)>>2]=1;break}else{h[bw>>3]=fT;break}}else{bw=c[bJ>>2]|0;aq=+h[bw+(d2<<6)+16>>3];fy=+h[(c[f1>>2]|0)+(d2<<6)+16>>3]*+h[9040];bs=c[17366]|0;if((bs&2|0)==0&aq>+h[8686]){c[bw+(d2<<6)>>2]=1;g1=c[17366]|0}else{g1=bs}if((g1&1|0)==0){g2=aq- +h[8685]}else{g2=aq}aq=g2*+S(+fy);aW=g2*+T(+fy);fy=+h[7030];L7758:do{if(fy<0.0){aP=5749}else{if((a[56232]&1)==0){aP=5749;break}bs=c[bB>>2]|0;if((bs|0)==99){break}e8=aq-fy*.5;L7762:do{if(e8>-8.988465674311579e+307&e8<8.988465674311579e+307){do{if((a[64788+(bs*688&-1)|0]&1)==0){h[(c[bJ>>2]|0)+(d2<<6)+48>>3]=e8}else{if(e8<0.0){aP=5720;break L7762}if(e8==0.0){h[(c[bJ>>2]|0)+(d2<<6)+48>>3]=-8.988465674311579e+307;aP=5720;break L7762}else{fl=+_(+e8);h[(c[bJ>>2]|0)+(d2<<6)+48>>3]=fl/+h[64800+(bs*688&-1)>>3];break}}}while(0);if((a[bO]&1)!=0){aP=5720;break}bw=c[bB>>2]|0;if((bw|0)<0){g3=bw;break}fx=aq- +h[7030]*.5;bo=64712+(bw*688&-1)|0;if(fx<+h[bo>>3]){h[bo>>3]=fx;g4=c[bB>>2]|0}else{g4=bw}bw=64664+(g4*688&-1)|0;do{if(fx<+h[bw>>3]){if((c[64648+(g4*688&-1)>>2]&1|0)==0){aP=5720;break L7762}if((c[64728+(g4*688&-1)>>2]&1|0)==0){h[bw>>3]=fx;break}fl=+h[64736+(g4*688&-1)>>3];if(fl>fx){h[bw>>3]=fl;aP=5720;break L7762}else{h[bw>>3]=fx;break}}}while(0);bw=c[bB>>2]|0;bo=64720+(bw*688&-1)|0;if(fx>+h[bo>>3]){h[bo>>3]=fx;g5=c[bB>>2]|0}else{g5=bw}bw=64672+(g5*688&-1)|0;if(fx<=+h[bw>>3]){g6=g5;aP=5721;break}if((c[64648+(g5*688&-1)>>2]&2|0)==0){aP=5720;break}if((c[64732+(g5*688&-1)>>2]&2|0)==0){h[bw>>3]=fx;aP=5720;break}fl=+h[64760+(g5*688&-1)>>3];if(fl>3]=fl;aP=5720;break}else{h[bw>>3]=fx;aP=5720;break}}else{aP=5720}}while(0);if((aP|0)==5720){aP=0;g6=c[bB>>2]|0;aP=5721}if((aP|0)==5721){aP=0;if((g6|0)==99){aP=5749;break}else{g3=g6}}e8=aq+ +h[7030]*.5;if(!(e8>-8.988465674311579e+307&e8<8.988465674311579e+307)){aP=5749;break}do{if((a[64788+(g3*688&-1)|0]&1)==0){h[(c[bJ>>2]|0)+(d2<<6)+56>>3]=e8}else{if(e8<0.0){aP=5749;break L7758}if(e8==0.0){h[(c[bJ>>2]|0)+(d2<<6)+56>>3]=-8.988465674311579e+307;aP=5749;break L7758}else{fl=+_(+e8);h[(c[bJ>>2]|0)+(d2<<6)+56>>3]=fl/+h[64800+(g3*688&-1)>>3];break}}}while(0);if((a[bO]&1)!=0){aP=5749;break}bs=c[bB>>2]|0;if((bs|0)<0){g7=bs;aP=5750;break}e8=aq+ +h[7030]*.5;bw=64712+(bs*688&-1)|0;if(e8<+h[bw>>3]){h[bw>>3]=e8;g8=c[bB>>2]|0}else{g8=bs}bs=64664+(g8*688&-1)|0;do{if(e8<+h[bs>>3]){if((c[64648+(g8*688&-1)>>2]&1|0)==0){aP=5749;break L7758}if((c[64728+(g8*688&-1)>>2]&1|0)==0){h[bs>>3]=e8;break}fl=+h[64736+(g8*688&-1)>>3];if(fl>e8){h[bs>>3]=fl;aP=5749;break L7758}else{h[bs>>3]=e8;break}}}while(0);bs=c[bB>>2]|0;bw=64720+(bs*688&-1)|0;if(e8>+h[bw>>3]){h[bw>>3]=e8;g9=c[bB>>2]|0}else{g9=bs}bs=64672+(g9*688&-1)|0;if(e8<=+h[bs>>3]){aP=5749;break}if((c[64648+(g9*688&-1)>>2]&2|0)==0){aP=5749;break}if((c[64732+(g9*688&-1)>>2]&2|0)==0){h[bs>>3]=e8;aP=5749;break}fl=+h[64760+(g9*688&-1)>>3];if(fl>3]=fl;aP=5749;break}else{h[bs>>3]=e8;aP=5749;break}}}while(0);if((aP|0)==5749){aP=0;bs=c[bB>>2]|0;if((bs|0)!=99){g7=bs;aP=5750}}L7840:do{if((aP|0)==5750){aP=0;if(!(aq>-8.988465674311579e+307&aq<8.988465674311579e+307)){c[(c[bJ>>2]|0)+(d2<<6)>>2]=2;break}do{if((a[64788+(g7*688&-1)|0]&1)==0){h[(c[bJ>>2]|0)+(d2<<6)+8>>3]=aq}else{if(aq<0.0){c[(c[bJ>>2]|0)+(d2<<6)>>2]=2;break L7840}if(aq==0.0){h[(c[bJ>>2]|0)+(d2<<6)+8>>3]=-8.988465674311579e+307;c[(c[bJ>>2]|0)+(d2<<6)>>2]=1;break L7840}else{fy=+_(+aq);h[(c[bJ>>2]|0)+(d2<<6)+8>>3]=fy/+h[64800+(g7*688&-1)>>3];break}}}while(0);if((a[bO]&1)!=0){break}if((c[(c[bJ>>2]|0)+(d2<<6)>>2]|0)!=0){break}bs=c[bB>>2]|0;if((bs|0)<0){break}bw=64712+(bs*688&-1)|0;if(aq<+h[bw>>3]){h[bw>>3]=aq;ha=c[bB>>2]|0}else{ha=bs}bs=64664+(ha*688&-1)|0;do{if(aq<+h[bs>>3]){if((c[64648+(ha*688&-1)>>2]&1|0)==0){c[(c[bJ>>2]|0)+(d2<<6)>>2]=1;break L7840}if((c[64728+(ha*688&-1)>>2]&1|0)==0){h[bs>>3]=aq;break}e8=+h[64736+(ha*688&-1)>>3];if(e8>aq){h[bs>>3]=e8;c[(c[bJ>>2]|0)+(d2<<6)>>2]=1;break L7840}else{h[bs>>3]=aq;break}}}while(0);bs=c[bB>>2]|0;bw=64720+(bs*688&-1)|0;if(aq>+h[bw>>3]){h[bw>>3]=aq;hb=c[bB>>2]|0}else{hb=bs}bs=64672+(hb*688&-1)|0;if(aq<=+h[bs>>3]){break}if((c[64648+(hb*688&-1)>>2]&2|0)==0){c[(c[bJ>>2]|0)+(d2<<6)>>2]=1;break}if((c[64732+(hb*688&-1)>>2]&2|0)==0){h[bs>>3]=aq;break}e8=+h[64760+(hb*688&-1)>>3];if(e8>3]=e8;c[(c[bJ>>2]|0)+(d2<<6)>>2]=1;break}else{h[bs>>3]=aq;break}}}while(0);bs=c[fb>>2]|0;if((bs|0)==99){break}if(!(aW>-8.988465674311579e+307&aW<8.988465674311579e+307)){c[(c[bJ>>2]|0)+(d2<<6)>>2]=2;break}do{if((a[64788+(bs*688&-1)|0]&1)==0){h[(c[bJ>>2]|0)+(d2<<6)+16>>3]=aW}else{if(aW<0.0){c[(c[bJ>>2]|0)+(d2<<6)>>2]=2;break L7750}if(aW==0.0){h[(c[bJ>>2]|0)+(d2<<6)+16>>3]=-8.988465674311579e+307;c[(c[bJ>>2]|0)+(d2<<6)>>2]=1;break L7750}else{aq=+_(+aW);h[(c[bJ>>2]|0)+(d2<<6)+16>>3]=aq/+h[64800+(bs*688&-1)>>3];break}}}while(0);if((a[bO]&1)!=0){break}if((c[(c[bJ>>2]|0)+(d2<<6)>>2]|0)!=0){break}bs=c[fb>>2]|0;if((bs|0)<0){break}bw=64712+(bs*688&-1)|0;if(aW<+h[bw>>3]){h[bw>>3]=aW;hc=c[fb>>2]|0}else{hc=bs}bs=64664+(hc*688&-1)|0;do{if(aW<+h[bs>>3]){if((c[64648+(hc*688&-1)>>2]&1|0)==0){c[(c[bJ>>2]|0)+(d2<<6)>>2]=1;break L7750}if((c[64728+(hc*688&-1)>>2]&1|0)==0){h[bs>>3]=aW;break}aq=+h[64736+(hc*688&-1)>>3];if(aq>aW){h[bs>>3]=aq;c[(c[bJ>>2]|0)+(d2<<6)>>2]=1;break L7750}else{h[bs>>3]=aW;break}}}while(0);bs=c[fb>>2]|0;bw=64720+(bs*688&-1)|0;if(aW>+h[bw>>3]){h[bw>>3]=aW;hd=c[fb>>2]|0}else{hd=bs}bs=64672+(hd*688&-1)|0;if(aW<=+h[bs>>3]){break}if((c[64648+(hd*688&-1)>>2]&2|0)==0){c[(c[bJ>>2]|0)+(d2<<6)>>2]=1;break}if((c[64732+(hd*688&-1)>>2]&2|0)==0){h[bs>>3]=aW;break}aq=+h[64760+(hd*688&-1)>>3];if(aq>3]=aq;c[(c[bJ>>2]|0)+(d2<<6)>>2]=1;break}else{h[bs>>3]=aW;break}}}while(0);d2=d2+1|0;}while((d2|0)<(c[cb>>2]|0))}c[gQ>>2]=f0;c[fZ>>2]=gR;cb=gR|0;d2=f$+1|0;if((d2|0)>(aQ|0)){gN=cb;gO=f_;gP=aQ;break L7738}else{fG=cb;f0=f_;fH=c[cb>>2]|0;fI=d2;fJ=aQ}}uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=94952,v)|0)}}while(0);c[10814]=c[d>>2];c[gN>>2]=gO;dc(2,0);if((c[x>>2]|0)==0){ga=gP;break}dc(6,0);ga=gP}}while(0);gP=c[10814]|0;if((ga|0)==0|(gP|0)==0){uf(c[13898]|0,134776,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}gO=(c[z>>2]|0)==0;do{if(gO){if((c[x>>2]|0)!=0){aP=5960;break}if((c[gP+8>>2]|0)!=4){aP=5959;break}uf(-1,100088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{g2=+h[8256];gC=+h[8255];if(g2==-8.988465674311579e+307|gC==8.988465674311579e+307){uf(-1,99648,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((a[66036]&1)==0){he=gC;hf=g2}else{h[8255]=g2;h[8256]=gC;he=g2;hf=gC}if((a[66164]&1)==0){aP=5959;break}if(he>0.0&hf>0.0){gC=+_(+he);g2=+h[8272];h[8255]=gC/g2;h[8256]=+_(+hf)/g2;aP=5959;break}else{uf(-1,218096,(v=i,i=i+8|0,c[v>>2]=56880,v)|0)}}}while(0);do{if((aP|0)==5959){gP=(c[x>>2]|0)==0;if(!gP){aP=5960;break}if(gO){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=98616,v)|0)}z=c[17194]|0;if((z&1|0)!=0){h[8599]=+h[8255]}if((z&2|0)!=0){h[8600]=+h[8256]}if((z|0)!=0){hg=gP;break}if((a[68788]&1)!=0){hf=+h[8599];h[8599]=+h[8600];h[8600]=hf}if((a[68916]&1)==0){hg=gP;break}hf=+h[8599];if(hf<=0.0){uf(-1,218096,(v=i,i=i+8|0,c[v>>2]=56976,v)|0)}he=+h[8600];if(he>0.0){g2=+_(+hf);hf=+h[8616];h[8599]=g2/hf;h[8600]=+_(+he)/hf;hg=gP;break}else{uf(-1,218096,(v=i,i=i+8|0,c[v>>2]=56976,v)|0)}}}while(0);do{if((aP|0)==5960){hf=+h[8600];he=+h[8599];if(hf==-8.988465674311579e+307|he==8.988465674311579e+307){uf(-1,99648,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((a[68788]&1)==0){hh=he;hi=hf}else{h[8599]=hf;h[8600]=he;hh=hf;hi=he}if((a[68916]&1)==0){hg=0;break}if(hh>0.0&hi>0.0){he=+_(+hh);hf=+h[8616];h[8599]=he/hf;h[8600]=+_(+hi)/hf;hg=0;break}else{uf(-1,218096,(v=i,i=i+8|0,c[v>>2]=56976,v)|0)}}}while(0);do{if(gO){if(hg){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=98024,v)|0)}aP=c[16506]|0;if((aP&1|0)!=0){h[8255]=+h[8599]}if((aP&2|0)==0){break}h[8256]=+h[8600]}}while(0);hg=(c[y>>2]|0)==0;do{if(!hg){dc(1,97344);if((a[65348]&1)!=0){hi=+h[8169];h[8169]=+h[8170];h[8170]=hi}if((a[65476]&1)==0){break}hi=+h[8169];if(hi<=0.0){uf(-1,218096,(v=i,i=i+8|0,c[v>>2]=56856,v)|0)}hh=+h[8170];if(hh>0.0){hf=+_(+hi);hi=+h[8186];h[8169]=hf/hi;h[8170]=+_(+hh)/hi;break}else{uf(-1,218096,(v=i,i=i+8|0,c[v>>2]=56856,v)|0)}}}while(0);y=(c[w>>2]|0)==0;do{if(y){if(hg){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=96304,v)|0)}w=c[17022]|0;if((w&1|0)!=0){h[8513]=+h[8169]}if((w&2|0)!=0){h[8514]=+h[8170]}if((w|0)!=0){break}if((a[68100]&1)!=0){hi=+h[8513];h[8513]=+h[8514];h[8514]=hi}if((a[68228]&1)==0){break}hi=+h[8513];if(hi<=0.0){uf(-1,218096,(v=i,i=i+8|0,c[v>>2]=56952,v)|0)}hh=+h[8514];if(hh>0.0){hf=+_(+hi);hi=+h[8530];h[8513]=hf/hi;h[8514]=+_(+hh)/hi;break}else{uf(-1,218096,(v=i,i=i+8|0,c[v>>2]=56952,v)|0)}}else{dc(5,96768);if((a[68100]&1)!=0){hi=+h[8513];h[8513]=+h[8514];h[8514]=hi}if((a[68228]&1)==0){break}hi=+h[8513];if(hi<=0.0){uf(-1,218096,(v=i,i=i+8|0,c[v>>2]=56952,v)|0)}hh=+h[8514];if(hh>0.0){hf=+_(+hi);hi=+h[8530];h[8513]=hf/hi;h[8514]=+_(+hh)/hi;break}else{uf(-1,218096,(v=i,i=i+8|0,c[v>>2]=56952,v)|0)}}}while(0);do{if(hg){if(y){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=95912,v)|0)}w=c[16334]|0;if((w&1|0)!=0){h[8169]=+h[8513]}if((w&2|0)==0){break}h[8170]=+h[8514]}}while(0);y=c[7738]|0;L8234:do{if((y|0)!=-1){hg=(c[13898]|0)-1|0;w=c[1054]|0;gO=(c[w+(hg*40&-1)+36>>2]|0)+(c[w+(hg*40&-1)+32>>2]|0)|0;hg=db(c[6924]|0,(gO+1|0)-(c[w+(y*40&-1)+32>>2]|0)|0,116456)|0;c[6924]=hg;w=c[(c[1054]|0)+(y*40&-1)+32>>2]|0;L8236:do{if((w|0)<(gO|0)){aP=w;x=hg;while(1){gP=a[(c[10036]|0)+aP|0]|0;if(gP<<24>>24==0){hj=x;break L8236}z=x+1|0;a[x]=gP;gP=aP+1|0;if((gP|0)<(gO|0)){aP=gP;x=z}else{hj=z;break}}}else{hj=hg}}while(0);a[hj]=0;c[7738]=-1;hg=c[6924]|0;gO=e6(126928)|0;if((gO|0)==0){break}w=gO+8|0;do{if((a[w]&1)==0){x=c[gO+24>>2]|0;if((aY(x|0,hg|0)|0)==0){break L8234}aP=gO+16|0;if((c[aP>>2]|0)!=3){break}uu(x);c[aP>>2]=1}else{a[w]=0}}while(0);if((hg|0)==0){hm=0}else{hm=bP(hg|0)|0}c[gO+16>>2]=3;c[gO+24>>2]=hm}}while(0);hm=c[10814]|0;if((a[14112]&1)!=0){lf(hm,ga);e7(1);i=b;return}fS(hm,ga);hm=0;do{if((c[64656+(hm*688&-1)>>2]&1|0)!=0){hi=+h[64664+(hm*688&-1)>>3];if((a[64788+(hm*688&-1)|0]&1)==0){h[64696+(hm*688&-1)>>3]=hi;ho=+h[64672+(hm*688&-1)>>3]}else{hh=+h[64800+(hm*688&-1)>>3];h[64696+(hm*688&-1)>>3]=+Z(+(hi*hh));ho=+Z(+(+h[64672+(hm*688&-1)>>3]*hh))}h[64704+(hm*688&-1)>>3]=ho}hm=hm+1|0;}while(hm>>>0<11);c[6930]=ga;c[6928]=2;e7(1);i=b;return}function iU(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0.0,A=0.0,B=0,C=0,D=0,E=0;e=(d|0)>0;if(e){f=0;g=b}else{return}while(1){i=c[g+304>>2]|0;j=c[g+308>>2]|0;k=c[g+12>>2]|0;do{if((k|0)==400|(k|0)==416){if((c[64652+(i*688&-1)>>2]|0)==0){if((c[64652+(j*688&-1)>>2]|0)==0){break}}f3(g,1)}else{l=g+300|0;if((c[l>>2]|0)<=0){break}m=g+320|0;n=g+23|0;o=64652+(i*688&-1)|0;p=64672+(i*688&-1)|0;q=64664+(i*688&-1)|0;r=64652+(j*688&-1)|0;s=64672+(j*688&-1)|0;t=64664+(j*688&-1)|0;u=0;do{v=c[m>>2]|0;w=v+(u<<6)|0;do{if((c[w>>2]|0)!=2){c[w>>2]=0;do{if((a[n]&1)==0){x=c[o>>2]|0;do{if((x&1|0)!=0){y=+h[v+(u<<6)+8>>3];if(y>=+h[q>>3]){break}h[q>>3]=y}}while(0);if((x&2|0)==0){break}y=+h[v+(u<<6)+8>>3];if(y<=+h[p>>3]){break}h[p>>3]=y}}while(0);y=+h[q>>3];z=+h[p>>3];A=+h[v+(u<<6)+8>>3];if(yz){B=6117}}else{if(Ay){B=6117}}if((B|0)==6117){B=0;c[w>>2]=1;break}do{if((a[n]&1)==0){C=c[r>>2]|0;do{if((C&1|0)!=0){y=+h[v+(u<<6)+16>>3];if(y>=+h[t>>3]){break}h[t>>3]=y}}while(0);if((C&2|0)==0){break}y=+h[v+(u<<6)+16>>3];if(y<=+h[s>>3]){break}h[s>>3]=y}}while(0);y=+h[t>>3];A=+h[s>>3];z=+h[v+(u<<6)+16>>3];if(yA)){break}}else{if(!(zy)){break}}c[w>>2]=1}}while(0);u=u+1|0;}while((u|0)<(c[l>>2]|0))}}while(0);j=f+1|0;if((j|0)<(d|0)){f=j;g=c[g>>2]|0}else{break}}if(e){D=0;E=b}else{return}while(1){dc(c[E+304>>2]|0,0);dc(c[E+308>>2]|0,0);b=D+1|0;if((b|0)<(d|0)){D=b;E=c[E>>2]|0}else{break}}return}function iV(a,b){a=a|0;b=b|0;return a_(c[(c[a>>2]|0)+60>>2]|0,c[(c[b>>2]|0)+60>>2]|0,64)|0}function iW(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=+g;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0.0,w=0,x=0,y=0,z=0.0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;j=i;if((b|0)==0){uf(-1,92360,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{k=b}while(1){l=k|0;m=c[l>>2]|0;if((m|0)==0){break}else{k=m}}m=ut(192)|0;do{if((m|0)==0){gk();n=ut(192)|0;if((n|0)!=0){o=n;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=84552,v)|0)}else{o=m}}while(0);c[l>>2]=o;uD(o|0,k|0,192);k=c[l>>2]|0;c[k>>2]=0;c[k+4>>2]=e;h[k+24>>3]=+h[d+8>>3];h[k+32>>3]=+h[d+16>>3];h[k+40>>3]=+h[d+24>>3];d=k+72|0;do{if((c[d>>2]|0)==6){h[k+80>>3]=g}else{e=c[b+72>>2]|0;if((e|0)==3){if(+h[b+80>>3]>=0.0){break}c[k+76>>2]=~~g;break}else if((e|0)!=7){break}e=c[8798]|0;l=(e|0)>0;o=~~g;L8336:while(1){m=43264;while(1){p=c[m>>2]|0;if((p|0)==0){break}if((c[p+4>>2]|0)==(o|0)){q=6152;break L8336}else{m=p|0}}m=o-1|0;if(!((o|0)>(e|0)&l)){r=1;s=m;t=0.0;break}o=((m|0)%(e|0)&-1)+1|0}do{if((q|0)==6152){e=c[p+48>>2]|0;o=c[p+52>>2]|0;u=+h[p+56>>3];if((c[(c[3524]|0)+96>>2]&1024|0)!=0){r=e;s=o;t=u;break}l=(a[p+40|0]&1)==0;r=l?1:e;s=l?c[p+12>>2]|0:o;t=u}}while(0);c[d>>2]=r;c[k+76>>2]=s;h[k+80>>3]=t}}while(0);L8349:do{if((c[b+88>>2]|0)>0){s=k+128|0;if((c[s>>2]|0)==6){h[k+136>>3]=g;break}do{if((c[b+128>>2]|0)==3){if(+h[b+136>>3]>=0.0){break}c[k+132>>2]=~~g;break L8349}}while(0);if((c[b+92>>2]|0)!=-6){break}r=c[8798]|0;d=(r|0)>0;p=~~g;L8359:while(1){o=43264;while(1){w=c[o>>2]|0;if((w|0)==0){break}if((c[w+4>>2]|0)==(p|0)){q=6168;break L8359}else{o=w|0}}o=p-1|0;if(!((p|0)>(r|0)&d)){x=1;y=o;z=0.0;break}p=((o|0)%(r|0)&-1)+1|0}do{if((q|0)==6168){r=c[w+48>>2]|0;p=c[w+52>>2]|0;t=+h[w+56>>3];if((c[(c[3524]|0)+96>>2]&1024|0)!=0){x=r;y=p;z=t;break}d=(a[w+40|0]&1)==0;x=d?1:r;y=d?c[w+12>>2]|0:p;z=t}}while(0);c[s>>2]=x;c[k+132>>2]=y;h[k+136>>3]=z}}while(0);y=(f|0)==0?179864:f;f=a[47120]|0;L8371:do{if(f<<24>>24==0){L8382:do{if((a[y]|0)==34){x=1;while(1){w=a[y+x|0]|0;if((w<<24>>24|0)==0|(w<<24>>24|0)==34){A=x;break L8382}x=x+1|0}}else{A=0}}while(0);while(1){s=a[y+A|0]|0;if(s<<24>>24==0){B=A;break L8371}if((aM(s<<24>>24|0)|0)==0){A=A+1|0}else{B=A;break}}}else{s=0;x=0;while(1){w=a[y+x|0]|0;if((w<<24>>24|0)==34){C=s^1}else if((w<<24>>24|0)==0){D=x;break}else{if(w<<24>>24!=f<<24>>24|s){C=s}else{D=x;break}}s=C;x=x+1|0}while(1){if((D|0)<=0){B=D;break L8371}x=D-1|0;if((aM(a[y+x|0]|0|0)|0)==0){B=D;break}else{D=x}}}}while(0);do{if((a[y]|0)==34){if((a[y+(B-1|0)|0]|0)!=34){E=B;F=y;break}E=B-2|0;F=y+1|0}else{E=B;F=y}}while(0);y=E+1|0;B=ut(y)|0;if((B|0)!=0){G=B;H=k+60|0;c[H>>2]=G;I=uF(G|0,F|0,E|0)|0;J=c[H>>2]|0;K=J+E|0;a[K]=0;L=c[H>>2]|0;ua(L);i=j;return}gk();B=ut(y)|0;if((B|0)==0){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=224080,v)|0)}else{G=B;H=k+60|0;c[H>>2]=G;I=uF(G|0,F|0,E|0)|0;J=c[H>>2]|0;K=J+E|0;a[K]=0;L=c[H>>2]|0;ua(L);i=j;return}}function iX(b,d,e,f,g,j,k,l,m){b=b|0;d=d|0;e=+e;f=+f;g=+g;j=+j;k=+k;l=+l;m=+m;var n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0,G=0,H=0.0,I=0,J=0,K=0.0,L=0.0,M=0,N=0,O=0,Q=0,R=0,U=0,V=0,W=0,X=0,Y=0,Z=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0,aA=0,aB=0,aC=0,aD=0,aE=0,aF=0,aG=0,aH=0,aI=0,aJ=0,aK=0,aL=0,aM=0,aN=0,aO=0,aP=0,aQ=0,aR=0,aS=0,aT=0,aU=0,aV=0,aW=0,aX=0,aY=0,aZ=0,a_=0,a$=0,a0=0,a1=0,a2=0,a3=0,a4=0,a5=0,a6=0,a7=0,a8=0,a9=0,ba=0,bb=0,bc=0,bd=0,be=0,bf=0,bg=0,bh=0,bi=0,bj=0,bk=0,bl=0.0,bm=0.0,bn=0.0;n=i;i=i+24|0;o=n|0;p=c[b+320>>2]|0;q=c[60]|0;do{if((q|0)==0){r=f;s=l;t=k}else{c[64]=2;h[33]=f;h[34]=0.0;c[76]=c[64];c[308>>2]=c[260>>2];c[312>>2]=c[264>>2];c[316>>2]=c[268>>2];c[320>>2]=c[272>>2];c[324>>2]=c[276>>2];e4(q,o);do{if((a[1960]&1)==0){u=c[o>>2]|0;if((u|0)==2){w=+h[o+8>>3];break}else if((u|0)==1){w=+(c[o+8>>2]|0);break}else if((u|0)==3){w=+uz(c[o+8>>2]|0,0);break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}else{w=0.0}}while(0);c[64]=2;h[33]=k;h[34]=0.0;c[76]=c[64];c[308>>2]=c[260>>2];c[312>>2]=c[264>>2];c[316>>2]=c[268>>2];c[320>>2]=c[272>>2];c[324>>2]=c[276>>2];e4(c[60]|0,o);do{if((a[1960]&1)==0){u=c[o>>2]|0;if((u|0)==3){x=+uz(c[o+8>>2]|0,0);break}else if((u|0)==1){x=+(c[o+8>>2]|0);break}else if((u|0)==2){x=+h[o+8>>3];break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}else{x=0.0}}while(0);c[64]=2;h[33]=l;h[34]=0.0;c[76]=c[64];c[308>>2]=c[260>>2];c[312>>2]=c[264>>2];c[316>>2]=c[268>>2];c[320>>2]=c[272>>2];c[324>>2]=c[276>>2];e4(c[60]|0,o);if((a[1960]&1)!=0){r=w;s=0.0;t=x;break}u=c[o>>2]|0;if((u|0)==3){r=w;s=+uz(c[o+8>>2]|0,0);t=x;break}else if((u|0)==2){r=w;s=+h[o+8>>3];t=x;break}else if((u|0)==1){r=w;s=+(c[o+8>>2]|0);t=x;break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);o=p+(d<<6)|0;c[o>>2]=0;do{if((a[30528]&1)==0){y=e;z=r;A=g;B=s;C=t;D=j}else{if(r<+h[8691]){h[8691]=r}do{if(r<+h[8685]){if((c[17366]&1|0)==0){break}h[8685]=r>0.0?0.0:r}}while(0);if(r>+h[8692]){h[8692]=r}do{if(r>+h[8686]){if((c[17366]&2|0)==0){c[o>>2]=1;break}if((c[17387]&2|0)==0){h[8686]=r;break}x=+h[8697];if(x>3<<3,c[v>>2]=0,v)|0)}u=c[17366]|0;if((u&1|0)==0){w=+_(+r);l=+h[8702];E=w/l- +_(+x)/l;F=u;break}else{uf(-1,77440,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);l=+h[9040]*e;x=E*+S(+l);w=E*+T(+l);if((c[b+12>>2]|0)==457){l=(j-g)*.5;y=x;z=w;A=x-l;B=s;C=t;D=l+x;break}if((F&2|0)==0&s>+h[8686]){c[o>>2]=1;G=a[69604]|0}else{G=q}do{if((G&1)==0){u=c[17366]|0;if((u&1|0)!=0){H=s;I=u;break}H=s- +h[8685];I=u}else{l=+_(+s);k=+h[8702];f=l/k- +_(+(+h[8685]))/k;H=f;I=c[17366]|0}}while(0);f=+h[9040]*j;k=H*+S(+f);l=H*+T(+f);if((I&2|0)==0&t>+h[8686]){c[o>>2]=1;J=a[69604]|0}else{J=G}do{if((J&1)==0){if((c[17366]&1|0)!=0){K=t;break}K=t- +h[8685]}else{f=+_(+t);L=+h[8702];K=f/L- +_(+(+h[8685]))/L}}while(0);L=+h[9040]*g;f=K*+S(+L);y=x;z=w;A=f;B=l;C=K*+T(+L);D=k}}while(0);J=b+304|0;G=c[J>>2]|0;L8481:do{if((G|0)!=99){if(!(y>-8.988465674311579e+307&y<8.988465674311579e+307)){c[o>>2]=2;i=n;return}do{if((a[64788+(G*688&-1)|0]&1)==0){h[p+(d<<6)+8>>3]=y}else{if(y<0.0){c[o>>2]=2;i=n;return}if(y==0.0){h[p+(d<<6)+8>>3]=-8.988465674311579e+307;c[o>>2]=1;break L8481}else{K=+_(+y);h[p+(d<<6)+8>>3]=K/+h[64800+(G*688&-1)>>3];break}}}while(0);if((a[b+23|0]&1)!=0){break}if((c[o>>2]|0)!=0){break}I=c[J>>2]|0;if((I|0)<0){break}F=64712+(I*688&-1)|0;if(y<+h[F>>3]){h[F>>3]=y;M=c[J>>2]|0}else{M=I}I=64664+(M*688&-1)|0;do{if(y<+h[I>>3]){if((c[64648+(M*688&-1)>>2]&1|0)==0){c[o>>2]=1;break L8481}if((c[64728+(M*688&-1)>>2]&1|0)==0){h[I>>3]=y;break}k=+h[64736+(M*688&-1)>>3];if(k>y){h[I>>3]=k;c[o>>2]=1;break L8481}else{h[I>>3]=y;break}}}while(0);I=c[J>>2]|0;F=64720+(I*688&-1)|0;if(y>+h[F>>3]){h[F>>3]=y;N=c[J>>2]|0}else{N=I}I=64672+(N*688&-1)|0;if(y<=+h[I>>3]){break}if((c[64648+(N*688&-1)>>2]&2|0)==0){c[o>>2]=1;break}if((c[64732+(N*688&-1)>>2]&2|0)==0){h[I>>3]=y;break}k=+h[64760+(N*688&-1)>>3];if(k>3]=k;c[o>>2]=1;break}else{h[I>>3]=y;break}}}while(0);N=b+308|0;M=c[N>>2]|0;L8530:do{if((M|0)!=99){if(!(z>-8.988465674311579e+307&z<8.988465674311579e+307)){c[o>>2]=2;i=n;return}do{if((a[64788+(M*688&-1)|0]&1)==0){h[p+(d<<6)+16>>3]=z}else{if(z<0.0){c[o>>2]=2;i=n;return}if(z==0.0){h[p+(d<<6)+16>>3]=-8.988465674311579e+307;c[o>>2]=1;break L8530}else{k=+_(+z);h[p+(d<<6)+16>>3]=k/+h[64800+(M*688&-1)>>3];break}}}while(0);if((a[b+23|0]&1)!=0){break}if((c[o>>2]|0)!=0){break}G=c[N>>2]|0;if((G|0)<0){break}I=64712+(G*688&-1)|0;if(z<+h[I>>3]){h[I>>3]=z;O=c[N>>2]|0}else{O=G}G=64664+(O*688&-1)|0;do{if(z<+h[G>>3]){if((c[64648+(O*688&-1)>>2]&1|0)==0){c[o>>2]=1;break L8530}if((c[64728+(O*688&-1)>>2]&1|0)==0){h[G>>3]=z;break}k=+h[64736+(O*688&-1)>>3];if(k>z){h[G>>3]=k;c[o>>2]=1;break L8530}else{h[G>>3]=z;break}}}while(0);G=c[N>>2]|0;I=64720+(G*688&-1)|0;if(z>+h[I>>3]){h[I>>3]=z;Q=c[N>>2]|0}else{Q=G}G=64672+(Q*688&-1)|0;if(z<=+h[G>>3]){break}if((c[64648+(Q*688&-1)>>2]&2|0)==0){c[o>>2]=1;break}if((c[64732+(Q*688&-1)>>2]&2|0)==0){h[G>>3]=z;break}k=+h[64760+(Q*688&-1)>>3];if(k>3]=k;c[o>>2]=1;break}else{h[G>>3]=z;break}}}while(0);Q=c[b+12>>2]|0;L8579:do{if((Q|0)==474){h[p+(d<<6)+32>>3]=C;O=c[N>>2]|0;L8581:do{if((O|0)==99){R=0}else{if(!(B>-8.988465674311579e+307&B<8.988465674311579e+307)){h[p+(d<<6)+40>>3]=-8.988465674311579e+307;R=2;break}do{if((a[64788+(O*688&-1)|0]&1)==0){h[p+(d<<6)+40>>3]=B}else{if(B<0.0){h[p+(d<<6)+40>>3]=-8.988465674311579e+307;R=2;break L8581}if(B==0.0){h[p+(d<<6)+40>>3]=-8.988465674311579e+307;R=1;break L8581}else{k=+_(+B);h[p+(d<<6)+40>>3]=k/+h[64800+(O*688&-1)>>3];break}}}while(0);if((a[b+23|0]&1)!=0){R=0;break}M=c[N>>2]|0;if((M|0)<0){R=0;break}G=64712+(M*688&-1)|0;if(B<+h[G>>3]){h[G>>3]=B;U=c[N>>2]|0}else{U=M}M=64664+(U*688&-1)|0;do{if(B<+h[M>>3]){if((c[64648+(U*688&-1)>>2]&1|0)==0){R=1;break L8581}if((c[64728+(U*688&-1)>>2]&1|0)==0){h[M>>3]=B;break}k=+h[64736+(U*688&-1)>>3];if(k>B){h[M>>3]=k;R=1;break L8581}else{h[M>>3]=B;break}}}while(0);M=c[N>>2]|0;G=64720+(M*688&-1)|0;if(B>+h[G>>3]){h[G>>3]=B;V=c[N>>2]|0}else{V=M}M=64672+(V*688&-1)|0;if(B<=+h[M>>3]){R=0;break}if((c[64648+(V*688&-1)>>2]&2|0)==0){R=1;break}if((c[64732+(V*688&-1)>>2]&2|0)==0){h[M>>3]=B;R=0;break}k=+h[64760+(V*688&-1)>>3];if(k>3]=k;R=1;break}else{h[M>>3]=B;R=0;break}}}while(0);O=c[J>>2]|0;if((O|0)==99){W=R;break}L8624:do{if(A>-8.988465674311579e+307&A<8.988465674311579e+307){do{if((a[64788+(O*688&-1)|0]&1)==0){h[p+(d<<6)+48>>3]=A}else{if(A<0.0){h[p+(d<<6)+48>>3]=-8.988465674311579e+307;X=2;Y=6440;break L8624}if(A==0.0){h[p+(d<<6)+48>>3]=-8.988465674311579e+307;X=1;Y=6440;break L8624}else{k=+_(+A);h[p+(d<<6)+48>>3]=k/+h[64800+(O*688&-1)>>3];break}}}while(0);if(!((a[b+23|0]&1)==0&(R|0)==0)){X=R;Y=6440;break}M=c[J>>2]|0;if((M|0)<0){Z=M;$=0;break}G=64712+(M*688&-1)|0;if(A<+h[G>>3]){h[G>>3]=A;aa=c[J>>2]|0}else{aa=M}M=64664+(aa*688&-1)|0;do{if(A<+h[M>>3]){if((c[64648+(aa*688&-1)>>2]&1|0)==0){X=1;Y=6440;break L8624}if((c[64728+(aa*688&-1)>>2]&1|0)==0){h[M>>3]=A;break}k=+h[64736+(aa*688&-1)>>3];if(k>A){h[M>>3]=k;X=1;Y=6440;break L8624}else{h[M>>3]=A;break}}}while(0);M=c[J>>2]|0;G=64720+(M*688&-1)|0;if(A>+h[G>>3]){h[G>>3]=A;ab=c[J>>2]|0}else{ab=M}M=64672+(ab*688&-1)|0;if(A<=+h[M>>3]){ac=0;ad=ab;Y=6441;break}if((c[64648+(ab*688&-1)>>2]&2|0)==0){X=1;Y=6440;break}if((c[64732+(ab*688&-1)>>2]&2|0)==0){h[M>>3]=A;X=0;Y=6440;break}k=+h[64760+(ab*688&-1)>>3];if(k>3]=k;X=1;Y=6440;break}else{h[M>>3]=A;X=0;Y=6440;break}}else{h[p+(d<<6)+48>>3]=-8.988465674311579e+307;X=2;Y=6440}}while(0);if((Y|0)==6440){ac=X;ad=c[J>>2]|0;Y=6441}if((Y|0)==6441){if((ad|0)==99){W=ac;break}else{Z=ad;$=ac}}if(!(D>-8.988465674311579e+307&D<8.988465674311579e+307)){h[p+(d<<6)+56>>3]=-8.988465674311579e+307;W=2;break}do{if((a[64788+(Z*688&-1)|0]&1)==0){h[p+(d<<6)+56>>3]=D}else{if(D<0.0){h[p+(d<<6)+56>>3]=-8.988465674311579e+307;W=2;break L8579}if(D==0.0){h[p+(d<<6)+56>>3]=-8.988465674311579e+307;W=1;break L8579}else{k=+_(+D);h[p+(d<<6)+56>>3]=k/+h[64800+(Z*688&-1)>>3];break}}}while(0);if(!((a[b+23|0]&1)==0&($|0)==0)){W=$;break}O=c[J>>2]|0;if((O|0)<0){W=0;break}M=64712+(O*688&-1)|0;if(D<+h[M>>3]){h[M>>3]=D;ae=c[J>>2]|0}else{ae=O}O=64664+(ae*688&-1)|0;do{if(D<+h[O>>3]){if((c[64648+(ae*688&-1)>>2]&1|0)==0){W=1;break L8579}if((c[64728+(ae*688&-1)>>2]&1|0)==0){h[O>>3]=D;break}k=+h[64736+(ae*688&-1)>>3];if(k>D){h[O>>3]=k;W=1;break L8579}else{h[O>>3]=D;break}}}while(0);O=c[J>>2]|0;M=64720+(O*688&-1)|0;if(D>+h[M>>3]){h[M>>3]=D;af=c[J>>2]|0}else{af=O}O=64672+(af*688&-1)|0;if(D<=+h[O>>3]){W=0;break}if((c[64648+(af*688&-1)>>2]&2|0)==0){W=1;break}if((c[64732+(af*688&-1)>>2]&2|0)==0){h[O>>3]=D;W=0;break}k=+h[64760+(af*688&-1)>>3];if(k>3]=k;W=1;break}else{h[O>>3]=D;W=0;break}}else if((Q|0)==18|(Q|0)==1|(Q|0)==51|(Q|0)==368|(Q|0)==64|(Q|0)==33|(Q|0)==177|(Q|0)==193|(Q|0)==209){h[p+(d<<6)+48>>3]=A;h[p+(d<<6)+56>>3]=D;h[p+(d<<6)+32>>3]=C;h[p+(d<<6)+40>>3]=B;W=0}else if((Q|0)==153){h[p+(d<<6)+32>>3]=C;h[p+(d<<6)+40>>3]=B;O=c[J>>2]|0;if((O|0)==99){W=0;break}L8710:do{if(A>-8.988465674311579e+307&A<8.988465674311579e+307){do{if((a[64788+(O*688&-1)|0]&1)==0){h[p+(d<<6)+48>>3]=A}else{if(A<0.0){h[p+(d<<6)+48>>3]=-8.988465674311579e+307;ag=2;Y=6349;break L8710}if(A==0.0){h[p+(d<<6)+48>>3]=-8.988465674311579e+307;ag=1;Y=6349;break L8710}else{k=+_(+A);h[p+(d<<6)+48>>3]=k/+h[64800+(O*688&-1)>>3];break}}}while(0);if((a[b+23|0]&1)!=0){ag=0;Y=6349;break}M=c[J>>2]|0;if((M|0)<0){ah=M;ai=0;break}G=64712+(M*688&-1)|0;if(A<+h[G>>3]){h[G>>3]=A;aj=c[J>>2]|0}else{aj=M}M=64664+(aj*688&-1)|0;do{if(A<+h[M>>3]){if((c[64648+(aj*688&-1)>>2]&1|0)==0){ag=1;Y=6349;break L8710}if((c[64728+(aj*688&-1)>>2]&1|0)==0){h[M>>3]=A;break}k=+h[64736+(aj*688&-1)>>3];if(k>A){h[M>>3]=k;ag=1;Y=6349;break L8710}else{h[M>>3]=A;break}}}while(0);M=c[J>>2]|0;G=64720+(M*688&-1)|0;if(A>+h[G>>3]){h[G>>3]=A;ak=c[J>>2]|0}else{ak=M}M=64672+(ak*688&-1)|0;if(A<=+h[M>>3]){al=0;am=ak;Y=6350;break}if((c[64648+(ak*688&-1)>>2]&2|0)==0){ag=1;Y=6349;break}if((c[64732+(ak*688&-1)>>2]&2|0)==0){h[M>>3]=A;ag=0;Y=6349;break}k=+h[64760+(ak*688&-1)>>3];if(k>3]=k;ag=1;Y=6349;break}else{h[M>>3]=A;ag=0;Y=6349;break}}else{h[p+(d<<6)+48>>3]=-8.988465674311579e+307;ag=2;Y=6349}}while(0);if((Y|0)==6349){al=ag;am=c[J>>2]|0;Y=6350}if((Y|0)==6350){if((am|0)==99){W=al;break}else{ah=am;ai=al}}if(!(D>-8.988465674311579e+307&D<8.988465674311579e+307)){h[p+(d<<6)+56>>3]=-8.988465674311579e+307;W=2;break}do{if((a[64788+(ah*688&-1)|0]&1)==0){h[p+(d<<6)+56>>3]=D}else{if(D<0.0){h[p+(d<<6)+56>>3]=-8.988465674311579e+307;W=2;break L8579}if(D==0.0){h[p+(d<<6)+56>>3]=-8.988465674311579e+307;W=1;break L8579}else{k=+_(+D);h[p+(d<<6)+56>>3]=k/+h[64800+(ah*688&-1)>>3];break}}}while(0);if(!((a[b+23|0]&1)==0&(ai|0)==0)){W=ai;break}O=c[J>>2]|0;if((O|0)<0){W=0;break}M=64712+(O*688&-1)|0;if(D<+h[M>>3]){h[M>>3]=D;an=c[J>>2]|0}else{an=O}O=64664+(an*688&-1)|0;do{if(D<+h[O>>3]){if((c[64648+(an*688&-1)>>2]&1|0)==0){W=1;break L8579}if((c[64728+(an*688&-1)>>2]&1|0)==0){h[O>>3]=D;break}k=+h[64736+(an*688&-1)>>3];if(k>D){h[O>>3]=k;W=1;break L8579}else{h[O>>3]=D;break}}}while(0);O=c[J>>2]|0;M=64720+(O*688&-1)|0;if(D>+h[M>>3]){h[M>>3]=D;ao=c[J>>2]|0}else{ao=O}O=64672+(ao*688&-1)|0;if(D<=+h[O>>3]){W=0;break}if((c[64648+(ao*688&-1)>>2]&2|0)==0){W=1;break}if((c[64732+(ao*688&-1)>>2]&2|0)==0){h[O>>3]=D;W=0;break}k=+h[64760+(ao*688&-1)>>3];if(k>3]=k;W=1;break}else{h[O>>3]=D;W=0;break}}else if((Q|0)==457){h[p+(d<<6)+40>>3]=B;O=c[J>>2]|0;L8794:do{if((O|0)==99){ap=0}else{L8796:do{if(A>-8.988465674311579e+307&A<8.988465674311579e+307){do{if((a[64788+(O*688&-1)|0]&1)==0){h[p+(d<<6)+48>>3]=A}else{if(A<0.0){h[p+(d<<6)+48>>3]=-8.988465674311579e+307;aq=2;Y=6501;break L8796}if(A==0.0){h[p+(d<<6)+48>>3]=-8.988465674311579e+307;aq=1;Y=6501;break L8796}else{k=+_(+A);h[p+(d<<6)+48>>3]=k/+h[64800+(O*688&-1)>>3];break}}}while(0);if((a[b+23|0]&1)!=0){aq=0;Y=6501;break}M=c[J>>2]|0;if((M|0)<0){ar=M;as=0;break}G=64712+(M*688&-1)|0;if(A<+h[G>>3]){h[G>>3]=A;at=c[J>>2]|0}else{at=M}M=64664+(at*688&-1)|0;do{if(A<+h[M>>3]){if((c[64648+(at*688&-1)>>2]&1|0)==0){aq=1;Y=6501;break L8796}if((c[64728+(at*688&-1)>>2]&1|0)==0){h[M>>3]=A;break}k=+h[64736+(at*688&-1)>>3];if(k>A){h[M>>3]=k;aq=1;Y=6501;break L8796}else{h[M>>3]=A;break}}}while(0);M=c[J>>2]|0;G=64720+(M*688&-1)|0;if(A>+h[G>>3]){h[G>>3]=A;au=c[J>>2]|0}else{au=M}M=64672+(au*688&-1)|0;if(A<=+h[M>>3]){av=0;aw=au;Y=6502;break}if((c[64648+(au*688&-1)>>2]&2|0)==0){aq=1;Y=6501;break}if((c[64732+(au*688&-1)>>2]&2|0)==0){h[M>>3]=A;aq=0;Y=6501;break}k=+h[64760+(au*688&-1)>>3];if(k>3]=k;aq=1;Y=6501;break}else{h[M>>3]=A;aq=0;Y=6501;break}}else{h[p+(d<<6)+48>>3]=-8.988465674311579e+307;aq=2;Y=6501}}while(0);if((Y|0)==6501){av=aq;aw=c[J>>2]|0;Y=6502}if((Y|0)==6502){if((aw|0)==99){ap=av;break}else{ar=aw;as=av}}if(!(D>-8.988465674311579e+307&D<8.988465674311579e+307)){h[p+(d<<6)+56>>3]=-8.988465674311579e+307;ap=2;break}do{if((a[64788+(ar*688&-1)|0]&1)==0){h[p+(d<<6)+56>>3]=D}else{if(D<0.0){h[p+(d<<6)+56>>3]=-8.988465674311579e+307;ap=2;break L8794}if(D==0.0){h[p+(d<<6)+56>>3]=-8.988465674311579e+307;ap=1;break L8794}else{k=+_(+D);h[p+(d<<6)+56>>3]=k/+h[64800+(ar*688&-1)>>3];break}}}while(0);if(!((a[b+23|0]&1)==0&(as|0)==0)){ap=as;break}M=c[J>>2]|0;if((M|0)<0){ap=0;break}G=64712+(M*688&-1)|0;if(D<+h[G>>3]){h[G>>3]=D;ax=c[J>>2]|0}else{ax=M}M=64664+(ax*688&-1)|0;do{if(D<+h[M>>3]){if((c[64648+(ax*688&-1)>>2]&1|0)==0){ap=1;break L8794}if((c[64728+(ax*688&-1)>>2]&1|0)==0){h[M>>3]=D;break}k=+h[64736+(ax*688&-1)>>3];if(k>D){h[M>>3]=k;ap=1;break L8794}else{h[M>>3]=D;break}}}while(0);M=c[J>>2]|0;G=64720+(M*688&-1)|0;if(D>+h[G>>3]){h[G>>3]=D;ay=c[J>>2]|0}else{ay=M}M=64672+(ay*688&-1)|0;if(D<=+h[M>>3]){ap=0;break}if((c[64648+(ay*688&-1)>>2]&2|0)==0){ap=1;break}if((c[64732+(ay*688&-1)>>2]&2|0)==0){h[M>>3]=D;ap=0;break}k=+h[64760+(ay*688&-1)>>3];if(k>3]=k;ap=1;break}else{h[M>>3]=D;ap=0;break}}}while(0);h[p+(d<<6)+32>>3]=C;h[p+(d<<6)+56>>3]=B;if(+P(+C)<=1.0e3){if(+P(+B)<=1.0e3){W=ap;break}}c[o>>2]=2;W=ap}else if((Q|0)==489){O=c[J>>2]|0;L9055:do{if((O|0)==99){az=0}else{k=(A>D?A:D)*.5;M=b+272|0;l=y-k*((c[M>>2]|0)==1?1.1:1.0);L9057:do{if(l>-8.988465674311579e+307&l<8.988465674311579e+307){do{if((a[64788+(O*688&-1)|0]&1)==0){h[p+(d<<6)+48>>3]=l}else{if(l<0.0){h[p+(d<<6)+48>>3]=-8.988465674311579e+307;aA=2;Y=6565;break L9057}if(l==0.0){h[p+(d<<6)+48>>3]=-8.988465674311579e+307;aA=1;Y=6565;break L9057}else{w=+_(+l);h[p+(d<<6)+48>>3]=w/+h[64800+(O*688&-1)>>3];break}}}while(0);if((a[b+23|0]&1)!=0){aA=0;Y=6565;break}G=c[J>>2]|0;if((G|0)<0){aB=G;aC=0;break}I=c[M>>2]|0;w=y-k*((I|0)==1?1.1:1.0);F=64712+(G*688&-1)|0;if(w<+h[F>>3]){h[F>>3]=w;aD=c[M>>2]|0;aE=c[J>>2]|0}else{aD=I;aE=G}w=y-k*((aD|0)==1?1.1:1.0);G=64664+(aE*688&-1)|0;do{if(w<+h[G>>3]){if((c[64648+(aE*688&-1)>>2]&1|0)==0){aA=1;Y=6565;break L9057}if((c[64728+(aE*688&-1)>>2]&1|0)==0){h[G>>3]=w;break}x=+h[64736+(aE*688&-1)>>3];if(x>w){h[G>>3]=x;aA=1;Y=6565;break L9057}else{h[G>>3]=w;break}}}while(0);G=c[M>>2]|0;w=y-k*((G|0)==1?1.1:1.0);I=c[J>>2]|0;F=64720+(I*688&-1)|0;if(w>+h[F>>3]){h[F>>3]=w;aF=c[M>>2]|0;aG=c[J>>2]|0}else{aF=G;aG=I}w=y-k*((aF|0)==1?1.1:1.0);I=64672+(aG*688&-1)|0;if(w<=+h[I>>3]){aH=0;aI=aG;Y=6566;break}if((c[64648+(aG*688&-1)>>2]&2|0)==0){aA=1;Y=6565;break}if((c[64732+(aG*688&-1)>>2]&2|0)==0){h[I>>3]=w;aA=0;Y=6565;break}x=+h[64760+(aG*688&-1)>>3];if(x>3]=x;aA=1;Y=6565;break}else{h[I>>3]=w;aA=0;Y=6565;break}}else{h[p+(d<<6)+48>>3]=-8.988465674311579e+307;aA=2;Y=6565}}while(0);if((Y|0)==6565){aH=aA;aI=c[J>>2]|0;Y=6566}if((Y|0)==6566){if((aI|0)==99){az=aH;break}else{aB=aI;aC=aH}}l=y+k*((c[M>>2]|0)==1?1.1:1.0);if(!(l>-8.988465674311579e+307&l<8.988465674311579e+307)){h[p+(d<<6)+56>>3]=-8.988465674311579e+307;az=2;break}do{if((a[64788+(aB*688&-1)|0]&1)==0){h[p+(d<<6)+56>>3]=l}else{if(l<0.0){h[p+(d<<6)+56>>3]=-8.988465674311579e+307;az=2;break L9055}if(l==0.0){h[p+(d<<6)+56>>3]=-8.988465674311579e+307;az=1;break L9055}else{w=+_(+l);h[p+(d<<6)+56>>3]=w/+h[64800+(aB*688&-1)>>3];break}}}while(0);if(!((a[b+23|0]&1)==0&(aC|0)==0)){az=aC;break}I=c[J>>2]|0;if((I|0)<0){az=0;break}G=c[M>>2]|0;l=y+k*((G|0)==1?1.1:1.0);F=64712+(I*688&-1)|0;if(l<+h[F>>3]){h[F>>3]=l;aJ=c[M>>2]|0;aK=c[J>>2]|0}else{aJ=G;aK=I}l=y+k*((aJ|0)==1?1.1:1.0);I=64664+(aK*688&-1)|0;do{if(l<+h[I>>3]){if((c[64648+(aK*688&-1)>>2]&1|0)==0){az=1;break L9055}if((c[64728+(aK*688&-1)>>2]&1|0)==0){h[I>>3]=l;break}w=+h[64736+(aK*688&-1)>>3];if(w>l){h[I>>3]=w;az=1;break L9055}else{h[I>>3]=l;break}}}while(0);I=c[M>>2]|0;l=y+k*((I|0)==1?1.1:1.0);G=c[J>>2]|0;F=64720+(G*688&-1)|0;if(l>+h[F>>3]){h[F>>3]=l;aL=c[M>>2]|0;aM=c[J>>2]|0}else{aL=I;aM=G}l=y+k*((aL|0)==1?1.1:1.0);G=64672+(aM*688&-1)|0;if(l<=+h[G>>3]){az=0;break}if((c[64648+(aM*688&-1)>>2]&2|0)==0){az=1;break}if((c[64732+(aM*688&-1)>>2]&2|0)==0){h[G>>3]=l;az=0;break}w=+h[64760+(aM*688&-1)>>3];if(w>3]=w;az=1;break}else{h[G>>3]=l;az=0;break}}}while(0);O=c[N>>2]|0;L9141:do{if((O|0)==99){aN=az}else{l=(A>D?A:D)*.5;G=b+272|0;w=z-l*((c[G>>2]|0)==2?1.0:1.4);L9143:do{if(w>-8.988465674311579e+307&w<8.988465674311579e+307){do{if((a[64788+(O*688&-1)|0]&1)==0){h[p+(d<<6)+32>>3]=w}else{if(w<0.0){h[p+(d<<6)+32>>3]=-8.988465674311579e+307;aO=2;Y=6626;break L9143}if(w==0.0){h[p+(d<<6)+32>>3]=-8.988465674311579e+307;aO=1;Y=6626;break L9143}else{x=+_(+w);h[p+(d<<6)+32>>3]=x/+h[64800+(O*688&-1)>>3];break}}}while(0);if(!((a[b+23|0]&1)==0&(az|0)==0)){aO=az;Y=6626;break}I=c[N>>2]|0;if((I|0)<0){aP=I;aQ=0;break}F=c[G>>2]|0;x=z-l*((F|0)==2?1.0:1.4);q=64712+(I*688&-1)|0;if(x<+h[q>>3]){h[q>>3]=x;aR=c[G>>2]|0;aS=c[N>>2]|0}else{aR=F;aS=I}x=z-l*((aR|0)==2?1.0:1.4);I=64664+(aS*688&-1)|0;do{if(x<+h[I>>3]){if((c[64648+(aS*688&-1)>>2]&1|0)==0){aO=1;Y=6626;break L9143}if((c[64728+(aS*688&-1)>>2]&1|0)==0){h[I>>3]=x;break}K=+h[64736+(aS*688&-1)>>3];if(K>x){h[I>>3]=K;aO=1;Y=6626;break L9143}else{h[I>>3]=x;break}}}while(0);I=c[G>>2]|0;x=z-l*((I|0)==2?1.0:1.4);F=c[N>>2]|0;q=64720+(F*688&-1)|0;if(x>+h[q>>3]){h[q>>3]=x;aT=c[G>>2]|0;aU=c[N>>2]|0}else{aT=I;aU=F}x=z-l*((aT|0)==2?1.0:1.4);F=64672+(aU*688&-1)|0;if(x<=+h[F>>3]){aV=0;aW=aU;Y=6627;break}if((c[64648+(aU*688&-1)>>2]&2|0)==0){aO=1;Y=6626;break}if((c[64732+(aU*688&-1)>>2]&2|0)==0){h[F>>3]=x;aO=0;Y=6626;break}K=+h[64760+(aU*688&-1)>>3];if(K>3]=K;aO=1;Y=6626;break}else{h[F>>3]=x;aO=0;Y=6626;break}}else{h[p+(d<<6)+32>>3]=-8.988465674311579e+307;aO=2;Y=6626}}while(0);if((Y|0)==6626){aV=aO;aW=c[N>>2]|0;Y=6627}if((Y|0)==6627){if((aW|0)==99){aN=aV;break}else{aP=aW;aQ=aV}}w=z+l*((c[G>>2]|0)==2?1.0:1.4);if(!(w>-8.988465674311579e+307&w<8.988465674311579e+307)){h[p+(d<<6)+40>>3]=-8.988465674311579e+307;aN=2;break}do{if((a[64788+(aP*688&-1)|0]&1)==0){h[p+(d<<6)+40>>3]=w}else{if(w<0.0){h[p+(d<<6)+40>>3]=-8.988465674311579e+307;aN=2;break L9141}if(w==0.0){h[p+(d<<6)+40>>3]=-8.988465674311579e+307;aN=1;break L9141}else{k=+_(+w);h[p+(d<<6)+40>>3]=k/+h[64800+(aP*688&-1)>>3];break}}}while(0);if(!((a[b+23|0]&1)==0&(aQ|0)==0)){aN=aQ;break}M=c[N>>2]|0;if((M|0)<0){aN=0;break}F=c[G>>2]|0;w=z+l*((F|0)==2?1.0:1.4);I=64712+(M*688&-1)|0;if(w<+h[I>>3]){h[I>>3]=w;aX=c[G>>2]|0;aY=c[N>>2]|0}else{aX=F;aY=M}w=z+l*((aX|0)==2?1.0:1.4);M=64664+(aY*688&-1)|0;do{if(w<+h[M>>3]){if((c[64648+(aY*688&-1)>>2]&1|0)==0){aN=1;break L9141}if((c[64728+(aY*688&-1)>>2]&1|0)==0){h[M>>3]=w;break}k=+h[64736+(aY*688&-1)>>3];if(k>w){h[M>>3]=k;aN=1;break L9141}else{h[M>>3]=w;break}}}while(0);M=c[G>>2]|0;w=z+l*((M|0)==2?1.0:1.4);F=c[N>>2]|0;I=64720+(F*688&-1)|0;if(w>+h[I>>3]){h[I>>3]=w;aZ=c[G>>2]|0;a_=c[N>>2]|0}else{aZ=M;a_=F}w=z+l*((aZ|0)==2?1.0:1.4);F=64672+(a_*688&-1)|0;if(w<=+h[F>>3]){aN=0;break}if((c[64648+(a_*688&-1)>>2]&2|0)==0){aN=1;break}if((c[64732+(a_*688&-1)>>2]&2|0)==0){h[F>>3]=w;aN=0;break}k=+h[64760+(a_*688&-1)>>3];if(k>3]=k;aN=1;break}else{h[F>>3]=w;aN=0;break}}}while(0);h[p+(d<<6)+48>>3]=A;h[p+(d<<6)+56>>3]=D;h[p+(d<<6)+32>>3]=C;W=aN}else{O=c[J>>2]|0;L8884:do{if((O|0)==99){a$=0}else{L8886:do{if(A>-8.988465674311579e+307&A<8.988465674311579e+307){do{if((a[64788+(O*688&-1)|0]&1)==0){h[p+(d<<6)+48>>3]=A}else{if(A<0.0){h[p+(d<<6)+48>>3]=-8.988465674311579e+307;a0=2;Y=6688;break L8886}if(A==0.0){h[p+(d<<6)+48>>3]=-8.988465674311579e+307;a0=1;Y=6688;break L8886}else{w=+_(+A);h[p+(d<<6)+48>>3]=w/+h[64800+(O*688&-1)>>3];break}}}while(0);if((a[b+23|0]&1)!=0){a0=0;Y=6688;break}F=c[J>>2]|0;if((F|0)<0){a1=F;a2=0;break}M=64712+(F*688&-1)|0;if(A<+h[M>>3]){h[M>>3]=A;a3=c[J>>2]|0}else{a3=F}F=64664+(a3*688&-1)|0;do{if(A<+h[F>>3]){if((c[64648+(a3*688&-1)>>2]&1|0)==0){a0=1;Y=6688;break L8886}if((c[64728+(a3*688&-1)>>2]&1|0)==0){h[F>>3]=A;break}w=+h[64736+(a3*688&-1)>>3];if(w>A){h[F>>3]=w;a0=1;Y=6688;break L8886}else{h[F>>3]=A;break}}}while(0);F=c[J>>2]|0;M=64720+(F*688&-1)|0;if(A>+h[M>>3]){h[M>>3]=A;a4=c[J>>2]|0}else{a4=F}F=64672+(a4*688&-1)|0;if(A<=+h[F>>3]){a5=0;a6=a4;Y=6689;break}if((c[64648+(a4*688&-1)>>2]&2|0)==0){a0=1;Y=6688;break}if((c[64732+(a4*688&-1)>>2]&2|0)==0){h[F>>3]=A;a0=0;Y=6688;break}w=+h[64760+(a4*688&-1)>>3];if(w>3]=w;a0=1;Y=6688;break}else{h[F>>3]=A;a0=0;Y=6688;break}}else{h[p+(d<<6)+48>>3]=-8.988465674311579e+307;a0=2;Y=6688}}while(0);if((Y|0)==6688){a5=a0;a6=c[J>>2]|0;Y=6689}if((Y|0)==6689){if((a6|0)==99){a$=a5;break}else{a1=a6;a2=a5}}if(!(D>-8.988465674311579e+307&D<8.988465674311579e+307)){h[p+(d<<6)+56>>3]=-8.988465674311579e+307;a$=2;break}do{if((a[64788+(a1*688&-1)|0]&1)==0){h[p+(d<<6)+56>>3]=D}else{if(D<0.0){h[p+(d<<6)+56>>3]=-8.988465674311579e+307;a$=2;break L8884}if(D==0.0){h[p+(d<<6)+56>>3]=-8.988465674311579e+307;a$=1;break L8884}else{l=+_(+D);h[p+(d<<6)+56>>3]=l/+h[64800+(a1*688&-1)>>3];break}}}while(0);if(!((a[b+23|0]&1)==0&(a2|0)==0)){a$=a2;break}G=c[J>>2]|0;if((G|0)<0){a$=0;break}F=64712+(G*688&-1)|0;if(D<+h[F>>3]){h[F>>3]=D;a7=c[J>>2]|0}else{a7=G}G=64664+(a7*688&-1)|0;do{if(D<+h[G>>3]){if((c[64648+(a7*688&-1)>>2]&1|0)==0){a$=1;break L8884}if((c[64728+(a7*688&-1)>>2]&1|0)==0){h[G>>3]=D;break}l=+h[64736+(a7*688&-1)>>3];if(l>D){h[G>>3]=l;a$=1;break L8884}else{h[G>>3]=D;break}}}while(0);G=c[J>>2]|0;F=64720+(G*688&-1)|0;if(D>+h[F>>3]){h[F>>3]=D;a8=c[J>>2]|0}else{a8=G}G=64672+(a8*688&-1)|0;if(D<=+h[G>>3]){a$=0;break}if((c[64648+(a8*688&-1)>>2]&2|0)==0){a$=1;break}if((c[64732+(a8*688&-1)>>2]&2|0)==0){h[G>>3]=D;a$=0;break}l=+h[64760+(a8*688&-1)>>3];if(l>3]=l;a$=1;break}else{h[G>>3]=D;a$=0;break}}}while(0);O=c[N>>2]|0;if((O|0)==99){W=a$;break}L8971:do{if(C>-8.988465674311579e+307&C<8.988465674311579e+307){do{if((a[64788+(O*688&-1)|0]&1)==0){h[p+(d<<6)+32>>3]=C}else{if(C<0.0){h[p+(d<<6)+32>>3]=-8.988465674311579e+307;a9=2;Y=6749;break L8971}if(C==0.0){h[p+(d<<6)+32>>3]=-8.988465674311579e+307;a9=1;Y=6749;break L8971}else{l=+_(+C);h[p+(d<<6)+32>>3]=l/+h[64800+(O*688&-1)>>3];break}}}while(0);if(!((a[b+23|0]&1)==0&(a$|0)==0)){a9=a$;Y=6749;break}G=c[N>>2]|0;if((G|0)<0){ba=G;bb=0;break}F=64712+(G*688&-1)|0;if(C<+h[F>>3]){h[F>>3]=C;bc=c[N>>2]|0}else{bc=G}G=64664+(bc*688&-1)|0;do{if(C<+h[G>>3]){if((c[64648+(bc*688&-1)>>2]&1|0)==0){a9=1;Y=6749;break L8971}if((c[64728+(bc*688&-1)>>2]&1|0)==0){h[G>>3]=C;break}l=+h[64736+(bc*688&-1)>>3];if(l>C){h[G>>3]=l;a9=1;Y=6749;break L8971}else{h[G>>3]=C;break}}}while(0);G=c[N>>2]|0;F=64720+(G*688&-1)|0;if(C>+h[F>>3]){h[F>>3]=C;bd=c[N>>2]|0}else{bd=G}G=64672+(bd*688&-1)|0;if(C<=+h[G>>3]){be=0;bf=bd;Y=6750;break}if((c[64648+(bd*688&-1)>>2]&2|0)==0){a9=1;Y=6749;break}if((c[64732+(bd*688&-1)>>2]&2|0)==0){h[G>>3]=C;a9=0;Y=6749;break}l=+h[64760+(bd*688&-1)>>3];if(l>3]=l;a9=1;Y=6749;break}else{h[G>>3]=C;a9=0;Y=6749;break}}else{h[p+(d<<6)+32>>3]=-8.988465674311579e+307;a9=2;Y=6749}}while(0);if((Y|0)==6749){be=a9;bf=c[N>>2]|0;Y=6750}if((Y|0)==6750){if((bf|0)==99){W=be;break}else{ba=bf;bb=be}}if(!(B>-8.988465674311579e+307&B<8.988465674311579e+307)){h[p+(d<<6)+40>>3]=-8.988465674311579e+307;W=2;break}do{if((a[64788+(ba*688&-1)|0]&1)==0){h[p+(d<<6)+40>>3]=B}else{if(B<0.0){h[p+(d<<6)+40>>3]=-8.988465674311579e+307;W=2;break L8579}if(B==0.0){h[p+(d<<6)+40>>3]=-8.988465674311579e+307;W=1;break L8579}else{l=+_(+B);h[p+(d<<6)+40>>3]=l/+h[64800+(ba*688&-1)>>3];break}}}while(0);if(!((a[b+23|0]&1)==0&(bb|0)==0)){W=bb;break}O=c[N>>2]|0;if((O|0)<0){W=0;break}G=64712+(O*688&-1)|0;if(B<+h[G>>3]){h[G>>3]=B;bg=c[N>>2]|0}else{bg=O}O=64664+(bg*688&-1)|0;do{if(B<+h[O>>3]){if((c[64648+(bg*688&-1)>>2]&1|0)==0){W=1;break L8579}if((c[64728+(bg*688&-1)>>2]&1|0)==0){h[O>>3]=B;break}l=+h[64736+(bg*688&-1)>>3];if(l>B){h[O>>3]=l;W=1;break L8579}else{h[O>>3]=B;break}}}while(0);O=c[N>>2]|0;G=64720+(O*688&-1)|0;if(B>+h[G>>3]){h[G>>3]=B;bh=c[N>>2]|0}else{bh=O}O=64672+(bh*688&-1)|0;if(B<=+h[O>>3]){W=0;break}if((c[64648+(bh*688&-1)>>2]&2|0)==0){W=1;break}if((c[64732+(bh*688&-1)>>2]&2|0)==0){h[O>>3]=B;W=0;break}l=+h[64760+(bh*688&-1)>>3];if(l>3]=l;W=1;break}else{h[O>>3]=B;W=0;break}}}while(0);bh=b+312|0;N=c[bh>>2]|0;L9228:do{if((N|0)==99){h[p+(d<<6)+24>>3]=m;bi=W}else{if(!(m>-8.988465674311579e+307&m<8.988465674311579e+307)){h[p+(d<<6)+24>>3]=-8.988465674311579e+307;bi=2;break}do{if((a[64788+(N*688&-1)|0]&1)==0){h[p+(d<<6)+24>>3]=m}else{if(m<0.0){h[p+(d<<6)+24>>3]=-8.988465674311579e+307;bi=2;break L9228}if(m==0.0){h[p+(d<<6)+24>>3]=-8.988465674311579e+307;bi=1;break L9228}else{B=+_(+m);h[p+(d<<6)+24>>3]=B/+h[64800+(N*688&-1)>>3];break}}}while(0);if(!((a[b+23|0]&1)==0&(W|0)==0)){bi=W;break}bg=c[bh>>2]|0;if((bg|0)<0){bi=0;break}bb=64712+(bg*688&-1)|0;if(+h[bb>>3]>m){h[bb>>3]=m;bj=c[bh>>2]|0}else{bj=bg}bg=64664+(bj*688&-1)|0;do{if(+h[bg>>3]>m){if((c[64648+(bj*688&-1)>>2]&1|0)==0){bi=1;break L9228}if((c[64728+(bj*688&-1)>>2]&1|0)==0){h[bg>>3]=m;break}B=+h[64736+(bj*688&-1)>>3];if(B>m){h[bg>>3]=B;bi=1;break L9228}else{h[bg>>3]=m;break}}}while(0);bg=c[bh>>2]|0;bb=64720+(bg*688&-1)|0;if(+h[bb>>3]>3]=m;bk=c[bh>>2]|0}else{bk=bg}bg=64672+(bk*688&-1)|0;if(+h[bg>>3]>=m){bi=0;break}if((c[64648+(bk*688&-1)>>2]&2|0)==0){bi=1;break}if((c[64732+(bk*688&-1)>>2]&2|0)==0){h[bg>>3]=m;bi=0;break}B=+h[64760+(bk*688&-1)>>3];if(B>3]=B;bi=1;break}else{h[bg>>3]=m;bi=0;break}}}while(0);if((c[b+64>>2]|0)!=6){i=n;return}bk=b+316|0;bh=c[bk>>2]|0;if((bh|0)==0){i=n;return}bj=bh+(d<<3)|0;m=+h[bj>>3];if(!(m>-8.988465674311579e+307&m<8.988465674311579e+307)){i=n;return}do{if((a[66852]&1)==0){bl=m}else{if(m<0.0){i=n;return}if(m!=0.0){B=+_(+m);bl=B/+h[8358];break}h[bj>>3]=-8.988465674311579e+307;i=n;return}}while(0);h[bj>>3]=bl;if(!((a[b+23|0]&1)==0&(bi|0)==0)){i=n;return}bl=+h[(c[bk>>2]|0)+(d<<3)>>3];if(bl<+h[8347]){h[8347]=bl;bm=+h[(c[bk>>2]|0)+(d<<3)>>3]}else{bm=bl}do{if(bm<+h[8341]){if((c[16678]&1|0)==0){i=n;return}if((c[16698]&1|0)==0){h[8341]=bm;break}bl=+h[8350];if(bl<=bm){h[8341]=bm;break}h[8341]=bl;i=n;return}}while(0);bm=+h[(c[bk>>2]|0)+(d<<3)>>3];if(bm>+h[8348]){h[8348]=bm;bn=+h[(c[bk>>2]|0)+(d<<3)>>3]}else{bn=bm}if(bn<=+h[8342]){i=n;return}if((c[16678]&2|0)==0){i=n;return}if((c[16699]&2|0)==0){h[8342]=bn;i=n;return}bm=+h[8353];if(bm>2]|0;d=c[b+16>>2]|0;if((d|0)!=0){uu(d)}d=b+256|0;e=c[d>>2]|0;if((e|0)!=0){f=e;while(1){e=c[f>>2]|0;uu(c[f+4>>2]|0);uu(c[d>>2]|0);c[d>>2]=e;if((e|0)==0){break}else{f=e}}}f=b+260|0;d=c[f>>2]|0;if((d|0)!=0){e=d;while(1){d=c[e>>2]|0;g=c[e+12>>2]|0;if((g|0)!=0){uu(g)}uu(e);c[f>>2]=d;if((d|0)==0){break}else{e=d}}}e=b+224|0;f=c[e>>2]|0;if((f|0)!=0){d=c[f+64>>2]|0;if((d|0)==0){h=f}else{uu(d);h=f}while(1){f=c[h+60>>2]|0;if((f|0)!=0){uu(f)}f=c[h+64>>2]|0;if(!((f|0)==0|(f|0)==(d|0))){uu(f)}f=c[h>>2]|0;uu(h);if((f|0)==0){break}else{h=f}}c[e>>2]=0}uu(b);if((a|0)==0){break}else{b=a}}return}function iZ(){var d=0,e=0,f=0,j=0,k=0.0,l=0.0,m=0,n=0.0,o=0.0,p=0,q=0.0,r=0,s=0.0,t=0.0,u=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0,C=0.0,D=0.0,E=0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0,M=0,N=0,O=0,P=0;d=i;i=i+24|0;e=d|0;a[37384]=1;do{if((c[5094]|0)==1){if(a[20368]|0){break}a[20368]=1;g[5090]=+g[3538];g[5088]=+g[3536];g[5086]=+g[3534];g[3538]=180.0;g[3536]=0.0;g[3534]=1.2999999523162842;c[16336]=c[16336]^2;c[17024]=c[17024]^2}}while(0);f=a[32936]&1;do{if(f<<24>>24!=0){if((aY(24544,175824)|0)!=0){break}b[12272]=117;w=118;a[24595]=w&255;w=w>>8;a[24596|0]=w&255}}while(0);j=c[16507]|0;c[16506]=j;if((j&3|0)==0){k=+h[8258];l=+h[8257];if(k>3];if((a[66164]&1)==0){q=0.0}else{q=+_(+(+h[8271]))}h[8272]=q;h[8261]=8.988465674311579e+307;h[8262]=-8.988465674311579e+307;m=c[16335]|0;c[16334]=m;if((m&3|0)==0){q=+h[8172];n=+h[8171];if(q>3];if((a[65476]&1)==0){u=0.0}else{u=+_(+(+h[8185]))}h[8186]=u;h[8175]=8.988465674311579e+307;h[8176]=-8.988465674311579e+307;r=c[16163]|0;c[16162]=r;do{if((r&3|0)==0){u=+h[8086];s=+h[8085];if(u>=s){x=s;y=u;p=6902;break}h[8083]=u;z=s}else{x=+h[8085];y=+h[8086];p=6902}}while(0);if((p|0)==6902){h[8083]=(r&1|0)==0?x:8.988465674311579e+307;z=(r&2|0)==0?y:-8.988465674311579e+307}h[8084]=z;if((a[64788]&1)==0){A=0.0}else{A=+_(+(+h[8099]))}h[8100]=A;h[8089]=8.988465674311579e+307;h[8090]=-8.988465674311579e+307;r=c[17711]|0;c[17710]=r;if((r&3|0)==0){A=+h[8860];z=+h[8859];if(A>3];a[70980]=0;h[8873]=1.0;h[8874]=0.0;h[8863]=8.988465674311579e+307;h[8864]=-8.988465674311579e+307;B=c[17883]|0;c[17882]=B;if((B&3|0)==0){C=+h[8946];D=+h[8945];if(C>3];a[71668]=0;h[8959]=1.0;h[8960]=0.0;h[8949]=8.988465674311579e+307;h[8950]=-8.988465674311579e+307;E=c[16679]|0;c[16678]=E;do{if((E&3|0)==0){F=+h[8344];G=+h[8343];if(F>=G){H=G;I=F;p=6917;break}h[8341]=F;J=G}else{H=+h[8343];I=+h[8344];p=6917}}while(0);if((p|0)==6917){h[8341]=(E&1|0)==0?H:8.988465674311579e+307;J=(E&2|0)==0?I:-8.988465674311579e+307}h[8342]=J;if((a[66852]&1)==0){K=0.0}else{K=+_(+(+h[8357]))}h[8358]=K;h[8347]=8.988465674311579e+307;h[8348]=-8.988465674311579e+307;if((c[3524]|0)==0){uf(c[13898]|0,135392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}E=f<<24>>24!=0;f=E?10:1;B=dr(E?9:2,-1)|0;do{if((c[5094]|0)==1){if((a[32936]&1)!=0){break}if(!(a[20368]|0)){break}a[20368]=0;g[3538]=+g[5090];g[3536]=+g[5088];g[3534]=+g[5086];c[16336]=c[16336]^2;c[17024]=c[17024]^2}}while(0);E=dr(f,-1)|0;f=a[32936]|0;do{if((c[5094]|0)==1){if((f&1)!=0){break}if(a[20368]|0){break}a[20368]=1;g[5090]=+g[3538];g[5088]=+g[3536];g[5086]=+g[3534];g[3538]=180.0;g[3536]=0.0;g[3534]=1.2999999523162842;c[16336]=c[16336]^2;c[17024]=c[17024]^2}}while(0);do{if((f&1)!=0){dq(2);do{if((c[5094]|0)==1){if(!(a[20368]|0)){break}a[20368]=0;g[3538]=+g[5090];g[3536]=+g[5088];g[3534]=+g[5086];c[16336]=c[16336]^2;c[17024]=c[17024]^2}}while(0);dq(1);if((c[5094]|0)!=1){break}if(a[20368]|0){break}a[20368]=1;g[5090]=+g[3538];g[5088]=+g[3536];g[5086]=+g[3534];g[3538]=180.0;g[3536]=0.0;g[3534]=1.2999999523162842;c[16336]=c[16336]^2;c[17024]=c[17024]^2}}while(0);dq(0);do{if((c[16506]&3|0)==0){K=+h[8256];J=+h[8255];if(K>=J){p=6940;break}h[8255]=K;h[8256]=J;L=1}else{p=6940}}while(0);if((p|0)==6940){L=(c[16508]|0)>>>1&1}a[66036]=L;do{if((c[16334]&3|0)==0){J=+h[8170];K=+h[8169];if(J>=K){p=6944;break}h[8169]=J;h[8170]=K;M=1}else{p=6944}}while(0);if((p|0)==6944){M=(c[16336]|0)>>>1&1}a[65348]=M;do{if((c[16162]&3|0)==0){K=+h[8084];J=+h[8083];if(K>=J){p=6948;break}h[8083]=K;h[8084]=J;N=1}else{p=6948}}while(0);if((p|0)==6948){N=(c[16164]|0)>>>1&1}a[64660]=N;N=e;M=e+16|0;L=0;do{f=64944+(L*688&-1)|0;r=c[f>>2]|0;if((r|0)==0){p=6957}else{c[N>>2]=c[7254];c[N+4>>2]=c[7255];c[N+8>>2]=c[7256];c[N+12>>2]=c[7257];c[N+16>>2]=c[7258];c[N+20>>2]=c[7259];m=e;j=r;L9464:while(1){r=j;while(1){if((c[r+12>>2]|0)>=0){break}uu(c[r+8>>2]|0);O=c[r+16>>2]|0;uu(r);if((O|0)==0){P=m;break L9464}else{r=O}}c[m+16>>2]=r;O=c[r+16>>2]|0;if((O|0)==0){P=r;break}else{m=r;j=O}}c[P+16>>2]=0;j=c[M>>2]|0;c[f>>2]=j;if((j|0)==0){p=6957}}do{if((p|0)==6957){p=0;j=64920+(L*688&-1)|0;if((c[j>>2]|0)!=3){break}c[j>>2]=1}}while(0);L=L+1|0;}while(L>>>0<11);if((B|0)>-1){L=c[1054]|0;p=c[L+(B*40&-1)+36>>2]|0;M=(p|0)>49?49:p;p=c[10036]|0;P=c[L+(B*40&-1)+32>>2]|0;B=0;while(1){L=B+1|0;a[B+55600|0]=a[p+P|0]|0;if((L|0)==(M|0)){break}else{P=P+1|0;B=L}}a[M+55600|0]=0}else{uB(55600,24544)}if((E|0)<=-1){uB(55651,24595);i_();i=d;return}M=c[1054]|0;B=c[M+(E*40&-1)+36>>2]|0;P=(B|0)>49?49:B;B=c[10036]|0;p=c[M+(E*40&-1)+32>>2]|0;E=0;while(1){M=E+1|0;a[E+55651|0]=a[B+p|0]|0;if((M|0)==(P|0)){break}else{p=p+1|0;E=M}}a[P+55651|0]=0;i_();i=d;return}function i_(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,U=0,V=0,W=0,X=0,Y=0,$=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0,aA=0,aB=0,aC=0,aD=0,aE=0,aF=0,aG=0,aH=0,aJ=0,aK=0,aL=0,aM=0,aN=0,aO=0,aP=0,aQ=0,aR=0,aS=0,aT=0,aU=0,aV=0,aW=0,aX=0,aZ=0,a_=0,a$=0,a0=0,a1=0,a2=0,a3=0,a4=0,a5=0,a6=0,a7=0,a8=0,a9=0,ba=0,bb=0,bc=0,bd=0,be=0,bf=0,bg=0,bh=0,bi=0,bj=0,bk=0,bl=0,bm=0,bn=0,bo=0,bp=0,bq=0,br=0,bs=0,bt=0,bu=0,bv=0,bw=0,bx=0,by=0,bz=0,bB=0,bC=0,bD=0,bE=0,bF=0,bG=0,bH=0,bI=0,bJ=0,bK=0,bL=0,bM=0,bN=0,bO=0,bQ=0,bR=0,bS=0,bT=0,bU=0,bV=0,bW=0,bX=0,bY=0,bZ=0,b_=0,b$=0,b0=0,b1=0,b2=0,b3=0,b4=0,b5=0,b6=0,b7=0,b8=0,b9=0,ca=0,cb=0,cc=0,cd=0,ce=0,cf=0,cg=0,ch=0,ci=0,cj=0,ck=0,cl=0,cm=0,cn=0,co=0,cp=0,cq=0,cr=0,cs=0,ct=0,cu=0,cv=0,cw=0,cx=0,cy=0,cz=0,cA=0,cB=0,cC=0,cD=0,cE=0,cF=0,cG=0,cH=0.0,cI=0,cJ=0,cK=0,cL=0,cM=0,cN=0,cO=0.0,cP=0,cQ=0,cR=0.0,cS=0.0,cT=0.0,cU=0.0,cV=0,cW=0.0,cX=0.0,cY=0.0,cZ=0.0,c_=0.0,c$=0.0,c0=0,c1=0.0,c2=0,c3=0.0,c4=0,c5=0.0,c6=0,c7=0.0,c8=0.0,c9=0.0,da=0.0,de=0,df=0.0,dg=0.0,dh=0,di=0,dj=0.0,dl=0.0,dm=0.0,dn=0.0,dp=0.0,dq=0.0,dr=0.0,ds=0.0,dt=0.0,du=0.0,dv=0.0,dw=0.0,dx=0.0,dy=0.0,dz=0.0,dA=0.0,dB=0.0,dC=0.0,dD=0,dE=0,dF=0,dG=0,dH=0,dI=0,dJ=0,dK=0,dL=0,dM=0,dN=0.0,dO=0,dP=0,dQ=0,dR=0,dS=0,dU=0,dV=0,dW=0,dX=0,dY=0,dZ=0,d_=0.0,d$=0.0,d0=0.0,d1=0.0,d2=0,d3=0.0,d4=0.0,d5=0.0,d6=0.0,d7=0.0,d8=0.0,d9=0.0,ea=0.0,eb=0.0,ec=0.0,ed=0.0,ee=0.0,ef=0,eg=0.0,eh=0,ei=0,ej=0,ek=0,el=0,em=0,en=0,eo=0,eq=0,er=0,es=0,et=0,eu=0,ev=0,ew=0,ex=0,eA=0,eB=0,eD=0,eE=0,eF=0,eG=0,eH=0,eI=0,eJ=0,eK=0,eN=0,eO=0,eP=0,eQ=0,eR=0,eS=0,eT=0,eU=0,eV=0,eW=0.0,eX=0.0,eY=0.0,eZ=0.0,e_=0,e$=0,e0=0,e1=0,e2=0,e3=0,e4=0,e5=0,e8=0,e9=0,fa=0,fb=0,fc=0,fd=0,fe=0,ff=0,fg=0,fh=0,fi=0,fj=0,fk=0.0,fl=0,fm=0,fn=0.0;b=i;i=i+272|0;d=b|0;e=b+32|0;f=b+40|0;g=b+128|0;j=b+152|0;k=b+200|0;l=b+256|0;n=b+264|0;o=c[10828]|0;if((o|0)!=0&(c[7952]|0)>0){iY(o)}c[7952]=0;c[10828]=0;c[200]=2;c[144]=1;c[34]=0;a[872]=0;o=c[13898]|0;c[7774]=iw()|0;p=c[13898]|0;if((p|0)>=(c[8272]|0)){q=p;uf(q,105216,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}r=b+96|0;s=k;t=k+4|0;u=k+16|0;w=k+24|0;x=k+8|0;y=k|0;z=k+40|0;A=k+44|0;B=k+32|0;C=g|0;D=j|0;E=j+8|0;F=f|0;G=f+8|0;H=f+16|0;I=f+24|0;J=f+32|0;K=f+40|0;L=f+48|0;f=b+8|0;M=b+176|0;N=0;O=0;U=0;V=0;W=0;X=0;Y=0;$=0;ab=0;ac=0;ad=43312;ae=p;L9498:while(1){p=(V|0)==0;af=Y;ag=ac;ah=ae;while(1){ai=c[1054]|0;L9502:do{if((a[ai+(ah*40&-1)|0]&1)!=0){aj=c[ai+(ah*40&-1)+36>>2]|0;ak=ai+(ah*40&-1)+32|0;al=c[10036]|0;am=0;while(1){if((am|0)>=(aj|0)){break}if((a[al+((c[ak>>2]|0)+am|0)|0]|0)==(a[am+103664|0]|0)){am=am+1|0}else{break L9502}}if((am|0)==1){an=af;ao=ag;ap=N;aq=V;ar=$;as=ab;at=ah;au=6983;break L9498}}}while(0);if(p){av=af?ag:ah}else{av=ag}if((t9(ah)|0)==0){au=6995;break}dT();ai=c[13898]|0;ak=(c[8272]|0)>(ai|0);if(!ak){an=1;ao=av;ap=N;aq=V;ar=$;as=ab;at=ai;au=6983;break L9498}al=c[1054]|0;if((a[al+(ai*40&-1)|0]&1)==0){af=1;ag=av;ah=ai;continue}aj=c[al+(ai*40&-1)+36>>2]|0;aw=al+(ai*40&-1)+32|0;al=c[10036]|0;ax=0;while(1){if((ax|0)>=(aj|0)){au=6994;break}if((a[al+((c[aw>>2]|0)+ax|0)|0]|0)==(a[ax+148464|0]|0)){ax=ax+1|0}else{break}}if((au|0)==6994){au=0;if((ax|0)==1){ay=ad;az=av;aA=ab;aB=$;aC=af;aD=X;aE=W;aF=V;aG=U;aH=O;aJ=N;break}}if(ak){af=1;ag=av;ah=ai}else{an=1;ao=av;ap=N;aq=V;ar=$;as=ab;at=ai;au=6983;break L9498}}do{if((au|0)==6995){au=0;if(af){aK=av}else{aK=(a[32936]&1)==0|p?c[13898]|0:av}c[11670]=31112;ah=iu(0)|0;c[11670]=0;if((ah|0)==0){ag=N+1|0;if((a[32936]&1)==0){aL=V}else{aL=(V+2|0)%3&-1}aw=c[ad>>2]|0;al=(a[38984]&1)==0;L9562:do{if((aw|0)==0){if(al){aM=i0(c[6352]|0,c[9344]|0,c[6350]|0,c[9342]|0)|0}else{aM=i0(c[9344]|0,0,0,c[9342]|0)|0}c[ad>>2]=aM;aN=aM}else{if(!al){aj=c[9344]|0;aO=c[9342]|0;aP=aw+260|0;aQ=c[aP>>2]|0;if((aQ|0)!=0){aR=aQ;while(1){aQ=c[aR>>2]|0;if((aR|0)!=0){aS=c[aR+12>>2]|0;if((aS|0)!=0){uu(aS)}uu(aR)}if((aQ|0)==0){break}else{aR=aQ}}}c[aP>>2]=0;if((aO|0)>0&(aj|0)>0){aR=0;while(1){am=hu(aj)|0;c[am>>2]=c[aP>>2];c[aP>>2]=am;am=aR+1|0;if((am|0)<(aO|0)){aR=am}else{aN=aw;break L9562}}}else{c[aP>>2]=0;aN=aw;break}}aR=c[6352]|0;aO=c[9344]|0;aj=c[6350]|0;am=c[9342]|0;aQ=aw+260|0;aS=c[aQ>>2]|0;if((aS|0)!=0){aT=aS;while(1){aS=c[aT>>2]|0;if((aT|0)!=0){aU=c[aT+12>>2]|0;if((aU|0)!=0){uu(aU)}uu(aT)}if((aS|0)==0){break}else{aT=aS}}}c[aQ>>2]=0;if(!((am|0)>0&(aR|0)>0)){c[aQ>>2]=0;aN=aw;break}if((aO|0)>0){aT=0;while(1){aP=hu(aj)|0;c[aP>>2]=c[aQ>>2];c[aQ>>2]=aP;aP=aT+1|0;if((aP|0)<(aO|0)){aT=aP}else{aV=0;break}}}else{aV=0}while(1){aT=hu(aR)|0;c[aT>>2]=c[aQ>>2];c[aQ>>2]=aT;aT=aV+1|0;if((aT|0)<(am|0)){aV=aT}else{aN=aw;break}}}}while(0);c[aN+8>>2]=2;c[aN+244>>2]=1;c[aN+12>>2]=c[10058];c[aN+252>>2]=c[9342];aW=(c[13898]|0)-1|0;aX=ab;aZ=1;a_=aL;a$=aN;a0=ag}else{if(!((a[32936]&1)==0|p)){au=6999;break L9498}do{if(!ab){aw=c[16506]|0;if((aw&1|0)!=0){h[8255]=8.988465674311579e+307}if((aw&2|0)!=0){h[8256]=-8.988465674311579e+307}aw=c[16334]|0;if((aw&1|0)!=0){h[8169]=8.988465674311579e+307}if((aw&2|0)==0){break}h[8170]=-8.988465674311579e+307}}while(0);ag=c[ad>>2]|0;if((ag|0)==0){uE(M|0,0,24);aw=ut(272)|0;if((aw|0)==0){gk();al=ut(272)|0;if((al|0)==0){au=7012;break L9498}else{a1=al}}else{a1=aw}aw=a1;uE(a1|0,0,272);c[a1+28>>2]=-2;al=a1+32|0;c[al>>2]=0;c[al+4>>2]=0;h[a1+40>>3]=1.0;h[a1+48>>3]=-2.0;al=a1+56|0;c[al>>2]=c[M>>2];c[al+4>>2]=c[M+4>>2];c[al+8>>2]=c[M+8>>2];c[al+12>>2]=c[M+12>>2];c[al+16>>2]=c[M+16>>2];c[al+20>>2]=c[M+20>>2];c[a1+80>>2]=-1;c[a1+84>>2]=0;al=a1+88|0;c[al>>2]=c[12872];c[al+4>>2]=c[12873];c[al+8>>2]=c[12874];c[al+12>>2]=c[12875];c[al+16>>2]=c[12876];c[al+20>>2]=c[12877];c[al+24>>2]=c[12878];c[al+28>>2]=c[12879];c[al+32>>2]=c[12880];c[al+36>>2]=c[12881];c[al+40>>2]=c[12882];c[al+44>>2]=c[12883];c[al+48>>2]=c[12884];c[al+52>>2]=c[12885];c[a1+144>>2]=1;h[a1+152>>3]=0.0;c[a1+160>>2]=0;h[a1+168>>3]=15.0;h[a1+176>>3]=90.0;c[a1+184>>2]=0;c[ad>>2]=aw;a2=aw}else{a2=ag}c[a2+8>>2]=3;c[a2+12>>2]=c[12890];c[11856]=2;ag=ey(ah,7,a2)|0;if((a[47584]&1)!=0){c[a2+244>>2]=1}aw=(c[13898]|0)-1|0;c[a2+4>>2]=aw;al=c[7774]|0;if((al|0)==0){a3=0}else{a3=c[al+32>>2]|0}c[a2+248>>2]=a3;if((ag|0)<3){if((c[16546]|0)==1){au=7020;break L9498}if((c[16374]|0)==1){au=7022;break L9498}}c[12210]=2;c[12211]=1;c[12212]=0;aW=aw;aX=1;aZ=$;a_=V;a$=a2;a0=N}a4=a$+16|0;aw=c[a4>>2]|0;if((aw|0)!=0){uu(aw);c[a4>>2]=0}aw=a$+24|0;ag=a$+56|0;a[ag]=0;al=a$+28|0;c[al>>2]=X;ai=a$+32|0;c[ai>>2]=W;ak=a$+240|0;c[ak>>2]=X;ax=X+1|0;do{if((a[30080]&1)==0){am=aw|0;aQ=c[am>>2]|0;aR=c[8798]|0;aT=(aR|0)>0;aO=ax;L9612:while(1){aj=43264;while(1){a5=c[aj>>2]|0;if((a5|0)==0){break}if((c[a5+4>>2]|0)==(aO|0)){break L9612}else{aj=a5|0}}a6=aO-1|0;if(!((aO|0)>(aR|0)&aT)){au=7067;break}aO=((a6|0)%(aR|0)&-1)+1|0}if((au|0)==7067){au=0;c[al>>2]=a6;c[a$+64>>2]=1;c[a$+68>>2]=a6;c[ai>>2]=a6;break}aR=aw;aT=a5+8|0;c[aR>>2]=c[aT>>2];c[aR+4>>2]=c[aT+4>>2];c[aR+8>>2]=c[aT+8>>2];c[aR+12>>2]=c[aT+12>>2];c[aR+16>>2]=c[aT+16>>2];c[aR+20>>2]=c[aT+20>>2];c[aR+24>>2]=c[aT+24>>2];c[aR+28>>2]=c[aT+28>>2];c[aR+32>>2]=c[aT+32>>2];c[aR+36>>2]=c[aT+36>>2];c[aR+40>>2]=c[aT+40>>2];c[aR+44>>2]=c[aT+44>>2];c[aR+48>>2]=c[aT+48>>2];c[aR+52>>2]=c[aT+52>>2];c[am>>2]=aQ;if((c[(c[3524]|0)+96>>2]&1024|0)!=0){c[al>>2]=aO;a[ag]=0;break}if((a[ag]&1)!=0){break}c[a$+64>>2]=1;c[a$+68>>2]=c[al>>2]}else{lK(aw,ax)}}while(0);ah=a$+12|0;aT=a$+224|0;aR=a$+80|0;aj=a$+88|0;aP=aw;aS=aj;aU=a$+80|0;a7=a$+84|0;a8=a$+144|0;a9=a$+152|0;ba=a$+160|0;bb=a$+168|0;bc=a$+176|0;bd=a$+184|0;be=aj|0;aj=a$+92|0;bf=a$+128|0;bg=a$+132|0;bh=a$+96|0;bi=a$+120|0;bj=a$+238|0;bk=a$+237|0;bl=a$+236|0;bm=a$+8|0;bn=a$+232|0;bo=a$+264|0;bp=a$+22|0;bq=(U|0)==0;br=(O|0)==0;bs=a$+20|0;bt=a$;bu=(a_|0)==0;bv=0;bw=0;bx=0;by=0;bz=0;L9627:while(1){bB=c[13898]|0;bC=c[8272]|0;L9629:do{if((bB|0)<(bC|0)){bD=c[1054]|0;bE=a[bD+(bB*40&-1)|0]|0;if((bE&1)==0){bF=bD;bG=bE;break}bH=c[bD+(bB*40&-1)+36>>2]|0;bI=bD+(bB*40&-1)+32|0;bJ=c[10036]|0;bK=0;while(1){if((bK|0)>=(bH|0)){break}if((a[bJ+((c[bI>>2]|0)+bK|0)|0]|0)==(a[bK+103664|0]|0)){bK=bK+1|0}else{bF=bD;bG=bE;break L9629}}if((bK|0)!=1|bw^1){bF=bD;bG=bE}else{break L9627}}else{if(bw){break L9627}bI=c[1054]|0;bF=bI;bG=a[bI+(bB*40&-1)|0]|0}}while(0);aO=c[bF+(bB*40&-1)+36>>2]|0;aQ=c[bF+(bB*40&-1)+32>>2]|0;am=(bG&1)==0;L9639:do{if((aO|0)>0&(am^1)){bI=c[10036]|0;bJ=0;bH=0;bL=aQ;while(1){if((a[bJ+224032|0]|0)==(a[bI+(bJ+bL|0)|0]|0)){bM=bL;bN=bH}else{if((bJ|0)!=1){break}bM=bL-1|0;bN=1}bO=bJ+1|0;if((bO|0)<(bN+aO|0)){bJ=bO;bH=bN;bL=bM}else{au=7083;break}}do{if((au|0)==7083){au=0;if((bN|0)==0){if(!((bJ|0)==0|(bJ|0)==5)){break}}if(bz){bQ=bB;au=8109;break L9498}a[bs]=a[36231]&1^1;do{if((a[32936]&1)!=0){if(!bu){au=7088;break L9498}if(!bq){a[U]=0}if(br){break}a[O]=0}}while(0);bR=(c[13898]|0)+1|0;c[13898]=bR;bL=c[1054]|0;bH=c[bL+(bR*40&-1)+36>>2]|0;bI=c[bL+(bR*40&-1)+32>>2]|0;bE=(a[bL+(bR*40&-1)|0]&1)==0;L9661:do{if((bH|0)>0&(bE^1)){bL=c[10036]|0;bD=0;bK=0;bO=bI;while(1){if((a[bD+137208|0]|0)==(a[bL+(bD+bO|0)|0]|0)){bS=bO;bT=bK}else{if((bD|0)!=3){break L9661}bS=bO-1|0;bT=1}bU=bD+1|0;if((bU|0)<(bT+bH|0)){bD=bU;bK=bT;bO=bS}else{break}}if((bT|0)==0){if(!((bD|0)==2|(bD|0)==12)){break}}eM(bt);bv=bv;bw=bw;bx=bx;by=by;bz=1;continue L9627}}while(0);if((bR|0)>=(c[8272]|0)){au=7110;break L9498}L9675:do{if(!bE){bO=c[10036]|0;bK=0;while(1){if((bK|0)>=(bH|0)){break}if((a[bO+(bI+bK|0)|0]|0)==(a[bK+103664|0]|0)){bK=bK+1|0}else{break L9675}}if((bK|0)==1){au=7110;break L9498}}}while(0);a[14176]=1;is(j);a[14176]=0;if((c[D>>2]|0)!=3){au=7109;break L9498}bI=c[E>>2]|0;c[a4>>2]=bI;if((bI|0)==0){au=8108;break L9498}else{bv=bv;bw=bw;bx=bx;by=by;bz=1;continue L9627}}}while(0);if(am){break}L9685:do{if((aO|0)>0){bJ=c[10036]|0;bI=0;bH=0;bE=aQ;while(1){if((a[bI+202e3|0]|0)==(a[bJ+(bI+bE|0)|0]|0)){bV=bE;bW=bH}else{if((bI|0)!=3){break L9685}bV=bE-1|0;bW=1}bO=bI+1|0;if((bO|0)<(bW+aO|0)){bI=bO;bH=bW;bE=bV}else{break}}if((bW|0)==0){if(!((bI|0)==2|(bI|0)==7)){break}}if(bz){bQ=bB;au=8110;break L9498}bE=bB+1|0;c[13898]=bE;bH=(a[bF+(bE*40&-1)|0]&1)==0;if(bH){au=7125}else{bJ=c[10036]|0;bO=a[bJ+(c[bF+(bE*40&-1)+32>>2]|0)|0]|0;if((bO<<24>>24|0)==39|(bO<<24>>24|0)==34){bX=bJ;au=7135}else{au=7125}}L9700:do{if((au|0)==7125){au=0;bJ=c[10810]|0;if((bJ|0)==0){break}bO=bF+(bE*40&-1)+36|0;bD=bF+(bE*40&-1)+32|0;bL=c[10036]|0;bU=bJ;L9703:while(1){bJ=c[bU+4>>2]|0;L9705:do{if(!((bC|0)<=(bE|0)|bH)){bY=c[bO>>2]|0;bZ=0;while(1){if((bZ|0)>=(bY|0)){break}if((a[bL+((c[bD>>2]|0)+bZ|0)|0]|0)==(a[bJ+bZ|0]|0)){bZ=bZ+1|0}else{break L9705}}if((a[bJ+bZ|0]|0)==0){break L9703}}}while(0);bJ=c[bU>>2]|0;if((bJ|0)==0){break L9700}else{bU=bJ}}if((a[bU+8|0]&1)!=0){break}if((c[bU+16>>2]|0)==3){bX=bL;au=7135}}}while(0);L9714:do{if((au|0)==7135){au=0;if((bE|0)>=(bC|0)){break}L9717:do{if(!bH){bI=c[bF+(bE*40&-1)+36>>2]|0;bD=bF+(bE*40&-1)+32|0;bO=0;while(1){if((bO|0)>=(bI|0)){break}if((a[bX+((c[bD>>2]|0)+bO|0)|0]|0)==(a[bO+103664|0]|0)){bO=bO+1|0}else{break L9717}}if((bO|0)==1){break L9714}}}while(0);a[14176]=1;is(g);a[14176]=0;if((c[C>>2]|0)==3){break}c[13898]=bE}}while(0);a[bp]=1;if(!bq){a[U]=0}if(br){bv=bv;bw=bw;bx=bx;by=by;bz=1;continue L9627}a[O]=0;bv=bv;bw=bw;bx=bx;by=by;bz=1;continue L9627}}while(0);if(!((aO|0)>0&(am^1))){break}bE=c[10036]|0;bH=0;bL=0;bU=aQ;while(1){if((a[bH+196448|0]|0)==(a[bE+(bH+bU|0)|0]|0)){b_=bU;b$=bL}else{if((bH|0)!=1){break}b_=bU-1|0;b$=1}bD=bH+1|0;if((bD|0)<(b$+aO|0)){bH=bD;bL=b$;bU=b_}else{au=7153;break}}do{if((au|0)==7153){au=0;if((b$|0)==0){if(!((bH|0)==0|(bH|0)==4)){break}}if(by){bQ=bB;au=8111;break L9498}bU=bB+1|0;c[13898]=bU;bL=c[bF+(bU*40&-1)+36>>2]|0;bE=c[bF+(bU*40&-1)+32>>2]|0;bD=(a[bF+(bU*40&-1)|0]&1)==0;bU=(bL|0)>0;bI=c[10036]|0;bK=30672;bJ=116448;L9744:while(1){L9746:do{if(!bD){if(bU){bY=0;b0=0;b1=bE;while(1){b2=a[bJ+bY|0]|0;if(b2<<24>>24==(a[bI+(bY+b1|0)|0]|0)){b3=b1;b4=b0}else{if(b2<<24>>24!=36){break L9746}b3=b1-1|0;b4=1}b5=bY+1|0;if((b5|0)<(b4+bL|0)){bY=b5;b0=b4;b1=b3}else{break}}if((b4|0)==0){b6=b5}else{b7=bK;break L9744}}else{b6=0}b1=a[bJ+b6|0]|0;if((b1<<24>>24|0)==36|(b1<<24>>24|0)==0){b7=bK;break L9744}}}while(0);b1=bK+8|0;b0=c[b1>>2]|0;if((b0|0)==0){b7=b1;break}else{bK=b1;bJ=b0}}bJ=c[b7+4>>2]|0;b8=bB+2|0;c[13898]=b8;if((bJ|0)==-1){au=7167;break L9498}c[ah>>2]=bJ;do{if((c[bm>>2]|0)==2){if(!((bJ&4|0)!=0|(bJ|0)==368)){b9=bJ;break}uh(c[13898]|0,185192,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);c[ah>>2]=18;b9=18}else{b9=bJ}}while(0);L9764:do{if(((c[12890]|b9)&352|0)==0){ca=b9}else{bJ=c[13898]|0;if((c[8272]|0)<=(bJ|0)){ca=b9;break}bK=c[1054]|0;if((a[bK+(bJ*40&-1)|0]&1)==0){ca=b9;break}bL=c[bK+(bJ*40&-1)+36>>2]|0;bI=bK+(bJ*40&-1)+32|0;bK=c[10036]|0;bE=0;while(1){if((bE|0)>=(bL|0)){break}if((a[bK+((c[bI>>2]|0)+bE|0)|0]|0)==(a[bE+95280|0]|0)){bE=bE+1|0}else{ca=b9;break L9764}}if((bE|0)!=2){ca=b9;break}c[13898]=bJ+1;if((i9(bo)|0)!=0){au=8116;break L9498}ca=c[ah>>2]|0}}while(0);if(!((ca|0)==400|(ca|0)==432|(ca|0)==416)){bv=bv;bw=bw;bx=bx;by=1;bz=bz;continue L9627}bI=c[13898]|0;if((c[8272]|0)<=(bI|0)){bv=bv;bw=bw;bx=bx;by=1;bz=bz;continue L9627}bK=c[1054]|0;if((a[bK+(bI*40&-1)|0]&1)==0){bv=bv;bw=bw;bx=bx;by=1;bz=bz;continue L9627}bL=c[bK+(bI*40&-1)+36>>2]|0;bU=bK+(bI*40&-1)+32|0;bK=c[10036]|0;bD=0;while(1){if((bD|0)>=(bL|0)){break}if((a[bK+((c[bU>>2]|0)+bD|0)|0]|0)==(a[bD+224816|0]|0)){bD=bD+1|0}else{bv=bv;bw=bw;bx=bx;by=1;bz=bz;continue L9627}}if((bD|0)!=8){bv=bv;bw=bw;bx=bx;by=1;bz=bz;continue L9627}c[13898]=bI+1;a[bn]=1;bv=bv;bw=bw;bx=bx;by=1;bz=bz;continue L9627}}while(0);if(am){break}L9785:do{if((aO|0)>0){bH=c[10036]|0;bU=0;bK=0;bL=aQ;while(1){if((a[bU+175968|0]|0)==(a[bH+(bU+bL|0)|0]|0)){cb=bL;cc=bK}else{if((bU|0)!=8){break L9785}cb=bL-1|0;cc=1}b0=bU+1|0;if((b0|0)<(cc+aO|0)){bU=b0;bK=cc;bL=cb}else{break}}if((cc|0)==0){if(!((bU|0)==10|(bU|0)==7)){break}}c[13898]=bB+1;a[bl]=1;bv=bv;bw=bw;bx=bx;by=by;bz=bz;continue L9627}}while(0);if(!((aO|0)>0&(am^1))){break}bL=c[10036]|0;bK=0;bH=0;bI=aQ;while(1){if((a[bK+171984|0]|0)==(a[bL+(bK+bI|0)|0]|0)){cd=bI;ce=bH}else{if((bK|0)!=5){break}cd=bI-1|0;ce=1}bD=bK+1|0;if((bD|0)<(ce+aO|0)){bK=bD;bH=ce;bI=cd}else{au=7204;break}}do{if((au|0)==7204){au=0;if((ce|0)==0){if(!((bK|0)==10|(bK|0)==4)){break}}c[13898]=bB+1;a[bk]=1;bv=bv;bw=bw;bx=bx;by=by;bz=bz;continue L9627}}while(0);if(!((aO|0)>0&(am^1))){break}bK=c[10036]|0;bI=0;bH=0;bL=aQ;while(1){if((a[bI+168e3|0]|0)==(a[bK+(bI+bL|0)|0]|0)){cf=bL;cg=bH}else{if((bI|0)!=5){break L9639}cf=bL-1|0;cg=1}bD=bI+1|0;if((bD|0)<(cg+aO|0)){bI=bD;bH=cg;bL=cf}else{break}}if((cg|0)==0){if(!((bI|0)==4|(bI|0)==9)){break}}c[13898]=bB+1;a[bj]=1;bv=bv;bw=bw;bx=bx;by=by;bz=bz;continue L9627}}while(0);aO=c[ah>>2]|0;do{if((aO|0)==368){aQ=c[aT>>2]|0;if((aQ|0)==0){uE(r|0,0,28);am=ut(192)|0;if((am|0)==0){gk();bC=ut(192)|0;if((bC|0)==0){au=7220;break L9498}else{ch=bC}}else{ch=am}c[ch>>2]=0;c[ch+4>>2]=-1;c[ch+72>>2]=0;c[ch+88>>2]=0;uE(ch+8|0,0,60);c[ch+96>>2]=1;c[ch+144>>2]=4;c[ch+148>>2]=4;c[ch+152>>2]=4;am=ch+156|0;c[am>>2]=c[r>>2];c[am+4>>2]=c[r+4>>2];c[am+8>>2]=c[r+8>>2];c[am+12>>2]=c[r+12>>2];c[am+16>>2]=c[r+16>>2];c[am+20>>2]=c[r+20>>2];c[am+24>>2]=c[r+24>>2];a[ch+184|0]=0;c[aT>>2]=ch;c[ch+48>>2]=1;c[(c[aT>>2]|0)+56>>2]=99;ci=c[aT>>2]|0}else{ci=aQ}jw(ci);aQ=c[13898]|0;if((bB|0)==(aQ|0)){cj=1;ck=c[ah>>2]|0;break}else{if(bv){bQ=aQ;au=8112;break L9498}else{bv=1;bw=1;bx=bx;by=by;bz=bz;continue L9627}}}else{cj=bw;ck=aO}}while(0);if((ck|0)==225){do{if(!cj){c[aU>>2]=-1;c[a7>>2]=0;c[aS>>2]=c[12872];c[aS+4>>2]=c[12873];c[aS+8>>2]=c[12874];c[aS+12>>2]=c[12875];c[aS+16>>2]=c[12876];c[aS+20>>2]=c[12877];c[aS+24>>2]=c[12878];c[aS+28>>2]=c[12879];c[aS+32>>2]=c[12880];c[aS+36>>2]=c[12881];c[aS+40>>2]=c[12882];c[aS+44>>2]=c[12883];c[aS+48>>2]=c[12884];c[aS+52>>2]=c[12885];c[a8>>2]=1;h[a9>>3]=0.0;c[ba>>2]=0;h[bb>>3]=15.0;h[bc>>3]=90.0;c[bd>>2]=0;aO=c[8798]|0;aQ=(aO|0)>0;am=ax;L9839:while(1){bC=43264;while(1){cl=c[bC>>2]|0;if((cl|0)==0){break}if((c[cl+4>>2]|0)==(am|0)){break L9839}else{bC=cl|0}}cm=am-1|0;if(!((am|0)>(aO|0)&aQ)){au=7237;break}am=((cm|0)%(aO|0)&-1)+1|0}if((au|0)==7237){au=0;c[aj>>2]=cm;c[bf>>2]=1;c[bg>>2]=cm;c[bh>>2]=cm;break}aO=cl+8|0;c[aS>>2]=c[aO>>2];c[aS+4>>2]=c[aO+4>>2];c[aS+8>>2]=c[aO+8>>2];c[aS+12>>2]=c[aO+12>>2];c[aS+16>>2]=c[aO+16>>2];c[aS+20>>2]=c[aO+20>>2];c[aS+24>>2]=c[aO+24>>2];c[aS+28>>2]=c[aO+28>>2];c[aS+32>>2]=c[aO+32>>2];c[aS+36>>2]=c[aO+36>>2];c[aS+40>>2]=c[aO+40>>2];c[aS+44>>2]=c[aO+44>>2];c[aS+48>>2]=c[aO+48>>2];c[aS+52>>2]=c[aO+52>>2];c[be>>2]=0;if((c[(c[3524]|0)+96>>2]&1024|0)!=0){c[aj>>2]=am;a[bi]=0;break}if((a[bi]&1)!=0){break}c[bf>>2]=1;c[bg>>2]=c[aj>>2]}}while(0);hL(aR,1);aO=c[13898]|0;if((bB|0)==(aO|0)){break}if(bx){bQ=aO;au=8113;break L9498}c[aP>>2]=c[aS>>2];c[aP+4>>2]=c[aS+4>>2];c[aP+8>>2]=c[aS+8>>2];c[aP+12>>2]=c[aS+12>>2];c[aP+16>>2]=c[aS+16>>2];c[aP+20>>2]=c[aS+20>>2];c[aP+24>>2]=c[aS+24>>2];c[aP+28>>2]=c[aS+28>>2];c[aP+32>>2]=c[aS+32>>2];c[aP+36>>2]=c[aS+36>>2];c[aP+40>>2]=c[aS+40>>2];c[aP+44>>2]=c[aS+44>>2];c[aP+48>>2]=c[aS+48>>2];c[aP+52>>2]=c[aS+52>>2];bv=bv;bw=1;bx=1;by=by;bz=bz;continue}uE(s|0,0,56);h[u>>3]=1.0;h[w>>3]=-2.0;c[t>>2]=X;c[x>>2]=W;do{if((a[30080]&1)==0){aO=c[8798]|0;aQ=(aO|0)>0;bI=ax;L9880:while(1){bC=43264;while(1){cn=c[bC>>2]|0;if((cn|0)==0){break}if((c[cn+4>>2]|0)==(bI|0)){break L9880}else{bC=cn|0}}co=bI-1|0;if(!((bI|0)>(aO|0)&aQ)){au=7267;break}bI=((co|0)%(aO|0)&-1)+1|0}if((au|0)==7267){au=0;c[t>>2]=co;c[z>>2]=1;c[A>>2]=co;c[x>>2]=co;break}aO=cn+8|0;c[s>>2]=c[aO>>2];c[s+4>>2]=c[aO+4>>2];c[s+8>>2]=c[aO+8>>2];c[s+12>>2]=c[aO+12>>2];c[s+16>>2]=c[aO+16>>2];c[s+20>>2]=c[aO+20>>2];c[s+24>>2]=c[aO+24>>2];c[s+28>>2]=c[aO+28>>2];c[s+32>>2]=c[aO+32>>2];c[s+36>>2]=c[aO+36>>2];c[s+40>>2]=c[aO+40>>2];c[s+44>>2]=c[aO+44>>2];c[s+48>>2]=c[aO+48>>2];c[s+52>>2]=c[aO+52>>2];c[y>>2]=0;if((c[(c[3524]|0)+96>>2]&1024|0)!=0){c[t>>2]=bI;a[B]=0;break}if((a[B]&1)!=0){break}c[z>>2]=1;c[A>>2]=c[t>>2]}else{aO=43280;while(1){cp=c[aO>>2]|0;if((cp|0)==0){break}if((c[cp+4>>2]|0)==(ax|0)){au=7244;break}else{aO=cp|0}}if((au|0)==7244){au=0;aO=cp+8|0;c[s>>2]=c[aO>>2];c[s+4>>2]=c[aO+4>>2];c[s+8>>2]=c[aO+8>>2];c[s+12>>2]=c[aO+12>>2];c[s+16>>2]=c[aO+16>>2];c[s+20>>2]=c[aO+20>>2];c[s+24>>2]=c[aO+24>>2];c[s+28>>2]=c[aO+28>>2];c[s+32>>2]=c[aO+32>>2];c[s+36>>2]=c[aO+36>>2];c[s+40>>2]=c[aO+40>>2];c[s+44>>2]=c[aO+44>>2];c[s+48>>2]=c[aO+48>>2];c[s+52>>2]=c[aO+52>>2];c[y>>2]=0;if((a[B]&1)!=0){break}c[z>>2]=1;c[A>>2]=c[t>>2];break}aO=c[8798]|0;bI=(aO|0)>0;aQ=ax;L9865:while(1){am=43264;while(1){cq=c[am>>2]|0;if((cq|0)==0){break}if((c[cq+4>>2]|0)==(aQ|0)){break L9865}else{am=cq|0}}cr=aQ-1|0;if(!((aQ|0)>(aO|0)&bI)){au=7256;break}aQ=((cr|0)%(aO|0)&-1)+1|0}if((au|0)==7256){au=0;c[t>>2]=cr;c[z>>2]=1;c[A>>2]=cr;c[x>>2]=cr;break}aO=cq+8|0;c[s>>2]=c[aO>>2];c[s+4>>2]=c[aO+4>>2];c[s+8>>2]=c[aO+8>>2];c[s+12>>2]=c[aO+12>>2];c[s+16>>2]=c[aO+16>>2];c[s+20>>2]=c[aO+20>>2];c[s+24>>2]=c[aO+24>>2];c[s+28>>2]=c[aO+28>>2];c[s+32>>2]=c[aO+32>>2];c[s+36>>2]=c[aO+36>>2];c[s+40>>2]=c[aO+40>>2];c[s+44>>2]=c[aO+44>>2];c[s+48>>2]=c[aO+48>>2];c[s+52>>2]=c[aO+52>>2];c[y>>2]=0;if((c[(c[3524]|0)+96>>2]&1024|0)!=0){c[t>>2]=aQ;a[B]=0;break}if((a[B]&1)!=0){break}c[z>>2]=1;c[A>>2]=c[t>>2]}}while(0);aO=hH(k,1,(c[ah>>2]&2|0)!=0)|0;bI=c[13898]|0;if((bB|0)==(bI|0)){break}if(bx){bQ=bI;au=8114;break L9498}c[aP>>2]=c[s>>2];c[aP+4>>2]=c[s+4>>2];c[aP+8>>2]=c[s+8>>2];c[aP+12>>2]=c[s+12>>2];c[aP+16>>2]=c[s+16>>2];c[aP+20>>2]=c[s+20>>2];c[aP+24>>2]=c[s+24>>2];c[aP+28>>2]=c[s+28>>2];c[aP+32>>2]=c[s+32>>2];c[aP+36>>2]=c[s+36>>2];c[aP+40>>2]=c[s+40>>2];c[aP+44>>2]=c[s+44>>2];c[aP+48>>2]=c[s+48>>2];c[aP+52>>2]=c[s+52>>2];if((aO|0)==0){bv=bv;bw=1;bx=1;by=by;bz=bz;continue}c[ak>>2]=aO-1;bv=bv;bw=1;bx=1;by=by;bz=bz}by=a$+21|0;a[by]=0;do{if(bz){cs=U;ct=O}else{a[bs]=1;if((c[9056]|0)!=1){if(!bq){a[U]=0}if(br){cs=U;ct=0;break}a[O]=0;cs=U;ct=O;break}bw=c[1054]|0;bv=(c[bw+(aW*40&-1)+36>>2]|0)+(c[bw+(aW*40&-1)+32>>2]|0)|0;bg=db(c[a4>>2]|0,(bv+1|0)-(c[bw+(aK*40&-1)+32>>2]|0)|0,116456)|0;c[a4>>2]=bg;bw=c[(c[1054]|0)+(aK*40&-1)+32>>2]|0;L9908:do{if((bw|0)<(bv|0)){bf=bw;bi=bg;while(1){be=a[(c[10036]|0)+bf|0]|0;if(be<<24>>24==0){cu=bi;break L9908}bh=bi+1|0;a[bi]=be;be=bf+1|0;if((be|0)<(bv|0)){bf=be;bi=bh}else{cu=bh;break}}}else{cu=bg}}while(0);a[cu]=0;if((a_|0)==2){cv=c[a4>>2]|0;cw=O}else if((a_|0)==1){cv=U;cw=c[a4>>2]|0}else{cv=U;cw=O}a[by]=1;cs=cv;ct=cw}}while(0);do{if(!bx){by=c[ah>>2]|0;if((by|0)==225){c[aj>>2]=X;hL(aR,1);c[aP>>2]=c[aS>>2];c[aP+4>>2]=c[aS+4>>2];c[aP+8>>2]=c[aS+8>>2];c[aP+12>>2]=c[aS+12>>2];c[aP+16>>2]=c[aS+16>>2];c[aP+20>>2]=c[aS+20>>2];c[aP+24>>2]=c[aS+24>>2];c[aP+28>>2]=c[aS+28>>2];c[aP+32>>2]=c[aS+32>>2];c[aP+36>>2]=c[aS+36>>2];c[aP+40>>2]=c[aS+40>>2];c[aP+44>>2]=c[aS+44>>2];c[aP+48>>2]=c[aS+48>>2];c[aP+52>>2]=c[aS+52>>2];break}c[al>>2]=X;h[a$+40>>3]=1.0;c[ai>>2]=W;h[a$+48>>3]=+h[3817];a[ag]=0;do{if((a[30080]&1)==0){br=aw|0;bq=c[br>>2]|0;bs=c[8798]|0;bz=(bs|0)>0;bg=ax;L9926:while(1){bv=43264;while(1){cx=c[bv>>2]|0;if((cx|0)==0){break}if((c[cx+4>>2]|0)==(bg|0)){break L9926}else{bv=cx|0}}cy=bg-1|0;if(!((bg|0)>(bs|0)&bz)){au=7301;break}bg=((cy|0)%(bs|0)&-1)+1|0}if((au|0)==7301){au=0;c[al>>2]=cy;c[a$+64>>2]=1;c[a$+68>>2]=cy;c[ai>>2]=cy;cz=by;break}bs=cx+8|0;c[aP>>2]=c[bs>>2];c[aP+4>>2]=c[bs+4>>2];c[aP+8>>2]=c[bs+8>>2];c[aP+12>>2]=c[bs+12>>2];c[aP+16>>2]=c[bs+16>>2];c[aP+20>>2]=c[bs+20>>2];c[aP+24>>2]=c[bs+24>>2];c[aP+28>>2]=c[bs+28>>2];c[aP+32>>2]=c[bs+32>>2];c[aP+36>>2]=c[bs+36>>2];c[aP+40>>2]=c[bs+40>>2];c[aP+44>>2]=c[bs+44>>2];c[aP+48>>2]=c[bs+48>>2];c[aP+52>>2]=c[bs+52>>2];c[br>>2]=bq;if((c[(c[3524]|0)+96>>2]&1024|0)!=0){c[al>>2]=bg;a[ag]=0;cz=by;break}if((a[ag]&1)!=0){cz=by;break}c[a$+64>>2]=1;c[a$+68>>2]=c[al>>2];cz=by}else{lK(aw,ax);cz=c[ah>>2]|0}}while(0);by=hH(aw,1,(cz&2|0)!=0)|0;if((by|0)==0){c[ak>>2]=X;break}else{c[ak>>2]=by-1;break}}}while(0);ak=c[ah>>2]|0;ax=(ak&2|0)==0;if(!ax){c[aw>>2]=1}do{if(!((c[bm>>2]|0)!=2|ax)){al=a$+48|0;if(+h[al>>3]!=-3.0){break}h[al>>3]=1.0}}while(0);if((ak|0)==1){a[bl]=0}do{if(bu){if((ak|0)==352|(ak|0)==400|(ak|0)==416|(ak|0)==432){cA=X;cB=W;break}aw=c[11690]|0;if(ax){cC=W;cD=a[38984]|0}else{al=a[38984]|0;cC=(((aw|0)!=0?2:1)+W|0)+(al&1)|0;cD=al}cA=(((aw|0)!=0?2:1)+X|0)+(cD&1)|0;cB=cC}else{cA=X;cB=W}}while(0);do{if((ak|0)==400){a[ag]=1}else if((ak|0)==416|(ak|0)==432){ax=c[16678]|0;if((ax&1|0)!=0){h[8341]=0.0}if((ax&2|0)==0){break}h[8342]=255.0}}while(0);if((a$|0)!=(c[ad>>2]|0)){au=7325;break L9498}if((c[bm>>2]|0)==3){cE=c[a$+4>>2]|0;ak=a0;ag=a$;while(1){if((ag|0)==0){au=7329;break L9498}cF=ag+4|0;c[cF>>2]=cE;ax=c[11870]|0;do{if((c[8732]|0)==0){if((ax|0)==2){au=7332;break L9498}else if((ax|0)!=1){break}c[12210]=0}else{if((ax|0)==1){au=7335;break L9498}}}while(0);ax=ag+252|0;c[ax>>2]=0;bu=ag+244|0;c[bu>>2]=1;bl=ag+239|0;a[bl]=0;aw=ag+260|0;al=c[aw>>2]|0;if((al|0)!=0){ai=al;while(1){al=c[ai>>2]|0;aS=c[ai+12>>2]|0;if((aS|0)!=0){uu(aS)}uu(ai);if((al|0)==0){break}else{ai=al}}c[aw>>2]=0}if((a[47584]&1)!=0){c[bu>>2]=1}ai=hu(c[6352]|0)|0;al=ag+12|0;aS=c[al>>2]|0;if((aS|0)==368){c[272]=1;aR=c[273]|0;do{if((aR|0)!=0){if((c[aR>>2]|0)!=2){break}aj=aR+40|0;if((c[aj>>2]|0)!=42){break}c[aj>>2]=43}}while(0);cG=c[al>>2]|0}else{cG=aS}if((cG|0)==225){aR=hu(c[6352]|0)|0;c[ai>>2]=aR;c[aR+8>>2]=0}aR=c[8270]|0;do{if((aR|0)!=0){if((aY(aR|0,139696)|0)==0){break}bA(4,aR|0)}}while(0);a[47040]=1;aR=ag+64|0;aS=ag+48|0;aj=ag+23|0;bx=ag+28|0;by=ag+56|0;bs=ag+224|0;bz=ag;bv=0;bw=0;bB=0;cH=8.988465674311579e+307;bi=0;bf=0;aQ=ai;L10008:while(1){cI=eC(F,7)|0;if((cI|0)==(-9|0)){bv=bv;bw=bw;bB=bB;cH=cH;bi=bi;bf=bf;aQ=aQ;continue}else if((cI|0)==0){bh=c[11932]|0;uh(-1,116952,(v=i,i=i+16|0,c[v>>2]=c[11900],c[v+8>>2]=(bh|0)!=0?bh:179864,v)|0)}else if((cI|0)==(-3|0)){bh=c[al>>2]|0;if((bh|0)==400|(bh|0)==416|(bh|0)==432|(bh|0)==225){bv=bv;bw=bw;bB=bB;cH=cH;bi=bi;bf=bf;aQ=aQ;continue}if((bf|0)==0){if((bv|0)==0){bv=0;bw=bw;bB=bB;cH=cH;bi=bi;bf=0;aQ=aQ;continue}else{cJ=bv}}else{cJ=bf}if((bv|0)<=0){bv=bv;bw=bw;bB=bB;cH=cH;bi=bi;bf=cJ;aQ=aQ;continue}c[aQ+8>>2]=bv;c[aQ>>2]=c[aw>>2];c[aw>>2]=aQ;c[ax>>2]=(c[ax>>2]|0)+1;if((bv|0)!=(cJ|0)){c[bu>>2]=0}bv=0;bw=bw+1|0;bB=bB;cH=cH;bi=bi;bf=cJ;aQ=hu(cJ)|0;continue}else if((cI|0)==(-6|0)){eL(bz);bv=bv;bw=bw;bB=bB;cH=cH;bi=bi;bf=bf;aQ=aQ;continue}else if((cI|0)==(-7|0)){aI(115120,50,1,c[m>>2]|0);bv=bv;bw=bw;bB=bB;cH=cH;bi=bi;bf=bf;aQ=aQ;continue}else if((cI|0)==(-1|0)|(cI|0)==(-4|0)){break}do{if((bv|0)<(c[aQ+4>>2]|0)){au=7370}else{bh=(bv<<1)+1e3|0;hv(aQ,bh);if((c[al>>2]|0)==225){be=aQ|0;hv(c[be>>2]|0,bh);c[(c[be>>2]|0)+8>>2]=0;au=7370;break}else{be=c[aQ+12>>2]|0;cK=bi;cL=be;cM=be+(bv<<6)|0;break}}}while(0);do{if((au|0)==7370){au=0;bg=c[aQ+12>>2]|0;bq=bg+(bv<<6)|0;if((c[al>>2]|0)!=225){cK=bi;cL=bg;cM=bq;break}if((cI|0)<6){c[bq>>2]=2;bv=bv;bw=bw;bB=bB;cH=cH;bi=bi;bf=bf;aQ=aQ;continue L10008}else{cK=(c[(c[aQ>>2]|0)+12>>2]|0)+(bv<<6)|0;cL=bg;cM=bq;break}}}while(0);bq=cM|0;L10036:do{if((cI|0)==(-2|0)|(cI|0)==(-5|0)){c[bq>>2]=2;cN=bB;cO=cH}else{c[bq>>2]=0;bg=c[8732]|0;do{if((bg|0)==0){if((cI|0)==1){cP=3;cQ=bB;cR=cH;cS=+h[F>>3];cT=+(bw|0);cU=+(bv|0);break}else if((cI|0)==2){if((c[al>>2]|0)!=352){au=7380;break L9498}cP=3;cQ=1;cR=+h[G>>3];cS=+h[F>>3];cT=+(bw|0);cU=+(bv|0);break}else{if((cI|0)<=2){cP=cI;cQ=bB;cR=cH;cS=0.0;cT=0.0;cU=0.0;break}cP=cI;cQ=bB;cR=cH;cS=+h[H>>3];cT=+h[G>>3];cU=+h[F>>3];break}}else if((bg|0)==1){if((cI|0)<2){au=7385;break L9498}if((cI|0)<3){h[H>>3]=1.0;cV=3;cW=1.0}else{cV=cI;cW=+h[H>>3]}cX=+h[9040];cY=cX*+h[F>>3];h[F>>3]=cY;cZ=cX*+h[G>>3];h[G>>3]=cZ;cX=cW*+S(+cY);c_=+S(+cZ);c$=c_*cW*+T(+cY);cP=cV;cQ=bB;cR=cH;cS=cW*+T(+cZ);cT=c$;cU=cX*c_}else if((bg|0)==2){if((cI|0)<2){au=7391;break L9498}if((cI|0)<3){h[H>>3]=1.0;c0=3;c1=1.0}else{c0=cI;c1=+h[H>>3]}c_=+h[9040]*+h[F>>3];h[F>>3]=c_;cX=c1*+S(+c_);c$=c1*+T(+c_);cP=c0;cQ=bB;cR=cH;cS=+h[G>>3];cT=c$;cU=cX}else{au=7396;break L9498}}while(0);if((cP|0)<(c[11870]|0)){au=7398;break L9498}bg=c[al>>2]|0;if((bg|0)==33){br=(c[aR>>2]|0)==6;c2=br?1:cQ;c3=br?cS:cR}else{c2=cQ;c3=cR}do{if((cP|0)>3){do{if((bg|0)==18|(bg|0)==51){if(+h[aS>>3]==-3.0){h[cL+(bv<<6)+48>>3]=+h[I>>3];c4=0;c5=cS;break}else{if((bg|0)==368){c4=0;c5=cS;break}else{au=7406;break}}}else if((bg|0)==368){c4=0;c5=cS}else{au=7406}}while(0);if((au|0)==7406){au=0;c4=1;c5=+h[I>>3]}if((cP|0)<=4){c6=c4;c7=c5;c8=0.0;c9=0.0;da=0.0;break}bJ=c[al>>2]|0;if((bJ|0)==18|(bJ|0)==51){if(+h[aS>>3]!=-3.0){c6=c4;c7=c5;c8=0.0;c9=0.0;da=0.0;break}cX=+h[J>>3];de=1;df=cX;dg=cX}else{de=c4;df=c5;dg=+h[J>>3]}bE=(bJ|0)==368;if(!((cP|0)>5&(bJ|0)==225)){c6=bE?1:de;c7=bE?dg:df;c8=0.0;c9=0.0;da=0.0;break}bE=(cP|0)>6;c6=bE&1;c7=bE?+h[L>>3]:cS;c8=cS+ +h[K>>3];c9=cT+dg;da=cU+ +h[I>>3]}else{c6=c2;c7=c3;c8=0.0;c9=0.0;da=0.0}}while(0);c[bq>>2]=0;bg=c[200]|0;L10082:do{if((bg|0)!=99){if(!(cU>-8.988465674311579e+307&cU<8.988465674311579e+307)){c[bq>>2]=2;cN=c6;cO=c7;break L10036}do{if((a[64788+(bg*688&-1)|0]&1)==0){h[cL+(bv<<6)+8>>3]=cU}else{if(cU<0.0){c[bq>>2]=2;cN=c6;cO=c7;break L10036}if(cU==0.0){h[cL+(bv<<6)+8>>3]=-8.988465674311579e+307;c[bq>>2]=1;break L10082}else{cX=+_(+cU);h[cL+(bv<<6)+8>>3]=cX/+h[64800+(bg*688&-1)>>3];break}}}while(0);if((a[aj]&1)!=0){break}if((c[bq>>2]|0)!=0|(bg|0)<0){break}bE=64712+(bg*688&-1)|0;if(cU<+h[bE>>3]){h[bE>>3]=cU}bE=64664+(bg*688&-1)|0;do{if(cU<+h[bE>>3]){if((c[64648+(bg*688&-1)>>2]&1|0)==0){c[bq>>2]=1;break L10082}if((c[64728+(bg*688&-1)>>2]&1|0)==0){h[bE>>3]=cU;break}cX=+h[64736+(bg*688&-1)>>3];if(cX>cU){h[bE>>3]=cX;c[bq>>2]=1;break L10082}else{h[bE>>3]=cU;break}}}while(0);bE=64720+(bg*688&-1)|0;if(cU>+h[bE>>3]){h[bE>>3]=cU}bE=64672+(bg*688&-1)|0;if(cU<=+h[bE>>3]){break}if((c[64648+(bg*688&-1)>>2]&2|0)==0){c[bq>>2]=1;break}if((c[64732+(bg*688&-1)>>2]&2|0)==0){h[bE>>3]=cU;break}cX=+h[64760+(bg*688&-1)>>3];if(cX>3]=cX;c[bq>>2]=1;break}else{h[bE>>3]=cU;break}}}while(0);bg=c[144]|0;L10128:do{if((bg|0)!=99){if(!(cT>-8.988465674311579e+307&cT<8.988465674311579e+307)){c[bq>>2]=2;cN=c6;cO=c7;break L10036}do{if((a[64788+(bg*688&-1)|0]&1)==0){h[cL+(bv<<6)+16>>3]=cT}else{if(cT<0.0){c[bq>>2]=2;cN=c6;cO=c7;break L10036}if(cT==0.0){h[cL+(bv<<6)+16>>3]=-8.988465674311579e+307;c[bq>>2]=1;break L10128}else{cX=+_(+cT);h[cL+(bv<<6)+16>>3]=cX/+h[64800+(bg*688&-1)>>3];break}}}while(0);if((a[aj]&1)!=0){break}if((c[bq>>2]|0)!=0|(bg|0)<0){break}bE=64712+(bg*688&-1)|0;if(cT<+h[bE>>3]){h[bE>>3]=cT}bE=64664+(bg*688&-1)|0;do{if(cT<+h[bE>>3]){if((c[64648+(bg*688&-1)>>2]&1|0)==0){c[bq>>2]=1;break L10128}if((c[64728+(bg*688&-1)>>2]&1|0)==0){h[bE>>3]=cT;break}cX=+h[64736+(bg*688&-1)>>3];if(cX>cT){h[bE>>3]=cX;c[bq>>2]=1;break L10128}else{h[bE>>3]=cT;break}}}while(0);bE=64720+(bg*688&-1)|0;if(cT>+h[bE>>3]){h[bE>>3]=cT}bE=64672+(bg*688&-1)|0;if(cT<=+h[bE>>3]){break}if((c[64648+(bg*688&-1)>>2]&2|0)==0){c[bq>>2]=1;break}if((c[64732+(bg*688&-1)>>2]&2|0)==0){h[bE>>3]=cT;break}cX=+h[64760+(bg*688&-1)>>3];if(cX>3]=cX;c[bq>>2]=1;break}else{h[bE>>3]=cT;break}}}while(0);L10174:do{if((c[al>>2]|0)==225){c[cK>>2]=0;bg=c[200]|0;L10176:do{if((bg|0)!=99){if(!(da>-8.988465674311579e+307&da<8.988465674311579e+307)){c[bq>>2]=2;cN=c6;cO=c7;break L10036}do{if((a[64788+(bg*688&-1)|0]&1)==0){h[cK+8>>3]=da}else{if(da<0.0){c[bq>>2]=2;cN=c6;cO=c7;break L10036}if(da==0.0){h[cK+8>>3]=-8.988465674311579e+307;c[bq>>2]=1;break L10176}else{cX=+_(+da);h[cK+8>>3]=cX/+h[64800+(bg*688&-1)>>3];break}}}while(0);if((a[aj]&1)!=0){break}if((c[bq>>2]|0)!=0|(bg|0)<0){break}bE=64712+(bg*688&-1)|0;if(da<+h[bE>>3]){h[bE>>3]=da}bE=64664+(bg*688&-1)|0;do{if(da<+h[bE>>3]){if((c[64648+(bg*688&-1)>>2]&1|0)==0){c[bq>>2]=1;break L10176}if((c[64728+(bg*688&-1)>>2]&1|0)==0){h[bE>>3]=da;break}cX=+h[64736+(bg*688&-1)>>3];if(cX>da){h[bE>>3]=cX;c[bq>>2]=1;break L10176}else{h[bE>>3]=da;break}}}while(0);bE=64720+(bg*688&-1)|0;if(da>+h[bE>>3]){h[bE>>3]=da}bE=64672+(bg*688&-1)|0;if(da<=+h[bE>>3]){break}if((c[64648+(bg*688&-1)>>2]&2|0)==0){c[bq>>2]=1;break}if((c[64732+(bg*688&-1)>>2]&2|0)==0){h[bE>>3]=da;break}cX=+h[64760+(bg*688&-1)>>3];if(cX>3]=cX;c[bq>>2]=1;break}else{h[bE>>3]=da;break}}}while(0);bg=c[144]|0;if((bg|0)==99){break}if(!(c9>-8.988465674311579e+307&c9<8.988465674311579e+307)){c[bq>>2]=2;cN=c6;cO=c7;break L10036}do{if((a[64788+(bg*688&-1)|0]&1)==0){h[cK+16>>3]=c9}else{if(c9<0.0){c[bq>>2]=2;cN=c6;cO=c7;break L10036}if(c9==0.0){h[cK+16>>3]=-8.988465674311579e+307;c[bq>>2]=1;break L10174}else{cX=+_(+c9);h[cK+16>>3]=cX/+h[64800+(bg*688&-1)>>3];break}}}while(0);if((a[aj]&1)!=0){break}if((c[bq>>2]|0)!=0|(bg|0)<0){break}bE=64712+(bg*688&-1)|0;if(c9<+h[bE>>3]){h[bE>>3]=c9}bE=64664+(bg*688&-1)|0;do{if(c9<+h[bE>>3]){if((c[64648+(bg*688&-1)>>2]&1|0)==0){c[bq>>2]=1;break L10174}if((c[64728+(bg*688&-1)>>2]&1|0)==0){h[bE>>3]=c9;break}cX=+h[64736+(bg*688&-1)>>3];if(cX>c9){h[bE>>3]=cX;c[bq>>2]=1;break L10174}else{h[bE>>3]=c9;break}}}while(0);bE=64720+(bg*688&-1)|0;if(c9>+h[bE>>3]){h[bE>>3]=c9}bE=64672+(bg*688&-1)|0;if(c9<=+h[bE>>3]){break}if((c[64648+(bg*688&-1)>>2]&2|0)==0){c[bq>>2]=1;break}if((c[64732+(bg*688&-1)>>2]&2|0)==0){h[bE>>3]=c9;break}cX=+h[64760+(bg*688&-1)>>3];if(cX>3]=cX;c[bq>>2]=1;break}else{h[bE>>3]=c9;break}}}while(0);L10267:do{if((a[47032]&1)==0){if((c[al>>2]|0)==400){h[cL+(bv<<6)+32>>3]=cS}bE=c[34]|0;L10274:do{if((bE|0)!=99){if(!(cS>-8.988465674311579e+307&cS<8.988465674311579e+307)){c[bq>>2]=2;cN=c6;cO=c7;break L10036}do{if((a[64788+(bE*688&-1)|0]&1)==0){h[cL+(bv<<6)+24>>3]=cS}else{if(cS<0.0){c[bq>>2]=2;cN=c6;cO=c7;break L10036}if(cS==0.0){h[cL+(bv<<6)+24>>3]=-8.988465674311579e+307;c[bq>>2]=1;break L10274}else{cX=+_(+cS);h[cL+(bv<<6)+24>>3]=cX/+h[64800+(bE*688&-1)>>3];break}}}while(0);if((a[aj]&1)!=0){break}if((c[bq>>2]|0)!=0|(bE|0)<0){break}bJ=64712+(bE*688&-1)|0;if(cS<+h[bJ>>3]){h[bJ>>3]=cS}bJ=64664+(bE*688&-1)|0;do{if(cS<+h[bJ>>3]){if((c[64648+(bE*688&-1)>>2]&1|0)==0){c[bq>>2]=1;break L10274}if((c[64728+(bE*688&-1)>>2]&1|0)==0){h[bJ>>3]=cS;break}cX=+h[64736+(bE*688&-1)>>3];if(cX>cS){h[bJ>>3]=cX;c[bq>>2]=1;break L10274}else{h[bJ>>3]=cS;break}}}while(0);bJ=64720+(bE*688&-1)|0;if(cS>+h[bJ>>3]){h[bJ>>3]=cS}bJ=64672+(bE*688&-1)|0;if(cS<=+h[bJ>>3]){break}if((c[64648+(bE*688&-1)>>2]&2|0)==0){c[bq>>2]=1;break}if((c[64732+(bE*688&-1)>>2]&2|0)==0){h[bJ>>3]=cS;break}cX=+h[64760+(bE*688&-1)>>3];if(cX>3]=cX;c[bq>>2]=1;break}else{h[bJ>>3]=cS;break}}}while(0);bE=c[34]|0;L10320:do{if(!((c[al>>2]|0)!=225|(bE|0)==99)){if(!(c8>-8.988465674311579e+307&c8<8.988465674311579e+307)){c[bq>>2]=2;cN=c6;cO=c7;break L10036}do{if((a[64788+(bE*688&-1)|0]&1)==0){h[cK+24>>3]=c8}else{if(c8<0.0){c[bq>>2]=2;cN=c6;cO=c7;break L10036}if(c8==0.0){h[cK+24>>3]=-8.988465674311579e+307;c[bq>>2]=1;break L10320}else{cX=+_(+c8);h[cK+24>>3]=cX/+h[64800+(bE*688&-1)>>3];break}}}while(0);if((a[aj]&1)!=0){break}if((c[bq>>2]|0)!=0|(bE|0)<0){break}bg=64712+(bE*688&-1)|0;if(c8<+h[bg>>3]){h[bg>>3]=c8}bg=64664+(bE*688&-1)|0;do{if(c8<+h[bg>>3]){if((c[64648+(bE*688&-1)>>2]&1|0)==0){c[bq>>2]=1;break L10320}if((c[64728+(bE*688&-1)>>2]&1|0)==0){h[bg>>3]=c8;break}cX=+h[64736+(bE*688&-1)>>3];if(cX>c8){h[bg>>3]=cX;c[bq>>2]=1;break L10320}else{h[bg>>3]=c8;break}}}while(0);bg=64720+(bE*688&-1)|0;if(c8>+h[bg>>3]){h[bg>>3]=c8}bg=64672+(bE*688&-1)|0;if(c8<=+h[bg>>3]){break}if((c[64648+(bE*688&-1)>>2]&2|0)==0){c[bq>>2]=1;break}if((c[64732+(bE*688&-1)>>2]&2|0)==0){h[bg>>3]=c8;break}cX=+h[64760+(bE*688&-1)>>3];if(cX>3]=cX;c[bq>>2]=1;break}else{h[bg>>3]=c8;break}}}while(0);if((c[bx>>2]|0)==-6){h[cL+(bv<<6)+32>>3]=c7}if(!((c[al>>2]|0)==352|(c[7662]|0)==1)){if((a[by]&1)==0){au=7669;break}}bE=c[bq>>2]|0;if((c6|0)==0){if(!(cS>-8.988465674311579e+307&cS<8.988465674311579e+307)){cN=0;cO=c7;break L10036}do{if((a[66852]&1)==0){h[cL+(bv<<6)+32>>3]=cS}else{if(cS<0.0){cN=0;cO=c7;break L10036}if(cS==0.0){h[cL+(bv<<6)+32>>3]=-8.988465674311579e+307;au=7669;break L10267}else{cX=+_(+cS);h[cL+(bv<<6)+32>>3]=cX/+h[8358];break}}}while(0);if(!((a[aj]&1)==0&(bE|0)==0)){au=7669;break}if(cS<+h[8347]){h[8347]=cS}do{if(cS<+h[8341]){if((c[16678]&1|0)==0){au=7669;break L10267}if((c[16698]&1|0)==0){h[8341]=cS;break}cX=+h[8350];if(cX>cS){h[8341]=cX;au=7669;break L10267}else{h[8341]=cS;break}}}while(0);if(cS>+h[8348]){h[8348]=cS}if(cS<=+h[8342]){au=7669;break}if((c[16678]&2|0)==0){au=7669;break}if((c[16699]&2|0)==0){h[8342]=cS;au=7669;break}cX=+h[8353];if(cX-8.988465674311579e+307&c7<8.988465674311579e+307)){cN=c6;cO=c7;break L10036}do{if((a[66852]&1)==0){h[cL+(bv<<6)+32>>3]=c7}else{if(c7<0.0){cN=c6;cO=c7;break L10036}if(c7==0.0){h[cL+(bv<<6)+32>>3]=-8.988465674311579e+307;au=7669;break L10267}else{cX=+_(+c7);h[cL+(bv<<6)+32>>3]=cX/+h[8358];break}}}while(0);if(!((a[aj]&1)==0&(bE|0)==0)){au=7669;break}if(c7<+h[8347]){h[8347]=c7}do{if(c7<+h[8341]){if((c[16678]&1|0)==0){au=7669;break L10267}if((c[16698]&1|0)==0){h[8341]=c7;break}cX=+h[8350];if(cX>c7){h[8341]=cX;au=7669;break L10267}else{h[8341]=c7;break}}}while(0);if(c7>+h[8348]){h[8348]=c7}if(c7<=+h[8342]){au=7669;break}if((c[16678]&2|0)==0){au=7669;break}if((c[16699]&2|0)==0){h[8342]=c7;au=7669;break}cX=+h[8353];if(cX>3]=cS;bE=c[al>>2]|0;if((bE|0)!=225){dh=bE;break}h[cK+24>>3]=c8;au=7669}}while(0);if((au|0)==7669){au=0;dh=c[al>>2]|0}if((dh|0)==368){iW(c[bs>>2]|0,cM,bv,c[11767]|0,c7);di=c[al>>2]|0}else{di=dh}if(!((di|0)==416|(di|0)==432)){cN=c6;cO=c7;break}h[cL+(bv<<6)+40>>3]=+h[I>>3];h[cL+(bv<<6)+48>>3]=+h[J>>3];h[cL+(bv<<6)+56>>3]=+h[K>>3];h[cL+(bv<<6)+32>>3]=+h[L>>3];cN=c6;cO=c7}}while(0);bv=bv+1|0;bw=bw;bB=cN;cH=cO;bi=cK;bf=bf;aQ=aQ}bi=c[8270]|0;do{if((bi|0)!=0){if((aY(bi|0,139696)|0)==0){break}bA(4,139696)}}while(0);if((bB|0)!=0){a[bl]=1}do{if((bv|0)>0){c[ax>>2]=(c[ax>>2]|0)+1;c[aQ+8>>2]=bv;if((c[al>>2]|0)!=225){c[aQ>>2]=c[aw>>2]}c[aw>>2]=aQ;if((bv|0)==(bf|0)){break}c[bu>>2]=0}else{do{if((c[al>>2]|0)==225){bi=c[aQ>>2]|0;if((bi|0)==0){break}bw=c[bi+12>>2]|0;if((bw|0)!=0){uu(bw)}uu(bi)}}while(0);if((aQ|0)==0){break}bi=c[aQ+12>>2]|0;if((bi|0)!=0){uu(bi)}uu(aQ)}}while(0);do{if((a[47032]&1)!=0){if((c[ax>>2]|0)<=0){break}aQ=c[aw>>2]|0;al=c[aQ+12>>2]|0;cH=+h[al+8>>3];cX=+h[al+16>>3];al=(aQ|0)==0;if(al){dj=cH;dl=cH;dm=cX;dn=cX}else{c$=cH;c_=cH;cH=cX;cZ=cX;bf=aQ;while(1){bv=c[bf+8>>2]|0;if((bv|0)>0){cX=c$;cY=c_;dp=cH;dq=cZ;bB=c[bf+12>>2]|0;bi=0;while(1){do{if((c[bB>>2]|0)==2){dr=dq;ds=dp;dt=cY;du=cX}else{dv=+h[bB+8>>3];dw=cX>dv?dv:cX;dx=cY>3];dy=dp>dv?dv:dp;if(dq>=dv){dr=dq;ds=dy;dt=dx;du=dw;break}dr=dv;ds=dy;dt=dx;du=dw}}while(0);bw=bi+1|0;if((bw|0)<(bv|0)){cX=du;cY=dt;dp=ds;dq=dr;bB=bB+64|0;bi=bw}else{dz=du;dA=dt;dB=ds;dC=dr;break}}}else{dz=c$;dA=c_;dB=cH;dC=cZ}bi=c[bf>>2]|0;if((bi|0)==0){dj=dz;dl=dA;dm=dB;dn=dC;break}else{c$=dz;c_=dA;cH=dB;cZ=dC;bf=bi}}}cZ=(dl-dj)/+((c[11756]|0)-1|0);cH=(dn-dm)/+((c[11732]|0)-1|0);c[aw>>2]=0;c[ax>>2]=c[11756];c[bu>>2]=1;if((c[11752]|0)==2){if(al){dD=0}else{bf=0;bi=aQ;while(1){bB=(c[bi+8>>2]|0)+bf|0;bv=c[bi>>2]|0;if((bv|0)==0){dD=bB;break}else{bf=bB;bi=bv}}}bi=dD+3|0;bf=aa(bi<<3,dD+8|0);bv=ut(bf)|0;if((bv|0)==0){gk();bB=ut(bf)|0;if((bB|0)==0){au=7709;break L9498}else{dE=bB}}else{dE=bv}bv=dE;bB=bi<<2;bi=ut(bB)|0;if((bi|0)==0){gk();bf=ut(bB)|0;if((bf|0)==0){au=7712;break L9498}else{dF=bf}}else{dF=bi}bi=dF;bf=dD<<1;bB=bf+dD|0;bw=bv+(bB<<3)|0;if(al){dG=0;dH=3;au=7715}else{bs=0;by=aQ;while(1){bx=by+8|0;aS=c[bx>>2]|0;if((aS|0)>0){aR=bs;bz=0;ai=c[by+12>>2]|0;bq=aS;while(1){if((c[ai>>2]|0)==2){dI=aR;dJ=bq}else{h[bv+(aR<<3)>>3]=+h[ai+8>>3];h[bv+(aR+dD<<3)>>3]=+h[ai+16>>3];h[bv+(aR+bf<<3)>>3]=+h[ai+24>>3];dI=aR+1|0;dJ=c[bx>>2]|0}aS=bz+1|0;if((aS|0)<(dJ|0)){aR=dI;bz=aS;ai=ai+64|0;bq=dJ}else{dK=dI;break}}}else{dK=bs}bq=c[by>>2]|0;if((bq|0)==0){break}else{bs=dK;by=bq}}by=dK+3|0;if((by|0)>0){dG=dK;dH=by;au=7715}else{dL=dK;dM=by}}if((au|0)==7715){au=0;by=0;while(1){bs=by+1|0;c[bi+(by<<2)>>2]=bv+(aa(bs,dH)+bB<<3);if((bs|0)<(dH|0)){by=bs}else{dL=dG;dM=dH;break}}}if((dL|0)>0){by=0;while(1){bs=by+1|0;bq=(bs|0)<(dL|0);if(bq){ai=bv+(by<<3)|0;bz=bv+(by+dD<<3)|0;aR=bi+(by<<2)|0;bx=bs;while(1){c_=+h[ai>>3]- +h[bv+(bx<<3)>>3];c$=+h[bz>>3]- +h[bv+(bx+dD<<3)>>3];dq=+Q(+(c_*c_+c$*c$));if(dq>0.0){dN=dq*dq*+_(+dq)}else{dN=0.0}dq=-0.0-dN;h[(c[bi+(bx<<2)>>2]|0)+(by<<3)>>3]=dq;h[(c[aR>>2]|0)+(bx<<3)>>3]=dq;aS=bx+1|0;if((aS|0)<(dL|0)){bx=aS}else{dO=aR;break}}}else{dO=bi+(by<<2)|0}h[(c[dO>>2]|0)+(by<<3)>>3]=0.0;h[bv+(by+bB<<3)>>3]=+h[bv+(by+bf<<3)>>3];if(bq){by=bs}else{break}}by=bi+(dL<<2)|0;bf=dL+1|0;aR=bi+(bf<<2)|0;bx=dL+2|0;bz=bi+(bx<<2)|0;ai=0;while(1){h[(c[by>>2]|0)+(ai<<3)>>3]=1.0;aS=bi+(ai<<2)|0;h[(c[aS>>2]|0)+(dL<<3)>>3]=1.0;dq=+h[bv+(ai<<3)>>3];h[(c[aR>>2]|0)+(ai<<3)>>3]=dq;h[(c[aS>>2]|0)+(bf<<3)>>3]=dq;dq=+h[bv+(ai+dD<<3)>>3];h[(c[bz>>2]|0)+(ai<<3)>>3]=dq;h[(c[aS>>2]|0)+(bx<<3)>>3]=dq;aS=ai+1|0;if((aS|0)<(dL|0)){ai=aS}else{dP=bf;dQ=bx;dR=by;dS=aR;dU=bz;break}}}else{bz=dL+1|0;aR=dL+2|0;dP=bz;dQ=aR;dR=bi+(dL<<2)|0;dS=bi+(bz<<2)|0;dU=bi+(aR<<2)|0}h[bv+(dL+bB<<3)>>3]=0.0;h[bv+(dP+bB<<3)>>3]=0.0;h[bv+(dQ+bB<<3)>>3]=0.0;h[(c[dR>>2]|0)+(dL<<3)>>3]=0.0;h[(c[dR>>2]|0)+(dP<<3)>>3]=0.0;h[(c[dR>>2]|0)+(dQ<<3)>>3]=0.0;h[(c[dS>>2]|0)+(dL<<3)>>3]=0.0;h[(c[dS>>2]|0)+(dP<<3)>>3]=0.0;h[(c[dS>>2]|0)+(dQ<<3)>>3]=0.0;h[(c[dU>>2]|0)+(dL<<3)>>3]=0.0;h[(c[dU>>2]|0)+(dP<<3)>>3]=0.0;h[(c[dU>>2]|0)+(dQ<<3)>>3]=0.0;aR=dM<<2;bz=ut(aR)|0;if((bz|0)==0){gk();by=ut(aR)|0;if((by|0)==0){au=7736;break L9498}else{dV=by}}else{dV=bz}bz=dV;ht(bi,dM,bz,e);hq(bi,dM,bz,bw);uu(dF);uu(dV);dW=bv+((dL*3&-1)<<3)|0;dX=bv+(dL<<3)|0;dY=dL;dZ=bv}else{dW=0;dX=0;dY=0;dZ=0}if((c[11756]|0)>0){bz=dW+(dY<<3)|0;by=(dY|0)>0;aR=dW+(dY+1<<3)|0;bx=dW+(dY+2<<3)|0;dq=dj;bf=0;ai=c[11732]|0;while(1){aS=hu(ai+1|0)|0;c[aS+8>>2]=c[11732];c[aS>>2]=c[aw>>2];c[aw>>2]=aS;bE=c[11732]|0;if((bE|0)>0){c$=dm;bg=c[aS+12>>2]|0;aS=0;while(1){bJ=bg|0;c[bJ>>2]=0;br=c[11752]|0;L10552:do{if((br|0)==2){c_=+h[bz>>3];if(by){dp=c_;be=0;while(1){cY=+h[dZ+(be<<3)>>3]-dq;cX=+h[dX+(be<<3)>>3]-c$;dw=+h[dW+(be<<3)>>3];dx=+Q(+(cY*cY+cX*cX));if(dx>0.0){d_=dx*dx*+_(+dx)}else{d_=0.0}dx=dp-dw*d_;bh=be+1|0;if((bh|0)<(dY|0)){dp=dx;be=bh}else{d$=dx;break}}}else{d$=c_}d0=d$+dq*+h[aR>>3]+c$*+h[bx>>3];d1=0.0}else{if(al){d0=0.0;d1=0.0;break}be=(br|0)==1;bh=c[11734]|0;dp=+(bh|0);dx=+h[5865];dw=+h[5864];cX=0.0;cY=0.0;bd=aQ;L10555:while(1){bc=c[bd+8>>2]|0;if((bc|0)>0){dy=cX;dv=cY;bb=0;d2=c[bd+12>>2]|0;while(1){d3=+h[d2+8>>3]-dq;if(be){d4=+P(+d3);d5=+P(+(+h[d2+16>>3]-c$));if((bh|0)==1){d6=d4+d5}else if((bh|0)==2){d6=d4*d4+d5*d5}else if((bh|0)==4){d7=d4*d4+d5*d5;d6=d7*d7}else if((bh|0)==8){d7=d4*d4+d5*d5;d8=d7*d7;d6=d8*d8}else if((bh|0)==16){d8=d4*d4+d5*d5;d7=d8*d8;d8=d7*d7;d6=d8*d8}else{d8=+R(+d4,+dp);d6=d8+ +R(+d5,+dp)}if(d6==0.0){break L10555}d9=+h[d2+24>>3]/d6;ea=1.0/d6}else{d5=(+h[d2+16>>3]-c$)/dw;d8=+P(+(d3/dx));d3=+P(+d5);do{if(d8>d3){eb=d8*+Q(+(d3*d3/(d8*d8)+1.0))}else{if(d5==0.0){eb=0.0;break}eb=d3*+Q(+(d8*d8/(d3*d3)+1.0))}}while(0);do{if((br|0)==3){ec=+Z(+(eb*(-0.0-eb)))}else if((br|0)==5){ec=1.0/(eb*eb+1.0)}else if((br|0)==4){ec=+Z(+(-0.0-eb))}else if((br|0)==6){ec=eb<1.0?1.0:0.0}else if((br|0)==7){if(eb>=1.0){ec=0.0;break}ec=(1.0- +S(+(eb*6.283185307179586)))*.5}else{ec=0.0}}while(0);d9=ec*+h[d2+24>>3];ea=ec}d3=dv+d9;d8=dy+ea;ba=bb+1|0;if((ba|0)<(bc|0)){dy=d8;dv=d3;bb=ba;d2=d2+64|0}else{ed=d8;ee=d3;break}}}else{ed=cX;ee=cY}bb=c[bd>>2]|0;if((bb|0)==0){d0=ee;d1=ed;break L10552}else{cX=ed;cY=ee;bd=bb}}c[bJ>>2]=2;d0=+h[d2+24>>3];d1=1.0}}while(0);c[bJ>>2]=0;h[bg+8>>3]=dq;h[bg+16>>3]=c$;br=c[200]|0;if(dq<+h[64664+(br*688&-1)>>3]){if((c[64648+(br*688&-1)>>2]&1|0)==0){au=7785}else{au=7779}}else{au=7779}do{if((au|0)==7779){au=0;if(dq>+h[64672+(br*688&-1)>>3]){if((c[64648+(br*688&-1)>>2]&2|0)==0){au=7785;break}}bd=c[144]|0;if(c$<+h[64664+(bd*688&-1)>>3]){if((c[64648+(bd*688&-1)>>2]&1|0)==0){au=7785;break}}if(c$<=+h[64672+(bd*688&-1)>>3]){ef=0;break}if((c[64648+(bd*688&-1)>>2]&2|0)==0){au=7785}else{ef=0}}}while(0);if((au|0)==7785){au=0;c[bJ>>2]=1;ef=1}do{if((c[11752]|0)==2){eg=d0}else{if((a[47016]&1)!=0){eg=d0;break}eg=d0/d1}}while(0);br=c[34]|0;L10616:do{if((br|0)!=99){if(!(eg>-8.988465674311579e+307&eg<8.988465674311579e+307)){c[bJ>>2]=2;break}do{if((a[64788+(br*688&-1)|0]&1)==0){h[bg+24>>3]=eg}else{if(eg<0.0){c[bJ>>2]=2;break L10616}if(eg==0.0){h[bg+24>>3]=-8.988465674311579e+307;c[bJ>>2]=1;break L10616}else{cY=+_(+eg);h[bg+24>>3]=cY/+h[64800+(br*688&-1)>>3];break}}}while(0);if((a[aj]&1)!=0){break}if((ef|0)!=0|(br|0)<0){break}bd=64712+(br*688&-1)|0;if(eg<+h[bd>>3]){h[bd>>3]=eg}bd=64664+(br*688&-1)|0;do{if(eg<+h[bd>>3]){if((c[64648+(br*688&-1)>>2]&1|0)==0){c[bJ>>2]=1;break L10616}if((c[64728+(br*688&-1)>>2]&1|0)==0){h[bd>>3]=eg;break}cY=+h[64736+(br*688&-1)>>3];if(cY>eg){h[bd>>3]=cY;c[bJ>>2]=1;break L10616}else{h[bd>>3]=eg;break}}}while(0);bd=64720+(br*688&-1)|0;if(eg>+h[bd>>3]){h[bd>>3]=eg}bd=64672+(br*688&-1)|0;if(eg<=+h[bd>>3]){break}if((c[64648+(br*688&-1)>>2]&2|0)==0){c[bJ>>2]=1;break}if((c[64732+(br*688&-1)>>2]&2|0)==0){h[bd>>3]=eg;break}cY=+h[64760+(br*688&-1)>>3];if(cY>3]=cY;c[bJ>>2]=1;break}else{h[bd>>3]=eg;break}}}while(0);if((a[bl]&1)!=0){au=7822;break L9498}br=c[bJ>>2]|0;L10663:do{if(eg>-8.988465674311579e+307&eg<8.988465674311579e+307){do{if((a[66852]&1)==0){h[bg+32>>3]=eg}else{if(eg<0.0){break L10663}if(eg==0.0){h[bg+32>>3]=-8.988465674311579e+307;break L10663}else{cY=+_(+eg);h[bg+32>>3]=cY/+h[8358];break}}}while(0);if(!((a[aj]&1)==0&(br|0)==0)){break}if(eg<+h[8347]){h[8347]=eg}do{if(eg<+h[8341]){if((c[16678]&1|0)==0){break L10663}if((c[16698]&1|0)==0){h[8341]=eg;break}cY=+h[8350];if(cY>eg){h[8341]=cY;break L10663}else{h[8341]=eg;break}}}while(0);if(eg>+h[8348]){h[8348]=eg}if(eg<=+h[8342]){break}if((c[16678]&2|0)==0){break}if((c[16699]&2|0)==0){h[8342]=eg;break}cY=+h[8353];if(cY>2]|0;bf=c[ei+12>>2]|0;if((bf|0)!=0){uu(bf)}uu(ei);if((ai|0)==0){break}else{ei=ai}}}}while(0);aj=c[200]|0;do{if(+h[64664+(aj*688&-1)>>3]==8.988465674311579e+307){au=7861}else{if(+h[64672+(aj*688&-1)>>3]==-8.988465674311579e+307){au=7861;break}bl=c[144]|0;if(+h[64664+(bl*688&-1)>>3]==8.988465674311579e+307){au=7861;break}if(+h[64672+(bl*688&-1)>>3]==-8.988465674311579e+307){au=7861;break}bl=c[34]|0;if(+h[64664+(bl*688&-1)>>3]==8.988465674311579e+307){au=7861;break}if(+h[64672+(bl*688&-1)>>3]==-8.988465674311579e+307){au=7861}}}while(0);if((au|0)==7861){au=0;uh(-1,105912,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}aj=c[ax>>2]|0;do{if((aj|0)<2){c[bu>>2]=0}else{if((c[bu>>2]|0)==0){break}if((a[38984]&1)!=0){break}bl=c[aw>>2]|0;aQ=c[bl+8>>2]|0;if((aQ|0)>0){al=0;ai=0;while(1){ej=hu(aj)|0;c[ej+8>>2]=aj;bf=c[aw>>2]|0;if((bf|0)!=0){bx=ej+12|0;aR=0;by=bf;while(1){uD((c[bx>>2]|0)+(aR<<6)|0,(c[by+12>>2]|0)+(ai<<6)|0,64);bf=c[by>>2]|0;if((bf|0)==0){break}else{aR=aR+1|0;by=bf}}}c[ej>>2]=al;by=ai+1|0;if((by|0)<(aQ|0)){al=ej;ai=by}else{break}}ek=ej;el=c[aw>>2]|0}else{ek=0;el=bl}ai=el;do{em=ai|0;ai=c[em>>2]|0;}while((ai|0)!=0);c[em>>2]=ek}}while(0);c[cF>>2]=c[13898];aw=c[7774]|0;if((aw|0)==0){en=0}else{en=c[aw+32>>2]|0}c[ag+248>>2]=en;if((c[ax>>2]|0)==0){c[ag+8>>2]=4}if((ag|0)!=(a$|0)){aw=ag+264|0;uB(aw|0,bo|0)}eo=ak+1|0;eq=ag|0;if((cI|0)==-1){break}aw=c[eq>>2]|0;do{if((aw|0)==0){uE(f|0,0,24);aj=ut(272)|0;if((aj|0)==0){gk();bu=ut(272)|0;if((bu|0)==0){au=7887;break L9498}else{er=bu}}else{er=aj}aj=er;uE(er|0,0,272);c[er+28>>2]=-2;bu=er+32|0;c[bu>>2]=0;c[bu+4>>2]=0;h[er+40>>3]=1.0;h[er+48>>3]=-2.0;bu=er+56|0;c[bu>>2]=c[f>>2];c[bu+4>>2]=c[f+4>>2];c[bu+8>>2]=c[f+8>>2];c[bu+12>>2]=c[f+12>>2];c[bu+16>>2]=c[f+16>>2];c[bu+20>>2]=c[f+20>>2];c[er+80>>2]=-1;c[er+84>>2]=0;bu=er+88|0;c[bu>>2]=c[12872];c[bu+4>>2]=c[12873];c[bu+8>>2]=c[12874];c[bu+12>>2]=c[12875];c[bu+16>>2]=c[12876];c[bu+20>>2]=c[12877];c[bu+24>>2]=c[12878];c[bu+28>>2]=c[12879];c[bu+32>>2]=c[12880];c[bu+36>>2]=c[12881];c[bu+40>>2]=c[12882];c[bu+44>>2]=c[12883];c[bu+48>>2]=c[12884];c[bu+52>>2]=c[12885];c[er+144>>2]=1;h[er+152>>3]=0.0;c[er+160>>2]=0;h[er+168>>3]=15.0;h[er+176>>3]=90.0;c[er+184>>2]=0;c[eq>>2]=aj;es=aj}else{aj=aw+16|0;bu=c[aj>>2]|0;if((bu|0)==0){es=aw;break}uu(bu);c[aj>>2]=0;es=aw}}while(0);c[es+8>>2]=3;aw=c[7774]|0;if((aw|0)==0){et=0}else{et=c[aw+32>>2]|0}c[es+248>>2]=et;aw=c[ah>>2]|0;c[es+12>>2]=aw;ax=es+24|0;c[ax>>2]=c[aP>>2];c[ax+4>>2]=c[aP+4>>2];c[ax+8>>2]=c[aP+8>>2];c[ax+12>>2]=c[aP+12>>2];c[ax+16>>2]=c[aP+16>>2];c[ax+20>>2]=c[aP+20>>2];c[ax+24>>2]=c[aP+24>>2];c[ax+28>>2]=c[aP+28>>2];c[ax+32>>2]=c[aP+32>>2];c[ax+36>>2]=c[aP+36>>2];c[ax+40>>2]=c[aP+40>>2];c[ax+44>>2]=c[aP+44>>2];c[ax+48>>2]=c[aP+48>>2];c[ax+52>>2]=c[aP+52>>2];if((aw|0)==368){uE(r|0,0,28);aw=ut(192)|0;if((aw|0)==0){gk();ax=ut(192)|0;if((ax|0)==0){au=7894;break L9498}else{eu=ax}}else{eu=aw}c[eu>>2]=0;c[eu+4>>2]=-1;c[eu+72>>2]=0;c[eu+88>>2]=0;uE(eu+8|0,0,60);c[eu+96>>2]=1;c[eu+144>>2]=4;c[eu+148>>2]=4;c[eu+152>>2]=4;aw=eu+156|0;c[aw>>2]=c[r>>2];c[aw+4>>2]=c[r+4>>2];c[aw+8>>2]=c[r+8>>2];c[aw+12>>2]=c[r+12>>2];c[aw+16>>2]=c[r+16>>2];c[aw+20>>2]=c[r+20>>2];c[aw+24>>2]=c[r+24>>2];a[eu+184|0]=0;aw=es+224|0;c[aw>>2]=eu;uD(eu|0,c[aT>>2]|0,192);c[c[aw>>2]>>2]=0}ak=eo;ag=c[eq>>2]|0}ez();ev=eq;ew=ag;ex=eo}else{c[a$+4>>2]=c[13898];ak=c[7774]|0;if((ak|0)==0){eA=0}else{eA=c[ak+32>>2]|0}c[a$+248>>2]=eA;ev=a$|0;ew=a$;ex=a0}ak=c[7774]|0;if((ak|0)==0){ay=ev;az=aK;aA=aX;aB=aZ;aC=0;aD=cA;aE=cB;aF=a_;aG=cs;aH=ct;aJ=ex;break}if((a[ak+38|0]&1)==0){ay=ev;az=aK;aA=aX;aB=aZ;aC=0;aD=cA;aE=cB;aF=a_;aG=cs;aH=ct;aJ=ex;break}c[ew+8>>2]=4;ay=ev;az=aK;aA=aX;aB=aZ;aC=0;aD=cA;aE=cB;aF=a_;aG=cs;aH=ct;aJ=ex}}while(0);do{if((aF|0)==0){if(ix(c[7774]|0)|0){c[13898]=az;eB=0;eD=az;break}p=c[7774]|0;if((p|0)!=0){af=p;while(1){p=c[af>>2]|0;uu(c[af+12>>2]|0);uu(af);if((p|0)==0){break}else{af=p}}}c[7774]=0;af=c[13898]|0;if((c[8272]|0)<=(af|0)){au=7924;break L9498}ag=c[1054]|0;if((a[ag+(af*40&-1)|0]&1)==0){au=7924;break L9498}p=c[ag+(af*40&-1)+36>>2]|0;ak=ag+(af*40&-1)+32|0;ag=c[10036]|0;aT=0;while(1){if((aT|0)>=(p|0)){break}if((a[ag+((c[ak>>2]|0)+aT|0)|0]|0)==(a[aT+148464|0]|0)){aT=aT+1|0}else{au=7924;break L9498}}if((aT|0)!=1){au=7924;break L9498}c[13898]=af+1;c[7774]=iw()|0;eB=0;eD=c[13898]|0}else{ak=c[13898]|0;if((c[8272]|0)<=(ak|0)){eE=az;eF=aA;eG=aB;eH=aC;eI=aF;eJ=aJ;au=7925;break L9498}ag=c[1054]|0;if((a[ag+(ak*40&-1)|0]&1)==0){eE=az;eF=aA;eG=aB;eH=aC;eI=aF;eJ=aJ;au=7925;break L9498}p=c[ag+(ak*40&-1)+36>>2]|0;aP=ag+(ak*40&-1)+32|0;ag=c[10036]|0;ah=0;while(1){if((ah|0)>=(p|0)){break}if((a[ag+((c[aP>>2]|0)+ah|0)|0]|0)==(a[ah+148464|0]|0)){ah=ah+1|0}else{eE=az;eF=aA;eG=aB;eH=aC;eI=aF;eJ=aJ;au=7925;break L9498}}if((ah|0)!=1){eE=az;eF=aA;eG=aB;eH=aC;eI=aF;eJ=aJ;au=7925;break L9498}aP=ak+1|0;c[13898]=aP;eB=aF;eD=aP}}while(0);if((eD|0)<(c[8272]|0)){N=aJ;O=aH;U=aG;V=eB;W=aE;X=aD;Y=aC;$=aB;ab=aA;ac=az;ad=ay;ae=eD}else{an=aC;ao=az;ap=aJ;aq=eB;ar=aB;as=aA;at=eD;au=6983;break}}do{if((au|0)==6983){if((ap|0)==0){q=at}else{eE=ao;eF=as;eG=ar;eH=an;eI=aq;eJ=ap;au=7925;break}uf(q,105216,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((au|0)==8108){eK=c[13898]|0;uf(eK,205152,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((au|0)==8109){uf(bQ,163568,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((au|0)==8110){uf(bQ,163568,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((au|0)==8111){uf(bQ,163568,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((au|0)==8112){uf(bQ,163568,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((au|0)==8113){uf(bQ,163568,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((au|0)==8114){uf(bQ,163568,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((au|0)==8116){i=b;return}else if((au|0)==6999){uf(c[13898]|0,92272,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((au|0)==7012){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=101304,v)|0)}else if((au|0)==7020){uf(c[13898]|0,84448,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((au|0)==7022){uf(c[13898]|0,76512,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((au|0)==7088){uf(c[13898]|0,216936,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((au|0)==7109){c[13898]=bR;au=7110}else if((au|0)==7167){uf(b8,143640,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((au|0)==7220){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=201712,v)|0)}else if((au|0)==7325){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=151256,v)|0)}else if((au|0)==7329){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=149424,v)|0)}else if((au|0)==7332){uf(cE,123192,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((au|0)==7335){uf(cE,121944,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((au|0)==7380){uf(c[cF>>2]|0,114088,(v=i,i=i+8|0,c[v>>2]=c[11900],v)|0)}else if((au|0)==7385){uf(c[cF>>2]|0,110664,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((au|0)==7391){uf(c[cF>>2]|0,110664,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((au|0)==7396){uf(-1,107856,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((au|0)==7398){uf(c[cF>>2]|0,106920,(v=i,i=i+8|0,c[v>>2]=c[11900],v)|0)}else if((au|0)==7709){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=104328,v)|0)}else if((au|0)==7712){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=103864,v)|0)}else if((au|0)==7736){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=103496,v)|0)}else if((au|0)==7822){uf(-1,104872,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((au|0)==7887){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=101304,v)|0)}else if((au|0)==7894){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=201712,v)|0)}else if((au|0)==7924){eD=a[32936]|0;if(aB){eN=eD&1;eO=eD;eP=az;eQ=aA;eR=aC;eS=0;eT=aJ;au=7928}else{eU=aJ}}}while(0);if((au|0)==7110){c[a4>>2]=0;eK=c[13898]|0;uf(eK,205152,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}do{if((au|0)==7925){eK=a[32936]|0;a4=eK&1;if(a4<<24>>24==0|(eI|0)==0){if(eG){eN=a4;eO=eK;eP=eE;eQ=eF;eR=eH;eS=eI;eT=eJ;au=7928;break}else{eU=eJ;break}}else{uf(-1,147440,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);do{if((au|0)==7928){eJ=eN<<24>>24!=0;eI=eJ?9:2;eH=eJ?10:1;if(eJ){eV=eO}else{dc(2,145296);dc(1,143440);eV=a[32936]|0}do{if(!((eV&1)==0|eQ)){eJ=c[16506]|0;if((eJ&1|0)!=0){h[8255]=8.988465674311579e+307}if((eJ&2|0)!=0){h[8256]=-8.988465674311579e+307}eJ=c[16334]|0;if((eJ&1|0)!=0){h[8169]=8.988465674311579e+307}if((eJ&2|0)==0){break}h[8170]=-8.988465674311579e+307}}while(0);eg=+h[64664+(eI*688&-1)>>3];eJ=(a[64788+(eI*688&-1)|0]&1)==0;do{if(eJ){eW=+h[64672+(eI*688&-1)>>3];eX=eg}else{if(eg<=0.0){uk(210984,(v=i,i=i+24|0,c[v>>2]=141960,c[v+8>>2]=56832+(eI*24&-1),h[v+16>>3]=eg,v)|0)}d1=+_(+eg);d0=d1/+h[64800+(eI*688&-1)>>3];d1=+h[64672+(eI*688&-1)>>3];if(eJ){eW=d1;eX=d0;break}if(d1>0.0){ee=+_(+d1);eW=ee/+h[64800+(eI*688&-1)>>3];eX=d0;break}else{uk(210984,(v=i,i=i+24|0,c[v>>2]=141960,c[v+8>>2]=56832+(eI*24&-1),h[v+16>>3]=d1,v)|0)}}}while(0);eg=+h[64664+(eH*688&-1)>>3];eJ=(a[64788+(eH*688&-1)|0]&1)==0;do{if(eJ){eY=+h[64672+(eH*688&-1)>>3];eZ=eg}else{if(eg<=0.0){uk(210984,(v=i,i=i+24|0,c[v>>2]=140304,c[v+8>>2]=56832+(eH*24&-1),h[v+16>>3]=eg,v)|0)}d1=+_(+eg);d0=d1/+h[64800+(eH*688&-1)>>3];d1=+h[64672+(eH*688&-1)>>3];if(eJ){eY=d1;eZ=d0;break}if(d1>0.0){ee=+_(+d1);eY=ee/+h[64800+(eH*688&-1)>>3];eZ=d0;break}else{uk(210984,(v=i,i=i+24|0,c[v>>2]=140304,c[v+8>>2]=56832+(eH*24&-1),h[v+16>>3]=d1,v)|0)}}}while(0);if((c[6352]|0)<2|(c[6350]|0)<2|(c[9344]|0)<2|(c[9342]|0)<2){uf(-1,138240,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}eJ=c[10828]|0;c[13898]=o;c[7774]=iw()|0;eF=(a[38984]&1)==0;eg=eW-eX;d1=eY-eZ;eE=c[9342]|0;d0=d1/+((eF?c[6350]|0:eE)-1|0);eG=c[9344]|0;ee=eg/+((eF?c[6352]|0:eG)-1|0);ed=eg/+(eG-1|0);eg=d1/+(eE-1|0);eE=eP;eG=eJ;eJ=eR;eF=eS;L10882:while(1){eK=(eF|0)==0;a4=eE;aJ=eJ;L10884:while(1){aC=c[13898]|0;if(eK){e_=aJ?a4:aC}else{e_=a4}if((t9(aC)|0)==0){au=7968;break}dT();aC=c[13898]|0;if((c[8272]|0)<=(aC|0)){a4=e_;aJ=1;continue}aA=c[1054]|0;if((a[aA+(aC*40&-1)|0]&1)==0){a4=e_;aJ=1;continue}az=c[aA+(aC*40&-1)+36>>2]|0;aB=aA+(aC*40&-1)+32|0;aA=c[10036]|0;cF=0;while(1){if((cF|0)>=(az|0)){break}if((a[aA+((c[aB>>2]|0)+cF|0)|0]|0)==(a[cF+148464|0]|0)){cF=cF+1|0}else{a4=e_;aJ=1;continue L10884}}if((cF|0)==1){e$=eG;e0=aJ;e1=eF;e2=aC;break}else{a4=e_;aJ=1}}L10896:do{if((au|0)==7968){au=0;e3=c[13898]|0;if((e3|0)>=(c[8272]|0)){au=7975;break L10882}aJ=c[1054]|0;L10899:do{if((a[aJ+(e3*40&-1)|0]&1)==0){e4=0}else{a4=c[aJ+(e3*40&-1)+36>>2]|0;eK=aJ+(e3*40&-1)+32|0;ak=c[10036]|0;ah=0;while(1){if((ah|0)>=(a4|0)){break}if((a[ak+((c[eK>>2]|0)+ah|0)|0]|0)==(a[ah+103664|0]|0)){ah=ah+1|0}else{e4=0;break L10899}}e4=(ah|0)==1}}while(0);if(e4|(eG|0)==0){au=7975;break L10882}c[11670]=31112;do{if((iu(l)|0)==0){c[n>>2]=c[eG+260>>2];if((a[32936]&1)==0){e5=eF}else{e5=(eF+2|0)%3&-1}c[7780]=c[l>>2];aJ=eG+12|0;if((c[aJ>>2]|0)==352|(c[7662]|0)==1){e8=1}else{e8=(a[eG+56|0]&1)!=0}i1(e5,0,n,eH,eZ,eg,c[9342]|0,eI,eX,ee,(a[38984]&1)!=0?c[9344]|0:c[6352]|0,e8);if((a[38984]&1)!=0){e9=e5;break}if((c[aJ>>2]|0)==352|(c[7662]|0)==1){fa=1}else{fa=(a[eG+56|0]&1)!=0}i1(e5,1,n,eI,eX,ed,c[9344]|0,eH,eZ,d0,c[6350]|0,fa);e9=e5}else{e9=eF}}while(0);aJ=c[eG+4>>2]|0;c[13898]=aJ;aC=c[eG+248>>2]|0;cF=eG;while(1){eK=c[cF>>2]|0;if((eK|0)==0){e$=0;e0=0;e1=e9;e2=aJ;break L10896}if((c[eK+4>>2]|0)!=(aJ|0)){e$=eK;e0=0;e1=e9;e2=aJ;break L10896}if((c[eK+248>>2]|0)==(aC|0)){cF=eK}else{e$=eK;e0=0;e1=e9;e2=aJ;break}}}}while(0);aJ=(e1|0)==0;if(aJ){if(ix(c[7774]|0)|0){c[13898]=e_;eE=e_;eG=e$;eJ=e0;eF=0;continue}cF=c[7774]|0;if((cF|0)!=0){aC=cF;while(1){cF=c[aC>>2]|0;uu(c[aC+12>>2]|0);uu(aC);if((cF|0)==0){break}else{aC=cF}}}c[7774]=0;fb=c[13898]|0}else{fb=e2}if((c[8272]|0)<=(fb|0)){break}aC=c[1054]|0;if((a[aC+(fb*40&-1)|0]&1)==0){break}cF=c[aC+(fb*40&-1)+36>>2]|0;eK=aC+(fb*40&-1)+32|0;aC=c[10036]|0;ak=0;while(1){if((ak|0)>=(cF|0)){break}if((a[aC+((c[eK>>2]|0)+ak|0)|0]|0)==(a[ak+148464|0]|0)){ak=ak+1|0}else{break L10882}}if((ak|0)!=1){break}c[13898]=fb+1;if(!aJ){eE=e_;eG=e$;eJ=e0;eF=e1;continue}c[7774]=iw()|0;eE=e_;eG=e$;eJ=e0;eF=0}if((au|0)==7975){uh(e3,136552,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((a[32936]&1)==0){eU=eT;break}eF=c[10828]|0;c[d>>2]=eF;L10947:do{if((eT|0)>0){eJ=0;eG=d;eE=0;eH=eF;eI=eT;eK=eT;while(1){if((c[eH+8>>2]|0)==2){aC=eH|0;cF=c[aC>>2]|0;a4=cF|0;aB=c[a4>>2]|0;aA=c[aB+260>>2]|0;az=eI-2|0;if((aA|0)!=0){cE=eH+260|0;b8=cF+260|0;bR=aA;while(1){aA=c[cE>>2]|0;bQ=c[b8>>2]|0;q=c[aA+12>>2]|0;ap=c[bQ+12>>2]|0;aq=c[bR+12>>2]|0;an=bR+8|0;if((c[an>>2]|0)>0){ar=0;do{h[aq+(ar<<6)+8>>3]=+h[q+(ar<<6)+24>>3];h[aq+(ar<<6)+16>>3]=+h[ap+(ar<<6)+24>>3];as=aq+(ar<<6)|0;ao=c[as>>2]|0;at=c[q+(ar<<6)>>2]|0;if(ao>>>0>>0){c[as>>2]=at;fc=at}else{fc=ao}ao=c[ap+(ar<<6)>>2]|0;if(fc>>>0>>0){c[as>>2]=ao}ar=ar+1|0;}while((ar|0)<(c[an>>2]|0))}an=c[bR>>2]|0;if((an|0)==0){break}else{cE=aA|0;b8=bQ|0;bR=an}}if((c[aC>>2]|0)!=(cF|0)){break}}c[a4>>2]=eE;c[eG>>2]=aB;fd=eH;fe=aB;ff=az;fg=az}else{fd=eE;fe=eH;ff=eI;fg=eK}bR=fe|0;b8=eJ+1|0;if((b8|0)<(ff|0)){eJ=b8;eG=bR;eE=fd;eH=c[bR>>2]|0;eI=ff;eK=fg}else{fh=bR;fi=fd;fj=fg;break L10947}}uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=125824,v)|0)}else{fh=d;fi=0;fj=eT}}while(0);c[fh>>2]=fi;c[10828]=c[d>>2];eU=fj}}while(0);if((eU|0)==0|(c[10828]|0)==0){uf(c[13898]|0,134776,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}dc(2,133200);if((a[66036]&1)!=0){eZ=+h[8255];h[8255]=+h[8256];h[8256]=eZ}do{if((a[66164]&1)!=0){eZ=+h[8255];if(eZ<=0.0){uf(-1,218096,(v=i,i=i+8|0,c[v>>2]=56880,v)|0)}eX=+h[8256];if(eX>0.0){eY=+_(+eZ);eZ=+h[8272];h[8255]=eY/eZ;h[8256]=+_(+eX)/eZ;break}else{uf(-1,218096,(v=i,i=i+8|0,c[v>>2]=56880,v)|0)}}}while(0);dc(1,131808);if((a[65348]&1)!=0){eZ=+h[8169];h[8169]=+h[8170];h[8170]=eZ}do{if((a[65476]&1)!=0){eZ=+h[8169];if(eZ<=0.0){uf(-1,218096,(v=i,i=i+8|0,c[v>>2]=56856,v)|0)}eX=+h[8170];if(eX>0.0){eY=+_(+eZ);eZ=+h[8186];h[8169]=eY/eZ;h[8170]=+_(+eX)/eZ;break}else{uf(-1,218096,(v=i,i=i+8|0,c[v>>2]=56856,v)|0)}}}while(0);do{if((c[5094]|0)==0){dc(0,130544)}else{eZ=+h[8083];eX=+h[8084];if(eX-eZ!=0.0){break}fj=c[16162]|0;if((fj|0)==0){uf(-1,197584,(v=i,i=i+8|0,c[v>>2]=56832,v)|0)}if(eX==0.0){fk=1.0}else{fk=+P(+eX)*.01}if((fj&1|0)!=0){h[8083]=eZ-fk}if((fj&2|0)==0){break}h[8084]=fk+eX}}while(0);if((a[64660]&1)!=0){fk=+h[8083];h[8083]=+h[8084];h[8084]=fk}do{if((a[64788]&1)!=0){fk=+h[8083];if(fk<=0.0){uf(-1,218096,(v=i,i=i+8|0,c[v>>2]=56832,v)|0)}eX=+h[8084];if(eX>0.0){eZ=+_(+fk);fk=+h[8100];h[8083]=eZ/fk;h[8084]=+_(+eX)/fk;break}else{uf(-1,218096,(v=i,i=i+8|0,c[v>>2]=56832,v)|0)}}}while(0);dd(2,20);dd(1,20);dd(0,20);i6(eU,2);if(a[31104]|0){dk();dc(3,129504);dd(3,20)}do{if((c[16508]&1|0)!=0){fj=c[16506]|0;if((fj&1|0)!=0){h[8257]=+h[8255]}if((fj&2|0)==0){break}h[8258]=+h[8256]}}while(0);fj=c[10828]|0;if((fj|0)==0){uf(c[13898]|0,134776,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((c[11690]|0)!=0&(eU|0)>0){d=fj;fj=0;while(1){fi=d+256|0;fh=c[fi>>2]|0;if((fh|0)!=0){eT=fh;while(1){fh=c[eT>>2]|0;uu(c[eT+4>>2]|0);uu(eT);if((fh|0)==0){break}else{eT=fh}}c[fi>>2]=0}eT=c[d+12>>2]|0;do{if(!((eT|0)==368|(eT|0)==225|(eT|0)==400|(eT|0)==416|(eT|0)==432)){if((a[d+237|0]&1)!=0){break}if((c[d+244>>2]|0)==0){uh(-1,128216,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);break}if((c[d+8>>2]|0)==3){c[fi>>2]=ep(c[d+252>>2]|0,c[d+260>>2]|0)|0;break}else{c[fi>>2]=ep(c[9342]|0,c[d+260>>2]|0)|0;break}}}while(0);fi=fj+1|0;if((fi|0)<(eU|0)){d=c[d>>2]|0;fj=fi}else{break}}}fj=c[7738]|0;L11058:do{if((fj|0)!=-1){d=(c[13898]|0)-1|0;fi=c[1054]|0;eT=(c[fi+(d*40&-1)+36>>2]|0)+(c[fi+(d*40&-1)+32>>2]|0)|0;d=db(c[6924]|0,(eT+1|0)-(c[fi+(fj*40&-1)+32>>2]|0)|0,116456)|0;c[6924]=d;fi=c[(c[1054]|0)+(fj*40&-1)+32>>2]|0;L11060:do{if((fi|0)<(eT|0)){fh=fi;fg=d;while(1){fd=a[(c[10036]|0)+fh|0]|0;if(fd<<24>>24==0){fl=fg;break L11060}ff=fg+1|0;a[fg]=fd;fd=fh+1|0;if((fd|0)<(eT|0)){fh=fd;fg=ff}else{fl=ff;break}}}else{fl=d}}while(0);a[fl]=0;c[7738]=-1;d=c[6924]|0;eT=e6(126928)|0;if((eT|0)==0){break}fi=eT+8|0;do{if((a[fi]&1)==0){fg=c[eT+24>>2]|0;if((aY(fg|0,d|0)|0)==0){break L11058}fh=eT+16|0;if((c[fh>>2]|0)!=3){break}uu(fg);c[fh>>2]=1}else{a[fi]=0}}while(0);if((d|0)==0){fm=0}else{fm=bP(d|0)|0}c[eT+16>>2]=3;c[eT+24>>2]=fm}}while(0);c[7952]=eU;if((a[14112]&1)!=0){li(eU);i=b;return}fv(c[10828]|0,eU,0);fm=0;do{if((c[64656+(fm*688&-1)>>2]&1|0)!=0){fk=+h[64664+(fm*688&-1)>>3];if((a[64788+(fm*688&-1)|0]&1)==0){h[64696+(fm*688&-1)>>3]=fk;fn=+h[64672+(fm*688&-1)>>3]}else{eX=+h[64800+(fm*688&-1)>>3];h[64696+(fm*688&-1)>>3]=+Z(+(fk*eX));fn=+Z(+(+h[64672+(fm*688&-1)>>3]*eX))}h[64704+(fm*688&-1)>>3]=fn}fm=fm+1|0;}while(fm>>>0<11);e7(1);c[6930]=eU;c[6928]=3;i=b;return}function i$(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0,w=0,x=0.0;e=i;if((d|0)>0){f=0;g=b;while(1){b=c[g+12>>2]|0;do{if((b|0)==400|(b|0)==416|(b|0)==432){if((c[16507]|0)==0){break}f3(g,1)}else{j=c[g+260>>2]|0;if((j|0)==0){break}k=g+23|0;l=j;do{j=l+8|0;if((c[j>>2]|0)>0){m=l+12|0;n=0;do{o=c[m>>2]|0;p=o+(n<<6)|0;do{if((c[p>>2]|0)!=2){c[p>>2]=0;do{if((a[k]&1)==0){q=c[16507]|0;do{if((q&1|0)!=0){r=+h[o+(n<<6)+8>>3];if(r>=+h[8255]){break}h[8255]=r}}while(0);if((q&2|0)==0){break}r=+h[o+(n<<6)+8>>3];if(r<=+h[8256]){break}h[8256]=r}}while(0);r=+h[8255];s=+h[8256];t=+h[o+(n<<6)+8>>3];if(rs){u=8137}}else{if(tr){u=8137}}if((u|0)==8137){u=0;c[p>>2]=1;break}do{if((a[k]&1)==0){w=c[16335]|0;do{if((w&1|0)!=0){r=+h[o+(n<<6)+16>>3];if(r>=+h[8169]){break}h[8169]=r}}while(0);if((w&2|0)==0){break}r=+h[o+(n<<6)+16>>3];if(r<=+h[8170]){break}h[8170]=r}}while(0);r=+h[8169];t=+h[8170];s=+h[o+(n<<6)+16>>3];if(rt){u=8148}}else{if(sr){u=8148}}if((u|0)==8148){u=0;c[p>>2]=1;break}do{if((a[k]&1)==0){q=c[16163]|0;do{if((q&1|0)!=0){r=+h[o+(n<<6)+24>>3];if(r>=+h[8083]){break}h[8083]=r}}while(0);if((q&2|0)==0){break}r=+h[o+(n<<6)+24>>3];if(r<=+h[8084]){break}h[8084]=r}}while(0);r=+h[8083];s=+h[8084];t=+h[o+(n<<6)+24>>3];if(rs)){break}}else{if(!(tr)){break}}c[p>>2]=1}}while(0);n=n+1|0;}while((n|0)<(c[j>>2]|0))}l=c[l>>2]|0;}while((l|0)!=0)}}while(0);b=f+1|0;if((b|0)<(d|0)){f=b;g=c[g>>2]|0}else{break}}}dc(2,0);dc(1,0);r=+h[8083];t=+h[8084];if(t-r!=0.0){i=e;return}g=c[16162]|0;if((g|0)==0){uf(-1,197584,(v=i,i=i+8|0,c[v>>2]=56832,v)|0)}if(t==0.0){x=1.0}else{x=+P(+t)*.01}if((g&1|0)!=0){h[8083]=r-x}if((g&2|0)==0){i=e;return}h[8084]=x+t;i=e;return}function i0(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0;f=i;i=i+24|0;g=f|0;uE(g|0,0,24);j=ut(272)|0;do{if((j|0)==0){gk();k=ut(272)|0;if((k|0)!=0){l=k;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=101304,v)|0);return 0}else{l=j}}while(0);j=l;uE(l|0,0,272);c[l+28>>2]=-2;k=l+32|0;c[k>>2]=0;c[k+4>>2]=0;h[l+40>>3]=1.0;h[l+48>>3]=-2.0;k=l+56|0;c[k>>2]=c[g>>2];c[k+4>>2]=c[g+4>>2];c[k+8>>2]=c[g+8>>2];c[k+12>>2]=c[g+12>>2];c[k+16>>2]=c[g+16>>2];c[k+20>>2]=c[g+20>>2];c[l+80>>2]=-1;c[l+84>>2]=0;g=l+88|0;c[g>>2]=c[12872];c[g+4>>2]=c[12873];c[g+8>>2]=c[12874];c[g+12>>2]=c[12875];c[g+16>>2]=c[12876];c[g+20>>2]=c[12877];c[g+24>>2]=c[12878];c[g+28>>2]=c[12879];c[g+32>>2]=c[12880];c[g+36>>2]=c[12881];c[g+40>>2]=c[12882];c[g+44>>2]=c[12883];c[g+48>>2]=c[12884];c[g+52>>2]=c[12885];c[l+144>>2]=1;h[l+152>>3]=0.0;c[l+160>>2]=0;h[l+168>>3]=15.0;h[l+176>>3]=90.0;c[l+184>>2]=0;if(!((e|0)>0&(a|0)>0)){i=f;return j|0}if((b|0)>0){g=l+260|0;k=0;do{m=hu(d)|0;c[m>>2]=c[g>>2];c[g>>2]=m;k=k+1|0;}while((k|0)<(b|0))}b=l+260|0;l=0;do{k=hu(a)|0;c[k>>2]=c[b>>2];c[b>>2]=k;l=l+1|0;}while((l|0)<(e|0));i=f;return j|0}function i1(b,d,e,f,g,j,k,l,m,n,o,p){b=b|0;d=d|0;e=e|0;f=f|0;g=+g;j=+j;k=k|0;l=l|0;m=+m;n=+n;o=o|0;p=p|0;var q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0.0,X=0.0,Y=0,$=0.0,aa=0.0,ab=0,ac=0.0,ad=0,ae=0.0,af=0,ag=0;q=i;i=i+24|0;r=q|0;if(p){s=(b|0)==0|(a[32936]&1)==0}else{s=0}if((k|0)<=0){i=q;return}p=d&1;t=p^1;u=64788+(f*688&-1)|0;w=31136+(t*24&-1)|0;x=31144+(t*24&-1)|0;y=31152+(t*24&-1)|0;t=(o|0)>0;z=64788+(l*688&-1)|0;A=31136+(p*24&-1)|0;B=31144+(p*24&-1)|0;C=31152+(p*24&-1)|0;p=r|0;D=r+8|0;E=D;F=(b|0)==99;G=64788+(b*688&-1)|0;H=(b|0)<0;I=64712+(b*688&-1)|0;J=64664+(b*688&-1)|0;K=64648+(b*688&-1)|0;L=64728+(b*688&-1)|0;M=64736+(b*688&-1)|0;N=64720+(b*688&-1)|0;O=64672+(b*688&-1)|0;Q=64732+(b*688&-1)|0;R=64760+(b*688&-1)|0;S=64800+(b*688&-1)|0;b=r+8|0;T=D;D=r+16|0;U=64800+(l*688&-1)|0;l=64800+(f*688&-1)|0;f=c[(c[e>>2]|0)+12>>2]|0;V=0;L11194:while(1){W=+(V|0)*j+g;if((a[u]&1)==0){X=W}else{X=+Z(+(W*+h[l>>3]))}c[w>>2]=2;h[x>>3]=X;h[y>>3]=0.0;if(t){Y=0;do{$=+(Y|0)*n+m;if((a[z]&1)==0){aa=$}else{aa=+Z(+($*+h[U>>3]))}c[A>>2]=2;h[B>>3]=aa;h[C>>3]=0.0;ab=f+(Y<<6)+8|0;if(d){h[ab>>3]=W;h[f+(Y<<6)+16>>3]=$}else{h[ab>>3]=$;h[f+(Y<<6)+16>>3]=W}e4(c[7780]|0,r);L11209:do{if((a[1960]&1)==0){ab=c[p>>2]|0;if((ab|0)==2){ac=+h[D>>3]}else if((ab|0)==3){ad=8203;break L11194}else if((ab|0)==1){ac=0.0}else{ad=8204;break L11194}$=+P(+ac);if($>+h[11]){ad=8206;break}if((ab|0)==1){ae=+(c[E>>2]|0)}else if((ab|0)==2){ae=+h[b>>3]}else if((ab|0)==3){ae=+uz(c[T>>2]|0,0)}else{ad=8211;break L11194}ab=f+(Y<<6)|0;c[ab>>2]=0;L11220:do{if(!F){if(!(ae>-8.988465674311579e+307&ae<8.988465674311579e+307)){c[ab>>2]=2;break}do{if((a[G]&1)==0){h[f+(Y<<6)+24>>3]=ae}else{if(ae<0.0){c[ab>>2]=2;break L11220}if(ae==0.0){h[f+(Y<<6)+24>>3]=-8.988465674311579e+307;c[ab>>2]=1;break L11220}else{$=+_(+ae);h[f+(Y<<6)+24>>3]=$/+h[S>>3];break}}}while(0);if(H){break}if(ae<+h[I>>3]){h[I>>3]=ae}do{if(ae<+h[J>>3]){if((c[K>>2]&1|0)==0){c[ab>>2]=1;break L11220}if((c[L>>2]&1|0)==0){h[J>>3]=ae;break}$=+h[M>>3];if($>ae){h[J>>3]=$;c[ab>>2]=1;break L11220}else{h[J>>3]=ae;break}}}while(0);if(ae>+h[N>>3]){h[N>>3]=ae}if(ae<=+h[O>>3]){break}if((c[K>>2]&2|0)==0){c[ab>>2]=1;break}if((c[Q>>2]&2|0)==0){h[O>>3]=ae;break}$=+h[R>>3];if($>3]=$;c[ab>>2]=1;break}else{h[O>>3]=ae;break}}}while(0);if(!s){break}af=c[ab>>2]|0;if(!(ae>-8.988465674311579e+307&ae<8.988465674311579e+307)){break}do{if((a[66852]&1)==0){h[f+(Y<<6)+32>>3]=ae}else{if(ae<0.0){break L11209}if(ae==0.0){h[f+(Y<<6)+32>>3]=-8.988465674311579e+307;break L11209}else{$=+_(+ae);h[f+(Y<<6)+32>>3]=$/+h[8358];break}}}while(0);if((af|0)!=0){break}if(ae<+h[8347]){h[8347]=ae}do{if(ae<+h[8341]){if((c[16678]&1|0)==0){break L11209}if((c[16698]&1|0)==0){h[8341]=ae;break}$=+h[8350];if($>ae){h[8341]=$;break L11209}else{h[8341]=ae;break}}}while(0);if(ae>+h[8348]){h[8348]=ae}if(ae<=+h[8342]){break}if((c[16678]&2|0)==0){break}if((c[16699]&2|0)==0){h[8342]=ae;break}$=+h[8353];if($>2]=2}Y=Y+1|0;}while((Y|0)<(o|0))}c[(c[e>>2]|0)+8>>2]=o;Y=c[c[e>>2]>>2]|0;c[e>>2]=Y;if((Y|0)==0){ag=0}else{ag=c[Y+12>>2]|0}Y=V+1|0;if((Y|0)<(k|0)){f=ag;V=Y}else{ad=8276;break}}if((ad|0)==8211){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ad|0)==8204){uf(-1,211552,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ad|0)==8203){uh(-1,212704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);uf(-1,212032,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ad|0)==8276){i=q;return}}function i2(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0;c=+h[a+8>>3];d=+h[b+8>>3];if(c>d){e=1;return e|0}e=(c>31;return e|0}function i3(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0,L=0,M=0,N=0,O=0,P=0;b=i;i=i+32|0;d=b|0;e=b+16|0;if((a[30641]|0)!=100){i=b;return}f=c[12904]|0;g=c[6952]|0;do{if((f|0)>0&(g|0)!=0){j=g+(f*152&-1)|0;if((f|0)!=0){k=64664+((c[200]|0)*688&-1)|0;l=64664+((c[144]|0)*688&-1)|0;m=g;do{n=+h[k>>3];o=+h[91];p=+h[96];q=+h[l>>3];r=+h[21];s=+h[68];t=+h[5279];u=+h[2];v=+h[12];w=+h[405];x=+h[393];y=+h[397];z=+h[401];A=+h[406];B=+h[394];C=+h[398];D=+h[402];E=(+h[m+16>>3]-n)*o+p+-1.0;F=(+h[m+24>>3]-q)*r+s+-1.0;G=(+h[m+32>>3]-t)*u+v+-1.0;H=A+E*B+F*C+G*D;I=(w+E*x+F*y+G*z)/(H==0.0?1.0e-5:H);H=(+h[m+48>>3]-n)*o+p+-1.0;G=(+h[m+56>>3]-q)*r+s+-1.0;F=(+h[m+64>>3]-t)*u+v+-1.0;E=A+H*B+G*C+F*D;J=(w+H*x+G*y+F*z)/(E==0.0?1.0e-5:E);E=J>I?J:I;I=(+h[m+80>>3]-n)*o+p+-1.0;J=(+h[m+88>>3]-q)*r+s+-1.0;F=(+h[m+96>>3]-t)*u+v+-1.0;G=A+I*B+J*C+F*D;H=(w+I*x+J*y+F*z)/(G==0.0?1.0e-5:G);G=H>E?H:E;E=(+h[m+112>>3]-n)*o+p+-1.0;p=(+h[m+120>>3]-q)*r+s+-1.0;s=(+h[m+128>>3]-t)*u+v+-1.0;v=A+E*B+p*C+s*D;D=(w+E*x+p*y+s*z)/(v==0.0?1.0e-5:v);h[m+8>>3]=D>G?D:G;m=m+152|0;}while((m|0)!=(j|0))}bM(g|0,f|0,152,16);j=c[6952]|0;m=c[12904]|0;l=j+(m*152&-1)|0;if((m|0)!=0){m=d|0;k=d+8|0;K=d+4|0;L=e|0;M=e+4|0;N=e+8|0;O=j;do{G=+h[O>>3];do{if((a[54008]&1)==0){j=(c[3524]|0)+144|0;if((c[j>>2]|0)==0){break}c[m>>2]=5;h[k>>3]=G;c[K>>2]=0;cM[c[j>>2]&511](d)}else{j=(c[3524]|0)+144|0;if((c[j>>2]|0)==0){break}c[L>>2]=3;c[M>>2]=~~G;h[N>>3]=0.0;cM[c[j>>2]&511](e)}}while(0);if((c[7661]|0)<0){j=c[O+144>>2]|0;c[7654]=c[j>>2];c[30620>>2]=c[j+4>>2];c[30624>>2]=c[j+8>>2];c[30628>>2]=c[j+12>>2]}dy(O+16|0);O=O+152|0;}while((O|0)!=(l|0))}if((a[30641]|0)==100){P=c[6952]|0;break}else{i=b;return}}else{P=g}}while(0);if((P|0)!=0){uu(P)}c[6952]=0;c[18084]=0;c[12904]=0;i=b;return}function i4(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0.0,q=0,r=0.0,s=0.0,t=0,u=0.0,w=0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,C=0,D=0.0,E=0,F=0,G=0.0,H=0.0,I=0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0,U=0,V=0,W=0,X=0;g=i;j=d<<2;k=ut(j)|0;do{if((k|0)==0){gk();l=ut(j)|0;if((l|0)!=0){m=l;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=224016,v)|0)}else{m=k}}while(0);k=m;c[e>>2]=k;L11355:do{if((a[30641]|0)!=97|(b|0)==0){n=0}else{o=0.0;p=0.0;e=b;m=d;L11356:while(1){j=(c[e+8>>2]|0)-1|0;do{if((j|0)<1){q=m;r=p;s=o}else{l=e+12|0;t=0;while(1){if((t|0)>(j|0)){u=o;break}w=c[l>>2]|0;if((c[w+(t<<6)>>2]|0)==2){t=t+1|0}else{x=8314;break}}if((x|0)==8314){x=0;y=(+h[w+(t<<6)+8>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;z=(+h[w+(t<<6)+16>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;A=(0.0- +h[5279])*+h[2]+ +h[12]+-1.0;B=+h[406]+y*+h[394]+z*+h[398]+A*+h[402];u=(+h[405]+y*+h[393]+z*+h[397]+A*+h[401])/(B==0.0?1.0e-5:B)}C=j;while(1){if((C|0)<=(t|0)){D=p;break}E=c[l>>2]|0;if((c[E+(C<<6)>>2]|0)==2){C=C-1|0}else{x=8318;break}}if((x|0)==8318){x=0;B=(+h[E+(C<<6)+8>>3]- +h[64664+((c[200]|0)*688&-1)>>3])*+h[91]+ +h[96]+-1.0;A=(+h[E+(C<<6)+16>>3]- +h[64664+((c[144]|0)*688&-1)>>3])*+h[21]+ +h[68]+-1.0;z=(0.0- +h[5279])*+h[2]+ +h[12]+-1.0;y=+h[406]+B*+h[394]+A*+h[398]+z*+h[402];D=(+h[405]+B*+h[393]+A*+h[397]+z*+h[401])/(y==0.0?1.0e-5:y)}if(+(C-t|0)<=+(j|0)*.1){q=m;r=D;s=u;break}c[f>>2]=D<=u&1;if((m|0)<3){q=m;r=D;s=u;break}F=64664+((c[200]|0)*688&-1)|0;G=+h[91];H=+h[96];I=64664+((c[144]|0)*688&-1)|0;J=+h[21];K=+h[68];y=(0.0- +h[5279])*+h[2]+ +h[12]+-1.0;L=+h[405];M=+h[393];N=+h[397];O=y*+h[401];P=+h[406];Q=+h[394];R=+h[398];S=y*+h[402];l=m;while(1){T=l-2|0;U=e;while(1){V=c[U>>2]|0;if((V|0)!=0&(T|0)!=0){T=T-1|0;U=V}else{break}}L11379:do{if((V|0)!=0){U=c[V+8>>2]|0;if((U|0)==0){break}T=V+12|0;W=t;while(1){if((W|0)>=(U|0)){break L11379}X=c[T>>2]|0;if((c[X+(W<<6)>>2]|0)==2){W=W+1|0}else{break L11356}}}}while(0);T=l-1|0;if((T|0)<3){q=T;r=D;s=u;break}else{l=T}}}}while(0);j=c[e>>2]|0;if((j|0)==0){n=0;break L11355}else{o=s;p=r;e=j;m=q-1|0}}p=(+h[X+(W<<6)+8>>3]- +h[F>>3])*G+H+-1.0;o=(+h[X+(W<<6)+16>>3]- +h[I>>3])*J+K+-1.0;y=P+p*Q+o*R+S;n=(L+p*M+o*N+O)/(y==0.0?1.0e-5:y)<=u&1}}while(0);if((d|0)<=0){i=g;return}I=(n|0)==1;n=0;W=b;b=d;while(1){d=b-1|0;X=a[30641]|0;do{if((X<<24>>24|0)==97){if(I){c[k+(d<<2)>>2]=W;break}else{c[k+(n<<2)>>2]=W;break}}else if((X<<24>>24|0)==102){c[k+(d<<2)>>2]=W}else{c[k+(n<<2)>>2]=W}}while(0);if((d|0)<=0){break}n=n+1|0;W=c[W>>2]|0;b=d}i=g;return}function i5(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,$=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0.0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0,aA=0,aB=0,aC=0,aD=0,aE=0,aF=0,aG=0,aH=0,aI=0,aJ=0,aK=0,aL=0,aM=0,aN=0,aO=0,aP=0,aQ=0,aR=0.0,aS=0,aT=0,aU=0.0,aV=0,aW=0,aX=0,aY=0,aZ=0,a_=0,a$=0,a0=0,a1=0,a2=0,a3=0,a4=0,a5=0,a6=0,a7=0,a9=0,ba=0,bb=0.0,bc=0,bd=0,be=0,bf=0,bg=0,bh=0,bi=0,bj=0,bk=0,bl=0,bm=0.0,bn=0,bo=0,bp=0,bq=0.0,br=0.0,bs=0.0,bt=0.0,bu=0.0,bv=0.0,bw=0.0,bx=0.0,by=0.0,bz=0.0,bA=0.0,bB=0.0,bC=0.0,bD=0.0,bE=0.0,bF=0.0,bG=0.0,bH=0.0,bI=0.0,bJ=0.0,bK=0.0,bL=0.0,bM=0,bN=0.0,bO=0,bP=0.0,bQ=0.0,bR=0,bS=0,bT=0,bU=0.0,bV=0.0,bW=0.0,bX=0.0,bY=0.0,bZ=0.0,b_=0.0,b$=0.0,b0=0.0,b1=0.0,b2=0.0,b3=0.0,b4=0.0,b5=0,b6=0,b7=0,b8=0,b9=0.0,ca=0.0,cb=0.0,cc=0.0,cd=0.0,ce=0.0,cf=0.0,cg=0.0,ch=0.0,ci=0.0,cj=0.0,ck=0.0,cl=0.0,cm=0.0,cn=0.0,co=0.0,cp=0.0,cq=0.0,cr=0.0,cs=0.0,ct=0.0,cu=0.0,cv=0.0,cw=0.0,cx=0.0,cy=0.0,cz=0.0,cA=0,cB=0.0,cC=0,cD=0;d=i;i=i+224|0;e=d|0;f=d+16|0;g=d+32|0;j=d+48|0;k=d+64|0;l=d+80|0;m=d+88|0;n=d+96|0;o=b+264|0;p=(a[o]|0)==0?30632:o;o=a[p]|0;if(o<<24>>24==0){i=d;return}if((a[30641]|0)==100){q=o;r=8348}else{cM[c[(c[3524]|0)+168>>2]&511](12);o=a[p]|0;if(o<<24>>24!=0){q=o;r=8348}}L11410:do{if((r|0)==8348){o=n;s=b+239|0;t=b+64|0;u=t|0;w=b+72|0;x=b+24|0;y=k;z=k|0;A=k+4|0;B=b+260|0;C=b+252|0;D=g|0;E=g+8|0;F=g+4|0;G=j|0;H=j+4|0;I=j+8|0;J=n|0;K=n|0;L=n+8|0;M=n+32|0;N=n+40|0;R=n+64|0;S=n+72|0;T=n+96|0;U=n+104|0;V=n+16|0;W=n+48|0;X=n+80|0;Y=n+112|0;$=n+24|0;ab=n+56|0;ac=n+88|0;ad=n+120|0;ae=e|0;af=e+8|0;ag=e+4|0;ah=f|0;ai=f+4|0;aj=f+8|0;ak=0;al=q;L11412:while(1){am=al<<24>>24;c[l>>2]=0;an=a[s]|0;if((c[u>>2]|0)==3){ao=+h[w>>3]==-1.0&1}else{ao=0}a[54008]=ao;c[7644]=c[x>>2];c[7645]=c[x+4>>2];c[7646]=c[x+8>>2];c[7647]=c[x+12>>2];c[7648]=c[x+16>>2];c[7649]=c[x+20>>2];c[7650]=c[x+24>>2];c[7651]=c[x+28>>2];c[7652]=c[x+32>>2];c[7653]=c[x+36>>2];c[7654]=c[x+40>>2];c[7655]=c[x+44>>2];c[7656]=c[x+48>>2];c[7657]=c[x+52>>2];ap=c[7661]|0;if((ap|0)>0){lK(30576,ap)}c[y>>2]=c[7654];c[y+4>>2]=c[30620>>2];c[y+8>>2]=c[30624>>2];c[y+12>>2]=c[30628>>2];ap=c[7645]|0;do{if((c[7644]|0)!=0){aq=+h[3825];ar=c[(c[3524]|0)+92>>2]|0;if(aq<0.0){cK[ar&63](+h[3817]);break}else{cK[ar&63](aq);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[3824]);ar=c[(c[3524]|0)+64>>2]|0;if((ap|0)<-5){cM[ar&511](-2)}else{cM[ar&511](ap)}ar=c[3524]|0;do{if((a[30608]&1)==0){if((c[ar+96>>2]&1024|0)!=0){break}c[z>>2]=1;c[A>>2]=ap;r=8363}else{r=8363}}while(0);if((r|0)==8363){r=0;fn(k,ar)}do{if((am|0)==116|(am|0)==115|(am|0)==98){if((c[(c[3524]|0)+148>>2]|0)==0){break}if((am|0)==98){aq=+h[7076];h[Y>>3]=aq;h[X>>3]=aq;h[W>>3]=aq;h[V>>3]=aq}else if((am|0)==116){aq=+h[6915];h[Y>>3]=aq;h[X>>3]=aq;h[W>>3]=aq;h[V>>3]=aq}i4(c[B>>2]|0,c[C>>2]|0,m,l);ap=c[7664]|0;as=c[7665]|0;at=(ap|0)<1;au=(as|0)<1;do{if(at|au){av=(c[C>>2]|0)-1|0;if((av|0)>0){aw=c[m>>2]|0;ax=0;ay=0;az=0;while(1){aA=c[aw+(az<<2)>>2]|0;aB=c[aA+12>>2]|0;aC=c[aA+8>>2]|0;do{if((aC|0)>0){aA=0;aD=0;do{aA=((c[aB+(aD<<6)>>2]|0)==0&1)+aA|0;aD=aD+1|0;}while((aD|0)<(aC|0));if((aA|0)<=0){aE=ay;aF=ax;break}aE=ay+1|0;aF=(ax|0)>(aA|0)?ax:aA}else{aE=ay;aF=ax}}while(0);aC=az+1|0;if((aC|0)<(av|0)){ax=aF;ay=aE;az=aC}else{aG=aF;aH=aE;break}}}else{aG=0;aH=0}if(at){aI=~~(+O(+(+((((ap|0)==0?200:-ap|0)|0)/(aG|0)&-1|0)))+1.0)}else{aI=ap}if(!au){aJ=as;aK=aI;break}aJ=~~(+O(+(+((((as|0)==0?200:-as|0)|0)/(aH|0)&-1|0)))+1.0);aK=aI}else{aJ=as;aK=ap}}while(0);if((a[30641]|0)==100){if(((c[C>>2]|0)-1|0)>0){ap=c[m>>2]|0;as=(a[30640]|0)==0;au=0;while(1){at=au+1|0;az=c[(c[ap+(au<<2)>>2]|0)+8>>2]|0;ay=c[(c[ap+(at<<2)>>2]|0)+8>>2]|0;do{if(as){aL=ay;r=8387}else{if((az|0)==(ay|0)){aL=az;r=8387;break}aM=(((az|0)>(ay|0)?az:ay)-1|0)+(c[18084]|0)|0}}while(0);if((r|0)==8387){r=0;aM=((c[18084]|0)-1|0)+((az|0)<(aL|0)?az:aL)|0}c[18084]=aM;if((at|0)<((c[C>>2]|0)-1|0)){au=at}else{aN=aM;break}}}else{aN=c[18084]|0}au=aa(aa((aJ|0)>1?aJ:1,(aK|0)>1?aK:1),aN);c[18084]=au;c[6952]=db(c[6952]|0,au*152&-1,98184)|0}au=(aJ|0)>1;as=(aK|0)>1|au;do{if(as){ap=(aK<<2)+4|0;ay=ut(ap)|0;if((ay|0)==0){gk();ax=ut(ap)|0;if((ax|0)==0){r=8394;break L11412}else{aO=ax}}else{aO=ay}ay=aO;if((aK|0)<0){aP=ay;break}ax=(aJ<<5)+32|0;ap=0;while(1){av=ut(ax)|0;if((av|0)==0){gk();aw=ut(ax)|0;if((aw|0)==0){r=8399;break L11412}else{aQ=aw}}else{aQ=av}c[ay+(ap<<2)>>2]=aQ;av=ap+1|0;if((av|0)>(aK|0)){aP=ay;break}else{ap=av}}}else{aP=0}}while(0);ap=c[C>>2]|0;if((ap-1|0)>0){ay=c[m>>2]|0;ax=(aK|0)<2&(aJ|0)<2;at=an&1;az=at<<24>>24==0;av=as|al<<24>>24==115;aw=(aK|0)<0;aC=(aK|0)>0;aB=(aJ|0)>0;aq=+(aK|0);aD=at<<24>>24!=0;aR=+(aJ|0);at=(c[l>>2]|0)==0;aS=-999;aT=-999;aU=0.0;aV=0;aW=ap;while(1){ap=c[ay+(aV<<2)>>2]|0;aX=aV+1|0;aY=c[ay+(aX<<2)>>2]|0;aZ=c[ap+12>>2]|0;a_=c[aY+12>>2]|0;a$=a[30639]|0;if((a$<<24>>24|0)==114){a0=c[ap+8>>2]|0;a1=c[aY+8>>2]|0;a2=a0-a1|0;a3=(a2|0)>-1?a2:-a2|0;a4=a0;a5=a1}else if((a$<<24>>24|0)==99){a$=c[ap+8>>2]|0;a1=c[aY+8>>2]|0;a0=a$-a1|0;a3=(((a0|0)>-1?a0:-a0|0)|0)/2&-1;a4=a$;a5=a1}else{a3=0;a4=c[ap+8>>2]|0;a5=c[aY+8>>2]|0}a1=ap+8|0;ap=aY+8|0;aY=(a4|0)<(a5|0)?a4:a5;a$=aY-2|0;if((a[30640]|0)!=0&(a4|0)!=(a5|0)){a6=(a4|0)>(a5|0)?a4:a5;a7=a$+a3|0;a9=a3;ba=1}else{a6=aY;a7=aT;a9=aS;ba=0}aY=a6-1|0;if((aY|0)>0){a0=(1-a3|0)+a7|0;a2=ba?a3:0;bb=aU;bc=0;while(1){do{if(ba){if(!((bc|0)<(a9|0)|(bc|0)>(a7|0))){r=8416;break}bd=(bc|0)>(a9|0)?a0:0;be=bd;bf=bd;bg=bc}else{r=8416}}while(0);if((r|0)==8416){r=0;bd=bc-a2|0;if((a[30641]|0)==97){bh=at?bd:a$-bd|0}else{bh=bd}be=bh;bf=bh+1|0;bg=bh+a3|0}bd=bg+1|0;bi=(c[a1>>2]|0)>(c[ap>>2]|0);bj=bi?bf:bd;bk=bi?be:bg;bl=bi?bd:bf;bd=bi?bg:be;bi=c[aZ+(bd<<6)>>2]|0;do{if((a[30642]|0)==52){if((bi|0)!=0){bm=bb;break}if((c[aZ+(bl<<6)>>2]|0)!=0){bm=bb;break}if((c[a_+(bk<<6)>>2]|0)!=0){bm=bb;break}if((c[a_+(bj<<6)>>2]|0)==0){r=8429}else{bm=bb}}else{if((bi|0)==2){bm=bb;break}bn=c[aZ+(bl<<6)>>2]|0;if((bn|0)==2){bm=bb;break}bo=c[a_+(bk<<6)>>2]|0;if((bo|0)==2){bm=bb;break}bp=c[a_+(bj<<6)>>2]|0;if((bp|0)==2){bm=bb;break}if((bi|0)==1&(bn|0)==1&(bo|0)==1&(bp|0)==1){bm=bb}else{r=8429}}}while(0);do{if((r|0)==8429){r=0;bi=(a[30641]|0)==100;do{if(ax|bi){do{if(az){bq=+h[aZ+(bd<<6)+24>>3];bp=c[34]|0;bo=(a[64788+(bp*688&-1)|0]&1)==0;bn=(a[66852]&1)==0;L11530:do{if(bo){do{if(bn){br=bq}else{if(bq>0.0){bs=+_(+bq);br=bs/+h[8358];break}else{bt=+h[8341];r=8443;break L11530}}}while(0);bu=br;bv=+h[aZ+(bl<<6)+24>>3];r=8444}else{if(bn){bt=+Z(+(bq*+h[64800+(bp*688&-1)>>3]));r=8443;break}if(+h[64792+(bp*688&-1)>>3]==+h[8357]){bw=bq}else{bw=bq*+h[64800+(bp*688&-1)>>3]/+h[8358]}bx=bw;by=+h[aZ+(bl<<6)+24>>3];r=8445}}while(0);if((r|0)==8443){r=0;bq=+h[aZ+(bl<<6)+24>>3];if(bo){bu=bt;bv=bq;r=8444}else{bx=bt;by=bq;r=8445}}do{if((r|0)==8444){r=0;if(bn){bz=bv;bA=bu;break}if(bv>0.0){bq=+_(+bv);bz=bq/+h[8358];bA=bu;break}else{bz=+h[8341];bA=bu;break}}else if((r|0)==8445){r=0;if(bn){bz=+Z(+(by*+h[64800+(bp*688&-1)>>3]));bA=bx;break}if(+h[64792+(bp*688&-1)>>3]==+h[8357]){bz=by;bA=bx;break}bz=by*+h[64800+(bp*688&-1)>>3]/+h[8358];bA=bx}}while(0);bq=+h[a_+(bk<<6)+24>>3];L11559:do{if(bo){do{if(bn){bB=bq}else{if(bq>0.0){bs=+_(+bq);bB=bs/+h[8358];break}else{bC=+h[8341];r=8463;break L11559}}}while(0);bD=bB;bE=+h[a_+(bj<<6)+24>>3];r=8464}else{if(bn){bC=+Z(+(bq*+h[64800+(bp*688&-1)>>3]));r=8463;break}if(+h[64792+(bp*688&-1)>>3]==+h[8357]){bF=bq}else{bF=bq*+h[64800+(bp*688&-1)>>3]/+h[8358]}bG=bF;bH=+h[a_+(bj<<6)+24>>3];r=8465}}while(0);if((r|0)==8463){r=0;bq=+h[a_+(bj<<6)+24>>3];if(bo){bD=bC;bE=bq;r=8464}else{bG=bC;bH=bq;r=8465}}if((r|0)==8464){r=0;if(bn){bI=bE;bJ=bD;bK=bz;bL=bA;break}if(bE>0.0){bq=+_(+bE);bI=bq/+h[8358];bJ=bD;bK=bz;bL=bA;break}else{bI=+h[8341];bJ=bD;bK=bz;bL=bA;break}}else if((r|0)==8465){r=0;if(bn){bI=+Z(+(bH*+h[64800+(bp*688&-1)>>3]));bJ=bG;bK=bz;bL=bA;break}if(+h[64792+(bp*688&-1)>>3]==+h[8357]){bI=bH;bJ=bG;bK=bz;bL=bA;break}bI=bH*+h[64800+(bp*688&-1)>>3]/+h[8358];bJ=bG;bK=bz;bL=bA;break}}else{bI=+h[a_+(bj<<6)+32>>3];bJ=+h[a_+(bk<<6)+32>>3];bK=+h[aZ+(bl<<6)+32>>3];bL=+h[aZ+(bd<<6)+32>>3]}}while(0);bM=c[7663]|0;do{if((bM|0)==5){bq=bL*bK*bJ*bI;if(bq==0.0){bN=0.0;break}bs=+Q(+(+Q(+(+P(+bq)))));if(((((bK<0.0&1)+(bL<0.0&1)|0)+(bJ<0.0&1)|0)+(bI<0.0&1)|0)<3){bN=bs;break}bN=-0.0-bs}else if((bM|0)==6){bO=bL>bK;bs=bO?bK:bL;bq=bO?bL:bK;bO=bJ>bI;bP=bO?bI:bJ;bQ=bO?bJ:bI;bN=((bsbK?bL:bK;bQ=bJ>bI?bJ:bI;bN=bq>bQ?bq:bQ}else if((bM|0)==1){bN=bK}else if((bM|0)==2){bN=bJ}else if((bM|0)==3){bN=bI}else if((bM|0)==0){bN=bL}else{if((a[54008]&1)==0){bN=(bL+bK+bJ+bI)*.25;break}else{bO=~~bL;bR=~~bK;bS=~~bJ;bT=~~bI;bN=+(((((bR&16711680)+(bO&16711680)|0)+(bS&16711680)|0)+(bT&16711680)|0)>>>2&16711680|((((bR&65280)+(bO&65280)|0)+(bS&65280)|0)+(bT&65280)|0)>>>2&65280|((((bR&255)+(bO&255)|0)+(bS&255)|0)+(bT&255)|0)>>>2&255|0);break}}}while(0);bM=(a[54008]&1)==0;do{if(bM){bQ=+h[8341];if(bQ>=bN){bU=+((a[20668]|0)!=112&1|0);break}bq=+h[8342];if(bq<=bN){bU=+((a[20668]|0)==112&1|0);break}bs=(bN-bQ)/(bq-bQ);if((a[20668]|0)==112){bU=bs;break}bU=1.0-bs}else{bU=bN}}while(0);if(bi){bV=bU;break}if(bM){bT=(c[3524]|0)+144|0;if((c[bT>>2]|0)==0){bV=bU;break}c[D>>2]=5;h[E>>3]=bU;c[F>>2]=0;cM[c[bT>>2]&511](g);bV=bU;break}else{bT=(c[3524]|0)+144|0;if((c[bT>>2]|0)==0){bV=bU;break}c[G>>2]=3;c[H>>2]=~~bU;h[I>>3]=0.0;cM[c[bT>>2]&511](j);bV=bU;break}}else{bV=bb}}while(0);bs=+h[aZ+(bd<<6)+8>>3];h[K>>3]=bs;bQ=+h[aZ+(bd<<6)+16>>3];h[L>>3]=bQ;bq=+h[a_+(bk<<6)+8>>3];h[M>>3]=bq;bP=+h[a_+(bk<<6)+16>>3];h[N>>3]=bP;bW=+h[a_+(bj<<6)+8>>3];h[R>>3]=bW;bX=+h[a_+(bj<<6)+16>>3];h[S>>3]=bX;bY=+h[aZ+(bl<<6)+8>>3];h[T>>3]=bY;bZ=+h[aZ+(bl<<6)+16>>3];h[U>>3]=bZ;do{if(av){h[V>>3]=+h[aZ+(bd<<6)+24>>3];h[W>>3]=+h[a_+(bk<<6)+24>>3];h[X>>3]=+h[a_+(bj<<6)+24>>3];h[Y>>3]=+h[aZ+(bl<<6)+24>>3];if(az){break}h[$>>3]=+h[aZ+(bd<<6)+32>>3];h[ab>>3]=+h[a_+(bk<<6)+32>>3];h[ac>>3]=+h[a_+(bj<<6)+32>>3];h[ad>>3]=+h[aZ+(bl<<6)+32>>3]}}while(0);if(!as){if((a[30641]|0)==100){bi=c[6952]|0;aA=c[12904]|0;uD(bi+(aA*152&-1)+16|0,o|0,128);h[bi+(aA*152&-1)>>3]=bV;c[bi+(aA*152&-1)+144>>2]=t;c[12904]=(c[12904]|0)+1;bm=bV;break}else{dy(J);bm=bV;break}}if(!aw){b_=+h[Y>>3];b$=+h[V>>3];b0=+h[X>>3];b1=+h[W>>3];aA=0;do{b2=+(aA|0);bi=aP+(aA<<2)|0;h[c[bi>>2]>>3]=bs+b2*((bY-bs)/aq);h[(c[bi>>2]|0)+(aJ<<5)>>3]=bq+b2*((bW-bq)/aq);h[(c[bi>>2]|0)+8>>3]=bQ+b2*((bZ-bQ)/aq);h[(c[bi>>2]|0)+(aJ<<5)+8>>3]=bP+b2*((bX-bP)/aq);h[(c[bi>>2]|0)+16>>3]=b$+b2*((b_-b$)/aq);h[(c[bi>>2]|0)+(aJ<<5)+16>>3]=b1+b2*((b0-b1)/aq);if(aD){b3=+h[$>>3];h[(c[bi>>2]|0)+24>>3]=b3+b2*((+h[ad>>3]-b3)/aq);b3=+h[ab>>3];h[(c[bi>>2]|0)+(aJ<<5)+24>>3]=b3+b2*((+h[ac>>3]-b3)/aq)}if(au){bT=1;do{bS=c[bi>>2]|0;b3=+h[bS>>3];b2=+(bT|0);h[bS+(bT<<5)>>3]=b3+b2*((+h[bS+(aJ<<5)>>3]-b3)/aR);bS=c[bi>>2]|0;b3=+h[bS+8>>3];h[bS+(bT<<5)+8>>3]=b3+b2*((+h[bS+(aJ<<5)+8>>3]-b3)/aR);bS=c[bi>>2]|0;b3=+h[bS+16>>3];h[bS+(bT<<5)+16>>3]=b3+b2*((+h[bS+(aJ<<5)+16>>3]-b3)/aR);if(aD){bS=c[bi>>2]|0;b3=+h[bS+24>>3];h[bS+(bT<<5)+24>>3]=b3+b2*((+h[bS+(aJ<<5)+24>>3]-b3)/aR)}bT=bT+1|0;}while((bT|0)<(aJ|0))}aA=aA+1|0;}while((aA|0)<=(aK|0))}if(aC){b4=bV;b5=0}else{bm=bV;break}while(1){if(aB){aA=aP+(b5<<2)|0;bT=b5+1|0;bi=aP+(bT<<2)|0;bM=0;while(1){bS=c[aA>>2]|0;h[K>>3]=+h[bS+(bM<<5)>>3];h[L>>3]=+h[bS+(bM<<5)+8>>3];b1=+h[bS+(bM<<5)+16>>3];h[V>>3]=b1;bO=c[bi>>2]|0;h[M>>3]=+h[bO+(bM<<5)>>3];h[N>>3]=+h[bO+(bM<<5)+8>>3];b0=+h[bO+(bM<<5)+16>>3];h[W>>3]=b0;bR=bM+1|0;h[R>>3]=+h[bO+(bR<<5)>>3];h[S>>3]=+h[bO+(bR<<5)+8>>3];b$=+h[bO+(bR<<5)+16>>3];h[X>>3]=b$;h[T>>3]=+h[bS+(bR<<5)>>3];h[U>>3]=+h[bS+(bR<<5)+8>>3];b_=+h[bS+(bR<<5)+16>>3];h[Y>>3]=b_;L11652:do{if(az){b6=c[34]|0;b7=(a[64788+(b6*688&-1)|0]&1)==0;b8=(a[66852]&1)==0;do{if(b7){if(b8){b9=b_;ca=b$;cb=b0;cc=b1;break L11652}if(b1>0.0){bP=+_(+b1);cd=bP/+h[8358];r=8531;break}else{ce=+h[8341];r=8526;break}}else{if(b8){ce=+Z(+(b1*+h[64800+(b6*688&-1)>>3]));r=8526;break}bP=+h[64792+(b6*688&-1)>>3];bX=+h[8357];if(bP==bX){cf=b1;cg=bP;ch=bX;r=8534;break}cf=b1*+h[64800+(b6*688&-1)>>3]/+h[8358];cg=bP;ch=bX;r=8534}}while(0);do{if((r|0)==8526){r=0;if(b7){if(b8){b9=b_;ca=b$;cb=b0;cc=ce;break L11652}else{cd=ce;r=8531;break}}if(b8){ci=+Z(+(b0*+h[64800+(b6*688&-1)>>3]));cj=ce;r=8539;break}else{cf=ce;cg=+h[64792+(b6*688&-1)>>3];ch=+h[8357];r=8534;break}}}while(0);do{if((r|0)==8531){r=0;if(b0>0.0){bX=+_(+b0);ck=bX/+h[8358];cl=cd;r=8536;break}else{ck=+h[8341];cl=cd;r=8536;break}}else if((r|0)==8534){r=0;if(cg==ch){ck=b0;cl=cf;r=8536;break}ck=b0*+h[64800+(b6*688&-1)>>3]/+h[8358];cl=cf;r=8536}}while(0);do{if((r|0)==8536){r=0;if(!b7){if(b8){ci=ck;cj=cl;r=8539;break}bX=+h[64792+(b6*688&-1)>>3];bP=+h[8357];if(bX==bP){cm=b$;cn=cl;co=ck;cp=bX;cq=bP;r=8553;break}cm=b$*+h[64800+(b6*688&-1)>>3]/+h[8358];cn=cl;co=ck;cp=bX;cq=bP;r=8553;break}if(b8){b9=b_;ca=b$;cb=ck;cc=cl;break L11652}if(b$>0.0){bP=+_(+b$);cr=ck;cs=cl;ct=bP/+h[8358];break}else{cu=+h[8341];cv=cl;cw=ck;r=8545;break}}}while(0);if((r|0)==8539){r=0;cu=+Z(+(b$*+h[64800+(b6*688&-1)>>3]));cv=cj;cw=ci;r=8545}do{if((r|0)==8545){r=0;if(b7){if(b8){b9=b_;ca=cu;cb=cw;cc=cv;break L11652}else{cr=cw;cs=cv;ct=cu;break}}if(b8){b9=+Z(+(b_*+h[64800+(b6*688&-1)>>3]));ca=cu;cb=cw;cc=cv;break L11652}else{cm=cu;cn=cv;co=cw;cp=+h[64792+(b6*688&-1)>>3];cq=+h[8357];r=8553;break}}}while(0);if((r|0)==8553){r=0;if(cp==cq){b9=b_;ca=cm;cb=co;cc=cn;break}b9=b_*+h[64800+(b6*688&-1)>>3]/+h[8358];ca=cm;cb=co;cc=cn;break}if(b_>0.0){bP=+_(+b_);b9=bP/+h[8358];ca=ct;cb=cr;cc=cs;break}else{b9=+h[8341];ca=ct;cb=cr;cc=cs;break}}else{bP=+h[bS+(bM<<5)+24>>3];h[$>>3]=bP;bX=+h[bO+(bM<<5)+24>>3];h[ab>>3]=bX;bQ=+h[bO+(bR<<5)+24>>3];h[ac>>3]=bQ;bZ=+h[bS+(bR<<5)+24>>3];h[ad>>3]=bZ;b9=bZ;ca=bQ;cb=bX;cc=bP}}while(0);bS=c[7663]|0;do{if((bS|0)==4){cx=(cc+cb+ca+b9)*.25}else if((bS|0)==5){b_=cc*cb*ca*b9;if(b_==0.0){cx=0.0;break}b$=+Q(+(+Q(+(+P(+b_)))));if(((((cb<0.0&1)+(cc<0.0&1)|0)+(ca<0.0&1)|0)+(b9<0.0&1)|0)<3){cx=b$;break}cx=-0.0-b$}else if((bS|0)==6){bO=cc>cb;b$=bO?cb:cc;b_=bO?cc:cb;bO=ca>b9;b0=bO?b9:ca;b1=bO?ca:b9;cx=((b$cb?cc:cb;b1=ca>b9?ca:b9;cx=b_>b1?b_:b1}else if((bS|0)==1){cx=cb}else if((bS|0)==2){cx=ca}else if((bS|0)==3){cx=b9}else if((bS|0)==0){cx=cc}else{r=8566;break L11412}}while(0);bS=(a[54008]&1)==0;do{if(bS){b1=+h[8341];if(b1>=cx){cy=+((a[20668]|0)!=112&1|0);break}b_=+h[8342];if(b_<=cx){cy=+((a[20668]|0)==112&1|0);break}b$=(cx-b1)/(b_-b1);if((a[20668]|0)==112){cy=b$;break}cy=1.0-b$}else{cy=cx}}while(0);if((a[30641]|0)==100){bO=c[6952]|0;bp=c[12904]|0;uD(bO+(bp*152&-1)+16|0,o|0,128);h[bO+(bp*152&-1)>>3]=cy;c[bO+(bp*152&-1)+144>>2]=t;c[12904]=(c[12904]|0)+1}else{do{if(bS){bp=(c[3524]|0)+144|0;if((c[bp>>2]|0)==0){break}c[ae>>2]=5;h[af>>3]=cy;c[ag>>2]=0;cM[c[bp>>2]&511](e)}else{bp=(c[3524]|0)+144|0;if((c[bp>>2]|0)==0){break}c[ah>>2]=3;c[ai>>2]=~~cy;h[aj>>3]=0.0;cM[c[bp>>2]&511](f)}}while(0);dy(J)}if((bR|0)<(aJ|0)){bM=bR}else{cz=cy;cA=bT;break}}}else{cz=b4;cA=b5+1|0}if((cA|0)<(aK|0)){b4=cz;b5=cA}else{bm=cz;break}}}}while(0);bl=bc+1|0;if((bl|0)<(aY|0)){bb=bm;bc=bl}else{break}}cB=bm;cC=c[C>>2]|0}else{cB=aU;cC=aW}if((aX|0)<(cC-1|0)){aS=a9;aT=a7;aU=cB;aV=aX;aW=cC}else{break}}}if((aP|0)!=0){if((aK|0)>=0){aW=0;do{uu(c[aP+(aW<<2)>>2]|0);aW=aW+1|0;}while((aW|0)<=(aK|0))}uu(aP)}uu(c[m>>2]|0)}}while(0);ak=ak+1|0;al=a[p+ak|0]|0;if(al<<24>>24==0){break L11410}}if((r|0)==8394){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=92248,v)|0)}else if((r|0)==8399){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=84424,v)|0)}else if((r|0)==8566){uf(-1,76496,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);do{if((a8(p|0,67)|0)!=0){r=c[11690]|0;if((r&2|0)==0){cD=r}else{i7(b,2);cD=c[11690]|0}if((cD&1|0)==0){break}i7(b,1)}}while(0);if((a[30641]|0)==100){i=d;return}cM[c[(c[3524]|0)+168>>2]&511](13);i=d;return}function i6(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;e=c[10828]|0;f=c[10814]|0;g=c[10822]|0;a[31104]=1;if((c[7662]|0)==1){return}L11775:do{if((d|0)==1){if((f|0)==0){h=0;break}else{i=f}while(1){if((c[i+12>>2]|0)==400){j=8642;break}if((a[i+56|0]&1)!=0){if((c[i+64>>2]|0)>3){j=8637;break}}k=c[i+224>>2]|0;if((k|0)!=0){if(((c[k+72>>2]|0)-4|0)>>>0<3){j=8640;break}}k=c[i>>2]|0;if((k|0)==0){j=8614;break L11775}else{i=k}}if((j|0)==8637){return}else if((j|0)==8640){return}else if((j|0)==8642){return}}else{j=8614}}while(0);L11790:do{if((j|0)==8614){i=(d|0)==2;if(!i){h=0;break}if((b|0)>0){l=e;m=1}else{h=1;break}while(1){f=c[l+12>>2]|0;if((f|0)==352|(f|0)==400){j=8638;break}if((a[l+56|0]&1)!=0){if(((c[l+64>>2]|0)-1|0)>>>0>=3){j=8644;break}}f=c[l+224>>2]|0;if((f|0)!=0){if((c[f+72>>2]|0)>3){j=8645;break}}if((m|0)<(b|0)){l=c[l>>2]|0;m=m+1|0}else{h=i;break L11790}}if((j|0)==8638){return}else if((j|0)==8644){return}else if((j|0)==8645){return}}}while(0);L11807:do{if((g|0)!=0){j=g;while(1){if(((c[j+72>>2]|0)-4|0)>>>0<3){break}j=c[j>>2]|0;if((j|0)==0){break L11807}}return}}while(0);if(((c[1122]|0)-4|0)>>>0<3){return}if(((c[16632]|0)-4|0)>>>0<3){return}if(((c[16460]|0)-4|0)>>>0<3){return}if(((c[17320]|0)-4|0)>>>0<3){return}if(((c[17148]|0)-4|0)>>>0<3){return}do{if(h){if(((c[16288]|0)-4|0)>>>0>=3){break}return}}while(0);if(((c[16804]|0)-4|0)>>>0<3){return}a[31104]=0;return}function i7(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,w=0.0,x=0.0;e=i;i=i+16|0;f=e|0;g=(a[b+239|0]&1)==0;if((b|0)==0){i=e;return}j=c[b+256>>2]|0;if((j|0)==0){i=e;return}if((d-1|0)>>>0>1){i=e;return}if((c[(c[3524]|0)+148>>2]|0)==0){i=e;return}b=(d|0)==2;d=f|0;k=f+8|0;l=f+4|0;m=j;do{j=m+44|0;n=m+4|0;o=+h[(c[n>>2]|0)+24>>3];p=m+9|0;bD(135272,(v=i,i=i+24|0,c[v>>2]=c[j>>2],h[v+8>>3]=o,c[v+16>>2]=(p|0)==0?122416:p,v)|0);do{if((a[m+8|0]|0)!=0){bJ(14200);p=c[n>>2]|0;do{if(g){o=+h[p+24>>3];q=c[34]|0;r=(a[66852]&1)==0;do{if((a[64788+(q*688&-1)|0]&1)==0){if(r){s=o;break}if(o>0.0){t=+_(+o);s=t/+h[8358];break}else{s=+h[8341];break}}else{if(r){s=+Z(+(o*+h[64800+(q*688&-1)>>3]));break}if(+h[64792+(q*688&-1)>>3]==+h[8357]){s=o;break}s=o*+h[64800+(q*688&-1)>>3]/+h[8358]}}while(0);o=+h[8341];if(o>=s){u=+((a[20668]|0)!=112&1|0);break}t=+h[8342];if(t<=s){u=+((a[20668]|0)==112&1|0);break}w=(s-o)/(t-o);if((a[20668]|0)==112){u=w;break}u=1.0-w}else{w=+h[p+32>>3];o=+h[8341];if(o>=w){u=+((a[20668]|0)!=112&1|0);break}t=+h[8342];if(t<=w){u=+((a[20668]|0)==112&1|0);break}x=(w-o)/(t-o);if((a[20668]|0)==112){u=x;break}u=1.0-x}}while(0);p=(c[3524]|0)+144|0;if((c[p>>2]|0)==0){break}c[d>>2]=5;h[k>>3]=u;c[l>>2]=0;cM[c[p>>2]&511](f)}}while(0);p=c[j>>2]|0;q=c[n>>2]|0;if(b){dA(p,q)}else{dB(p,q,+h[7076])}m=c[m>>2]|0;}while((m|0)!=0);i=e;return}function i8(b){b=b|0;var d=0,e=0,f=0;d=i;e=c[c[10810]>>2]|0;if((e|0)==0){i=d;return}else{f=e}do{do{if((a[f+8|0]&1)==0){e=c[f+4>>2]|0;if((a_(e|0,167320,6)|0)==0){break}if((a_(e|0,126208,6)|0)==0){break}if((a_(e|0,133568,4)|0)==0){break}cf(b|0,126032,(v=i,i=i+8|0,c[v>>2]=e,v)|0);j5(b,f+16|0,1);aF(10,b|0)}}while(0);f=c[f>>2]|0;}while((f|0)!=0);i=d;return}function i9(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=c[13898]|0;if((d|0)>=(c[8272]|0)){ja();return 0}e=c[1054]|0;f=c[e+(d*40&-1)+36>>2]|0;L11906:do{if((a[e+(d*40&-1)|0]&1)!=0){g=e+(d*40&-1)+32|0;h=c[10036]|0;i=0;while(1){if((i|0)>=(f|0)){break}if((a[h+((c[g>>2]|0)+i|0)|0]|0)==(a[i+103664|0]|0)){i=i+1|0}else{break L11906}}if((i|0)!=1){break}ja();return 0}}while(0);if(f>>>0>6){ja();return 0}uD(b|0,(c[10036]|0)+(c[e+(d*40&-1)+32>>2]|0)|0,f);a[b+(c[(c[1054]|0)+((c[13898]|0)*40&-1)+36>>2]|0)|0]=0;f=b;while(1){b=a[f]|0;if((b<<24>>24|0)==0){j=8713;break}else if(!((b<<24>>24|0)==67|(b<<24>>24|0)==98|(b<<24>>24|0)==116|(b<<24>>24|0)==115)){j=8711;break}f=f+1|0}if((j|0)==8713){c[13898]=(c[13898]|0)+1;return 0}else if((j|0)==8711){ja();return 0}return 0}function ja(){uf(c[13898]|0,156480,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}function jb(b){b=b|0;var d=0,e=0,f=0,j=0.0,k=0,l=0,n=0,o=0,p=0,q=0.0,r=0,s=0.0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0.0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0.0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0,aA=0,aB=0,aC=0,aD=0,aE=0,aG=0,aH=0,aJ=0,aL=0,aM=0,aN=0,aO=0,aP=0,aQ=0,aR=0,aS=0,aT=0,aU=0,aV=0,aW=0,aX=0,aZ=0,a_=0;d=i;e=c[3524]|0;if((e|0)==0){aI(214736,23,1,b|0)}else{f=c[e>>2]|0;cf(b|0,215208,(v=i,i=i+16|0,c[v>>2]=f,c[v+8>>2]=13048,v)|0)}f=c[8244]|0;if((f|0)==0){aI(98152,13,1,b|0)}else{cf(b|0,105136,(v=i,i=i+8|0,c[v>>2]=f,v)|0)}f=(a[54160]&1)!=0?179864:213448;e=(a[54152]&1)!=0?179864:213448;j=+h[7077];k=(c[14156]|0)==0?150704:150856;cf(b|0,214064,(v=i,i=i+40|0,c[v>>2]=(a[54144]&1)!=0?179864:213448,c[v+8>>2]=f,c[v+16>>2]=e,h[v+24>>3]=j,c[v+32>>2]=k,v)|0);k=c[11692]|0;if((k|0)==0){aI(212312,13,1,b|0);l=0}else{e=(c[14088]|0)==0?150704:150856;cf(b|0,212872,(v=i,i=i+16|0,c[v>>2]=k,c[v+8>>2]=e,v)|0);ji(b,56296,0);aF(10,b|0);l=0}L11936:while(1){do{if((l|0)!=4){e=64813+(l*688&-1)|0;if((a[e]|0)!=0){k=56832+(l*24&-1)|0;f=j3(e)|0;cf(b|0,211776,(v=i,i=i+16|0,c[v>>2]=k,c[v+8>>2]=f,v)|0)}if((l|0)==3){break}f=56832+(l*24&-1)|0;k=(c[64808+(l*688&-1)>>2]|0)==1?141856:179864;cf(b|0,211344,(v=i,i=i+16|0,c[v>>2]=f,c[v+8>>2]=k,v)|0);k=l+1|0;if((k|0)<7){l=k;continue L11936}else{break L11936}}}while(0);l=l+1|0}j=+h[7030];if(j<0.0){aI(210168,13,1,b|0)}else{l=(a[56232]&1)!=0?106640:106608;cf(b|0,209528,(v=i,i=i+16|0,h[v>>3]=j,c[v+8>>2]=l,v)|0)}aI(207904,15,1,b|0);jf(b,49488);l=c[12292]|0;if((l|0)>0){n=150856}else{n=(l|0)<0?121920:150704}cf(b|0,207056,(v=i,i=i+8|0,c[v>>2]=n,v)|0);if((a[49240]&1)==0){n=(c[12303]|0)+1|0;cf(b|0,121528,(v=i,i=i+8|0,c[v>>2]=n,v)|0)}else{jg(b,49248)}aI(220776,11,1,b|0);jf(b,49176);aI(206464,24,1,b|0);n=c[12738]|0;if((n|0)==0){o=179864}else{o=c[53424+(n<<2)>>2]|0}j=+h[6371];l=c[12739]|0;if((l|0)==(n|0)){p=179864}else{p=c[53424+(l<<2)>>2]|0}q=+h[6372];n=c[12740]|0;if((n|0)==(l|0)){r=179864}else{r=c[53424+(n<<2)>>2]|0}s=+h[6373];cf(b|0,215704,(v=i,i=i+48|0,c[v>>2]=o,h[v+8>>3]=j,c[v+16>>2]=p,h[v+24>>3]=q,c[v+32>>2]=r,h[v+40>>3]=s,v)|0);aI(205664,2,1,b|0);aI(205016,23,1,b|0);r=c[12418]|0;if((r|0)==0){t=179864}else{t=c[53424+(r<<2)>>2]|0}s=+h[6211];p=c[12419]|0;if((p|0)==(r|0)){u=179864}else{u=c[53424+(p<<2)>>2]|0}q=+h[6212];r=c[12420]|0;if((r|0)==(p|0)){w=179864}else{w=c[53424+(r<<2)>>2]|0}j=+h[6213];cf(b|0,215704,(v=i,i=i+48|0,c[v>>2]=t,h[v+8>>3]=s,c[v+16>>2]=u,h[v+24>>3]=q,c[v+32>>2]=w,h[v+40>>3]=j,v)|0);cf(b|0,204656,(v=i,i=i+8|0,h[v>>3]=+h[6214],v)|0);aI(204408,6,1,b|0);w=c[12406]|0;if((w|0)==0){aI(204112,3,1,b|0)}else if((w|0)==1){aI(203864,3,1,b|0)}else if((w|0)==2){aI(203656,3,1,b|0)}do{if((a[47032]&1)!=0){w=c[11752]|0;if((w|0)==1){u=c[11732]|0;t=c[11756]|0;r=c[11734]|0;cf(b|0,203400,(v=i,i=i+24|0,c[v>>2]=u,c[v+8>>2]=t,c[v+16>>2]=r,v)|0);break}r=c[11732]|0;t=c[11756]|0;if((w|0)==2){cf(b|0,203056,(v=i,i=i+16|0,c[v>>2]=r,c[v+8>>2]=t,v)|0);break}else{x=-1}while(1){u=x+1|0;if((u|0)==7){y=0;break}if((c[46948+(u<<3)>>2]|0)==(w|0)){y=c[46944+(u<<3)>>2]|0;break}else{x=u}}w=(a[47016]&1)!=0?202360:179864;j=+h[5865];q=+h[5864];cf(b|0,202800,(v=i,i=i+48|0,c[v>>2]=r,c[v+8>>2]=t,c[v+16>>2]=y,c[v+24>>2]=w,h[v+32>>3]=j,h[v+40>>3]=q,v)|0)}}while(0);cf(b|0,201728,(v=i,i=i+16|0,c[v>>2]=24544,c[v+8>>2]=24595,v)|0);y=j3(66240)|0;cf(b|0,201048,(v=i,i=i+16|0,c[v>>2]=56880,c[v+8>>2]=y,v)|0);y=j3(65552)|0;cf(b|0,201048,(v=i,i=i+16|0,c[v>>2]=56856,c[v+8>>2]=y,v)|0);y=j3(68992)|0;cf(b|0,201048,(v=i,i=i+16|0,c[v>>2]=56976,c[v+8>>2]=y,v)|0);y=j3(68304)|0;cf(b|0,201048,(v=i,i=i+16|0,c[v>>2]=56952,c[v+8>>2]=y,v)|0);y=j3(64864)|0;cf(b|0,201048,(v=i,i=i+16|0,c[v>>2]=56832,c[v+8>>2]=y,v)|0);y=j3(66928)|0;cf(b|0,201048,(v=i,i=i+16|0,c[v>>2]=56904,c[v+8>>2]=y,v)|0);y=j3(69680)|0;cf(b|0,201048,(v=i,i=i+16|0,c[v>>2]=57e3,c[v+8>>2]=y,v)|0);cf(b|0,200232,(v=i,i=i+8|0,c[v>>2]=+h[9040]==1.0?124080:123976,v)|0);y=c[10026]|0;if((y|0)>-1){x=(y|0)==0?150704:150856;cf(b|0,198776,(v=i,i=i+8|0,c[v>>2]=x,v)|0);z=0}else{z=0}while(1){if(z>>>0>=8){A=8770;break}if((a[65036+(z*688&-1)|0]&1)!=0){A=8771;break}if((a[65037+(z*688&-1)|0]&1)==0){z=z+1|0}else{A=8771;break}}if((A|0)==8770){aI(198368,11,1,b|0)}else if((A|0)==8771){q=+h[3815];if(q!=0.0){j=q/+h[9040];cf(b|0,197920,(v=i,i=i+8|0,h[v>>3]=j,v)|0)}else{aI(197464,17,1,b|0)}aI(196824,8,1,b|0);z=(a[66413]&1)!=0?179864:136208;cf(b|0,196192,(v=i,i=i+32|0,c[v>>2]=(a[66412]&1)!=0?179864:136208,c[v+8>>2]=56880,c[v+16>>2]=z,c[v+24>>2]=56880,v)|0);z=(a[65725]&1)!=0?179864:136208;cf(b|0,196192,(v=i,i=i+32|0,c[v>>2]=(a[65724]&1)!=0?179864:136208,c[v+8>>2]=56856,c[v+16>>2]=z,c[v+24>>2]=56856,v)|0);z=(a[65037]&1)!=0?179864:136208;cf(b|0,196192,(v=i,i=i+32|0,c[v>>2]=(a[65036]&1)!=0?179864:136208,c[v+8>>2]=56832,c[v+16>>2]=z,c[v+24>>2]=56832,v)|0);aI(195696,3,1,b|0);z=(a[69165]&1)!=0?179864:136208;cf(b|0,196192,(v=i,i=i+32|0,c[v>>2]=(a[69164]&1)!=0?179864:136208,c[v+8>>2]=56976,c[v+16>>2]=z,c[v+24>>2]=56976,v)|0);z=(a[68477]&1)!=0?179864:136208;cf(b|0,196192,(v=i,i=i+32|0,c[v>>2]=(a[68476]&1)!=0?179864:136208,c[v+8>>2]=56952,c[v+16>>2]=z,c[v+24>>2]=56952,v)|0);z=(a[67101]&1)!=0?179864:136208;cf(b|0,196192,(v=i,i=i+32|0,c[v>>2]=(a[67100]&1)!=0?179864:136208,c[v+8>>2]=56904,c[v+16>>2]=z,c[v+24>>2]=56904,v)|0);aF(10,b|0);z=c[10026]|0;if((z|0)==-1){B=193464}else{B=(z|0)==0?150704:150856}cf(b|0,193936,(v=i,i=i+8|0,c[v>>2]=B,v)|0);ji(b,40048,0);aI(86120,2,1,b|0);ji(b,34776,0);aF(10,b|0)}cf(b|0,188584,(v=i,i=i+8|0,c[v>>2]=(a[27776]&1)!=0?179864:213448,v)|0);B=j3(36288)|0;cf(b|0,187184,(v=i,i=i+8|0,c[v>>2]=B,v)|0);B=c[9329]|0;if((B|0)!=0){cf(b|0,126104,(v=i,i=i+8|0,c[v>>2]=B,v)|0)}B=c[9330]|0;if(!((B|0)==1&(c[9331]|0)==-2|(B|0)==0)){aI(145280,10,1,b|0);jg(b,37320)}aF(10,b|0);aI(186104,8,1,b|0);B=c[9031]|0;do{if((B|0)==0){aI(185592,6,1,b|0);A=8796}else if((B|0)==1){aI(185072,7,1,b|0);A=8796}else if((B|0)==2){z=c[9032]|0;if((z|0)==0){aI(184712,7,1,b|0);A=8796;break}else if((z|0)==1){aI(184336,7,1,b|0);A=8796;break}else if((z|0)==2){aI(183952,7,1,b|0);A=8796;break}else if((z|0)==3){aI(183592,7,1,b|0);A=8796;break}else{A=8796;break}}else if((B|0)==3){aI(183128,3,1,b|0);z=c[9034]|0;if((z|0)==0){C=179864}else{C=c[53424+(z<<2)>>2]|0}j=+h[4519];x=c[9035]|0;if((x|0)==(z|0)){D=179864}else{D=c[53424+(x<<2)>>2]|0}q=+h[4520];z=c[9036]|0;if((z|0)==(x|0)){E=179864}else{E=c[53424+(z<<2)>>2]|0}s=+h[4521];cf(b|0,215704,(v=i,i=i+48|0,c[v>>2]=C,h[v+8>>3]=j,c[v+16>>2]=D,h[v+24>>3]=q,c[v+32>>2]=E,h[v+40>>3]=s,v)|0);A=8796}else{A=8798}}while(0);do{if((A|0)==8796){if((c[9031]|0)!=2){A=8798;break}if(((c[9032]|0)-2|0)>>>0>=2){A=8798}}}while(0);do{if((A|0)==8798){E=c[9045]|0;if((E|0)==2){aI(131280,6,1,b|0);break}else if((E|0)==0){aI(131440,5,1,b|0);break}else if((E|0)==1){aI(131216,7,1,b|0);break}else{break}}}while(0);do{if(!((c[9031]|0)==2&(c[9032]|0)>>>0<2)){E=c[9044]|0;if((E|0)==0){aI(180360,4,1,b|0);break}else if((E|0)==2){aI(179904,7,1,b|0);break}else if((E|0)==1){aI(131216,7,1,b|0);break}else{break}}}while(0);E=(c[9046]|0)==0?178184:164216;D=(a[36229]&1)!=0?179864:136208;C=(a[36231]&1)!=0?179864:136208;B=c[9056]|0;if((B|0)==2){F=177584}else{F=(B|0)==1?177096:176744}cf(b|0,179568,(v=i,i=i+40|0,c[v>>2]=(c[9047]|0)==0?179176:178608,c[v+8>>2]=E,c[v+16>>2]=D,c[v+24>>2]=C,c[v+32>>2]=F,v)|0);if((c[9059]|0)>-3){aI(99520,3,1,b|0);ji(b,36232,0)}else{aI(175760,5,1,b|0)}s=+h[4524];q=+h[4525];j=+h[4526];G=+h[4527];cf(b|0,175416,(v=i,i=i+40|0,c[v>>2]=(a[36230]&1)!=0?179864:136208,h[v+8>>3]=s,h[v+16>>3]=q,h[v+24>>3]=j,h[v+32>>3]=G,v)|0);F=c[9339]|0;cf(b|0,174936,(v=i,i=i+16|0,c[v>>2]=c[9338],c[v+8>>2]=F,v)|0);aF(10,b|0);cf(b|0,174656,(v=i,i=i+8|0,c[v>>2]=(a[36228]&1)!=0?179864:136208,v)|0);if((a[36120]&1)==0){aI(174304,10,1,b|0)}aI(173712,12,1,b|0);F=c[10822]|0;if((F|0)!=0){C=F;do{F=c[C+4>>2]|0;D=j3(c[C+60>>2]|0)|0;cf(b|0,173208,(v=i,i=i+16|0,c[v>>2]=F,c[v+8>>2]=D,v)|0);D=c[C+8>>2]|0;if((D|0)==0){H=179864}else{H=c[53424+(D<<2)>>2]|0}G=+h[C+24>>3];F=c[C+12>>2]|0;if((F|0)==(D|0)){I=179864}else{I=c[53424+(F<<2)>>2]|0}j=+h[C+32>>3];D=c[C+16>>2]|0;if((D|0)==(F|0)){J=179864}else{J=c[53424+(D<<2)>>2]|0}q=+h[C+40>>3];cf(b|0,215704,(v=i,i=i+48|0,c[v>>2]=H,h[v+8>>3]=G,c[v+16>>2]=I,h[v+24>>3]=j,c[v+32>>2]=J,h[v+40>>3]=q,v)|0);D=c[C+48>>2]|0;if((D|0)==0){aI(131440,5,1,b|0)}else if((D|0)==1){aI(126448,7,1,b|0)}else if((D|0)==2){aI(131280,6,1,b|0)}D=c[C+52>>2]|0;if((D|0)==0){aI(90568,9,1,b|0)}else{cf(b|0,172464,(v=i,i=i+8|0,c[v>>2]=D,v)|0)}D=c[C+64>>2]|0;if((D|0)!=0){cf(b|0,126104,(v=i,i=i+8|0,c[v>>2]=D,v)|0)}cf(b|0,124744,(v=i,i=i+8|0,c[v>>2]=(c[C+56>>2]|0)==0?150704:150856,v)|0);if((a[C+184|0]&1)!=0){aI(199048,11,1,b|0)}D=C+72|0;if((c[D>>2]|0)!=0){aI(145280,10,1,b|0);jg(b,D)}D=C+88|0;if((c[D>>2]|0)==0){aI(126e3,8,1,b|0)}else{aI(170816,6,1,b|0);ji(b,D,1)}aI(216256,8,1,b|0);D=c[C+144>>2]|0;if((D|0)==0){K=179864}else{K=c[53424+(D<<2)>>2]|0}q=+h[C+160>>3];F=c[C+148>>2]|0;if((F|0)==(D|0)){L=179864}else{L=c[53424+(F<<2)>>2]|0}j=+h[C+168>>3];D=c[C+152>>2]|0;if((D|0)==(F|0)){M=179864}else{M=c[53424+(D<<2)>>2]|0}G=+h[C+176>>3];cf(b|0,215704,(v=i,i=i+48|0,c[v>>2]=K,h[v+8>>3]=q,c[v+16>>2]=L,h[v+24>>3]=j,c[v+32>>2]=M,h[v+40>>3]=G,v)|0);aF(10,b|0);C=c[C>>2]|0;}while((C|0)!=0)}aI(170408,12,1,b|0);C=c[10826]|0;if((C|0)!=0){M=C;do{cf(b|0,170056,(v=i,i=i+8|0,c[v>>2]=c[M+4>>2],v)|0);C=c[M+8>>2]|0;if((C|0)==0){N=179864}else{N=c[53424+(C<<2)>>2]|0}G=+h[M+24>>3];L=c[M+12>>2]|0;if((L|0)==(C|0)){O=179864}else{O=c[53424+(L<<2)>>2]|0}j=+h[M+32>>3];C=c[M+16>>2]|0;if((C|0)==(L|0)){P=179864}else{P=c[53424+(C<<2)>>2]|0}q=+h[M+40>>3];cf(b|0,215704,(v=i,i=i+48|0,c[v>>2]=N,h[v+8>>3]=G,c[v+16>>2]=O,h[v+24>>3]=j,c[v+32>>2]=P,h[v+40>>3]=q,v)|0);aK(((a[M+88|0]&1)!=0?127520:127448)|0,b|0);C=c[M+48>>2]|0;if((C|0)==0){Q=179864}else{Q=c[53424+(C<<2)>>2]|0}q=+h[M+64>>3];L=c[M+52>>2]|0;if((L|0)==(C|0)){R=179864}else{R=c[53424+(L<<2)>>2]|0}j=+h[M+72>>3];C=c[M+56>>2]|0;if((C|0)==(L|0)){S=179864}else{S=c[53424+(C<<2)>>2]|0}G=+h[M+80>>3];cf(b|0,215704,(v=i,i=i+48|0,c[v>>2]=Q,h[v+8>>3]=q,c[v+16>>2]=R,h[v+24>>3]=j,c[v+32>>2]=S,h[v+40>>3]=G,v)|0);C=(c[M+100>>2]|0)==0?150704:150856;L=c[M+200>>2]|0;if((L|0)==2){T=128e3}else{T=(L|0)==1?127904:127768}cf(b|0,169144,(v=i,i=i+24|0,c[v>>2]=c[72304+(c[M+160>>2]<<2)>>2],c[v+8>>2]=C,c[v+16>>2]=T,v)|0);ji(b,M+104|0,0);G=+h[M+168>>3];if(G>0.0){C=c[25376+(c[M+176>>2]<<2)>>2]|0;j=+h[M+184>>3];q=+h[M+192>>3];cf(b|0,165352,(v=i,i=i+32|0,c[v>>2]=C,h[v+8>>3]=G,h[v+16>>3]=j,h[v+24>>3]=q,v)|0)}aF(10,b|0);M=c[M>>2]|0;}while((M|0)!=0)}cf(b|0,164920,(v=i,i=i+8|0,c[v>>2]=(a[30080]&1)!=0?164520:126024,v)|0);aI(164048,17,1,b|0);M=c[10820]|0;if((M|0)!=0){T=M;do{cf(b|0,163384,(v=i,i=i+8|0,c[v>>2]=c[T+4>>2],v)|0);ji(b,T+8|0,1);aF(10,b|0);T=c[T>>2]|0;}while((T|0)!=0)}aI(162896,18,1,b|0);T=c[10824]|0;if((T|0)!=0){M=T;do{cf(b|0,162248,(v=i,i=i+8|0,c[v>>2]=c[M+4>>2],v)|0);T=(c[M+12>>2]|0)==0?150704:150856;S=c[M+112>>2]|0;if((S|0)==2){U=128e3}else{U=(S|0)==1?127904:127768}cf(b|0,169144,(v=i,i=i+24|0,c[v>>2]=c[72304+(c[M+72>>2]<<2)>>2],c[v+8>>2]=T,c[v+16>>2]=U,v)|0);ji(b,M+16|0,0);q=+h[M+80>>3];if(q>0.0){T=c[25376+(c[M+88>>2]<<2)>>2]|0;j=+h[M+96>>3];G=+h[M+104>>3];cf(b|0,165352,(v=i,i=i+32|0,c[v>>2]=T,h[v+8>>3]=q,h[v+16>>3]=j,h[v+24>>3]=G,v)|0)}aF(10,b|0);M=c[M>>2]|0;}while((M|0)!=0)}aI(159152,20,1,b|0);M=c[9670]|0;if((M|0)==4){U=c[9671]|0;G=+h[4840];cf(b|0,158040,(v=i,i=i+16|0,c[v>>2]=U,h[v+8>>3]=G,v)|0)}else if((M|0)==1){aI(156128,11,1,b|0)}else if((M|0)==2){aI(155064,14,1,b|0)}else{cf(b|0,158640,(v=i,i=i+8|0,c[v>>2]=c[9671],v)|0)}aI(154704,6,1,b|0);aI(216256,8,1,b|0);M=c[9720]|0;if((M|0)==0){V=179864}else{V=c[53424+(M<<2)>>2]|0}G=+h[4862];U=c[9721]|0;if((U|0)==(M|0)){W=179864}else{W=c[53424+(U<<2)>>2]|0}j=+h[4863];M=c[9722]|0;if((M|0)==(U|0)){X=179864}else{X=c[53424+(M<<2)>>2]|0}q=+h[4864];cf(b|0,215704,(v=i,i=i+48|0,c[v>>2]=V,h[v+8>>3]=G,c[v+16>>2]=W,h[v+24>>3]=j,c[v+32>>2]=X,h[v+40>>3]=q,v)|0);aF(10,b|0);jj(b,0);aI(154408,15,1,b|0);if((a[66164]&1)!=0){q=+h[8271];cf(b|0,154056,(v=i,i=i+16|0,c[v>>2]=56880,h[v+8>>3]=q,v)|0)}if((a[65476]&1)!=0){q=+h[8185];cf(b|0,154056,(v=i,i=i+16|0,c[v>>2]=56856,h[v+8>>3]=q,v)|0)}if((a[68916]&1)!=0){q=+h[8615];cf(b|0,154056,(v=i,i=i+16|0,c[v>>2]=56976,h[v+8>>3]=q,v)|0)}if((a[68228]&1)!=0){q=+h[8529];cf(b|0,154056,(v=i,i=i+16|0,c[v>>2]=56952,h[v+8>>3]=q,v)|0)}if((a[64788]&1)!=0){q=+h[8099];cf(b|0,154056,(v=i,i=i+16|0,c[v>>2]=56832,h[v+8>>3]=q,v)|0)}if((a[66852]&1)!=0){q=+h[8357];cf(b|0,154056,(v=i,i=i+16|0,c[v>>2]=56904,h[v+8>>3]=q,v)|0)}if((a[69604]&1)!=0){q=+h[8701];cf(b|0,154056,(v=i,i=i+16|0,c[v>>2]=57e3,h[v+8>>3]=q,v)|0)}X=(c[8764]|0)==2?88392:179864;q=+h[4384];W=(c[6588]|0)==2?88392:179864;j=+h[3296];V=(c[1057]|0)==2?88392:179864;G=+h[531];M=(c[14091]|0)==2?88392:179864;s=+h[7048];cf(b|0,89120,(v=i,i=i+72|0,c[v>>2]=153688,c[v+8>>2]=X,h[v+16>>3]=q,c[v+24>>2]=W,h[v+32>>3]=j,c[v+40>>2]=V,h[v+48>>3]=G,c[v+56>>2]=M,h[v+64>>3]=s,v)|0);s=+h[3818];M=c[44936+(c[11252]<<2)>>2]|0;V=(a[30528]&1)!=0?179864:213448;W=(a[32936]&1)!=0?179864:213448;cf(b|0,153216,(v=i,i=i+40|0,h[v>>3]=+h[3817],h[v+8>>3]=s,c[v+16>>2]=M,c[v+24>>2]=V,c[v+32>>2]=W,v)|0);W=c[8270]|0;if((W|0)!=0){cf(b|0,152808,(v=i,i=i+8|0,c[v>>2]=W,v)|0)}W=c[12886]|0;if((W|0)==0){Y=0}else{cf(b|0,152408,(v=i,i=i+8|0,c[v>>2]=W,v)|0);Y=(c[12886]|0)!=0}if(!((c[8270]|0)!=0|Y)){aI(152040,18,1,b|0)}aI(151856,9,1,b|0);if((c[5094]|0)==1){aI(134552,3,1,b|0)}else{s=+g[3538];G=+g[3536];j=+g[3534];q=+g[3532];cf(b|0,151408,(v=i,i=i+32|0,h[v>>3]=s,h[v+8>>3]=G,h[v+16>>3]=j,h[v+24>>3]=q,v)|0)}Y=c[18072]|0;if((Y|0)==2){Z=150928;A=8906}else if((Y|0)!=0){Z=(Y|0)==3?150776:179864;A=8906}if((A|0)==8906){cf(b|0,151136,(v=i,i=i+8|0,c[v>>2]=Z,v)|0)}Z=c[6350]|0;A=c[9344]|0;Y=c[9342]|0;W=(a[46752]&1)!=0?179864:213448;V=(c[11690]|0)!=0?179864:213448;cf(b|0,150608,(v=i,i=i+48|0,c[v>>2]=c[6352],c[v+8>>2]=Z,c[v+16>>2]=A,c[v+24>>2]=Y,c[v+32>>2]=W,c[v+40>>2]=V,v)|0);V=c[11690]|0;if((V|0)==0){aF(10,b|0)}else if((V|0)==1){aI(150432,6,1,b|0)}else if((V|0)==2){aI(150288,9,1,b|0)}else if((V|0)==3){aI(150104,6,1,b|0)}if((a[35888]&1)==0){aI(149752,13,1,b|0)}else{cf(b|0,149912,(v=i,i=i+8|0,c[v>>2]=53520,v)|0)}if((a[43472]&1)!=0){aI(149592,11,1,b|0)}aI(149400,12,1,b|0);V=c[8732]|0;if((V|0)==1){aI(113784,10,1,b|0)}else if((V|0)==2){aI(113712,12,1,b|0)}else{aI(113904,10,1,b|0)}V=c[8528]|0;if((V|0)!=0){cf(b|0,148496,(v=i,i=i+8|0,c[v>>2]=V,v)|0)}V=a[47120]|0;if(V<<24>>24==0){aI(148224,34,1,b|0)}else{W=V<<24>>24;cf(b|0,148416,(v=i,i=i+8|0,c[v>>2]=W,v)|0)}W=c[11948]|0;if((aY(W|0,199184)|0)!=0){cf(b|0,147856,(v=i,i=i+8|0,c[v>>2]=W,v)|0)}if((a[47712]&1)!=0){aI(147600,21,1,b|0)}if((a[47472]&1)!=0){aI(147320,24,1,b|0)}if((a[38984]&1)==0){aI(197656,15,1,b|0)}else{W=(c[9744]|0)==0?150704:150856;V=c[9742]|0;Y=c[9734]|0;A=c[9738]|0;Z=a[38944]|0?136208:179864;M=a[38960]|0?136208:179864;cf(b|0,186344,(v=i,i=i+48|0,c[v>>2]=W,c[v+8>>2]=V,c[v+16>>2]=Y,c[v+24>>2]=A,c[v+32>>2]=Z,c[v+40>>2]=M,v)|0)}cf(b|0,147064,(v=i,i=i+8|0,c[v>>2]=c[13368],v)|0);aI(146824,14,1,b|0);M=c[13378]|0;if((M|0)==0){aI(146624,7,1,b|0)}else if((M|0)==1){aI(146456,12,1,b|0)}else if((M|0)==2){aI(146264,8,1,b|0)}aI(146096,21,1,b|0);M=c[13372]|0;if((M|0)==0){Z=c[13374]|0;cf(b|0,145944,(v=i,i=i+8|0,c[v>>2]=Z,v)|0)}else if((M|0)==1){Z=c[11662]|0;q=+h[Z>>3];j=+h[Z+8>>3];G=q+j*+(c[13374]|0);cf(b|0,145704,(v=i,i=i+24|0,h[v>>3]=q,h[v+8>>3]=j,h[v+16>>3]=G,v)|0)}else if((M|0)==2){cf(b|0,145496,(v=i,i=i+8|0,h[v>>3]=+h[c[11662]>>3],v)|0);if((c[13374]|0)>1){M=1;do{cf(b|0,107648,(v=i,i=i+8|0,h[v>>3]=+h[(c[11662]|0)+(M<<3)>>3],v)|0);M=M+1|0;}while((M|0)<(c[13374]|0))}aF(10,b|0)}G=+g[18074];j=+g[178];q=+g[38];s=+g[184];_=+g[44];cf(b|0,144928,(v=i,i=i+48|0,c[v>>2]=c[13366],h[v+8>>3]=G,h[v+16>>3]=j,h[v+24>>3]=q,h[v+32>>3]=s,h[v+40>>3]=_,v)|0);aI(144752,15,1,b|0);jh(b,107848,c[12890]|0);aI(144472,19,1,b|0);jh(b,144328,c[10058]|0);cf(b|0,126416,(v=i,i=i+8|0,c[v>>2]=56880,v)|0);ji(b,66656,0);aF(10,b|0);cf(b|0,126416,(v=i,i=i+8|0,c[v>>2]=56856,v)|0);ji(b,65968,0);aF(10,b|0);cf(b|0,126416,(v=i,i=i+8|0,c[v>>2]=56832,v)|0);ji(b,65280,0);aF(10,b|0);cf(b|0,126416,(v=i,i=i+8|0,c[v>>2]=56976,v)|0);ji(b,69408,0);aF(10,b|0);cf(b|0,126416,(v=i,i=i+8|0,c[v>>2]=56952,v)|0);ji(b,68720,0);aF(10,b|0);_=+h[77];if((a[624]&1)==0){cf(b|0,143976,(v=i,i=i+8|0,h[v>>3]=_,v)|0)}else{cf(b|0,144112,(v=i,i=i+8|0,h[v>>3]=_,v)|0)}M=c[16604]&3;if((M|0)==0){cf(b|0,143896,(v=i,i=i+8|0,c[v>>2]=56880,v)|0)}else if((M|0)==3){cf(b|0,143776,(v=i,i=i+8|0,c[v>>2]=56880,v)|0)}else if((M|0)==1){cf(b|0,143616,(v=i,i=i+8|0,c[v>>2]=56880,v)|0)}else if((M|0)==2){_=+h[8303];cf(b|0,143408,(v=i,i=i+16|0,c[v>>2]=56880,h[v+8>>3]=_,v)|0)}M=c[16432]&3;if((M|0)==0){cf(b|0,143896,(v=i,i=i+8|0,c[v>>2]=56856,v)|0)}else if((M|0)==3){cf(b|0,143776,(v=i,i=i+8|0,c[v>>2]=56856,v)|0)}else if((M|0)==1){cf(b|0,143616,(v=i,i=i+8|0,c[v>>2]=56856,v)|0)}else if((M|0)==2){_=+h[8217];cf(b|0,143408,(v=i,i=i+16|0,c[v>>2]=56856,h[v+8>>3]=_,v)|0)}M=c[16260]&3;if((M|0)==0){cf(b|0,143896,(v=i,i=i+8|0,c[v>>2]=56832,v)|0)}else if((M|0)==3){cf(b|0,143776,(v=i,i=i+8|0,c[v>>2]=56832,v)|0)}else if((M|0)==1){cf(b|0,143616,(v=i,i=i+8|0,c[v>>2]=56832,v)|0)}else if((M|0)==2){_=+h[8131];cf(b|0,143408,(v=i,i=i+16|0,c[v>>2]=56832,h[v+8>>3]=_,v)|0)}M=c[17292]&3;if((M|0)==0){cf(b|0,143896,(v=i,i=i+8|0,c[v>>2]=56976,v)|0)}else if((M|0)==3){cf(b|0,143776,(v=i,i=i+8|0,c[v>>2]=56976,v)|0)}else if((M|0)==1){cf(b|0,143616,(v=i,i=i+8|0,c[v>>2]=56976,v)|0)}else if((M|0)==2){_=+h[8647];cf(b|0,143408,(v=i,i=i+16|0,c[v>>2]=56976,h[v+8>>3]=_,v)|0)}M=c[17120]&3;if((M|0)==0){cf(b|0,143896,(v=i,i=i+8|0,c[v>>2]=56952,v)|0)}else if((M|0)==3){cf(b|0,143776,(v=i,i=i+8|0,c[v>>2]=56952,v)|0)}else if((M|0)==1){cf(b|0,143616,(v=i,i=i+8|0,c[v>>2]=56952,v)|0)}else if((M|0)==2){_=+h[8561];cf(b|0,143408,(v=i,i=i+16|0,c[v>>2]=56952,h[v+8>>3]=_,v)|0)}M=c[16776]&3;if((M|0)==0){cf(b|0,143896,(v=i,i=i+8|0,c[v>>2]=56904,v)|0)}else if((M|0)==3){cf(b|0,143776,(v=i,i=i+8|0,c[v>>2]=56904,v)|0)}else if((M|0)==1){cf(b|0,143616,(v=i,i=i+8|0,c[v>>2]=56904,v)|0)}else if((M|0)==2){_=+h[8389];cf(b|0,143408,(v=i,i=i+16|0,c[v>>2]=56904,h[v+8>>3]=_,v)|0)}jk(b,2);jk(b,1);jk(b,0);jk(b,6);jk(b,5);jk(b,3);jk(b,7);M=c[1119]|0;if((M|0)==0){$=179864}else{$=j3(M)|0}cf(b|0,143304,(v=i,i=i+24|0,c[v>>2]=179864,c[v+8>>2]=154440,c[v+16>>2]=$,v)|0);cf(b|0,142960,(v=i,i=i+16|0,c[v>>2]=179864,c[v+8>>2]=154440,v)|0);aI(216256,8,1,b|0);$=c[1140]|0;if(($|0)==0){aa=179864}else{aa=c[53424+($<<2)>>2]|0}_=+h[572];M=c[1141]|0;if((M|0)==($|0)){ab=179864}else{ab=c[53424+(M<<2)>>2]|0}s=+h[573];$=c[1142]|0;if(($|0)==(M|0)){ac=179864}else{ac=c[53424+($<<2)>>2]|0}q=+h[574];cf(b|0,215704,(v=i,i=i+48|0,c[v>>2]=aa,h[v+8>>3]=_,c[v+16>>2]=ab,h[v+24>>3]=s,c[v+32>>2]=ac,h[v+40>>3]=q,v)|0);ac=c[1120]|0;if((ac|0)==0){ad=179864}else{ad=j3(ac)|0}cf(b|0,126104,(v=i,i=i+8|0,c[v>>2]=ad,v)|0);if((c[1122]|0)!=0){aI(145280,10,1,b|0);jg(b,4488)}if((c[1105]|0)==-3){aI(142704,16,1,b|0)}ad=c[1117]|0;if((ad|0)==0){aI(90568,9,1,b|0)}else{cf(b|0,172464,(v=i,i=i+8|0,c[v>>2]=ad,v)|0)}cf(b|0,154696,(v=i,i=i+8|0,c[v>>2]=(a[4600]&1)!=0?199048:179864,v)|0);cf(b|0,142592,(v=i,i=i+8|0,c[v>>2]=(c[1166]|0)!=0?196800:196168,v)|0);ad=c[1183]|0;if((ad|0)==0){ae=179864}else{ae=j3(ad)|0}cf(b|0,143304,(v=i,i=i+24|0,c[v>>2]=179864,c[v+8>>2]=133504,c[v+16>>2]=ae,v)|0);cf(b|0,142960,(v=i,i=i+16|0,c[v>>2]=179864,c[v+8>>2]=133504,v)|0);aI(216256,8,1,b|0);ae=c[1204]|0;if((ae|0)==0){af=179864}else{af=c[53424+(ae<<2)>>2]|0}q=+h[604];ad=c[1205]|0;if((ad|0)==(ae|0)){ag=179864}else{ag=c[53424+(ad<<2)>>2]|0}s=+h[605];ae=c[1206]|0;if((ae|0)==(ad|0)){ah=179864}else{ah=c[53424+(ae<<2)>>2]|0}_=+h[606];cf(b|0,215704,(v=i,i=i+48|0,c[v>>2]=af,h[v+8>>3]=q,c[v+16>>2]=ag,h[v+24>>3]=s,c[v+32>>2]=ah,h[v+40>>3]=_,v)|0);ah=c[1184]|0;if((ah|0)==0){ai=179864}else{ai=j3(ah)|0}cf(b|0,126104,(v=i,i=i+8|0,c[v>>2]=ai,v)|0);if((c[1186]|0)!=0){aI(145280,10,1,b|0);jg(b,4744)}if((c[1169]|0)==-3){aI(142704,16,1,b|0)}ai=c[1181]|0;if((ai|0)==0){aI(90568,9,1,b|0)}else{cf(b|0,172464,(v=i,i=i+8|0,c[v>>2]=ai,v)|0)}cf(b|0,154696,(v=i,i=i+8|0,c[v>>2]=(a[4856]&1)!=0?199048:179864,v)|0);je(b,7);je(b,8);je(b,9);je(b,10);ai=c[16629]|0;if((ai|0)==0){aj=179864}else{aj=j3(ai)|0}cf(b|0,143304,(v=i,i=i+24|0,c[v>>2]=56880,c[v+8>>2]=202256,c[v+16>>2]=aj,v)|0);cf(b|0,142960,(v=i,i=i+16|0,c[v>>2]=56880,c[v+8>>2]=202256,v)|0);aI(216256,8,1,b|0);aj=c[16650]|0;if((aj|0)==0){ak=179864}else{ak=c[53424+(aj<<2)>>2]|0}_=+h[8327];ai=c[16651]|0;if((ai|0)==(aj|0)){al=179864}else{al=c[53424+(ai<<2)>>2]|0}s=+h[8328];aj=c[16652]|0;if((aj|0)==(ai|0)){am=179864}else{am=c[53424+(aj<<2)>>2]|0}q=+h[8329];cf(b|0,215704,(v=i,i=i+48|0,c[v>>2]=ak,h[v+8>>3]=_,c[v+16>>2]=al,h[v+24>>3]=s,c[v+32>>2]=am,h[v+40>>3]=q,v)|0);am=c[16630]|0;if((am|0)==0){an=179864}else{an=j3(am)|0}cf(b|0,126104,(v=i,i=i+8|0,c[v>>2]=an,v)|0);if((c[16632]|0)!=0){aI(145280,10,1,b|0);jg(b,66528)}if((c[16615]|0)==-3){aI(142704,16,1,b|0)}an=c[16627]|0;if((an|0)==0){aI(90568,9,1,b|0)}else{cf(b|0,172464,(v=i,i=i+8|0,c[v>>2]=an,v)|0)}cf(b|0,154696,(v=i,i=i+8|0,c[v>>2]=(a[66640]&1)!=0?199048:179864,v)|0);an=c[17317]|0;if((an|0)==0){ao=179864}else{ao=j3(an)|0}cf(b|0,143304,(v=i,i=i+24|0,c[v>>2]=56976,c[v+8>>2]=202256,c[v+16>>2]=ao,v)|0);cf(b|0,142960,(v=i,i=i+16|0,c[v>>2]=56976,c[v+8>>2]=202256,v)|0);aI(216256,8,1,b|0);ao=c[17338]|0;if((ao|0)==0){ap=179864}else{ap=c[53424+(ao<<2)>>2]|0}q=+h[8671];an=c[17339]|0;if((an|0)==(ao|0)){aq=179864}else{aq=c[53424+(an<<2)>>2]|0}s=+h[8672];ao=c[17340]|0;if((ao|0)==(an|0)){ar=179864}else{ar=c[53424+(ao<<2)>>2]|0}_=+h[8673];cf(b|0,215704,(v=i,i=i+48|0,c[v>>2]=ap,h[v+8>>3]=q,c[v+16>>2]=aq,h[v+24>>3]=s,c[v+32>>2]=ar,h[v+40>>3]=_,v)|0);ar=c[17318]|0;if((ar|0)==0){as=179864}else{as=j3(ar)|0}cf(b|0,126104,(v=i,i=i+8|0,c[v>>2]=as,v)|0);if((c[17320]|0)!=0){aI(145280,10,1,b|0);jg(b,69280)}if((c[17303]|0)==-3){aI(142704,16,1,b|0)}as=c[17315]|0;if((as|0)==0){aI(90568,9,1,b|0)}else{cf(b|0,172464,(v=i,i=i+8|0,c[v>>2]=as,v)|0)}cf(b|0,154696,(v=i,i=i+8|0,c[v>>2]=(a[69392]&1)!=0?199048:179864,v)|0);je(b,2);je(b,6);as=c[16457]|0;if((as|0)==0){at=179864}else{at=j3(as)|0}cf(b|0,143304,(v=i,i=i+24|0,c[v>>2]=56856,c[v+8>>2]=202256,c[v+16>>2]=at,v)|0);cf(b|0,142960,(v=i,i=i+16|0,c[v>>2]=56856,c[v+8>>2]=202256,v)|0);aI(216256,8,1,b|0);at=c[16478]|0;if((at|0)==0){au=179864}else{au=c[53424+(at<<2)>>2]|0}_=+h[8241];as=c[16479]|0;if((as|0)==(at|0)){av=179864}else{av=c[53424+(as<<2)>>2]|0}s=+h[8242];at=c[16480]|0;if((at|0)==(as|0)){aw=179864}else{aw=c[53424+(at<<2)>>2]|0}q=+h[8243];cf(b|0,215704,(v=i,i=i+48|0,c[v>>2]=au,h[v+8>>3]=_,c[v+16>>2]=av,h[v+24>>3]=s,c[v+32>>2]=aw,h[v+40>>3]=q,v)|0);aw=c[16458]|0;if((aw|0)==0){ax=179864}else{ax=j3(aw)|0}cf(b|0,126104,(v=i,i=i+8|0,c[v>>2]=ax,v)|0);if((c[16460]|0)!=0){aI(145280,10,1,b|0);jg(b,65840)}if((c[16443]|0)==-3){aI(142704,16,1,b|0)}ax=c[16455]|0;if((ax|0)==0){aI(90568,9,1,b|0)}else{cf(b|0,172464,(v=i,i=i+8|0,c[v>>2]=ax,v)|0)}cf(b|0,154696,(v=i,i=i+8|0,c[v>>2]=(a[65952]&1)!=0?199048:179864,v)|0);ax=c[17145]|0;if((ax|0)==0){ay=179864}else{ay=j3(ax)|0}cf(b|0,143304,(v=i,i=i+24|0,c[v>>2]=56952,c[v+8>>2]=202256,c[v+16>>2]=ay,v)|0);cf(b|0,142960,(v=i,i=i+16|0,c[v>>2]=56952,c[v+8>>2]=202256,v)|0);aI(216256,8,1,b|0);ay=c[17166]|0;if((ay|0)==0){az=179864}else{az=c[53424+(ay<<2)>>2]|0}q=+h[8585];ax=c[17167]|0;if((ax|0)==(ay|0)){aA=179864}else{aA=c[53424+(ax<<2)>>2]|0}s=+h[8586];ay=c[17168]|0;if((ay|0)==(ax|0)){aB=179864}else{aB=c[53424+(ay<<2)>>2]|0}_=+h[8587];cf(b|0,215704,(v=i,i=i+48|0,c[v>>2]=az,h[v+8>>3]=q,c[v+16>>2]=aA,h[v+24>>3]=s,c[v+32>>2]=aB,h[v+40>>3]=_,v)|0);aB=c[17146]|0;if((aB|0)==0){aC=179864}else{aC=j3(aB)|0}cf(b|0,126104,(v=i,i=i+8|0,c[v>>2]=aC,v)|0);if((c[17148]|0)!=0){aI(145280,10,1,b|0);jg(b,68592)}if((c[17131]|0)==-3){aI(142704,16,1,b|0)}aC=c[17143]|0;if((aC|0)==0){aI(90568,9,1,b|0)}else{cf(b|0,172464,(v=i,i=i+8|0,c[v>>2]=aC,v)|0)}cf(b|0,154696,(v=i,i=i+8|0,c[v>>2]=(a[68704]&1)!=0?199048:179864,v)|0);do{if((c[5094]|0)==0){je(b,1);je(b,5)}else{if(a[20368]|0){a[20368]=0;g[3538]=+g[5090];g[3536]=+g[5088];g[3534]=+g[5086];c[16336]=c[16336]^2;c[17024]=c[17024]^2}je(b,1);je(b,5);if(a[20368]|0){break}a[20368]=1;g[5090]=+g[3538];g[5088]=+g[3536];g[5086]=+g[3534];g[3538]=180.0;g[3536]=0.0;g[3534]=1.2999999523162842;c[16336]=c[16336]^2;c[17024]=c[17024]^2}}while(0);aC=c[16285]|0;if((aC|0)==0){aD=179864}else{aD=j3(aC)|0}cf(b|0,143304,(v=i,i=i+24|0,c[v>>2]=56832,c[v+8>>2]=202256,c[v+16>>2]=aD,v)|0);cf(b|0,142960,(v=i,i=i+16|0,c[v>>2]=56832,c[v+8>>2]=202256,v)|0);aI(216256,8,1,b|0);aD=c[16306]|0;if((aD|0)==0){aE=179864}else{aE=c[53424+(aD<<2)>>2]|0}_=+h[8155];aC=c[16307]|0;if((aC|0)==(aD|0)){aG=179864}else{aG=c[53424+(aC<<2)>>2]|0}s=+h[8156];aD=c[16308]|0;if((aD|0)==(aC|0)){aH=179864}else{aH=c[53424+(aD<<2)>>2]|0}q=+h[8157];cf(b|0,215704,(v=i,i=i+48|0,c[v>>2]=aE,h[v+8>>3]=_,c[v+16>>2]=aG,h[v+24>>3]=s,c[v+32>>2]=aH,h[v+40>>3]=q,v)|0);aH=c[16286]|0;if((aH|0)==0){aJ=179864}else{aJ=j3(aH)|0}cf(b|0,126104,(v=i,i=i+8|0,c[v>>2]=aJ,v)|0);if((c[16288]|0)!=0){aI(145280,10,1,b|0);jg(b,65152)}if((c[16271]|0)==-3){aI(142704,16,1,b|0)}aJ=c[16283]|0;if((aJ|0)==0){aI(90568,9,1,b|0)}else{cf(b|0,172464,(v=i,i=i+8|0,c[v>>2]=aJ,v)|0)}cf(b|0,154696,(v=i,i=i+8|0,c[v>>2]=(a[65264]&1)!=0?199048:179864,v)|0);je(b,0);aJ=c[16801]|0;if((aJ|0)==0){aL=179864}else{aL=j3(aJ)|0}cf(b|0,143304,(v=i,i=i+24|0,c[v>>2]=56904,c[v+8>>2]=202256,c[v+16>>2]=aL,v)|0);cf(b|0,142960,(v=i,i=i+16|0,c[v>>2]=56904,c[v+8>>2]=202256,v)|0);aI(216256,8,1,b|0);aL=c[16822]|0;if((aL|0)==0){aM=179864}else{aM=c[53424+(aL<<2)>>2]|0}q=+h[8413];aJ=c[16823]|0;if((aJ|0)==(aL|0)){aN=179864}else{aN=c[53424+(aJ<<2)>>2]|0}s=+h[8414];aL=c[16824]|0;if((aL|0)==(aJ|0)){aO=179864}else{aO=c[53424+(aL<<2)>>2]|0}_=+h[8415];cf(b|0,215704,(v=i,i=i+48|0,c[v>>2]=aM,h[v+8>>3]=q,c[v+16>>2]=aN,h[v+24>>3]=s,c[v+32>>2]=aO,h[v+40>>3]=_,v)|0);aO=c[16802]|0;if((aO|0)==0){aP=179864}else{aP=j3(aO)|0}cf(b|0,126104,(v=i,i=i+8|0,c[v>>2]=aP,v)|0);if((c[16804]|0)!=0){aI(145280,10,1,b|0);jg(b,67216)}if((c[16787]|0)==-3){aI(142704,16,1,b|0)}aP=c[16799]|0;if((aP|0)==0){aI(90568,9,1,b|0)}else{cf(b|0,172464,(v=i,i=i+8|0,c[v>>2]=aP,v)|0)}cf(b|0,154696,(v=i,i=i+8|0,c[v>>2]=(a[67328]&1)!=0?199048:179864,v)|0);je(b,3);cf(b|0,141912,(v=i,i=i+8|0,h[v>>3]=+h[11],v)|0);_=+h[4395];cf(b|0,141776,(v=i,i=i+16|0,c[v>>2]=(c[8786]|0)==3?141576:179864,h[v+8>>3]=_,v)|0);_=+h[7052];cf(b|0,141392,(v=i,i=i+16|0,c[v>>2]=(c[14100]|0)==3?141576:179864,h[v+8>>3]=_,v)|0);_=+h[3301];cf(b|0,141272,(v=i,i=i+16|0,c[v>>2]=(c[6598]|0)==3?141576:179864,h[v+8>>3]=_,v)|0);_=+h[535];cf(b|0,141072,(v=i,i=i+16|0,c[v>>2]=(c[1066]|0)==3?141576:179864,h[v+8>>3]=_,v)|0);cf(b|0,140928,(v=i,i=i+8|0,c[v>>2]=c[12908],v)|0);aI(140768,9,1,b|0);aI(((c[7662]|0)==1?140568:140376)|0,8,1,b|0);cf(b|0,140264,(v=i,i=i+8|0,c[v>>2]=30632,v)|0);aI(140768,9,1,b|0);aP=a[30641]|0;if((aP|0)==97){aI(140104,15,1,b|0)}else if((aP|0)==102){aI(139848,13,1,b|0)}else if((aP|0)==98){aI(139608,14,1,b|0)}else if((aP|0)==100){aI(139464,11,1,b|0)}aP=c[7665]|0;cf(b|0,139248,(v=i,i=i+16|0,c[v>>2]=c[7664],c[v+8>>2]=aP,v)|0);aI(139080,7,1,b|0);aP=a[30639]|0;if((aP|0)==99){aI(89896,6,1,b|0)}else if((aP|0)==98){aI(138664,5,1,b|0)}else if((aP|0)==114){aI(74552,3,1,b|0)}aK(((a[30640]|0)!=0?73808:138016)|0,b|0);aI(137864,10,1,b|0);aP=c[7661]|0;if((aP|0)>0){cf(b|0,137704,(v=i,i=i+8|0,c[v>>2]=aP,v)|0)}else{aO=(aP|0)!=0?137592:137416;aK(aO|0,b|0)}aI(137296,15,1,b|0);aO=c[7663]|0;if((aO|0)==4){aI(105792,4,1,b|0)}else if((aO|0)==5){aI(167728,7,1,b|0)}else if((aO|0)==6){aI(100616,6,1,b|0)}else if((aO|0)==7){aI(103256,3,1,b|0)}else if((aO|0)==8){aI(99528,3,1,b|0)}else{cf(b|0,136120,(v=i,i=i+8|0,c[v>>2]=aO+1,v)|0)}aF(10,b|0);aO=(a[20684]|0)!=0?137784:137920;aP=c[5168]|0;cf(b|0,135880,(v=i,i=i+24|0,c[v>>2]=(a[20668]|0)==112?135696:135584,c[v+8>>2]=aO,c[v+16>>2]=aP,v)|0);cf(b|0,135120,(v=i,i=i+8|0,h[v>>3]=+h[2705],v)|0);do{if((c[5163]|0)==103){aI(134936,5,1,b|0)}else{aI(134744,12,1,b|0);aP=c[5174]|0;if((aP|0)==114){aI(134624,4,1,b|0)}else if((aP|0)==104){aI(134504,4,1,b|0)}else if((aP|0)==99){aI(134336,4,1,b|0)}else if((aP|0)==121){aI(134152,4,1,b|0)}else if((aP|0)==120){aI(133992,4,1,b|0)}else{cf(c[m>>2]|0,133856,(v=i,i=i+24|0,c[v>>2]=133776,c[v+8>>2]=871,c[v+16>>2]=aP<<24>>24,v)|0)}aI(133576,13,1,b|0);aP=c[5163]|0;if((aP|0)==114){aO=c[5164]|0;aN=c[5165]|0;aM=c[5166]|0;cf(b|0,133464,(v=i,i=i+24|0,c[v>>2]=aO,c[v+8>>2]=aN,c[v+16>>2]=aM,v)|0);break}else if((aP|0)==100){aI(133112,9,1,b|0);if((c[5172]|0)>0){aM=0;do{aN=c[5173]|0;_=+h[aN+(aM<<5)+8>>3];s=+h[aN+(aM<<5)+16>>3];q=+h[aN+(aM<<5)+24>>3];cf(b|0,132952,(v=i,i=i+32|0,h[v>>3]=+h[aN+(aM<<5)>>3],h[v+8>>3]=_,h[v+16>>3]=s,h[v+24>>3]=q,v)|0);do{if((aM|0)<((c[5172]|0)-1|0)){aF(44,b|0);if(!((aM|0)==2|((aM|0)%4&-1|0)==2)){break}aI(132648,6,1,b|0)}}while(0);aM=aM+1|0;}while((aM|0)<(c[5172]|0))}aI(132568,3,1,b|0);break}else if((aP|0)==102){aM=c[5257]|0;t=c[5335]|0;cf(b|0,132440,(v=i,i=i+24|0,c[v>>2]=c[5179],c[v+8>>2]=aM,c[v+16>>2]=t,v)|0);break}else if((aP|0)==99){q=+h[2707];s=+h[2708];cf(b|0,132312,(v=i,i=i+24|0,h[v>>3]=+h[2706],h[v+8>>3]=q,h[v+16>>3]=s,v)|0);break}else{cf(c[m>>2]|0,142392,(v=i,i=i+24|0,c[v>>2]=133776,c[v+8>>2]=905,c[v+16>>2]=aP<<24>>24,v)|0);break}}}while(0);t=a[54016]|0;if(t<<24>>24!=110){aM=t<<24>>24==100?126024:132024;cf(b|0,132088,(v=i,i=i+8|0,c[v>>2]=aM,v)|0)}cf(b|0,131760,(v=i,i=i+8|0,c[v>>2]=(a[54017]|0)==118?131648:131544,v)|0);aM=c[13508]|0;if((aM|0)==0){aQ=179864}else{aQ=c[53424+(aM<<2)>>2]|0}s=+h[6756];t=c[13509]|0;if((t|0)==(aM|0)){aR=179864}else{aR=c[53424+(t<<2)>>2]|0}q=+h[6757];aM=c[13510]|0;if((aM|0)==(t|0)){aS=179864}else{aS=c[53424+(aM<<2)>>2]|0}_=+h[6758];cf(b|0,215704,(v=i,i=i+48|0,c[v>>2]=aQ,h[v+8>>3]=s,c[v+16>>2]=aR,h[v+24>>3]=q,c[v+32>>2]=aS,h[v+40>>3]=_,v)|0);aI(83624,6,1,b|0);aS=c[13518]|0;if((aS|0)==0){aT=179864}else{aT=c[53424+(aS<<2)>>2]|0}_=+h[6761];aR=c[13519]|0;if((aR|0)==(aS|0)){aU=179864}else{aU=c[53424+(aR<<2)>>2]|0}q=+h[6762];aS=c[13520]|0;if((aS|0)==(aR|0)){aV=179864}else{aV=c[53424+(aS<<2)>>2]|0}s=+h[6763];cf(b|0,215704,(v=i,i=i+48|0,c[v>>2]=aT,h[v+8>>3]=_,c[v+16>>2]=aU,h[v+24>>3]=q,c[v+32>>2]=aV,h[v+40>>3]=s,v)|0);cf(b|0,126160,(v=i,i=i+8|0,c[v>>2]=(c[13506]|0)==1?150856:150704,v)|0);do{if((a[54018]|0)==0){aI(131352,8,1,b|0)}else{aV=c[13505]|0;if((aV|0)<0){aI(131224,8,1,b|0);break}else{cf(b|0,131128,(v=i,i=i+8|0,c[v>>2]=aV,v)|0);break}}}while(0);if((a[54016]|0)==110){aI(131e3,16,1,b|0)}else{aF(10,b|0)}aV=(c[14068]|0)==257?130728:130528;aU=(c[14062]|0)==1?130472:205008;s=+h[7032];aT=(a[56264]&1)!=0?179864:136208;aS=(c[14067]|0)+1|0;q=+h[7035];aR=c[14072]|0;do{if((aR|0)==2){aW=202352}else{if((aR|0)==3){aW=108208;break}aW=(aR|0)==1?201e3:150208}}while(0);aR=(a[56292]&1)!=0?179864:213448;cf(b|0,130824,(v=i,i=i+64|0,c[v>>2]=aV,c[v+8>>2]=aU,h[v+16>>3]=s,c[v+24>>2]=aT,c[v+32>>2]=aS,h[v+40>>3]=q,c[v+48>>2]=aW,c[v+56>>2]=aR,v)|0);aI(129976,13,1,b|0);aR=c[8782]|0;c[8778]=aR;aW=c[8776]|0;L12586:do{if((aW|0)!=0){aS=aW;aT=aR;while(1){aU=c[8774]|0;do{if((aU|0)==0){c[8774]=aS;if((aT|0)!=0){aX=aS;aZ=aT;break}aV=c[8780]|0;c[8778]=aV;aX=aS;aZ=aV}else{aV=aU+((uA(aU|0)|0)+1|0)|0;c[8774]=aV;aX=aV;aZ=aT}}while(0);if(aX>>>0>=aZ>>>0){break}if((aX|0)==0){break L12586}cf(b|0,103640,(v=i,i=i+8|0,c[v>>2]=aX,v)|0);aT=c[8782]|0;c[8778]=aT;aS=c[8776]|0;if((aS|0)==0){break L12586}}c[8774]=0;c[8778]=0}}while(0);aF(10,b|0);aI(129680,13,1,b|0);aX=ur(16,0)|0;if((aX|0)!=0){aZ=aX;do{cf(b|0,103640,(v=i,i=i+8|0,c[v>>2]=aZ,v)|0);aZ=ur(16,0)|0;}while((aZ|0)!=0)}aF(10,b|0);aZ=c[57238]|0;if((aZ|0)==0){aI(129352,10,1,b|0)}else{cf(b|0,129480,(v=i,i=i+8|0,c[v>>2]=aZ,v)|0)}cf(b|0,129048,(v=i,i=i+8|0,c[v>>2]=(a[42568]&1)!=0?179864:136208,v)|0);aZ=c[10568]|0;if((aZ|0)==0){a_=aF(10,b|0)|0;i=d;return}cf(b|0,128984,(v=i,i=i+8|0,c[v>>2]=aZ,v)|0);a_=aF(10,b|0)|0;i=d;return}function jc(b){b=b|0;var d=0,e=0,f=0,g=0;d=i;jI(b);jb(b);e=c[10812]|0;if((e|0)!=0){f=e;do{e=c[f+12>>2]|0;if((e|0)!=0){cf(b|0,154696,(v=i,i=i+8|0,c[v>>2]=e,v)|0)}f=c[f>>2]|0;}while((f|0)!=0)}i8(b);cf(b|0,154696,(v=i,i=i+8|0,c[v>>2]=c[6924],v)|0);if((a[35352]|0)==0){g=aI(172e3,9,1,b|0)|0;i=d;return}aI(156144,3,1,b|0);if((b|0)!=0){aK(35352,b|0)}aF(10,b|0);g=aI(172e3,9,1,b|0)|0;i=d;return}function jd(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;jI(a);d=c[3524]|0;if((d|0)==0){aI(122336,21,1,a|0)}else{e=c[d>>2]|0;cf(a|0,135232,(v=i,i=i+16|0,c[v>>2]=e,c[v+8>>2]=13048,v)|0)}e=c[8244]|0;if((e|0)==0){aI(98152,13,1,a|0);f=aI(172e3,9,1,a|0)|0;i=b;return}else{cf(a|0,105136,(v=i,i=i+8|0,c[v>>2]=e,v)|0);f=aI(172e3,9,1,a|0)|0;i=b;return}}function je(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0,D=0.0,E=0,F=0;d=i;i=i+1024|0;e=d|0;f=d+48|0;g=d+96|0;j=d+144|0;k=d+192|0;l=d+240|0;n=d+288|0;o=d+336|0;p=d+384|0;q=d+464|0;r=d+544|0;s=d+624|0;t=d+704|0;u=d+784|0;w=d+864|0;x=d+944|0;y=56832+(b*24&-1)|0;cf(a|0,92200,(v=i,i=i+8|0,c[v>>2]=y,v)|0);z=64652+(b*688&-1)|0;do{if((c[z>>2]&1|0)==0){if((c[64808+(b*688&-1)>>2]|0)==1){aF(34,a|0);A=r|0;B=64813+(b*688&-1)|0;C=+h[64680+(b*688&-1)>>3];t3(l,C);D=C- +O(+C);t4(A,80,B,l,D);B=j3(A)|0;aK(B|0,a|0);aF(34,a|0);break}else{D=+h[64680+(b*688&-1)>>3];cf(a|0,92736,(v=i,i=i+8|0,h[v>>3]=D,v)|0);break}}else{B=64728+(b*688&-1)|0;if((c[B>>2]&1|0)!=0){if((c[64808+(b*688&-1)>>2]|0)==1){aF(34,a|0);A=p|0;E=64813+(b*688&-1)|0;D=+h[64736+(b*688&-1)>>3];t3(o,D);C=D- +O(+D);t4(A,80,E,o,C);E=j3(A)|0;aK(E|0,a|0);aF(34,a|0)}else{C=+h[64736+(b*688&-1)>>3];cf(a|0,92736,(v=i,i=i+8|0,h[v>>3]=C,v)|0)}aI(76472,3,1,a|0)}aF(42,a|0);if((c[B>>2]&2|0)==0){break}aI(76472,3,1,a|0);if((c[64808+(b*688&-1)>>2]|0)==1){aF(34,a|0);B=q|0;E=64813+(b*688&-1)|0;C=+h[64744+(b*688&-1)>>3];t3(n,C);D=C- +O(+C);t4(B,80,E,n,D);E=j3(B)|0;aK(E|0,a|0);aF(34,a|0);break}else{D=+h[64744+(b*688&-1)>>3];cf(a|0,92736,(v=i,i=i+8|0,h[v>>3]=D,v)|0);break}}}while(0);aI(223968,3,1,a|0);do{if((c[z>>2]&2|0)==0){if((c[64808+(b*688&-1)>>2]|0)==1){aF(34,a|0);n=u|0;q=64813+(b*688&-1)|0;D=+h[64688+(b*688&-1)>>3];t3(g,D);C=D- +O(+D);t4(n,80,q,g,C);q=j3(n)|0;aK(q|0,a|0);aF(34,a|0);break}else{C=+h[64688+(b*688&-1)>>3];cf(a|0,92736,(v=i,i=i+8|0,h[v>>3]=C,v)|0);break}}else{q=64732+(b*688&-1)|0;if((c[q>>2]&1|0)!=0){if((c[64808+(b*688&-1)>>2]|0)==1){aF(34,a|0);n=s|0;o=64813+(b*688&-1)|0;C=+h[64752+(b*688&-1)>>3];t3(k,C);D=C- +O(+C);t4(n,80,o,k,D);o=j3(n)|0;aK(o|0,a|0);aF(34,a|0)}else{D=+h[64752+(b*688&-1)>>3];cf(a|0,92736,(v=i,i=i+8|0,h[v>>3]=D,v)|0)}aI(76472,3,1,a|0)}aF(42,a|0);if((c[q>>2]&2|0)==0){break}aI(76472,3,1,a|0);if((c[64808+(b*688&-1)>>2]|0)==1){aF(34,a|0);q=t|0;o=64813+(b*688&-1)|0;D=+h[64760+(b*688&-1)>>3];t3(j,D);C=D- +O(+D);t4(q,80,o,j,C);o=j3(q)|0;aK(o|0,a|0);aF(34,a|0);break}else{C=+h[64760+(b*688&-1)>>3];cf(a|0,92736,(v=i,i=i+8|0,h[v>>3]=C,v)|0);break}}}while(0);j=c[64656+(b*688&-1)>>2]|0;cf(a|0,216880,(v=i,i=i+16|0,c[v>>2]=(j&2|0)!=0?179864:136208,c[v+8>>2]=(j&1|0)!=0?179864:136208,v)|0);if(!((c[z>>2]|0)!=0&(c[m>>2]|0)==(a|0))){aF(10,a|0);i=d;return}aI(201952,16,1,a|0);do{if((c[z>>2]&1|0)!=0){if((c[64808+(b*688&-1)>>2]|0)==1){aF(34,a|0);j=w|0;t=64813+(b*688&-1)|0;C=+h[64664+(b*688&-1)>>3];t3(f,C);D=C- +O(+C);t4(j,80,t,f,D);t=j3(j)|0;aK(t|0,a|0);aF(34,a|0);break}else{D=+h[64664+(b*688&-1)>>3];cf(a|0,92736,(v=i,i=i+8|0,h[v>>3]=D,v)|0);break}}}while(0);aF(58,a|0);do{if((c[z>>2]&2|0)!=0){if((c[64808+(b*688&-1)>>2]|0)==1){aF(34,a|0);f=x|0;w=64813+(b*688&-1)|0;D=+h[64672+(b*688&-1)>>3];t3(e,D);C=D- +O(+D);t4(f,80,w,e,C);w=j3(f)|0;aK(w|0,a|0);aF(34,a|0);break}else{C=+h[64672+(b*688&-1)>>3];cf(a|0,92736,(v=i,i=i+8|0,h[v>>3]=C,v)|0);break}}}while(0);aI(196384,4,1,a|0);b=c[z>>2]|0;if((b&4|0)==0){F=b}else{cf(a|0,185160,(v=i,i=i+8|0,c[v>>2]=y,v)|0);F=c[z>>2]|0}if((F&8|0)==0){i=d;return}cf(a|0,180048,(v=i,i=i+8|0,c[v>>2]=y,v)|0);i=d;return}function jf(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0.0;d=i;e=c[b>>2]|0;if((e|0)==3){aI(163528,9,1,a|0);i=d;return}else if((e|0)==2|(e|0)==5){f=c[b+8>>2]|0;cf(a|0,167968,(v=i,i=i+16|0,c[v>>2]=(e|0)==2?179864:114984,c[v+8>>2]=f,v)|0)}else if((e|0)==1|(e|0)==4){g=+(c[b+4>>2]|0)/100.0;cf(a|0,175936,(v=i,i=i+16|0,c[v>>2]=(e|0)==1?179864:114984,h[v+8>>3]=g,v)|0)}else{aI(154480,7,1,a|0)}e=b+16|0;do{if((c[e>>2]|0)==1){if((c[b+20>>2]|0)!=-3){break}aI(151240,9,1,a|0);i=d;return}}while(0);aI(149416,6,1,a|0);jg(a,e);aF(10,a|0);i=d;return}function jg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,g=0,j=0,k=0,l=0,m=0,n=0;d=i;e=c[b>>2]|0;if((e|0)==5){f=+h[b+8>>3];cf(a|0,136528,(v=i,i=i+8|0,h[v>>3]=f,v)|0);i=d;return}else if((e|0)==4){cf(a|0,138224,(v=i,i=i+8|0,h[v>>3]=+h[b+8>>3],v)|0);i=d;return}else if((e|0)==6){aI(140288,10,1,a|0);i=d;return}else if((e|0)==2){cf(a|0,141944,(v=i,i=i+8|0,c[v>>2]=c[b+4>>2],v)|0);i=d;return}else if((e|0)==3){g=c[7642]|0;j=c[b+4>>2]|0;k=-1;while(1){l=k+1|0;m=c[g+(l<<3)>>2]|0;if((m|0)==0){n=0;break}if((c[g+(l<<3)+4>>2]|0)==(j|0)){n=m;break}else{k=l}}if(+h[b+8>>3]<0.0){aI(134760,14,1,a|0);i=d;return}if((n|0)==0){cf(a|0,131792,(v=i,i=i+8|0,c[v>>2]=j,v)|0);i=d;return}else{cf(a|0,133184,(v=i,i=i+8|0,c[v>>2]=n,v)|0);i=d;return}}else if((e|0)==1){cf(a|0,143432,(v=i,i=i+8|0,c[v>>2]=(c[b+4>>2]|0)+1,v)|0);i=d;return}else{i=d;return}}function jh(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;if((c|0)==311){aI(121928,13,1,a|0);return}else if((c|0)==18){aI(129496,7,1,a|0);return}else if((c|0)==209){aI(103480,8,1,a|0);return}else if((c|0)==102){aI(120312,11,1,a|0);return}else if((c|0)==33){aI(128200,9,1,a|0);return}else if((c|0)==392){aI(114072,11,1,a|0);return}else if((c|0)==137){aI(104856,15,1,a|0);return}else if((c|0)==177){aI(104320,6,1,a|0);return}else if((c|0)==368){aI(98592,7,1,a|0);return}else if((c|0)==51){aI(126912,12,1,a|0);return}else if((c|0)==400){aI(98008,6,1,a|0);return}else if((c|0)==295){aI(124576,12,1,a|0);return}else if((c|0)==86){aI(116936,11,1,a|0);return}else if((c|0)==118){aI(116016,12,1,a|0);return}else if((c|0)==252){aI(100064,13,1,a|0);return}else if((c|0)==345){aI(110648,13,1,a|0);do{if((aY(b|0,107848)|0)==0){d=9320}else{if((aY(b|0,122960)|0)==0){d=9320;break}hF(43400,a)}}while(0);if((d|0)==9320){hF(43432,a)}aF(10,a|0);return}else if((c|0)==279){aI(123176,12,1,a|0);return}else if((c|0)==257){aI(100768,12,1,a|0);return}else if((c|0)==64){aI(125816,5,1,a|0);return}else if((c|0)==153){aI(115112,6,1,a|0);return}else if((c|0)==1){aI(130536,6,1,a|0);return}else if((c|0)==193){aI(103856,7,1,a|0);return}else if((c|0)==489){aI(96288,9,1,a|0);return}else if((c|0)==416){aI(97328,9,1,a|0);return}else if((c|0)==225){aI(101296,7,1,a|0);return}else if((c|0)==169){aI(105896,13,1,a|0);return}else if((c|0)==457){aI(96752,8,1,a|0);return}else if((c|0)==474){aI(99624,8,1,a|0);return}else if((c|0)==352){aI(99200,5,1,a|0);return}else{aI(95896,13,1,a|0);return}}function ji(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0.0;f=i;g=d+4|0;cf(b|0,95408,(v=i,i=i+8|0,c[v>>2]=(c[g>>2]|0)+1,v)|0);L12805:do{if((a[d+32|0]&1)!=0){aI(94936,10,1,b|0);j=d+40|0;k=c[j>>2]|0;if((k|0)==2){l=9373}else if((k|0)==1){cf(b|0,95144,(v=i,i=i+8|0,c[v>>2]=(c[d+44>>2]|0)+1,v)|0);break}do{if((l|0)==9373){if((c[g>>2]|0)!=-6){break}aI(93616,9,1,b|0);break L12805}}while(0);jg(b,j)}}while(0);cf(b|0,92904,(v=i,i=i+8|0,h[v>>3]=+h[d+16>>3],v)|0);if(!e){i=f;return}cf(b|0,92032,(v=i,i=i+8|0,c[v>>2]=(c[d+8>>2]|0)+1,v)|0);m=+h[d+24>>3];do{if(m==-3.0){aI(91352,19,1,b|0)}else{if(m==-2.0){aI(90696,18,1,b|0);break}else{cf(b|0,90312,(v=i,i=i+8|0,h[v>>3]=m,v)|0);break}}}while(0);cf(b|0,89624,(v=i,i=i+8|0,c[v>>2]=c[d+12>>2],v)|0);i=f;return}function jj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0,u=0,w=0.0,x=0,y=0.0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ab=0,ac=0,ad=0;e=i;f=c[10818]|0;if((f|0)==0){g=0}else{j=(d|0)==0;k=0;l=f;while(1){f=c[l+12>>2]|0;L12830:do{if((f|0)==1){n=c[l+4>>2]|0;do{if(j){o=n}else{if((n|0)==(d|0)){o=d;break}if((f|0)==4){p=9449;break L12830}else if((f|0)==3){p=9431;break L12830}else if((f|0)==2){p=9419;break L12830}else{p=9448;break L12830}}}while(0);n=(c[m>>2]|0)==(b|0)?86152:85072;q=l+4|0;cf(b|0,87232,(v=i,i=i+16|0,c[v>>2]=n,c[v+8>>2]=o,v)|0);if((c[l+104>>2]|0)==1){aI(84272,7,1,b|0);n=c[l+112>>2]|0;if((n|0)==0){r=179864}else{r=c[53424+(n<<2)>>2]|0}s=+h[l+128>>3];t=c[l+116>>2]|0;if((t|0)==(n|0)){u=179864}else{u=c[53424+(t<<2)>>2]|0}w=+h[l+136>>3];n=c[l+120>>2]|0;if((n|0)==(t|0)){x=179864}else{x=c[53424+(n<<2)>>2]|0}y=+h[l+144>>3];cf(b|0,215704,(v=i,i=i+48|0,c[v>>2]=r,h[v+8>>3]=s,c[v+16>>2]=u,h[v+24>>3]=w,c[v+32>>2]=x,h[v+40>>3]=y,v)|0);aI(83624,6,1,b|0);n=c[l+152>>2]|0;if((n|0)==0){z=179864}else{z=c[53424+(n<<2)>>2]|0}y=+h[l+168>>3];t=c[l+156>>2]|0;if((t|0)==(n|0)){A=179864}else{A=c[53424+(t<<2)>>2]|0}w=+h[l+176>>3];n=c[l+160>>2]|0;if((n|0)==(t|0)){B=179864}else{B=c[53424+(n<<2)>>2]|0}s=+h[l+184>>3];cf(b|0,215704,(v=i,i=i+48|0,c[v>>2]=z,h[v+8>>3]=y,c[v+16>>2]=A,h[v+24>>3]=w,c[v+32>>2]=B,h[v+40>>3]=s,v)|0);C=1;D=q;break}else{aI(82592,5,1,b|0);n=c[l+192>>2]|0;if((n|0)==0){E=179864}else{E=c[53424+(n<<2)>>2]|0}s=+h[l+208>>3];t=c[l+196>>2]|0;if((t|0)==(n|0)){F=179864}else{F=c[53424+(t<<2)>>2]|0}w=+h[l+216>>3];n=c[l+200>>2]|0;if((n|0)==(t|0)){G=179864}else{G=c[53424+(n<<2)>>2]|0}y=+h[l+224>>3];cf(b|0,215704,(v=i,i=i+48|0,c[v>>2]=E,h[v+8>>3]=s,c[v+16>>2]=F,h[v+24>>3]=w,c[v+32>>2]=G,h[v+40>>3]=y,v)|0);aI(127448,4,1,b|0);n=c[l+232>>2]|0;if((n|0)==0){H=179864}else{H=c[53424+(n<<2)>>2]|0}y=+h[l+248>>3];t=c[l+236>>2]|0;if((t|0)==(n|0)){I=179864}else{I=c[53424+(t<<2)>>2]|0}w=+h[l+256>>3];n=c[l+240>>2]|0;if((n|0)==(t|0)){J=179864}else{J=c[53424+(n<<2)>>2]|0}s=+h[l+264>>3];cf(b|0,215704,(v=i,i=i+48|0,c[v>>2]=H,h[v+8>>3]=y,c[v+16>>2]=I,h[v+24>>3]=w,c[v+32>>2]=J,h[v+40>>3]=s,v)|0);C=1;D=q;break}}else if((f|0)==4){p=9449}else if((f|0)==3){p=9431}else if((f|0)==2){p=9419}else{p=9448}}while(0);L12875:do{if((p|0)==9419){p=0;q=c[l+4>>2]|0;do{if(j){K=q}else{if((q|0)==(d|0)){K=d;break}if((f|0)==4){p=9449;break L12875}else if((f|0)==3){p=9431;break L12875}else{p=9448;break L12875}}}while(0);q=(c[m>>2]|0)==(b|0)?86152:85072;n=l+4|0;cf(b|0,79696,(v=i,i=i+16|0,c[v>>2]=q,c[v+8>>2]=K,v)|0);aI(84272,7,1,b|0);q=c[l+112>>2]|0;if((q|0)==0){L=179864}else{L=c[53424+(q<<2)>>2]|0}s=+h[l+128>>3];t=c[l+116>>2]|0;if((t|0)==(q|0)){M=179864}else{M=c[53424+(t<<2)>>2]|0}w=+h[l+136>>3];q=c[l+120>>2]|0;if((q|0)==(t|0)){N=179864}else{N=c[53424+(q<<2)>>2]|0}y=+h[l+144>>3];cf(b|0,215704,(v=i,i=i+48|0,c[v>>2]=L,h[v+8>>3]=s,c[v+16>>2]=M,h[v+24>>3]=w,c[v+32>>2]=N,h[v+40>>3]=y,v)|0);aI(83624,6,1,b|0);q=c[l+152>>2]|0;if((q|0)==0){O=179864}else{O=c[53424+(q<<2)>>2]|0}y=+h[l+168>>3];cf(b|0,78968,(v=i,i=i+16|0,c[v>>2]=O,h[v+8>>3]=y,v)|0);y=+h[l+192>>3];w=+h[l+200>>3];cf(b|0,78400,(v=i,i=i+16|0,h[v>>3]=y,h[v+8>>3]=w,v)|0);C=1;D=n}}while(0);L12893:do{if((p|0)==9431){p=0;n=c[l+4>>2]|0;do{if(j){P=n}else{if((n|0)==(d|0)){P=d;break}if((f|0)==4){p=9449;break L12893}else{p=9448;break L12893}}}while(0);n=(c[m>>2]|0)==(b|0)?86152:85072;q=l+4|0;cf(b|0,78048,(v=i,i=i+16|0,c[v>>2]=n,c[v+8>>2]=P,v)|0);aI(84272,7,1,b|0);n=c[l+112>>2]|0;if((n|0)==0){Q=179864}else{Q=c[53424+(n<<2)>>2]|0}w=+h[l+128>>3];t=c[l+116>>2]|0;if((t|0)==(n|0)){R=179864}else{R=c[53424+(t<<2)>>2]|0}y=+h[l+136>>3];n=c[l+120>>2]|0;if((n|0)==(t|0)){S=179864}else{S=c[53424+(n<<2)>>2]|0}s=+h[l+144>>3];cf(b|0,215704,(v=i,i=i+48|0,c[v>>2]=Q,h[v+8>>3]=w,c[v+16>>2]=R,h[v+24>>3]=y,c[v+32>>2]=S,h[v+40>>3]=s,v)|0);aI(83624,6,1,b|0);n=l+152|0;t=c[n>>2]|0;if((t|0)==0){T=179864}else{T=c[53424+(t<<2)>>2]|0}s=+h[l+168>>3];cf(b|0,78968,(v=i,i=i+16|0,c[v>>2]=T,h[v+8>>3]=s,v)|0);t=c[l+156>>2]|0;if((t|0)==(c[n>>2]|0)){U=179864}else{U=c[53424+(t<<2)>>2]|0}s=+h[l+176>>3];cf(b|0,77424,(v=i,i=i+16|0,c[v>>2]=U,h[v+8>>3]=s,v)|0);s=+h[l+192>>3];cf(b|0,76888,(v=i,i=i+8|0,h[v>>3]=s,v)|0);aI(76320,7,1,b|0);t=c[l+104>>2]|0;if((t|0)==2){aI(210848,2,1,b|0);C=1;D=q;break}else if((t|0)==0){aI(150688,2,1,b|0);C=1;D=q;break}else if((t|0)==1){aI(211336,2,1,b|0);C=1;D=q;break}else{C=1;D=q;break}}}while(0);do{if((p|0)==9448){p=0;C=k;D=l+4|0}else if((p|0)==9449){p=0;f=l+4|0;q=c[f>>2]|0;if(j){V=q}else{if((q|0)==(d|0)){V=d}else{C=k;D=f;break}}f=l+104|0;q=(c[m>>2]|0)==(b|0)?86152:85072;t=l+4|0;cf(b|0,74328,(v=i,i=i+16|0,c[v>>2]=q,c[v+8>>2]=V,v)|0);q=f+4|0;if((c[q>>2]|0)!=0){aI(82592,5,1,b|0);n=c[q>>2]|0;W=c[n>>2]|0;if((W|0)==0){X=179864}else{X=c[53424+(W<<2)>>2]|0}s=+h[n+16>>3];Y=c[n+4>>2]|0;if((Y|0)==(W|0)){Z=179864}else{Z=c[53424+(Y<<2)>>2]|0}y=+h[n+24>>3];W=c[n+8>>2]|0;if((W|0)==(Y|0)){_=179864}else{_=c[53424+(W<<2)>>2]|0}w=+h[n+32>>3];cf(b|0,215704,(v=i,i=i+48|0,c[v>>2]=X,h[v+8>>3]=s,c[v+16>>2]=Z,h[v+24>>3]=y,c[v+32>>2]=_,h[v+40>>3]=w,v)|0)}n=f|0;if((c[n>>2]|0)>1){$=1}else{C=1;D=t;break}while(1){cf(b|0,((c[m>>2]|0)==(b|0)?73888:127448)|0,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);f=c[q>>2]|0;W=c[f+($*40&-1)>>2]|0;if((W|0)==0){aa=179864}else{aa=c[53424+(W<<2)>>2]|0}w=+h[f+($*40&-1)+16>>3];Y=c[f+($*40&-1)+4>>2]|0;if((Y|0)==(W|0)){ab=179864}else{ab=c[53424+(Y<<2)>>2]|0}y=+h[f+($*40&-1)+24>>3];W=c[f+($*40&-1)+8>>2]|0;if((W|0)==(Y|0)){ac=179864}else{ac=c[53424+(W<<2)>>2]|0}s=+h[f+($*40&-1)+32>>3];cf(b|0,215704,(v=i,i=i+48|0,c[v>>2]=aa,h[v+8>>3]=w,c[v+16>>2]=ab,h[v+24>>3]=y,c[v+32>>2]=ac,h[v+40>>3]=s,v)|0);f=$+1|0;if((f|0)<(c[n>>2]|0)){$=f}else{C=1;D=t;break}}}}while(0);t=(c[m>>2]|0)==(b|0)?86152:85072;n=c[D>>2]|0;cf(b|0,73592,(v=i,i=i+16|0,c[v>>2]=t,c[v+8>>2]=n,v)|0);n=c[l+8>>2]|0;if((n|0)>0){ad=150856}else{ad=(n|0)<0?121920:150704}cf(b|0,73368,(v=i,i=i+8|0,c[v>>2]=ad,v)|0);s=+h[l+64>>3];if(s!=0.0){cf(b|0,223096,(v=i,i=i+8|0,h[v>>3]=s,v)|0)}aI(222648,3,1,b|0);n=c[l+52>>2]|0;do{if((n|0)==-7){aI(126024,7,1,b|0)}else{if((a[l+80|0]&1)==0){t=n+1|0;cf(b|0,121528,(v=i,i=i+8|0,c[v>>2]=t,v)|0);break}else{jg(b,l+88|0);break}}}while(0);aI(220776,11,1,b|0);jf(b,l+16|0);n=c[l>>2]|0;if((n|0)==0){g=C;break}else{k=C;l=n}}}if((d|0)<1|g){i=e;return}else{uf(c[13898]|0,218968,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}function jk(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0,u=0,w=0,x=0,y=0,z=0.0,A=0;e=i;i=i+384|0;f=e|0;g=e+48|0;j=e+96|0;k=e+144|0;l=e+224|0;m=e+304|0;n=c[64916+(d*688&-1)>>2]|0;o=n&3;p=56832+(d*24&-1)|0;if((o|0)==0){cf(b|0,128832,(v=i,i=i+8|0,c[v>>2]=p,v)|0);i=e;return}q=(a[65072+(d*688&-1)|0]&1)!=0?145600:128472;r=+h[65056+(d*688&-1)>>3];s=+h[65064+(d*688&-1)>>3];t=65032+(d*688&-1)|0;u=(c[t>>2]|0)!=0?185408:185368;cf(b|0,128728,(v=i,i=i+56|0,c[v>>2]=p,c[v+8>>2]=(o|0)==2?128640:149416,c[v+16>>2]=q,h[v+24>>3]=r,h[v+32>>3]=s,c[v+40>>2]=(n&4|0)!=0?179864:136208,c[v+48>>2]=u,v)|0);u=c[t>>2]|0;if((u|0)!=0){cf(b|0,128080,(v=i,i=i+8|0,c[v>>2]=u,v)|0)}aI(216256,8,1,b|0);u=c[64984+(d*688&-1)>>2]|0;if((u|0)==0){w=179864}else{w=c[53424+(u<<2)>>2]|0}s=+h[65e3+(d*688&-1)>>3];t=c[64988+(d*688&-1)>>2]|0;if((t|0)==(u|0)){x=179864}else{x=c[53424+(t<<2)>>2]|0}r=+h[65008+(d*688&-1)>>3];u=c[64992+(d*688&-1)>>2]|0;if((u|0)==(t|0)){y=179864}else{y=c[53424+(u<<2)>>2]|0}z=+h[65016+(d*688&-1)>>3];cf(b|0,215704,(v=i,i=i+48|0,c[v>>2]=w,h[v+8>>3]=s,c[v+16>>2]=x,h[v+24>>3]=r,c[v+32>>2]=y,h[v+40>>3]=z,v)|0);do{if((a[65272+(d*688&-1)|0]&1)==0){aI(127936,12,1,b|0)}else{y=c[65128+(d*688&-1)>>2]|0;if((y|0)==2){aI(131280,6,1,b|0);break}else if((y|0)==0){aI(131440,5,1,b|0);break}else if((y|0)==1){aI(131216,7,1,b|0);break}else{break}}}while(0);cf(b|0,127832,(v=i,i=i+8|0,c[v>>2]=p,v)|0);y=64920+(d*688&-1)|0;x=c[y>>2]|0;do{if((x|0)==2){w=64952+(d*688&-1)|0;z=+h[w>>3];if(z!=-8.988465674311579e+307){if((c[64808+(d*688&-1)>>2]|0)==1){aF(34,b|0);u=k|0;t=64813+(d*688&-1)|0;r=+h[w>>3];t3(j,r);s=r- +O(+r);t4(u,80,t,j,s);t=j3(u)|0;aK(t|0,b|0);aF(34,b|0)}else{cf(b|0,92736,(v=i,i=i+8|0,h[v>>3]=z,v)|0)}aF(44,b|0)}z=+h[64960+(d*688&-1)>>3];cf(b|0,170912,(v=i,i=i+8|0,h[v>>3]=z,v)|0);t=64968+(d*688&-1)|0;if(+h[t>>3]==8.988465674311579e+307){break}aF(44,b|0);if((c[64808+(d*688&-1)>>2]|0)==1){aF(34,b|0);u=l|0;w=64813+(d*688&-1)|0;z=+h[t>>3];t3(g,z);s=z- +O(+z);t4(u,80,w,g,s);w=j3(u)|0;aK(w|0,b|0);aF(34,b|0);break}else{s=+h[t>>3];cf(b|0,92736,(v=i,i=i+8|0,h[v>>3]=s,v)|0);break}}else if((x|0)==1){aI(127656,9,1,b|0)}else if((x|0)==4){cf(b|0,127576,(v=i,i=i+8|0,c[v>>2]=p,v)|0)}else if((x|0)==5){cf(b|0,127464,(v=i,i=i+8|0,c[v>>2]=p,v)|0)}}while(0);cf(b|0,((a[65024+(d*688&-1)|0]&1)!=0?127160:127080)|0,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);x=c[64924+(d*688&-1)>>2]|0;do{if((x|0)!=0){if((a[x]|0)==0){break}cf(b|0,126104,(v=i,i=i+8|0,c[v>>2]=x,v)|0)}}while(0);x=64928+(d*688&-1)|0;if((c[x>>2]|0)!=0){aI(145280,10,1,b|0);jg(b,x)}aF(10,b|0);x=64944+(d*688&-1)|0;if((c[x>>2]|0)==0){i=e;return}g=(c[y>>2]|0)==3?179864:186440;cf(b|0,126896,(v=i,i=i+16|0,c[v>>2]=p,c[v+8>>2]=g,v)|0);aI(126656,2,1,b|0);g=c[x>>2]|0;if((g|0)!=0){x=64808+(d*688&-1)|0;p=m|0;m=64813+(d*688&-1)|0;d=g;do{g=d+12|0;do{if((c[g>>2]|0)<0){A=d+16|0}else{y=c[d+8>>2]|0;if((y|0)!=0){l=j3(y)|0;cf(b|0,103640,(v=i,i=i+8|0,c[v>>2]=l,v)|0)}if((c[x>>2]|0)==1){aF(34,b|0);s=+h[d>>3];t3(f,s);z=s- +O(+s);t4(p,80,m,f,z);l=j3(p)|0;aK(l|0,b|0);aF(34,b|0)}else{z=+h[d>>3];cf(b|0,92736,(v=i,i=i+8|0,h[v>>3]=z,v)|0)}l=c[g>>2]|0;if((l|0)!=0){cf(b|0,95144,(v=i,i=i+8|0,c[v>>2]=l,v)|0)}l=d+16|0;if((c[l>>2]|0)==0){A=l;break}aI(86120,2,1,b|0);A=l}}while(0);d=c[A>>2]|0;}while((d|0)!=0)}aI(84944,2,1,b|0);i=e;return}function jl(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0;f=i;i=i+8|0;g=f|0;h=c[b>>2]|0;c[12918]=0;c[3530]=0;j=a[h]|0;if(j<<24>>24==0){k=0;l=c[3530]|0;m=c[1054]|0;n=m+(l*40&-1)+32|0;c[n>>2]=k;o=c[3530]|0;p=c[1054]|0;q=p+(o*40&-1)+36|0;c[q>>2]=0;r=c[3530]|0;s=c[1054]|0;t=s+(r*40&-1)|0;a[t]=1;u=c[3530]|0;i=f;return u|0}else{w=h;x=0;y=h;z=j;A=1}L13041:while(1){if((A|0)<(c[1052]|0)){B=z}else{dH();B=a[y]|0}L13046:do{if((aM(B&255|0)|0)==0){c[(c[1054]|0)+((c[3530]|0)*40&-1)+32>>2]=x;c[(c[1054]|0)+((c[3530]|0)*40&-1)+36>>2]=1;a[(c[1054]|0)+((c[3530]|0)*40&-1)|0]=1;j=a[y]|0;if(j<<24>>24==96){jm(b,e,x);C=x-1|0;D=c[b>>2]|0;break}L13051:do{if((bO(j&255|0)|0)==0){h=a[y]|0;if(h<<24>>24==95){E=x;F=9542;break}if(((h&255)-48|0)>>>0<10){a[(c[1054]|0)+((c[3530]|0)*40&-1)|0]=0;G=jn(y)|0;c[(c[1054]|0)+((c[3530]|0)*40&-1)+36>>2]=G;H=(x-1|0)+(c[(c[1054]|0)+((c[3530]|0)*40&-1)+36>>2]|0)|0;I=w;break}J=h<<24>>24;if((h<<24>>24|0)==46){if(((a[w+(x+1|0)|0]|0)-48|0)>>>0>=10){H=x;I=w;break}a[(c[1054]|0)+((c[3530]|0)*40&-1)|0]=0;G=jn(y)|0;c[(c[1054]|0)+((c[3530]|0)*40&-1)+36>>2]=G;H=(x-1|0)+(c[(c[1054]|0)+((c[3530]|0)*40&-1)+36>>2]|0)|0;I=w;break}else if((h<<24>>24|0)==39|(h<<24>>24|0)==34){G=(c[1054]|0)+((c[3530]|0)*40&-1)+36|0;c[G>>2]=(c[G>>2]|0)+1;G=a[y]|0;K=x+1|0;L=w+K|0;M=a[L]|0;if(M<<24>>24==G<<24>>24){H=K;I=w;break}N=G<<24>>24==34;O=G<<24>>24==39;P=w;Q=x;R=K;K=L;L=M;L13062:while(1){S=Q;T=R;U=K;M=L;L13064:while(1){if(M<<24>>24==0){break L13062}do{if(N&M<<24>>24==92){V=S+2|0;if((a[P+V|0]|0)==0){F=9567;break}W=(c[1054]|0)+((c[3530]|0)*40&-1)+36|0;c[W>>2]=(c[W>>2]|0)+2;X=V}else{F=9567}}while(0);L13070:do{if((F|0)==9567){F=0;do{if(N){if(M<<24>>24==96){break L13064}}else{if(!O){break}if((a[P+(S+2|0)|0]|0)!=39){break}V=S+3|0;if((a[P+V|0]|0)!=39){break}W=(c[1054]|0)+((c[3530]|0)*40&-1)+36|0;c[W>>2]=(c[W>>2]|0)+3;X=V;break L13070}}while(0);V=(c[1054]|0)+((c[3530]|0)*40&-1)+36|0;c[V>>2]=(c[V>>2]|0)+1;X=T}}while(0);V=X+1|0;W=P+V|0;Y=a[W]|0;if(Y<<24>>24==G<<24>>24){H=V;I=P;break L13051}else{S=X;T=V;U=W;M=Y}}jm(b,e,T);M=c[b>>2]|0;Y=S+1|0;W=M+Y|0;V=a[W]|0;if(V<<24>>24==34){H=Y;I=M;break L13051}else{P=M;Q=S;R=Y;K=W;L=V}}a[U]=G;a[P+(S+2|0)|0]=0;H=T;I=P;break}else if((h<<24>>24|0)==123){a[(c[1054]|0)+((c[3530]|0)*40&-1)|0]=0;c[(c[1054]|0)+((c[3530]|0)*40&-1)+8>>2]=2;L=x+1|0;K=c[3530]|0;R=c[1054]|0;Q=ca(w+L|0,153808,(v=i,i=i+24|0,c[v>>2]=R+(K*40&-1)+16,c[v+8>>2]=R+(K*40&-1)+24,c[v+16>>2]=g,v)|0)|0;if((Q|0)<1){c[12918]=(c[12918]|0)+1;K=c[3530]|0;c[3530]=K+1;a[(c[1054]|0)+(K*40&-1)|0]=1;C=x;D=w;break L13046}Z=c[3530]|0;if(!((Q|0)==3&(a[g]|0)==125)){F=9553;break L13041}Q=(c[1054]|0)+(Z*40&-1)+36|0;c[Q>>2]=(c[Q>>2]|0)+2;Q=L;while(1){L=Q+1|0;K=w+L|0;if((a[K]|0)==125){H=L;I=w;break L13051}R=(c[1054]|0)+((c[3530]|0)*40&-1)+36|0;c[R>>2]=(c[R>>2]|0)+1;if((a[K]|0)==0){F=9557;break L13041}else{Q=L}}}else{if((J|0)==35){k=x;F=9588;break L13041}else if((J|0)==125){c[12918]=(c[12918]|0)-1;H=x;I=w;break}else if((J|0)==94|(J|0)==43|(J|0)==45|(J|0)==47|(J|0)==37|(J|0)==126|(J|0)==40|(J|0)==41|(J|0)==91|(J|0)==93|(J|0)==59|(J|0)==58|(J|0)==63|(J|0)==44|(J|0)==36){H=x;I=w;break}else if((J|0)==33|(J|0)==60|(J|0)==62){Q=x+1|0;if((a[w+Q|0]|0)!=61){H=x;I=w;break}P=(c[1054]|0)+((c[3530]|0)*40&-1)+36|0;c[P>>2]=(c[P>>2]|0)+1;H=Q;I=w;break}else if((J|0)==38|(J|0)==124|(J|0)==61|(J|0)==42){Q=x+1|0;if(h<<24>>24!=(a[w+Q|0]|0)){H=x;I=w;break}P=(c[1054]|0)+((c[3530]|0)*40&-1)+36|0;c[P>>2]=(c[P>>2]|0)+1;H=Q;I=w;break}else{F=9581;break L13041}}}else{E=x;F=9542}}while(0);L13097:do{if((F|0)==9542){while(1){F=0;j=E+1|0;Q=w+j|0;if((bs(d[Q]|0|0)|0)==0){if((a[Q]|0)!=95){H=E;I=w;break L13097}}Q=(c[1054]|0)+((c[3530]|0)*40&-1)+36|0;c[Q>>2]=(c[Q>>2]|0)+1;E=j;F=9542}}}while(0);c[3530]=(c[3530]|0)+1;C=H;D=I}else{C=x;D=w}}while(0);h=C+1|0;j=D+h|0;Q=a[j]|0;if(Q<<24>>24==0){k=h;F=9587;break}w=D;x=h;y=j;z=Q;A=(c[3530]|0)+1|0}if((F|0)==9553){uf(Z,211216,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((F|0)==9581){uf(c[3530]|0,134656,(v=i,i=i+8|0,c[v>>2]=J,v)|0);return 0}else if((F|0)==9588){l=c[3530]|0;m=c[1054]|0;n=m+(l*40&-1)+32|0;c[n>>2]=k;o=c[3530]|0;p=c[1054]|0;q=p+(o*40&-1)+36|0;c[q>>2]=0;r=c[3530]|0;s=c[1054]|0;t=s+(r*40&-1)|0;a[t]=1;u=c[3530]|0;i=f;return u|0}else if((F|0)==9557){uf(c[3530]|0,154312,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((F|0)==9587){l=c[3530]|0;m=c[1054]|0;n=m+(l*40&-1)+32|0;c[n>>2]=k;o=c[3530]|0;p=c[1054]|0;q=p+(o*40&-1)+36|0;c[q>>2]=0;r=c[3530]|0;s=c[1054]|0;t=s+(r*40&-1)|0;a[t]=1;u=c[3530]|0;i=f;return u|0}return 0}function jm(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;f=i;i=i+8|0;g=f|0;h=c[b>>2]|0;j=h+e|0;k=j;while(1){l=k+1|0;m=a[l]|0;if((m<<24>>24|0)==0|(m<<24>>24|0)==96){break}else{k=l}}m=l-j|0;n=ut(m)|0;do{if((n|0)==0){gk();o=ut(m)|0;if((o|0)!=0){p=o;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=121896,v)|0)}else{p=n}}while(0);n=h+(e+1|0)|0;uF(p|0,n|0,m|0);if((uA(n|0)|0)>>>0>=m>>>0){a[p+((l|0)==(j|0)?0:m-1|0)|0]=0}do{if((a[l]|0)==0){q=0;r=0}else{m=k+2|0;j=(uA(m|0)|0)+1|0;if(j>>>0<=1){q=j;r=0;break}n=ut(j)|0;do{if((n|0)==0){gk();h=ut(j)|0;if((h|0)!=0){s=h;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=104824,v)|0)}else{s=n}}while(0);uB(s|0,m|0);q=j;r=s}}while(0);eo(p,g);uu(p);p=c[g>>2]|0;g=0;s=e;while(1){e=g+1|0;k=a[p+g|0]|0;if((k<<24>>24|0)==0){break}else if((k<<24>>24|0)==10|(k<<24>>24|0)==13){t=s}else{a[(c[b>>2]|0)+s|0]=k;t=s+1|0}if((t|0)!=(c[d>>2]|0)){g=e;s=t;continue}dG();g=e;s=t}a[(c[b>>2]|0)+s|0]=0;uu(p);if((r|0)==0){a[25280]=0;i=f;return}p=s+q|0;if(p>>>0>(c[d>>2]|0)>>>0){do{dG();}while(p>>>0>(c[d>>2]|0)>>>0)}uB((c[b>>2]|0)+s|0,r|0);uu(r);a[25280]=0;i=f;return}function jn(b){b=b|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0.0;e=i;i=i+8|0;f=e|0;a[(c[1054]|0)+((c[3530]|0)*40&-1)|0]=0;c[(c[1054]|0)+((c[3530]|0)*40&-1)+8>>2]=1;g=0;while(1){j=a[b+g|0]|0;if(((j&255)-48|0)>>>0<10){g=g+1|0}else{break}}if(j<<24>>24==46){c[(c[1054]|0)+((c[3530]|0)*40&-1)+8>>2]=2;k=g;while(1){l=k+1|0;m=a[b+l|0]|0;if(((m&255)-48|0)>>>0<10){k=l}else{n=l;o=m;break}}}else{n=g;o=j}if((o<<24>>24|0)==101|(o<<24>>24|0)==69){c[(c[1054]|0)+((c[3530]|0)*40&-1)+8>>2]=2;o=n+1|0;j=a[b+o|0]|0;if((j<<24>>24|0)==45|(j<<24>>24|0)==43){g=n+2|0;p=g;q=a[b+g|0]|0}else{p=o;q=j}if(((q&255)-48|0)>>>0<10){q=p;while(1){j=q+1|0;if(((d[b+j|0]|0)-48|0)>>>0<10){q=j}else{r=j;break}}}else{q=(c[1054]|0)+((c[3530]|0)*40&-1)+32|0;c[q>>2]=(c[q>>2]|0)+p;uf(c[3530]|0,97936,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}}else{r=n}n=c[3530]|0;p=c[1054]|0;do{if((c[p+(n*40&-1)+8>>2]|0)==1){c[b0()>>2]=0;q=aE(b|0,f|0,0)|0;j=(c[b0()>>2]|0)==0;o=c[3530]|0;if(!j){uh(o,91904,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);c[(c[1054]|0)+((c[3530]|0)*40&-1)+8>>2]=2;s=c[3530]|0;t=c[1054]|0;break}c[(c[1054]|0)+(o*40&-1)+16>>2]=q;u=(c[f>>2]|0)-b|0;i=e;return u|0}else{s=n;t=p}}while(0);h[t+(s*40&-1)+24>>3]=0.0;w=+uz(b,0);h[(c[1054]|0)+((c[3530]|0)*40&-1)+16>>3]=w;u=r;i=e;return u|0}function jo(){var d=0,e=0,f=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,$=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,aA=0,aB=0,aC=0,aD=0,aE=0,aF=0,aH=0,aJ=0,aK=0,aL=0,aM=0,aN=0,aO=0,aP=0,aR=0,aS=0,aT=0,aU=0,aV=0,aW=0,aX=0,aZ=0,a$=0,a0=0,a1=0,a2=0,a3=0,a4=0,a5=0,a6=0,a7=0,a8=0,a9=0,ba=0,bb=0,bc=0,bd=0,bf=0,bg=0,bh=0,bj=0,bk=0,bl=0,bm=0,bn=0,bo=0,bp=0,bq=0,br=0,bs=0,bt=0,bu=0,bv=0,bw=0,bx=0,by=0,bz=0,bB=0,bC=0,bD=0,bE=0,bG=0,bH=0,bI=0,bJ=0,bK=0,bL=0,bM=0,bN=0,bO=0,bQ=0,bR=0,bS=0,bT=0,bV=0,bW=0,bX=0,bY=0,bZ=0,b_=0,b0=0,b1=0,b2=0,b3=0,b4=0,b5=0,b6=0,b7=0,b8=0,b9=0,cb=0,cc=0,cd=0,ce=0,cg=0,ch=0,ci=0,cj=0,ck=0,cl=0,cm=0,cn=0,co=0,cp=0,cq=0,cr=0,cs=0,ct=0,cu=0,cv=0,cw=0,cx=0,cy=0,cA=0,cC=0,cD=0,cE=0,cF=0,cG=0,cH=0,cI=0,cJ=0,cK=0,cL=0,cM=0,cN=0,cO=0,cP=0,cQ=0,cR=0,cT=0,cU=0,cV=0,cW=0,cX=0,cY=0,cZ=0,c_=0,c$=0,c0=0,c1=0,c2=0,c3=0,c4=0,c5=0,c6=0,c7=0,c8=0,c9=0,da=0,dc=0,dd=0,de=0,df=0,dg=0,dh=0,di=0,dj=0,dk=0,dm=0,dn=0,dp=0,dq=0,dr=0,ds=0,dt=0,du=0,dv=0,dw=0,dx=0,dy=0,dz=0,dA=0,dB=0,dC=0,dD=0,dE=0,dF=0,dG=0,dH=0,dI=0,dJ=0,dK=0,dL=0,dM=0,dN=0,dO=0,dP=0,dQ=0,dR=0,dS=0,dT=0,dU=0,dV=0,dW=0,dX=0,dY=0,dZ=0,d_=0,d$=0,d0=0,d1=0,d2=0,d3=0,d4=0,d5=0,d6=0,d7=0,d8=0,d9=0,eb=0,ec=0,ed=0,ee=0,ef=0,eg=0,eh=0,ei=0,ej=0,ek=0,el=0,em=0,en=0,eo=0,ep=0,eq=0,er=0,es=0,et=0,eu=0,ev=0,ew=0,ex=0,eA=0,eB=0,eD=0,eE=0,eF=0,eG=0,eH=0,eI=0,eJ=0,eK=0,eL=0,eM=0,eN=0,eO=0,eQ=0,eR=0,eS=0,eT=0,eU=0,eV=0,eW=0,eX=0,eY=0,eZ=0,e_=0,e$=0,e0=0,e2=0,e3=0,e4=0,e5=0,e6=0,e8=0,e9=0,fa=0,fb=0,fc=0,fd=0,fe=0,ff=0,fg=0,fh=0,fi=0,fj=0,fk=0,fl=0,fm=0,fn=0,fo=0,fp=0,fq=0,fr=0,fs=0,ft=0,fu=0,fv=0,fw=0,fx=0,fy=0,fz=0,fA=0,fB=0,fC=0,fD=0,fE=0,fF=0,fG=0,fH=0,fI=0,fJ=0,fK=0,fL=0,fM=0,fN=0,fO=0,fP=0,fQ=0,fS=0,fT=0,fU=0,fV=0,fW=0,fX=0,fY=0,fZ=0,f_=0,f$=0,f0=0,f1=0,f2=0,f3=0,f4=0,f5=0,f6=0,f7=0,f8=0,f9=0,ga=0,gb=0,gc=0,gd=0,ge=0,gf=0,gg=0,gh=0,gi=0,gj=0,gl=0,gm=0,gn=0,go=0,gp=0,gq=0,gs=0,gt=0,gu=0,gv=0,gw=0,gx=0,gy=0,gz=0,gA=0,gB=0,gC=0,gD=0,gE=0,gF=0,gG=0,gH=0,gI=0,gJ=0,gK=0,gL=0,gM=0,gN=0,gO=0,gP=0,gQ=0,gR=0,gS=0,gT=0,gU=0,gV=0,gW=0,gX=0.0,gY=0,gZ=0,g_=0,g$=0,g0=0,g1=0,g2=0,g3=0,g4=0,g5=0,g6=0,g7=0,g8=0,g9=0,ha=0,hb=0,hc=0.0,hd=0,he=0,hf=0,hg=0,hh=0,hi=0,hj=0,hk=0,hl=0,hm=0,hn=0,ho=0,hp=0,hq=0,hr=0,hs=0,ht=0,hu=0,hv=0,hw=0,hx=0,hy=0,hA=0,hB=0,hC=0,hF=0,hG=0,hK=0,hN=0,hP=0,hQ=0,hR=0,hS=0,hT=0,hU=0,hV=0,hW=0,hY=0,hZ=0,h_=0,h$=0,h0=0,h1=0,h2=0,h3=0,h4=0,h5=0,h6=0,h7=0,h8=0,h9=0,ia=0,ib=0,ic=0,id=0,ie=0,ig=0,ih=0,ii=0,ij=0,ik=0,il=0,im=0,io=0,ip=0,iq=0,ir=0,iu=0,iv=0,iy=0,iz=0,iA=0,iB=0,iC=0,iD=0,iE=0,iF=0,iG=0,iH=0,iI=0,iJ=0,iK=0,iL=0,iM=0,iN=0,iP=0,iR=0,iS=0,iT=0,iU=0,iV=0,iW=0,iX=0,iZ=0,i_=0,i$=0,i0=0,i1=0,i2=0,i3=0,i4=0,i5=0,i6=0,i7=0,i8=0,ja=0,jb=0,jc=0,jd=0,je=0,jf=0,jg=0,jh=0,ji=0,jj=0,jk=0,jl=0,jm=0,jn=0,jo=0,jy=0,jz=0,jA=0,jB=0,jC=0,jD=0,jE=0,jF=0,jG=0,jH=0,jI=0,jJ=0,jK=0,jL=0,jM=0,jN=0,jO=0,jP=0,jQ=0,jR=0,jS=0,jT=0,jU=0,jV=0,jW=0,jX=0,jY=0,jZ=0,j_=0,j$=0,j0=0,j1=0,j2=0,j3=0,j4=0,j5=0,j6=0,j7=0,j8=0,j9=0,ka=0,kb=0,kc=0,kd=0,ke=0,kf=0,kg=0,kh=0,ki=0,kj=0,kk=0,kl=0,km=0,kn=0,ko=0,kp=0,kq=0,kr=0,ks=0,kt=0,ku=0,kv=0,kw=0,kx=0,ky=0,kz=0,kA=0,kB=0,kC=0,kD=0,kE=0,kF=0,kG=0,kH=0,kI=0,kJ=0,kK=0,kL=0,kM=0,kN=0,kO=0,kP=0,kQ=0,kR=0,kS=0,kT=0,kU=0,kV=0,kW=0,kX=0,kY=0,kZ=0,k_=0,k$=0,k0=0,k1=0,k2=0,k3=0.0,k4=0,k5=0,k6=0,k7=0,k8=0,k9=0,la=0.0,lb=0.0,lc=0,ld=0,le=0,lf=0,lg=0,lh=0,li=0,lk=0,lm=0,ln=0,lo=0,lp=0,lq=0,lr=0,lt=0,lu=0,lv=0,lw=0,lx=0,ly=0,lA=0,lB=0,lC=0,lD=0,lE=0,lF=0,lG=0,lH=0,lI=0,lJ=0,lK=0,lL=0,lM=0,lN=0,lO=0,lP=0,lQ=0,lR=0,lS=0,lT=0,lU=0,lV=0.0,lW=0,lX=0,lY=0,lZ=0,l_=0,l$=0,l0=0,l1=0,l2=0,l3=0,l4=0,l5=0,l6=0,l7=0,l8=0,l9=0,ma=0,mb=0,mc=0,md=0,me=0,mf=0,mg=0,mh=0,mi=0,mj=0,mk=0.0,ml=0,mm=0,mn=0,mo=0,mp=0.0,mq=0,mr=0,ms=0,mt=0,mu=0,mv=0,mw=0,mx=0,my=0,mz=0,mA=0.0,mB=0,mC=0.0,mD=0,mE=0,mF=0.0,mG=0,mH=0,mI=0.0,mJ=0.0,mK=0,mL=0,mM=0.0,mN=0,mO=0,mP=0,mQ=0,mR=0,mS=0,mT=0,mU=0,mV=0,mW=0,mX=0,mY=0,mZ=0,m_=0,m$=0,m0=0,m1=0,m2=0.0,m3=0.0,m4=0.0,m5=0.0,m6=0,m7=0,m8=0,m9=0,na=0,nb=0.0,nc=0.0,nd=0,ne=0,nf=0,ng=0,nh=0,ni=0,nj=0,nk=0,nl=0,nm=0,nn=0,no=0,np=0,nq=0.0,nr=0.0,ns=0,nt=0,nu=0,nv=0.0,nw=0,nx=0,ny=0,nz=0.0,nA=0.0,nB=0.0,nC=0.0,nD=0.0,nE=0,nF=0,nG=0,nH=0,nI=0,nJ=0,nK=0,nL=0,nM=0,nN=0,nO=0,nP=0,nQ=0,nR=0,nS=0,nT=0,nU=0,nV=0,nW=0,nX=0,nY=0,nZ=0,n_=0,n$=0,n0=0,n1=0,n2=0,n3=0,n4=0,n5=0,n6=0,n7=0,n8=0,n9=0,oa=0,ob=0,oc=0,od=0,oe=0,of=0,og=0,oh=0,oi=0,oj=0,ok=0,ol=0,om=0,on=0,oo=0,op=0,oq=0,or=0,os=0,ot=0,ou=0,ov=0,ow=0,ox=0,oy=0,oz=0,oA=0,oB=0,oC=0,oD=0,oE=0,oF=0,oG=0,oH=0,oI=0,oJ=0,oK=0,oL=0,oM=0,oN=0,oO=0,oP=0,oQ=0,oR=0,oS=0,oT=0,oU=0,oV=0,oW=0,oX=0,oY=0,oZ=0,o_=0,o$=0,o0=0,o1=0,o2=0,o3=0,o4=0,o5=0,o6=0,o7=0,o8=0,o9=0,pa=0,pb=0,pc=0,pd=0,pe=0,pf=0,pg=0,ph=0,pi=0,pj=0,pk=0,pl=0,pm=0,pn=0,po=0,pp=0,pq=0,pr=0,ps=0,pt=0,pu=0,pv=0,pw=0,px=0,py=0,pz=0,pA=0,pB=0,pC=0,pD=0,pE=0,pF=0,pG=0,pH=0,pI=0,pJ=0,pK=0,pL=0,pM=0,pN=0,pO=0,pP=0,pQ=0,pR=0,pS=0,pT=0,pU=0,pV=0,pW=0,pX=0,pY=0,pZ=0,p_=0,p$=0,p0=0,p1=0,p2=0,p3=0,p4=0,p5=0,p6=0,p7=0,p8=0,p9=0,qa=0,qb=0,qc=0,qd=0,qe=0,qf=0,qg=0,qh=0,qi=0,qj=0,qk=0,ql=0,qm=0,qn=0,qo=0,qp=0,qq=0,qr=0,qs=0,qt=0,qu=0,qv=0,qw=0,qx=0,qy=0,qz=0,qA=0,qB=0,qC=0,qD=0,qE=0,qF=0,qG=0.0,qH=0,qI=0,qJ=0,qK=0,qL=0,qM=0,qN=0,qO=0.0,qP=0,qQ=0,qR=0,qS=0.0,qT=0,qU=0,qV=0,qW=0,qX=0,qY=0,qZ=0,q_=0,q$=0,q0=0,q1=0,q2=0,q3=0,q4=0,q5=0,q6=0.0,q7=0.0,q8=0.0,q9=0.0,ra=0.0,rb=0,rc=0,rd=0,re=0,rf=0,rg=0,rh=0,ri=0,rj=0,rk=0.0,rl=0,rm=0,rn=0,ro=0,rp=0.0,rq=0,rr=0.0,rs=0,rt=0,ru=0,rv=0,rw=0,rx=0,ry=0,rz=0,rA=0,rB=0,rC=0,rD=0,rE=0,rF=0,rG=0,rH=0,rI=0,rJ=0,rK=0,rL=0,rM=0,rN=0,rO=0,rP=0,rQ=0,rR=0.0,rS=0,rT=0,rU=0,rV=0,rW=0,rX=0,rY=0,rZ=0,r_=0,r$=0,r0=0,r1=0,r2=0,r3=0,r4=0.0,r5=0,r6=0,r7=0,r8=0,r9=0,sa=0,sb=0,sc=0,sd=0,se=0,sf=0,sg=0,sh=0,si=0,sj=0,sk=0,sl=0,sm=0,sn=0,so=0,sp=0,sq=0,sr=0,ss=0,st=0,su=0,sv=0,sw=0,sx=0,sy=0.0,sz=0.0,sA=0,sB=0,sC=0,sD=0,sE=0,sF=0,sG=0,sH=0,sI=0,sJ=0,sK=0,sL=0,sM=0,sN=0,sO=0,sP=0,sQ=0,sR=0,sS=0,sT=0,sU=0,sV=0,sW=0,sX=0,sY=0,sZ=0,s_=0,s$=0,s0=0,s1=0,s2=0,s3=0,s4=0,s5=0,s6=0,s7=0,s8=0,s9=0,ta=0,tb=0,tc=0,td=0,te=0,tf=0,tg=0,th=0,ti=0,tj=0,tk=0,tl=0,tm=0,tn=0,to=0,tp=0,tq=0,tr=0,ts=0,tt=0,tu=0,tv=0,tw=0,tx=0,ty=0,tz=0,tA=0,tB=0,tC=0,tD=0,tE=0,tF=0,tG=0.0,tH=0,tI=0,tJ=0,tK=0,tL=0,tM=0,tN=0,tO=0,tP=0,tQ=0,tR=0,tS=0,tT=0,tU=0,tV=0,tW=0,tX=0,tY=0,tZ=0,t_=0,t$=0,t0=0,t1=0,t2=0,t3=0,t4=0,t6=0,t7=0,t8=0,t9=0,ub=0,uc=0,ue=0,ug=0,ui=0,ul=0,um=0,un=0,uo=0,up=0,uv=0,uw=0,ux=0,uy=0,uC=0,uG=0,uH=0,uI=0,uJ=0,uK=0,uL=0,uM=0,uN=0,uO=0,uP=0,uQ=0,uR=0,uS=0,uT=0,uU=0,uV=0,uW=0,uX=0,uY=0,uZ=0,u_=0,u$=0,u0=0,u1=0,u2=0,u3=0,u4=0,u5=0,u6=0,u7=0.0,u8=0,u9=0,va=0,vb=0,vc=0,vd=0,ve=0.0,vf=0,vg=0,vh=0,vi=0,vj=0,vk=0,vl=0,vm=0,vn=0,vo=0,vp=0,vq=0,vr=0,vs=0,vt=0.0,vu=0,vv=0,vw=0.0,vx=0,vy=0,vz=0.0,vA=0,vB=0,vC=0.0,vD=0.0,vE=0,vF=0.0,vG=0.0,vH=0,vI=0,vJ=0,vK=0,vL=0,vM=0,vN=0,vO=0,vP=0,vQ=0,vR=0,vS=0,vT=0,vU=0.0,vV=0,vW=0.0,vX=0,vY=0,vZ=0,v_=0,v$=0,v0=0,v1=0,v2=0,v3=0,v4=0,v5=0,v6=0,v7=0,v8=0,v9=0,wa=0,wb=0.0,wc=0,wd=0,we=0,wf=0,wg=0,wh=0,wi=0,wj=0,wk=0,wl=0,wm=0,wn=0,wo=0,wp=0,wq=0,wr=0,ws=0,wt=0,wu=0,wv=0.0,ww=0.0,wx=0.0,wy=0.0,wz=0,wA=0,wB=0,wC=0,wD=0.0,wE=0,wF=0,wG=0,wH=0,wI=0,wJ=0.0,wK=0,wL=0,wM=0.0,wN=0,wO=0,wP=0,wQ=0,wR=0,wS=0,wT=0,wU=0,wV=0,wW=0,wX=0,wY=0,wZ=0,w_=0,w$=0,w0=0.0,w1=0,w2=0,w3=0,w4=0,w5=0,w6=0.0,w7=0.0,w8=0.0,w9=0.0,xa=0.0,xb=0.0,xc=0,xd=0,xe=0,xf=0,xg=0,xh=0,xi=0,xj=0,xk=0,xl=0,xm=0,xn=0,xo=0,xp=0.0,xq=0.0,xr=0.0,xs=0.0,xt=0.0,xu=0.0,xv=0,xw=0,xx=0,xy=0,xz=0,xA=0,xB=0,xC=0,xD=0,xE=0,xF=0,xG=0,xH=0,xI=0,xJ=0,xK=0,xL=0,xM=0,xN=0.0,xO=0,xP=0,xQ=0,xR=0,xS=0,xT=0,xU=0,xV=0,xW=0,xX=0,xY=0,xZ=0,x_=0.0,x$=0,x0=0,x1=0.0,x2=0.0,x3=0.0,x4=0.0,x5=0,x6=0,x7=0,x8=0,x9=0,ya=0,yb=0,yc=0,yd=0,ye=0,yf=0,yg=0,yh=0,yi=0,yj=0,yk=0,yl=0,ym=0,yn=0,yo=0,yp=0,yq=0,yr=0,ys=0,yt=0,yu=0,yv=0,yw=0,yx=0,yy=0.0,yz=0,yA=0,yB=0,yC=0,yD=0,yE=0,yF=0,yG=0,yH=0,yI=0,yJ=0,yK=0,yL=0,yM=0,yN=0,yO=0,yP=0,yQ=0,yR=0,yS=0,yT=0.0,yU=0,yV=0,yW=0,yX=0.0,yY=0,yZ=0,y_=0,y$=0,y0=0,y1=0,y2=0,y3=0,y4=0,y5=0,y6=0,y7=0,y8=0,y9=0,za=0,zb=0,zc=0.0,zd=0,ze=0,zf=0,zg=0,zh=0,zi=0,zj=0,zk=0.0,zl=0.0,zm=0,zn=0,zo=0,zp=0,zq=0,zr=0,zs=0,zt=0,zu=0,zv=0,zw=0,zx=0,zy=0,zz=0,zA=0,zB=0,zC=0.0,zD=0,zE=0,zF=0,zG=0,zH=0,zI=0,zJ=0,zK=0,zL=0,zM=0,zN=0,zO=0,zP=0,zQ=0,zR=0,zS=0,zT=0,zU=0.0,zV=0,zW=0,zX=0,zY=0,zZ=0,z_=0,z$=0,z0=0,z1=0,z2=0,z3=0,z4=0,z5=0,z6=0,z7=0,z8=0,z9=0,Aa=0,Ab=0,Ac=0,Ad=0,Ae=0,Af=0,Ag=0,Ah=0,Ai=0,Aj=0,Ak=0,Al=0,Am=0,An=0,Ao=0,Ap=0,Aq=0,Ar=0,As=0,At=0,Au=0,Av=0,Aw=0,Ax=0,Ay=0,Az=0,AA=0,AB=0,AC=0,AD=0.0,AE=0,AF=0,AG=0,AH=0,AI=0,AJ=0,AK=0,AL=0.0,AM=0,AN=0,AO=0,AP=0,AQ=0,AR=0,AS=0,AT=0,AU=0,AV=0,AW=0,AX=0,AY=0,AZ=0,A_=0,A$=0,A0=0,A1=0,A2=0,A3=0,A4=0,A5=0,A6=0,A7=0,A8=0,A9=0,Ba=0,Bb=0,Bc=0,Bd=0,Be=0,Bf=0,Bg=0.0,Bh=0,Bi=0,Bj=0,Bk=0,Bl=0,Bm=0.0,Bn=0,Bo=0,Bp=0,Bq=0,Br=0,Bs=0,Bt=0,Bu=0,Bv=0,Bw=0,Bx=0,By=0,Bz=0,BA=0,BB=0,BC=0.0,BD=0,BE=0,BF=0,BG=0,BH=0,BI=0,BJ=0,BK=0,BL=0,BM=0,BN=0,BO=0,BP=0,BQ=0,BR=0,BS=0.0,BT=0,BU=0,BV=0,BW=0,BX=0,BY=0,BZ=0,B_=0,B$=0,B0=0,B1=0,B2=0,B3=0,B4=0,B5=0,B6=0,B7=0,B8=0,B9=0,Ca=0,Cb=0,Cc=0,Cd=0,Ce=0,Cf=0,Cg=0,Ch=0,Ci=0,Cj=0,Ck=0,Cl=0,Cm=0,Cn=0,Co=0,Cp=0,Cq=0,Cr=0,Cs=0,Ct=0,Cu=0,Cv=0,Cw=0,Cx=0,Cy=0,Cz=0,CA=0,CB=0,CC=0,CD=0,CE=0,CF=0,CG=0,CH=0,CI=0,CJ=0,CK=0,CL=0,CM=0,CN=0,CO=0,CP=0,CQ=0,CR=0,CS=0,CT=0,CU=0,CV=0,CW=0,CX=0,CY=0,CZ=0,C_=0,C$=0,C0=0,C1=0,C2=0,C3=0.0,C4=0.0,C5=0.0,C6=0,C7=0,C8=0,C9=0,Da=0,Db=0.0,Dc=0,Dd=0,De=0,Df=0,Dg=0,Dh=0,Di=0,Dj=0,Dk=0,Dl=0,Dm=0,Dn=0,Do=0,Dp=0,Dq=0,Dr=0,Ds=0,Dt=0,Du=0,Dv=0,Dw=0,Dx=0,Dy=0,Dz=0,DA=0,DB=0,DC=0,DD=0,DE=0,DF=0,DG=0,DH=0,DI=0,DJ=0,DK=0,DL=0,DM=0,DN=0,DO=0,DP=0,DQ=0,DR=0,DS=0,DT=0,DU=0,DV=0,DW=0,DX=0,DY=0,DZ=0,D_=0,D$=0.0,D0=0.0,D1=0.0,D2=0,D3=0.0,D4=0,D5=0,D6=0,D7=0,D8=0,D9=0,Ea=0,Eb=0,Ec=0,Ed=0,Ee=0,Ef=0,Eg=0,Eh=0,Ei=0,Ej=0,Ek=0,El=0,Em=0,En=0,Eo=0,Ep=0,Eq=0,Er=0,Es=0,Et=0,Eu=0,Ev=0,Ew=0,Ex=0,Ey=0,Ez=0,EA=0,EB=0,EC=0,ED=0,EE=0,EF=0,EG=0,EH=0,EI=0,EJ=0,EK=0,EL=0,EM=0,EN=0,EO=0,EP=0,EQ=0,ER=0,ES=0,ET=0,EU=0,EV=0.0,EW=0.0,EX=0,EY=0,EZ=0,E_=0,E$=0,E0=0,E1=0,E2=0,E3=0,E4=0,E5=0,E6=0,E7=0,E8=0.0,E9=0.0,Fa=0.0,Fb=0.0,Fc=0.0,Fd=0.0,Fe=0,Ff=0,Fg=0,Fh=0.0,Fi=0,Fj=0.0,Fk=0,Fl=0,Fm=0,Fn=0.0,Fo=0.0,Fp=0,Fq=0,Fr=0,Fs=0,Ft=0,Fu=0,Fv=0,Fw=0,Fx=0,Fy=0,Fz=0;d=i;i=i+3552|0;e=d|0;f=d+24|0;j=d+48|0;k=d+72|0;l=d+96|0;n=d+120|0;o=d+144|0;p=d+168|0;q=d+192|0;r=d+216|0;s=d+240|0;t=d+264|0;u=d+288|0;x=d+312|0;y=d+336|0;z=d+360|0;A=d+384|0;B=d+408|0;C=d+432|0;D=d+456|0;E=d+480|0;F=d+504|0;G=d+544|0;H=d+560|0;I=d+584|0;J=d+608|0;K=d+632|0;L=d+656|0;M=d+680|0;N=d+704|0;O=d+728|0;R=d+752|0;S=d+776|0;T=d+968|0;U=d+992|0;V=d+1016|0;W=d+1040|0;X=d+1064|0;Y=d+1088|0;Z=d+1112|0;$=d+1136|0;ab=d+1160|0;ac=d+1184|0;ad=d+1208|0;ae=d+1216|0;af=d+1240|0;ag=d+1264|0;ah=d+1288|0;ai=d+1312|0;aj=d+1368|0;ak=d+1392|0;al=d+1424|0;am=d+1448|0;an=d+1472|0;ao=d+1496|0;ap=d+1520|0;aq=d+1544|0;ar=d+1552|0;as=d+1560|0;at=d+1568|0;au=d+1592|0;av=d+1616|0;aw=d+1640|0;ax=d+1664|0;ay=d+1688|0;aA=d+1712|0;aB=d+1736|0;aC=d+1760|0;aD=d+1784|0;aE=d+1808|0;aF=d+1832|0;aH=d+1840|0;aJ=d+1864|0;aK=d+1888|0;aL=d+1912|0;aM=d+1936|0;aN=d+1960|0;aO=d+1984|0;aP=d+2008|0;aR=d+2032|0;aS=d+2056|0;aT=d+2080|0;aU=d+2104|0;aV=d+2128|0;aW=d+2152|0;aX=d+2176|0;aZ=d+2184|0;a$=d+2192|0;a0=d+2216|0;a1=d+2240|0;a2=d+2280|0;a3=d+2304|0;a4=d+2328|0;a5=d+2352|0;a6=d+2368|0;a7=d+2392|0;a8=d+2416|0;a9=d+2424|0;ba=d+2448|0;bb=d+2472|0;bc=d+2496|0;bd=d+2528|0;bf=d+2552|0;bg=d+2576|0;bh=d+2600|0;bj=d+2624|0;bk=d+2648|0;bl=d+2672|0;bm=d+2696|0;bn=d+2720|0;bo=d+2744|0;bp=d+2768|0;bq=d+2792|0;br=d+2808|0;bs=d+2832|0;bt=d+2856|0;bu=d+2880|0;bv=d+2904|0;bw=d+2912|0;bx=d+2936|0;by=d+2944|0;bz=d+2952|0;bB=d+2960|0;bC=d+2968|0;bD=d+2976|0;bE=d+3e3|0;bG=d+3024|0;bH=d+3048|0;bI=d+3072|0;bJ=d+3096|0;bK=d+3120|0;bL=d+3144|0;bM=d+3168|0;bN=d+3192|0;bO=d+3216|0;bQ=d+3240|0;bR=d+3264|0;bS=d+3288|0;bT=d+3312|0;bV=d+3336|0;bW=d+3360|0;bX=d+3384|0;bY=d+3408|0;bZ=d+3432|0;b_=d+3456|0;b0=d+3480|0;b1=d+3504|0;b2=d+3528|0;b3=(c[13898]|0)+1|0;c[13898]=b3;b4=c[1054]|0;b5=c[b4+(b3*40&-1)+32>>2]|0;b6=c[10036]|0;do{if((a[b6+b5|0]|0)==110){if((a[b6+(b5+1|0)|0]|0)!=111){b7=6;break}if((a[37400]&1)==0){b8=b3;b9=b4;cb=b5}else{uh(b3,153488,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);cc=c[13898]|0;cd=c[1054]|0;b8=cc;b9=cd;cb=c[cd+(cc*40&-1)+32>>2]|0}c[b9+(b8*40&-1)+32>>2]=cb+2;cc=(c[1054]|0)+((c[13898]|0)*40&-1)+36|0;c[cc>>2]=(c[cc>>2]|0)-2;c[13898]=(c[13898]|0)-1;t5()}else{b7=6}}while(0);L7:do{if((b7|0)==6){cb=iw()|0;c[6074]=cb;do{if((cb|0)!=0){if((a[cb+38|0]&1)==0){break}b8=c[13898]|0;b9=c[8272]|0;L12:do{if((b8|0)<(b9|0)){b3=c[1054]|0;b5=b8;while(1){L16:do{if((a[b3+(b5*40&-1)|0]&1)!=0){b4=c[b3+(b5*40&-1)+36>>2]|0;b6=b3+(b5*40&-1)+32|0;cc=c[10036]|0;cd=0;while(1){if((cd|0)>=(b4|0)){break}if((a[cc+((c[b6>>2]|0)+cd|0)|0]|0)==(a[cd+103664|0]|0)){cd=cd+1|0}else{break L16}}if((cd|0)==1){ce=cb;break L12}}}while(0);b6=b5+1|0;c[13898]=b6;if((b6|0)<(b9|0)){b5=b6}else{ce=cb;break}}}else{ce=cb}}while(0);while(1){b9=c[ce>>2]|0;uu(c[ce+12>>2]|0);uu(ce);if((b9|0)==0){break}else{ce=b9}}i=d;return}}while(0);cb=c[13898]|0;b9=b2|0;b8=b2+8|0;b5=b0|0;b3=b1|0;b6=b_|0;cc=b_+8|0;b4=bZ|0;cg=bZ+8|0;ch=bY|0;ci=bY+8|0;cj=bX|0;ck=bX+8|0;cl=bW|0;cm=bW+8|0;cn=bT|0;co=bT+8|0;cp=bS|0;cq=bS+8|0;cr=bR|0;cs=bR+8|0;ct=bQ|0;cu=bQ+8|0;cv=bO|0;cw=bO+8|0;cx=bN|0;cy=bN+8|0;cA=bM|0;cC=bM+8|0;cD=bV|0;cE=bV+8|0;cF=bI|0;cG=bI+8|0;cH=bH|0;cI=bH+8|0;cJ=bG|0;cK=bG+8|0;cL=bL|0;cM=bL+8|0;cN=bK|0;cO=bK+8|0;cP=bJ|0;cQ=bJ+8|0;cR=bE|0;cT=bE+8|0;cU=bD|0;cV=bD+8|0;cW=bx|0;cX=bw|0;cY=bw+8|0;cZ=bu|0;c_=bu+8|0;c$=bt|0;c0=bt+8|0;c1=bs|0;c2=bs+8|0;c3=br|0;c4=br+8|0;c5=bq;c6=bp|0;c7=bp+8|0;c8=bo|0;c9=bo+8|0;da=bn|0;dc=bn+8|0;dd=bm|0;de=bm+8|0;df=bl|0;dg=bl+8|0;dh=bk|0;di=bk+8|0;dj=bj|0;dk=bj+8|0;dm=bq|0;dn=bq+8|0;dp=bh|0;dq=bh+8|0;dr=bg|0;ds=bg+8|0;dt=bf|0;du=bf+8|0;dv=bd|0;dw=bd+8|0;dx=bc|0;dy=bb|0;dz=bb+8|0;dA=dz;dB=dz;dz=bb+8|0;dC=a9|0;dD=a9+8|0;dE=ba|0;dF=ba+8|0;dG=a7|0;dH=a7+8|0;dI=a6|0;dJ=a6+8|0;dK=a5|0;dL=a4|0;dM=a4+8|0;dN=a2|0;dO=a2+8|0;dP=a3|0;dQ=a3+8|0;dR=a0+4|0;dS=a0+8|0;dT=aW+4|0;dU=aW+8|0;dV=aT|0;dW=aT+8|0;dX=aS|0;dY=aS+8|0;dZ=aP|0;d_=aP+8|0;d$=aO|0;d0=aO+8|0;d1=aR|0;d2=aR+8|0;d3=aV|0;d4=aV+8|0;d5=a$|0;d6=a$+8|0;d7=aM|0;d8=aM+8|0;d9=aL|0;eb=aL+8|0;ec=aK|0;ed=aK+8|0;ee=aN|0;ef=aN+8|0;eg=aH|0;eh=aH+8|0;ei=aJ|0;ej=aJ+8|0;ek=aE|0;el=aE+8|0;em=aC|0;en=aC+8|0;eo=aB|0;ep=aB+8|0;eq=aD|0;er=aD+8|0;es=aA|0;et=aA+8|0;eu=ay|0;ev=ay+8|0;ew=ax|0;ex=ax+8|0;eA=aw|0;eB=aw+8|0;eD=av|0;eE=av+8|0;eF=at|0;eG=at+8|0;eH=au|0;eI=au+8|0;eJ=ap|0;eK=ap+8|0;eL=ao|0;eM=ao+8|0;eN=an|0;eO=an+8|0;eQ=am|0;eR=am+8|0;eS=al|0;eT=al+8|0;eU=aj|0;eV=aj+8|0;eW=ak|0;eX=ak+8|0;eY=ak+16|0;eZ=ak+24|0;e_=ai|0;e$=ah|0;e0=ah+8|0;e2=ag|0;e3=ag+8|0;e4=af|0;e5=af+8|0;e6=ae|0;e8=ae+8|0;e9=ac|0;fa=ac+8|0;fb=ab|0;fc=ab+8|0;fd=$|0;fe=$+8|0;ff=Z|0;fg=Z+8|0;fh=Y|0;fi=Y+8|0;fj=V|0;fk=V+8|0;fl=X|0;fm=X+8|0;fn=W|0;fo=W+8|0;fp=U|0;fq=U+8|0;fr=T|0;fs=T+8|0;ft=S;fu=O|0;fv=O+8|0;fw=R|0;fx=R+8|0;fy=S+144|0;fz=S+72|0;fA=L|0;fB=L+8|0;fC=N|0;fD=N+8|0;fE=K|0;fF=K+8|0;fG=M|0;fH=M+8|0;fI=J|0;fJ=J+8|0;fK=I|0;fL=I+8|0;fM=H|0;fN=H+8|0;fO=F;fP=G;fQ=E|0;fS=E+8|0;fT=D|0;fU=D+8|0;fV=C|0;fW=C+8|0;fX=B|0;fY=B+8|0;fZ=z|0;f_=z+8|0;f$=A|0;f0=A+8|0;f1=y|0;f2=y+8|0;f3=x|0;f4=x+8|0;f5=t|0;f6=t+8|0;f7=u|0;f8=u+8|0;f9=s|0;ga=s+8|0;gb=q|0;gc=q+8|0;gd=p|0;ge=p+8|0;gf=o|0;gg=o+8|0;gh=n|0;gi=n+8|0;gj=l|0;gl=l+8|0;gm=k|0;gn=k+8|0;go=f|0;gp=f+8|0;gq=j|0;gs=j+8|0;gt=e|0;gu=e+8|0;gv=c[13898]|0;L27:while(1){gw=c[1054]|0;gx=c[gw+(gv*40&-1)+36>>2]|0;gy=c[gw+(gv*40&-1)+32>>2]|0;gz=(a[gw+(gv*40&-1)|0]&1)==0;gA=(gx|0)>0;gB=c[10036]|0;gC=21960;gD=96232;L29:while(1){L31:do{if(!gz){if(gA){gE=0;gF=0;gG=gy;while(1){gH=a[gD+gE|0]|0;if(gH<<24>>24==(a[gB+(gE+gG|0)|0]|0)){gI=gG;gJ=gF}else{if(gH<<24>>24!=36){break L31}gI=gG-1|0;gJ=1}gK=gE+1|0;if((gK|0)<(gJ+gx|0)){gE=gK;gF=gJ;gG=gI}else{break}}if((gJ|0)==0){gL=gK}else{gM=gC;break L29}}else{gL=0}gG=a[gD+gL|0]|0;if((gG<<24>>24|0)==36|(gG<<24>>24|0)==0){gM=gC;break L29}}}while(0);gG=gC+8|0;gF=c[gG>>2]|0;if((gF|0)==0){gM=gG;break}else{gC=gG;gD=gF}}gD=c[gM+4>>2]|0;L44:do{if((gD|0)==3){gN=gv+1|0;c[13898]=gN;L46:do{if((gN|0)<(c[8272]|0)){if((a[gw+(gN*40&-1)|0]&1)==0){b7=5107;break L27}gC=c[gw+(gN*40&-1)+36>>2]|0;gx=gw+(gN*40&-1)+32|0;gy=0;while(1){if((gy|0)>=(gC|0)){b7=34;break}gA=c[gx>>2]|0;if((a[gB+(gA+gy|0)|0]|0)==(a[gy+103664|0]|0)){gy=gy+1|0}else{gO=gA;break}}if((b7|0)==34){b7=0;if((gy|0)==1){b7=36;break}gO=c[gx>>2]|0}if((gC|0)>0){gP=0;gQ=0;gR=gO}else{b7=5108;break L27}while(1){if((a[gP+123160|0]|0)==(a[gB+(gP+gR|0)|0]|0)){gS=gR;gT=gQ}else{if((gP|0)!=1){gU=0;gV=0;gW=gO;break}gS=gR-1|0;gT=1}gA=gP+1|0;if((gA|0)<(gT+gC|0)){gP=gA;gQ=gT;gR=gS}else{b7=42;break}}do{if((b7|0)==42){b7=0;if((gT|0)==0){if(!((gP|0)==7|(gP|0)==0)){gU=0;gV=0;gW=gO;break}}c[13898]=gv+2;h[9040]=1.0;gX=1.0;break L46}}while(0);while(1){if((a[gU+123032|0]|0)==(a[gB+(gU+gW|0)|0]|0)){gY=gW;gZ=gV}else{if((gU|0)!=1){b7=5109;break L27}gY=gW-1|0;gZ=1}gx=gU+1|0;if((gx|0)<(gZ+gC|0)){gU=gx;gV=gZ;gW=gY}else{break}}if((gZ|0)==0){if(!((gU|0)==7|(gU|0)==0)){b7=5110;break L27}}c[13898]=gv+2;h[9040]=.017453292519943295;gX=.017453292519943295}else{b7=36}}while(0);if((b7|0)==36){b7=0;h[9040]=1.0;gX=1.0}if((a[30528]&1)==0|(c[17539]|0)==0){break}h[8773]=0.0;h[8774]=6.283185307179586/gX}else if((gD|0)==4){gC=gv+1|0;c[13898]=gC;gx=c[gw+(gC*40&-1)+36>>2]|0;gy=c[gw+(gC*40&-1)+32>>2]|0;gA=(a[gw+(gC*40&-1)|0]&1)==0;gz=(gx|0)>0&(gA^1);L82:do{if(gz){gF=0;gG=0;gE=gy;while(1){if((a[gF+124752|0]|0)==(a[gB+(gF+gE|0)|0]|0)){g_=gE;g$=gG}else{if((gF|0)!=4){b7=62;break L82}g_=gE-1|0;g$=1}gH=gF+1|0;if((gH|0)<(g$+gx|0)){gF=gH;gG=g$;gE=g_}else{break}}if((g$|0)!=0){b7=102;break}if((gF|0)==3|(gF|0)==8){b7=102}else{b7=62}}else{b7=62}}while(0);L91:do{if((b7|0)==62){b7=0;gE=(c[8272]|0)>(gC|0);L93:do{if(gE){if(gA){break}else{g0=0}while(1){if((g0|0)>=(gx|0)){b7=66;break}if((a[gB+(g0+gy|0)|0]|0)==(a[g0+150856|0]|0)){g0=g0+1|0}else{g1=0;break}}if((b7|0)==66){b7=0;if((g0|0)==5){b7=102;break L91}else{g1=0}}while(1){if((g1|0)>=(gx|0)){b7=69;break}if((a[gB+(g1+gy|0)|0]|0)==(a[g1+188576|0]|0)){g1=g1+1|0}else{g2=0;break}}if((b7|0)==69){b7=0;if((g1|0)==4){b7=102;break L91}else{g2=0}}while(1){if((g2|0)>=(gx|0)){b7=72;break}if((a[gB+(g2+gy|0)|0]|0)==(a[g2+130496|0]|0)){g2=g2+1|0}else{g3=0;break}}if((b7|0)==72){b7=0;if((g2|0)==4){b7=102;break L91}else{g3=0}}while(1){if((g3|0)>=(gx|0)){b7=75;break}if((a[gB+(g3+gy|0)|0]|0)==(a[g3+187176|0]|0)){g3=g3+1|0}else{g4=0;break}}if((b7|0)==75){b7=0;if((g3|0)==2){b7=102;break L91}else{g4=0}}while(1){if((g4|0)>=(gx|0)){b7=78;break}if((a[gB+(g4+gy|0)|0]|0)==(a[g4+186688|0]|0)){g4=g4+1|0}else{g5=0;break}}if((b7|0)==78){b7=0;if((g4|0)==3){b7=102;break L91}else{g5=0}}while(1){if((g5|0)>=(gx|0)){b7=81;break}if((a[gB+(g5+gy|0)|0]|0)==(a[g5+128e3|0]|0)){g5=g5+1|0}else{g6=0;break}}if((b7|0)==81){b7=0;if((g5|0)==6){b7=102;break L91}else{g6=0}}while(1){if((g6|0)>=(gx|0)){b7=84;break}if((a[gB+(g6+gy|0)|0]|0)==(a[g6+127904|0]|0)){g6=g6+1|0}else{g7=0;break}}if((b7|0)==84){b7=0;if((g6|0)==5){b7=102;break L91}else{g7=0}}while(1){if((g7|0)>=(gx|0)){b7=87;break}if((a[gB+(g7+gy|0)|0]|0)==(a[g7+124464|0]|0)){g7=g7+1|0}else{g8=0;break}}if((b7|0)==87){b7=0;if((g7|0)==2){b7=102;break L91}else{g8=0}}while(1){if((g8|0)>=(gx|0)){break}if((a[gB+(g8+gy|0)|0]|0)==(a[g8+176728|0]|0)){g8=g8+1|0}else{b7=91;break L93}}if((g8|0)==10){b7=102;break L91}else{b7=91}}else{b7=91}}while(0);L139:do{if((b7|0)==91){b7=0;L141:do{if(gz){gF=0;cd=0;gG=gy;while(1){if((a[gF+124344|0]|0)==(a[gB+(gF+gG|0)|0]|0)){g9=gG;ha=cd}else{if((gF|0)!=4){break L141}g9=gG-1|0;ha=1}gH=gF+1|0;if((gH|0)<(ha+gx|0)){gF=gH;cd=ha;gG=g9}else{break}}if((ha|0)!=0){b7=102;break L91}if((gF|0)==3|(gF|0)==5){b7=102;break L91}}}while(0);if(gA|gE^1){break}else{hb=0}while(1){if((hb|0)>=(gx|0)){break}if((a[gB+(hb+gy|0)|0]|0)==(a[hb+150816|0]|0)){hb=hb+1|0}else{break L139}}if((hb|0)==6){b7=102;break L91}}}while(0);gE=is(b2)|0;gG=c[gE>>2]|0;if((gG|0)==1){hc=+(c[gE+8>>2]|0)}else if((gG|0)==2){hc=+h[gE+8>>3]}else if((gG|0)==3){hc=+uz(c[gE+8>>2]|0,0)}else{b7=109;break L27}if((c[b9>>2]|0)==3){uu(c[b8>>2]|0);c[b9>>2]=1}hd=~~hc;b7=113}}while(0);L164:do{if((b7|0)==102){b7=0;gy=c[10826]|0;if((gy|0)==0){he=1;hf=0;hg=0;b7=119;break}else{hh=1;hi=gy}while(1){if((c[hi+4>>2]|0)!=(hh|0)){hd=hh;b7=113;break L164}gy=hh+1|0;gx=c[hi>>2]|0;if((gx|0)==0){hd=gy;b7=113;break}else{hh=gy;hi=gx}}}}while(0);L169:do{if((b7|0)==113){b7=0;if((hd|0)<1){b7=114;break L27}gx=c[10826]|0;if((gx|0)==0){he=hd;hf=0;hg=0;b7=119;break}else{hj=0;hk=gx}while(1){hl=c[hk+4>>2]|0;if((hd|0)<=(hl|0)){break}gx=c[hk>>2]|0;if((gx|0)==0){he=hd;hf=hk;hg=0;b7=119;break L169}else{hj=hk;hk=gx}}if((hd|0)==(hl|0)){hm=hk}else{he=hd;hf=hj;hg=hk;b7=119}}}while(0);if((b7|0)==119){b7=0;gx=ut(208)|0;if((gx|0)==0){gk();gy=ut(208)|0;if((gy|0)==0){b7=121;break L27}else{hn=gy}}else{hn=gx}gx=hn;if((hf|0)==0){c[10826]=gx}else{c[hf>>2]=gx}c[hn+4>>2]=he;c[hn>>2]=hg;uE(hn+8|0,0,80);c[hn+96>>2]=-1;c[hn+100>>2]=0;gy=hn+104|0;c[gy>>2]=c[12872];c[gy+4>>2]=c[12873];c[gy+8>>2]=c[12874];c[gy+12>>2]=c[12875];c[gy+16>>2]=c[12876];c[gy+20>>2]=c[12877];c[gy+24>>2]=c[12878];c[gy+28>>2]=c[12879];c[gy+32>>2]=c[12880];c[gy+36>>2]=c[12881];c[gy+40>>2]=c[12882];c[gy+44>>2]=c[12883];c[gy+48>>2]=c[12884];c[gy+52>>2]=c[12885];c[hn+160>>2]=1;h[hn+168>>3]=0.0;c[hn+176>>2]=0;h[hn+184>>3]=15.0;h[hn+192>>3]=90.0;c[hn+200>>2]=0;hm=gx}gx=c[13898]|0;gy=c[8272]|0;if((gx|0)>=(gy|0)){break}gA=hm+96|0;gz=hm+88|0;gC=hm+48|0;gE=hm+8|0;gG=0;cd=0;gH=gx;gx=gy;while(1){gy=cd;ho=gH;hp=gx;L189:while(1){hq=ho;hr=hp;L191:while(1){hs=c[1054]|0;L193:do{if((a[hs+(hq*40&-1)|0]&1)!=0){ht=c[hs+(hq*40&-1)+36>>2]|0;hu=hs+(hq*40&-1)+32|0;hv=c[10036]|0;hw=0;while(1){if((hw|0)>=(ht|0)){b7=134;break}if((a[hv+((c[hu>>2]|0)+hw|0)|0]|0)==(a[hw+103664|0]|0)){hw=hw+1|0}else{break}}if((b7|0)==134){b7=0;if((hw|0)==1){break L44}}if((hr|0)>(hq|0)){hx=0}else{break}while(1){if((hx|0)>=(ht|0)){b7=138;break}if((a[hv+((c[hu>>2]|0)+hx|0)|0]|0)==(a[hx+188576|0]|0)){hx=hx+1|0}else{hy=0;break}}if((b7|0)==138){b7=0;if((hx|0)==4){break L189}else{hy=0}}while(1){if((hy|0)>=(ht|0)){b7=150;break}if((a[hv+((c[hu>>2]|0)+hy|0)|0]|0)==(a[hy+187176|0]|0)){hy=hy+1|0}else{hA=0;break}}if((b7|0)==150){b7=0;if((hy|0)==2){break L191}else{hA=0}}while(1){if((hA|0)>=(ht|0)){break}if((a[hv+((c[hu>>2]|0)+hA|0)|0]|0)==(a[hA+186688|0]|0)){hA=hA+1|0}else{break L193}}if((hA|0)==3){break L191}}}while(0);hL(gA,1);gF=c[13898]|0;hw=c[8272]|0;hB=(gF|0)<(hw|0);if((hq|0)==(gF|0)&hB){hC=c[1054]|0;if((a[hC+(hq*40&-1)|0]&1)==0){b7=5115;break L27}hF=c[hC+(hq*40&-1)+36>>2]|0;hG=hC+(hq*40&-1)+32|0;hC=c[10036]|0;hK=0;while(1){if((hK|0)>=(hF|0)){break}if((a[hC+((c[hG>>2]|0)+hK|0)|0]|0)==(a[hK+103664|0]|0)){hK=hK+1|0}else{b7=5116;break L27}}if((hK|0)!=1){b7=5117;break L27}}if(hB){hq=gF;hr=hw}else{break L44}}if(gy){b7=5119;break L27}else{hN=0}while(1){if((hN|0)>=(ht|0)){b7=157;break}if((a[hv+((c[hu>>2]|0)+hN|0)|0]|0)==(a[hN+186688|0]|0)){hN=hN+1|0}else{hP=0;break}}if((b7|0)==157){b7=0;hP=(hN|0)==3&1}a[gz]=hP;hQ=(c[13898]|0)+1|0;c[13898]=hQ;if((hQ|0)>=(c[8272]|0)){b7=5113;break L27}hG=c[1054]|0;L232:do{if((a[hG+(hQ*40&-1)|0]&1)!=0){hC=c[hG+(hQ*40&-1)+36>>2]|0;hF=hG+(hQ*40&-1)+32|0;hR=c[10036]|0;hS=0;while(1){if((hS|0)>=(hC|0)){break}if((a[hR+((c[hF>>2]|0)+hS|0)|0]|0)==(a[hS+103664|0]|0)){hS=hS+1|0}else{break L232}}if((hS|0)==1){b7=5114;break L27}}}while(0);dl(gC,0);hG=c[13898]|0;hF=c[8272]|0;if((hG|0)<(hF|0)){gy=1;ho=hG;hp=hF}else{break L44}}if(gG){b7=5118;break L27}hT=hq+1|0;c[13898]=hT;if((hT|0)>=(hr|0)){b7=5111;break L27}L242:do{if((a[hs+(hT*40&-1)|0]&1)!=0){hp=c[hs+(hT*40&-1)+36>>2]|0;ho=hs+(hT*40&-1)+32|0;hF=0;while(1){if((hF|0)>=(hp|0)){break}if((a[hv+((c[ho>>2]|0)+hF|0)|0]|0)==(a[hF+103664|0]|0)){hF=hF+1|0}else{break L242}}if((hF|0)==1){b7=5112;break L27}}}while(0);dl(gE,0);ho=c[13898]|0;hp=c[8272]|0;if((ho|0)<(hp|0)){gG=1;cd=gy;gH=ho;gx=hp}else{break}}}else if((gD|0)==5){gx=gv+1|0;c[13898]=gx;L250:do{if((gx|0)<(c[8272]|0)){gH=(a[gw+(gx*40&-1)|0]&1)==0;L252:do{if(!gH){cd=c[gw+(gx*40&-1)+36>>2]|0;gG=gw+(gx*40&-1)+32|0;gE=0;while(1){if((gE|0)>=(cd|0)){b7=180;break}if((a[gB+((c[gG>>2]|0)+gE|0)|0]|0)==(a[gE+103664|0]|0)){gE=gE+1|0}else{hU=0;break}}if((b7|0)==180){b7=0;if((gE|0)==1){break L250}else{hU=0}}while(1){if((hU|0)>=(cd|0)){b7=184;break}if((a[gB+((c[gG>>2]|0)+hU|0)|0]|0)==(a[hU+150688|0]|0)){hU=hU+1|0}else{b7=185;break}}if((b7|0)==184){b7=0;if((hU|0)!=2){b7=185}}do{if((b7|0)==185){b7=0;if(gH){break L252}gG=c[gw+(gx*40&-1)+36>>2]|0;cd=gw+(gx*40&-1)+32|0;gE=0;while(1){if((gE|0)>=(gG|0)){b7=189;break}if((a[gB+((c[cd>>2]|0)+gE|0)|0]|0)==(a[gE+148800|0]|0)){gE=gE+1|0}else{break}}if((b7|0)==189){b7=0;if((gE|0)==2){break}}if(gH){break L252}cd=c[gw+(gx*40&-1)+36>>2]|0;gG=gw+(gx*40&-1)+32|0;hS=0;while(1){if((hS|0)>=(cd|0)){b7=195;break}if((a[gB+((c[gG>>2]|0)+hS|0)|0]|0)==(a[hS+125808|0]|0)){hS=hS+1|0}else{break}}do{if((b7|0)==195){b7=0;if((hS|0)!=3){break}c[16163]=c[16163]|12;c[16335]=c[16335]|12;c[16507]=c[16507]|12;c[16679]=c[16679]|12;c[16851]=c[16851]|12;c[17023]=c[17023]|12;c[17195]=c[17195]|12;c[17367]=c[17367]|12;c[17539]=c[17539]|12;c[17711]=c[17711]|12;c[17883]=c[17883]|12;c[13898]=gv+2;break L44}}while(0);hS=c[gw+(gx*40&-1)+36>>2]|0;gG=c[gw+(gx*40&-1)+32>>2]|0;if(gH){break L252}if((hS|0)>0){cd=0;gE=0;hF=gG;while(1){if((a[cd+125680|0]|0)==(a[gB+(cd+hF|0)|0]|0)){hV=hF;hW=gE}else{if((cd|0)!=2){break}hV=hF-1|0;hW=1}gC=cd+1|0;if((gC|0)<(hW+hS|0)){cd=gC;gE=hW;hF=hV}else{b7=203;break}}do{if((b7|0)==203){b7=0;if((hW|0)==0){if(!((cd|0)==1|(cd|0)==7)){break}}c[16163]=c[16163]|3;c[16335]=c[16335]|3;c[16507]=c[16507]|3;c[16679]=c[16679]|3;c[16851]=c[16851]|3;c[17023]=c[17023]|3;c[17195]=c[17195]|3;c[17367]=c[17367]|3;c[17539]=c[17539]|3;c[17711]=c[17711]|3;c[17883]=c[17883]|3;c[13898]=gv+2;break L44}}while(0);if(gH){break L252}else{hY=0}}else{hY=0}while(1){if((hY|0)>=(hS|0)){break}if((a[gB+(gG+hY|0)|0]|0)==(a[hY+57e3|0]|0)){hY=hY+1|0}else{break L252}}if((a[hY+57e3|0]|0)!=0){break L252}c[17367]=3;c[17386]=0;c[17387]=0;c[13898]=gv+2;break L44}}while(0);c[16335]=3;c[16507]=3;c[16355]=0;c[16354]=0;c[16527]=0;c[16526]=0;c[13898]=gv+2;break L44}}while(0);be(b5|0,125560,(v=i,i=i+8|0,c[v>>2]=57e3,v)|0);gH=c[13898]|0;gy=c[1054]|0;gG=c[gy+(gH*40&-1)+36>>2]|0;hS=c[gy+(gH*40&-1)+32>>2]|0;L302:do{if((a[gy+(gH*40&-1)|0]&1)!=0){if((gG|0)>0){cd=c[10036]|0;hF=0;gE=0;gC=hS;while(1){gz=a[b0+hF|0]|0;if(gz<<24>>24==(a[cd+(hF+gC|0)|0]|0)){hZ=gC;h_=gE}else{if(gz<<24>>24!=36){break L302}hZ=gC-1|0;h_=1}h$=hF+1|0;if((h$|0)<(h_+gG|0)){hF=h$;gE=h_;gC=hZ}else{break}}if((h_|0)==0){h0=h$;b7=219}}else{h0=0;b7=219}if((b7|0)==219){b7=0;gC=a[b0+h0|0]|0;if(!((gC<<24>>24|0)==36|(gC<<24>>24|0)==0)){break}}c[17367]=c[17367]|1;c[17386]=0;c[13898]=gH+1;break L44}}while(0);be(b3|0,125432,(v=i,i=i+8|0,c[v>>2]=57e3,v)|0);gH=c[13898]|0;gG=c[1054]|0;hS=c[gG+(gH*40&-1)+36>>2]|0;gy=c[gG+(gH*40&-1)+32>>2]|0;L317:do{if((a[gG+(gH*40&-1)|0]&1)!=0){if((hS|0)>0){gC=c[10036]|0;gE=0;hF=0;cd=gy;while(1){gz=a[b1+gE|0]|0;if(gz<<24>>24==(a[gC+(gE+cd|0)|0]|0)){h1=cd;h2=hF}else{if(gz<<24>>24!=36){break L317}h1=cd-1|0;h2=1}h3=gE+1|0;if((h3|0)<(h2+hS|0)){gE=h3;hF=h2;cd=h1}else{break}}if((h2|0)==0){h4=h3;b7=229}}else{h4=0;b7=229}if((b7|0)==229){b7=0;cd=a[b1+h4|0]|0;if(!((cd<<24>>24|0)==36|(cd<<24>>24|0)==0)){break}}c[17367]=c[17367]|2;c[17387]=0;c[13898]=gH+1;break L44}}while(0);be(b5|0,125376,(v=i,i=i+8|0,c[v>>2]=57e3,v)|0);gH=c[13898]|0;L332:do{if((c[8272]|0)>(gH|0)){hS=c[1054]|0;if((a[hS+(gH*40&-1)|0]&1)==0){break}gy=c[hS+(gH*40&-1)+36>>2]|0;gG=hS+(gH*40&-1)+32|0;hS=c[10036]|0;cd=0;while(1){if((cd|0)>=(gy|0)){break}if((a[hS+((c[gG>>2]|0)+cd|0)|0]|0)==(a[b0+cd|0]|0)){cd=cd+1|0}else{break L332}}if((a[b0+cd|0]|0)!=0){break}c[17367]=c[17367]|12;c[13898]=gH+1;break L44}}while(0);be(b5|0,125128,(v=i,i=i+8|0,c[v>>2]=57e3,v)|0);gH=c[13898]|0;gG=c[1054]|0;hS=c[gG+(gH*40&-1)+36>>2]|0;gy=c[gG+(gH*40&-1)+32>>2]|0;L341:do{if((a[gG+(gH*40&-1)|0]&1)!=0){if((hS|0)>0){hF=c[10036]|0;gE=0;gC=0;gz=gy;while(1){gA=a[b0+gE|0]|0;if(gA<<24>>24==(a[hF+(gE+gz|0)|0]|0)){h5=gz;h6=gC}else{if(gA<<24>>24!=36){break L341}h5=gz-1|0;h6=1}h7=gE+1|0;if((h7|0)<(h6+hS|0)){gE=h7;gC=h6;gz=h5}else{break}}if((h6|0)==0){h8=h7;b7=246}}else{h8=0;b7=246}if((b7|0)==246){b7=0;gz=a[b0+h8|0]|0;if(!((gz<<24>>24|0)==36|(gz<<24>>24|0)==0)){break}}c[17367]=c[17367]|4;c[13898]=gH+1;break L44}}while(0);be(b3|0,124936,(v=i,i=i+8|0,c[v>>2]=57e3,v)|0);gH=c[13898]|0;hS=c[1054]|0;gy=c[hS+(gH*40&-1)+36>>2]|0;gG=c[hS+(gH*40&-1)+32>>2]|0;gz=(a[hS+(gH*40&-1)|0]&1)==0;L356:do{if(!gz){if((gy|0)>0){hS=c[10036]|0;gC=0;gE=0;hF=gG;while(1){cd=a[b1+gC|0]|0;if(cd<<24>>24==(a[hS+(gC+hF|0)|0]|0)){h9=hF;ia=gE}else{if(cd<<24>>24!=36){break L356}h9=hF-1|0;ia=1}ib=gC+1|0;if((ib|0)<(ia+gy|0)){gC=ib;gE=ia;hF=h9}else{break}}if((ia|0)==0){ic=ib;b7=256}}else{ic=0;b7=256}if((b7|0)==256){b7=0;hF=a[b1+ic|0]|0;if(!((hF<<24>>24|0)==36|(hF<<24>>24|0)==0)){break}}c[17367]=c[17367]|8;c[13898]=gH+1;break L44}}while(0);L371:do{if(!((c[8272]|0)<=(gH|0)|gz)){hF=c[10036]|0;gE=0;while(1){if((gE|0)>=(gy|0)){break}if((a[hF+(gG+gE|0)|0]|0)==(a[gE+57024|0]|0)){gE=gE+1|0}else{break L371}}if((a[gE+57024|0]|0)!=0){break}c[17539]=3;c[17558]=0;c[17559]=0;c[13898]=gH+1;break L44}}while(0);be(b5|0,125560,(v=i,i=i+8|0,c[v>>2]=57024,v)|0);gH=c[13898]|0;gG=c[1054]|0;gy=c[gG+(gH*40&-1)+36>>2]|0;gz=c[gG+(gH*40&-1)+32>>2]|0;L379:do{if((a[gG+(gH*40&-1)|0]&1)!=0){if((gy|0)>0){hF=c[10036]|0;gC=0;hS=0;cd=gz;while(1){gA=a[b0+gC|0]|0;if(gA<<24>>24==(a[hF+(gC+cd|0)|0]|0)){id=cd;ie=hS}else{if(gA<<24>>24!=36){break L379}id=cd-1|0;ie=1}ig=gC+1|0;if((ig|0)<(ie+gy|0)){gC=ig;hS=ie;cd=id}else{break}}if((ie|0)==0){ih=ig;b7=272}}else{ih=0;b7=272}if((b7|0)==272){b7=0;cd=a[b0+ih|0]|0;if(!((cd<<24>>24|0)==36|(cd<<24>>24|0)==0)){break}}c[17539]=c[17539]|1;c[17558]=0;c[13898]=gH+1;break L44}}while(0);be(b3|0,125432,(v=i,i=i+8|0,c[v>>2]=57024,v)|0);gH=c[13898]|0;gy=c[1054]|0;gz=c[gy+(gH*40&-1)+36>>2]|0;gG=c[gy+(gH*40&-1)+32>>2]|0;L394:do{if((a[gy+(gH*40&-1)|0]&1)!=0){if((gz|0)>0){cd=c[10036]|0;hS=0;gC=0;hF=gG;while(1){gE=a[b1+hS|0]|0;if(gE<<24>>24==(a[cd+(hS+hF|0)|0]|0)){ii=hF;ij=gC}else{if(gE<<24>>24!=36){break L394}ii=hF-1|0;ij=1}ik=hS+1|0;if((ik|0)<(ij+gz|0)){hS=ik;gC=ij;hF=ii}else{break}}if((ij|0)==0){il=ik;b7=282}}else{il=0;b7=282}if((b7|0)==282){b7=0;hF=a[b1+il|0]|0;if(!((hF<<24>>24|0)==36|(hF<<24>>24|0)==0)){break}}c[17539]=c[17539]|2;c[17559]=0;c[13898]=gH+1;break L44}}while(0);be(b5|0,125376,(v=i,i=i+8|0,c[v>>2]=57024,v)|0);gH=c[13898]|0;L409:do{if((c[8272]|0)>(gH|0)){gz=c[1054]|0;if((a[gz+(gH*40&-1)|0]&1)==0){break}gG=c[gz+(gH*40&-1)+36>>2]|0;gy=gz+(gH*40&-1)+32|0;gz=c[10036]|0;hF=0;while(1){if((hF|0)>=(gG|0)){break}if((a[gz+((c[gy>>2]|0)+hF|0)|0]|0)==(a[b0+hF|0]|0)){hF=hF+1|0}else{break L409}}if((a[b0+hF|0]|0)!=0){break}c[17539]=c[17539]|12;c[13898]=gH+1;break L44}}while(0);be(b5|0,125128,(v=i,i=i+8|0,c[v>>2]=57024,v)|0);gH=c[13898]|0;gy=c[1054]|0;gz=c[gy+(gH*40&-1)+36>>2]|0;gG=c[gy+(gH*40&-1)+32>>2]|0;L418:do{if((a[gy+(gH*40&-1)|0]&1)!=0){if((gz|0)>0){gC=c[10036]|0;hS=0;cd=0;gE=gG;while(1){gA=a[b0+hS|0]|0;if(gA<<24>>24==(a[gC+(hS+gE|0)|0]|0)){im=gE;io=cd}else{if(gA<<24>>24!=36){break L418}im=gE-1|0;io=1}ip=hS+1|0;if((ip|0)<(io+gz|0)){hS=ip;cd=io;gE=im}else{break}}if((io|0)==0){iq=ip;b7=299}}else{iq=0;b7=299}if((b7|0)==299){b7=0;gE=a[b0+iq|0]|0;if(!((gE<<24>>24|0)==36|(gE<<24>>24|0)==0)){break}}c[17539]=c[17539]|4;c[13898]=gH+1;break L44}}while(0);be(b3|0,124936,(v=i,i=i+8|0,c[v>>2]=57024,v)|0);gH=c[13898]|0;gz=c[1054]|0;gG=c[gz+(gH*40&-1)+36>>2]|0;gy=c[gz+(gH*40&-1)+32>>2]|0;L433:do{if((a[gz+(gH*40&-1)|0]&1)!=0){L435:do{if((gG|0)>0){gE=c[10036]|0;cd=0;hS=0;gC=gy;while(1){hF=a[b1+cd|0]|0;if(hF<<24>>24==(a[gE+(cd+gC|0)|0]|0)){ir=gC;iu=hS}else{if(hF<<24>>24!=36){break L435}ir=gC-1|0;iu=1}iv=cd+1|0;if((iv|0)<(iu+gG|0)){cd=iv;hS=iu;gC=ir}else{break}}if((iu|0)==0){iy=iv;b7=309}else{b7=310}}else{iy=0;b7=309}}while(0);if((b7|0)==309){b7=0;gC=a[b1+iy|0]|0;if((gC<<24>>24|0)==36|(gC<<24>>24|0)==0){b7=310}}if((b7|0)==310){b7=0;c[17539]=c[17539]|8;c[13898]=gH+1;break L44}if((c[8272]|0)<=(gH|0)){break}gC=c[10036]|0;hS=0;while(1){if((hS|0)>=(gG|0)){break}if((a[gC+(hS+gy|0)|0]|0)==(a[hS+57048|0]|0)){hS=hS+1|0}else{break L433}}if((a[hS+57048|0]|0)!=0){break}c[17711]=3;c[17730]=0;c[17731]=0;c[13898]=gH+1;break L44}}while(0);be(b5|0,125560,(v=i,i=i+8|0,c[v>>2]=57048,v)|0);gH=c[13898]|0;gy=c[1054]|0;gG=c[gy+(gH*40&-1)+36>>2]|0;gz=c[gy+(gH*40&-1)+32>>2]|0;L456:do{if((a[gy+(gH*40&-1)|0]&1)!=0){if((gG|0)>0){gC=c[10036]|0;cd=0;gE=0;hF=gz;while(1){gA=a[b0+cd|0]|0;if(gA<<24>>24==(a[gC+(cd+hF|0)|0]|0)){iz=hF;iA=gE}else{if(gA<<24>>24!=36){break L456}iz=hF-1|0;iA=1}iB=cd+1|0;if((iB|0)<(iA+gG|0)){cd=iB;gE=iA;hF=iz}else{break}}if((iA|0)==0){iC=iB;b7=325}}else{iC=0;b7=325}if((b7|0)==325){b7=0;hF=a[b0+iC|0]|0;if(!((hF<<24>>24|0)==36|(hF<<24>>24|0)==0)){break}}c[17711]=c[17711]|1;c[17730]=0;c[13898]=gH+1;break L44}}while(0);be(b3|0,125432,(v=i,i=i+8|0,c[v>>2]=57048,v)|0);gH=c[13898]|0;gG=c[1054]|0;gz=c[gG+(gH*40&-1)+36>>2]|0;gy=c[gG+(gH*40&-1)+32>>2]|0;L471:do{if((a[gG+(gH*40&-1)|0]&1)!=0){if((gz|0)>0){hF=c[10036]|0;gE=0;cd=0;gC=gy;while(1){hS=a[b1+gE|0]|0;if(hS<<24>>24==(a[hF+(gE+gC|0)|0]|0)){iD=gC;iE=cd}else{if(hS<<24>>24!=36){break L471}iD=gC-1|0;iE=1}iF=gE+1|0;if((iF|0)<(iE+gz|0)){gE=iF;cd=iE;gC=iD}else{break}}if((iE|0)==0){iG=iF;b7=335}}else{iG=0;b7=335}if((b7|0)==335){b7=0;gC=a[b1+iG|0]|0;if(!((gC<<24>>24|0)==36|(gC<<24>>24|0)==0)){break}}c[17711]=c[17711]|2;c[17731]=0;c[13898]=gH+1;break L44}}while(0);be(b5|0,125376,(v=i,i=i+8|0,c[v>>2]=57048,v)|0);gH=c[13898]|0;L486:do{if((c[8272]|0)>(gH|0)){gz=c[1054]|0;if((a[gz+(gH*40&-1)|0]&1)==0){break}gy=c[gz+(gH*40&-1)+36>>2]|0;gG=gz+(gH*40&-1)+32|0;gz=c[10036]|0;gC=0;while(1){if((gC|0)>=(gy|0)){break}if((a[gz+((c[gG>>2]|0)+gC|0)|0]|0)==(a[b0+gC|0]|0)){gC=gC+1|0}else{break L486}}if((a[b0+gC|0]|0)!=0){break}c[17711]=c[17711]|12;c[13898]=gH+1;break L44}}while(0);be(b5|0,125128,(v=i,i=i+8|0,c[v>>2]=57048,v)|0);gH=c[13898]|0;gG=c[1054]|0;gz=c[gG+(gH*40&-1)+36>>2]|0;gy=c[gG+(gH*40&-1)+32>>2]|0;L495:do{if((a[gG+(gH*40&-1)|0]&1)!=0){if((gz|0)>0){cd=c[10036]|0;gE=0;hF=0;hS=gy;while(1){gA=a[b0+gE|0]|0;if(gA<<24>>24==(a[cd+(gE+hS|0)|0]|0)){iH=hS;iI=hF}else{if(gA<<24>>24!=36){break L495}iH=hS-1|0;iI=1}iJ=gE+1|0;if((iJ|0)<(iI+gz|0)){gE=iJ;hF=iI;hS=iH}else{break}}if((iI|0)==0){iK=iJ;b7=352}}else{iK=0;b7=352}if((b7|0)==352){b7=0;hS=a[b0+iK|0]|0;if(!((hS<<24>>24|0)==36|(hS<<24>>24|0)==0)){break}}c[17711]=c[17711]|4;c[13898]=gH+1;break L44}}while(0);be(b3|0,124936,(v=i,i=i+8|0,c[v>>2]=57048,v)|0);gH=c[13898]|0;gz=c[1054]|0;gy=c[gz+(gH*40&-1)+36>>2]|0;gG=c[gz+(gH*40&-1)+32>>2]|0;L510:do{if((a[gz+(gH*40&-1)|0]&1)!=0){L512:do{if((gy|0)>0){hS=c[10036]|0;hF=0;gE=0;cd=gG;while(1){gC=a[b1+hF|0]|0;if(gC<<24>>24==(a[hS+(hF+cd|0)|0]|0)){iL=cd;iM=gE}else{if(gC<<24>>24!=36){break L512}iL=cd-1|0;iM=1}iN=hF+1|0;if((iN|0)<(iM+gy|0)){hF=iN;gE=iM;cd=iL}else{break}}if((iM|0)==0){iP=iN;b7=362}else{b7=363}}else{iP=0;b7=362}}while(0);if((b7|0)==362){b7=0;cd=a[b1+iP|0]|0;if((cd<<24>>24|0)==36|(cd<<24>>24|0)==0){b7=363}}if((b7|0)==363){b7=0;c[17711]=c[17711]|8;c[13898]=gH+1;break L44}if((c[8272]|0)<=(gH|0)){break}cd=c[10036]|0;gE=0;while(1){if((gE|0)>=(gy|0)){break}if((a[cd+(gE+gG|0)|0]|0)==(a[gE+57072|0]|0)){gE=gE+1|0}else{break L510}}if((a[gE+57072|0]|0)!=0){break}c[17883]=3;c[17902]=0;c[17903]=0;c[13898]=gH+1;break L44}}while(0);be(b5|0,125560,(v=i,i=i+8|0,c[v>>2]=57072,v)|0);gH=c[13898]|0;gG=c[1054]|0;gy=c[gG+(gH*40&-1)+36>>2]|0;gz=c[gG+(gH*40&-1)+32>>2]|0;L533:do{if((a[gG+(gH*40&-1)|0]&1)!=0){if((gy|0)>0){cd=c[10036]|0;hF=0;hS=0;gC=gz;while(1){gA=a[b0+hF|0]|0;if(gA<<24>>24==(a[cd+(hF+gC|0)|0]|0)){iR=gC;iS=hS}else{if(gA<<24>>24!=36){break L533}iR=gC-1|0;iS=1}iT=hF+1|0;if((iT|0)<(iS+gy|0)){hF=iT;hS=iS;gC=iR}else{break}}if((iS|0)==0){iU=iT;b7=378}}else{iU=0;b7=378}if((b7|0)==378){b7=0;gC=a[b0+iU|0]|0;if(!((gC<<24>>24|0)==36|(gC<<24>>24|0)==0)){break}}c[17883]=c[17883]|1;c[17902]=0;c[13898]=gH+1;break L44}}while(0);be(b3|0,125432,(v=i,i=i+8|0,c[v>>2]=57072,v)|0);gH=c[13898]|0;gy=c[1054]|0;gz=c[gy+(gH*40&-1)+36>>2]|0;gG=c[gy+(gH*40&-1)+32>>2]|0;L548:do{if((a[gy+(gH*40&-1)|0]&1)!=0){if((gz|0)>0){gC=c[10036]|0;hS=0;hF=0;cd=gG;while(1){gE=a[b1+hS|0]|0;if(gE<<24>>24==(a[gC+(hS+cd|0)|0]|0)){iV=cd;iW=hF}else{if(gE<<24>>24!=36){break L548}iV=cd-1|0;iW=1}iX=hS+1|0;if((iX|0)<(iW+gz|0)){hS=iX;hF=iW;cd=iV}else{break}}if((iW|0)==0){iZ=iX;b7=388}}else{iZ=0;b7=388}if((b7|0)==388){b7=0;cd=a[b1+iZ|0]|0;if(!((cd<<24>>24|0)==36|(cd<<24>>24|0)==0)){break}}c[17883]=c[17883]|2;c[17903]=0;c[13898]=gH+1;break L44}}while(0);be(b5|0,125376,(v=i,i=i+8|0,c[v>>2]=57072,v)|0);gH=c[13898]|0;L563:do{if((c[8272]|0)>(gH|0)){gz=c[1054]|0;if((a[gz+(gH*40&-1)|0]&1)==0){break}gG=c[gz+(gH*40&-1)+36>>2]|0;gy=gz+(gH*40&-1)+32|0;gz=c[10036]|0;cd=0;while(1){if((cd|0)>=(gG|0)){break}if((a[gz+((c[gy>>2]|0)+cd|0)|0]|0)==(a[b0+cd|0]|0)){cd=cd+1|0}else{break L563}}if((a[b0+cd|0]|0)!=0){break}c[17883]=c[17883]|12;c[13898]=gH+1;break L44}}while(0);be(b5|0,125128,(v=i,i=i+8|0,c[v>>2]=57072,v)|0);gH=c[13898]|0;gy=c[1054]|0;gz=c[gy+(gH*40&-1)+36>>2]|0;gG=c[gy+(gH*40&-1)+32>>2]|0;L572:do{if((a[gy+(gH*40&-1)|0]&1)!=0){if((gz|0)>0){hF=c[10036]|0;hS=0;gC=0;gE=gG;while(1){gA=a[b0+hS|0]|0;if(gA<<24>>24==(a[hF+(hS+gE|0)|0]|0)){i_=gE;i$=gC}else{if(gA<<24>>24!=36){break L572}i_=gE-1|0;i$=1}i0=hS+1|0;if((i0|0)<(i$+gz|0)){hS=i0;gC=i$;gE=i_}else{break}}if((i$|0)==0){i1=i0;b7=405}}else{i1=0;b7=405}if((b7|0)==405){b7=0;gE=a[b0+i1|0]|0;if(!((gE<<24>>24|0)==36|(gE<<24>>24|0)==0)){break}}c[17883]=c[17883]|4;c[13898]=gH+1;break L44}}while(0);be(b3|0,124936,(v=i,i=i+8|0,c[v>>2]=57072,v)|0);gH=c[13898]|0;gz=c[1054]|0;gG=c[gz+(gH*40&-1)+36>>2]|0;gy=c[gz+(gH*40&-1)+32>>2]|0;L587:do{if((a[gz+(gH*40&-1)|0]&1)!=0){L589:do{if((gG|0)>0){gE=c[10036]|0;gC=0;hS=0;hF=gy;while(1){cd=a[b1+gC|0]|0;if(cd<<24>>24==(a[gE+(gC+hF|0)|0]|0)){i2=hF;i3=hS}else{if(cd<<24>>24!=36){break L589}i2=hF-1|0;i3=1}i4=gC+1|0;if((i4|0)<(i3+gG|0)){gC=i4;hS=i3;hF=i2}else{break}}if((i3|0)==0){i5=i4;b7=415}else{b7=416}}else{i5=0;b7=415}}while(0);if((b7|0)==415){b7=0;hF=a[b1+i5|0]|0;if((hF<<24>>24|0)==36|(hF<<24>>24|0)==0){b7=416}}if((b7|0)==416){b7=0;c[17883]=c[17883]|8;c[13898]=gH+1;break L44}if((c[8272]|0)<=(gH|0)){break}hF=c[10036]|0;hS=0;while(1){if((hS|0)>=(gG|0)){break}if((a[hF+(hS+gy|0)|0]|0)==(a[hS+56880|0]|0)){hS=hS+1|0}else{break L587}}if((a[hS+56880|0]|0)!=0){break}c[16507]=3;c[16526]=0;c[16527]=0;c[13898]=gH+1;break L44}}while(0);be(b5|0,125560,(v=i,i=i+8|0,c[v>>2]=56880,v)|0);gH=c[13898]|0;gy=c[1054]|0;gG=c[gy+(gH*40&-1)+36>>2]|0;gz=c[gy+(gH*40&-1)+32>>2]|0;L610:do{if((a[gy+(gH*40&-1)|0]&1)!=0){if((gG|0)>0){hF=c[10036]|0;gC=0;gE=0;cd=gz;while(1){gA=a[b0+gC|0]|0;if(gA<<24>>24==(a[hF+(gC+cd|0)|0]|0)){i6=cd;i7=gE}else{if(gA<<24>>24!=36){break L610}i6=cd-1|0;i7=1}i8=gC+1|0;if((i8|0)<(i7+gG|0)){gC=i8;gE=i7;cd=i6}else{break}}if((i7|0)==0){ja=i8;b7=431}}else{ja=0;b7=431}if((b7|0)==431){b7=0;cd=a[b0+ja|0]|0;if(!((cd<<24>>24|0)==36|(cd<<24>>24|0)==0)){break}}c[16507]=c[16507]|1;c[16526]=0;c[13898]=gH+1;break L44}}while(0);be(b3|0,125432,(v=i,i=i+8|0,c[v>>2]=56880,v)|0);gH=c[13898]|0;gG=c[1054]|0;gz=c[gG+(gH*40&-1)+36>>2]|0;gy=c[gG+(gH*40&-1)+32>>2]|0;L625:do{if((a[gG+(gH*40&-1)|0]&1)!=0){if((gz|0)>0){cd=c[10036]|0;gE=0;gC=0;hF=gy;while(1){hS=a[b1+gE|0]|0;if(hS<<24>>24==(a[cd+(gE+hF|0)|0]|0)){jb=hF;jc=gC}else{if(hS<<24>>24!=36){break L625}jb=hF-1|0;jc=1}jd=gE+1|0;if((jd|0)<(jc+gz|0)){gE=jd;gC=jc;hF=jb}else{break}}if((jc|0)==0){je=jd;b7=441}}else{je=0;b7=441}if((b7|0)==441){b7=0;hF=a[b1+je|0]|0;if(!((hF<<24>>24|0)==36|(hF<<24>>24|0)==0)){break}}c[16507]=c[16507]|2;c[16527]=0;c[13898]=gH+1;break L44}}while(0);be(b5|0,125376,(v=i,i=i+8|0,c[v>>2]=56880,v)|0);gH=c[13898]|0;L640:do{if((c[8272]|0)>(gH|0)){gz=c[1054]|0;if((a[gz+(gH*40&-1)|0]&1)==0){break}gy=c[gz+(gH*40&-1)+36>>2]|0;gG=gz+(gH*40&-1)+32|0;gz=c[10036]|0;hF=0;while(1){if((hF|0)>=(gy|0)){break}if((a[gz+((c[gG>>2]|0)+hF|0)|0]|0)==(a[b0+hF|0]|0)){hF=hF+1|0}else{break L640}}if((a[b0+hF|0]|0)!=0){break}c[16507]=c[16507]|12;c[13898]=gH+1;break L44}}while(0);be(b5|0,125128,(v=i,i=i+8|0,c[v>>2]=56880,v)|0);gH=c[13898]|0;gG=c[1054]|0;gz=c[gG+(gH*40&-1)+36>>2]|0;gy=c[gG+(gH*40&-1)+32>>2]|0;L649:do{if((a[gG+(gH*40&-1)|0]&1)!=0){if((gz|0)>0){gC=c[10036]|0;gE=0;cd=0;hS=gy;while(1){gA=a[b0+gE|0]|0;if(gA<<24>>24==(a[gC+(gE+hS|0)|0]|0)){jf=hS;jg=cd}else{if(gA<<24>>24!=36){break L649}jf=hS-1|0;jg=1}jh=gE+1|0;if((jh|0)<(jg+gz|0)){gE=jh;cd=jg;hS=jf}else{break}}if((jg|0)==0){ji=jh;b7=458}}else{ji=0;b7=458}if((b7|0)==458){b7=0;hS=a[b0+ji|0]|0;if(!((hS<<24>>24|0)==36|(hS<<24>>24|0)==0)){break}}c[16507]=c[16507]|4;c[13898]=gH+1;break L44}}while(0);be(b3|0,124936,(v=i,i=i+8|0,c[v>>2]=56880,v)|0);gH=c[13898]|0;gz=c[1054]|0;gy=c[gz+(gH*40&-1)+36>>2]|0;gG=c[gz+(gH*40&-1)+32>>2]|0;L664:do{if((a[gz+(gH*40&-1)|0]&1)!=0){L666:do{if((gy|0)>0){hS=c[10036]|0;cd=0;gE=0;gC=gG;while(1){hF=a[b1+cd|0]|0;if(hF<<24>>24==(a[hS+(cd+gC|0)|0]|0)){jj=gC;jk=gE}else{if(hF<<24>>24!=36){break L666}jj=gC-1|0;jk=1}jl=cd+1|0;if((jl|0)<(jk+gy|0)){cd=jl;gE=jk;gC=jj}else{break}}if((jk|0)==0){jm=jl;b7=468}else{b7=469}}else{jm=0;b7=468}}while(0);if((b7|0)==468){b7=0;gC=a[b1+jm|0]|0;if((gC<<24>>24|0)==36|(gC<<24>>24|0)==0){b7=469}}if((b7|0)==469){b7=0;c[16507]=c[16507]|8;c[13898]=gH+1;break L44}if((c[8272]|0)<=(gH|0)){break}gC=c[10036]|0;gE=0;while(1){if((gE|0)>=(gy|0)){break}if((a[gC+(gE+gG|0)|0]|0)==(a[gE+56856|0]|0)){gE=gE+1|0}else{break L664}}if((a[gE+56856|0]|0)!=0){break}c[16335]=3;c[16354]=0;c[16355]=0;c[13898]=gH+1;break L44}}while(0);be(b5|0,125560,(v=i,i=i+8|0,c[v>>2]=56856,v)|0);gH=c[13898]|0;gG=c[1054]|0;gy=c[gG+(gH*40&-1)+36>>2]|0;gz=c[gG+(gH*40&-1)+32>>2]|0;L687:do{if((a[gG+(gH*40&-1)|0]&1)!=0){if((gy|0)>0){gC=c[10036]|0;cd=0;hS=0;hF=gz;while(1){gA=a[b0+cd|0]|0;if(gA<<24>>24==(a[gC+(cd+hF|0)|0]|0)){jn=hF;jo=hS}else{if(gA<<24>>24!=36){break L687}jn=hF-1|0;jo=1}jy=cd+1|0;if((jy|0)<(jo+gy|0)){cd=jy;hS=jo;hF=jn}else{break}}if((jo|0)==0){jz=jy;b7=484}}else{jz=0;b7=484}if((b7|0)==484){b7=0;hF=a[b0+jz|0]|0;if(!((hF<<24>>24|0)==36|(hF<<24>>24|0)==0)){break}}c[16335]=c[16335]|1;c[16354]=0;c[13898]=gH+1;break L44}}while(0);be(b3|0,125432,(v=i,i=i+8|0,c[v>>2]=56856,v)|0);gH=c[13898]|0;gy=c[1054]|0;gz=c[gy+(gH*40&-1)+36>>2]|0;gG=c[gy+(gH*40&-1)+32>>2]|0;L702:do{if((a[gy+(gH*40&-1)|0]&1)!=0){if((gz|0)>0){hF=c[10036]|0;hS=0;cd=0;gC=gG;while(1){gE=a[b1+hS|0]|0;if(gE<<24>>24==(a[hF+(hS+gC|0)|0]|0)){jA=gC;jB=cd}else{if(gE<<24>>24!=36){break L702}jA=gC-1|0;jB=1}jC=hS+1|0;if((jC|0)<(jB+gz|0)){hS=jC;cd=jB;gC=jA}else{break}}if((jB|0)==0){jD=jC;b7=494}}else{jD=0;b7=494}if((b7|0)==494){b7=0;gC=a[b1+jD|0]|0;if(!((gC<<24>>24|0)==36|(gC<<24>>24|0)==0)){break}}c[16335]=c[16335]|2;c[16355]=0;c[13898]=gH+1;break L44}}while(0);be(b5|0,125376,(v=i,i=i+8|0,c[v>>2]=56856,v)|0);gH=c[13898]|0;L717:do{if((c[8272]|0)>(gH|0)){gz=c[1054]|0;if((a[gz+(gH*40&-1)|0]&1)==0){break}gG=c[gz+(gH*40&-1)+36>>2]|0;gy=gz+(gH*40&-1)+32|0;gz=c[10036]|0;gC=0;while(1){if((gC|0)>=(gG|0)){break}if((a[gz+((c[gy>>2]|0)+gC|0)|0]|0)==(a[b0+gC|0]|0)){gC=gC+1|0}else{break L717}}if((a[b0+gC|0]|0)!=0){break}c[16335]=c[16335]|12;c[13898]=gH+1;break L44}}while(0);be(b5|0,125128,(v=i,i=i+8|0,c[v>>2]=56856,v)|0);gH=c[13898]|0;gy=c[1054]|0;gz=c[gy+(gH*40&-1)+36>>2]|0;gG=c[gy+(gH*40&-1)+32>>2]|0;L726:do{if((a[gy+(gH*40&-1)|0]&1)!=0){if((gz|0)>0){cd=c[10036]|0;hS=0;hF=0;gE=gG;while(1){gA=a[b0+hS|0]|0;if(gA<<24>>24==(a[cd+(hS+gE|0)|0]|0)){jE=gE;jF=hF}else{if(gA<<24>>24!=36){break L726}jE=gE-1|0;jF=1}jG=hS+1|0;if((jG|0)<(jF+gz|0)){hS=jG;hF=jF;gE=jE}else{break}}if((jF|0)==0){jH=jG;b7=511}}else{jH=0;b7=511}if((b7|0)==511){b7=0;gE=a[b0+jH|0]|0;if(!((gE<<24>>24|0)==36|(gE<<24>>24|0)==0)){break}}c[16335]=c[16335]|4;c[13898]=gH+1;break L44}}while(0);be(b3|0,124936,(v=i,i=i+8|0,c[v>>2]=56856,v)|0);gH=c[13898]|0;gz=c[1054]|0;gG=c[gz+(gH*40&-1)+36>>2]|0;gy=c[gz+(gH*40&-1)+32>>2]|0;L741:do{if((a[gz+(gH*40&-1)|0]&1)!=0){L743:do{if((gG|0)>0){gE=c[10036]|0;hF=0;hS=0;cd=gy;while(1){gC=a[b1+hF|0]|0;if(gC<<24>>24==(a[gE+(hF+cd|0)|0]|0)){jI=cd;jJ=hS}else{if(gC<<24>>24!=36){break L743}jI=cd-1|0;jJ=1}jK=hF+1|0;if((jK|0)<(jJ+gG|0)){hF=jK;hS=jJ;cd=jI}else{break}}if((jJ|0)==0){jL=jK;b7=521}else{b7=522}}else{jL=0;b7=521}}while(0);if((b7|0)==521){b7=0;cd=a[b1+jL|0]|0;if((cd<<24>>24|0)==36|(cd<<24>>24|0)==0){b7=522}}if((b7|0)==522){b7=0;c[16335]=c[16335]|8;c[13898]=gH+1;break L44}if((c[8272]|0)<=(gH|0)){break}cd=c[10036]|0;hS=0;while(1){if((hS|0)>=(gG|0)){break}if((a[cd+(hS+gy|0)|0]|0)==(a[hS+56832|0]|0)){hS=hS+1|0}else{break L741}}if((a[hS+56832|0]|0)!=0){break}c[16163]=3;c[16182]=0;c[16183]=0;c[13898]=gH+1;break L44}}while(0);be(b5|0,125560,(v=i,i=i+8|0,c[v>>2]=56832,v)|0);gH=c[13898]|0;gy=c[1054]|0;gG=c[gy+(gH*40&-1)+36>>2]|0;gz=c[gy+(gH*40&-1)+32>>2]|0;L764:do{if((a[gy+(gH*40&-1)|0]&1)!=0){if((gG|0)>0){cd=c[10036]|0;hF=0;gE=0;gC=gz;while(1){gA=a[b0+hF|0]|0;if(gA<<24>>24==(a[cd+(hF+gC|0)|0]|0)){jM=gC;jN=gE}else{if(gA<<24>>24!=36){break L764}jM=gC-1|0;jN=1}jO=hF+1|0;if((jO|0)<(jN+gG|0)){hF=jO;gE=jN;gC=jM}else{break}}if((jN|0)==0){jP=jO;b7=537}}else{jP=0;b7=537}if((b7|0)==537){b7=0;gC=a[b0+jP|0]|0;if(!((gC<<24>>24|0)==36|(gC<<24>>24|0)==0)){break}}c[16163]=c[16163]|1;c[16182]=0;c[13898]=gH+1;break L44}}while(0);be(b3|0,125432,(v=i,i=i+8|0,c[v>>2]=56832,v)|0);gH=c[13898]|0;gG=c[1054]|0;gz=c[gG+(gH*40&-1)+36>>2]|0;gy=c[gG+(gH*40&-1)+32>>2]|0;L779:do{if((a[gG+(gH*40&-1)|0]&1)!=0){if((gz|0)>0){gC=c[10036]|0;gE=0;hF=0;cd=gy;while(1){hS=a[b1+gE|0]|0;if(hS<<24>>24==(a[gC+(gE+cd|0)|0]|0)){jQ=cd;jR=hF}else{if(hS<<24>>24!=36){break L779}jQ=cd-1|0;jR=1}jS=gE+1|0;if((jS|0)<(jR+gz|0)){gE=jS;hF=jR;cd=jQ}else{break}}if((jR|0)==0){jT=jS;b7=547}}else{jT=0;b7=547}if((b7|0)==547){b7=0;cd=a[b1+jT|0]|0;if(!((cd<<24>>24|0)==36|(cd<<24>>24|0)==0)){break}}c[16163]=c[16163]|2;c[16183]=0;c[13898]=gH+1;break L44}}while(0);be(b5|0,125376,(v=i,i=i+8|0,c[v>>2]=56832,v)|0);gH=c[13898]|0;L794:do{if((c[8272]|0)>(gH|0)){gz=c[1054]|0;if((a[gz+(gH*40&-1)|0]&1)==0){break}gy=c[gz+(gH*40&-1)+36>>2]|0;gG=gz+(gH*40&-1)+32|0;gz=c[10036]|0;cd=0;while(1){if((cd|0)>=(gy|0)){break}if((a[gz+((c[gG>>2]|0)+cd|0)|0]|0)==(a[b0+cd|0]|0)){cd=cd+1|0}else{break L794}}if((a[b0+cd|0]|0)!=0){break}c[16163]=c[16163]|12;c[13898]=gH+1;break L44}}while(0);be(b5|0,125128,(v=i,i=i+8|0,c[v>>2]=56832,v)|0);gH=c[13898]|0;gG=c[1054]|0;gz=c[gG+(gH*40&-1)+36>>2]|0;gy=c[gG+(gH*40&-1)+32>>2]|0;L803:do{if((a[gG+(gH*40&-1)|0]&1)!=0){if((gz|0)>0){hF=c[10036]|0;gE=0;gC=0;hS=gy;while(1){gA=a[b0+gE|0]|0;if(gA<<24>>24==(a[hF+(gE+hS|0)|0]|0)){jU=hS;jV=gC}else{if(gA<<24>>24!=36){break L803}jU=hS-1|0;jV=1}jW=gE+1|0;if((jW|0)<(jV+gz|0)){gE=jW;gC=jV;hS=jU}else{break}}if((jV|0)==0){jX=jW;b7=564}}else{jX=0;b7=564}if((b7|0)==564){b7=0;hS=a[b0+jX|0]|0;if(!((hS<<24>>24|0)==36|(hS<<24>>24|0)==0)){break}}c[16163]=c[16163]|4;c[13898]=gH+1;break L44}}while(0);be(b3|0,124936,(v=i,i=i+8|0,c[v>>2]=56832,v)|0);gH=c[13898]|0;gz=c[1054]|0;gy=c[gz+(gH*40&-1)+36>>2]|0;gG=c[gz+(gH*40&-1)+32>>2]|0;L818:do{if((a[gz+(gH*40&-1)|0]&1)!=0){L820:do{if((gy|0)>0){hS=c[10036]|0;gC=0;gE=0;hF=gG;while(1){cd=a[b1+gC|0]|0;if(cd<<24>>24==(a[hS+(gC+hF|0)|0]|0)){jY=hF;jZ=gE}else{if(cd<<24>>24!=36){break L820}jY=hF-1|0;jZ=1}j_=gC+1|0;if((j_|0)<(jZ+gy|0)){gC=j_;gE=jZ;hF=jY}else{break}}if((jZ|0)==0){j$=j_;b7=574}else{b7=575}}else{j$=0;b7=574}}while(0);if((b7|0)==574){b7=0;hF=a[b1+j$|0]|0;if((hF<<24>>24|0)==36|(hF<<24>>24|0)==0){b7=575}}if((b7|0)==575){b7=0;c[16163]=c[16163]|8;c[13898]=gH+1;break L44}if((c[8272]|0)<=(gH|0)){break}hF=c[10036]|0;gE=0;while(1){if((gE|0)>=(gy|0)){break}if((a[hF+(gE+gG|0)|0]|0)==(a[gE+56976|0]|0)){gE=gE+1|0}else{break L818}}if((a[gE+56976|0]|0)!=0){break}c[17195]=3;c[17214]=0;c[17215]=0;c[13898]=gH+1;break L44}}while(0);be(b5|0,125560,(v=i,i=i+8|0,c[v>>2]=56976,v)|0);gH=c[13898]|0;gG=c[1054]|0;gy=c[gG+(gH*40&-1)+36>>2]|0;gz=c[gG+(gH*40&-1)+32>>2]|0;L841:do{if((a[gG+(gH*40&-1)|0]&1)!=0){if((gy|0)>0){hF=c[10036]|0;gC=0;hS=0;cd=gz;while(1){gA=a[b0+gC|0]|0;if(gA<<24>>24==(a[hF+(gC+cd|0)|0]|0)){j0=cd;j1=hS}else{if(gA<<24>>24!=36){break L841}j0=cd-1|0;j1=1}j2=gC+1|0;if((j2|0)<(j1+gy|0)){gC=j2;hS=j1;cd=j0}else{break}}if((j1|0)==0){j3=j2;b7=590}}else{j3=0;b7=590}if((b7|0)==590){b7=0;cd=a[b0+j3|0]|0;if(!((cd<<24>>24|0)==36|(cd<<24>>24|0)==0)){break}}c[17195]=c[17195]|1;c[17214]=0;c[13898]=gH+1;break L44}}while(0);be(b3|0,125432,(v=i,i=i+8|0,c[v>>2]=56976,v)|0);gH=c[13898]|0;gy=c[1054]|0;gz=c[gy+(gH*40&-1)+36>>2]|0;gG=c[gy+(gH*40&-1)+32>>2]|0;L856:do{if((a[gy+(gH*40&-1)|0]&1)!=0){if((gz|0)>0){cd=c[10036]|0;hS=0;gC=0;hF=gG;while(1){gE=a[b1+hS|0]|0;if(gE<<24>>24==(a[cd+(hS+hF|0)|0]|0)){j4=hF;j5=gC}else{if(gE<<24>>24!=36){break L856}j4=hF-1|0;j5=1}j6=hS+1|0;if((j6|0)<(j5+gz|0)){hS=j6;gC=j5;hF=j4}else{break}}if((j5|0)==0){j7=j6;b7=600}}else{j7=0;b7=600}if((b7|0)==600){b7=0;hF=a[b1+j7|0]|0;if(!((hF<<24>>24|0)==36|(hF<<24>>24|0)==0)){break}}c[17195]=c[17195]|2;c[17215]=0;c[13898]=gH+1;break L44}}while(0);be(b5|0,125376,(v=i,i=i+8|0,c[v>>2]=56976,v)|0);gH=c[13898]|0;L871:do{if((c[8272]|0)>(gH|0)){gz=c[1054]|0;if((a[gz+(gH*40&-1)|0]&1)==0){break}gG=c[gz+(gH*40&-1)+36>>2]|0;gy=gz+(gH*40&-1)+32|0;gz=c[10036]|0;hF=0;while(1){if((hF|0)>=(gG|0)){break}if((a[gz+((c[gy>>2]|0)+hF|0)|0]|0)==(a[b0+hF|0]|0)){hF=hF+1|0}else{break L871}}if((a[b0+hF|0]|0)!=0){break}c[17195]=c[17195]|12;c[13898]=gH+1;break L44}}while(0);be(b5|0,125128,(v=i,i=i+8|0,c[v>>2]=56976,v)|0);gH=c[13898]|0;gy=c[1054]|0;gz=c[gy+(gH*40&-1)+36>>2]|0;gG=c[gy+(gH*40&-1)+32>>2]|0;L880:do{if((a[gy+(gH*40&-1)|0]&1)!=0){if((gz|0)>0){gC=c[10036]|0;hS=0;cd=0;gE=gG;while(1){gA=a[b0+hS|0]|0;if(gA<<24>>24==(a[gC+(hS+gE|0)|0]|0)){j8=gE;j9=cd}else{if(gA<<24>>24!=36){break L880}j8=gE-1|0;j9=1}ka=hS+1|0;if((ka|0)<(j9+gz|0)){hS=ka;cd=j9;gE=j8}else{break}}if((j9|0)==0){kb=ka;b7=617}}else{kb=0;b7=617}if((b7|0)==617){b7=0;gE=a[b0+kb|0]|0;if(!((gE<<24>>24|0)==36|(gE<<24>>24|0)==0)){break}}c[17195]=c[17195]|4;c[13898]=gH+1;break L44}}while(0);be(b3|0,124936,(v=i,i=i+8|0,c[v>>2]=56976,v)|0);gH=c[13898]|0;gz=c[1054]|0;gG=c[gz+(gH*40&-1)+36>>2]|0;gy=c[gz+(gH*40&-1)+32>>2]|0;L895:do{if((a[gz+(gH*40&-1)|0]&1)!=0){L897:do{if((gG|0)>0){gE=c[10036]|0;cd=0;hS=0;gC=gy;while(1){hF=a[b1+cd|0]|0;if(hF<<24>>24==(a[gE+(cd+gC|0)|0]|0)){kc=gC;kd=hS}else{if(hF<<24>>24!=36){break L897}kc=gC-1|0;kd=1}ke=cd+1|0;if((ke|0)<(kd+gG|0)){cd=ke;hS=kd;gC=kc}else{break}}if((kd|0)==0){kf=ke;b7=627}else{b7=628}}else{kf=0;b7=627}}while(0);if((b7|0)==627){b7=0;gC=a[b1+kf|0]|0;if((gC<<24>>24|0)==36|(gC<<24>>24|0)==0){b7=628}}if((b7|0)==628){b7=0;c[17195]=c[17195]|8;c[13898]=gH+1;break L44}if((c[8272]|0)<=(gH|0)){break}gC=c[10036]|0;hS=0;while(1){if((hS|0)>=(gG|0)){break}if((a[gC+(hS+gy|0)|0]|0)==(a[hS+56952|0]|0)){hS=hS+1|0}else{break L895}}if((a[hS+56952|0]|0)!=0){break}c[17023]=3;c[17042]=0;c[17043]=0;c[13898]=gH+1;break L44}}while(0);be(b5|0,125560,(v=i,i=i+8|0,c[v>>2]=56952,v)|0);gH=c[13898]|0;gy=c[1054]|0;gG=c[gy+(gH*40&-1)+36>>2]|0;gz=c[gy+(gH*40&-1)+32>>2]|0;L918:do{if((a[gy+(gH*40&-1)|0]&1)!=0){if((gG|0)>0){gC=c[10036]|0;cd=0;gE=0;hF=gz;while(1){gA=a[b0+cd|0]|0;if(gA<<24>>24==(a[gC+(cd+hF|0)|0]|0)){kg=hF;kh=gE}else{if(gA<<24>>24!=36){break L918}kg=hF-1|0;kh=1}ki=cd+1|0;if((ki|0)<(kh+gG|0)){cd=ki;gE=kh;hF=kg}else{break}}if((kh|0)==0){kj=ki;b7=643}}else{kj=0;b7=643}if((b7|0)==643){b7=0;hF=a[b0+kj|0]|0;if(!((hF<<24>>24|0)==36|(hF<<24>>24|0)==0)){break}}c[17023]=c[17023]|1;c[17042]=0;c[13898]=gH+1;break L44}}while(0);be(b3|0,125432,(v=i,i=i+8|0,c[v>>2]=56952,v)|0);gH=c[13898]|0;gG=c[1054]|0;gz=c[gG+(gH*40&-1)+36>>2]|0;gy=c[gG+(gH*40&-1)+32>>2]|0;L933:do{if((a[gG+(gH*40&-1)|0]&1)!=0){if((gz|0)>0){hF=c[10036]|0;gE=0;cd=0;gC=gy;while(1){hS=a[b1+gE|0]|0;if(hS<<24>>24==(a[hF+(gE+gC|0)|0]|0)){kk=gC;kl=cd}else{if(hS<<24>>24!=36){break L933}kk=gC-1|0;kl=1}km=gE+1|0;if((km|0)<(kl+gz|0)){gE=km;cd=kl;gC=kk}else{break}}if((kl|0)==0){kn=km;b7=653}}else{kn=0;b7=653}if((b7|0)==653){b7=0;gC=a[b1+kn|0]|0;if(!((gC<<24>>24|0)==36|(gC<<24>>24|0)==0)){break}}c[17023]=c[17023]|2;c[17043]=0;c[13898]=gH+1;break L44}}while(0);be(b5|0,125376,(v=i,i=i+8|0,c[v>>2]=56952,v)|0);gH=c[13898]|0;L948:do{if((c[8272]|0)>(gH|0)){gz=c[1054]|0;if((a[gz+(gH*40&-1)|0]&1)==0){break}gy=c[gz+(gH*40&-1)+36>>2]|0;gG=gz+(gH*40&-1)+32|0;gz=c[10036]|0;gC=0;while(1){if((gC|0)>=(gy|0)){break}if((a[gz+((c[gG>>2]|0)+gC|0)|0]|0)==(a[b0+gC|0]|0)){gC=gC+1|0}else{break L948}}if((a[b0+gC|0]|0)!=0){break}c[17023]=c[17023]|12;c[13898]=gH+1;break L44}}while(0);be(b5|0,125128,(v=i,i=i+8|0,c[v>>2]=56952,v)|0);gH=c[13898]|0;gG=c[1054]|0;gz=c[gG+(gH*40&-1)+36>>2]|0;gy=c[gG+(gH*40&-1)+32>>2]|0;L957:do{if((a[gG+(gH*40&-1)|0]&1)!=0){if((gz|0)>0){cd=c[10036]|0;gE=0;hF=0;hS=gy;while(1){gA=a[b0+gE|0]|0;if(gA<<24>>24==(a[cd+(gE+hS|0)|0]|0)){ko=hS;kp=hF}else{if(gA<<24>>24!=36){break L957}ko=hS-1|0;kp=1}kq=gE+1|0;if((kq|0)<(kp+gz|0)){gE=kq;hF=kp;hS=ko}else{break}}if((kp|0)==0){kr=kq;b7=670}}else{kr=0;b7=670}if((b7|0)==670){b7=0;hS=a[b0+kr|0]|0;if(!((hS<<24>>24|0)==36|(hS<<24>>24|0)==0)){break}}c[17023]=c[17023]|4;c[13898]=gH+1;break L44}}while(0);be(b3|0,124936,(v=i,i=i+8|0,c[v>>2]=56952,v)|0);gH=c[13898]|0;gz=c[1054]|0;gy=c[gz+(gH*40&-1)+36>>2]|0;gG=c[gz+(gH*40&-1)+32>>2]|0;L972:do{if((a[gz+(gH*40&-1)|0]&1)!=0){L974:do{if((gy|0)>0){hS=c[10036]|0;hF=0;gE=0;cd=gG;while(1){gC=a[b1+hF|0]|0;if(gC<<24>>24==(a[hS+(hF+cd|0)|0]|0)){ks=cd;kt=gE}else{if(gC<<24>>24!=36){break L974}ks=cd-1|0;kt=1}ku=hF+1|0;if((ku|0)<(kt+gy|0)){hF=ku;gE=kt;cd=ks}else{break}}if((kt|0)==0){kv=ku;b7=680}else{b7=681}}else{kv=0;b7=680}}while(0);if((b7|0)==680){b7=0;cd=a[b1+kv|0]|0;if((cd<<24>>24|0)==36|(cd<<24>>24|0)==0){b7=681}}if((b7|0)==681){b7=0;c[17023]=c[17023]|8;c[13898]=gH+1;break L44}if((c[8272]|0)<=(gH|0)){break}cd=c[10036]|0;gE=0;while(1){if((gE|0)>=(gy|0)){break}if((a[cd+(gE+gG|0)|0]|0)==(a[gE+56904|0]|0)){gE=gE+1|0}else{break L972}}if((a[gE+56904|0]|0)!=0){break}c[16679]=3;c[16698]=0;c[16699]=0;c[13898]=gH+1;break L44}}while(0);be(b5|0,125560,(v=i,i=i+8|0,c[v>>2]=56904,v)|0);gH=c[13898]|0;gG=c[1054]|0;gy=c[gG+(gH*40&-1)+36>>2]|0;gz=c[gG+(gH*40&-1)+32>>2]|0;L995:do{if((a[gG+(gH*40&-1)|0]&1)!=0){if((gy|0)>0){cd=c[10036]|0;hF=0;hS=0;gC=gz;while(1){gA=a[b0+hF|0]|0;if(gA<<24>>24==(a[cd+(hF+gC|0)|0]|0)){kw=gC;kx=hS}else{if(gA<<24>>24!=36){break L995}kw=gC-1|0;kx=1}ky=hF+1|0;if((ky|0)<(kx+gy|0)){hF=ky;hS=kx;gC=kw}else{break}}if((kx|0)==0){kz=ky;b7=696}}else{kz=0;b7=696}if((b7|0)==696){b7=0;gC=a[b0+kz|0]|0;if(!((gC<<24>>24|0)==36|(gC<<24>>24|0)==0)){break}}c[16679]=c[16679]|1;c[16698]=0;c[13898]=gH+1;break L44}}while(0);be(b3|0,125432,(v=i,i=i+8|0,c[v>>2]=56904,v)|0);gH=c[13898]|0;gy=c[1054]|0;gz=c[gy+(gH*40&-1)+36>>2]|0;gG=c[gy+(gH*40&-1)+32>>2]|0;L1010:do{if((a[gy+(gH*40&-1)|0]&1)!=0){if((gz|0)>0){gC=c[10036]|0;hS=0;hF=0;cd=gG;while(1){gE=a[b1+hS|0]|0;if(gE<<24>>24==(a[gC+(hS+cd|0)|0]|0)){kA=cd;kB=hF}else{if(gE<<24>>24!=36){break L1010}kA=cd-1|0;kB=1}kC=hS+1|0;if((kC|0)<(kB+gz|0)){hS=kC;hF=kB;cd=kA}else{break}}if((kB|0)==0){kD=kC;b7=706}}else{kD=0;b7=706}if((b7|0)==706){b7=0;cd=a[b1+kD|0]|0;if(!((cd<<24>>24|0)==36|(cd<<24>>24|0)==0)){break}}c[16679]=c[16679]|2;c[16699]=0;c[13898]=gH+1;break L44}}while(0);be(b5|0,125376,(v=i,i=i+8|0,c[v>>2]=56904,v)|0);gH=c[13898]|0;L1025:do{if((c[8272]|0)>(gH|0)){gz=c[1054]|0;if((a[gz+(gH*40&-1)|0]&1)==0){break}gG=c[gz+(gH*40&-1)+36>>2]|0;gy=gz+(gH*40&-1)+32|0;gz=c[10036]|0;cd=0;while(1){if((cd|0)>=(gG|0)){break}if((a[gz+((c[gy>>2]|0)+cd|0)|0]|0)==(a[b0+cd|0]|0)){cd=cd+1|0}else{break L1025}}if((a[b0+cd|0]|0)!=0){break}c[16679]=c[16679]|12;c[13898]=gH+1;break L44}}while(0);be(b5|0,125128,(v=i,i=i+8|0,c[v>>2]=56904,v)|0);gH=c[13898]|0;gy=c[1054]|0;gz=c[gy+(gH*40&-1)+36>>2]|0;gG=c[gy+(gH*40&-1)+32>>2]|0;L1034:do{if((a[gy+(gH*40&-1)|0]&1)!=0){if((gz|0)>0){hF=c[10036]|0;hS=0;gC=0;gE=gG;while(1){gA=a[b0+hS|0]|0;if(gA<<24>>24==(a[hF+(hS+gE|0)|0]|0)){kE=gE;kF=gC}else{if(gA<<24>>24!=36){break L1034}kE=gE-1|0;kF=1}kG=hS+1|0;if((kG|0)<(kF+gz|0)){hS=kG;gC=kF;gE=kE}else{break}}if((kF|0)==0){kH=kG;b7=723}}else{kH=0;b7=723}if((b7|0)==723){b7=0;gE=a[b0+kH|0]|0;if(!((gE<<24>>24|0)==36|(gE<<24>>24|0)==0)){break}}c[16679]=c[16679]|4;c[13898]=gH+1;break L44}}while(0);be(b3|0,124936,(v=i,i=i+8|0,c[v>>2]=56904,v)|0);kI=c[13898]|0;gH=c[1054]|0;gz=c[gH+(kI*40&-1)+36>>2]|0;if((a[gH+(kI*40&-1)|0]&1)==0){b7=5120;break L27}if((gz|0)>0){gG=c[10036]|0;gy=0;gE=0;gC=c[gH+(kI*40&-1)+32>>2]|0;while(1){gH=a[b1+gy|0]|0;if(gH<<24>>24==(a[gG+(gy+gC|0)|0]|0)){kJ=gC;kK=gE}else{if(gH<<24>>24!=36){b7=5121;break L27}kJ=gC-1|0;kK=1}kL=gy+1|0;if((kL|0)<(kK+gz|0)){gy=kL;gE=kK;gC=kJ}else{break}}if((kK|0)==0){kM=kL;b7=733}}else{kM=0;b7=733}if((b7|0)==733){b7=0;gC=a[b1+kM|0]|0;if(!((gC<<24>>24|0)==36|(gC<<24>>24|0)==0)){b7=5122;break L27}}c[16679]=c[16679]|8;c[13898]=kI+1;break L44}}while(0);c[16163]=3;c[16335]=3;c[16507]=3;c[16679]=3;c[16851]=3;c[17023]=3;c[17195]=3;c[17367]=3;c[17539]=3;c[17711]=3;c[17883]=3}else if((gD|0)==6){gx=gv+1|0;c[13898]=gx;gC=c[8272]|0;L1064:do{if((gx|0)<(gC|0)){gE=gx;gy=gC;gz=gw;while(1){gG=c[gz+(gE*40&-1)+36>>2]|0;gH=gz+(gE*40&-1)+32|0;L1067:do{if((a[gz+(gE*40&-1)|0]&1)==0){b7=776}else{hS=c[10036]|0;hF=0;while(1){if((hF|0)>=(gG|0)){b7=741;break}cd=c[gH>>2]|0;if((a[hS+(cd+hF|0)|0]|0)==(a[hF+103664|0]|0)){hF=hF+1|0}else{kN=cd;break}}if((b7|0)==741){b7=0;if((hF|0)==1){kO=gE;break L1064}kN=c[gH>>2]|0}L1076:do{if((gG|0)>0){cd=0;gA=0;hp=kN;while(1){if((a[cd+95520|0]|0)==(a[hS+(cd+hp|0)|0]|0)){kP=hp;kQ=gA}else{if((cd|0)!=1){kR=0;kS=0;kT=kN;break}kP=hp-1|0;kQ=1}ho=cd+1|0;if((ho|0)<(kQ+gG|0)){cd=ho;gA=kQ;hp=kP}else{b7=748;break}}do{if((b7|0)==748){b7=0;if((kQ|0)==0){if(!((cd|0)==0|(cd|0)==5)){kR=0;kS=0;kT=kN;break}}h[7077]=0.0;hp=gE+1|0;c[13898]=hp;kU=hp;kV=gy;break L1067}}while(0);while(1){if((a[kR+126016|0]|0)==(a[hS+(kR+kT|0)|0]|0)){kW=kT;kX=kS}else{if((kR|0)!=1){kY=0;kZ=0;k_=kN;break}kW=kT-1|0;kX=1}cd=kR+1|0;if((cd|0)<(kX+gG|0)){kR=cd;kS=kX;kT=kW}else{b7=755;break}}do{if((b7|0)==755){b7=0;if((kX|0)==0){if(!((kR|0)==0|(kR|0)==5)){kY=0;kZ=0;k_=kN;break}}h[7077]=1.0;cd=gE+1|0;c[13898]=cd;kU=cd;kV=gy;break L1067}}while(0);while(1){if((a[kY+125960|0]|0)==(a[hS+(kY+k_|0)|0]|0)){k$=k_;k0=kZ}else{if((kY|0)!=4){break L1076}k$=k_-1|0;k0=1}cd=kY+1|0;if((cd|0)<(k0+gG|0)){kY=cd;kZ=k0;k_=k$}else{break}}if((k0|0)==0){if(!((kY|0)==3|(kY|0)==9)){break}}h[7077]=-1.0;cd=gE+1|0;c[13898]=cd;kU=cd;kV=gy;break L1067}}while(0);if((gy|0)>(gE|0)){k1=0}else{b7=776;break}while(1){if((k1|0)>=(gG|0)){b7=770;break}if((a[hS+(k1+kN|0)|0]|0)==(a[k1+150856|0]|0)){k1=k1+1|0}else{k2=0;break}}do{if((b7|0)==770){b7=0;if((k1|0)!=5){k2=0;break}c[14156]=1;hF=gE+1|0;c[13898]=hF;kU=hF;kV=gy;break L1067}}while(0);while(1){if((k2|0)>=(gG|0)){break}if((a[hS+(k2+kN|0)|0]|0)==(a[k2+150704|0]|0)){k2=k2+1|0}else{b7=776;break L1067}}if((k2|0)!=4){b7=776;break}c[14156]=0;hS=gE+1|0;c[13898]=hS;kU=hS;kV=gy}}while(0);if((b7|0)==776){b7=0;gG=is(b_)|0;gH=c[gG>>2]|0;if((gH|0)==1){k3=+(c[gG+8>>2]|0)}else if((gH|0)==2){k3=+h[gG+8>>3]}else if((gH|0)==3){k3=+uz(c[gG+8>>2]|0,0)}else{b7=780;break L27}if((c[b6>>2]|0)==3){uu(c[cc>>2]|0);c[b6>>2]=1}h[7077]=k3;kU=c[13898]|0;kV=c[8272]|0}if((kU|0)>=(kV|0)){kO=kU;break L1064}gE=kU;gy=kV;gz=c[1054]|0}}else{kO=gx}}while(0);if((gx|0)!=(kO|0)){break}h[7077]=1.0}else if((gD|0)==8){gC=gv+1|0;c[13898]=gC;gz=c[8272]|0;gy=(gC|0)<(gz|0);L1136:do{if(gy){if((a[gw+(gC*40&-1)|0]&1)==0){k4=gC;k5=gz;k6=gw;b7=794;break}gE=c[gw+(gC*40&-1)+36>>2]|0;gG=gw+(gC*40&-1)+32|0;gH=0;while(1){if((gH|0)>=(gE|0)){break}if((a[gB+((c[gG>>2]|0)+gH|0)|0]|0)==(a[gH+103664|0]|0)){gH=gH+1|0}else{b7=793;break L1136}}if((gH|0)==1){b7=792}else{b7=793}}else{b7=792}}while(0);if((b7|0)==792){b7=0;c[11692]=31;c[14088]=1;c[14074]=c[12768];c[14075]=c[12769];c[14076]=c[12770];c[14077]=c[12771];c[14078]=c[12772];c[14079]=c[12773];c[14080]=c[12774];c[14081]=c[12775];c[14082]=c[12776];c[14083]=c[12777];c[14084]=c[12778];c[14085]=c[12779];c[14086]=c[12780];c[14087]=c[12781];b7=793}if((b7|0)==793){b7=0;if(gy){k4=gC;k5=gz;k6=gw;b7=794}}L1147:do{if((b7|0)==794){while(1){b7=0;L1150:do{if((a[k6+(k4*40&-1)|0]&1)==0){b7=810}else{gx=c[k6+(k4*40&-1)+36>>2]|0;gG=k6+(k4*40&-1)+32|0;gE=c[10036]|0;hS=0;while(1){if((hS|0)>=(gx|0)){b7=798;break}if((a[gE+((c[gG>>2]|0)+hS|0)|0]|0)==(a[hS+103664|0]|0)){hS=hS+1|0}else{break}}if((b7|0)==798){b7=0;if((hS|0)==1){break L1147}}if((k5|0)>(k4|0)){k7=0}else{b7=810;break}while(1){if((k7|0)>=(gx|0)){b7=802;break}if((a[gE+((c[gG>>2]|0)+k7|0)|0]|0)==(a[k7+150856|0]|0)){k7=k7+1|0}else{k8=0;break}}do{if((b7|0)==802){b7=0;if((k7|0)!=5){k8=0;break}c[14088]=1;hS=k4+1|0;c[13898]=hS;k9=hS;break L1150}}while(0);while(1){if((k8|0)>=(gx|0)){break}if((a[gE+((c[gG>>2]|0)+k8|0)|0]|0)==(a[k8+150704|0]|0)){k8=k8+1|0}else{b7=810;break L1150}}if((k8|0)!=4){b7=810;break}c[14088]=0;gG=k4+1|0;c[13898]=gG;k9=gG}}while(0);do{if((b7|0)==810){b7=0;hH(56296,1,0);gG=c[13898]|0;if((k4|0)!=(gG|0)){k9=gG;break}gG=is(bZ)|0;gE=c[gG>>2]|0;if((gE|0)==1){la=+(c[gG+8>>2]|0)}else if((gE|0)==2){la=+h[gG+8>>3]}else if((gE|0)==3){la=+uz(c[gG+8>>2]|0,0)}else{b7=815;break L27}if((c[b4>>2]|0)==3){uu(c[cg>>2]|0);c[b4>>2]=1}c[11692]=~~la;k9=c[13898]|0}}while(0);gG=c[8272]|0;if((k9|0)>=(gG|0)){break L1147}k4=k9;k5=gG;k6=c[1054]|0;b7=794}}}while(0);c[260]=c[11692]}else if((gD|0)==9){gz=gv+1|0;c[13898]=gz;gC=c[8272]|0;L1184:do{if((gz|0)<(gC|0)){L1186:do{if((a[gw+(gz*40&-1)|0]&1)!=0){gy=c[gw+(gz*40&-1)+36>>2]|0;gH=gw+(gz*40&-1)+32|0;gG=0;while(1){if((gG|0)>=(gy|0)){break}if((a[gB+((c[gH>>2]|0)+gG|0)|0]|0)==(a[gG+103664|0]|0)){gG=gG+1|0}else{break L1186}}if((gG|0)==1){b7=826;break L1184}}}while(0);gH=is(bY)|0;gy=c[gH>>2]|0;if((gy|0)==1){lb=+(c[gH+8>>2]|0)}else if((gy|0)==2){lb=+h[gH+8>>3]}else if((gy|0)==3){lb=+uz(c[gH+8>>2]|0,0)}else{b7=831;break L27}if((c[ch>>2]|0)==3){uu(c[ci>>2]|0);c[ch>>2]=1}h[7030]=lb;lc=c[13898]|0;ld=c[8272]|0}else{b7=826}}while(0);if((b7|0)==826){b7=0;h[7030]=-1.0;a[56232]=1;lc=gz;ld=gC}if((lc|0)>=(ld|0)){break}gH=c[1054]|0;if((a[gH+(lc*40&-1)|0]&1)==0){b7=5123;break L27}gy=c[gH+(lc*40&-1)+36>>2]|0;gE=gH+(lc*40&-1)+32|0;gH=c[10036]|0;gx=0;while(1){if((gx|0)>=(gy|0)){b7=840;break}hS=c[gE>>2]|0;if((a[gH+(hS+gx|0)|0]|0)==(a[gx+103664|0]|0)){gx=gx+1|0}else{le=hS;break}}if((b7|0)==840){b7=0;if((gx|0)==1){break}le=c[gE>>2]|0}if((gy|0)>0){lf=0;lg=0;lh=le}else{b7=5124;break L27}while(1){if((a[lf+126368|0]|0)==(a[gH+(lf+lh|0)|0]|0)){li=lh;lk=lg}else{if((lf|0)!=1){lm=0;ln=0;lo=le;b7=849;break}li=lh-1|0;lk=1}gC=lf+1|0;if((gC|0)<(lk+gy|0)){lf=gC;lg=lk;lh=li}else{b7=847;break}}do{if((b7|0)==847){b7=0;if((lk|0)!=0){lp=1;break}if((lf|0)==0|(lf|0)==8){lp=1}else{lm=0;ln=0;lo=le;b7=849}}}while(0);do{if((b7|0)==849){while(1){b7=0;if((a[lm+126280|0]|0)==(a[gH+(lm+lo|0)|0]|0)){lq=lo;lr=ln}else{if((lm|0)!=1){b7=5125;break L27}lq=lo-1|0;lr=1}gE=lm+1|0;if((gE|0)<(lr+gy|0)){lm=gE;ln=lr;lo=lq;b7=849}else{break}}if((lr|0)!=0){lp=0;break}if((lm|0)==0|(lm|0)==8){lp=0}else{b7=5126;break L27}}}while(0);a[56232]=lp;c[13898]=lc+1}else if((gD|0)==10){gy=gv+1|0;c[13898]=gy;a[35888]=1;if((gy|0)>=(c[8272]|0)){break}L1234:do{if((a[gw+(gy*40&-1)|0]&1)!=0){gH=c[gw+(gy*40&-1)+36>>2]|0;gE=gw+(gy*40&-1)+32|0;gx=0;while(1){if((gx|0)>=(gH|0)){break}if((a[gB+((c[gE>>2]|0)+gx|0)|0]|0)==(a[gx+103664|0]|0)){gx=gx+1|0}else{break L1234}}if((gx|0)==1){break L44}}}while(0);a[14176]=1;is(bX);a[14176]=0;if((c[cj>>2]|0)!=3){c[13898]=gy;break}gE=c[ck>>2]|0;if((gE|0)==0){break}uF(53520,gE|0,32);uu(gE)}else if((gD|0)==11){lt=gv+1|0;c[13898]=lt;L1246:do{if((lt|0)<(c[8272]|0)){if((a[gw+(lt*40&-1)|0]&1)==0){b7=5127;break L27}gE=c[gw+(lt*40&-1)+36>>2]|0;gH=gw+(lt*40&-1)+32|0;gC=0;while(1){if((gC|0)>=(gE|0)){b7=872;break}gz=c[gH>>2]|0;if((a[gB+(gz+gC|0)|0]|0)==(a[gC+103664|0]|0)){gC=gC+1|0}else{lu=gz;break}}if((b7|0)==872){b7=0;if((gC|0)==1){b7=874;break}lu=c[gH>>2]|0}if((gE|0)>0){lv=0;lw=0;lx=lu}else{b7=5128;break L27}while(1){if((a[lv+144616|0]|0)==(a[gB+(lv+lx|0)|0]|0)){ly=lx;lA=lw}else{if((lv|0)!=1){lB=0;lC=0;lD=lu;break}ly=lx-1|0;lA=1}gx=lv+1|0;if((gx|0)<(lA+gE|0)){lv=gx;lw=lA;lx=ly}else{b7=880;break}}do{if((b7|0)==880){b7=0;if((lA|0)==0){if(!((lv|0)==0|(lv|0)==6)){lB=0;lC=0;lD=lu;break}}a[54144]=1;break L1246}}while(0);while(1){if((a[lB+143008|0]|0)==(a[gB+(lB+lD|0)|0]|0)){lE=lD;lF=lC}else{if((lB|0)!=1){lG=0;lH=0;lI=lu;break}lE=lD-1|0;lF=1}gH=lB+1|0;if((gH|0)<(lF+gE|0)){lB=gH;lC=lF;lD=lE}else{b7=887;break}}do{if((b7|0)==887){b7=0;if((lF|0)==0){if(!((lB|0)==0|(lB|0)==3)){lG=0;lH=0;lI=lu;break}}a[54160]=1;break L1246}}while(0);while(1){if((a[lG+141464|0]|0)==(a[gB+(lG+lI|0)|0]|0)){lJ=lI;lK=lH}else{if((lG|0)!=1){b7=5129;break L27}lJ=lI-1|0;lK=1}gH=lG+1|0;if((gH|0)<(lK+gE|0)){lG=gH;lH=lK;lI=lJ}else{break}}if((lK|0)==0){if(!((lG|0)==0|(lG|0)==3)){b7=5130;break L27}}a[54152]=1}else{b7=874}}while(0);if((b7|0)==874){b7=0;a[54144]=1}c[13898]=gv+2}else if((gD|0)==12){lL=gv+1|0;c[13898]=lL;do{if((lL|0)<(c[8272]|0)){if((a[gw+(lL*40&-1)|0]&1)==0){b7=5144;break L27}gy=c[gw+(lL*40&-1)+36>>2]|0;gE=gw+(lL*40&-1)+32|0;gH=0;while(1){if((gH|0)>=(gy|0)){b7=904;break}gC=c[gE>>2]|0;if((a[gB+(gC+gH|0)|0]|0)==(a[gH+103664|0]|0)){gH=gH+1|0}else{lM=gC;break}}if((b7|0)==904){b7=0;if((gH|0)==1){break}lM=c[gE>>2]|0}if((gy|0)>0){lN=0;lO=0;lP=lM}else{b7=5145;break L27}while(1){if((a[lN+144616|0]|0)==(a[gB+(lN+lP|0)|0]|0)){lQ=lP;lR=lO}else{if((lN|0)!=1){lS=0;lT=0;lU=lM;break}lQ=lP-1|0;lR=1}gC=lN+1|0;if((gC|0)<(lR+gy|0)){lN=gC;lO=lR;lP=lQ}else{b7=912;break}}do{if((b7|0)==912){b7=0;if((lR|0)==0){if(!((lN|0)==6|(lN|0)==0)){lS=0;lT=0;lU=lM;break}}c[13898]=gv+2;gE=is(bW)|0;gH=c[gE>>2]|0;if((gH|0)==1){lV=+(c[gE+8>>2]|0)}else if((gH|0)==2){lV=+h[gE+8>>3]}else if((gH|0)==3){lV=+uz(c[gE+8>>2]|0,0)}else{b7=918;break L27}if((c[cl>>2]|0)==3){uu(c[cm>>2]|0);c[cl>>2]=1}c[13366]=~~lV;break L44}}while(0);while(1){if((a[lS+128720|0]|0)==(a[gB+(lS+lU|0)|0]|0)){lW=lU;lX=lT}else{if((lS|0)!=2){lY=0;lZ=0;l_=lM;break}lW=lU-1|0;lX=1}gE=lS+1|0;if((gE|0)<(lX+gy|0)){lS=gE;lT=lX;lU=lW}else{b7=926;break}}do{if((b7|0)==926){b7=0;if((lX|0)==0){if(!((lS|0)==6|(lS|0)==1)){lY=0;lZ=0;l_=lM;break}}c[13898]=gv+2;c[13378]=0;break L44}}while(0);while(1){if((a[lY+128624|0]|0)==(a[gB+(lY+l_|0)|0]|0)){l$=l_;l0=lZ}else{if((lY|0)!=1){l1=0;l2=0;l3=lM;break}l$=l_-1|0;l0=1}gE=lY+1|0;if((gE|0)<(l0+gy|0)){lY=gE;lZ=l0;l_=l$}else{b7=933;break}}do{if((b7|0)==933){b7=0;if((l0|0)==0){if(!((lY|0)==11|(lY|0)==0)){l1=0;l2=0;l3=lM;break}}c[13898]=gv+2;c[13378]=1;break L44}}while(0);while(1){if((a[l1+128536|0]|0)==(a[gB+(l1+l3|0)|0]|0)){l4=l3;l5=l2}else{if((l1|0)!=1){l6=0;l7=0;l8=lM;break}l4=l3-1|0;l5=1}gE=l1+1|0;if((gE|0)<(l5+gy|0)){l1=gE;l2=l5;l3=l4}else{b7=940;break}}do{if((b7|0)==940){b7=0;if((l5|0)==0){if(!((l1|0)==7|(l1|0)==0)){l6=0;l7=0;l8=lM;break}}c[13898]=gv+2;c[13378]=2;break L44}}while(0);while(1){if((a[l6+128464|0]|0)==(a[gB+(l6+l8|0)|0]|0)){l9=l8;ma=l7}else{if((l6|0)!=2){mb=0;mc=0;md=lM;break}l9=l8-1|0;ma=1}gE=l6+1|0;if((gE|0)<(ma+gy|0)){l6=gE;l7=ma;l8=l9}else{b7=947;break}}do{if((b7|0)==947){b7=0;if((ma|0)==0){if(!((l6|0)==6|(l6|0)==1)){mb=0;mc=0;md=lM;break}}gE=gv+2|0;c[13898]=gE;gH=c[6074]|0;if((gH|0)==0){b7=951}else{if((c[gH+32>>2]|0)==0){b7=951}else{me=gE;mf=gw}}if((b7|0)==951){b7=0;uu(c[11662]|0);c[11658]=0;c[11659]=0;c[11662]=0;gE=ut(40)|0;if((gE|0)==0){gk();gH=ut(40)|0;if((gH|0)==0){b7=953;break L27}else{mg=gH}}else{mg=gE}c[11662]=mg;c[11658]=5;c[11659]=0;c[11660]=10;c[11661]=8;me=c[13898]|0;mf=c[1054]|0}gE=c[mf+(me*40&-1)+36>>2]|0;gH=c[mf+(me*40&-1)+32>>2]|0;gC=(a[mf+(me*40&-1)|0]&1)==0;L1373:do{if((gE|0)>0&(gC^1)){gx=c[10036]|0;gz=0;hS=0;hF=gH;while(1){if((a[gz+128352|0]|0)==(a[gx+(gz+hF|0)|0]|0)){mh=hF;mi=hS}else{if((gz|0)!=2){break}mh=hF-1|0;mi=1}cd=gz+1|0;if((cd|0)<(mi+gE|0)){gz=cd;hS=mi;hF=mh}else{b7=961;break}}do{if((b7|0)==961){b7=0;if((mi|0)==0){if(!((gz|0)==1|(gz|0)==8)){break}}c[13372]=2;mj=me+1|0;c[13898]=mj;if((mj|0)>=(c[8272]|0)){b7=5131;break L27}L1387:do{if((a[mf+(mj*40&-1)|0]&1)!=0){hF=c[mf+(mj*40&-1)+36>>2]|0;hS=mf+(mj*40&-1)+32|0;cd=0;while(1){if((cd|0)>=(hF|0)){break}if((a[gx+((c[hS>>2]|0)+cd|0)|0]|0)==(a[cd+103664|0]|0)){cd=cd+1|0}else{break L1387}}if((cd|0)==1){b7=5132;break L27}}}while(0);hS=is(bT)|0;hF=c[hS>>2]|0;if((hF|0)==1){mk=+(c[hS+8>>2]|0)}else if((hF|0)==2){mk=+h[hS+8>>3]}else if((hF|0)==3){mk=+uz(c[hS+8>>2]|0,0)}else{b7=974;break L27}if((c[cn>>2]|0)==3){uu(c[co>>2]|0);c[cn>>2]=1}hS=c[11662]|0;if((hS|0)==0){b7=978;break L27}hF=c[11659]|0;hp=c[11658]|0;do{if((hF|0)<(hp|0)){ml=hS;mm=hF}else{gA=(c[11660]|0)+hp|0;if((gA|0)==0){uu(hS);c[11662]=0;c[11658]=0;c[11659]=0;ml=0;mm=0;break}else{ho=db(hS,aa(c[11661]|0,gA),150384)|0;c[11662]=ho;c[11658]=gA;ml=ho;mm=c[11659]|0;break}}}while(0);hS=c[11661]|0;c[11659]=mm+1;h[ml+aa(hS,mm)>>3]=mk;hS=c[13898]|0;hp=c[8272]|0;L1409:do{if((hS|0)<(hp|0)){mn=hS;hF=hp;while(1){ho=c[1054]|0;if((a[ho+(mn*40&-1)|0]&1)==0){b7=5133;break L27}gA=c[ho+(mn*40&-1)+36>>2]|0;hG=ho+(mn*40&-1)+32|0;ho=c[10036]|0;hR=0;while(1){if((hR|0)>=(gA|0)){b7=988;break}if((a[ho+((c[hG>>2]|0)+hR|0)|0]|0)==(a[hR+103664|0]|0)){hR=hR+1|0}else{break}}if((b7|0)==988){b7=0;if((hR|0)==1){break L1409}}if((hF|0)>(mn|0)){mo=0}else{b7=5134;break L27}while(1){if((mo|0)>=(gA|0)){break}if((a[ho+((c[hG>>2]|0)+mo|0)|0]|0)==(a[mo+148464|0]|0)){mo=mo+1|0}else{b7=5135;break L27}}if((mo|0)!=1){b7=5136;break L27}c[13898]=mn+1;hG=is(bS)|0;ho=c[hG>>2]|0;if((ho|0)==1){mp=+(c[hG+8>>2]|0)}else if((ho|0)==2){mp=+h[hG+8>>3]}else if((ho|0)==3){mp=+uz(c[hG+8>>2]|0,0)}else{b7=998;break L27}if((c[cp>>2]|0)==3){uu(c[cq>>2]|0);c[cp>>2]=1}hG=c[11662]|0;if((hG|0)==0){b7=1002;break L27}ho=c[11659]|0;gA=c[11658]|0;do{if((ho|0)<(gA|0)){mq=hG;mr=ho}else{hR=(c[11660]|0)+gA|0;if((hR|0)==0){uu(hG);c[11662]=0;c[11658]=0;c[11659]=0;mq=0;mr=0;break}else{hC=db(hG,aa(c[11661]|0,hR),150384)|0;c[11662]=hC;c[11658]=hR;mq=hC;mr=c[11659]|0;break}}}while(0);hG=c[11661]|0;c[11659]=mr+1;h[mq+aa(hG,mr)>>3]=mp;hG=c[13898]|0;gA=c[8272]|0;if((hG|0)<(gA|0)){mn=hG;hF=gA}else{break}}}}while(0);c[13374]=c[11659];break L44}}while(0);if(gC){break}else{ms=0;mt=0;mu=gH}while(1){if((a[ms+127912|0]|0)==(a[gx+(ms+mu|0)|0]|0)){mv=mu;mw=mt}else{if((ms|0)!=2){mx=0;my=0;mz=gH;break}mv=mu-1|0;mw=1}gz=ms+1|0;if((gz|0)<(mw+gE|0)){ms=gz;mt=mw;mu=mv}else{b7=1014;break}}do{if((b7|0)==1014){b7=0;if((mw|0)==0){if(!((ms|0)==1|(ms|0)==11)){mx=0;my=0;mz=gH;break}}c[13372]=1;c[13898]=me+1;gz=is(bR)|0;hp=c[gz>>2]|0;if((hp|0)==1){mA=+(c[gz+8>>2]|0)}else if((hp|0)==2){mA=+h[gz+8>>3]}else if((hp|0)==3){mA=+uz(c[gz+8>>2]|0,0)}else{b7=1020;break L27}if((c[cr>>2]|0)==3){uu(c[cs>>2]|0);c[cr>>2]=1}h[c[11662]>>3]=mA;mB=c[13898]|0;if((c[8272]|0)<=(mB|0)){b7=5137;break L27}gz=c[1054]|0;if((a[gz+(mB*40&-1)|0]&1)==0){b7=5138;break L27}hp=c[gz+(mB*40&-1)+36>>2]|0;hS=gz+(mB*40&-1)+32|0;gz=c[10036]|0;hF=0;while(1){if((hF|0)>=(hp|0)){break}if((a[gz+((c[hS>>2]|0)+hF|0)|0]|0)==(a[hF+148464|0]|0)){hF=hF+1|0}else{b7=5139;break L27}}if((hF|0)!=1){b7=5140;break L27}c[13898]=mB+1;hS=is(bQ)|0;gz=c[hS>>2]|0;if((gz|0)==1){mC=+(c[hS+8>>2]|0)}else if((gz|0)==2){mC=+h[hS+8>>3]}else if((gz|0)==3){mC=+uz(c[hS+8>>2]|0,0)}else{b7=1034;break L27}if((c[ct>>2]|0)==3){uu(c[cu>>2]|0);c[ct>>2]=1}h[(c[11662]|0)+8>>3]=mC;mD=c[13898]|0;if(mC==0.0){b7=1038;break L27}if((mD|0)>=(c[8272]|0)){break L44}hS=c[1054]|0;if((a[hS+(mD*40&-1)|0]&1)==0){b7=5141;break L27}gz=c[hS+(mD*40&-1)+36>>2]|0;hp=hS+(mD*40&-1)+32|0;hS=c[10036]|0;cd=0;while(1){if((cd|0)>=(gz|0)){b7=1044;break}if((a[hS+((c[hp>>2]|0)+cd|0)|0]|0)==(a[cd+103664|0]|0)){cd=cd+1|0}else{mE=0;break}}if((b7|0)==1044){b7=0;if((cd|0)==1){break L44}else{mE=0}}while(1){if((mE|0)>=(gz|0)){break}if((a[hS+((c[hp>>2]|0)+mE|0)|0]|0)==(a[mE+148464|0]|0)){mE=mE+1|0}else{b7=5142;break L27}}if((mE|0)!=1){b7=5143;break L27}c[13898]=mD+1;c[11659]=2;hp=is(bO)|0;hS=c[hp>>2]|0;if((hS|0)==1){mF=+(c[hp+8>>2]|0)}else if((hS|0)==2){mF=+h[hp+8>>3]}else if((hS|0)==3){mF=+uz(c[hp+8>>2]|0,0)}else{b7=1053;break L27}if((c[cv>>2]|0)==3){uu(c[cw>>2]|0);c[cv>>2]=1}hp=c[11662]|0;c[13374]=~~((mF- +h[hp>>3])/+h[hp+8>>3]+1.0);break L44}}while(0);while(1){if((a[mx+127456|0]|0)==(a[gx+(mx+mz|0)|0]|0)){mG=mz;mH=my}else{if((mx|0)!=2){break L1373}mG=mz-1|0;mH=1}hp=mx+1|0;if((hp|0)<(mH+gE|0)){mx=hp;my=mH;mz=mG}else{break}}if((mH|0)==0){if(!((mx|0)==1|(mx|0)==4)){break}}c[13372]=0;hp=me+1|0;c[13898]=hp;if((hp|0)>=(c[8272]|0)){break L44}L1507:do{if((a[mf+(hp*40&-1)|0]&1)!=0){hS=c[mf+(hp*40&-1)+36>>2]|0;gz=mf+(hp*40&-1)+32|0;cd=0;while(1){if((cd|0)>=(hS|0)){break}if((a[gx+((c[gz>>2]|0)+cd|0)|0]|0)==(a[cd+103664|0]|0)){cd=cd+1|0}else{break L1507}}if((cd|0)==1){break L44}}}while(0);gx=is(bN)|0;hp=c[gx>>2]|0;if((hp|0)==1){mI=+(c[gx+8>>2]|0)}else if((hp|0)==2){mI=+h[gx+8>>3]}else if((hp|0)==3){mI=+uz(c[gx+8>>2]|0,0)}else{b7=1073;break L27}if((c[cx>>2]|0)==3){uu(c[cy>>2]|0);c[cx>>2]=1}c[13374]=~~mI;break L44}}while(0);if((c[13372]|0)==2){b7=1078;break L27}gE=is(bM)|0;gH=c[gE>>2]|0;if((gH|0)==1){mJ=+(c[gE+8>>2]|0)}else if((gH|0)==2){mJ=+h[gE+8>>3]}else if((gH|0)==3){mJ=+uz(c[gE+8>>2]|0,0)}else{b7=1083;break L27}if((c[cA>>2]|0)==3){uu(c[cC>>2]|0);c[cA>>2]=1}c[13374]=~~mJ;break L44}}while(0);while(1){if((a[mb+127152|0]|0)==(a[gB+(mb+md|0)|0]|0)){mK=md;mL=mc}else{if((mb|0)!=1){b7=5146;break L27}mK=md-1|0;mL=1}gE=mb+1|0;if((gE|0)<(mL+gy|0)){mb=gE;mc=mL;md=mK}else{break}}if((mL|0)==0){if(!((mb|0)==5|(mb|0)==0)){b7=5147;break L27}}c[13898]=gv+2;gy=is(bV)|0;gE=c[gy>>2]|0;if((gE|0)==1){mM=+(c[gy+8>>2]|0)}else if((gE|0)==2){mM=+h[gy+8>>3]}else if((gE|0)==3){mM=+uz(c[gy+8>>2]|0,0)}else{b7=1097;break L27}if((c[cD>>2]|0)==3){uu(c[cE>>2]|0);c[cD>>2]=1}gy=~~mM;if((gy-2|0)>>>0>8){b7=1101;break L27}c[13368]=gy;break L44}}while(0);c[13366]=5;c[13378]=0;c[13368]=4;c[13374]=5;c[13372]=0}else if((gD|0)==13){mN=gv+1|0;c[13898]=mN;do{if((mN|0)<(c[8272]|0)){if((a[gw+(mN*40&-1)|0]&1)==0){b7=5148;break L27}gy=c[gw+(mN*40&-1)+36>>2]|0;gE=gw+(mN*40&-1)+32|0;gH=0;while(1){if((gH|0)>=(gy|0)){b7=1109;break}gC=c[gE>>2]|0;if((a[gB+(gC+gH|0)|0]|0)==(a[gH+103664|0]|0)){gH=gH+1|0}else{mO=gC;break}}if((b7|0)==1109){b7=0;if((gH|0)==1){break}mO=c[gE>>2]|0}if((gy|0)>0){mP=0;mQ=0;mR=mO}else{b7=5149;break L27}while(1){if((a[mP+129472|0]|0)==(a[gB+(mP+mR|0)|0]|0)){mS=mR;mT=mQ}else{if((mP|0)!=2){mU=0;mV=0;mW=mO;b7=1120;break}mS=mR-1|0;mT=1}gC=mP+1|0;if((gC|0)<(mT+gy|0)){mP=gC;mQ=mT;mR=mS}else{b7=1117;break}}do{if((b7|0)==1117){b7=0;if((mT|0)==0){if(!((mP|0)==1|(mP|0)==4)){mU=0;mV=0;mW=mO;b7=1120;break}}c[11690]=1}}while(0);L1574:do{if((b7|0)==1120){while(1){b7=0;if((a[mU+129312|0]|0)==(a[gB+(mU+mW|0)|0]|0)){mX=mW;mY=mV}else{if((mU|0)!=1){mZ=0;m_=0;m$=mO;break}mX=mW-1|0;mY=1}gE=mU+1|0;if((gE|0)<(mY+gy|0)){mU=gE;mV=mY;mW=mX;b7=1120}else{b7=1124;break}}do{if((b7|0)==1124){b7=0;if((mY|0)==0){if(!((mU|0)==0|(mU|0)==7)){mZ=0;m_=0;m$=mO;break}}c[11690]=2;break L1574}}while(0);while(1){if((a[mZ+129032|0]|0)==(a[gB+(mZ+m$|0)|0]|0)){m0=m$;m1=m_}else{if((mZ|0)!=2){b7=5150;break L27}m0=m$-1|0;m1=1}gE=mZ+1|0;if((gE|0)<(m1+gy|0)){mZ=gE;m_=m1;m$=m0}else{break}}if((m1|0)==0){if(!((mZ|0)==1|(mZ|0)==4)){b7=5151;break L27}}c[11690]=3}}while(0);c[13898]=gv+2;break L44}}while(0);c[11690]=1}else if((gD|0)==17){gy=c[11732]|0;gE=c[11756]|0;gH=c[11734]|0;m2=+h[5865];m3=+h[5864];c[11752]=0;a[47016]=0;gC=gv+1|0;c[13898]=gC;gG=c[8272]|0;L1599:do{if((gC|0)<(gG|0)){gx=gy;hp=gE;gz=gH;m4=m2;m5=m3;hS=0;hF=gC;gA=gG;hG=gw;while(1){ho=(a[hG+(hF*40&-1)|0]&1)==0;hC=c[hG+(hF*40&-1)+36>>2]|0;L1602:do{if(ho){m6=c[10036]|0;m7=hG+(hF*40&-1)+32|0}else{hR=hG+(hF*40&-1)+32|0;hw=c[10036]|0;gF=0;while(1){if((gF|0)>=(hC|0)){break}if((a[hw+((c[hR>>2]|0)+gF|0)|0]|0)==(a[gF+103664|0]|0)){gF=gF+1|0}else{m6=hw;m7=hR;break L1602}}if((gF|0)==1){m8=gx;m9=hp;na=gz;nb=m4;nc=m5;break L1599}else{m6=hw;m7=hR}}}while(0);hB=c[m7>>2]|0;hK=(hC|0)>0;nd=46944;ne=103784;L1610:while(1){L1612:do{if(!ho){if(hK){nf=0;ng=0;nh=hB;while(1){ni=a[ne+nf|0]|0;if(ni<<24>>24==(a[m6+(nf+nh|0)|0]|0)){nj=nh;nk=ng}else{if(ni<<24>>24!=36){break L1612}nj=nh-1|0;nk=1}nl=nf+1|0;if((nl|0)<(nk+hC|0)){nf=nl;ng=nk;nh=nj}else{break}}if((nk|0)==0){nm=nl}else{nn=nd;break L1610}}else{nm=0}nh=a[ne+nm|0]|0;if((nh<<24>>24|0)==36|(nh<<24>>24|0)==0){nn=nd;break L1610}}}while(0);hR=nd+8|0;hw=c[hR>>2]|0;if((hw|0)==0){nn=hR;break}else{nd=hR;ne=hw}}ne=c[nn+4>>2]|0;L1625:do{if((ne|0)==8){no=hF;b7=1210}else{c[11752]=ne;nd=hF+1|0;c[13898]=nd;if((ne|0)==1){if((nd|0)>=(gA|0)){np=hS;nq=m5;nr=m4;ns=gz;nt=hp;nu=gx;break}L1630:do{if((a[hG+(nd*40&-1)|0]&1)!=0){hC=c[hG+(nd*40&-1)+36>>2]|0;hB=hG+(nd*40&-1)+32|0;hK=0;while(1){if((hK|0)>=(hC|0)){break}if((a[m6+((c[hB>>2]|0)+hK|0)|0]|0)==(a[hK+103664|0]|0)){hK=hK+1|0}else{break L1630}}if((hK|0)==1){np=hS;nq=m5;nr=m4;ns=gz;nt=hp;nu=gx;break L1625}}}while(0);hB=is(bL)|0;hC=c[hB>>2]|0;if((hC|0)==1){nv=+(c[hB+8>>2]|0)}else if((hC|0)==2){nv=+h[hB+8>>3]}else if((hC|0)==3){nv=+uz(c[hB+8>>2]|0,0)}else{b7=1165;break L27}if((c[cL>>2]|0)==3){uu(c[cM>>2]|0);c[cL>>2]=1}np=hS;nq=m5;nr=m4;ns=~~nv;nt=hp;nu=gx;break}else if((ne|0)==2){np=hS;nq=m5;nr=m4;ns=gz;nt=hp;nu=gx;break}else if(!((ne|0)==3|(ne|0)==5|(ne|0)==4|(ne|0)==6|(ne|0)==7)){no=nd;b7=1210;break}L1646:do{if((nd|0)<(gA|0)){if((a[hG+(nd*40&-1)|0]&1)==0){nw=nd;break}hB=c[hG+(nd*40&-1)+36>>2]|0;hC=hG+(nd*40&-1)+32|0;ho=0;while(1){if((ho|0)>=(hB|0)){b7=1174;break}if((a[m6+((c[hC>>2]|0)+ho|0)|0]|0)==(a[ho+103664|0]|0)){ho=ho+1|0}else{b7=1175;break}}if((b7|0)==1174){b7=0;if(!((ho|0)!=1&(hB|0)>0)){nw=nd;break}}else if((b7|0)==1175){b7=0;if((hB|0)<=0){nw=nd;break}}hK=0;hw=0;hR=c[hC>>2]|0;while(1){if((a[hK+130016|0]|0)==(a[m6+(hK+hR|0)|0]|0)){nx=hR;ny=hw}else{if((hK|0)!=5){nw=nd;break L1646}nx=hR-1|0;ny=1}gF=hK+1|0;if((gF|0)<(ny+hB|0)){hK=gF;hw=ny;hR=nx}else{break}}if((ny|0)==0){if(!((hK|0)==4|(hK|0)==10)){nw=nd;break}}a[47016]=1;hR=hF+2|0;c[13898]=hR;nw=hR}else{nw=nd}}while(0);if((nw|0)>=(gA|0)){np=hS;nq=m5;nr=m4;ns=gz;nt=hp;nu=gx;break}L1668:do{if((a[hG+(nw*40&-1)|0]&1)!=0){nd=c[hG+(nw*40&-1)+36>>2]|0;hR=hG+(nw*40&-1)+32|0;hw=0;while(1){if((hw|0)>=(nd|0)){break}if((a[m6+((c[hR>>2]|0)+hw|0)|0]|0)==(a[hw+103664|0]|0)){hw=hw+1|0}else{break L1668}}if((hw|0)==1){np=hS;nq=m5;nr=m4;ns=gz;nt=hp;nu=gx;break L1625}}}while(0);hR=is(bK)|0;nd=c[hR>>2]|0;if((nd|0)==1){nz=+(c[hR+8>>2]|0)}else if((nd|0)==2){nz=+h[hR+8>>3]}else if((nd|0)==3){nz=+uz(c[hR+8>>2]|0,0)}else{b7=1194;break L27}if((c[cN>>2]|0)==3){uu(c[cO>>2]|0);c[cN>>2]=1}hR=c[13898]|0;if((c[8272]|0)<=(hR|0)){np=hS;nq=nz;nr=nz;ns=gz;nt=hp;nu=gx;break}nd=c[1054]|0;if((a[nd+(hR*40&-1)|0]&1)==0){np=hS;nq=nz;nr=nz;ns=gz;nt=hp;nu=gx;break}hK=c[nd+(hR*40&-1)+36>>2]|0;hB=nd+(hR*40&-1)+32|0;nd=c[10036]|0;hC=0;while(1){if((hC|0)>=(hK|0)){break}if((a[nd+((c[hB>>2]|0)+hC|0)|0]|0)==(a[hC+148464|0]|0)){hC=hC+1|0}else{np=hS;nq=nz;nr=nz;ns=gz;nt=hp;nu=gx;break L1625}}if((hC|0)!=1){np=hS;nq=nz;nr=nz;ns=gz;nt=hp;nu=gx;break}c[13898]=hR+1;hB=is(bJ)|0;nd=c[hB>>2]|0;if((nd|0)==1){nA=+(c[hB+8>>2]|0)}else if((nd|0)==2){nA=+h[hB+8>>3]}else if((nd|0)==3){nA=+uz(c[hB+8>>2]|0,0)}else{b7=1207;break L27}if((c[cP>>2]|0)!=3){np=hS;nq=nA;nr=nz;ns=gz;nt=hp;nu=gx;break}uu(c[cQ>>2]|0);c[cP>>2]=1;np=hS;nq=nA;nr=nz;ns=gz;nt=hp;nu=gx}}while(0);L1696:do{if((b7|0)==1210){b7=0;L1698:do{if((gA|0)>(no|0)){if((a[hG+(no*40&-1)|0]&1)==0){break}ne=c[hG+(no*40&-1)+36>>2]|0;hB=hG+(no*40&-1)+32|0;nd=0;while(1){if((nd|0)>=(ne|0)){break}if((a[m6+((c[hB>>2]|0)+nd|0)|0]|0)==(a[nd+148464|0]|0)){nd=nd+1|0}else{break L1698}}if((nd|0)!=1){break}c[13898]=no+1;np=hS+1|0;nq=m5;nr=m4;ns=gz;nt=hp;nu=gx;break L1696}}while(0);if((hS|0)==0){hR=is(bI)|0;hC=c[hR>>2]|0;if((hC|0)==1){nB=+(c[hR+8>>2]|0)}else if((hC|0)==2){nB=+h[hR+8>>3]}else if((hC|0)==3){nB=+uz(c[hR+8>>2]|0,0)}else{b7=1224;break L27}if((c[cF>>2]|0)==3){uu(c[cG>>2]|0);c[cF>>2]=1}hR=~~nB;np=0;nq=m5;nr=m4;ns=gz;nt=hR;nu=hR;break}else if((hS|0)==1){hR=is(bH)|0;hC=c[hR>>2]|0;if((hC|0)==1){nC=+(c[hR+8>>2]|0)}else if((hC|0)==2){nC=+h[hR+8>>3]}else if((hC|0)==3){nC=+uz(c[hR+8>>2]|0,0)}else{b7=1232;break L27}if((c[cH>>2]|0)==3){uu(c[cI>>2]|0);c[cH>>2]=1}np=1;nq=m5;nr=m4;ns=gz;nt=~~nC;nu=gx;break}else if((hS|0)==2){hR=is(bG)|0;hC=c[hR>>2]|0;if((hC|0)==1){nD=+(c[hR+8>>2]|0)}else if((hC|0)==2){nD=+h[hR+8>>3]}else if((hC|0)==3){nD=+uz(c[hR+8>>2]|0,0)}else{b7=1240;break L27}if((c[cJ>>2]|0)==3){uu(c[cK>>2]|0);c[cJ>>2]=1}np=2;nq=m5;nr=m4;ns=~~nD;nt=hp;nu=gx;break}else{b7=1244;break L27}}}while(0);hR=c[13898]|0;hC=c[8272]|0;if((hR|0)>=(hC|0)){m8=nu;m9=nt;na=ns;nb=nr;nc=nq;break L1599}gx=nu;hp=nt;gz=ns;m4=nr;m5=nq;hS=np;hF=hR;gA=hC;hG=c[1054]|0}}else{m8=gy;m9=gE;na=gH;nb=m2;nc=m3}}while(0);if((m8-2|0)>>>0>998){b7=5152;break L27}if((m9-2|0)>>>0>998){b7=5153;break L27}if((c[11752]|0)==0){c[11752]=1}if(nb<0.0|nc<0.0){b7=1251;break L27}c[11732]=m8;c[11756]=m9;c[11734]=na;h[5865]=nb;h[5864]=nc;a[47032]=1}else if((gD|0)==20){c[13898]=gv+1;uu(c[12886]|0);c[12886]=0;nE=c[13898]|0;gH=c[8272]|0;L1745:do{if((nE|0)<(gH|0)){gE=c[1054]|0;L1747:do{if((a[gE+(nE*40&-1)|0]&1)!=0){gy=c[gE+(nE*40&-1)+36>>2]|0;gG=gE+(nE*40&-1)+32|0;gC=c[10036]|0;hG=0;while(1){if((hG|0)>=(gy|0)){b7=1258;break}if((a[gC+((c[gG>>2]|0)+hG|0)|0]|0)==(a[hG+103664|0]|0)){hG=hG+1|0}else{nF=0;break}}if((b7|0)==1258){b7=0;if((hG|0)==1){break L1745}else{nF=0}}while(1){if((nF|0)>=(gy|0)){b7=1265;break}if((a[gC+((c[gG>>2]|0)+nF|0)|0]|0)==(a[nF+132080|0]|0)){nF=nF+1|0}else{nG=0;break}}do{if((b7|0)==1265){b7=0;if((nF|0)!=6){nG=0;break}hG=nE+1|0;c[13898]=hG;L1760:do{if((hG|0)<(gH|0)){L1762:do{if((a[gE+(hG*40&-1)|0]&1)!=0){gA=c[gE+(hG*40&-1)+36>>2]|0;hF=gE+(hG*40&-1)+32|0;hS=0;while(1){if((hS|0)>=(gA|0)){break}if((a[gC+((c[hF>>2]|0)+hS|0)|0]|0)==(a[hS+103664|0]|0)){hS=hS+1|0}else{break L1762}}if((hS|0)==1){b7=1275;break L1760}}}while(0);a[14176]=1;is(bD);a[14176]=0;if((c[cU>>2]|0)==3){nd=c[cV>>2]|0;if((nd|0)==0){b7=1275;break}else{nH=nd;break}}else{c[13898]=hG;b7=1275;break}}else{b7=1275}}while(0);do{if((b7|0)==1275){b7=0;hG=bA(4,179864)|0;if((hG|0)!=0){nd=bP(hG|0)|0;if((nd|0)!=0){nH=nd;break}}nd=bU(130448)|0;if((nd|0)!=0){hG=bP(nd|0)|0;if((hG|0)!=0){nH=hG;break}}hG=bU(130352)|0;if((hG|0)!=0){nd=bP(hG|0)|0;if((nd|0)!=0){nH=nd;break}}nd=bU(130304)|0;if((nd|0)==0){nH=0;break}nH=bP(nd|0)|0}}while(0);if((bA(4,((nH|0)!=0?nH:179864)|0)|0)==0){b7=1284;break L27}nd=c[b$()>>2]|0;if((nd|0)==0){nI=0}else{nI=bP(nd|0)|0}c[12886]=nI;nd=c[m>>2]|0;cf(nd|0,130136,(v=i,i=i+8|0,c[v>>2]=nI,v)|0);uu(c[8270]|0);c[8270]=nH;bA(4,139696);break L44}}while(0);while(1){if((nG|0)>=(gy|0)){break}if((a[gC+((c[gG>>2]|0)+nG|0)|0]|0)==(a[nG+103664|0]|0)){nG=nG+1|0}else{break L1747}}if((nG|0)==1){b7=1293;break L27}}}while(0);a[14176]=1;is(bE);a[14176]=0;if((c[cR>>2]|0)!=3){b7=1292;break L27}gE=c[cT>>2]|0;c[12886]=gE;if((gE|0)==0){b7=1295;break L27}else{break L44}}}while(0);gH=c[8270]|0;do{if((gH|0)==0){nJ=0}else{if((aY(gH|0,139696)|0)==0){nJ=gH;break}bA(4,139696);nJ=c[8270]|0}}while(0);uu(nJ);c[8270]=0}else if((gD|0)==18){nK=gv+1|0;c[13898]=nK;gH=c[8272]|0;if((nK|0)>=(gH|0)){b7=5156;break L27}L1802:do{if((a[gw+(nK*40&-1)|0]&1)==0){nL=gw+(nK*40&-1)+32|0;nM=gw+(nK*40&-1)+36|0;b7=1308}else{gE=gw+(nK*40&-1)+36|0;gG=c[gE>>2]|0;gC=gw+(nK*40&-1)+32|0;gy=0;while(1){if((gy|0)>=(gG|0)){b7=1303;break}if((a[gB+((c[gC>>2]|0)+gy|0)|0]|0)==(a[gy+103664|0]|0)){gy=gy+1|0}else{nN=0;break}}if((b7|0)==1303){b7=0;if((gy|0)==1){b7=5157;break L27}else{nN=0}}while(1){if((nN|0)>=(gG|0)){break}if((a[gB+((c[gC>>2]|0)+nN|0)|0]|0)==(a[nN+148464|0]|0)){nN=nN+1|0}else{nL=gC;nM=gE;b7=1308;break L1802}}if((nN|0)==1){nO=nK}else{nL=gC;nM=gE;b7=1308}}}while(0);if((b7|0)==1308){b7=0;gG=gv+2|0;c[13898]=gG;gy=c[nM>>2]|0;nd=(gy|0)>49?49:gy;gy=c[nL>>2]|0;hG=0;while(1){hF=hG+1|0;a[hG+24544|0]=a[gB+gy|0]|0;if((hF|0)==(nd|0)){break}else{gy=gy+1|0;hG=hF}}a[nd+24544|0]=0;nO=gG}if((nO|0)>=(gH|0)){break}if((a[gw+(nO*40&-1)|0]&1)==0){break}hG=c[gw+(nO*40&-1)+36>>2]|0;gy=gw+(nO*40&-1)+32|0;hF=0;while(1){if((hF|0)>=(hG|0)){b7=1316;break}if((a[gB+((c[gy>>2]|0)+hF|0)|0]|0)==(a[hF+103664|0]|0)){hF=hF+1|0}else{nP=0;break}}if((b7|0)==1316){b7=0;if((hF|0)==1){break}else{nP=0}}while(1){if((nP|0)>=(hG|0)){break}if((a[gB+((c[gy>>2]|0)+nP|0)|0]|0)==(a[nP+148464|0]|0)){nP=nP+1|0}else{break L44}}if((nP|0)!=1){break}nQ=nO+1|0;c[13898]=nQ;if((nQ|0)>=(gH|0)){b7=5158;break L27}L1833:do{if((a[gw+(nQ*40&-1)|0]&1)==0){nR=gw+(nQ*40&-1)+32|0;nS=gw+(nQ*40&-1)+36|0}else{gy=gw+(nQ*40&-1)+36|0;hG=c[gy>>2]|0;hF=gw+(nQ*40&-1)+32|0;gG=0;while(1){if((gG|0)>=(hG|0)){break}if((a[gB+((c[hF>>2]|0)+gG|0)|0]|0)==(a[gG+103664|0]|0)){gG=gG+1|0}else{nR=hF;nS=gy;break L1833}}if((gG|0)==1){b7=5159;break L27}else{nR=hF;nS=gy}}}while(0);c[13898]=nO+2;gH=c[nS>>2]|0;hG=(gH|0)>49?49:gH;gH=c[nR>>2]|0;gE=0;while(1){gC=gE+1|0;a[gE+24595|0]=a[gB+gH|0]|0;if((gC|0)==(hG|0)){break}else{gH=gH+1|0;gE=gC}}a[hG+24595|0]=0}else if((gD|0)==19){nT=gv+1|0;c[13898]=nT;L1845:do{if((nT|0)<(c[8272]|0)){gE=(a[gw+(nT*40&-1)|0]&1)==0;gH=c[gw+(nT*40&-1)+36>>2]|0;gC=gw+(nT*40&-1)+32|0;L1847:do{if(!gE){nd=0;while(1){if((nd|0)>=(gH|0)){b7=1335;break}if((a[gB+((c[gC>>2]|0)+nd|0)|0]|0)==(a[nd+103664|0]|0)){nd=nd+1|0}else{nU=0;break}}if((b7|0)==1335){b7=0;if((nd|0)==1){b7=1336;break L1845}else{nU=0}}while(1){if((nU|0)>=(gH|0)){break}if((a[gB+((c[gC>>2]|0)+nU|0)|0]|0)==(a[nU+132080|0]|0)){nU=nU+1|0}else{break L1847}}if((nU|0)!=6){break}nd=bA(2,179864)|0;gA=(nd|0)==0;L1858:do{if(!gA){if((aQ(nd|0,131976)|0)==0){if((aQ(nd|0,131752)|0)!=0){b7=1343}}else{b7=1343}if((b7|0)==1343){b7=0;c[11252]=15}do{if((aQ(nd|0,200432)|0)==0){if((aQ(nd|0,131528)|0)!=0){break}if((aQ(nd|0,131448)|0)==0){break L1858}}}while(0);c[11252]=14}}while(0);c[13898]=(c[13898]|0)+1;a[cW]=a[25160]|0;a[cW+1|0]=a[25161|0]|0;a[cW+2|0]=a[25162|0]|0;c[by>>2]=3;c[bz>>2]=8;c[bB>>2]=cW;c[bC>>2]=48904;if(gA){break L1845}nd=cB(0)|0;if((nd|0)==0){break L44}if((aY(nd|0,171384)|0)==0){uB(48904,cW|0);break L44}gz=bi(nd|0,171384)|0;if((gz|0)==-1){uh(-1,131096,(v=i,i=i+8|0,c[v>>2]=nd,v)|0);break L44}if((aG(gz|0,bB|0,by|0,bC|0,bz|0)|0)==-1){uh(-1,130952,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}cz(gz|0);break L44}}while(0);gy=c[gC>>2]|0;hF=(gH|0)>0;gG=24408;gz=184456;L1882:while(1){L1884:do{if(!gE){if(hF){nd=0;hp=0;gx=gy;while(1){hC=a[gz+nd|0]|0;if(hC<<24>>24==(a[gB+(nd+gx|0)|0]|0)){nV=gx;nW=hp}else{if(hC<<24>>24!=36){break L1884}nV=gx-1|0;nW=1}nX=nd+1|0;if((nX|0)<(nW+gH|0)){nd=nX;hp=nW;gx=nV}else{break}}if((nW|0)==0){nY=nX}else{nZ=gG;break L1882}}else{nY=0}gx=a[gz+nY|0]|0;if((gx<<24>>24|0)==36|(gx<<24>>24|0)==0){nZ=gG;break L1882}}}while(0);gA=gG+8|0;gx=c[gA>>2]|0;if((gx|0)==0){nZ=gA;break}else{gG=gA;gz=gx}}gz=c[nZ+4>>2]|0;if((gz|0)==16){b7=1360;break L27}c[11252]=gz;c[13898]=gv+2;a[cW]=a[25160]|0;a[cW+1|0]=a[25161|0]|0;a[cW+2|0]=a[25162|0]|0;c[by>>2]=3;c[bz>>2]=8;c[bB>>2]=cW;c[bC>>2]=48904}else{b7=1336}}while(0);if((b7|0)==1336){b7=0;c[11252]=0;a[cW]=a[25160]|0;a[cW+1|0]=a[25161|0]|0;a[cW+2|0]=a[25162|0]|0;c[by>>2]=3;c[bz>>2]=8;c[bB>>2]=cW;c[bC>>2]=48904}hG=48904;c[hG>>2]=0;c[hG+4>>2]=0;hG=c[11252]|0;if((hG|0)==15){a[48904]=-62;a[48905]=-80;break}else if((hG|0)==12|(hG|0)==13){a[48904]=-100;break}else if((hG|0)==5|(hG|0)==6|(hG|0)==7){a[48904]=-8;break}else if((hG|0)==14|(hG|0)==8){break}else{a[48904]=-80;break}}else if((gD|0)==21){hG=gv+1|0;c[13898]=hG;gz=c[8272]|0;if((hG|0)<(gz|0)){n_=hG;n$=gz;n0=gw}else{break}while(1){gz=c[n0+(n_*40&-1)+36>>2]|0;hG=n0+(n_*40&-1)+32|0;if((a[n0+(n_*40&-1)|0]&1)==0){b7=5162;break L27}gG=c[10036]|0;gH=0;while(1){if((gH|0)>=(gz|0)){b7=1380;break}gy=c[hG>>2]|0;if((a[gG+(gy+gH|0)|0]|0)==(a[gH+103664|0]|0)){gH=gH+1|0}else{n1=gy;break}}if((b7|0)==1380){b7=0;if((gH|0)==1){break L44}n1=c[hG>>2]|0}L1917:do{if((gz|0)>0){gy=0;hF=0;gE=n1;while(1){if((a[gy+132904|0]|0)==(a[gG+(gy+gE|0)|0]|0)){n2=gE;n3=hF}else{if((gy|0)!=3){n4=0;n5=0;n6=n1;break}n2=gE-1|0;n3=1}gC=gy+1|0;if((gC|0)<(n3+gz|0)){gy=gC;hF=n3;gE=n2}else{b7=1387;break}}do{if((b7|0)==1387){b7=0;if((n3|0)==0){if(!((gy|0)==7|(gy|0)==2)){n4=0;n5=0;n6=n1;break}}n7=n_+1|0;c[13898]=n7;L1929:do{if((n7|0)<(n$|0)){L1931:do{if((a[n0+(n7*40&-1)|0]&1)!=0){gE=c[n0+(n7*40&-1)+36>>2]|0;hF=n0+(n7*40&-1)+32|0;gC=0;while(1){if((gC|0)>=(gE|0)){b7=1394;break}if((a[gG+((c[hF>>2]|0)+gC|0)|0]|0)==(a[gC+103664|0]|0)){gC=gC+1|0}else{n8=0;break}}if((b7|0)==1394){b7=0;if((gC|0)==1){break L1929}else{n8=0}}while(1){if((n8|0)>=(gE|0)){break}if((a[gG+((c[hF>>2]|0)+n8|0)|0]|0)==(a[n8+103664|0]|0)){n8=n8+1|0}else{break L1931}}if((n8|0)==1){b7=1403;break L27}}}while(0);a[14176]=1;is(bw);a[14176]=0;if((c[cX>>2]|0)!=3){b7=1402;break L27}hF=c[cY>>2]|0;c[10568]=hF;if((hF|0)==0){b7=1405;break L27}else{break L1917}}}while(0);hF=c[10568]|0;if((hF|0)!=0){uu(hF)}c[10568]=0;break L1917}}while(0);while(1){if((a[n4+132632|0]|0)==(a[gG+(n4+n6|0)|0]|0)){n9=n6;oa=n5}else{if((n4|0)!=3){ob=0;oc=0;od=n1;break}n9=n6-1|0;oa=1}gy=n4+1|0;if((gy|0)<(oa+gz|0)){n4=gy;n5=oa;n6=n9}else{b7=1411;break}}do{if((b7|0)==1411){b7=0;if((oa|0)==0){if(!((n4|0)==2|(n4|0)==14)){ob=0;oc=0;od=n1;break}}a[42568]=1;c[13898]=n_+1;break L1917}}while(0);while(1){if((a[ob+132544|0]|0)==(a[gG+(ob+od|0)|0]|0)){oe=od;of=oc}else{if((ob|0)!=5){b7=1423;break L1917}oe=od-1|0;of=1}gy=ob+1|0;if((gy|0)<(of+gz|0)){ob=gy;oc=of;od=oe}else{break}}if((of|0)==0){if(!((ob|0)==4|(ob|0)==16)){b7=1423;break}}a[42568]=0;c[13898]=n_+1}else{b7=1423}}while(0);L1969:do{if((b7|0)==1423){b7=0;if((n$|0)>(n_|0)){og=0}else{b7=5163;break L27}while(1){if((og|0)>=(gz|0)){b7=1426;break}if((a[gG+(og+n1|0)|0]|0)==(a[og+132432|0]|0)){og=og+1|0}else{oh=0;break}}do{if((b7|0)==1426){b7=0;if((og|0)!=5){oh=0;break}a[42560]=1;c[13898]=n_+1;break L1969}}while(0);while(1){if((oh|0)>=(gz|0)){break}if((a[gG+(oh+n1|0)|0]|0)==(a[oh+132304|0]|0)){oh=oh+1|0}else{b7=5164;break L27}}if((oh|0)!=7){b7=5165;break L27}a[42560]=0;c[13898]=n_+1}}while(0);gG=c[13898]|0;gz=c[8272]|0;if((gG|0)>=(gz|0)){break L44}n_=gG;n$=gz;n0=c[1054]|0}}else if((gD|0)==22){gz=gv+1|0;c[13898]=gz;gG=c[8272]|0;L1985:do{if((gz|0)<(gG|0)){hG=a[gw+(gz*40&-1)|0]|0;L1987:do{if((hG&1)==0){oi=0;oj=gz;ok=gG;ol=gw;om=hG}else{gH=c[gw+(gz*40&-1)+36>>2]|0;gy=gw+(gz*40&-1)+32|0;hF=0;while(1){if((hF|0)>=(gH|0)){break}if((a[gB+((c[gy>>2]|0)+hF|0)|0]|0)==(a[hF+103664|0]|0)){hF=hF+1|0}else{oi=0;oj=gz;ok=gG;ol=gw;om=hG;break L1987}}if((hF|0)==1){break L1985}else{oi=0;oj=gz;ok=gG;ol=gw;om=hG}}}while(0);L1993:while(1){hG=(om&1)==0;L1995:do{if(!hG){gy=c[ol+(oj*40&-1)+36>>2]|0;gH=ol+(oj*40&-1)+32|0;gE=c[10036]|0;gC=0;while(1){if((gC|0)>=(gy|0)){break}if((a[gE+((c[gH>>2]|0)+gC|0)|0]|0)==(a[gC+103664|0]|0)){gC=gC+1|0}else{break L1995}}if((gC|0)==1){on=oi;break L1993}}}while(0);if((oj|0)>=(ok|0)){b7=1453;break L27}L2003:do{if(!hG){hF=c[ol+(oj*40&-1)+36>>2]|0;gH=ol+(oj*40&-1)+32|0;gE=c[10036]|0;gy=0;while(1){if((gy|0)>=(hF|0)){break}if((a[gE+((c[gH>>2]|0)+gy|0)|0]|0)==(a[gy+103664|0]|0)){gy=gy+1|0}else{break L2003}}if((gy|0)==1){b7=1453;break L27}}}while(0);a[14176]=1;is(bu);a[14176]=0;if((c[cZ>>2]|0)!=3){b7=1452;break L27}hG=c[c_>>2]|0;c[bv>>2]=hG;if((hG|0)==0){b7=1462;break L27}if((oi|0)==0){oo=0}else{oo=uA(oi|0)|0}iQ(bv);hG=c[bv>>2]|0;gH=db(oi,(oo+2|0)+(uA(hG|0)|0)|0,140552)|0;if((oo|0)==0){uB(gH|0,hG|0)}else{gE=gH+oo|0;hF=gH+(oo+1|0)|0;uB(hF|0,hG|0);a[gE]=58}uu(hG);hG=c[13898]|0;gE=c[8272]|0;if((hG|0)>=(gE|0)){on=gH;break}hF=c[1054]|0;oi=gH;oj=hG;ok=gE;ol=hF;om=a[hF+(hG*40&-1)|0]|0}if((on|0)==0){break L44}ur(4,on);uu(on);break L44}}while(0);ur(32,0)}else if((gD|0)==23){jp()}else if((gD|0)==24){gG=gv+1|0;c[13898]=gG;gz=c[8272]|0;if((gG|0)<(gz|0)){hG=0;hF=gG;gG=gz;gz=gw;L2026:while(1){gE=(a[gz+(hF*40&-1)|0]&1)==0;gH=c[gz+(hF*40&-1)+36>>2]|0;gC=gz+(hF*40&-1)+32|0;L2028:do{if(gE){op=c[gC>>2]|0;b7=1704}else{hS=c[10036]|0;gx=0;while(1){if((gx|0)>=(gH|0)){b7=1473;break}gA=c[gC>>2]|0;if((a[hS+(gA+gx|0)|0]|0)==(a[gx+103664|0]|0)){gx=gx+1|0}else{oq=gA;break}}if((b7|0)==1473){b7=0;if((gx|0)==1){or=hG;break L2026}oq=c[gC>>2]|0}if((gH|0)>0){os=0;ot=0;ou=oq}else{op=oq;b7=1704;break}while(1){gA=os+2|0;if((a[gA+136104|0]|0)==(a[hS+(os+ou|0)|0]|0)){ov=ou;ow=ot}else{if((gA|0)!=3){ox=0;oy=0;oz=oq;break}ov=ou-1|0;ow=1}gA=os+1|0;if((gA|0)<(ow+gH|0)){os=gA;ot=ow;ou=ov}else{b7=1480;break}}do{if((b7|0)==1480){b7=0;if((ow|0)==0){if(!((os|0)==0|(os|0)==5)){ox=0;oy=0;oz=oq;break}}a[66412]=1;gx=hF+1|0;c[13898]=gx;oA=1;oB=gx;break L2028}}while(0);while(1){if((a[ox+136104|0]|0)==(a[hS+(ox+oz|0)|0]|0)){oC=oz;oD=oy}else{if((ox|0)!=3){oE=0;oF=0;oG=oq;break}oC=oz-1|0;oD=1}gx=ox+1|0;if((gx|0)<(oD+gH|0)){ox=gx;oy=oD;oz=oC}else{b7=1487;break}}do{if((b7|0)==1487){b7=0;if((oD|0)==0){if(!((ox|0)==2|(ox|0)==7)){oE=0;oF=0;oG=oq;break}}a[66412]=0;gx=hF+1|0;c[13898]=gx;oA=1;oB=gx;break L2028}}while(0);while(1){gx=oE+2|0;if((a[gx+135864|0]|0)==(a[hS+(oE+oG|0)|0]|0)){oH=oG;oI=oF}else{if((gx|0)!=3){oJ=0;oK=0;oL=oq;break}oH=oG-1|0;oI=1}gx=oE+1|0;if((gx|0)<(oI+gH|0)){oE=gx;oF=oI;oG=oH}else{b7=1496;break}}do{if((b7|0)==1496){b7=0;if((oI|0)==0){if(!((oE|0)==0|(oE|0)==5)){oJ=0;oK=0;oL=oq;break}}a[65724]=1;gx=hF+1|0;c[13898]=gx;oA=1;oB=gx;break L2028}}while(0);while(1){if((a[oJ+135864|0]|0)==(a[hS+(oJ+oL|0)|0]|0)){oM=oL;oN=oK}else{if((oJ|0)!=3){oO=0;oP=0;oQ=oq;break}oM=oL-1|0;oN=1}gx=oJ+1|0;if((gx|0)<(oN+gH|0)){oJ=gx;oK=oN;oL=oM}else{b7=1503;break}}do{if((b7|0)==1503){b7=0;if((oN|0)==0){if(!((oJ|0)==2|(oJ|0)==7)){oO=0;oP=0;oQ=oq;break}}a[65724]=0;gx=hF+1|0;c[13898]=gx;oA=1;oB=gx;break L2028}}while(0);while(1){gx=oO+2|0;if((a[gx+135680|0]|0)==(a[hS+(oO+oQ|0)|0]|0)){oR=oQ;oS=oP}else{if((gx|0)!=3){oT=0;oU=0;oV=oq;break}oR=oQ-1|0;oS=1}gx=oO+1|0;if((gx|0)<(oS+gH|0)){oO=gx;oP=oS;oQ=oR}else{b7=1510;break}}do{if((b7|0)==1510){b7=0;if((oS|0)==0){if(!((oO|0)==0|(oO|0)==5)){oT=0;oU=0;oV=oq;break}}a[65036]=1;gx=hF+1|0;c[13898]=gx;oA=1;oB=gx;break L2028}}while(0);while(1){if((a[oT+135680|0]|0)==(a[hS+(oT+oV|0)|0]|0)){oW=oV;oX=oU}else{if((oT|0)!=3){oY=0;oZ=0;o_=oq;break}oW=oV-1|0;oX=1}gx=oT+1|0;if((gx|0)<(oX+gH|0)){oT=gx;oU=oX;oV=oW}else{b7=1517;break}}do{if((b7|0)==1517){b7=0;if((oX|0)==0){if(!((oT|0)==2|(oT|0)==7)){oY=0;oZ=0;o_=oq;break}}a[65036]=0;gx=hF+1|0;c[13898]=gx;oA=1;oB=gx;break L2028}}while(0);while(1){gx=oY+2|0;if((a[gx+135568|0]|0)==(a[hS+(oY+o_|0)|0]|0)){o$=o_;o0=oZ}else{if((gx|0)!=4){o1=0;o2=0;o3=oq;break}o$=o_-1|0;o0=1}gx=oY+1|0;if((gx|0)<(o0+gH|0)){oY=gx;oZ=o0;o_=o$}else{b7=1524;break}}do{if((b7|0)==1524){b7=0;if((o0|0)==0){if(!((oY|0)==1|(oY|0)==6)){o1=0;o2=0;o3=oq;break}}a[69164]=1;gx=hF+1|0;c[13898]=gx;oA=1;oB=gx;break L2028}}while(0);while(1){if((a[o1+135568|0]|0)==(a[hS+(o1+o3|0)|0]|0)){o4=o3;o5=o2}else{if((o1|0)!=4){o6=0;o7=0;o8=oq;break}o4=o3-1|0;o5=1}gx=o1+1|0;if((gx|0)<(o5+gH|0)){o1=gx;o2=o5;o3=o4}else{b7=1531;break}}do{if((b7|0)==1531){b7=0;if((o5|0)==0){if(!((o1|0)==3|(o1|0)==8)){o6=0;o7=0;o8=oq;break}}a[69164]=0;gx=hF+1|0;c[13898]=gx;oA=1;oB=gx;break L2028}}while(0);while(1){gx=o6+2|0;if((a[gx+135376|0]|0)==(a[hS+(o6+o8|0)|0]|0)){o9=o8;pa=o7}else{if((gx|0)!=4){pb=0;pc=0;pd=oq;break}o9=o8-1|0;pa=1}gx=o6+1|0;if((gx|0)<(pa+gH|0)){o6=gx;o7=pa;o8=o9}else{b7=1538;break}}do{if((b7|0)==1538){b7=0;if((pa|0)==0){if(!((o6|0)==1|(o6|0)==6)){pb=0;pc=0;pd=oq;break}}a[68476]=1;gx=hF+1|0;c[13898]=gx;oA=1;oB=gx;break L2028}}while(0);while(1){if((a[pb+135376|0]|0)==(a[hS+(pb+pd|0)|0]|0)){pe=pd;pf=pc}else{if((pb|0)!=4){pg=0;ph=0;pi=oq;break}pe=pd-1|0;pf=1}gx=pb+1|0;if((gx|0)<(pf+gH|0)){pb=gx;pc=pf;pd=pe}else{b7=1545;break}}do{if((b7|0)==1545){b7=0;if((pf|0)==0){if(!((pb|0)==3|(pb|0)==8)){pg=0;ph=0;pi=oq;break}}a[68476]=0;gx=hF+1|0;c[13898]=gx;oA=1;oB=gx;break L2028}}while(0);while(1){gx=pg+2|0;if((a[gx+135216|0]|0)==(a[hS+(pg+pi|0)|0]|0)){pj=pi;pk=ph}else{if((gx|0)!=4){pl=0;pm=0;pn=oq;break}pj=pi-1|0;pk=1}gx=pg+1|0;if((gx|0)<(pk+gH|0)){pg=gx;ph=pk;pi=pj}else{b7=1552;break}}do{if((b7|0)==1552){b7=0;if((pk|0)==0){if(!((pg|0)==1|(pg|0)==6)){pl=0;pm=0;pn=oq;break}}a[66413]=1;gx=hF+1|0;c[13898]=gx;oA=1;oB=gx;break L2028}}while(0);while(1){if((a[pl+135216|0]|0)==(a[hS+(pl+pn|0)|0]|0)){po=pn;pp=pm}else{if((pl|0)!=4){pq=0;pr=0;ps=oq;break}po=pn-1|0;pp=1}gx=pl+1|0;if((gx|0)<(pp+gH|0)){pl=gx;pm=pp;pn=po}else{b7=1559;break}}do{if((b7|0)==1559){b7=0;if((pp|0)==0){if(!((pl|0)==3|(pl|0)==8)){pq=0;pr=0;ps=oq;break}}a[66413]=0;gx=hF+1|0;c[13898]=gx;oA=1;oB=gx;break L2028}}while(0);while(1){gx=pq+2|0;if((a[gx+135104|0]|0)==(a[hS+(pq+ps|0)|0]|0)){pt=ps;pu=pr}else{if((gx|0)!=4){pv=0;pw=0;px=oq;break}pt=ps-1|0;pu=1}gx=pq+1|0;if((gx|0)<(pu+gH|0)){pq=gx;pr=pu;ps=pt}else{b7=1566;break}}do{if((b7|0)==1566){b7=0;if((pu|0)==0){if(!((pq|0)==1|(pq|0)==6)){pv=0;pw=0;px=oq;break}}a[65725]=1;gx=hF+1|0;c[13898]=gx;oA=1;oB=gx;break L2028}}while(0);while(1){if((a[pv+135104|0]|0)==(a[hS+(pv+px|0)|0]|0)){py=px;pz=pw}else{if((pv|0)!=4){pA=0;pB=0;pC=oq;break}py=px-1|0;pz=1}gx=pv+1|0;if((gx|0)<(pz+gH|0)){pv=gx;pw=pz;px=py}else{b7=1573;break}}do{if((b7|0)==1573){b7=0;if((pz|0)==0){if(!((pv|0)==3|(pv|0)==8)){pA=0;pB=0;pC=oq;break}}a[65725]=0;gx=hF+1|0;c[13898]=gx;oA=1;oB=gx;break L2028}}while(0);while(1){gx=pA+2|0;if((a[gx+134880|0]|0)==(a[hS+(pA+pC|0)|0]|0)){pD=pC;pE=pB}else{if((gx|0)!=4){pF=0;pG=0;pH=oq;break}pD=pC-1|0;pE=1}gx=pA+1|0;if((gx|0)<(pE+gH|0)){pA=gx;pB=pE;pC=pD}else{b7=1580;break}}do{if((b7|0)==1580){b7=0;if((pE|0)==0){if(!((pA|0)==1|(pA|0)==6)){pF=0;pG=0;pH=oq;break}}a[65037]=1;gx=hF+1|0;c[13898]=gx;oA=1;oB=gx;break L2028}}while(0);while(1){if((a[pF+134880|0]|0)==(a[hS+(pF+pH|0)|0]|0)){pI=pH;pJ=pG}else{if((pF|0)!=4){pK=0;pL=0;pM=oq;break}pI=pH-1|0;pJ=1}gx=pF+1|0;if((gx|0)<(pJ+gH|0)){pF=gx;pG=pJ;pH=pI}else{b7=1587;break}}do{if((b7|0)==1587){b7=0;if((pJ|0)==0){if(!((pF|0)==3|(pF|0)==8)){pK=0;pL=0;pM=oq;break}}a[65037]=0;gx=hF+1|0;c[13898]=gx;oA=1;oB=gx;break L2028}}while(0);while(1){gx=pK+2|0;if((a[gx+134728|0]|0)==(a[hS+(pK+pM|0)|0]|0)){pN=pM;pO=pL}else{if((gx|0)!=5){pP=0;pQ=0;pR=oq;break}pN=pM-1|0;pO=1}gx=pK+1|0;if((gx|0)<(pO+gH|0)){pK=gx;pL=pO;pM=pN}else{b7=1594;break}}do{if((b7|0)==1594){b7=0;if((pO|0)==0){if(!((pK|0)==2|(pK|0)==7)){pP=0;pQ=0;pR=oq;break}}a[69165]=1;gx=hF+1|0;c[13898]=gx;oA=1;oB=gx;break L2028}}while(0);while(1){if((a[pP+134728|0]|0)==(a[hS+(pP+pR|0)|0]|0)){pS=pR;pT=pQ}else{if((pP|0)!=5){pU=0;pV=0;pW=oq;break}pS=pR-1|0;pT=1}gx=pP+1|0;if((gx|0)<(pT+gH|0)){pP=gx;pQ=pT;pR=pS}else{b7=1601;break}}do{if((b7|0)==1601){b7=0;if((pT|0)==0){if(!((pP|0)==4|(pP|0)==9)){pU=0;pV=0;pW=oq;break}}a[69165]=0;gx=hF+1|0;c[13898]=gx;oA=1;oB=gx;break L2028}}while(0);while(1){gx=pU+2|0;if((a[gx+134600|0]|0)==(a[hS+(pU+pW|0)|0]|0)){pX=pW;pY=pV}else{if((gx|0)!=5){pZ=0;p_=0;p$=oq;break}pX=pW-1|0;pY=1}gx=pU+1|0;if((gx|0)<(pY+gH|0)){pU=gx;pV=pY;pW=pX}else{b7=1608;break}}do{if((b7|0)==1608){b7=0;if((pY|0)==0){if(!((pU|0)==2|(pU|0)==7)){pZ=0;p_=0;p$=oq;break}}a[68477]=1;gx=hF+1|0;c[13898]=gx;oA=1;oB=gx;break L2028}}while(0);while(1){if((a[pZ+134600|0]|0)==(a[hS+(pZ+p$|0)|0]|0)){p0=p$;p1=p_}else{if((pZ|0)!=5){p2=0;p3=0;p4=oq;break}p0=p$-1|0;p1=1}gx=pZ+1|0;if((gx|0)<(p1+gH|0)){pZ=gx;p_=p1;p$=p0}else{b7=1615;break}}do{if((b7|0)==1615){b7=0;if((p1|0)==0){if(!((pZ|0)==4|(pZ|0)==9)){p2=0;p3=0;p4=oq;break}}a[68477]=0;gx=hF+1|0;c[13898]=gx;oA=1;oB=gx;break L2028}}while(0);while(1){gx=p2+2|0;if((a[gx+134488|0]|0)==(a[hS+(p2+p4|0)|0]|0)){p5=p4;p6=p3}else{if((gx|0)!=4){p7=0;p8=0;p9=oq;break}p5=p4-1|0;p6=1}gx=p2+1|0;if((gx|0)<(p6+gH|0)){p2=gx;p3=p6;p4=p5}else{b7=1622;break}}do{if((b7|0)==1622){b7=0;if((p6|0)==0){if(!((p2|0)==1|(p2|0)==6)){p7=0;p8=0;p9=oq;break}}a[67100]=1;gx=hF+1|0;c[13898]=gx;oA=1;oB=gx;break L2028}}while(0);while(1){if((a[p7+134488|0]|0)==(a[hS+(p7+p9|0)|0]|0)){qa=p9;qb=p8}else{if((p7|0)!=4){qc=0;qd=0;qe=oq;break}qa=p9-1|0;qb=1}gx=p7+1|0;if((gx|0)<(qb+gH|0)){p7=gx;p8=qb;p9=qa}else{b7=1629;break}}do{if((b7|0)==1629){b7=0;if((qb|0)==0){if(!((p7|0)==3|(p7|0)==8)){qc=0;qd=0;qe=oq;break}}a[67100]=0;gx=hF+1|0;c[13898]=gx;oA=1;oB=gx;break L2028}}while(0);while(1){gx=qc+2|0;if((a[gx+134320|0]|0)==(a[hS+(qc+qe|0)|0]|0)){qf=qe;qg=qd}else{if((gx|0)!=5){qh=0;qi=0;qj=oq;break}qf=qe-1|0;qg=1}gx=qc+1|0;if((gx|0)<(qg+gH|0)){qc=gx;qd=qg;qe=qf}else{b7=1636;break}}do{if((b7|0)==1636){b7=0;if((qg|0)==0){if(!((qc|0)==2|(qc|0)==7)){qh=0;qi=0;qj=oq;break}}a[67101]=1;gx=hF+1|0;c[13898]=gx;oA=1;oB=gx;break L2028}}while(0);while(1){if((a[qh+134320|0]|0)==(a[hS+(qh+qj|0)|0]|0)){qk=qj;ql=qi}else{if((qh|0)!=5){qm=0;qn=0;qo=oq;break}qk=qj-1|0;ql=1}gx=qh+1|0;if((gx|0)<(ql+gH|0)){qh=gx;qi=ql;qj=qk}else{b7=1643;break}}do{if((b7|0)==1643){b7=0;if((ql|0)==0){if(!((qh|0)==4|(qh|0)==9)){qm=0;qn=0;qo=oq;break}}a[67101]=0;gx=hF+1|0;c[13898]=gx;oA=1;oB=gx;break L2028}}while(0);while(1){gx=qm+2|0;if((a[gx+134136|0]|0)==(a[hS+(qm+qo|0)|0]|0)){qp=qo;qq=qn}else{if((gx|0)!=3){qr=0;qs=0;qt=oq;break}qp=qo-1|0;qq=1}gx=qm+1|0;if((gx|0)<(qq+gH|0)){qm=gx;qn=qq;qo=qp}else{b7=1650;break}}do{if((b7|0)==1650){b7=0;if((qq|0)==0){if(!((qm|0)==0|(qm|0)==5)){qr=0;qs=0;qt=oq;break}}a[69852]=1;gx=hF+1|0;c[13898]=gx;oA=1;oB=gx;break L2028}}while(0);while(1){if((a[qr+134136|0]|0)==(a[hS+(qr+qt|0)|0]|0)){qu=qt;qv=qs}else{if((qr|0)!=3){qw=0;qx=0;qy=oq;break}qu=qt-1|0;qv=1}gx=qr+1|0;if((gx|0)<(qv+gH|0)){qr=gx;qs=qv;qt=qu}else{b7=1657;break}}do{if((b7|0)==1657){b7=0;if((qv|0)==0){if(!((qr|0)==2|(qr|0)==7)){qw=0;qx=0;qy=oq;break}}a[69852]=0;gx=hF+1|0;c[13898]=gx;oA=1;oB=gx;break L2028}}while(0);while(1){if((a[qw+133984|0]|0)==(a[hS+(qw+qy|0)|0]|0)){qz=qy;qA=qx}else{if((qw|0)!=2){qB=0;qC=0;qD=oq;break}qz=qy-1|0;qA=1}gx=qw+1|0;if((gx|0)<(qA+gH|0)){qw=gx;qx=qA;qy=qz}else{b7=1664;break}}do{if((b7|0)==1664){b7=0;if((qA|0)==0){if((qw|0)==1|(qw|0)==5){qE=0}else{qB=0;qC=0;qD=oq;break}}else{qE=0}while(1){if(qE>>>0>=8){b7=1669;break}if((a[65036+(qE*688&-1)|0]&1)!=0){break}if((a[65037+(qE*688&-1)|0]&1)==0){qE=qE+1|0}else{break}}if((b7|0)==1669){b7=0;a[69852]=1}h[3815]=.5235987755982988;gy=hF+1|0;c[13898]=gy;L2341:do{if((a[gz+(gy*40&-1)|0]&1)!=0){gx=c[10810]|0;if((gx|0)==0){oA=hG;oB=gy;break L2028}gA=(gG|0)>(gy|0);hp=gz+(gy*40&-1)+36|0;nd=gz+(gy*40&-1)+32|0;hC=gx;L2344:while(1){hR=c[hC+4>>2]|0;L2346:do{if(gA){hB=c[hp>>2]|0;ne=0;while(1){if((ne|0)>=(hB|0)){break}if((a[hS+((c[nd>>2]|0)+ne|0)|0]|0)==(a[hR+ne|0]|0)){ne=ne+1|0}else{break L2346}}if((a[hR+ne|0]|0)==0){b7=1678;break L2344}}}while(0);hR=c[hC>>2]|0;if((hR|0)==0){qF=gx;break}else{hC=hR}}do{if((b7|0)==1678){b7=0;if((a[hC+8|0]&1)!=0){qF=gx;break}if((c[hC+16>>2]|0)==1){break L2341}else{qF=gx}}}while(0);L2356:while(1){gx=c[qF+4>>2]|0;L2358:do{if(gA){hC=c[hp>>2]|0;hR=0;while(1){if((hR|0)>=(hC|0)){break}if((a[hS+((c[nd>>2]|0)+hR|0)|0]|0)==(a[gx+hR|0]|0)){hR=hR+1|0}else{break L2358}}if((a[gx+hR|0]|0)==0){break L2356}}}while(0);gx=c[qF>>2]|0;if((gx|0)==0){oA=hG;oB=gy;break L2028}else{qF=gx}}if((a[qF+8|0]&1)!=0){oA=hG;oB=gy;break L2028}if((c[qF+16>>2]|0)!=2){oA=hG;oB=gy;break L2028}}}while(0);m3=+h[9040];gy=is(bt)|0;nd=c[gy>>2]|0;if((nd|0)==1){qG=+(c[gy+8>>2]|0)}else if((nd|0)==2){qG=+h[gy+8>>3]}else if((nd|0)==3){qG=+uz(c[gy+8>>2]|0,0)}else{b7=1693;break L27}if((c[c$>>2]|0)==3){uu(c[c0>>2]|0);c[c$>>2]=1}h[3815]=m3*qG;oA=hG;oB=c[13898]|0;break L2028}}while(0);while(1){if((a[qB+133840|0]|0)==(a[hS+(qB+qD|0)|0]|0)){qH=qD;qI=qC}else{if((qB|0)!=4){op=oq;b7=1704;break L2028}qH=qD-1|0;qI=1}gy=qB+1|0;if((gy|0)<(qI+gH|0)){qB=gy;qC=qI;qD=qH}else{break}}if((qI|0)==0){if(!((qB|0)==3|(qB|0)==7)){op=oq;b7=1704;break}}h[3815]=0.0;hS=hF+1|0;c[13898]=hS;oA=hG;oB=hS}}while(0);L2386:do{if((b7|0)==1704){b7=0;L2388:do{if((gG|0)>(hF|0)){if(gE){break}gC=c[10036]|0;hS=0;while(1){if((hS|0)>=(gH|0)){b7=1709;break}if((a[gC+(hS+op|0)|0]|0)==(a[hS+150704|0]|0)){hS=hS+1|0}else{qJ=0;break}}do{if((b7|0)==1709){b7=0;if((hS|0)!=4){qJ=0;break}c[10026]=0;gy=hF+1|0;c[13898]=gy;oA=hG;oB=gy;break L2386}}while(0);while(1){if((qJ|0)>=(gH|0)){break}if((a[gC+(qJ+op|0)|0]|0)==(a[qJ+150856|0]|0)){qJ=qJ+1|0}else{b7=1715;break L2388}}if((qJ|0)!=5){b7=1715;break}c[10026]=1;gC=hF+1|0;c[13898]=gC;oA=hG;oB=gC;break L2386}else{b7=1715}}while(0);L2402:do{if((b7|0)==1715){b7=0;if(!((gH|0)>0&(gE^1))){break}gC=c[10036]|0;hS=0;gy=0;nd=op;while(1){if((a[hS+133704|0]|0)==(a[gC+(hS+nd|0)|0]|0)){qK=nd;qL=gy}else{if((hS|0)!=6){break L2402}qK=nd-1|0;qL=1}hp=hS+1|0;if((hp|0)<(qL+gH|0)){hS=hp;gy=qL;nd=qK}else{break}}if((qL|0)==0){if(!((hS|0)==5|(hS|0)==12)){break}}c[10026]=-1;nd=hF+1|0;c[13898]=nd;oA=hG;oB=nd;break L2386}}while(0);hH(40048,1,0);nd=c[13898]|0;L2416:do{if((c[8272]|0)>(nd|0)){gy=c[1054]|0;if((a[gy+(nd*40&-1)|0]&1)==0){b7=1731;break}gC=c[gy+(nd*40&-1)+36>>2]|0;hp=gy+(nd*40&-1)+32|0;gy=c[10036]|0;gA=0;while(1){if((gA|0)>=(gC|0)){break}if((a[gy+((c[hp>>2]|0)+gA|0)|0]|0)==(a[gA+148464|0]|0)){gA=gA+1|0}else{b7=1731;break L2416}}if((gA|0)!=1){b7=1731;break}c[13898]=nd+1;hH(34776,1,0);qM=c[13898]|0}else{b7=1731}}while(0);do{if((b7|0)==1731){b7=0;if((hF|0)==(nd|0)){qM=hF;break}c[8694]=c[10012];c[8695]=c[10013];c[8696]=c[10014];c[8697]=c[10015];c[8698]=c[10016];c[8699]=c[10017];c[8700]=c[10018];c[8701]=c[10019];c[8702]=c[10020];c[8703]=c[10021];c[8704]=c[10022];c[8705]=c[10023];c[8706]=c[10024];c[8707]=c[10025];qM=nd}}while(0);if((hF|0)==(qM|0)){or=hG;break L2026}else{oA=hG;oB=qM}}}while(0);gH=c[8272]|0;if((oB|0)>=(gH|0)){or=oA;break}hG=oA;hF=oB;gG=gH;gz=c[1054]|0}if(or){break}else{qN=0}}else{qN=0}while(1){if(qN>>>0>=8){break}if((a[65036+(qN*688&-1)|0]&1)!=0){break L44}if((a[65037+(qN*688&-1)|0]&1)==0){qN=qN+1|0}else{break L44}}if((a[30528]&1)==0){a[66412]=1;a[65724]=1;break}else{a[69852]=1;break}}else if((gD|0)==25){c[13898]=gv+1;gr();a[38984]=1}else if((gD|0)==26){b7=1742;break L27}else if((gD|0)==27){c[13898]=gv+1;gz=is(bs)|0;gG=c[gz>>2]|0;if((gG|0)==1){qO=+(c[gz+8>>2]|0)}else if((gG|0)==2){qO=+h[gz+8>>3]}else if((gG|0)==3){qO=+uz(c[gz+8>>2]|0,0)}else{b7=1747;break L27}if((c[c1>>2]|0)==3){uu(c[c2>>2]|0);c[c1>>2]=1}gz=~~qO;gG=(gz|0)>-1?gz:-gz|0;qP=c[13898]|0;do{if((qP|0)<(c[8272]|0)){gz=c[1054]|0;if((a[gz+(qP*40&-1)|0]&1)==0){b7=5168;break L27}hF=c[gz+(qP*40&-1)+36>>2]|0;hG=gz+(qP*40&-1)+32|0;gz=c[10036]|0;gH=0;while(1){if((gH|0)>=(hF|0)){b7=1755;break}if((a[gz+((c[hG>>2]|0)+gH|0)|0]|0)==(a[gH+103664|0]|0)){gH=gH+1|0}else{qQ=0;break}}if((b7|0)==1755){b7=0;if((gH|0)==1){qR=gG;break}else{qQ=0}}while(1){if((qQ|0)>=(hF|0)){break}if((a[gz+((c[hG>>2]|0)+qQ|0)|0]|0)==(a[qQ+148464|0]|0)){qQ=qQ+1|0}else{b7=5169;break L27}}if((qQ|0)!=1){b7=5170;break L27}c[13898]=qP+1;hG=is(br)|0;gz=c[hG>>2]|0;if((gz|0)==1){qS=+(c[hG+8>>2]|0)}else if((gz|0)==2){qS=+h[hG+8>>3]}else if((gz|0)==3){qS=+uz(c[hG+8>>2]|0,0)}else{b7=1764;break L27}if((c[c3>>2]|0)==3){uu(c[c4>>2]|0);c[c3>>2]=1}hG=~~qS;qR=(hG|0)>-1?hG:-hG|0}else{qR=gG}}while(0);if((gG|0)<2|(qR|0)<2){b7=1769;break L27}hG=c[10814]|0;gz=c[10828]|0;c[10814]=0;c[10828]=0;iO(hG);iY(gz);c[9344]=gG;c[9342]=qR}else if((gD|0)==28){gz=gv+1|0;c[13898]=gz;a[36120]=1;hG=c[8272]|0;L2473:do{if((gz|0)<(hG|0)){hF=0;gH=0;gE=0;nd=0;qT=gz;hp=hG;gy=gw;while(1){gC=(a[gy+(qT*40&-1)|0]&1)==0;hS=c[gy+(qT*40&-1)+36>>2]|0;L2476:do{if(gC){qU=c[10036]|0;qV=gy+(qT*40&-1)+32|0}else{gx=gy+(qT*40&-1)+32|0;hC=c[10036]|0;ne=0;while(1){if((ne|0)>=(hS|0)){break}if((a[hC+((c[gx>>2]|0)+ne|0)|0]|0)==(a[ne+103664|0]|0)){ne=ne+1|0}else{qU=hC;qV=gx;break L2476}}if((ne|0)==1){qW=gE;qX=nd;break L2473}else{qU=hC;qV=gx}}}while(0);gA=c[qV>>2]|0;hB=(hS|0)>0;hw=23912;hK=184456;L2484:while(1){L2486:do{if(!gC){if(hB){ho=0;gF=0;nh=gA;while(1){ng=a[hK+ho|0]|0;if(ng<<24>>24==(a[qU+(ho+nh|0)|0]|0)){qY=nh;qZ=gF}else{if(ng<<24>>24!=36){break L2486}qY=nh-1|0;qZ=1}q_=ho+1|0;if((q_|0)<(qZ+hS|0)){ho=q_;gF=qZ;nh=qY}else{break}}if((qZ|0)==0){q$=q_}else{q0=hw;break L2484}}else{q$=0}nh=a[hK+q$|0]|0;if((nh<<24>>24|0)==36|(nh<<24>>24|0)==0){q0=hw;break L2484}}}while(0);gx=hw+8|0;hC=c[gx>>2]|0;if((hC|0)==0){q0=gx;break}else{hw=gx;hK=hC}}hK=c[q0+4>>2]|0;L2499:do{if((hK|0)==40){a[36120]=1;q1=nd;q2=gE;q3=gH;q4=hF}else if((hK|0)==41){a[36120]=0;q1=nd;q2=gE;q3=gH;q4=hF}else if((hK|0)==39){uu(c[9329]|0);uD(36120,26456,1240);q1=nd;q2=gE;q3=gH;q4=hF}else if((hK|0)==1){if(nd){uh(qT,137664,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[9044]=0;q1=1;q2=gE;q3=gH;q4=hF}else if((hK|0)==2){if(nd){uh(qT,137664,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[9044]=2;q1=1;q2=gE;q3=gH;q4=hF}else if((hK|0)==3){if(gE){uh(qT,137552,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[9045]=0;q1=nd;q2=1;q3=gH;q4=hF}else if((hK|0)==4){if(gE){uh(qT,137552,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[9045]=2;q1=nd;q2=1;q3=gH;q4=hF}else if((hK|0)==5){if(!nd){c[9044]=1}if(!gE){c[9045]=1}hw=nd|gE;q1=hw;q2=hw;q3=gH;q4=hF}else if((hK|0)==6){if(hF){uh(qT,137256,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[9047]=0;q1=nd;q2=gE;q3=gH;q4=1}else if((hK|0)==7){if(hF){uh(qT,137256,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[9047]=1;q1=nd;q2=gE;q3=gH;q4=1}else if((hK|0)==8){if(!gH){b7=1817;break}uh(qT,137376,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);b7=1817}else if((hK|0)==13){b7=1817}else if((hK|0)==9){if(!gH){b7=1824;break}uh(qT,137376,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);b7=1824}else if((hK|0)==14){b7=1824}else if((hK|0)==11){if(gH){uh(qT,137376,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[9031]=0;q1=nd;q2=gE;q3=1;q4=hF}else if((hK|0)==12){if(gH){uh(qT,137376,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[9031]=1;q1=nd;q2=gE;q3=1;q4=hF}else if((hK|0)==15){if(gH){uh(qT,137376,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[9031]=2;c[9032]=0;q1=nd;q2=gE;q3=1;q4=hF}else if((hK|0)==16){if(gH){uh(qT,137376,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[9031]=2;c[9032]=1;q1=nd;q2=gE;q3=1;q4=hF}else if((hK|0)==17){if(gH){uh(qT,137376,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[9031]=2;c[9032]=2;q1=nd;q2=gE;q3=1;q4=hF}else if((hK|0)==18){if(gH){uh(qT,137376,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[9031]=2;c[9032]=3;q1=nd;q2=gE;q3=1;q4=hF}else if((hK|0)==19){c[9046]=0;q1=nd;q2=gE;q3=gH;q4=hF}else if((hK|0)==20){c[9046]=1;q1=nd;q2=gE;q3=gH;q4=hF}else if((hK|0)==21){a[36229]=1;q1=nd;q2=gE;q3=gH;q4=hF}else if((hK|0)==22){a[36229]=0;q1=nd;q2=gE;q3=gH;q4=hF}else if((hK|0)==23){a[36230]=1;q1=nd;q2=gE;q3=gH;q4=hF}else if((hK|0)==24){a[36230]=0;q1=nd;q2=gE;q3=gH;q4=hF}else if((hK|0)==25){a[36231]=1;q1=nd;q2=gE;q3=gH;q4=hF}else if((hK|0)==26){a[36231]=0;q1=nd;q2=gE;q3=gH;q4=hF}else if((hK|0)==27){hw=qT+1|0;c[13898]=hw;c[9059]=-2;L2571:do{if((hw|0)<(hp|0)){L2573:do{if((a[gy+(hw*40&-1)|0]&1)!=0){hS=c[gy+(hw*40&-1)+36>>2]|0;gA=gy+(hw*40&-1)+32|0;hB=0;while(1){if((hB|0)>=(hS|0)){break}if((a[qU+((c[gA>>2]|0)+hB|0)|0]|0)==(a[hB+103664|0]|0)){hB=hB+1|0}else{break L2573}}if((hB|0)==1){q5=hw;break L2571}}}while(0);hH(36232,1,0);gA=c[13898]|0;if((hw|0)!=(gA|0)){q5=gA;break}if((a[(c[1054]|0)+(hw*40&-1)|0]&1)!=0){q5=hw;break}gA=is(bp)|0;hS=c[gA>>2]|0;if((hS|0)==1){q6=+(c[gA+8>>2]|0)}else if((hS|0)==2){q6=+h[gA+8>>3]}else if((hS|0)==3){q6=+uz(c[gA+8>>2]|0,0)}else{b7=1867;break L27}if((c[c6>>2]|0)==3){uu(c[c7>>2]|0);c[c6>>2]=1}c[9059]=~~q6-1;gA=(c[13898]|0)+1|0;c[13898]=gA;q5=gA}else{q5=hw}}while(0);c[13898]=q5-1;q1=nd;q2=gE;q3=gH;q4=hF}else if((hK|0)==28){c[9059]=-3;q1=nd;q2=gE;q3=gH;q4=hF}else if((hK|0)==29){c[13898]=qT+1;hw=is(bo)|0;gA=c[hw>>2]|0;if((gA|0)==1){q7=+(c[hw+8>>2]|0)}else if((gA|0)==2){q7=+h[hw+8>>3]}else if((gA|0)==3){q7=+uz(c[hw+8>>2]|0,0)}else{b7=1877;break L27}if((c[c8>>2]|0)==3){uu(c[c9>>2]|0);c[c8>>2]=1}h[4524]=q7;c[13898]=(c[13898]|0)-1;q1=nd;q2=gE;q3=gH;q4=hF}else if((hK|0)==30){c[13898]=qT+1;hw=is(bn)|0;gA=c[hw>>2]|0;if((gA|0)==1){q8=+(c[hw+8>>2]|0)}else if((gA|0)==2){q8=+h[hw+8>>3]}else if((gA|0)==3){q8=+uz(c[hw+8>>2]|0,0)}else{b7=1885;break L27}if((c[da>>2]|0)==3){uu(c[dc>>2]|0);c[da>>2]=1}h[4525]=q8<0.0?0.0:q8;c[13898]=(c[13898]|0)-1;q1=nd;q2=gE;q3=gH;q4=hF}else if((hK|0)==31){c[13898]=qT+1;hw=is(bm)|0;gA=c[hw>>2]|0;if((gA|0)==1){q9=+(c[hw+8>>2]|0)}else if((gA|0)==2){q9=+h[hw+8>>3]}else if((gA|0)==3){q9=+uz(c[hw+8>>2]|0,0)}else{b7=1893;break L27}if((c[dd>>2]|0)==3){uu(c[de>>2]|0);c[dd>>2]=1}h[4526]=q9;c[13898]=(c[13898]|0)-1;q1=nd;q2=gE;q3=gH;q4=hF}else if((hK|0)==32){c[13898]=qT+1;hw=is(bl)|0;gA=c[hw>>2]|0;if((gA|0)==1){ra=+(c[hw+8>>2]|0)}else if((gA|0)==2){ra=+h[hw+8>>3]}else if((gA|0)==3){ra=+uz(c[hw+8>>2]|0,0)}else{b7=1901;break L27}if((c[df>>2]|0)==3){uu(c[dg>>2]|0);c[df>>2]=1}h[4527]=ra;c[13898]=(c[13898]|0)-1;q1=nd;q2=gE;q3=gH;q4=hF}else if((hK|0)==37){hw=qT+1|0;c[13898]=hw;gA=c[gy+(hw*40&-1)+36>>2]|0;L2629:do{if((a[gy+(hw*40&-1)|0]&1)!=0&(gA|0)>0){hS=0;gC=0;hC=c[gy+(hw*40&-1)+32>>2]|0;while(1){if((a[hS+137208|0]|0)==(a[qU+(hS+hC|0)|0]|0)){rb=hC;rc=gC}else{if((hS|0)!=3){break L2629}rb=hC-1|0;rc=1}gx=hS+1|0;if((gx|0)<(rc+gA|0)){hS=gx;gC=rc;hC=rb}else{break}}if((rc|0)==0){if(!((hS|0)==2|(hS|0)==12)){break}}c[9056]=2;q1=nd;q2=gE;q3=gH;q4=hF;break L2499}}while(0);c[9056]=1;c[13898]=qT;q1=nd;q2=gE;q3=gH;q4=hF}else if((hK|0)==38){c[9056]=0;q1=nd;q2=gE;q3=gH;q4=hF}else if((hK|0)==33){gA=qT+1|0;c[13898]=gA;L2644:do{if((gA|0)<(hp|0)){L2646:do{if((a[gy+(gA*40&-1)|0]&1)!=0){hw=c[gy+(gA*40&-1)+36>>2]|0;hC=gy+(gA*40&-1)+32|0;gC=0;while(1){if((gC|0)>=(hw|0)){break}if((a[qU+((c[hC>>2]|0)+gC|0)|0]|0)==(a[gC+103664|0]|0)){gC=gC+1|0}else{break L2646}}if((gC|0)==1){b7=1926;break L2644}}}while(0);a[14176]=1;is(bk);a[14176]=0;if((c[dh>>2]|0)!=3){c[13898]=gA;b7=1926;break}hS=c[di>>2]|0;if((hS|0)==0){b7=1926;break}uF(36288,hS|0,1025);uu(hS)}else{b7=1926}}while(0);if((b7|0)==1926){b7=0;a[36288]=0}c[13898]=(c[13898]|0)-1;q1=nd;q2=gE;q3=gH;q4=hF}else if((hK|0)==34){a[36288]=0;q1=nd;q2=gE;q3=gH;q4=hF}else if((hK|0)==35){rd=qT+1|0;c[13898]=rd;gA=(a[gy+(rd*40&-1)|0]&1)==0;if(gA){b7=1931}else{hS=a[qU+(c[gy+(rd*40&-1)+32>>2]|0)|0]|0;if(!((hS<<24>>24|0)==39|(hS<<24>>24|0)==34)){b7=1931}}if((b7|0)==1931){b7=0;hS=c[10810]|0;if((hS|0)==0){b7=5171;break L27}hC=gy+(rd*40&-1)+36|0;hw=gy+(rd*40&-1)+32|0;hB=(hp|0)<=(rd|0)|gA;gA=hS;L2667:while(1){hS=c[gA+4>>2]|0;L2669:do{if(!hB){gx=c[hC>>2]|0;ne=0;while(1){if((ne|0)>=(gx|0)){break}if((a[qU+((c[hw>>2]|0)+ne|0)|0]|0)==(a[hS+ne|0]|0)){ne=ne+1|0}else{break L2669}}if((a[hS+ne|0]|0)==0){break L2667}}}while(0);hS=c[gA>>2]|0;if((hS|0)==0){b7=5173;break L27}else{gA=hS}}if((a[gA+8|0]&1)!=0){b7=5172;break L27}if((c[gA+16>>2]|0)!=3){b7=5174;break L27}}uu(c[9329]|0);hw=c[13898]|0;L2679:do{if((hw|0)<(c[8272]|0)){hC=c[1054]|0;L2681:do{if((a[hC+(hw*40&-1)|0]&1)!=0){hB=c[hC+(hw*40&-1)+36>>2]|0;hS=hC+(hw*40&-1)+32|0;gx=c[10036]|0;gC=0;while(1){if((gC|0)>=(hB|0)){break}if((a[gx+((c[hS>>2]|0)+gC|0)|0]|0)==(a[gC+103664|0]|0)){gC=gC+1|0}else{break L2681}}if((gC|0)==1){re=0;rf=hw;break L2679}}}while(0);a[14176]=1;is(bj);a[14176]=0;if((c[dj>>2]|0)==3){re=c[dk>>2]|0;rf=c[13898]|0;break}else{c[13898]=hw;re=0;rf=hw;break}}else{re=0;rf=hw}}while(0);c[9329]=re;c[13898]=rf-1;q1=nd;q2=gE;q3=gH;q4=hF}else if((hK|0)==36){uE(c5|0,0,16);hI(bq,7);do{if((c[dm>>2]|0)==3){if(+h[dn>>3]!=-1.0){break}c[dm>>2]=7}}while(0);c[9330]=c[c5>>2];c[37324>>2]=c[c5+4>>2];c[37328>>2]=c[c5+8>>2];c[37332>>2]=c[c5+12>>2];c[13898]=(c[13898]|0)-1;q1=nd;q2=gE;q3=gH;q4=hF}else if((hK|0)==42){hw=qT+1|0;c[13898]=hw;L2698:do{if((hw|0)<(hp|0)){L2700:do{if((a[gy+(hw*40&-1)|0]&1)!=0){gA=c[gy+(hw*40&-1)+36>>2]|0;hC=gy+(hw*40&-1)+32|0;hS=0;while(1){if((hS|0)>=(gA|0)){b7=1961;break}if((a[qU+((c[hC>>2]|0)+hS|0)|0]|0)==(a[hS+103664|0]|0)){hS=hS+1|0}else{break}}if((b7|0)==1961){b7=0;if((hS|0)==1){rg=0;rh=hw;break L2698}}if((gA|0)<=0){break}gC=0;gx=0;hB=c[hC>>2]|0;while(1){if((a[gC+137072|0]|0)==(a[qU+(gC+hB|0)|0]|0)){ri=hB;rj=gx}else{if((gC|0)!=1){break L2700}ri=hB-1|0;rj=1}ne=gC+1|0;if((ne|0)<(rj+gA|0)){gC=ne;gx=rj;hB=ri}else{break}}if((rj|0)!=0){rg=0;rh=hw;break L2698}if((gC|0)==0|(gC|0)==9){rg=0;rh=hw;break L2698}}}while(0);hB=is(bh)|0;gx=c[hB>>2]|0;if((gx|0)==1){rk=+(c[hB+8>>2]|0)}else if((gx|0)==2){rk=+h[hB+8>>3]}else if((gx|0)==3){rk=+uz(c[hB+8>>2]|0,0)}else{b7=1974;break L27}if((c[dp>>2]|0)==3){uu(c[dq>>2]|0);c[dp>>2]=1}rg=~~rk;rh=c[13898]|0}else{rg=0;rh=hw}}while(0);c[9338]=(rg|0)<0?0:rg;c[13898]=rh-1;q1=nd;q2=gE;q3=gH;q4=hF}else if((hK|0)==43){hw=qT+1|0;c[13898]=hw;L2728:do{if((hw|0)<(hp|0)){L2730:do{if((a[gy+(hw*40&-1)|0]&1)!=0){hB=c[gy+(hw*40&-1)+36>>2]|0;gx=gy+(hw*40&-1)+32|0;gA=0;while(1){if((gA|0)>=(hB|0)){b7=1984;break}if((a[qU+((c[gx>>2]|0)+gA|0)|0]|0)==(a[gA+103664|0]|0)){gA=gA+1|0}else{break}}if((b7|0)==1984){b7=0;if((gA|0)==1){rl=0;rm=hw;break L2728}}if((hB|0)<=0){break}gC=0;hC=0;hS=c[gx>>2]|0;while(1){if((a[gC+137072|0]|0)==(a[qU+(gC+hS|0)|0]|0)){rn=hS;ro=hC}else{if((gC|0)!=1){break L2730}rn=hS-1|0;ro=1}ne=gC+1|0;if((ne|0)<(ro+hB|0)){gC=ne;hC=ro;hS=rn}else{break}}if((ro|0)!=0){rl=0;rm=hw;break L2728}if((gC|0)==0|(gC|0)==9){rl=0;rm=hw;break L2728}}}while(0);hS=is(bg)|0;hC=c[hS>>2]|0;if((hC|0)==1){rp=+(c[hS+8>>2]|0)}else if((hC|0)==2){rp=+h[hS+8>>3]}else if((hC|0)==3){rp=+uz(c[hS+8>>2]|0,0)}else{b7=1997;break L27}if((c[dr>>2]|0)==3){uu(c[ds>>2]|0);c[dr>>2]=1}rl=~~rp;rm=c[13898]|0}else{rl=0;rm=hw}}while(0);c[9339]=(rl|0)<0?0:rl;c[13898]=rm-1;q1=nd;q2=gE;q3=gH;q4=hF}else if((hK|0)==44){a[36228]=1;q1=nd;q2=gE;q3=gH;q4=hF}else if((hK|0)==45){a[36228]=0;q1=nd;q2=gE;q3=gH;q4=hF}else if((hK|0)==10){hw=qT+1|0;c[13898]=hw;if(gH){uh(hw,137376,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}dl(36136,0);c[9031]=3;c[13898]=(c[13898]|0)-1;q1=nd;q2=gE;q3=1;q4=hF}else{b7=2007;break L27}}while(0);if((b7|0)==1817){b7=0;if(!gE){c[9045]=1}if(!hF){c[9047]=1}c[9031]=2;c[9032]=0;q1=nd;q2=gE;q3=1;q4=hF}else if((b7|0)==1824){b7=0;if(!gE){c[9045]=1}if(!hF){c[9047]=1}c[9031]=2;c[9032]=1;q1=nd;q2=gE;q3=1;q4=hF}hK=(c[13898]|0)+1|0;c[13898]=hK;hw=c[8272]|0;if((hK|0)>=(hw|0)){qW=q2;qX=q1;break L2473}hF=q4;gH=q3;gE=q2;nd=q1;qT=hK;hp=hw;gy=c[1054]|0}}else{qW=0;qX=0}}while(0);hG=c[9031]|0;if((hG|0)==2){gz=c[9032]|0;if(qX&gz>>>0<2){uh(-1,136464,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);break}if(!qW){break}if((gz-2|0)>>>0>=2){break}uh(-1,136272,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);break}else if((hG|0)!=1){break}if((c[9047]|0)==0){hG=c[9045]|0;if((hG|0)==0){c[9032]=2;break}else if((hG|0)==1){if((c[9044]|0)==0){c[9032]=0;break}else{c[9032]=1;break}}else if((hG|0)==2){c[9032]=3;break}else{break}}else{hG=c[9044]|0;if((hG|0)==0){c[9032]=0;break}else if((hG|0)==1){if((c[9045]|0)==0){c[9032]=2;break}else{c[9032]=3;break}}else if((hG|0)==2){c[9032]=1;break}else{break}}}else if((gD|0)==29){hG=gv+1|0;c[13898]=hG;L2807:do{if((hG|0)<(c[8272]|0)){L2809:do{if((a[gw+(hG*40&-1)|0]&1)!=0){gz=c[gw+(hG*40&-1)+36>>2]|0;gG=gw+(hG*40&-1)+32|0;gy=0;while(1){if((gy|0)>=(gz|0)){b7=2034;break}if((a[gB+((c[gG>>2]|0)+gy|0)|0]|0)==(a[gy+103664|0]|0)){gy=gy+1|0}else{rq=0;break}}if((b7|0)==2034){b7=0;if((gy|0)==1){break L2807}else{rq=0}}while(1){if((rq|0)>=(gz|0)){break}if((a[gB+((c[gG>>2]|0)+rq|0)|0]|0)==(a[rq+103664|0]|0)){rq=rq+1|0}else{break L2809}}if((rq|0)==1){break L44}}}while(0);a[14176]=1;is(bf);a[14176]=0;if((c[dt>>2]|0)!=3){c[13898]=hG;break L44}gG=c[du>>2]|0;if((gG|0)==0){break L44}uF(36288,gG|0,1025);uu(gG);break L44}}while(0);a[36288]=0}else if((gD|0)==31){jr(43280)}else if((gD|0)==32){hG=gv+1|0;L2828:do{if((c[8272]|0)>(hG|0)){if((a[gw+(hG*40&-1)|0]&1)==0){break}gG=c[gw+(hG*40&-1)+36>>2]|0;gz=gw+(hG*40&-1)+32|0;gy=0;while(1){if((gy|0)>=(gG|0)){break}if((a[gB+((c[gz>>2]|0)+gy|0)|0]|0)==(a[gy+166752|0]|0)){gy=gy+1|0}else{break L2828}}if((gy|0)!=5){break}c[13898]=gv+2;gz=is(bd)|0;gG=c[gz>>2]|0;if((gG|0)==1){rr=+(c[gz+8>>2]|0)}else if((gG|0)==2){rr=+h[gz+8>>3]}else if((gG|0)==3){rr=+uz(c[gz+8>>2]|0,0)}else{b7=2054;break L27}if((c[dv>>2]|0)==3){uu(c[dw>>2]|0);c[dv>>2]=1}c[8798]=~~rr;break L44}}while(0);jr(43264)}else if((gD|0)==30){hG=gv+1|0;c[13898]=hG;L2846:do{if((hG|0)<(c[8272]|0)){gz=(a[gw+(hG*40&-1)|0]&1)==0;if(!gz){gG=c[gw+(hG*40&-1)+36>>2]|0;hp=gw+(hG*40&-1)+32|0;nd=0;while(1){if((nd|0)>=(gG|0)){b7=2064;break}if((a[gB+((c[hp>>2]|0)+nd|0)|0]|0)==(a[nd+103664|0]|0)){nd=nd+1|0}else{break}}if((b7|0)==2064){b7=0;if((nd|0)==1){b7=2154;break}}gG=a[gB+(c[hp>>2]|0)|0]|0;if((gG<<24>>24|0)==39|(gG<<24>>24|0)==34){b7=2154;break}}gG=c[10810]|0;L2857:do{if((gG|0)!=0){gy=gw+(hG*40&-1)+36|0;gE=gw+(hG*40&-1)+32|0;gH=gG;L2859:while(1){hF=c[gH+4>>2]|0;L2861:do{if(!gz){hw=c[gy>>2]|0;hK=0;while(1){if((hK|0)>=(hw|0)){break}if((a[gB+((c[gE>>2]|0)+hK|0)|0]|0)==(a[hF+hK|0]|0)){hK=hK+1|0}else{break L2861}}if((a[hF+hK|0]|0)==0){break L2859}}}while(0);hF=c[gH>>2]|0;if((hF|0)==0){break L2857}else{gH=hF}}if((a[gH+8|0]&1)!=0){break}if((c[gH+16>>2]|0)==3){b7=2154;break L2846}}}while(0);L2871:do{if(!gz){gG=c[gw+(hG*40&-1)+36>>2]|0;hp=gw+(hG*40&-1)+32|0;nd=0;while(1){if((nd|0)>=(gG|0)){b7=2080;break}if((a[gB+((c[hp>>2]|0)+nd|0)|0]|0)==(a[nd+95280|0]|0)){nd=nd+1|0}else{rs=0;break}}if((b7|0)==2080){b7=0;if((nd|0)==2){b7=2154;break L2846}else{rs=0}}while(1){if((rs|0)>=(gG|0)){b7=2083;break}if((a[gB+((c[hp>>2]|0)+rs|0)|0]|0)==(a[rs+130008|0]|0)){rs=rs+1|0}else{rt=0;break}}if((b7|0)==2083){b7=0;if((rs|0)==4){b7=2154;break L2846}else{rt=0}}while(1){if((rt|0)>=(gG|0)){b7=2086;break}if((a[gB+((c[hp>>2]|0)+rt|0)|0]|0)==(a[rt+89896|0]|0)){rt=rt+1|0}else{ru=0;break}}if((b7|0)==2086){b7=0;if((rt|0)==6){b7=2154;break L2846}else{ru=0}}while(1){if((ru|0)>=(gG|0)){b7=2089;break}if((a[gB+((c[hp>>2]|0)+ru|0)|0]|0)==(a[ru+139840|0]|0)){ru=ru+1|0}else{rv=0;break}}if((b7|0)==2089){b7=0;if((ru|0)==6){b7=2154;break L2846}else{rv=0}}while(1){if((rv|0)>=(gG|0)){b7=2092;break}if((a[gB+((c[hp>>2]|0)+rv|0)|0]|0)==(a[rv+129888|0]|0)){rv=rv+1|0}else{rw=0;break}}if((b7|0)==2092){b7=0;if((rv|0)==5){b7=2154;break L2846}else{rw=0}}while(1){if((rw|0)>=(gG|0)){b7=2095;break}if((a[gB+((c[hp>>2]|0)+rw|0)|0]|0)==(a[rw+150856|0]|0)){rw=rw+1|0}else{rx=0;break}}if((b7|0)==2095){b7=0;if((rw|0)==5){b7=2154;break L2846}else{rx=0}}while(1){if((rx|0)>=(gG|0)){b7=2098;break}if((a[gB+((c[hp>>2]|0)+rx|0)|0]|0)==(a[rx+150704|0]|0)){rx=rx+1|0}else{break}}if((b7|0)==2098){b7=0;if((rx|0)==4){b7=2154;break L2846}}nd=c[hp>>2]|0;gH=(gG|0)>0;L2909:do{if(gH){gE=0;gy=0;hF=nd;while(1){if((a[gE+90456|0]|0)==(a[gB+(gE+hF|0)|0]|0)){ry=hF;rz=gy}else{if((gE|0)!=3){rA=0;rB=0;rC=nd;break}ry=hF-1|0;rz=1}hw=gE+1|0;if((hw|0)<(rz+gG|0)){gE=hw;gy=rz;hF=ry}else{b7=2104;break}}if((b7|0)==2104){b7=0;if((rz|0)!=0){b7=2154;break L2846}if((gE|0)==2|(gE|0)==6){b7=2154;break L2846}else{rA=0;rB=0;rC=nd}}while(1){if((a[rA+149328|0]|0)==(a[gB+(rA+rC|0)|0]|0)){rD=rC;rE=rB}else{if((rA|0)!=5){rF=0;break L2909}rD=rC-1|0;rE=1}hF=rA+1|0;if((hF|0)<(rE+gG|0)){rA=hF;rB=rE;rC=rD}else{break}}if((rE|0)!=0){b7=2154;break L2846}if((rA|0)==4|(rA|0)==8){b7=2154;break L2846}else{rF=0}}else{rF=0}}while(0);while(1){if((rF|0)>=(gG|0)){b7=2114;break}if((a[gB+(rF+nd|0)|0]|0)==(a[rF+225056|0]|0)){rF=rF+1|0}else{break}}if((b7|0)==2114){b7=0;if((rF|0)==2){b7=2154;break L2846}}L2933:do{if(gH){hp=0;gE=0;hF=nd;while(1){if((a[hp+139232|0]|0)==(a[gB+(hp+hF|0)|0]|0)){rG=hF;rH=gE}else{if((hp|0)!=5){rI=0;break L2933}rG=hF-1|0;rH=1}gy=hp+1|0;if((gy|0)<(rH+gG|0)){hp=gy;gE=rH;hF=rG}else{break}}if((rH|0)!=0){b7=2154;break L2846}if((hp|0)==4|(hp|0)==8){b7=2154;break L2846}else{rI=0}}else{rI=0}}while(0);while(1){if((rI|0)>=(gG|0)){b7=2124;break}if((a[gB+(rI+nd|0)|0]|0)==(a[rI+205624|0]|0)){rI=rI+1|0}else{break}}if((b7|0)==2124){b7=0;if((rI|0)==2){b7=2154;break L2846}}L2948:do{if(gH){hF=0;gE=0;gy=nd;while(1){if((a[hF+139064|0]|0)==(a[gB+(hF+gy|0)|0]|0)){rJ=gy;rK=gE}else{if((hF|0)!=6){rL=0;break L2948}rJ=gy-1|0;rK=1}hw=hF+1|0;if((hw|0)<(rK+gG|0)){hF=hw;gE=rK;gy=rJ}else{break}}if((rK|0)!=0){b7=2154;break L2846}if((hF|0)==5|(hF|0)==9){b7=2154;break L2846}else{rL=0}}else{rL=0}}while(0);while(1){if((rL|0)>=(gG|0)){b7=2134;break}if((a[gB+(rL+nd|0)|0]|0)==(a[rL+143040|0]|0)){rL=rL+1|0}else{break}}if((b7|0)==2134){b7=0;if((rL|0)==2){b7=2154;break L2846}}L2963:do{if(gH){gy=0;gE=0;hp=nd;while(1){if((a[gy+142856|0]|0)==(a[gB+(gy+hp|0)|0]|0)){rM=hp;rN=gE}else{if((gy|0)!=4){rO=0;break L2963}rM=hp-1|0;rN=1}hw=gy+1|0;if((hw|0)<(rN+gG|0)){gy=hw;gE=rN;hp=rM}else{break}}if((rN|0)!=0){b7=2154;break L2846}if((gy|0)==3|(gy|0)==9){b7=2154;break L2846}else{rO=0}}else{rO=0}}while(0);while(1){if((rO|0)>=(gG|0)){break}if((a[gB+(rO+nd|0)|0]|0)==(a[rO+124352|0]|0)){rO=rO+1|0}else{break L2871}}if((rO|0)==4){b7=2154;break L2846}}}while(0);is(bb);gz=c[dy>>2]|0;if((gz|0)==3){c[13898]=hG;nd=c[10822]|0;L2979:do{if((nd|0)==0){rP=1}else{gG=1;gH=nd;while(1){if((c[gH+4>>2]|0)!=(gG|0)){rP=gG;break L2979}hp=gG+1|0;gE=c[gH>>2]|0;if((gE|0)==0){rP=hp;break}else{gG=hp;gH=gE}}}}while(0);uu(c[dA>>2]|0);c[dy>>2]=1;rQ=rP;b7=2157;break}else if((gz|0)==1){rR=+(c[dB>>2]|0)}else if((gz|0)==2){rR=+h[dz>>3]}else{b7=2152;break L27}rQ=~~rR;b7=2157}else{b7=2154}}while(0);L2987:do{if((b7|0)==2154){b7=0;hG=c[10822]|0;if((hG|0)==0){rS=1;rT=0;rU=0;b7=2163;break}else{rV=1;rW=hG}while(1){if((c[rW+4>>2]|0)!=(rV|0)){rQ=rV;b7=2157;break L2987}hG=rV+1|0;nd=c[rW>>2]|0;if((nd|0)==0){rQ=hG;b7=2157;break}else{rV=hG;rW=nd}}}}while(0);L2992:do{if((b7|0)==2157){b7=0;if((rQ|0)<1){b7=2158;break L27}gz=c[10822]|0;if((gz|0)==0){rS=rQ;rT=0;rU=0;b7=2163;break}else{rX=0;rY=gz}while(1){rZ=c[rY+4>>2]|0;if((rQ|0)<=(rZ|0)){break}gz=c[rY>>2]|0;if((gz|0)==0){rS=rQ;rT=rY;rU=0;b7=2163;break L2992}else{rX=rY;rY=gz}}if((rQ|0)==(rZ|0)){r_=rY}else{rS=rQ;rT=rX;rU=rY;b7=2163}}}while(0);if((b7|0)==2163){b7=0;uE(dx|0,0,28);gz=ut(192)|0;if((gz|0)==0){gk();nd=ut(192)|0;if((nd|0)==0){b7=2165;break L27}else{r$=nd}}else{r$=gz}gz=r$;nd=r$;c[nd>>2]=0;c[r$+4>>2]=rS;c[r$+72>>2]=0;c[r$+88>>2]=0;uE(r$+8|0,0,60);c[r$+96>>2]=1;hG=r$+156|0;a[r$+184|0]=0;c[r$+144>>2]=4;c[r$+148>>2]=4;c[r$+152>>2]=4;c[hG>>2]=c[dx>>2];c[hG+4>>2]=c[dx+4>>2];c[hG+8>>2]=c[dx+8>>2];c[hG+12>>2]=c[dx+12>>2];c[hG+16>>2]=c[dx+16>>2];c[hG+20>>2]=c[dx+20>>2];c[hG+24>>2]=c[dx+24>>2];if((rT|0)==0){c[10822]=gz}else{c[rT>>2]=gz}c[nd>>2]=rU;r_=gz}gz=c[13898]|0;L3009:do{if((gz|0)<(c[8272]|0)){nd=c[1054]|0;L3011:do{if((a[nd+(gz*40&-1)|0]&1)!=0){hG=c[nd+(gz*40&-1)+36>>2]|0;gH=nd+(gz*40&-1)+32|0;gG=c[10036]|0;gE=0;while(1){if((gE|0)>=(hG|0)){break}if((a[gG+((c[gH>>2]|0)+gE|0)|0]|0)==(a[gE+103664|0]|0)){gE=gE+1|0}else{break L3011}}if((gE|0)==1){break L3009}}}while(0);jw(r_);nd=c[13898]|0;L3018:do{if((nd|0)<(c[8272]|0)){gH=c[1054]|0;L3020:do{if((a[gH+(nd*40&-1)|0]&1)!=0){gG=c[gH+(nd*40&-1)+36>>2]|0;hG=gH+(nd*40&-1)+32|0;hp=c[10036]|0;hF=0;while(1){if((hF|0)>=(gG|0)){break}if((a[hp+((c[hG>>2]|0)+hF|0)|0]|0)==(a[hF+103664|0]|0)){hF=hF+1|0}else{break L3020}}if((hF|0)==1){break L3018}}}while(0);a[14176]=1;is(a9);a[14176]=0;if((c[dC>>2]|0)!=3){c[13898]=nd;break}gH=c[dD>>2]|0;if((gH|0)==0){break}gE=r_+60|0;uu(c[gE>>2]|0);c[gE>>2]=gH}}while(0);nd=c[13898]|0;if((nd|0)>=(c[8272]|0)){break}gH=c[1054]|0;if((a[gH+(nd*40&-1)|0]&1)==0){break}gE=c[gH+(nd*40&-1)+36>>2]|0;hG=gH+(nd*40&-1)+32|0;nd=c[10036]|0;gH=0;while(1){if((gH|0)>=(gE|0)){b7=2191;break}if((a[nd+((c[hG>>2]|0)+gH|0)|0]|0)==(a[gH+103664|0]|0)){gH=gH+1|0}else{r0=0;break}}if((b7|0)==2191){b7=0;if((gH|0)==1){break}else{r0=0}}while(1){if((r0|0)>=(gE|0)){break}if((a[nd+((c[hG>>2]|0)+r0|0)|0]|0)==(a[r0+148464|0]|0)){r0=r0+1|0}else{break L3009}}if((r0|0)!=1){break}hG=r_+60|0;nd=c[hG>>2]|0;gE=(uA(nd|0)|0)+1|0;gH=ut(gE)|0;if((gH|0)==0){gk();hp=ut(gE)|0;if((hp|0)==0){b7=2198;break L27}else{r1=hp}}else{r1=gH}r2=nd;nd=0;r3=r1;gH=gE;hp=gE;gE=c[13898]|0;gG=c[1054]|0;L3047:while(1){gy=gE+1|0;c[13898]=gy;if((a[gG+(gy*40&-1)|0]&1)!=0){hw=a[(c[10036]|0)+(c[gG+(gy*40&-1)+32>>2]|0)|0]|0;if((hw<<24>>24|0)==39|(hw<<24>>24|0)==34){b7=2201;break L27}}hw=is(ba)|0;gy=c[hw>>2]|0;if((gy|0)==1){r4=+(c[hw+8>>2]|0)}else if((gy|0)==2){r4=+h[hw+8>>3]}else if((gy|0)==3){r4=+uz(c[hw+8>>2]|0,0)}else{b7=2206;break L27}if((c[dE>>2]|0)==3){uu(c[dF>>2]|0);c[dE>>2]=1}r5=(hp+30|0)+gH|0;r6=db(r3,r5,138416)|0;hw=r6+nd|0;ud(hw,r5-nd|0,r2,1.0,r4);r7=(uA(hw|0)|0)+nd|0;hw=c[13898]|0;gy=c[8272]|0;if((hw|0)>=(gy|0)){b7=2218;break}hS=c[1054]|0;if((a[hS+(hw*40&-1)|0]&1)==0){b7=2218;break}hC=c[hS+(hw*40&-1)+36>>2]|0;hB=hS+(hw*40&-1)+32|0;gx=c[10036]|0;gA=0;while(1){if((gA|0)>=(hC|0)){b7=2214;break}if((a[gx+((c[hB>>2]|0)+gA|0)|0]|0)==(a[gA+103664|0]|0)){gA=gA+1|0}else{r8=0;break}}if((b7|0)==2214){b7=0;if((gA|0)==1){b7=2218;break}else{r8=0}}while(1){if((r8|0)>=(hC|0)){break}if((a[gx+((c[hB>>2]|0)+r8|0)|0]|0)==(a[r8+148464|0]|0)){r8=r8+1|0}else{b7=2218;break L3047}}if((r8|0)!=1){b7=2218;break}hB=hw+1|0;c[13898]=hB;if((hB|0)>=(gy|0)){b7=5175;break L27}if((a[hS+(hB*40&-1)|0]&1)==0){b7=5176;break L27}hC=c[hS+(hB*40&-1)+36>>2]|0;gA=hS+(hB*40&-1)+32|0;ne=0;while(1){if((ne|0)>=(hC|0)){b7=2224;break}nh=c[gA>>2]|0;if((a[gx+(nh+ne|0)|0]|0)==(a[ne+103664|0]|0)){ne=ne+1|0}else{r9=nh;break}}if((b7|0)==2224){b7=0;if((ne|0)==1){b7=5177;break L27}r9=c[gA>>2]|0}gy=a[gx+r9|0]|0;if(!((gy<<24>>24|0)==39|(gy<<24>>24|0)==34)){b7=5178;break L27}if(hC>>>0>>0){sa=r2;sb=hp;sc=hB;sd=hS;se=hC}else{gy=db(r2,hC,138128)|0;hw=c[13898]|0;nh=c[1054]|0;sa=gy;sb=hC;sc=hw;sd=nh;se=c[nh+(hw*40&-1)+36>>2]|0}hw=se-2|0;nh=(hw|0)<(hC|0)?hw:hC-1|0;if((nh|0)>0){hw=c[sd+(sc*40&-1)+32>>2]|0;gy=0;while(1){gF=hw+1|0;ho=gy+1|0;a[sa+gy|0]=a[(c[10036]|0)+gF|0]|0;if((ho|0)==(nh|0)){sf=nh;break}else{hw=gF;gy=ho}}}else{sf=0}a[sa+sf|0]=0;if((a[(c[10036]|0)+(c[(c[1054]|0)+(sc*40&-1)+32>>2]|0)|0]|0)==34){ua(sa)}else{gy=sa;hw=sa;while(1){nh=a[hw]|0;if((nh<<24>>24|0)==39){hC=hw+1|0;hS=(a[hC]|0)==39?hC:hw;sg=hS;sh=a[hS]|0}else if((nh<<24>>24|0)==0){break}else{sg=hw;sh=nh}a[gy]=sh;gy=gy+1|0;hw=sg+1|0}a[gy]=0}hw=(c[13898]|0)+1|0;c[13898]=hw;if((hw|0)>=(c[8272]|0)){b7=2248;break}nh=c[1054]|0;if((a[nh+(hw*40&-1)|0]&1)==0){b7=2248;break}hS=c[nh+(hw*40&-1)+36>>2]|0;hC=nh+(hw*40&-1)+32|0;hB=c[10036]|0;gx=0;while(1){if((gx|0)>=(hS|0)){b7=2244;break}if((a[hB+((c[hC>>2]|0)+gx|0)|0]|0)==(a[gx+103664|0]|0)){gx=gx+1|0}else{si=0;break}}if((b7|0)==2244){b7=0;if((gx|0)==1){b7=2248;break}else{si=0}}while(1){if((si|0)>=(hS|0)){break}if((a[hB+((c[hC>>2]|0)+si|0)|0]|0)==(a[si+148464|0]|0)){si=si+1|0}else{b7=2248;break L3047}}if((si|0)==1){r2=sa;nd=r7;r3=r6;gH=r5;hp=sb;gE=hw;gG=nh}else{b7=2248;break}}if((b7|0)==2218){b7=0;uu(r2);sj=r6}else if((b7|0)==2248){b7=0;gG=db(r6,sb+r5|0,137840)|0;uB(gG+r7|0,sa|0);uu(sa);sj=gG}c[hG>>2]=sj}}while(0);jw(r_);}else if((gD|0)==33){gz=gv+1|0;c[13898]=gz;gG=c[8272]|0;L3116:do{if((gz|0)<(gG|0)){gE=a[gw+(gz*40&-1)|0]|0;L3118:do{if((gE&1)==0){sk=0;sl=gz;sm=gG;sn=gw;so=gE}else{hp=c[gw+(gz*40&-1)+36>>2]|0;gH=gw+(gz*40&-1)+32|0;nd=0;while(1){if((nd|0)>=(hp|0)){break}if((a[gB+((c[gH>>2]|0)+nd|0)|0]|0)==(a[nd+103664|0]|0)){nd=nd+1|0}else{sk=0;sl=gz;sm=gG;sn=gw;so=gE;break L3118}}if((nd|0)==1){break L3116}else{sk=0;sl=gz;sm=gG;sn=gw;so=gE}}}while(0);L3124:while(1){gE=(so&1)==0;L3126:do{if(!gE){hG=c[sn+(sl*40&-1)+36>>2]|0;gH=sn+(sl*40&-1)+32|0;hp=c[10036]|0;nh=0;while(1){if((nh|0)>=(hG|0)){break}if((a[hp+((c[gH>>2]|0)+nh|0)|0]|0)==(a[nh+103664|0]|0)){nh=nh+1|0}else{break L3126}}if((nh|0)==1){sp=sk;break L3124}}}while(0);if((sl|0)>=(sm|0)){b7=2271;break L27}L3134:do{if(!gE){nd=c[sn+(sl*40&-1)+36>>2]|0;gH=sn+(sl*40&-1)+32|0;hp=c[10036]|0;hG=0;while(1){if((hG|0)>=(nd|0)){break}if((a[hp+((c[gH>>2]|0)+hG|0)|0]|0)==(a[hG+103664|0]|0)){hG=hG+1|0}else{break L3134}}if((hG|0)==1){b7=2271;break L27}}}while(0);a[14176]=1;is(a7);a[14176]=0;if((c[dG>>2]|0)!=3){b7=2270;break L27}gE=c[dH>>2]|0;c[a8>>2]=gE;if((gE|0)==0){b7=2280;break L27}if((sk|0)==0){sq=0}else{sq=uA(sk|0)|0}iQ(a8);gE=c[a8>>2]|0;gH=db(sk,(sq+2|0)+(uA(gE|0)|0)|0,140360)|0;if((sq|0)==0){uB(gH|0,gE|0)}else{hp=gH+sq|0;nd=gH+(sq+1|0)|0;uB(nd|0,gE|0);a[hp]=58}uu(gE);gE=c[13898]|0;hp=c[8272]|0;if((gE|0)>=(hp|0)){sp=gH;break}nd=c[1054]|0;sk=gH;sl=gE;sm=hp;sn=nd;so=a[nd+(gE*40&-1)|0]|0}if((sp|0)==0){break L44}uq(4,sp);uu(sp);break L44}}while(0);uq(32,0)}else if((gD|0)==34){sr=gv+1|0;c[13898]=sr;L3155:do{if((sr|0)<(c[8272]|0)){L3157:do{if((a[gw+(sr*40&-1)|0]&1)!=0){gG=c[gw+(sr*40&-1)+36>>2]|0;gz=gw+(sr*40&-1)+32|0;gE=0;while(1){if((gE|0)>=(gG|0)){b7=2289;break}if((a[gB+((c[gz>>2]|0)+gE|0)|0]|0)==(a[gE+103664|0]|0)){gE=gE+1|0}else{ss=0;break}}if((b7|0)==2289){b7=0;if((gE|0)==1){break L3155}else{ss=0}}while(1){if((ss|0)>=(gG|0)){break}if((a[gB+((c[gz>>2]|0)+ss|0)|0]|0)==(a[ss+103664|0]|0)){ss=ss+1|0}else{break L3157}}if((ss|0)==1){st=sr;b7=5181;break L27}}}while(0);a[14176]=1;is(a6);a[14176]=0;if((c[dI>>2]|0)!=3){b7=2297;break L27}gz=c[dJ>>2]|0;if((gz|0)==0){b7=2299;break L27}us(4,gz);uu(gz);break L44}}while(0);uu(c[12908]|0);bA(5,179864);bA(2,179864);gz=bA(5,0)|0;if((gz|0)==0){su=0}else{su=bP(gz|0)|0}c[12908]=su}else if((gD|0)==35){uE(dK|0,0,11);gz=gv+1|0;c[13898]=gz;gG=c[8272]|0;L3176:do{if((gz|0)<(gG|0)){gE=c[gw+(gz*40&-1)+36>>2]|0;L3178:do{if((a[gw+(gz*40&-1)|0]&1)!=0){nd=gw+(gz*40&-1)+32|0;hp=0;while(1){if((hp|0)>=(gE|0)){break}if((a[gB+((c[nd>>2]|0)+hp|0)|0]|0)==(a[hp+103664|0]|0)){hp=hp+1|0}else{break L3178}}if((hp|0)==1){b7=2308;break L3176}}}while(0);if((gE|0)>0){sv=gw+(gz*40&-1)+32|0;nd=c[sv>>2]|0;gH=0;do{sw=gH+nd|0;nh=gB+sw|0;hF=a[nh]|0;do{if(hF<<24>>24==114){sx=7}else{if((a_(nh|0,108208,2)|0)==0){sx=6;break}if((a_(nh|0,108120,2)|0)==0){sx=5;break}if((a_(nh|0,124768,2)|0)==0){sx=4;break}if((a_(nh|0,88416,2)|0)==0){sx=3;break}if(hF<<24>>24==120){sx=2;break}if(hF<<24>>24==121){sx=1;break}if(hF<<24>>24==122){sx=0}else{b7=2312;break L27}}}while(0);a[a5+(c[56724+(sx<<3)>>2]|0)|0]=1;gH=(uA(c[56720+(sx<<3)>>2]|0)|0)+gH|0;}while((gH|0)<(gE|0))}gE=gv+2|0;c[13898]=gE;if((gE|0)>=(gG|0)){sy=10.0;break}L3200:do{if((a[gw+(gE*40&-1)|0]&1)!=0){gH=c[gw+(gE*40&-1)+36>>2]|0;nd=gw+(gE*40&-1)+32|0;hF=0;while(1){if((hF|0)>=(gH|0)){break}if((a[gB+((c[nd>>2]|0)+hF|0)|0]|0)==(a[hF+103664|0]|0)){hF=hF+1|0}else{break L3200}}if((hF|0)==1){sy=10.0;break L3176}}}while(0);gE=is(a4)|0;nd=c[gE>>2]|0;if((nd|0)==1){sz=+(c[gE+8>>2]|0)}else if((nd|0)==2){sz=+h[gE+8>>3]}else if((nd|0)==3){sz=+uz(c[gE+8>>2]|0,0)}else{b7=2324;break L27}if((c[dL>>2]|0)==3){uu(c[dM>>2]|0);c[dL>>2]=1}m3=+P(+sz);if(m3>1.0){sy=m3}else{b7=2328;break L27}}else{b7=2308}}while(0);if((b7|0)==2308){b7=0;uE(dK|0,1,7);sy=10.0}gG=0;L3218:do{do{if((a[a5+gG|0]&1)!=0){a[64788+(gG*688&-1)|0]=1;h[64792+(gG*688&-1)>>3]=sy;h[64800+(gG*688&-1)>>3]=+_(+sy);if((gG|0)!=7){break}if((a[30528]&1)==0){break L3218}ju()}}while(0);gG=gG+1|0;}while((gG|0)<8);c[6928]=0}else if((gD|0)==36){c[13898]=gv+1;a[43472]=1}else if((gD|0)==37){sA=gv+1|0;c[13898]=sA;L3228:do{if((sA|0)<(c[8272]|0)){if((a[gw+(sA*40&-1)|0]&1)==0){b7=5184;break L27}gG=c[gw+(sA*40&-1)+36>>2]|0;gz=gw+(sA*40&-1)+32|0;gE=0;while(1){if((gE|0)>=(gG|0)){b7=2349;break}nd=c[gz>>2]|0;if((a[gB+(nd+gE|0)|0]|0)==(a[gE+103664|0]|0)){gE=gE+1|0}else{sB=nd;break}}if((b7|0)==2349){b7=0;if((gE|0)==1){b7=2351;break}sB=c[gz>>2]|0}if((gG|0)>0){sC=0;sD=0;sE=sB}else{b7=5185;break L27}while(1){if((a[sC+141752|0]|0)==(a[gB+(sC+sE|0)|0]|0)){sF=sE;sG=sD}else{if((sC|0)!=2){sH=0;sI=0;sJ=sB;break}sF=sE-1|0;sG=1}nd=sC+1|0;if((nd|0)<(sG+gG|0)){sC=nd;sD=sG;sE=sF}else{b7=2357;break}}do{if((b7|0)==2357){b7=0;if((sG|0)==0){if(!((sC|0)==1|(sC|0)==9)){sH=0;sI=0;sJ=sB;break}}c[8732]=0;break L3228}}while(0);while(1){if((a[sH+141560|0]|0)==(a[gB+(sH+sJ|0)|0]|0)){sK=sJ;sL=sI}else{if((sH|0)!=1){sM=0;sN=0;sO=sB;break}sK=sJ-1|0;sL=1}gz=sH+1|0;if((gz|0)<(sL+gG|0)){sH=gz;sI=sL;sJ=sK}else{b7=2364;break}}do{if((b7|0)==2364){b7=0;if((sL|0)==0){if(!((sH|0)==0|(sH|0)==9)){sM=0;sN=0;sO=sB;break}}c[8732]=1;break L3228}}while(0);while(1){if((a[sM+141376|0]|0)==(a[gB+(sM+sO|0)|0]|0)){sP=sO;sQ=sN}else{if((sM|0)!=2){b7=5186;break L27}sP=sO-1|0;sQ=1}gz=sM+1|0;if((gz|0)<(sQ+gG|0)){sM=gz;sN=sQ;sO=sP}else{break}}if((sQ|0)==0){if(!((sM|0)==1|(sM|0)==11)){b7=5187;break L27}}c[8732]=2}else{b7=2351}}while(0);if((b7|0)==2351){b7=0;c[8732]=0}c[13898]=gv+2}else if((gD|0)==42){js(56400)}else if((gD|0)==39){js(35144)}else if((gD|0)==40){js(26392)}else if((gD|0)==41){js(4264)}else if((gD|0)==15){sR=gv+1|0;c[13898]=sR;gG=c[gw+(sR*40&-1)+36>>2]|0;gz=c[gw+(sR*40&-1)+32>>2]|0;gE=(a[gw+(sR*40&-1)|0]&1)==0;if((gG|0)>0&(gE^1)){sS=0;sT=0;sU=gz}else{b7=5195;break L27}while(1){if((a[sS+210832|0]|0)==(a[gB+(sS+sU|0)|0]|0)){sV=sU;sW=sT}else{if((sS|0)!=4){break}sV=sU-1|0;sW=1}nd=sS+1|0;if((nd|0)<(sW+gG|0)){sS=nd;sT=sW;sU=sV}else{b7=2385;break}}do{if((b7|0)==2385){b7=0;if((sW|0)==0){if(!((sS|0)==3|(sS|0)==7)){break}}sX=gv+2|0;c[13898]=sX;L3289:do{if((sX|0)<(c[8272]|0)){L3291:do{if((a[gw+(sX*40&-1)|0]&1)!=0){nd=c[gw+(sX*40&-1)+36>>2]|0;gH=gw+(sX*40&-1)+32|0;nh=0;while(1){if((nh|0)>=(nd|0)){b7=2392;break}if((a[gB+((c[gH>>2]|0)+nh|0)|0]|0)==(a[nh+103664|0]|0)){nh=nh+1|0}else{sY=0;break}}if((b7|0)==2392){b7=0;if((nh|0)==1){break L3289}else{sY=0}}while(1){if((sY|0)>=(nd|0)){break}if((a[gB+((c[gH>>2]|0)+sY|0)|0]|0)==(a[sY+103664|0]|0)){sY=sY+1|0}else{break L3291}}if((sY|0)==1){b7=2399;break L27}}}while(0);a[14176]=1;is(a3);a[14176]=0;if((c[dP>>2]|0)!=3){b7=2398;break L27}hF=c[dQ>>2]|0;c[8528]=hF;if((hF|0)==0){b7=2401;break L27}else{break L44}}}while(0);uu(c[8528]|0);c[8528]=0;break L44}}while(0);if(gE){b7=5196;break L27}L3307:do{if((gG|0)>0){hF=0;gH=0;nd=gz;while(1){if((a[hF+209008|0]|0)==(a[gB+(hF+nd|0)|0]|0)){sZ=nd;s_=gH}else{if((hF|0)!=3){break L3307}sZ=nd-1|0;s_=1}nh=hF+1|0;if((nh|0)<(s_+gG|0)){hF=nh;gH=s_;nd=sZ}else{break}}if((s_|0)==0){if(!((hF|0)==2|(hF|0)==9)){break}}s$=gv+2|0;c[13898]=s$;do{if((s$|0)<(c[8272]|0)){if((a[gw+(s$*40&-1)|0]&1)==0){b7=5190;break L27}nd=c[gw+(s$*40&-1)+36>>2]|0;gH=gw+(s$*40&-1)+32|0;nh=0;while(1){if((nh|0)>=(nd|0)){b7=2416;break}hG=c[gH>>2]|0;if((a[gB+(hG+nh|0)|0]|0)==(a[nh+103664|0]|0)){nh=nh+1|0}else{s0=hG;break}}if((b7|0)==2416){b7=0;if((nh|0)==1){break}s0=c[gH>>2]|0}L3328:do{if((nd|0)>0){hG=0;hp=0;hw=s0;while(1){if((a[hG+142688|0]|0)==(a[gB+(hG+hw|0)|0]|0)){s1=hw;s2=hp}else{if((hG|0)!=5){b7=2427;break L3328}s1=hw-1|0;s2=1}hC=hG+1|0;if((hC|0)<(s2+nd|0)){hG=hC;hp=s2;hw=s1}else{break}}if((s2|0)==0){if(!((hG|0)==4|(hG|0)==10)){b7=2427;break}}a[47120]=0}else{b7=2427}}while(0);L3339:do{if((b7|0)==2427){b7=0;gH=a[gB+s0|0]|0;if((gH<<24>>24|0)==39|(gH<<24>>24|0)==34){s3=0}else{b7=5191;break L27}while(1){if((s3|0)>=(nd|0)){b7=2431;break}if((a[gB+(s3+s0|0)|0]|0)==(a[s3+142432|0]|0)){s3=s3+1|0}else{s4=0;b7=2432;break}}if((b7|0)==2431){b7=0;if((s3|0)!=4){s4=0;b7=2432}}do{if((b7|0)==2432){while(1){b7=0;if((s4|0)>=(nd|0)){b7=2434;break}if((a[gB+(s4+s0|0)|0]|0)==(a[s4+142280|0]|0)){s4=s4+1|0;b7=2432}else{break}}if((b7|0)==2434){b7=0;if((s4|0)==4){break}}if(gH<<24>>24!=(a[gB+(s0+2|0)|0]|0)){b7=2437;break L27}a[47120]=a[gB+(s0+1|0)|0]|0;break L3339}}while(0);a[47120]=9}}while(0);c[13898]=gv+3;break L44}}while(0);a[47120]=0;break L44}}while(0);if((gG|0)>0&(gE^1)){s5=0;s6=0;s7=gz}else{b7=5197;break L27}while(1){if((a[s5+97920|0]|0)==(a[gB+(s5+s7|0)|0]|0)){s8=s7;s9=s6}else{if((s5|0)!=3){break}s8=s7-1|0;s9=1}hF=s5+1|0;if((hF|0)<(s9+gG|0)){s5=hF;s6=s9;s7=s8}else{b7=2445;break}}do{if((b7|0)==2445){b7=0;if((s9|0)==0){if(!((s5|0)==2|(s5|0)==13)){break}}ta=gv+2|0;c[13898]=ta;L3369:do{if((ta|0)<(c[8272]|0)){L3371:do{if((a[gw+(ta*40&-1)|0]&1)!=0){hF=c[gw+(ta*40&-1)+36>>2]|0;nd=gw+(ta*40&-1)+32|0;gH=0;while(1){if((gH|0)>=(hF|0)){b7=2452;break}if((a[gB+((c[nd>>2]|0)+gH|0)|0]|0)==(a[gH+103664|0]|0)){gH=gH+1|0}else{tb=0;break}}if((b7|0)==2452){b7=0;if((gH|0)==1){b7=2453;break L3369}else{tb=0}}while(1){if((tb|0)>=(hF|0)){break}if((a[gB+((c[nd>>2]|0)+tb|0)|0]|0)==(a[tb+103664|0]|0)){tb=tb+1|0}else{break L3371}}if((tb|0)==1){tc=ta;b7=5192;break L27}}}while(0);a[14176]=1;is(a2);a[14176]=0;if((c[dN>>2]|0)!=3){b7=2458;break L27}nd=c[dO>>2]|0;if((nd|0)==0){b7=2460;break L27}uu(c[11948]|0);td=nd}else{b7=2453}}while(0);if((b7|0)==2453){b7=0;uu(c[11948]|0);td=bP(199184)|0}c[11948]=td;break L44}}while(0);if(gE){b7=5198;break L27}L3390:do{if((gG|0)>0){nd=0;hF=0;gH=gz;while(1){if((a[nd+204608|0]|0)==(a[gB+(nd+gH|0)|0]|0)){te=gH;tf=hF}else{if((nd|0)!=3){break L3390}te=gH-1|0;tf=1}hK=nd+1|0;if((hK|0)<(tf+gG|0)){nd=hK;hF=tf;gH=te}else{break}}if((tf|0)==0){if(!((nd|0)==2|(nd|0)==6)){break}}eP();break L44}}while(0);if((gG|0)>0&(gE^1)){tg=0;th=0;ti=gz}else{b7=5199;break L27}while(1){if((a[tg+115448|0]|0)==(a[gB+(tg+ti|0)|0]|0)){tj=ti;tk=th}else{if((tg|0)!=4){break}tj=ti-1|0;tk=1}gH=tg+1|0;if((gH|0)<(tk+gG|0)){tg=gH;th=tk;ti=tj}else{b7=2478;break}}do{if((b7|0)==2478){b7=0;if((tk|0)==0){if(!((tg|0)==3|(tg|0)==7)){break}}a[47712]=1;c[13898]=gv+2;break L44}}while(0);if(gE){b7=5200;break L27}L3415:do{if((gG|0)>0){gH=0;hF=0;hK=gz;while(1){if((a[gH+76296|0]|0)==(a[gB+(gH+hK|0)|0]|0)){tl=hK;tm=hF}else{if((gH|0)!=6){break L3415}tl=hK-1|0;tm=1}hG=gH+1|0;if((hG|0)<(tm+gG|0)){gH=hG;hF=tm;hK=tl}else{break}}if((tm|0)==0){if(!((gH|0)==5|(gH|0)==9)){break}}a[47712]=0;c[13898]=gv+2;break L44}}while(0);if((gG|0)>0&(gE^1)){tn=0}else{b7=5201;break L27}while(1){if((a[tn+223696|0]|0)!=(a[gB+(tn+gz|0)|0]|0)){break}to=tn+1|0;if((to|0)<(gG|0)){tn=to}else{b7=2493;break}}do{if((b7|0)==2493){b7=0;if((to|0)!=8){break}a[47472]=0;c[13898]=gv+2;break L44}}while(0);if((gG|0)>0&(gE^1)){tp=0}else{b7=5202;break L27}do{if((a[tp+216640|0]|0)!=(a[gB+(tp+gz|0)|0]|0)){b7=5203;break L27}tp=tp+1|0;}while((tp|0)<(gG|0));if((tp|0)!=10){b7=5204;break L27}a[47472]=1;c[13898]=gv+2}else if((gD|0)==44){gG=gv+1|0;c[13898]=gG;c[8496]=1;gz=c[8272]|0;if((gG|0)<(gz|0)){tq=gG;tr=gz;ts=gw}else{break}L3440:while(1){tt=c[ts+(tq*40&-1)+36>>2]|0;tu=ts+(tq*40&-1)+32|0;if((a[ts+(tq*40&-1)|0]&1)==0){b7=2503;break}gz=c[10036]|0;gG=0;while(1){if((gG|0)>=(tt|0)){b7=2507;break}gE=c[tu>>2]|0;if((a[gz+(gE+gG|0)|0]|0)==(a[gG+103664|0]|0)){gG=gG+1|0}else{tv=gE;break}}if((b7|0)==2507){b7=0;if((gG|0)==1){break L44}tv=c[tu>>2]|0}if((tt|0)>0){tw=0;tx=0;ty=tv}else{tz=tv;tA=0;break}while(1){if((a[tw+148208|0]|0)==(a[gz+(tw+ty|0)|0]|0)){tB=ty;tC=tx}else{if((tw|0)!=2){tD=0;tE=0;tF=tv;b7=2525;break}tB=ty-1|0;tC=1}gH=tw+1|0;if((gH|0)<(tC+tt|0)){tw=gH;tx=tC;ty=tB}else{b7=2514;break}}do{if((b7|0)==2514){b7=0;if((tC|0)==0){if(!((tw|0)==11|(tw|0)==1)){tD=0;tE=0;tF=tv;b7=2525;break}}c[13898]=tq+1;gG=is(a$)|0;gH=c[gG>>2]|0;if((gH|0)==1){tG=+(c[gG+8>>2]|0)}else if((gH|0)==2){tG=+h[gG+8>>3]}else if((gH|0)==3){tG=+uz(c[gG+8>>2]|0,0)}else{b7=2520;break L27}if((c[d5>>2]|0)==3){uu(c[d6>>2]|0);c[d5>>2]=1}gG=~~tG;c[8497]=gG;if((gG|0)>=0){break}c[8497]=0}}while(0);L3470:do{if((b7|0)==2525){while(1){b7=0;if((a[tD+148024|0]|0)==(a[gz+(tD+tF|0)|0]|0)){tH=tF;tI=tE}else{if((tD|0)!=4){tJ=0;tK=0;tL=tv;break}tH=tF-1|0;tI=1}gG=tD+1|0;if((gG|0)<(tI+tt|0)){tD=gG;tE=tI;tF=tH;b7=2525}else{b7=2529;break}}do{if((b7|0)==2529){b7=0;if((tI|0)==0){if(!((tD|0)==3|(tD|0)==13)){tJ=0;tK=0;tL=tv;break}}c[8497]=0;c[13898]=tq+1;break L3470}}while(0);while(1){if((a[tJ+147832|0]|0)==(a[gz+(tJ+tL|0)|0]|0)){tM=tL;tN=tK}else{if((tJ|0)!=6){tO=0;tP=0;tQ=tv;break}tM=tL-1|0;tN=1}gG=tJ+1|0;if((gG|0)<(tN+tt|0)){tJ=gG;tK=tN;tL=tM}else{b7=2538;break}}do{if((b7|0)==2538){b7=0;if((tN|0)==0){if(!((tJ|0)==5|(tJ|0)==15)){tO=0;tP=0;tQ=tv;break}}c[8498]=1;c[13898]=tq+1;break L3470}}while(0);while(1){if((a[tO+147576|0]|0)==(a[gz+(tO+tQ|0)|0]|0)){tR=tQ;tS=tP}else{if((tO|0)!=8){tT=0;tU=0;tV=tv;break}tR=tQ-1|0;tS=1}gG=tO+1|0;if((gG|0)<(tS+tt|0)){tO=gG;tP=tS;tQ=tR}else{b7=2545;break}}do{if((b7|0)==2545){b7=0;if((tS|0)==0){if(!((tO|0)==7|(tO|0)==17)){tT=0;tU=0;tV=tv;break}}c[8498]=0;c[13898]=tq+1;break L3470}}while(0);while(1){if((a[tT+147296|0]|0)==(a[gz+(tT+tV|0)|0]|0)){tW=tV;tX=tU}else{if((tT|0)!=2){tY=0;tZ=0;t_=tv;break}tW=tV-1|0;tX=1}gG=tT+1|0;if((gG|0)<(tX+tt|0)){tT=gG;tU=tX;tV=tW}else{b7=2552;break}}do{if((b7|0)==2552){b7=0;if((tX|0)==0){if(!((tT|0)==1|(tT|0)==16)){tY=0;tZ=0;t_=tv;break}}c[8500]=1;hM();c[13898]=(c[13898]|0)+1;break L3470}}while(0);while(1){if((a[tY+147040|0]|0)==(a[gz+(tY+t_|0)|0]|0)){t$=t_;t0=tZ}else{if((tY|0)!=14){t1=0;t2=0;t3=tv;break}t$=t_-1|0;t0=1}gG=tY+1|0;if((gG|0)<(t0+tt|0)){tY=gG;tZ=t0;t_=t$}else{b7=2559;break}}do{if((b7|0)==2559){b7=0;if((t0|0)==0){if(!((tY|0)==13|(tY|0)==16)){t1=0;t2=0;t3=tv;break}}c[8500]=2;hM();c[13898]=(c[13898]|0)+1;break L3470}}while(0);while(1){if((a[t1+146800|0]|0)==(a[gz+(t1+t3|0)|0]|0)){t4=t3;t6=t2}else{if((t1|0)!=4){t7=0;t8=0;t9=tv;break}t4=t3-1|0;t6=1}gG=t1+1|0;if((gG|0)<(t6+tt|0)){t1=gG;t2=t6;t3=t4}else{b7=2566;break}}do{if((b7|0)==2566){b7=0;if((t6|0)==0){if(!((t1|0)==3|(t1|0)==15)){t7=0;t8=0;t9=tv;break}}c[8500]=0;hM();c[13898]=(c[13898]|0)+1;break L3470}}while(0);while(1){if((a[t7+146616|0]|0)==(a[gz+(t7+t9|0)|0]|0)){ub=t9;uc=t8}else{if((t7|0)!=5){ue=0;ug=0;ui=tv;break}ub=t9-1|0;uc=1}gG=t7+1|0;if((gG|0)<(uc+tt|0)){t7=gG;t8=uc;t9=ub}else{b7=2573;break}}do{if((b7|0)==2573){b7=0;if((uc|0)==0){if(!((t7|0)==4|(t7|0)==6)){ue=0;ug=0;ui=tv;break}}c[8499]=1;gG=tq+1|0;c[13898]=gG;gH=(a[ts+(gG*40&-1)|0]&1)==0;if(gH){b7=2577}else{gE=a[gz+(c[ts+(gG*40&-1)+32>>2]|0)|0]|0;if(!((gE<<24>>24|0)==39|(gE<<24>>24|0)==34)){b7=2577}}if((b7|0)==2577){b7=0;gE=c[10810]|0;if((gE|0)==0){break L3470}hK=ts+(gG*40&-1)+36|0;hF=ts+(gG*40&-1)+32|0;nd=(tr|0)<=(gG|0)|gH;gH=gE;L3553:while(1){gE=c[gH+4>>2]|0;L3555:do{if(!nd){gG=c[hK>>2]|0;hG=0;while(1){if((hG|0)>=(gG|0)){break}if((a[gz+((c[hF>>2]|0)+hG|0)|0]|0)==(a[gE+hG|0]|0)){hG=hG+1|0}else{break L3555}}if((a[gE+hG|0]|0)==0){break L3553}}}while(0);gE=c[gH>>2]|0;if((gE|0)==0){break L3470}else{gH=gE}}if((a[gH+8|0]&1)!=0){break L3470}if((c[gH+16>>2]|0)!=3){break L3470}}uu(c[8504]|0);hF=c[13898]|0;L3565:do{if((hF|0)<(c[8272]|0)){hK=c[1054]|0;L3567:do{if((a[hK+(hF*40&-1)|0]&1)!=0){nd=c[hK+(hF*40&-1)+36>>2]|0;gE=hK+(hF*40&-1)+32|0;gG=c[10036]|0;gC=0;while(1){if((gC|0)>=(nd|0)){break}if((a[gG+((c[gE>>2]|0)+gC|0)|0]|0)==(a[gC+103664|0]|0)){gC=gC+1|0}else{break L3567}}if((gC|0)==1){ul=0;break L3565}}}while(0);a[14176]=1;is(aV);a[14176]=0;if((c[d3>>2]|0)==3){ul=c[d4>>2]|0;break}else{c[13898]=hF;ul=0;break}}else{ul=0}}while(0);c[8504]=ul;break L3470}}while(0);while(1){if((a[ue+146440|0]|0)==(a[gz+(ue+ui|0)|0]|0)){um=ui;un=ug}else{if((ue|0)!=4){uo=0;up=0;uv=tv;break}um=ui-1|0;un=1}hF=ue+1|0;if((hF|0)<(un+tt|0)){ue=hF;ug=un;ui=um}else{b7=2601;break}}do{if((b7|0)==2601){b7=0;if((un|0)==0){if(!((ue|0)==3|(ue|0)==8)){uo=0;up=0;uv=tv;break}}c[8499]=0;c[13898]=tq+1;break L3470}}while(0);while(1){if((a[uo+146248|0]|0)==(a[gz+(uo+uv|0)|0]|0)){uw=uv;ux=up}else{if((uo|0)!=2){uy=0;uC=0;uG=tv;break}uw=uv-1|0;ux=1}hF=uo+1|0;if((hF|0)<(ux+tt|0)){uo=hF;up=ux;uv=uw}else{b7=2608;break}}do{if((b7|0)==2608){b7=0;if((ux|0)==0){if(!((uo|0)==1|(uo|0)==7)){uy=0;uC=0;uG=tv;break}}c[8501]=1;c[13898]=tq+1;break L3470}}while(0);while(1){if((a[uy+146080|0]|0)==(a[gz+(uy+uG|0)|0]|0)){uH=uG;uI=uC}else{if((uy|0)!=4){uJ=0;uK=0;uL=tv;break}uH=uG-1|0;uI=1}hF=uy+1|0;if((hF|0)<(uI+tt|0)){uy=hF;uC=uI;uG=uH}else{b7=2615;break}}do{if((b7|0)==2615){b7=0;if((uI|0)==0){if(!((uy|0)==3|(uy|0)==9)){uJ=0;uK=0;uL=tv;break}}c[8501]=0;c[13898]=tq+1;break L3470}}while(0);while(1){if((a[uJ+145928|0]|0)==(a[gz+(uJ+uL|0)|0]|0)){uM=uL;uN=uK}else{if((uJ|0)!=6){uO=0;uP=0;uQ=tv;break}uM=uL-1|0;uN=1}hF=uJ+1|0;if((hF|0)<(uN+tt|0)){uJ=hF;uK=uN;uL=uM}else{b7=2622;break}}do{if((b7|0)==2622){b7=0;if((uN|0)==0){if(!((uJ|0)==5|(uJ|0)==8)){uO=0;uP=0;uQ=tv;break}}c[8502]=1;c[13898]=tq+1;break L3470}}while(0);while(1){if((a[uO+145688|0]|0)==(a[gz+(uO+uQ|0)|0]|0)){uR=uQ;uS=uP}else{if((uO|0)!=8){uT=0;uU=0;uV=tv;break}uR=uQ-1|0;uS=1}hF=uO+1|0;if((hF|0)<(uS+tt|0)){uO=hF;uP=uS;uQ=uR}else{b7=2629;break}}do{if((b7|0)==2629){b7=0;if((uS|0)==0){if(!((uO|0)==7|(uO|0)==10)){uT=0;uU=0;uV=tv;break}}c[8502]=0;c[13898]=tq+1;break L3470}}while(0);while(1){if((a[uT+78872|0]|0)==(a[gz+(uT+uV|0)|0]|0)){uW=uV;uX=uU}else{if((uT|0)!=2){uY=0;uZ=0;u_=tv;break}uW=uV-1|0;uX=1}hF=uT+1|0;if((hF|0)<(uX+tt|0)){uT=hF;uU=uX;uV=uW}else{b7=2636;break}}do{if((b7|0)==2636){b7=0;if((uX|0)==0){if(!((uT|0)==6|(uT|0)==1)){uY=0;uZ=0;u_=tv;break}}hF=tq+1|0;c[13898]=hF;gH=(a[ts+(hF*40&-1)|0]&1)==0;if(gH){b7=2640}else{hK=a[gz+(c[ts+(hF*40&-1)+32>>2]|0)|0]|0;if(!((hK<<24>>24|0)==39|(hK<<24>>24|0)==34)){b7=2640}}L3646:do{if((b7|0)==2640){b7=0;hK=c[10810]|0;L3648:do{if((hK|0)!=0){gE=ts+(hF*40&-1)+36|0;gG=ts+(hF*40&-1)+32|0;nd=(tr|0)<=(hF|0)|gH;hG=hK;L3650:while(1){nh=c[hG+4>>2]|0;L3652:do{if(!nd){hw=c[gE>>2]|0;hp=0;while(1){if((hp|0)>=(hw|0)){break}if((a[gz+((c[gG>>2]|0)+hp|0)|0]|0)==(a[nh+hp|0]|0)){hp=hp+1|0}else{break L3652}}if((a[nh+hp|0]|0)==0){break L3650}}}while(0);nh=c[hG>>2]|0;if((nh|0)==0){break L3648}else{hG=nh}}if((a[hG+8|0]&1)!=0){break}if((c[hG+16>>2]|0)==3){break L3646}}}while(0);c[8503]=34032;break L3470}}while(0);gH=c[8503]|0;if((gH|0)==34032){u$=hF;u0=tr}else{uu(gH);u$=c[13898]|0;u0=c[8272]|0}L3666:do{if((u$|0)<(u0|0)){gH=c[1054]|0;L3668:do{if((a[gH+(u$*40&-1)|0]&1)!=0){hK=c[gH+(u$*40&-1)+36>>2]|0;gG=gH+(u$*40&-1)+32|0;gE=c[10036]|0;nd=0;while(1){if((nd|0)>=(hK|0)){break}if((a[gE+((c[gG>>2]|0)+nd|0)|0]|0)==(a[nd+103664|0]|0)){nd=nd+1|0}else{break L3668}}if((nd|0)==1){u1=0;break L3666}}}while(0);a[14176]=1;is(aR);a[14176]=0;if((c[d1>>2]|0)==3){u1=c[d2>>2]|0;break}else{c[13898]=u$;u1=0;break}}else{u1=0}}while(0);c[8503]=u1;break L3470}}while(0);while(1){if((a[uY+145232|0]|0)==(a[gz+(uY+u_|0)|0]|0)){u2=u_;u3=uZ}else{if((uY|0)!=2){u4=0;u5=0;u6=tv;break}u2=u_-1|0;u3=1}hF=uY+1|0;if((hF|0)<(u3+tt|0)){uY=hF;uZ=u3;u_=u2}else{b7=2667;break}}do{if((b7|0)==2667){b7=0;if((u3|0)==0){if(!((uY|0)==15|(uY|0)==1)){u4=0;u5=0;u6=tv;break}}hF=tq+1|0;c[13898]=hF;gH=(a[ts+(hF*40&-1)|0]&1)==0;if(gH){b7=2671}else{gG=a[gz+(c[ts+(hF*40&-1)+32>>2]|0)|0]|0;if(!((gG<<24>>24|0)==39|(gG<<24>>24|0)==34)){b7=2671}}L3692:do{if((b7|0)==2671){b7=0;gG=c[10810]|0;L3694:do{if((gG|0)!=0){gE=ts+(hF*40&-1)+36|0;hK=ts+(hF*40&-1)+32|0;hG=(tr|0)<=(hF|0)|gH;gC=gG;L3696:while(1){nh=c[gC+4>>2]|0;L3698:do{if(!hG){hR=c[gE>>2]|0;hw=0;while(1){if((hw|0)>=(hR|0)){break}if((a[gz+((c[hK>>2]|0)+hw|0)|0]|0)==(a[nh+hw|0]|0)){hw=hw+1|0}else{break L3698}}if((a[nh+hw|0]|0)==0){break L3696}}}while(0);nh=c[gC>>2]|0;if((nh|0)==0){break L3694}else{gC=nh}}if((a[gC+8|0]&1)!=0){break}if((c[gC+16>>2]|0)==3){break L3692}}}while(0);gG=is(aP)|0;hK=c[gG>>2]|0;if((hK|0)==1){u7=+(c[gG+8>>2]|0)}else if((hK|0)==2){u7=+h[gG+8>>3]}else if((hK|0)==3){u7=+uz(c[gG+8>>2]|0,0)}else{b7=2698;break L27}if((c[dZ>>2]|0)==3){uu(c[d_>>2]|0);c[dZ>>2]=1}gG=~~u7;if(gG>>>0<7){c[13532]=gG;break L3470}else{gG=c[m>>2]|0;cf(gG|0,144712,(v=i,i=i+16|0,c[v>>2]=0,c[v+8>>2]=6,v)|0);break L3470}}}while(0);uu(c[13534]|0);gH=c[13898]|0;L3720:do{if((gH|0)<(c[8272]|0)){hF=c[1054]|0;L3722:do{if((a[hF+(gH*40&-1)|0]&1)!=0){gG=c[hF+(gH*40&-1)+36>>2]|0;hK=hF+(gH*40&-1)+32|0;gE=c[10036]|0;hG=0;while(1){if((hG|0)>=(gG|0)){break}if((a[gE+((c[hK>>2]|0)+hG|0)|0]|0)==(a[hG+103664|0]|0)){hG=hG+1|0}else{break L3722}}if((hG|0)==1){u8=0;break L3720}}}while(0);a[14176]=1;is(aO);a[14176]=0;if((c[d$>>2]|0)==3){u8=c[d0>>2]|0;break}else{c[13898]=gH;u8=0;break}}else{u8=0}}while(0);c[13534]=u8;if((a[u8]|0)!=0){c[13532]=7;break L3470}uu(u8);c[13534]=0;if((c[8506]|0)!=7){break L3470}c[8506]=0;break L3470}}while(0);while(1){if((a[u4+144456|0]|0)==(a[gz+(u4+u6|0)|0]|0)){u9=u6;va=u5}else{if((u4|0)!=2){vb=0;vc=0;vd=tv;break}u9=u6-1|0;va=1}gH=u4+1|0;if((gH|0)<(va+tt|0)){u4=gH;u5=va;u6=u9}else{b7=2708;break}}do{if((b7|0)==2708){b7=0;if((va|0)==0){if(!((u4|0)==11|(u4|0)==1)){vb=0;vc=0;vd=tv;break}}gH=tq+1|0;c[13898]=gH;hF=(a[ts+(gH*40&-1)|0]&1)==0;if(hF){b7=2712}else{hK=a[gz+(c[ts+(gH*40&-1)+32>>2]|0)|0]|0;if(!((hK<<24>>24|0)==39|(hK<<24>>24|0)==34)){b7=2712}}L3750:do{if((b7|0)==2712){b7=0;hK=c[10810]|0;L3752:do{if((hK|0)!=0){gE=ts+(gH*40&-1)+36|0;gG=ts+(gH*40&-1)+32|0;gC=(tr|0)<=(gH|0)|hF;nd=hK;L3754:while(1){nh=c[nd+4>>2]|0;L3756:do{if(!gC){hR=c[gE>>2]|0;hp=0;while(1){if((hp|0)>=(hR|0)){break}if((a[gz+((c[gG>>2]|0)+hp|0)|0]|0)==(a[nh+hp|0]|0)){hp=hp+1|0}else{break L3756}}if((a[nh+hp|0]|0)==0){break L3754}}}while(0);nh=c[nd>>2]|0;if((nh|0)==0){break L3752}else{nd=nh}}if((a[nd+8|0]&1)!=0){break}if((c[nd+16>>2]|0)==3){break L3750}}}while(0);hK=is(aT)|0;gG=c[hK>>2]|0;if((gG|0)==1){ve=+(c[hK+8>>2]|0)}else if((gG|0)==2){ve=+h[hK+8>>3]}else if((gG|0)==3){ve=+uz(c[hK+8>>2]|0,0)}else{b7=2740;break L27}if((c[dV>>2]|0)==3){uu(c[dW>>2]|0);c[dV>>2]=1}hK=~~ve;if(hK>>>0>=8){gG=c[m>>2]|0;cf(gG|0,144072,(v=i,i=i+16|0,c[v>>2]=0,c[v+8>>2]=7,v)|0);break L3470}if((hK|0)!=7|(c[8510]|0)!=0){c[8506]=hK;break L3470}else{hK=c[m>>2]|0;aI(144280,44,1,hK|0);break L3470}}}while(0);uu(c[8510]|0);hF=c[13898]|0;L3781:do{if((hF|0)<(c[8272]|0)){gH=c[1054]|0;L3783:do{if((a[gH+(hF*40&-1)|0]&1)!=0){hK=c[gH+(hF*40&-1)+36>>2]|0;gG=gH+(hF*40&-1)+32|0;gE=c[10036]|0;gC=0;while(1){if((gC|0)>=(hK|0)){break}if((a[gE+((c[gG>>2]|0)+gC|0)|0]|0)==(a[gC+103664|0]|0)){gC=gC+1|0}else{break L3783}}if((gC|0)==1){vf=0;break L3781}}}while(0);a[14176]=1;is(aS);a[14176]=0;if((c[dX>>2]|0)==3){vf=c[dY>>2]|0;break}else{c[13898]=hF;vf=0;break}}else{vf=0}}while(0);c[8510]=vf;do{if((a[vf]|0)==0){uu(vf);c[8510]=0;if((c[8506]|0)!=7){break}c[8506]=0}else{c[8506]=7}}while(0);c[13898]=(c[13898]|0)+1;break L3470}}while(0);while(1){if((a[vb+143960|0]|0)==(a[gz+(vb+vd|0)|0]|0)){vg=vd;vh=vc}else{if((vb|0)!=4){vi=0;vj=0;vk=tv;break}vg=vd-1|0;vh=1}hF=vb+1|0;if((hF|0)<(vh+tt|0)){vb=hF;vc=vh;vd=vg}else{b7=2752;break}}do{if((b7|0)==2752){b7=0;if((vh|0)==0){if(!((vb|0)==7|(vb|0)==3)){vi=0;vj=0;vk=tv;break}}c[13898]=tq+1;if((a[26192]&1)==0){break L3470}hX(aU);break L3470}}while(0);while(1){if((a[vi+143888|0]|0)==(a[gz+(vi+vk|0)|0]|0)){vl=vk;vm=vj}else{if((vi|0)!=2){tz=tv;tA=0;break L3440}vl=vk-1|0;vm=1}hF=vi+1|0;if((hF|0)<(vm+tt|0)){vi=hF;vj=vm;vk=vl}else{break}}if((vm|0)==0){if(!((vi|0)==5|(vi|0)==1)){tz=tv;tA=0;break L3440}}hF=tq+1|0;c[13898]=hF;L3821:do{if((hF|0)<(tr|0)){if((a[ts+(hF*40&-1)|0]&1)==0){break}gH=c[ts+(hF*40&-1)+36>>2]|0;gG=ts+(hF*40&-1)+32|0;gE=0;while(1){if((gE|0)>=(gH|0)){b7=2767;break}if((a[gz+((c[gG>>2]|0)+gE|0)|0]|0)==(a[gE+103664|0]|0)){gE=gE+1|0}else{vn=0;break}}if((b7|0)==2767){b7=0;if((gE|0)==1){break}else{vn=0}}while(1){if((vn|0)>=(gH|0)){break}if((a[gz+((c[gG>>2]|0)+vn|0)|0]|0)==(a[vn+95280|0]|0)){vn=vn+1|0}else{break L3821}}if((vn|0)!=2){break}vo=tq+2|0;c[13898]=vo;if((vo|0)>=(tr|0)){b7=5205;break L27}L3835:do{if((a[ts+(vo*40&-1)|0]&1)!=0){gG=c[ts+(vo*40&-1)+36>>2]|0;gH=ts+(vo*40&-1)+32|0;gE=0;while(1){if((gE|0)>=(gG|0)){break}if((a[gz+((c[gH>>2]|0)+gE|0)|0]|0)==(a[gE+103664|0]|0)){gE=gE+1|0}else{break L3835}}if((gE|0)==1){b7=5206;break L27}}}while(0);dl(a1,0);fR(a1,aX,aZ,143600);gH=~~+h[aX>>3];gG=~~+h[aZ>>3];hK=gG|gH;if((a[26192]&1)!=0){if((hK|0)<0){break L3470}hX(a0)}if((hK|0)>-1){c[dR>>2]=gH;vp=gG}else{c[dR>>2]=c[6558];vp=c[6559]|0}c[dS>>2]=vp;hX(a0);break L3470}}while(0);if((a[26192]&1)!=0){break}c[dT>>2]=c[6558];c[dU>>2]=c[6559];hX(aW)}}while(0);gz=c[13898]|0;hF=c[8272]|0;if((gz|0)>=(hF|0)){break L44}tq=gz;tr=hF;ts=c[1054]|0}if((b7|0)==2503){b7=0;tz=c[tu>>2]|0;tA=1}if((tq|0)>=(tr|0)){break}if(tA){b7=5207;break L27}hF=c[10036]|0;gz=0;while(1){if((gz|0)>=(tt|0)){break}if((a[hF+(gz+tz|0)|0]|0)==(a[gz+103664|0]|0)){gz=gz+1|0}else{b7=5208;break L27}}if((gz|0)!=1){b7=5209;break L27}}else if((gD|0)==45){ll()}else if((gD|0)==56){hF=gv+1|0;c[13898]=hF;L3865:do{if((hF|0)<(c[8272]|0)){gG=gw+(hF*40&-1)|0;gH=gw+(hF*40&-1)+36|0;L3867:do{if((a[gG]&1)==0){vq=gw+(hF*40&-1)+32|0}else{hK=c[gH>>2]|0;nd=gw+(hF*40&-1)+32|0;hG=0;while(1){if((hG|0)>=(hK|0)){break}if((a[gB+((c[nd>>2]|0)+hG|0)|0]|0)==(a[hG+103664|0]|0)){hG=hG+1|0}else{vq=nd;break L3867}}if((hG|0)==1){break L3865}else{vq=nd}}}while(0);c[8764]=0;hK=c[gH>>2]|0;L3875:do{if((a[gG]&1)!=0&(hK|0)>0){nh=0;hR=0;hw=c[vq>>2]|0;while(1){if((a[nh+148408|0]|0)==(a[gB+(nh+hw|0)|0]|0)){vr=hw;vs=hR}else{if((nh|0)!=2){break L3875}vr=hw-1|0;vs=1}hC=nh+1|0;if((hC|0)<(vs+hK|0)){nh=hC;hR=vs;hw=vr}else{break}}if((vs|0)==0){if(!((nh|0)==1|(nh|0)==5)){break}}c[8764]=2;c[13898]=gv+2}}while(0);hK=is(aM)|0;gG=c[hK>>2]|0;if((gG|0)==1){vt=+(c[hK+8>>2]|0)}else if((gG|0)==2){vt=+h[hK+8>>3]}else if((gG|0)==3){vt=+uz(c[hK+8>>2]|0,0)}else{b7=2816;break L27}if((c[d7>>2]|0)==3){uu(c[d8>>2]|0);c[d7>>2]=1}h[4384]=vt;hK=c[13898]|0;if((c[8272]|0)<=(hK|0)){break L44}gG=c[1054]|0;if((a[gG+(hK*40&-1)|0]&1)==0){break L44}gH=c[gG+(hK*40&-1)+36>>2]|0;hw=gG+(hK*40&-1)+32|0;hR=c[10036]|0;nd=0;while(1){if((nd|0)>=(gH|0)){break}if((a[hR+((c[hw>>2]|0)+nd|0)|0]|0)==(a[nd+148464|0]|0)){nd=nd+1|0}else{break L44}}if((nd|0)!=1){break L44}c[6588]=0;hw=hK+1|0;c[13898]=hw;gH=c[gG+(hw*40&-1)+36>>2]|0;L3903:do{if((a[gG+(hw*40&-1)|0]&1)!=0&(gH|0)>0){hG=0;hC=0;hB=c[gG+(hw*40&-1)+32>>2]|0;while(1){if((a[hG+148408|0]|0)==(a[hR+(hG+hB|0)|0]|0)){vu=hB;vv=hC}else{if((hG|0)!=2){break L3903}vu=hB-1|0;vv=1}hS=hG+1|0;if((hS|0)<(vv+gH|0)){hG=hS;hC=vv;hB=vu}else{break}}if((vv|0)==0){if(!((hG|0)==1|(hG|0)==5)){break}}c[6588]=2;c[13898]=hK+2}}while(0);hK=is(aL)|0;gH=c[hK>>2]|0;if((gH|0)==1){vw=+(c[hK+8>>2]|0)}else if((gH|0)==2){vw=+h[hK+8>>3]}else if((gH|0)==3){vw=+uz(c[hK+8>>2]|0,0)}else{b7=2838;break L27}if((c[d9>>2]|0)==3){uu(c[eb>>2]|0);c[d9>>2]=1}h[3296]=vw;hK=c[13898]|0;if((c[8272]|0)<=(hK|0)){break L44}gH=c[1054]|0;if((a[gH+(hK*40&-1)|0]&1)==0){break L44}hR=c[gH+(hK*40&-1)+36>>2]|0;hw=gH+(hK*40&-1)+32|0;gG=c[10036]|0;nd=0;while(1){if((nd|0)>=(hR|0)){break}if((a[gG+((c[hw>>2]|0)+nd|0)|0]|0)==(a[nd+148464|0]|0)){nd=nd+1|0}else{break L44}}if((nd|0)!=1){break L44}c[1057]=0;hw=hK+1|0;c[13898]=hw;hR=c[gH+(hw*40&-1)+36>>2]|0;L3931:do{if((a[gH+(hw*40&-1)|0]&1)!=0&(hR|0)>0){hB=0;hC=0;nh=c[gH+(hw*40&-1)+32>>2]|0;while(1){if((a[hB+148408|0]|0)==(a[gG+(hB+nh|0)|0]|0)){vx=nh;vy=hC}else{if((hB|0)!=2){break L3931}vx=nh-1|0;vy=1}hS=hB+1|0;if((hS|0)<(vy+hR|0)){hB=hS;hC=vy;nh=vx}else{break}}if((vy|0)==0){if(!((hB|0)==1|(hB|0)==5)){break}}c[1057]=2;c[13898]=hK+2}}while(0);hK=is(aK)|0;hR=c[hK>>2]|0;if((hR|0)==1){vz=+(c[hK+8>>2]|0)}else if((hR|0)==2){vz=+h[hK+8>>3]}else if((hR|0)==3){vz=+uz(c[hK+8>>2]|0,0)}else{b7=2860;break L27}if((c[ec>>2]|0)==3){uu(c[ed>>2]|0);c[ec>>2]=1}h[531]=vz;hK=c[13898]|0;if((c[8272]|0)<=(hK|0)){break L44}hR=c[1054]|0;if((a[hR+(hK*40&-1)|0]&1)==0){break L44}gG=c[hR+(hK*40&-1)+36>>2]|0;hw=hR+(hK*40&-1)+32|0;gH=c[10036]|0;nd=0;while(1){if((nd|0)>=(gG|0)){break}if((a[gH+((c[hw>>2]|0)+nd|0)|0]|0)==(a[nd+148464|0]|0)){nd=nd+1|0}else{break L44}}if((nd|0)!=1){break L44}c[14091]=0;hw=hK+1|0;c[13898]=hw;gG=c[hR+(hw*40&-1)+36>>2]|0;L3959:do{if((a[hR+(hw*40&-1)|0]&1)!=0&(gG|0)>0){nh=0;hC=0;hG=c[hR+(hw*40&-1)+32>>2]|0;while(1){if((a[nh+148408|0]|0)==(a[gH+(nh+hG|0)|0]|0)){vA=hG;vB=hC}else{if((nh|0)!=2){break L3959}vA=hG-1|0;vB=1}hS=nh+1|0;if((hS|0)<(vB+gG|0)){nh=hS;hC=vB;hG=vA}else{break}}if((vB|0)==0){if(!((nh|0)==1|(nh|0)==5)){break}}c[14091]=2;c[13898]=hK+2}}while(0);hK=is(aN)|0;gG=c[hK>>2]|0;if((gG|0)==1){vC=+(c[hK+8>>2]|0)}else if((gG|0)==2){vC=+h[hK+8>>3]}else if((gG|0)==3){vC=+uz(c[hK+8>>2]|0,0)}else{b7=2882;break L27}if((c[ee>>2]|0)==3){uu(c[ef>>2]|0);c[ee>>2]=1}h[7048]=vC;break L44}}while(0);h[7048]=0.0;h[531]=0.0;h[3296]=0.0;h[4384]=0.0}else if((gD|0)==57){hF=gv+1|0;c[13898]=hF;L3982:do{if((hF|0)<(c[8272]|0)){L3984:do{if((a[gw+(hF*40&-1)|0]&1)!=0){gz=c[gw+(hF*40&-1)+36>>2]|0;hK=gw+(hF*40&-1)+32|0;gG=0;while(1){if((gG|0)>=(gz|0)){break}if((a[gB+((c[hK>>2]|0)+gG|0)|0]|0)==(a[gG+103664|0]|0)){gG=gG+1|0}else{break L3984}}if((gG|0)==1){b7=2892;break L3982}}}while(0);hK=is(aH)|0;gz=c[hK>>2]|0;if((gz|0)==1){vD=+(c[hK+8>>2]|0)}else if((gz|0)==2){vD=+h[hK+8>>3]}else if((gz|0)==3){vD=+uz(c[hK+8>>2]|0,0)}else{b7=2897;break L27}if((c[eg>>2]|0)==3){uu(c[eh>>2]|0);c[eg>>2]=1}g[184]=vD;vE=c[13898]|0;if((c[8272]|0)<=(vE|0)){b7=5210;break L27}hK=c[1054]|0;if((a[hK+(vE*40&-1)|0]&1)==0){b7=5211;break L27}gz=c[hK+(vE*40&-1)+36>>2]|0;nh=hK+(vE*40&-1)+32|0;hK=c[10036]|0;gH=0;while(1){if((gH|0)>=(gz|0)){break}if((a[hK+((c[nh>>2]|0)+gH|0)|0]|0)==(a[gH+148464|0]|0)){gH=gH+1|0}else{b7=5212;break L27}}if((gH|0)!=1){b7=5213;break L27}c[13898]=vE+1;nh=is(aJ)|0;hK=c[nh>>2]|0;if((hK|0)==1){vF=+(c[nh+8>>2]|0)}else if((hK|0)==2){vF=+h[nh+8>>3]}else if((hK|0)==3){vF=+uz(c[nh+8>>2]|0,0)}else{b7=2911;break L27}if((c[ei>>2]|0)==3){uu(c[ej>>2]|0);c[ei>>2]=1}vG=vF}else{b7=2892}}while(0);if((b7|0)==2892){b7=0;g[184]=0.0;vG=0.0}g[44]=vG}else if((gD|0)==58){vH=gv+1|0;c[13898]=vH;if((a[33512]&1)!=0){b7=2917;break L27}L4019:do{if((vH|0)<(c[8272]|0)){L4021:do{if((a[gw+(vH*40&-1)|0]&1)!=0){hF=c[gw+(vH*40&-1)+36>>2]|0;nh=gw+(vH*40&-1)+32|0;hK=0;while(1){if((hK|0)>=(hF|0)){b7=2923;break}if((a[gB+((c[nh>>2]|0)+hK|0)|0]|0)==(a[hK+103664|0]|0)){hK=hK+1|0}else{vI=0;break}}if((b7|0)==2923){b7=0;if((hK|0)==1){b7=2924;break L4019}else{vI=0}}while(1){if((vI|0)>=(hF|0)){break}if((a[gB+((c[nh>>2]|0)+vI|0)|0]|0)==(a[vI+103664|0]|0)){vI=vI+1|0}else{break L4021}}if((vI|0)==1){b7=2931;break L27}}}while(0);a[14176]=1;is(aE);a[14176]=0;if((c[ek>>2]|0)!=3){b7=2930;break L27}gH=c[el>>2]|0;c[aF>>2]=gH;if((gH|0)==0){b7=2933;break L27}iQ(aF);gH=c[aF>>2]|0;lj(gH);nh=c[8244]|0;if((gH|0)==(nh|0)){break}if((gH|0)==0){vJ=nh}else{uu(gH);vJ=c[8244]|0}c[aF>>2]=vJ}else{b7=2924}}while(0);do{if((b7|0)==2924){b7=0;lj(0);gH=c[8244]|0;if((gH|0)==0){break}uu(gH);c[8244]=0}}while(0);c[7271]=-1}else if((gD|0)==59){c[13898]=gv+1;if((a[32936]&1)!=0){break}a[32936]=1;if((a[30528]&1)!=0){break}b[12272]=116;w=121;a[24595]=w&255;w=w>>8;a[24596|0]=w&255;if((a[37400]&1)==0){break}aI(149344,51,1,c[m>>2]|0)}else if((gD|0)==61){gH=gv+1|0;c[13898]=gH;nh=c[8272]|0;L4048:do{if((gH|0)<(nh|0)){hF=a[gw+(gH*40&-1)|0]|0;L4050:do{if((hF&1)!=0){hK=c[gw+(gH*40&-1)+36>>2]|0;gG=gw+(gH*40&-1)+32|0;gz=0;while(1){if((gz|0)>=(hK|0)){break}if((a[gB+((c[gG>>2]|0)+gz|0)|0]|0)==(a[gz+103664|0]|0)){gz=gz+1|0}else{break L4050}}if((gz|0)==1){break L4048}}}while(0);gG=gv+2|0;vK=gH;hK=nh;hw=gw;hR=hF;L4057:while(1){nd=(hR&1)==0;hG=c[hw+(vK*40&-1)+36>>2]|0;L4059:do{if(nd){vL=c[10036]|0;vM=hw+(vK*40&-1)+32|0}else{hC=hw+(vK*40&-1)+32|0;hB=c[10036]|0;hS=0;while(1){if((hS|0)>=(hG|0)){break}if((a[hB+((c[hC>>2]|0)+hS|0)|0]|0)==(a[hS+103664|0]|0)){hS=hS+1|0}else{vL=hB;vM=hC;break L4059}}if((hS|0)==1){break L4057}else{vL=hB;vM=hC}}}while(0);gz=c[vM>>2]|0;gx=(hG|0)>0;gy=23264;gA=95280;L4067:while(1){L4069:do{if(!nd){if(gx){ne=0;ho=0;gF=gz;while(1){ng=a[gA+ne|0]|0;if(ng<<24>>24==(a[vL+(ne+gF|0)|0]|0)){vN=gF;vO=ho}else{if(ng<<24>>24!=36){break L4069}vN=gF-1|0;vO=1}vP=ne+1|0;if((vP|0)<(vO+hG|0)){ne=vP;ho=vO;gF=vN}else{break}}if((vO|0)==0){vQ=vP}else{vR=gy;break L4067}}else{vQ=0}gF=a[gA+vQ|0]|0;if((gF<<24>>24|0)==36|(gF<<24>>24|0)==0){vR=gy;break L4067}}}while(0);hC=gy+8|0;hB=c[hC>>2]|0;if((hB|0)==0){vR=hC;break}else{gy=hC;gA=hB}}gA=c[vR+4>>2]|0;L4082:do{if((gA|0)==1){c[13898]=vK+1;if((i9(30632)|0)!=0){break L44}gy=(c[13898]|0)-1|0;c[13898]=gy;if((gy|0)!=(gG|0)){vS=gy;break}c[7662]=1;vS=gG}else if((gA|0)==2){vT=vK+1|0;c[13898]=vT;if((vT|0)>=(hK|0)){b7=5216;break L27}L4088:do{if((a[hw+(vT*40&-1)|0]&1)!=0){gy=c[hw+(vT*40&-1)+36>>2]|0;hG=hw+(vT*40&-1)+32|0;gz=0;while(1){if((gz|0)>=(gy|0)){break}if((a[vL+((c[hG>>2]|0)+gz|0)|0]|0)==(a[gz+103664|0]|0)){gz=gz+1|0}else{break L4088}}if((gz|0)==1){b7=5217;break L27}}}while(0);hG=is(aC)|0;gy=c[hG>>2]|0;if((gy|0)==1){vU=+(c[hG+8>>2]|0)}else if((gy|0)==2){vU=+h[hG+8>>3]}else if((gy|0)==3){vU=+uz(c[hG+8>>2]|0,0)}else{b7=2983;break L27}if((c[em>>2]|0)==3){uu(c[en>>2]|0);c[em>>2]=1}c[7664]=~~vU;vV=c[13898]|0;if((c[8272]|0)<=(vV|0)){b7=5218;break L27}hG=c[1054]|0;if((a[hG+(vV*40&-1)|0]&1)==0){b7=5219;break L27}gy=c[hG+(vV*40&-1)+36>>2]|0;gx=hG+(vV*40&-1)+32|0;hG=c[10036]|0;nd=0;while(1){if((nd|0)>=(gy|0)){break}if((a[hG+((c[gx>>2]|0)+nd|0)|0]|0)==(a[nd+148464|0]|0)){nd=nd+1|0}else{b7=5220;break L27}}if((nd|0)!=1){b7=5221;break L27}c[13898]=vV+1;gx=is(aB)|0;hG=c[gx>>2]|0;if((hG|0)==1){vW=+(c[gx+8>>2]|0)}else if((hG|0)==2){vW=+h[gx+8>>3]}else if((hG|0)==3){vW=+uz(c[gx+8>>2]|0,0)}else{b7=2997;break L27}if((c[eo>>2]|0)==3){uu(c[ep>>2]|0);c[eo>>2]=1}c[7665]=~~vW;gx=(c[13898]|0)-1|0;c[13898]=gx;vS=gx}else if((gA|0)==3){a[30641]=102;vS=vK}else if((gA|0)==4){a[30641]=98;vS=vK}else if((gA|0)==5){a[30641]=97;vS=vK}else if((gA|0)==6){a[30641]=100;vS=vK}else if((gA|0)==7){vX=vK+1|0;c[13898]=vX;gx=c[hw+(vX*40&-1)+36>>2]|0;hG=c[hw+(vX*40&-1)+32>>2]|0;gy=(a[hw+(vX*40&-1)|0]&1)==0;if((gx|0)>0&(gy^1)){vY=0;vZ=0;v_=hG}else{b7=5222;break L27}while(1){if((a[vY+170048|0]|0)==(a[vL+(vY+v_|0)|0]|0)){v$=v_;v0=vZ}else{if((vY|0)!=1){break}v$=v_-1|0;v0=1}hB=vY+1|0;if((hB|0)<(v0+gx|0)){vY=hB;vZ=v0;v_=v$}else{b7=3010;break}}do{if((b7|0)==3010){b7=0;if((v0|0)==0){if(!((vY|0)==0|(vY|0)==5)){break}}a[30639]=98;vS=vX;break L4082}}while(0);if(gy){b7=5223;break L27}else{v1=0;v2=0;v3=hG}while(1){if((a[v1+149304|0]|0)==(a[vL+(v1+v3|0)|0]|0)){v4=v3;v5=v2}else{if((v1|0)!=1){v6=0;v7=0;v8=hG;break}v4=v3-1|0;v5=1}nd=v1+1|0;if((nd|0)<(v5+gx|0)){v1=nd;v2=v5;v3=v4}else{b7=3018;break}}do{if((b7|0)==3018){b7=0;if((v5|0)==0){if(!((v1|0)==0|(v1|0)==6)){v6=0;v7=0;v8=hG;break}}a[30639]=99;vS=vX;break L4082}}while(0);while(1){if((a[v6+169576|0]|0)==(a[vL+(v6+v8|0)|0]|0)){v9=v8;wa=v7}else{if((v6|0)!=1){b7=5224;break L27}v9=v8-1|0;wa=1}hG=v6+1|0;if((hG|0)<(wa+gx|0)){v6=hG;v7=wa;v8=v9}else{break}}if((wa|0)==0){if(!((v6|0)==0|(v6|0)==3)){b7=5225;break L27}}a[30639]=114;vS=vX}else if((gA|0)==10){a[30642]=49;vS=vK}else if((gA|0)==11){a[30642]=52;vS=vK}else if((gA|0)==12){a[30632]=98;a[30633]=0;c[12890]=352;c[10058]=352;c[5094]=1;vS=vK}else if((gA|0)==8){a[30640]=1;vS=vK}else if((gA|0)==9){a[30640]=0;vS=vK}else if((gA|0)==13){gx=vK+1|0;c[13898]=gx;c[7661]=-1;L4162:do{if((a[hw+(gx*40&-1)|0]&1)==0){b7=3045}else{hG=c[10810]|0;if((hG|0)==0){break}gy=(hK|0)>(gx|0);nd=hw+(gx*40&-1)+36|0;hB=hw+(gx*40&-1)+32|0;hC=hG;L4165:while(1){hG=c[hC+4>>2]|0;L4167:do{if(gy){hS=c[nd>>2]|0;gF=0;while(1){if((gF|0)>=(hS|0)){break}if((a[vL+((c[hB>>2]|0)+gF|0)|0]|0)==(a[hG+gF|0]|0)){gF=gF+1|0}else{break L4167}}if((a[hG+gF|0]|0)==0){break L4165}}}while(0);hG=c[hC>>2]|0;if((hG|0)==0){break L4162}else{hC=hG}}if((a[hC+8|0]&1)!=0){break}if((c[hC+16>>2]|0)==1){b7=3045}}}while(0);do{if((b7|0)==3045){b7=0;gx=is(aD)|0;hB=c[gx>>2]|0;if((hB|0)==1){wb=+(c[gx+8>>2]|0)}else if((hB|0)==2){wb=+h[gx+8>>3]}else if((hB|0)==3){wb=+uz(c[gx+8>>2]|0,0)}else{b7=3049;break L27}if((c[eq>>2]|0)==3){uu(c[er>>2]|0);c[eq>>2]=1}gx=~~wb;c[7661]=gx;if((gx|0)>=-1){break}c[7661]=-1}}while(0);gx=(c[13898]|0)-1|0;c[13898]=gx;vS=gx}else if((gA|0)==14){c[7661]=0;vS=vK}else if((gA|0)==15|(gA|0)==16|(gA|0)==17|(gA|0)==18){if((a[37400]&1)==0){wc=vK;b7=3058;break}uh(vK,168664,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);wc=c[13898]|0;b7=3058}else if((gA|0)==19|(gA|0)==20){wc=vK;b7=3058}else if((gA|0)==21|(gA|0)==22){c[7662]=0;vS=vK}else if((gA|0)==23){wd=vK+1|0;c[13898]=wd;if((hK|0)<=(wd|0)){b7=5226;break L27}gx=(a[hw+(wd*40&-1)|0]&1)==0;if(gx){b7=5227;break L27}hB=c[hw+(wd*40&-1)+36>>2]|0;nd=hw+(wd*40&-1)+32|0;gy=0;while(1){if((gy|0)>=(hB|0)){b7=3065;break}if((a[vL+((c[nd>>2]|0)+gy|0)|0]|0)==(a[gy+105792|0]|0)){gy=gy+1|0}else{break}}do{if((b7|0)==3065){b7=0;if((gy|0)!=4){break}c[7663]=4;vS=wd;break L4082}}while(0);if(gx){b7=5228;break L27}gy=c[hw+(wd*40&-1)+36>>2]|0;nd=hw+(wd*40&-1)+32|0;hB=0;while(1){if((hB|0)>=(gy|0)){b7=3071;break}if((a[vL+((c[nd>>2]|0)+hB|0)|0]|0)==(a[hB+167728|0]|0)){hB=hB+1|0}else{break}}do{if((b7|0)==3071){b7=0;if((hB|0)!=7){break}c[7663]=5;vS=wd;break L4082}}while(0);if(gx){b7=5229;break L27}hB=c[hw+(wd*40&-1)+36>>2]|0;nd=hw+(wd*40&-1)+32|0;gy=0;while(1){if((gy|0)>=(hB|0)){b7=3077;break}if((a[vL+((c[nd>>2]|0)+gy|0)|0]|0)==(a[gy+100616|0]|0)){gy=gy+1|0}else{break}}do{if((b7|0)==3077){b7=0;if((gy|0)!=6){break}c[7663]=6;vS=wd;break L4082}}while(0);if(gx){b7=5230;break L27}gy=c[hw+(wd*40&-1)+36>>2]|0;nd=hw+(wd*40&-1)+32|0;hB=0;while(1){if((hB|0)>=(gy|0)){b7=3083;break}if((a[vL+((c[nd>>2]|0)+hB|0)|0]|0)==(a[hB+103256|0]|0)){hB=hB+1|0}else{break}}do{if((b7|0)==3083){b7=0;if((hB|0)!=3){break}c[7663]=7;vS=wd;break L4082}}while(0);if(gx){b7=5231;break L27}hB=c[hw+(wd*40&-1)+36>>2]|0;nd=hw+(wd*40&-1)+32|0;gy=0;while(1){if((gy|0)>=(hB|0)){b7=3089;break}if((a[vL+((c[nd>>2]|0)+gy|0)|0]|0)==(a[gy+99528|0]|0)){gy=gy+1|0}else{break}}do{if((b7|0)==3089){b7=0;if((gy|0)!=3){break}c[7663]=8;vS=wd;break L4082}}while(0);if(gx){b7=5232;break L27}gy=c[hw+(wd*40&-1)+36>>2]|0;nd=hw+(wd*40&-1)+32|0;hB=0;while(1){if((hB|0)>=(gy|0)){b7=3095;break}if((a[vL+((c[nd>>2]|0)+hB|0)|0]|0)==(a[hB+166192|0]|0)){hB=hB+1|0}else{break}}do{if((b7|0)==3095){b7=0;if((hB|0)!=2){break}c[7663]=0;vS=wd;break L4082}}while(0);if(gx){b7=5233;break L27}hB=c[hw+(wd*40&-1)+36>>2]|0;nd=hw+(wd*40&-1)+32|0;gy=0;while(1){if((gy|0)>=(hB|0)){b7=3101;break}if((a[vL+((c[nd>>2]|0)+gy|0)|0]|0)==(a[gy+165720|0]|0)){gy=gy+1|0}else{break}}do{if((b7|0)==3101){b7=0;if((gy|0)!=2){break}c[7663]=1;vS=wd;break L4082}}while(0);if(gx){b7=5234;break L27}gy=c[hw+(wd*40&-1)+36>>2]|0;nd=hw+(wd*40&-1)+32|0;hB=0;while(1){if((hB|0)>=(gy|0)){b7=3107;break}if((a[vL+((c[nd>>2]|0)+hB|0)|0]|0)==(a[hB+165344|0]|0)){hB=hB+1|0}else{break}}do{if((b7|0)==3107){b7=0;if((hB|0)!=2){break}c[7663]=2;vS=wd;break L4082}}while(0);if(gx){b7=5235;break L27}hB=c[hw+(wd*40&-1)+36>>2]|0;nd=hw+(wd*40&-1)+32|0;gy=0;while(1){if((gy|0)>=(hB|0)){break}if((a[vL+((c[nd>>2]|0)+gy|0)|0]|0)==(a[gy+164912|0]|0)){gy=gy+1|0}else{b7=5236;break L27}}if((gy|0)!=2){b7=5237;break L27}c[7663]=3;vS=wd}else{b7=3116;break L27}}while(0);if((b7|0)==3058){b7=0;c[7662]=1;vS=wc}gA=vS+1|0;c[13898]=gA;nd=c[8272]|0;if((gA|0)>=(nd|0)){break}hB=c[1054]|0;vK=gA;hK=nd;hw=hB;hR=a[hB+(gA*40&-1)|0]|0}if((a[30641]|0)!=97|(a[30639]|0)==98){break L44}a[30641]=102;break L44}}while(0);b[15316]=115;a[30639]=98;a[30640]=0;a[30641]=97;a[30642]=52;c[7661]=0;c[7663]=4;c[7664]=1;c[7665]=1;c[7662]=1}else if((gD|0)==60){nh=gv+1|0;c[13898]=nh;gH=c[8272]|0;L4272:do{if((nh|0)<(gH|0)){hR=a[gw+(nh*40&-1)|0]|0;L4274:do{if((hR&1)==0){we=0;wf=0;wg=nh;wh=gH;wi=gw;wj=hR}else{hw=c[gw+(nh*40&-1)+36>>2]|0;hK=gw+(nh*40&-1)+32|0;gG=0;while(1){if((gG|0)>=(hw|0)){break}if((a[gB+((c[hK>>2]|0)+gG|0)|0]|0)==(a[gG+103664|0]|0)){gG=gG+1|0}else{we=0;wf=0;wg=nh;wh=gH;wi=gw;wj=hR;break L4274}}if((gG|0)==1){b7=3127;break L4272}else{we=0;wf=0;wg=nh;wh=gH;wi=gw;wj=hR}}}while(0);L4280:while(1){hR=(wj&1)==0;hK=c[wi+(wg*40&-1)+36>>2]|0;L4282:do{if(hR){wk=c[10036]|0;wl=wi+(wg*40&-1)+32|0}else{hw=wi+(wg*40&-1)+32|0;hF=c[10036]|0;gA=0;while(1){if((gA|0)>=(hK|0)){break}if((a[hF+((c[hw>>2]|0)+gA|0)|0]|0)==(a[gA+103664|0]|0)){gA=gA+1|0}else{wk=hF;wl=hw;break L4282}}if((gA|0)==1){wm=we;break L4280}else{wk=hF;wl=hw}}}while(0);gG=c[wl>>2]|0;gy=(hK|0)>0;hB=23456;nd=140016;L4290:while(1){L4292:do{if(!hR){if(gy){gx=0;gz=0;hG=gG;while(1){gC=a[nd+gx|0]|0;if(gC<<24>>24==(a[wk+(gx+hG|0)|0]|0)){wn=hG;wo=gz}else{if(gC<<24>>24!=36){break L4292}wn=hG-1|0;wo=1}wp=gx+1|0;if((wp|0)<(wo+hK|0)){gx=wp;gz=wo;hG=wn}else{break}}if((wo|0)==0){wq=wp}else{wr=hB;break L4290}}else{wq=0}hG=a[nd+wq|0]|0;if((hG<<24>>24|0)==36|(hG<<24>>24|0)==0){wr=hB;break L4290}}}while(0);hw=hB+8|0;hF=c[hw>>2]|0;if((hF|0)==0){wr=hw;break}else{hB=hw;nd=hF}}nd=c[wr+4>>2]|0;L4305:do{if((nd|0)==1){a[20668]=112;ws=wf;wt=we;wu=wg}else if((nd|0)==2){a[20668]=110;ws=wf;wt=we;wu=wg}else if((nd|0)==3){c[5163]=103;ws=wf;wt=we;wu=wg}else if((nd|0)==13){c[13898]=wg+1;hB=is(aA)|0;hK=c[hB>>2]|0;if((hK|0)==1){wv=+(c[hB+8>>2]|0)}else if((hK|0)==2){wv=+h[hB+8>>3]}else if((hK|0)==3){wv=+uz(c[hB+8>>2]|0,0)}else{b7=3153;break L27}if((c[es>>2]|0)==3){uu(c[et>>2]|0);c[es>>2]=1}h[2705]=wv;hB=(c[13898]|0)-1|0;c[13898]=hB;ws=wf;wt=we;wu=hB}else if((nd|0)==4){hB=c[7640]|0;if((hB|0)==48){c[5163]=114;ws=wf;wt=we;wu=wg;break}else{c[5163]=hB;ws=wf;wt=we;wu=wg;break}}else if((nd|0)==5){if((wf|0)!=0){b7=3161;break L27}c[13898]=wg+1;hB=is(ay)|0;hK=c[hB>>2]|0;if((hK|0)==1){ww=+(c[hB+8>>2]|0)}else if((hK|0)==2){ww=+h[hB+8>>3]}else if((hK|0)==3){ww=+uz(c[hB+8>>2]|0,0)}else{b7=3166;break L27}if((c[eu>>2]|0)==3){uu(c[ev>>2]|0);c[eu>>2]=1}hB=~~ww;if((((hB|0)>-1?hB:-hB|0)|0)>=(c[5162]|0)){b7=3170;break L27}c[5164]=hB;hB=c[13898]|0;L4333:do{if((c[8272]|0)>(hB|0)){hK=c[1054]|0;if((a[hK+(hB*40&-1)|0]&1)==0){break}gG=c[hK+(hB*40&-1)+36>>2]|0;gy=hK+(hB*40&-1)+32|0;hK=c[10036]|0;hR=0;while(1){if((hR|0)>=(gG|0)){break}if((a[hK+((c[gy>>2]|0)+hR|0)|0]|0)==(a[hR+148464|0]|0)){hR=hR+1|0}else{break L4333}}if((hR|0)!=1){break}c[13898]=hB+1;gy=is(ax)|0;hK=c[gy>>2]|0;if((hK|0)==1){wx=+(c[gy+8>>2]|0)}else if((hK|0)==2){wx=+h[gy+8>>3]}else if((hK|0)==3){wx=+uz(c[gy+8>>2]|0,0)}else{b7=3182;break L27}if((c[ew>>2]|0)==3){uu(c[ex>>2]|0);c[ew>>2]=1}gy=~~wx;if((((gy|0)>-1?gy:-gy|0)|0)>=(c[5162]|0)){b7=3186;break L27}c[5165]=gy;gy=c[13898]|0;L4350:do{if((c[8272]|0)>(gy|0)){hK=c[1054]|0;if((a[hK+(gy*40&-1)|0]&1)==0){break}gG=c[hK+(gy*40&-1)+36>>2]|0;hF=hK+(gy*40&-1)+32|0;hK=c[10036]|0;hw=0;while(1){if((hw|0)>=(gG|0)){break}if((a[hK+((c[hF>>2]|0)+hw|0)|0]|0)==(a[hw+148464|0]|0)){hw=hw+1|0}else{break L4350}}if((hw|0)!=1){break}c[13898]=gy+1;hF=is(aw)|0;hK=c[hF>>2]|0;if((hK|0)==1){wy=+(c[hF+8>>2]|0)}else if((hK|0)==2){wy=+h[hF+8>>3]}else if((hK|0)==3){wy=+uz(c[hF+8>>2]|0,0)}else{b7=3198;break L27}if((c[eA>>2]|0)==3){uu(c[eB>>2]|0);c[eA>>2]=1}hF=~~wy;if((((hF|0)>-1?hF:-hF|0)|0)>=(c[5162]|0)){b7=3202;break L27}c[5166]=hF;hF=(c[13898]|0)-1|0;c[13898]=hF;c[5163]=114;c[7640]=114;ws=1;wt=we;wu=hF;break L4305}}while(0);hR=gy-1|0;c[13898]=hR;ws=1;wt=we;wu=hR;break L4305}}while(0);hR=hB-1|0;c[13898]=hR;ws=1;wt=we;wu=hR}else if((nd|0)==14){if((wf|0)!=0){b7=3205;break L27}c[5163]=99;h[2706]=.5;h[2707]=-1.5;h[2708]=1.0;hR=wg+1|0;c[13898]=hR;hF=hR;hR=wh;hK=wi;L4371:while(1){gG=a[hK+(hF*40&-1)|0]&1;L4373:do{if((hR|0)>(hF|0)){if(gG<<24>>24==0){wz=0;b7=3212;break}gA=c[hK+(hF*40&-1)+36>>2]|0;hG=hK+(hF*40&-1)+32|0;gz=c[10036]|0;gx=0;while(1){if((gx|0)>=(gA|0)){break}if((a[gz+((c[hG>>2]|0)+gx|0)|0]|0)==(a[gx+74592|0]|0)){gx=gx+1|0}else{wz=gG;b7=3212;break L4373}}if((gx|0)!=5){wA=gA;wB=hG;wC=gG;b7=3222;break}c[13898]=hF+1;gz=is(av)|0;hw=c[gz>>2]|0;if((hw|0)==1){wD=+(c[gz+8>>2]|0)}else if((hw|0)==2){wD=+h[gz+8>>3]}else if((hw|0)==3){wD=+uz(c[gz+8>>2]|0,0)}else{b7=3218;break L27}if((c[eD>>2]|0)==3){uu(c[eE>>2]|0);c[eD>>2]=1}h[2706]=wD}else{wz=gG;b7=3212}}while(0);if((b7|0)==3212){b7=0;wA=c[hK+(hF*40&-1)+36>>2]|0;wB=hK+(hF*40&-1)+32|0;wC=wz;b7=3222}L4391:do{if((b7|0)==3222){b7=0;gG=c[wB>>2]|0;if(!((wA|0)>0&wC<<24>>24!=0)){break L4371}gy=c[10036]|0;gz=0;hw=0;hC=gG;while(1){if((a[gz+158032|0]|0)==(a[gy+(gz+hC|0)|0]|0)){wE=hC;wF=hw}else{if((gz|0)!=3){wG=0;wH=0;wI=gG;break}wE=hC-1|0;wF=1}gC=gz+1|0;if((gC|0)<(wF+wA|0)){gz=gC;hw=wF;hC=wE}else{b7=3228;break}}do{if((b7|0)==3228){b7=0;if((wF|0)==0){if(!((gz|0)==6|(gz|0)==2)){wG=0;wH=0;wI=gG;break}}c[13898]=hF+1;hC=is(au)|0;hw=c[hC>>2]|0;if((hw|0)==1){wJ=+(c[hC+8>>2]|0)}else if((hw|0)==2){wJ=+h[hC+8>>3]}else if((hw|0)==3){wJ=+uz(c[hC+8>>2]|0,0)}else{b7=3234;break L27}if((c[eH>>2]|0)==3){uu(c[eI>>2]|0);c[eH>>2]=1}h[2707]=wJ;break L4391}}while(0);while(1){if((a[wG+156112|0]|0)==(a[gy+(wG+wI|0)|0]|0)){wK=wI;wL=wH}else{if((wG|0)!=3){break L4371}wK=wI-1|0;wL=1}gG=wG+1|0;if((gG|0)<(wL+wA|0)){wG=gG;wH=wL;wI=wK}else{break}}if((wL|0)==0){if(!((wG|0)==2|(wG|0)==10)){break L4371}}c[13898]=hF+1;gy=is(at)|0;gG=c[gy>>2]|0;if((gG|0)==1){wM=+(c[gy+8>>2]|0)}else if((gG|0)==2){wM=+h[gy+8>>3]}else if((gG|0)==3){wM=+uz(c[gy+8>>2]|0,0)}else{b7=3249;break L27}if((c[eF>>2]|0)==3){uu(c[eG>>2]|0);c[eF>>2]=1}h[2708]=wM}}while(0);hF=c[13898]|0;hR=c[8272]|0;hK=c[1054]|0}hK=hF-1|0;c[13898]=hK;ws=1;wt=we;wu=hK}else if((nd|0)==9){if((wf|0)!=0){b7=3255;break L27}c[13898]=wg+1;c[7271]=-1;uu(c[5173]|0);hK=ut(256)|0;if((hK|0)==0){gk();hR=ut(256)|0;if((hR|0)==0){b7=3258;break L27}else{wN=hR}}else{wN=hK}hK=wN;c[5173]=hK;wO=c[13898]|0;hR=c[8272]|0;do{if((wO|0)<(hR|0)){hB=c[1054]|0;if((a[hB+(wO*40&-1)|0]&1)==0){b7=5238;break L27}gy=c[hB+(wO*40&-1)+36>>2]|0;gG=hB+(wO*40&-1)+32|0;gz=c[10036]|0;hC=0;while(1){if((hC|0)>=(gy|0)){b7=3264;break}if((a[gz+((c[gG>>2]|0)+hC|0)|0]|0)==(a[hC+103664|0]|0)){hC=hC+1|0}else{wP=0;break}}if((b7|0)==3264){b7=0;if((hC|0)==1){wQ=0;wR=hK;b7=3265;break}else{wP=0}}while(1){if((wP|0)>=(gy|0)){break}if((a[gz+((c[gG>>2]|0)+wP|0)|0]|0)==(a[wP+199040|0]|0)){wP=wP+1|0}else{b7=5239;break L27}}if((wP|0)==1){wS=8;wT=0;wU=-1;wV=wO;wW=hR;wX=hB;wY=gz}else{b7=5240;break L27}L4450:while(1){gG=wV+1|0;c[13898]=gG;if((gG|0)>=(wW|0)){wZ=wT;w_=wU;w$=gG;break}L4453:do{if((a[wX+(gG*40&-1)|0]&1)!=0){gy=c[wX+(gG*40&-1)+36>>2]|0;hC=wX+(gG*40&-1)+32|0;hw=0;while(1){if((hw|0)>=(gy|0)){break}if((a[wY+((c[hC>>2]|0)+hw|0)|0]|0)==(a[hw+103664|0]|0)){hw=hw+1|0}else{break L4453}}if((hw|0)==1){wZ=wT;w_=wU;w$=gG;break L4450}}}while(0);gG=is(ap)|0;hC=c[gG>>2]|0;if((hC|0)==1){w0=+(c[gG+8>>2]|0)}else if((hC|0)==2){w0=+h[gG+8>>3]}else if((hC|0)==3){w0=+uz(c[gG+8>>2]|0,0)}else{b7=3282;break L27}if((c[eJ>>2]|0)==3){uu(c[eK>>2]|0);c[eJ>>2]=1}gG=c[13898]|0;L4468:do{if((gG|0)<(c[8272]|0)){hC=c[1054]|0;L4470:do{if((a[hC+(gG*40&-1)|0]&1)!=0){gy=c[hC+(gG*40&-1)+36>>2]|0;gF=hC+(gG*40&-1)+32|0;hG=c[10036]|0;gA=0;while(1){if((gA|0)>=(gy|0)){break}if((a[hG+((c[gF>>2]|0)+gA|0)|0]|0)==(a[gA+103664|0]|0)){gA=gA+1|0}else{break L4470}}if((gA|0)==1){b7=3304;break L4468}}}while(0);a[14176]=1;is(ao);a[14176]=0;if((c[eL>>2]|0)!=3){c[13898]=gG;b7=3304;break}hC=c[eM>>2]|0;if((hC|0)==0){b7=3304;break}if((a[hC]|0)==35){if((ca(hC|0,150416,(v=i,i=i+24|0,c[v>>2]=aq,c[v+8>>2]=ar,c[v+16>>2]=as,v)|0)|0)!=3){b7=3296;break L27}w1=wT;w2=c[as>>2]|0;w3=c[ar>>2]|0;w4=c[aq>>2]|0}else{hw=c[7642]|0;while(1){gF=c[hw>>2]|0;if((gF|0)==0){b7=3302;break L27}if((aY(hC|0,gF|0)|0)==0){break}else{hw=hw+8|0}}gF=c[hw+4>>2]|0;w1=1;w2=gF&255;w3=gF>>>8&255;w4=gF>>>16&255}uu(hC);w5=w1;w6=+(w2|0)/255.0;w7=+(w3|0)/255.0;w8=+(w4|0)/255.0}else{b7=3304}}while(0);if((b7|0)==3304){b7=0;gG=is(an)|0;gF=c[gG>>2]|0;if((gF|0)==1){w9=+(c[gG+8>>2]|0)}else if((gF|0)==2){w9=+h[gG+8>>3]}else if((gF|0)==3){w9=+uz(c[gG+8>>2]|0,0)}else{b7=3308;break L27}if((c[eN>>2]|0)==3){uu(c[eO>>2]|0);c[eN>>2]=1}if(w9<0.0|w9>1.0){b7=3312;break L27}gG=is(am)|0;gF=c[gG>>2]|0;if((gF|0)==1){xa=+(c[gG+8>>2]|0)}else if((gF|0)==2){xa=+h[gG+8>>3]}else if((gF|0)==3){xa=+uz(c[gG+8>>2]|0,0)}else{b7=3317;break L27}if((c[eQ>>2]|0)==3){uu(c[eR>>2]|0);c[eQ>>2]=1}if(xa<0.0|xa>1.0){b7=3321;break L27}gG=is(al)|0;gF=c[gG>>2]|0;if((gF|0)==1){xb=+(c[gG+8>>2]|0)}else if((gF|0)==2){xb=+h[gG+8>>3]}else if((gF|0)==3){xb=+uz(c[gG+8>>2]|0,0)}else{b7=3326;break L27}if((c[eS>>2]|0)==3){uu(c[eT>>2]|0);c[eS>>2]=1}if(xb<0.0|xb>1.0){b7=3330;break L27}else{w5=wT;w6=xb;w7=xa;w8=w9}}gG=wU+1|0;if((gG|0)<(wS|0)){xc=wS;xd=c[5173]|0}else{gF=wS+10|0;hG=db(c[5173]|0,gF<<5,151392)|0;c[5173]=hG;xc=gF;xd=hG}h[xd+(gG<<5)>>3]=w0;h[(c[5173]|0)+(gG<<5)+8>>3]=w8;h[(c[5173]|0)+(gG<<5)+16>>3]=w7;h[(c[5173]|0)+(gG<<5)+24>>3]=w6;xe=c[13898]|0;hG=c[8272]|0;if((hG|0)<=(xe|0)){b7=5241;break L27}gF=c[1054]|0;if((a[gF+(xe*40&-1)|0]&1)==0){b7=5242;break L27}gy=c[gF+(xe*40&-1)+36>>2]|0;hp=gF+(xe*40&-1)+32|0;gx=c[10036]|0;gC=0;while(1){if((gC|0)>=(gy|0)){b7=3339;break}if((a[gx+((c[hp>>2]|0)+gC|0)|0]|0)==(a[gC+131272|0]|0)){gC=gC+1|0}else{xf=0;break}}if((b7|0)==3339){b7=0;if((gC|0)==1){wZ=w5;w_=gG;w$=xe;break}else{xf=0}}while(1){if((xf|0)>=(gy|0)){break}if((a[gx+((c[hp>>2]|0)+xf|0)|0]|0)==(a[xf+148464|0]|0)){xf=xf+1|0}else{b7=5243;break L27}}if((xf|0)==1){wS=xc;wT=w5;wU=gG;wV=xe;wW=hG;wX=gF;wY=gx}else{b7=5244;break L27}}c[5172]=w_+1;gz=c[5173]|0;hB=0;while(1){if((hB|0)>=(w_|0)){break}hp=hB+1|0;if(+h[gz+(hB<<5)>>3]>+h[gz+(hp<<5)>>3]){b7=3347;break L27}else{hB=hp}}m3=+h[gz>>3];m2=1.0/(+h[gz+(w_<<5)>>3]-m3);if((w_|0)>1){hB=1;hp=gz;while(1){gy=hp+(hB<<5)|0;h[gy>>3]=m2*(+h[gy>>3]-m3);gy=hB+1|0;gC=c[5173]|0;if((gy|0)<((c[5172]|0)-1|0)){hB=gy;hp=gC}else{xg=gC;break}}}else{xg=gz}h[xg>>3]=0.0;h[(c[5173]|0)+((c[5172]|0)-1<<5)>>3]=1.0;xh=wZ}else{wQ=0;wR=hK;b7=3265}}while(0);if((b7|0)==3265){while(1){b7=0;h[wR+(wQ<<5)>>3]=+h[23584+(wQ<<5)>>3];h[(c[5173]|0)+(wQ<<5)+8>>3]=+h[23592+(wQ<<5)>>3];h[(c[5173]|0)+(wQ<<5)+16>>3]=+h[23600+(wQ<<5)>>3];h[(c[5173]|0)+(wQ<<5)+24>>3]=+h[23608+(wQ<<5)>>3];hK=wQ+1|0;if((hK|0)>=8){break}wQ=hK;wR=c[5173]|0;b7=3265}c[5172]=8;c[5174]=114;xh=0}c[5163]=100;c[7640]=100;ws=1;wt=xh;wu=c[13898]|0}else if((nd|0)==10){if((wf|0)!=0){b7=3353;break L27}xi=wg+1|0;c[13898]=xi;if((xi|0)>=(wh|0)){xj=xi;b7=5245;break L27}L4552:do{if((a[wi+(xi*40&-1)|0]&1)!=0){hK=c[wi+(xi*40&-1)+36>>2]|0;hR=wi+(xi*40&-1)+32|0;hF=0;while(1){if((hF|0)>=(hK|0)){break}if((a[wk+((c[hR>>2]|0)+hF|0)|0]|0)==(a[hF+103664|0]|0)){hF=hF+1|0}else{break L4552}}if((hF|0)==1){xj=xi;b7=5246;break L27}}}while(0);a[14176]=1;is(aj);a[14176]=0;if((c[eU>>2]|0)!=3){b7=3361;break L27}hR=c[eV>>2]|0;if((hR|0)==0){b7=3363;break L27}c[11856]=0;hK=ey(hR,4,0)|0;uu(hR);if((hK-1|0)>>>0<2){b7=3366;break L27}hK=c[5173]|0;if((hK|0)!=0){uu(hK);c[5173]=0}hK=ut(320)|0;if((hK|0)==0){gk();hR=ut(320)|0;if((hR|0)==0){b7=3371;break L27}else{xk=hR}}else{xk=hK}c[5173]=xk;hK=eC(eW,4)|0;if((hK|0)==-1){b7=3373;break L27}else{xl=10;xm=0;xn=hK}while(1){if((xm|0)<(xl|0)){xo=xl}else{hK=xl+10|0;c[5173]=db(c[5173]|0,hK<<5,151392)|0;xo=hK}if((xn|0)==3){m3=+h[eW>>3];do{if(m3<0.0){xp=0.0}else{if(m3>1.0){xp=1.0;break}xp=m3}}while(0);h[(c[5173]|0)+(xm<<5)+8>>3]=xp;m3=+h[eX>>3];do{if(m3<0.0){xq=0.0}else{if(m3>1.0){xq=1.0;break}xq=m3}}while(0);h[(c[5173]|0)+(xm<<5)+16>>3]=xq;m3=+h[eY>>3];do{if(m3<0.0){xr=0.0}else{if(m3>1.0){xr=1.0;break}xr=m3}}while(0);h[(c[5173]|0)+(xm<<5)+24>>3]=xr;h[(c[5173]|0)+(xm<<5)>>3]=+(xm|0)}else if((xn|0)==4){m3=+h[eX>>3];do{if(m3<0.0){xs=0.0}else{if(m3>1.0){xs=1.0;break}xs=m3}}while(0);h[(c[5173]|0)+(xm<<5)+8>>3]=xs;m3=+h[eY>>3];do{if(m3<0.0){xt=0.0}else{if(m3>1.0){xt=1.0;break}xt=m3}}while(0);h[(c[5173]|0)+(xm<<5)+16>>3]=xt;m3=+h[eZ>>3];do{if(m3<0.0){xu=0.0}else{if(m3>1.0){xu=1.0;break}xu=m3}}while(0);h[(c[5173]|0)+(xm<<5)+24>>3]=xu;h[(c[5173]|0)+(xm<<5)>>3]=+h[eW>>3]}else{b7=3397;break L27}xv=xm+1|0;hF=eC(eW,4)|0;if((hF|0)==-1){break}else{xl=xo;xm=xv;xn=hF}}ez();if((xv|0)==0){b7=5250;break L27}c[5172]=xv;hF=c[5173]|0;hK=0;while(1){if((hK|0)>=(xm|0)){break}hR=hK+1|0;if(+h[hF+(hK<<5)>>3]>+h[hF+(hR<<5)>>3]){b7=3404;break L27}else{hK=hR}}m3=+h[hF>>3];m2=1.0/(+h[hF+(xm<<5)>>3]-m3);if((xm|0)>1){hK=1;hR=hF;while(1){gz=hR+(hK<<5)|0;h[gz>>3]=m2*(+h[gz>>3]-m3);gz=hK+1|0;hp=c[5173]|0;if((gz|0)<((c[5172]|0)-1|0)){hK=gz;hR=hp}else{xw=hp;break}}}else{xw=hF}h[xw>>3]=0.0;h[(c[5173]|0)+((c[5172]|0)-1<<5)>>3]=1.0;c[5163]=100;c[7640]=100;hR=(c[13898]|0)-1|0;c[13898]=hR;ws=1;wt=we;wu=hR}else if((nd|0)==11){if((wf|0)!=0){b7=3409;break L27}c[13898]=wg+1;uF(e_|0,55600,50);uF(55600,89352,50);xx=c[13898]|0;hR=c[5178]|0;if((hR|0)!=0){e1(hR);c[5178]=0}c[11670]=20704;it();hR=c[18070]|0;hK=db(hR,c[hR>>2]<<5|8,105624)|0;c[18070]=0;c[5178]=hK;if((hK|0)==0){b7=3413;break L27}hK=(c[13898]|0)-1|0;hR=c[1054]|0;hp=(c[hR+(hK*40&-1)+36>>2]|0)+(c[hR+(hK*40&-1)+32>>2]|0)|0;hK=db(c[5179]|0,(hp+1|0)-(c[hR+(xx*40&-1)+32>>2]|0)|0,116456)|0;c[5179]=hK;hR=c[(c[1054]|0)+(xx*40&-1)+32>>2]|0;L4617:do{if((hR|0)<(hp|0)){gz=hR;hB=hK;while(1){gC=a[(c[10036]|0)+gz|0]|0;if(gC<<24>>24==0){xy=hB;break L4617}gy=hB+1|0;a[hB]=gC;gC=gz+1|0;if((gC|0)<(hp|0)){gz=gC;hB=gy}else{xy=gy;break}}}else{xy=hK}}while(0);a[xy]=0;c[11670]=0;xz=c[13898]|0;if((c[8272]|0)<=(xz|0)){b7=5251;break L27}hK=c[1054]|0;if((a[hK+(xz*40&-1)|0]&1)==0){b7=5252;break L27}hp=c[hK+(xz*40&-1)+36>>2]|0;hR=hK+(xz*40&-1)+32|0;hK=c[10036]|0;hF=0;while(1){if((hF|0)>=(hp|0)){break}if((a[hK+((c[hR>>2]|0)+hF|0)|0]|0)==(a[hF+148464|0]|0)){hF=hF+1|0}else{b7=5253;break L27}}if((hF|0)!=1){b7=5254;break L27}xA=xz+1|0;c[13898]=xA;hR=c[5256]|0;if((hR|0)!=0){e1(hR);c[5256]=0}c[11670]=21016;it();hR=c[18070]|0;hK=db(hR,c[hR>>2]<<5|8,105624)|0;c[18070]=0;c[5256]=hK;if((hK|0)==0){b7=3427;break L27}hK=(c[13898]|0)-1|0;hR=c[1054]|0;hp=(c[hR+(hK*40&-1)+36>>2]|0)+(c[hR+(hK*40&-1)+32>>2]|0)|0;hK=db(c[5257]|0,(hp+1|0)-(c[hR+(xA*40&-1)+32>>2]|0)|0,116456)|0;c[5257]=hK;hR=c[(c[1054]|0)+(xA*40&-1)+32>>2]|0;L4633:do{if((hR|0)<(hp|0)){hB=hR;gz=hK;while(1){gy=a[(c[10036]|0)+hB|0]|0;if(gy<<24>>24==0){xB=gz;break L4633}gC=gz+1|0;a[gz]=gy;gy=hB+1|0;if((gy|0)<(hp|0)){hB=gy;gz=gC}else{xB=gC;break}}}else{xB=hK}}while(0);a[xB]=0;c[11670]=0;xC=c[13898]|0;if((c[8272]|0)<=(xC|0)){b7=5255;break L27}hK=c[1054]|0;if((a[hK+(xC*40&-1)|0]&1)==0){b7=5256;break L27}hp=c[hK+(xC*40&-1)+36>>2]|0;hR=hK+(xC*40&-1)+32|0;hK=c[10036]|0;hF=0;while(1){if((hF|0)>=(hp|0)){break}if((a[hK+((c[hR>>2]|0)+hF|0)|0]|0)==(a[hF+148464|0]|0)){hF=hF+1|0}else{b7=5257;break L27}}if((hF|0)!=1){b7=5258;break L27}xD=xC+1|0;c[13898]=xD;hR=c[5334]|0;if((hR|0)!=0){e1(hR);c[5334]=0}c[11670]=21328;it();hR=c[18070]|0;hK=db(hR,c[hR>>2]<<5|8,105624)|0;c[18070]=0;c[5334]=hK;if((hK|0)==0){b7=3441;break L27}hK=(c[13898]|0)-1|0;hR=c[1054]|0;hp=(c[hR+(hK*40&-1)+36>>2]|0)+(c[hR+(hK*40&-1)+32>>2]|0)|0;hK=db(c[5335]|0,(hp+1|0)-(c[hR+(xD*40&-1)+32>>2]|0)|0,116456)|0;c[5335]=hK;hR=c[(c[1054]|0)+(xD*40&-1)+32>>2]|0;L4649:do{if((hR|0)<(hp|0)){gz=hR;hB=hK;while(1){gC=a[(c[10036]|0)+gz|0]|0;if(gC<<24>>24==0){xE=hB;break L4649}gy=hB+1|0;a[hB]=gC;gC=gz+1|0;if((gC|0)<(hp|0)){gz=gC;hB=gy}else{xE=gy;break}}}else{xE=hK}}while(0);a[xE]=0;c[11670]=0;uF(55600,e_|0,50);c[5163]=102;c[7640]=102;hK=(c[13898]|0)-1|0;c[13898]=hK;ws=1;wt=we;wu=hK}else if((nd|0)==12){xF=wg+1|0;c[13898]=xF;if((xF|0)>=(wh|0)){b7=5259;break L27}L4656:do{if((a[wi+(xF*40&-1)|0]&1)==0){b7=3495}else{hK=c[wi+(xF*40&-1)+36>>2]|0;hp=wi+(xF*40&-1)+32|0;hR=0;while(1){if((hR|0)>=(hK|0)){b7=3451;break}hF=c[hp>>2]|0;if((a[wk+(hF+hR|0)|0]|0)==(a[hR+103664|0]|0)){hR=hR+1|0}else{xG=hF;break}}if((b7|0)==3451){b7=0;if((hR|0)==1){b7=5260;break L27}xG=c[hp>>2]|0}hF=(hK|0)>0;L4665:do{if(hF){hB=0;while(1){if((a[hB+137240|0]|0)!=(a[wk+(hB+xG|0)|0]|0)){break L4665}gz=hB+1|0;if((gz|0)<(hK|0)){hB=gz}else{xH=gz;b7=3457;break}}}else{xH=0;b7=3457}}while(0);if((b7|0)==3457){b7=0;hp=a[xH+137240|0]|0;if((hp<<24>>24|0)==36|(hp<<24>>24|0)==0){xI=53960;break}}L4672:do{if(hF){hp=0;while(1){if((a[hp+137176|0]|0)!=(a[wk+(hp+xG|0)|0]|0)){break L4672}hR=hp+1|0;if((hR|0)<(hK|0)){hp=hR}else{xJ=hR;b7=3482;break}}}else{xJ=0;b7=3482}}while(0);if((b7|0)==3482){b7=0;hp=a[xJ+137176|0]|0;if((hp<<24>>24|0)==36|(hp<<24>>24|0)==0){xI=53968;break}}L4679:do{if(hF){hp=0;while(1){if((a[hp+137048|0]|0)!=(a[wk+(hp+xG|0)|0]|0)){break L4679}hR=hp+1|0;if((hR|0)<(hK|0)){hp=hR}else{xK=hR;b7=3486;break}}}else{xK=0;b7=3486}}while(0);if((b7|0)==3486){b7=0;hp=a[xK+137048|0]|0;if((hp<<24>>24|0)==36|(hp<<24>>24|0)==0){xI=53976;break}}L4686:do{if(hF){hp=0;while(1){if((a[hp+136776|0]|0)!=(a[wk+(hp+xG|0)|0]|0)){break L4686}hR=hp+1|0;if((hR|0)<(hK|0)){hp=hR}else{xL=hR;b7=3490;break}}}else{xL=0;b7=3490}}while(0);if((b7|0)==3490){b7=0;hp=a[xL+136776|0]|0;if((hp<<24>>24|0)==36|(hp<<24>>24|0)==0){xI=53984;break}}if(hF){hp=0;while(1){if((a[hp+136432|0]|0)!=(a[wk+(hp+xG|0)|0]|0)){b7=3495;break L4656}hR=hp+1|0;if((hR|0)<(hK|0)){hp=hR}else{xM=hR;break}}}else{xM=0}hp=a[xM+136432|0]|0;if((hp<<24>>24|0)==36|(hp<<24>>24|0)==0){xI=53992}else{b7=3495}}}while(0);if((b7|0)==3495){b7=0;xI=54e3}hp=c[xI+4>>2]|0;if((hp|0)==-1){b7=3459;break L27}c[5174]=hp;ws=wf;wt=we;wu=xF}else if((nd|0)==6){a[20684]=0;ws=wf;wt=we;wu=wg}else if((nd|0)==7){a[20684]=1;ws=wf;wt=we;wu=wg}else if((nd|0)==8){c[13898]=wg+1;hp=is(ah)|0;hK=c[hp>>2]|0;if((hK|0)==1){xN=+(c[hp+8>>2]|0)}else if((hK|0)==2){xN=+h[hp+8>>3]}else if((hK|0)==3){xN=+uz(c[hp+8>>2]|0,0)}else{b7=3467;break L27}if((c[e$>>2]|0)==3){uu(c[e0>>2]|0);c[e$>>2]=1}hp=~~xN;if((hp|0)<0){b7=3471;break L27}c[5168]=hp;hp=(c[13898]|0)-1|0;c[13898]=hp;ws=wf;wt=we;wu=hp}else{b7=3473;break L27}}while(0);nd=wu+1|0;c[13898]=nd;hp=c[8272]|0;if((nd|0)>=(hp|0)){wm=wt;break}hK=c[1054]|0;we=wt;wf=ws;wg=nd;wh=hp;wi=hK;wj=a[hK+(nd*40&-1)|0]|0}if(!((wm|0)!=0&(c[5174]|0)!=114)){break}if((a[37400]&1)==0){break}uh(-1,153616,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{b7=3127}}while(0);do{if((b7|0)==3127){b7=0;if((c[11254]|0)==0){break}c[5163]=114;c[5164]=7;c[5165]=5;c[5166]=15;a[20668]=112;a[20684]=0;c[5168]=0;c[5172]=0;uu(c[5173]|0);c[5173]=0;uu(c[5170]|0);c[5170]=0;c[5174]=114;h[2705]=1.5;c[7640]=48}}while(0);c[7271]=-1}else if((gD|0)==62){gH=gv+1|0;c[13898]=gH;nh=c[8272]|0;L4724:do{if((gH|0)<(nh|0)){nd=a[gw+(gH*40&-1)|0]|0;L4726:do{if((nd&1)==0){xO=gH;xP=nh;xQ=gw;xR=nd}else{hK=c[gw+(gH*40&-1)+36>>2]|0;hp=gw+(gH*40&-1)+32|0;hF=0;while(1){if((hF|0)>=(hK|0)){break}if((a[gB+((c[hp>>2]|0)+hF|0)|0]|0)==(a[hF+103664|0]|0)){hF=hF+1|0}else{xO=gH;xP=nh;xQ=gw;xR=nd;break L4726}}if((hF|0)==1){break L4724}else{xO=gH;xP=nh;xQ=gw;xR=nd}}}while(0);L4732:while(1){nd=(xR&1)==0;hp=c[xQ+(xO*40&-1)+36>>2]|0;L4734:do{if(nd){xS=c[10036]|0;xT=xQ+(xO*40&-1)+32|0}else{hK=xQ+(xO*40&-1)+32|0;hR=c[10036]|0;hB=0;while(1){if((hB|0)>=(hp|0)){break}if((a[hR+((c[hK>>2]|0)+hB|0)|0]|0)==(a[hB+103664|0]|0)){hB=hB+1|0}else{xS=hR;xT=hK;break L4734}}if((hB|0)==1){break L4732}else{xS=hR;xT=hK}}}while(0);hF=c[xT>>2]|0;gx=(hp|0)>0;gF=25168;hG=141728;L4742:while(1){L4744:do{if(!nd){if(gx){gG=0;gz=0;gy=hF;while(1){gC=a[hG+gG|0]|0;if(gC<<24>>24==(a[xS+(gG+gy|0)|0]|0)){xU=gy;xV=gz}else{if(gC<<24>>24!=36){break L4744}xU=gy-1|0;xV=1}xW=gG+1|0;if((xW|0)<(xV+hp|0)){gG=xW;gz=xV;gy=xU}else{break}}if((xV|0)==0){xX=xW}else{xY=gF;break L4742}}else{xX=0}gy=a[hG+xX|0]|0;if((gy<<24>>24|0)==36|(gy<<24>>24|0)==0){xY=gF;break L4742}}}while(0);hK=gF+8|0;hR=c[hK>>2]|0;if((hR|0)==0){xY=hK;break}else{gF=hK;hG=hR}}hG=c[xY+4>>2]|0;L4757:do{if((hG|0)==1){a[54017]=118;xZ=xO}else if((hG|0)==2){a[54017]=104;xZ=xO}else if((hG|0)==3){a[54016]=100;xZ=xO}else if((hG|0)==4){a[54016]=117;xZ=xO}else if((hG|0)==10){c[13506]=1;xZ=xO}else if((hG|0)==11){c[13506]=0;xZ=xO}else if((hG|0)==5){a[54018]=1;gF=xO+1|0;c[13898]=gF;if((gF|0)>=(xP|0)){xZ=gF;break}L4766:do{if((a[xQ+(gF*40&-1)|0]&1)!=0){hp=c[xQ+(gF*40&-1)+36>>2]|0;hF=xQ+(gF*40&-1)+32|0;gx=0;while(1){if((gx|0)>=(hp|0)){break}if((a[xS+((c[hF>>2]|0)+gx|0)|0]|0)==(a[gx+103664|0]|0)){gx=gx+1|0}else{break L4766}}if((gx|0)==1){xZ=gF;break L4757}}}while(0);gF=is(ag)|0;hF=c[gF>>2]|0;if((hF|0)==1){x_=+(c[gF+8>>2]|0)}else if((hF|0)==2){x_=+h[gF+8>>3]}else if((hF|0)==3){x_=+uz(c[gF+8>>2]|0,0)}else{b7=3537;break L27}if((c[e2>>2]|0)==3){uu(c[e3>>2]|0);c[e2>>2]=1}gF=~~x_;c[13505]=gF;if((gF|0)<1){b7=3541;break L27}gF=(c[13898]|0)-1|0;c[13898]=gF;xZ=gF}else if((hG|0)==6){c[13505]=-1;xZ=xO}else if((hG|0)==7){a[54018]=0;xZ=xO}else if((hG|0)==8){x$=xO+1|0;c[13898]=x$;if((x$|0)>=(xP|0)){b7=5261;break L27}L4786:do{if((a[xQ+(x$*40&-1)|0]&1)!=0){gF=c[xQ+(x$*40&-1)+36>>2]|0;hF=xQ+(x$*40&-1)+32|0;hp=0;while(1){if((hp|0)>=(gF|0)){break}if((a[xS+((c[hF>>2]|0)+hp|0)|0]|0)==(a[hp+103664|0]|0)){hp=hp+1|0}else{break L4786}}if((hp|0)==1){b7=5262;break L27}}}while(0);dl(54032,3);hF=(c[13898]|0)-1|0;c[13898]=hF;xZ=hF}else if((hG|0)==9){x0=xO+1|0;c[13898]=x0;if((x0|0)>=(xP|0)){b7=5263;break L27}L4795:do{if((a[xQ+(x0*40&-1)|0]&1)!=0){hF=c[xQ+(x0*40&-1)+36>>2]|0;gF=xQ+(x0*40&-1)+32|0;gx=0;while(1){if((gx|0)>=(hF|0)){break}if((a[xS+((c[gF>>2]|0)+gx|0)|0]|0)==(a[gx+103664|0]|0)){gx=gx+1|0}else{break L4795}}if((gx|0)==1){b7=5264;break L27}}}while(0);dl(54072,3);gF=(c[13898]|0)-1|0;c[13898]=gF;xZ=gF}else{b7=3561;break L27}}while(0);hG=xZ+1|0;c[13898]=hG;gF=c[8272]|0;if((hG|0)>=(gF|0)){break}hF=c[1054]|0;xO=hG;xP=gF;xQ=hF;xR=a[hF+(hG*40&-1)|0]|0}if((a[54016]|0)!=110){break L44}a[54016]=100;break L44}}while(0);a[54016]=100}else if((gD|0)==77){nh=gv+1|0;c[13898]=nh;L4808:do{if((nh|0)<(c[8272]|0)){L4810:do{if((a[gw+(nh*40&-1)|0]&1)!=0){gH=c[gw+(nh*40&-1)+36>>2]|0;hG=gw+(nh*40&-1)+32|0;hF=0;while(1){if((hF|0)>=(gH|0)){break}if((a[gB+((c[hG>>2]|0)+hF|0)|0]|0)==(a[hF+103664|0]|0)){hF=hF+1|0}else{break L4810}}if((hF|0)==1){x1=1.0;break L4808}}}while(0);hG=is(af)|0;gH=c[hG>>2]|0;if((gH|0)==1){x2=+(c[hG+8>>2]|0)}else if((gH|0)==2){x2=+h[hG+8>>3]}else if((gH|0)==3){x2=+uz(c[hG+8>>2]|0,0)}else{b7=3576;break L27}if((c[e4>>2]|0)!=3){x1=x2;break}uu(c[e5>>2]|0);c[e4>>2]=1;x1=x2}else{x1=1.0}}while(0);h[3818]=x1>0.0?x1:1.0}else if((gD|0)==78){nh=gv+1|0;c[13898]=nh;L4825:do{if((nh|0)<(c[8272]|0)){L4827:do{if((a[gw+(nh*40&-1)|0]&1)!=0){hG=c[gw+(nh*40&-1)+36>>2]|0;gH=gw+(nh*40&-1)+32|0;gF=0;while(1){if((gF|0)>=(hG|0)){break}if((a[gB+((c[gH>>2]|0)+gF|0)|0]|0)==(a[gF+103664|0]|0)){gF=gF+1|0}else{break L4827}}if((gF|0)==1){x3=1.0;break L4825}}}while(0);gH=is(ae)|0;hG=c[gH>>2]|0;if((hG|0)==1){x4=+(c[gH+8>>2]|0)}else if((hG|0)==2){x4=+h[gH+8>>3]}else if((hG|0)==3){x4=+uz(c[gH+8>>2]|0,0)}else{b7=3590;break L27}if((c[e6>>2]|0)!=3){x3=x4;break}uu(c[e8>>2]|0);c[e6>>2]=1;x3=x4}else{x3=1.0}}while(0);h[3817]=x3>0.0?x3:1.0}else if((gD|0)==79){c[13898]=gv+1;if((a[30528]&1)!=0){break}a[30528]=1;if((a[32936]&1)==0){if((a[37400]&1)!=0){nh=c[m>>2]|0;aI(171240,33,1,nh|0)}b[12272]=116}if((c[17539]|0)!=0){h[8773]=0.0;h[8774]=6.283185307179586/+h[9040]}if((c[17367]|0)==3){break}ju()}else if((gD|0)==80){c[ad>>2]=0;x5=gv+1|0;c[13898]=x5;L4854:do{if((x5|0)<(c[8272]|0)){L4856:do{if((a[gw+(x5*40&-1)|0]&1)!=0){nh=c[gw+(x5*40&-1)+36>>2]|0;gH=gw+(x5*40&-1)+32|0;hG=0;while(1){if((hG|0)>=(nh|0)){b7=3608;break}if((a[gB+((c[gH>>2]|0)+hG|0)|0]|0)==(a[hG+103664|0]|0)){hG=hG+1|0}else{x6=0;break}}if((b7|0)==3608){b7=0;if((hG|0)==1){break L4854}else{x6=0}}while(1){if((x6|0)>=(nh|0)){break}if((a[gB+((c[gH>>2]|0)+x6|0)|0]|0)==(a[x6+103664|0]|0)){x6=x6+1|0}else{break L4856}}if((x6|0)==1){b7=3615;break L27}}}while(0);a[14176]=1;is(ac);a[14176]=0;if((c[e9>>2]|0)!=3){b7=3614;break L27}gH=c[fa>>2]|0;c[ad>>2]=gH;if((gH|0)==0){b7=3617;break L27}iQ(ad);x7=c[13898]|0;do{if((x7|0)<(c[8272]|0)){gH=c[1054]|0;if((a[gH+(x7*40&-1)|0]&1)==0){b7=5265;break L27}nh=c[gH+(x7*40&-1)+36>>2]|0;hG=gH+(x7*40&-1)+32|0;gH=c[10036]|0;gF=0;while(1){if((gF|0)>=(nh|0)){b7=3623;break}if((a[gH+((c[hG>>2]|0)+gF|0)|0]|0)==(a[gF+103664|0]|0)){gF=gF+1|0}else{x8=0;break}}if((b7|0)==3623){b7=0;if((gF|0)==1){x9=0;break}else{x8=0}}while(1){if((x8|0)>=(nh|0)){break}if((a[gH+((c[hG>>2]|0)+x8|0)|0]|0)==(a[x8+148880|0]|0)){x8=x8+1|0}else{b7=5266;break L27}}if((x8|0)!=6){b7=5267;break L27}c[13898]=x7+1;x9=1}else{x9=0}}while(0);ea(c[ad>>2]|0,x9);break L44}}while(0);ea(0,0)}else if((gD|0)==81){ya=gv+1|0;c[13898]=ya;L4886:do{if((ya|0)<(c[8272]|0)){L4888:do{if((a[gw+(ya*40&-1)|0]&1)!=0){hG=c[gw+(ya*40&-1)+36>>2]|0;gH=gw+(ya*40&-1)+32|0;nh=0;while(1){if((nh|0)>=(hG|0)){b7=3636;break}if((a[gB+((c[gH>>2]|0)+nh|0)|0]|0)==(a[nh+103664|0]|0)){nh=nh+1|0}else{yb=0;break}}if((b7|0)==3636){b7=0;if((nh|0)==1){break L4886}else{yb=0}}while(1){if((yb|0)>=(hG|0)){break}if((a[gB+((c[gH>>2]|0)+yb|0)|0]|0)==(a[yb+103664|0]|0)){yb=yb+1|0}else{break L4888}}if((yb|0)==1){b7=3643;break L27}}}while(0);a[14176]=1;is(ab);a[14176]=0;if((c[fb>>2]|0)!=3){b7=3642;break L27}gH=c[fc>>2]|0;c[57238]=gH;if((gH|0)==0){b7=3645;break L27}iQ(228952);break L44}}while(0);uu(c[57238]|0);c[57238]=0}else if((gD|0)==75){gH=gv+1|0;c[13898]=gH;hG=c[gw+(gH*40&-1)+36>>2]|0;nh=c[gw+(gH*40&-1)+32>>2]|0;gF=a[gw+(gH*40&-1)|0]|0;hF=(gF&1)==0;L4904:do{if((hG|0)>0&(hF^1)){hp=0;nd=0;hR=nh;while(1){if((a[hp+115824|0]|0)==(a[gB+(hp+hR|0)|0]|0)){yc=hR;yd=nd}else{if((hp|0)!=4){break}yc=hR-1|0;yd=1}hK=hp+1|0;if((hK|0)<(yd+hG|0)){hp=hK;nd=yd;hR=yc}else{b7=3653;break}}if((b7|0)==3653){b7=0;if((yd|0)!=0){ye=-1;yf=gH;yg=hG;yh=nh;yi=gF;break}if((hp|0)==3|(hp|0)==9){ye=-1;yf=gH;yg=hG;yh=nh;yi=gF;break}}if(hF){b7=3674;break}else{yj=0;yk=0;yl=nh}while(1){if((a[yj+115976|0]|0)==(a[gB+(yj+yl|0)|0]|0)){ym=yl;yn=yk}else{if((yj|0)!=3){yo=0;yp=0;yq=nh;break}ym=yl-1|0;yn=1}hR=yj+1|0;if((hR|0)<(yn+hG|0)){yj=hR;yk=yn;yl=ym}else{b7=3660;break}}if((b7|0)==3660){b7=0;if((yn|0)!=0){ye=-1;yf=gH;yg=hG;yh=nh;yi=gF;break}if((yj|0)==2|(yj|0)==7){ye=-1;yf=gH;yg=hG;yh=nh;yi=gF;break}else{yo=0;yp=0;yq=nh}}while(1){if((a[yo+116120|0]|0)==(a[gB+(yo+yq|0)|0]|0)){yr=yq;ys=yp}else{if((yo|0)!=4){yt=0;yu=0;yv=nh;break}yr=yq-1|0;ys=1}hp=yo+1|0;if((hp|0)<(ys+hG|0)){yo=hp;yp=ys;yq=yr}else{b7=3666;break}}if((b7|0)==3666){b7=0;if((ys|0)!=0){ye=-1;yf=gH;yg=hG;yh=nh;yi=gF;break}if((yo|0)==3|(yo|0)==6){ye=-1;yf=gH;yg=hG;yh=nh;yi=gF;break}else{yt=0;yu=0;yv=nh}}while(1){if((a[yt+172184|0]|0)==(a[gB+(yt+yv|0)|0]|0)){yw=yv;yx=yu}else{if((yt|0)!=4){b7=3674;break L4904}yw=yv-1|0;yx=1}hp=yt+1|0;if((hp|0)<(yx+hG|0)){yt=hp;yu=yx;yv=yw}else{break}}if((yx|0)!=0){ye=-1;yf=gH;yg=hG;yh=nh;yi=gF;break}if((yt|0)==3|(yt|0)==7){ye=-1;yf=gH;yg=hG;yh=nh;yi=gF}else{b7=3674}}else{b7=3674}}while(0);if((b7|0)==3674){b7=0;gF=is($)|0;nh=c[gF>>2]|0;if((nh|0)==1){yy=+(c[gF+8>>2]|0)}else if((nh|0)==2){yy=+h[gF+8>>3]}else if((nh|0)==3){yy=+uz(c[gF+8>>2]|0,0)}else{b7=3678;break L27}if((c[fd>>2]|0)==3){uu(c[fe>>2]|0);c[fd>>2]=1}gF=~~yy;yz=c[13898]|0;if((gF|0)<1){b7=3683;break L27}nh=c[1054]|0;ye=gF;yf=yz;yg=c[nh+(yz*40&-1)+36>>2]|0;yh=c[nh+(yz*40&-1)+32>>2]|0;yi=a[nh+(yz*40&-1)|0]|0}nh=(yi&1)==0;L4953:do{if((yg|0)>0&(nh^1)){gF=c[10036]|0;hG=0;gH=0;hF=yh;while(1){if((a[hG+115824|0]|0)==(a[gF+(hG+hF|0)|0]|0)){yA=hF;yB=gH}else{if((hG|0)!=4){break}yA=hF-1|0;yB=1}hp=hG+1|0;if((hp|0)<(yB+yg|0)){hG=hp;gH=yB;hF=yA}else{b7=3690;break}}do{if((b7|0)==3690){b7=0;if((yB|0)==0){if(!((hG|0)==3|(hG|0)==9)){break}}jx(ye,1);break L44}}while(0);if(nh){break}else{yC=0;yD=0;yE=yh}while(1){if((a[yC+115976|0]|0)==(a[gF+(yC+yE|0)|0]|0)){yF=yE;yG=yD}else{if((yC|0)!=3){yH=0;yI=0;yJ=yh;break}yF=yE-1|0;yG=1}hG=yC+1|0;if((hG|0)<(yG+yg|0)){yC=hG;yD=yG;yE=yF}else{b7=3698;break}}do{if((b7|0)==3698){b7=0;if((yG|0)==0){if(!((yC|0)==2|(yC|0)==7)){yH=0;yI=0;yJ=yh;break}}jx(ye,3);break L44}}while(0);while(1){if((a[yH+116120|0]|0)==(a[gF+(yH+yJ|0)|0]|0)){yK=yJ;yL=yI}else{if((yH|0)!=4){yM=0;yN=0;yO=yh;break}yK=yJ-1|0;yL=1}hG=yH+1|0;if((hG|0)<(yL+yg|0)){yH=hG;yI=yL;yJ=yK}else{b7=3705;break}}do{if((b7|0)==3705){b7=0;if((yL|0)==0){if(!((yH|0)==3|(yH|0)==6)){yM=0;yN=0;yO=yh;break}}jx(ye,2);break L44}}while(0);while(1){if((a[yM+172184|0]|0)==(a[gF+(yM+yO|0)|0]|0)){yP=yO;yQ=yN}else{if((yM|0)!=4){break L4953}yP=yO-1|0;yQ=1}hG=yM+1|0;if((hG|0)<(yQ+yg|0)){yM=hG;yN=yQ;yO=yP}else{break}}if((yQ|0)==0){if(!((yM|0)==3|(yM|0)==7)){break}}jx(ye,4);break L44}}while(0);if((ye|0)>0){yR=43272}else{b7=3720;break L27}while(1){yS=c[yR>>2]|0;if((yS|0)==0){b7=3719;break L27}if((ye|0)==(c[yS+4>>2]|0)){break}else{yR=yS|0}}c[13898]=yf-1;jx(ye,c[yS+12>>2]|0)}else if((gD|0)==82){c[13898]=gv+1;nh=is(Z)|0;gF=c[nh>>2]|0;if((gF|0)==1){yT=+(c[nh+8>>2]|0)}else if((gF|0)==2){yT=+h[nh+8>>3]}else if((gF|0)==3){yT=+uz(c[nh+8>>2]|0,0)}else{b7=3725;break L27}if((c[ff>>2]|0)==3){uu(c[fg>>2]|0);c[ff>>2]=1}nh=~~yT;gF=(nh|0)>-1?nh:-nh|0;yU=c[13898]|0;do{if((yU|0)<(c[8272]|0)){nh=c[1054]|0;if((a[nh+(yU*40&-1)|0]&1)==0){b7=5272;break L27}hG=c[nh+(yU*40&-1)+36>>2]|0;hF=nh+(yU*40&-1)+32|0;nh=c[10036]|0;gH=0;while(1){if((gH|0)>=(hG|0)){b7=3733;break}if((a[nh+((c[hF>>2]|0)+gH|0)|0]|0)==(a[gH+103664|0]|0)){gH=gH+1|0}else{yV=0;break}}if((b7|0)==3733){b7=0;if((gH|0)==1){yW=gF;break}else{yV=0}}while(1){if((yV|0)>=(hG|0)){break}if((a[nh+((c[hF>>2]|0)+yV|0)|0]|0)==(a[yV+148464|0]|0)){yV=yV+1|0}else{b7=5273;break L27}}if((yV|0)!=1){b7=5274;break L27}c[13898]=yU+1;hF=is(Y)|0;nh=c[hF>>2]|0;if((nh|0)==1){yX=+(c[hF+8>>2]|0)}else if((nh|0)==2){yX=+h[hF+8>>3]}else if((nh|0)==3){yX=+uz(c[hF+8>>2]|0,0)}else{b7=3742;break L27}if((c[fh>>2]|0)==3){uu(c[fi>>2]|0);c[fh>>2]=1}hF=~~yX;yW=(hF|0)>-1?hF:-hF|0}else{yW=gF}}while(0);if((gF|0)<2|(yW|0)<2){b7=3747;break L27}hF=c[10828]|0;c[10828]=0;iY(hF);c[6352]=gF;c[6350]=yW}else if((gD|0)==83){hF=gv+1|0;c[13898]=hF;nh=c[8272]|0;L5037:do{if((hF|0)<(nh|0)){L5039:do{if((a[gw+(hF*40&-1)|0]&1)==0){yY=hF;yZ=nh}else{hG=c[gw+(hF*40&-1)+36>>2]|0;gH=gw+(hF*40&-1)+32|0;hp=0;while(1){if((hp|0)>=(hG|0)){b7=3754;break}hR=c[gH>>2]|0;if((a[gB+(hR+hp|0)|0]|0)==(a[hp+103664|0]|0)){hp=hp+1|0}else{y_=hR;break}}if((b7|0)==3754){b7=0;if((hp|0)==1){b7=3756;break L5037}y_=c[gH>>2]|0}if((hG|0)>0){y$=0;y0=0;y1=y_}else{yY=hF;yZ=nh;break}while(1){if((a[y$+175752|0]|0)==(a[gB+(y$+y1|0)|0]|0)){y2=y1;y3=y0}else{if((y$|0)!=2){y4=0;y5=0;y6=y_;break}y2=y1-1|0;y3=1}hR=y$+1|0;if((hR|0)<(y3+hG|0)){y$=hR;y0=y3;y1=y2}else{b7=3762;break}}do{if((b7|0)==3762){b7=0;if((y3|0)==0){if(!((y$|0)==1|(y$|0)==6)){y4=0;y5=0;y6=y_;break}}g[18074]=1.0;gH=gv+2|0;c[13898]=gH;yY=gH;yZ=nh;break L5039}}while(0);while(1){if((a[y4+175400|0]|0)==(a[gB+(y4+y6|0)|0]|0)){y7=y6;y8=y5}else{if((y4|0)!=2){y9=0;za=0;zb=y_;break}y7=y6-1|0;y8=1}gH=y4+1|0;if((gH|0)<(y8+hG|0)){y4=gH;y5=y8;y6=y7}else{b7=3769;break}}do{if((b7|0)==3769){b7=0;if((y8|0)==0){if(!((y4|0)==5|(y4|0)==1)){y9=0;za=0;zb=y_;break}}c[13898]=gv+2;gH=is(W)|0;hp=c[gH>>2]|0;if((hp|0)==1){zc=+(c[gH+8>>2]|0)}else if((hp|0)==2){zc=+h[gH+8>>3]}else if((hp|0)==3){zc=+uz(c[gH+8>>2]|0,0)}else{b7=3775;break L27}if((c[fn>>2]|0)==3){uu(c[fo>>2]|0);c[fn>>2]=1}g[18074]=zc;yY=c[13898]|0;yZ=c[8272]|0;break L5039}}while(0);while(1){if((a[y9+174920|0]|0)==(a[gB+(y9+zb|0)|0]|0)){zd=zb;ze=za}else{if((y9|0)!=4){zf=0;zg=0;zh=y_;b7=3785;break}zd=zb-1|0;ze=1}gH=y9+1|0;if((gH|0)<(ze+hG|0)){y9=gH;za=ze;zb=zd}else{b7=3783;break}}do{if((b7|0)==3783){b7=0;if((ze|0)!=0){break}if(!((y9|0)==3|(y9|0)==7)){zf=0;zg=0;zh=y_;b7=3785}}}while(0);do{if((b7|0)==3785){while(1){b7=0;if((a[zf+174640|0]|0)==(a[gB+(zf+zh|0)|0]|0)){zi=zh;zj=zg}else{if((zf|0)!=4){yY=hF;yZ=nh;break L5039}zi=zh-1|0;zj=1}gH=zf+1|0;if((gH|0)<(zj+hG|0)){zf=gH;zg=zj;zh=zi;b7=3785}else{break}}if((zj|0)!=0){break}if(!((zf|0)==3|(zf|0)==8)){yY=hF;yZ=nh;break L5039}}}while(0);g[18074]=0.0;hG=gv+2|0;c[13898]=hG;yY=hG;yZ=nh}}while(0);if((yY|0)>=(yZ|0)){break}hG=c[1054]|0;L5099:do{if((a[hG+(yY*40&-1)|0]&1)!=0){gH=c[hG+(yY*40&-1)+36>>2]|0;hp=hG+(yY*40&-1)+32|0;hR=c[10036]|0;nd=0;while(1){if((nd|0)>=(gH|0)){break}if((a[hR+((c[hp>>2]|0)+nd|0)|0]|0)==(a[nd+103664|0]|0)){nd=nd+1|0}else{break L5099}}if((nd|0)==1){break L5037}}}while(0);hG=is(V)|0;hp=c[hG>>2]|0;if((hp|0)==1){zk=+(c[hG+8>>2]|0)}else if((hp|0)==2){zk=+h[hG+8>>3]}else if((hp|0)==3){zk=+uz(c[hG+8>>2]|0,0)}else{b7=3802;break L27}if((c[fj>>2]|0)==3){uu(c[fk>>2]|0);c[fj>>2]=1}m3=zk;g[178]=m3;hG=c[13898]|0;L5114:do{if((c[8272]|0)>(hG|0)){hp=c[1054]|0;if((a[hp+(hG*40&-1)|0]&1)==0){break}hR=c[hp+(hG*40&-1)+36>>2]|0;gH=hp+(hG*40&-1)+32|0;hp=c[10036]|0;hK=0;while(1){if((hK|0)>=(hR|0)){break}if((a[hp+((c[gH>>2]|0)+hK|0)|0]|0)==(a[hK+148464|0]|0)){hK=hK+1|0}else{break L5114}}if((hK|0)!=1){break}c[13898]=hG+1;gH=is(X)|0;hp=c[gH>>2]|0;if((hp|0)==1){zl=+(c[gH+8>>2]|0)}else if((hp|0)==2){zl=+h[gH+8>>3]}else if((hp|0)==3){zl=+uz(c[gH+8>>2]|0,0)}else{b7=3815;break L27}if((c[fl>>2]|0)==3){uu(c[fm>>2]|0);c[fl>>2]=1}g[38]=zl;break L5037}}while(0);g[38]=m3}else{b7=3756}}while(0);if((b7|0)==3756){b7=0;g[178]=1.0;g[38]=1.0}if(+g[178]<=0.0|+g[38]<=0.0){b7=3821;break L27}}else if((gD|0)==85){zm=gv+1|0;c[13898]=zm;nh=gw+(zm*40&-1)+36|0;hF=c[nh>>2]|0;gF=gw+(zm*40&-1)+32|0;hG=c[gF>>2]|0;gH=gw+(zm*40&-1)|0;hp=(a[gH]&1)==0;hR=(hF|0)>0;nd=21680;hB=116616;L5135:while(1){L5137:do{if(!hp){if(hR){gy=0;gz=0;gG=hG;while(1){gC=a[hB+gy|0]|0;if(gC<<24>>24==(a[gB+(gy+gG|0)|0]|0)){zn=gG;zo=gz}else{if(gC<<24>>24!=36){break L5137}zn=gG-1|0;zo=1}zp=gy+1|0;if((zp|0)<(zo+hF|0)){gy=zp;gz=zo;gG=zn}else{break}}if((zo|0)==0){zq=zp}else{zr=nd;break L5135}}else{zq=0}gG=a[hB+zq|0]|0;if((gG<<24>>24|0)==36|(gG<<24>>24|0)==0){zr=nd;break L5135}}}while(0);gG=nd+8|0;gz=c[gG>>2]|0;if((gz|0)==0){zr=gG;break}else{nd=gG;hB=gz}}hB=c[zr+4>>2]|0;if((hB|0)==7){nd=gv+2|0;c[13898]=nd;hF=c[8272]|0;if((nd|0)<(hF|0)){zs=nd;zt=hF;zu=gw}else{break}while(1){hF=(a[zu+(zs*40&-1)|0]&1)==0;if(hF){b7=5284;break L27}nd=c[zu+(zs*40&-1)+36>>2]|0;hG=zu+(zs*40&-1)+32|0;hR=c[10036]|0;hp=0;while(1){if((hp|0)>=(nd|0)){b7=3937;break}if((a[hR+((c[hG>>2]|0)+hp|0)|0]|0)==(a[hp+103664|0]|0)){hp=hp+1|0}else{break}}if((b7|0)==3937){b7=0;if((hp|0)==1){break L44}}L5161:do{if((zt|0)>(zs|0)){gz=0;while(1){if((gz|0)>=(nd|0)){break}if((a[hR+((c[hG>>2]|0)+gz|0)|0]|0)==(a[gz+130496|0]|0)){gz=gz+1|0}else{b7=3943;break L5161}}if((gz|0)!=4){b7=3943;break}c[13898]=zs+1;dl(49672,0);gG=(c[13898]|0)-1|0;c[13898]=gG;zv=gG}else{b7=3943}}while(0);L5167:do{if((b7|0)==3943){b7=0;hR=c[hG>>2]|0;if(!((nd|0)>0&(hF^1))){b7=5285;break L27}hp=c[10036]|0;gG=0;gy=0;hK=hR;while(1){if((a[gG+212296|0]|0)==(a[hp+(gG+hK|0)|0]|0)){zw=hK;zx=gy}else{if((gG|0)!=3){zy=0;zz=0;zA=hR;break}zw=hK-1|0;zx=1}gC=gG+1|0;if((gC|0)<(zx+nd|0)){gG=gC;gy=zx;hK=zw}else{b7=3949;break}}do{if((b7|0)==3949){b7=0;if((zx|0)==0){if(!((gG|0)==5|(gG|0)==2)){zy=0;zz=0;zA=hR;break}}hK=zs+1|0;c[13898]=hK;L5181:do{if((a[zu+(hK*40&-1)|0]&1)!=0){gy=c[10810]|0;if((gy|0)==0){zv=hK;break L5167}gz=(zt|0)>(hK|0);gC=zu+(hK*40&-1)+36|0;hS=zu+(hK*40&-1)+32|0;ho=gy;L5184:while(1){ne=c[ho+4>>2]|0;L5186:do{if(gz){gE=c[gC>>2]|0;ng=0;while(1){if((ng|0)>=(gE|0)){break}if((a[hp+((c[hS>>2]|0)+ng|0)|0]|0)==(a[ne+ng|0]|0)){ng=ng+1|0}else{break L5186}}if((a[ne+ng|0]|0)==0){b7=3959;break L5184}}}while(0);ne=c[ho>>2]|0;if((ne|0)==0){zB=gy;break}else{ho=ne}}do{if((b7|0)==3959){b7=0;if((a[ho+8|0]&1)!=0){zB=gy;break}if((c[ho+16>>2]|0)==1){break L5181}else{zB=gy}}}while(0);L5196:while(1){gy=c[zB+4>>2]|0;L5198:do{if(gz){ho=c[gC>>2]|0;gx=0;while(1){if((gx|0)>=(ho|0)){break}if((a[hp+((c[hS>>2]|0)+gx|0)|0]|0)==(a[gy+gx|0]|0)){gx=gx+1|0}else{break L5198}}if((a[gy+gx|0]|0)==0){break L5196}}}while(0);gy=c[zB>>2]|0;if((gy|0)==0){zv=hK;break L5167}else{zB=gy}}if((a[zB+8|0]&1)!=0){zv=hK;break L5167}if((c[zB+16>>2]|0)!=2){zv=hK;break L5167}}}while(0);hK=is(T)|0;hS=c[hK>>2]|0;if((hS|0)==1){zC=+(c[hK+8>>2]|0)}else if((hS|0)==2){zC=+h[hK+8>>3]}else if((hS|0)==3){zC=+uz(c[hK+8>>2]|0,0)}else{b7=3974;break L27}if((c[fr>>2]|0)==3){uu(c[fs>>2]|0);c[fr>>2]=1}h[6214]=zC;hK=(c[13898]|0)-1|0;c[13898]=hK;zv=hK;break L5167}}while(0);while(1){if((a[zy+211736|0]|0)==(a[hp+(zy+zA|0)|0]|0)){zD=zA;zE=zz}else{if((zy|0)!=4){b7=5286;break L27}zD=zA-1|0;zE=1}hR=zy+1|0;if((hR|0)<(zE+nd|0)){zy=hR;zz=zE;zA=zD}else{break}}if((zE|0)==0){if(!((zy|0)==5|(zy|0)==3)){b7=5287;break L27}}zF=zs+1|0;c[13898]=zF;do{if((zt|0)>(zF|0)){hR=(a[zu+(zF*40&-1)|0]&1)==0;if(hR){b7=5280;break L27}gG=c[zu+(zF*40&-1)+36>>2]|0;hK=zu+(zF*40&-1)+32|0;hS=0;while(1){if((hS|0)>=(gG|0)){b7=3991;break}if((a[hp+((c[hK>>2]|0)+hS|0)|0]|0)==(a[hS+150688|0]|0)){hS=hS+1|0}else{break}}if((b7|0)==3991){b7=0;if((hS|0)==2){break}}if(hR){b7=5281;break L27}hK=c[zu+(zF*40&-1)+36>>2]|0;gG=zu+(zF*40&-1)+32|0;gC=0;while(1){if((gC|0)>=(hK|0)){b7=3996;break}if((a[hp+((c[gG>>2]|0)+gC|0)|0]|0)==(a[gC+103664|0]|0)){gC=gC+1|0}else{zG=0;break}}if((b7|0)==3996){b7=0;if((gC|0)==1){break}else{zG=0}}while(1){if((zG|0)>=(hK|0)){b7=4e3;break}if((a[hp+((c[gG>>2]|0)+zG|0)|0]|0)==(a[zG+211336|0]|0)){zG=zG+1|0}else{zH=0;break}}do{if((b7|0)==4e3){b7=0;if((zG|0)!=2){zH=0;break}c[12406]=1;zv=zF;break L5167}}while(0);while(1){if((zH|0)>=(hK|0)){break}if((a[hp+((c[gG>>2]|0)+zH|0)|0]|0)==(a[zH+210848|0]|0)){zH=zH+1|0}else{b7=5282;break L27}}if((zH|0)!=2){b7=5283;break L27}c[12406]=2;zv=zF;break L5167}}while(0);c[12406]=0;zv=zF}}while(0);nd=zv+1|0;c[13898]=nd;hF=c[8272]|0;if((nd|0)>=(hF|0)){break L44}zs=nd;zt=hF;zu=c[1054]|0}}else if((hB|0)==1){hF=gv+2|0;c[13898]=hF;nd=c[gw+(hF*40&-1)+36>>2]|0;hG=c[gw+(hF*40&-1)+32>>2]|0;hp=(a[gw+(hF*40&-1)|0]&1)==0;hF=(nd|0)>0;gG=30672;hK=116448;L5256:while(1){L5258:do{if(!hp){if(hF){gC=0;hR=0;hS=hG;while(1){gz=a[hK+gC|0]|0;if(gz<<24>>24==(a[gB+(gC+hS|0)|0]|0)){zI=hS;zJ=hR}else{if(gz<<24>>24!=36){break L5258}zI=hS-1|0;zJ=1}zK=gC+1|0;if((zK|0)<(zJ+nd|0)){gC=zK;hR=zJ;hS=zI}else{break}}if((zJ|0)==0){zL=zK}else{zM=gG;break L5256}}else{zL=0}hS=a[hK+zL|0]|0;if((hS<<24>>24|0)==36|(hS<<24>>24|0)==0){zM=gG;break L5256}}}while(0);hS=gG+8|0;hR=c[hS>>2]|0;if((hR|0)==0){zM=hS;break}else{gG=hS;hK=hR}}hK=c[zM+4>>2]|0;zN=gv+3|0;c[13898]=zN;if((hK|0)==-1){b7=3845;break L27}c[12890]=hK;if((hK|0)!=345){break}hE(43432);if((c[10858]|0)!=0){break}c[10859]=0;break}else if((hB|0)==2){hK=gv+2|0;c[13898]=hK;gG=c[gw+(hK*40&-1)+36>>2]|0;nd=c[gw+(hK*40&-1)+32>>2]|0;hG=(a[gw+(hK*40&-1)|0]&1)==0;hK=(gG|0)>0;hF=30672;hp=116448;L5275:while(1){L5277:do{if(!hG){if(hK){hR=0;hS=0;gC=nd;while(1){gz=a[hp+hR|0]|0;if(gz<<24>>24==(a[gB+(hR+gC|0)|0]|0)){zO=gC;zP=hS}else{if(gz<<24>>24!=36){break L5277}zO=gC-1|0;zP=1}zQ=hR+1|0;if((zQ|0)<(zP+gG|0)){hR=zQ;hS=zP;gC=zO}else{break}}if((zP|0)==0){zR=zQ}else{zS=hF;break L5275}}else{zR=0}gC=a[hp+zR|0]|0;if((gC<<24>>24|0)==36|(gC<<24>>24|0)==0){zS=hF;break L5275}}}while(0);gC=hF+8|0;hS=c[gC>>2]|0;if((hS|0)==0){zS=gC;break}else{hF=gC;hp=hS}}hp=c[zS+4>>2]|0;zT=gv+3|0;c[13898]=zT;if((hp|0)==-1){b7=3860;break L27}if((hp&4|0)!=0){b7=5275;break L27}if((hp|0)==392|(hp|0)==368){b7=5276;break L27}c[10058]=hp;if((hp|0)!=345){break}hE(43400);if((c[10850]|0)!=0){break}c[10851]=0;break}else if((hB|0)==3){jr(43280);break}else if((hB|0)==4){hJ(49488,c[12372]|0,c[12373]|0,c[12374]|0,49504);break}else if((hB|0)==5){hp=gv+2|0;c[13898]=hp;L5298:do{if((hp|0)<(c[8272]|0)){L5300:do{if((a[gw+(hp*40&-1)|0]&1)!=0){hF=c[gw+(hp*40&-1)+36>>2]|0;gG=gw+(hp*40&-1)+32|0;nd=0;while(1){if((nd|0)>=(hF|0)){break}if((a[gB+((c[gG>>2]|0)+nd|0)|0]|0)==(a[nd+103664|0]|0)){nd=nd+1|0}else{break L5300}}if((nd|0)==1){b7=3885;break L5298}}}while(0);gG=is(U)|0;hF=c[gG>>2]|0;if((hF|0)==1){zU=+(c[gG+8>>2]|0)}else if((hF|0)==2){zU=+h[gG+8>>3]}else if((hF|0)==3){zU=+uz(c[gG+8>>2]|0,0)}else{b7=3879;break L27}if((c[fp>>2]|0)==3){uu(c[fq>>2]|0);c[fp>>2]=1}gG=~~zU;if((gG|0)<1){b7=3884;break L27}zV=gG;zW=c[10824]|0;b7=3888}else{b7=3885}}while(0);L5316:do{if((b7|0)==3885){b7=0;hp=c[10824]|0;if((hp|0)==0){zX=1;zY=0;zZ=0;b7=3892;break}else{z_=1;z$=hp}while(1){if((c[z$+4>>2]|0)!=(z_|0)){zV=z_;zW=hp;b7=3888;break L5316}gG=z_+1|0;hF=c[z$>>2]|0;if((hF|0)==0){zV=gG;zW=hp;b7=3888;break}else{z_=gG;z$=hF}}}}while(0);L5321:do{if((b7|0)==3888){b7=0;if((zW|0)==0){zX=zV;zY=0;zZ=0;b7=3892;break}else{z0=zW;z1=0}while(1){z2=c[z0+4>>2]|0;if((zV|0)<=(z2|0)){break}hp=c[z0>>2]|0;if((hp|0)==0){zX=zV;zY=0;zZ=z0;b7=3892;break L5321}else{z1=z0;z0=hp}}if((zV|0)==(z2|0)){z3=z0}else{zX=zV;zY=z0;zZ=z1;b7=3892}}}while(0);if((b7|0)==3892){b7=0;hp=ut(120)|0;if((hp|0)==0){gk();hF=ut(120)|0;if((hF|0)==0){b7=3894;break L27}else{z4=hF}}else{z4=hp}hp=z4;hF=z4+8|0;c[hF>>2]=-1;c[z4+12>>2]=0;gG=z4+16|0;c[gG>>2]=c[12872];c[gG+4>>2]=c[12873];c[gG+8>>2]=c[12874];c[gG+12>>2]=c[12875];c[gG+16>>2]=c[12876];c[gG+20>>2]=c[12877];c[gG+24>>2]=c[12878];c[gG+28>>2]=c[12879];c[gG+32>>2]=c[12880];c[gG+36>>2]=c[12881];c[gG+40>>2]=c[12882];c[gG+44>>2]=c[12883];c[gG+48>>2]=c[12884];c[gG+52>>2]=c[12885];c[z4+72>>2]=1;h[z4+80>>3]=0.0;c[z4+88>>2]=0;h[z4+96>>3]=15.0;h[z4+104>>3]=90.0;c[z4+112>>2]=0;if((zZ|0)==0){c[10824]=hp}else{c[zZ>>2]=hp}c[hF>>2]=zX;c[z4+4>>2]=zX;c[z4>>2]=zY;z3=hp}hp=c[13898]|0;L5337:do{if((hp|0)<(c[8272]|0)){hF=c[1054]|0;L5339:do{if((a[hF+(hp*40&-1)|0]&1)!=0){gG=c[hF+(hp*40&-1)+36>>2]|0;hK=hF+(hp*40&-1)+32|0;hG=c[10036]|0;hS=0;while(1){if((hS|0)>=(gG|0)){b7=3904;break}if((a[hG+((c[hK>>2]|0)+hS|0)|0]|0)==(a[hS+103664|0]|0)){hS=hS+1|0}else{break}}if((b7|0)==3904){b7=0;if((hS|0)==1){b7=3905;break L5337}}if((gG|0)<=0){break}nd=0;gC=0;hR=c[hK>>2]|0;while(1){if((a[nd+184456|0]|0)==(a[hG+(nd+hR|0)|0]|0)){z5=hR;z6=gC}else{if((nd|0)!=3){break L5339}z5=hR-1|0;z6=1}gz=nd+1|0;if((gz|0)<(z6+gG|0)){nd=gz;gC=z6;hR=z5}else{break}}if((z6|0)==0){if(!((nd|0)==2|(nd|0)==7)){break}}c[z3+8>>2]=-1;c[z3+12>>2]=0;hR=z3+16|0;c[hR>>2]=c[12872];c[hR+4>>2]=c[12873];c[hR+8>>2]=c[12874];c[hR+12>>2]=c[12875];c[hR+16>>2]=c[12876];c[hR+20>>2]=c[12877];c[hR+24>>2]=c[12878];c[hR+28>>2]=c[12879];c[hR+32>>2]=c[12880];c[hR+36>>2]=c[12881];c[hR+40>>2]=c[12882];c[hR+44>>2]=c[12883];c[hR+48>>2]=c[12884];c[hR+52>>2]=c[12885];c[z3+72>>2]=1;h[z3+80>>3]=0.0;c[z3+88>>2]=0;h[z3+96>>3]=15.0;h[z3+104>>3]=90.0;c[z3+112>>2]=0;c[13898]=(c[13898]|0)+1;break L5337}}while(0);hL(z3+8|0,0)}else{b7=3905}}while(0);if((b7|0)==3905){b7=0;c[z3+8>>2]=-1;c[z3+12>>2]=0;hp=z3+16|0;c[hp>>2]=c[12872];c[hp+4>>2]=c[12873];c[hp+8>>2]=c[12874];c[hp+12>>2]=c[12875];c[hp+16>>2]=c[12876];c[hp+20>>2]=c[12877];c[hp+24>>2]=c[12878];c[hp+28>>2]=c[12879];c[hp+32>>2]=c[12880];c[hp+36>>2]=c[12881];c[hp+40>>2]=c[12882];c[hp+44>>2]=c[12883];c[hp+48>>2]=c[12884];c[hp+52>>2]=c[12885];c[z3+72>>2]=1;h[z3+80>>3]=0.0;c[z3+88>>2]=0;h[z3+96>>3]=15.0;h[z3+104>>3]=90.0;c[z3+112>>2]=0}z7=c[13898]|0;if((z7|0)>=(c[8272]|0)){break}hp=c[1054]|0;if((a[hp+(z7*40&-1)|0]&1)==0){b7=5277;break L27}hF=c[hp+(z7*40&-1)+36>>2]|0;hR=hp+(z7*40&-1)+32|0;hp=c[10036]|0;gC=0;while(1){if((gC|0)>=(hF|0)){break}if((a[hp+((c[hR>>2]|0)+gC|0)|0]|0)==(a[gC+103664|0]|0)){gC=gC+1|0}else{b7=5278;break L27}}if((gC|0)==1){break}else{b7=5279;break L27}}else if((hB|0)==8){c[13898]=gv+2;jx(-2,1);break}else if((hB|0)==6){hR=gv+2|0;c[13898]=gv+3;hp=c[gw+(hR*40&-1)+36>>2]|0;if(!((a[gw+(hR*40&-1)|0]&1)!=0&(hp|0)>0)){break}hF=0;gG=0;hG=c[gw+(hR*40&-1)+32>>2]|0;while(1){if((a[hF+213440|0]|0)==(a[gB+(hF+hG|0)|0]|0)){z8=hG;z9=gG}else{if((hF|0)!=1){break L44}z8=hG-1|0;z9=1}hR=hF+1|0;if((hR|0)<(z9+hp|0)){hF=hR;gG=z9;hG=z8}else{break}}if((z9|0)==0){if(!((hF|0)==0|(hF|0)==6)){break}}dl(50952,0);break}else if((hB|0)==10){uD(ft|0,51296,192);c[9670]=3;hG=c[8272]|0;if((zm|0)>=(hG|0)){break}if((a[gH]&1)==0){break}gG=c[nh>>2]|0;hp=0;while(1){if((hp|0)>=(gG|0)){b7=4013;break}if((a[gB+((c[gF>>2]|0)+hp|0)|0]|0)==(a[hp+103664|0]|0)){hp=hp+1|0}else{Aa=0;break}}if((b7|0)==4013){b7=0;if((hp|0)==1){break}else{Aa=0}}while(1){if((Aa|0)>=(gG|0)){b7=4016;break}if((a[gB+((c[gF>>2]|0)+Aa|0)|0]|0)==(a[Aa+198768|0]|0)){Aa=Aa+1|0}else{b7=4017;break}}if((b7|0)==4016){b7=0;if((Aa|0)!=2){b7=4017}}do{if((b7|0)==4017){b7=0;if((gG|0)<=0){break L44}hp=0;nh=0;gH=c[gF>>2]|0;while(1){if((a[hp+116200|0]|0)==(a[gB+(hp+gH|0)|0]|0)){Ab=gH;Ac=nh}else{if((hp|0)!=4){break L44}Ab=gH-1|0;Ac=1}hF=hp+1|0;if((hF|0)<(Ac+gG|0)){hp=hF;nh=Ac;gH=Ab}else{break}}if((Ac|0)!=0){break}if(!((hp|0)==3|(hp|0)==9)){break L44}}}while(0);gG=gv+2|0;c[13898]=gG;if((gG|0)<(hG|0)){Ad=gG;Ae=hG;Af=gw}else{break}while(1){gG=(a[Af+(Ad*40&-1)|0]&1)==0;gF=c[Af+(Ad*40&-1)+36>>2]|0;gH=Af+(Ad*40&-1)+32|0;L5408:do{if(gG){Ag=c[gH>>2]|0;b7=4064}else{nh=c[10036]|0;hF=0;while(1){if((hF|0)>=(gF|0)){b7=4031;break}gC=c[gH>>2]|0;if((a[nh+(gC+hF|0)|0]|0)==(a[hF+103664|0]|0)){hF=hF+1|0}else{Ah=gC;break}}if((b7|0)==4031){b7=0;if((hF|0)==1){break L44}Ah=c[gH>>2]|0}if((gF|0)>0){Ai=0;Aj=0;Ak=Ah}else{Ag=Ah;b7=4064;break}while(1){if((a[Ai+197904|0]|0)==(a[nh+(Ai+Ak|0)|0]|0)){Al=Ak;Am=Aj}else{if((Ai|0)!=5){An=0;Ao=0;Ap=Ah;break}Al=Ak-1|0;Am=1}nd=Ai+1|0;if((nd|0)<(Am+gF|0)){Ai=nd;Aj=Am;Ak=Al}else{b7=4038;break}}do{if((b7|0)==4038){b7=0;if((Am|0)==0){if(!((Ai|0)==4|(Ai|0)==9)){An=0;Ao=0;Ap=Ah;break}}c[9670]=3;c[13898]=Ad+1;break L5408}}while(0);while(1){if((a[An+197448|0]|0)==(a[nh+(An+Ap|0)|0]|0)){Aq=Ap;Ar=Ao}else{if((An|0)!=5){As=0;At=0;Au=Ah;break}Aq=Ap-1|0;Ar=1}hF=An+1|0;if((hF|0)<(Ar+gF|0)){An=hF;Ao=Ar;Ap=Aq}else{b7=4045;break}}do{if((b7|0)==4045){b7=0;if((Ar|0)==0){if(!((An|0)==4|(An|0)==9)){As=0;At=0;Au=Ah;break}}c[9670]=4;c[13898]=Ad+1;break L5408}}while(0);while(1){if((a[As+196808|0]|0)==(a[nh+(As+Au|0)|0]|0)){Av=Au;Aw=At}else{if((As|0)!=4){Ax=0;Ay=0;Az=Ah;break}Av=Au-1|0;Aw=1}hF=As+1|0;if((hF|0)<(Aw+gF|0)){As=hF;At=Aw;Au=Av}else{b7=4054;break}}do{if((b7|0)==4054){b7=0;if((Aw|0)==0){if(!((As|0)==3|(As|0)==10)){Ax=0;Ay=0;Az=Ah;break}}c[9670]=1;c[13898]=Ad+1;break L5408}}while(0);while(1){if((a[Ax+196176|0]|0)==(a[nh+(Ax+Az|0)|0]|0)){AA=Az;AB=Ay}else{if((Ax|0)!=7){Ag=Ah;b7=4064;break L5408}AA=Az-1|0;AB=1}hF=Ax+1|0;if((hF|0)<(AB+gF|0)){Ax=hF;Ay=AB;Az=AA}else{break}}if((AB|0)==0){if(!((Ax|0)==6|(Ax|0)==13)){Ag=Ah;b7=4064;break}}c[9670]=2;c[13898]=Ad+1}}while(0);L5461:do{if((b7|0)==4064){b7=0;gH=(Ae|0)>(Ad|0);L5463:do{if(gH){if(gG){break L44}hp=c[10036]|0;nh=0;while(1){if((nh|0)>=(gF|0)){break}if((a[hp+(nh+Ag|0)|0]|0)==(a[nh+195688|0]|0)){nh=nh+1|0}else{break L5463}}if((nh|0)!=3){break}AC=Ad+1|0;c[13898]=AC;if((a[Af+(AC*40&-1)|0]&1)!=0){b7=4079;break L27}hp=is(O)|0;hF=c[hp>>2]|0;if((hF|0)==1){AD=+(c[hp+8>>2]|0)}else if((hF|0)==2){AD=+h[hp+8>>3]}else if((hF|0)==3){AD=+uz(c[hp+8>>2]|0,0)}else{b7=4075;break L27}if((c[fu>>2]|0)==3){uu(c[fv>>2]|0);c[fu>>2]=1}c[9671]=~~AD;break L5461}}while(0);hp=(gF|0)>0;L5481:do{if(hp&(gG^1)){hF=c[10036]|0;nd=0;gC=0;hR=Ag;while(1){if((a[nd+125568|0]|0)==(a[hF+(nd+hR|0)|0]|0)){AE=hR;AF=gC}else{if((nd|0)!=2){break L5481}AE=hR-1|0;AF=1}hK=nd+1|0;if((hK|0)<(AF+gF|0)){nd=hK;gC=AF;hR=AE}else{break}}if((AF|0)==0){if(!((nd|0)==1|(nd|0)==5)){break}}c[fy>>2]=c[9720];c[fy+4>>2]=c[38884>>2];c[fy+8>>2]=c[38888>>2];c[fy+12>>2]=c[38892>>2];c[fy+16>>2]=c[38896>>2];c[fy+20>>2]=c[38900>>2];c[fy+24>>2]=c[38904>>2];c[fy+28>>2]=c[38908>>2];c[fy+32>>2]=c[38912>>2];c[fy+36>>2]=c[38916>>2];jq(S);c[9702]=c[fz>>2];c[38812>>2]=c[fz+4>>2];c[38816>>2]=c[fz+8>>2];c[38820>>2]=c[fz+12>>2];c[9720]=c[fy>>2];c[38884>>2]=c[fy+4>>2];c[38888>>2]=c[fy+8>>2];c[38892>>2]=c[fy+12>>2];c[38896>>2]=c[fy+16>>2];c[38900>>2]=c[fy+20>>2];c[38904>>2]=c[fy+24>>2];c[38908>>2]=c[fy+28>>2];c[38912>>2]=c[fy+32>>2];c[38916>>2]=c[fy+36>>2];c[9700]=c[16630];break L5461}}while(0);L5494:do{if(gH){if(gG){break L44}hR=c[10036]|0;gC=0;while(1){if((gC|0)>=(gF|0)){break}if((a[hR+(gC+Ag|0)|0]|0)==(a[gC+128296|0]|0)){gC=gC+1|0}else{b7=4095;break L5494}}if((gC|0)!=2){b7=4095;break}if((c[9670]|0)!=4){break L44}}else{b7=4095}}while(0);if((b7|0)==4095){b7=0;if(gG){break L44}if(hp){gH=c[10036]|0;hR=0;nd=0;hF=Ag;while(1){if((a[hR+128400|0]|0)==(a[gH+(hR+hF|0)|0]|0)){AG=hF;AH=nd}else{if((hR|0)!=5){break L44}AG=hF-1|0;AH=1}AI=hR+1|0;if((AI|0)<(AH+gF|0)){hR=AI;nd=AH;hF=AG}else{break}}if((AH|0)==0){AJ=AI;b7=4103}else{AK=1}}else{AJ=0;b7=4103}if((b7|0)==4103){b7=0;AK=(AJ|0)==5|(AJ|0)==10}if(!(AK&(c[9670]|0)==4)){break L44}}c[13898]=Ad+1;hF=is(R)|0;nd=c[hF>>2]|0;if((nd|0)==1){AL=+(c[hF+8>>2]|0)}else if((nd|0)==2){AL=+h[hF+8>>3]}else if((nd|0)==3){AL=+uz(c[hF+8>>2]|0,0)}else{b7=4110;break L27}if((c[fw>>2]|0)==3){uu(c[fx>>2]|0);c[fw>>2]=1}h[4840]=AL;if(AL>0.0){break}h[4840]=1.0}}while(0);gF=c[13898]|0;gG=c[8272]|0;if((gF|0)>=(gG|0)){break L44}Ad=gF;Ae=gG;Af=c[1054]|0}}else if((hB|0)==9){hG=gv+2|0;c[13898]=hG;L5530:do{if((hG|0)<(c[8272]|0)){if((a[gw+(hG*40&-1)|0]&1)==0){break}gG=c[gw+(hG*40&-1)+36>>2]|0;gF=gw+(hG*40&-1)+32|0;hF=0;while(1){if((hF|0)>=(gG|0)){b7=4120;break}nd=c[gF>>2]|0;if((a[gB+(nd+hF|0)|0]|0)==(a[hF+103664|0]|0)){hF=hF+1|0}else{AM=nd;break}}if((b7|0)==4120){b7=0;if((hF|0)==1){b7=4129;break}AM=c[gF>>2]|0}if((gG|0)>0){AN=0;AO=0;AP=AM}else{break}while(1){if((a[AN+184456|0]|0)==(a[gB+(AN+AP|0)|0]|0)){AQ=AP;AR=AO}else{if((AN|0)!=3){AS=0;AT=0;AU=AM;break}AQ=AP-1|0;AR=1}nd=AN+1|0;if((nd|0)<(AR+gG|0)){AN=nd;AO=AR;AP=AQ}else{b7=4127;break}}if((b7|0)==4127){b7=0;if((AR|0)!=0){b7=4129;break}if((AN|0)==2|(AN|0)==7){b7=4129;break}else{AS=0;AT=0;AU=AM}}while(1){if((a[AS+209024|0]|0)==(a[gB+(AS+AU|0)|0]|0)){AV=AU;AW=AT}else{if((AS|0)!=1){break L5530}AV=AU-1|0;AW=1}gF=AS+1|0;if((gF|0)<(AW+gG|0)){AS=gF;AT=AW;AU=AV}else{break}}if((AW|0)==0){if(!((AS|0)==0|(AS|0)==10)){break}}a[30080]=1}else{b7=4129}}while(0);if((b7|0)==4129){b7=0;a[30080]=0}c[13898]=gv+3;break}else if((hB|0)==11){hG=gv+2|0;c[13898]=hG;gG=c[8272]|0;gF=(hG|0)<(gG|0);L5563:do{if(gF){if((a[gw+(hG*40&-1)|0]&1)==0){AX=hG;AY=gG;AZ=gw;break}hF=c[gw+(hG*40&-1)+36>>2]|0;nd=gw+(hG*40&-1)+32|0;hR=0;while(1){if((hR|0)>=(hF|0)){break}if((a[gB+((c[nd>>2]|0)+hR|0)|0]|0)==(a[hR+103664|0]|0)){hR=hR+1|0}else{b7=4145;break L5563}}if((hR|0)==1){b7=4144}else{b7=4145}}else{b7=4144}}while(0);if((b7|0)==4144){b7=0;uE(cW|0,0,3);hB=56248;c[hB>>2]=0;c[hB+4>>2]=0;h[7032]=1.5;a[56264]=1;a[56265]=a[cW]|0;a[56266|0]=a[cW+1|0]|0;a[56267|0]=a[cW+2|0]|0;c[14067]=6;c[14068]=252;c[14069]=0;h[7035]=1.0;c[14072]=1;c[14073]=0;b7=4145}if((b7|0)==4145){b7=0;if(gF){AX=hG;AY=gG;AZ=gw}else{break}}while(1){hB=(a[AZ+(AX*40&-1)|0]&1)==0;nd=c[AZ+(AX*40&-1)+36>>2]|0;hF=AZ+(AX*40&-1)+32|0;L5576:do{if(hB){A_=c[hF>>2]|0;b7=4176}else{gH=c[10036]|0;hp=0;while(1){if((hp|0)>=(nd|0)){b7=4151;break}nh=c[hF>>2]|0;if((a[gH+(nh+hp|0)|0]|0)==(a[hp+103664|0]|0)){hp=hp+1|0}else{A$=nh;break}}if((b7|0)==4151){b7=0;if((hp|0)==1){break L44}A$=c[hF>>2]|0}if((nd|0)>0){A0=0;A1=0;A2=A$}else{A_=A$;b7=4176;break}while(1){if((a[A0+207888|0]|0)==(a[gH+(A0+A2|0)|0]|0)){A3=A2;A4=A1}else{if((A0|0)!=5){A5=0;A6=0;A7=A$;break}A3=A2-1|0;A4=1}nh=A0+1|0;if((nh|0)<(A4+nd|0)){A0=nh;A1=A4;A2=A3}else{b7=4158;break}}do{if((b7|0)==4158){b7=0;if((A4|0)==0){if(!((A0|0)==4|(A0|0)==10)){A5=0;A6=0;A7=A$;break}}a[56264]=0;c[13898]=AX+1;break L5576}}while(0);while(1){if((a[A5+207040|0]|0)==(a[gH+(A5+A7|0)|0]|0)){A8=A7;A9=A6}else{if((A5|0)!=3){Ba=0;Bb=0;Bc=A$;break}A8=A7-1|0;A9=1}hp=A5+1|0;if((hp|0)<(A9+nd|0)){A5=hp;A6=A9;A7=A8}else{b7=4165;break}}do{if((b7|0)==4165){b7=0;if((A9|0)==0){if(!((A5|0)==2|(A5|0)==8)){Ba=0;Bb=0;Bc=A$;break}}a[56264]=1;c[13898]=AX+1;break L5576}}while(0);while(1){if((a[Ba+206448|0]|0)==(a[gH+(Ba+Bc|0)|0]|0)){Bd=Bc;Be=Bb}else{if((Ba|0)!=5){A_=A$;b7=4176;break L5576}Bd=Bc-1|0;Be=1}hp=Ba+1|0;if((hp|0)<(Be+nd|0)){Ba=hp;Bb=Be;Bc=Bd}else{break}}if((Be|0)!=0){b7=4182;break}if((Ba|0)==4|(Ba|0)==9){b7=4182}else{A_=A$;b7=4176}}}while(0);L5616:do{if((b7|0)==4176){b7=0;L5618:do{if((AY|0)>(AX|0)){if(hB){b7=5292;break L27}hF=c[10036]|0;hR=0;while(1){if((hR|0)>=(nd|0)){b7=4181;break}if((a[hF+(hR+A_|0)|0]|0)==(a[hR+205624|0]|0)){hR=hR+1|0}else{Bf=0;break}}if((b7|0)==4181){b7=0;if((hR|0)==2){b7=4182;break L5616}else{Bf=0}}while(1){if((Bf|0)>=(nd|0)){break}if((a[hF+(Bf+A_|0)|0]|0)==(a[Bf+205008|0]|0)){Bf=Bf+1|0}else{break L5618}}if((Bf|0)!=5){break}c[13898]=AX+1;c[14062]=0;hF=is(L)|0;hR=c[hF>>2]|0;if((hR|0)==1){Bg=+(c[hF+8>>2]|0)}else if((hR|0)==2){Bg=+h[hF+8>>3]}else if((hR|0)==3){Bg=+uz(c[hF+8>>2]|0,0)}else{b7=4197;break L27}if((c[fA>>2]|0)==3){uu(c[fB>>2]|0);c[fA>>2]=1}h[7032]=Bg;break L5616}}while(0);if(!((nd|0)>0&(hB^1))){b7=5293;break L27}hF=c[10036]|0;hR=0;gC=0;gH=A_;while(1){if((a[hR+204616|0]|0)==(a[hF+(hR+gH|0)|0]|0)){Bh=gH;Bi=gC}else{if((hR|0)!=4){Bj=0;Bk=0;Bl=A_;break}Bh=gH-1|0;Bi=1}hp=hR+1|0;if((hp|0)<(Bi+nd|0)){hR=hp;gC=Bi;gH=Bh}else{b7=4207;break}}do{if((b7|0)==4207){b7=0;if((Bi|0)==0){if(!((hR|0)==8|(hR|0)==3)){Bj=0;Bk=0;Bl=A_;break}}c[13898]=AX+1;gH=is(K)|0;gC=c[gH>>2]|0;if((gC|0)==1){Bm=+(c[gH+8>>2]|0)}else if((gC|0)==2){Bm=+h[gH+8>>3]}else if((gC|0)==3){Bm=+uz(c[gH+8>>2]|0,0)}else{b7=4213;break L27}if((c[fE>>2]|0)==3){uu(c[fF>>2]|0);c[fE>>2]=1}h[7032]=Bm;if(Bm<0.0|Bm>1.0){b7=4217;break L27}c[14062]=1;break L5616}}while(0);while(1){if((a[Bj+204096|0]|0)==(a[hF+(Bj+Bl|0)|0]|0)){Bn=Bl;Bo=Bk}else{if((Bj|0)!=6){Bp=0;Bq=0;Br=A_;break}Bn=Bl-1|0;Bo=1}hR=Bj+1|0;if((hR|0)<(Bo+nd|0)){Bj=hR;Bk=Bo;Bl=Bn}else{b7=4223;break}}do{if((b7|0)==4223){b7=0;if((Bo|0)==0){if(!((Bj|0)==12|(Bj|0)==5)){Bp=0;Bq=0;Br=A_;break}}c[13898]=AX+1;c[14068]=252;break L5616}}while(0);while(1){if((a[Bp+203848|0]|0)==(a[hF+(Bp+Br|0)|0]|0)){Bs=Br;Bt=Bq}else{if((Bp|0)!=7){Bu=0;Bv=0;Bw=A_;break}Bs=Br-1|0;Bt=1}hR=Bp+1|0;if((hR|0)<(Bt+nd|0)){Bp=hR;Bq=Bt;Br=Bs}else{b7=4230;break}}do{if((b7|0)==4230){b7=0;if((Bt|0)==0){if(!((Bp|0)==11|(Bp|0)==6)){Bu=0;Bv=0;Bw=A_;break}}c[13898]=AX+1;c[14068]=257;break L5616}}while(0);while(1){if((a[Bu+203640|0]|0)==(a[hF+(Bu+Bw|0)|0]|0)){Bx=Bw;By=Bv}else{if((Bu|0)!=3){Bz=0;BA=0;BB=A_;break}Bx=Bw-1|0;By=1}hR=Bu+1|0;if((hR|0)<(By+nd|0)){Bu=hR;Bv=By;Bw=Bx}else{b7=4237;break}}do{if((b7|0)==4237){b7=0;if((By|0)==0){if(!((Bu|0)==10|(Bu|0)==2)){Bz=0;BA=0;BB=A_;break}}c[13898]=AX+1;hR=is(N)|0;gH=c[hR>>2]|0;if((gH|0)==1){BC=+(c[hR+8>>2]|0)}else if((gH|0)==2){BC=+h[hR+8>>3]}else if((gH|0)==3){BC=+uz(c[hR+8>>2]|0,0)}else{b7=4243;break L27}if((c[fC>>2]|0)==3){uu(c[fD>>2]|0);c[fC>>2]=1}h[7035]=BC;if(BC<0.0){b7=4247;break L27}else{break L5616}}}while(0);while(1){if((a[Bz+203048|0]|0)==(a[hF+(Bz+BB|0)|0]|0)){BD=BB;BE=BA}else{if((Bz|0)!=3){BF=0;BG=0;BH=A_;break}BD=BB-1|0;BE=1}hR=Bz+1|0;if((hR|0)<(BE+nd|0)){Bz=hR;BA=BE;BB=BD}else{b7=4252;break}}do{if((b7|0)==4252){b7=0;if((BE|0)==0){if(!((Bz|0)==6|(Bz|0)==2)){BF=0;BG=0;BH=A_;break}}hR=AX+1|0;c[13898]=hR;if((AY|0)<=(hR|0)){b7=5288;break L27}if((a[AZ+(hR*40&-1)|0]&1)==0){b7=5289;break L27}gH=c[AZ+(hR*40&-1)+36>>2]|0;gC=AZ+(hR*40&-1)+32|0;hR=0;while(1){if((hR|0)>=(gH|0)){b7=4259;break}if((a[hF+((c[gC>>2]|0)+hR|0)|0]|0)==(a[hR+150208|0]|0)){hR=hR+1|0}else{BI=0;b7=4261;break}}do{if((b7|0)==4259){b7=0;if((hR|0)!=3){BI=0;b7=4261;break}c[14072]=0}}while(0);L5721:do{if((b7|0)==4261){while(1){b7=0;if((BI|0)>=(gH|0)){b7=4263;break}if((a[hF+((c[gC>>2]|0)+BI|0)|0]|0)==(a[BI+202352|0]|0)){BI=BI+1|0;b7=4261}else{BJ=0;break}}do{if((b7|0)==4263){b7=0;if((BI|0)!=1){BJ=0;break}c[14072]=2;break L5721}}while(0);while(1){if((BJ|0)>=(gH|0)){b7=4267;break}if((a[hF+((c[gC>>2]|0)+BJ|0)|0]|0)==(a[BJ+108208|0]|0)){BJ=BJ+1|0}else{BK=0;break}}do{if((b7|0)==4267){b7=0;if((BJ|0)!=2){BK=0;break}c[14072]=3;break L5721}}while(0);while(1){if((BK|0)>=(gH|0)){break}if((a[hF+((c[gC>>2]|0)+BK|0)|0]|0)==(a[BK+201e3|0]|0)){BK=BK+1|0}else{b7=5290;break L27}}if((BK|0)!=4){b7=5291;break L27}c[14072]=1}}while(0);c[13898]=AX+2;break L5616}}while(0);while(1){if((a[BF+199432|0]|0)==(a[hF+(BF+BH|0)|0]|0)){BL=BH;BM=BG}else{if((BF|0)!=2){BN=0;BO=0;BP=A_;break}BL=BH-1|0;BM=1}gC=BF+1|0;if((gC|0)<(BM+nd|0)){BF=gC;BG=BM;BH=BL}else{b7=4279;break}}do{if((b7|0)==4279){b7=0;if((BM|0)==0){if(!((BF|0)==1|(BF|0)==6)){BN=0;BO=0;BP=A_;break}}a[56292]=1;c[13898]=AX+1;break L5616}}while(0);while(1){if((a[BN+199064|0]|0)==(a[hF+(BN+BP|0)|0]|0)){BQ=BP;BR=BO}else{if((BN|0)!=2){b7=5294;break L27}BQ=BP-1|0;BR=1}gC=BN+1|0;if((gC|0)<(BR+nd|0)){BN=gC;BO=BR;BP=BQ}else{break}}if((BR|0)==0){if(!((BN|0)==1|(BN|0)==8)){b7=5295;break L27}}a[56292]=0;c[13898]=AX+1}}while(0);if((b7|0)==4182){b7=0;c[13898]=AX+1;nd=is(M)|0;hB=c[nd>>2]|0;if((hB|0)==1){BS=+(c[nd+8>>2]|0)}else if((hB|0)==2){BS=+h[nd+8>>3]}else if((hB|0)==3){BS=+uz(c[nd+8>>2]|0,0)}else{b7=4186;break L27}if((c[fG>>2]|0)==3){uu(c[fH>>2]|0);c[fG>>2]=1}c[14067]=~~BS-1}nd=c[13898]|0;hB=c[8272]|0;if((nd|0)>=(hB|0)){break L44}AX=nd;AY=hB;AZ=c[1054]|0}}else{b7=4290;break L27}}else if((gD|0)==84){c[13898]=gv+1;a[46752]=1}else if((gD|0)==86){gG=gv+1|0;c[13898]=gG;hG=c[3526]|0;if((hG|0)==0){BT=gG}else{az(hG|0);c[3526]=0;BT=c[13898]|0}L5778:do{if((BT|0)<(c[8272]|0)){hG=c[1054]|0;L5780:do{if((a[hG+(BT*40&-1)|0]&1)!=0){gG=c[hG+(BT*40&-1)+36>>2]|0;gF=hG+(BT*40&-1)+32|0;hB=c[10036]|0;nd=0;while(1){if((nd|0)>=(gG|0)){break}if((a[hB+((c[gF>>2]|0)+nd|0)|0]|0)==(a[nd+103664|0]|0)){nd=nd+1|0}else{break L5780}}if((nd|0)==1){break L5778}}}while(0);a[14176]=1;is(J);a[14176]=0;if((c[fI>>2]|0)!=3){c[13898]=BT;break}hG=c[fJ>>2]|0;if((hG|0)==0){break}gF=bF(hG|0,137896)|0;c[3526]=gF;if((gF|0)==0){b7=4304;break L27}uu(hG)}}while(0);a[14112]=1}else if((gD|0)==87){BU=gv+1|0;c[13898]=BU;if((a[33512]&1)!=0){b7=4308;break L27}L5795:do{if((BU|0)<(c[8272]|0)){L5797:do{if((a[gw+(BU*40&-1)|0]&1)!=0){hG=c[gw+(BU*40&-1)+36>>2]|0;gF=gw+(BU*40&-1)+32|0;hB=0;while(1){if((hB|0)>=(hG|0)){b7=4314;break}if((a[gB+((c[gF>>2]|0)+hB|0)|0]|0)==(a[hB+103664|0]|0)){hB=hB+1|0}else{BV=0;break}}if((b7|0)==4314){b7=0;if((hB|0)==1){break L5795}else{BV=0}}while(1){if((BV|0)>=(hG|0)){break}if((a[gB+((c[gF>>2]|0)+BV|0)|0]|0)==(a[BV+216664|0]|0)){BV=BV+1|0}else{break L5797}}if((BV|0)!=4){break}hz(a[37400]&1);c[13898]=(c[13898]|0)+1;break L44}}while(0);hO(1);c[8026]=0;do{if((a[14080]&1)!=0){if(a[13032]|0){gF=c[(c[3524]|0)+104>>2]|0;if((gF|0)!=0){cS[gF&511]()}a[13032]=0}if(a[14088]|0){cS[c[(c[3524]|0)+44>>2]&511]();a[14088]=0}if((a[14080]&1)==0){break}cS[c[(c[3524]|0)+40>>2]&511]();a[14080]=0;c[10028]=0}}while(0);gF=c[13898]|0;L5823:do{if((c[8272]|0)>(gF|0)){hG=c[1054]|0;if((a[hG+(gF*40&-1)|0]&1)==0){break}hB=c[hG+(gF*40&-1)+36>>2]|0;nd=hG+(gF*40&-1)+32|0;hG=c[10036]|0;gG=0;while(1){if((gG|0)>=(hB|0)){break}if((a[hG+((c[nd>>2]|0)+gG|0)|0]|0)==(a[gG+216216|0]|0)){gG=gG+1|0}else{break L5823}}if((gG|0)!=3){break}hD();c[13898]=(c[13898]|0)+1;break L44}}while(0);c[3524]=0;gF=lz()|0;c[3524]=gF;a[13048]=0;if((gF|0)==0){break L44}cS[c[gF+32>>2]&511]();if((a[37400]&1)==0|(a[13048]|0)==0){break L44}gF=c[m>>2]|0;cf(gF|0,215680,(v=i,i=i+8|0,c[v>>2]=13048,v)|0);break L44}}while(0);ls();a[25280]=0}else if((gD|0)==88){gF=c[8272]|0;BW=gv+1|0;c[13898]=BW;if((BW|0)>=(gF|0)){break}nd=(a[gw+(BW*40&-1)|0]&1)==0;L5837:do{if(nd){BX=1}else{hG=c[gw+(BW*40&-1)+36>>2]|0;hB=gw+(BW*40&-1)+32|0;hF=0;while(1){if((hF|0)>=(hG|0)){break}if((a[gB+((c[hB>>2]|0)+hF|0)|0]|0)==(a[hF+103664|0]|0)){hF=hF+1|0}else{BX=1;break L5837}}BX=(hF|0)!=1}}while(0);hB=c[3524]|0;if(!(BX&(hB|0)!=0)){break}hG=c[gw+(BW*40&-1)+36>>2]|0;gC=c[gw+(BW*40&-1)+32>>2]|0;L5845:do{if(nd){b7=4406}else{gH=(hG|0)>0;L5847:do{if(gH){hR=0;hp=0;nh=gC;while(1){if((a[hR+122880|0]|0)==(a[gB+(hR+nh|0)|0]|0)){BY=nh;BZ=hp}else{if((hR|0)!=3){B_=0;B$=0;B0=gC;b7=4354;break}BY=nh-1|0;BZ=1}hK=hR+1|0;if((hK|0)<(BZ+hG|0)){hR=hK;hp=BZ;nh=BY}else{b7=4352;break}}do{if((b7|0)==4352){b7=0;if((BZ|0)!=0){break}if(!((hR|0)==2|(hR|0)==8)){B_=0;B$=0;B0=gC;b7=4354}}}while(0);do{if((b7|0)==4354){while(1){b7=0;if((a[B_+121536|0]|0)==(a[gB+(B_+B0|0)|0]|0)){B1=B0;B2=B$}else{if((B_|0)!=5){B3=0;break L5847}B1=B0-1|0;B2=1}hR=B_+1|0;if((hR|0)<(B2+hG|0)){B_=hR;B$=B2;B0=B1;b7=4354}else{break}}if((B2|0)!=0){break}if(!((B_|0)==4|(B_|0)==10)){B3=0;break L5847}}}while(0);hR=gv+2|0;c[8272]=(gF|0)<(hR|0)?gF:hR;if((c[hB+156>>2]|0)!=0){b7=4411;break L5845}c[13898]=hR;break L5845}else{B3=0}}while(0);while(1){if((B3|0)>=(hG|0)){b7=4364;break}if((a[gB+(B3+gC|0)|0]|0)==(a[B3+124352|0]|0)){B3=B3+1|0}else{B4=0;b7=4365;break}}if((b7|0)==4364){b7=0;if((B3|0)!=4){B4=0;b7=4365}}do{if((b7|0)==4365){while(1){b7=0;if((B4|0)>=(hG|0)){b7=4367;break}if((a[gB+(B4+gC|0)|0]|0)==(a[B4+223712|0]|0)){B4=B4+1|0;b7=4365}else{B5=0;break}}if((b7|0)==4367){b7=0;if((B4|0)==5){break}else{B5=0}}while(1){if((B5|0)>=(hG|0)){b7=4372;break}if((a[gB+(B5+gC|0)|0]|0)==(a[B5+128096|0]|0)){B5=B5+1|0}else{B6=0;break}}do{if((b7|0)==4372){b7=0;if((B5|0)!=9){B6=0;break}if((c[hB+96>>2]&4096|0)!=0){b7=4411;break L5845}c[13898]=gv+2;hF=is(H)|0;hR=c[hF>>2]|0;if((hR|0)==3){nh=c[hF+8>>2]|0;uz(nh,0)}else if(!((hR|0)==1|(hR|0)==2)){b7=4376;break L27}if((c[fM>>2]|0)!=3){break L5845}uu(c[fN>>2]|0);c[fM>>2]=1;break L5845}}while(0);while(1){if((B6|0)>=(hG|0)){b7=4381;break}if((a[gB+(B6+gC|0)|0]|0)==(a[B6+128296|0]|0)){B6=B6+1|0}else{b7=4382;break}}if((b7|0)==4381){b7=0;if((B6|0)!=2){b7=4382}}L5895:do{if((b7|0)==4382){b7=0;L5897:do{if(gH){hR=0;nh=0;hF=gC;while(1){if((a[hR+128400|0]|0)==(a[gB+(hR+hF|0)|0]|0)){B7=hF;B8=nh}else{if((hR|0)!=5){B9=0;Ca=0;Cb=gC;break}B7=hF-1|0;B8=1}hp=hR+1|0;if((hp|0)<(B8+hG|0)){hR=hp;nh=B8;hF=B7}else{b7=4387;break}}if((b7|0)==4387){b7=0;if((B8|0)!=0){break L5895}if((hR|0)==4|(hR|0)==9){break L5895}else{B9=0;Ca=0;Cb=gC}}while(1){if((a[B9+217752|0]|0)==(a[gB+(B9+Cb|0)|0]|0)){Cc=Cb;Cd=Ca}else{if((B9|0)!=4){Ce=0;b7=4401;break L5897}Cc=Cb-1|0;Cd=1}hF=B9+1|0;if((hF|0)<(Cd+hG|0)){B9=hF;Ca=Cd;Cb=Cc}else{break}}if((Cd|0)!=0){break}if(!((B9|0)==3|(B9|0)==6)){Ce=0;b7=4401}}else{Ce=0;b7=4401}}while(0);if((b7|0)==4401){while(1){b7=0;if((Ce|0)>=(hG|0)){break}if((a[gB+(Ce+gC|0)|0]|0)==(a[Ce+131504|0]|0)){Ce=Ce+1|0;b7=4401}else{b7=4406;break L5845}}if((Ce|0)!=5){b7=4406;break L5845}}if((c[hB+96>>2]&256|0)!=0){b7=4411;break L5845}c[13898]=gv+2;break L5845}}while(0);if((c[hB+96>>2]&2048|0)!=0){b7=4411;break L5845}c[13898]=gv+2;hR=is(I)|0;hF=c[hR>>2]|0;if((hF|0)==3){nh=c[hR+8>>2]|0;uz(nh,0)}else if(!((hF|0)==1|(hF|0)==2)){b7=4392;break L27}if((c[fK>>2]|0)!=3){break L5845}uu(c[fL>>2]|0);c[fK>>2]=1;break L5845}}while(0);gH=gv+3|0;c[8272]=(gF|0)<(gH|0)?gF:gH;if((c[hB+88>>2]|0)!=0){b7=4411;break}c[13898]=gH}}while(0);if((b7|0)==4406){b7=0;if((aY(c[hB>>2]|0,218960)|0)!=0|nd){b7=5296;break L27}else{Cf=0}while(1){if((Cf|0)>=(hG|0)){break}if((a[gB+(Cf+gC|0)|0]|0)==(a[Cf+218488|0]|0)){Cf=Cf+1|0}else{b7=5297;break L27}}if((Cf|0)==5&(gF|0)==4){b7=4411}else{b7=5298;break L27}}if((b7|0)==4411){b7=0;a[13048]=0;cS[c[hB+32>>2]&511]()}c[8272]=gF}else if((gD|0)==89){gC=gv+1|0;c[13898]=gC;hG=c[8272]|0;nd=(gC|0)<(hG|0);L5940:do{if(nd){if((a[gw+(gC*40&-1)|0]&1)==0){Cg=0;Ch=0;Ci=gC;Cj=hG;Ck=gw;b7=4421;break}gH=c[gw+(gC*40&-1)+36>>2]|0;hF=gw+(gC*40&-1)+32|0;nh=0;while(1){if((nh|0)>=(gH|0)){break}if((a[gB+((c[hF>>2]|0)+nh|0)|0]|0)==(a[nh+103664|0]|0)){nh=nh+1|0}else{b7=4420;break L5940}}if((nh|0)==1){b7=4419}else{b7=4420}}else{b7=4419}}while(0);if((b7|0)==4419){b7=0;a[65072]=1;a[65760]=1;a[66448]=1;a[67136]=1;a[67824]=1;a[68512]=1;a[69200]=1;a[69888]=1;a[70576]=1;a[71264]=1;a[71952]=1;b7=4420}if((b7|0)==4420){b7=0;if(nd){Cg=0;Ch=0;Ci=gC;Cj=hG;Ck=gw;b7=4421}else{Cl=0;Cm=0}}L5951:do{if((b7|0)==4421){while(1){b7=0;gF=(a[Ck+(Ci*40&-1)|0]&1)==0;hB=c[Ck+(Ci*40&-1)+36>>2]|0;hF=Ck+(Ci*40&-1)+32|0;L5954:do{if(gF){Cn=c[hF>>2]|0;b7=4620}else{gH=c[10036]|0;hR=0;while(1){if((hR|0)>=(hB|0)){b7=4426;break}hp=c[hF>>2]|0;if((a[gH+(hp+hR|0)|0]|0)==(a[hR+103664|0]|0)){hR=hR+1|0}else{Co=hp;break}}if((b7|0)==4426){b7=0;if((hR|0)==1){Cl=Cg;Cm=Ch;break L5951}Co=c[hF>>2]|0}if((hB|0)>0){Cp=0;Cq=0;Cr=Co}else{Cn=Co;b7=4620;break}while(1){if((a[Cp+116896|0]|0)==(a[gH+(Cp+Cr|0)|0]|0)){Cs=Cr;Ct=Cq}else{if((Cp|0)!=2){Cu=0;Cv=0;Cw=Co;break}Cs=Cr-1|0;Ct=1}hp=Cp+1|0;if((hp|0)<(Ct+hB|0)){Cp=hp;Cq=Ct;Cr=Cs}else{b7=4434;break}}do{if((b7|0)==4434){b7=0;if((Ct|0)==0){if(!((Cp|0)==1|(Cp|0)==4)){Cu=0;Cv=0;Cw=Co;break}}c[16229]=c[16229]&-4|2;c[16401]=c[16401]&-4|2;c[16573]=c[16573]&-4|2;c[16745]=c[16745]&-4|2;c[16917]=c[16917]&-4|2;c[17089]=c[17089]&-4|2;c[17261]=c[17261]&-4|2;c[17433]=c[17433]&-4|2;c[17605]=c[17605]&-4|2;c[17777]=c[17777]&-4|2;c[17949]=c[17949]&-4|2;c[13898]=Ci+1;Cx=1;Cy=Cg;break L5954}}while(0);while(1){if((a[Cu+141136|0]|0)==(a[gH+(Cu+Cw|0)|0]|0)){Cz=Cw;CA=Cv}else{if((Cu|0)!=2){CB=0;CC=0;CD=Co;break}Cz=Cw-1|0;CA=1}hR=Cu+1|0;if((hR|0)<(CA+hB|0)){Cu=hR;Cv=CA;Cw=Cz}else{b7=4441;break}}do{if((b7|0)==4441){b7=0;if((CA|0)==0){if(!((Cu|0)==1|(Cu|0)==6)){CB=0;CC=0;CD=Co;break}}c[16229]=c[16229]&-4|1;c[16401]=c[16401]&-4|1;c[16573]=c[16573]&-4|1;c[16745]=c[16745]&-4|1;c[16917]=c[16917]&-4|1;c[17089]=c[17089]&-4|1;c[17261]=c[17261]&-4|1;c[17433]=c[17433]&-4|1;c[17605]=c[17605]&-4|1;c[17777]=c[17777]&-4|1;c[17949]=c[17949]&-4|1;c[13898]=Ci+1;Cx=Ch;Cy=Cg;break L5954}}while(0);while(1){if((a[CB+115048|0]|0)==(a[gH+(CB+CD|0)|0]|0)){CE=CD;CF=CC}else{if((CB|0)!=2){CG=0;CH=0;CI=Co;break}CE=CD-1|0;CF=1}hR=CB+1|0;if((hR|0)<(CF+hB|0)){CB=hR;CC=CF;CD=CE}else{b7=4450;break}}do{if((b7|0)==4450){b7=0;if((CF|0)==0){if(!((CB|0)==1|(CB|0)==6)){CG=0;CH=0;CI=Co;break}}c[16229]=c[16229]|4;c[16401]=c[16401]|4;c[16573]=c[16573]|4;c[16745]=c[16745]|4;c[16917]=c[16917]|4;c[17089]=c[17089]|4;c[17261]=c[17261]|4;c[17433]=c[17433]|4;c[17605]=c[17605]|4;c[17777]=c[17777]|4;c[17949]=c[17949]|4;c[13898]=Ci+1;Cx=Ch;Cy=1;break L5954}}while(0);while(1){if((a[CG+114024|0]|0)==(a[gH+(CG+CI|0)|0]|0)){CJ=CI;CK=CH}else{if((CG|0)!=4){CL=0;CM=0;CN=Co;break}CJ=CI-1|0;CK=1}hR=CG+1|0;if((hR|0)<(CK+hB|0)){CG=hR;CH=CK;CI=CJ}else{b7=4457;break}}do{if((b7|0)==4457){b7=0;if((CK|0)==0){if(!((CG|0)==3|(CG|0)==8)){CL=0;CM=0;CN=Co;break}}c[16229]=c[16229]&-5;c[16401]=c[16401]&-5;c[16573]=c[16573]&-5;c[16745]=c[16745]&-5;c[16917]=c[16917]&-5;c[17089]=c[17089]&-5;c[17261]=c[17261]&-5;c[17433]=c[17433]&-5;c[17605]=c[17605]&-5;c[17777]=c[17777]&-5;c[17949]=c[17949]&-5;c[13898]=Ci+1;Cx=Ch;Cy=1;break L5954}}while(0);while(1){if((a[CL+110600|0]|0)==(a[gH+(CL+CN|0)|0]|0)){CO=CN;CP=CM}else{if((CL|0)!=2){CQ=0;CR=0;CS=Co;break}CO=CN-1|0;CP=1}hR=CL+1|0;if((hR|0)<(CP+hB|0)){CL=hR;CM=CP;CN=CO}else{b7=4464;break}}do{if((b7|0)==4464){b7=0;if((CP|0)==0){if(!((CL|0)==1|(CL|0)==7)){CQ=0;CR=0;CS=Co;break}}a[65072]=1;a[65760]=1;a[66448]=1;a[67136]=1;a[67824]=1;a[68512]=1;a[69200]=1;a[69888]=1;a[70576]=1;a[71264]=1;a[71952]=1;c[13898]=Ci+1;Cx=Ch;Cy=Cg;break L5954}}while(0);while(1){if((a[CQ+107800|0]|0)==(a[gH+(CQ+CS|0)|0]|0)){CT=CS;CU=CR}else{if((CQ|0)!=3){CV=0;CW=0;CX=Co;break}CT=CS-1|0;CU=1}hR=CQ+1|0;if((hR|0)<(CU+hB|0)){CQ=hR;CR=CU;CS=CT}else{b7=4471;break}}do{if((b7|0)==4471){b7=0;if((CU|0)==0){if(!((CQ|0)==2|(CQ|0)==8)){CV=0;CW=0;CX=Co;break}}a[65072]=0;a[65760]=0;a[66448]=0;a[67136]=0;a[67824]=0;a[68512]=0;a[69200]=0;a[69888]=0;a[70576]=0;a[71264]=0;a[71952]=0;c[13898]=Ci+1;Cx=Ch;Cy=Cg;break L5954}}while(0);while(1){if((a[CV+106864|0]|0)==(a[gH+(CV+CX|0)|0]|0)){CY=CX;CZ=CW}else{if((CV|0)!=2){C_=0;C$=0;C0=Co;break}CY=CX-1|0;CZ=1}hR=CV+1|0;if((hR|0)<(CZ+hB|0)){CV=hR;CW=CZ;CX=CY}else{b7=4478;break}}do{if((b7|0)==4478){b7=0;if((CZ|0)==0){if(!((CV|0)==5|(CV|0)==1)){C_=0;C$=0;C0=Co;break}}hR=Ci+1|0;c[13898]=hR;hp=c[Ck+(hR*40&-1)+36>>2]|0;L6041:do{if((a[Ck+(hR*40&-1)|0]&1)!=0&(hp|0)>0){gG=0;hK=0;hS=c[Ck+(hR*40&-1)+32>>2]|0;while(1){if((a[gG+184456|0]|0)==(a[gH+(gG+hS|0)|0]|0)){C1=hS;C2=hK}else{if((gG|0)!=3){break L6041}C1=hS-1|0;C2=1}gz=gG+1|0;if((gz|0)<(C2+hp|0)){gG=gz;hK=C2;hS=C1}else{break}}if((C2|0)==0){if(!((gG|0)==2|(gG|0)==7)){break}}h[8132]=1.0;h[8133]=.5;h[8218]=1.0;h[8219]=.5;h[8304]=1.0;h[8305]=.5;h[8390]=1.0;h[8391]=.5;h[8476]=1.0;h[8477]=.5;h[8562]=1.0;h[8563]=.5;h[8648]=1.0;h[8649]=.5;h[8734]=1.0;h[8735]=.5;h[8820]=1.0;h[8821]=.5;h[8906]=1.0;h[8907]=.5;h[8992]=1.0;h[8993]=.5;c[13898]=Ci+2;Cx=Ch;Cy=Cg;break L5954}}while(0);hp=is(C)|0;hR=c[hp>>2]|0;if((hR|0)==1){C3=+(c[hp+8>>2]|0)}else if((hR|0)==2){C3=+h[hp+8>>3]}else if((hR|0)==3){C3=+uz(c[hp+8>>2]|0,0)}else{b7=4493;break L27}if((c[fV>>2]|0)==3){uu(c[fW>>2]|0);c[fV>>2]=1}hp=c[13898]|0;L6062:do{if((c[8272]|0)>(hp|0)){hR=c[1054]|0;if((a[hR+(hp*40&-1)|0]&1)==0){b7=4509;break}hS=c[hR+(hp*40&-1)+36>>2]|0;hK=hR+(hp*40&-1)+32|0;hR=c[10036]|0;gz=0;while(1){if((gz|0)>=(hS|0)){break}if((a[hR+((c[hK>>2]|0)+gz|0)|0]|0)==(a[gz+148464|0]|0)){gz=gz+1|0}else{b7=4509;break L6062}}if((gz|0)!=1){b7=4509;break}c[13898]=hp+1;hK=is(B)|0;hR=c[hK>>2]|0;if((hR|0)==1){C4=+(c[hK+8>>2]|0)}else if((hR|0)==2){C4=+h[hK+8>>3]}else if((hR|0)==3){C4=+uz(c[hK+8>>2]|0,0)}else{b7=4506;break L27}if((c[fX>>2]|0)!=3){C5=C4;break}uu(c[fY>>2]|0);c[fX>>2]=1;C5=C4}else{b7=4509}}while(0);if((b7|0)==4509){b7=0;C5=C3*.5}h[8132]=C3;h[8133]=C5;h[8218]=C3;h[8219]=C5;h[8304]=C3;h[8305]=C5;h[8390]=C3;h[8391]=C5;h[8476]=C3;h[8477]=C5;h[8562]=C3;h[8563]=C5;h[8648]=C3;h[8649]=C5;h[8734]=C3;h[8735]=C5;h[8820]=C3;h[8821]=C5;h[8906]=C3;h[8907]=C5;h[8992]=C3;h[8993]=C5;Cx=Ch;Cy=Cg;break L5954}}while(0);while(1){if((a[C_+104840|0]|0)==(a[gH+(C_+C0|0)|0]|0)){C6=C0;C7=C$}else{if((C_|0)!=2){C8=0;C9=0;Da=Co;break}C6=C0-1|0;C7=1}hp=C_+1|0;if((hp|0)<(C7+hB|0)){C_=hp;C$=C7;C0=C6}else{b7=4515;break}}do{if((b7|0)==4515){b7=0;if((C7|0)==0){if(!((C_|0)==1|(C_|0)==6)){C8=0;C9=0;Da=Co;break}}c[16258]=-270;c[16430]=-270;c[16602]=-270;c[16774]=-270;c[16946]=-270;c[17118]=-270;c[17290]=-270;c[17462]=-270;c[17634]=-270;c[17806]=-270;c[17978]=-270;hp=Ci+1|0;c[13898]=hp;if((Cj|0)<=(hp|0)){Cx=Ch;Cy=Cg;break L5954}if((a[Ck+(hp*40&-1)|0]&1)==0){Cx=Ch;Cy=Cg;break L5954}hK=c[Ck+(hp*40&-1)+36>>2]|0;hR=Ck+(hp*40&-1)+32|0;hp=0;while(1){if((hp|0)>=(hK|0)){break}if((a[gH+((c[hR>>2]|0)+hp|0)|0]|0)==(a[hp+163312|0]|0)){hp=hp+1|0}else{Cx=Ch;Cy=Cg;break L5954}}if((hp|0)!=2){Cx=Ch;Cy=Cg;break L5954}c[13898]=Ci+2;hR=is(D)|0;hK=c[hR>>2]|0;if((hK|0)==1){Db=+(c[hR+8>>2]|0)}else if((hK|0)==2){Db=+h[hR+8>>3]}else if((hK|0)==3){Db=+uz(c[hR+8>>2]|0,0)}else{b7=4527;break L27}if((c[fT>>2]|0)==3){uu(c[fU>>2]|0);c[fT>>2]=1}hR=~~Db;c[16258]=hR;c[16430]=hR;c[16602]=hR;c[16774]=hR;c[16946]=hR;c[17118]=hR;c[17290]=hR;c[17462]=hR;c[17634]=hR;c[17806]=hR;c[17978]=hR;Cx=Ch;Cy=Cg;break L5954}}while(0);while(1){if((a[C8+104240|0]|0)==(a[gH+(C8+Da|0)|0]|0)){Dc=Da;Dd=C9}else{if((C8|0)!=4){De=0;Df=0;Dg=Co;break}Dc=Da-1|0;Dd=1}hR=C8+1|0;if((hR|0)<(Dd+hB|0)){C8=hR;C9=Dd;Da=Dc}else{b7=4535;break}}do{if((b7|0)==4535){b7=0;if((Dd|0)==0){if(!((C8|0)==3|(C8|0)==8)){De=0;Df=0;Dg=Co;break}}c[16258]=0;c[16430]=0;c[16602]=0;c[16774]=0;c[16946]=0;c[17118]=0;c[17290]=0;c[17462]=0;c[17634]=0;c[17806]=0;c[17978]=0;c[13898]=Ci+1;Cx=Ch;Cy=Cg;break L5954}}while(0);while(1){if((a[De+149696|0]|0)==(a[gH+(De+Dg|0)|0]|0)){Dh=Dg;Di=Df}else{if((De|0)!=1){Dj=0;Dk=0;Dl=Co;break}Dh=Dg-1|0;Di=1}hR=De+1|0;if((hR|0)<(Di+hB|0)){De=hR;Df=Di;Dg=Dh}else{b7=4542;break}}do{if((b7|0)==4542){b7=0;if((Di|0)==0){if(!((De|0)==0|(De|0)==4)){Dj=0;Dk=0;Dl=Co;break}}c[16282]=0;a[65272]=1;c[16454]=0;a[65960]=1;c[16626]=0;a[66648]=1;c[16798]=0;a[67336]=1;c[16970]=0;a[68024]=1;c[17142]=0;a[68712]=1;c[17314]=0;a[69400]=1;c[17486]=0;a[70088]=1;c[17658]=0;a[70776]=1;c[17830]=0;a[71464]=1;c[18002]=0;a[72152]=1;c[13898]=Ci+1;Cx=Ch;Cy=Cg;break L5954}}while(0);while(1){if((a[Dj+179896|0]|0)==(a[gH+(Dj+Dl|0)|0]|0)){Dm=Dl;Dn=Dk}else{if((Dj|0)!=1){Do=0;Dp=0;Dq=Co;b7=4551;break}Dm=Dl-1|0;Dn=1}hR=Dj+1|0;if((hR|0)<(Dn+hB|0)){Dj=hR;Dk=Dn;Dl=Dm}else{b7=4549;break}}do{if((b7|0)==4549){b7=0;if((Dn|0)!=0){break}if(!((Dj|0)==0|(Dj|0)==6)){Do=0;Dp=0;Dq=Co;b7=4551}}}while(0);do{if((b7|0)==4551){while(1){b7=0;if((a[Do+149304|0]|0)==(a[gH+(Do+Dq|0)|0]|0)){Dr=Dq;Ds=Dp}else{if((Do|0)!=1){Dt=0;Du=0;Dv=Co;break}Dr=Dq-1|0;Ds=1}hR=Do+1|0;if((hR|0)<(Ds+hB|0)){Do=hR;Dp=Ds;Dq=Dr;b7=4551}else{b7=4555;break}}if((b7|0)==4555){b7=0;if((Ds|0)!=0){break}if((Do|0)==0|(Do|0)==6){break}else{Dt=0;Du=0;Dv=Co}}while(1){if((a[Dt+101272|0]|0)==(a[gH+(Dt+Dv|0)|0]|0)){Dw=Dv;Dx=Du}else{if((Dt|0)!=2){Dy=0;Dz=0;DA=Co;break}Dw=Dv-1|0;Dx=1}hp=Dt+1|0;if((hp|0)<(Dx+hB|0)){Dt=hp;Du=Dx;Dv=Dw}else{b7=4562;break}}do{if((b7|0)==4562){b7=0;if((Dx|0)==0){if(!((Dt|0)==1|(Dt|0)==5)){Dy=0;Dz=0;DA=Co;break}}c[16282]=2;a[65272]=1;c[16454]=2;a[65960]=1;c[16626]=2;a[66648]=1;c[16798]=2;a[67336]=1;c[16970]=2;a[68024]=1;c[17142]=2;a[68712]=1;c[17314]=2;a[69400]=1;c[17486]=2;a[70088]=1;c[17658]=2;a[70776]=1;c[17830]=2;a[71464]=1;c[18002]=2;a[72152]=1;c[13898]=Ci+1;Cx=Ch;Cy=Cg;break L5954}}while(0);while(1){if((a[Dy+100712|0]|0)==(a[gH+(Dy+DA|0)|0]|0)){DB=DA;DC=Dz}else{if((Dy|0)!=5){DD=0;DE=0;DF=Co;break}DB=DA-1|0;DC=1}hp=Dy+1|0;if((hp|0)<(DC+hB|0)){Dy=hp;Dz=DC;DA=DB}else{b7=4569;break}}do{if((b7|0)==4569){b7=0;if((DC|0)==0){if(!((Dy|0)==4|(Dy|0)==11)){DD=0;DE=0;DF=Co;break}}a[65272]=0;a[65960]=0;a[66648]=0;a[67336]=0;a[68024]=0;a[68712]=0;a[69400]=0;a[70088]=0;a[70776]=0;a[71464]=0;a[72152]=0;c[13898]=Ci+1;Cx=Ch;Cy=Cg;break L5954}}while(0);while(1){if((a[DD+152064|0]|0)==(a[gH+(DD+DF|0)|0]|0)){DG=DF;DH=DE}else{if((DD|0)!=3){DI=0;DJ=0;DK=Co;break}DG=DF-1|0;DH=1}hp=DD+1|0;if((hp|0)<(DH+hB|0)){DD=hp;DE=DH;DF=DG}else{b7=4576;break}}do{if((b7|0)==4576){b7=0;if((DH|0)==0){if(!((DD|0)==6|(DD|0)==2)){DI=0;DJ=0;DK=Co;break}}c[13898]=Ci+1;dl(F,4);c[16246]=c[fO>>2];c[64988>>2]=c[fO+4>>2];c[64992>>2]=c[fO+8>>2];c[64996>>2]=c[fO+12>>2];c[65e3>>2]=c[fO+16>>2];c[65004>>2]=c[fO+20>>2];c[65008>>2]=c[fO+24>>2];c[65012>>2]=c[fO+28>>2];c[65016>>2]=c[fO+32>>2];c[65020>>2]=c[fO+36>>2];c[16418]=c[fO>>2];c[65676>>2]=c[fO+4>>2];c[65680>>2]=c[fO+8>>2];c[65684>>2]=c[fO+12>>2];c[65688>>2]=c[fO+16>>2];c[65692>>2]=c[fO+20>>2];c[65696>>2]=c[fO+24>>2];c[65700>>2]=c[fO+28>>2];c[65704>>2]=c[fO+32>>2];c[65708>>2]=c[fO+36>>2];c[16590]=c[fO>>2];c[66364>>2]=c[fO+4>>2];c[66368>>2]=c[fO+8>>2];c[66372>>2]=c[fO+12>>2];c[66376>>2]=c[fO+16>>2];c[66380>>2]=c[fO+20>>2];c[66384>>2]=c[fO+24>>2];c[66388>>2]=c[fO+28>>2];c[66392>>2]=c[fO+32>>2];c[66396>>2]=c[fO+36>>2];c[16762]=c[fO>>2];c[67052>>2]=c[fO+4>>2];c[67056>>2]=c[fO+8>>2];c[67060>>2]=c[fO+12>>2];c[67064>>2]=c[fO+16>>2];c[67068>>2]=c[fO+20>>2];c[67072>>2]=c[fO+24>>2];c[67076>>2]=c[fO+28>>2];c[67080>>2]=c[fO+32>>2];c[67084>>2]=c[fO+36>>2];c[16934]=c[fO>>2];c[67740>>2]=c[fO+4>>2];c[67744>>2]=c[fO+8>>2];c[67748>>2]=c[fO+12>>2];c[67752>>2]=c[fO+16>>2];c[67756>>2]=c[fO+20>>2];c[67760>>2]=c[fO+24>>2];c[67764>>2]=c[fO+28>>2];c[67768>>2]=c[fO+32>>2];c[67772>>2]=c[fO+36>>2];c[17106]=c[fO>>2];c[68428>>2]=c[fO+4>>2];c[68432>>2]=c[fO+8>>2];c[68436>>2]=c[fO+12>>2];c[68440>>2]=c[fO+16>>2];c[68444>>2]=c[fO+20>>2];c[68448>>2]=c[fO+24>>2];c[68452>>2]=c[fO+28>>2];c[68456>>2]=c[fO+32>>2];c[68460>>2]=c[fO+36>>2];c[17278]=c[fO>>2];c[69116>>2]=c[fO+4>>2];c[69120>>2]=c[fO+8>>2];c[69124>>2]=c[fO+12>>2];c[69128>>2]=c[fO+16>>2];c[69132>>2]=c[fO+20>>2];c[69136>>2]=c[fO+24>>2];c[69140>>2]=c[fO+28>>2];c[69144>>2]=c[fO+32>>2];c[69148>>2]=c[fO+36>>2];c[17450]=c[fO>>2];c[69804>>2]=c[fO+4>>2];c[69808>>2]=c[fO+8>>2];c[69812>>2]=c[fO+12>>2];c[69816>>2]=c[fO+16>>2];c[69820>>2]=c[fO+20>>2];c[69824>>2]=c[fO+24>>2];c[69828>>2]=c[fO+28>>2];c[69832>>2]=c[fO+32>>2];c[69836>>2]=c[fO+36>>2];c[17622]=c[fO>>2];c[70492>>2]=c[fO+4>>2];c[70496>>2]=c[fO+8>>2];c[70500>>2]=c[fO+12>>2];c[70504>>2]=c[fO+16>>2];c[70508>>2]=c[fO+20>>2];c[70512>>2]=c[fO+24>>2];c[70516>>2]=c[fO+28>>2];c[70520>>2]=c[fO+32>>2];c[70524>>2]=c[fO+36>>2];c[17794]=c[fO>>2];c[71180>>2]=c[fO+4>>2];c[71184>>2]=c[fO+8>>2];c[71188>>2]=c[fO+12>>2];c[71192>>2]=c[fO+16>>2];c[71196>>2]=c[fO+20>>2];c[71200>>2]=c[fO+24>>2];c[71204>>2]=c[fO+28>>2];c[71208>>2]=c[fO+32>>2];c[71212>>2]=c[fO+36>>2];c[17966]=c[fO>>2];c[71868>>2]=c[fO+4>>2];c[71872>>2]=c[fO+8>>2];c[71876>>2]=c[fO+12>>2];c[71880>>2]=c[fO+16>>2];c[71884>>2]=c[fO+20>>2];c[71888>>2]=c[fO+24>>2];c[71892>>2]=c[fO+28>>2];c[71896>>2]=c[fO+32>>2];c[71900>>2]=c[fO+36>>2];Cx=Ch;Cy=Cg;break L5954}}while(0);while(1){if((a[DI+153128|0]|0)==(a[gH+(DI+DK|0)|0]|0)){DL=DK;DM=DJ}else{if((DI|0)!=5){DN=0;break}DL=DK-1|0;DM=1}hp=DI+1|0;if((hp|0)<(DM+hB|0)){DI=hp;DJ=DM;DK=DL}else{b7=4583;break}}do{if((b7|0)==4583){b7=0;if((DM|0)==0){if(!((DI|0)==4|(DI|0)==8)){DN=0;break}}uE(dx|0,0,28);c[13898]=Ci+1;c[16246]=4;c[16247]=4;c[16248]=4;c[16249]=c[dx>>2];c[65e3>>2]=c[dx+4>>2];c[65004>>2]=c[dx+8>>2];c[65008>>2]=c[dx+12>>2];c[65012>>2]=c[dx+16>>2];c[65016>>2]=c[dx+20>>2];c[65020>>2]=c[dx+24>>2];c[16418]=4;c[16419]=4;c[16420]=4;c[65684>>2]=c[dx>>2];c[(65684|0)+4>>2]=c[dx+4>>2];c[(65684|0)+8>>2]=c[dx+8>>2];c[(65684|0)+12>>2]=c[dx+12>>2];c[(65684|0)+16>>2]=c[dx+16>>2];c[(65684|0)+20>>2]=c[dx+20>>2];c[(65684|0)+24>>2]=c[dx+24>>2];c[16590]=4;c[16591]=4;c[16592]=4;c[66372>>2]=c[dx>>2];c[(66372|0)+4>>2]=c[dx+4>>2];c[(66372|0)+8>>2]=c[dx+8>>2];c[(66372|0)+12>>2]=c[dx+12>>2];c[(66372|0)+16>>2]=c[dx+16>>2];c[(66372|0)+20>>2]=c[dx+20>>2];c[(66372|0)+24>>2]=c[dx+24>>2];c[16762]=4;c[16763]=4;c[16764]=4;c[67060>>2]=c[dx>>2];c[(67060|0)+4>>2]=c[dx+4>>2];c[(67060|0)+8>>2]=c[dx+8>>2];c[(67060|0)+12>>2]=c[dx+12>>2];c[(67060|0)+16>>2]=c[dx+16>>2];c[(67060|0)+20>>2]=c[dx+20>>2];c[(67060|0)+24>>2]=c[dx+24>>2];c[16934]=4;c[16935]=4;c[16936]=4;c[67748>>2]=c[dx>>2];c[(67748|0)+4>>2]=c[dx+4>>2];c[(67748|0)+8>>2]=c[dx+8>>2];c[(67748|0)+12>>2]=c[dx+12>>2];c[(67748|0)+16>>2]=c[dx+16>>2];c[(67748|0)+20>>2]=c[dx+20>>2];c[(67748|0)+24>>2]=c[dx+24>>2];c[17106]=4;c[17107]=4;c[17108]=4;c[68436>>2]=c[dx>>2];c[(68436|0)+4>>2]=c[dx+4>>2];c[(68436|0)+8>>2]=c[dx+8>>2];c[(68436|0)+12>>2]=c[dx+12>>2];c[(68436|0)+16>>2]=c[dx+16>>2];c[(68436|0)+20>>2]=c[dx+20>>2];c[(68436|0)+24>>2]=c[dx+24>>2];c[17278]=4;c[17279]=4;c[17280]=4;c[69124>>2]=c[dx>>2];c[(69124|0)+4>>2]=c[dx+4>>2];c[(69124|0)+8>>2]=c[dx+8>>2];c[(69124|0)+12>>2]=c[dx+12>>2];c[(69124|0)+16>>2]=c[dx+16>>2];c[(69124|0)+20>>2]=c[dx+20>>2];c[(69124|0)+24>>2]=c[dx+24>>2];c[17450]=4;c[17451]=4;c[17452]=4;c[69812>>2]=c[dx>>2];c[(69812|0)+4>>2]=c[dx+4>>2];c[(69812|0)+8>>2]=c[dx+8>>2];c[(69812|0)+12>>2]=c[dx+12>>2];c[(69812|0)+16>>2]=c[dx+16>>2];c[(69812|0)+20>>2]=c[dx+20>>2];c[(69812|0)+24>>2]=c[dx+24>>2];c[17622]=4;c[17623]=4;c[17624]=4;c[70500>>2]=c[dx>>2];c[(70500|0)+4>>2]=c[dx+4>>2];c[(70500|0)+8>>2]=c[dx+8>>2];c[(70500|0)+12>>2]=c[dx+12>>2];c[(70500|0)+16>>2]=c[dx+16>>2];c[(70500|0)+20>>2]=c[dx+20>>2];c[(70500|0)+24>>2]=c[dx+24>>2];c[17794]=4;c[17795]=4;c[17796]=4;c[71188>>2]=c[dx>>2];c[(71188|0)+4>>2]=c[dx+4>>2];c[(71188|0)+8>>2]=c[dx+8>>2];c[(71188|0)+12>>2]=c[dx+12>>2];c[(71188|0)+16>>2]=c[dx+16>>2];c[(71188|0)+20>>2]=c[dx+20>>2];c[(71188|0)+24>>2]=c[dx+24>>2];c[17966]=4;c[17967]=4;c[17968]=4;c[71876>>2]=c[dx>>2];c[(71876|0)+4>>2]=c[dx+4>>2];c[(71876|0)+8>>2]=c[dx+8>>2];c[(71876|0)+12>>2]=c[dx+12>>2];c[(71876|0)+16>>2]=c[dx+16>>2];c[(71876|0)+20>>2]=c[dx+20>>2];c[(71876|0)+24>>2]=c[dx+24>>2];Cx=Ch;Cy=Cg;break L5954}}while(0);while(1){if((a[DN+97960|0]|0)!=(a[gH+(DN+Co|0)|0]|0)){DO=0;DP=0;DQ=Co;break}DR=DN+1|0;if((DR|0)<(hB|0)){DN=DR}else{b7=4588;break}}do{if((b7|0)==4588){b7=0;if((DR|0)!=6){DO=0;DP=0;DQ=Co;break}jp();Cx=Ch;Cy=Cg;break L5954}}while(0);while(1){if((a[DO+175984|0]|0)==(a[gH+(DO+DQ|0)|0]|0)){DS=DQ;DT=DP}else{if((DO|0)!=1){Cn=Co;b7=4620;break L5954}DS=DQ-1|0;DT=1}hp=DO+1|0;if((hp|0)<(DT+hB|0)){DO=hp;DP=DT;DQ=DS}else{break}}if((DT|0)==0){if(!((DO|0)==4|(DO|0)==0)){Cn=Co;b7=4620;break L5954}}DU=Ci+1|0;c[13898]=DU;hp=(a[Ck+(DU*40&-1)|0]&1)==0;if(hp){b7=4598}else{hR=a[gH+(c[Ck+(DU*40&-1)+32>>2]|0)|0]|0;if(!((hR<<24>>24|0)==39|(hR<<24>>24|0)==34)){b7=4598}}if((b7|0)==4598){b7=0;hR=c[10810]|0;if((hR|0)==0){b7=5299;break L27}hK=Ck+(DU*40&-1)+36|0;hS=Ck+(DU*40&-1)+32|0;gG=(Cj|0)<=(DU|0)|hp;gy=hR;L6211:while(1){hR=c[gy+4>>2]|0;L6213:do{if(!gG){ho=c[hK>>2]|0;ng=0;while(1){if((ng|0)>=(ho|0)){break}if((a[gH+((c[hS>>2]|0)+ng|0)|0]|0)==(a[hR+ng|0]|0)){ng=ng+1|0}else{break L6213}}if((a[hR+ng|0]|0)==0){break L6211}}}while(0);hR=c[gy>>2]|0;if((hR|0)==0){b7=5301;break L27}else{gy=hR}}if((a[gy+8|0]&1)!=0){b7=5300;break L27}if((c[gy+16>>2]|0)!=3){b7=5302;break L27}}L6223:do{if((DU|0)<(Cj|0)){L6225:do{if(!hp){hS=c[Ck+(DU*40&-1)+36>>2]|0;hK=Ck+(DU*40&-1)+32|0;gG=0;while(1){if((gG|0)>=(hS|0)){break}if((a[gH+((c[hK>>2]|0)+gG|0)|0]|0)==(a[gG+103664|0]|0)){gG=gG+1|0}else{break L6225}}if((gG|0)==1){DV=0;break L6223}}}while(0);a[14176]=1;is(E);a[14176]=0;if((c[fQ>>2]|0)==3){DV=c[fS>>2]|0;break}else{c[13898]=DU;DV=0;break}}else{DV=0}}while(0);uu(c[16231]|0);if((DV|0)==0){c[16231]=0;uu(c[16403]|0);c[16403]=0;uu(c[16575]|0);c[16575]=0;uu(c[16747]|0);c[16747]=0;uu(c[16919]|0);c[16919]=0;uu(c[17091]|0);c[17091]=0;uu(c[17263]|0);c[17263]=0;uu(c[17435]|0);c[17435]=0;uu(c[17607]|0);c[17607]=0;uu(c[17779]|0);c[17779]=0;uu(c[17951]|0);DW=0}else{c[16231]=bP(DV|0)|0;uu(c[16403]|0);c[16403]=bP(DV|0)|0;uu(c[16575]|0);c[16575]=bP(DV|0)|0;uu(c[16747]|0);c[16747]=bP(DV|0)|0;uu(c[16919]|0);c[16919]=bP(DV|0)|0;uu(c[17091]|0);c[17091]=bP(DV|0)|0;uu(c[17263]|0);c[17263]=bP(DV|0)|0;uu(c[17435]|0);c[17435]=bP(DV|0)|0;uu(c[17607]|0);c[17607]=bP(DV|0)|0;uu(c[17779]|0);c[17779]=bP(DV|0)|0;uu(c[17951]|0);DW=bP(DV|0)|0}c[17951]=DW;uu(DV);Cx=Ch;Cy=Cg;break L5954}}while(0);c[16282]=1;a[65272]=1;c[16454]=1;a[65960]=1;c[16626]=1;a[66648]=1;c[16798]=1;a[67336]=1;c[16970]=1;a[68024]=1;c[17142]=1;a[68712]=1;c[17314]=1;a[69400]=1;c[17486]=1;a[70088]=1;c[17658]=1;a[70776]=1;c[17830]=1;a[71464]=1;c[18002]=1;a[72152]=1;c[13898]=Ci+1;Cx=Ch;Cy=Cg}}while(0);L6241:do{if((b7|0)==4620){b7=0;hF=(Cj|0)>(Ci|0);L6243:do{if(hF){if(gF){b7=5303;break L27}gH=c[10036]|0;hp=0;while(1){if((hp|0)>=(hB|0)){break}if((a[gH+(hp+Cn|0)|0]|0)==(a[hp+143040|0]|0)){hp=hp+1|0}else{b7=4626;break L6243}}if((hp|0)!=2){b7=4626}}else{b7=4626}}while(0);L6250:do{if((b7|0)==4626){b7=0;L6252:do{if((hB|0)>0&(gF^1)){gH=c[10036]|0;gy=0;hK=0;hS=Cn;while(1){if((a[gy+142856|0]|0)==(a[gH+(gy+hS|0)|0]|0)){DX=hS;DY=hK}else{if((gy|0)!=4){break L6252}DX=hS-1|0;DY=1}ng=gy+1|0;if((ng|0)<(DY+hB|0)){gy=ng;hK=DY;hS=DX}else{break}}if((DY|0)!=0){break L6250}if((gy|0)==3|(gy|0)==9){break L6250}}}while(0);if(!hF){Cx=Ch;Cy=Cg;break L6241}if(gF){b7=5304;break L27}hp=c[10036]|0;hS=0;while(1){if((hS|0)>=(hB|0)){b7=4640;break}if((a[hp+(hS+Cn|0)|0]|0)==(a[hS+150856|0]|0)){hS=hS+1|0}else{DZ=0;break}}do{if((b7|0)==4640){b7=0;if((hS|0)!=5){DZ=0;break}c[10026]=1;c[13898]=Ci+1;Cx=Ch;Cy=Cg;break L6241}}while(0);while(1){if((DZ|0)>=(hB|0)){b7=4644;break}if((a[hp+(DZ+Cn|0)|0]|0)==(a[DZ+150704|0]|0)){DZ=DZ+1|0}else{D_=0;break}}do{if((b7|0)==4644){b7=0;if((DZ|0)!=4){D_=0;break}c[10026]=0;c[13898]=Ci+1;Cx=Ch;Cy=Cg;break L6241}}while(0);while(1){if((D_|0)>=(hB|0)){break}if((a[hp+(D_+Cn|0)|0]|0)==(a[D_+103664|0]|0)){D_=D_+1|0}else{b7=5305;break L27}}if((D_|0)==1){Cx=Ch;Cy=Cg;break L6241}else{b7=5306;break L27}}}while(0);hI(G,5);c[16232]=c[fP>>2];c[64932>>2]=c[fP+4>>2];c[64936>>2]=c[fP+8>>2];c[64940>>2]=c[fP+12>>2];c[16404]=c[fP>>2];c[65620>>2]=c[fP+4>>2];c[65624>>2]=c[fP+8>>2];c[65628>>2]=c[fP+12>>2];c[16576]=c[fP>>2];c[66308>>2]=c[fP+4>>2];c[66312>>2]=c[fP+8>>2];c[66316>>2]=c[fP+12>>2];c[16748]=c[fP>>2];c[66996>>2]=c[fP+4>>2];c[67e3>>2]=c[fP+8>>2];c[67004>>2]=c[fP+12>>2];c[16920]=c[fP>>2];c[67684>>2]=c[fP+4>>2];c[67688>>2]=c[fP+8>>2];c[67692>>2]=c[fP+12>>2];c[17092]=c[fP>>2];c[68372>>2]=c[fP+4>>2];c[68376>>2]=c[fP+8>>2];c[68380>>2]=c[fP+12>>2];c[17264]=c[fP>>2];c[69060>>2]=c[fP+4>>2];c[69064>>2]=c[fP+8>>2];c[69068>>2]=c[fP+12>>2];c[17436]=c[fP>>2];c[69748>>2]=c[fP+4>>2];c[69752>>2]=c[fP+8>>2];c[69756>>2]=c[fP+12>>2];c[17608]=c[fP>>2];c[70436>>2]=c[fP+4>>2];c[70440>>2]=c[fP+8>>2];c[70444>>2]=c[fP+12>>2];c[17780]=c[fP>>2];c[71124>>2]=c[fP+4>>2];c[71128>>2]=c[fP+8>>2];c[71132>>2]=c[fP+12>>2];c[17952]=c[fP>>2];c[71812>>2]=c[fP+4>>2];c[71816>>2]=c[fP+8>>2];c[71820>>2]=c[fP+12>>2];Cx=Ch;Cy=Cg}}while(0);hB=c[13898]|0;gF=c[8272]|0;if((hB|0)>=(gF|0)){Cl=Cy;Cm=Cx;break L5951}Cg=Cy;Ch=Cx;Ci=hB;Cj=gF;Ck=c[1054]|0;b7=4421}}}while(0);hG=0;do{gC=64916+(hG*688&-1)|0;do{if(!((c[gC>>2]&3|0)!=0|Cm)){if((hG-5|0)>>>0<2){break}c[gC>>2]=1;if(Cl){break}if((hG-1|0)>>>0>=3){break}c[gC>>2]=5}}while(0);hG=hG+1|0;}while(hG>>>0<11)}else if((gD|0)==90){uh(gv,225144,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);hG=(c[13898]|0)+1|0;c[13898]=hG;L6294:do{if((hG|0)<(c[8272]|0)){gC=c[1054]|0;L6296:do{if((a[gC+(hG*40&-1)|0]&1)!=0){nd=c[gC+(hG*40&-1)+36>>2]|0;nh=gC+(hG*40&-1)+32|0;gF=c[10036]|0;hB=0;while(1){if((hB|0)>=(nd|0)){break}if((a[gF+((c[nh>>2]|0)+hB|0)|0]|0)==(a[hB+103664|0]|0)){hB=hB+1|0}else{break L6296}}if((hB|0)==1){D$=.5;D0=1.0;break L6294}}}while(0);gC=is(z)|0;nh=c[gC>>2]|0;if((nh|0)==1){D1=+(c[gC+8>>2]|0)}else if((nh|0)==2){D1=+h[gC+8>>3]}else if((nh|0)==3){D1=+uz(c[gC+8>>2]|0,0)}else{b7=4668;break L27}if((c[fZ>>2]|0)==3){uu(c[f_>>2]|0);c[fZ>>2]=1}gC=c[13898]|0;L6311:do{if((gC|0)<(c[8272]|0)){nh=c[1054]|0;L6313:do{if((a[nh+(gC*40&-1)|0]&1)!=0){gF=c[nh+(gC*40&-1)+36>>2]|0;nd=nh+(gC*40&-1)+32|0;hF=c[10036]|0;hp=0;while(1){if((hp|0)>=(gF|0)){b7=4676;break}if((a[hF+((c[nd>>2]|0)+hp|0)|0]|0)==(a[hp+103664|0]|0)){hp=hp+1|0}else{D2=0;break}}if((b7|0)==4676){b7=0;if((hp|0)==1){break L6311}else{D2=0}}while(1){if((D2|0)>=(gF|0)){break}if((a[hF+((c[nd>>2]|0)+D2|0)|0]|0)==(a[D2+148464|0]|0)){D2=D2+1|0}else{break L6313}}if((D2|0)!=1){break}c[13898]=gC+1}}while(0);nh=is(A)|0;hB=c[nh>>2]|0;if((hB|0)==1){D3=+(c[nh+8>>2]|0)}else if((hB|0)==2){D3=+h[nh+8>>3]}else if((hB|0)==3){D3=+uz(c[nh+8>>2]|0,0)}else{b7=4686;break L27}if((c[f$>>2]|0)!=3){D$=D3;D0=D1;break L6294}uu(c[f0>>2]|0);c[f$>>2]=1;D$=D3;D0=D1;break L6294}}while(0);D$=D1*.5;D0=D1}else{D$=.5;D0=1.0}}while(0);h[8132]=D0;h[8133]=D$;h[8218]=D0;h[8219]=D$;h[8304]=D0;h[8305]=D$;h[8390]=D0;h[8391]=D$;h[8476]=D0;h[8477]=D$;h[8562]=D0;h[8563]=D$;h[8648]=D0;h[8649]=D$;h[8734]=D0;h[8735]=D$;h[8820]=D0;h[8821]=D$;h[8906]=D0;h[8907]=D$;h[8992]=D0;h[8993]=D$}else if((gD|0)==92){D4=gv+1|0;c[13898]=D4;hG=c[8272]|0;L6335:do{if((D4|0)<(hG|0)){gC=(a[gw+(D4*40&-1)|0]&1)==0;nh=c[gw+(D4*40&-1)+36>>2]|0;hB=gw+(D4*40&-1)+32|0;L6337:do{if(!gC){nd=0;while(1){if((nd|0)>=(nh|0)){break}if((a[gB+((c[hB>>2]|0)+nd|0)|0]|0)==(a[nd+103664|0]|0)){nd=nd+1|0}else{break L6337}}if((nd|0)==1){break L6335}}}while(0);hF=c[hB>>2]|0;gF=(nh|0)>0;hp=56720;hS=77416;L6343:while(1){L6345:do{if(!gC){if(gF){hK=0;gH=0;ng=hF;while(1){hR=a[hS+hK|0]|0;if(hR<<24>>24==(a[gB+(hK+ng|0)|0]|0)){D5=ng;D6=gH}else{if(hR<<24>>24!=36){break L6345}D5=ng-1|0;D6=1}D7=hK+1|0;if((D7|0)<(D6+nh|0)){hK=D7;gH=D6;ng=D5}else{break}}if((D6|0)==0){D8=D7}else{D9=hp;break L6343}}else{D8=0}ng=a[hS+D8|0]|0;if((ng<<24>>24|0)==36|(ng<<24>>24|0)==0){D9=hp;break L6343}}}while(0);nd=hp+8|0;ng=c[nd>>2]|0;if((ng|0)==0){D9=nd;break}else{hp=nd;hS=ng}}hS=c[D9+4>>2]|0;if((hS|0)>-1){Ea=gv+2|0;c[13898]=Ea;if((Ea|0)>=(hG|0)){b7=4725;break L27}L6361:do{if((a[gw+(Ea*40&-1)|0]&1)!=0){hp=c[gw+(Ea*40&-1)+36>>2]|0;gF=gw+(Ea*40&-1)+32|0;hB=0;while(1){if((hB|0)>=(hp|0)){break}if((a[gB+((c[gF>>2]|0)+hB|0)|0]|0)==(a[hB+103664|0]|0)){hB=hB+1|0}else{break L6361}}if((hB|0)==1){b7=4725;break L27}}}while(0);a[14176]=1;is(y);a[14176]=0;if((c[f1>>2]|0)!=3){b7=4714;break L27}gF=c[f2>>2]|0;if((gF|0)==0){b7=4725;break L27}hp=64813+(hS*688&-1)|0;uF(hp|0,gF|0,50);Eb=gF}else{L6371:do{if(!gC){gF=0;while(1){if((gF|0)>=(nh|0)){break}if((a[gB+(gF+hF|0)|0]|0)==(a[gF+103664|0]|0)){gF=gF+1|0}else{break L6371}}if((gF|0)==1){b7=4725;break L27}}}while(0);a[14176]=1;is(x);a[14176]=0;if((c[f3>>2]|0)!=3){b7=4722;break L27}hF=c[f4>>2]|0;if((hF|0)==0){b7=4725;break L27}uF(64813,hF|0,50);uF(65501,hF|0,50);uF(66189,hF|0,50);uF(66877,hF|0,50);uF(67565,hF|0,50);uF(68253,hF|0,50);uF(68941,hF|0,50);uF(69629,hF|0,50);uF(70317,hF|0,50);uF(71005,hF|0,50);uF(71693,hF|0,50);Eb=hF}uu(Eb);break L44}}while(0);uD(64813,82192,15);uD(65501,82192,15);uD(66189,82192,15);uD(66877,82192,15);uD(67565,82192,15);uD(68253,82192,15);uD(68941,82192,15);uD(69629,82192,15);uD(70317,82192,15);uD(71005,82192,15);uD(71693,82192,15)}else if((gD|0)==93){hG=gv+1|0;c[13898]=hG;hF=c[8272]|0;L6382:do{if((hG|0)<(hF|0)){nh=0;gC=hG;hS=hF;while(1){Ec=gC;hB=hS;L6385:while(1){hp=c[1054]|0;Ed=c[hp+(Ec*40&-1)+36>>2]|0;Ee=hp+(Ec*40&-1)+32|0;if((a[hp+(Ec*40&-1)|0]&1)==0){b7=4773;break}ng=c[10036]|0;nd=0;while(1){if((nd|0)>=(Ed|0)){b7=4734;break}gH=c[Ee>>2]|0;if((a[ng+(gH+nd|0)|0]|0)==(a[nd+103664|0]|0)){nd=nd+1|0}else{Ef=gH;break}}if((b7|0)==4734){b7=0;if((nd|0)==1){break L6382}Ef=c[Ee>>2]|0}L6395:do{if((Ed|0)>0){gH=0;hK=0;hR=Ef;while(1){if((a[gH+150048|0]|0)==(a[ng+(gH+hR|0)|0]|0)){Eg=hR;Eh=hK}else{if((gH|0)!=1){Ei=0;Ej=0;Ek=Ef;break}Eg=hR-1|0;Eh=1}gz=gH+1|0;if((gz|0)<(Eh+Ed|0)){gH=gz;hK=Eh;hR=Eg}else{b7=4741;break}}do{if((b7|0)==4741){b7=0;if((Eh|0)==0){if(!((gH|0)==0|(gH|0)==3)){Ei=0;Ej=0;Ek=Ef;break}}c[1166]=0;c[13898]=Ec+1;break L6395}}while(0);while(1){if((a[Ei+149848|0]|0)==(a[ng+(Ei+Ek|0)|0]|0)){El=Ek;Em=Ej}else{if((Ei|0)!=1){En=0;Eo=0;Ep=Ef;break}El=Ek-1|0;Em=1}gH=Ei+1|0;if((gH|0)<(Em+Ed|0)){Ei=gH;Ej=Em;Ek=El}else{b7=4749;break}}do{if((b7|0)==4749){b7=0;if((Em|0)==0){if(!((Ei|0)==0|(Ei|0)==6)){En=0;Eo=0;Ep=Ef;break}}c[1166]=1;c[13898]=Ec+1;break L6395}}while(0);while(1){if((a[En+95544|0]|0)==(a[ng+(En+Ep|0)|0]|0)){Eq=Ep;Er=Eo}else{if((En|0)!=1){Es=0;Et=0;Eu=Ef;break}Eq=Ep-1|0;Er=1}gH=En+1|0;if((gH|0)<(Er+Ed|0)){En=gH;Eo=Er;Ep=Eq}else{b7=4756;break}}do{if((b7|0)==4756){b7=0;if((Er|0)==0){if(!((En|0)==0|(En|0)==6)){Es=0;Et=0;Eu=Ef;break}}c[1164]=1;c[13898]=Ec+1;break L6395}}while(0);while(1){if((a[Es+184048|0]|0)==(a[ng+(Es+Eu|0)|0]|0)){Ev=Eu;Ew=Et}else{if((Es|0)!=1){Ex=0;Ey=0;Ez=Ef;break}Ev=Eu-1|0;Ew=1}gH=Es+1|0;if((gH|0)<(Ew+Ed|0)){Es=gH;Et=Ew;Eu=Ev}else{b7=4763;break}}do{if((b7|0)==4763){b7=0;if((Ew|0)==0){if(!((Es|0)==0|(Es|0)==8)){Ex=0;Ey=0;Ez=Ef;break}}c[1164]=0;c[13898]=Ec+1;break L6395}}while(0);while(1){if((a[Ex+152064|0]|0)==(a[ng+(Ex+Ez|0)|0]|0)){EA=Ez;EB=Ey}else{if((Ex|0)!=3){b7=4774;break L6395}EA=Ez-1|0;EB=1}gH=Ex+1|0;if((gH|0)<(EB+Ed|0)){Ex=gH;Ey=EB;Ez=EA}else{break}}if((EB|0)==0){if(!((Ex|0)==6|(Ex|0)==2)){b7=4774;break}}c[13898]=Ec+1;dl(4816,4)}else{b7=4774}}while(0);if((b7|0)==4774){b7=0;nd=(hB|0)>(Ec|0);if(nd){EC=0}else{ED=Ef;EE=0;EF=0;break}while(1){if((EC|0)>=(Ed|0)){break}if((a[ng+(EC+Ef|0)|0]|0)==(a[EC+124352|0]|0)){EC=EC+1|0}else{ED=Ef;EE=nd;EF=0;break L6385}}if((EC|0)!=4){ED=Ef;EE=nd;EF=0;break}gH=Ec+1|0;c[13898]=gH;L6457:do{if((gH|0)<(hB|0)){L6459:do{if((a[hp+(gH*40&-1)|0]&1)!=0){hR=c[hp+(gH*40&-1)+36>>2]|0;hK=hp+(gH*40&-1)+32|0;gz=0;while(1){if((gz|0)>=(hR|0)){break}if((a[ng+((c[hK>>2]|0)+gz|0)|0]|0)==(a[gz+103664|0]|0)){gz=gz+1|0}else{break L6459}}if((gz|0)==1){EG=0;break L6457}}}while(0);a[14176]=1;is(t);a[14176]=0;if((c[f5>>2]|0)==3){EG=c[f6>>2]|0;break}else{c[13898]=gH;EG=0;break}}else{EG=0}}while(0);uu(c[1184]|0);c[1184]=EG}gH=c[13898]|0;ng=c[8272]|0;if((gH|0)<(ng|0)){Ec=gH;hB=ng}else{break L6382}}if((b7|0)==4773){b7=0;ED=c[Ee>>2]|0;EE=(hB|0)>(Ec|0);EF=1}if(nh){EH=Ec;b7=5310;break L27}if(!EE){EH=Ec;b7=5311;break L27}L6476:do{if(!EF){gF=c[10036]|0;ng=0;while(1){if((ng|0)>=(Ed|0)){break}if((a[gF+(ng+ED|0)|0]|0)==(a[ng+103664|0]|0)){ng=ng+1|0}else{break L6476}}if((ng|0)==1){EH=Ec;b7=5312;break L27}}}while(0);a[14176]=1;is(u);a[14176]=0;if((c[f7>>2]|0)!=3){b7=4796;break L27}hB=c[f8>>2]|0;if((hB|0)==0){b7=4798;break L27}uu(c[1183]|0);c[1183]=hB;hB=c[13898]|0;gF=c[8272]|0;if((hB|0)<(gF|0)){nh=1;gC=hB;hS=gF}else{break L44}}}}while(0);if((c[1183]|0)!=0){break}c[1183]=bP(74304)|0}else if((gD|0)==94){jq(4416)}else if((gD|0)==99){hF=gv+1|0;c[13898]=hF;hG=c[8272]|0;hS=(hG|0)>(hF|0);L6489:do{if(hS){if((a[gw+(hF*40&-1)|0]&1)==0){break}gC=c[gw+(hF*40&-1)+36>>2]|0;nh=gw+(hF*40&-1)+32|0;gF=0;while(1){if((gF|0)>=(gC|0)){break}if((a[gB+((c[nh>>2]|0)+gF|0)|0]|0)==(a[gF+134552|0]|0)){gF=gF+1|0}else{break L6489}}if((gF|0)!=3){break}c[5094]=1;c[13898]=gv+2;break L44}}while(0);if((c[5094]|0)==1){if(a[20368]|0){a[20368]=0;g[3538]=+g[5090];g[3536]=+g[5088];g[3534]=+g[5086];c[16336]=c[16336]^2;c[17024]=c[17024]^2}c[5094]=0}nh=c[gw+(hF*40&-1)+36>>2]|0;gC=c[gw+(hF*40&-1)+32>>2]|0;L6504:do{if((nh|0)>0&(a[gw+(hF*40&-1)|0]&1)!=0){hB=0;gH=0;hp=gC;while(1){if((a[hB+82576|0]|0)==(a[gB+(hB+hp|0)|0]|0)){EI=hp;EJ=gH}else{if((hB|0)!=5){EK=0;EL=0;EM=gC;break}EI=hp-1|0;EJ=1}nd=hB+1|0;if((nd|0)<(EJ+nh|0)){hB=nd;gH=EJ;hp=EI}else{b7=4820;break}}do{if((b7|0)==4820){b7=0;if((EJ|0)==0){if(!((hB|0)==10|(hB|0)==4)){EK=0;EL=0;EM=gC;break}}hp=gv+2|0;c[13898]=hp;do{if((hp|0)<(hG|0)){if((a[gw+(hp*40&-1)|0]&1)==0){break L44}gH=c[gw+(hp*40&-1)+36>>2]|0;gF=gw+(hp*40&-1)+32|0;nd=0;while(1){if((nd|0)>=(gH|0)){b7=4827;break}if((a[gB+((c[gF>>2]|0)+nd|0)|0]|0)==(a[nd+103664|0]|0)){nd=nd+1|0}else{EN=0;break}}if((b7|0)==4827){b7=0;if((nd|0)==1){break}else{EN=0}}while(1){if((EN|0)>=(gH|0)){b7=4830;break}if((a[gB+((c[gF>>2]|0)+EN|0)|0]|0)==(a[EN+150688|0]|0)){EN=EN+1|0}else{EO=0;break}}if((b7|0)==4830){b7=0;if((EN|0)==2){break}else{EO=0}}while(1){if((EO|0)>=(gH|0)){break}if((a[gB+((c[gF>>2]|0)+EO|0)|0]|0)==(a[EO+79688|0]|0)){EO=EO+1|0}else{break L44}}if((EO|0)!=3){break L44}c[18072]=3;c[13898]=gv+3;break L44}}while(0);c[18072]=2;c[13898]=gv+3;break L44}}while(0);while(1){if((a[EK+78952|0]|0)==(a[gB+(EK+EM|0)|0]|0)){EP=EM;EQ=EL}else{if((EK|0)!=7){break L6504}EP=EM-1|0;EQ=1}hB=EK+1|0;if((hB|0)<(EQ+nh|0)){EK=hB;EL=EQ;EM=EP}else{break}}if((EQ|0)==0){if(!((EK|0)==6|(EK|0)==12)){break}}c[18072]=0;c[13898]=gv+2;break L44}}while(0);h[eW>>3]=+g[3538];h[eX>>3]=+g[3536];h[eY>>3]=+g[3534];h[eZ>>3]=+g[3532];L6546:do{if(hS){ER=hF;nh=1;hG=0;gC=gw;while(1){L6549:do{if((a[gC+(ER*40&-1)|0]&1)==0){b7=4853}else{hB=c[gC+(ER*40&-1)+36>>2]|0;hp=gC+(ER*40&-1)+32|0;gF=c[10036]|0;gH=0;while(1){if((gH|0)>=(hB|0)){b7=4848;break}if((a[gF+((c[hp>>2]|0)+gH|0)|0]|0)==(a[gH+103664|0]|0)){gH=gH+1|0}else{ES=0;break}}if((b7|0)==4848){b7=0;if((gH|0)==1){break L6546}else{ES=0}}while(1){if((ES|0)>=(hB|0)){break}if((a[gF+((c[hp>>2]|0)+ES|0)|0]|0)==(a[ES+148464|0]|0)){ES=ES+1|0}else{b7=4853;break L6549}}if((ES|0)!=1){b7=4853;break}c[13898]=ER+1;ET=1;EU=(nh&1)+hG|0}}while(0);if((b7|0)==4853){b7=0;if(!nh){b7=4854;break L27}hp=is(s)|0;gF=c[hp>>2]|0;if((gF|0)==1){EV=+(c[hp+8>>2]|0)}else if((gF|0)==2){EV=+h[hp+8>>3]}else if((gF|0)==3){EV=+uz(c[hp+8>>2]|0,0)}else{b7=4859;break L27}if((c[f9>>2]|0)==3){uu(c[ga>>2]|0);c[f9>>2]=1}h[ak+(hG<<3)>>3]=EV;ET=0;EU=hG+1|0}if((EU|0)>=4){break L6546}hp=c[13898]|0;if((hp|0)>=(c[8272]|0)){break L6546}ER=hp;nh=ET;hG=EU;gC=c[1054]|0}}}while(0);m3=+h[eW>>3];if(m3<0.0|m3>360.0){b7=4867;break L27}m2=+h[eX>>3];if(m2<0.0|m2>360.0){b7=4869;break L27}m5=+h[eY>>3];if(m5<1.0e-6){b7=4871;break L27}m4=+h[eZ>>3];if(m4<1.0e-6){b7=4873;break L27}g[3538]=m3;g[3536]=m2;m2=m5;g[3534]=m2;g[3532]=m4;g[3540]=+_(+m2)}else if((gD|0)==151){c[13898]=gv+1;hF=is(r)|0;hS=c[hF>>2]|0;do{if((hS|0)==1){gC=c[hF+8>>2]|0;EW=+(((gC|0)>-1?gC:-gC|0)|0)}else if((hS|0)==2){m2=+P(+(+h[hF+8>>3]));m4=+h[hF+16>>3];m5=+P(+m4);if(m4==0.0){EW=m2;break}if(m2>m5){m4=m5/m2;EW=m2*+Q(+(m4*m4+1.0));break}else{m4=m2/m5;EW=m5*+Q(+(m4*m4+1.0));break}}else{b7=4881;break L27}}while(0);h[11]=EW}else if((gD|0)==48|(gD|0)==49|(gD|0)==117|(gD|0)==118|(gD|0)==111|(gD|0)==112|(gD|0)==114|(gD|0)==115){jt(2)}else if((gD|0)==52|(gD|0)==53|(gD|0)==136|(gD|0)==137|(gD|0)==130|(gD|0)==131|(gD|0)==133|(gD|0)==134){jt(1)}else if((gD|0)==46|(gD|0)==47|(gD|0)==108|(gD|0)==109|(gD|0)==102|(gD|0)==103|(gD|0)==105|(gD|0)==106){jt(6)}else if((gD|0)==50|(gD|0)==51|(gD|0)==127|(gD|0)==128|(gD|0)==121|(gD|0)==122|(gD|0)==124|(gD|0)==125){jt(5)}else if((gD|0)==54|(gD|0)==55|(gD|0)==145|(gD|0)==146|(gD|0)==139|(gD|0)==140|(gD|0)==142|(gD|0)==143){jt(0)}else if((gD|0)==68|(gD|0)==69|(gD|0)==66|(gD|0)==67|(gD|0)==71|(gD|0)==72|(gD|0)==73|(gD|0)==74){jt(3)}else if((gD|0)==147|(gD|0)==148){jt(7)}else if((gD|0)==110){hF=gv+1|0;c[13898]=hF;c[16546]=0;hS=c[gw+(hF*40&-1)+36>>2]|0;L6597:do{if((a[gw+(hF*40&-1)|0]&1)!=0&(hS|0)>0){gC=0;hG=0;nh=c[gw+(hF*40&-1)+32>>2]|0;while(1){if((a[gC+84264|0]|0)==(a[gB+(gC+nh|0)|0]|0)){EX=nh;EY=hG}else{if((gC|0)!=1){EZ=0;break L6597}EX=nh-1|0;EY=1}hp=gC+1|0;if((hp|0)<(EY+hS|0)){gC=hp;hG=EY;nh=EX}else{break}}if((EY|0)==0){if(!((gC|0)==0|(gC|0)==4)){EZ=0;break}}c[16546]=1;c[13898]=gv+2;EZ=1}else{EZ=0}}while(0);c[17750]=EZ;c[17578]=EZ}else if((gD|0)==129){hS=gv+1|0;c[13898]=hS;c[16374]=0;hF=c[gw+(hS*40&-1)+36>>2]|0;L6611:do{if((a[gw+(hS*40&-1)|0]&1)!=0&(hF|0)>0){nh=0;hG=0;hp=c[gw+(hS*40&-1)+32>>2]|0;while(1){if((a[nh+84264|0]|0)==(a[gB+(nh+hp|0)|0]|0)){E_=hp;E$=hG}else{if((nh|0)!=1){break L6611}E_=hp-1|0;E$=1}gF=nh+1|0;if((gF|0)<(E$+hF|0)){nh=gF;hG=E$;hp=E_}else{break}}if((E$|0)==0){if(!((nh|0)==0|(nh|0)==4)){break}}c[16374]=1;c[13898]=gv+2}}while(0);c[17922]=c[16546]}else if((gD|0)==138){hF=gv+1|0;c[13898]=hF;c[16202]=0;hS=c[gw+(hF*40&-1)+36>>2]|0;if(!((a[gw+(hF*40&-1)|0]&1)!=0&(hS|0)>0)){break}hp=0;hG=0;gC=c[gw+(hF*40&-1)+32>>2]|0;while(1){if((a[hp+84264|0]|0)==(a[gB+(hp+gC|0)|0]|0)){E0=gC;E1=hG}else{if((hp|0)!=1){break L44}E0=gC-1|0;E1=1}hF=hp+1|0;if((hF|0)<(E1+hS|0)){hp=hF;hG=E1;gC=E0}else{break}}if((E1|0)==0){if(!((hp|0)==0|(hp|0)==4)){break}}c[16202]=1;c[13898]=gv+2}else if((gD|0)==70){gC=gv+1|0;c[13898]=gC;c[16718]=0;hG=c[gw+(gC*40&-1)+36>>2]|0;if(!((a[gw+(gC*40&-1)|0]&1)!=0&(hG|0)>0)){break}hS=0;hF=0;gF=c[gw+(gC*40&-1)+32>>2]|0;while(1){if((a[hS+84264|0]|0)==(a[gB+(hS+gF|0)|0]|0)){E2=gF;E3=hF}else{if((hS|0)!=1){break L44}E2=gF-1|0;E3=1}gC=hS+1|0;if((gC|0)<(E3+hG|0)){hS=gC;hF=E3;gF=E2}else{break}}if((E3|0)==0){if(!((hS|0)==0|(hS|0)==4)){break}}c[16718]=1;c[13898]=gv+2}else if((gD|0)==101){gF=gv+1|0;c[13898]=gF;c[17234]=0;hF=c[gw+(gF*40&-1)+36>>2]|0;if(!((a[gw+(gF*40&-1)|0]&1)!=0&(hF|0)>0)){break}hG=0;hp=0;gC=c[gw+(gF*40&-1)+32>>2]|0;while(1){if((a[hG+84264|0]|0)==(a[gB+(hG+gC|0)|0]|0)){E4=gC;E5=hp}else{if((hG|0)!=1){break L44}E4=gC-1|0;E5=1}gF=hG+1|0;if((gF|0)<(E5+hF|0)){hG=gF;hp=E5;gC=E4}else{break}}if((E5|0)==0){if(!((hG|0)==0|(hG|0)==4)){break}}c[17234]=1;c[13898]=gv+2}else if((gD|0)==120){gC=gv+1|0;c[13898]=gC;c[17062]=0;hp=c[gw+(gC*40&-1)+36>>2]|0;if(!((a[gw+(gC*40&-1)|0]&1)!=0&(hp|0)>0)){break}hF=0;hS=0;gF=c[gw+(gC*40&-1)+32>>2]|0;while(1){if((a[hF+84264|0]|0)==(a[gB+(hF+gF|0)|0]|0)){E6=gF;E7=hS}else{if((hF|0)!=1){break L44}E6=gF-1|0;E7=1}gC=hF+1|0;if((gC|0)<(E7+hp|0)){hF=gC;hS=E7;gF=E6}else{break}}if((E7|0)==0){if(!((hF|0)==0|(hF|0)==4)){break}}c[17062]=1;c[13898]=gv+2}else if((gD|0)==113){jq(66456)}else if((gD|0)==132){jq(65768)}else if((gD|0)==141){jq(65080)}else if((gD|0)==64){jq(67144)}else if((gD|0)==104){jq(69208)}else if((gD|0)==123){jq(68520)}else if((gD|0)==116){jv(2)}else if((gD|0)==107){jv(6)}else if((gD|0)==135){jv(1)}else if((gD|0)==126){jv(5)}else if((gD|0)==144){jv(0)}else if((gD|0)==65){jv(3)}else if((gD|0)==149){jv(7);if((a[30528]&1)==0){break}ju()}else if((gD|0)==95){jv(8)}else if((gD|0)==96){jv(9)}else if((gD|0)==100){jv(10)}else if((gD|0)==150){a[27776]=1;c[13898]=gv+1}else if((gD|0)==153){gF=gv+1|0;c[13898]=gF;L6691:do{if((gF|0)<(c[8272]|0)){L6693:do{if((a[gw+(gF*40&-1)|0]&1)!=0){hS=c[gw+(gF*40&-1)+36>>2]|0;hp=gw+(gF*40&-1)+32|0;hG=0;while(1){if((hG|0)>=(hS|0)){break}if((a[gB+((c[hp>>2]|0)+hG|0)|0]|0)==(a[hG+103664|0]|0)){hG=hG+1|0}else{break L6693}}if((hG|0)==1){break L6691}}}while(0);c[16665]=-1;hH(66656,1,0);if((gF|0)!=(c[13898]|0)){break L44}nh=is(q)|0;hp=c[nh>>2]|0;if((hp|0)==1){E8=+(c[nh+8>>2]|0)}else if((hp|0)==2){E8=+h[nh+8>>3]}else if((hp|0)==3){E8=+uz(c[nh+8>>2]|0,0)}else{b7=4976;break L27}if((c[gb>>2]|0)==3){uu(c[gc>>2]|0);c[gb>>2]=1}c[16665]=~~E8-1;break L44}}while(0);c[16665]=-1}else if((gD|0)==155){gF=gv+1|0;c[13898]=gF;L6711:do{if((gF|0)<(c[8272]|0)){L6713:do{if((a[gw+(gF*40&-1)|0]&1)!=0){hF=c[gw+(gF*40&-1)+36>>2]|0;nh=gw+(gF*40&-1)+32|0;hp=0;while(1){if((hp|0)>=(hF|0)){break}if((a[gB+((c[nh>>2]|0)+hp|0)|0]|0)==(a[hp+103664|0]|0)){hp=hp+1|0}else{break L6713}}if((hp|0)==1){break L6711}}}while(0);c[16493]=-1;hH(65968,1,0);if((gF|0)!=(c[13898]|0)){break L44}nh=is(p)|0;hF=c[nh>>2]|0;if((hF|0)==1){E9=+(c[nh+8>>2]|0)}else if((hF|0)==2){E9=+h[nh+8>>3]}else if((hF|0)==3){E9=+uz(c[nh+8>>2]|0,0)}else{b7=4992;break L27}if((c[gd>>2]|0)==3){uu(c[ge>>2]|0);c[gd>>2]=1}c[16493]=~~E9-1;break L44}}while(0);c[16493]=-1}else if((gD|0)==157){gF=gv+1|0;c[13898]=gF;L6731:do{if((gF|0)<(c[8272]|0)){L6733:do{if((a[gw+(gF*40&-1)|0]&1)!=0){nh=c[gw+(gF*40&-1)+36>>2]|0;hF=gw+(gF*40&-1)+32|0;hG=0;while(1){if((hG|0)>=(nh|0)){break}if((a[gB+((c[hF>>2]|0)+hG|0)|0]|0)==(a[hG+103664|0]|0)){hG=hG+1|0}else{break L6733}}if((hG|0)==1){break L6731}}}while(0);c[16321]=-1;hH(65280,1,0);if((gF|0)!=(c[13898]|0)){break L44}hF=is(o)|0;nh=c[hF>>2]|0;if((nh|0)==1){Fa=+(c[hF+8>>2]|0)}else if((nh|0)==2){Fa=+h[hF+8>>3]}else if((nh|0)==3){Fa=+uz(c[hF+8>>2]|0,0)}else{b7=5008;break L27}if((c[gf>>2]|0)==3){uu(c[gg>>2]|0);c[gf>>2]=1}c[16321]=~~Fa-1;break L44}}while(0);c[16321]=-1}else if((gD|0)==154){gF=gv+1|0;c[13898]=gF;L6751:do{if((gF|0)<(c[8272]|0)){L6753:do{if((a[gw+(gF*40&-1)|0]&1)!=0){hF=c[gw+(gF*40&-1)+36>>2]|0;nh=gw+(gF*40&-1)+32|0;hp=0;while(1){if((hp|0)>=(hF|0)){break}if((a[gB+((c[nh>>2]|0)+hp|0)|0]|0)==(a[hp+103664|0]|0)){hp=hp+1|0}else{break L6753}}if((hp|0)==1){break L6751}}}while(0);c[17353]=-1;hH(69408,1,0);if((gF|0)!=(c[13898]|0)){break L44}nh=is(n)|0;hF=c[nh>>2]|0;if((hF|0)==1){Fb=+(c[nh+8>>2]|0)}else if((hF|0)==2){Fb=+h[nh+8>>3]}else if((hF|0)==3){Fb=+uz(c[nh+8>>2]|0,0)}else{b7=5024;break L27}if((c[gh>>2]|0)==3){uu(c[gi>>2]|0);c[gh>>2]=1}c[17353]=~~Fb-1;break L44}}while(0);c[17353]=-1}else if((gD|0)==156){gF=gv+1|0;c[13898]=gF;L6771:do{if((gF|0)<(c[8272]|0)){L6773:do{if((a[gw+(gF*40&-1)|0]&1)!=0){nh=c[gw+(gF*40&-1)+36>>2]|0;hF=gw+(gF*40&-1)+32|0;hG=0;while(1){if((hG|0)>=(nh|0)){break}if((a[gB+((c[hF>>2]|0)+hG|0)|0]|0)==(a[hG+103664|0]|0)){hG=hG+1|0}else{break L6773}}if((hG|0)==1){break L6771}}}while(0);c[17181]=-1;hH(68720,1,0);if((gF|0)!=(c[13898]|0)){break L44}hF=is(l)|0;nh=c[hF>>2]|0;if((nh|0)==1){Fc=+(c[hF+8>>2]|0)}else if((nh|0)==2){Fc=+h[hF+8>>3]}else if((nh|0)==3){Fc=+uz(c[hF+8>>2]|0,0)}else{b7=5040;break L27}if((c[gj>>2]|0)==3){uu(c[gl>>2]|0);c[gj>>2]=1}c[17181]=~~Fc-1;break L44}}while(0);c[17181]=-1}else if((gD|0)==152){gF=gv+1|0;c[13898]=gF;L6791:do{if((gF|0)<(c[8272]|0)){L6793:do{if((a[gw+(gF*40&-1)|0]&1)!=0){hF=c[gw+(gF*40&-1)+36>>2]|0;nh=gw+(gF*40&-1)+32|0;hp=0;while(1){if((hp|0)>=(hF|0)){break}if((a[gB+((c[nh>>2]|0)+hp|0)|0]|0)==(a[hp+103664|0]|0)){hp=hp+1|0}else{break L6793}}if((hp|0)==1){b7=5050;break L6791}}}while(0);c[16665]=-1;hH(66656,1,0);if((gF|0)!=(c[13898]|0)){break}nh=is(k)|0;hF=c[nh>>2]|0;if((hF|0)==1){Fd=+(c[nh+8>>2]|0)}else if((hF|0)==2){Fd=+h[nh+8>>3]}else if((hF|0)==3){Fd=+uz(c[nh+8>>2]|0,0)}else{b7=5056;break L27}if((c[gm>>2]|0)==3){uu(c[gn>>2]|0);c[gm>>2]=1}c[16665]=~~Fd-1}else{b7=5050}}while(0);if((b7|0)==5050){b7=0;c[16665]=-1}c[16492]=c[16664];c[65972>>2]=c[66660>>2];c[65976>>2]=c[66664>>2];c[65980>>2]=c[66668>>2];c[65984>>2]=c[66672>>2];c[65988>>2]=c[66676>>2];c[65992>>2]=c[66680>>2];c[65996>>2]=c[66684>>2];c[66e3>>2]=c[66688>>2];c[66004>>2]=c[66692>>2];c[66008>>2]=c[66696>>2];c[66012>>2]=c[66700>>2];c[66016>>2]=c[66704>>2];c[66020>>2]=c[66708>>2];c[16320]=c[16664];c[65284>>2]=c[66660>>2];c[65288>>2]=c[66664>>2];c[65292>>2]=c[66668>>2];c[65296>>2]=c[66672>>2];c[65300>>2]=c[66676>>2];c[65304>>2]=c[66680>>2];c[65308>>2]=c[66684>>2];c[65312>>2]=c[66688>>2];c[65316>>2]=c[66692>>2];c[65320>>2]=c[66696>>2];c[65324>>2]=c[66700>>2];c[65328>>2]=c[66704>>2];c[65332>>2]=c[66708>>2]}else if((gD|0)==119){gF=gv+1|0;c[13898]=gF;nh=a[gw+(gF*40&-1)|0]&1;L6813:do{if((c[8272]|0)>(gF|0)){if(nh<<24>>24==0){Fe=0;b7=5066;break}hF=c[gw+(gF*40&-1)+36>>2]|0;hG=gw+(gF*40&-1)+32|0;hS=0;while(1){if((hS|0)>=(hF|0)){break}if((a[gB+((c[hG>>2]|0)+hS|0)|0]|0)==(a[hS+95280|0]|0)){hS=hS+1|0}else{Fe=nh;b7=5066;break L6813}}if((hS|0)!=2){Ff=hF;Fg=nh;b7=5075;break}c[13898]=gv+2;hG=is(f)|0;gC=c[hG>>2]|0;if((gC|0)==1){Fh=+(c[hG+8>>2]|0)}else if((gC|0)==2){Fh=+h[hG+8>>3]}else if((gC|0)==3){Fh=+uz(c[hG+8>>2]|0,0)}else{b7=5072;break L27}if((c[go>>2]|0)!=3){Fi=1;Fj=Fh;break}uu(c[gp>>2]|0);c[go>>2]=1;Fi=1;Fj=Fh}else{Fe=nh;b7=5066}}while(0);if((b7|0)==5066){b7=0;Ff=c[gw+(gF*40&-1)+36>>2]|0;Fg=Fe;b7=5075}do{if((b7|0)==5075){b7=0;L6831:do{if(Fg<<24>>24!=0&(Ff|0)>0){nh=0;hG=0;gC=c[gw+(gF*40&-1)+32>>2]|0;while(1){if((a[nh+72944|0]|0)==(a[gB+(nh+gC|0)|0]|0)){Fk=gC;Fl=hG}else{if((nh|0)!=3){b7=5083;break L6831}Fk=gC-1|0;Fl=1}hB=nh+1|0;if((hB|0)<(Fl+Ff|0)){nh=hB;hG=Fl;gC=Fk}else{break}}if((Fl|0)!=0){Fm=gF;break}if((nh|0)==2|(nh|0)==8){Fm=gF}else{b7=5083}}else{b7=5083}}while(0);if((b7|0)==5083){b7=0;c[13898]=gv;Fm=gv}c[13898]=Fm+1;hF=is(j)|0;hS=c[hF>>2]|0;if((hS|0)==1){Fn=+(c[hF+8>>2]|0)}else if((hS|0)==2){Fn=+h[hF+8>>3]}else if((hS|0)==3){Fn=+uz(c[hF+8>>2]|0,0)}else{b7=5088;break L27}if((c[gq>>2]|0)!=3){Fi=0;Fj=Fn;break}uu(c[gs>>2]|0);c[gq>>2]=1;Fi=0;Fj=Fn}}while(0);h[77]=Fj;a[624]=Fi}else if((gD|0)==91){c[13898]=gv+1;gF=is(e)|0;hF=c[gF>>2]|0;if((hF|0)==1){Fo=+(c[gF+8>>2]|0)}else if((hF|0)==2){Fo=+h[gF+8>>3]}else if((hF|0)==3){Fo=+uz(c[gF+8>>2]|0,0)}else{b7=5096;break L27}if((c[gt>>2]|0)==3){uu(c[gu>>2]|0);c[gt>>2]=1}h[77]=Fo;a[624]=0}else{b7=5100;break L27}}while(0);if(!(ix(c[6074]|0)|0)){break L7}c[13898]=cb;gv=cb}if((b7|0)==109){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==114){uf(c[13898]|0,124136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==121){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=123984,v)|0)}else if((b7|0)==780){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==815){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==831){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==918){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==953){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=129728,v)|0)}else if((b7|0)==974){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==978){uk(132480,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==998){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1002){uk(132480,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1020){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1034){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1038){uf(mD,127632,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1053){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1073){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1078){uf(me,127264,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1083){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1097){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1101){uf(c[13898]|0,127040,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1165){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1194){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1207){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1224){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1232){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1240){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1244){uf(no,129896,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1251){uf(-1,129624,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1284){uf((c[13898]|0)-1|0,130240,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1292){c[13898]=nE;b7=1293}else if((b7|0)==1295){Fp=c[13898]|0;uf(Fp,132744,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1360){uf(nT,131288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1402){c[13898]=n7;b7=1403}else if((b7|0)==1405){Fq=c[13898]|0;uf(Fq,132744,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1452){c[13898]=oj;b7=1453}else if((b7|0)==1462){Fr=c[13898]|0;uf(Fr,140752,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1693){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1742){uf(gv,154168,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1747){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1764){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1769){uf(c[13898]|0,173664,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1867){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1877){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1885){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1893){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1901){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1974){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1997){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2007){uf(qT,136864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2054){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2152){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2158){uf(c[13898]|0,208936,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2165){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=201712,v)|0)}else if((b7|0)==2198){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=138936,v)|0)}else if((b7|0)==2201){uu(r3);uu(r2);uf(c[13898]|0,138632,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2206){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2270){c[13898]=sl;b7=2271}else if((b7|0)==2280){Fs=c[13898]|0;uf(Fs,140752,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2297){c[13898]=sr;st=sr;uf(st,140752,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2299){st=c[13898]|0;uf(st,140752,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2312){c[sv>>2]=sw;uf(c[13898]|0,174808,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2324){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2328){uf(c[13898]|0,140880,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2398){c[13898]=sX;b7=2399}else if((b7|0)==2401){Ft=c[13898]|0;uf(Ft,143264,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2437){uf(s$,142184,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2458){c[13898]=ta;tc=ta;uf(tc,142920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2460){tc=c[13898]|0;uf(tc,142920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2520){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2698){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2740){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2816){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2838){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2860){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2882){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2897){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2911){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2917){uf(vH,179040,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2930){c[13898]=vH;b7=2931}else if((b7|0)==2933){Fu=c[13898]|0;uf(Fu,149040,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2983){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2997){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3049){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3116){uf(vK,164e3,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3153){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3161){uf(wg,159752,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3166){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3170){uf(c[13898]|0,159064,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3182){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3186){uf(c[13898]|0,159064,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3198){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3202){uf(c[13898]|0,159064,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3205){uf(wg,159752,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3218){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3234){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3249){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3255){uf(wg,159752,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3258){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=151392,v)|0)}else if((b7|0)==3282){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3296){uf((c[13898]|0)-1|0,150248,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3302){uf((c[13898]|0)-1|0,150080,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3308){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3312){uf((c[13898]|0)-1|0,149880,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3317){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3321){uf((c[13898]|0)-1|0,149880,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3326){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3330){uf((c[13898]|0)-1|0,149880,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3347){uf(w$,150736,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3353){uf(wg,159752,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3361){c[13898]=xi;xj=xi;uf(xj,205112,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3363){xj=c[13898]|0;uf(xj,205112,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3366){uf(c[13898]|0,151816,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3371){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=151632,v)|0)}else if((b7|0)==3373){ez();Fv=c[13898]|0;uf(Fv,150896,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3397){ez();uf(c[13898]|0,151112,(v=i,i=i+8|0,c[v>>2]=c[11900],v)|0)}else if((b7|0)==3404){uf(c[13898]|0,150736,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3409){uf(wg,159752,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3413){uf(xx,152776,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3427){uf(xA,152776,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3441){uf(xD,152776,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3459){uf(xF,154672,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3467){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3471){uf(c[13898]|0,154376,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3473){uf(wg,154e3,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3537){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3541){c[13505]=0;uf(c[13898]|0,163320,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3561){uf(xO,162224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3576){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3590){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3614){c[13898]=x5;b7=3615}else if((b7|0)==3617){Fw=c[13898]|0;uf(Fw,149040,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3642){c[13898]=ya;b7=3643}else if((b7|0)==3645){Fx=c[13898]|0;uf(Fx,149040,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3678){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3683){uf(yz,208936,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3719){uf(yf,171872,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3720){uf(yf,171504,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3725){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3742){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3747){uf(c[13898]|0,173664,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3775){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3802){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3815){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3821){g[38]=1.0;g[178]=1.0;uf(-1,174280,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3845){uf(zN,143640,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3860){uf(zT,143640,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3879){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3884){uf(c[13898]|0,208936,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3894){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=176728,v)|0)}else if((b7|0)==3974){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4075){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4079){uf(AC,193912,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4110){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4186){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4197){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4213){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4217){uf((c[13898]|0)-1|0,204376,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4243){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4247){uf((c[13898]|0)-1|0,203376,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4290){uf(zm,208496,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4304){uj(c[13898]|0,214704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4308){uf(BU,217328,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4376){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4392){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4493){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4506){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4527){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4668){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4686){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4714){c[13898]=Ea;Fy=Ea;uf(Fy,73560,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4722){c[13898]=D4;Fy=D4;uf(Fy,73560,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4725){Fy=c[13898]|0;uf(Fy,73560,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4796){c[13898]=Ec;EH=Ec;uf(EH,95448,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4798){EH=c[13898]|0;uf(EH,95448,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4854){uf(ER,78920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4859){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4867){uf(c[13898]|0,21904,(v=i,i=i+16|0,c[v>>2]=120,c[v+8>>2]=360,v)|0)}else if((b7|0)==4869){uf(c[13898]|0,21904,(v=i,i=i+16|0,c[v>>2]=122,c[v+8>>2]=360,v)|0)}else if((b7|0)==4871){uf(c[13898]|0,21864,(v=i,i=i+8|0,c[v>>2]=179864,v)|0)}else if((b7|0)==4873){uf(c[13898]|0,21864,(v=i,i=i+8|0,c[v>>2]=77416,v)|0)}else if((b7|0)==4881){uf(-1,211136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4976){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==4992){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5008){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5024){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5040){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5056){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5072){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5088){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5096){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5100){uf(gv,204968,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5107){uf(gN,122840,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5108){uf(gN,122840,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5109){uf(gN,122840,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5110){uf(gN,122840,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5111){uf(hT,123864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5112){uf(hT,123864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5113){uf(hQ,123776,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5114){uf(hQ,123776,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5115){uf(hq,123648,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5116){uf(hq,123648,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5117){uf(hq,123648,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5118){uf(hq,123512,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5119){uf(hq,123512,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5120){uf(kI,124880,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5121){uf(kI,124880,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5122){uf(kI,124880,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5123){uf(lc,126168,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5124){uf(lc,126168,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5125){uf(lc,126168,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5126){uf(lc,126168,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5127){uf(lt,139712,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5128){uf(lt,139712,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5129){uf(lt,139712,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5130){uf(lt,139712,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5131){uf(mj,128168,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5132){uf(mj,128168,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5133){uf(mn,128008,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5134){uf(mn,128008,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5135){uf(mn,128008,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5136){uf(mn,128008,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5137){uf(mB,127784,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5138){uf(mB,127784,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5139){uf(mB,127784,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5140){uf(mB,127784,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5141){uf(mD,127528,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5142){uf(mD,127528,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5143){uf(mD,127528,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5144){uf(lL,126816,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5145){uf(lL,126816,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5146){uf(lL,126816,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5147){uf(lL,126816,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5148){uf(mN,128944,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5149){uf(mN,128944,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5150){uf(mN,128944,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5151){uf(mN,128944,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5152){uf(-1,129776,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5153){uf(-1,129776,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5156){uf(nK,130792,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5157){uf(nK,130792,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5158){uf(nQ,130664,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5159){uf(nQ,130664,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5162){uf(n_,132152,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5163){uf(n_,132152,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5164){uf(n_,132152,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5165){uf(n_,132152,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5168){uf(qP,78920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5169){uf(qP,78920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5170){uf(qP,78920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5171){uf(rd,98544,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5172){uf(rd,98544,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5173){uf(rd,98544,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5174){uf(rd,98544,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5175){uu(r2);uu(r6);Fz=c[13898]|0;uf(Fz,137984,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5176){uu(r2);uu(r6);Fz=c[13898]|0;uf(Fz,137984,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5177){uu(r2);uu(r6);Fz=c[13898]|0;uf(Fz,137984,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5178){uu(r2);uu(r6);Fz=c[13898]|0;uf(Fz,137984,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5181){uf(st,140752,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5184){uf(sA,141216,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5185){uf(sA,141216,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5186){uf(sA,141216,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5187){uf(sA,141216,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5190){uf(s$,142560,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5191){uf(s$,142560,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5192){uf(tc,142920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5195){uf(sR,211296,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5196){uf(sR,211296,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5197){uf(sR,211296,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5198){uf(sR,211296,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5199){uf(sR,211296,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5200){uf(sR,211296,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5201){uf(sR,211296,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5202){uf(sR,211296,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5203){uf(sR,211296,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5204){uf(sR,211296,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5205){uf(vo,143744,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5206){uf(vo,143744,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5207){uf(tq,143392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5208){uf(tq,143392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5209){uf(tq,143392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5210){uf(vE,78920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5211){uf(vE,78920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5212){uf(vE,78920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5213){uf(vE,78920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5216){uf(vT,170376,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5217){uf(vT,170376,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5218){uf(vV,78920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5219){uf(vV,78920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5220){uf(vV,78920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5221){uf(vV,78920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5222){uf(vX,169096,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5223){uf(vX,169096,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5224){uf(vX,169096,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5225){uf(vX,169096,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5226){uf(wd,164440,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5227){uf(wd,164440,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5228){uf(wd,164440,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5229){uf(wd,164440,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5230){uf(wd,164440,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5231){uf(wd,164440,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5232){uf(wd,164440,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5233){uf(wd,164440,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5234){uf(wd,164440,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5235){uf(wd,164440,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5236){uf(wd,164440,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5237){uf(wd,164440,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5238){uf(wO,150560,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5239){uf(wO,150560,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5240){uf(wO,150560,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5241){uf(xe,149736,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5242){uf(xe,149736,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5243){uf(xe,149736,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5244){uf(xe,149736,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5245){uf(xj,205112,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5246){uf(xj,205112,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5250){Fv=c[13898]|0;uf(Fv,150896,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5251){uf(xz,152392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5252){uf(xz,152392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5253){uf(xz,152392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5254){uf(xz,152392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5255){uf(xC,152392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5256){uf(xC,152392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5257){uf(xC,152392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5258){uf(xC,152392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5259){uf(xF,155040,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5260){uf(xF,155040,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5261){uf(x$,162848,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5262){uf(x$,162848,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5263){uf(x0,162848,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5264){uf(x0,162848,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5265){uf(x7,148728,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5266){uf(x7,148728,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5267){uf(x7,148728,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5272){uf(yU,78920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5273){uf(yU,78920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5274){uf(yU,78920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5275){uf(zT,214008,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5276){uf(zT,214008,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5277){uf(z7,176128,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5278){uf(z7,176128,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5279){uf(z7,176128,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5280){uf(zF,210136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5281){uf(zF,210136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5282){uf(zF,210136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5283){uf(zF,210136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5284){uf(zs,209456,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5285){uf(zs,209456,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5286){uf(zs,209456,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5287){uf(zs,209456,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5288){uf(AX,200192,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5289){uf(AX,200192,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5290){uf(AX,200192,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5291){uf(AX,200192,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5292){uf(AX,95448,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5293){uf(AX,95448,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5294){uf(AX,95448,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5295){uf(AX,95448,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5296){uf(BW,217888,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5297){uf(BW,217888,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5298){uf(BW,217888,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5299){uf(DU,98544,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5300){uf(DU,98544,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5301){uf(DU,98544,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5302){uf(DU,98544,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5303){uf(Ci,224656,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5304){uf(Ci,224656,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5305){uf(Ci,224656,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5306){uf(Ci,224656,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5310){uf(EH,95448,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5311){uf(EH,95448,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==5312){uf(EH,95448,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((b7|0)==1293){c[12886]=0;Fp=nE;uf(Fp,132744,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1403){c[10568]=0;Fq=n7;uf(Fq,132744,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==1453){c[bv>>2]=0;Fr=oj;uf(Fr,140752,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2271){c[a8>>2]=0;Fs=sl;uf(Fs,140752,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2399){c[8528]=0;Ft=sX;uf(Ft,143264,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==2931){c[aF>>2]=0;Fu=vH;uf(Fu,149040,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3615){c[ad>>2]=0;Fw=x5;uf(Fw,149040,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b7|0)==3643){c[57238]=0;Fx=ya;uf(Fx,149040,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);e7(0);Fx=c[6074]|0;if((Fx|0)!=0){ya=Fx;while(1){Fx=c[ya>>2]|0;uu(c[ya+12>>2]|0);uu(ya);if((Fx|0)==0){break}else{ya=Fx}}}c[6074]=0;i=d;return}function jp(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0;b=i;i=i+40|0;d=b|0;e=b+24|0;f=e|0;g=e|0;uE(g|0,0,11);h=c[13898]|0;j=h+1|0;c[13898]=j;k=c[1054]|0;l=c[k+(j*40&-1)+36>>2]|0;m=c[k+(j*40&-1)+32>>2]|0;n=(a[k+(j*40&-1)|0]&1)==0;o=(l|0)>0;p=c[10036]|0;q=56720;r=77416;L7279:while(1){L7281:do{if(!n){if(o){s=0;t=0;u=m;while(1){w=a[r+s|0]|0;if(w<<24>>24==(a[p+(s+u|0)|0]|0)){x=u;y=t}else{if(w<<24>>24!=36){break L7281}x=u-1|0;y=1}z=s+1|0;if((z|0)<(y+l|0)){s=z;t=y;u=x}else{break}}if((y|0)==0){A=z}else{B=q;break L7279}}else{A=0}u=a[r+A|0]|0;if((u<<24>>24|0)==36|(u<<24>>24|0)==0){B=q;break L7279}}}while(0);u=q+8|0;t=c[u>>2]|0;if((t|0)==0){B=u;break}else{q=u;r=t}}r=c[B+4>>2]|0;L7294:do{if((r|0)>-1){a[e+r|0]=1;B=h+2|0;c[13898]=B;C=B;D=c[8272]|0}else{B=c[8272]|0;q=(B|0)>(j|0);L7296:do{if(!(n|q^1)){A=0;while(1){if((A|0)>=(l|0)){E=5332;break}if((a[p+(m+A|0)|0]|0)==(a[A+150688|0]|0)){A=A+1|0}else{E=5333;break}}if((E|0)==5332){if((A|0)!=2){E=5333}}if((E|0)==5333){if(n|q^1){break}else{F=0}while(1){if((F|0)>=(l|0)){break}if((a[p+(m+F|0)|0]|0)==(a[F+148800|0]|0)){F=F+1|0}else{break L7296}}if((F|0)!=2){break}}a[e+1|0]=1;a[e+2|0]=1;A=h+2|0;c[13898]=A;C=A;D=B;break L7294}}while(0);uE(f|0,1,11);C=j;D=B}}while(0);L7312:do{if((C|0)<(D|0)){j=(a[k+(C*40&-1)|0]&1)==0;L7314:do{if(j){G=d}else{f=c[k+(C*40&-1)+36>>2]|0;h=k+(C*40&-1)+32|0;F=0;while(1){if((F|0)>=(f|0)){E=5345;break}if((a[p+((c[h>>2]|0)+F|0)|0]|0)==(a[F+103664|0]|0)){F=F+1|0}else{break}}if((E|0)==5345){if((F|0)==1){break L7312}}h=d;if(j){G=h;break}f=c[k+(C*40&-1)+36>>2]|0;m=k+(C*40&-1)+32|0;l=0;while(1){if((l|0)>=(f|0)){break}if((a[p+((c[m>>2]|0)+l|0)|0]|0)==(a[l+103664|0]|0)){l=l+1|0}else{G=h;break L7314}}if((l|0)==1){H=C}else{G=h;break}uf(H,133088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);a[14176]=1;is(d);a[14176]=0;if((c[d>>2]|0)!=3){c[13898]=C;H=C;uf(H,133088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}j=c[d+8>>2]|0;if((j|0)==0){H=c[13898]|0;uf(H,133088,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((a[e+2|0]&1)!=0){uF(66240,j|0,50);B=a8(j|0,37)|0;do{if((B|0)==0){I=0}else{m=B+1|0;L7342:do{if((m|0)==0){J=0}else{f=m;while(1){F=a[f]|0;if(!((F<<24>>24|0)==32|(F<<24>>24|0)==45|(F<<24>>24|0)==43|(F<<24>>24|0)==35)){J=f;break L7342}F=f+1|0;if((F|0)==0){J=0;break}else{f=F}}}}while(0);while(1){K=a[J]|0;if(!(((K&255)-48|0)>>>0<10|K<<24>>24==46)){break}J=J+1|0}if((K-102&255)<2){I=1;break}I=K<<24>>24==101&1}}while(0);a[66188]=I}if((a[e+1|0]&1)!=0){uF(65552,j|0,50);B=a8(j|0,37)|0;do{if((B|0)==0){L=0}else{m=B+1|0;L7357:do{if((m|0)==0){M=0}else{h=m;while(1){l=a[h]|0;if(!((l<<24>>24|0)==32|(l<<24>>24|0)==45|(l<<24>>24|0)==43|(l<<24>>24|0)==35)){M=h;break L7357}l=h+1|0;if((l|0)==0){M=0;break}else{h=l}}}}while(0);while(1){N=a[M]|0;if(!(((N&255)-48|0)>>>0<10|N<<24>>24==46)){break}M=M+1|0}if((N-102&255)<2){L=1;break}L=N<<24>>24==101&1}}while(0);a[65500]=L}if((a[g]&1)!=0){uF(64864,j|0,50);B=a8(j|0,37)|0;do{if((B|0)==0){O=0}else{m=B+1|0;L7372:do{if((m|0)==0){P=0}else{h=m;while(1){l=a[h]|0;if(!((l<<24>>24|0)==32|(l<<24>>24|0)==45|(l<<24>>24|0)==43|(l<<24>>24|0)==35)){P=h;break L7372}l=h+1|0;if((l|0)==0){P=0;break}else{h=l}}}}while(0);while(1){Q=a[P]|0;if(!(((Q&255)-48|0)>>>0<10|Q<<24>>24==46)){break}P=P+1|0}if((Q-102&255)<2){O=1;break}O=Q<<24>>24==101&1}}while(0);a[64812]=O}if((a[e+6|0]&1)!=0){uF(68992,j|0,50);B=a8(j|0,37)|0;do{if((B|0)==0){R=0}else{m=B+1|0;L7387:do{if((m|0)==0){S=0}else{h=m;while(1){l=a[h]|0;if(!((l<<24>>24|0)==32|(l<<24>>24|0)==45|(l<<24>>24|0)==43|(l<<24>>24|0)==35)){S=h;break L7387}l=h+1|0;if((l|0)==0){S=0;break}else{h=l}}}}while(0);while(1){T=a[S]|0;if(!(((T&255)-48|0)>>>0<10|T<<24>>24==46)){break}S=S+1|0}if((T-102&255)<2){R=1;break}R=T<<24>>24==101&1}}while(0);a[68940]=R}if((a[e+5|0]&1)!=0){uF(68304,j|0,50);B=a8(j|0,37)|0;do{if((B|0)==0){U=0}else{m=B+1|0;L7402:do{if((m|0)==0){V=0}else{h=m;while(1){l=a[h]|0;if(!((l<<24>>24|0)==32|(l<<24>>24|0)==45|(l<<24>>24|0)==43|(l<<24>>24|0)==35)){V=h;break L7402}l=h+1|0;if((l|0)==0){V=0;break}else{h=l}}}}while(0);while(1){W=a[V]|0;if(!(((W&255)-48|0)>>>0<10|W<<24>>24==46)){break}V=V+1|0}if((W-102&255)<2){U=1;break}U=W<<24>>24==101&1}}while(0);a[68252]=U}if((a[e+3|0]&1)!=0){uF(66928,j|0,50);B=a8(j|0,37)|0;do{if((B|0)==0){X=0}else{m=B+1|0;L7417:do{if((m|0)==0){Y=0}else{h=m;while(1){l=a[h]|0;if(!((l<<24>>24|0)==32|(l<<24>>24|0)==45|(l<<24>>24|0)==43|(l<<24>>24|0)==35)){Y=h;break L7417}l=h+1|0;if((l|0)==0){Y=0;break}else{h=l}}}}while(0);while(1){Z=a[Y]|0;if(!(((Z&255)-48|0)>>>0<10|Z<<24>>24==46)){break}Y=Y+1|0}if((Z-102&255)<2){X=1;break}X=Z<<24>>24==101&1}}while(0);a[66876]=X}if((a[e+7|0]&1)!=0){uF(69680,j|0,50);B=a8(j|0,37)|0;do{if((B|0)==0){_=0}else{m=B+1|0;L7432:do{if((m|0)==0){$=0}else{h=m;while(1){l=a[h]|0;if(!((l<<24>>24|0)==32|(l<<24>>24|0)==45|(l<<24>>24|0)==43|(l<<24>>24|0)==35)){$=h;break L7432}l=h+1|0;if((l|0)==0){$=0;break}else{h=l}}}}while(0);while(1){aa=a[$]|0;if(!(((aa&255)-48|0)>>>0<10|aa<<24>>24==46)){break}$=$+1|0}if((aa-102&255)<2){_=1;break}_=aa<<24>>24==101&1}}while(0);a[69628]=_}uu(j);i=b;return}}while(0);if((a[e+2|0]&1)!=0){c[16560]=6758437;a[66188]=1}if((a[e+1|0]&1)!=0){c[16388]=6758437;a[65500]=1}if((a[g]&1)!=0){c[16216]=6758437;a[64812]=1}if((a[e+6|0]&1)!=0){c[17248]=6758437;a[68940]=1}if((a[e+5|0]&1)!=0){c[17076]=6758437;a[68252]=1}if((a[e+3|0]&1)!=0){c[16732]=6758437;a[66876]=1}if((a[e+7|0]&1)==0){i=b;return}c[17420]=6758437;a[69628]=1;i=b;return}function jq(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;d=i;i=i+24|0;e=d|0;f=(c[13898]|0)+1|0;c[13898]=f;L7468:do{if((f|0)<(c[8272]|0)){g=c[1054]|0;L7470:do{if((a[g+(f*40&-1)|0]&1)!=0){h=c[g+(f*40&-1)+36>>2]|0;j=g+(f*40&-1)+32|0;k=c[10036]|0;l=0;while(1){if((l|0)>=(h|0)){break}if((a[k+((c[j>>2]|0)+l|0)|0]|0)==(a[l+103664|0]|0)){l=l+1|0}else{break L7470}}if((l|0)==1){break L7468}}}while(0);jw(b);g=c[13898]|0;L7477:do{if((g|0)<(c[8272]|0)){j=c[1054]|0;k=(a[j+(g*40&-1)|0]&1)==0;L7479:do{if(k){m=e}else{h=c[j+(g*40&-1)+36>>2]|0;n=j+(g*40&-1)+32|0;o=c[10036]|0;p=0;while(1){if((p|0)>=(h|0)){q=5461;break}if((a[o+((c[n>>2]|0)+p|0)|0]|0)==(a[p+103664|0]|0)){p=p+1|0}else{break}}if((q|0)==5461){if((p|0)==1){break L7477}}n=e;if(k){m=n;break}o=c[j+(g*40&-1)+36>>2]|0;h=j+(g*40&-1)+32|0;r=c[10036]|0;s=0;while(1){if((s|0)>=(o|0)){break}if((a[r+((c[h>>2]|0)+s|0)|0]|0)==(a[s+103664|0]|0)){s=s+1|0}else{m=n;break L7479}}if((s|0)==1){break L7477}else{m=n}}}while(0);a[14176]=1;is(e);a[14176]=0;if((c[e>>2]|0)!=3){c[13898]=g;break}j=c[e+8>>2]|0;if((j|0)==0){break}k=b+60|0;uu(c[k>>2]|0);c[k>>2]=j}}while(0);jw(b);i=d;return}}while(0);e=b+60|0;uu(c[e>>2]|0);c[e>>2]=0;i=d;return}function jr(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;d=i;i=i+48|0;e=d|0;f=d+24|0;g=(c[13898]|0)+1|0;c[13898]=g;if((g|0)>=(c[8272]|0)){j=g;uf(j,208936,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}k=c[1054]|0;L7506:do{if((a[k+(g*40&-1)|0]&1)!=0){l=c[k+(g*40&-1)+36>>2]|0;m=k+(g*40&-1)+32|0;n=c[10036]|0;o=0;while(1){if((o|0)>=(l|0)){break}if((a[n+((c[m>>2]|0)+o|0)|0]|0)==(a[o+103664|0]|0)){o=o+1|0}else{break L7506}}if((o|0)==1){j=g}else{break}uf(j,208936,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);g=is(e)|0;k=c[g>>2]|0;if((k|0)==3){p=+uz(c[g+8>>2]|0,0)}else if((k|0)==2){p=+h[g+8>>3]}else if((k|0)==1){p=+(c[g+8>>2]|0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=e|0;if((c[g>>2]|0)==3){uu(c[e+8>>2]|0);c[g>>2]=1}g=~~p;if((g|0)<1){j=c[13898]|0;uf(j,208936,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{q=b;r=0}while(1){s=c[q>>2]|0;if((s|0)==0){t=0;u=5494;break}w=c[s+4>>2]|0;if((g|0)>(w|0)){q=s|0;r=s}else{u=5493;break}}if((u|0)==5493){if((g|0)==(w|0)){x=s}else{t=s;u=5494}}if((u|0)==5494){s=f|0;uE(s|0,0,24);f=g-1|0;w=ut(64)|0;do{if((w|0)==0){gk();q=ut(64)|0;if((q|0)!=0){y=q;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=128152,v)|0)}else{y=w}}while(0);w=y;if((r|0)==0){c[b>>2]=w}else{c[r>>2]=w}c[y+4>>2]=g;c[y>>2]=t;c[y+8>>2]=0;c[y+12>>2]=f;c[y+16>>2]=f;c[y+20>>2]=0;h[y+24>>3]=1.0;h[y+32>>3]=-2.0;f=y+40|0;c[f>>2]=c[s>>2];c[f+4>>2]=c[s+4>>2];c[f+8>>2]=c[s+8>>2];c[f+12>>2]=c[s+12>>2];c[f+16>>2]=c[s+16>>2];c[f+20>>2]=c[s+20>>2];x=w}w=c[13898]|0;s=c[1054]|0;f=c[s+(w*40&-1)+36>>2]|0;L7542:do{if((a[s+(w*40&-1)|0]&1)!=0&(f|0)>0){y=c[10036]|0;t=0;g=0;q=c[s+(w*40&-1)+32>>2]|0;while(1){if((a[t+184456|0]|0)==(a[y+(t+q|0)|0]|0)){z=q;A=g}else{if((t|0)!=3){u=5515;break L7542}z=q-1|0;A=1}j=t+1|0;if((j|0)<(A+f|0)){t=j;g=A;q=z}else{break}}if((A|0)==0){if(!((t|0)==2|(t|0)==7)){u=5515;break}}if((x|0)==0){B=w}else{q=c[x>>2]|0;if((c[b>>2]|0)==(x|0)){c[b>>2]=q}else{c[r>>2]=q}uu(x);B=c[13898]|0}q=B+1|0;c[13898]=q;C=q}else{u=5515}}while(0);if((u|0)==5515){B=x+8|0;hH(B,0,1);C=c[13898]|0}if((C|0)>=(c[8272]|0)){i=d;return}B=c[1054]|0;if((a[B+(C*40&-1)|0]&1)==0){D=(b|0)==43264;E=D?124560:123144;uf(C,125776,(v=i,i=i+8|0,c[v>>2]=E,v)|0)}x=c[B+(C*40&-1)+36>>2]|0;r=B+(C*40&-1)+32|0;B=c[10036]|0;w=0;while(1){if((w|0)>=(x|0)){break}if((a[B+((c[r>>2]|0)+w|0)|0]|0)==(a[w+103664|0]|0)){w=w+1|0}else{u=5530;break}}if((u|0)==5530){D=(b|0)==43264;E=D?124560:123144;uf(C,125776,(v=i,i=i+8|0,c[v>>2]=E,v)|0)}if((w|0)==1){i=d;return}else{D=(b|0)==43264;E=D?124560:123144;uf(C,125776,(v=i,i=i+8|0,c[v>>2]=E,v)|0)}}function js(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0;d=i;i=i+24|0;e=d|0;f=b|0;c[f>>2]=4;g=b+16|0;h[g>>3]=-1.0;b=c[13898]|0;j=b+1|0;c[13898]=j;if((j|0)>=(c[8272]|0)){i=d;return}k=c[1054]|0;l=a[k+(j*40&-1)|0]|0;m=(l&1)==0;L7583:do{if(m){n=j;o=l}else{p=c[k+(j*40&-1)+36>>2]|0;q=k+(j*40&-1)+32|0;r=c[10036]|0;s=0;while(1){if((s|0)>=(p|0)){t=5537;break}if((a[r+((c[q>>2]|0)+s|0)|0]|0)==(a[s+103664|0]|0)){s=s+1|0}else{break}}do{if((t|0)==5537){if((s|0)!=1){break}i=d;return}}while(0);if(m){n=j;o=l;break}s=c[k+(j*40&-1)+36>>2]|0;q=k+(j*40&-1)+32|0;r=c[10036]|0;p=0;while(1){if((p|0)>=(s|0)){break}if((a[r+((c[q>>2]|0)+p|0)|0]|0)==(a[p+95280|0]|0)){p=p+1|0}else{n=j;o=l;break L7583}}if((p|0)!=2){n=j;o=l;break}q=b+2|0;c[13898]=q;s=c[k+(q*40&-1)+36>>2]|0;u=a[k+(q*40&-1)|0]|0;if((u&1)!=0&(s|0)>0){w=0;x=0;y=c[k+(q*40&-1)+32>>2]|0}else{uf(q,141880,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}while(1){if((a[w+142056|0]|0)==(a[r+(w+y|0)|0]|0)){z=y;A=x}else{if((w|0)!=2){t=5575;break}z=y-1|0;A=1}B=w+1|0;if((B|0)<(A+s|0)){w=B;x=A;y=z}else{break}}if((t|0)==5575){uf(q,141880,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((A|0)!=0){n=q;o=u;break}if((w|0)==1|(w|0)==6){n=q;o=u;break}uf(q,141880,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);w=c[k+(n*40&-1)+36>>2]|0;L7612:do{if((o&1)!=0&(w|0)>0){A=c[10036]|0;t=0;z=0;y=c[k+(n*40&-1)+32>>2]|0;while(1){if((a[t+142056|0]|0)==(a[A+(t+y|0)|0]|0)){C=y;D=z}else{if((t|0)!=2){break L7612}C=y-1|0;D=1}x=t+1|0;if((x|0)<(D+w|0)){t=x;z=D;y=C}else{break}}if((D|0)==0){if(!((t|0)==1|(t|0)==6)){break}}c[f>>2]=3;c[13898]=(c[13898]|0)+1}}while(0);D=is(e)|0;C=c[D>>2]|0;if((C|0)==1){E=+(c[D+8>>2]|0)}else if((C|0)==2){E=+h[D+8>>3]}else if((C|0)==3){E=+uz(c[D+8>>2]|0,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}D=e|0;if((c[D>>2]|0)==3){uu(c[e+8>>2]|0);c[D>>2]=1}D=E<0.0;F=D?-1.0:E;h[g>>3]=F;if((c[f>>2]|0)!=3){i=d;return}if(D){h[g>>3]=0.0;i=d;return}if(F<=1.0){i=d;return}h[g>>3]=1.0;i=d;return}function jt(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0,aA=0,aB=0,aC=0,aD=0,aE=0,aF=0,aG=0,aH=0,aI=0,aJ=0,aK=0,aL=0,aM=0,aN=0,aO=0,aP=0,aQ=0,aR=0,aS=0,aT=0,aU=0,aV=0,aW=0,aX=0,aY=0,aZ=0,a_=0,a$=0,a0=0,a1=0,a2=0,a3=0,a4=0,a5=0,a6=0,a7=0,a9=0,ba=0,bb=0,bc=0,bd=0,be=0,bf=0,bg=0,bh=0,bi=0,bj=0,bk=0,bl=0,bm=0,bn=0,bo=0,bp=0,bq=0,br=0,bs=0,bt=0,bu=0,bv=0,bw=0,bx=0.0,by=0.0,bz=0,bA=0,bB=0.0,bC=0,bD=0,bE=0,bF=0,bG=0,bH=0,bI=0,bJ=0,bK=0,bL=0,bM=0,bN=0,bO=0,bP=0,bQ=0,bR=0,bS=0,bT=0,bU=0,bV=0,bW=0,bX=0,bY=0,bZ=0,b_=0,b$=0,b0=0,b1=0,b2=0,b3=0,b4=0,b5=0,b6=0,b7=0,b8=0,b9=0,ca=0,cb=0,cc=0,cd=0,ce=0,cf=0,cg=0,ch=0,ci=0,cj=0,ck=0,cl=0,cm=0,cn=0,co=0,cp=0,cq=0,cr=0.0,cs=0.0,ct=0.0,cu=0,cv=0.0,cw=0,cx=0,cy=0,cz=0.0,cA=0,cB=0,cC=0,cD=0,cE=0.0,cF=0.0,cG=0.0,cH=0.0,cI=0.0,cJ=0.0,cK=0,cL=0,cM=0.0,cN=0.0,cO=0.0,cP=0.0,cQ=0,cR=0.0,cS=0.0,cT=0,cU=0,cV=0,cW=0,cX=0,cY=0,cZ=0,c_=0,c$=0,c0=0,c1=0,c2=0,c3=0,c4=0,c5=0,c6=0,c7=0,c8=0,c9=0,da=0,db=0,dc=0,dd=0,de=0,df=0,dg=0,dh=0,di=0,dj=0,dk=0,dm=0,dn=0,dq=0,dr=0,ds=0,dt=0,du=0,dv=0,dw=0,dx=0,dy=0,dz=0,dA=0,dB=0,dC=0,dD=0,dE=0,dF=0,dG=0,dH=0,dI=0.0,dJ=0,dK=0,dL=0,dM=0;d=i;i=i+656|0;e=d|0;f=d+24|0;g=d+48|0;j=d+72|0;k=d+96|0;l=d+120|0;m=d+144|0;n=d+168|0;o=d+192|0;p=d+216|0;q=d+264|0;r=d+272|0;s=d+296|0;t=d+320|0;u=d+344|0;w=d+368|0;x=d+392|0;y=d+416|0;z=d+464|0;A=d+472|0;B=d+520|0;C=d+528|0;D=d+576|0;E=d+584|0;F=d+608|0;G=d+624|0;H=F|0;a[H]=a[136208]|0;a[H+1|0]=a[136209|0]|0;a[H+2|0]=a[136210|0]|0;I=F+2|0;J=56832+(b*24&-1)|0;uB(I|0,J|0);K=F+(uA(H|0)|0)|0;a[K]=a[120232]|0;a[K+1|0]=a[120233|0]|0;a[K+2|0]=a[120234|0]|0;a[K+3|0]=a[120235|0]|0;a[K+4|0]=a[120236|0]|0;a[K+5|0]=a[120237|0]|0;H=c[13898]|0;L=c[1054]|0;M=c[L+(H*40&-1)+36>>2]|0;N=c[L+(H*40&-1)+32>>2]|0;L7646:do{if((a[L+(H*40&-1)|0]&1)==0){P=H}else{if((M|0)>0){Q=c[10036]|0;R=0;S=0;T=N;while(1){U=a[F+(R+2|0)|0]|0;if(U<<24>>24==(a[Q+(R+T|0)|0]|0)){V=T;W=S}else{if(U<<24>>24!=36){P=H;break L7646}V=T-1|0;W=1}X=R+1|0;if((X|0)<(W+M|0)){R=X;S=W;T=V}else{break}}if((W|0)==0){Y=X;Z=5590}}else{Y=0;Z=5590}if((Z|0)==5590){T=a[F+(Y+2|0)|0]|0;if(!((T<<24>>24|0)==36|(T<<24>>24|0)==0)){P=H;break}}T=64976+(b*688&-1)|0;a[T]=0;S=H+1|0;c[13898]=S;R=e|0;Q=e+8|0;U=64864+(b*688&-1)|0;_=64812+(b*688&-1)|0;$=64944+(b*688&-1)|0;aa=o|0;ab=o+8|0;ac=64808+(b*688&-1)|0;ad=n|0;ae=n+8|0;af=64813+(b*688&-1)|0;ag=m|0;ah=m+8|0;ai=l|0;aj=l+8|0;ak=x|0;al=x+8|0;am=w|0;an=w+8|0;ao=u|0;ap=u+8|0;aq=t|0;ar=t+8|0;as=s|0;at=s+8|0;au=r|0;av=r+8|0;aw=64944+(b*688&-1)|0;ax=64920+(b*688&-1)|0;ay=64952+(b*688&-1)|0;az=64960+(b*688&-1)|0;aA=64968+(b*688&-1)|0;aB=64928+(b*688&-1)|0;aC=(b|0)==0?6:5;aD=64924+(b*688&-1)|0;aE=f|0;aF=f+8|0;aG=65024+(b*688&-1)|0;aH=65272+(b*688&-1)|0;aI=65128+(b*688&-1)|0;aJ=G|0;aK=64984+(b*688&-1)|0;aL=64988+(b*688&-1)|0;aM=64992+(b*688&-1)|0;aN=(64648+(b*688&-1)|0)+348|0;aO=64984+(b*688&-1)|0;aP=65032+(b*688&-1)|0;aQ=g|0;aR=g+8|0;aS=k|0;aT=k+8|0;aU=65056+(b*688&-1)|0;aV=j|0;aW=j+8|0;aX=65064+(b*688&-1)|0;aY=65072+(b*688&-1)|0;aZ=64916+(b*688&-1)|0;a_=0;a$=0;a0=S;a1=L;a2=a[L+(S*40&-1)|0]|0;L7660:while(1){S=c[a1+(a0*40&-1)+36>>2]|0;a3=c[a1+(a0*40&-1)+32>>2]|0;a4=(a2&1)==0;L7662:do{if((S|0)>0&(a4^1)){a5=c[10036]|0;a6=0;a7=0;a9=a3;while(1){if((a[a6+116896|0]|0)==(a[a5+(a6+a9|0)|0]|0)){ba=a9;bb=a7}else{if((a6|0)!=2){break}ba=a9-1|0;bb=1}bc=a6+1|0;if((bc|0)<(bb+S|0)){a6=bc;a7=bb;a9=ba}else{Z=5598;break}}do{if((Z|0)==5598){Z=0;if((bb|0)==0){if(!((a6|0)==1|(a6|0)==4)){break}}c[aZ>>2]=c[aZ>>2]&-4|2;c[13898]=a0+1;bd=1;be=a$;break L7662}}while(0);if(a4){Z=5835;break}L7677:do{if((S|0)>0){a6=c[10036]|0;a9=0;a7=0;a5=a3;while(1){if((a[a9+141136|0]|0)==(a[a6+(a9+a5|0)|0]|0)){bf=a5;bg=a7}else{if((a9|0)!=2){break L7677}bf=a5-1|0;bg=1}bc=a9+1|0;if((bc|0)<(bg+S|0)){a9=bc;a7=bg;a5=bf}else{break}}if((bg|0)==0){if(!((a9|0)==1|(a9|0)==6)){break}}c[aZ>>2]=c[aZ>>2]&-4|1;c[13898]=a0+1;bd=a_;be=a$;break L7662}}while(0);if(!((S|0)>0&(a4^1))){Z=5835;break}a5=c[10036]|0;a7=0;a6=0;bc=a3;while(1){if((a[a7+115048|0]|0)==(a[a5+(a7+bc|0)|0]|0)){bh=bc;bi=a6}else{if((a7|0)!=2){break}bh=bc-1|0;bi=1}bj=a7+1|0;if((bj|0)<(bi+S|0)){a7=bj;a6=bi;bc=bh}else{Z=5617;break}}do{if((Z|0)==5617){Z=0;if((bi|0)==0){if(!((a7|0)==1|(a7|0)==6)){break}}c[aZ>>2]=c[aZ>>2]|4;c[13898]=a0+1;bd=a_;be=1;break L7662}}while(0);if(a4){Z=5835;break}L7704:do{if((S|0)>0){a7=c[10036]|0;bc=0;a6=0;a5=a3;while(1){if((a[bc+114024|0]|0)==(a[a7+(bc+a5|0)|0]|0)){bk=a5;bl=a6}else{if((bc|0)!=4){break L7704}bk=a5-1|0;bl=1}bj=bc+1|0;if((bj|0)<(bl+S|0)){bc=bj;a6=bl;a5=bk}else{break}}if((bl|0)==0){if(!((bc|0)==3|(bc|0)==8)){break}}c[aZ>>2]=c[aZ>>2]&-5;c[13898]=a0+1;bd=a_;be=1;break L7662}}while(0);if(!((S|0)>0&(a4^1))){Z=5835;break}a5=c[10036]|0;a6=0;a7=0;a9=a3;while(1){if((a[a6+110600|0]|0)==(a[a5+(a6+a9|0)|0]|0)){bm=a9;bn=a7}else{if((a6|0)!=2){break}bm=a9-1|0;bn=1}bj=a6+1|0;if((bj|0)<(bn+S|0)){a6=bj;a7=bn;a9=bm}else{Z=5636;break}}do{if((Z|0)==5636){Z=0;if((bn|0)==0){if(!((a6|0)==1|(a6|0)==7)){break}}a[aY]=1;c[13898]=a0+1;bd=a_;be=a$;break L7662}}while(0);if(a4){Z=5835;break}L7731:do{if((S|0)>0){a6=c[10036]|0;a9=0;a7=0;a5=a3;while(1){if((a[a9+107800|0]|0)==(a[a6+(a9+a5|0)|0]|0)){bo=a5;bp=a7}else{if((a9|0)!=3){break L7731}bo=a5-1|0;bp=1}bj=a9+1|0;if((bj|0)<(bp+S|0)){a9=bj;a7=bp;a5=bo}else{break}}if((bp|0)==0){if(!((a9|0)==2|(a9|0)==8)){break}}a[aY]=0;c[13898]=a0+1;bd=a_;be=a$;break L7662}}while(0);if(!((S|0)>0&(a4^1))){Z=5835;break}a5=c[10036]|0;a7=0;a6=0;bc=a3;while(1){if((a[a7+106864|0]|0)==(a[a5+(a7+bc|0)|0]|0)){bq=bc;br=a6}else{if((a7|0)!=2){break}bq=bc-1|0;br=1}bj=a7+1|0;if((bj|0)<(br+S|0)){a7=bj;a6=br;bc=bq}else{Z=5655;break}}do{if((Z|0)==5655){Z=0;if((br|0)==0){if(!((a7|0)==5|(a7|0)==1)){break}}bc=a0+1|0;c[13898]=bc;a6=c[a1+(bc*40&-1)+36>>2]|0;L7756:do{if((a[a1+(bc*40&-1)|0]&1)!=0&(a6|0)>0){a5=c[10036]|0;bj=0;bs=0;bt=c[a1+(bc*40&-1)+32>>2]|0;while(1){if((a[bj+184456|0]|0)==(a[a5+(bj+bt|0)|0]|0)){bu=bt;bv=bs}else{if((bj|0)!=3){break L7756}bu=bt-1|0;bv=1}bw=bj+1|0;if((bw|0)<(bv+a6|0)){bj=bw;bs=bv;bt=bu}else{break}}if((bv|0)==0){if(!((bj|0)==2|(bj|0)==7)){break}}h[aU>>3]=1.0;h[aX>>3]=.5;c[13898]=a0+2;bd=a_;be=a$;break L7662}}while(0);a6=is(k)|0;bc=c[a6>>2]|0;if((bc|0)==1){bx=+(c[a6+8>>2]|0)}else if((bc|0)==2){bx=+h[a6+8>>3]}else if((bc|0)==3){bx=+uz(c[a6+8>>2]|0,0)}else{Z=5670;break L7660}if((c[aS>>2]|0)==3){uu(c[aT>>2]|0);c[aS>>2]=1}h[aU>>3]=bx;a6=c[13898]|0;L7777:do{if((c[8272]|0)>(a6|0)){bc=c[1054]|0;if((a[bc+(a6*40&-1)|0]&1)==0){break}a9=c[bc+(a6*40&-1)+36>>2]|0;bt=bc+(a6*40&-1)+32|0;bc=c[10036]|0;bs=0;while(1){if((bs|0)>=(a9|0)){break}if((a[bc+((c[bt>>2]|0)+bs|0)|0]|0)==(a[bs+148464|0]|0)){bs=bs+1|0}else{break L7777}}if((bs|0)!=1){break}c[13898]=a6+1;bt=is(j)|0;bc=c[bt>>2]|0;if((bc|0)==1){by=+(c[bt+8>>2]|0)}else if((bc|0)==2){by=+h[bt+8>>3]}else if((bc|0)==3){by=+uz(c[bt+8>>2]|0,0)}else{Z=5683;break L7660}if((c[aV>>2]|0)==3){uu(c[aW>>2]|0);c[aV>>2]=1}h[aX>>3]=by;bd=a_;be=a$;break L7662}}while(0);h[aX>>3]=bx*.5;bd=a_;be=a$;break L7662}}while(0);if(!((S|0)>0&(a4^1))){Z=5835;break}a7=c[10036]|0;a6=0;bt=0;bc=a3;while(1){if((a[a6+104840|0]|0)==(a[a7+(a6+bc|0)|0]|0)){bz=bc;bA=bt}else{if((a6|0)!=2){break}bz=bc-1|0;bA=1}a9=a6+1|0;if((a9|0)<(bA+S|0)){a6=a9;bt=bA;bc=bz}else{Z=5694;break}}do{if((Z|0)==5694){Z=0;if((bA|0)==0){if(!((a6|0)==1|(a6|0)==6)){break}}c[aP>>2]=-270;bc=a0+1|0;c[13898]=bc;if((c[8272]|0)<=(bc|0)){bd=a_;be=a$;break L7662}if((a[a1+(bc*40&-1)|0]&1)==0){bd=a_;be=a$;break L7662}bt=c[a1+(bc*40&-1)+36>>2]|0;a7=a1+(bc*40&-1)+32|0;bc=c[10036]|0;a9=0;while(1){if((a9|0)>=(bt|0)){break}if((a[bc+((c[a7>>2]|0)+a9|0)|0]|0)==(a[a9+163312|0]|0)){a9=a9+1|0}else{bd=a_;be=a$;break L7662}}if((a9|0)!=2){bd=a_;be=a$;break L7662}c[13898]=a0+2;a7=is(g)|0;bc=c[a7>>2]|0;if((bc|0)==2){bB=+h[a7+8>>3]}else if((bc|0)==3){bB=+uz(c[a7+8>>2]|0,0)}else if((bc|0)==1){bB=+(c[a7+8>>2]|0)}else{Z=5706;break L7660}if((c[aQ>>2]|0)==3){uu(c[aR>>2]|0);c[aQ>>2]=1}c[aP>>2]=~~bB;bd=a_;be=a$;break L7662}}while(0);if(a4){Z=5835;break}L7824:do{if((S|0)>0){a6=c[10036]|0;a7=0;bc=0;bt=a3;while(1){if((a[a7+104240|0]|0)==(a[a6+(a7+bt|0)|0]|0)){bC=bt;bD=bc}else{if((a7|0)!=4){break L7824}bC=bt-1|0;bD=1}bj=a7+1|0;if((bj|0)<(bD+S|0)){a7=bj;bc=bD;bt=bC}else{break}}if((bD|0)==0){if(!((a7|0)==3|(a7|0)==8)){break}}c[aP>>2]=0;c[13898]=a0+1;bd=a_;be=a$;break L7662}}while(0);if(!((S|0)>0&(a4^1))){Z=5835;break}bt=c[10036]|0;bc=0;a6=0;a9=a3;while(1){if((a[bc+152064|0]|0)==(a[bt+(bc+a9|0)|0]|0)){bE=a9;bF=a6}else{if((bc|0)!=3){break}bE=a9-1|0;bF=1}bj=bc+1|0;if((bj|0)<(bF+S|0)){bc=bj;a6=bF;a9=bE}else{Z=5726;break}}do{if((Z|0)==5726){Z=0;if((bF|0)==0){if(!((bc|0)==6|(bc|0)==2)){break}}c[13898]=a0+1;dl(aO,4);bd=a_;be=a$;break L7662}}while(0);if(!((S|0)>0&(a4^1))){Z=5835;break}bc=c[10036]|0;a9=0;a6=0;bt=a3;while(1){if((a[a9+153128|0]|0)==(a[bc+(a9+bt|0)|0]|0)){bG=bt;bH=a6}else{if((a9|0)!=5){break}bG=bt-1|0;bH=1}bj=a9+1|0;if((bj|0)<(bH+S|0)){a9=bj;a6=bH;bt=bG}else{Z=5735;break}}do{if((Z|0)==5735){Z=0;if((bH|0)==0){if(!((a9|0)==4|(a9|0)==8)){break}}uE(aJ|0,0,28);c[13898]=a0+1;c[aK>>2]=4;c[aL>>2]=4;c[aM>>2]=4;c[aN>>2]=c[aJ>>2];c[aN+4>>2]=c[aJ+4>>2];c[aN+8>>2]=c[aJ+8>>2];c[aN+12>>2]=c[aJ+12>>2];c[aN+16>>2]=c[aJ+16>>2];c[aN+20>>2]=c[aJ+20>>2];c[aN+24>>2]=c[aJ+24>>2];bd=a_;be=a$;break L7662}}while(0);if(a4){Z=5835;break}L7864:do{if((S|0)>0){a9=c[10036]|0;bt=0;a6=0;bc=a3;while(1){if((a[bt+149696|0]|0)==(a[a9+(bt+bc|0)|0]|0)){bI=bc;bJ=a6}else{if((bt|0)!=1){break L7864}bI=bc-1|0;bJ=1}bj=bt+1|0;if((bj|0)<(bJ+S|0)){bt=bj;a6=bJ;bc=bI}else{break}}if((bJ|0)==0){if(!((bt|0)==0|(bt|0)==4)){break}}c[aI>>2]=0;a[aH]=1;c[13898]=a0+1;bd=a_;be=a$;break L7662}}while(0);if(!((S|0)>0&(a4^1))){Z=5835;break}bc=c[10036]|0;a6=0;a9=0;a7=a3;while(1){if((a[a6+179896|0]|0)==(a[bc+(a6+a7|0)|0]|0)){bK=a7;bL=a9}else{if((a6|0)!=1){Z=5756;break}bK=a7-1|0;bL=1}bj=a6+1|0;if((bj|0)<(bL+S|0)){a6=bj;a9=bL;a7=bK}else{Z=5754;break}}do{if((Z|0)==5754){Z=0;if((bL|0)!=0){break}if(!((a6|0)==0|(a6|0)==6)){Z=5756}}}while(0);L7887:do{if((Z|0)==5756){Z=0;if(a4){Z=5835;break L7662}L7890:do{if((S|0)>0){a6=c[10036]|0;a7=0;a9=0;bc=a3;while(1){if((a[a7+149304|0]|0)==(a[a6+(a7+bc|0)|0]|0)){bM=bc;bN=a9}else{if((a7|0)!=1){break L7890}bM=bc-1|0;bN=1}bj=a7+1|0;if((bj|0)<(bN+S|0)){a7=bj;a9=bN;bc=bM}else{break}}if((bN|0)!=0){break L7887}if((a7|0)==0|(a7|0)==6){break L7887}}}while(0);if(!((S|0)>0&(a4^1))){Z=5835;break L7662}bt=c[10036]|0;bc=0;a9=0;a6=a3;while(1){if((a[bc+101272|0]|0)==(a[bt+(bc+a6|0)|0]|0)){bO=a6;bP=a9}else{if((bc|0)!=2){break}bO=a6-1|0;bP=1}bs=bc+1|0;if((bs|0)<(bP+S|0)){bc=bs;a9=bP;a6=bO}else{Z=5772;break}}do{if((Z|0)==5772){Z=0;if((bP|0)==0){if(!((bc|0)==1|(bc|0)==5)){break}}c[aI>>2]=2;a[aH]=1;c[13898]=a0+1;bd=a_;be=a$;break L7662}}while(0);if(a4){Z=5835;break L7662}L7915:do{if((S|0)>0){bc=c[10036]|0;a6=0;a9=0;bt=a3;while(1){if((a[a6+100712|0]|0)==(a[bc+(a6+bt|0)|0]|0)){bQ=bt;bR=a9}else{if((a6|0)!=5){break L7915}bQ=bt-1|0;bR=1}bs=a6+1|0;if((bs|0)<(bR+S|0)){a6=bs;a9=bR;bt=bQ}else{break}}if((bR|0)==0){if(!((a6|0)==4|(a6|0)==11)){break}}a[aH]=0;c[13898]=a0+1;bd=a_;be=a$;break L7662}}while(0);if(!((S|0)>0&(a4^1))){Z=5835;break L7662}bt=c[10036]|0;a9=0;bc=0;a7=a3;while(1){if((a[a9+100040|0]|0)==(a[bt+(a9+a7|0)|0]|0)){bS=a7;bT=bc}else{if((a9|0)!=5){break}bS=a7-1|0;bT=1}bs=a9+1|0;if((bs|0)<(bT+S|0)){a9=bs;bc=bT;a7=bS}else{Z=5791;break}}do{if((Z|0)==5791){Z=0;if((bT|0)==0){if(!((a9|0)==4|(a9|0)==12)){break}}a[aG]=1;c[13898]=a0+1;bd=a_;be=a$;break L7662}}while(0);if(a4){Z=5835;break L7662}L7942:do{if((S|0)>0){a9=c[10036]|0;a7=0;bc=0;bt=a3;while(1){if((a[a7+99600|0]|0)==(a[a9+(a7+bt|0)|0]|0)){bU=bt;bV=bc}else{if((a7|0)!=7){break L7942}bU=bt-1|0;bV=1}bs=a7+1|0;if((bs|0)<(bV+S|0)){a7=bs;bc=bV;bt=bU}else{break}}if((bV|0)==0){if(!((a7|0)==6|(a7|0)==14)){break}}a[aG]=0;c[13898]=a0+1;bd=a_;be=a$;break L7662}}while(0);if(!((S|0)>0&(a4^1))){Z=5835;break L7662}bt=c[10036]|0;bc=0;a9=0;a6=a3;while(1){if((a[bc+175984|0]|0)==(a[bt+(bc+a6|0)|0]|0)){bW=a6;bX=a9}else{if((bc|0)!=1){Z=5835;break L7662}bW=a6-1|0;bX=1}bs=bc+1|0;if((bs|0)<(bX+S|0)){bc=bs;a9=bX;a6=bW}else{break}}if((bX|0)==0){if(!((bc|0)==4|(bc|0)==0)){Z=5835;break L7662}}bY=a0+1|0;c[13898]=bY;a6=(a[a1+(bY*40&-1)|0]&1)==0;if(a6){Z=5814}else{a9=a[(c[10036]|0)+(c[a1+(bY*40&-1)+32>>2]|0)|0]|0;if(!((a9<<24>>24|0)==39|(a9<<24>>24|0)==34)){Z=5814}}if((Z|0)==5814){Z=0;a9=c[10810]|0;if((a9|0)==0){Z=6274;break L7660}bt=c[8272]|0;bs=a1+(bY*40&-1)+36|0;bj=a1+(bY*40&-1)+32|0;a5=c[10036]|0;bw=a9;L7971:while(1){a9=c[bw+4>>2]|0;L7973:do{if(!((bt|0)<=(bY|0)|a6)){bZ=c[bs>>2]|0;b_=0;while(1){if((b_|0)>=(bZ|0)){break}if((a[a5+((c[bj>>2]|0)+b_|0)|0]|0)==(a[a9+b_|0]|0)){b_=b_+1|0}else{break L7973}}if((a[a9+b_|0]|0)==0){break L7971}}}while(0);a9=c[bw>>2]|0;if((a9|0)==0){Z=6272;break L7660}else{bw=a9}}if((a[bw+8|0]&1)!=0){Z=6271;break L7660}if((c[bw+16>>2]|0)!=3){Z=6273;break L7660}}uu(c[aD>>2]|0);c[aD>>2]=0;bj=c[13898]|0;L7983:do{if((bj|0)<(c[8272]|0)){a5=c[1054]|0;L7985:do{if((a[a5+(bj*40&-1)|0]&1)!=0){bs=c[a5+(bj*40&-1)+36>>2]|0;a6=a5+(bj*40&-1)+32|0;bt=c[10036]|0;bc=0;while(1){if((bc|0)>=(bs|0)){break}if((a[bt+((c[a6>>2]|0)+bc|0)|0]|0)==(a[bc+103664|0]|0)){bc=bc+1|0}else{break L7985}}if((bc|0)==1){b$=0;break L7983}}}while(0);a[14176]=1;is(f);a[14176]=0;if((c[aE>>2]|0)==3){b$=c[aF>>2]|0;break}else{c[13898]=bj;b$=0;break}}else{b$=0}}while(0);c[aD>>2]=b$;bd=a_;be=a$;break L7662}}while(0);c[aI>>2]=1;a[aH]=1;c[13898]=a0+1;bd=a_;be=a$}else{Z=5835}}while(0);L7997:do{if((Z|0)==5835){Z=0;bj=c[8272]|0;bw=(bj|0)>(a0|0);L7999:do{if(bw){if(a4){break}a5=c[10036]|0;a6=0;while(1){if((a6|0)>=(S|0)){Z=5840;break}if((a[a5+(a3+a6|0)|0]|0)==(a[a6+97960|0]|0)){a6=a6+1|0}else{break}}do{if((Z|0)==5840){Z=0;if((a6|0)!=6){break}b0=a0+1|0;c[13898]=b0;if((b0|0)>=(bj|0)){b1=b0;Z=6280;break L7660}L8009:do{if((a[a1+(b0*40&-1)|0]&1)!=0){bt=c[a1+(b0*40&-1)+36>>2]|0;bs=a1+(b0*40&-1)+32|0;b_=0;while(1){if((b_|0)>=(bt|0)){break}if((a[a5+((c[bs>>2]|0)+b_|0)|0]|0)==(a[b_+103664|0]|0)){b_=b_+1|0}else{break L8009}}if((b_|0)==1){b1=b0;Z=6277;break L7660}}}while(0);a[14176]=1;is(e);a[14176]=0;if((c[R>>2]|0)!=3){Z=5848;break L7660}bs=c[Q>>2]|0;if((bs|0)==0){Z=5850;break L7660}uF(U|0,bs|0,51);uu(bs);bs=a8(U|0,37)|0;do{if((bs|0)==0){b2=0}else{bt=bs+1|0;L8020:do{if((bt|0)==0){b3=0}else{bc=bt;while(1){a9=a[bc]|0;if(!((a9<<24>>24|0)==32|(a9<<24>>24|0)==45|(a9<<24>>24|0)==43|(a9<<24>>24|0)==35)){b3=bc;break L8020}a9=bc+1|0;if((a9|0)==0){b3=0;break}else{bc=a9}}}}while(0);while(1){b4=a[b3]|0;if(!(((b4&255)-48|0)>>>0<10|b4<<24>>24==46)){break}b3=b3+1|0}if((b4-102&255)<2){b2=1;break}b2=b4<<24>>24==101&1}}while(0);a[_]=b2;bd=a_;be=a$;break L7997}}while(0);if(!bw){Z=5867;break}if(a4){break}a5=c[10036]|0;a6=0;while(1){if((a6|0)>=(S|0)){break}if((a[a5+(a3+a6|0)|0]|0)==(a[a6+143040|0]|0)){a6=a6+1|0}else{Z=5867;break L7999}}if((a6|0)==2){Z=5875}else{Z=5867}}else{Z=5867}}while(0);L8037:do{if((Z|0)==5867){Z=0;L8039:do{if((S|0)>0&(a4^1)){a5=c[10036]|0;bs=0;bt=0;b_=a3;while(1){if((a[bs+142856|0]|0)==(a[a5+(bs+b_|0)|0]|0)){b5=b_;b6=bt}else{if((bs|0)!=4){break}b5=b_-1|0;b6=1}bc=bs+1|0;if((bc|0)<(b6+S|0)){bs=bc;bt=b6;b_=b5}else{Z=5873;break}}if((Z|0)==5873){Z=0;if((b6|0)!=0){Z=5875;break L8037}if((bs|0)==3|(bs|0)==9){Z=5875;break L8037}}if(!((S|0)>0&(a4^1))){break}b_=c[10036]|0;bt=0;a5=0;bc=a3;while(1){if((a[bt+96704|0]|0)==(a[b_+(bt+bc|0)|0]|0)){b7=bc;b8=a5}else{if((bt|0)!=2){break L8039}b7=bc-1|0;b8=1}a9=bt+1|0;if((a9|0)<(b8+S|0)){bt=a9;a5=b8;bc=b7}else{break}}if((b8|0)==0){if(!((bt|0)==8|(bt|0)==1)){break}}c[13898]=a0+1;if((a[T]&1)==0){bc=c[aw>>2]|0;if((bc|0)!=0){a5=bc;while(1){bc=c[a5+16>>2]|0;b_=c[a5+8>>2]|0;if((b_|0)!=0){uu(b_)}uu(a5);if((bc|0)==0){break}else{a5=bc}}}c[aw>>2]=0}c[ax>>2]=1;bd=a_;be=a$;break L7997}}while(0);if(!bw){bd=a_;be=a$;break L7997}if(a4){break}a6=c[10036]|0;a5=0;while(1){if((a5|0)>=(S|0)){Z=5896;break}if((a[a6+(a3+a5|0)|0]|0)==(a[a5+186440|0]|0)){a5=a5+1|0}else{break}}do{if((Z|0)==5896){Z=0;if((a5|0)!=3){break}c[13898]=a0+1;a[T]=1;bd=a_;be=a$;break L7997}}while(0);if(!bw){bd=a_;be=a$;break L7997}if(a4){break}a5=c[10036]|0;a6=0;while(1){if((a6|0)>=(S|0)){Z=5903;break}if((a[a5+(a3+a6|0)|0]|0)==(a[a6+103664|0]|0)){a6=a6+1|0}else{break}}if((Z|0)==5903){Z=0;if((a6|0)==1){bd=a_;be=a$;break L7997}}if(a4){break}a5=c[10036]|0;bt=0;while(1){if((bt|0)>=(S|0)){break}if((a[a5+(a3+bt|0)|0]|0)==(a[bt+199040|0]|0)){bt=bt+1|0}else{break L8037}}if((bt|0)!=1){break}a6=a0+1|0;c[13898]=a6;L8096:do{if((bj|0)>(a6|0)){if((a[a1+(a6*40&-1)|0]&1)==0){break}bc=c[a1+(a6*40&-1)+36>>2]|0;b_=a1+(a6*40&-1)+32|0;bs=0;while(1){if((bs|0)>=(bc|0)){break}if((a[a5+((c[b_>>2]|0)+bs|0)|0]|0)==(a[bs+131272|0]|0)){bs=bs+1|0}else{break L8096}}if((bs|0)!=1){break}c[13898]=a0+2;bd=a_;be=a$;break L7997}}while(0);do{if((a[T]&1)==0){a5=c[6074]|0;if((a5|0)!=0){if((c[a5+32>>2]|0)!=0){b9=a6;ca=bj;break}}a5=c[$>>2]|0;if((a5|0)==0){cb=a6;cc=bj}else{bt=a5;while(1){a5=c[bt+16>>2]|0;b_=c[bt+8>>2]|0;if((b_|0)!=0){uu(b_)}uu(bt);if((a5|0)==0){break}else{bt=a5}}cb=c[13898]|0;cc=c[8272]|0}c[$>>2]=0;b9=cb;ca=cc}else{b9=a6;ca=bj}}while(0);L8119:do{if((b9|0)<(ca|0)){a6=b9;bt=ca;bs=c[1054]|0;while(1){a5=(a[bs+(a6*40&-1)|0]&1)==0;L8123:do{if(!a5){b_=c[bs+(a6*40&-1)+36>>2]|0;bc=bs+(a6*40&-1)+32|0;a9=c[10036]|0;a7=0;while(1){if((a7|0)>=(b_|0)){break}if((a[a9+((c[bc>>2]|0)+a7|0)|0]|0)==(a[a7+103664|0]|0)){a7=a7+1|0}else{break L8123}}if((a7|0)==1){cd=a6;ce=bt;break L8119}}}while(0);L8130:do{if((a6|0)<(bt|0)){L8132:do{if(!a5){bc=c[bs+(a6*40&-1)+36>>2]|0;a9=bs+(a6*40&-1)+32|0;b_=c[10036]|0;bZ=0;while(1){if((bZ|0)>=(bc|0)){break}if((a[b_+((c[a9>>2]|0)+bZ|0)|0]|0)==(a[bZ+103664|0]|0)){bZ=bZ+1|0}else{break L8132}}if((bZ|0)==1){cf=0;Z=5952;break L8130}}}while(0);a[14176]=1;is(o);a[14176]=0;if((c[aa>>2]|0)!=3){c[13898]=a6;cf=0;Z=5952;break}a7=c[ab>>2]|0;if((a7|0)==0){cf=0;Z=5952;break}if((c[ac>>2]|0)!=1){cg=a7;Z=5977;break}a9=c[13898]|0;if((c[8272]|0)<=(a9|0)){cf=a7;Z=5952;break}b_=c[1054]|0;if((a[b_+(a9*40&-1)|0]&1)==0){cf=a7;Z=5952;break}bc=c[b_+(a9*40&-1)+36>>2]|0;ch=b_+(a9*40&-1)+32|0;a9=c[10036]|0;b_=0;while(1){if((b_|0)>=(bc|0)){Z=5947;break}if((a[a9+((c[ch>>2]|0)+b_|0)|0]|0)==(a[b_+148464|0]|0)){b_=b_+1|0}else{ci=0;Z=5948;break}}if((Z|0)==5947){Z=0;if((b_|0)!=1){ci=0;Z=5948}}if((Z|0)==5948){while(1){Z=0;if((ci|0)>=(bc|0)){break}if((a[a9+((c[ch>>2]|0)+ci|0)|0]|0)==(a[ci+131272|0]|0)){ci=ci+1|0;Z=5948}else{cf=a7;Z=5952;break L8130}}if((ci|0)!=1){cf=a7;Z=5952;break}}c[13898]=a6;uu(a7);cf=0;Z=5952}else{cf=0;Z=5952}}while(0);L8157:do{if((Z|0)==5952){Z=0;if((c[ac>>2]|0)!=1){cg=cf;Z=5977;break}a5=c[13898]|0;ch=c[1054]|0;a9=(a[ch+(a5*40&-1)|0]&1)==0;if(a9){Z=5955}else{bc=c[10036]|0;b_=a[bc+(c[ch+(a5*40&-1)+32>>2]|0)|0]|0;if((b_<<24>>24|0)==39|(b_<<24>>24|0)==34){cj=bc}else{Z=5955}}if((Z|0)==5955){Z=0;bc=c[10810]|0;if((bc|0)==0){cg=cf;Z=5977;break}b_=ch+(a5*40&-1)+36|0;ck=ch+(a5*40&-1)+32|0;cl=c[10036]|0;cm=(c[8272]|0)<=(a5|0)|a9;cn=bc;L8165:while(1){bc=c[cn+4>>2]|0;L8167:do{if(!cm){co=c[b_>>2]|0;cp=0;while(1){if((cp|0)>=(co|0)){break}if((a[cl+((c[ck>>2]|0)+cp|0)|0]|0)==(a[bc+cp|0]|0)){cp=cp+1|0}else{break L8167}}if((a[bc+cp|0]|0)==0){break L8165}}}while(0);bc=c[cn>>2]|0;if((bc|0)==0){cg=cf;Z=5977;break L8157}else{cn=bc}}if((a[cn+8|0]&1)!=0){cg=cf;Z=5977;break}if((c[cn+16>>2]|0)==3){cj=cl}else{cg=cf;Z=5977;break}}L8177:do{if((a5|0)<(c[8272]|0)){L8179:do{if(!a9){ck=c[ch+(a5*40&-1)+36>>2]|0;b_=ch+(a5*40&-1)+32|0;cm=0;while(1){if((cm|0)>=(ck|0)){break}if((a[cj+((c[b_>>2]|0)+cm|0)|0]|0)==(a[cm+103664|0]|0)){cm=cm+1|0}else{break L8179}}if((cm|0)==1){cq=0;break L8177}}}while(0);a[14176]=1;is(n);a[14176]=0;if((c[ad>>2]|0)==3){cq=c[ae>>2]|0;break}else{c[13898]=a5;cq=0;break}}else{cq=0}}while(0);if((t1(cq,af,p,q)|0)==0){cr=0.0}else{cs=+t2(p);cr=cs+ +h[q>>3]}uu(cq);ct=cr;cu=cf}}while(0);do{if((Z|0)==5977){Z=0;a5=is(m)|0;ch=c[a5>>2]|0;if((ch|0)==1){cv=+(c[a5+8>>2]|0)}else if((ch|0)==2){cv=+h[a5+8>>3]}else if((ch|0)==3){cv=+uz(c[a5+8>>2]|0,0)}else{Z=5981;break L7660}if((c[ag>>2]|0)!=3){ct=cv;cu=cg;break}uu(c[ah>>2]|0);c[ag>>2]=1;ct=cv;cu=cg}}while(0);a5=c[13898]|0;L8202:do{if((a5|0)<(c[8272]|0)){ch=c[1054]|0;L8204:do{if((a[ch+(a5*40&-1)|0]&1)!=0){a9=c[ch+(a5*40&-1)+36>>2]|0;cl=ch+(a5*40&-1)+32|0;cn=c[10036]|0;b_=0;while(1){if((b_|0)>=(a9|0)){Z=5989;break}if((a[cn+((c[cl>>2]|0)+b_|0)|0]|0)==(a[b_+103664|0]|0)){b_=b_+1|0}else{cw=0;break}}if((Z|0)==5989){Z=0;if((b_|0)==1){cx=0;break L8202}else{cw=0}}while(1){if((cw|0)>=(a9|0)){Z=5992;break}if((a[cn+((c[cl>>2]|0)+cw|0)|0]|0)==(a[cw+148464|0]|0)){cw=cw+1|0}else{cy=0;break}}if((Z|0)==5992){Z=0;if((cw|0)==1){cx=0;break L8202}else{cy=0}}while(1){if((cy|0)>=(a9|0)){break}if((a[cn+((c[cl>>2]|0)+cy|0)|0]|0)==(a[cy+131272|0]|0)){cy=cy+1|0}else{break L8204}}if((cy|0)==1){cx=0;break L8202}}}while(0);ch=is(l)|0;cl=c[ch>>2]|0;if((cl|0)==1){cz=+(c[ch+8>>2]|0)}else if((cl|0)==2){cz=+h[ch+8>>3]}else if((cl|0)==3){cz=+uz(c[ch+8>>2]|0,0)}else{Z=6e3;break L7660}if((c[ai>>2]|0)==3){uu(c[aj>>2]|0);c[ai>>2]=1}cx=~~cz}else{cx=0}}while(0);dp(b,cu,ct,cx);uu(cu);a5=c[13898]|0;ch=c[8272]|0;if((a5|0)>=(ch|0)){cd=a5;ce=ch;break L8119}cl=c[1054]|0;if((a[cl+(a5*40&-1)|0]&1)==0){cd=a5;ce=ch;break L8119}cn=c[cl+(a5*40&-1)+36>>2]|0;a9=cl+(a5*40&-1)+32|0;b_=c[10036]|0;ck=0;while(1){if((ck|0)>=(cn|0)){Z=6009;break}if((a[b_+((c[a9>>2]|0)+ck|0)|0]|0)==(a[ck+103664|0]|0)){ck=ck+1|0}else{cA=0;break}}if((Z|0)==6009){Z=0;if((ck|0)==1){cd=a5;ce=ch;break L8119}else{cA=0}}while(1){if((cA|0)>=(cn|0)){break}if((a[b_+((c[a9>>2]|0)+cA|0)|0]|0)==(a[cA+148464|0]|0)){cA=cA+1|0}else{cd=a5;ce=ch;break L8119}}if((cA|0)!=1){cd=a5;ce=ch;break L8119}a9=a5+1|0;c[13898]=a9;if((a9|0)<(ch|0)){a6=a9;bt=ch;bs=cl}else{cd=a9;ce=ch;break}}}else{cd=b9;ce=ca}}while(0);if((cd|0)>=(ce|0)){Z=6023;break L7660}bs=c[1054]|0;if((a[bs+(cd*40&-1)|0]&1)==0){Z=6023;break L7660}bt=c[bs+(cd*40&-1)+36>>2]|0;a6=bs+(cd*40&-1)+32|0;bs=c[10036]|0;a9=0;while(1){if((a9|0)>=(bt|0)){Z=6019;break}if((a[bs+((c[a6>>2]|0)+a9|0)|0]|0)==(a[a9+103664|0]|0)){a9=a9+1|0}else{cB=0;break}}if((Z|0)==6019){Z=0;if((a9|0)==1){Z=6023;break L7660}else{cB=0}}while(1){if((cB|0)>=(bt|0)){break}if((a[bs+((c[a6>>2]|0)+cB|0)|0]|0)==(a[cB+131272|0]|0)){cB=cB+1|0}else{Z=6023;break L7660}}if((cB|0)!=1){Z=6023;break L7660}c[13898]=cd+1;bd=a_;be=a$;break L7997}}while(0);if((Z|0)==5875){Z=0;hI(aB,aC);bd=a_;be=a$;break}L8258:do{if((c[ac>>2]|0)==1){if(a4){Z=6033}else{bj=c[10036]|0;bw=a[bj+a3|0]|0;if((bw<<24>>24|0)==39|(bw<<24>>24|0)==34){cC=bj;Z=6043}else{Z=6033}}if((Z|0)==6033){Z=0;bj=c[10810]|0;if((bj|0)==0){Z=6053;break}bw=c[10036]|0;a6=bj;L8265:while(1){bj=c[a6+4>>2]|0;L8267:do{if(!a4){bs=0;while(1){if((bs|0)>=(S|0)){break}if((a[bw+(a3+bs|0)|0]|0)==(a[bj+bs|0]|0)){bs=bs+1|0}else{break L8267}}if((a[bj+bs|0]|0)==0){break L8265}}}while(0);bj=c[a6>>2]|0;if((bj|0)==0){Z=6053;break L8258}else{a6=bj}}if((a[a6+8|0]&1)!=0){Z=6053;break}if((c[a6+16>>2]|0)!=3){Z=6053;break}if(a4){Z=6047}else{cC=bw;Z=6043}}L8276:do{if((Z|0)==6043){Z=0;bj=0;while(1){if((bj|0)>=(S|0)){break}if((a[cC+(a3+bj|0)|0]|0)==(a[bj+103664|0]|0)){bj=bj+1|0}else{Z=6047;break L8276}}if((bj|0)==1){cD=0}else{Z=6047}}}while(0);do{if((Z|0)==6047){Z=0;a[14176]=1;is(x);a[14176]=0;if((c[ak>>2]|0)==3){cD=c[al>>2]|0;break}else{c[13898]=a0;cD=0;break}}}while(0);if((t1(cD,af,y,z)|0)==0){cE=0.0}else{cs=+t2(y);cE=cs+ +h[z>>3]}uu(cD);cF=cE}else{Z=6053}}while(0);do{if((Z|0)==6053){Z=0;bw=is(w)|0;a6=c[bw>>2]|0;if((a6|0)==1){cG=+(c[bw+8>>2]|0)}else if((a6|0)==2){cG=+h[bw+8>>3]}else if((a6|0)==3){cG=+uz(c[bw+8>>2]|0,0)}else{Z=6057;break L7660}if((c[am>>2]|0)!=3){cF=cG;break}uu(c[an>>2]|0);c[am>>2]=1;cF=cG}}while(0);bw=c[13898]|0;a6=c[8272]|0;L8300:do{if((a6|0)>(bw|0)){ch=c[1054]|0;if((a[ch+(bw*40&-1)|0]&1)==0){cH=-8.988465674311579e+307;cI=cF;cJ=8.988465674311579e+307;break}cl=c[ch+(bw*40&-1)+36>>2]|0;a5=ch+(bw*40&-1)+32|0;bt=c[10036]|0;a9=0;while(1){if((a9|0)>=(cl|0)){break}if((a[bt+((c[a5>>2]|0)+a9|0)|0]|0)==(a[a9+148464|0]|0)){a9=a9+1|0}else{cH=-8.988465674311579e+307;cI=cF;cJ=8.988465674311579e+307;break L8300}}if((a9|0)!=1){cH=-8.988465674311579e+307;cI=cF;cJ=8.988465674311579e+307;break}cK=bw+1|0;c[13898]=cK;L8308:do{if((c[ac>>2]|0)==1){a5=(a[ch+(cK*40&-1)|0]&1)==0;if(a5){Z=6069}else{cl=a[bt+(c[ch+(cK*40&-1)+32>>2]|0)|0]|0;if(!((cl<<24>>24|0)==39|(cl<<24>>24|0)==34)){Z=6069}}if((Z|0)==6069){Z=0;cl=c[10810]|0;if((cl|0)==0){Z=6091;break}b_=ch+(cK*40&-1)+36|0;cn=ch+(cK*40&-1)+32|0;ck=(a6|0)<=(cK|0)|a5;cp=cl;L8315:while(1){cl=c[cp+4>>2]|0;L8317:do{if(!ck){a7=c[b_>>2]|0;bc=0;while(1){if((bc|0)>=(a7|0)){break}if((a[bt+((c[cn>>2]|0)+bc|0)|0]|0)==(a[cl+bc|0]|0)){bc=bc+1|0}else{break L8317}}if((a[cl+bc|0]|0)==0){break L8315}}}while(0);cl=c[cp>>2]|0;if((cl|0)==0){Z=6091;break L8308}else{cp=cl}}if((a[cp+8|0]&1)!=0){Z=6091;break}if((c[cp+16>>2]|0)!=3){Z=6091;break}}L8327:do{if((cK|0)<(a6|0)){L8329:do{if(!a5){cn=c[ch+(cK*40&-1)+36>>2]|0;b_=ch+(cK*40&-1)+32|0;ck=0;while(1){if((ck|0)>=(cn|0)){break}if((a[bt+((c[b_>>2]|0)+ck|0)|0]|0)==(a[ck+103664|0]|0)){ck=ck+1|0}else{break L8329}}if((ck|0)==1){cL=0;break L8327}}}while(0);a[14176]=1;is(u);a[14176]=0;if((c[ao>>2]|0)==3){cL=c[ap>>2]|0;break}else{c[13898]=cK;cL=0;break}}else{cL=0}}while(0);if((t1(cL,af,A,B)|0)==0){cM=0.0}else{cs=+t2(A);cM=cs+ +h[B>>3]}uu(cL);cN=cM}else{Z=6091}}while(0);do{if((Z|0)==6091){Z=0;bt=is(t)|0;ch=c[bt>>2]|0;if((ch|0)==1){cO=+(c[bt+8>>2]|0)}else if((ch|0)==2){cO=+h[bt+8>>3]}else if((ch|0)==3){cO=+uz(c[bt+8>>2]|0,0)}else{Z=6095;break L7660}if((c[aq>>2]|0)!=3){cN=cO;break}uu(c[ar>>2]|0);c[aq>>2]=1;cN=cO}}while(0);bt=c[13898]|0;ch=c[8272]|0;L8352:do{if((ch|0)>(bt|0)){a9=c[1054]|0;if((a[a9+(bt*40&-1)|0]&1)==0){cP=8.988465674311579e+307;break}a5=c[a9+(bt*40&-1)+36>>2]|0;cp=a9+(bt*40&-1)+32|0;b_=c[10036]|0;cn=0;while(1){if((cn|0)>=(a5|0)){break}if((a[b_+((c[cp>>2]|0)+cn|0)|0]|0)==(a[cn+148464|0]|0)){cn=cn+1|0}else{cP=8.988465674311579e+307;break L8352}}if((cn|0)!=1){cP=8.988465674311579e+307;break}cp=bt+1|0;c[13898]=cp;L8360:do{if((c[ac>>2]|0)==1){a5=(a[a9+(cp*40&-1)|0]&1)==0;if(a5){Z=6107}else{bc=a[b_+(c[a9+(cp*40&-1)+32>>2]|0)|0]|0;if(!((bc<<24>>24|0)==39|(bc<<24>>24|0)==34)){Z=6107}}if((Z|0)==6107){Z=0;bc=c[10810]|0;if((bc|0)==0){break}bj=a9+(cp*40&-1)+36|0;cl=a9+(cp*40&-1)+32|0;bs=(ch|0)<=(cp|0)|a5;a7=bc;L8367:while(1){bc=c[a7+4>>2]|0;L8369:do{if(!bs){bZ=c[bj>>2]|0;co=0;while(1){if((co|0)>=(bZ|0)){break}if((a[b_+((c[cl>>2]|0)+co|0)|0]|0)==(a[bc+co|0]|0)){co=co+1|0}else{break L8369}}if((a[bc+co|0]|0)==0){break L8367}}}while(0);bc=c[a7>>2]|0;if((bc|0)==0){break L8360}else{a7=bc}}if((a[a7+8|0]&1)!=0){break}if((c[a7+16>>2]|0)!=3){break}}L8379:do{if((cp|0)<(ch|0)){L8381:do{if(!a5){cl=c[a9+(cp*40&-1)+36>>2]|0;bj=a9+(cp*40&-1)+32|0;bs=0;while(1){if((bs|0)>=(cl|0)){break}if((a[b_+((c[bj>>2]|0)+bs|0)|0]|0)==(a[bs+103664|0]|0)){bs=bs+1|0}else{break L8381}}if((bs|0)==1){cQ=0;break L8379}}}while(0);a[14176]=1;is(s);a[14176]=0;if((c[as>>2]|0)==3){cQ=c[at>>2]|0;break}else{c[13898]=cp;cQ=0;break}}else{cQ=0}}while(0);if((t1(cQ,af,C,D)|0)==0){cR=0.0}else{cs=+t2(C);cR=cs+ +h[D>>3]}uu(cQ);cP=cR;break L8352}}while(0);cp=is(r)|0;b_=c[cp>>2]|0;if((b_|0)==1){cS=+(c[cp+8>>2]|0)}else if((b_|0)==2){cS=+h[cp+8>>3]}else if((b_|0)==3){cS=+uz(c[cp+8>>2]|0,0)}else{Z=6133;break L7660}if((c[au>>2]|0)!=3){cP=cS;break}uu(c[av>>2]|0);c[au>>2]=1;cP=cS}else{cP=8.988465674311579e+307}}while(0);if(!(cF>=cP|cN>0.0)){Z=6137;break L7660}ch=cF>cP;if(!(cN<0.0|ch^1)){Z=6139;break L7660}if(!ch){cH=cF;cI=cN;cJ=cP;break}cH=cF+cN*+O(+((cP*1.01-cF)/cN));cI=-0.0-cN;cJ=cF}else{cH=-8.988465674311579e+307;cI=cF;cJ=8.988465674311579e+307}}while(0);if((a[T]&1)==0){a6=c[aw>>2]|0;if((a6|0)!=0){bw=a6;while(1){a6=c[bw+16>>2]|0;ch=c[bw+8>>2]|0;if((ch|0)!=0){uu(ch)}uu(bw);if((a6|0)==0){break}else{bw=a6}}}c[aw>>2]=0}c[ax>>2]=2;h[ay>>3]=cH;h[az>>3]=cI;h[aA>>3]=cJ;bd=a_;be=a$}}while(0);cT=c[13898]|0;if((cT|0)>=(c[8272]|0)){Z=6155;break}a3=c[1054]|0;S=a[a3+(cT*40&-1)|0]|0;if((S&1)==0){a_=bd;a$=be;a0=cT;a1=a3;a2=S;continue}a4=c[a3+(cT*40&-1)+36>>2]|0;bw=a3+(cT*40&-1)+32|0;a6=c[10036]|0;ch=0;while(1){if((ch|0)>=(a4|0)){break}if((a[a6+((c[bw>>2]|0)+ch|0)|0]|0)==(a[ch+103664|0]|0)){ch=ch+1|0}else{a_=bd;a$=be;a0=cT;a1=a3;a2=S;continue L7660}}if((ch|0)==1){Z=6155;break}else{a_=bd;a$=be;a0=cT;a1=a3;a2=S}}if((Z|0)==5670){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Z|0)==5706){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Z|0)==6271){uf(bY,98544,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Z|0)==6272){uf(bY,98544,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Z|0)==6273){uf(bY,98544,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Z|0)==6274){uf(bY,98544,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Z|0)==6277){uf(b1,97288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Z|0)==6280){uf(b1,97288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Z|0)==6e3){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Z|0)==6155){a2=c[aZ>>2]|0;if((a2&3|0)!=0|bd){P=cT;break}c[aZ>>2]=a2|1;if(be){P=cT;break}if((b-1|0)>>>0>=3){P=cT;break}c[aZ>>2]=a2|5;P=cT;break}else if((Z|0)==6023){a2=c[$>>2]|0;if((a2|0)==0){cU=cd;c[$>>2]=0;uf(cU,91952,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{cV=a2}while(1){a2=c[cV+16>>2]|0;a1=c[cV+8>>2]|0;if((a1|0)!=0){uu(a1)}uu(cV);if((a2|0)==0){break}else{cV=a2}}cU=c[13898]|0;c[$>>2]=0;uf(cU,91952,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Z|0)==5848){c[13898]=b0;b1=b0;uf(b1,97288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Z|0)==5850){b1=c[13898]|0;uf(b1,97288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Z|0)==5981){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Z|0)==5683){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Z|0)==6095){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Z|0)==6057){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Z|0)==6133){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Z|0)==6137){uf(cK,93560,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Z|0)==6139){uf(cK,92744,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);cK=c[1054]|0;b1=c[cK+(P*40&-1)+36>>2]|0;b0=c[cK+(P*40&-1)+32>>2]|0;L8460:do{if((a[cK+(P*40&-1)|0]&1)==0){cW=P}else{if((b1|0)>0){cU=c[10036]|0;cV=0;cd=0;cT=b0;while(1){be=a[F+cV|0]|0;if(be<<24>>24==(a[cU+(cV+cT|0)|0]|0)){cX=cT;cY=cd}else{if(be<<24>>24!=36){cW=P;break L8460}cX=cT-1|0;cY=1}cZ=cV+1|0;if((cZ|0)<(cY+b1|0)){cV=cZ;cd=cY;cT=cX}else{break}}if((cY|0)==0){c_=cZ;Z=6167}}else{c_=0;Z=6167}if((Z|0)==6167){cT=a[F+c_|0]|0;if(!((cT<<24>>24|0)==36|(cT<<24>>24|0)==0)){cW=P;break}}cT=64916+(b*688&-1)|0;c[cT>>2]=c[cT>>2]&-4;cT=P+1|0;c[13898]=cT;cW=cT}}while(0);a[K]=a[95856]|0;a[K+1|0]=a[95857|0]|0;a[K+2|0]=a[95858|0]|0;a[K+3|0]=a[95859|0]|0;a[K+4|0]=a[95860|0]|0;a[K+5|0]=a[95861|0]|0;a[K+6|0]=a[95862|0]|0;P=c[cK+(cW*40&-1)+36>>2]|0;c_=c[cK+(cW*40&-1)+32>>2]|0;cZ=a[cK+(cW*40&-1)|0]|0;L8475:do{if((cZ&1)==0){c$=cW;c0=cK;c1=P;c2=c_;c3=cZ}else{if((P|0)>0){cY=c[10036]|0;cX=0;b1=0;b0=c_;while(1){cT=a[F+(cX+2|0)|0]|0;if(cT<<24>>24==(a[cY+(cX+b0|0)|0]|0)){c4=b0;c5=b1}else{if(cT<<24>>24!=36){c$=cW;c0=cK;c1=P;c2=c_;c3=cZ;break L8475}c4=b0-1|0;c5=1}c6=cX+1|0;if((c6|0)<(c5+P|0)){cX=c6;b1=c5;b0=c4}else{break}}if((c5|0)==0){c7=c6;Z=6177}}else{c7=0;Z=6177}if((Z|0)==6177){b0=a[F+(c7+2|0)|0]|0;if(!((b0<<24>>24|0)==36|(b0<<24>>24|0)==0)){c$=cW;c0=cK;c1=P;c2=c_;c3=cZ;break}}if((a[64976+(b*688&-1)|0]&1)==0){b0=64944+(b*688&-1)|0;b1=c[b0>>2]|0;if((b1|0)==0){c8=cW;c9=cK}else{cX=b1;while(1){b1=c[cX+16>>2]|0;cY=c[cX+8>>2]|0;if((cY|0)!=0){uu(cY)}uu(cX);if((b1|0)==0){break}else{cX=b1}}c8=c[13898]|0;c9=c[1054]|0}c[b0>>2]=0;da=c8;db=c9}else{da=cW;db=cK}c[64920+(b*688&-1)>>2]=4;cX=da+1|0;c[13898]=cX;c$=cX;c0=db;c1=c[db+(cX*40&-1)+36>>2]|0;c2=c[db+(cX*40&-1)+32>>2]|0;c3=a[db+(cX*40&-1)|0]|0}}while(0);L8501:do{if((c3&1)==0){dc=c$}else{if((c1|0)>0){db=c[10036]|0;da=0;cK=0;cW=c2;while(1){c9=a[F+da|0]|0;if(c9<<24>>24==(a[db+(da+cW|0)|0]|0)){dd=cW;de=cK}else{if(c9<<24>>24!=36){dc=c$;break L8501}dd=cW-1|0;de=1}df=da+1|0;if((df|0)<(de+c1|0)){da=df;cK=de;cW=dd}else{break}}if((de|0)==0){dg=df;Z=6194}}else{dg=0;Z=6194}if((Z|0)==6194){cW=a[F+dg|0]|0;if(!((cW<<24>>24|0)==36|(cW<<24>>24|0)==0)){dc=c$;break}}c[64920+(b*688&-1)>>2]=1;cW=c$+1|0;c[13898]=cW;dc=cW}}while(0);a[K]=a[95384]|0;a[K+1|0]=a[95385|0]|0;a[K+2|0]=a[95386|0]|0;a[K+3|0]=a[95387|0]|0;a[K+4|0]=a[95388|0]|0;a[K+5|0]=a[95389|0]|0;a[K+6|0]=a[95390|0]|0;K=c[c0+(dc*40&-1)+36>>2]|0;c$=c[c0+(dc*40&-1)+32>>2]|0;dg=a[c0+(dc*40&-1)|0]|0;L8516:do{if((dg&1)==0){dh=dc;di=K;dj=c$;dk=dg}else{if((K|0)>0){df=c[10036]|0;de=0;dd=0;c1=c$;while(1){c2=a[F+(de+2|0)|0]|0;if(c2<<24>>24==(a[df+(de+c1|0)|0]|0)){dm=c1;dn=dd}else{if(c2<<24>>24!=36){dh=dc;di=K;dj=c$;dk=dg;break L8516}dm=c1-1|0;dn=1}dq=de+1|0;if((dq|0)<(dn+K|0)){de=dq;dd=dn;c1=dm}else{break}}if((dn|0)==0){dr=dq;Z=6204}}else{dr=0;Z=6204}if((Z|0)==6204){c1=a[F+(dr+2|0)|0]|0;if(!((c1<<24>>24|0)==36|(c1<<24>>24|0)==0)){dh=dc;di=K;dj=c$;dk=dg;break}}if((a[64976+(b*688&-1)|0]&1)==0){c1=64944+(b*688&-1)|0;dd=c[c1>>2]|0;if((dd|0)==0){ds=dc;dt=c0}else{de=dd;while(1){dd=c[de+16>>2]|0;df=c[de+8>>2]|0;if((df|0)!=0){uu(df)}uu(de);if((dd|0)==0){break}else{de=dd}}ds=c[13898]|0;dt=c[1054]|0}c[c1>>2]=0;du=ds;dv=dt}else{du=dc;dv=c0}c[64920+(b*688&-1)>>2]=5;de=du+1|0;c[13898]=de;dh=de;di=c[dv+(de*40&-1)+36>>2]|0;dj=c[dv+(de*40&-1)+32>>2]|0;dk=a[dv+(de*40&-1)|0]|0}}while(0);L8542:do{if((dk&1)!=0){if((di|0)>0){dv=c[10036]|0;du=0;c0=0;dc=dj;while(1){dt=a[F+du|0]|0;if(dt<<24>>24==(a[dv+(du+dc|0)|0]|0)){dw=dc;dx=c0}else{if(dt<<24>>24!=36){break L8542}dw=dc-1|0;dx=1}dy=du+1|0;if((dy|0)<(dx+di|0)){du=dy;c0=dx;dc=dw}else{break}}if((dx|0)==0){dz=dy;Z=6221}}else{dz=0;Z=6221}if((Z|0)==6221){dc=a[F+dz|0]|0;if(!((dc<<24>>24|0)==36|(dc<<24>>24|0)==0)){break}}c[64920+(b*688&-1)>>2]=1;c[13898]=dh+1}}while(0);a[I]=109;uB(F+3|0,J|0);J=F+((uA(I|0)|0)+2|0)|0;a[J]=a[120232]|0;a[J+1|0]=a[120233|0]|0;a[J+2|0]=a[120234|0]|0;a[J+3|0]=a[120235|0]|0;a[J+4|0]=a[120236|0]|0;a[J+5|0]=a[120237|0]|0;J=c[13898]|0;I=c[1054]|0;dh=c[I+(J*40&-1)+36>>2]|0;dz=c[I+(J*40&-1)+32>>2]|0;L8557:do{if((a[I+(J*40&-1)|0]&1)==0){dA=J;dB=I}else{if((dh|0)>0){dy=c[10036]|0;dx=0;dw=0;di=dz;while(1){dj=a[F+(dx+2|0)|0]|0;if(dj<<24>>24==(a[dy+(dx+di|0)|0]|0)){dC=di;dD=dw}else{if(dj<<24>>24!=36){dA=J;dB=I;break L8557}dC=di-1|0;dD=1}dE=dx+1|0;if((dE|0)<(dD+dh|0)){dx=dE;dw=dD;di=dC}else{break}}if((dD|0)==0){dF=dE;Z=6231}}else{dF=0;Z=6231}if((Z|0)==6231){di=a[F+(dF+2|0)|0]|0;if(!((di<<24>>24|0)==36|(di<<24>>24|0)==0)){dA=J;dB=I;break}}di=J+1|0;c[13898]=di;L8571:do{if((di|0)<(c[8272]|0)){dw=(a[I+(di*40&-1)|0]&1)==0;L8573:do{if(!dw){dx=c[I+(di*40&-1)+36>>2]|0;dy=I+(di*40&-1)+32|0;dj=c[10036]|0;dk=0;while(1){if((dk|0)>=(dx|0)){Z=6237;break}if((a[dj+((c[dy>>2]|0)+dk|0)|0]|0)==(a[dk+103664|0]|0)){dk=dk+1|0}else{break}}if((Z|0)==6237){if((dk|0)==1){break L8571}}if(!((dx|0)>0&(dw^1))){break}dj=c[10036]|0;dc=0;c0=0;du=c[dy>>2]|0;while(1){if((a[dc+184456|0]|0)==(a[dj+(dc+du|0)|0]|0)){dG=du;dH=c0}else{if((dc|0)!=3){break L8573}dG=du-1|0;dH=1}dv=dc+1|0;if((dv|0)<(dH+dx|0)){dc=dv;c0=dH;du=dG}else{break}}if((dH|0)==0){if(!((dc|0)==2|(dc|0)==7)){break}}c[65040+(b*688&-1)>>2]=1;du=J+2|0;c[13898]=du;dA=du;dB=I;break L8557}}while(0);dw=is(E)|0;S=c[dw>>2]|0;if((S|0)==1){dI=+(c[dw+8>>2]|0)}else if((S|0)==2){dI=+h[dw+8>>3]}else if((S|0)==3){dI=+uz(c[dw+8>>2]|0,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}dw=E|0;if((c[dw>>2]|0)==3){uu(c[E+8>>2]|0);c[dw>>2]=1}h[65048+(b*688&-1)>>3]=+O(+dI);c[65040+(b*688&-1)>>2]=2;dA=c[13898]|0;dB=c[1054]|0;break L8557}}while(0);c[65040+(b*688&-1)>>2]=3;dA=di;dB=I}}while(0);I=c[dB+(dA*40&-1)+36>>2]|0;if((a[dB+(dA*40&-1)|0]&1)==0){i=d;return}do{if((I|0)>0){E=c[10036]|0;J=0;dH=0;dG=c[dB+(dA*40&-1)+32>>2]|0;while(1){dF=a[F+J|0]|0;if(dF<<24>>24==(a[E+(J+dG|0)|0]|0)){dJ=dG;dK=dH}else{if(dF<<24>>24!=36){Z=6267;break}dJ=dG-1|0;dK=1}dL=J+1|0;if((dL|0)<(dK+I|0)){J=dL;dH=dK;dG=dJ}else{Z=6263;break}}if((Z|0)==6267){i=d;return}else if((Z|0)==6263){if((dK|0)==0){dM=dL;Z=6264;break}else{break}}}else{dM=0;Z=6264}}while(0);do{if((Z|0)==6264){dL=a[F+dM|0]|0;if((dL<<24>>24|0)==36|(dL<<24>>24|0)==0){break}i=d;return}}while(0);c[65040+(b*688&-1)>>2]=0;c[13898]=dA+1;i=d;return}function ju(){var b=0,d=0.0,e=0,f=0,g=0.0,i=0.0,j=0.0,k=0.0;b=c[17367]|0;d=(b&1|0)==0?+h[8687]:0.0;e=c[200]|0;f=64652+(e*688&-1)|0;if((b&2|0)!=0){c[f>>2]=3;c[64652+((c[144]|0)*688&-1)>>2]=3;return}c[f>>2]=0;f=c[144]|0;c[64652+(f*688&-1)>>2]=0;g=+h[8688];if((a[69604]&1)==0){i=g-d;h[64688+(e*688&-1)>>3]=i;j=i}else{i=+_(+g);g=+h[8702];k=i/g- +_(+d)/g;h[64688+(e*688&-1)>>3]=k;j=k}h[64688+(f*688&-1)>>3]=j;j=-0.0- +h[64688+(e*688&-1)>>3];h[64680+(e*688&-1)>>3]=j;h[64680+(f*688&-1)>>3]=j;return}function jv(b){b=b|0;var d=0,e=0,f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0;d=i;e=c[13898]|0;f=e+1|0;c[13898]=f;do{if((c[5094]|0)!=0){if(!(a[20368]|0)){break}a[20368]=0;g[3538]=+g[5090];g[3536]=+g[5088];g[3534]=+g[5086];c[16336]=c[16336]^2;c[17024]=c[17024]^2}}while(0);j=c[1054]|0;k=c[j+(f*40&-1)+36>>2]|0;l=c[j+(f*40&-1)+32>>2]|0;m=(a[j+(f*40&-1)|0]&1)==0;L8638:do{if((k|0)>0&(m^1)){j=c[10036]|0;n=0;o=0;p=l;while(1){if((a[n+91248|0]|0)==(a[j+(n+p|0)|0]|0)){q=p;r=o}else{if((n|0)!=2){s=6302;break L8638}q=p-1|0;r=1}t=n+1|0;if((t|0)<(r+k|0)){n=t;o=r;p=q}else{break}}if((r|0)==0){if(!((n|0)==7|(n|0)==1)){s=6302;break}}c[13898]=e+2;h[64680+(b*688&-1)>>3]=+h[64696+(b*688&-1)>>3];h[64688+(b*688&-1)>>3]=+h[64704+(b*688&-1)>>3];c[64652+(b*688&-1)>>2]=0}else{s=6302}}while(0);L8650:do{if((s|0)==6302){if((c[8272]|0)<=(f|0)|m){uf(f,90200,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}r=c[10036]|0;q=0;while(1){if((q|0)>=(k|0)){break}if((a[r+(l+q|0)|0]|0)==(a[q+78280|0]|0)){q=q+1|0}else{s=6352;break}}if((s|0)==6352){uf(f,90200,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((q|0)!=1){uf(f,90200,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[13898]=e+2;r=64652+(b*688&-1)|0;c[r>>2]=dj(b,64680+(b*688&-1)|0,64688+(b*688&-1)|0,c[r>>2]|0)|0;r=c[13898]|0;if((c[8272]|0)<=(r|0)){uf(r,78824,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}n=c[1054]|0;if((a[n+(r*40&-1)|0]&1)==0){uf(r,78824,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}p=c[n+(r*40&-1)+36>>2]|0;o=n+(r*40&-1)+32|0;j=c[10036]|0;t=0;while(1){if((t|0)>=(p|0)){break}if((a[j+((c[o>>2]|0)+t|0)|0]|0)==(a[t+78864|0]|0)){t=t+1|0}else{s=6356;break}}if((s|0)==6356){uf(r,78824,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((t|0)!=1){uf(r,78824,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}o=r+1|0;c[13898]=o;p=c[n+(o*40&-1)+36>>2]|0;q=c[n+(o*40&-1)+32>>2]|0;u=(a[n+(o*40&-1)|0]&1)==0;L8679:do{if((p|0)>0&(u^1)){w=0;x=0;y=q;while(1){if((a[w+146208|0]|0)==(a[j+(w+y|0)|0]|0)){z=y;A=x}else{if((w|0)!=3){break}z=y-1|0;A=1}B=w+1|0;if((B|0)<(A+p|0)){w=B;x=A;y=z}else{s=6320;break}}do{if((s|0)==6320){if((A|0)==0){if(!((w|0)==7|(w|0)==2)){break}}y=r+2|0;c[13898]=y;x=64656+(b*688&-1)|0;c[x>>2]=c[x>>2]|2;C=y;break L8679}}while(0);if((p|0)>0&(u^1)){D=0;E=0;F=q}else{C=o;break}while(1){if((a[D+146040|0]|0)==(a[j+(D+F|0)|0]|0)){G=F;H=E}else{if((D|0)!=5){C=o;break L8679}G=F-1|0;H=1}w=D+1|0;if((w|0)<(H+p|0)){D=w;E=H;F=G}else{break}}if((H|0)==0){if(!((D|0)==4|(D|0)==9)){C=o;break}}w=r+2|0;c[13898]=w;y=64656+(b*688&-1)|0;c[y>>2]=c[y>>2]&-3;C=w}else{C=o}}while(0);o=c[n+(C*40&-1)+36>>2]|0;r=c[n+(C*40&-1)+32>>2]|0;p=(a[n+(C*40&-1)|0]&1)==0;if((o|0)>0&(p^1)){I=0;J=0;K=r}else{break}while(1){if((a[I+86128|0]|0)==(a[j+(I+K|0)|0]|0)){L=K;M=J}else{if((I|0)!=2){break}L=K-1|0;M=1}q=I+1|0;if((q|0)<(M+o|0)){I=q;J=M;K=L}else{s=6336;break}}do{if((s|0)==6336){if((M|0)==0){if(!((I|0)==9|(I|0)==1)){break}}c[13898]=C+1;n=64656+(b*688&-1)|0;c[n>>2]=c[n>>2]|1;break L8650}}while(0);if((o|0)>0&(p^1)){N=0;O=0;P=r}else{break}while(1){if((a[N+84952|0]|0)==(a[j+(N+P|0)|0]|0)){Q=P;R=O}else{if((N|0)!=5){break L8650}Q=P-1|0;R=1}n=N+1|0;if((n|0)<(R+o|0)){N=n;O=R;P=Q}else{break}}if((R|0)==0){if(!((N|0)==4|(N|0)==11)){break}}c[13898]=C+1;o=64656+(b*688&-1)|0;c[o>>2]=c[o>>2]&-2}}while(0);if((c[5094]|0)==0){i=d;return}if(a[20368]|0){i=d;return}a[20368]=1;g[5090]=+g[3538];g[5088]=+g[3536];g[5086]=+g[3534];g[3538]=180.0;g[3536]=0.0;g[3534]=1.2999999523162842;c[16336]=c[16336]^2;c[17024]=c[17024]^2;i=d;return}function jw(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0.0,T=0.0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0.0,aq=0.0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0.0,aA=0.0,aB=0,aC=0,aD=0,aE=0,aF=0,aG=0,aH=0,aI=0,aJ=0,aK=0,aL=0,aM=0,aN=0,aO=0,aP=0,aQ=0,aR=0,aS=0,aT=0,aU=0,aV=0,aW=0,aX=0,aY=0,aZ=0,a_=0,a$=0,a0=0,a1=0,a2=0,a3=0.0,a4=0,a5=0,a6=0,a7=0,a8=0,a9=0,ba=0,bb=0,bc=0,bd=0,be=0.0,bf=0.0,bg=0,bh=0,bi=0,bj=0,bk=0,bl=0,bm=0,bn=0,bo=0,bp=0,bq=0,br=0,bs=0,bt=0,bu=0,bv=0,bw=0.0,bx=0.0,by=0,bz=0,bA=0,bB=0,bC=0,bD=0,bE=0,bF=0,bG=0,bH=0,bI=0,bJ=0,bK=0,bL=0,bM=0.0,bN=0.0,bO=0,bP=0,bQ=0,bR=0,bS=0,bT=0,bU=0,bV=0,bW=0,bX=0,bY=0,bZ=0,b_=0,b$=0,b0=0,b1=0,b2=0,b3=0,b4=0,b5=0,b6=0,b7=0.0,b8=0.0,b9=0,ca=0,cb=0,cc=0,cd=0,ce=0,cf=0,cg=0,ch=0,ci=0,cj=0,ck=0,cl=0.0,cm=0.0,cn=0,co=0,cp=0,cq=0,cr=0,cs=0,ct=0.0,cu=0.0,cv=0,cw=0,cx=0,cy=0,cz=0,cA=0,cB=0,cC=0,cD=0,cE=0,cF=0,cG=0.0,cH=0.0,cI=0,cJ=0,cK=0,cL=0,cM=0,cN=0,cO=0,cP=0,cQ=0,cR=0,cS=0,cT=0,cU=0,cV=0.0,cW=0.0,cX=0,cY=0,cZ=0,c_=0,c$=0,c0=0,c1=0,c2=0,c3=0.0,c4=0.0,c5=0,c6=0,c7=0,c8=0,c9=0,da=0,db=0.0,dc=0.0,dd=0,de=0,df=0,dg=0,dh=0,di=0,dj=0.0,dk=0.0,dm=0,dn=0,dp=0,dq=0,dr=0,ds=0,dt=0,du=0.0,dv=0.0,dw=0,dx=0,dy=0,dz=0,dA=0,dB=0.0,dC=0.0,dD=0,dE=0;d=i;i=i+224|0;e=d|0;f=d+24|0;g=d+48|0;j=d+88|0;k=d+128|0;l=d+168|0;m=b+4|0;n=(c[m>>2]|0)==-2;o=j;uE(o|0,0,40);c[j>>2]=4;c[j+4>>2]=4;c[j+8>>2]=4;p=k;uE(p|0,0,16);q=d+144|0;uE(q|0,0,24);r=c[13898]|0;s=c[8272]|0;do{if((r|0)<(s|0)){t=b+184|0;u=l|0;w=l+4|0;x=l+8|0;y=l+16|0;z=l+24|0;A=l+32|0;B=f|0;C=f+8|0;D=b+52|0;E=e|0;F=e+8|0;G=0;H=0;I=0;J=0;K=0;L=0;M=0;N=0;O=0;P=0;Q=0;R=0;S=-2.0;T=1.0;U=-2;V=-2;W=0;X=r;Y=s;L8736:while(1){Z=c[1054]|0;_=(a[Z+(X*40&-1)|0]&1)==0;L8738:do{if(!_){$=c[Z+(X*40&-1)+36>>2]|0;aa=Z+(X*40&-1)+32|0;ab=c[10036]|0;ac=0;while(1){if((ac|0)>=($|0)){break}if((a[ab+((c[aa>>2]|0)+ac|0)|0]|0)==(a[ac+103664|0]|0)){ac=ac+1|0}else{break L8738}}if((ac|0)==1){ad=G;ae=H;af=I;ag=J;ah=K;ai=L;aj=M;ak=N;al=O;am=P;an=Q;ao=R;ap=S;aq=T;ar=U;as=V;at=W;au=6556;break L8736}}}while(0);L8745:do{if(J|(Y|0)<=(X|0)|_){au=6376}else{aa=c[Z+(X*40&-1)+36>>2]|0;ab=Z+(X*40&-1)+32|0;$=c[10036]|0;av=0;while(1){if((av|0)>=(aa|0)){break}if((a[$+((c[ab>>2]|0)+av|0)|0]|0)==(a[av+95280|0]|0)){av=av+1|0}else{au=6376;break L8745}}if(n|(av|0)!=2){au=6376;break}c[13898]=X+1;dl(g,0);aw=W;ax=V;ay=U;az=T;aA=S;aB=R;aC=Q;aD=P;aE=O;aF=N;aG=M;aH=L;aI=K;aJ=1;aK=I;aL=G;aM=H}}while(0);L8752:do{if((au|0)==6376){au=0;ab=c[Z+(X*40&-1)+36>>2]|0;$=c[Z+(X*40&-1)+32>>2]|0;L8754:do{if(K){au=6413}else{if(!((ab|0)>0&(_^1))){break}aa=c[10036]|0;ac=0;aN=0;aO=$;while(1){if((a[ac+149696|0]|0)==(a[aa+(ac+aO|0)|0]|0)){aP=aO;aQ=aN}else{if((ac|0)!=1){break}aP=aO-1|0;aQ=1}aR=ac+1|0;if((aR|0)<(aQ+ab|0)){ac=aR;aN=aQ;aO=aP}else{au=6383;break}}do{if((au|0)==6383){au=0;if((aQ|0)==0){if(!((ac|0)==4|(ac|0)==0)){break}}c[13898]=X+1;aw=W;ax=V;ay=U;az=T;aA=S;aB=0;aC=Q;aD=P;aE=O;aF=N;aG=M;aH=L;aI=1;aJ=J;aK=I;aL=G;aM=H;break L8752}}while(0);if(!((ab|0)>0&(_^1))){break}ac=c[10036]|0;aO=0;aN=0;aa=$;while(1){if((a[aO+179896|0]|0)==(a[ac+(aO+aa|0)|0]|0)){aS=aa;aT=aN}else{if((aO|0)!=1){au=6394;break}aS=aa-1|0;aT=1}aR=aO+1|0;if((aR|0)<(aT+ab|0)){aO=aR;aN=aT;aa=aS}else{au=6392;break}}do{if((au|0)==6392){au=0;if((aT|0)!=0){break}if(!((aO|0)==0|(aO|0)==6)){au=6394}}}while(0);L8779:do{if((au|0)==6394){au=0;if(_){break L8754}L8782:do{if((ab|0)>0){aO=c[10036]|0;aa=0;aN=0;ac=$;while(1){if((a[aa+149304|0]|0)==(a[aO+(aa+ac|0)|0]|0)){aU=ac;aV=aN}else{if((aa|0)!=1){break L8782}aU=ac-1|0;aV=1}aR=aa+1|0;if((aR|0)<(aV+ab|0)){aa=aR;aN=aV;ac=aU}else{break}}if((aV|0)!=0){break L8779}if((aa|0)==0|(aa|0)==6){break L8779}}}while(0);if(!((ab|0)>0&(_^1))){break L8754}ac=c[10036]|0;aN=0;aO=0;aR=$;while(1){if((a[aN+149568|0]|0)==(a[ac+(aN+aR|0)|0]|0)){aW=aR;aX=aO}else{if((aN|0)!=1){au=6413;break L8754}aW=aR-1|0;aX=1}aY=aN+1|0;if((aY|0)<(aX+ab|0)){aN=aY;aO=aX;aR=aW}else{break}}if((aX|0)==0){if(!((aN|0)==0|(aN|0)==5)){au=6413;break L8754}}c[13898]=X+1;aw=W;ax=V;ay=U;az=T;aA=S;aB=2;aC=Q;aD=P;aE=O;aF=N;aG=M;aH=L;aI=1;aJ=J;aK=I;aL=G;aM=H;break L8752}}while(0);c[13898]=X+1;aw=W;ax=V;ay=U;az=T;aA=S;aB=1;aC=Q;aD=P;aE=O;aF=N;aG=M;aH=L;aI=1;aJ=J;aK=I;aL=G;aM=H;break L8752}}while(0);L8805:do{if((au|0)==6413){au=0;if(_){break}L8808:do{if((ab|0)>0){av=c[10036]|0;aR=0;aO=0;ac=$;while(1){if((a[aR+90456|0]|0)==(a[av+(aR+ac|0)|0]|0)){aZ=ac;a_=aO}else{if((aR|0)!=3){break L8808}aZ=ac-1|0;a_=1}aY=aR+1|0;if((aY|0)<(a_+ab|0)){aR=aY;aO=a_;ac=aZ}else{break}}if((a_|0)==0){if(!((aR|0)==6|(aR|0)==2)){break}}a$=X+1|0;c[13898]=a$;ac=c[D>>2]|0;aO=a[Z+(a$*40&-1)|0]|0;L8820:do{if((Y|0)>(a$|0)){if((aO&1)==0){au=6427;break}av=c[Z+(a$*40&-1)+36>>2]|0;aN=Z+(a$*40&-1)+32|0;aY=c[10036]|0;a0=0;while(1){if((a0|0)>=(av|0)){break}if((a[aY+((c[aN>>2]|0)+a0|0)|0]|0)==(a[a0+163312|0]|0)){a0=a0+1|0}else{au=6427;break L8820}}if((a0|0)!=2){a1=av;a2=aN;break}c[13898]=X+2;aY=is(e)|0;aa=c[aY>>2]|0;if((aa|0)==1){a3=+(c[aY+8>>2]|0)}else if((aa|0)==2){a3=+h[aY+8>>3]}else if((aa|0)==3){a3=+uz(c[aY+8>>2]|0,0)}else{au=6433;break L8736}if((c[E>>2]|0)==3){uu(c[F>>2]|0);c[E>>2]=1}aw=W;ax=V;ay=U;az=T;aA=S;aB=R;aC=Q;aD=P;aE=O;aF=N;aG=M;aH=1;aI=K;aJ=J;aK=~~a3;aL=G;aM=H;break L8752}else{au=6427}}while(0);if((au|0)==6427){au=0;a1=c[Z+(a$*40&-1)+36>>2]|0;a2=Z+(a$*40&-1)+32|0}if(!((aO&1)!=0&(a1|0)>0)){aw=W;ax=V;ay=U;az=T;aA=S;aB=R;aC=Q;aD=P;aE=O;aF=N;aG=M;aH=1;aI=K;aJ=J;aK=-270;aL=G;aM=H;break L8752}aR=c[10036]|0;aY=0;aa=0;a4=c[a2>>2]|0;while(1){if((a[aY+154360|0]|0)==(a[aR+(aY+a4|0)|0]|0)){a5=a4;a6=aa}else{if((aY|0)!=4){aw=W;ax=V;ay=U;az=T;aA=S;aB=R;aC=Q;aD=P;aE=O;aF=N;aG=M;aH=1;aI=K;aJ=J;aK=-270;aL=G;aM=H;break L8752}a5=a4-1|0;a6=1}a7=aY+1|0;if((a7|0)<(a6+a1|0)){aY=a7;aa=a6;a4=a5}else{break}}if((a6|0)==0){if(!((aY|0)==3|(aY|0)==8)){aw=W;ax=V;ay=U;az=T;aA=S;aB=R;aC=Q;aD=P;aE=O;aF=N;aG=M;aH=1;aI=K;aJ=J;aK=-270;aL=G;aM=H;break L8752}}if((c[m>>2]|0)>-1){au=6446;break L8736}c[13898]=X+2;c[m>>2]=-3;aw=W;ax=V;ay=U;az=T;aA=S;aB=R;aC=Q;aD=P;aE=O;aF=N;aG=M;aH=1;aI=K;aJ=J;aK=ac;aL=G;aM=H;break L8752}}while(0);if(!((ab|0)>0&(_^1))){break}a4=c[10036]|0;aa=0;aR=0;aO=$;while(1){if((a[aa+149328|0]|0)==(a[a4+(aa+aO|0)|0]|0)){a8=aO;a9=aR}else{if((aa|0)!=5){break L8805}a8=aO-1|0;a9=1}a7=aa+1|0;if((a7|0)<(a9+ab|0)){aa=a7;aR=a9;aO=a8}else{break}}if((a9|0)==0){if(!((aa|0)==4|(aa|0)==8)){break}}c[13898]=X+1;if((c[m>>2]|0)!=-3){aw=W;ax=V;ay=U;az=T;aA=S;aB=R;aC=Q;aD=P;aE=O;aF=N;aG=M;aH=1;aI=K;aJ=J;aK=0;aL=G;aM=H;break L8752}c[m>>2]=-2;aw=W;ax=V;ay=U;az=T;aA=S;aB=R;aC=Q;aD=P;aE=O;aF=N;aG=M;aH=1;aI=K;aJ=J;aK=0;aL=G;aM=H;break L8752}}while(0);L8865:do{if(!(M|(Y|0)<=(X|0)|_)){aO=c[10036]|0;aR=0;while(1){if((aR|0)>=(ab|0)){break}if((a[aO+($+aR|0)|0]|0)==(a[aR+124352|0]|0)){aR=aR+1|0}else{break L8865}}if((aR|0)!=4){break}ba=X+1|0;c[13898]=ba;if((ba|0)>=(Y|0)){bb=ba;au=6577;break L8736}L8873:do{if((a[Z+(ba*40&-1)|0]&1)!=0){aa=c[Z+(ba*40&-1)+36>>2]|0;a4=Z+(ba*40&-1)+32|0;a7=0;while(1){if((a7|0)>=(aa|0)){break}if((a[aO+((c[a4>>2]|0)+a7|0)|0]|0)==(a[a7+103664|0]|0)){a7=a7+1|0}else{break L8873}}if((a7|0)==1){bb=ba;au=6578;break L8736}}}while(0);a[14176]=1;is(f);a[14176]=0;if((c[B>>2]|0)!=3){au=6470;break L8736}aO=c[C>>2]|0;if((aO|0)==0){au=6472;break L8736}else{aw=aO;ax=V;ay=U;az=T;aA=S;aB=R;aC=Q;aD=P;aE=O;aF=N;aG=1;aH=L;aI=K;aJ=J;aK=I;aL=G;aM=H;break L8752}}}while(0);L8882:do{if(!(O|n)){aO=(Y|0)>(X|0);if(_|aO^1){break}aR=c[10036]|0;a4=0;while(1){if((a4|0)>=(ab|0)){au=6479;break}if((a[aR+($+a4|0)|0]|0)==(a[a4+150704|0]|0)){a4=a4+1|0}else{break}}do{if((au|0)==6479){au=0;if((a4|0)!=4){break}c[13898]=X+1;aw=W;ax=V;ay=U;az=T;aA=S;aB=R;aC=0;aD=P;aE=1;aF=N;aG=M;aH=L;aI=K;aJ=J;aK=I;aL=G;aM=H;break L8752}}while(0);if(_|aO^1){break}a4=c[10036]|0;aR=0;while(1){if((aR|0)>=(ab|0)){break}if((a[a4+($+aR|0)|0]|0)==(a[aR+150856|0]|0)){aR=aR+1|0}else{break L8882}}if((aR|0)!=5){break}c[13898]=X+1;aw=W;ax=V;ay=U;az=T;aA=S;aB=R;aC=1;aD=P;aE=1;aF=N;aG=M;aH=L;aI=K;aJ=J;aK=I;aL=G;aM=H;break L8752}}while(0);L8899:do{if((ab|0)>0&(((V|0)!=-2|n|_)^1)){a4=c[10036]|0;aO=0;aa=0;ac=$;while(1){if((a[aO+140256|0]|0)==(a[a4+(aO+ac|0)|0]|0)){bc=ac;bd=aa}else{if((aO|0)!=2){break}bc=ac-1|0;bd=1}aY=aO+1|0;if((aY|0)<(bd+ab|0)){aO=aY;aa=bd;ac=bc}else{au=6493;break}}do{if((au|0)==6493){au=0;if((bd|0)==0){if(!((aO|0)==5|(aO|0)==1)){break}}ac=X+1|0;c[13898]=ac;c[u>>2]=1;c[w>>2]=U;c[x>>2]=H;c[x+4>>2]=G;h[y>>3]=T;h[z>>3]=S;c[A>>2]=c[q>>2];c[A+4>>2]=c[q+4>>2];c[A+8>>2]=c[q+8>>2];c[A+12>>2]=c[q+12>>2];c[A+16>>2]=c[q+16>>2];c[A+20>>2]=c[q+20>>2];hH(l,1,1);if((ac|0)==(c[13898]|0)){aw=W;ax=1;ay=U;az=T;aA=S;aB=R;aC=Q;aD=P;aE=O;aF=N;aG=M;aH=L;aI=K;aJ=J;aK=I;aL=G;aM=H;break L8752}ac=c[u>>2]|0;aa=c[w>>2]|0;a4=c[x>>2]|0;aR=c[x+4>>2]|0;be=+h[y>>3];bf=+h[z>>3];c[q>>2]=c[A>>2];c[q+4>>2]=c[A+4>>2];c[q+8>>2]=c[A+8>>2];c[q+12>>2]=c[A+12>>2];c[q+16>>2]=c[A+16>>2];c[q+20>>2]=c[A+20>>2];aw=W;ax=ac;ay=aa;az=be;aA=bf;aB=R;aC=Q;aD=P;aE=O;aF=N;aG=M;aH=L;aI=K;aJ=J;aK=I;aL=aR;aM=a4;break L8752}}while(0);if(!((ab|0)>0&(_^1))){break}aO=c[10036]|0;a4=0;aR=0;aa=$;while(1){if((a[a4+138112|0]|0)==(a[aO+(a4+aa|0)|0]|0)){bg=aa;bh=aR}else{if((a4|0)!=4){break L8899}bg=aa-1|0;bh=1}ac=a4+1|0;if((ac|0)<(bh+ab|0)){a4=ac;aR=bh;aa=bg}else{break}}if((bh|0)==0){if(!((a4|0)==3|(a4|0)==7)){break}}c[13898]=X+1;aw=W;ax=0;ay=U;az=T;aA=S;aB=R;aC=Q;aD=P;aE=O;aF=N;aG=M;aH=L;aI=K;aJ=J;aK=I;aL=G;aM=H;break L8752}}while(0);L8926:do{if((ab|0)>0&((N|_)^1)){aa=c[10036]|0;aR=0;aO=0;ac=$;while(1){if((a[aR+136456|0]|0)==(a[aa+(aR+ac|0)|0]|0)){bi=ac;bj=aO}else{if((aR|0)!=2){break L8926}bi=ac-1|0;bj=1}aY=aR+1|0;if((aY|0)<(bj+ab|0)){aR=aY;aO=bj;ac=bi}else{break}}if((bj|0)==0){if(!((aR|0)==1|(aR|0)==6)){break}}c[13898]=X+1;dl(j,4);aw=W;ax=V;ay=U;az=T;aA=S;aB=R;aC=Q;aD=P;aE=O;aF=1;aG=M;aH=L;aI=K;aJ=J;aK=I;aL=G;aM=H;break L8752}}while(0);L8939:do{if((Y|0)>(X|0)){if(_){au=6544;break L8736}ac=c[10036]|0;aO=0;while(1){if((aO|0)>=(ab|0)){break}if((a[ac+($+aO|0)|0]|0)==(a[aO+143040|0]|0)){aO=aO+1|0}else{au=6521;break L8939}}if((aO|0)!=2){au=6521;break}if(!P){au=6532}}else{au=6521}}while(0);L8947:do{if((au|0)==6521){au=0;if(_){au=6544;break L8736}if((ab|0)>0){ac=c[10036]|0;aR=0;aa=0;a4=$;while(1){if((a[aR+142856|0]|0)==(a[ac+(aR+a4|0)|0]|0)){bk=a4;bl=aa}else{if((aR|0)!=4){break L8947}bk=a4-1|0;bl=1}bm=aR+1|0;if((bm|0)<(bl+ab|0)){aR=bm;aa=bl;a4=bk}else{break}}if((bl|0)==0){bn=bm;au=6529}else{bo=0}}else{bn=0;au=6529}if((au|0)==6529){au=0;bo=(bn|0)!=10&(bn|0)!=4}if(!(bo|P)){au=6532}}}while(0);if((au|0)==6532){au=0;hI(k,7);aw=W;ax=V;ay=U;az=T;aA=S;aB=R;aC=Q;aD=1;aE=O;aF=N;aG=M;aH=L;aI=K;aJ=J;aK=I;aL=G;aM=H;break}if(_){au=6534;break L8736}if((ab|0)<=0){au=6547;break L8736}a4=c[10036]|0;aa=0;aR=0;ac=$;while(1){if((a[aa+121536|0]|0)==(a[a4+(aa+ac|0)|0]|0)){bp=ac;bq=aR}else{if((aa|0)!=5){break}bp=ac-1|0;bq=1}aO=aa+1|0;if((aO|0)<(bq+ab|0)){aa=aO;aR=bq;ac=bp}else{au=6541;break}}do{if((au|0)==6541){au=0;if((bq|0)==0){if(!((aa|0)==4|(aa|0)==10)){break}}a[t]=1;c[13898]=(c[13898]|0)+1;aw=W;ax=V;ay=U;az=T;aA=S;aB=R;aC=Q;aD=P;aE=O;aF=N;aG=M;aH=L;aI=K;aJ=J;aK=I;aL=G;aM=H;break L8752}}while(0);if(_){ad=G;ae=H;af=I;ag=J;ah=K;ai=L;aj=M;ak=N;al=O;am=P;an=Q;ao=R;ap=S;aq=T;ar=U;as=V;at=W;au=6556;break L8736}if((ab|0)<=0){au=6547;break L8736}aa=c[10036]|0;ac=0;aR=0;a4=$;while(1){if((a[ac+122880|0]|0)==(a[aa+(ac+a4|0)|0]|0)){br=a4;bs=aR}else{if((ac|0)!=3){ad=G;ae=H;af=I;ag=J;ah=K;ai=L;aj=M;ak=N;al=O;am=P;an=Q;ao=R;ap=S;aq=T;ar=U;as=V;at=W;au=6556;break L8736}br=a4-1|0;bs=1}aO=ac+1|0;if((aO|0)<(bs+ab|0)){ac=aO;aR=bs;a4=br}else{break}}if((bs|0)==0){if(!((ac|0)==2|(ac|0)==8)){ad=G;ae=H;af=I;ag=J;ah=K;ai=L;aj=M;ak=N;al=O;am=P;an=Q;ao=R;ap=S;aq=T;ar=U;as=V;at=W;au=6556;break L8736}}a[t]=0;c[13898]=(c[13898]|0)+1;aw=W;ax=V;ay=U;az=T;aA=S;aB=R;aC=Q;aD=P;aE=O;aF=N;aG=M;aH=L;aI=K;aJ=J;aK=I;aL=G;aM=H}}while(0);_=c[13898]|0;Z=c[8272]|0;if((_|0)<(Z|0)){G=aL;H=aM;I=aK;J=aJ;K=aI;L=aH;M=aG;N=aF;O=aE;P=aD;Q=aC;R=aB;S=aA;T=az;U=ay;V=ax;W=aw;X=_;Y=Z}else{ad=aL;ae=aM;af=aK;ag=aJ;ah=aI;ai=aH;aj=aG;ak=aF;al=aE;am=aD;an=aC;ao=aB;ap=aA;aq=az;ar=ay;as=ax;at=aw;au=6556;break}}if((au|0)==6577){uf(bb,145200,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((au|0)==6578){uf(bb,145200,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((au|0)==6534){if(J){bt=W;bu=V;bv=U;bw=T;bx=S;by=R;bz=Q;bA=P;bB=O;bC=N;bD=M;bE=L;bF=K;bG=I;bH=G;bI=H;au=6558}else{bJ=W;bK=V;bL=U;bM=T;bN=S;bO=R;bP=Q;bQ=P;bR=O;bS=N;bT=M;bU=L;bV=K;bW=I;bX=G;bY=H;au=6557}}else if((au|0)==6544){if(J){bt=W;bu=V;bv=U;bw=T;bx=S;by=R;bz=Q;bA=P;bB=O;bC=N;bD=M;bE=L;bF=K;bG=I;bH=G;bI=H;au=6558}else{bJ=W;bK=V;bL=U;bM=T;bN=S;bO=R;bP=Q;bQ=P;bR=O;bS=N;bT=M;bU=L;bV=K;bW=I;bX=G;bY=H;au=6557}}else if((au|0)==6547){if(J){bt=W;bu=V;bv=U;bw=T;bx=S;by=R;bz=Q;bA=P;bB=O;bC=N;bD=M;bE=L;bF=K;bG=I;bH=G;bI=H;au=6558}else{bJ=W;bK=V;bL=U;bM=T;bN=S;bO=R;bP=Q;bQ=P;bR=O;bS=N;bT=M;bU=L;bV=K;bW=I;bX=G;bY=H;au=6557}}else if((au|0)==6556){if(ag){bt=at;bu=as;bv=ar;bw=aq;bx=ap;by=ao;bz=an;bA=am;bB=al;bC=ak;bD=aj;bE=ai;bF=ah;bG=af;bH=ad;bI=ae;au=6558}else{bJ=at;bK=as;bL=ar;bM=aq;bN=ap;bO=ao;bP=an;bQ=am;bR=al;bS=ak;bT=aj;bU=ai;bV=ah;bW=af;bX=ad;bY=ae;au=6557}}else if((au|0)==6470){c[13898]=ba;bb=ba;uf(bb,145200,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((au|0)==6472){bb=c[13898]|0;uf(bb,145200,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((au|0)==6446){uf(a$,151096,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((au|0)==6433){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((au|0)==6558){Y=b+8|0;X=g;c[Y>>2]=c[X>>2];c[Y+4>>2]=c[X+4>>2];c[Y+8>>2]=c[X+8>>2];c[Y+12>>2]=c[X+12>>2];c[Y+16>>2]=c[X+16>>2];c[Y+20>>2]=c[X+20>>2];c[Y+24>>2]=c[X+24>>2];c[Y+28>>2]=c[X+28>>2];c[Y+32>>2]=c[X+32>>2];c[Y+36>>2]=c[X+36>>2];if(bF){bZ=bH;b_=bI;b$=bG;b0=bE;b1=bD;b2=bC;b3=bB;b4=bA;b5=bz;b6=by;b7=bx;b8=bw;b9=bv;ca=bu;cb=bt;au=6559}else{cc=bH;cd=bI;ce=bG;cf=bE;cg=bD;ch=bC;ci=bB;cj=bA;ck=bz;cl=bx;cm=bw;cn=bv;co=bu;cp=bt;au=6560}}else if((au|0)==6557){uE(g|0,0,40);if(bV){bZ=bX;b_=bY;b$=bW;b0=bU;b1=bT;b2=bS;b3=bR;b4=bQ;b5=bP;b6=bO;b7=bN;b8=bM;b9=bL;ca=bK;cb=bJ;au=6559}else{cc=bX;cd=bY;ce=bW;cf=bU;cg=bT;ch=bS;ci=bR;cj=bQ;ck=bP;cl=bN;cm=bM;cn=bL;co=bK;cp=bJ;au=6560}}if((au|0)==6559){c[b+48>>2]=b6;if(b0){cq=cb;cr=ca;cs=b9;ct=b8;cu=b7;cv=b5;cw=b4;cx=b3;cy=b2;cz=b1;cA=b$;cB=bZ;cC=b_;au=6561}else{cD=cb;cE=ca;cF=b9;cG=b8;cH=b7;cI=b5;cJ=b4;cK=b3;cL=b2;cM=b1;cN=bZ;cO=b_;au=6562}}else if((au|0)==6560){if(cf){cq=cp;cr=co;cs=cn;ct=cm;cu=cl;cv=ck;cw=cj;cx=ci;cy=ch;cz=cg;cA=ce;cB=cc;cC=cd;au=6561}else{cD=cp;cE=co;cF=cn;cG=cm;cH=cl;cI=ck;cJ=cj;cK=ci;cL=ch;cM=cg;cN=cc;cO=cd;au=6562}}if((au|0)==6561){c[b+52>>2]=cA;if(cx){cP=cB;cQ=cC;cR=cz;cS=cy;cT=cw;cU=cv;cV=cu;cW=ct;cX=cs;cY=cr;cZ=cq;au=6563}else{c_=cB;c$=cC;c0=cz;c1=cy;c2=cw;c3=cu;c4=ct;c5=cs;c6=cr;c7=cq;au=6564}}else if((au|0)==6562){if(cK){cP=cN;cQ=cO;cR=cM;cS=cL;cT=cJ;cU=cI;cV=cH;cW=cG;cX=cF;cY=cE;cZ=cD;au=6563}else{c_=cN;c$=cO;c0=cM;c1=cL;c2=cJ;c3=cH;c4=cG;c5=cF;c6=cE;c7=cD;au=6564}}if((au|0)==6563){c[b+56>>2]=cU;if(cR){c8=cZ;c9=cY;da=cX;db=cW;dc=cV;dd=cT;de=cS;df=cP;dg=cQ;au=6565}else{dh=cY;di=cX;dj=cW;dk=cV;dm=cT;dn=cS;dp=cP;dq=cQ;au=6566}}else if((au|0)==6564){if(c0){c8=c7;c9=c6;da=c5;db=c4;dc=c3;dd=c2;de=c1;df=c_;dg=c$;au=6565}else{dh=c6;di=c5;dj=c4;dk=c3;dm=c2;dn=c1;dp=c_;dq=c$;au=6566}}if((au|0)==6565){c[b+64>>2]=c8;if(dd){dr=df;ds=dg;dt=de;du=dc;dv=db;dw=da;dx=c9;au=6567}else{dy=df;dz=dg;dA=de;dB=dc;dC=db;dD=da;dE=c9}}else if((au|0)==6566){if(dm){dr=dp;ds=dq;dt=dn;du=dk;dv=dj;dw=di;dx=dh;au=6567}else{dy=dp;dz=dq;dA=dn;dB=dk;dC=dj;dD=di;dE=dh}}if((au|0)==6567){X=b+72|0;c[X>>2]=c[p>>2];c[X+4>>2]=c[p+4>>2];c[X+8>>2]=c[p+8>>2];c[X+12>>2]=c[p+12>>2];dy=dr;dz=ds;dA=dt;dB=du;dC=dv;dD=dw;dE=dx}if((dE|0)>-1){c[b+88>>2]=dE;c[b+92>>2]=dD;X=b+96|0;c[X>>2]=dz;c[X+4>>2]=dy;h[b+104>>3]=dC;h[b+112>>3]=dB;X=b+120|0;c[X>>2]=c[q>>2];c[X+4>>2]=c[q+4>>2];c[X+8>>2]=c[q+8>>2];c[X+12>>2]=c[q+12>>2];c[X+16>>2]=c[q+16>>2];c[X+20>>2]=c[q+20>>2];if(!dA){break}}else{if(!dA){break}}X=b+144|0;c[X>>2]=c[o>>2];c[X+4>>2]=c[o+4>>2];c[X+8>>2]=c[o+8>>2];c[X+12>>2]=c[o+12>>2];c[X+16>>2]=c[o+16>>2];c[X+20>>2]=c[o+20>>2];c[X+24>>2]=c[o+24>>2];c[X+28>>2]=c[o+28>>2];c[X+32>>2]=c[o+32>>2];c[X+36>>2]=c[o+36>>2]}else{uE(g|0,0,40)}}while(0);if((c[b+72>>2]|0)!=6){i=d;return}h[b+80>>3]=+h[b+40>>3];i=d;return} -function jx(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0.0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0,aA=0.0,aB=0,aC=0,aD=0,aE=0,aF=0,aG=0,aH=0,aJ=0,aK=0,aL=0.0,aM=0,aN=0,aO=0,aP=0,aQ=0,aR=0,aS=0,aT=0,aU=0,aV=0,aW=0,aX=0,aY=0.0,aZ=0,a_=0,a$=0,a0=0,a1=0,a2=0,a3=0,a4=0,a5=0,a6=0.0,a7=0.0,a8=0,a9=0,ba=0,bb=0,bc=0,bd=0,be=0,bf=0,bg=0,bh=0,bi=0,bj=0,bk=0,bl=0,bm=0,bn=0,bo=0,bp=0,bq=0,br=0,bs=0,bt=0.0,bu=0,bv=0,bw=0.0,bx=0,by=0,bz=0;e=i;i=i+96|0;f=e|0;g=e+24|0;j=e+48|0;k=e+72|0;l=c[13898]|0;c[13898]=l+1;do{if((b|0)<-1){c[13898]=l;if((d|0)==1){n=b;o=49264;p=0;q=0;r=49160;s=0;t=0;u=l;break}uf(l,191504,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{w=c[10818]|0;L9036:do{if((w|0)==0){x=0;y=0;z=6591}else{A=(b|0)>0;B=0;C=w;while(1){if(A){D=c[C+4>>2]|0;if((D|0)>=(b|0)){break}}E=c[C>>2]|0;if((E|0)==0){x=C;y=0;z=6591;break L9036}else{B=C;C=E}}if((C|0)==0){F=b;G=B;H=0;z=6594;break}if((D|0)!=(b|0)){x=B;y=C;z=6591;break}A=c[C+12>>2]|0;if((A|0)==(d|0)){I=b;J=0;K=C;break}E=C|0;L=c[E>>2]|0;if((A|0)==4){uu(c[(C+104|0)+4>>2]|0)}if((d|0)==4){uD(C|0,33240,272)}else if((d|0)==1){uD(C|0,1144,272);c[C+52>>2]=-7;c[C+16>>2]=3}else if((d|0)==3){uD(C|0,1416,272)}else if((d|0)==2){uD(C|0,1688,272)}else{uf(-1,177064,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[C+4>>2]=b;c[C+12>>2]=d;c[E>>2]=L;I=b;J=C;K=C}}while(0);do{if((z|0)==6591){if((b|0)!=-1){F=b;G=x;H=y;z=6594;break}if((x|0)==0){F=1;G=0;H=y;z=6594;break}F=(c[x+4>>2]|0)+1|0;G=x;H=y;z=6594}}while(0);if((z|0)==6594){w=ut(272)|0;do{if((w|0)==0){gk();L=ut(272)|0;if((L|0)!=0){M=L;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=177576,v)|0)}else{M=w}}while(0);w=M;if((d|0)==1){uD(M|0,1144,272);c[M+52>>2]=-7;c[M+16>>2]=3}else if((d|0)==3){uD(M|0,1416,272)}else if((d|0)==2){uD(M|0,1688,272)}else if((d|0)==4){uD(M|0,33240,272)}else{uf(-1,177064,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[M+4>>2]=F;c[M+12>>2]=d;if((G|0)==0){c[10818]=w}else{c[G>>2]=w}c[M>>2]=H;I=F;J=w;K=w}w=K+104|0;n=I;o=w|0;p=w;q=J;r=K;s=w;t=w;u=c[13898]|0}}while(0);K=c[8272]|0;if((u|0)>=(K|0)){i=e;return}J=o+88|0;I=o+128|0;F=J|0;H=I|0;M=o+92|0;G=o+132|0;y=o+104|0;x=o+144|0;b=o+112|0;D=o+152|0;l=o|0;w=o+48|0;L=o+8|0;o=r+8|0;E=k|0;A=k+8|0;N=r+80|0;O=r+52|0;Q=r+88|0;R=Q|0;S=r+12|0;T=(q|0)==0;q=r+16|0;U=q|0;V=r+20|0;W=r+24|0;X=r+32|0;Y=(n|0)<0;n=r+16|0;Z=j|0;_=j+8|0;$=t+88|0;aa=g|0;ab=g+8|0;ac=t+96|0;ad=t+48|0;ae=t+8|0;t=p+48|0;af=p|0;ag=f|0;ah=f+8|0;ai=p+88|0;aj=p+8|0;p=s+4|0;ak=s|0;s=0;al=0;am=0;an=0;ao=0;ap=0;aq=1.0;ar=u;u=K;L9085:while(1){K=c[1054]|0;as=(a[K+(ar*40&-1)|0]&1)==0;L9087:do{if(!as){at=c[K+(ar*40&-1)+36>>2]|0;au=K+(ar*40&-1)+32|0;av=c[10036]|0;aw=0;while(1){if((aw|0)>=(at|0)){break}if((a[av+((c[au>>2]|0)+aw|0)|0]|0)==(a[aw+103664|0]|0)){aw=aw+1|0}else{break L9087}}if((aw|0)==1){ax=am;ay=an;az=ao;aA=aq;z=6939;break L9085}}}while(0);L9094:do{if((d|0)==3){au=(u|0)>(ar|0);L9096:do{if(au){av=c[K+(ar*40&-1)+36>>2]|0;at=K+(ar*40&-1)+32|0;if(as){aB=c[at>>2]|0;aC=av;z=6764;break}C=c[10036]|0;B=0;while(1){if((B|0)>=(av|0)){break}if((a[C+((c[at>>2]|0)+B|0)|0]|0)==(a[B+95280|0]|0)){B=B+1|0}else{z=6754;break L9096}}if((B|0)==2){z=6762}else{z=6754}}else{z=6754}}while(0);L9105:do{if((z|0)==6754){z=0;aw=c[K+(ar*40&-1)+36>>2]|0;at=c[K+(ar*40&-1)+32>>2]|0;L9107:do{if((aw|0)>0&(as^1)){C=c[10036]|0;av=0;aD=0;aE=at;while(1){if((a[av+185064|0]|0)==(a[C+(av+aE|0)|0]|0)){aF=aE;aG=aD}else{if((av|0)!=3){break L9107}aF=aE-1|0;aG=1}aH=av+1|0;if((aH|0)<(aG+aw|0)){av=aH;aD=aG;aE=aF}else{break}}if((aG|0)!=0){z=6762;break L9105}if((av|0)==2|(av|0)==6){z=6762;break L9105}}}while(0);if(au){aB=at;aC=aw;z=6764}else{aJ=aw;aK=at}}}while(0);if((z|0)==6762){z=0;c[13898]=ar+1;dl(aj,0);aL=aq;aM=ap;aN=ao;aO=an;aP=am;aQ=al;aR=s;break}L9120:do{if((z|0)==6764){z=0;if(as){aS=ap;aT=an;aU=ar;aV=u;z=6859;break L9094}au=c[10036]|0;B=0;while(1){if((B|0)>=(aC|0)){break}if((a[au+(aB+B|0)|0]|0)==(a[B+130496|0]|0)){B=B+1|0}else{aJ=aC;aK=aB;break L9120}}if((B|0)!=4){aJ=aC;aK=aB;break}c[13898]=ar+1;dl(t,0);aL=aq;aM=ap;aN=ao;aO=an;aP=am;aQ=al;aR=s;break L9094}}while(0);if(!((aJ|0)>0&(as^1))){aS=ap;aT=an;aU=ar;aV=u;z=6859;break}au=c[10036]|0;at=0;aw=0;aE=aK;while(1){if((a[at+212296|0]|0)==(a[au+(at+aE|0)|0]|0)){aW=aE;aX=aw}else{if((at|0)!=3){break}aW=aE-1|0;aX=1}aD=at+1|0;if((aD|0)<(aX+aJ|0)){at=aD;aw=aX;aE=aW}else{z=6776;break}}do{if((z|0)==6776){z=0;if((aX|0)==0){if(!((at|0)==5|(at|0)==2)){break}}c[13898]=ar+1;aE=is(f)|0;aw=c[aE>>2]|0;if((aw|0)==1){aY=+(c[aE+8>>2]|0)}else if((aw|0)==2){aY=+h[aE+8>>3]}else if((aw|0)==3){aY=+uz(c[aE+8>>2]|0,0)}else{z=6782;break L9085}if((c[ag>>2]|0)==3){uu(c[ah>>2]|0);c[ag>>2]=1}h[ai>>3]=aY;aL=aq;aM=ap;aN=ao;aO=an;aP=am;aQ=al;aR=s;break L9094}}while(0);if(!((aJ|0)>0&(as^1))){aS=ap;aT=an;aU=ar;aV=u;z=6859;break}at=c[10036]|0;aE=0;aw=0;au=aK;while(1){if((a[aE+211736|0]|0)==(a[at+(aE+au|0)|0]|0)){aZ=au;a_=aw}else{if((aE|0)!=4){aS=ap;aT=an;aU=ar;aV=u;z=6859;break L9094}aZ=au-1|0;a_=1}aD=aE+1|0;if((aD|0)<(a_+aJ|0)){aE=aD;aw=a_;au=aZ}else{break}}if((a_|0)==0){if(!((aE|0)==3|(aE|0)==5)){aS=ap;aT=an;aU=ar;aV=u;z=6859;break}}a$=ar+1|0;c[13898]=a$;au=(u|0)>(a$|0);L9161:do{if(au){do{if((a[K+(a$*40&-1)|0]&1)!=0){aw=c[K+(a$*40&-1)+36>>2]|0;at=K+(a$*40&-1)+32|0;aD=c[10036]|0;C=0;while(1){if((C|0)>=(aw|0)){z=6799;break}if((a[aD+((c[at>>2]|0)+C|0)|0]|0)==(a[C+150688|0]|0)){C=C+1|0}else{z=6800;break}}if((z|0)==6799){z=0;if((C|0)==2|au^1){z=6806;break L9161}else{break}}else if((z|0)==6800){z=0;if(au){break}else{z=6806;break L9161}}}}while(0);B=(a[K+(a$*40&-1)|0]&1)==0;if(B){z=6963;break L9085}at=c[K+(a$*40&-1)+36>>2]|0;aD=K+(a$*40&-1)+32|0;aw=c[10036]|0;av=0;while(1){if((av|0)>=(at|0)){z=6805;break}if((a[aw+((c[aD>>2]|0)+av|0)|0]|0)==(a[av+103664|0]|0)){av=av+1|0}else{break}}if((z|0)==6805){z=0;if((av|0)==1){z=6806;break}}if(B){z=6962;break L9085}aD=c[K+(a$*40&-1)+36>>2]|0;aw=K+(a$*40&-1)+32|0;at=c[10036]|0;aH=0;while(1){if((aH|0)>=(aD|0)){z=6811;break}if((a[at+((c[aw>>2]|0)+aH|0)|0]|0)==(a[aH+211336|0]|0)){aH=aH+1|0}else{break}}do{if((z|0)==6811){z=0;if((aH|0)!=2){break}c[af>>2]=1;break L9161}}while(0);if(B){z=6964;break L9085}aH=c[K+(a$*40&-1)+36>>2]|0;aw=K+(a$*40&-1)+32|0;at=c[10036]|0;aD=0;while(1){if((aD|0)>=(aH|0)){break}if((a[at+((c[aw>>2]|0)+aD|0)|0]|0)==(a[aD+210848|0]|0)){aD=aD+1|0}else{z=6965;break L9085}}if((aD|0)!=2){z=6966;break L9085}c[af>>2]=2}else{z=6806}}while(0);if((z|0)==6806){z=0;c[af>>2]=0}c[13898]=(c[13898]|0)+1;aL=aq;aM=ap;aN=ao;aO=an;aP=am;aQ=al;aR=s}else if((d|0)==2){au=(u|0)>(ar|0);L9197:do{if(au){aE=c[K+(ar*40&-1)+36>>2]|0;aw=K+(ar*40&-1)+32|0;if(as){a0=c[aw>>2]|0;a1=aE;break}at=c[10036]|0;aH=0;while(1){if((aH|0)>=(aE|0)){break}if((a[at+((c[aw>>2]|0)+aH|0)|0]|0)==(a[aH+95280|0]|0)){aH=aH+1|0}else{z=6682;break L9197}}if((aH|0)==2){z=6690}else{z=6682}}else{z=6682}}while(0);L9206:do{if((z|0)==6682){z=0;aw=c[K+(ar*40&-1)+36>>2]|0;at=c[K+(ar*40&-1)+32>>2]|0;L9208:do{if((aw|0)>0&(as^1)){aE=c[10036]|0;aD=0;B=0;av=at;while(1){if((a[aD+185064|0]|0)==(a[aE+(aD+av|0)|0]|0)){a2=av;a3=B}else{if((aD|0)!=3){break L9208}a2=av-1|0;a3=1}a4=aD+1|0;if((a4|0)<(a3+aw|0)){aD=a4;B=a3;av=a2}else{break}}if((a3|0)!=0){z=6690;break L9206}if((aD|0)==2|(aD|0)==6){z=6690;break L9206}}}while(0);if(au){a0=at;a1=aw}else{aS=ap;aT=an;aU=ar;aV=u;z=6859;break L9094}}}while(0);if((z|0)==6690){z=0;c[13898]=ar+1;dl(ae,0);aL=aq;aM=ap;aN=ao;aO=an;aP=am;aQ=al;aR=s;break}L9222:do{if(as){z=6697}else{aH=c[10036]|0;av=0;while(1){if((av|0)>=(a1|0)){break}if((a[aH+(a0+av|0)|0]|0)==(a[av+130496|0]|0)){av=av+1|0}else{z=6697;break L9222}}if((av|0)!=4){z=6697}}}while(0);do{if((z|0)==6697){z=0;if(!au){aS=ap;aT=an;aU=ar;aV=u;z=6859;break L9094}if(as){aS=ap;aT=an;aU=ar;aV=u;z=6859;break L9094}aH=c[10036]|0;aw=0;while(1){if((aw|0)>=(a1|0)){z=6702;break}if((a[aH+(a0+aw|0)|0]|0)==(a[aw+184696|0]|0)){aw=aw+1|0}else{break}}if((z|0)==6702){z=0;if((aw|0)==6){break}}if(!au){aS=ap;aT=an;aU=ar;aV=u;z=6859;break L9094}if(as){aS=ap;aT=an;aU=ar;aV=u;z=6859;break L9094}aH=c[10036]|0;av=0;while(1){if((av|0)>=(a1|0)){break}if((a[aH+(a0+av|0)|0]|0)==(a[av+184328|0]|0)){av=av+1|0}else{aS=ap;aT=an;aU=ar;aV=u;z=6859;break L9094}}if((av|0)!=3){aS=ap;aT=an;aU=ar;aV=u;z=6859;break L9094}aw=ar+1|0;c[13898]=aw;if((u|0)<=(aw|0)){a5=aw;z=6948;break L9085}if((a[K+(aw*40&-1)|0]&1)==0){a5=aw;z=6946;break L9085}at=c[K+(aw*40&-1)+36>>2]|0;B=K+(aw*40&-1)+32|0;aE=0;while(1){if((aE|0)>=(at|0)){break}if((a[aH+((c[B>>2]|0)+aE|0)|0]|0)==(a[aE+78280|0]|0)){aE=aE+1|0}else{a5=aw;z=6952;break L9085}}if((aE|0)!=1){a5=aw;z=6953;break L9085}c[13898]=ar+2;B=is(j)|0;aH=c[B>>2]|0;if((aH|0)==1){a6=+(c[B+8>>2]|0)}else if((aH|0)==2){a6=+h[B+8>>3]}else if((aH|0)==3){a6=+uz(c[B+8>>2]|0,0)}else{z=6720;break L9085}if((c[Z>>2]|0)==3){uu(c[_>>2]|0);c[Z>>2]=1}if(+P(+a6)>1.0e3){z=6724;break L9085}h[$>>3]=a6;B=c[13898]|0;aH=B+1|0;c[13898]=aH;if((c[8272]|0)<=(B|0)){a5=aH;z=6956;break L9085}at=c[1054]|0;if((a[at+(B*40&-1)|0]&1)==0){a5=aH;z=6957;break L9085}av=c[at+(B*40&-1)+36>>2]|0;C=at+(B*40&-1)+32|0;B=c[10036]|0;at=0;while(1){if((at|0)>=(av|0)){break}if((a[B+((c[C>>2]|0)+at|0)|0]|0)==(a[at+183584|0]|0)){at=at+1|0}else{a5=aH;z=6954;break L9085}}if((at|0)!=1){a5=aH;z=6955;break L9085}C=is(g)|0;B=c[C>>2]|0;if((B|0)==1){a7=+(c[C+8>>2]|0)}else if((B|0)==2){a7=+h[C+8>>3]}else if((B|0)==3){a7=+uz(c[C+8>>2]|0,0)}else{z=6735;break L9085}if((c[aa>>2]|0)==3){uu(c[ab>>2]|0);c[aa>>2]=1}if(+P(+a7)>1.0e3){z=6739;break L9085}h[ac>>3]=a7;C=c[13898]|0;B=C+1|0;c[13898]=B;if((c[8272]|0)<=(C|0)){a5=B;z=6947;break L9085}av=c[1054]|0;if((a[av+(C*40&-1)|0]&1)==0){a5=B;z=6951;break L9085}aw=c[av+(C*40&-1)+36>>2]|0;aE=av+(C*40&-1)+32|0;C=c[10036]|0;av=0;while(1){if((av|0)>=(aw|0)){break}if((a[C+((c[aE>>2]|0)+av|0)|0]|0)==(a[av+78864|0]|0)){av=av+1|0}else{a5=B;z=6949;break L9085}}if((av|0)==1){aL=aq;aM=ap;aN=ao;aO=an;aP=am;aQ=al;aR=s;break L9094}else{a5=B;z=6950;break L9085}}}while(0);c[13898]=ar+1;dl(ad,0);aL=aq;aM=ap;aN=ao;aO=an;aP=am;aQ=al;aR=s}else if((d|0)==1){au=(u|0)>(ar|0);L9285:do{if(au){do{if(!as){aE=c[K+(ar*40&-1)+36>>2]|0;C=K+(ar*40&-1)+32|0;aw=c[10036]|0;aH=0;while(1){if((aH|0)>=(aE|0)){z=6631;break}if((a[aw+((c[C>>2]|0)+aH|0)|0]|0)==(a[aH+188576|0]|0)){aH=aH+1|0}else{break}}do{if((z|0)==6631){z=0;if((aH|0)!=4){break}c[13898]=ar+1;dl(J,0);a8=c[13898]|0;C=(c[8272]|0)>(a8|0);if(!C){z=6967;break L9085}aw=c[1054]|0;L9296:do{if((a[aw+(a8*40&-1)|0]&1)==0){z=6640}else{aE=c[aw+(a8*40&-1)+36>>2]|0;aD=aw+(a8*40&-1)+32|0;at=c[10036]|0;a4=0;while(1){if((a4|0)>=(aE|0)){z=6637;break}if((a[at+((c[aD>>2]|0)+a4|0)|0]|0)==(a[a4+187176|0]|0)){a4=a4+1|0}else{break}}do{if((z|0)==6637){z=0;if((a4|0)!=2){break}c[13898]=a8+1;dl(I,0);break L9296}}while(0);if(C){z=6640}else{z=6970;break L9085}}}while(0);if((z|0)==6640){z=0;C=c[1054]|0;if((a[C+(a8*40&-1)|0]&1)==0){z=6971;break L9085}aw=c[C+(a8*40&-1)+36>>2]|0;a4=C+(a8*40&-1)+32|0;C=c[10036]|0;aD=0;while(1){if((aD|0)>=(aw|0)){break}if((a[C+((c[a4>>2]|0)+aD|0)|0]|0)==(a[aD+186688|0]|0)){aD=aD+1|0}else{z=6968;break L9085}}if((aD|0)!=3){z=6969;break L9085}c[13898]=a8+1;dl(I,c[F>>2]|0);if((c[F>>2]|0)!=(c[H>>2]|0)){z=6958;break L9085}if((c[M>>2]|0)!=(c[G>>2]|0)){z=6959;break L9085}h[x>>3]=+h[y>>3]+ +h[x>>3];h[D>>3]=+h[b>>3]+ +h[D>>3]}c[l>>2]=0;aL=aq;aM=ap;aN=ao;aO=1;aP=am;aQ=al;aR=s;break L9094}}while(0);if(!au){z=6659;break L9285}if(as){break}aH=c[K+(ar*40&-1)+36>>2]|0;a4=K+(ar*40&-1)+32|0;C=c[10036]|0;aw=0;while(1){if((aw|0)>=(aH|0)){break}if((a[C+((c[a4>>2]|0)+aw|0)|0]|0)==(a[aw+95280|0]|0)){aw=aw+1|0}else{z=6659;break L9285}}if((aw|0)==2){z=6667;break L9285}else{z=6659;break L9285}}}while(0);a9=c[K+(ar*40&-1)+36>>2]|0;ba=c[K+(ar*40&-1)+32>>2]|0}else{z=6659}}while(0);L9324:do{if((z|0)==6659){z=0;B=c[K+(ar*40&-1)+36>>2]|0;av=c[K+(ar*40&-1)+32>>2]|0;if(!((B|0)>0&(as^1))){a9=B;ba=av;break}a4=c[10036]|0;C=0;aH=0;at=av;while(1){if((a[C+185064|0]|0)==(a[a4+(C+at|0)|0]|0)){bb=at;bc=aH}else{if((C|0)!=3){a9=B;ba=av;break L9324}bb=at-1|0;bc=1}aE=C+1|0;if((aE|0)<(bc+B|0)){C=aE;aH=bc;at=bb}else{break}}if((bc|0)!=0){z=6667;break}if((C|0)==2|(C|0)==6){z=6667}else{a9=B;ba=av}}}while(0);if((z|0)==6667){z=0;c[13898]=ar+1;dl(L,0);c[l>>2]=1;aL=aq;aM=ap;aN=1;aO=an;aP=am;aQ=al;aR=s;break}if(!au){aS=ap;aT=an;aU=ar;aV=u;z=6859;break}if(as){aS=ap;aT=an;aU=ar;aV=u;z=6859;break}at=c[10036]|0;aH=0;while(1){if((aH|0)>=(a9|0)){break}if((a[at+(ba+aH|0)|0]|0)==(a[aH+130496|0]|0)){aH=aH+1|0}else{aS=ap;aT=an;aU=ar;aV=u;z=6859;break L9094}}if((aH|0)!=4){aS=ap;aT=an;aU=ar;aV=u;z=6859;break}c[13898]=ar+1;dl(w,0);c[l>>2]=1;aL=aq;aM=ap;aN=1;aO=an;aP=am;aQ=al;aR=s}else if((d|0)==4){L9346:do{if((u|0)<=(ar|0)|as){bd=ap}else{at=c[K+(ar*40&-1)+36>>2]|0;au=K+(ar*40&-1)+32|0;a4=c[10036]|0;aE=0;while(1){if((aE|0)>=(at|0)){break}if((a[a4+((c[au>>2]|0)+aE|0)|0]|0)==(a[aE+188576|0]|0)){aE=aE+1|0}else{bd=ap;break L9346}}if((aE|0)!=4){bd=ap;break}c[13898]=ar+1;au=db(c[p>>2]|0,40,182592)|0;c[p>>2]=au;dl(au,0);c[ak>>2]=1;bd=1}}while(0);aH=an;L9354:while(1){be=c[13898]|0;bf=c[8272]|0;au=(bf|0)>(be|0);if(!au){break}a4=c[1054]|0;do{if((a[a4+(be*40&-1)|0]&1)==0){z=6835}else{at=c[a4+(be*40&-1)+36>>2]|0;av=a4+(be*40&-1)+32|0;B=c[10036]|0;C=0;while(1){if((C|0)>=(at|0)){z=6833;break}if((a[B+((c[av>>2]|0)+C|0)|0]|0)==(a[C+187176|0]|0)){C=C+1|0}else{break}}if((z|0)==6833){z=0;if((C|0)==2){break}}if(au){z=6835}else{break L9354}}}while(0);if((z|0)==6835){z=0;au=c[1054]|0;if((a[au+(be*40&-1)|0]&1)==0){break}a4=c[au+(be*40&-1)+36>>2]|0;aE=au+(be*40&-1)+32|0;au=c[10036]|0;av=0;while(1){if((av|0)>=(a4|0)){break}if((a[au+((c[aE>>2]|0)+av|0)|0]|0)==(a[av+186688|0]|0)){av=av+1|0}else{break L9354}}if((av|0)!=3){break}}bg=c[p>>2]|0;if(!bd){z=6857;break L9085}c[p>>2]=db(bg,((c[ak>>2]|0)*40&-1)+40|0,182592)|0;aE=c[13898]|0;c[13898]=aE+1;L9374:do{if((c[8272]|0)>(aE|0)){au=c[1054]|0;if((a[au+(aE*40&-1)|0]&1)==0){z=6846;break}a4=c[au+(aE*40&-1)+36>>2]|0;B=au+(aE*40&-1)+32|0;au=c[10036]|0;at=0;while(1){if((at|0)>=(a4|0)){break}if((a[au+((c[B>>2]|0)+at|0)|0]|0)==(a[at+187176|0]|0)){at=at+1|0}else{z=6846;break L9374}}B=c[ak>>2]|0;au=c[p>>2]|0;a4=au+(B*40&-1)|0;if((at|0)!=2){bh=B;bi=au;bj=a4;z=6849;break}dl(a4,0)}else{z=6846}}while(0);if((z|0)==6846){z=0;aE=c[ak>>2]|0;av=c[p>>2]|0;bh=aE;bi=av;bj=av+(aE*40&-1)|0;z=6849}if((z|0)==6849){z=0;dl(bj,c[bi>>2]|0);aE=c[p>>2]|0;av=bh-1|0;if((c[aE+(bh*40&-1)>>2]|0)!=(c[aE+(av*40&-1)>>2]|0)){z=6972;break L9085}if((c[aE+(bh*40&-1)+4>>2]|0)!=(c[aE+(av*40&-1)+4>>2]|0)){z=6973;break L9085}a4=aE+(bh*40&-1)+16|0;h[a4>>3]=+h[aE+(av*40&-1)+16>>3]+ +h[a4>>3];a4=c[p>>2]|0;aE=a4+(bh*40&-1)+24|0;h[aE>>3]=+h[a4+(av*40&-1)+24>>3]+ +h[aE>>3]}c[ak>>2]=(c[ak>>2]|0)+1;aH=1}if(!aH){aS=bd;aT=0;aU=be;aV=bf;z=6859;break}aE=c[p>>2]|0;if((uG(aE+(((c[ak>>2]|0)-1|0)*40&-1)|0,aE|0,40)|0)==0){aS=bd;aT=1;aU=be;aV=bf;z=6859;break}aI(181096,44,1,c[m>>2]|0);aE=db(c[p>>2]|0,((c[ak>>2]|0)*40&-1)+40|0,182592)|0;av=aE;c[p>>2]=av;a4=av+((c[ak>>2]|0)*40&-1)|0;c[a4>>2]=c[aE>>2];c[a4+4>>2]=c[aE+4>>2];c[a4+8>>2]=c[aE+8>>2];c[a4+12>>2]=c[aE+12>>2];c[a4+16>>2]=c[aE+16>>2];c[a4+20>>2]=c[aE+20>>2];c[a4+24>>2]=c[aE+24>>2];c[a4+28>>2]=c[aE+28>>2];c[a4+32>>2]=c[aE+32>>2];c[a4+36>>2]=c[aE+36>>2];c[ak>>2]=(c[ak>>2]|0)+1;aS=bd;aT=1;aU=c[13898]|0;aV=c[8272]|0;z=6859}else{z=6858;break L9085}}while(0);L9392:do{if((z|0)==6859){z=0;K=(aV|0)>(aU|0);L9394:do{if(K){as=c[1054]|0;if((a[as+(aU*40&-1)|0]&1)!=0){aE=c[as+(aU*40&-1)+36>>2]|0;a4=as+(aU*40&-1)+32|0;as=c[10036]|0;av=0;while(1){if((av|0)>=(aE|0)){z=6864;break}if((a[as+((c[a4>>2]|0)+av|0)|0]|0)==(a[av+150856|0]|0)){av=av+1|0}else{break}}do{if((z|0)==6864){z=0;if((av|0)!=5){break}c[o>>2]=1;c[13898]=(c[13898]|0)+1;aL=aq;aM=aS;aN=ao;aO=aT;aP=am;aQ=al;aR=s;break L9392}}while(0);if(!K){z=6874;break}}av=c[1054]|0;L9406:do{if((a[av+(aU*40&-1)|0]&1)!=0){a4=c[av+(aU*40&-1)+36>>2]|0;as=av+(aU*40&-1)+32|0;aE=c[10036]|0;au=0;while(1){if((au|0)>=(a4|0)){break}if((a[aE+((c[as>>2]|0)+au|0)|0]|0)==(a[au+150704|0]|0)){au=au+1|0}else{break L9406}}if((au|0)!=4){break}c[o>>2]=0;c[13898]=(c[13898]|0)+1;aL=aq;aM=aS;aN=ao;aO=aT;aP=am;aQ=al;aR=s;break L9392}}while(0);if(!K){z=6874;break}av=c[1054]|0;as=a[av+(aU*40&-1)|0]|0;if((as&1)==0){bk=av;bl=as;break}aE=c[av+(aU*40&-1)+36>>2]|0;a4=av+(aU*40&-1)+32|0;at=c[10036]|0;B=0;while(1){if((B|0)>=(aE|0)){break}if((a[at+((c[a4>>2]|0)+B|0)|0]|0)==(a[B+121920|0]|0)){B=B+1|0}else{bk=av;bl=as;break L9394}}if((B|0)!=6){bk=av;bl=as;break}c[o>>2]=-1;c[13898]=(c[13898]|0)+1;aL=aq;aM=aS;aN=ao;aO=aT;aP=am;aQ=al;aR=s;break L9392}else{z=6874}}while(0);if((z|0)==6874){z=0;K=c[1054]|0;bk=K;bl=a[K+(aU*40&-1)|0]|0}K=c[bk+(aU*40&-1)+36>>2]|0;L9424:do{if((bl&1)!=0&(K|0)>0){aH=c[10036]|0;a4=0;at=0;aE=c[bk+(aU*40&-1)+32>>2]|0;while(1){if((a[a4+184456|0]|0)==(a[aH+(a4+aE|0)|0]|0)){bm=aE;bn=at}else{if((a4|0)!=3){break L9424}bm=aE-1|0;bn=1}C=a4+1|0;if((C|0)<(bn+K|0)){a4=C;at=bn;aE=bm}else{break}}if((bn|0)==0){if(!((a4|0)==2|(a4|0)==7)){break}}if(Y){z=6890;break L9085}c[O>>2]=-7;c[n>>2]=3;c[13898]=(c[13898]|0)+1;aL=aq;aM=aS;aN=ao;aO=aT;aP=am;aQ=1;aR=1;break L9392}}while(0);if(s){bo=aU}else{K=(c[S>>2]|0)==1?49176:49488;if(T){hJ(q,c[U>>2]|0,c[V>>2]|0,c[W>>2]|0,X)}else{hJ(q,c[K>>2]|0,c[K+4>>2]|0,c[K+8>>2]|0,K+16|0)}if((c[13898]|0)==(ar|0)){bo=ar}else{aL=aq;aM=aS;aN=ao;aO=aT;aP=am;aQ=al;aR=1;break}}if(al){bp=bo}else{K=c[1054]|0;aE=a[K+(bo*40&-1)|0]|0;L9447:do{if((c[8272]|0)>(bo|0)){if((aE&1)==0){z=6904;break}at=c[K+(bo*40&-1)+36>>2]|0;aH=K+(bo*40&-1)+32|0;as=c[10036]|0;av=0;while(1){if((av|0)>=(at|0)){break}if((a[as+((c[aH>>2]|0)+av|0)|0]|0)==(a[av+179168|0]|0)){av=av+1|0}else{z=6904;break L9447}}if((av|0)==2){z=6912}else{z=6904}}else{z=6904}}while(0);L9454:do{if((z|0)==6904){z=0;aH=c[K+(bo*40&-1)+36>>2]|0;if(!((aE&1)!=0&(aH|0)>0)){break}as=c[10036]|0;at=0;a4=0;B=c[K+(bo*40&-1)+32>>2]|0;while(1){if((a[at+178592|0]|0)==(a[as+(at+B|0)|0]|0)){bq=B;br=a4}else{if((at|0)!=5){break L9454}bq=B-1|0;br=1}C=at+1|0;if((C|0)<(br+aH|0)){at=C;a4=br;B=bq}else{break}}if((br|0)!=0){z=6912;break}if((at|0)==4|(at|0)==9){z=6912}}}while(0);do{if((z|0)==6912){z=0;a[N]=1;c[O>>2]=-2;hI(Q,5);if((c[R>>2]|0)!=0){break}c[O>>2]=-7}}while(0);if((c[13898]|0)==(ar|0)){bp=ar}else{aL=aq;aM=aS;aN=ao;aO=aT;aP=am;aQ=1;aR=s;break}}if(am){bs=bp;z=6960;break L9085}K=c[1054]|0;aE=a[K+(bp*40&-1)|0]|0;L9471:do{if((c[8272]|0)>(bp|0)){if((aE&1)==0){z=6922;break}B=c[K+(bp*40&-1)+36>>2]|0;a4=K+(bp*40&-1)+32|0;aH=c[10036]|0;as=0;while(1){if((as|0)>=(B|0)){break}if((a[aH+((c[a4>>2]|0)+as|0)|0]|0)==(a[as+128296|0]|0)){as=as+1|0}else{z=6922;break L9471}}if((as|0)==2){z=6930}else{z=6922}}else{z=6922}}while(0);L9478:do{if((z|0)==6922){z=0;a4=c[K+(bp*40&-1)+36>>2]|0;if(!((aE&1)!=0&(a4|0)>0)){bt=aq;break}aH=c[10036]|0;B=0;at=0;av=c[K+(bp*40&-1)+32>>2]|0;while(1){if((a[B+128400|0]|0)==(a[aH+(B+av|0)|0]|0)){bu=av;bv=at}else{if((B|0)!=5){bt=aq;break L9478}bu=av-1|0;bv=1}C=B+1|0;if((C|0)<(bv+a4|0)){B=C;at=bv;av=bu}else{break}}if((bv|0)!=0){z=6930;break}if((B|0)==4|(B|0)==9){z=6930}else{bt=aq}}}while(0);do{if((z|0)==6930){z=0;c[13898]=bp+1;K=is(k)|0;aE=c[K>>2]|0;if((aE|0)==2){bw=+h[K+8>>3]}else if((aE|0)==3){bw=+uz(c[K+8>>2]|0,0)}else if((aE|0)==1){bw=+(c[K+8>>2]|0)}else{z=6934;break L9085}if((c[E>>2]|0)!=3){bt=bw;break}uu(c[A>>2]|0);c[E>>2]=1;bt=bw}}while(0);if((c[13898]|0)==(ar|0)){bs=ar;z=6961;break L9085}else{aL=bt;aM=aS;aN=ao;aO=aT;aP=1;aQ=al;aR=s}}}while(0);K=c[13898]|0;aE=c[8272]|0;if((K|0)<(aE|0)){s=aR;al=aQ;am=aP;an=aO;ao=aN;ap=aM;aq=aL;ar=K;u=aE}else{ax=aP;ay=aO;az=aN;aA=aL;z=6939;break}}if((z|0)==6739){uf((c[13898]|0)-1|0,183928,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6962){uf(a$,210136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6963){uf(a$,210136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6964){uf(a$,210136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6965){uf(a$,210136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6966){uf(a$,210136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6967){uf(a8,185568,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6968){uf(a8,185568,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6969){uf(a8,185568,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6970){uf(a8,185568,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6971){uf(a8,185568,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6972){bx=c[13898]|0;uf(bx,186064,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6973){bx=c[13898]|0;uf(bx,186064,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6857){uu(bg);c[p>>2]=0;c[ak>>2]=0;uf(c[13898]|0,180752,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6858){uf(ar,180328,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6952){by=a5-1|0;c[13898]=by;uf(by,183096,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6953){by=a5-1|0;c[13898]=by;uf(by,183096,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6954){by=a5-1|0;c[13898]=by;uf(by,183096,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6955){by=a5-1|0;c[13898]=by;uf(by,183096,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6956){by=a5-1|0;c[13898]=by;uf(by,183096,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6957){by=a5-1|0;c[13898]=by;uf(by,183096,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6958){bz=c[13898]|0;uf(bz,186064,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6959){bz=c[13898]|0;uf(bz,186064,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6960){uf(bs,178144,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6961){uf(bs,178144,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6934){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6939){if(ax){h[r+64>>3]=aA}if(az&ay){uf(-1,177888,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{i=e;return}}else if((z|0)==6720){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6946){by=a5-1|0;c[13898]=by;uf(by,183096,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6947){by=a5-1|0;c[13898]=by;uf(by,183096,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6948){by=a5-1|0;c[13898]=by;uf(by,183096,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6949){by=a5-1|0;c[13898]=by;uf(by,183096,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6950){by=a5-1|0;c[13898]=by;uf(by,183096,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6951){by=a5-1|0;c[13898]=by;uf(by,183096,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6782){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6724){uf((c[13898]|0)-1|0,183928,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6735){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==6890){uf(aU,179496,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}function jy(){var b=0,d=0,e=0,f=0,j=0,k=0,l=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0.0,L=0,M=0.0,N=0,O=0,P=0,Q=0,R=0,S=0.0,T=0,U=0,V=0.0,W=0,X=0,Y=0,Z=0,_=0,$=0.0,aa=0,ab=0.0,ac=0.0,ad=0.0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0.0;b=i;i=i+120|0;d=b|0;e=b+24|0;f=b+48|0;j=b+72|0;k=b+96|0;l=c[13898]|0;o=l+1|0;c[13898]=o;p=c[1054]|0;q=c[p+(o*40&-1)+36>>2]|0;r=c[p+(o*40&-1)+32>>2]|0;s=(a[p+(o*40&-1)|0]&1)==0;t=(q|0)>0;u=c[10036]|0;w=21960;x=96232;L9545:while(1){L9547:do{if(!s){if(t){y=0;z=0;A=r;while(1){B=a[x+y|0]|0;if(B<<24>>24==(a[u+(y+A|0)|0]|0)){C=A;D=z}else{if(B<<24>>24!=36){break L9547}C=A-1|0;D=1}E=y+1|0;if((E|0)<(D+q|0)){y=E;z=D;A=C}else{break}}if((D|0)==0){F=E}else{G=w;break L9545}}else{F=0}A=a[x+F|0]|0;if((A<<24>>24|0)==36|(A<<24>>24|0)==0){G=w;break L9545}}}while(0);A=w+8|0;z=c[A>>2]|0;if((z|0)==0){G=A;break}else{w=A;x=z}}x=c[G+4>>2]|0;if((x|0)==0){H=75960;I=c[13898]|0;uf(I,H,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}G=l+2|0;c[13898]=G;do{if((x|0)==95){if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}if((c[17578]|0)==1){w=c[m>>2]|0;cf(w|0,198344,(v=i,i=i+8|0,c[v>>2]=57024,v)|0)}w=c[m>>2]|0;aF(9,w|0);je(c[m>>2]|0,8)}else if((x|0)==30){L9572:do{if((G|0)<(c[8272]|0)){L9574:do{if((a[p+(G*40&-1)|0]&1)!=0){w=c[p+(G*40&-1)+36>>2]|0;F=p+(G*40&-1)+32|0;E=0;while(1){if((E|0)>=(w|0)){break}if((a[u+((c[F>>2]|0)+E|0)|0]|0)==(a[E+103664|0]|0)){E=E+1|0}else{break L9574}}if((E|0)==1){J=0;break L9572}}}while(0);F=is(k)|0;w=c[F>>2]|0;if((w|0)==2){K=+h[F+8>>3]}else if((w|0)==3){K=+uz(c[F+8>>2]|0,0)}else if((w|0)==1){K=+(c[F+8>>2]|0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}F=k|0;if((c[F>>2]|0)==3){uu(c[k+8>>2]|0);c[F>>2]=1}F=~~K;if((F|0)<1){H=208936}else{J=F;break}I=c[13898]|0;uf(I,H,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{J=0}}while(0);aF(10,c[m>>2]|0);jM(J)}else if((x|0)==65){if(!(a[928]|0)){F=c[m>>2]|0;aF(10,F|0)}if((c[16718]|0)==1){F=c[m>>2]|0;cf(F|0,198344,(v=i,i=i+8|0,c[v>>2]=56904,v)|0)}aF(9,c[m>>2]|0);je(c[m>>2]|0,3)}else if((x|0)==18){if(!(a[928]|0)){F=c[m>>2]|0;aF(10,F|0)}cf(c[m>>2]|0,114368,(v=i,i=i+16|0,c[v>>2]=24544,c[v+8>>2]=24595,v)|0)}else if((x|0)==32){L9604:do{if((G|0)<(c[8272]|0)){L9606:do{if((a[p+(G*40&-1)|0]&1)!=0){F=c[p+(G*40&-1)+36>>2]|0;w=p+(G*40&-1)+32|0;D=0;while(1){if((D|0)>=(F|0)){break}if((a[u+((c[w>>2]|0)+D|0)|0]|0)==(a[D+103664|0]|0)){D=D+1|0}else{break L9606}}if((D|0)==1){L=7233;break L9604}}}while(0);w=is(e)|0;F=c[w>>2]|0;if((F|0)==2){M=+h[w+8>>3]}else if((F|0)==3){M=+uz(c[w+8>>2]|0,0)}else if((F|0)==1){M=+(c[w+8>>2]|0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}w=e|0;if((c[w>>2]|0)==3){uu(c[e+8>>2]|0);c[w>>2]=1}w=~~M;if((w|0)<1){H=208936;I=c[13898]|0;uf(I,H,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{F=c[m>>2]|0;aF(10,F|0);N=w;O=0;break}}else{L=7233}}while(0);if((L|0)==7233){w=c[m>>2]|0;aF(10,w|0);w=c[m>>2]|0;F=c[8798]|0;cf(w|0,76832,(v=i,i=i+8|0,c[v>>2]=F,v)|0);N=0;O=1}F=c[10816]|0;if((F|0)==0){P=0}else{w=0;E=F;while(1){F=c[E+4>>2]|0;if(O){Q=F;L=7237}else{if((F|0)==(N|0)){Q=N;L=7237}else{R=w}}if((L|0)==7237){L=0;F=c[m>>2]|0;cf(F|0,76280,(v=i,i=i+8|0,c[v>>2]=Q,v)|0);ji(c[m>>2]|0,E+8|0,1);F=c[m>>2]|0;aF(10,F|0);R=1}F=c[E>>2]|0;if((F|0)==0){P=R;break}else{w=R;E=F}}}if((N|0)<1|P){break}uf(c[13898]|0,75640,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((x|0)==39|(x|0)==40|(x|0)==41|(x|0)==42|(x|0)==38){jO()}else if((x|0)==58){if(!(a[928]|0)){E=c[m>>2]|0;aF(10,E|0)}E=c[8244]|0;w=c[m>>2]|0;if((E|0)==0){aI(134568,26,1,w|0);break}else{cf(w|0,134696,(v=i,i=i+8|0,c[v>>2]=E,v)|0);break}}else if((x|0)==60){jQ()}else if((x|0)==62){jW()}else if((x|0)==79){if(!(a[928]|0)){E=c[m>>2]|0;aF(10,E|0)}cf(c[m>>2]|0,172840,(v=i,i=i+8|0,c[v>>2]=(a[30528]&1)!=0?172456:172176,v)|0)}else if((x|0)==63){c[13898]=o;jR()}else if((x|0)==77){if(!(a[928]|0)){E=c[m>>2]|0;aF(10,E|0)}cf(c[m>>2]|0,167288,(v=i,i=i+8|0,h[v>>3]=+h[3818],v)|0)}else if((x|0)==59){if(!(a[928]|0)){E=c[m>>2]|0;aF(10,E|0)}cf(c[m>>2]|0,136080,(v=i,i=i+8|0,c[v>>2]=(a[32936]&1)!=0?172456:172176,v)|0)}else if((x|0)==61){jP()}else if((x|0)==110){if(!(a[928]|0)){E=c[m>>2]|0;aF(10,E|0)}E=(c[16546]|0)==1?141856:202784;cf(c[m>>2]|0,203352,(v=i,i=i+16|0,c[v>>2]=56880,c[v+8>>2]=E,v)|0)}else if((x|0)==129){if(!(a[928]|0)){E=c[m>>2]|0;aF(10,E|0)}E=(c[16374]|0)==1?141856:202784;cf(c[m>>2]|0,203352,(v=i,i=i+16|0,c[v>>2]=56856,c[v+8>>2]=E,v)|0)}else if((x|0)==101){if(!(a[928]|0)){E=c[m>>2]|0;aF(10,E|0)}E=(c[17234]|0)==1?141856:202784;cf(c[m>>2]|0,203352,(v=i,i=i+16|0,c[v>>2]=56976,c[v+8>>2]=E,v)|0)}else if((x|0)==149){if(!(a[928]|0)){E=c[m>>2]|0;aF(10,E|0)}if((c[17406]|0)==1){E=c[m>>2]|0;cf(E|0,198344,(v=i,i=i+8|0,c[v>>2]=57e3,v)|0)}aF(9,c[m>>2]|0);je(c[m>>2]|0,7)}else if((x|0)==19){if(!(a[928]|0)){E=c[m>>2]|0;aF(10,E|0)}cf(c[m>>2]|0,168248,(v=i,i=i+8|0,c[v>>2]=c[44936+(c[11252]<<2)>>2],v)|0);E=c[m>>2]|0;w=bA(2,0)|0;cf(E|0,167680,(v=i,i=i+8|0,c[v>>2]=w,v)|0)}else if((x|0)==21){jT()}else if((x|0)==22){if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}ur(2,0)}else if((x|0)==144){if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}if((c[16202]|0)==1){w=c[m>>2]|0;cf(w|0,198344,(v=i,i=i+8|0,c[v>>2]=56832,v)|0)}aF(9,c[m>>2]|0);je(c[m>>2]|0,0)}else if((x|0)==57){if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}S=+g[44];cf(c[m>>2]|0,183064,(v=i,i=i+16|0,h[v>>3]=+g[184],h[v+8>>3]=S,v)|0)}else if((x|0)==87){if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}w=c[3524]|0;E=c[m>>2]|0;if((w|0)==0){aI(183552,26,1,E|0);break}else{F=c[w>>2]|0;cf(E|0,183896,(v=i,i=i+16|0,c[v>>2]=F,c[v+8>>2]=13048,v)|0);break}}else if((x|0)==29){jJ()}else if((x|0)==153){jH(2)}else if((x|0)==14){H=134e3;I=c[13898]|0;uf(I,H,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((x|0)==107){if(!(a[928]|0)){F=c[m>>2]|0;aF(10,F|0)}if((c[17234]|0)==1){F=c[m>>2]|0;cf(F|0,198344,(v=i,i=i+8|0,c[v>>2]=56976,v)|0)}aF(9,c[m>>2]|0);je(c[m>>2]|0,6)}else if((x|0)==3){if(!(a[928]|0)){F=c[m>>2]|0;aF(10,F|0)}aI(174264,15,1,c[m>>2]|0);F=c[m>>2]|0;if(+h[9040]==1.0){aI(173624,8,1,F|0);break}else{aI(173192,8,1,F|0);break}}else if((x|0)==78){if(!(a[928]|0)){F=c[m>>2]|0;aF(10,F|0)}cf(c[m>>2]|0,166928,(v=i,i=i+8|0,h[v>>3]=+h[3817],v)|0)}else if((x|0)==20){jS()}else if((x|0)==126){if(!(a[928]|0)){F=c[m>>2]|0;aF(10,F|0)}if((c[17062]|0)==1){F=c[m>>2]|0;cf(F|0,198344,(v=i,i=i+8|0,c[v>>2]=56952,v)|0)}aF(9,c[m>>2]|0);je(c[m>>2]|0,5)}else if((x|0)==89|(x|0)==91|(x|0)==90|(x|0)==119){jZ(1,1,1,1,1,1)}else if((x|0)==48){j$(2)}else if((x|0)==52){j$(1)}else if((x|0)==54){j$(0)}else if((x|0)==68){j$(3)}else if((x|0)==46){j$(6)}else if((x|0)==50){j$(5)}else if((x|0)==93){if(!(a[928]|0)){F=c[m>>2]|0;aF(10,F|0)}j6(179864,141856,4672);cf(c[m>>2]|0,197424,(v=i,i=i+8|0,c[v>>2]=(c[1166]|0)!=0?196800:196168,v)|0);F=c[m>>2]|0;if((c[1164]|0)==0){aI(193896,14,1,F|0);break}else{aI(195648,36,1,F|0);break}}else if((x|0)==88){cf(c[m>>2]|0,91616,(v=i,i=i+8|0,c[v>>2]=(a[13048]|0)!=0?13048:84080,v)|0)}else if((x|0)==96){if(!(a[928]|0)){F=c[m>>2]|0;aF(10,F|0)}if((c[17750]|0)==1){F=c[m>>2]|0;cf(F|0,198344,(v=i,i=i+8|0,c[v>>2]=57048,v)|0)}aF(9,c[m>>2]|0);je(c[m>>2]|0,9)}else if((x|0)==15){j0()}else if((x|0)==70){if(!(a[928]|0)){F=c[m>>2]|0;aF(10,F|0)}F=(c[16718]|0)==1?141856:202784;cf(c[m>>2]|0,203352,(v=i,i=i+16|0,c[v>>2]=56904,c[v+8>>2]=F,v)|0)}else if((x|0)==92){j_()}else if((x|0)==116){if(!(a[928]|0)){F=c[m>>2]|0;aF(10,F|0)}if((c[16546]|0)==1){F=c[m>>2]|0;cf(F|0,198344,(v=i,i=i+8|0,c[v>>2]=56880,v)|0)}aF(9,c[m>>2]|0);je(c[m>>2]|0,2)}else if((x|0)==44){j1()}else if((x|0)==76){if(!(a[928]|0)){F=c[m>>2]|0;aF(10,F|0)}cf(c[m>>2]|0,222616,(v=i,i=i+8|0,c[v>>2]=c[6924],v)|0)}else if((x|0)==97){j2()}else if((x|0)==117|(x|0)==111|(x|0)==114){jZ(1,0,0,1,0,0)}else if((x|0)==136|(x|0)==130|(x|0)==133){jZ(0,1,0,0,1,0)}else if((x|0)==145|(x|0)==139|(x|0)==142){jZ(0,0,1,0,0,0)}else if((x|0)==66|(x|0)==71|(x|0)==73){jZ(0,0,0,0,0,1)}else if((x|0)==147){j4(7)}else if((x|0)==108|(x|0)==102|(x|0)==105){jZ(0,0,0,1,0,0)}else if((x|0)==127|(x|0)==121|(x|0)==124){jZ(0,0,0,0,1,0)}else if((x|0)==45){cf(c[m>>2]|0,121216,(v=i,i=i+8|0,c[v>>2]=(a[33512]&1)!=0?150376:150208,v)|0)}else if((x|0)==23){jF()}else if((x|0)==16){F=c[10812]|0;aI(123576,26,1,c[m>>2]|0);if((F|0)==0){break}else{T=F}do{F=c[T+12>>2]|0;E=c[m>>2]|0;if((F|0)==0){w=c[T+4>>2]|0;cf(E|0,123120,(v=i,i=i+8|0,c[v>>2]=w,v)|0)}else{cf(E|0,123448,(v=i,i=i+8|0,c[v>>2]=F,v)|0)}T=c[T>>2]|0;}while((T|0)!=0)}else if((x|0)==82){if(!(a[928]|0)){F=c[m>>2]|0;aF(10,F|0)}F=c[6350]|0;cf(c[m>>2]|0,174608,(v=i,i=i+16|0,c[v>>2]=c[6352],c[v+8>>2]=F,v)|0)}else if((x|0)==27){if(!(a[928]|0)){F=c[m>>2]|0;aF(10,F|0)}F=c[9342]|0;cf(c[m>>2]|0,174888,(v=i,i=i+16|0,c[v>>2]=c[9344],c[v+8>>2]=F,v)|0)}else if((x|0)==135){if(!(a[928]|0)){F=c[m>>2]|0;aF(10,F|0)}if((c[16374]|0)==1){F=c[m>>2]|0;cf(F|0,198344,(v=i,i=i+8|0,c[v>>2]=56856,v)|0)}aF(9,c[m>>2]|0);je(c[m>>2]|0,1)}else if((x|0)==34){if(!(a[928]|0)){F=c[m>>2]|0;aF(10,F|0)}F=c[m>>2]|0;E=bA(2,0)|0;cf(F|0,146672,(v=i,i=i+8|0,c[v>>2]=E,v)|0);cf(c[m>>2]|0,144576,(v=i,i=i+8|0,c[v>>2]=c[44936+(c[11252]<<2)>>2],v)|0);E=c[m>>2]|0;F=bA(5,0)|0;cf(E|0,142976,(v=i,i=i+8|0,c[v>>2]=F,v)|0);F=c[8270]|0;cf(c[m>>2]|0,141432,(v=i,i=i+8|0,c[v>>2]=(F|0)!=0?F:139696,v)|0)}else if((x|0)==33){if(!(a[928]|0)){F=c[m>>2]|0;aF(10,F|0)}uq(2,0)}else if((x|0)==151){if(!(a[928]|0)){F=c[m>>2]|0;aF(10,F|0)}cf(c[m>>2]|0,203824,(v=i,i=i+8|0,h[v>>3]=+h[11],v)|0)}else if((x|0)==31){L9824:do{if((G|0)<(c[8272]|0)){L9826:do{if((a[p+(G*40&-1)|0]&1)!=0){F=c[p+(G*40&-1)+36>>2]|0;E=p+(G*40&-1)+32|0;w=0;while(1){if((w|0)>=(F|0)){break}if((a[u+((c[E>>2]|0)+w|0)|0]|0)==(a[w+103664|0]|0)){w=w+1|0}else{break L9826}}if((w|0)==1){U=0;break L9824}}}while(0);E=is(f)|0;F=c[E>>2]|0;if((F|0)==1){V=+(c[E+8>>2]|0)}else if((F|0)==3){V=+uz(c[E+8>>2]|0,0)}else if((F|0)==2){V=+h[E+8>>3]}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}E=f|0;if((c[E>>2]|0)==3){uu(c[f+8>>2]|0);c[E>>2]=1}E=~~V;if((E|0)<1){H=208936}else{U=E;break}I=c[13898]|0;uf(I,H,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{U=0}}while(0);aF(10,c[m>>2]|0);E=c[10820]|0;if((E|0)==0){W=0}else{F=(U|0)==0;D=0;C=E;while(1){E=c[C+4>>2]|0;if(F){X=E;L=7214}else{if((E|0)==(U|0)){X=U;L=7214}else{Y=D}}if((L|0)==7214){L=0;E=c[m>>2]|0;cf(E|0,75168,(v=i,i=i+8|0,c[v>>2]=X,v)|0);ji(c[m>>2]|0,C+8|0,1);E=c[m>>2]|0;aF(10,E|0);Y=1}E=c[C>>2]|0;if((E|0)==0){W=Y;break}else{D=Y;C=E}}}if((U|0)<1|W){break}uf(c[13898]|0,74736,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((x|0)==94){if(!(a[928]|0)){C=c[m>>2]|0;aF(10,C|0)}j6(179864,154440,4416)}else if((x|0)==113){if(!(a[928]|0)){C=c[m>>2]|0;aF(10,C|0)}j6(56880,202256,66456)}else if((x|0)==132){if(!(a[928]|0)){C=c[m>>2]|0;aF(10,C|0)}j6(56856,202256,65768)}else if((x|0)==80){if(!(a[928]|0)){C=c[m>>2]|0;aF(10,C|0)}C=c[m>>2]|0;D=c[7262]|0;do{if((D|0)==(c[n>>2]|0)){Z=89880}else{if((D|0)==0){Z=89256;break}F=c[7260]|0;Z=(D|0)!=(C|0)&(F|0)!=0?F:89256}}while(0);cf(C|0,134848,(v=i,i=i+8|0,c[v>>2]=Z,v)|0)}else if((x|0)==11){jB()}else if((x|0)==10|(x|0)==13|(x|0)==12){jC()}else if((x|0)==17){jD()}else if((x|0)==36){if(!(a[928]|0)){D=c[m>>2]|0;aF(10,D|0)}cf(c[m>>2]|0,113600,(v=i,i=i+8|0,c[v>>2]=(a[43472]&1)!=0?179864:211688,v)|0)}else if((x|0)==37){jE()}else if((x|0)==4){L9884:do{if((G|0)<(c[8272]|0)){L9886:do{if((a[p+(G*40&-1)|0]&1)!=0){D=c[p+(G*40&-1)+36>>2]|0;F=p+(G*40&-1)+32|0;E=0;while(1){if((E|0)>=(D|0)){break}if((a[u+((c[F>>2]|0)+E|0)|0]|0)==(a[E+103664|0]|0)){E=E+1|0}else{break L9886}}if((E|0)==1){_=0;break L9884}}}while(0);F=is(j)|0;D=c[F>>2]|0;if((D|0)==2){$=+h[F+8>>3]}else if((D|0)==3){$=+uz(c[F+8>>2]|0,0)}else if((D|0)==1){$=+(c[F+8>>2]|0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}F=j|0;if((c[F>>2]|0)==3){uu(c[j+8>>2]|0);c[F>>2]=1}F=~~$;if((F|0)<1){H=208936}else{_=F;break}I=c[13898]|0;uf(I,H,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{_=0}}while(0);aF(10,c[m>>2]|0);jN(_)}else if((x|0)==5){jz()}else if((x|0)==6){if(!(a[928]|0)){C=c[m>>2]|0;aF(10,C|0)}S=+h[7077];C=c[m>>2]|0;if(S>0.0){F=(c[14156]|0)==0?150704:150856;cf(C|0,106368,(v=i,i=i+16|0,c[v>>2]=F,h[v+8>>3]=S,v)|0);break}else{aI(106320,33,1,C|0);break}}else if((x|0)==8){jA()}else if((x|0)==9){if(!(a[928]|0)){C=c[m>>2]|0;aF(10,C|0)}S=+h[7030];C=c[m>>2]|0;if(S<0.0){aI(106792,18,1,C|0);break}else{F=(a[56232]&1)!=0?106640:106608;cf(C|0,106688,(v=i,i=i+16|0,h[v>>3]=S,c[v+8>>2]=F,v)|0);break}}else if((x|0)==98){jI(c[m>>2]|0)}else if((x|0)==7){F=c[8272]|0;L9922:do{if((G|0)<(F|0)){C=G;while(1){L9925:do{if((a[p+(C*40&-1)|0]&1)!=0){D=c[p+(C*40&-1)+36>>2]|0;w=p+(C*40&-1)+32|0;q=0;while(1){if((q|0)>=(D|0)){break}if((a[u+((c[w>>2]|0)+q|0)|0]|0)==(a[q+103664|0]|0)){q=q+1|0}else{break L9925}}if((q|0)==1){aa=C;break L9922}}}while(0);E=C+1|0;c[13898]=E;if((E|0)<(F|0)){C=E}else{aa=E;break}}}else{aa=G}}while(0);c[13898]=aa-1;dV()}else if((x|0)==1){aF(10,c[m>>2]|0);kc(it()|0,0);c[13898]=(c[13898]|0)+1}else if((x|0)==2){a[928]=1;jI(c[m>>2]|0);jz();if(!(a[928]|0)){F=c[m>>2]|0;aF(10,F|0)}S=+h[7077];F=c[m>>2]|0;if(S>0.0){C=(c[14156]|0)==0?150704:150856;cf(F|0,106368,(v=i,i=i+16|0,c[v>>2]=C,h[v+8>>3]=S,v)|0)}else{aI(106320,33,1,F|0)}jA();if(!(a[928]|0)){F=c[m>>2]|0;aF(10,F|0)}S=+h[7030];F=c[m>>2]|0;if(S<0.0){aI(106792,18,1,F|0)}else{C=(a[56232]&1)!=0?106640:106608;cf(F|0,106688,(v=i,i=i+16|0,h[v>>3]=S,c[v+8>>2]=C,v)|0)}jB();C=c[m>>2]|0;if((a[35888]&1)==0){aI(107400,37,1,C|0)}else{cf(C|0,107464,(v=i,i=i+8|0,c[v>>2]=53520,v)|0)}jC();jD();if(!(a[928]|0)){C=c[m>>2]|0;aF(10,C|0)}cf(c[m>>2]|0,113600,(v=i,i=i+8|0,c[v>>2]=(a[43472]&1)!=0?179864:211688,v)|0);jE();if(!(a[928]|0)){C=c[m>>2]|0;aF(10,C|0)}cf(c[m>>2]|0,114368,(v=i,i=i+16|0,c[v>>2]=24544,c[v+8>>2]=24595,v)|0);jF();jX();jG();cf(c[m>>2]|0,125408,(v=i,i=i+8|0,c[v>>2]=(a[27776]&1)!=0?179864:211688,v)|0);jH(2);jH(1);jH(0);jM(0);jN(0);jK();jL();if(!(a[928]|0)){C=c[m>>2]|0;aF(10,C|0)}C=(c[8764]|0)==2?88392:179864;S=+h[4384];F=(c[6588]|0)==2?88392:179864;ab=+h[3296];E=(c[1057]|0)==2?88392:179864;ac=+h[531];w=(c[14091]|0)==2?88392:179864;ad=+h[7048];cf(c[m>>2]|0,89120,(v=i,i=i+72|0,c[v>>2]=132528,c[v+8>>2]=C,h[v+16>>3]=S,c[v+24>>2]=F,h[v+32>>3]=ab,c[v+40>>2]=E,h[v+48>>3]=ac,c[v+56>>2]=w,h[v+64>>3]=ad,v)|0);jO();if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}w=c[8244]|0;E=c[m>>2]|0;if((w|0)==0){aI(134568,26,1,E|0)}else{cf(E|0,134696,(v=i,i=i+8|0,c[v>>2]=w,v)|0)}if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}w=c[m>>2]|0;E=c[7262]|0;do{if((E|0)==(c[n>>2]|0)){ae=89880}else{if((E|0)==0){ae=89256;break}F=c[7260]|0;ae=(E|0)!=(w|0)&(F|0)!=0?F:89256}}while(0);cf(w|0,134848,(v=i,i=i+8|0,c[v>>2]=ae,v)|0);if(!(a[928]|0)){E=c[m>>2]|0;aF(10,E|0)}cf(c[m>>2]|0,136080,(v=i,i=i+8|0,c[v>>2]=(a[32936]&1)!=0?172456:172176,v)|0);jQ();jW();jP();if(!(a[928]|0)){E=c[m>>2]|0;aF(10,E|0)}cf(c[m>>2]|0,166928,(v=i,i=i+8|0,h[v>>3]=+h[3817],v)|0);if(!(a[928]|0)){E=c[m>>2]|0;aF(10,E|0)}cf(c[m>>2]|0,167288,(v=i,i=i+8|0,h[v>>3]=+h[3818],v)|0);if(!(a[928]|0)){E=c[m>>2]|0;aF(10,E|0)}cf(c[m>>2]|0,168248,(v=i,i=i+8|0,c[v>>2]=c[44936+(c[11252]<<2)>>2],v)|0);E=c[m>>2]|0;F=bA(2,0)|0;cf(E|0,167680,(v=i,i=i+8|0,c[v>>2]=F,v)|0);jS();jT();if(!(a[928]|0)){F=c[m>>2]|0;aF(10,F|0)}cf(c[m>>2]|0,172840,(v=i,i=i+8|0,c[v>>2]=(a[30528]&1)!=0?172456:172176,v)|0);if(!(a[928]|0)){F=c[m>>2]|0;aF(10,F|0)}aI(174264,15,1,c[m>>2]|0);F=c[m>>2]|0;if(+h[9040]==1.0){aI(173624,8,1,F|0)}else{aI(173192,8,1,F|0)}jj(c[m>>2]|0,0);if(!(a[928]|0)){F=c[m>>2]|0;aF(10,F|0)}F=c[6350]|0;cf(c[m>>2]|0,174608,(v=i,i=i+16|0,c[v>>2]=c[6352],c[v+8>>2]=F,v)|0);if(!(a[928]|0)){F=c[m>>2]|0;aF(10,F|0)}F=c[9342]|0;cf(c[m>>2]|0,174888,(v=i,i=i+16|0,c[v>>2]=c[9344],c[v+8>>2]=F,v)|0);jV();if(!(a[928]|0)){F=c[m>>2]|0;aF(10,F|0)}cf(c[m>>2]|0,178568,(v=i,i=i+8|0,c[v>>2]=(a[46752]&1)!=0?179864:211688,v)|0);if(!(a[928]|0)){F=c[m>>2]|0;aF(10,F|0)}cf(c[m>>2]|0,179872,(v=i,i=i+8|0,c[v>>2]=(a[38984]&1)!=0?179488:179160,v)|0);gp();jY();if(!(a[928]|0)){F=c[m>>2]|0;aF(10,F|0)}ad=+g[44];cf(c[m>>2]|0,183064,(v=i,i=i+16|0,h[v>>3]=+g[184],h[v+8>>3]=ad,v)|0);if(!(a[928]|0)){F=c[m>>2]|0;aF(10,F|0)}F=c[3524]|0;E=c[m>>2]|0;if((F|0)==0){aI(183552,26,1,E|0)}else{C=c[F>>2]|0;cf(E|0,183896,(v=i,i=i+16|0,c[v>>2]=C,c[v+8>>2]=13048,v)|0)}jZ(1,1,1,1,1,1);j$(2);j$(1);j$(0);j$(6);j$(5);j6(179864,141856,4672);if((a[32936]&1)==0){if((a[30528]&1)!=0){L=7049}}else{L=7049}do{if((L|0)==7049){C=a[928]|0;if((a[37384]&1)==0){if(!C){E=c[m>>2]|0;aF(10,E|0)}if((c[17578]|0)==1){E=c[m>>2]|0;cf(E|0,198344,(v=i,i=i+8|0,c[v>>2]=57024,v)|0)}E=c[m>>2]|0;aF(9,E|0);je(c[m>>2]|0,8);break}if(!C){C=c[m>>2]|0;aF(10,C|0)}if((c[17750]|0)==1){C=c[m>>2]|0;cf(C|0,198344,(v=i,i=i+8|0,c[v>>2]=57048,v)|0)}C=c[m>>2]|0;aF(9,C|0);je(c[m>>2]|0,9);if(!(a[928]|0)){C=c[m>>2]|0;aF(10,C|0)}if((c[17922]|0)==1){C=c[m>>2]|0;cf(C|0,198344,(v=i,i=i+8|0,c[v>>2]=57072,v)|0)}C=c[m>>2]|0;aF(9,C|0);je(c[m>>2]|0,10)}}while(0);if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}if((c[16546]|0)==1){w=c[m>>2]|0;cf(w|0,198344,(v=i,i=i+8|0,c[v>>2]=56880,v)|0)}aF(9,c[m>>2]|0);je(c[m>>2]|0,2);if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}if((c[16374]|0)==1){w=c[m>>2]|0;cf(w|0,198344,(v=i,i=i+8|0,c[v>>2]=56856,v)|0)}aF(9,c[m>>2]|0);je(c[m>>2]|0,1);if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}if((c[17234]|0)==1){w=c[m>>2]|0;cf(w|0,198344,(v=i,i=i+8|0,c[v>>2]=56976,v)|0)}aF(9,c[m>>2]|0);je(c[m>>2]|0,6);if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}if((c[17062]|0)==1){w=c[m>>2]|0;cf(w|0,198344,(v=i,i=i+8|0,c[v>>2]=56952,v)|0)}aF(9,c[m>>2]|0);je(c[m>>2]|0,5);if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}if((c[16202]|0)==1){w=c[m>>2]|0;cf(w|0,198344,(v=i,i=i+8|0,c[v>>2]=56832,v)|0)}aF(9,c[m>>2]|0);je(c[m>>2]|0,0);if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}j6(179864,154440,4416);if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}j6(56880,202256,66456);if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}j6(56856,202256,65768);if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}j6(56832,202256,65080);if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}j6(56976,202256,69208);if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}j6(56952,202256,68520);if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}w=(c[16546]|0)==1?141856:202784;cf(c[m>>2]|0,203352,(v=i,i=i+16|0,c[v>>2]=56880,c[v+8>>2]=w,v)|0);if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}w=(c[16374]|0)==1?141856:202784;cf(c[m>>2]|0,203352,(v=i,i=i+16|0,c[v>>2]=56856,c[v+8>>2]=w,v)|0);if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}w=(c[17234]|0)==1?141856:202784;cf(c[m>>2]|0,203352,(v=i,i=i+16|0,c[v>>2]=56976,c[v+8>>2]=w,v)|0);if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}w=(c[17062]|0)==1?141856:202784;cf(c[m>>2]|0,203352,(v=i,i=i+16|0,c[v>>2]=56952,c[v+8>>2]=w,v)|0);if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}w=(c[16202]|0)==1?141856:202784;cf(c[m>>2]|0,203352,(v=i,i=i+16|0,c[v>>2]=56832,c[v+8>>2]=w,v)|0);j_();if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}uq(2,0);if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}ur(2,0);jU();if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}w=c[m>>2]|0;C=bA(2,0)|0;cf(w|0,146672,(v=i,i=i+8|0,c[v>>2]=C,v)|0);cf(c[m>>2]|0,144576,(v=i,i=i+8|0,c[v>>2]=c[44936+(c[11252]<<2)>>2],v)|0);C=c[m>>2]|0;w=bA(5,0)|0;cf(C|0,142976,(v=i,i=i+8|0,c[v>>2]=w,v)|0);w=c[8270]|0;cf(c[m>>2]|0,141432,(v=i,i=i+8|0,c[v>>2]=(w|0)!=0?w:139696,v)|0);if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}cf(c[m>>2]|0,203824,(v=i,i=i+8|0,h[v>>3]=+h[11],v)|0);j0();j1();if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}cf(c[m>>2]|0,222616,(v=i,i=i+8|0,c[v>>2]=c[6924],v)|0);j2();w=c[10812]|0;aI(123576,26,1,c[m>>2]|0);if((w|0)!=0){C=w;do{w=c[C+12>>2]|0;E=c[m>>2]|0;if((w|0)==0){F=c[C+4>>2]|0;cf(E|0,123120,(v=i,i=i+8|0,c[v>>2]=F,v)|0)}else{cf(E|0,123448,(v=i,i=i+8|0,c[v>>2]=w,v)|0)}C=c[C>>2]|0;}while((C|0)!=0)}a[928]=0}else if((x|0)==99){jV()}else if((x|0)==85){jX()}else if((x|0)==84){if(!(a[928]|0)){C=c[m>>2]|0;aF(10,C|0)}cf(c[m>>2]|0,178568,(v=i,i=i+8|0,c[v>>2]=(a[46752]&1)!=0?179864:211688,v)|0)}else if((x|0)==25){if(!(a[928]|0)){C=c[m>>2]|0;aF(10,C|0)}cf(c[m>>2]|0,179872,(v=i,i=i+8|0,c[v>>2]=(a[38984]&1)!=0?179488:179160,v)|0);gp()}else if((x|0)==83){jY()}else if((x|0)==141){if(!(a[928]|0)){C=c[m>>2]|0;aF(10,C|0)}j6(56832,202256,65080)}else if((x|0)==64){if(!(a[928]|0)){C=c[m>>2]|0;aF(10,C|0)}j6(56904,202256,67144)}else if((x|0)==104){if(!(a[928]|0)){C=c[m>>2]|0;aF(10,C|0)}j6(56976,202256,69208)}else if((x|0)==123){if(!(a[928]|0)){C=c[m>>2]|0;aF(10,C|0)}j6(56952,202256,68520)}else if((x|0)==81){jU()}else if((x|0)==75){C=c[p+(G*40&-1)+36>>2]|0;L10161:do{if((a[p+(G*40&-1)|0]&1)!=0&(C|0)>0){w=0;E=0;F=c[p+(G*40&-1)+32>>2]|0;while(1){if((a[w+115824|0]|0)==(a[u+(w+F|0)|0]|0)){af=F;ag=E}else{if((w|0)!=4){ah=G;break L10161}af=F-1|0;ag=1}D=w+1|0;if((D|0)<(ag+C|0)){w=D;E=ag;F=af}else{break}}if((ag|0)==0){if(!((w|0)==3|(w|0)==9)){ah=G;break}}F=l+3|0;c[13898]=F;ah=F}else{ah=G}}while(0);L10173:do{if((ah|0)<(c[8272]|0)){L10175:do{if((a[p+(ah*40&-1)|0]&1)!=0){C=c[p+(ah*40&-1)+36>>2]|0;F=p+(ah*40&-1)+32|0;E=0;while(1){if((E|0)>=(C|0)){break}if((a[u+((c[F>>2]|0)+E|0)|0]|0)==(a[E+103664|0]|0)){E=E+1|0}else{break L10175}}if((E|0)==1){ai=0;break L10173}}}while(0);w=is(d)|0;F=c[w>>2]|0;if((F|0)==1){aj=+(c[w+8>>2]|0)}else if((F|0)==2){aj=+h[w+8>>3]}else if((F|0)==3){aj=+uz(c[w+8>>2]|0,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}w=d|0;if((c[w>>2]|0)==3){uu(c[d+8>>2]|0);c[w>>2]=1}w=~~aj;if((w|0)<1){H=208936}else{ai=w;break}I=c[13898]|0;uf(I,H,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{ai=0}}while(0);aF(10,c[m>>2]|0);jj(c[m>>2]|0,ai)}else if((x|0)==120){if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}w=(c[17062]|0)==1?141856:202784;cf(c[m>>2]|0,203352,(v=i,i=i+16|0,c[v>>2]=56952,c[v+8>>2]=w,v)|0)}else if((x|0)==138){if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}w=(c[16202]|0)==1?141856:202784;cf(c[m>>2]|0,203352,(v=i,i=i+16|0,c[v>>2]=56832,c[v+8>>2]=w,v)|0)}else if((x|0)==24){jG()}else if((x|0)==150){cf(c[m>>2]|0,125408,(v=i,i=i+8|0,c[v>>2]=(a[27776]&1)!=0?179864:211688,v)|0)}else if((x|0)==152){jH(2);jH(1);jH(0)}else if((x|0)==155){jH(1)}else if((x|0)==154){jH(6)}else if((x|0)==156){jH(5)}else if((x|0)==157){jH(0)}else if((x|0)==28){jK()}else if((x|0)==35){jL()}else if((x|0)==56){if(!(a[928]|0)){w=c[m>>2]|0;aF(10,w|0)}w=(c[8764]|0)==2?88392:179864;ad=+h[4384];F=(c[6588]|0)==2?88392:179864;ac=+h[3296];C=(c[1057]|0)==2?88392:179864;ab=+h[531];D=(c[14091]|0)==2?88392:179864;S=+h[7048];cf(c[m>>2]|0,89120,(v=i,i=i+72|0,c[v>>2]=132528,c[v+8>>2]=w,h[v+16>>3]=ad,c[v+24>>2]=F,h[v+32>>3]=ac,c[v+40>>2]=C,h[v+48>>3]=ab,c[v+56>>2]=D,h[v+64>>3]=S,v)|0)}else if((x|0)==100){if(!(a[928]|0)){D=c[m>>2]|0;aF(10,D|0)}if((c[17922]|0)==1){D=c[m>>2]|0;cf(D|0,198344,(v=i,i=i+8|0,c[v>>2]=57072,v)|0)}aF(9,c[m>>2]|0);je(c[m>>2]|0,10)}else{H=223488;I=c[13898]|0;uf(I,H,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);a[25280]=0;aF(10,c[m>>2]|0);i=b;return}function jz(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0;b=i;if(!(a[928]|0)){d=c[m>>2]|0;aF(10,d|0)}aI(106224,16,1,c[m>>2]|0);do{if((a[32936]&1)!=0){if((a[37384]&1)==0){d=c[17711]|0;e=c[m>>2]|0;f=d&3;g=(f|0)!=0?172456:172176;h=(f|0)==1?105824:179864;j=(f|0)==2?105728:179864;f=(d&4|0)!=0?105664:179864;k=(d&8|0)!=0?105608:179864;cf(e|0,105872,(v=i,i=i+48|0,c[v>>2]=57048,c[v+8>>2]=g,c[v+16>>2]=h,c[v+24>>2]=j,c[v+32>>2]=f,c[v+40>>2]=k,v)|0);k=c[17883]|0;f=c[m>>2]|0;j=k&3;h=(j|0)!=0?172456:172176;g=(j|0)==1?105824:179864;e=(j|0)==2?105728:179864;j=(k&4|0)!=0?105664:179864;d=(k&8|0)!=0?105608:179864;cf(f|0,105872,(v=i,i=i+48|0,c[v>>2]=57072,c[v+8>>2]=h,c[v+16>>2]=g,c[v+24>>2]=e,c[v+32>>2]=j,c[v+40>>2]=d,v)|0);break}else{d=c[17539]|0;j=c[m>>2]|0;e=d&3;g=(e|0)!=0?172456:172176;h=(e|0)==1?105824:179864;f=(e|0)==2?105728:179864;e=(d&4|0)!=0?105664:179864;k=(d&8|0)!=0?105608:179864;cf(j|0,105872,(v=i,i=i+48|0,c[v>>2]=57024,c[v+8>>2]=g,c[v+16>>2]=h,c[v+24>>2]=f,c[v+32>>2]=e,c[v+40>>2]=k,v)|0);break}}}while(0);if((a[30528]&1)!=0){k=c[17367]|0;e=c[m>>2]|0;f=k&3;h=(f|0)!=0?172456:172176;g=(f|0)==1?105824:179864;j=(f|0)==2?105728:179864;f=(k&4|0)!=0?105664:179864;d=(k&8|0)!=0?105608:179864;cf(e|0,105872,(v=i,i=i+48|0,c[v>>2]=57e3,c[v+8>>2]=h,c[v+16>>2]=g,c[v+24>>2]=j,c[v+32>>2]=f,c[v+40>>2]=d,v)|0)}d=c[16507]|0;f=d&3;cf(c[m>>2]|0,105872,(v=i,i=i+48|0,c[v>>2]=56880,c[v+8>>2]=(f|0)!=0?172456:172176,c[v+16>>2]=(f|0)==1?105824:179864,c[v+24>>2]=(f|0)==2?105728:179864,c[v+32>>2]=(d&4|0)!=0?105664:179864,c[v+40>>2]=(d&8|0)!=0?105608:179864,v)|0);d=c[16335]|0;f=d&3;cf(c[m>>2]|0,105872,(v=i,i=i+48|0,c[v>>2]=56856,c[v+8>>2]=(f|0)!=0?172456:172176,c[v+16>>2]=(f|0)==1?105824:179864,c[v+24>>2]=(f|0)==2?105728:179864,c[v+32>>2]=(d&4|0)!=0?105664:179864,c[v+40>>2]=(d&8|0)!=0?105608:179864,v)|0);aI(105360,17,1,c[m>>2]|0);d=c[17195]|0;f=d&3;cf(c[m>>2]|0,105872,(v=i,i=i+48|0,c[v>>2]=56976,c[v+8>>2]=(f|0)!=0?172456:172176,c[v+16>>2]=(f|0)==1?105824:179864,c[v+24>>2]=(f|0)==2?105728:179864,c[v+32>>2]=(d&4|0)!=0?105664:179864,c[v+40>>2]=(d&8|0)!=0?105608:179864,v)|0);d=c[17023]|0;f=d&3;cf(c[m>>2]|0,105872,(v=i,i=i+48|0,c[v>>2]=56952,c[v+8>>2]=(f|0)!=0?172456:172176,c[v+16>>2]=(f|0)==1?105824:179864,c[v+24>>2]=(f|0)==2?105728:179864,c[v+32>>2]=(d&4|0)!=0?105664:179864,c[v+40>>2]=(d&8|0)!=0?105608:179864,v)|0);aI(105360,17,1,c[m>>2]|0);d=c[16163]|0;f=d&3;cf(c[m>>2]|0,105872,(v=i,i=i+48|0,c[v>>2]=56832,c[v+8>>2]=(f|0)!=0?172456:172176,c[v+16>>2]=(f|0)==1?105824:179864,c[v+24>>2]=(f|0)==2?105728:179864,c[v+32>>2]=(d&4|0)!=0?105664:179864,c[v+40>>2]=(d&8|0)!=0?105608:179864,v)|0);d=c[16679]|0;f=d&3;cf(c[m>>2]|0,105872,(v=i,i=i+48|0,c[v>>2]=56904,c[v+8>>2]=(f|0)!=0?172456:172176,c[v+16>>2]=(f|0)==1?105824:179864,c[v+24>>2]=(f|0)==2?105728:179864,c[v+32>>2]=(d&4|0)!=0?105664:179864,c[v+40>>2]=(d&8|0)!=0?105608:179864,v)|0);i=b;return}function jA(){var b=0,d=0,e=0,f=0;b=i;if(!(a[928]|0)){d=c[m>>2]|0;aF(10,d|0)}d=c[11692]|0;e=c[m>>2]|0;if((d|0)==0){aI(106520,21,1,e|0);i=b;return}else{f=(c[14088]|0)==0?150704:150856;cf(e|0,106440,(v=i,i=i+16|0,c[v>>2]=d,c[v+8>>2]=f,v)|0);ji(c[m>>2]|0,56296,0);f=c[m>>2]|0;aF(10,f|0);i=b;return}}function jB(){var b=0,d=0;b=i;if(!(a[928]|0)){d=c[m>>2]|0;aF(10,d|0)}cf(c[m>>2]|0,107344,(v=i,i=i+8|0,c[v>>2]=(a[54144]&1)!=0?172456:172176,v)|0);d=c[m>>2]|0;if((a[54160]&1)==0){aI(107184,55,1,d|0)}else{aI(107256,64,1,d|0)}d=c[m>>2]|0;if((a[54152]&1)==0){aI(106872,47,1,d|0);i=b;return}else{aI(107096,56,1,d|0);i=b;return}}function jC(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,n=0.0,o=0.0;b=i;if(!(a[928]|0)){d=c[m>>2]|0;aF(10,d|0)}cf(c[m>>2]|0,110616,(v=i,i=i+8|0,c[v>>2]=(c[11690]|0)!=0?179160:109736,v)|0);if((c[11690]|0)==0){i=b;return}cf(c[m>>2]|0,109312,(v=i,i=i+8|0,c[v>>2]=c[13374],v)|0);d=c[11690]|0;if((d|0)==1){e=c[m>>2]|0;aI(108736,10,1,e|0)}else if((d|0)==2){aI(108488,8,1,c[m>>2]|0)}else if((d|0)==3){aI(108392,22,1,c[m>>2]|0)}d=c[13378]|0;if((d|0)==0){e=c[m>>2]|0;aI(108304,21,1,e|0)}else if((d|0)==1){cf(c[m>>2]|0,108216,(v=i,i=i+8|0,c[v>>2]=c[13366],v)|0)}else if((d|0)==2){d=c[13366]|0;cf(c[m>>2]|0,108128,(v=i,i=i+16|0,c[v>>2]=c[13368],c[v+8>>2]=d,v)|0)}d=c[13372]|0;if((d|0)==0){e=c[m>>2]|0;f=c[13374]|0;cf(e|0,108056,(v=i,i=i+8|0,c[v>>2]=f,v)|0)}else if((d|0)==2){cf(c[m>>2]|0,107816,(v=i,i=i+8|0,c[v>>2]=c[13374],v)|0);cf(c[m>>2]|0,170912,(v=i,i=i+8|0,h[v>>3]=+h[c[11662]>>3],v)|0);f=c[m>>2]|0;if((c[13374]|0)>1){e=1;g=f;while(1){cf(g|0,107648,(v=i,i=i+8|0,h[v>>3]=+h[(c[11662]|0)+(e<<3)>>3],v)|0);j=e+1|0;k=c[m>>2]|0;if((j|0)<(c[13374]|0)){e=j;g=k}else{l=k;break}}}else{l=f}aF(10,l|0)}else if((d|0)==1){d=c[13374]|0;l=c[11662]|0;n=+h[l>>3];o=+h[l+8>>3];cf(c[m>>2]|0,107544,(v=i,i=i+32|0,c[v>>2]=d,h[v+8>>3]=n,h[v+16>>3]=o,h[v+24>>3]=n+ +(d-1|0)*o,v)|0)}d=c[m>>2]|0;if((a[35888]&1)==0){aI(107400,37,1,d|0);i=b;return}else{cf(d|0,107464,(v=i,i=i+8|0,c[v>>2]=53520,v)|0);i=b;return}}function jD(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,n=0.0,o=0.0;b=i;if(!(a[928]|0)){d=c[m>>2]|0;aF(10,d|0)}if((a[47032]&1)==0){d=c[m>>2]|0;aI(111136,25,1,d|0);i=b;return}d=c[11752]|0;if((d|0)==1){e=c[m>>2]|0;f=c[11732]|0;g=c[11756]|0;j=c[11734]|0;cf(e|0,113384,(v=i,i=i+24|0,c[v>>2]=f,c[v+8>>2]=g,c[v+16>>2]=j,v)|0);i=b;return}j=c[m>>2]|0;g=c[11732]|0;f=c[11756]|0;if((d|0)==2){cf(j|0,113272,(v=i,i=i+16|0,c[v>>2]=g,c[v+8>>2]=f,v)|0);i=b;return}else{k=-1}while(1){e=k+1|0;if((e|0)==7){l=0;break}if((c[46948+(e<<3)>>2]|0)==(d|0)){l=c[46944+(e<<3)>>2]|0;break}else{k=e}}n=+h[5865];o=+h[5864];k=(a[47016]&1)!=0?112728:179864;cf(j|0,113e3,(v=i,i=i+48|0,c[v>>2]=g,c[v+8>>2]=f,c[v+16>>2]=l,h[v+24>>3]=n,h[v+32>>3]=o,c[v+40>>2]=k,v)|0);i=b;return}function jE(){var b=0,d=0;if(!(a[928]|0)){b=c[m>>2]|0;aF(10,b|0)}aI(114040,25,1,c[m>>2]|0);b=c[8732]|0;if((b|0)==1){d=c[m>>2]|0;aI(113784,10,1,d|0);return}else if((b|0)==0){aI(113904,10,1,c[m>>2]|0);return}else if((b|0)==2){aI(113712,12,1,c[m>>2]|0);return}else{return}}function jF(){var b=0,d=0,e=0;b=i;if(!(a[928]|0)){d=c[m>>2]|0;aF(10,d|0)}aI(114560,16,1,c[m>>2]|0);d=c[m>>2]|0;e=j3(66240)|0;cf(d|0,114480,(v=i,i=i+16|0,c[v>>2]=56880,c[v+8>>2]=e,v)|0);e=c[m>>2]|0;d=j3(65552)|0;cf(e|0,114480,(v=i,i=i+16|0,c[v>>2]=56856,c[v+8>>2]=d,v)|0);d=c[m>>2]|0;e=j3(68992)|0;cf(d|0,114480,(v=i,i=i+16|0,c[v>>2]=56976,c[v+8>>2]=e,v)|0);e=c[m>>2]|0;d=j3(68304)|0;cf(e|0,114480,(v=i,i=i+16|0,c[v>>2]=56952,c[v+8>>2]=d,v)|0);d=c[m>>2]|0;e=j3(64864)|0;cf(d|0,114480,(v=i,i=i+16|0,c[v>>2]=56832,c[v+8>>2]=e,v)|0);e=c[m>>2]|0;d=j3(66928)|0;cf(e|0,114480,(v=i,i=i+16|0,c[v>>2]=56904,c[v+8>>2]=d,v)|0);d=c[m>>2]|0;e=j3(69680)|0;cf(d|0,114480,(v=i,i=i+16|0,c[v>>2]=57e3,c[v+8>>2]=e,v)|0);i=b;return}function jG(){var b=0,d=0,e=0,f=0,g=0.0,j=0.0,k=0.0,l=0;b=i;if(a[928]|0){d=0}else{e=c[m>>2]|0;aF(10,e|0);d=0}while(1){if(d>>>0>=8){f=7559;break}if((a[65036+(d*688&-1)|0]&1)!=0){break}if((a[65037+(d*688&-1)|0]&1)==0){d=d+1|0}else{break}}if((f|0)==7559){f=c[m>>2]|0;aI(125328,13,1,f|0);i=b;return}cf(c[m>>2]|0,125104,(v=i,i=i+8|0,c[v>>2]=+h[3815]!=0.0?124928:124832,v)|0);if((a[66412]&1)!=0){f=c[m>>2]|0;cf(f|0,124744,(v=i,i=i+8|0,c[v>>2]=56880,v)|0)}if((a[66413]&1)!=0){f=c[m>>2]|0;cf(f|0,124664,(v=i,i=i+8|0,c[v>>2]=56880,v)|0)}if((a[65724]&1)!=0){f=c[m>>2]|0;cf(f|0,124744,(v=i,i=i+8|0,c[v>>2]=56856,v)|0)}if((a[65725]&1)!=0){f=c[m>>2]|0;cf(f|0,124664,(v=i,i=i+8|0,c[v>>2]=56856,v)|0)}if((a[69164]&1)!=0){f=c[m>>2]|0;cf(f|0,124744,(v=i,i=i+8|0,c[v>>2]=56976,v)|0)}if((a[69165]&1)!=0){f=c[m>>2]|0;cf(f|0,124664,(v=i,i=i+8|0,c[v>>2]=56976,v)|0)}if((a[68476]&1)!=0){f=c[m>>2]|0;cf(f|0,124744,(v=i,i=i+8|0,c[v>>2]=56952,v)|0)}if((a[68477]&1)!=0){f=c[m>>2]|0;cf(f|0,124664,(v=i,i=i+8|0,c[v>>2]=56952,v)|0)}if((a[65036]&1)!=0){f=c[m>>2]|0;cf(f|0,124744,(v=i,i=i+8|0,c[v>>2]=56832,v)|0)}if((a[65037]&1)!=0){f=c[m>>2]|0;cf(f|0,124664,(v=i,i=i+8|0,c[v>>2]=56832,v)|0)}if((a[67100]&1)!=0){f=c[m>>2]|0;cf(f|0,124744,(v=i,i=i+8|0,c[v>>2]=56904,v)|0)}if((a[67101]&1)!=0){f=c[m>>2]|0;cf(f|0,124664,(v=i,i=i+8|0,c[v>>2]=56904,v)|0)}if((a[69852]&1)!=0){f=c[m>>2]|0;cf(f|0,124744,(v=i,i=i+8|0,c[v>>2]=57e3,v)|0)}if((a[69853]&1)!=0){f=c[m>>2]|0;cf(f|0,124664,(v=i,i=i+8|0,c[v>>2]=57e3,v)|0)}aI(124552,6,1,c[m>>2]|0);aI(124400,22,1,c[m>>2]|0);ji(c[m>>2]|0,40048,0);aI(124312,23,1,c[m>>2]|0);ji(c[m>>2]|0,34776,0);aF(10,c[m>>2]|0);g=+h[3815];if(g!=0.0){f=c[m>>2]|0;j=+h[9040];k=g/j;d=j==1.0?124080:123976;cf(f|0,124200,(v=i,i=i+16|0,h[v>>3]=k,c[v+8>>2]=d,v)|0)}d=c[10026]|0;if((d|0)==-1){l=123760}else{l=(d|0)==0?150704:150856}cf(c[m>>2]|0,123840,(v=i,i=i+8|0,c[v>>2]=l,v)|0);i=b;return}function jH(b){b=b|0;var d=0,e=0,f=0,g=0;d=i;e=b;while(1){if(!(a[928]|0)){b=c[m>>2]|0;aF(10,b|0)}b=c[m>>2]|0;f=56832+(e*24&-1)|0;if((c[65284+(e*688&-1)>>2]|0)>-3){g=65280+(e*688&-1)|0;cf(b|0,125624,(v=i,i=i+8|0,c[v>>2]=f,v)|0);ji(c[m>>2]|0,g,0);g=c[m>>2]|0;aF(10,g|0)}else{cf(b|0,125528,(v=i,i=i+8|0,c[v>>2]=f,v)|0)}if(e>>>0<4){e=e+4|0}else{break}}i=d;return}function jI(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,n=0,o=0,p=0;d=i;i=i+2056|0;e=d|0;f=d+8|0;g=e|0;a[g]=35;h=e+5|0;j=e+1|0;w=538976288;a[j]=w&255;w=w>>8;a[j+1|0]=w&255;w=w>>8;a[j+2|0]=w&255;w=w>>8;a[j+3|0]=w&255;a[h]=0;if((c[13388]|0)==0){j=ut(1024)|0;do{if((j|0)==0){gk();e=ut(1024)|0;if((e|0)!=0){k=e;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=216448,v)|0)}else{k=j}}while(0);c[13388]=k;be(k|0,163128,(v=i,i=i+88|0,c[v>>2]=211088,c[v+8>>2]=204752,c[v+16>>2]=184880,c[v+24>>2]=179760,c[v+32>>2]=201520,c[v+40>>2]=179864,c[v+48>>2]=175632,c[v+56>>2]=179864,c[v+64>>2]=171680,c[v+72>>2]=179864,c[v+80>>2]=167488,v)|0);k=c[13388]|0;c[13388]=db(k,(uA(k|0)|0)+1|0,216448)|0}if((b|0)==0){i=d;return}if((c[m>>2]|0)==(b|0)){l=h}else{cf(b|0,154128,(v=i,i=i+8|0,c[v>>2]=151008,v)|0);l=g}g=f|0;uD(g|0,149072,187);uD(f+(uA(g|0)|0)|0,147160,95);cf(b|0,g|0,(v=i,i=i+144|0,c[v>>2]=l,c[v+8>>2]=l,c[v+16>>2]=145064,c[v+24>>2]=l,c[v+32>>2]=40152,c[v+40>>2]=40160,c[v+48>>2]=40168,c[v+56>>2]=l,c[v+64>>2]=33040,c[v+72>>2]=33008,c[v+80>>2]=l,c[v+88>>2]=l,c[v+96>>2]=40184,c[v+104>>2]=l,c[v+112>>2]=l,c[v+120>>2]=l,c[v+128>>2]=l,c[v+136>>2]=l,v)|0);l=c[13898]|0;g=c[1054]|0;b=c[g+(l*40&-1)+36>>2]|0;if(!((a[g+(l*40&-1)|0]&1)!=0&(b|0)>0)){i=d;return}f=c[10036]|0;h=0;k=0;j=c[g+(l*40&-1)+32>>2]|0;while(1){if((a[h+143320|0]|0)==(a[f+(h+j|0)|0]|0)){n=j;o=k}else{if((h|0)!=1){p=7623;break}n=j-1|0;o=1}g=h+1|0;if((g|0)<(o+b|0)){h=g;k=o;j=n}else{break}}if((p|0)==7623){i=d;return}do{if((o|0)==0){if((h|0)==0|(h|0)==4){break}i=d;return}}while(0);c[13898]=l+1;cf(c[m>>2]|0,141816,(v=i,i=i+8|0,c[v>>2]=c[13388],v)|0);l=bU(140128)|0;cf(c[m>>2]|0,136384,(v=i,i=i+8|0,c[v>>2]=195896,v)|0);cf(c[m>>2]|0,132976,(v=i,i=i+8|0,c[v>>2]=(l|0)==0?138024:l,v)|0);i=d;return}function jJ(){var b=0,d=0,e=0,f=0;b=i;if(!(a[928]|0)){d=c[m>>2]|0;aF(10,d|0)}d=c[m>>2]|0;e=j3(36288)|0;cf(d|0,128328,(v=i,i=i+8|0,c[v>>2]=e,v)|0);e=c[9329]|0;do{if((e|0)!=0){if((a[e]|0)==0){break}d=c[m>>2]|0;cf(d|0,82560,(v=i,i=i+8|0,c[v>>2]=e,v)|0)}}while(0);if((c[9330]|0)==1&(c[9331]|0)==-2){i=b;return}aI(84256,2,1,c[m>>2]|0);e=c[m>>2]|0;if((c[9330]|0)==0){f=e}else{aI(145280,10,1,e|0);jg(e,37320);f=c[m>>2]|0}aF(10,f|0);i=b;return}function jK(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0.0,l=0,n=0.0,o=0,p=0.0,q=0;b=i;if(!(a[928]|0)){d=c[m>>2]|0;aF(10,d|0)}if((a[36120]&1)==0){d=c[m>>2]|0;aI(131736,12,1,d|0);i=b;return}d=c[9031]|0;if((d|0)==0|(d|0)==1|(d|0)==2){e=c[m>>2]|0;aI(131624,22,1,e|0);if((c[9031]|0)==2&(c[9032]|0)>>>0<2){f=7651}else{e=c[9044]|0;do{if((e|0)==0){g=c[m>>2]|0;aI(196168,3,1,g|0)}else{g=c[m>>2]|0;if((e|0)==2){aI(196800,6,1,g|0);break}else{aI(89896,6,1,g|0);break}}}while(0);if((c[9031]|0)==2){f=7651}else{f=7652}}if((f|0)==7651){if(((c[9032]|0)-2|0)>>>0>=2){f=7652}}do{if((f|0)==7652){e=c[9045]|0;if((e|0)==0){g=c[m>>2]|0;aI(131440,5,1,g|0);break}else if((e|0)==2){aI(131280,6,1,c[m>>2]|0);break}else{if((c[9044]|0)==1){break}aI(131216,7,1,c[m>>2]|0);break}}}while(0);f=c[m>>2]|0;if((c[9047]|0)==0){aI(131080,9,1,f|0)}else{aI(130936,11,1,f|0)}f=c[9031]|0;do{if((f|0)==0){e=c[m>>2]|0;aI(130784,7,1,e|0)}else if((f|0)==1){aI(130648,8,1,c[m>>2]|0)}else{e=c[9032]|0;if((e|0)==1){g=c[m>>2]|0;aI(130432,8,1,g|0);break}else if((e|0)==2){aI(130336,8,1,c[m>>2]|0);break}else if((e|0)==0){aI(130512,8,1,c[m>>2]|0);break}else if((e|0)==3){aI(130288,8,1,c[m>>2]|0);break}else{break}}}while(0);f=c[m>>2]|0;aF(10,f|0)}else if((d|0)==3){aI(130224,11,1,c[m>>2]|0);d=c[9034]|0;if((d|0)==0){j=179864}else{j=c[21784+(d<<2)>>2]|0}k=+h[4519];f=c[9035]|0;if((f|0)==(d|0)){l=179864}else{l=c[21784+(f<<2)>>2]|0}n=+h[4520];d=c[9036]|0;if((d|0)==(f|0)){o=179864}else{o=c[21784+(d<<2)>>2]|0}p=+h[4521];cf(c[m>>2]|0,77392,(v=i,i=i+48|0,c[v>>2]=j,h[v+8>>3]=k,c[v+16>>2]=l,h[v+24>>3]=n,c[v+32>>2]=o,h[v+40>>3]=p,v)|0);aF(10,c[m>>2]|0)}o=(a[36229]&1)!=0?179864:211688;l=(a[36230]&1)!=0?179864:211688;j=(a[36231]&1)!=0?179864:211688;cf(c[m>>2]|0,130072,(v=i,i=i+32|0,c[v>>2]=(c[9046]|0)==0?130008:129888,c[v+8>>2]=o,c[v+16>>2]=l,c[v+24>>2]=j,v)|0);j=c[m>>2]|0;if((c[9059]|0)>-3){aI(129760,12,1,j|0);ji(c[m>>2]|0,36232,0);l=c[m>>2]|0;aF(10,l|0)}else{aI(129608,10,1,j|0)}if((a[36228]&1)!=0){j=c[m>>2]|0;aI(129416,51,1,j|0)}p=+h[4525];n=+h[4526];k=+h[4527];j=c[9056]|0;if((j|0)==1){q=129016}else{q=(j|0)==2?128920:179864}cf(c[m>>2]|0,129128,(v=i,i=i+48|0,h[v>>3]=+h[4524],h[v+8>>3]=p,h[v+16>>3]=n,h[v+24>>3]=k,c[v+32>>2]=(j|0)!=0?179864:171496,c[v+40>>2]=q,v)|0);aI(128800,30,1,c[m>>2]|0);q=c[9338]|0;j=c[m>>2]|0;if((q|0)>0){cf(j|0,128688,(v=i,i=i+8|0,c[v>>2]=q,v)|0)}else{aI(128592,25,1,j|0)}aI(128504,27,1,c[m>>2]|0);j=c[9339]|0;q=c[m>>2]|0;if((j|0)>0){cf(q|0,128432,(v=i,i=i+8|0,c[v>>2]=j,v)|0)}else{aI(128592,25,1,q|0)}jJ();i=b;return}function jL(){var b=0,d=0,e=0,f=0.0,g=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0;b=i;if(!(a[928]|0)){d=c[m>>2]|0;aF(10,d|0)}if((a[66164]&1)==0){e=0}else{d=c[m>>2]|0;f=+h[8271];cf(d|0,132416,(v=i,i=i+24|0,c[v>>2]=132288,c[v+8>>2]=56880,h[v+16>>3]=f,v)|0);e=1}if((a[65476]&1)==0){g=e}else{d=c[m>>2]|0;j=e+1|0;k=(e|0)==0?132288:132144;f=+h[8185];cf(d|0,132416,(v=i,i=i+24|0,c[v>>2]=k,c[v+8>>2]=56856,h[v+16>>3]=f,v)|0);g=j}if((a[64788]&1)==0){l=g}else{j=c[m>>2]|0;k=g+1|0;d=(g|0)==0?132288:132144;f=+h[8099];cf(j|0,132416,(v=i,i=i+24|0,c[v>>2]=d,c[v+8>>2]=56832,h[v+16>>3]=f,v)|0);l=k}if((a[68916]&1)==0){n=l}else{k=c[m>>2]|0;d=l+1|0;j=(l|0)==0?132288:132144;f=+h[8615];cf(k|0,132416,(v=i,i=i+24|0,c[v>>2]=j,c[v+8>>2]=56976,h[v+16>>3]=f,v)|0);n=d}if((a[68228]&1)==0){o=n}else{d=c[m>>2]|0;j=n+1|0;k=(n|0)==0?132288:132144;f=+h[8529];cf(d|0,132416,(v=i,i=i+24|0,c[v>>2]=k,c[v+8>>2]=56952,h[v+16>>3]=f,v)|0);o=j}if((a[66852]&1)==0){p=o}else{j=c[m>>2]|0;k=o+1|0;d=(o|0)==0?132288:132144;f=+h[8357];cf(j|0,132416,(v=i,i=i+24|0,c[v>>2]=d,c[v+8>>2]=56904,h[v+16>>3]=f,v)|0);p=k}if((a[69604]&1)==0){q=p}else{k=c[m>>2]|0;d=p+1|0;j=(p|0)==0?132288:132144;f=+h[8701];cf(k|0,132416,(v=i,i=i+24|0,c[v>>2]=j,c[v+8>>2]=57e3,h[v+16>>3]=f,v)|0);q=d}if((q|0)==0){d=c[m>>2]|0;aI(132064,15,1,d|0);i=b;return}d=c[m>>2]|0;if((q|0)==1){aI(131968,6,1,d|0);i=b;return}else{aF(10,d|0);i=b;return}}function jM(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0,u=0,w=0.0,x=0,y=0.0,z=0,A=0,B=0;d=i;e=c[10822]|0;if((e|0)==0){f=0}else{g=(b|0)==0;j=0;k=e;while(1){e=c[k+4>>2]|0;if(g){l=e;n=7722}else{if((e|0)==(b|0)){l=b;n=7722}else{o=j}}if((n|0)==7722){n=0;e=c[m>>2]|0;p=c[k+60>>2]|0;if((p|0)==0){q=179864}else{q=j3(p)|0}cf(e|0,126584,(v=i,i=i+16|0,c[v>>2]=l,c[v+8>>2]=q,v)|0);e=c[m>>2]|0;p=c[k+8>>2]|0;if((p|0)==0){r=179864}else{r=c[21784+(p<<2)>>2]|0}s=+h[k+24>>3];t=c[k+12>>2]|0;if((t|0)==(p|0)){u=179864}else{u=c[21784+(t<<2)>>2]|0}w=+h[k+32>>3];p=c[k+16>>2]|0;if((p|0)==(t|0)){x=179864}else{x=c[21784+(p<<2)>>2]|0}y=+h[k+40>>3];cf(e|0,77392,(v=i,i=i+48|0,c[v>>2]=r,h[v+8>>3]=s,c[v+16>>2]=u,h[v+24>>3]=w,c[v+32>>2]=x,h[v+40>>3]=y,v)|0);e=c[k+48>>2]|0;if((e|0)==1){p=c[m>>2]|0;aI(126448,7,1,p|0)}else if((e|0)==2){aI(131280,6,1,c[m>>2]|0)}else if((e|0)==0){aI(131440,5,1,c[m>>2]|0)}e=c[k+52>>2]|0;p=c[m>>2]|0;if((e|0)==0){aI(126264,12,1,p|0)}else{cf(p|0,126328,(v=i,i=i+8|0,c[v>>2]=e,v)|0)}e=c[m>>2]|0;p=(c[k+56>>2]|0)!=0?150856:150704;cf(e|0,126160,(v=i,i=i+8|0,c[v>>2]=p,v)|0);p=c[k+64>>2]|0;if((p|0)!=0){e=c[m>>2]|0;cf(e|0,126104,(v=i,i=i+8|0,c[v>>2]=p,v)|0)}p=k+72|0;if((c[p>>2]|0)!=0){e=c[m>>2]|0;aI(145280,10,1,e|0);jg(e,p)}if((a[k+184|0]&1)!=0){p=c[m>>2]|0;aI(199048,11,1,p|0)}p=k+88|0;e=c[m>>2]|0;if((c[p>>2]|0)==0){aI(126e3,8,1,e|0)}else{aI(125912,20,1,e|0);ji(c[m>>2]|0,p,1);p=c[m>>2]|0;e=c[k+144>>2]|0;if((e|0)==0){z=179864}else{z=c[21784+(e<<2)>>2]|0}y=+h[k+160>>3];t=c[k+148>>2]|0;if((t|0)==(e|0)){A=179864}else{A=c[21784+(t<<2)>>2]|0}w=+h[k+168>>3];e=c[k+152>>2]|0;if((e|0)==(t|0)){B=179864}else{B=c[21784+(e<<2)>>2]|0}s=+h[k+176>>3];cf(p|0,77392,(v=i,i=i+48|0,c[v>>2]=z,h[v+8>>3]=y,c[v+16>>2]=A,h[v+24>>3]=w,c[v+32>>2]=B,h[v+40>>3]=s,v)|0)}p=c[m>>2]|0;aF(10,p|0);o=1}p=c[k>>2]|0;if((p|0)==0){f=o;break}else{j=o;k=p}}}if((b|0)<1|f){i=d;return}else{uf(c[13898]|0,125760,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}function jN(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0,w=0,x=0.0,y=0,z=0.0,A=0,B=0,C=0,D=0;d=i;e=c[10826]|0;if((e|0)==0){f=0}else{g=(b|0)==0;j=0;k=e;while(1){e=c[k+4>>2]|0;if(g){l=e;n=7761}else{if((e|0)==(b|0)){l=b;n=7761}else{o=j}}if((n|0)==7761){n=0;e=c[m>>2]|0;p=c[72304+(c[k+160>>2]<<2)>>2]|0;q=k+200|0;r=c[q>>2]|0;if((r|0)==2){s=128e3}else{s=(r|0)==1?127904:127768}r=(c[k+100>>2]|0)!=0?150856:150704;cf(e|0,128128,(v=i,i=i+32|0,c[v>>2]=l,c[v+8>>2]=p,c[v+16>>2]=s,c[v+24>>2]=r,v)|0);ji(c[m>>2]|0,k+104|0,0);r=c[m>>2]|0;aI(127616,9,1,r|0);r=c[m>>2]|0;p=c[k+8>>2]|0;if((p|0)==0){t=179864}else{t=c[21784+(p<<2)>>2]|0}u=+h[k+24>>3];e=c[k+12>>2]|0;if((e|0)==(p|0)){w=179864}else{w=c[21784+(e<<2)>>2]|0}x=+h[k+32>>3];p=c[k+16>>2]|0;if((p|0)==(e|0)){y=179864}else{y=c[21784+(p<<2)>>2]|0}z=+h[k+40>>3];cf(r|0,77392,(v=i,i=i+48|0,c[v>>2]=t,h[v+8>>3]=u,c[v+16>>2]=w,h[v+24>>3]=x,c[v+32>>2]=y,h[v+40>>3]=z,v)|0);r=(a[k+88|0]&1)!=0?127520:127448;p=c[m>>2]|0;aK(r|0,p|0);p=c[m>>2]|0;r=c[k+48>>2]|0;if((r|0)==0){A=179864}else{A=c[21784+(r<<2)>>2]|0}z=+h[k+64>>3];e=c[k+52>>2]|0;if((e|0)==(r|0)){B=179864}else{B=c[21784+(e<<2)>>2]|0}x=+h[k+72>>3];r=c[k+56>>2]|0;if((r|0)==(e|0)){C=179864}else{C=c[21784+(r<<2)>>2]|0}u=+h[k+80>>3];cf(p|0,77392,(v=i,i=i+48|0,c[v>>2]=A,h[v+8>>3]=z,c[v+16>>2]=B,h[v+24>>3]=x,c[v+32>>2]=C,h[v+40>>3]=u,v)|0);u=+h[k+168>>3];do{if(u>0.0){p=c[m>>2]|0;r=c[k+176>>2]|0;if((r|0)==0){D=179864}else{D=c[21832+(r<<2)>>2]|0}x=+h[k+184>>3];cf(p|0,126992,(v=i,i=i+24|0,c[v>>2]=D,h[v+8>>3]=u,h[v+16>>3]=x,v)|0);if((c[q>>2]|0)==0){break}p=c[m>>2]|0;x=+h[k+192>>3];cf(p|0,126792,(v=i,i=i+8|0,h[v>>3]=x,v)|0)}}while(0);q=c[m>>2]|0;aF(10,q|0);o=1}q=c[k>>2]|0;if((q|0)==0){f=o;break}else{j=o;k=q}}}if((b|0)<1|f){i=d;return}else{uf(c[13898]|0,134376,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}function jO(){var b=0,d=0,e=0.0;b=i;if(!(a[928]|0)){d=c[m>>2]|0;aF(10,d|0)}do{if((c[8786]|0)==3){d=c[m>>2]|0;e=+h[4395];cf(d|0,134456,(v=i,i=i+8|0,h[v>>3]=e,v)|0)}else{e=+h[4395];d=c[m>>2]|0;if(e<0.0){aI(134096,35,1,d|0);break}else{cf(d|0,134296,(v=i,i=i+8|0,h[v>>3]=e,v)|0);break}}}while(0);do{if((c[14100]|0)==3){d=c[m>>2]|0;e=+h[7052];cf(d|0,133952,(v=i,i=i+8|0,h[v>>3]=e,v)|0)}else{e=+h[7052];d=c[m>>2]|0;if(e<0.0){aI(133664,35,1,d|0);break}else{cf(d|0,133816,(v=i,i=i+8|0,h[v>>3]=e,v)|0);break}}}while(0);do{if((c[6598]|0)==3){d=c[m>>2]|0;e=+h[3301];cf(d|0,133536,(v=i,i=i+8|0,h[v>>3]=e,v)|0)}else{e=+h[3301];d=c[m>>2]|0;if(e<0.0){aI(133048,35,1,d|0);break}else{cf(d|0,133360,(v=i,i=i+8|0,h[v>>3]=e,v)|0);break}}}while(0);if((c[1066]|0)==3){d=c[m>>2]|0;e=+h[535];cf(d|0,132872,(v=i,i=i+8|0,h[v>>3]=e,v)|0);i=b;return}e=+h[535];d=c[m>>2]|0;if(e<0.0){aI(132592,35,1,d|0);i=b;return}else{cf(d|0,132720,(v=i,i=i+8|0,h[v>>3]=e,v)|0);i=b;return}}function jP(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0;b=i;c[13898]=(c[13898]|0)+1;cf(c[m>>2]|0,166536,(v=i,i=i+8|0,c[v>>2]=(c[7662]|0)==1?166152:165672,v)|0);aI(165320,17,1,c[m>>2]|0);d=a[30632]|0;if(d<<24>>24!=0){e=0;f=30632;g=d;do{if((e|0)>0){d=c[m>>2]|0;aI(164904,7,1,d|0);h=a[f]|0}else{h=g}d=h<<24>>24;if((d|0)==98){j=c[m>>2]|0;aI(164432,6,1,j|0)}else if((d|0)==115){aI(163992,7,1,c[m>>2]|0)}else if((d|0)==116){aI(163304,3,1,c[m>>2]|0)}e=e+1|0;f=e+30632|0;g=a[f]|0;}while(g<<24>>24!=0)}aF(10,c[m>>2]|0);g=a[30641]|0;do{if(g<<24>>24==100){f=c[m>>2]|0;aI(162824,21,1,f|0)}else{f=c[m>>2]|0;if(g<<24>>24==97){aI(158600,38,1,f|0);break}else{e=g<<24>>24==102?159744:159048;cf(f|0,162192,(v=i,i=i+8|0,c[v>>2]=e,v)|0);break}}}while(0);aI(157984,47,1,c[m>>2]|0);g=a[30639]|0;e=c[m>>2]|0;if(g<<24>>24==99){aI(156096,9,1,e|0)}else{f=g<<24>>24==98?154664:154352;cf(e|0,155016,(v=i,i=i+8|0,c[v>>2]=f,v)|0)}cf(c[m>>2]|0,153960,(v=i,i=i+8|0,c[v>>2]=(a[30640]|0)!=0?179864:211688,v)|0);aI(153600,11,1,c[m>>2]|0);f=c[m>>2]|0;if((a[30642]|0)==49){aI(153160,49,1,f|0)}else{aI(152728,45,1,f|0)}f=c[7661]|0;e=c[m>>2]|0;if((f|0)>0){cf(e|0,152344,(v=i,i=i+8|0,c[v>>2]=f,v)|0)}else{g=(f|0)!=0?150376:150208;cf(e|0,152016,(v=i,i=i+8|0,c[v>>2]=g,v)|0)}g=c[7665]|0;cf(c[m>>2]|0,151768,(v=i,i=i+16|0,c[v>>2]=c[7664],c[v+8>>2]=g,v)|0);aI(151600,31,1,c[m>>2]|0);g=c[7663]|0;if((g|0)==8){e=c[m>>2]|0;aI(150536,21,1,e|0);i=b;return}else if((g|0)==7){aI(150712,21,1,c[m>>2]|0);i=b;return}else if((g|0)==4){aI(151368,19,1,c[m>>2]|0);i=b;return}else if((g|0)==5){aI(151064,30,1,c[m>>2]|0);i=b;return}else if((g|0)==6){aI(150872,20,1,c[m>>2]|0);i=b;return}else{cf(c[m>>2]|0,150400,(v=i,i=i+8|0,c[v>>2]=g+1,v)|0);i=b;return}}function jQ(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0.0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0,Z=0,_=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0.0,aq=0,ar=0,as=0,at=0,au=0,av=0,aw=0.0,ax=0.0,ay=0.0,az=0,aA=0,aB=0;b=i;i=i+48|0;d=b|0;e=b+24|0;f=c[13898]|0;g=c[8272]|0;do{if((f|0)<(g|0)){j=c[1054]|0;k=(a[j+(f*40&-1)|0]&1)==0;if(k){uf(f,141144,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}l=c[j+(f*40&-1)+36>>2]|0;o=j+(f*40&-1)+32|0;p=c[10036]|0;q=0;while(1){if((q|0)>=(l|0)){r=7852;break}if((a[p+((c[o>>2]|0)+q|0)|0]|0)==(a[q+103664|0]|0)){q=q+1|0}else{break}}if((r|0)==7852){if((q|0)==1){break}}p=c[o>>2]|0;if(k){uf(f,141144,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}do{if((l|0)>0){s=c[10036]|0;t=0;u=0;w=p;while(1){if((a[t+205488|0]|0)==(a[s+(t+w|0)|0]|0)){x=w;y=u}else{if((t|0)!=3){break}x=w-1|0;y=1}z=t+1|0;if((z|0)<(y+l|0)){t=z;u=y;w=x}else{r=7882;break}}do{if((r|0)==7882){if((y|0)==0){if(!((t|0)==2|(t|0)==7)){break}}w=f+1|0;c[13898]=w;if((w|0)>=(g|0)){uf(w,138608,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}L10757:do{if((a[j+(w*40&-1)|0]&1)!=0){u=c[j+(w*40&-1)+36>>2]|0;s=j+(w*40&-1)+32|0;z=c[10036]|0;A=0;while(1){if((A|0)>=(u|0)){break}if((a[z+((c[s>>2]|0)+A|0)|0]|0)==(a[A+103664|0]|0)){A=A+1|0}else{break L10757}}if((A|0)!=1){break}uf(w,138608,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);w=is(d)|0;s=c[w>>2]|0;if((s|0)==1){B=+(c[w+8>>2]|0)}else if((s|0)==2){B=+h[w+8>>3]}else if((s|0)==3){B=+uz(c[w+8>>2]|0,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}w=d|0;if((c[w>>2]|0)==3){uu(c[d+8>>2]|0);c[w>>2]=1}w=~~B;s=(w|0)<2?128:w;w=c[13898]|0;do{if((w|0)<(c[8272]|0)){z=c[1054]|0;if((a[z+(w*40&-1)|0]&1)==0){uf(w,137944,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}u=c[z+(w*40&-1)+36>>2]|0;C=z+(w*40&-1)+32|0;z=c[10036]|0;D=0;while(1){if((D|0)>=(u|0)){r=7903;break}E=c[C>>2]|0;if((a[z+(E+D|0)|0]|0)==(a[D+103664|0]|0)){D=D+1|0}else{F=E;break}}if((r|0)==7903){if((D|0)==1){G=0;break}F=c[C>>2]|0}if((u|0)>0){H=0;I=0;J=F}else{uf(w,137944,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}while(1){if((a[H+138408|0]|0)==(a[z+(H+J|0)|0]|0)){K=J;L=I}else{if((H|0)!=1){M=0;N=0;O=F;r=7912;break}K=J-1|0;L=1}A=H+1|0;if((A|0)<(L+u|0)){H=A;I=L;J=K}else{r=7910;break}}do{if((r|0)==7910){if((L|0)!=0){P=1;break}if((H|0)==0|(H|0)==5){P=1}else{M=0;N=0;O=F;r=7912}}}while(0);do{if((r|0)==7912){while(1){r=0;if((a[M+138104|0]|0)==(a[z+(M+O|0)|0]|0)){Q=O;R=N}else{if((M|0)!=1){r=8045;break}Q=O-1|0;R=1}C=M+1|0;if((C|0)<(R+u|0)){M=C;N=R;O=Q;r=7912}else{break}}if((r|0)==8045){uf(w,137944,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((R|0)!=0){P=2;break}if((M|0)==0|(M|0)==3){P=2;break}uf(w,137944,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);c[13898]=w+1;G=P}else{G=0}}while(0);w=c[7262]|0;u=c[m>>2]|0;if((w|0)==0|(w|0)==(u|0)){S=1}else{S=(w|0)==(c[n>>2]|0)}z=(w|0)!=0?w:u;w=(c[5163]|0)==103?137656:137544;cf(u|0,137800,(v=i,i=i+16|0,c[v>>2]=w,c[v+8>>2]=s,v)|0);w=c[m>>2]|0;if(S){aI(137248,2,1,w|0)}else{u=c[7260]|0;cf(w|0,137360,(v=i,i=i+8|0,c[v>>2]=u,v)|0)}if((s|0)<=0){i=b;return}T=+(s-1|0);u=e|0;w=e+8|0;C=e+16|0;D=0;do{U=+(D|0)/T;if((a[20668]|0)==110){V=1.0-U}else{V=U}fq(V,e);U=+h[u>>3];W=+h[w>>3];X=+h[C>>3];A=~~(U*255.0+.5);E=~~(W*255.0+.5);Y=~~(X*255.0+.5);if((G|0)==1){cf(z|0,137184,(v=i,i=i+24|0,h[v>>3]=U,h[v+8>>3]=W,h[v+16>>3]=X,v)|0)}else if((G|0)==2){cf(z|0,137056,(v=i,i=i+24|0,c[v>>2]=A&255,c[v+8>>2]=E&255,c[v+16>>2]=Y&255,v)|0)}else{Z=A&255;A=E&255;E=Y&255;cf(z|0,138856,(v=i,i=i+88|0,c[v>>2]=D,h[v+8>>3]=V,h[v+16>>3]=U,h[v+24>>3]=W,h[v+32>>3]=X,c[v+40>>2]=Z,c[v+48>>2]=A,c[v+56>>2]=E,c[v+64>>2]=Z,c[v+72>>2]=A,c[v+80>>2]=E,v)|0)}D=D+1|0;}while((D|0)<(s|0));i=b;return}}while(0);if(k){uf(f,141144,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}L10836:do{if((l|0)>0){t=c[10036]|0;s=0;D=0;z=p;while(1){if((a[s+142040|0]|0)==(a[t+(s+z|0)|0]|0)){_=z;$=D}else{if((s|0)!=3){break L10836}_=z-1|0;$=1}C=s+1|0;if((C|0)<($+l|0)){s=C;D=$;z=_}else{break}}if(($|0)==0){if(!((s|0)==2|(s|0)==8)){break}}c[13898]=f+1;if((c[5163]|0)!=100){z=c[m>>2]|0;aI(139016,47,1,z|0);i=b;return}if((c[5172]|0)>0){aa=0}else{i=b;return}do{z=c[5173]|0;T=+h[z+(aa<<5)>>3];X=+h[z+(aa<<5)+8>>3];W=+h[z+(aa<<5)+16>>3];U=+h[z+(aa<<5)+24>>3];z=~~(X*255.0+.5);D=~~(W*255.0+.5);t=~~(U*255.0+.5);cf(c[m>>2]|0,138856,(v=i,i=i+88|0,c[v>>2]=aa,h[v+8>>3]=T,h[v+16>>3]=X,h[v+24>>3]=W,h[v+32>>3]=U,c[v+40>>2]=z,c[v+48>>2]=D,c[v+56>>2]=t,c[v+64>>2]=z,c[v+72>>2]=D,c[v+80>>2]=t,v)|0);aa=aa+1|0;}while((aa|0)<(c[5172]|0));i=b;return}}while(0);if(k){uf(f,141144,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((l|0)<=0){break}s=c[10036]|0;t=0;D=0;z=p;while(1){if((a[t+141864|0]|0)==(a[s+(t+z|0)|0]|0)){ab=z;ac=D}else{if((t|0)!=6){break}ab=z-1|0;ac=1}C=t+1|0;if((C|0)<(ac+l|0)){t=C;D=ac;z=ab}else{r=7954;break}}do{if((r|0)==7954){if((ac|0)==0){if(!((t|0)==5|(t|0)==11)){break}}z=c[m>>2]|0;D=c[5162]|0;cf(z|0,140040,(v=i,i=i+8|0,c[v>>2]=D,v)|0);if((a[c[7122]|0]|0)!=0){D=0;z=0;do{if(((D|0)%3&-1|0)==0){s=c[m>>2]|0;aI(139832,6,1,s|0)}s=c[28488+((z|1)<<2)>>2]|0;cf(c[m>>2]|0,139592,(v=i,i=i+16|0,c[v>>2]=D,c[v+8>>2]=s,v)|0);D=D+1|0;z=D<<1;}while((a[c[28488+(z<<2)>>2]|0]|0)!=0)}z=c[m>>2]|0;aF(10,z|0);z=c[m>>2]|0;aI(139400,62,1,z|0);z=c[m>>2]|0;D=(c[5162]|0)-1|0;cf(z|0,139168,(v=i,i=i+16|0,c[v>>2]=D,c[v+8>>2]=D,v)|0);c[13898]=(c[13898]|0)+1;i=b;return}}while(0);if(!k){break}uf(f,141144,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);j=c[10036]|0;o=0;while(1){if((o|0)>=(l|0)){r=7965;break}if((a[j+(p+o|0)|0]|0)==(a[o+204344|0]|0)){o=o+1|0}else{r=7966;break}}if((r|0)==7965){if((o|0)!=6){r=7966}}do{if((r|0)==7966){if(!((l|0)>0&(k^1))){uf(f,141144,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}j=c[10036]|0;q=0;t=0;D=p;while(1){if((a[q+141544|0]|0)==(a[j+(q+D|0)|0]|0)){ad=D;ae=t}else{if((q|0)!=5){break}ad=D-1|0;ae=1}z=q+1|0;if((z|0)<(ae+l|0)){q=z;t=ae;D=ad}else{r=7972;break}}if((r|0)==7972){if((ae|0)!=0){break}if((q|0)==4|(q|0)==10){break}}if(!((l|0)>0&(k^1))){uf(f,141144,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}D=c[10036]|0;t=0;j=0;z=p;while(1){if((a[t+141352|0]|0)==(a[D+(t+z|0)|0]|0)){af=z;ag=j}else{if((t|0)!=7){r=8027;break}af=z-1|0;ag=1}s=t+1|0;if((s|0)<(ag+l|0)){t=s;j=ag;z=af}else{break}}if((r|0)==8027){uf(f,141144,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}do{if((ag|0)==0){if((t|0)==6|(t|0)==15){break}uf(f,141144,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);t=(c[5162]|0)-1|0;c[13898]=f+1;if((c[5163]|0)==114&(c[5174]|0)==114){z=c[m>>2]|0;j=c[5164]|0;D=c[5165]|0;q=c[5166]|0;cf(z|0,141008,(v=i,i=i+24|0,c[v>>2]=j,c[v+8>>2]=D,c[v+16>>2]=q,v)|0);i=b;return}q=ut(768)|0;do{if((q|0)==0){gk();D=ut(768)|0;if((D|0)!=0){ah=D;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=140872,v)|0)}else{ah=q}}while(0);q=ah;D=0;do{fq(+(D|0)/31.0,q+(D*24&-1)|0);D=D+1|0;}while((D|0)<32);D=t<<1|1;j=D<<2;z=ut(j)|0;do{if((z|0)==0){gk();s=ut(j)|0;if((s|0)!=0){ai=s;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=140736,v)|0)}else{ai=z}}while(0);z=ai;do{if((t|0)>=0){s=0;do{c[z+(s<<2)>>2]=s;s=s+1|0;}while((s|0)<=(t|0));if((t|0)<1){break}else{aj=1}do{c[z+(aj+t<<2)>>2]=-aj;aj=aj+1|0;}while((aj|0)<=(t|0))}}while(0);t=ut(j)|0;do{if((t|0)==0){gk();s=ut(j)|0;if((s|0)!=0){ak=s;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=140536,v)|0)}else{ak=t}}while(0);t=ak;if((D|0)>0){j=0;while(1){s=ut(256)|0;if((s|0)==0){gk();C=ut(256)|0;if((C|0)==0){r=8003;break}else{al=C}}else{al=s}s=t+(j<<2)|0;c[s>>2]=al;C=z+(j<<2)|0;w=0;do{U=+fu(c[C>>2]|0,+(w|0)/31.0);h[(c[s>>2]|0)+(w<<3)>>3]=U;w=w+1|0;}while((w|0)<32);w=j+1|0;if((w|0)<(D|0)){j=w}else{am=0;an=0;ao=0;ap=8.988465674311579e+307;aq=0;break}}if((r|0)==8003){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=140344,v)|0)}while(1){j=z+(aq<<2)|0;w=c[t+(aq<<2)>>2]|0;s=am;C=an;u=ao;U=ap;E=0;while(1){A=c[t+(E<<2)>>2]|0;Z=z+(E<<2)|0;Y=s;ar=C;as=u;W=U;at=0;while(1){au=c[t+(at<<2)>>2]|0;X=0.0;av=0;do{T=+h[q+(av*24&-1)>>3]- +h[w+(av<<3)>>3];aw=+h[q+(av*24&-1)+8>>3]- +h[A+(av<<3)>>3];ax=+h[q+(av*24&-1)+16>>3]- +h[au+(av<<3)>>3];X=X+(T*T+aw*aw+ax*ax);av=av+1|0;}while((av|0)<32);if(X>2]|0;aA=c[Z>>2]|0;aB=c[z+(at<<2)>>2]|0}else{ay=W;az=as;aA=ar;aB=Y}av=at+1|0;if((av|0)<(D|0)){Y=aB;ar=aA;as=az;W=ay;at=av}else{break}}at=E+1|0;if((at|0)<(D|0)){s=aB;C=aA;u=az;U=ay;E=at}else{break}}E=aq+1|0;if((E|0)<(D|0)){am=aB;an=aA;ao=az;ap=ay;aq=E}else{break}}cf(c[m>>2]|0,140160,(v=i,i=i+24|0,c[v>>2]=az,c[v+8>>2]=aA,c[v+16>>2]=aB,v)|0);z=0;do{uu(c[t+(z<<2)>>2]|0);z=z+1|0;}while((z|0)<(D|0))}else{cf(c[m>>2]|0,140160,(v=i,i=i+24|0,c[v>>2]=0,c[v+8>>2]=0,c[v+16>>2]=0,v)|0)}uu(ak);uu(ai);uu(ah);i=b;return}}while(0);jR();i=b;return}}while(0);cf(c[m>>2]|0,147560,(v=i,i=i+8|0,c[v>>2]=(c[5163]|0)==103?147288:147032,v)|0);ah=c[5163]|0;do{if((ah|0)==100){ai=c[m>>2]|0;aI(146576,35,1,ai|0)}else if((ah|0)==114){ai=c[5165]|0;ak=c[5166]|0;cf(c[m>>2]|0,146752,(v=i,i=i+24|0,c[v>>2]=c[5164],c[v+8>>2]=ai,c[v+16>>2]=ak,v)|0)}else if((ah|0)==102){aI(146384,49,1,c[m>>2]|0);ak=c[5179]|0;if((c[5178]|0)!=0&(ak|0)!=0){ai=c[m>>2]|0;cf(ai|0,146224,(v=i,i=i+8|0,c[v>>2]=ak,v)|0)}ak=c[5257]|0;if((c[5256]|0)!=0&(ak|0)!=0){ai=c[m>>2]|0;cf(ai|0,146056,(v=i,i=i+8|0,c[v>>2]=ak,v)|0)}ak=c[5335]|0;if(!((c[5334]|0)!=0&(ak|0)!=0)){break}cf(c[m>>2]|0,145904,(v=i,i=i+8|0,c[v>>2]=ak,v)|0)}else if((ah|0)==99){ay=+h[2707];ap=+h[2708];cf(c[m>>2]|0,145624,(v=i,i=i+24|0,h[v>>3]=+h[2706],h[v+8>>3]=ay,h[v+16>>3]=ap,v)|0)}else if((ah|0)!=103){cf(c[m>>2]|0,145456,(v=i,i=i+24|0,c[v>>2]=145192,c[v+8>>2]=2321,c[v+16>>2]=ah<<24>>24,v)|0)}}while(0);cf(c[m>>2]|0,144904,(v=i,i=i+8|0,c[v>>2]=(a[20668]|0)==112?144696:144440,v)|0);cf(c[m>>2]|0,144216,(v=i,i=i+8|0,c[v>>2]=(a[20684]|0)==0?144064:179864,v)|0);aI(143944,12,1,c[m>>2]|0);ah=c[5168]|0;ak=c[m>>2]|0;if((ah|0)==0){aI(143728,13,1,ak|0)}else{cf(ak|0,143880,(v=i,i=i+8|0,c[v>>2]=ah,v)|0)}aI(143544,48,1,c[m>>2]|0);aI(143376,14,1,c[m>>2]|0);ah=c[5174]|0;if((ah|0)==114){ak=c[m>>2]|0;aI(143256,4,1,ak|0)}else if((ah|0)==120){aI(142552,4,1,c[m>>2]|0)}else if((ah|0)==99){aI(142912,4,1,c[m>>2]|0)}else if((ah|0)==104){aI(143048,4,1,c[m>>2]|0)}else if((ah|0)==121){aI(142680,4,1,c[m>>2]|0)}else{cf(c[m>>2]|0,142392,(v=i,i=i+24|0,c[v>>2]=145192,c[v+8>>2]=2343,c[v+16>>2]=ah<<24>>24,v)|0)}cf(c[m>>2]|0,142264,(v=i,i=i+8|0,h[v>>3]=+h[2705],v)|0);i=b;return}function jR(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,n=0;a=i;cf(c[m>>2]|0,136824,(v=i,i=i+8|0,c[v>>2]=112,v)|0);b=c[7642]|0;d=c[b>>2]|0;if((d|0)==0){e=c[m>>2]|0;f=aF(10,e|0)|0;g=c[13898]|0;h=g+1|0;c[13898]=h;i=a;return}else{j=b;k=d}do{d=c[j+4>>2]|0;b=d>>>16&255;l=d>>>8&255;n=d&255;cf(c[m>>2]|0,136440,(v=i,i=i+8|0,c[v>>2]=k,v)|0);cf(c[m>>2]|0,136240,(v=i,i=i+48|0,c[v>>2]=b,c[v+8>>2]=l,c[v+16>>2]=n,c[v+24>>2]=b,c[v+32>>2]=l,c[v+40>>2]=n,v)|0);j=j+8|0;k=c[j>>2]|0;}while((k|0)!=0);e=c[m>>2]|0;f=aF(10,e|0)|0;g=c[13898]|0;h=g+1|0;c[13898]=h;i=a;return}function jS(){var b=0,d=0,e=0,f=0,g=0;b=i;if(!(a[928]|0)){d=c[m>>2]|0;aF(10,d|0)}d=c[8270]|0;do{if((d|0)!=0){if((aY(d|0,139696)|0)==0){break}bA(4,d|0)}}while(0);d=c[m>>2]|0;e=c[b$()>>2]|0;cf(d|0,170016,(v=i,i=i+8|0,c[v>>2]=e,v)|0);e=c[8270]|0;do{if((e|0)!=0){if((aY(e|0,139696)|0)==0){break}bA(4,139696)}}while(0);e=c[12886]|0;d=c[m>>2]|0;if((e|0)==0){aI(169e3,57,1,d|0);f=c[m>>2]|0;g=cf(f|0,168632,(v=i,i=i+8|0,c[v>>2]=48904,v)|0)|0;i=b;return}else{cf(d|0,169544,(v=i,i=i+8|0,c[v>>2]=e,v)|0);f=c[m>>2]|0;g=cf(f|0,168632,(v=i,i=i+8|0,c[v>>2]=48904,v)|0)|0;i=b;return}}function jT(){var b=0,d=0,e=0;b=i;if(!(a[928]|0)){d=c[m>>2]|0;aF(10,d|0)}cf(c[m>>2]|0,171816,(v=i,i=i+8|0,c[v>>2]=(a[42568]&1)!=0?179864:171496,v)|0);d=c[10568]|0;if((d|0)!=0){e=c[m>>2]|0;cf(e|0,171184,(v=i,i=i+8|0,c[v>>2]=d,v)|0);i=b;return}d=fg()|0;if((d|0)==0){i=b;return}cf(c[m>>2]|0,170744,(v=i,i=i+8|0,c[v>>2]=d,v)|0);uu(d);i=b;return}function jU(){var b=0,d=0,e=0;b=i;if(!(a[928]|0)){d=c[m>>2]|0;aF(10,d|0)}aI(135832,29,1,c[m>>2]|0);d=c[57238]|0;cf(c[m>>2]|0,154696,(v=i,i=i+8|0,c[v>>2]=(d|0)!=0?d:135560,v)|0);aI(135336,38,1,c[m>>2]|0);d=c[m>>2]|0;e=bU(195768)|0;cf(d|0,154696,(v=i,i=i+8|0,c[v>>2]=(e|0)==0?135560:e,v)|0);cf(c[m>>2]|0,135072,(v=i,i=i+8|0,c[v>>2]=195896,v)|0);i=b;return}function jV(){var b=0,d=0,e=0.0,f=0.0,j=0.0,k=0;b=i;if(!(a[928]|0)){d=c[m>>2]|0;aF(10,d|0)}aI(178128,9,1,c[m>>2]|0);d=c[m>>2]|0;if((c[5094]|0)==1){aI(177880,4,1,d|0);i=b;return}e=+g[3536];f=+g[3534];j=+g[3532];cf(d|0,177528,(v=i,i=i+32|0,h[v>>3]=+g[3538],h[v+8>>3]=e,h[v+16>>3]=f,h[v+24>>3]=j,v)|0);d=c[18072]|0;if((d|0)==2){k=176720}else{k=(d|0)==3?176120:179864}cf(c[m>>2]|0,177040,(v=i,i=i+16|0,c[v>>2]=k,c[v+8>>2]=(d|0)>1?175728:175376,v)|0);i=b;return}function jW(){var b=0,d=0,e=0,f=0,g=0,j=0.0,k=0,l=0,n=0.0,o=0,p=0.0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0;b=i;c[13898]=(c[13898]|0)+1;d=c[m>>2]|0;do{if((a[54018]|0)==0){aI(149704,29,1,d|0)}else{aI(150216,24,1,d|0);e=c[13505]|0;f=c[m>>2]|0;if((e|0)>-1){cf(f|0,150056,(v=i,i=i+8|0,c[v>>2]=e,v)|0);break}else{aI(149856,21,1,f|0);break}}}while(0);do{if((a[54016]|0)!=110){d=c[m>>2]|0;if((c[13506]|0)==1){aI(149576,13,1,d|0);break}else{aI(149312,12,1,d|0);break}}}while(0);d=a[54016]|0;if((d|0)==117){f=c[m>>2]|0;aI(148704,16,1,f|0);f=c[m>>2]|0;e=c[13508]|0;if((e|0)==0){g=179864}else{g=c[21784+(e<<2)>>2]|0}j=+h[6756];k=c[13509]|0;if((k|0)==(e|0)){l=179864}else{l=c[21784+(k<<2)>>2]|0}n=+h[6757];e=c[13510]|0;if((e|0)==(k|0)){o=179864}else{o=c[21784+(e<<2)>>2]|0}p=+h[6758];cf(f|0,77392,(v=i,i=i+48|0,c[v>>2]=g,h[v+8>>3]=j,c[v+16>>2]=l,h[v+24>>3]=n,c[v+32>>2]=o,h[v+40>>3]=p,v)|0);o=c[m>>2]|0;aI(148472,18,1,o|0);o=c[m>>2]|0;l=c[13518]|0;if((l|0)==0){q=179864}else{q=c[21784+(l<<2)>>2]|0}p=+h[6761];g=c[13519]|0;if((g|0)==(l|0)){r=179864}else{r=c[21784+(g<<2)>>2]|0}n=+h[6762];l=c[13520]|0;if((l|0)==(g|0)){s=179864}else{s=c[21784+(l<<2)>>2]|0}j=+h[6763];cf(o|0,77392,(v=i,i=i+48|0,c[v>>2]=q,h[v+8>>3]=p,c[v+16>>2]=r,h[v+24>>3]=n,c[v+32>>2]=s,h[v+40>>3]=j,v)|0);s=c[m>>2]|0;aF(10,s|0);t=c[m>>2]|0;u=a[54017]|0;w=u<<24>>24==118;x=w?148008:147816;y=cf(t|0,148168,(v=i,i=i+8|0,c[v>>2]=x,v)|0)|0;i=b;return}else if((d|0)==100){aI(148856,20,1,c[m>>2]|0);t=c[m>>2]|0;u=a[54017]|0;w=u<<24>>24==118;x=w?148008:147816;y=cf(t|0,148168,(v=i,i=i+8|0,c[v>>2]=x,v)|0)|0;i=b;return}else if((d|0)==110){aI(149024,10,1,c[m>>2]|0);t=c[m>>2]|0;u=a[54017]|0;w=u<<24>>24==118;x=w?148008:147816;y=cf(t|0,148168,(v=i,i=i+8|0,c[v>>2]=x,v)|0)|0;i=b;return}else{uf(-1,148400,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}function jX(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0,D=0,E=0,F=0,G=0,H=0,I=0.0,J=0,K=0,L=0,M=0.0,N=0,O=0,P=0;b=i;i=i+48|0;d=b|0;e=b+24|0;f=c[13898]|0;g=c[1054]|0;j=c[g+(f*40&-1)+36>>2]|0;k=c[g+(f*40&-1)+32>>2]|0;l=(a[g+(f*40&-1)|0]&1)==0;n=(j|0)>0;o=c[10036]|0;p=21680;q=116616;L11099:while(1){L11101:do{if(!l){if(n){r=0;s=0;t=k;while(1){u=a[q+r|0]|0;if(u<<24>>24==(a[o+(r+t|0)|0]|0)){w=t;x=s}else{if(u<<24>>24!=36){break L11101}w=t-1|0;x=1}y=r+1|0;if((y|0)<(x+j|0)){r=y;s=x;t=w}else{break}}if((x|0)==0){z=y}else{A=p;break L11099}}else{z=0}t=a[q+z|0]|0;if((t<<24>>24|0)==36|(t<<24>>24|0)==0){A=p;break L11099}}}while(0);t=p+8|0;s=c[t>>2]|0;if((s|0)==0){A=t;break}else{p=t;q=s}}q=c[A+4>>2]|0;if((q|0)==1){if(!(a[928]|0)){A=c[m>>2]|0;aF(10,A|0)}A=c[12890]|0;p=c[m>>2]|0;cf(p|0,114608,(v=i,i=i+8|0,c[v>>2]=122960,v)|0);jh(c[m>>2]|0,122960,A);c[13898]=(c[13898]|0)+1;i=b;return}else if((q|0)==2){if(!(a[928]|0)){A=c[m>>2]|0;aF(10,A|0)}A=c[10058]|0;cf(c[m>>2]|0,114608,(v=i,i=i+8|0,c[v>>2]=122816,v)|0);jh(c[m>>2]|0,122816,A);c[13898]=(c[13898]|0)+1;i=b;return}else if((q|0)==4){j7();c[13898]=(c[13898]|0)+1;i=b;return}else if((q|0)==9){aI(115400,27,1,c[m>>2]|0);A=c[m>>2]|0;if((a[30080]&1)==0){aI(115272,18,1,A|0)}else{aI(115320,56,1,A|0)}c[13898]=(c[13898]|0)+1;i=b;return}else if((q|0)==3){A=f+1|0;c[13898]=A;L11134:do{if((A|0)<(c[8272]|0)){L11136:do{if((a[g+(A*40&-1)|0]&1)!=0){p=c[g+(A*40&-1)+36>>2]|0;z=g+(A*40&-1)+32|0;y=0;while(1){if((y|0)>=(p|0)){break}if((a[o+((c[z>>2]|0)+y|0)|0]|0)==(a[y+103664|0]|0)){y=y+1|0}else{break L11136}}if((y|0)==1){B=0;break L11134}}}while(0);z=is(e)|0;p=c[z>>2]|0;if((p|0)==1){C=+(c[z+8>>2]|0)}else if((p|0)==3){C=+uz(c[z+8>>2]|0,0)}else if((p|0)==2){C=+h[z+8>>3]}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}z=e|0;if((c[z>>2]|0)==3){uu(c[e+8>>2]|0);c[z>>2]=1}z=~~C;if((z|0)>=1){B=z;break}uf(c[13898]|0,208936,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{B=0}}while(0);e=c[10820]|0;if((e|0)==0){D=0}else{A=(B|0)==0;z=0;p=e;while(1){e=c[p+4>>2]|0;if(A){E=e;F=8155}else{if((e|0)==(B|0)){E=B;F=8155}else{G=z}}if((F|0)==8155){F=0;e=c[m>>2]|0;cf(e|0,75168,(v=i,i=i+8|0,c[v>>2]=E,v)|0);ji(c[m>>2]|0,p+8|0,1);e=c[m>>2]|0;aF(10,e|0);G=1}e=c[p>>2]|0;if((e|0)==0){D=G;break}else{z=G;p=e}}}if((B|0)<1|D){i=b;return}else{uf(c[13898]|0,74736,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}else if((q|0)==8){ka();c[13898]=(c[13898]|0)+1;i=b;return}else if((q|0)==7){kb();c[13898]=(c[13898]|0)+1;i=b;return}else if((q|0)==11){j9();c[13898]=(c[13898]|0)+1;i=b;return}else if((q|0)==10){j8();c[13898]=(c[13898]|0)+1;i=b;return}else if((q|0)==5){D=f+1|0;c[13898]=D;L11198:do{if((D|0)<(c[8272]|0)){L11200:do{if((a[g+(D*40&-1)|0]&1)!=0){f=c[g+(D*40&-1)+36>>2]|0;B=g+(D*40&-1)+32|0;p=0;while(1){if((p|0)>=(f|0)){break}if((a[o+((c[B>>2]|0)+p|0)|0]|0)==(a[p+103664|0]|0)){p=p+1|0}else{break L11200}}if((p|0)==1){H=0;break L11198}}}while(0);B=is(d)|0;f=c[B>>2]|0;if((f|0)==2){I=+h[B+8>>3]}else if((f|0)==3){I=+uz(c[B+8>>2]|0,0)}else if((f|0)==1){I=+(c[B+8>>2]|0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}B=d|0;if((c[B>>2]|0)==3){uu(c[d+8>>2]|0);c[B>>2]=1}B=~~I;if((B|0)>=1){H=B;break}uf(c[13898]|0,208936,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{H=0}}while(0);kd(H);i=b;return}else if((q|0)==6){if(!(a[928]|0)){q=c[m>>2]|0;aF(10,q|0)}aI(122192,33,1,c[m>>2]|0);q=c[12738]|0;if((q|0)==0){J=179864}else{J=c[21784+(q<<2)>>2]|0}I=+h[6371];H=c[12739]|0;if((H|0)==(q|0)){K=179864}else{K=c[21784+(H<<2)>>2]|0}C=+h[6372];q=c[12740]|0;if((q|0)==(H|0)){L=179864}else{L=c[21784+(q<<2)>>2]|0}M=+h[6373];cf(c[m>>2]|0,77392,(v=i,i=i+48|0,c[v>>2]=J,h[v+8>>3]=I,c[v+16>>2]=K,h[v+24>>3]=C,c[v+32>>2]=L,h[v+40>>3]=M,v)|0);aF(10,c[m>>2]|0);c[13898]=(c[13898]|0)+1;i=b;return}else{L=c[12890]|0;cf(c[m>>2]|0,114608,(v=i,i=i+8|0,c[v>>2]=122960,v)|0);jh(c[m>>2]|0,122960,L);L=c[10058]|0;cf(c[m>>2]|0,114608,(v=i,i=i+8|0,c[v>>2]=122816,v)|0);jh(c[m>>2]|0,122816,L);L=c[10820]|0;if((L|0)!=0){K=L;do{cf(c[m>>2]|0,75168,(v=i,i=i+8|0,c[v>>2]=c[K+4>>2],v)|0);ji(c[m>>2]|0,K+8|0,1);aF(10,c[m>>2]|0);K=c[K>>2]|0;}while((K|0)!=0)}j7();aI(115400,27,1,c[m>>2]|0);K=c[m>>2]|0;if((a[30080]&1)==0){aI(115272,18,1,K|0)}else{aI(115320,56,1,K|0)}j8();kd(0);j9();ka();if(!(a[928]|0)){K=c[m>>2]|0;aF(10,K|0)}aI(122192,33,1,c[m>>2]|0);K=c[12738]|0;if((K|0)==0){N=179864}else{N=c[21784+(K<<2)>>2]|0}M=+h[6371];L=c[12739]|0;if((L|0)==(K|0)){O=179864}else{O=c[21784+(L<<2)>>2]|0}C=+h[6372];K=c[12740]|0;if((K|0)==(L|0)){P=179864}else{P=c[21784+(K<<2)>>2]|0}I=+h[6373];cf(c[m>>2]|0,77392,(v=i,i=i+48|0,c[v>>2]=N,h[v+8>>3]=M,c[v+16>>2]=O,h[v+24>>3]=C,c[v+32>>2]=P,h[v+40>>3]=I,v)|0);aF(10,c[m>>2]|0);kb();i=b;return}}function jY(){var b=0,d=0,e=0.0,f=0.0;b=i;if(!(a[928]|0)){d=c[m>>2]|0;aF(10,d|0)}e=+g[38];cf(c[m>>2]|0,182560,(v=i,i=i+16|0,h[v>>3]=+g[178],h[v+8>>3]=e,v)|0);e=+g[18074];if(e>0.0){d=c[m>>2]|0;f=e;cf(d|0,181056,(v=i,i=i+8|0,h[v>>3]=f,v)|0);i=b;return}d=c[m>>2]|0;if(e==0.0){aI(180712,36,1,d|0);i=b;return}else{f=-0.0-e;cf(d|0,180280,(v=i,i=i+8|0,h[v>>3]=f,v)|0);i=b;return}}function jZ(b,d,e,f,g,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,n=0.0,o=0,p=0;k=i;if(!(a[928]|0)){l=c[m>>2]|0;aF(10,l|0)}l=c[m>>2]|0;n=+h[77];if((a[624]&1)==0){cf(l|0,185536,(v=i,i=i+8|0,h[v>>3]=n,v)|0)}else{cf(l|0,186024,(v=i,i=i+8|0,h[v>>3]=n,v)|0)}l=c[10026]|0;if((l|0)>-1){o=c[m>>2]|0;p=(l|0)==0?150704:150856;cf(o|0,185040,(v=i,i=i+8|0,c[v>>2]=p,v)|0)}if(b){j4(2)}if(f){j4(6)}if(d){j4(1)}if(g){j4(5)}if(e){j4(0)}if(!j){a[25280]=0;i=k;return}j4(3);a[25280]=0;i=k;return}function j_(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0;b=i;if(!(a[928]|0)){d=c[m>>2]|0;aF(10,d|0)}d=c[13898]|0;e=c[1054]|0;f=c[e+(d*40&-1)+36>>2]|0;g=c[e+(d*40&-1)+32>>2]|0;h=(a[e+(d*40&-1)|0]&1)==0;e=(f|0)>0;j=c[10036]|0;k=56720;l=77416;L11280:while(1){L11282:do{if(!h){if(e){n=0;o=0;p=g;while(1){q=a[l+n|0]|0;if(q<<24>>24==(a[j+(n+p|0)|0]|0)){r=p;s=o}else{if(q<<24>>24!=36){break L11282}r=p-1|0;s=1}t=n+1|0;if((t|0)<(s+f|0)){n=t;o=s;p=r}else{break}}if((s|0)==0){u=t}else{w=k;break L11280}}else{u=0}p=a[l+u|0]|0;if((p<<24>>24|0)==36|(p<<24>>24|0)==0){w=k;break L11280}}}while(0);p=k+8|0;o=c[p>>2]|0;if((o|0)==0){w=p;break}else{k=p;l=o}}l=c[w+4>>2]|0;if((l|0)>-1){c[13898]=d+1;d=c[m>>2]|0;w=56832+(l*24&-1)|0;k=j3(64813+(l*688&-1)|0)|0;cf(d|0,203592,(v=i,i=i+16|0,c[v>>2]=w,c[v+8>>2]=k,v)|0);i=b;return}else{x=0}do{if((c[64808+(x*688&-1)>>2]|0)==1){k=c[m>>2]|0;w=56832+(x*24&-1)|0;d=j3(64813+(x*688&-1)|0)|0;cf(k|0,203592,(v=i,i=i+16|0,c[v>>2]=w,c[v+8>>2]=d,v)|0)}x=x+1|0;}while((x|0)<11);i=b;return}function j$(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=c[65040+(a*688&-1)>>2]|0;if((d|0)==2){e=c[m>>2]|0;f=56832+(a*24&-1)|0;g=~~+h[65048+(a*688&-1)>>3];cf(e|0,187104,(v=i,i=i+16|0,c[v>>2]=f,c[v+8>>2]=g,v)|0);i=b;return}else if((d|0)==1){g=56832+(a*24&-1)|0;cf(c[m>>2]|0,191400,(v=i,i=i+16|0,c[v>>2]=g,c[v+8>>2]=g,v)|0);i=b;return}else if((d|0)==0){cf(c[m>>2]|0,193440,(v=i,i=i+8|0,c[v>>2]=56832+(a*24&-1),v)|0);i=b;return}else if((d|0)==3){cf(c[m>>2]|0,188528,(v=i,i=i+8|0,c[v>>2]=56832+(a*24&-1),v)|0);i=b;return}else{uf(-1,186648,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}function j0(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0;b=i;if(!(a[928]|0)){d=c[m>>2]|0;aF(10,d|0)}d=c[13898]|0;L11319:do{if((d|0)<(c[8272]|0)){e=c[1054]|0;f=(a[e+(d*40&-1)|0]&1)==0;if(f){break}g=c[e+(d*40&-1)+36>>2]|0;h=e+(d*40&-1)+32|0;e=c[10036]|0;j=0;while(1){if((j|0)>=(g|0)){k=8291;break}if((a[e+((c[h>>2]|0)+j|0)|0]|0)==(a[j+103664|0]|0)){j=j+1|0}else{break}}if((k|0)==8291){if((j|0)==1){k=8300;break}}if(!((g|0)>0&(f^1))){break}e=c[10036]|0;l=0;n=0;o=c[h>>2]|0;while(1){if((a[l+210832|0]|0)==(a[e+(l+o|0)|0]|0)){p=o;q=n}else{if((l|0)!=4){break L11319}p=o-1|0;q=1}r=l+1|0;if((r|0)<(q+g|0)){l=r;n=q;o=p}else{break}}if((q|0)!=0){k=8300;break}if((l|0)==3|(l|0)==7){k=8300}}else{k=8300}}while(0);do{if((k|0)==8300){q=c[8528]|0;p=c[m>>2]|0;if((q|0)==0){aI(210088,41,1,p|0);break}else{cf(p|0,209400,(v=i,i=i+8|0,c[v>>2]=q,v)|0);break}}}while(0);q=c[13898]|0;L11343:do{if((q|0)<(c[8272]|0)){p=c[1054]|0;d=(a[p+(q*40&-1)|0]&1)==0;if(d){break}o=c[p+(q*40&-1)+36>>2]|0;n=p+(q*40&-1)+32|0;p=c[10036]|0;g=0;while(1){if((g|0)>=(o|0)){k=8308;break}if((a[p+((c[n>>2]|0)+g|0)|0]|0)==(a[g+103664|0]|0)){g=g+1|0}else{break}}if((k|0)==8308){if((g|0)==1){k=8317;break}}if(!((o|0)>0&(d^1))){break}p=c[10036]|0;l=0;e=0;h=c[n>>2]|0;while(1){if((a[l+209008|0]|0)==(a[p+(l+h|0)|0]|0)){s=h;t=e}else{if((l|0)!=3){break L11343}s=h-1|0;t=1}f=l+1|0;if((f|0)<(t+o|0)){l=f;e=t;h=s}else{break}}if((t|0)!=0){k=8317;break}if((l|0)==2|(l|0)==9){k=8317}}else{k=8317}}while(0);do{if((k|0)==8317){t=a[47120]|0;s=c[m>>2]|0;if(t<<24>>24==0){aI(207840,41,1,s|0);break}else{q=t<<24>>24;cf(s|0,208456,(v=i,i=i+8|0,c[v>>2]=q,v)|0);break}}}while(0);q=c[13898]|0;L11367:do{if((q|0)<(c[8272]|0)){s=c[1054]|0;t=(a[s+(q*40&-1)|0]&1)==0;if(t){break}h=c[s+(q*40&-1)+36>>2]|0;e=s+(q*40&-1)+32|0;s=c[10036]|0;o=0;while(1){if((o|0)>=(h|0)){k=8325;break}if((a[s+((c[e>>2]|0)+o|0)|0]|0)==(a[o+103664|0]|0)){o=o+1|0}else{break}}if((k|0)==8325){if((o|0)==1){k=8334;break}}if(!((h|0)>0&(t^1))){break}s=c[10036]|0;l=0;p=0;n=c[e>>2]|0;while(1){if((a[l+207024|0]|0)==(a[s+(l+n|0)|0]|0)){u=n;w=p}else{if((l|0)!=3){break L11367}u=n-1|0;w=1}d=l+1|0;if((d|0)<(w+h|0)){l=d;p=w;n=u}else{break}}if((w|0)!=0){k=8334;break}if((l|0)==2|(l|0)==8){k=8334}}else{k=8334}}while(0);if((k|0)==8334){w=c[m>>2]|0;u=c[11948]|0;cf(w|0,206416,(v=i,i=i+8|0,c[v>>2]=u,v)|0)}if((a[47712]&1)!=0){u=c[m>>2]|0;aI(205568,55,1,u|0)}if((a[47472]&1)!=0){u=c[m>>2]|0;aI(204904,55,1,u|0)}u=c[13898]|0;w=c[1054]|0;q=c[w+(u*40&-1)+36>>2]|0;n=c[w+(u*40&-1)+32>>2]|0;L11394:do{if((a[w+(u*40&-1)|0]&1)!=0&(q|0)>0){p=c[10036]|0;h=0;s=0;e=n;while(1){if((a[h+204608|0]|0)==(a[p+(h+e|0)|0]|0)){x=e;y=s}else{if((h|0)!=3){z=u;break L11394}x=e-1|0;y=1}t=h+1|0;if((t|0)<(y+q|0)){h=t;s=y;e=x}else{break}}if((y|0)==0){if(!((h|0)==2|(h|0)==6)){z=u;break}}e=c[8272]|0;do{if((u|0)<(e|0)){s=c[10036]|0;p=0;while(1){if((p|0)>=(q|0)){k=8351;break}if((a[s+(n+p|0)|0]|0)==(a[p+103664|0]|0)){p=p+1|0}else{break}}if((k|0)==8351){if((p|0)==1){A=u;break}}s=u+1|0;c[13898]=s;A=s}else{A=u}}while(0);L11415:do{if((A|0)<(e|0)){if((a[w+(A*40&-1)|0]&1)==0){B=A;C=e;break}h=c[w+(A*40&-1)+36>>2]|0;s=w+(A*40&-1)+32|0;l=c[10036]|0;t=0;while(1){if((t|0)>=(h|0)){break}if((a[l+((c[s>>2]|0)+t|0)|0]|0)==(a[t+103664|0]|0)){t=t+1|0}else{B=A;C=e;break L11415}}if((t|0)==1){k=8359}else{B=A;C=e}}else{k=8359}}while(0);if((k|0)==8359){eN(c[m>>2]|0);e=c[m>>2]|0;aF(10,e|0);B=c[13898]|0;C=c[8272]|0}L11425:do{if((B|0)<(C|0)){e=c[1054]|0;s=(a[e+(B*40&-1)|0]&1)==0;if(s){D=B;E=C;break}l=c[e+(B*40&-1)+36>>2]|0;h=e+(B*40&-1)+32|0;e=c[10036]|0;p=0;while(1){if((p|0)>=(l|0)){k=8365;break}if((a[e+((c[h>>2]|0)+p|0)|0]|0)==(a[p+103664|0]|0)){p=p+1|0}else{break}}if((k|0)==8365){if((p|0)==1){k=8374;break}}if(!((l|0)>0&(s^1))){D=B;E=C;break}e=c[10036]|0;t=0;o=0;d=c[h>>2]|0;while(1){if((a[t+204360|0]|0)==(a[e+(t+d|0)|0]|0)){F=d;G=o}else{if((t|0)!=5){D=B;E=C;break L11425}F=d-1|0;G=1}g=t+1|0;if((g|0)<(G+l|0)){t=g;o=G;d=F}else{break}}if((G|0)!=0){k=8374;break}if((t|0)==4|(t|0)==9){k=8374}else{D=B;E=C}}else{k=8374}}while(0);if((k|0)==8374){eO(c[m>>2]|0);D=c[13898]|0;E=c[8272]|0}L11446:do{if((D|0)<(E|0)){d=c[1054]|0;if((a[d+(D*40&-1)|0]&1)==0){H=D;I=E;break}o=c[d+(D*40&-1)+36>>2]|0;l=d+(D*40&-1)+32|0;d=c[10036]|0;e=0;while(1){if((e|0)>=(o|0)){break}if((a[d+((c[l>>2]|0)+e|0)|0]|0)==(a[e+103664|0]|0)){e=e+1|0}else{H=D;I=E;break L11446}}if((e|0)==1){k=8381}else{H=D;I=E}}else{k=8381}}while(0);if((k|0)==8381){l=c[m>>2]|0;aF(10,l|0);H=c[13898]|0;I=c[8272]|0}do{if((H|0)<(I|0)){l=c[1054]|0;d=(a[l+(H*40&-1)|0]&1)==0;if(d){z=H;break L11394}o=c[l+(H*40&-1)+36>>2]|0;t=l+(H*40&-1)+32|0;l=c[10036]|0;h=0;while(1){if((h|0)>=(o|0)){k=8387;break}if((a[l+((c[t>>2]|0)+h|0)|0]|0)==(a[h+103664|0]|0)){h=h+1|0}else{break}}if((k|0)==8387){if((h|0)==1){break}}if(!((o|0)>0&(d^1))){z=H;break L11394}l=c[10036]|0;e=0;s=0;p=c[t>>2]|0;while(1){if((a[e+204080|0]|0)==(a[l+(e+p|0)|0]|0)){J=p;K=s}else{if((e|0)!=5){z=H;break L11394}J=p-1|0;K=1}g=e+1|0;if((g|0)<(K+o|0)){e=g;s=K;p=J}else{break}}if((K|0)!=0){break}if(!((e|0)==4|(e|0)==9)){z=H;break L11394}}}while(0);p=c[m>>2]|0;aI(192576,70,1,p|0);s=c[12174]|0;if((s|0)!=0){o=0;l=s;do{o=o+1|0;cf(p|0,189936,(v=i,i=i+8|0,c[v>>2]=l,v)|0);l=c[48696+(o<<3)>>2]|0;}while((l|0)!=0)}aF(10,p|0);z=c[13898]|0}else{z=u}}while(0);if((z|0)>=(c[8272]|0)){i=b;return}u=c[1054]|0;L11483:do{if((a[u+(z*40&-1)|0]&1)!=0){H=c[u+(z*40&-1)+36>>2]|0;K=u+(z*40&-1)+32|0;J=c[10036]|0;k=0;while(1){if((k|0)>=(H|0)){break}if((a[J+((c[K>>2]|0)+k|0)|0]|0)==(a[k+103664|0]|0)){k=k+1|0}else{break L11483}}if((k|0)!=1){break}i=b;return}}while(0);c[13898]=z+1;i=b;return}function j1(){var b=0,d=0,e=0;b=i;if(!(a[928]|0)){d=c[m>>2]|0;aF(10,d|0)}d=c[m>>2]|0;if((c[8496]|0)==0){aI(211280,14,1,d|0);i=b;return}aI(221800,13,1,d|0);d=c[m>>2]|0;if((c[8498]|0)==0){aI(220672,35,1,d|0)}else{aI(221272,32,1,d|0)}d=c[m>>2]|0;if((c[8500]|0)==0){aI(218440,42,1,d|0)}else{aI(218904,53,1,d|0)}d=c[8497]|0;e=c[m>>2]|0;if((d|0)>0){cf(e|0,217848,(v=i,i=i+8|0,c[v>>2]=d,v)|0)}else{aI(217288,32,1,e|0)}cf(c[m>>2]|0,216608,(v=i,i=i+8|0,c[v>>2]=c[8503],v)|0);cf(c[m>>2]|0,216184,(v=i,i=i+8|0,c[v>>2]=c[13532],v)|0);e=c[13534]|0;if((e|0)!=0){d=c[m>>2]|0;cf(d|0,215632,(v=i,i=i+8|0,c[v>>2]=e,v)|0)}cf(c[m>>2]|0,215176,(v=i,i=i+8|0,c[v>>2]=c[8506],v)|0);e=c[8510]|0;if((e|0)!=0){d=c[m>>2]|0;cf(d|0,214656,(v=i,i=i+8|0,c[v>>2]=e,v)|0)}e=c[m>>2]|0;if((c[8499]|0)==0){aI(213400,33,1,e|0)}else{d=c[8504]|0;cf(e|0,213952,(v=i,i=i+8|0,c[v>>2]=d,v)|0)}cf(c[m>>2]|0,212848,(v=i,i=i+8|0,c[v>>2]=(c[8502]|0)!=0?150376:150208,v)|0);cf(c[m>>2]|0,212248,(v=i,i=i+8|0,c[v>>2]=(c[8501]|0)!=0?179864:211688,v)|0);i=b;return}function j2(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;b=i;i=i+56|0;d=b|0;e=c[10810]|0;f=d|0;uE(f|0,0,51);if(!(a[928]|0)){g=c[m>>2]|0;aF(10,g|0)}g=c[13898]|0;L11527:do{if((g|0)<(c[8272]|0)){h=c[1054]|0;j=(a[h+(g*40&-1)|0]&1)==0;k=c[h+(g*40&-1)+36>>2]|0;l=h+(g*40&-1)+32|0;L11529:do{if(j){n=c[l>>2]|0}else{h=c[10036]|0;o=0;while(1){if((o|0)>=(k|0)){p=8442;break}if((a[h+((c[l>>2]|0)+o|0)|0]|0)==(a[o+103664|0]|0)){o=o+1|0}else{break}}if((p|0)==8442){if((o|0)==1){p=8452;break L11527}}h=c[l>>2]|0;if(!((k|0)>0&(j^1))){n=h;break}q=c[10036]|0;r=0;do{if((a[r+74272|0]|0)!=(a[q+(r+h|0)|0]|0)){n=h;break L11529}r=r+1|0;}while((r|0)<(k|0));if((r|0)!=3){n=h;break}c[13898]=g+1;aI(73856,27,1,c[m>>2]|0);s=1;break L11527}}while(0);j=(k|0)>49?49:k;l=c[10036]|0;q=n;o=0;while(1){t=o+1|0;a[d+o|0]=a[l+q|0]|0;if((t|0)==(j|0)){break}else{q=q+1|0;o=t}}a[d+j|0]=0;c[13898]=g+1;p=8452}else{p=8452}}while(0);do{if((p|0)==8452){g=c[m>>2]|0;if((a[f]|0)==0){aI(72912,30,1,g|0);s=0;break}else{cf(g|0,73512,(v=i,i=i+8|0,c[v>>2]=f,v)|0);s=0;break}}}while(0);if((e|0)==0){i=b;return}else{u=e}do{e=c[u+4>>2]|0;g=bk(e|0,73808)|0;d=(a[f]|0)==0;if(d){p=8459}else{if((a_(e|0,f|0,uA(f|0)|0)|0)==0){p=8459}}do{if((p|0)==8459){p=0;if(!s){if(!((a_(e|0,167320,6)|0)!=0|d^1)){break}}if((a[u+8|0]&1)!=0){break}n=c[m>>2]|0;cf(n|0,223688,(v=i,i=i+16|0,c[v>>2]=g,c[v+8>>2]=e,v)|0);n=c[m>>2]|0;aI(223040,2,1,n|0);j5(c[m>>2]|0,u+16|0,1);n=c[m>>2]|0;aF(10,n|0)}}while(0);u=c[u>>2]|0;}while((u|0)!=0);i=b;return}function j3(b){b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;e=i;if((b|0)==0){f=0;i=e;return f|0}g=c[13364]|0;h=db(g,(uA(b|0)<<2)+4|0,124472)|0;c[13364]=h;c[13362]=h;g=a[b]|0;if(g<<24>>24==0){j=h}else{h=b;b=g;do{g=b<<24>>24;do{if((g|0)==13){k=c[13362]|0;c[13362]=k+1;a[k]=92;k=c[13362]|0;c[13362]=k+1;a[k]=114}else if((g|0)==10){k=c[13362]|0;c[13362]=k+1;a[k]=92;k=c[13362]|0;c[13362]=k+1;a[k]=110}else if((g|0)==34|(g|0)==92){k=c[13362]|0;c[13362]=k+1;a[k]=92;k=a[h]|0;l=c[13362]|0;c[13362]=l+1;a[l]=k}else if((g|0)==9){k=c[13362]|0;c[13362]=k+1;a[k]=92;k=c[13362]|0;c[13362]=k+1;a[k]=116}else{if((c[11252]|0)==15){k=c[13362]|0;c[13362]=k+1;a[k]=b;break}if((bB(b&255|0)|0)!=0){k=a[h]|0;l=c[13362]|0;c[13362]=l+1;a[l]=k;break}k=c[13362]|0;c[13362]=k+1;a[k]=92;be(c[13362]|0,123064,(v=i,i=i+8|0,c[v>>2]=d[h]|0,v)|0);k=c[13362]|0;if((a[k]|0)==0){break}else{m=k}do{m=m+1|0;c[13362]=m;}while((a[m]|0)!=0)}}while(0);h=h+1|0;b=a[h]|0;}while(b<<24>>24!=0);j=c[13362]|0}a[j]=0;f=c[13364]|0;i=e;return f|0}function j4(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0,u=0,w=0,x=0,y=0,z=0.0,A=0,B=0;d=i;i=i+384|0;e=d|0;f=d+48|0;g=d+96|0;j=d+144|0;k=d+224|0;l=d+304|0;n=j3(64864+(b*688&-1)|0)|0;o=56832+(b*24&-1)|0;p=65072+(b*688&-1)|0;q=(a[p]&1)!=0?115944:115008;r=+h[65056+(b*688&-1)>>3];s=+h[65064+(b*688&-1)>>3];cf(c[m>>2]|0,116800,(v=i,i=i+32|0,c[v>>2]=o,c[v+8>>2]=q,h[v+16>>3]=r,h[v+24>>3]=s,v)|0);cf(c[m>>2]|0,113920,(v=i,i=i+8|0,c[v>>2]=o,v)|0);o=64916+(b*688&-1)|0;q=c[o>>2]&3;do{if((q|0)==2){t=c[m>>2]|0;aI(107752,7,1,t|0);if((c[o>>2]&4|0)==0){break}t=c[m>>2]|0;u=(a[p]&1)!=0?115008:115944;cf(t|0,106816,(v=i,i=i+8|0,c[v>>2]=u,v)|0)}else if((q|0)==0){aI(109752,4,1,c[m>>2]|0);i=d;return}else if((q|0)==1){aI(105832,9,1,c[m>>2]|0);if((c[o>>2]&4|0)==0){break}aI(104760,32,1,c[m>>2]|0)}}while(0);if((a[65024+(b*688&-1)|0]&1)!=0){o=c[m>>2]|0;aI(104192,34,1,o|0)}aI(103824,15,1,c[m>>2]|0);do{if((a[65272+(b*688&-1)|0]&1)==0){o=c[m>>2]|0;aI(100008,25,1,o|0)}else{o=c[65128+(b*688&-1)>>2]|0;if((o|0)==0){q=c[m>>2]|0;aI(103432,16,1,q|0);break}else if((o|0)==2){aI(101240,17,1,c[m>>2]|0);break}else if((o|0)==1){aI(100688,18,1,c[m>>2]|0);break}else{break}}}while(0);cf(c[m>>2]|0,99584,(v=i,i=i+8|0,c[v>>2]=n,v)|0);n=65032+(b*688&-1)|0;o=c[m>>2]|0;if((c[n>>2]|0)==0){aI(97264,23,1,o|0)}else{aI(99160,8,1,o|0);o=c[m>>2]|0;q=c[n>>2]|0;cf(o|0,98536,(v=i,i=i+8|0,c[v>>2]=q,v)|0);q=c[m>>2]|0;aI(97880,35,1,q|0)}aI(96688,11,1,c[m>>2]|0);q=c[64984+(b*688&-1)>>2]|0;if((q|0)==0){w=179864}else{w=c[21784+(q<<2)>>2]|0}s=+h[65e3+(b*688&-1)>>3];o=c[64988+(b*688&-1)>>2]|0;if((o|0)==(q|0)){x=179864}else{x=c[21784+(o<<2)>>2]|0}r=+h[65008+(b*688&-1)>>3];q=c[64992+(b*688&-1)>>2]|0;if((q|0)==(o|0)){y=179864}else{y=c[21784+(q<<2)>>2]|0}z=+h[65016+(b*688&-1)>>3];cf(c[m>>2]|0,77392,(v=i,i=i+48|0,c[v>>2]=w,h[v+8>>3]=s,c[v+16>>2]=x,h[v+24>>3]=r,c[v+32>>2]=y,h[v+40>>3]=z,v)|0);aI(84248,2,1,c[m>>2]|0);y=c[64920+(b*688&-1)>>2]|0;if((y|0)==5){x=c[m>>2]|0;aI(94856,30,1,x|0)}else if((y|0)==4){aI(95344,32,1,c[m>>2]|0)}else if((y|0)==2){aI(94192,8,1,c[m>>2]|0);x=64952+(b*688&-1)|0;do{if(+h[x>>3]!=-8.988465674311579e+307){w=c[m>>2]|0;aI(93552,6,1,w|0);w=64808+(b*688&-1)|0;q=c[m>>2]|0;if((c[w>>2]|0)==1){aF(34,q|0);o=j|0;n=64813+(b*688&-1)|0;z=+h[x>>3];t3(g,z);r=z- +O(+z);t4(o,80,n,g,r);n=j3(o)|0;o=c[m>>2]|0;aK(n|0,o|0);o=c[m>>2]|0;aF(34,o|0);A=w;break}else{r=+h[x>>3];cf(q|0,92736,(v=i,i=i+8|0,h[v>>3]=r,v)|0);A=w;break}}else{A=64808+(b*688&-1)|0}}while(0);x=(c[A>>2]|0)==1?91240:179864;cf(c[m>>2]|0,91888,(v=i,i=i+16|0,h[v>>3]=+h[64960+(b*688&-1)>>3],c[v+8>>2]=x,v)|0);x=64968+(b*688&-1)|0;do{if(+h[x>>3]!=8.988465674311579e+307){g=c[m>>2]|0;aI(90664,7,1,g|0);g=c[m>>2]|0;if((c[A>>2]|0)==1){aF(34,g|0);j=k|0;w=64813+(b*688&-1)|0;r=+h[x>>3];t3(f,r);z=r- +O(+r);t4(j,80,w,f,z);w=j3(j)|0;j=c[m>>2]|0;aK(w|0,j|0);j=c[m>>2]|0;aF(34,j|0);break}else{z=+h[x>>3];cf(g|0,92736,(v=i,i=i+8|0,h[v>>3]=z,v)|0);break}}}while(0);aF(10,c[m>>2]|0)}else if((y|0)==1){aI(95816,35,1,c[m>>2]|0)}else if((y|0)==3){aI(90168,25,1,c[m>>2]|0)}else{uf(-1,89432,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}y=64944+(b*688&-1)|0;if((c[y>>2]|0)!=0){x=c[m>>2]|0;aI(89080,18,1,x|0);x=c[y>>2]|0;L11649:do{if((x|0)!=0){y=64808+(b*688&-1)|0;f=l|0;k=64813+(b*688&-1)|0;A=x;do{g=c[A+8>>2]|0;if((g|0)!=0){j=c[m>>2]|0;w=j3(g)|0;cf(j|0,103640,(v=i,i=i+8|0,c[v>>2]=w,v)|0)}w=c[m>>2]|0;if((c[y>>2]|0)==1){aF(34,w|0);z=+h[A>>3];t3(e,z);r=z- +O(+z);t4(f,80,k,e,r);j=j3(f)|0;g=c[m>>2]|0;aK(j|0,g|0);g=c[m>>2]|0;aF(34,g|0)}else{r=+h[A>>3];cf(w|0,92736,(v=i,i=i+8|0,h[v>>3]=r,v)|0)}w=c[A+12>>2]|0;if((w|0)!=0){g=c[m>>2]|0;cf(g|0,95144,(v=i,i=i+8|0,c[v>>2]=w,v)|0)}w=A+16|0;if((c[w>>2]|0)==0){break L11649}aI(86120,2,1,c[m>>2]|0);A=c[w>>2]|0;}while((A|0)!=0)}}while(0);e=c[m>>2]|0;aI(84944,2,1,e|0)}e=64928+(b*688&-1)|0;x=e|0;if((c[x>>2]|0)!=0){l=c[m>>2]|0;aI(84256,2,1,l|0);l=c[m>>2]|0;if((c[x>>2]|0)==0){B=l}else{aI(145280,10,1,l|0);jg(l,e);B=c[m>>2]|0}aF(10,B|0)}B=c[64924+(b*688&-1)>>2]|0;if((B|0)==0){i=d;return}if((a[B]|0)==0){i=d;return}cf(c[m>>2]|0,82560,(v=i,i=i+8|0,c[v>>2]=B,v)|0);i=d;return}function j5(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0.0,n=0,o=0;f=i;g=c[d>>2]|0;if((g|0)==2){j=d+8|0;if((cg(+(+h[j>>3]))|0)==0){aI(133568,3,1,b|0);i=f;return}k=d+16|0;l=+h[k>>3]!=0.0;m=+h[j>>3];j=c[8300]|0;n=j+1|0;c[8300]=(n|0)>3?0:n;n=33096+(j*25&-1)|0;be(n|0,121864,(v=i,i=i+8|0,h[v>>3]=m,v)|0);do{if((a8(n|0,46)|0)==0){if((a8(n|0,101)|0)!=0){break}if((a8(n|0,69)|0)!=0){break}o=(uA(n|0)|0)+(33096+(j*25&-1))|0;a[o]=a[119960]|0;a[o+1|0]=a[119961|0]|0;a[o+2|0]=a[119962|0]|0}}while(0);if(!l){aK(n|0,b|0);i=f;return}m=+h[k>>3];k=c[8300]|0;l=k+1|0;c[8300]=(l|0)>3?0:l;l=33096+(k*25&-1)|0;be(l|0,121864,(v=i,i=i+8|0,h[v>>3]=m,v)|0);do{if((a8(l|0,46)|0)==0){if((a8(l|0,101)|0)!=0){break}if((a8(l|0,69)|0)!=0){break}j=(uA(l|0)|0)+(33096+(k*25&-1))|0;a[j]=a[119960]|0;a[j+1|0]=a[119961|0]|0;a[j+2|0]=a[119962|0]|0}}while(0);cf(b|0,129368,(v=i,i=i+16|0,c[v>>2]=n,c[v+8>>2]=l,v)|0);i=f;return}else if((g|0)==1){cf(b|0,21e4,(v=i,i=i+8|0,c[v>>2]=c[d+8>>2],v)|0);i=f;return}else if((g|0)==3){g=c[d+8>>2]|0;if((g|0)==0){i=f;return}if(e){e=j3(g)|0;cf(b|0,126760,(v=i,i=i+8|0,c[v>>2]=e,v)|0);i=f;return}else{aK(g|0,b|0);i=f;return}}else{uf(-1,125696,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}function j6(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,n=0.0,o=0,p=0.0,q=0,r=0.0;f=i;if((e|0)==0){i=f;return}g=c[m>>2]|0;j=c[e+60>>2]|0;if((j|0)==0){k=179864}else{k=j3(j)|0}cf(g|0,201680,(v=i,i=i+24|0,c[v>>2]=b,c[v+8>>2]=d,c[v+16>>2]=k,v)|0);k=c[e+144>>2]|0;if((k|0)==0){l=179864}else{l=c[21784+(k<<2)>>2]|0}n=+h[e+160>>3];d=c[e+148>>2]|0;if((d|0)==(k|0)){o=179864}else{o=c[21784+(d<<2)>>2]|0}p=+h[e+168>>3];k=c[e+152>>2]|0;if((k|0)==(d|0)){q=179864}else{q=c[21784+(k<<2)>>2]|0}r=+h[e+176>>3];cf(c[m>>2]|0,77392,(v=i,i=i+48|0,c[v>>2]=l,h[v+8>>3]=n,c[v+16>>2]=o,h[v+24>>3]=p,c[v+32>>2]=q,h[v+40>>3]=r,v)|0);q=c[e+64>>2]|0;if((q|0)!=0){o=c[m>>2]|0;l=j3(q)|0;cf(o|0,200976,(v=i,i=i+8|0,c[v>>2]=l,v)|0)}do{if((c[e+4>>2]|0)==-3){l=c[m>>2]|0;aI(200160,30,1,l|0)}else{l=c[e+52>>2]|0;if((l|0)==0){break}o=c[m>>2]|0;cf(o|0,199392,(v=i,i=i+8|0,c[v>>2]=l,v)|0)}}while(0);l=e+72|0;if((c[l>>2]|0)!=0){o=c[m>>2]|0;aI(145280,10,1,o|0);jg(o,l)}if((a[e+184|0]&1)!=0){e=c[m>>2]|0;aI(199048,11,1,e|0)}aF(10,c[m>>2]|0);i=f;return}function j7(){var b=0,d=0,e=0,f=0,g=0.0;b=i;if(!(a[928]|0)){d=c[m>>2]|0;aF(10,d|0)}d=c[12372]|0;if((d|0)==1|(d|0)==4){e=c[m>>2]|0;f=(d|0)==1?179864:114984;g=+(c[12373]|0)/100.0;cf(e|0,115056,(v=i,i=i+16|0,c[v>>2]=f,h[v+8>>3]=g,v)|0)}else if((d|0)==2|(d|0)==5){f=c[12374]|0;cf(c[m>>2]|0,114872,(v=i,i=i+16|0,c[v>>2]=(d|0)==2?179864:114984,c[v+8>>2]=f,v)|0)}else{aI(114808,20,1,c[m>>2]|0)}f=c[m>>2]|0;if((c[12376]|0)==1&(c[12377]|0)==-3){aI(114720,16,1,f|0);i=b;return}else{aI(114672,13,1,f|0);jg(c[m>>2]|0,49504);f=c[m>>2]|0;aF(10,f|0);i=b;return}}function j8(){var a=0,b=0,d=0,e=0,f=0.0,g=0,j=0,k=0.0,l=0,n=0.0,o=0,p=0;a=i;b=c[9670]|0;if((b|0)==4){d=c[m>>2]|0;e=c[9671]|0;f=+h[4840];cf(d|0,115720,(v=i,i=i+16|0,c[v>>2]=e,h[v+8>>3]=f,v)|0)}else if((b|0)==3){cf(c[m>>2]|0,115896,(v=i,i=i+8|0,c[v>>2]=c[9671],v)|0)}else if((b|0)==1){aI(115656,31,1,c[m>>2]|0)}else if((b|0)==2){aI(115560,34,1,c[m>>2]|0)}aI(115520,14,1,c[m>>2]|0);b=c[9720]|0;if((b|0)==0){g=179864}else{g=c[21784+(b<<2)>>2]|0}f=+h[4862];e=c[9721]|0;if((e|0)==(b|0)){j=179864}else{j=c[21784+(e<<2)>>2]|0}k=+h[4863];b=c[9722]|0;if((b|0)==(e|0)){l=179864}else{l=c[21784+(b<<2)>>2]|0}n=+h[4864];cf(c[m>>2]|0,77392,(v=i,i=i+48|0,c[v>>2]=g,h[v+8>>3]=f,c[v+16>>2]=j,h[v+24>>3]=k,c[v+32>>2]=l,h[v+40>>3]=n,v)|0);if((c[9702]|0)!=1){o=c[m>>2]|0;p=aF(10,o|0)|0;i=a;return}cf(c[m>>2]|0,115464,(v=i,i=i+8|0,c[v>>2]=(c[9703]|0)+1,v)|0);o=c[m>>2]|0;p=aF(10,o|0)|0;i=a;return}function j9(){var b=0,d=0,e=0.0,f=0,g=0;b=i;cf(c[m>>2]|0,121184,(v=i,i=i+8|0,c[v>>2]=(c[14068]|0)==257?120960:120872,v)|0);aI(120712,32,1,c[m>>2]|0);d=c[m>>2]|0;e=+h[7032];if((c[14062]|0)==1){cf(d|0,120416,(v=i,i=i+8|0,h[v>>3]=e,v)|0)}else{cf(d|0,120264,(v=i,i=i+8|0,h[v>>3]=e,v)|0)}d=c[m>>2]|0;if((a[56264]&1)==0){aI(119752,28,1,d|0)}else{f=(c[14067]|0)+1|0;cf(d|0,119912,(v=i,i=i+8|0,c[v>>2]=f,v)|0)}cf(c[m>>2]|0,119616,(v=i,i=i+8|0,h[v>>3]=+h[7035],v)|0);f=c[m>>2]|0;d=c[14072]|0;do{if((d|0)==2){g=119368}else{if((d|0)==3){g=119280;break}g=(d|0)==1?119216:119160}}while(0);cf(f|0,119552,(v=i,i=i+8|0,c[v>>2]=g,v)|0);cf(c[m>>2]|0,119104,(v=i,i=i+8|0,c[v>>2]=(a[56292]&1)!=0?116904:116760,v)|0);i=b;return}function ka(){var b=0,d=0,e=0,f=0;b=i;if(!(a[928]|0)){d=c[m>>2]|0;aF(10,d|0)}d=c[12292]|0;if((d|0)>0){e=150856}else{e=(d|0)<0?121920:150704}cf(c[m>>2]|0,122136,(v=i,i=i+8|0,c[v>>2]=e,v)|0);do{if((a[49240]&1)==0){e=c[12303]|0;d=c[m>>2]|0;if((e|0)==-4){aI(121848,10,1,d|0);break}else{f=e+1|0;cf(d|0,121528,(v=i,i=i+8|0,c[v>>2]=f,v)|0);break}}else{jg(c[m>>2]|0,49248)}}while(0);cf(c[m>>2]|0,121456,(v=i,i=i+8|0,h[v>>3]=+h[6153],v)|0);aI(121392,11,1,c[m>>2]|0);jf(c[m>>2]|0,49176);i=b;return}function kb(){var b=0,d=0,e=0,f=0.0,g=0,j=0,k=0.0,l=0,n=0.0;b=i;if(!(a[928]|0)){d=c[m>>2]|0;aF(10,d|0)}aI(122752,32,1,c[m>>2]|0);d=c[12418]|0;if((d|0)==0){e=179864}else{e=c[21784+(d<<2)>>2]|0}f=+h[6211];g=c[12419]|0;if((g|0)==(d|0)){j=179864}else{j=c[21784+(g<<2)>>2]|0}k=+h[6212];d=c[12420]|0;if((d|0)==(g|0)){l=179864}else{l=c[21784+(d<<2)>>2]|0}n=+h[6213];cf(c[m>>2]|0,77392,(v=i,i=i+48|0,c[v>>2]=e,h[v+8>>3]=f,c[v+16>>2]=j,h[v+24>>3]=k,c[v+32>>2]=l,h[v+40>>3]=n,v)|0);cf(c[m>>2]|0,122680,(v=i,i=i+8|0,h[v>>3]=+h[6214],v)|0);l=c[12406]|0;if((l|0)==1){j=c[m>>2]|0;aI(122448,53,1,j|0);i=b;return}else if((l|0)==0){aI(122568,66,1,c[m>>2]|0);i=b;return}else if((l|0)==2){aI(122360,53,1,c[m>>2]|0);i=b;return}else{i=b;return}}function kc(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,n=0,o=0,p=0;e=i;f=b|0;if((c[f>>2]|0)<=0){i=e;return}g=(d|0)>0;h=(d|0)<6;j=d+2|0;k=0;do{aF(9,c[m>>2]|0);if(g){l=0;do{aF(32,c[m>>2]|0);l=l+1|0;}while((l|0)<(d|0))}l=b+8+(k<<5)|0;aK(c[41160+(c[l>>2]<<3)>>2]|0,c[m>>2]|0);n=b+8+(k<<5)+8|0;o=c[l>>2]|0;do{if((o|0)==37|(o|0)==38|(o|0)==39|(o|0)==40){l=c[m>>2]|0;p=c[n>>2]|0;cf(l|0,105024,(v=i,i=i+8|0,c[v>>2]=p,v)|0)}else if((o|0)==6){p=n;cf(c[m>>2]|0,124744,(v=i,i=i+8|0,c[v>>2]=c[(c[p>>2]|0)+4>>2],v)|0);if(!h){l=c[m>>2]|0;aF(10,l|0);break}l=c[m>>2]|0;if((c[(c[p>>2]|0)+8>>2]|0)==0){aI(105080,13,1,l|0);break}else{aF(10,l|0);kc(c[(c[p>>2]|0)+8>>2]|0,j);break}}else if((o|0)==2){cf(c[m>>2]|0,105160,(v=i,i=i+8|0,c[v>>2]=a[c[(c[n>>2]|0)+4>>2]|0]|0,v)|0)}else if((o|0)==0){cf(c[m>>2]|0,105248,(v=i,i=i+8|0,c[v>>2]=c[(c[n>>2]|0)+4>>2],v)|0)}else if((o|0)==3){cf(c[m>>2]|0,105160,(v=i,i=i+8|0,c[v>>2]=a[(c[(c[n>>2]|0)+4>>2]|0)+1|0]|0,v)|0)}else if((o|0)==1){aF(32,c[m>>2]|0);j5(c[m>>2]|0,n|0,1);aF(10,c[m>>2]|0)}else if((o|0)==31){cf(c[m>>2]|0,104848,(v=i,i=i+8|0,c[v>>2]=c[b+8+(k<<5)+16>>2],v)|0)}else if((o|0)==7|(o|0)==8){p=n;cf(c[m>>2]|0,124744,(v=i,i=i+8|0,c[v>>2]=c[(c[p>>2]|0)+4>>2],v)|0);if(!h){l=c[m>>2]|0;aF(10,l|0);break}l=c[m>>2]|0;if((c[(c[p>>2]|0)+8>>2]|0)==0){aI(105080,13,1,l|0);break}else{aF(10,l|0);kc(c[(c[p>>2]|0)+8>>2]|0,j);break}}else{aF(10,c[m>>2]|0)}}while(0);k=k+1|0;}while((k|0)<(c[f>>2]|0));i=e;return}function kd(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0,u=0.0;b=i;d=c[10824]|0;if((d|0)==0){e=0}else{f=(a|0)==0;g=0;j=d;while(1){d=c[j+4>>2]|0;if(f){k=d;l=8695}else{if((d|0)==(a|0)){k=a;l=8695}else{n=g}}do{if((l|0)==8695){l=0;d=c[m>>2]|0;cf(d|0,116640,(v=i,i=i+8|0,c[v>>2]=k,v)|0);d=c[m>>2]|0;aD(d|0);d=c[m>>2]|0;o=j+72|0;p=c[o>>2]|0;if((p|0)==0){q=116368}else{q=(p|0)==2?116472:116424}p=(c[j+12>>2]|0)!=0?150856:150704;cf(d|0,116584,(v=i,i=i+16|0,c[v>>2]=q,c[v+8>>2]=p,v)|0);ji(c[m>>2]|0,j+16|0,0);p=c[m>>2]|0;aF(10,p|0);if((c[o>>2]|0)==0){n=1;break}o=c[m>>2]|0;p=j+112|0;d=c[p>>2]|0;if((d|0)==2){r=128e3}else{r=(d|0)==1?127904:127768}cf(o|0,116328,(v=i,i=i+8|0,c[v>>2]=r,v)|0);s=+h[j+80>>3];o=c[m>>2]|0;if(s<=0.0){aI(116160,29,1,o|0);n=1;break}d=c[j+88>>2]|0;if((d|0)==0){t=179864}else{t=c[21808+(d<<2)>>2]|0}u=+h[j+96>>3];cf(o|0,116216,(v=i,i=i+24|0,c[v>>2]=t,h[v+8>>3]=s,h[v+16>>3]=u,v)|0);if((c[p>>2]|0)!=0){p=c[m>>2]|0;u=+h[j+104>>3];cf(p|0,126792,(v=i,i=i+8|0,h[v>>3]=u,v)|0)}p=c[m>>2]|0;aF(10,p|0);n=1}}while(0);p=c[j>>2]|0;if((p|0)==0){e=n;break}else{g=n;j=p}}}if((a|0)<1|e){i=b;return}else{uf(c[13898]|0,115992,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}function ke(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0.0,k=0.0,l=0,m=0.0;a=i;i=i+8|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-1;e=14296+(d*24&-1)|0;f=c[e>>2]|0;g=c[e+4>>2]|0;e=14304+(d*24&-1)|0;j=+h[e>>3];d=c[e>>2]|0;e=d;do{if((f|0)==3){k=+uz(e,b);l=(e|0)==(c[b>>2]|0);uu(e);if(!l){m=k;break}uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{if((f|0)==2){m=j;break}else if((f|0)==1){m=+(d|0);break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);j=+b3(+m);d=c[6354]|0;if((d|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{f=d+1|0;c[6354]=f;d=14296+(f*24&-1)|0;c[d>>2]=2;c[d+4>>2]=g;h[14304+(f*24&-1)>>3]=j;h[14312+(f*24&-1)>>3]=0.0;i=a;return}}function kf(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0.0,k=0.0,l=0,m=0.0;a=i;i=i+8|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-1;e=14296+(d*24&-1)|0;f=c[e>>2]|0;g=c[e+4>>2]|0;e=14304+(d*24&-1)|0;j=+h[e>>3];d=c[e>>2]|0;e=d;do{if((f|0)==3){k=+uz(e,b);l=(e|0)==(c[b>>2]|0);uu(e);if(!l){m=k;break}uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{if((f|0)==1){m=+(d|0);break}else if((f|0)==2){m=j;break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);j=+bu(+m);f=c[6354]|0;if((f|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{d=f+1|0;c[6354]=d;f=14296+(d*24&-1)|0;c[f>>2]=2;c[f+4>>2]=g;h[14304+(d*24&-1)>>3]=j;h[14312+(d*24&-1)>>3]=0.0;i=a;return}}function kg(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0.0,o=0.0,p=0,q=0.0,r=0,s=0.0,t=0,u=0.0,w=0.0,x=0.0,y=0.0;b=i;i=i+32|0;d=b|0;e=b+8|0;f=b+16|0;g=b+24|0;j=c[6354]|0;if((j|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}k=j-1|0;c[6354]=k;l=c[14296+(j*24&-1)>>2]|0;m=14304+(j*24&-1)|0;n=+h[m>>3];j=c[m>>2]|0;h[g>>3]=n;m=j;j=m;do{if((l|0)==3){o=+uz(j,f);p=(j|0)==(c[f>>2]|0);uu(j);if(p){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[g>>3]=o;q=o;r=c[6354]|0;break}}else{if((l|0)==1){q=+(m|0);r=k;break}else if((l|0)==2){q=n;r=k;break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);if((r|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}k=r-1|0;c[6354]=k;l=c[14296+(r*24&-1)>>2]|0;m=14304+(r*24&-1)|0;n=+h[m>>3];r=c[m>>2]|0;h[g>>3]=n;m=r;r=m;do{if((l|0)==3){o=+uz(r,e);j=(r|0)==(c[e>>2]|0);uu(r);if(j){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[g>>3]=o;s=o;t=c[6354]|0;break}}else{if((l|0)==2){s=n;t=k;break}else if((l|0)==1){s=+(m|0);t=k;break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);if((t|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=t-1;k=14296+(t*24&-1)|0;m=c[k>>2]|0;l=c[k+4>>2]|0;k=14304+(t*24&-1)|0;n=+h[k>>3];r=c[k>>2]|0;h[g>>3]=n;o=+h[14312+(t*24&-1)>>3];t=r;r=t;do{if((m|0)==3){u=+uz(r,d);k=(r|0)==(c[d>>2]|0);uu(r);if(k){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[g>>3]=u;w=u;x=0.0;break}}else{if((m|0)==2){w=n;x=o;break}else if((m|0)==1){w=+(t|0);x=o;break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);do{if(w>0.0&s>0.0){if(q<0.0|q>1.0){break}do{if(q==0.0|q==1.0){y=q}else{if(q*(s+w)<=w){y=+kr(w,s,q);break}o=+kr(s,w,1.0-q);if(o<0.0){y=o;break}y=1.0-o}}while(0);if(y==-1.0){break}h[g>>3]=y;t=c[6354]|0;if((t|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}m=t+1|0;c[6354]=m;t=14296+(m*24&-1)|0;c[t>>2]=2;c[t+4>>2]=l;h[14304+(m*24&-1)>>3]=y;h[14312+(m*24&-1)>>3]=0.0;i=b;return}}while(0);a[1960]=1;c[g>>2]=0;m=c[6354]|0;if((m|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}t=m+1|0;c[6354]=t;m=14296+(t*24&-1)|0;c[m>>2]=1;c[m+4>>2]=l;h[14304+(t*24&-1)>>3]=+h[g>>3];h[14312+(t*24&-1)>>3]=x;i=b;return}function kh(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0,p=0.0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,w=0.0,x=0.0,y=0,z=0.0,A=0.0,B=0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,Q=0.0,R=0.0,S=0.0,T=0.0;b=i;i=i+24|0;d=b|0;e=b+8|0;f=b+16|0;g=c[6354]|0;if((g|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}j=g-1|0;c[6354]=j;k=c[14296+(g*24&-1)>>2]|0;l=14304+(g*24&-1)|0;m=+h[l>>3];g=c[l>>2]|0;h[f>>3]=m;l=g;g=l;do{if((k|0)==3){n=+uz(g,e);o=(g|0)==(c[e>>2]|0);uu(g);if(o){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[f>>3]=n;p=n;q=c[6354]|0;break}}else{if((k|0)==1){p=+(l|0);q=j;break}else if((k|0)==2){p=m;q=j;break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);if((q|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=q-1;j=14296+(q*24&-1)|0;k=c[j>>2]|0;l=c[j+4>>2]|0;j=14304+(q*24&-1)|0;m=+h[j>>3];g=c[j>>2]|0;h[f>>3]=m;n=+h[14312+(q*24&-1)>>3];q=g;g=q;do{if((k|0)==3){r=+uz(g,d);j=(g|0)==(c[d>>2]|0);uu(g);if(j){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[f>>3]=r;s=r;t=0.0;break}}else{if((k|0)==1){s=+(q|0);t=n;break}else if((k|0)==2){s=m;t=n;break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);L12007:do{if(p>=0.0&s>0.0){do{if(p==0.0){u=0.0}else{if(p>1.0e8){u=1.0;break}n=s*+_(+p)-p;m=n- +b2(+(s+1.0));if(m<-706.893623549172){w=0.0}else{w=+Z(+m)}do{if(p>1.0){if(s+2.0>p){x=s;y=0;z=1.0;A=1.0;B=8809;break}m=1.0-s;n=p+m+1.0;r=p+1.0;C=p*n;D=n;k=1;n=1.0;E=p;F=r;G=C;H=m;m=r/C;while(1){C=H+1.0;r=D+2.0;I=C*+(k|0);J=F*r-n*I;K=G*r-E*I;if(K!=0.0){L=J/K;I=L*1.1920928955078125e-7;if(+P(+(m-L))>(I>1.1920928955078125e-7?1.1920928955078125e-7:I)){M=L}else{break}}else{M=m}if(+P(+J)<3.4028234663852886e+38){N=K;O=J;Q=G;R=F}else{N=K/3.4028234663852886e+38;O=J/3.4028234663852886e+38;Q=G/3.4028234663852886e+38;R=F/3.4028234663852886e+38}q=k+1|0;if((q|0)<201){D=r;k=q;n=R;E=Q;F=O;G=N;H=C;m=M}else{break L12007}}S=1.0-s*w*L}else{x=s;y=0;z=1.0;A=1.0;B=8809}}while(0);if((B|0)==8809){while(1){B=0;if((y|0)>=201){break L12007}m=x+1.0;H=A*(p/m);T=z+H;if(H>3]=u;k=c[6354]|0;if((k|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}q=k+1|0;c[6354]=q;k=14296+(q*24&-1)|0;c[k>>2]=2;c[k+4>>2]=l;h[14304+(q*24&-1)>>3]=u;h[14312+(q*24&-1)>>3]=0.0;i=b;return}}while(0);a[1960]=1;c[f>>2]=0;B=c[6354]|0;if((B|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}y=B+1|0;c[6354]=y;B=14296+(y*24&-1)|0;c[B>>2]=1;c[B+4>>2]=l;h[14304+(y*24&-1)>>3]=+h[f>>3];h[14312+(y*24&-1)>>3]=t;i=b;return}function ki(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0.0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0;b=i;i=i+16|0;d=b|0;e=b+8|0;f=c[6354]|0;if((f|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=f-1;g=14296+(f*24&-1)|0;j=c[g>>2]|0;k=c[g+4>>2]|0;g=14304+(f*24&-1)|0;l=+h[g>>3];m=c[g>>2]|0;h[e>>3]=l;n=+h[14312+(f*24&-1)>>3];f=m;m=f;do{if((j|0)==3){o=+uz(m,d);g=(m|0)==(c[d>>2]|0);uu(m);if(g){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[e>>3]=o;p=o;q=0.0;break}}else{if((j|0)==1){p=+(f|0);q=n;break}else if((j|0)==2){p=l;q=n;break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);n=+b2(+p);if(n>709.1962086421661){a[1960]=1;c[e>>2]=0;j=c[6354]|0;if((j|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=j+1|0;c[6354]=f;j=14296+(f*24&-1)|0;c[j>>2]=1;c[j+4>>2]=k;h[14304+(f*24&-1)>>3]=+h[e>>3];h[14312+(f*24&-1)>>3]=q;i=b;return}q=+(c[aH()>>2]|0);if(n<-706.893623549172){r=0.0}else{r=+Z(+n)}n=q*r;h[e>>3]=n;e=c[6354]|0;if((e|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=e+1|0;c[6354]=f;e=14296+(f*24&-1)|0;c[e>>2]=2;c[e+4>>2]=k;h[14304+(f*24&-1)>>3]=n;h[14312+(f*24&-1)>>3]=0.0;i=b;return}function kj(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0.0,k=0.0,l=0,m=0.0;a=i;i=i+8|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-1;e=14296+(d*24&-1)|0;f=c[e>>2]|0;g=c[e+4>>2]|0;e=14304+(d*24&-1)|0;j=+h[e>>3];d=c[e>>2]|0;e=d;do{if((f|0)==3){k=+uz(e,b);l=(e|0)==(c[b>>2]|0);uu(e);if(!l){m=k;break}uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{if((f|0)==2){m=j;break}else if((f|0)==1){m=+(d|0);break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);j=+b2(+m);d=c[6354]|0;if((d|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{f=d+1|0;c[6354]=f;d=14296+(f*24&-1)|0;c[d>>2]=2;c[d+4>>2]=g;h[14304+(f*24&-1)>>3]=j;h[14312+(f*24&-1)>>3]=0.0;i=a;return}}function kk(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,l=0.0,m=0.0,n=0.0,o=0,p=0.0,q=0.0,r=0,s=0,t=0.0,u=0,w=0.0,x=0,y=0,z=0,A=0,B=0.0;b=i;i=i+8|0;d=b|0;e=c[6354]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=e-1;f=14296+(e*24&-1)|0;g=c[f>>2]|0;j=c[f+4>>2]|0;f=14304+(e*24&-1)|0;l=+h[f>>3];m=+h[14312+(e*24&-1)>>3];e=c[f>>2]|0;f=e;do{if((g|0)==3){n=+uz(f,d);o=(f|0)==(c[d>>2]|0);uu(f);if(o){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[k>>3]=n;p=n;q=0.0;r=2;s=c[k>>2]|0;t=n;break}}else{if((g|0)==2){p=l;q=m;r=2;s=e;t=l;break}else if((g|0)==1){p=+(e|0);q=m;r=1;s=e;t=l;break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);do{if(p!=0.0){if((r|0)==2){u=8870;break}else if((r|0)==1){w=+(s|0);x=0;y=s;u=8871;break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}else{if((r|0)==2){if(q!=0.0){u=8870;break}}else if((r|0)!=1){uf(-1,211552,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if(!(a[27800]|0)){u=8886;break}z=c[6948]|0;A=c[6946]|0}}while(0);if((u|0)==8870){w=t;x=~~q;y=~~t;u=8871}L12113:do{if((u|0)==8871){if(w!=+(y|0)){uf(-1,216320,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((r|0)==3){uh(-1,212704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);uf(-1,212032,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((r|0)==1){B=0.0}else if((r|0)==2){B=q}else{uf(-1,211552,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if(B!=+(x|0)){uf(-1,216320,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}do{if((y|0)<1){if((x|0)!=0){uf(-1,216320,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((y|0)>=0){break}a[27800]=0;u=8886;break L12113}else{if((x|0)>=0){break}uf(-1,216320,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);c[6948]=y;s=(x|0)!=0?x:y;c[6946]=s;a[27800]=1;z=y;A=s}}while(0);if((u|0)==8886){a[27800]=1;c[6948]=1234567890;c[6946]=1234567890;z=1234567890;A=1234567890}u=(z|0)/53668&-1;y=(((u*-53668&-1)+z|0)*40014&-1)+(u*-12211&-1)|0;u=(y|0)<0?y+2147483563|0:y;c[6948]=u;y=(A|0)/52774&-1;z=(((y*-52774&-1)+A|0)*40692&-1)+(y*-3791&-1)|0;y=(z|0)<0?z+2147483399|0:z;c[6946]=y;z=u-y|0;y=c[6354]|0;if((y|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{u=y+1|0;c[6354]=u;y=14296+(u*24&-1)|0;c[y>>2]=2;c[y+4>>2]=j;h[14304+(u*24&-1)>>3]=+(((z|0)<1?z+2147483562|0:z)|0)*4.656613057e-10;h[14312+(u*24&-1)>>3]=0.0;i=b;return}}function kl(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0,w=0.0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0;a=i;i=i+400|0;b=a|0;d=a+48|0;e=a+96|0;f=a+144|0;g=a+192|0;j=a+240|0;k=a+288|0;l=a+336|0;m=a+384|0;n=a+392|0;o=c[6354]|0;if((o|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}p=o-1|0;c[6354]=p;q=c[14296+(o*24&-1)>>2]|0;r=14304+(o*24&-1)|0;s=+h[r>>3];o=c[r>>2]|0;r=o;do{if((q|0)==3){t=+uz(r,n);u=(r|0)==(c[n>>2]|0);uu(r);if(u){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{w=t;x=c[6354]|0;break}}else{if((q|0)==2){w=s;x=p;break}else if((q|0)==1){w=+(o|0);x=p;break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);if((x|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=x-1;p=14296+(x*24&-1)|0;o=c[p>>2]|0;q=c[p+4>>2]|0;p=14304+(x*24&-1)|0;s=+h[p>>3];x=c[p>>2]|0;p=x;do{if((o|0)==3){t=+uz(p,m);r=(p|0)==(c[m>>2]|0);uu(p);if(!r){y=t;break}uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{if((o|0)==1){y=+(x|0);break}else if((o|0)==2){y=s;break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);s=w*w;t=w*.56418958;z=+P(+y);A=z*z;do{if(w<70.55){B=+Q(+(w*(40.0-w*3.6)+15100.0));if(w<8.425){C=+Q(+(164.0-w*(w*1.8+4.3)))}else{C=0.0}D=w*18.1+1.65;o=w>1.0e-6;if(z>=B){E=t/(s+A);break}if(z>=(o?C:B)){F=s+.5;E=(F+A)*w*(.56418958/(F*F+A*(s+s+-1.0+A)));break}if(z>(o?6.8-w:B)){B=s*4.0;F=B+-6.0;E=(s*(s*(s+5.5)+8.25)+1.875+A*(s*(s*3.0+1.0)+5.25+A*(F*.75+A)))*w*(.56418958/(s*(s*(s*(s+6.0)+10.5)+4.5)+.5625+A*(s*(s*(B+6.0)+9.0)-4.5+A*(10.5-s*(6.0-s*6.0)+A*(F+A)))));break}if(z>3];H=y-G;I=H*H;h[e+(o<<3)>>3]=I;J=1.0/(B+I);h[b+(o<<3)>>3]=J;h[g+(o<<3)>>3]=J*H;h[j+(o<<3)>>3]=F*J;J=y+G;G=J*J;h[f+(o<<3)>>3]=G;H=1.0/(B+G);h[d+(o<<3)>>3]=H;h[k+(o<<3)>>3]=J*H;h[l+(o<<3)>>3]=F*H;o=o+1|0;}while((o|0)<6);if(z<=D){E=(+h[j>>3]+ +h[l>>3])*1.0117281-(+h[g>>3]- +h[k>>3])*1.393237+0.0+((+h[j+8>>3]+ +h[l+8>>3])*-.75197147-(+h[g+8>>3]- +h[k+8>>3])*.23115241)+((+h[j+16>>3]+ +h[l+16>>3])*.012557727-(+h[g+16>>3]- +h[k+16>>3])*-.15535147)+((+h[j+24>>3]+ +h[l+24>>3])*.010022008-(+h[g+24>>3]- +h[k+24>>3])*.0062183662)+((+h[j+32>>3]+ +h[l+32>>3])*-.00024206814-(+h[g+32>>3]- +h[k+32>>3])*91908299.0e-12)+((+h[j+40>>3]+ +h[l+40>>3])*5.0084806e-7-(+h[g+40>>3]- +h[k+40>>3])*-6.2752596e-7);break}F=w+3.0;B=0.0;o=0;do{H=+h[37592+(o<<3)>>3];J=+h[e+(o<<3)>>3];G=F*+h[37544+(o<<3)>>3];I=+h[f+(o<<3)>>3];B=B+((H*(J*+h[b+(o<<3)>>3]- +h[j+(o<<3)>>3]*1.5)+G*+h[g+(o<<3)>>3])/(J+2.25)+(H*(I*+h[d+(o<<3)>>3]- +h[l+(o<<3)>>3]*1.5)-G*+h[k+(o<<3)>>3])/(I+2.25));o=o+1|0;}while((o|0)<6);E=w*B+ +Z(+(-0.0-A))}else{E=t/(s+A)}}while(0);k=c[6354]|0;if((k|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{l=k+1|0;c[6354]=l;k=14296+(l*24&-1)|0;c[k>>2]=2;c[k+4>>2]=q;h[14304+(l*24&-1)>>3]=E;h[14312+(l*24&-1)>>3]=0.0;i=a;return}}function km(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0.0,k=0.0,l=0,m=0.0;a=i;i=i+8|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-1;e=14296+(d*24&-1)|0;f=c[e>>2]|0;g=c[e+4>>2]|0;e=14304+(d*24&-1)|0;j=+h[e>>3];d=c[e>>2]|0;e=d;do{if((f|0)==3){k=+uz(e,b);l=(e|0)==(c[b>>2]|0);uu(e);if(!l){m=k;break}uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{if((f|0)==2){m=j;break}else if((f|0)==1){m=+(d|0);break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);j=+bu(+(-0.0-m*.7071067811865476));d=c[6354]|0;if((d|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{f=d+1|0;c[6354]=f;d=14296+(f*24&-1)|0;c[d>>2]=2;c[d+4>>2]=g;h[14304+(f*24&-1)>>3]=j*.5;h[14312+(f*24&-1)>>3]=0.0;i=a;return}}function kn(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0.0,l=0.0,m=0,n=0.0,o=0.0,p=0,q=0.0,r=0.0,s=0.0;b=i;i=i+8|0;d=b|0;e=c[6354]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=e-1;f=14296+(e*24&-1)|0;g=c[f>>2]|0;j=c[f+4>>2]|0;f=14304+(e*24&-1)|0;k=+h[f>>3];e=c[f>>2]|0;f=e;do{if((g|0)==3){l=+uz(f,d);m=(f|0)==(c[d>>2]|0);uu(f);if(!m){n=l;break}uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{if((g|0)==2){n=k;break}else if((g|0)==1){n=+(e|0);break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);if(n<=0.0|n>=1.0){a[1960]=1;e=c[6354]|0;if((e|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=e+1|0;c[6354]=g;e=14296+(g*24&-1)|0;c[e>>2]=2;c[e+4>>2]=j;uE(14304+(g*24&-1)|0,0,16);i=b;return}do{if(n>0.0){if(n>=1.0){bD(75808,(v=i,i=i+8|0,c[v>>2]=205976,v)|0);bD(223272,(v=i,i=i+8|0,c[v>>2]=133496,v)|0);o=1.7976931348623157e+308;break}if(n>.8646647167633873){p=0;q=1.0-n}else{p=1;q=n}if(q>.1353352832366127){k=q+-.5;l=k*k;o=(k+k*(l*(l*(l*(l*(l*-59.96335010141079+98.00107541859997)-56.67628574690703)+13.931260938727968)-1.2391658386738125)/(l*(l*(l*(l*(l*(l*(l*(l+1.9544885833814176)+4.676279128988815)+86.36024213908905)-225.46268785411937)+200.26021238006066)-82.03722561683334)+15.90562251262117)-1.1833162112133)))*2.5066282746310007;break}l=+Q(+(+_(+q)*-2.0));k=l- +_(+l)/l;r=1.0/l;if(l<8.0){s=r*(r*(r*(r*(r*(r*(r*(r*(r*4.0554489230596245+31.525109459989388)+57.16281922464213)+44.08050738932008)+14.684956192885803)+2.1866330685079025)+-.1402560791713545)+-.03504246268278482)+-.0008574567851546854)/(r*(r*(r*(r*(r*(r*(r*(r+15.779988325646675)+45.39076351288792)+41.3172038254672)+15.04253856929075)+2.504649462083094)+-.14218292285478779)+-.03808064076915783)+-.0009332594808954574)}else{s=r*(r*(r*(r*(r*(r*(r*(r*(r*3.2377489177694603+6.915228890689842)+3.9388102529247444)+1.3330346081580755)+.20148538954917908)+.012371663481782003)+.00030158155350823543)+26580697468673755.0e-22)+6.239745391849833e-9)/(r*(r*(r*(r*(r*(r*(r*(r+6.02427039364742)+3.6798356385616087)+1.3770209948908132)+.21623699359449663)+.013420400608854318)+.00032801446468212774)+28924786474538068.0e-22)+6.790194080099813e-9)}r=k-s;if((p|0)==0){o=r;break}o=-0.0-r}else{bD(75808,(v=i,i=i+8|0,c[v>>2]=205976,v)|0);bD(223272,(v=i,i=i+8|0,c[v>>2]=133496,v)|0);o=-1.7976931348623157e+308}}while(0);p=c[6354]|0;if((p|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=p+1|0;c[6354]=g;p=14296+(g*24&-1)|0;c[p>>2]=2;c[p+4>>2]=j;h[14304+(g*24&-1)>>3]=o;h[14312+(g*24&-1)>>3]=0.0;i=b;return}function ko(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0.0,l=0.0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0;b=i;i=i+8|0;d=b|0;e=c[6354]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=e-1;f=14296+(e*24&-1)|0;g=c[f>>2]|0;j=c[f+4>>2]|0;f=14304+(e*24&-1)|0;k=+h[f>>3];e=c[f>>2]|0;f=e;do{if((g|0)==3){l=+uz(f,d);m=(f|0)==(c[d>>2]|0);uu(f);if(!m){n=l;break}uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{if((g|0)==2){n=k;break}else if((g|0)==1){n=+(e|0);break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);if(+P(+n)>=1.0){a[1960]=1;e=c[6354]|0;if((e|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=e+1|0;c[6354]=g;e=14296+(g*24&-1)|0;c[e>>2]=2;c[e+4>>2]=j;uE(14304+(g*24&-1)|0,0,16);i=b;return}do{if(n<-1.0|n>1.0){bD(137432,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);o=+_(-1.0)}else{if(n==-1.0|n==1.0){o=+_(0.0)*(-0.0-n);break}do{if(n>-1.0&n<-.7){k=+Q(+(-0.0- +_(+((n+1.0)*.5))));p=(-0.0-(k*(k*(k*1.641345311+3.429567803)-1.624906493)-1.970840454))/(k*(k*1.6370678+3.5438892)+1.0)}else{if(!(n<-.7|n>.7)){k=n*n;p=n*(k*(k*(k*-.140543331+.914624893)-1.645349621)+.886226899)/(k*(k*(k*(k*.012229801+.012229801)+1.442710462)-2.118377725)+1.0);break}if(!(n>.7&n<1.0)){p=0.0;break}k=+Q(+(-0.0- +_(+((1.0-n)*.5))));p=(k*(k*(k*1.641345311+3.429567803)-1.624906493)-1.970840454)/(k*(k*1.6370678+3.5438892)+1.0)}}while(0);k=+b3(+p)-n;l=p*(-0.0-p);if(l<-706.893623549172){q=0.0}else{q=+Z(+l)*1.1283791670955126}l=p-k/q;k=+b3(+l)-n;r=l*(-0.0-l);if(r<-706.893623549172){s=0.0}else{s=+Z(+r)*1.1283791670955126}r=l-k/s;k=+b3(+r)-n;l=r*(-0.0-r);if(l<-706.893623549172){t=0.0}else{t=+Z(+l)*1.1283791670955126}l=r-k/t;k=+b3(+l)-n;r=l*(-0.0-l);if(r<-706.893623549172){u=0.0}else{u=+Z(+r)*1.1283791670955126}o=l-k/u}}while(0);g=c[6354]|0;if((g|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=g+1|0;c[6354]=e;g=14296+(e*24&-1)|0;c[g>>2]=2;c[g+4>>2]=j;h[14304+(e*24&-1)>>3]=o;h[14312+(e*24&-1)>>3]=0.0;i=b;return}function kp(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0.0,l=0.0,m=0,n=0.0,o=0.0,p=0,q=0.0,r=0,s=0.0,t=0.0,u=0.0,w=0.0,x=0.0;b=i;i=i+8|0;d=b|0;e=c[6354]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=e-1;f=14296+(e*24&-1)|0;g=c[f>>2]|0;j=c[f+4>>2]|0;f=14304+(e*24&-1)|0;k=+h[f>>3];e=c[f>>2]|0;f=e;do{if((g|0)==3){l=+uz(f,d);m=(f|0)==(c[d>>2]|0);uu(f);if(!m){n=l;break}uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{if((g|0)==2){n=k;break}else if((g|0)==1){n=+(e|0);break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);L12315:do{if(n<-.36787944117144233){o=-1.0;p=9032}else{if(+P(+n)>1.1920928955078125e-7){if(n<1.0){k=+Q(+((n*2.718281828459045+1.0)*2.0));q=k+-1.0-k*k/3.0+k*k*k*.1527777777777778}else{q=+_(+n)}if(n>3.0){r=0;s=q- +_(+q)}else{r=0;s=q}while(1){if((r|0)>=20){o=-1.0;p=9032;break L12315}if(s<-706.893623549172){t=0.0}else{t=+Z(+s)}k=s*t-n;l=s+1.0;u=k/(l*t-(s+2.0)*.5*k/l);l=s-u;k=+P(+u);if(k<(+P(+l)+1.0)*1.1920928955078125e-7){w=l;break}else{r=r+1|0;s=l}}}else{w=n}if(w>-1.0){x=w}else{o=w;p=9032}}}while(0);if((p|0)==9032){a[1960]=1;x=o}p=c[6354]|0;if((p|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{r=p+1|0;c[6354]=r;p=14296+(r*24&-1)|0;c[p>>2]=2;c[p+4>>2]=j;h[14304+(r*24&-1)>>3]=x;h[14312+(r*24&-1)>>3]=0.0;i=b;return}}function kq(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0.0,k=0.0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0;a=i;i=i+8|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-1;e=14296+(d*24&-1)|0;f=c[e>>2]|0;g=c[e+4>>2]|0;e=14304+(d*24&-1)|0;j=+h[e>>3];d=c[e>>2]|0;e=d;do{if((f|0)==3){k=+uz(e,b);l=(e|0)==(c[b>>2]|0);uu(e);if(!l){m=k;break}uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{if((f|0)==2){m=j;break}else if((f|0)==1){m=+(d|0);break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);j=+P(+m);k=+R(+j,3.0);if(m<0.0){n=+Q(+(k+.37));o=+R(+j,1.5)*.6666666666666666;j=n*.3989422;p=(j+-.043883564)*+S(+o);q=p/+R(+n,1.1666666666666667)+0.0;p=m*(-.013883003-j)*+T(+o);r=q+p/(o*+R(+n,.8333333333333334)*1.5)}else{n=+Q(+(k+.0425));k=(n*.326662423+-.002800908)/+R(+n,1.1666666666666667)+0.0;o=k+m*(-.007232251-n*.044567423)/+R(+n,1.8333333333333333);r=o*+Z(+(n*-.6666666666666666))}d=c[6354]|0;if((d|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{f=d+1|0;c[6354]=f;d=14296+(f*24&-1)|0;c[d>>2]=2;c[d+4>>2]=g;h[14304+(f*24&-1)>>3]=r;h[14312+(f*24&-1)>>3]=0.0;i=a;return}}function kr(a,b,c){a=+a;b=+b;c=+c;var d=0.0,e=0.0,f=0.0,g=0.0,h=0.0,i=0.0,j=0.0,k=0.0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0.0,u=0;d=a+b;e=+b2(+d);f=e+ +_(+c)*a;e=f+ +_(+(1.0-c))*b;f=e- +b2(+(a+1.0));e=f- +b2(+b);if(e<-706.893623549172){g=1.0;h=1.0;i=0.0;j=0.0;k=0.0;l=0;m=1}else{f=+Z(+e);g=1.0;h=1.0;i=f;j=f;k=0.0;l=0;m=1}while(1){f=+(m|0);e=+(l|0);n=e+(f+a);o=(d+e)*(-0.0-(e+a))*c/n/(n+-1.0);e=f*(b-f)*c/n/(n+1.0);n=j+k*o;f=g+h*o;o=n+j*e;p=f+g*e;e=+P(+p)<1.1920928955078125e-7?0.0:p;if(e!=0.0){p=o/e;q=+P(+(p-i));if(q<+P(+p)*1.1920928955078125e-7){r=p;s=9057;break}else{t=p}}else{t=i}u=l+1|0;if((u|0)<201){g=e;h=f;i=t;j=o;k=n;l=u;m=m+1|0}else{r=-1.0;s=9056;break}}if((s|0)==9056){return+r}else if((s|0)==9057){return+r}return 0.0}function ks(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0,p=0.0,q=0,r=0.0,s=0.0,t=0,u=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0;b=i;i=i+24|0;d=b|0;e=b+8|0;f=b+16|0;g=c[6354]|0;if((g|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}j=g-1|0;c[6354]=j;k=c[14296+(g*24&-1)>>2]|0;l=14304+(g*24&-1)|0;m=+h[l>>3];g=c[l>>2]|0;l=g;do{if((k|0)==3){n=+uz(l,f);o=(l|0)==(c[f>>2]|0);uu(l);if(o){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{p=n;q=c[6354]|0;break}}else{if((k|0)==1){p=+(g|0);q=j;break}else if((k|0)==2){p=m;q=j;break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);if((q|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=q-1;j=14296+(q*24&-1)|0;k=c[j>>2]|0;g=c[j+4>>2]|0;j=14304+(q*24&-1)|0;m=+h[j>>3];q=c[j>>2]|0;j=q;do{if((k|0)==3){n=+uz(j,e);l=(j|0)==(c[e>>2]|0);uu(j);if(!l){r=n;break}uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{if((k|0)==2){r=m;break}else if((k|0)==1){r=+(q|0);break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);do{if(r<0.0|p<0.0){s=-1.0;t=9095}else{if(+bj(+r,d|0)!=0.0){s=-1.0;t=9095;break}q=p==0.0;if(q&r<2.0){s=-1.0;t=9095;break}do{if(r==0.0){u=+Z(+(-0.0-p))/p}else{if(q){u=1.0/(r+-1.0);break}if(p>3.0){m=1.0;n=1.0;w=p;x=0.0;y=1.0;k=0;while(1){z=r+ +(k|0);A=x*z+m;B=w+z*n;j=k+1|0;z=+(j|0);C=z*m+p*A;D=z*w+p*B;E=C/D;if(E==y){break}if(D<3.4028234663852886e+38){F=A;G=D;H=B;I=C}else{F=A/3.4028234663852886e+38;G=D/3.4028234663852886e+38;H=B/3.4028234663852886e+38;I=C/3.4028234663852886e+38}if((j|0)<333){m=I;n=H;w=G;x=F;y=E;k=j}else{break}}u=E*+Z(+(-0.0-p));break}y=-.5772156649015329- +_(+p);x=0.0;w=1.0;k=1;while(1){n=+(k|0);m=p*(-0.0-w)/n;J=y-m/n;if(J==x){break}j=k+1|0;if((j|0)<333){y=J;x=J;w=m;k=j}else{break}}if(r<=1.0){u=J;break}w=+Z(+(-0.0-p));x=J;y=1.0;while(1){m=(w-p*x)/y;n=y+1.0;if(n-1.0){K=u}else{s=u;t=9095}}}while(0);if((t|0)==9095){a[1960]=1;K=s}t=c[6354]|0;if((t|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{d=t+1|0;c[6354]=d;t=14296+(d*24&-1)|0;c[t>>2]=2;c[t+4>>2]=g;h[14304+(d*24&-1)>>3]=K;h[14312+(d*24&-1)>>3]=0.0;i=b;return}}function kt(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,k=0.0,l=0.0,m=0,n=0.0,o=0;a=i;i=i+8|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=d-1|0;c[6354]=e;f=14296+(d*24&-1)|0;g=c[f>>2]|0;j=c[f+4>>2]|0;f=14304+(d*24&-1)|0;k=+h[f>>3];d=c[f>>2]|0;f=d;do{if((g|0)==3){l=+uz(f,b);m=(f|0)==(c[b>>2]|0);uu(f);if(m){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{n=l;o=c[6354]|0;break}}else{if((g|0)==1){n=+(d|0);o=e;break}else if((g|0)==2){n=k;o=e;break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);if((o|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{e=o+1|0;c[6354]=e;o=14296+(e*24&-1)|0;c[o>>2]=2;c[o+4>>2]=j;h[14304+(e*24&-1)>>3]=n;h[14312+(e*24&-1)>>3]=0.0;i=a;return}}function ku(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0.0,m=0,n=0,o=0.0,p=0;a=i;i=i+8|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=d-1|0;c[6354]=e;f=14296+(d*24&-1)|0;g=c[f>>2]|0;j=c[f+4>>2]|0;f=c[14304+(d*24&-1)>>2]|0;do{if((g|0)==3){uz(f,b);k=(f|0)==(c[b>>2]|0);uu(f);if(k){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{l=0.0;m=c[6354]|0;n=9118;break}}else{if((g|0)==2){l=+h[14312+(d*24&-1)>>3];m=e;n=9118;break}else if((g|0)==1){o=0.0;p=e;break}uf(-1,211552,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);if((n|0)==9118){o=l;p=m}if((p|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{m=p+1|0;c[6354]=m;p=14296+(m*24&-1)|0;c[p>>2]=2;c[p+4>>2]=j;h[14304+(m*24&-1)>>3]=o;h[14312+(m*24&-1)>>3]=0.0;i=a;return}}function kv(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,k=0.0,l=0.0,m=0.0,n=0,o=0.0,p=0,q=0,r=0.0,s=0;a=i;i=i+8|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=d-1|0;c[6354]=e;f=14296+(d*24&-1)|0;g=c[f>>2]|0;j=c[f+4>>2]|0;f=14304+(d*24&-1)|0;k=+h[f>>3];l=+h[14312+(d*24&-1)>>3];d=c[f>>2]|0;f=d;do{if((g|0)==3){m=+uz(f,b);n=(f|0)==(c[b>>2]|0);uu(f);if(n){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{o=m;p=c[6354]|0;q=9132;break}}else{if((g|0)==1){r=(d|0)>-1?0.0:3.141592653589793;s=e;break}else if((g|0)==2){if(l==0.0){o=k;p=e;q=9132;break}r=+Y(+l,+k);s=e;break}else{uf(-1,210664,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);if((q|0)==9132){r=o<0.0?3.141592653589793:0.0;s=p}if((s|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{o=r/+h[9040];p=s+1|0;c[6354]=p;s=14296+(p*24&-1)|0;c[s>>2]=2;c[s+4>>2]=j;h[14304+(p*24&-1)>>3]=o;h[14312+(p*24&-1)>>3]=0.0;i=a;return}}function kw(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,k=0.0,l=0,m=0.0,n=0,o=0.0,p=0.0,q=0;a=i;i=i+8|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=d-1|0;c[6354]=e;f=14296+(d*24&-1)|0;g=c[f>>2]|0;j=c[f+4>>2]|0;f=14304+(d*24&-1)|0;k=+h[f>>3];l=c[f>>2]|0;f=l;do{if((g|0)==3){m=+uz(f,b);n=(f|0)==(c[b>>2]|0);uu(f);if(n){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{o=0.0;p=m;q=c[6354]|0;break}}else{if((g|0)==2){o=+h[14312+(d*24&-1)>>3];p=k;q=e;break}else if((g|0)==1){o=0.0;p=+(l|0);q=e;break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);if((q|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{e=q+1|0;c[6354]=e;q=14296+(e*24&-1)|0;c[q>>2]=2;c[q+4>>2]=j;h[14304+(e*24&-1)>>3]=p;h[14312+(e*24&-1)>>3]=-0.0-o;i=a;return}}function kx(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0.0,k=0,l=0.0,m=0,n=0.0,o=0.0,p=0.0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,w=0.0,x=0.0,y=0.0;a=i;i=i+8|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-1;e=14296+(d*24&-1)|0;f=c[e>>2]|0;g=c[e+4>>2]|0;e=14304+(d*24&-1)|0;j=+h[e>>3];k=c[e>>2]|0;e=k;do{if((f|0)==3){l=+uz(e,b);m=(e|0)==(c[b>>2]|0);uu(e);if(m){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{n=0.0;o=+h[9040];p=l;q=9159;break}}else{l=+h[9040];if((f|0)==2){n=+h[14312+(d*24&-1)>>3];o=l;p=j;q=9159;break}else if((f|0)==1){r=+(k|0);s=+T(+(l*r));t=s*+a4(+(l*0.0));l=+h[9040];u=0.0;w=t;x=l;y=l*r;break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);if((q|0)==9159){j=+T(+(o*p));r=j*+a4(+(n*o));o=+h[9040];u=n;w=r;x=o;y=o*p}p=+bz(+(x*u));q=c[6354]|0;if((q|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{u=+S(+y)*p;k=q+1|0;c[6354]=k;q=14296+(k*24&-1)|0;c[q>>2]=2;c[q+4>>2]=g;h[14304+(k*24&-1)>>3]=w;h[14312+(k*24&-1)>>3]=u;i=a;return}}function ky(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0.0,k=0,l=0.0,m=0,n=0.0,o=0.0,p=0.0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,w=0.0,x=0.0,y=0.0;a=i;i=i+8|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-1;e=14296+(d*24&-1)|0;f=c[e>>2]|0;g=c[e+4>>2]|0;e=14304+(d*24&-1)|0;j=+h[e>>3];k=c[e>>2]|0;e=k;do{if((f|0)==3){l=+uz(e,b);m=(e|0)==(c[b>>2]|0);uu(e);if(m){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{n=0.0;o=+h[9040];p=l;q=9172;break}}else{l=+h[9040];if((f|0)==2){n=+h[14312+(d*24&-1)>>3];o=l;p=j;q=9172;break}else if((f|0)==1){r=+(k|0);s=+S(+(l*r));t=s*+a4(+(l*0.0));l=+h[9040];u=0.0;w=t;x=l;y=l*r;break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);if((q|0)==9172){j=+S(+(o*p));r=j*+a4(+(n*o));o=+h[9040];u=n;w=r;x=o;y=o*p}p=+bz(+(x*u));q=c[6354]|0;if((q|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{u=p*(-0.0- +T(+y));k=q+1|0;c[6354]=k;q=14296+(k*24&-1)|0;c[q>>2]=2;c[q+4>>2]=g;h[14304+(k*24&-1)>>3]=w;h[14312+(k*24&-1)>>3]=u;i=a;return}}function kz(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0.0,m=0.0,n=0.0,o=0,p=0.0,q=0.0,r=0,s=0.0,t=0.0,u=0,w=0.0;b=i;i=i+8|0;d=b|0;e=c[6354]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=e-1|0;c[6354]=f;g=14296+(e*24&-1)|0;j=c[g>>2]|0;k=c[g+4>>2]|0;g=14304+(e*24&-1)|0;l=+h[g>>3];m=+h[14312+(e*24&-1)>>3];e=c[g>>2]|0;g=e;do{if((j|0)==3){n=+uz(g,d);o=(g|0)==(c[d>>2]|0);uu(g);if(o){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{p=n;q=+h[9040];r=c[6354]|0;break}}else{if((j|0)==1){p=+(e|0);q=+h[9040];r=f;break}else if((j|0)==2){n=+h[9040];if(m==0.0){p=l;q=n;r=f;break}s=n*2.0;n=+S(+(s*l));t=n+ +a4(+(m*s));if(t==0.0){a[1960]=1;o=c[6354]|0;if((o|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}u=o+1|0;c[6354]=u;o=14296+(u*24&-1)|0;c[o>>2]=2;c[o+4>>2]=k;h[14304+(u*24&-1)>>3]=l;h[14312+(u*24&-1)>>3]=m;i=b;return}else{s=+h[9040]*2.0;n=+bz(+(m*s));u=c[6354]|0;if((u|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}w=+T(+(s*l))/t;o=u+1|0;c[6354]=o;u=14296+(o*24&-1)|0;c[u>>2]=2;c[u+4>>2]=k;h[14304+(o*24&-1)>>3]=w;h[14312+(o*24&-1)>>3]=n/t;i=b;return}}else{uf(-1,211552,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);if((r|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}l=+U(+(q*p));f=r+1|0;c[6354]=f;r=14296+(f*24&-1)|0;c[r>>2]=2;c[r+4>>2]=k;h[14304+(f*24&-1)>>3]=l;h[14312+(f*24&-1)>>3]=0.0;i=b;return}function kA(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0.0,k=0.0,l=0.0,m=0,n=0.0,o=0.0,p=0,q=0.0,r=0.0;a=i;i=i+8|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-1;e=14296+(d*24&-1)|0;f=c[e>>2]|0;g=c[e+4>>2]|0;e=14304+(d*24&-1)|0;j=+h[e>>3];k=+h[14312+(d*24&-1)>>3];d=c[e>>2]|0;e=d;do{if((f|0)==3){l=+uz(e,b);m=(e|0)==(c[b>>2]|0);uu(e);if(!m){n=l;o=0.0;p=9209;break}uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{if((f|0)==1){n=+(d|0);o=0.0;p=9209;break}else if((f|0)==2){if(k==0.0){n=j;o=k;p=9209;break}else{q=j;r=k;break}}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);do{if((p|0)==9209){if(+P(+n)>1.0){q=n;r=o;break}f=c[6354]|0;if((f|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}k=+h[9040];j=+W(+n)/k;d=f+1|0;c[6354]=d;f=14296+(d*24&-1)|0;c[f>>2]=2;c[f+4>>2]=g;h[14304+(d*24&-1)>>3]=j;h[14312+(d*24&-1)>>3]=0.0;i=a;return}}while(0);if(q==0.0){p=c[6354]|0;if((p|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}n=+h[9040];o=(-0.0- +_(+(+Q(+(r*r+1.0))-r)))/n;d=p+1|0;c[6354]=d;p=14296+(d*24&-1)|0;c[p>>2]=2;c[p+4>>2]=g;h[14304+(d*24&-1)>>3]=0.0;h[14312+(d*24&-1)>>3]=o;i=a;return}else{o=q+1.0;n=r*r;j=+Q(+(n+o*o))*.5;o=q+-1.0;q=+Q(+(n+o*o))*.5;o=j-q;n=j+q;q=+h[9040];d=c[6354]|0;if((d|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}j=+W(+(o>1.0?1.0:o))/q;o=(r>=0.0?1.0:-1.0)*+_(+(n+ +Q(+(n*n+-1.0))))/q;p=d+1|0;c[6354]=p;d=14296+(p*24&-1)|0;c[d>>2]=2;c[d+4>>2]=g;h[14304+(p*24&-1)>>3]=j;h[14312+(p*24&-1)>>3]=o;i=a;return}}function kB(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0.0,k=0.0,l=0.0,m=0,n=0.0,o=0.0,p=0,q=0.0,r=0.0,s=0.0;a=i;i=i+8|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-1;e=14296+(d*24&-1)|0;f=c[e>>2]|0;g=c[e+4>>2]|0;e=14304+(d*24&-1)|0;j=+h[e>>3];k=+h[14312+(d*24&-1)>>3];d=c[e>>2]|0;e=d;do{if((f|0)==3){l=+uz(e,b);m=(e|0)==(c[b>>2]|0);uu(e);if(!m){n=l;o=0.0;p=9233;break}uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{if((f|0)==2){if(k==0.0){n=j;o=k;p=9233;break}else{q=j;r=k;break}}else if((f|0)==1){n=+(d|0);o=0.0;p=9233;break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);do{if((p|0)==9233){if(+P(+n)>1.0){q=n;r=o;break}d=c[6354]|0;if((d|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}k=+h[9040];j=+V(+n)/k;f=d+1|0;c[6354]=f;d=14296+(f*24&-1)|0;c[d>>2]=2;c[d+4>>2]=g;h[14304+(f*24&-1)>>3]=j;h[14312+(f*24&-1)>>3]=0.0;i=a;return}}while(0);n=q+1.0;o=r*r;j=+Q(+(o+n*n))*.5;n=q+-1.0;q=+Q(+(o+n*n))*.5;n=j+q;o=j-q;do{if(o>1.0){s=1.0}else{if(o>=-1.0){s=o;break}s=-1.0}}while(0);o=+h[9040];p=c[6354]|0;if((p|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}q=+V(+s)/o;s=+_(+(n+ +Q(+(n*n+-1.0))))*(-0.0-(r>=0.0?1.0:-1.0))/o;f=p+1|0;c[6354]=f;p=14296+(f*24&-1)|0;c[p>>2]=2;c[p+4>>2]=g;h[14304+(f*24&-1)>>3]=q;h[14312+(f*24&-1)>>3]=s;i=a;return}function kC(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0.0,o=0,p=0.0,q=0,r=0,s=0.0,t=0,u=0.0,w=0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0;b=i;i=i+8|0;d=b|0;e=c[6354]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=e-1|0;c[6354]=f;g=14296+(e*24&-1)|0;j=g|0;k=c[j>>2]|0;l=g+4|0;g=c[l>>2]|0;m=14304+(e*24&-1)|0;n=+h[m>>3];o=14312+(e*24&-1)|0;p=+h[o>>3];q=c[m>>2]|0;r=q;do{if((k|0)==3){s=+uz(r,d);t=(r|0)==(c[d>>2]|0);uu(r);if(t){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{u=s;w=c[6354]|0;break}}else{if((k|0)==2){if(p==0.0){u=n;w=f;break}do{if(n==0.0){if(+P(+p)<1.0){break}a[1960]=1;if((f|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=e;c[j>>2]=2;c[l>>2]=g;uE(m|0,0,16);i=b;return}}while(0);if(n<0.0){x=-0.0-p;y=-0.0-n}else{x=p;y=n}s=y*y;z=+X(+(y*2.0/(1.0-s-x*x)));A=x+1.0;B=x+-1.0;C=+_(+((s+A*A)/(s+B*B)))*.25;if(z<0.0){D=z+3.141592653589793}else{D=z}if(n<0.0){E=-0.0-D;F=-0.0-C}else{E=D;F=C}if((f|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}C=E*.5/+h[9040];c[6354]=e;c[j>>2]=2;c[l>>2]=g;h[m>>3]=C;h[o>>3]=F;i=b;return}else if((k|0)==1){u=+(q|0);w=f;break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);if((w|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}F=+h[9040];E=+X(+u)/F;f=w+1|0;c[6354]=f;w=14296+(f*24&-1)|0;c[w>>2]=2;c[w+4>>2]=g;h[14304+(f*24&-1)>>3]=E;h[14312+(f*24&-1)>>3]=0.0;i=b;return}function kD(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0,p=0.0,q=0,r=0.0,s=0.0,t=0.0,u=0;b=i;i=i+24|0;d=b|0;e=b+8|0;f=b+16|0;g=c[6354]|0;if((g|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}j=g-1|0;c[6354]=j;k=c[14296+(g*24&-1)>>2]|0;l=14304+(g*24&-1)|0;m=+h[l>>3];g=c[l>>2]|0;h[f>>3]=m;l=g;g=l;do{if((k|0)==3){n=+uz(g,e);o=(g|0)==(c[e>>2]|0);uu(g);if(o){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[f>>3]=n;p=n;q=c[6354]|0;break}}else{if((k|0)==2){p=m;q=j;break}else if((k|0)==1){p=+(l|0);q=j;break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);if((q|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=q-1;j=14296+(q*24&-1)|0;l=c[j>>2]|0;k=c[j+4>>2]|0;j=14304+(q*24&-1)|0;m=+h[j>>3];g=c[j>>2]|0;h[f>>3]=m;n=+h[14312+(q*24&-1)>>3];q=g;g=q;do{if((l|0)==3){r=+uz(g,d);j=(g|0)==(c[d>>2]|0);uu(g);if(j){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[f>>3]=r;s=r;t=0.0;break}}else{if((l|0)==2){s=m;t=n;break}else if((l|0)==1){s=+(q|0);t=n;break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);do{if(p==0.0&s==0.0){a[1960]=1;c[f>>2]=0;q=c[6354]|0;if((q|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{l=q+1|0;c[6354]=l;q=14296+(l*24&-1)|0;c[q>>2]=1;c[q+4>>2]=k;h[14304+(l*24&-1)>>3]=+h[f>>3];h[14312+(l*24&-1)>>3]=t;u=l;break}}else{u=c[6354]|0}}while(0);t=+Y(+s,+p);p=t/+h[9040];h[f>>3]=p;if((u|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{f=u+1|0;c[6354]=f;u=14296+(f*24&-1)|0;c[u>>2]=2;c[u+4>>2]=k;h[14304+(f*24&-1)>>3]=p;h[14312+(f*24&-1)>>3]=0.0;i=b;return}}function kE(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0.0,k=0,l=0.0,m=0,n=0.0,o=0.0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0;a=i;i=i+8|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-1;e=14296+(d*24&-1)|0;f=c[e>>2]|0;g=c[e+4>>2]|0;e=14304+(d*24&-1)|0;j=+h[e>>3];k=c[e>>2]|0;e=k;do{if((f|0)==3){l=+uz(e,b);m=(e|0)==(c[b>>2]|0);uu(e);if(!m){n=0.0;o=l;p=9311;break}uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{l=+h[14312+(d*24&-1)>>3];if((f|0)==1){q=+(k|0);r=+bz(+q);s=0.0;t=r;u=+a4(+q);break}else if((f|0)==2){n=l;o=j;p=9311;break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);if((p|0)==9311){j=+bz(+o);l=j*+S(+n);s=n;t=l;u=+a4(+o)}p=c[6354]|0;if((p|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{o=u*+T(+s);f=p+1|0;c[6354]=f;p=14296+(f*24&-1)|0;c[p>>2]=2;c[p+4>>2]=g;h[14304+(f*24&-1)>>3]=t;h[14312+(f*24&-1)>>3]=o;i=a;return}}function kF(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0.0,k=0,l=0.0,m=0,n=0.0,o=0.0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0;a=i;i=i+8|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-1;e=14296+(d*24&-1)|0;f=c[e>>2]|0;g=c[e+4>>2]|0;e=14304+(d*24&-1)|0;j=+h[e>>3];k=c[e>>2]|0;e=k;do{if((f|0)==3){l=+uz(e,b);m=(e|0)==(c[b>>2]|0);uu(e);if(!m){n=0.0;o=l;p=9323;break}uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{l=+h[14312+(d*24&-1)>>3];if((f|0)==1){q=+(k|0);r=+a4(+q);s=0.0;t=r;u=+bz(+q);break}else if((f|0)==2){n=l;o=j;p=9323;break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);if((p|0)==9323){j=+a4(+o);l=j*+S(+n);s=n;t=l;u=+bz(+o)}p=c[6354]|0;if((p|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{o=u*+T(+s);f=p+1|0;c[6354]=f;p=14296+(f*24&-1)|0;c[p>>2]=2;c[p+4>>2]=g;h[14304+(f*24&-1)>>3]=t;h[14312+(f*24&-1)>>3]=o;i=a;return}}function kG(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0.0,k=0,l=0.0,m=0,n=0.0,o=0.0;a=i;i=i+8|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-1;e=14296+(d*24&-1)|0;f=c[e>>2]|0;g=c[e+4>>2]|0;e=14304+(d*24&-1)|0;j=+h[e>>3];k=c[e>>2]|0;e=k;do{if((f|0)==3){l=+uz(e,b);m=(e|0)==(c[b>>2]|0);uu(e);if(!m){n=0.0;o=l;break}uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{if((f|0)==2){n=+h[14312+(d*24&-1)>>3];o=j;break}else if((f|0)==1){n=0.0;o=+(k|0);break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);j=o*2.0;o=n*2.0;if(+P(+j)>706.893623549172){k=c[6354]|0;if((k|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=k+1|0;c[6354]=f;k=14296+(f*24&-1)|0;c[k>>2]=2;c[k+4>>2]=g;h[14304+(f*24&-1)>>3]=j<0.0?-1.0:1.0;h[14312+(f*24&-1)>>3]=0.0;i=a;return}else{n=+a4(+j);l=n+ +S(+o);n=+bz(+j);f=c[6354]|0;if((f|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}j=+T(+o)/l;k=f+1|0;c[6354]=k;f=14296+(k*24&-1)|0;c[f>>2]=2;c[f+4>>2]=g;h[14304+(k*24&-1)>>3]=n/l;h[14312+(k*24&-1)>>3]=j;i=a;return}}function kH(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0.0,l=0,m=0.0,n=0,o=0.0,p=0.0,q=0,r=0.0,s=0.0,t=0.0;b=i;i=i+8|0;d=b|0;e=c[6354]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=e-1;f=14296+(e*24&-1)|0;g=c[f>>2]|0;j=c[f+4>>2]|0;f=14304+(e*24&-1)|0;k=+h[f>>3];l=c[f>>2]|0;f=l;do{if((g|0)==3){m=+uz(f,d);n=(f|0)==(c[d>>2]|0);uu(f);if(!n){o=0.0;p=m;q=9353;break}uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{if((g|0)==2){o=+h[14312+(e*24&-1)>>3];p=k;q=9353;break}else if((g|0)==1){r=+(l|0);s=0.0;t=-0.0;break}else{uf(-1,211552,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);if((q|0)==9353){r=p;s=o;t=-0.0-o}if(r==0.0){q=+P(+t)>1.0;l=c[6354]|0;g=(l|0)==249;if(q){if(g){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}q=l+1|0;c[6354]=q;e=14296+(q*24&-1)|0;c[e>>2]=2;c[e+4>>2]=j;uE(14304+(q*24&-1)|0,0,16);a[1960]=1;i=b;return}else{if(g){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}o=+h[9040];p=(-0.0- +W(+t))/o;g=l+1|0;c[6354]=g;l=14296+(g*24&-1)|0;c[l>>2]=2;c[l+4>>2]=j;h[14304+(g*24&-1)>>3]=0.0;h[14312+(g*24&-1)>>3]=p;i=b;return}}else{if(s==-0.0){g=c[6354]|0;if((g|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}p=r+ +Q(+(r*r+1.0));o=+h[9040];t=+_(+p)/o;l=g+1|0;c[6354]=l;g=14296+(l*24&-1)|0;c[g>>2]=2;c[g+4>>2]=j;h[14304+(l*24&-1)>>3]=t;h[14312+(l*24&-1)>>3]=0.0;i=b;return}else{t=1.0-s;o=r*r;p=+Q(+(t*t+o))*.5;t=-1.0-s;s=+Q(+(t*t+o))*.5;o=p+s;t=+h[9040];l=c[6354]|0;if((l|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}k=(r>=0.0?1.0:-1.0)*+_(+(+Q(+(o*o+-1.0))+o))/t;o=(-0.0- +W(+(p-s)))/t;g=l+1|0;c[6354]=g;l=14296+(g*24&-1)|0;c[l>>2]=2;c[l+4>>2]=j;h[14304+(g*24&-1)>>3]=k;h[14312+(g*24&-1)>>3]=o;i=b;return}}}function kI(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0.0,n=0,o=0.0,p=0,q=0,r=0.0,s=0,t=0.0,u=0.0,w=0.0,x=0.0,y=0.0;a=i;i=i+8|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=d-1|0;c[6354]=e;f=14296+(d*24&-1)|0;g=f|0;j=c[g>>2]|0;k=f+4|0;f=c[k>>2]|0;l=14304+(d*24&-1)|0;m=+h[l>>3];n=14312+(d*24&-1)|0;o=+h[n>>3];p=c[l>>2]|0;q=p;do{if((j|0)==3){r=+uz(q,b);s=(q|0)==(c[b>>2]|0);uu(q);if(!s){t=r;break}uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{if((j|0)==2){if(o==0.0){t=m;break}r=m+1.0;u=o*o;w=+Q(+(u+r*r))*.5;r=m+-1.0;x=+Q(+(u+r*r))*.5;r=w+x;u=+h[9040];if((e|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}y=+_(+(+Q(+(r*r+-1.0))+r))/u;r=(o<0.0?-1.0:1.0)*+V(+(w-x))/u;c[6354]=d;c[g>>2]=2;c[k>>2]=f;h[l>>3]=y;h[n>>3]=r;i=a;return}else if((j|0)==1){t=+(p|0);break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);p=+P(+t)>1.0;j=c[6354]|0;n=(j|0)==249;if(p){if(n){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}o=t+ +Q(+(t*t+-1.0));m=+h[9040];r=+_(+o)/m;p=j+1|0;c[6354]=p;l=14296+(p*24&-1)|0;c[l>>2]=2;c[l+4>>2]=f;h[14304+(p*24&-1)>>3]=r;h[14312+(p*24&-1)>>3]=0.0;i=a;return}else{if(n){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}r=+h[9040];m=+V(+t)/r;n=j+1|0;c[6354]=n;j=14296+(n*24&-1)|0;c[j>>2]=2;c[j+4>>2]=f;h[14304+(n*24&-1)>>3]=0.0;h[14312+(n*24&-1)>>3]=m;i=a;return}}function kJ(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0.0,l=0,m=0.0,n=0,o=0.0,p=0.0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,w=0.0,x=0.0,y=0.0,z=0.0;b=i;i=i+8|0;d=b|0;e=c[6354]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=e-1;f=14296+(e*24&-1)|0;g=c[f>>2]|0;j=c[f+4>>2]|0;f=14304+(e*24&-1)|0;k=+h[f>>3];l=c[f>>2]|0;f=l;do{if((g|0)==3){m=+uz(f,d);n=(f|0)==(c[d>>2]|0);uu(f);if(!n){o=0.0;p=m;q=9405;break}uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{if((g|0)==2){o=+h[14312+(e*24&-1)>>3];p=k;q=9405;break}else if((g|0)==1){r=+(l|0);s=0.0;t=-0.0;break}else{uf(-1,211552,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);if((q|0)==9405){r=p;s=o;t=-0.0-o}if(r==0.0){q=c[6354]|0;if((q|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}o=+h[9040];p=(-0.0- +X(+t))/o;l=q+1|0;c[6354]=l;q=14296+(l*24&-1)|0;c[q>>2]=2;c[q+4>>2]=j;h[14304+(l*24&-1)>>3]=0.0;h[14312+(l*24&-1)>>3]=p;i=b;return}do{if(s==-0.0){if(+P(+r)<1.0){break}a[1960]=1;l=c[6354]|0;if((l|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}q=l+1|0;c[6354]=q;l=14296+(q*24&-1)|0;c[l>>2]=2;c[l+4>>2]=j;uE(14304+(q*24&-1)|0,0,16);i=b;return}}while(0);if(s>-0.0){u=-0.0-r;w=s}else{u=r;w=t}t=w*w;r=+X(+(w*2.0/(1.0-t-u*u)));w=u+1.0;p=u+-1.0;u=+_(+((t+w*w)/(t+p*p)))*.25;if(r<0.0){x=r+3.141592653589793}else{x=r}if(s>-0.0){y=-0.0-x;z=-0.0-u}else{y=x;z=u}q=c[6354]|0;if((q|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}u=y*-.5/+h[9040];l=q+1|0;c[6354]=l;q=14296+(l*24&-1)|0;c[q>>2]=2;c[q+4>>2]=j;h[14304+(l*24&-1)>>3]=z;h[14312+(l*24&-1)>>3]=u;i=b;return}function kK(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,l=0.0,m=0.0,n=0.0,o=0,p=0.0,q=0,r=0.0,s=0,t=0.0,u=0.0,w=0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0;b=i;i=i+8|0;d=b|0;e=c[6354]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=e-1;f=14296+(e*24&-1)|0;g=c[f>>2]|0;j=c[f+4>>2]|0;f=14304+(e*24&-1)|0;l=+h[f>>3];m=+h[14312+(e*24&-1)>>3];e=c[f>>2]|0;f=e;do{if((g|0)==3){n=+uz(f,d);o=(f|0)==(c[d>>2]|0);uu(f);if(o){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[k>>3]=n;p=0.0;q=c[k>>2]|0;r=n;s=9435;break}}else{if((g|0)==2){p=m;q=e;r=l;s=9435;break}else if((g|0)==1){t=0.0;u=m;w=1;x=e;y=l;break}uf(-1,211552,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);if((s|0)==9435){t=p;u=p;w=2;x=q;y=r}r=+P(+t);if(r>+h[11]){uf(-1,136968,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((w|0)==1){z=+(x|0)}else if((w|0)==2){z=y}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}r=(1.0-z)*(z+1.0);if(r>0.0){A=1.0;B=r;C=0.0}else{x=c[6354]|0;if((x|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}q=x+1|0;c[6354]=q;x=14296+(q*24&-1)|0;c[x>>2]=w;c[x+4>>2]=j;h[14304+(q*24&-1)>>3]=y;h[14312+(q*24&-1)>>3]=u;a[1960]=1;i=b;return}while(1){u=+Q(+C);y=+Q(+B);r=+Q(+A);z=y*r+u*(y+r);r=(C+z)*.25;y=(B+z)*.25;u=(A+z)*.25;D=(u+(r+y))*.3333333333333333;E=(D-r)/D;F=(D-y)/D;G=(D-u)/D;if(+P(+E)>.0025){A=u;B=y;C=r;continue}if(+P(+F)>.0025){A=u;B=y;C=r;continue}if(+P(+G)>.0025){A=u;B=y;C=r}else{break}}C=E*F;F=C-G*G;E=C*G;q=c[6354]|0;if((q|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}G=(E*.07142857142857142+(F*(F*.041666666666666664+-.1-E*.06818181818181818)+1.0))/+Q(+D);x=q+1|0;c[6354]=x;q=14296+(x*24&-1)|0;c[q>>2]=2;c[q+4>>2]=j;h[14304+(x*24&-1)>>3]=G;h[14312+(x*24&-1)>>3]=0.0;i=b;return}function kL(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,l=0.0,m=0.0,n=0.0,o=0,p=0.0,q=0,r=0.0,s=0,t=0.0,u=0.0,w=0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0;b=i;i=i+8|0;d=b|0;e=c[6354]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=e-1;f=14296+(e*24&-1)|0;g=c[f>>2]|0;j=c[f+4>>2]|0;f=14304+(e*24&-1)|0;l=+h[f>>3];m=+h[14312+(e*24&-1)>>3];e=c[f>>2]|0;f=e;do{if((g|0)==3){n=+uz(f,d);o=(f|0)==(c[d>>2]|0);uu(f);if(o){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[k>>3]=n;p=0.0;q=c[k>>2]|0;r=n;s=9462;break}}else{if((g|0)==1){t=0.0;u=m;w=1;x=e;y=l;break}else if((g|0)==2){p=m;q=e;r=l;s=9462;break}uf(-1,211552,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);if((s|0)==9462){t=p;u=p;w=2;x=q;y=r}r=+P(+t);if(r>+h[11]){uf(-1,136968,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((w|0)==1){z=+(x|0)}else if((w|0)==2){z=y}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}r=(1.0-z)*(z+1.0);if(r>0.0){A=1.0;B=r;C=0.0}else{if(r<0.0){a[1960]=1;x=c[6354]|0;if((x|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}q=x+1|0;c[6354]=q;x=14296+(q*24&-1)|0;c[x>>2]=w;c[x+4>>2]=j;h[14304+(q*24&-1)>>3]=y;h[14312+(q*24&-1)>>3]=u;i=b;return}else{q=c[6354]|0;if((q|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}x=q+1|0;c[6354]=x;q=14296+(x*24&-1)|0;c[q>>2]=2;c[q+4>>2]=j;h[14304+(x*24&-1)>>3]=1.0;h[14312+(x*24&-1)>>3]=0.0;i=b;return}}while(1){u=+Q(+C);y=+Q(+B);t=+Q(+A);p=y*t+u*(y+t);t=(C+p)*.25;y=(B+p)*.25;u=(A+p)*.25;D=(u+(t+y))*.3333333333333333;E=(D-t)/D;F=(D-y)/D;G=(D-u)/D;if(+P(+E)>.0025){A=u;B=y;C=t;continue}if(+P(+F)>.0025){A=u;B=y;C=t;continue}if(+P(+G)>.0025){A=u;B=y;C=t}else{break}}C=E*F;F=C-G*G;E=C*G;G=(E*.07142857142857142+(F*(F*.041666666666666664+-.1-E*.06818181818181818)+1.0))/+Q(+D);D=1.0;E=1.0;F=r;r=0.0;C=0.0;while(1){B=+Q(+r);A=+Q(+F);t=+Q(+E);y=A*t+B*(A+t);A=E+y;H=C+D/(t*A);I=D*.25;t=(r+y)*.25;B=(F+y)*.25;y=A*.25;J=(t+B+y*3.0)*.2;K=(J-t)/J;L=(J-B)/J;M=(J-y)/J;if(+P(+K)>.0015){D=I;E=y;F=B;r=t;C=H;continue}if(+P(+L)>.0015){D=I;E=y;F=B;r=t;C=H;continue}if(+P(+M)>.0015){D=I;E=y;F=B;r=t;C=H}else{break}}C=K*L;L=M*M;K=C-L;r=C-L*6.0;L=K+(K+r);x=c[6354]|0;if((x|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}F=G-z*z*(H*3.0+I*(M*(M*(C*M*.11538461538461539+K*-.4090909090909091)+L*.16666666666666666)+(r*(r*.10227272727272728+-.21428571428571427-M*.17307692307692307*L)+1.0))/(J*+Q(+J)))/3.0;q=x+1|0;c[6354]=q;x=14296+(q*24&-1)|0;c[x>>2]=2;c[x+4>>2]=j;h[14304+(q*24&-1)>>3]=F;h[14312+(q*24&-1)>>3]=0.0;i=b;return}function kM(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0.0,t=0,u=0,w=0.0,x=0,y=0,z=0.0,A=0,B=0.0,C=0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ab=0.0,ac=0.0,ad=0.0,ae=0.0,af=0.0,ag=0.0,ah=0.0,ai=0.0,aj=0.0,ak=0.0,al=0.0,am=0.0,an=0.0,ao=0.0,ap=0.0,aq=0.0,ar=0.0,as=0.0;b=i;i=i+16|0;d=b|0;e=b+8|0;f=c[6354]|0;if((f|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=f-1|0;c[6354]=g;j=14296+(f*24&-1)|0;l=c[j>>2]|0;m=c[j+4>>2]|0;j=14304+(f*24&-1)|0;n=+h[j>>3];o=+h[14312+(f*24&-1)>>3];f=c[j>>2]|0;j=f;do{if((l|0)==3){p=+uz(j,e);q=(j|0)==(c[e>>2]|0);uu(j);if(q){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[k>>3]=p;q=c[k>>2]|0;r=2;s=0.0;t=c[6354]|0;u=q;w=p;x=q;break}}else{r=l;s=o;t=g;u=f;w=n;x=j}}while(0);if((t|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=t-1;j=14296+(t*24&-1)|0;f=c[j>>2]|0;g=c[j+4>>2]|0;j=14304+(t*24&-1)|0;n=+h[j>>3];o=+h[14312+(t*24&-1)>>3];t=c[j>>2]|0;j=t;do{if((f|0)==3){p=+uz(j,d);l=(j|0)==(c[d>>2]|0);uu(j);if(l){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[k>>3]=p;l=c[k>>2]|0;y=2;z=0.0;A=l;B=p;C=l;break}}else{y=f;z=o;A=t;B=n;C=j}}while(0);if((r|0)==2){D=s}else if((r|0)==1){D=0.0}else if((r|0)==3){uh(-1,212704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);uf(-1,212032,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{uf(-1,211552,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}n=+P(+D);D=+h[11];if(n>D){uf(-1,136968,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((y|0)==1){E=0.0}else if((y|0)==3){uh(-1,212704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);uf(-1,212032,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((y|0)==2){E=z}else{uf(-1,211552,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if(+P(+E)>D){uf(-1,136968,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((r|0)==1){F=+(u|0)}else if((r|0)==2){F=w}else if((r|0)==3){F=+uz(x,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((y|0)==3){G=+uz(C,0)}else if((y|0)==2){G=B}else if((y|0)==1){G=+(A|0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}B=(1.0-F)*(F+1.0);if(B>0.0&G<1.0){H=1.0;I=B;J=0.0}else{a[1960]=1;A=c[6354]|0;if((A|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}y=A+1|0;c[6354]=y;A=14296+(y*24&-1)|0;c[A>>2]=r;c[A+4>>2]=m;h[14304+(y*24&-1)>>3]=w;h[14312+(y*24&-1)>>3]=s;h[k>>3]=w;y=c[k>>2]|0;if((r|0)!=3|(y|0)==0){i=b;return}r=bP(y|0)|0;c[14304+((c[6354]|0)*24&-1)>>2]=r;i=b;return}while(1){w=+Q(+J);s=+Q(+I);F=+Q(+H);D=s*F+w*(s+F);F=(J+D)*.25;s=(I+D)*.25;w=(H+D)*.25;K=(w+(F+s))*.3333333333333333;L=(K-F)/K;M=(K-s)/K;N=(K-w)/K;if(+P(+L)>.0025){H=w;I=s;J=F;continue}if(+P(+M)>.0025){H=w;I=s;J=F;continue}if(+P(+N)>.0025){H=w;I=s;J=F}else{break}}J=L*M;M=J-N*N;L=J*N;N=(L*.07142857142857142+(M*(M*.041666666666666664+-.1-L*.06818181818181818)+1.0))/+Q(+K);K=1.0-G;if(K>0.0){O=1.0;R=B;S=0.0;T=0.0;U=K;V=0.0}else{L=B<0.0?0.0:B;M=L>1.0?L:1.0;L=B+0.0+1.0-M;B=1.0/(L-K);J=L*(M-L)*B;I=L+J;H=M*0.0/L;F=K*I/L;if(F>0.0){W=1.0;X=F;Y=H}else{s=H-F;w=+Q(+H);W=w/+Q(+s);X=-0.0-F;Y=s}s=X;X=Y;do{Y=+Q(+X)*2.0;F=s+Y*+Q(+s);X=(X+F)*.25;s=(s+F)*.25;Z=(s+(X+s))*.3333333333333333;_=(s-Z)/Z;}while(+P(+_)>.0012);O=M;R=L;S=B;T=J;U=I;V=W*(_*_*(_*(_*(_*.4090909090909091+.375)+.14285714285714285)+.3)+1.0)/+Q(+Z)}Z=O;O=R;R=0.0;_=0.0;W=1.0;I=U;while(1){U=+Q(+R);J=+Q(+O);B=+Q(+Z);L=J*B+U*(J+B);M=U*J*B+I*(U+J+B);B=M*M;M=I+L;J=I*M*M;if(J>0.0){$=1.0;aa=J;ab=B}else{U=B-J;s=+Q(+B);$=s/+Q(+U);aa=-0.0-J;ab=U}U=aa;J=ab;do{s=+Q(+J)*2.0;B=U+s*+Q(+U);J=(J+B)*.25;U=(U+B)*.25;ac=(U+(J+U))*.3333333333333333;ad=(U-ac)/ac;}while(+P(+ad)>.0012);ae=_+W*($*(ad*ad*(ad*(ad*(ad*.4090909090909091+.375)+.14285714285714285)+.3)+1.0)/+Q(+ac));af=W*.25;ag=(R+L)*.25;ah=(O+L)*.25;ai=(Z+L)*.25;U=M*.25;aj=(U+(U+(ai+(ag+ah))))*.2;ak=(aj-ag)/aj;al=(aj-ah)/aj;am=(aj-ai)/aj;an=(aj-U)/aj;if(+P(+ak)>.0015){Z=ai;O=ah;R=ag;_=ae;W=af;I=U;continue}if(+P(+al)>.0015){Z=ai;O=ah;R=ag;_=ae;W=af;I=U;continue}if(+P(+am)>.0015){Z=ai;O=ah;R=ag;_=ae;W=af;I=U;continue}if(+P(+an)>.0015){Z=ai;O=ah;R=ag;_=ae;W=af;I=U}else{break}}I=al*am+ak*(al+am);W=ak*al*am;am=an*an;al=I-am*3.0;ak=ae*3.0+af*((.3333333333333333-an*.13636363636363635)*an*I+(W*(an*(an*.11538461538461539+-.2727272727272727)+.16666666666666666)+(al*(al*.10227272727272727+-.21428571428571427-(W+an*2.0*(I-am))*.17307692307692307)+1.0))-an*.3333333333333333*am)/(aj*+Q(+aj));if(K>0.0){ao=ak}else{K=ai;ai=ah;ah=ag;while(1){ag=+Q(+ah);aj=+Q(+ai);am=+Q(+K);an=aj*am+ag*(aj+am);am=(ah+an)*.25;aj=(ai+an)*.25;ag=(K+an)*.25;ap=(ag+(am+aj))*.3333333333333333;aq=(ap-am)/ap;ar=(ap-aj)/ap;as=(ap-ag)/ap;if(+P(+aq)>.0025){K=ag;ai=aj;ah=am;continue}if(+P(+ar)>.0025){K=ag;ai=aj;ah=am;continue}if(+P(+as)>.0025){K=ag;ai=aj;ah=am}else{break}}ah=aq*ar;ar=ah-as*as;aq=ah*as;ao=S*(T*ak+(V-(aq*.07142857142857142+(ar*(ar*.041666666666666664+-.1-aq*.06818181818181818)+1.0))/+Q(+ap))*3.0)}r=c[6354]|0;if((r|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}y=r+1|0;c[6354]=y;r=14296+(y*24&-1)|0;c[r>>2]=2;c[r+4>>2]=g;h[14304+(y*24&-1)>>3]=N+G*ao/3.0;h[14312+(y*24&-1)>>3]=0.0;i=b;return}function kN(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0.0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0;a=i;i=i+16|0;b=a|0;d=a+8|0;e=c[6354]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=e-1|0;c[6354]=f;g=14296+(e*24&-1)|0;j=c[g>>2]|0;k=c[g+4>>2]|0;g=14304+(e*24&-1)|0;l=+h[g>>3];m=c[g>>2]|0;h[d>>3]=l;n=+h[14312+(e*24&-1)>>3];e=m;m=e;do{if((j|0)==3){o=+uz(m,b);g=(m|0)==(c[b>>2]|0);uu(m);if(g){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[d>>3]=o;p=o;q=0.0;r=c[6354]|0;break}}else{if((j|0)==2){p=l;q=n;r=f;break}else if((j|0)==1){p=+(e|0);q=n;r=f;break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);c[d>>2]=~~p;if((r|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{f=r+1|0;c[6354]=f;r=14296+(f*24&-1)|0;c[r>>2]=1;c[r+4>>2]=k;h[14304+(f*24&-1)>>3]=+h[d>>3];h[14312+(f*24&-1)>>3]=q;i=a;return}}function kO(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0.0,o=0,p=0,q=0.0,r=0,s=0.0,t=0,u=0.0,w=0.0,x=0.0;a=i;i=i+16|0;b=a|0;d=a+8|0;e=c[6354]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=e-1|0;c[6354]=f;g=14296+(e*24&-1)|0;j=g|0;k=c[j>>2]|0;l=g+4|0;g=c[l>>2]|0;m=14304+(e*24&-1)|0;n=+h[m>>3];o=c[m>>2]|0;h[d>>3]=n;p=14312+(e*24&-1)|0;q=+h[p>>3];r=o;o=r;do{if((k|0)==3){s=+uz(o,b);t=(o|0)==(c[b>>2]|0);uu(o);if(t){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[d>>3]=s;u=0.0;w=s;break}}else{if((k|0)==2){u=q;w=n;break}else if((k|0)!=1){uf(-1,205760,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[d>>2]=(r|0)>-1?r:-r|0;if((f|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=e;c[j>>2]=1;c[l>>2]=g;h[m>>3]=+h[d>>3];h[p>>3]=q;i=a;return}}while(0);q=+P(+w);w=+P(+u);do{if(u==0.0){x=q}else{if(q>w){n=w/q;x=q*+Q(+(n*n+1.0));break}else{n=q/w;x=w*+Q(+(n*n+1.0));break}}}while(0);h[d>>3]=x;d=c[6354]|0;if((d|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}p=d+1|0;c[6354]=p;d=14296+(p*24&-1)|0;c[d>>2]=2;c[d+4>>2]=g;h[14304+(p*24&-1)>>3]=x;h[14312+(p*24&-1)>>3]=0.0;i=a;return}function kP(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0.0,o=0,p=0,q=0.0,r=0,s=0.0,t=0,u=0.0,w=0.0,x=0;a=i;i=i+16|0;b=a|0;d=a+8|0;e=c[6354]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=e-1|0;c[6354]=f;g=14296+(e*24&-1)|0;j=g|0;k=c[j>>2]|0;l=g+4|0;g=c[l>>2]|0;m=14304+(e*24&-1)|0;n=+h[m>>3];o=c[m>>2]|0;h[d>>3]=n;p=14312+(e*24&-1)|0;q=+h[p>>3];r=o;o=r;do{if((k|0)==3){s=+uz(o,b);t=(o|0)==(c[b>>2]|0);uu(o);if(t){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[d>>3]=s;u=0.0;w=s;break}}else{if((k|0)==2){u=q;w=n;break}else if((k|0)!=1){uf(-1,205760,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[d>>2]=(r|0)>0?1:r>>31;if((f|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=e;c[j>>2]=1;c[l>>2]=g;h[m>>3]=+h[d>>3];h[p>>3]=q;i=a;return}}while(0);if(w>0.0){x=1}else{x=(w<0.0)<<31>>31}c[d>>2]=x;x=c[6354]|0;if((x|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}p=x+1|0;c[6354]=p;x=14296+(p*24&-1)|0;c[x>>2]=1;c[x+4>>2]=g;h[14304+(p*24&-1)>>3]=+h[d>>3];h[14312+(p*24&-1)>>3]=u;i=a;return}function kQ(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0.0,k=0,l=0.0,m=0,n=0.0,o=0.0,p=0,q=0.0,r=0.0,s=0.0,t=0.0;a=i;i=i+8|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-1;e=14296+(d*24&-1)|0;f=c[e>>2]|0;g=c[e+4>>2]|0;e=14304+(d*24&-1)|0;j=+h[e>>3];k=c[e>>2]|0;e=k;do{if((f|0)==3){l=+uz(e,b);m=(e|0)==(c[b>>2]|0);uu(e);if(!m){n=0.0;o=l;p=9618;break}uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{if((f|0)==2){n=+h[14312+(d*24&-1)>>3];o=j;p=9618;break}else if((f|0)==1){q=+(k|0);r=+Q(+(+(((k|0)>-1?k:-k|0)|0)));break}else{uf(-1,211136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);do{if((p|0)==9618){j=+P(+o);l=+P(+n);k=n==0.0;if(k){q=o;r=+Q(+j);break}if(j>l){s=l/j;t=+Q(+(j*+Q(+(s*s+1.0))))}else{s=j/l;j=+Q(+(l*+Q(+(s*s+1.0))));if(k){q=o;r=j;break}else{t=j}}j=+Y(+n,+o)*.5;k=c[6354]|0;if((k|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}s=t*+S(+j);l=t*+T(+j);f=k+1|0;c[6354]=f;k=14296+(f*24&-1)|0;c[k>>2]=2;c[k+4>>2]=g;h[14304+(f*24&-1)>>3]=s;h[14312+(f*24&-1)>>3]=l;i=a;return}}while(0);p=c[6354]|0;f=(p|0)==249;if(q<0.0){if(f){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}k=p+1|0;c[6354]=k;d=14296+(k*24&-1)|0;c[d>>2]=2;c[d+4>>2]=g;h[14304+(k*24&-1)>>3]=0.0;h[14312+(k*24&-1)>>3]=r;i=a;return}else{if(f){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=p+1|0;c[6354]=f;p=14296+(f*24&-1)|0;c[p>>2]=2;c[p+4>>2]=g;h[14304+(f*24&-1)>>3]=r;h[14312+(f*24&-1)>>3]=0.0;i=a;return}}function kR(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0.0,k=0.0,l=0.0,m=0,n=0.0,o=0.0,p=0,q=0.0,r=0.0;a=i;i=i+8|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-1;e=14296+(d*24&-1)|0;f=c[e>>2]|0;g=c[e+4>>2]|0;e=14304+(d*24&-1)|0;j=+h[e>>3];k=+h[14312+(d*24&-1)>>3];d=c[e>>2]|0;e=d;do{if((f|0)==3){l=+uz(e,b);m=(e|0)==(c[b>>2]|0);uu(e);if(!m){n=l;o=0.0;p=2;break}uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{if((f|0)==1){n=+(d|0);o=k;p=1;break}else if((f|0)==2){n=j;o=k;p=2;break}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);if(n<-706.893623549172){q=0.0}else{q=+Z(+n)}if((p|0)==2){r=o}else if((p|0)==1){r=0.0}else{uf(-1,211552,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}p=c[6354]|0;if((p|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{o=q*+S(+r);n=q*+T(+r);f=p+1|0;c[6354]=f;p=14296+(f*24&-1)|0;c[p>>2]=2;c[p+4>>2]=g;h[14304+(f*24&-1)>>3]=o;h[14312+(f*24&-1)>>3]=n;i=a;return}}function kS(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,l=0.0,m=0.0,n=0.0,o=0,p=0.0,q=0.0,r=0,s=0,t=0.0,u=0.0,w=0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0;b=i;i=i+8|0;d=b|0;e=c[6354]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=e-1;f=14296+(e*24&-1)|0;g=c[f>>2]|0;j=c[f+4>>2]|0;f=14304+(e*24&-1)|0;l=+h[f>>3];m=+h[14312+(e*24&-1)>>3];e=c[f>>2]|0;f=e;do{if((g|0)==3){n=+uz(f,d);o=(f|0)==(c[d>>2]|0);uu(f);if(o){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[k>>3]=n;p=0.0;q=n;r=c[k>>2]|0;s=9662;break}}else{if((g|0)==1){t=+(((e|0)>-1?e:-e|0)|0);u=m;w=1;x=e;y=l;break}else if((g|0)==2){p=m;q=l;r=e;s=9662;break}else{uf(-1,211136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);do{if((s|0)==9662){l=+P(+q);m=+P(+p);if(p==0.0){t=l;u=p;w=2;x=r;y=q;break}if(l>m){n=m/l;t=l*+Q(+(n*n+1.0));u=p;w=2;x=r;y=q;break}else{n=l/m;t=m*+Q(+(n*n+1.0));u=p;w=2;x=r;y=q;break}}}while(0);if(t==0.0){a[1960]=1;r=c[6354]|0;if((r|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}s=r+1|0;c[6354]=s;r=14296+(s*24&-1)|0;c[r>>2]=w;c[r+4>>2]=j;h[14304+(s*24&-1)>>3]=y;h[14312+(s*24&-1)>>3]=u;i=b;return}L13201:do{if((w|0)==1){z=(x|0)>-1?0.0:3.141592653589793;A=+_(+(+(((x|0)>-1?x:-x|0)|0)))/2.302585092994046}else if((w|0)==2){t=+P(+y);q=+P(+u);s=u==0.0;do{if(s){B=+_(+t)/2.302585092994046}else{if(t>q){p=q/t;C=+_(+(t*+Q(+(p*p+1.0))))/2.302585092994046}else{p=t/q;n=+_(+(q*+Q(+(p*p+1.0))))/2.302585092994046;if(s){B=n;break}else{C=n}}z=+Y(+u,+y);A=C;break L13201}}while(0);z=y<0.0?3.141592653589793:0.0;A=B}else{uf(-1,211136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);w=c[6354]|0;if((w|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}x=w+1|0;c[6354]=x;w=14296+(x*24&-1)|0;c[w>>2]=2;c[w+4>>2]=j;h[14304+(x*24&-1)>>3]=A;h[14312+(x*24&-1)>>3]=z/2.302585092994046;i=b;return}function kT(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,l=0.0,m=0.0,n=0.0,o=0,p=0.0,q=0.0,r=0,s=0,t=0.0,u=0.0,w=0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0;b=i;i=i+8|0;d=b|0;e=c[6354]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=e-1;f=14296+(e*24&-1)|0;g=c[f>>2]|0;j=c[f+4>>2]|0;f=14304+(e*24&-1)|0;l=+h[f>>3];m=+h[14312+(e*24&-1)>>3];e=c[f>>2]|0;f=e;do{if((g|0)==3){n=+uz(f,d);o=(f|0)==(c[d>>2]|0);uu(f);if(o){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[k>>3]=n;p=0.0;q=n;r=c[k>>2]|0;s=9695;break}}else{if((g|0)==2){p=m;q=l;r=e;s=9695;break}else if((g|0)==1){t=+(((e|0)>-1?e:-e|0)|0);u=m;w=1;x=e;y=l;break}else{uf(-1,211136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);do{if((s|0)==9695){l=+P(+q);m=+P(+p);if(p==0.0){t=l;u=p;w=2;x=r;y=q;break}if(l>m){n=m/l;t=l*+Q(+(n*n+1.0));u=p;w=2;x=r;y=q;break}else{n=l/m;t=m*+Q(+(n*n+1.0));u=p;w=2;x=r;y=q;break}}}while(0);if(t==0.0){a[1960]=1;r=c[6354]|0;if((r|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}s=r+1|0;c[6354]=s;r=14296+(s*24&-1)|0;c[r>>2]=w;c[r+4>>2]=j;h[14304+(s*24&-1)>>3]=y;h[14312+(s*24&-1)>>3]=u;i=b;return}L13245:do{if((w|0)==1){z=(x|0)>-1?0.0:3.141592653589793;A=+_(+(+(((x|0)>-1?x:-x|0)|0)))}else if((w|0)==2){t=+P(+y);q=+P(+u);s=u==0.0;do{if(s){B=+_(+t)}else{if(t>q){p=q/t;C=+_(+(t*+Q(+(p*p+1.0))))}else{p=t/q;n=+_(+(q*+Q(+(p*p+1.0))));if(s){B=n;break}else{C=n}}z=+Y(+u,+y);A=C;break L13245}}while(0);z=y<0.0?3.141592653589793:0.0;A=B}else{uf(-1,211136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);w=c[6354]|0;if((w|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}x=w+1|0;c[6354]=x;w=14296+(x*24&-1)|0;c[w>>2]=2;c[w+4>>2]=j;h[14304+(x*24&-1)>>3]=A;h[14312+(x*24&-1)>>3]=z;i=b;return}function kU(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0.0,o=0,p=0,q=0.0,r=0,s=0.0,t=0,u=0.0,w=0.0,x=0;a=i;i=i+16|0;b=a|0;d=a+8|0;e=c[6354]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=e-1|0;c[6354]=f;g=14296+(e*24&-1)|0;j=g|0;k=c[j>>2]|0;l=g+4|0;g=c[l>>2]|0;m=14304+(e*24&-1)|0;n=+h[m>>3];o=c[m>>2]|0;h[d>>3]=n;p=14312+(e*24&-1)|0;q=+h[p>>3];r=o;o=r;do{if((k|0)==3){s=+uz(o,b);t=(o|0)==(c[b>>2]|0);uu(o);if(t){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[d>>3]=s;u=0.0;w=s;x=c[6354]|0;break}}else{if((k|0)==2){u=q;w=n;x=f;break}else if((k|0)!=1){uf(-1,205760,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[d>>2]=~~+O(+(+(r|0)));if((f|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=e;c[j>>2]=1;c[l>>2]=g;h[m>>3]=+h[d>>3];h[p>>3]=q;i=a;return}}while(0);c[d>>2]=~~+O(+w);if((x|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}p=x+1|0;c[6354]=p;x=14296+(p*24&-1)|0;c[x>>2]=1;c[x+4>>2]=g;h[14304+(p*24&-1)>>3]=+h[d>>3];h[14312+(p*24&-1)>>3]=u;i=a;return}function kV(a){a=+a;var b=0.0,c=0.0,d=0.0,e=0.0,f=0.0;if(a>0.0){b=a}else{b=-0.0-a}if(b<8.0){a=b*b;c=(a*(a*(a*(a*(a*(a*(a*(a*26857.86856980015-40504123.71833133)+25071582855.36882)-8085222034853.794)+DOT$ZERO(0x51889c8a118fa))+-136762035308817140.0)+6382059341072356000.0)+-117915762910761060000.0)+49337872517941336.0e4)/(a*(a*(a*(a*(a*(a*(a*(a+1363.0636523289706)+1114636.0984629854)+669998767.298224)+312304311494.12134)+112775673967979.84)+30246356167094628.0)+5428918384092285000.0)+49337872517941336.0e4);return+c}else{a=+Q(+(.6366197723675814/b));d=8.0/b;e=d*d;f=b+-.7853981633974483;b=(e*(e*(e*(e*(e*.8896154842421046+153.76201909008356)+3480.648644324927)+21170.523380864943)+41345.38663958076)+22779.090197304686)/(e*(e*(e*(e*(e+157.11159858080893)+3502.8735138235606)+21215.350561880117)+41370.41249551042)+22779.090197304686)*+S(+f);c=a*(b-d*((e*(e*(e*(e*(e*-.008803330304868075-1.244102674583564)-22.300261666214197)-111.83429920482737)-185.91953644342993)-89.22660020080009)/(e*(e*(e*(e*(e+90.59376959499312)+1488.7231232283757)+7264.278016921102)+11951.131543434614)+5710.502412851206))*+T(+f));return+c}return 0.0}function kW(a){a=+a;var b=0,c=0.0,d=0.0,e=0.0,f=0.0,g=0.0,h=0.0;b=a<0.0;if(b){c=-0.0-a}else{c=a}if(c<8.0){d=c*c;e=(d*(d*(d*(d*(d*(d*(d*(d*2701.1227108923235-4695753.530642996)+3413234182.3017006)-1322983480332.1265)+290879526383477.56)+-35888175699101060.0)+2316433580634002400.0)+-6672106568924916.0e4)+5811993540016061.0e5)/(d*(d*(d*(d*(d*(d*(d*(d+1606.9315734814877)+1501793.5949985855)+1013863514.358674)+524371026216.76495)+208166122130760.75)+60920613989175220.0)+11857707121903210000.0)+0x3f0385ca46d07a0000)*a;return+e}a=+Q(+(.6366197723675814/c));d=8.0/c;f=d*d;g=c-2.356194490192345;c=(f*(f*(f*(f*(f*1.2571716929145342+211.15291828539623)+4985.4832060594335)+31353.963110915956)+62758.84524716128)+35224.66491336798)/(f*(f*(f*(f*(f+203.07751891347593)+4930.396490181089)+31240.406381904104)+62694.34695935605)+35224.66491336798)*+S(+g);h=a*(c-d*((f*(f*(f*(f*(f*.03532840052740124+4.568171629551227)+83.18989576738508)+425.98730116544425)+721.0391804904475)+351.17519143035526)/(f*(f*(f*(f*(f+103.81875854621337)+1811.1867005523513)+9152.231701516992)+15414.177339265098)+7491.737417180912))*+T(+g));if(!b){e=h;return+e}e=-0.0-h;return+e}function kX(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0.0,o=0,p=0,q=0.0,r=0,s=0.0,t=0,u=0.0,w=0.0,x=0;a=i;i=i+16|0;b=a|0;d=a+8|0;e=c[6354]|0;if((e|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=e-1|0;c[6354]=f;g=14296+(e*24&-1)|0;j=g|0;k=c[j>>2]|0;l=g+4|0;g=c[l>>2]|0;m=14304+(e*24&-1)|0;n=+h[m>>3];o=c[m>>2]|0;h[d>>3]=n;p=14312+(e*24&-1)|0;q=+h[p>>3];r=o;o=r;do{if((k|0)==3){s=+uz(o,b);t=(o|0)==(c[b>>2]|0);uu(o);if(t){uf(-1,208864,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{h[d>>3]=s;u=0.0;w=s;x=c[6354]|0;break}}else{if((k|0)==2){u=q;w=n;x=f;break}else if((k|0)!=1){uf(-1,205760,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[d>>2]=~~+$(+(+(r|0)));if((f|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=e;c[j>>2]=1;c[l>>2]=g;h[m>>3]=+h[d>>3];h[p>>3]=q;i=a;return}}while(0);c[d>>2]=~~+$(+w);if((x|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}p=x+1|0;c[6354]=p;x=14296+(p*24&-1)|0;c[x>>2]=1;c[x+4>>2]=g;h[14304+(p*24&-1)>>3]=+h[d>>3];h[14312+(p*24&-1)>>3]=u;i=a;return}function kY(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;b=i;i=i+16|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=d-1|0;c[6354]=e;f=14296+(d*24&-1)|0;g=f;h=f|0;f=c[h>>2]|0;j=g+4|0;k=c[j>>2]|0;l=14304+(d*24&-1)|0;m=c[l>>2]|0;n=g+12|0;g=b|0;c[g>>2]=c[n>>2];c[g+4>>2]=c[n+4>>2];c[g+8>>2]=c[n+8>>2];if((f|0)==3){f=m;m=e6(f)|0;uu(f);f=c[6354]|0;if((f|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}o=(a[m+8|0]&1^1)&255;m=f+1|0;c[6354]=m;f=14296+(m*24&-1)|0;p=f;c[f>>2]=1;c[p+4>>2]=k;c[14304+(m*24&-1)>>2]=o;o=p+12|0;c[o>>2]=c[g>>2];c[o+4>>2]=c[g+4>>2];c[o+8>>2]=c[g+8>>2];i=b;return}else{if((e|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d;c[h>>2]=1;c[j>>2]=k;c[l>>2]=0;c[n>>2]=c[g>>2];c[n+4>>2]=c[g+4>>2];c[n+8>>2]=c[g+8>>2];i=b;return}}function kZ(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0.0,k=0,l=0.0,m=0.0,n=0.0,o=0;a=i;b=c[6354]|0;if((b|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}d=b-1|0;c[6354]=d;e=14296+(b*24&-1)|0;f=c[e>>2]|0;g=c[e+4>>2]|0;e=14304+(b*24&-1)|0;j=+h[e>>3];k=c[e>>2]|0;e=k;if((f|0)==2){l=+h[14312+(b*24&-1)>>3]}else if((f|0)==3){uh(-1,212704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);uf(-1,212032,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((f|0)==1){l=0.0}else{uf(-1,211552,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}m=+P(+l);if(m>+h[11]){uf(-1,151424,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((f|0)==1){n=+(k|0);o=d}else if((f|0)==2){n=j;o=d}else if((f|0)==3){j=+uz(e,0);n=j;o=c[6354]|0}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((o|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{j=+kV(n);e=o+1|0;c[6354]=e;o=14296+(e*24&-1)|0;c[o>>2]=2;c[o+4>>2]=g;h[14304+(e*24&-1)>>3]=j;h[14312+(e*24&-1)>>3]=0.0;i=a;return}}function k_(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0.0,k=0,l=0.0,m=0.0,n=0.0,o=0;a=i;b=c[6354]|0;if((b|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}d=b-1|0;c[6354]=d;e=14296+(b*24&-1)|0;f=c[e>>2]|0;g=c[e+4>>2]|0;e=14304+(b*24&-1)|0;j=+h[e>>3];k=c[e>>2]|0;e=k;if((f|0)==1){l=0.0}else if((f|0)==3){uh(-1,212704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);uf(-1,212032,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((f|0)==2){l=+h[14312+(b*24&-1)>>3]}else{uf(-1,211552,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}m=+P(+l);if(m>+h[11]){uf(-1,151424,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((f|0)==3){m=+uz(e,0);n=m;o=c[6354]|0}else if((f|0)==1){n=+(k|0);o=d}else if((f|0)==2){n=j;o=d}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((o|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{j=+kW(n);d=o+1|0;c[6354]=d;o=14296+(d*24&-1)|0;c[o>>2]=2;c[o+4>>2]=g;h[14304+(d*24&-1)>>3]=j;h[14312+(d*24&-1)>>3]=0.0;i=a;return}}function k$(b){b=b|0;var d=0,e=0,f=0,g=0,j=0.0,k=0,l=0.0,m=0.0,n=0.0,o=0,q=0.0,r=0.0,s=0.0;b=i;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-1;e=14296+(d*24&-1)|0;f=c[e>>2]|0;g=c[e+4>>2]|0;e=14304+(d*24&-1)|0;j=+h[e>>3];k=c[e>>2]|0;e=k;if((f|0)==2){l=+h[14312+(d*24&-1)>>3]}else if((f|0)==3){uh(-1,212704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);uf(-1,212032,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((f|0)==1){l=0.0}else{uf(-1,211552,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}m=+P(+l);if(m>+h[11]){uf(-1,151424,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((f|0)==1){n=+(k|0)}else if((f|0)==2){n=j}else if((f|0)==3){n=+uz(e,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if(n<=0.0){d=c[6354]|0;if((d|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}o=d+1|0;c[6354]=o;d=14296+(o*24&-1)|0;c[d>>2]=2;c[d+4>>2]=g;uE(14304+(o*24&-1)|0,0,16);a[1960]=1;i=b;return}if((f|0)==2){q=j}else if((f|0)==1){q=+(k|0)}else if((f|0)==3){q=+uz(e,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}do{if(q<0.0){r=p}else{if(q<8.0){j=q*q;n=+kV(q)*.6366197723675814;r=(j*(j*(j*(j*(j*(j*(j*(j*-41370.35497933149+59152134.6568689)-34363712229.790405)+10255208596863.943)-1648605817185729.5)+137562431639934400.0)+-5247065581112765000.0)+6587473275719555.0e4)+-27502866786291098000.0)/(j*(j*(j*(j*(j*(j*(j*(j+1282.452772478994)+1001702.6412889062)+579512264.070073)+261306575504.10812)+91620380340751.86)+DOT$ZERO(0x550324fdf7f63c))+419241704341084.0e4)+3726458838986166.0e5)+n*+_(+q);break}else{n=+Q(+(.6366197723675814/q));j=8.0/q;m=j*j;l=q+-.7853981633974483;s=(m*(m*(m*(m*(m*.8896154842421046+153.76201909008356)+3480.648644324927)+21170.523380864943)+41345.38663958076)+22779.090197304686)/(m*(m*(m*(m*(m+157.11159858080893)+3502.8735138235606)+21215.350561880117)+41370.41249551042)+22779.090197304686)*+T(+l);r=n*(s+j*((m*(m*(m*(m*(m*-.008803330304868075-1.244102674583564)-22.300261666214197)-111.83429920482737)-185.91953644342993)-89.22660020080009)/(m*(m*(m*(m*(m+90.59376959499312)+1488.7231232283757)+7264.278016921102)+11951.131543434614)+5710.502412851206))*+S(+l));break}}}while(0);e=c[6354]|0;if((e|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=e+1|0;c[6354]=f;e=14296+(f*24&-1)|0;c[e>>2]=2;c[e+4>>2]=g;h[14304+(f*24&-1)>>3]=r;h[14312+(f*24&-1)>>3]=0.0;i=b;return}function k0(b){b=b|0;var d=0,e=0,f=0,g=0,j=0.0,k=0,l=0.0,m=0.0,n=0.0,o=0,q=0.0,r=0.0,s=0.0;b=i;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-1;e=14296+(d*24&-1)|0;f=c[e>>2]|0;g=c[e+4>>2]|0;e=14304+(d*24&-1)|0;j=+h[e>>3];k=c[e>>2]|0;e=k;if((f|0)==3){uh(-1,212704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);uf(-1,212032,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((f|0)==1){l=0.0}else if((f|0)==2){l=+h[14312+(d*24&-1)>>3]}else{uf(-1,211552,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}m=+P(+l);if(m>+h[11]){uf(-1,151424,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((f|0)==2){n=j}else if((f|0)==3){n=+uz(e,0)}else if((f|0)==1){n=+(k|0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if(n<=0.0){d=c[6354]|0;if((d|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}o=d+1|0;c[6354]=o;d=14296+(o*24&-1)|0;c[d>>2]=2;c[d+4>>2]=g;uE(14304+(o*24&-1)|0,0,16);a[1960]=1;i=b;return}if((f|0)==1){q=+(k|0)}else if((f|0)==2){q=j}else if((f|0)==3){q=+uz(e,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}do{if(q>0.0){if(q<8.0){j=q*q;n=+kW(q);r=q*((j*(j*(j*(j*(j*(j*(j*(j*0.0+355692.4009830526)-428947196.88552487)+204969667374.56622)-48633169425671.75)+5915160760490071.0)+-344104806308411460.0)+774852068218684.0e4)+-29238219615329624000.0)/(j*(j*(j*(j*(j*(j*(j*(j+1072.6961437789255)+726914.7307198885)+371666079.86219305)+150022169915.6709)+47551735888881.375)+DOT$ZERO(0x2834334232332e))+1818662841706135000.0)+149131151130292030000.0))+(n*+_(+q)-1.0/q)*.6366197723675814;break}else{n=+Q(+(.6366197723675814/q));j=8.0/q;m=j*j;l=q-2.356194490192345;s=(m*(m*(m*(m*(m*1.2571716929145342+211.15291828539623)+4985.4832060594335)+31353.963110915956)+62758.84524716128)+35224.66491336798)/(m*(m*(m*(m*(m+203.07751891347593)+4930.396490181089)+31240.406381904104)+62694.34695935605)+35224.66491336798)*+T(+l);r=n*(s+j*((m*(m*(m*(m*(m*.03532840052740124+4.568171629551227)+83.18989576738508)+425.98730116544425)+721.0391804904475)+351.17519143035526)/(m*(m*(m*(m*(m+103.81875854621337)+1811.1867005523513)+9152.231701516992)+15414.177339265098)+7491.737417180912))*+S(+l));break}}else{r=p}}while(0);e=c[6354]|0;if((e|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=e+1|0;c[6354]=f;e=14296+(f*24&-1)|0;c[e>>2]=2;c[e+4>>2]=g;h[14304+(f*24&-1)>>3]=r;h[14312+(f*24&-1)>>3]=0.0;i=b;return}function k1(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0.0,k=0.0;a=i;i=i+48|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-1;e=14296+(d*24&-1)|0;f=c[e>>2]|0;g=c[e+4>>2]|0;e=14304+(d*24&-1)|0;j=+h[e>>3];d=c[e>>2]|0;if((f|0)==1){k=+(d|0)}else if((f|0)==3){k=+uz(d,0)}else if((f|0)==2){k=j}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}t3(b,k);f=c[6354]|0;if((f|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{k=+(c[b>>2]|0);b=f+1|0;c[6354]=b;f=14296+(b*24&-1)|0;c[f>>2]=2;c[f+4>>2]=g;h[14304+(b*24&-1)>>3]=k;h[14312+(b*24&-1)>>3]=0.0;i=a;return}}function k2(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0.0;a=i;i=i+48|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-1;e=14296+(d*24&-1)|0;f=c[e>>2]|0;g=c[e+4>>2]|0;e=14304+(d*24&-1)|0;d=c[e>>2]|0;if((f|0)==2){j=+h[e>>3]}else if((f|0)==3){j=+uz(d,0)}else if((f|0)==1){j=+(d|0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}t3(b,j);d=c[6354]|0;if((d|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{j=+(c[b+4>>2]|0);b=d+1|0;c[6354]=b;d=14296+(b*24&-1)|0;c[d>>2]=2;c[d+4>>2]=g;h[14304+(b*24&-1)>>3]=j;h[14312+(b*24&-1)>>3]=0.0;i=a;return}}function k3(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0.0;a=i;i=i+48|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-1;e=14296+(d*24&-1)|0;f=c[e>>2]|0;g=c[e+4>>2]|0;e=14304+(d*24&-1)|0;d=c[e>>2]|0;if((f|0)==2){j=+h[e>>3]}else if((f|0)==3){j=+uz(d,0)}else if((f|0)==1){j=+(d|0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}t3(b,j);d=c[6354]|0;if((d|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{j=+(c[b+8>>2]|0);b=d+1|0;c[6354]=b;d=14296+(b*24&-1)|0;c[d>>2]=2;c[d+4>>2]=g;h[14304+(b*24&-1)>>3]=j;h[14312+(b*24&-1)>>3]=0.0;i=a;return}}function k4(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0.0;a=i;i=i+48|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-1;e=14296+(d*24&-1)|0;f=c[e>>2]|0;g=c[e+4>>2]|0;e=14304+(d*24&-1)|0;d=c[e>>2]|0;if((f|0)==2){j=+h[e>>3]}else if((f|0)==1){j=+(d|0)}else if((f|0)==3){j=+uz(d,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}t3(b,j);d=c[6354]|0;if((d|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{j=+(c[b+12>>2]|0);b=d+1|0;c[6354]=b;d=14296+(b*24&-1)|0;c[d>>2]=2;c[d+4>>2]=g;h[14304+(b*24&-1)>>3]=j;h[14312+(b*24&-1)>>3]=0.0;i=a;return}}function k5(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0.0;a=i;i=i+48|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-1;e=14296+(d*24&-1)|0;f=c[e>>2]|0;g=c[e+4>>2]|0;e=14304+(d*24&-1)|0;d=c[e>>2]|0;if((f|0)==2){j=+h[e>>3]}else if((f|0)==1){j=+(d|0)}else if((f|0)==3){j=+uz(d,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}t3(b,j);d=c[6354]|0;if((d|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{j=+(c[b+16>>2]|0);b=d+1|0;c[6354]=b;d=14296+(b*24&-1)|0;c[d>>2]=2;c[d+4>>2]=g;h[14304+(b*24&-1)>>3]=j;h[14312+(b*24&-1)>>3]=0.0;i=a;return}}function k6(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0.0,k=0.0;a=i;i=i+48|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-1;e=14296+(d*24&-1)|0;f=c[e>>2]|0;g=c[e+4>>2]|0;e=14304+(d*24&-1)|0;j=+h[e>>3];d=c[e>>2]|0;if((f|0)==1){k=+(d|0)}else if((f|0)==2){k=j}else if((f|0)==3){k=+uz(d,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}t3(b,k);d=c[6354]|0;if((d|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{k=+(c[b+20>>2]|0);b=d+1|0;c[6354]=b;d=14296+(b*24&-1)|0;c[d>>2]=2;c[d+4>>2]=g;h[14304+(b*24&-1)>>3]=k;h[14312+(b*24&-1)>>3]=0.0;i=a;return}}function k7(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0.0;a=i;i=i+48|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-1;e=14296+(d*24&-1)|0;f=c[e>>2]|0;g=c[e+4>>2]|0;e=14304+(d*24&-1)|0;d=c[e>>2]|0;if((f|0)==2){j=+h[e>>3]}else if((f|0)==1){j=+(d|0)}else if((f|0)==3){j=+uz(d,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}t3(b,j);d=c[6354]|0;if((d|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{j=+(c[b+24>>2]|0);b=d+1|0;c[6354]=b;d=14296+(b*24&-1)|0;c[d>>2]=2;c[d+4>>2]=g;h[14304+(b*24&-1)>>3]=j;h[14312+(b*24&-1)>>3]=0.0;i=a;return}}function k8(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0.0;a=i;i=i+48|0;b=a|0;d=c[6354]|0;if((d|0)<0){uf(-1,209224,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[6354]=d-1;e=14296+(d*24&-1)|0;f=c[e>>2]|0;g=c[e+4>>2]|0;e=14304+(d*24&-1)|0;d=c[e>>2]|0;if((f|0)==2){j=+h[e>>3]}else if((f|0)==1){j=+(d|0)}else if((f|0)==3){j=+uz(d,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}t3(b,j);d=c[6354]|0;if((d|0)==249){uf(-1,208304,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{j=+(c[b+28>>2]|0);b=d+1|0;c[6354]=b;d=14296+(b*24&-1)|0;c[d>>2]=2;c[d+4>>2]=g;h[14304+(b*24&-1)>>3]=j;h[14312+(b*24&-1)>>3]=0.0;i=a;return}}function k9(){var b=0,d=0,e=0,f=0,j=0,k=0,l=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0.0,am=0.0,an=0,ao=0,ap=0,aq=0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0,aA=0,aB=0,aC=0,aD=0,aE=0,aG=0,aH=0.0,aJ=0.0,aK=0.0,aL=0.0,aM=0.0,aN=0.0,aO=0,aP=0.0,aQ=0.0,aR=0.0,aS=0.0,aT=0.0,aU=0.0,aV=0.0,aW=0.0,aX=0,aZ=0,a$=0,a0=0,a1=0,a2=0,a3=0,a4=0,a5=0,a6=0,a7=0,a8=0,a9=0,ba=0,bb=0,bc=0,bd=0,bf=0,bg=0,bh=0,bi=0,bj=0,bk=0,bl=0,bm=0,bn=0;b=i;i=i+720|0;d=b|0;e=b+112|0;f=b+144|0;j=b+176|0;k=b+208|0;l=b+320|0;o=b+432|0;p=b+456|0;q=b+480|0;r=b+496|0;s=b+608|0;c[13898]=(c[13898]|0)+1;c[16506]=c[16507];h[8255]=+h[8257];h[8256]=+h[8258];h[8261]=8.988465674311579e+307;h[8262]=-8.988465674311579e+307;c[16334]=c[16335];h[8169]=+h[8171];h[8170]=+h[8172];h[8175]=8.988465674311579e+307;h[8176]=-8.988465674311579e+307;dq(2);dq(1);uu(c[3562]|0);uu(c[3560]|0);t=ut(32768)|0;do{if((t|0)==0){gk();u=ut(32768)|0;if((u|0)!=0){x=u;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=215008,v)|0)}else{x=t}}while(0);c[3562]=x;x=ut(32768)|0;do{if((x|0)==0){gk();t=ut(32768)|0;if((t|0)!=0){y=t;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=215008,v)|0)}else{y=x}}while(0);c[3560]=y;if(!((c[3562]|0)!=0&(y|0)!=0)){uf(-1,135152,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}uu(c[3558]|0);y=c[13898]|0;L13568:do{if((y|0)<(c[8272]|0)){x=c[1054]|0;L13570:do{if((a[x+(y*40&-1)|0]&1)!=0){t=c[x+(y*40&-1)+36>>2]|0;u=x+(y*40&-1)+32|0;z=c[10036]|0;A=0;while(1){if((A|0)>=(t|0)){break}if((a[z+((c[u>>2]|0)+A|0)|0]|0)==(a[A+103664|0]|0)){A=A+1|0}else{break L13570}}if((A|0)==1){break L13568}}}while(0);a[14176]=1;is(p);a[14176]=0;if((c[p>>2]|0)!=3){c[13898]=y;break}x=c[p+8>>2]|0;c[3558]=x;u=c[13898]|0;if((x|0)==0){B=u;uf(B,205112,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}z=c[1054]|0;t=c[z+(u*40&-1)+36>>2]|0;L13583:do{if((a[z+(u*40&-1)|0]&1)!=0&(t|0)>0){C=c[10036]|0;D=0;E=0;F=c[z+(u*40&-1)+32>>2]|0;while(1){if((a[D+151232|0]|0)==(a[C+(D+F|0)|0]|0)){G=F;H=E}else{if((D|0)!=3){I=9981;break L13583}G=F-1|0;H=1}J=D+1|0;if((J|0)<(H+t|0)){D=J;E=H;F=G}else{break}}if((H|0)==0){if(!((D|0)==6|(D|0)==2)){I=9981;break}}ey(x,3,0);F=(c[11864]|0)-1|0;E=c[12172]|0;C=c[E+(F*232&-1)+144>>2]|0;A=aa(C,c[E+(F*232&-1)+140>>2]|0);J=c[E+(F*232&-1)+224>>2]|0;if((A|0)<1){c[3562]=0;uf(-1,133128,(v=i,i=i+8|0,c[v>>2]=A,v)|0)}F=A<<3;E=db(c[3562]|0,F,215008)|0;c[3562]=E;if((E|0)==0){uf(-1,133128,(v=i,i=i+8|0,c[v>>2]=A,v)|0)}E=db(c[3560]|0,F,215008)|0;F=E;c[3560]=F;if((E|0)==0){uf(-1,133128,(v=i,i=i+8|0,c[v>>2]=A,v)|0)}if((A|0)>0){E=0;do{h[F+(E<<3)>>3]=+g[J+(E<<2)>>2];E=E+1|0;}while((E|0)<(A|0))}ez();K=1;L=C;M=A;N=0;O=0;Q=0;R=0}else{I=9981}}while(0);if((I|0)==9981){t=ey(x,2,0)|0;if((t|0)<0){uf(-1,120240,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((t|0)>2){uf(c[13898]|0,104256,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}u=c[8270]|0;do{if((u|0)!=0){if((aY(u|0,139696)|0)==0){break}bA(4,u|0)}}while(0);if((a[66164]&1)!=0){uf(-1,91264,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((a[65476]&1)!=0){uf(-1,91264,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((c[16546]|0)==1|(c[16374]|0)==1){uf(-1,83576,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((a[30528]&1)!=0){uf(-1,75664,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((a[32936]&1)!=0){uf(-1,223048,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}u=q|0;x=eC(u,2)|0;do{if((x|0)==-1){ez();S=2;T=0;U=0;V=0;W=0;X=0;I=10029}else{z=q+8|0;E=4096;J=0;F=0;D=0;Y=0;Z=0;_=2;$=x;L13639:while(1){ab=($|0)>(_|0)?$:_;if((Z|0)<(E|0)){ac=E}else{ad=E*3&-1;ae=(ad|0)/2&-1;if((ad|0)<2){I=10002;break}ad=ae<<3;af=db(c[3562]|0,ad,215008)|0;c[3562]=af;if((af|0)==0){I=10358;break}af=db(c[3560]|0,ad,215008)|0;c[3560]=af;if((af|0)==0){I=10356;break}else{ac=ae}}L13646:do{if(($|0)==(-5|0)|($|0)==(-2|0)){ag=Z;ah=Y;ai=D;aj=F;ak=J+1|0}else if(($|0)==(-3|0)){ag=Z;ah=Y;ai=D;aj=F+1|0;ak=J}else if(($|0)==(-4|0)){ag=Z;ah=Y;ai=D+1|0;aj=F+1|0;ak=J}else if(($|0)==0){I=10011;break L13639}else if(($|0)==1){al=+h[u>>3];af=c[16334]&3;if((af|0)==3){I=10016}else if((af|0)==1){if(+h[8170]al){I=10017}else{I=10016}}else if((af|0)==0){if(+h[8170]al){I=10017}else{I=10016}}else{I=10017}if((I|0)==10016){I=0;h[(c[3560]|0)+(Z<<3)>>3]=al;ag=Z+1|0;ah=Y;ai=D;aj=F;ak=J;break}else if((I|0)==10017){I=0;ag=Z;ah=Y+1|0;ai=D;aj=F;ak=J;break}}else if(($|0)==2){al=+h[u>>3];af=c[16506]&3;if((af|0)==0){if(!(+h[8256]al)){I=10022}}else if((af|0)==3){I=10022}else if((af|0)==1){if(+h[8256]>=al){I=10022}}else if((af|0)==2){if(+h[8255]<=al){I=10022}}do{if((I|0)==10022){I=0;am=+h[z>>3];af=c[16334]&3;if((af|0)==1){if(+h[8170]am){break}}else if((af|0)==0){if(+h[8170]am){break}}else if((af|0)!=3){break}h[(c[3562]|0)+(Z<<3)>>3]=al;h[(c[3560]|0)+(Z<<3)>>3]=+h[z>>3];ag=Z+1|0;ah=Y;ai=D;aj=F;ak=J;break L13646}}while(0);ag=Z;ah=Y+1|0;ai=D;aj=F;ak=J}else{ag=Z;ah=Y;ai=D;aj=F;ak=J}}while(0);af=eC(u,2)|0;if((af|0)==-1){I=10028;break}else{E=ac;J=ak;F=aj;D=ai;Y=ah;Z=ag;_=ab;$=af}}if((I|0)==10356){ez();uf(-1,133128,(v=i,i=i+8|0,c[v>>2]=ae,v)|0)}else if((I|0)==10358){ez();uf(-1,133128,(v=i,i=i+8|0,c[v>>2]=ae,v)|0)}else if((I|0)==10011){$=c[11932]|0;uf(-1,216224,(v=i,i=i+16|0,c[v>>2]=c[11900],c[v+8>>2]=($|0)!=0?$:179864,v)|0)}else if((I|0)==10002){c[3562]=0;ez();uf(-1,133128,(v=i,i=i+8|0,c[v>>2]=ae,v)|0)}else if((I|0)==10028){ez();if((ag|0)<1){S=ab;T=ag;U=ah;V=ai;W=aj;X=ak;I=10029;break}$=ag<<3;c[3562]=db(c[3562]|0,$,215008)|0;an=db(c[3560]|0,$,215008)|0;ao=ab;ap=ag;aq=ah;ar=ai;as=aj;at=ak;break}}}while(0);if((I|0)==10029){c[3562]=0;an=0;ao=S;ap=T;aq=U;ar=V;as=W;at=X}c[3560]=an;K=(t|0)==0?ao:t;L=0;M=ap;N=aq;O=ar;Q=as;R=at}u=c[8270]|0;do{if((u|0)!=0){if((aY(u|0,139696)|0)==0){break}bA(4,139696)}}while(0);if((M|0)==0){if((N|0)>0){uf(-1,204632,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{uf(-1,201008,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}u=o|0;t=o+8|0;x=1;L13694:while(1){L13696:while(1){au=c[13898]|0;if((au|0)>=(c[8272]|0)){I=10098;break L13694}$=c[1054]|0;_=(a[$+(au*40&-1)|0]&1)==0;if(_){I=10351;break L13694}Z=c[$+(au*40&-1)+36>>2]|0;Y=$+(au*40&-1)+32|0;$=c[10036]|0;D=0;while(1){if((D|0)>=(Z|0)){I=10045;break}if((a[$+((c[Y>>2]|0)+D|0)|0]|0)==(a[D+103664|0]|0)){D=D+1|0}else{break}}if((I|0)==10045){I=0;if((D|0)==1){I=10098;break L13694}}$=c[Y>>2]|0;if(_){I=10345;break L13694}do{if((Z|0)>0){F=c[10036]|0;J=0;E=0;z=$;while(1){if((a[J+184704|0]|0)==(a[F+(J+z|0)|0]|0)){av=z;aw=E}else{if((J|0)!=3){break}av=z-1|0;aw=1}A=J+1|0;if((A|0)<(aw+Z|0)){J=A;E=aw;z=av}else{I=10053;break}}if((I|0)==10053){I=0;if((aw|0)!=0){ax=1;break L13696}if((J|0)==6|(J|0)==2){ax=1;break L13696}}if(_){I=10346;break L13694}if((Z|0)<=0){I=10076;break}z=c[10036]|0;E=0;F=0;A=$;while(1){if((a[E+179552|0]|0)==(a[z+(E+A|0)|0]|0)){ay=A;az=F}else{if((E|0)!=5){break}ay=A-1|0;az=1}C=E+1|0;if((C|0)<(az+Z|0)){E=C;F=az;A=ay}else{I=10064;break}}if((I|0)==10064){I=0;if((az|0)!=0){ax=0;break L13696}if((E|0)==8|(E|0)==4){ax=0;break L13696}}if(_){I=10350;break L13694}if((Z|0)<=0){I=10076;break}A=c[10036]|0;F=0;z=0;J=$;while(1){if((a[F+175408|0]|0)==(a[A+(F+J|0)|0]|0)){aA=J;aB=z}else{if((F|0)!=3){break}aA=J-1|0;aB=1}C=F+1|0;if((C|0)<(aB+Z|0)){F=C;z=aB;J=aA}else{I=10073;break}}if((I|0)==10073){I=0;if((aB|0)!=0){break}if((F|0)==2|(F|0)==6){break}}if(_){I=10348;break L13694}else{I=10076}}else{I=10076}}while(0);if((I|0)==10076){I=0;_=c[10036]|0;Y=0;while(1){if((Y|0)>=(Z|0)){break}if((a[_+($+Y|0)|0]|0)==(a[Y+218432|0]|0)){Y=Y+1|0}else{I=10349;break L13694}}if((Y|0)!=4){I=10347;break L13694}}c[13898]=au+1;uu(c[3556]|0);aC=c[13898]|0;if((aC|0)>=(c[8272]|0)){break L13694}$=c[1054]|0;L13751:do{if((a[$+(aC*40&-1)|0]&1)!=0){_=c[$+(aC*40&-1)+36>>2]|0;Z=$+(aC*40&-1)+32|0;D=c[10036]|0;J=0;while(1){if((J|0)>=(_|0)){break}if((a[D+((c[Z>>2]|0)+J|0)|0]|0)==(a[J+103664|0]|0)){J=J+1|0}else{break L13751}}if((J|0)==1){break L13694}}}while(0);a[14176]=1;is(o);a[14176]=0;if((c[u>>2]|0)!=3){I=10087;break L13694}$=c[t>>2]|0;c[3556]=$;if(($|0)==0){I=10341;break L13694}Y=a[$]|0;if(Y<<24>>24==0){I=10342;break L13694}if(((Y<<24>>24)-48|0)>>>0<10){I=10343;break L13694}else{aD=$;aE=Y}do{if((bs(aE&255|0)|0)==0){if((a[aD]|0)!=95){I=10339;break L13694}}aD=aD+1|0;aE=a[aD]|0;}while(aE<<24>>24!=0);if((aY(167320,c[3556]|0)|0)==0){I=10340;break L13694}}c[13898]=au+1;x=ax}if((I|0)==10098){t=c[3556]|0;if((t|0)==0){u=bP(150920)|0;c[3556]=u;aG=u}else{aG=t}t=uA(aG|0)|0;if((a[aG+(t-1|0)|0]|0)!=95){u=db(aG,t+2|0,149064)|0;c[3556]=u;t=u+(uA(u|0)|0)|0;w=95;a[t]=w&255;w=w>>8;a[t+1|0]=w&255}t=O+1|0;u=(K|0)==1;do{if(u){lc(s,c[3560]|0,M,L);aH=0.0;aJ=0.0;aK=0.0;aL=0.0;aM=0.0;aN=0.0;aO=0}else{if((K|0)!=2){aH=0.0;aJ=0.0;aK=0.0;aL=0.0;aM=0.0;aN=0.0;aO=0;break}lc(r,c[3562]|0,M,0);lc(s,c[3560]|0,M,0);Y=c[3562]|0;$=c[3560]|0;al=+h[r+8>>3];am=+h[r+16>>3];aP=+h[r+24>>3];aQ=+h[r+32>>3];aR=+h[s+8>>3];aS=+h[s+16>>3];aT=+h[s+24>>3];Z=c[s+48>>2]|0;D=c[s+64>>2]|0;if((M|0)>0){_=0;aU=0.0;while(1){aV=aU+ +h[Y+(_<<3)>>3]*+h[$+(_<<3)>>3];F=_+1|0;if((F|0)<(M|0)){_=F;aU=aV}else{aW=aV;break}}}else{aW=0.0}aU=+(M|0);aV=(aW-aP*aT/aU)/(aQ-aP*aP/aU);aH=aW;aJ=aV;aK=aR-al*aV;aL=am*aV/aS;aM=+h[Y+(Z<<3)>>3];aN=+h[Y+(D<<3)>>3];aO=1}}while(0);_=c[3556]|0;$=c[10810]|0;if(($|0)==0){aX=_}else{F=$;do{$=c[F+4>>2]|0;do{if((a_(_|0,$|0,uA(_|0)|0)|0)==0){a[F+8|0]=1;z=F+16|0;if((c[z>>2]|0)!=3){break}uu(c[F+24>>2]|0);c[z>>2]=1}}while(0);F=c[F>>2]|0;}while((F|0)!=0);aX=c[3556]|0}aS=+(M|0);F=(aX|0)!=0?aX:179864;_=(uA(F|0)|0)+8|0;$=ut(_)|0;do{if(($|0)==0){gk();D=ut(_)|0;if((D|0)!=0){aZ=D;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74192,v)|0)}else{aZ=$}}while(0);be(aZ|0,172512,(v=i,i=i+24|0,c[v>>2]=F,c[v+8>>2]=83376,c[v+16>>2]=179864,v)|0);$=e6(aZ)|0;c[$+16>>2]=2;h[$+24>>3]=aS;h[$+32>>3]=0.0;a[$+8|0]=0;uu(aZ);am=+(R|0);$=(uA(F|0)|0)+8|0;_=ut($)|0;do{if((_|0)==0){gk();D=ut($)|0;if((D|0)!=0){a$=D;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74192,v)|0)}else{a$=_}}while(0);be(a$|0,172512,(v=i,i=i+24|0,c[v>>2]=F,c[v+8>>2]=82464,c[v+16>>2]=179864,v)|0);_=e6(a$)|0;c[_+16>>2]=2;h[_+24>>3]=am;h[_+32>>3]=0.0;a[_+8|0]=0;uu(a$);al=+(Q|0);_=(uA(F|0)|0)+6|0;$=ut(_)|0;do{if(($|0)==0){gk();D=ut(_)|0;if((D|0)!=0){a0=D;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74192,v)|0)}else{a0=$}}while(0);be(a0|0,172512,(v=i,i=i+24|0,c[v>>2]=F,c[v+8>>2]=224608,c[v+16>>2]=179864,v)|0);$=e6(a0)|0;c[$+16>>2]=2;h[$+24>>3]=al;h[$+32>>3]=0.0;a[$+8|0]=0;uu(a0);am=+(t|0);$=(uA(F|0)|0)+7|0;_=ut($)|0;do{if((_|0)==0){gk();D=ut($)|0;if((D|0)!=0){a1=D;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74192,v)|0)}else{a1=_}}while(0);be(a1|0,172512,(v=i,i=i+24|0,c[v>>2]=F,c[v+8>>2]=79624,c[v+16>>2]=179864,v)|0);_=e6(a1)|0;c[_+16>>2]=2;h[_+24>>3]=am;h[_+32>>3]=0.0;a[_+8|0]=0;uu(a1);al=+(N|0);_=(uA(F|0)|0)+11|0;$=ut(_)|0;do{if(($|0)==0){gk();D=ut(_)|0;if((D|0)!=0){a2=D;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74192,v)|0)}else{a2=$}}while(0);be(a2|0,172512,(v=i,i=i+24|0,c[v>>2]=F,c[v+8>>2]=78880,c[v+16>>2]=179864,v)|0);$=e6(a2)|0;c[$+16>>2]=2;h[$+24>>3]=al;h[$+32>>3]=0.0;a[$+8|0]=0;uu(a2);if(u){ld(s,c[3556]|0,179864)}if(aO){ld(r,c[3556]|0,144920);ld(s,c[3556]|0,143296);$=c[3556]|0;_=($|0)!=0?$:179864;$=(uA(_|0)|0)+6|0;D=ut($)|0;do{if((D|0)==0){gk();Y=ut($)|0;if((Y|0)!=0){a3=Y;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74192,v)|0)}else{a3=D}}while(0);be(a3|0,172512,(v=i,i=i+24|0,c[v>>2]=_,c[v+8>>2]=140096,c[v+16>>2]=179864,v)|0);D=e6(a3)|0;c[D+16>>2]=2;h[D+24>>3]=aJ;h[D+32>>3]=0.0;a[D+8|0]=0;uu(a3);D=(uA(_|0)|0)+10|0;$=ut(D)|0;do{if(($|0)==0){gk();F=ut(D)|0;if((F|0)!=0){a4=F;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74192,v)|0)}else{a4=$}}while(0);be(a4|0,172512,(v=i,i=i+24|0,c[v>>2]=_,c[v+8>>2]=138e3,c[v+16>>2]=179864,v)|0);$=e6(a4)|0;c[$+16>>2]=2;h[$+24>>3]=aK;h[$+32>>3]=0.0;a[$+8|0]=0;uu(a4);$=(uA(_|0)|0)+12|0;D=ut($)|0;do{if((D|0)==0){gk();F=ut($)|0;if((F|0)!=0){a5=F;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74192,v)|0)}else{a5=D}}while(0);be(a5|0,172512,(v=i,i=i+24|0,c[v>>2]=_,c[v+8>>2]=136336,c[v+16>>2]=179864,v)|0);D=e6(a5)|0;c[D+16>>2]=2;h[D+24>>3]=aL;h[D+32>>3]=0.0;a[D+8|0]=0;uu(a5);D=(uA(_|0)|0)+6|0;$=ut(D)|0;do{if(($|0)==0){gk();F=ut(D)|0;if((F|0)!=0){a6=F;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74192,v)|0)}else{a6=$}}while(0);be(a6|0,172512,(v=i,i=i+24|0,c[v>>2]=_,c[v+8>>2]=134616,c[v+16>>2]=179864,v)|0);$=e6(a6)|0;c[$+16>>2]=2;h[$+24>>3]=aH;h[$+32>>3]=0.0;a[$+8|0]=0;uu(a6);$=(uA(_|0)|0)+10|0;D=ut($)|0;do{if((D|0)==0){gk();F=ut($)|0;if((F|0)!=0){a7=F;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74192,v)|0)}else{a7=D}}while(0);be(a7|0,172512,(v=i,i=i+24|0,c[v>>2]=_,c[v+8>>2]=75120,c[v+16>>2]=179864,v)|0);D=e6(a7)|0;c[D+16>>2]=2;h[D+24>>3]=aM;h[D+32>>3]=0.0;a[D+8|0]=0;uu(a7);D=(uA(_|0)|0)+10|0;$=ut(D)|0;do{if(($|0)==0){gk();F=ut(D)|0;if((F|0)!=0){a8=F;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74192,v)|0)}else{a8=$}}while(0);be(a8|0,172512,(v=i,i=i+24|0,c[v>>2]=_,c[v+8>>2]=74616,c[v+16>>2]=179864,v)|0);$=e6(a8)|0;c[$+16>>2]=2;h[$+24>>3]=aN;h[$+32>>3]=0.0;a[$+8|0]=0;uu(a8)}if(!x){a9=c[3562]|0;ba=a9;uu(ba);bb=c[3560]|0;bc=bb;uu(bc);c[3562]=0;c[3560]=0;bd=c[3558]|0;uu(bd);c[3558]=0;bf=c[3556]|0;uu(bf);c[3556]=0;i=b;return}$=(M|0)>0;if($){bg=~~+bQ(+aS)+1|0}else{bg=3}D=c[7262]|0;F=c[m>>2]|0;do{if((D|0)==0){c[7262]=F;bh=F;I=10158}else{if((D|0)==(c[n>>2]|0)|(D|0)==(F|0)){bh=D;I=10158;break}cf(D|0,84208,(v=i,i=i+16|0,c[v>>2]=83376,c[v+8>>2]=M,v)|0);Y=c[7262]|0;cf(Y|0,84208,(v=i,i=i+16|0,c[v>>2]=82464,c[v+8>>2]=R,v)|0);Y=c[7262]|0;cf(Y|0,84208,(v=i,i=i+16|0,c[v>>2]=80984,c[v+8>>2]=Q,v)|0);Y=c[7262]|0;cf(Y|0,84208,(v=i,i=i+16|0,c[v>>2]=79624,c[v+8>>2]=t,v)|0);Y=c[7262]|0;cf(Y|0,84208,(v=i,i=i+16|0,c[v>>2]=78880,c[v+8>>2]=N,v)|0)}}while(0);if((I|0)==10158){aF(10,bh|0);D=c[7262]|0;aI(78344,9,1,D|0);D=c[7262]|0;cf(D|0,77936,(v=i,i=i+16|0,c[v>>2]=bg,c[v+8>>2]=M,v)|0);D=c[7262]|0;cf(D|0,77320,(v=i,i=i+16|0,c[v>>2]=bg,c[v+8>>2]=N,v)|0);D=c[7262]|0;cf(D|0,76744,(v=i,i=i+16|0,c[v>>2]=bg,c[v+8>>2]=R,v)|0);D=c[7262]|0;cf(D|0,76144,(v=i,i=i+16|0,c[v>>2]=bg,c[v+8>>2]=Q,v)|0);D=c[7262]|0;cf(D|0,75560,(v=i,i=i+16|0,c[v>>2]=bg,c[v+8>>2]=t,v)|0)}if(u){uD(d|0,s|0,112);D=e|0;F=f|0;if($){bi=~~+bQ(+aS)+1|0}else{bi=1}x=c[7262]|0;_=c[m>>2]|0;do{if((x|0)==0){c[7262]=_;bj=_}else{if((x|0)==(c[n>>2]|0)|(x|0)==(_|0)){bj=x;break}lb(d,143296);a9=c[3562]|0;ba=a9;uu(ba);bb=c[3560]|0;bc=bb;uu(bc);c[3562]=0;c[3560]=0;bd=c[3558]|0;uu(bd);c[3558]=0;bf=c[3556]|0;uu(bf);c[3556]=0;i=b;return}}while(0);aF(10,bj|0);x=c[d>>2]|0;_=(x|0)>0;u=c[7262]|0;if(_){t=c[d+4>>2]|0;cf(u|0,94136,(v=i,i=i+16|0,c[v>>2]=x,c[v+8>>2]=t,v)|0)}else{aI(93512,11,1,u|0)}u=c[7262]|0;al=+h[d+8>>3];am=+P(+al);do{if(am<1.0e-14){be(D|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(D|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(D|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);cf(u|0,92672,(v=i,i=i+8|0,c[v>>2]=D,v)|0);t=c[7262]|0;al=+h[d+16>>3];am=+P(+al);do{if(am<1.0e-14){be(D|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(D|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(D|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);cf(t|0,91840,(v=i,i=i+8|0,c[v>>2]=D,v)|0);u=c[7262]|0;al=+h[d+24>>3];am=+P(+al);do{if(am<1.0e-14){be(D|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(D|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(D|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);cf(u|0,91184,(v=i,i=i+8|0,c[v>>2]=D,v)|0);t=c[7262]|0;al=+h[d+32>>3];am=+P(+al);do{if(am<1.0e-14){be(D|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(D|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(D|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);cf(t|0,90616,(v=i,i=i+8|0,c[v>>2]=D,v)|0);u=c[7262]|0;aF(10,u|0);u=c[7262]|0;al=+h[d+40>>3];am=+P(+al);do{if(am<1.0e-14){be(D|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(D|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(D|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);t=c[d+48>>2]|0;if(_){Y=(t|0)/(x|0)&-1;Z=(t|0)%(x|0)&-1;cf(u|0,90112,(v=i,i=i+32|0,c[v>>2]=D,c[v+8>>2]=bi,c[v+16>>2]=Y,c[v+24>>2]=Z,v)|0);Z=c[7262]|0;al=+h[d+56>>3];am=+P(+al);do{if(am<1.0e-14){be(D|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(D|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(D|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);_=c[d+64>>2]|0;Y=(_|0)/(x|0)&-1;z=(_|0)%(x|0)&-1;cf(Z|0,89384,(v=i,i=i+32|0,c[v>>2]=D,c[v+8>>2]=bi,c[v+16>>2]=Y,c[v+24>>2]=z,v)|0);z=c[7262]|0;al=+h[d+96>>3];am=+P(+al);do{if(am<1.0e-14){be(D|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(D|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(D|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);al=+h[d+104>>3];am=+P(+al);do{if(am<1.0e-14){be(F|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(F|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(F|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);cf(z|0,88904,(v=i,i=i+16|0,c[v>>2]=D,c[v+8>>2]=F,v)|0);a9=c[3562]|0;ba=a9;uu(ba);bb=c[3560]|0;bc=bb;uu(bc);c[3562]=0;c[3560]=0;bd=c[3558]|0;uu(bd);c[3558]=0;bf=c[3556]|0;uu(bf);c[3556]=0;i=b;return}cf(u|0,88336,(v=i,i=i+24|0,c[v>>2]=D,c[v+8>>2]=bi,c[v+16>>2]=t,v)|0);Z=c[7262]|0;al=+h[d+56>>3];am=+P(+al);do{if(am<1.0e-14){be(D|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(D|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(D|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);t=c[d+64>>2]|0;cf(Z|0,87048,(v=i,i=i+24|0,c[v>>2]=D,c[v+8>>2]=bi,c[v+16>>2]=t,v)|0);t=c[7262]|0;al=+h[d+80>>3];am=+P(+al);do{if(am<1.0e-14){be(D|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(D|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(D|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);cf(t|0,86e3,(v=i,i=i+8|0,c[v>>2]=D,v)|0);Z=c[7262]|0;al=+h[d+72>>3];am=+P(+al);do{if(am<1.0e-14){be(D|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(D|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(D|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);cf(Z|0,84768,(v=i,i=i+8|0,c[v>>2]=D,v)|0);t=c[7262]|0;al=+h[d+88>>3];am=+P(+al);do{if(am<1.0e-14){be(D|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(D|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(D|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);cf(t|0,86e3,(v=i,i=i+8|0,c[v>>2]=D,v)|0);Z=c[7262]|0;aF(10,Z|0);a9=c[3562]|0;ba=a9;uu(ba);bb=c[3560]|0;bc=bb;uu(bc);c[3562]=0;c[3560]=0;bd=c[3558]|0;uu(bd);c[3558]=0;bf=c[3556]|0;uu(bf);c[3556]=0;i=b;return}uD(l|0,r|0,112);uD(k|0,s|0,112);Z=e|0;u=f|0;F=j|0;if($){bk=~~+bQ(+aS)+1|0}else{bk=1}z=c[7262]|0;if(!((z|0)==(c[n>>2]|0)|(z|0)==(c[m>>2]|0))){lb(l,144920);lb(k,143296);z=c[7262]|0;cf(z|0,141768,(v=i,i=i+16|0,c[v>>2]=140096,h[v+8>>3]=aJ,v)|0);z=c[7262]|0;cf(z|0,141768,(v=i,i=i+16|0,c[v>>2]=138e3,h[v+8>>3]=aK,v)|0);z=c[7262]|0;cf(z|0,141768,(v=i,i=i+16|0,c[v>>2]=136336,h[v+8>>3]=aL,v)|0);z=c[7262]|0;cf(z|0,141768,(v=i,i=i+16|0,c[v>>2]=134616,h[v+8>>3]=aH,v)|0);a9=c[3562]|0;ba=a9;uu(ba);bb=c[3560]|0;bc=bb;uu(bc);c[3562]=0;c[3560]=0;bd=c[3558]|0;uu(bd);c[3558]=0;bf=c[3556]|0;uu(bf);c[3556]=0;i=b;return}z=bk+4|0;uF(F|0,132920,z|0);a[j+z|0]=0;z=c[7262]|0;if((z|0)==0){x=c[m>>2]|0;c[7262]=x;bl=x}else{bl=z}aF(10,bl|0);z=c[7262]|0;aI(130456,11,1,z|0);z=c[7262]|0;al=+h[l+8>>3];am=+P(+al);do{if(am<1.0e-14){be(Z|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(Z|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(Z|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);al=+h[k+8>>3];am=+P(+al);do{if(am<1.0e-14){be(u|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(u|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(u|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);cf(z|0,129328,(v=i,i=i+24|0,c[v>>2]=Z,c[v+8>>2]=F,c[v+16>>2]=u,v)|0);$=c[7262]|0;al=+h[l+16>>3];am=+P(+al);do{if(am<1.0e-14){be(Z|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(Z|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(Z|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);al=+h[k+16>>3];am=+P(+al);do{if(am<1.0e-14){be(u|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(u|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(u|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);cf($|0,128056,(v=i,i=i+24|0,c[v>>2]=Z,c[v+8>>2]=F,c[v+16>>2]=u,v)|0);z=c[7262]|0;al=+h[l+24>>3];am=+P(+al);do{if(am<1.0e-14){be(Z|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(Z|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(Z|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);al=+h[k+24>>3];am=+P(+al);do{if(am<1.0e-14){be(u|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(u|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(u|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);cf(z|0,126736,(v=i,i=i+24|0,c[v>>2]=Z,c[v+8>>2]=F,c[v+16>>2]=u,v)|0);$=c[7262]|0;al=+h[l+32>>3];am=+P(+al);do{if(am<1.0e-14){be(Z|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(Z|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(Z|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);al=+h[k+32>>3];am=+P(+al);do{if(am<1.0e-14){be(u|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(u|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(u|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);cf($|0,125656,(v=i,i=i+24|0,c[v>>2]=Z,c[v+8>>2]=F,c[v+16>>2]=u,v)|0);z=c[7262]|0;aF(10,z|0);z=c[7262]|0;al=+h[l+40>>3];am=+P(+al);do{if(am<1.0e-14){be(Z|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(Z|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(Z|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);$=c[l+48>>2]|0;al=+h[k+40>>3];am=+P(+al);do{if(am<1.0e-14){be(u|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(u|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(u|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);D=c[k+48>>2]|0;cf(z|0,124424,(v=i,i=i+48|0,c[v>>2]=Z,c[v+8>>2]=bk,c[v+16>>2]=$,c[v+24>>2]=u,c[v+32>>2]=bk,c[v+40>>2]=D,v)|0);D=c[7262]|0;al=+h[l+56>>3];am=+P(+al);do{if(am<1.0e-14){be(Z|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(Z|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(Z|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);$=c[l+64>>2]|0;al=+h[k+56>>3];am=+P(+al);do{if(am<1.0e-14){be(u|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(u|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(u|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);z=c[k+64>>2]|0;cf(D|0,122968,(v=i,i=i+48|0,c[v>>2]=Z,c[v+8>>2]=bk,c[v+16>>2]=$,c[v+24>>2]=u,c[v+32>>2]=bk,c[v+40>>2]=z,v)|0);z=c[7262]|0;al=+h[l+80>>3];am=+P(+al);do{if(am<1.0e-14){be(Z|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(Z|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(Z|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);al=+h[k+80>>3];am=+P(+al);do{if(am<1.0e-14){be(u|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(u|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(u|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);cf(z|0,121824,(v=i,i=i+24|0,c[v>>2]=Z,c[v+8>>2]=F,c[v+16>>2]=u,v)|0);$=c[7262]|0;al=+h[l+72>>3];am=+P(+al);do{if(am<1.0e-14){be(Z|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(Z|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(Z|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);al=+h[k+72>>3];am=+P(+al);do{if(am<1.0e-14){be(u|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(u|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(u|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);cf($|0,119880,(v=i,i=i+24|0,c[v>>2]=Z,c[v+8>>2]=F,c[v+16>>2]=u,v)|0);z=c[7262]|0;al=+h[l+88>>3];am=+P(+al);do{if(am<1.0e-14){be(Z|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(Z|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(Z|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);al=+h[k+88>>3];am=+P(+al);do{if(am<1.0e-14){be(u|0,109728,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else{if(+P(+(+bQ(+am)))<6.0){be(u|0,109728,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}else{be(u|0,107744,(v=i,i=i+8|0,h[v>>3]=al,v)|0);break}}}while(0);cf(z|0,121824,(v=i,i=i+24|0,c[v>>2]=Z,c[v+8>>2]=F,c[v+16>>2]=u,v)|0);$=c[7262]|0;aF(10,$|0);$=c[7262]|0;if(aK<0.0){al=-0.0-aK;cf($|0,116720,(v=i,i=i+16|0,h[v>>3]=aJ,h[v+8>>3]=al,v)|0)}else{cf($|0,115856,(v=i,i=i+16|0,h[v>>3]=aJ,h[v+8>>3]=aK,v)|0)}$=c[7262]|0;cf($|0,114952,(v=i,i=i+8|0,h[v>>3]=aL,v)|0);$=c[7262]|0;cf($|0,113880,(v=i,i=i+8|0,h[v>>3]=aH,v)|0);$=c[7262]|0;aF(10,$|0);a9=c[3562]|0;ba=a9;uu(ba);bb=c[3560]|0;bc=bb;uu(bc);c[3562]=0;c[3560]=0;bd=c[3558]|0;uu(bd);c[3558]=0;bf=c[3556]|0;uu(bf);c[3556]=0;i=b;return}else if((I|0)==10339){bm=c[13898]|0;bn=bm-1|0;c[13898]=bn;uf(bn,162880,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((I|0)==10340){bm=c[13898]|0;bn=bm-1|0;c[13898]=bn;uf(bn,162880,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((I|0)==10341){bm=c[13898]|0;bn=bm-1|0;c[13898]=bn;uf(bn,162880,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((I|0)==10342){bm=c[13898]|0;bn=bm-1|0;c[13898]=bn;uf(bn,162880,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((I|0)==10343){bm=c[13898]|0;bn=bm-1|0;c[13898]=bn;uf(bn,162880,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((I|0)==10345){uf(au,154024,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((I|0)==10346){uf(au,154024,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((I|0)==10347){uf(au,154024,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((I|0)==10348){uf(au,154024,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((I|0)==10349){uf(au,154024,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((I|0)==10350){uf(au,154024,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((I|0)==10351){uf(au,154024,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((I|0)==10087){c[13898]=aC}c[3556]=0;bm=c[13898]|0;bn=bm-1|0;c[13898]=bn;uf(bn,162880,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);c[3558]=0;B=y;uf(B,205112,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}function la(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0;c=+h[a>>3];d=+h[b>>3];if(cd&1;return e|0}function lb(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,g=0,j=0,k=0,l=0,m=0;d=i;e=a;a=i;i=i+112|0;uD(a,e,112);f=+h[a+8>>3];cf(c[7262]|0,106776,(v=i,i=i+24|0,c[v>>2]=105792,c[v+8>>2]=b,h[v+16>>3]=f,v)|0);f=+h[a+16>>3];cf(c[7262]|0,106776,(v=i,i=i+24|0,c[v>>2]=104736,c[v+8>>2]=b,h[v+16>>3]=f,v)|0);f=+h[a+24>>3];cf(c[7262]|0,106776,(v=i,i=i+24|0,c[v>>2]=104152,c[v+8>>2]=b,h[v+16>>3]=f,v)|0);f=+h[a+32>>3];cf(c[7262]|0,106776,(v=i,i=i+24|0,c[v>>2]=103792,c[v+8>>2]=b,h[v+16>>3]=f,v)|0);f=+h[a+40>>3];cf(c[7262]|0,106776,(v=i,i=i+24|0,c[v>>2]=103256,c[v+8>>2]=b,h[v+16>>3]=f,v)|0);e=c[a>>2]|0;if((e|0)==0){g=c[7262]|0;f=+h[a+80>>3];cf(g|0,106776,(v=i,i=i+24|0,c[v>>2]=101216,c[v+8>>2]=b,h[v+16>>3]=f,v)|0);g=c[7262]|0;f=+h[a+72>>3];cf(g|0,106776,(v=i,i=i+24|0,c[v>>2]=100616,c[v+8>>2]=b,h[v+16>>3]=f,v)|0);g=c[7262]|0;f=+h[a+88>>3];cf(g|0,106776,(v=i,i=i+24|0,c[v>>2]=99968,c[v+8>>2]=b,h[v+16>>3]=f,v)|0)}f=+h[a+56>>3];cf(c[7262]|0,106776,(v=i,i=i+24|0,c[v>>2]=99528,c[v+8>>2]=b,h[v+16>>3]=f,v)|0);g=c[7262]|0;j=c[a+48>>2]|0;if((e|0)>0){k=(j|0)/(e|0)&-1;cf(g|0,99104,(v=i,i=i+24|0,c[v>>2]=98432,c[v+8>>2]=b,c[v+16>>2]=k,v)|0);k=c[7262]|0;l=(j|0)%(e|0)&-1;cf(k|0,99104,(v=i,i=i+24|0,c[v>>2]=97816,c[v+8>>2]=b,c[v+16>>2]=l,v)|0);l=c[7262]|0;k=c[a+64>>2]|0;m=(k|0)/(e|0)&-1;cf(l|0,99104,(v=i,i=i+24|0,c[v>>2]=97216,c[v+8>>2]=b,c[v+16>>2]=m,v)|0);m=c[7262]|0;l=(k|0)%(e|0)&-1;cf(m|0,99104,(v=i,i=i+24|0,c[v>>2]=96656,c[v+8>>2]=b,c[v+16>>2]=l,v)|0);l=c[7262]|0;f=+h[a+96>>3];cf(l|0,106776,(v=i,i=i+24|0,c[v>>2]=96240,c[v+8>>2]=b,h[v+16>>3]=f,v)|0);l=c[7262]|0;f=+h[a+104>>3];cf(l|0,106776,(v=i,i=i+24|0,c[v>>2]=95776,c[v+8>>2]=b,h[v+16>>3]=f,v)|0);i=d;return}else{cf(g|0,99104,(v=i,i=i+24|0,c[v>>2]=95288,c[v+8>>2]=b,c[v+16>>2]=j,v)|0);j=c[7262]|0;g=c[a+64>>2]|0;cf(j|0,99104,(v=i,i=i+24|0,c[v>>2]=94824,c[v+8>>2]=b,c[v+16>>2]=g,v)|0);i=d;return}}function lc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,w=0.0,x=0.0,y=0.0,z=0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0;f=i;i=i+32|0;g=f|0;j=d<<4;k=ut(j)|0;do{if((k|0)==0){gk();l=ut(j)|0;if((l|0)!=0){m=l;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=223576,v)|0)}else{m=k}}while(0);k=m;j=(e|0)>0;if(j){n=e;o=(d|0)/(e|0)&-1}else{n=0;o=d}e=(d|0)>0;if(e){l=0;p=0.0;q=0.0;r=0.0;s=0.0;while(1){t=+h[b+(l<<3)>>3];u=p+t;w=q+t*t;if(j){x=s+t*+((l|0)/(n|0)&-1|0);y=r+t*+((l|0)%(n|0)&-1|0)}else{x=s;y=r}z=l+1|0;if((z|0)<(d|0)){l=z;p=u;q=w;r=y;s=x}else{A=u;B=w;C=y;D=x;break}}}else{A=0.0;B=0.0;C=0.0;D=0.0}x=+(d|0);y=A/x;s=+Q(+(B/x-y*y));if(e){e=0;do{h[k+(e<<4)>>3]=+h[b+(e<<3)>>3];c[k+(e<<4)+8>>2]=e;e=e+1|0;}while((e|0)<(d|0))}bM(m|0,d|0,16,4);e=g;c[e>>2]=c[m>>2];c[e+4>>2]=c[m+4>>2];c[e+8>>2]=c[m+8>>2];c[e+12>>2]=c[m+12>>2];b=d-1|0;l=k+(b<<4)|0;j=g+16|0;c[j>>2]=c[l>>2];c[j+4>>2]=c[l+4>>2];c[j+8>>2]=c[l+8>>2];c[j+12>>2]=c[l+12>>2];if((d&1|0)==0){l=(d|0)/2&-1;E=(+h[k+(l-1<<4)>>3]+ +h[k+(l<<4)>>3])*.5}else{E=+h[k+(((b|0)/2&-1)<<4)>>3]}if((d&3|0)==0){b=(d|0)/4&-1;l=d-b|0;F=(+h[k+(l<<4)>>3]+ +h[k+(l-1<<4)>>3])*.5;G=(+h[k+(b-1<<4)>>3]+ +h[k+(b<<4)>>3])*.5}else{b=(d+3|0)/4&-1;F=+h[k+(d-b<<4)>>3];G=+h[k+(b-1<<4)>>3]}if(C==0.0&D==0.0){H=0.0;I=0.0}else{H=D/A;I=C/A}uu(m);c[a>>2]=n;c[a+4>>2]=o;h[a+8>>3]=y;h[a+16>>3]=s;h[a+24>>3]=A;h[a+32>>3]=B;o=a+40|0;c[o>>2]=c[e>>2];c[o+4>>2]=c[e+4>>2];c[o+8>>2]=c[e+8>>2];c[o+12>>2]=c[e+12>>2];c[o+16>>2]=c[e+16>>2];c[o+20>>2]=c[e+20>>2];c[o+24>>2]=c[e+24>>2];c[o+28>>2]=c[e+28>>2];h[a+72>>3]=E;h[a+80>>3]=G;h[a+88>>3]=F;h[a+96>>3]=I;h[a+104>>3]=H;i=f;return}function ld(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0.0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0;f=i;g=b;b=i;i=i+112|0;uD(b,g,112);j=+h[b+8>>3];g=(d|0)!=0?d:179864;d=(e|0)!=0?e:179864;e=uA(g|0)|0;k=(e+5|0)+(uA(d|0)|0)|0;e=ut(k)|0;do{if((e|0)==0){gk();l=ut(k)|0;if((l|0)!=0){m=l;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74192,v)|0)}else{m=e}}while(0);be(m|0,172512,(v=i,i=i+24|0,c[v>>2]=g,c[v+8>>2]=105792,c[v+16>>2]=d,v)|0);e=e6(m)|0;c[e+16>>2]=2;h[e+24>>3]=j;h[e+32>>3]=0.0;a[e+8|0]=0;uu(m);j=+h[b+16>>3];m=uA(g|0)|0;e=(m+7|0)+(uA(d|0)|0)|0;m=ut(e)|0;do{if((m|0)==0){gk();k=ut(e)|0;if((k|0)!=0){n=k;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74192,v)|0)}else{n=m}}while(0);be(n|0,172512,(v=i,i=i+24|0,c[v>>2]=g,c[v+8>>2]=104736,c[v+16>>2]=d,v)|0);m=e6(n)|0;c[m+16>>2]=2;h[m+24>>3]=j;h[m+32>>3]=0.0;a[m+8|0]=0;uu(n);j=+h[b+24>>3];n=uA(g|0)|0;m=(n+4|0)+(uA(d|0)|0)|0;n=ut(m)|0;do{if((n|0)==0){gk();e=ut(m)|0;if((e|0)!=0){o=e;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74192,v)|0)}else{o=n}}while(0);be(o|0,172512,(v=i,i=i+24|0,c[v>>2]=g,c[v+8>>2]=104152,c[v+16>>2]=d,v)|0);n=e6(o)|0;c[n+16>>2]=2;h[n+24>>3]=j;h[n+32>>3]=0.0;a[n+8|0]=0;uu(o);j=+h[b+32>>3];o=uA(g|0)|0;n=(o+6|0)+(uA(d|0)|0)|0;o=ut(n)|0;do{if((o|0)==0){gk();m=ut(n)|0;if((m|0)!=0){p=m;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74192,v)|0)}else{p=o}}while(0);be(p|0,172512,(v=i,i=i+24|0,c[v>>2]=g,c[v+8>>2]=73440,c[v+16>>2]=d,v)|0);o=e6(p)|0;c[o+16>>2]=2;h[o+24>>3]=j;h[o+32>>3]=0.0;a[o+8|0]=0;uu(p);j=+h[b+40>>3];p=uA(g|0)|0;o=(p+4|0)+(uA(d|0)|0)|0;p=ut(o)|0;do{if((p|0)==0){gk();n=ut(o)|0;if((n|0)!=0){q=n;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74192,v)|0)}else{q=p}}while(0);be(q|0,172512,(v=i,i=i+24|0,c[v>>2]=g,c[v+8>>2]=103256,c[v+16>>2]=d,v)|0);p=e6(q)|0;c[p+16>>2]=2;h[p+24>>3]=j;h[p+32>>3]=0.0;a[p+8|0]=0;uu(q);j=+h[b+56>>3];q=uA(g|0)|0;p=(q+4|0)+(uA(d|0)|0)|0;q=ut(p)|0;do{if((q|0)==0){gk();o=ut(p)|0;if((o|0)!=0){r=o;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74192,v)|0)}else{r=q}}while(0);be(r|0,172512,(v=i,i=i+24|0,c[v>>2]=g,c[v+8>>2]=99528,c[v+16>>2]=d,v)|0);q=e6(r)|0;c[q+16>>2]=2;h[q+24>>3]=j;h[q+32>>3]=0.0;a[q+8|0]=0;uu(r);r=c[b>>2]|0;if((r|0)>0){q=c[b+48>>2]|0;j=+((q|0)/(r|0)&-1|0);p=uA(g|0)|0;o=(p+12|0)+(uA(d|0)|0)|0;p=ut(o)|0;do{if((p|0)==0){gk();n=ut(o)|0;if((n|0)!=0){s=n;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74192,v)|0)}else{s=p}}while(0);be(s|0,172512,(v=i,i=i+24|0,c[v>>2]=g,c[v+8>>2]=98432,c[v+16>>2]=d,v)|0);p=e6(s)|0;c[p+16>>2]=2;h[p+24>>3]=j;h[p+32>>3]=0.0;a[p+8|0]=0;uu(s);j=+((q|0)%(r|0)&-1|0);q=uA(g|0)|0;s=(q+12|0)+(uA(d|0)|0)|0;q=ut(s)|0;do{if((q|0)==0){gk();p=ut(s)|0;if((p|0)!=0){t=p;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74192,v)|0)}else{t=q}}while(0);be(t|0,172512,(v=i,i=i+24|0,c[v>>2]=g,c[v+8>>2]=97816,c[v+16>>2]=d,v)|0);q=e6(t)|0;c[q+16>>2]=2;h[q+24>>3]=j;h[q+32>>3]=0.0;a[q+8|0]=0;uu(t);t=c[b+64>>2]|0;j=+((t|0)/(r|0)&-1|0);q=uA(g|0)|0;s=(q+12|0)+(uA(d|0)|0)|0;q=ut(s)|0;do{if((q|0)==0){gk();p=ut(s)|0;if((p|0)!=0){u=p;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74192,v)|0)}else{u=q}}while(0);be(u|0,172512,(v=i,i=i+24|0,c[v>>2]=g,c[v+8>>2]=97216,c[v+16>>2]=d,v)|0);q=e6(u)|0;c[q+16>>2]=2;h[q+24>>3]=j;h[q+32>>3]=0.0;a[q+8|0]=0;uu(u);j=+((t|0)%(r|0)&-1|0);r=uA(g|0)|0;t=(r+12|0)+(uA(d|0)|0)|0;r=ut(t)|0;do{if((r|0)==0){gk();u=ut(t)|0;if((u|0)!=0){w=u;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74192,v)|0)}else{w=r}}while(0);be(w|0,172512,(v=i,i=i+24|0,c[v>>2]=g,c[v+8>>2]=96656,c[v+16>>2]=d,v)|0);r=e6(w)|0;c[r+16>>2]=2;h[r+24>>3]=j;h[r+32>>3]=0.0;a[r+8|0]=0;uu(w);i=f;return}j=+h[b+72>>3];w=uA(g|0)|0;r=(w+7|0)+(uA(d|0)|0)|0;w=ut(r)|0;do{if((w|0)==0){gk();t=ut(r)|0;if((t|0)!=0){x=t;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74192,v)|0)}else{x=w}}while(0);be(x|0,172512,(v=i,i=i+24|0,c[v>>2]=g,c[v+8>>2]=100616,c[v+16>>2]=d,v)|0);w=e6(x)|0;c[w+16>>2]=2;h[w+24>>3]=j;h[w+32>>3]=0.0;a[w+8|0]=0;uu(x);j=+h[b+80>>3];x=uA(g|0)|0;w=(x+12|0)+(uA(d|0)|0)|0;x=ut(w)|0;do{if((x|0)==0){gk();r=ut(w)|0;if((r|0)!=0){y=r;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74192,v)|0)}else{y=x}}while(0);be(y|0,172512,(v=i,i=i+24|0,c[v>>2]=g,c[v+8>>2]=101216,c[v+16>>2]=d,v)|0);x=e6(y)|0;c[x+16>>2]=2;h[x+24>>3]=j;h[x+32>>3]=0.0;a[x+8|0]=0;uu(y);j=+h[b+88>>3];y=uA(g|0)|0;x=(y+12|0)+(uA(d|0)|0)|0;y=ut(x)|0;do{if((y|0)==0){gk();w=ut(x)|0;if((w|0)!=0){z=w;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74192,v)|0)}else{z=y}}while(0);be(z|0,172512,(v=i,i=i+24|0,c[v>>2]=g,c[v+8>>2]=99968,c[v+16>>2]=d,v)|0);y=e6(z)|0;c[y+16>>2]=2;h[y+24>>3]=j;h[y+32>>3]=0.0;a[y+8|0]=0;uu(z);j=+(c[b+48>>2]|0);z=uA(g|0)|0;y=(z+10|0)+(uA(d|0)|0)|0;z=ut(y)|0;do{if((z|0)==0){gk();x=ut(y)|0;if((x|0)!=0){A=x;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74192,v)|0)}else{A=z}}while(0);be(A|0,172512,(v=i,i=i+24|0,c[v>>2]=g,c[v+8>>2]=72824,c[v+16>>2]=d,v)|0);z=e6(A)|0;c[z+16>>2]=2;h[z+24>>3]=j;h[z+32>>3]=0.0;a[z+8|0]=0;uu(A);j=+(c[b+64>>2]|0);b=uA(g|0)|0;A=(b+10|0)+(uA(d|0)|0)|0;b=ut(A)|0;do{if((b|0)==0){gk();z=ut(A)|0;if((z|0)!=0){B=z;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74192,v)|0)}else{B=b}}while(0);be(B|0,172512,(v=i,i=i+24|0,c[v>>2]=g,c[v+8>>2]=225064,c[v+16>>2]=d,v)|0);d=e6(B)|0;c[d+16>>2]=2;h[d+24>>3]=j;h[d+32>>3]=0.0;a[d+8|0]=0;uu(B);i=f;return}function le(b,d,e){b=+b;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0.0;f=i;i=i+48|0;g=f|0;do{if((c[64808+(d*688&-1)>>2]|0)==1){j=64864+(d*688&-1)|0;if((aY(j|0,132824)|0)==0){ud(e,150,74984,1.0,b);break}a[e]=34;k=e+1|0;t3(g,b);l=b- +O(+b);t4(k,149,j,g,l);j=a8(e|0,10)|0;if((j|0)!=0){k=j;do{a[k]=32;k=a8(e|0,10)|0;}while((k|0)!=0)}k=e+(uA(e|0)|0)|0;w=34;a[k]=w&255;w=w>>8;a[k+1|0]=w&255}else{if((a[64788+(d*688&-1)|0]&1)==0){ud(e,150,64864+(d*688&-1)|0,1.0,b);break}else{ud(e,150,64864+(d*688&-1)|0,1.0,+R(+(+h[64792+(d*688&-1)>>3]),+b));break}}}while(0);aK(e|0,c[8248]|0);aF(32,c[8248]|0);i=f;return}function lf(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0.0,H=0,I=0,J=0;e=i;f=ut(150)|0;do{if((f|0)==0){gk();g=ut(150)|0;if((g|0)!=0){j=g;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=126456,v)|0)}else{j=f}}while(0);f=c[3526]|0;g=(f|0)!=0?f:c[10030]|0;c[8248]=g;if((d|0)>0){k=0;l=b;n=g}else{o=g;p=aD(o|0)|0;uu(j);i=e;return}L14252:while(1){g=l+300|0;b=c[g>>2]|0;cf(n|0,203280,(v=i,i=i+24|0,c[v>>2]=k,c[v+8>>2]=d,c[v+16>>2]=b,v)|0);b=c[l+16>>2]|0;do{if((b|0)!=0){if((a[b]|0)==0){break}f=uA(b|0)<<1;q=ut(f)|0;if((q|0)==0){gk();r=ut(f)|0;if((r|0)==0){s=10464;break L14252}else{t=r}}else{t=q}q=t;r=b;while(1){f=a[r]|0;if(f<<24>>24==10){u=q+1|0;a[q]=92;a[u]=110;w=u}else{a[q]=f;w=q}if((a[r]|0)==0){break}else{q=w+1|0;r=r+1|0}}cf(c[8248]|0,15e4,(v=i,i=i+8|0,c[v>>2]=t,v)|0);uu(t)}}while(0);aI(132264,6,1,c[8248]|0);b=l+12|0;r=c[b>>2]|0;do{if((r|0)==137|(r|0)==118){q=c[8248]|0;aI(96928,22,1,q|0)}else if((r|0)==252){aI(75296,29,1,c[8248]|0)}else if((r|0)==416|(r|0)==432){aI(204480,22,1,c[8248]|0)}else if((r|0)==400){aI(210472,7,1,c[8248]|0)}else if((r|0)==257){aI(82936,23,1,c[8248]|0)}else if((r|0)==153|(r|0)==86){aI(119232,11,1,c[8248]|0)}else if((r|0)==345){aI(90824,4,1,c[8248]|0)}else if((r|0)==169|(r|0)==102){aI(103984,11,1,c[8248]|0)}else if((r|0)==225){aI(215896,16,1,c[8248]|0)}else if((r|0)==368){aI(222792,6,1,c[8248]|0)}else if(!((r|0)==1|(r|0)==18|(r|0)==51|(r|0)==64|(r|0)==33|(r|0)==177|(r|0)==193|(r|0)==209)){if((a[37400]&1)==0){break}cf(c[m>>2]|0,200512,(v=i,i=i+8|0,c[v>>2]=(r|0)==392?195192:184488,v)|0)}}while(0);r=l+316|0;if((c[r>>2]|0)!=0){q=c[8248]|0;aI(179312,7,1,q|0)}aI(175152,6,1,c[8248]|0);q=c[b>>2]|0;do{if((q|0)==392){x=(c[c[l+276>>2]>>2]|0)==4?102:392;s=10499}else if((q|0)==368){f=c[c[l+224>>2]>>2]|0;if((f|0)==0){break}u=l+304|0;y=l+308|0;z=f;do{f=c[z+60>>2]|0;A=uA(f|0)<<1;B=ut(A)|0;if((B|0)==0){gk();C=ut(A)|0;if((C|0)==0){s=10491;break L14252}else{D=C}}else{D=B}B=D;C=f;while(1){f=a[C]|0;if(f<<24>>24==10){A=B+1|0;a[B]=92;a[A]=110;E=A}else{a[B]=f;E=B}if((a[C]|0)==0){break}else{B=E+1|0;C=C+1|0}}le(+h[z+24>>3],c[u>>2]|0,j);le(+h[z+32>>3],c[y>>2]|0,j);cf(c[8248]|0,171376,(v=i,i=i+8|0,c[v>>2]=D,v)|0);uu(D);z=c[z>>2]|0;}while((z|0)!=0)}else{x=q;s=10499}}while(0);do{if((s|0)==10499){s=0;q=l+320|0;if((c[g>>2]|0)<=0){break}b=l+304|0;z=l+308|0;y=l+72|0;u=l+64|0;C=l+28|0;B=c[q>>2]|0;f=0;while(1){if((uG(B|0,56440,64)|0)==0){A=c[8248]|0;aF(10,A|0)}else{A=B+8|0;le(+h[A>>3],c[b>>2]|0,j);F=B+16|0;le(+h[F>>3],c[z>>2]|0,j);if((x|0)==345){le(+h[B+40>>3],c[z>>2]|0,j)}else if((x|0)==169|(x|0)==102){s=10506}else if((x|0)==400){cf(c[8248]|0,184536,(v=i,i=i+8|0,h[v>>3]=+h[B+24>>3],v)|0)}else if((x|0)==416|(x|0)==432){cf(c[8248]|0,153776,(v=i,i=i+8|0,c[v>>2]=~~+h[B+40>>3],v)|0);cf(c[8248]|0,153776,(v=i,i=i+8|0,c[v>>2]=~~+h[B+48>>3],v)|0);cf(c[8248]|0,153776,(v=i,i=i+8|0,c[v>>2]=~~+h[B+56>>3],v)|0);cf(c[8248]|0,153776,(v=i,i=i+8|0,c[v>>2]=~~+h[B+32>>3],v)|0)}else if((x|0)==153|(x|0)==86){le(+h[B+48>>3],c[b>>2]|0,j);le(+h[B+56>>3],c[b>>2]|0,j)}else if((x|0)==137|(x|0)==118){le(+h[B+48>>3],c[b>>2]|0,j);le(+h[B+56>>3],c[b>>2]|0,j);s=10506}else if((x|0)==257){le(+h[B+32>>3],c[z>>2]|0,j);le(+h[B+40>>3],c[z>>2]|0,j);le(+h[B+24>>3],c[z>>2]|0,j)}else if((x|0)==252){le(+h[B+32>>3],c[z>>2]|0,j);le(+h[B+40>>3],c[z>>2]|0,j);le(+h[B+24>>3],c[z>>2]|0,j);le((+h[A>>3]- +h[B+48>>3])*2.0,c[b>>2]|0,j)}else if((x|0)==225){le(+h[B+56>>3]- +h[A>>3],c[b>>2]|0,j);le(+h[B+40>>3]- +h[F>>3],c[z>>2]|0,j)}if((s|0)==10506){s=0;le(+h[B+32>>3],c[z>>2]|0,j);le(+h[B+40>>3],c[z>>2]|0,j)}F=c[r>>2]|0;do{if((F|0)!=0){G=+h[F+(f<<3)>>3];A=c[u>>2]|0;if(+h[y>>3]<0.0&(A|0)==3){H=c[8248]|0;I=~~G;cf(H|0,150832,(v=i,i=i+8|0,c[v>>2]=I,v)|0);break}if((A|0)==6){le(G,3,j);break}if((c[C>>2]|0)!=-6){break}le(G,3,j)}}while(0);F=c[8248]|0;A=c[(c[q>>2]|0)+(f<<6)>>2]|0;if((A|0)==0){J=105}else{J=(A|0)==1?111:117}cf(F|0,148928,(v=i,i=i+8|0,c[v>>2]=J,v)|0)}F=f+1|0;if((F|0)<(c[g>>2]|0)){B=B+64|0;f=F}else{break}}}}while(0);aF(10,c[8248]|0);g=k+1|0;r=c[8248]|0;if((g|0)<(d|0)){k=g;l=c[l>>2]|0;n=r}else{o=r;s=10527;break}}if((s|0)==10527){p=aD(o|0)|0;uu(j);i=e;return}else if((s|0)==10464){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=134528,v)|0)}else if((s|0)==10491){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=134528,v)|0)}}function lg(){var b=0.0,d=0,e=0.0,f=0.0,i=0,j=0.0,k=0.0,l=0.0,m=0,n=0.0,o=0.0;if((a[33656]&1)==0){return}b=+h[4211];d=c[8417]|0;e=+(d|0);g[178]=b/e;f=+h[4212];i=c[8416]|0;j=+(i|0);k=f/j;g[38]=k;l=+(c[8420]|0)/e;g[184]=l;m=c[8419]|0;if((a[33673]&1)==0){n=+(m|0)/j}else{n=1.0- +(m+1|0)/j}j=n;g[44]=j;if((c[8453]|0)==0){o=j}else{n=1.0- +h[4243];g[38]=n*k;k=n*j;g[44]=k;o=k}g[184]=+h[4213]+(l-(b+-1.0)/+(d<<1|0));g[44]=+h[4214]+(o-(f+-1.0)/+(i<<1|0));return}function lh(){var b=0;if((a[14080]&1)==0){return}cM[c[(c[3524]|0)+168>>2]&511](5);do{if((a[33512]&1)==0){cS[c[(c[3524]|0)+44>>2]&511]();a[14088]=0}else{c[8415]=(c[8415]|0)+1;if((a[33656]&1)==0){break}do{if((a[33672]&1)==0){b=(c[8420]|0)+1|0;c[8420]=b;if((b|0)!=(c[8417]|0)){break}c[8420]=0;b=(c[8419]|0)+1|0;c[8419]=b;if((b|0)!=(c[8416]|0)){break}c[8420]=0}else{b=(c[8419]|0)+1|0;c[8419]=b;if((b|0)!=(c[8416]|0)){break}c[8419]=0;b=(c[8420]|0)+1|0;c[8420]=b;if((b|0)!=(c[8417]|0)){break}c[8420]=0}}while(0);lg()}}while(0);aD(c[10030]|0);hN(c[8494]|0,c[8492]|0,27760,27744,27752,27736);hM();hW();return}function li(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0;d=i;e=ut(150)|0;do{if((e|0)==0){gk();f=ut(150)|0;if((f|0)!=0){g=f;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=146952,v)|0)}else{g=e}}while(0);e=c[3526]|0;f=(e|0)!=0?e:c[10030]|0;c[8248]=f;if((b|0)>0){j=0;k=43312;l=f}else{n=f;o=aD(n|0)|0;uu(g);i=d;return}L14377:while(1){f=c[k>>2]|0;cf(l|0,144784,(v=i,i=i+16|0,c[v>>2]=j,c[v+8>>2]=b,v)|0);e=c[f+16>>2]|0;do{if((e|0)!=0){if((a[e]|0)==0){break}p=uA(e|0)<<1;q=ut(p)|0;if((q|0)==0){gk();r=ut(p)|0;if((r|0)==0){s=10562;break L14377}else{t=r}}else{t=q}q=t;r=e;while(1){p=a[r]|0;if(p<<24>>24==10){u=q+1|0;a[q]=92;a[u]=110;w=u}else{a[q]=p;w=q}if((a[r]|0)==0){break}else{q=w+1|0;r=r+1|0}}cf(c[8248]|0,15e4,(v=i,i=i+8|0,c[v>>2]=t,v)|0);uu(t)}}while(0);e=f+12|0;r=c[e>>2]|0;do{if((r|0)==368){q=c[c[f+224>>2]>>2]|0;if((q|0)==0){break}else{x=q}do{q=c[x+60>>2]|0;p=uA(q|0)<<1;u=ut(p)|0;if((u|0)==0){gk();y=ut(p)|0;if((y|0)==0){s=10573;break L14377}else{z=y}}else{z=u}u=z;y=q;while(1){q=a[y]|0;if(q<<24>>24==10){p=u+1|0;a[u]=92;a[p]=110;A=p}else{a[u]=q;A=u}if((a[y]|0)==0){break}else{u=A+1|0;y=y+1|0}}le(+h[x+24>>3],2,g);le(+h[x+32>>3],1,g);le(+h[x+40>>3],0,g);cf(c[8248]|0,171376,(v=i,i=i+8|0,c[v>>2]=z,v)|0);uu(z);x=c[x>>2]|0;}while((x|0)!=0)}else if((r|0)==1|(r|0)==18|(r|0)==33|(r|0)==64|(r|0)==225|(r|0)==400){if((a[46752]&1)!=0){y=c[f+260>>2]|0;L14410:do{if((y|0)==0){s=10584}else{u=f+252|0;q=0;p=y;while(1){B=c[8248]|0;if((q|0)>=(c[u>>2]|0)){C=B;break L14410}D=p+8|0;E=c[D>>2]|0;cf(B|0,141688,(v=i,i=i+16|0,c[v>>2]=q,c[v+8>>2]=E,v)|0);if((c[e>>2]|0)==225){E=c[(c[p>>2]|0)+12>>2]|0;B=c[8248]|0;aI(139920,24,1,B|0);F=E}else{F=0}aI(175152,6,1,c[8248]|0);if((c[D>>2]|0)>0){E=c[p+12>>2]|0;B=F;G=0;while(1){H=E+8|0;le(+h[H>>3],2,g);I=E+16|0;le(+h[I>>3],1,g);J=E+24|0;le(+h[J>>3],0,g);K=c[e>>2]|0;if((K|0)==225){le(+h[B+8>>3]- +h[H>>3],2,g);le(+h[B+16>>3]- +h[I>>3],1,g);le(+h[B+24>>3]- +h[J>>3],0,g);L=B+64|0}else if((K|0)==400){cf(c[8248]|0,184536,(v=i,i=i+8|0,h[v>>3]=+h[E+32>>3],v)|0);L=B}else{L=B}K=c[E>>2]|0;if((K|0)==0){M=105}else{M=(K|0)==1?111:117}cf(c[8248]|0,137904,(v=i,i=i+8|0,c[v>>2]=M,v)|0);K=G+1|0;if((K|0)<(c[D>>2]|0)){E=E+64|0;B=L;G=K}else{break}}}G=c[p>>2]|0;if((G|0)==0){s=10584;break}else{q=q+1|0;p=G}}}}while(0);if((s|0)==10584){s=0;C=c[8248]|0}aF(10,C|0)}if((c[11690]|0)==0){break}y=c[f+256>>2]|0;if((y|0)==0){break}else{N=0;O=y}while(1){y=c[O+44>>2]|0;p=c[O+4>>2]|0;if((a[O+8|0]|0)==0){P=N}else{q=c[8248]|0;u=N+1|0;G=O+9|0;cf(q|0,136176,(v=i,i=i+16|0,c[v>>2]=N,c[v+8>>2]=G,v)|0);P=u}if((y|0)>0){u=y;y=p;while(1){p=u-1|0;le(+h[y+8>>3],2,g);le(+h[y+16>>3],1,g);le(+h[y+24>>3],0,g);aF(10,c[8248]|0);if((p|0)>0){u=p;y=y+64|0}else{break}}}aF(10,c[8248]|0);y=c[O>>2]|0;if((y|0)==0){break}else{N=P;O=y}}}else{aI(143080,53,1,c[m>>2]|0)}}while(0);e=j+1|0;r=c[8248]|0;if((e|0)<(b|0)){j=e;k=f|0;l=r}else{n=r;s=10608;break}}if((s|0)==10562){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=134528,v)|0)}else if((s|0)==10608){o=aD(n|0)|0;uu(g);i=d;return}else if((s|0)==10573){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=134528,v)|0)}}function lj(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;e=(b|0)==0;if((c[8244]|0)==(b|0)&(e^1)){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=141656,v)|0)}if((a[33512]&1)!=0){f=c[m>>2]|0;aI(139872,46,1,f|0);i=d;return}f=c[3524]|0;do{if((f|0)!=0){if((a[14080]&1)==0){break}cS[c[f+40>>2]&511]();a[14080]=0;c[10028]=0}}while(0);if(e){a[33072]=0;if((c[8244]|0)==0){i=d;return}e=c[10030]|0;do{if(a[32984]|0){a2(e|0);a[32984]=0}else{if((e|0)==(c[10028]|0)){break}az(e|0)}}while(0);c[10030]=c[n>>2];uu(c[8244]|0);c[8244]=0;e=c[10028]|0;if((e|0)!=0){az(e|0)}c[10028]=0;i=d;return}do{if((a[b]|0)==124){if(!(a[14168]|0)){uf(-1,145320,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=bt(b+1|0,137896)|0;if((e|0)==0){uj(c[13898]|0,136136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{a[32984]=1;g=e;break}}else{e=c[3524]|0;do{if((e|0)==0){h=10634}else{if((c[e+96>>2]&4|0)==0){h=10634;break}j=bF(b|0,134520)|0}}while(0);if((h|0)==10634){j=bF(b|0,137896)|0}if((j|0)!=0){g=j;break}uj(c[13898]|0,132784,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);a[33072]=0;if((c[8244]|0)!=0){j=c[10030]|0;do{if(a[32984]|0){a2(j|0);a[32984]=0}else{if((j|0)==(c[10028]|0)){break}az(j|0)}}while(0);c[10030]=c[n>>2];uu(c[8244]|0);c[8244]=0;j=c[10028]|0;if((j|0)!=0){az(j|0)}c[10028]=0}c[10030]=g;c[8244]=b;b=c[3524]|0;if((b|0)==0){k=0}else{k=(c[b+96>>2]|0)>>>2&1}a[33072]=k;i=d;return}function lk(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;b=i;d=c[3524]|0;if((d|0)==0){uf(-1,131560,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=c[8244]|0;L14513:do{if((e|0)!=0){do{if((c[d+96>>2]&64|0)==0){f=e}else{if((a[37400]&1)==0){g=e}else{h=c[m>>2]|0;cf(h|0,130376,(v=i,i=i+8|0,c[v>>2]=e,v)|0);g=c[8244]|0}a[33072]=0;if((g|0)==0){break L14513}h=c[10030]|0;do{if(a[32984]|0){a2(h|0);a[32984]=0}else{if((h|0)==(c[10028]|0)){break}az(h|0)}}while(0);c[10030]=c[n>>2];uu(c[8244]|0);c[8244]=0;h=c[10028]|0;if((h|0)==0){c[10028]=0;break L14513}else{az(h|0);h=c[8244]|0;c[10028]=0;if((h|0)==0){break L14513}else{f=h;break}}}}while(0);h=(a[33072]&1)==0;if((c[(c[3524]|0)+96>>2]&4|0)==0){if(h){break}}else{if(!h){break}}h=(uA(f|0)|0)+1|0;j=ut(h)|0;do{if((j|0)==0){gk();k=ut(h)|0;if((k|0)!=0){l=k;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=129080,v)|0)}else{l=j}}while(0);j=c[8244]|0;uB(l|0,j|0);lj(l);if((l|0)==(c[8244]|0)|(l|0)==0){break}uu(l)}}while(0);if((a[14080]&1)!=0){i=b;return}cS[c[(c[3524]|0)+36>>2]&511]();a[14080]=1;i=b;return}function ll(){var b=0,d=0,e=0,f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0.0,ai=0,aj=0,ak=0,al=0,am=0.0,an=0,ao=0,ap=0,aq=0,ar=0,as=0.0,at=0,au=0,av=0.0,aw=0.0,ax=0,ay=0.0,az=0,aA=0,aB=0,aC=0.0;b=i;i=i+208|0;d=b|0;e=b+24|0;f=b+48|0;j=b+72|0;k=b+96|0;l=b+120|0;m=b+144|0;n=b+168|0;o=b+192|0;p=b+200|0;c[13898]=(c[13898]|0)+1;if((a[33512]&1)!=0){lm()}if((a[14080]&1)==0){lk()}do{if(a[14088]|0){if((a[33512]&1)==0){break}if(!(a[13032]|0)){break}q=c[(c[3524]|0)+104>>2]|0;if((q|0)!=0){cS[q&511]()}a[13032]=0}else{cS[c[(c[3524]|0)+52>>2]&511]();a[14088]=1}}while(0);cM[c[(c[3524]|0)+168>>2]&511](0);q=c[3524]|0;if((c[q+96>>2]&16|0)!=0){c[7271]=-1}c[13880]=0;c[13881]=(c[q+8>>2]|0)-1;c[13882]=0;c[13883]=(c[q+12>>2]|0)-1;a[33656]=0;c[8415]=0;a[33936]=0;q=c[13898]|0;r=c[8272]|0;L14563:do{if((q|0)<(r|0)){s=m|0;t=m+8|0;u=j|0;w=j+8|0;x=f|0;y=f+8|0;z=e|0;A=e+8|0;B=d|0;C=d+8|0;D=l|0;E=l+8|0;F=k|0;G=k+8|0;H=n|0;I=n+8|0;J=q;K=r;L14565:while(1){L=c[1054]|0;M=(a[L+(J*40&-1)|0]&1)==0;N=c[L+(J*40&-1)+36>>2]|0;O=L+(J*40&-1)+32|0;L14567:do{if(M){P=c[O>>2]|0;Q=10719}else{R=c[10036]|0;S=0;while(1){if((S|0)>=(N|0)){Q=10700;break}if((a[R+((c[O>>2]|0)+S|0)|0]|0)==(a[S+103664|0]|0)){S=S+1|0}else{break}}if((Q|0)==10700){Q=0;if((S|0)==1){break L14563}}R=c[O>>2]|0;if(!((N|0)>0&(M^1))){P=R;Q=10719;break}T=c[10036]|0;U=0;V=0;W=R;while(1){if((a[U+125568|0]|0)==(a[T+(U+W|0)|0]|0)){X=W;Y=V}else{if((U|0)!=2){P=R;Q=10719;break L14567}X=W-1|0;Y=1}Z=U+1|0;if((Z|0)<(Y+N|0)){U=Z;V=Y;W=X}else{break}}if((Y|0)==0){if(!((U|0)==5|(U|0)==1)){P=R;Q=10719;break}}W=J+1|0;c[13898]=W;if((W|0)>=(K|0)){break}L14588:do{if((a[L+(W*40&-1)|0]&1)!=0){V=c[L+(W*40&-1)+36>>2]|0;T=L+(W*40&-1)+32|0;S=c[10036]|0;Z=0;while(1){if((Z|0)>=(V|0)){break}if((a[S+((c[T>>2]|0)+Z|0)|0]|0)==(a[Z+103664|0]|0)){Z=Z+1|0}else{break L14588}}if((Z|0)==1){break L14567}}}while(0);a[14176]=1;is(n);a[14176]=0;if((c[H>>2]|0)!=3){c[13898]=W;break}R=c[I>>2]|0;if((R|0)==0){break}uu(c[8453]|0);c[8453]=R}}while(0);L14599:do{if((Q|0)==10719){Q=0;L14601:do{if((K|0)>(J|0)){if(M){Q=10765;break}O=c[10036]|0;R=0;while(1){if((R|0)>=(N|0)){break}if((a[O+(P+R|0)|0]|0)==(a[R+124352|0]|0)){R=R+1|0}else{Q=10735;break L14601}}if((R|0)!=4){Q=10735;break}Z=J+1|0;c[13898]=Z;if((Z|0)>=(K|0)){break L14599}L14610:do{if((a[L+(Z*40&-1)|0]&1)!=0){U=c[L+(Z*40&-1)+36>>2]|0;T=L+(Z*40&-1)+32|0;S=0;while(1){if((S|0)>=(U|0)){break}if((a[O+((c[T>>2]|0)+S|0)|0]|0)==(a[S+103664|0]|0)){S=S+1|0}else{break L14610}}if((S|0)==1){break L14599}}}while(0);a[14176]=1;is(m);a[14176]=0;if((c[s>>2]|0)!=3){c[13898]=Z;break L14599}O=c[t>>2]|0;if((O|0)==0){break L14599}uu(c[8454]|0);c[8454]=O;break L14599}else{Q=10735}}while(0);L14621:do{if((Q|0)==10735){Q=0;if(M){Q=10765;break}do{if((N|0)>0){W=c[10036]|0;O=0;R=0;T=P;while(1){if((a[O+122880|0]|0)==(a[W+(O+T|0)|0]|0)){_=T;$=R}else{if((O|0)!=3){break}_=T-1|0;$=1}U=O+1|0;if((U|0)<($+N|0)){O=U;R=$;T=_}else{Q=10742;break}}do{if((Q|0)==10742){Q=0;if(($|0)==0){if(!((O|0)==2|(O|0)==8)){break}}a[33936]=0;c[13898]=J+1;break L14599}}while(0);if(M){Q=10765;break L14621}L14639:do{if((N|0)>0){O=c[10036]|0;T=0;R=0;W=P;while(1){if((a[T+121536|0]|0)==(a[O+(T+W|0)|0]|0)){ab=W;ac=R}else{if((T|0)!=5){break L14639}ab=W-1|0;ac=1}S=T+1|0;if((S|0)<(ac+N|0)){T=S;R=ac;W=ab}else{break}}if((ac|0)==0){if(!((T|0)==4|(T|0)==10)){break}}a[33936]=1;c[13898]=J+1;break L14599}}while(0);if(M){Q=10765;break L14621}if((N|0)<=0){break}W=c[10036]|0;R=0;O=0;S=P;while(1){if((a[R+119784|0]|0)==(a[W+(R+S|0)|0]|0)){ad=S;ae=O}else{if((R|0)!=3){Q=10765;break L14621}ad=S-1|0;ae=1}af=R+1|0;if((af|0)<(ae+N|0)){R=af;O=ae;S=ad}else{break}}do{if((ae|0)!=0|(af|0)==3){if((a[33656]&1)!=0){Q=10925;break L14565}}else{S=(a[33656]&1)!=0;if((af|0)==7){if(S){Q=10926;break L14565}else{break}}else{if(S){break L14621}else{Q=10920;break L14565}}}}while(0);a[33656]=1;ag=J+1|0;c[13898]=ag;if((ag|0)>=(K|0)){Q=10923;break L14565}L14669:do{if((a[L+(ag*40&-1)|0]&1)!=0){S=c[L+(ag*40&-1)+36>>2]|0;O=L+(ag*40&-1)+32|0;R=c[10036]|0;W=0;while(1){if((W|0)>=(S|0)){break}if((a[R+((c[O>>2]|0)+W|0)|0]|0)==(a[W+103664|0]|0)){W=W+1|0}else{break L14669}}if((W|0)==1){Q=10924;break L14565}}}while(0);O=is(l)|0;R=c[O>>2]|0;if((R|0)==1){ah=+(c[O+8>>2]|0)}else if((R|0)==2){ah=+h[O+8>>3]}else if((R|0)==3){ah=+uz(c[O+8>>2]|0,0)}else{Q=10781;break L14565}if((c[D>>2]|0)==3){uu(c[E>>2]|0);c[D>>2]=1}c[8416]=~~ah;ai=c[13898]|0;O=c[8272]|0;if((ai|0)>=(O|0)){Q=10939;break L14565}R=c[1054]|0;S=(a[R+(ai*40&-1)|0]&1)==0;if(S){Q=10934;break L14565}T=c[R+(ai*40&-1)+36>>2]|0;U=R+(ai*40&-1)+32|0;V=c[10036]|0;aj=0;while(1){if((aj|0)>=(T|0)){Q=10789;break}if((a[V+((c[U>>2]|0)+aj|0)|0]|0)==(a[aj+103664|0]|0)){aj=aj+1|0}else{Q=10790;break}}if((Q|0)==10790){Q=0;if(S){Q=10935;break L14565}}else if((Q|0)==10789){Q=0;if((aj|0)==1|S){Q=10936;break L14565}}U=c[R+(ai*40&-1)+36>>2]|0;V=R+(ai*40&-1)+32|0;T=c[10036]|0;ak=0;while(1){if((ak|0)>=(U|0)){break}if((a[T+((c[V>>2]|0)+ak|0)|0]|0)==(a[ak+148464|0]|0)){ak=ak+1|0}else{Q=10937;break L14565}}if((ak|0)!=1){Q=10938;break L14565}al=ai+1|0;c[13898]=al;if((al|0)>=(O|0)){Q=10929;break L14565}L14699:do{if((a[R+(al*40&-1)|0]&1)!=0){V=c[R+(al*40&-1)+36>>2]|0;U=R+(al*40&-1)+32|0;S=0;while(1){if((S|0)>=(V|0)){break}if((a[T+((c[U>>2]|0)+S|0)|0]|0)==(a[S+103664|0]|0)){S=S+1|0}else{break L14699}}if((S|0)==1){Q=10930;break L14565}}}while(0);T=is(k)|0;R=c[T>>2]|0;if((R|0)==2){am=+h[T+8>>3]}else if((R|0)==3){am=+uz(c[T+8>>2]|0,0)}else if((R|0)==1){am=+(c[T+8>>2]|0)}else{Q=10807;break L14565}if((c[F>>2]|0)==3){uu(c[G>>2]|0);c[F>>2]=1}c[8417]=~~am;h[4215]=+g[178];h[4216]=+g[38];h[4217]=+g[184];h[4218]=+g[44];c[8419]=0;c[8420]=0;break L14599}}while(0);if((a[33656]&1)==0){Q=10922;break L14565}}}while(0);if((Q|0)==10765){Q=0;if((a[33656]&1)==0){Q=10921;break L14565}}Z=(N|0)>0;T=c[10036]|0;R=23840;O=119784;L14718:while(1){L14720:do{if(!M){if(Z){ak=0;U=0;V=P;while(1){W=a[O+ak|0]|0;if(W<<24>>24==(a[T+(ak+V|0)|0]|0)){an=V;ao=U}else{if(W<<24>>24!=36){break L14720}an=V-1|0;ao=1}ap=ak+1|0;if((ap|0)<(ao+N|0)){ak=ap;U=ao;V=an}else{break}}if((ao|0)==0){aq=ap}else{ar=R;break L14718}}else{aq=0}V=a[O+aq|0]|0;if((V<<24>>24|0)==36|(V<<24>>24|0)==0){ar=R;break L14718}}}while(0);V=R+8|0;U=c[V>>2]|0;if((U|0)==0){ar=V;break}else{R=V;O=U}}O=c[ar+4>>2]|0;if((O|0)==1){a[33672]=1;c[13898]=J+1;break}else if((O|0)==6){c[13898]=J+1;R=is(e)|0;T=c[R>>2]|0;if((T|0)==1){as=+(c[R+8>>2]|0)}else if((T|0)==2){as=+h[R+8>>3]}else if((T|0)==3){as=+uz(c[R+8>>2]|0,0)}else{Q=10865;break L14565}if((c[z>>2]|0)==3){uu(c[A>>2]|0);c[z>>2]=1}h[4213]=as;h[4214]=as;R=c[13898]|0;T=c[8272]|0;if((R|0)>=(T|0)){break}Z=c[1054]|0;U=(a[Z+(R*40&-1)|0]&1)==0;if(U){break}V=c[Z+(R*40&-1)+36>>2]|0;ak=Z+(R*40&-1)+32|0;W=c[10036]|0;aj=0;while(1){if((aj|0)>=(V|0)){Q=10873;break}if((a[W+((c[ak>>2]|0)+aj|0)|0]|0)==(a[aj+103664|0]|0)){aj=aj+1|0}else{Q=10874;break}}if((Q|0)==10873){Q=0;if((aj|0)==1|U){break}}else if((Q|0)==10874){Q=0;if(U){break}}ak=c[Z+(R*40&-1)+36>>2]|0;W=Z+(R*40&-1)+32|0;V=c[10036]|0;at=0;while(1){if((at|0)>=(ak|0)){break}if((a[V+((c[W>>2]|0)+at|0)|0]|0)==(a[at+148464|0]|0)){at=at+1|0}else{break L14599}}if((at|0)!=1){break}au=R+1|0;c[13898]=au;if((au|0)>=(T|0)){Q=10927;break L14565}L14759:do{if((a[Z+(au*40&-1)|0]&1)!=0){W=c[Z+(au*40&-1)+36>>2]|0;ak=Z+(au*40&-1)+32|0;U=0;while(1){if((U|0)>=(W|0)){break}if((a[V+((c[ak>>2]|0)+U|0)|0]|0)==(a[U+103664|0]|0)){U=U+1|0}else{break L14759}}if((U|0)==1){Q=10928;break L14565}}}while(0);V=is(d)|0;Z=c[V>>2]|0;if((Z|0)==1){av=+(c[V+8>>2]|0)}else if((Z|0)==2){av=+h[V+8>>3]}else if((Z|0)==3){av=+uz(c[V+8>>2]|0,0)}else{Q=10890;break L14565}if((c[B>>2]|0)==3){uu(c[C>>2]|0);c[B>>2]=1}h[4214]=av;break}else if((O|0)==2){a[33672]=0;c[13898]=J+1;break}else if((O|0)==4){a[33673]=1;c[13898]=J+1;break}else if((O|0)==5){a[33673]=0;c[13898]=J+1;break}else if((O|0)==3){c[13898]=J+1;V=is(j)|0;Z=c[V>>2]|0;if((Z|0)==1){aw=+(c[V+8>>2]|0)}else if((Z|0)==2){aw=+h[V+8>>3]}else if((Z|0)==3){aw=+uz(c[V+8>>2]|0,0)}else{Q=10832;break L14565}if((c[u>>2]|0)==3){uu(c[w>>2]|0);c[u>>2]=1}h[4211]=aw;h[4212]=aw;V=c[13898]|0;Z=c[8272]|0;if((V|0)>=(Z|0)){break}T=c[1054]|0;R=(a[T+(V*40&-1)|0]&1)==0;if(R){break}at=c[T+(V*40&-1)+36>>2]|0;ak=T+(V*40&-1)+32|0;W=c[10036]|0;aj=0;while(1){if((aj|0)>=(at|0)){Q=10840;break}if((a[W+((c[ak>>2]|0)+aj|0)|0]|0)==(a[aj+103664|0]|0)){aj=aj+1|0}else{Q=10841;break}}if((Q|0)==10840){Q=0;if((aj|0)==1|R){break}}else if((Q|0)==10841){Q=0;if(R){break}}ak=c[T+(V*40&-1)+36>>2]|0;W=T+(V*40&-1)+32|0;at=c[10036]|0;O=0;while(1){if((O|0)>=(ak|0)){break}if((a[at+((c[W>>2]|0)+O|0)|0]|0)==(a[O+148464|0]|0)){O=O+1|0}else{break L14599}}if((O|0)!=1){break}ax=V+1|0;c[13898]=ax;if((ax|0)>=(Z|0)){Q=10940;break L14565}L14801:do{if((a[T+(ax*40&-1)|0]&1)!=0){W=c[T+(ax*40&-1)+36>>2]|0;ak=T+(ax*40&-1)+32|0;R=0;while(1){if((R|0)>=(W|0)){break}if((a[at+((c[ak>>2]|0)+R|0)|0]|0)==(a[R+103664|0]|0)){R=R+1|0}else{break L14801}}if((R|0)==1){Q=10941;break L14565}}}while(0);at=is(f)|0;T=c[at>>2]|0;if((T|0)==2){ay=+h[at+8>>3]}else if((T|0)==3){ay=+uz(c[at+8>>2]|0,0)}else if((T|0)==1){ay=+(c[at+8>>2]|0)}else{Q=10857;break L14565}if((c[x>>2]|0)==3){uu(c[y>>2]|0);c[x>>2]=1}h[4212]=ay;break}else{Q=10894;break L14565}}}while(0);N=c[13898]|0;M=c[8272]|0;if((N|0)<(M|0)){J=N;K=M}else{break L14563}}if((Q|0)==10926){uf(J,116664,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==10927){uf(au,105736,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==10928){uf(au,105736,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==10894){uf(J,104688,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==10920){uf(J,107656,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==10921){uf(J,107656,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==10922){uf(J,107656,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==10923){uf(ag,115776,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==10924){uf(ag,115776,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==10925){uf(J,116664,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==10929){uf(al,109336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==10930){uf(al,109336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==10934){uf(ai,113800,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==10935){uf(ai,113800,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==10936){uf(ai,113800,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==10937){uf(ai,113800,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==10941){uf(ax,106712,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==10938){uf(ai,113800,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==10939){uf(ai,113800,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==10940){uf(ax,106712,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==10890){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==10832){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==10781){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==10857){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==10865){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==10807){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);a[33512]=1;Q=e6(104120)|0;if((Q|0)!=0){a[Q+8|0]=0;c[Q+16>>2]=1;c[Q+24>>2]=1}Q=c[8453]|0;if((Q|0)==0){h[4243]=0.0;lg();hM();i=b;return}fN(33896,o,p,103768);ax=c[3524]|0;ai=~~(+h[o>>3]+ +((c[ax+8>>2]|0)>>>1>>>0>>>0));o=~~(+h[p>>3]+ +(((c[ax+12>>2]|0)-(c[ax+16>>2]|0)|0)>>>0>>>0));p=a[33936]&1;do{if(p<<24>>24==0){az=ax}else{if((a[37456]&1)!=0){az=ax;break}a[37456]=1;al=c[ax+88>>2]|0;if((al|0)==0){az=ax;break}cO[al&255](179864);az=c[3524]|0}}while(0);a[37456]=p;fn(33824,az);ln(ai,o,c[8453]|0,1,0,0,c[8454]|0);if((c[8456]|0)!=0){cM[c[(c[3524]|0)+64>>2]&511](-2)}a[37456]=0;o=Q;Q=1;while(1){ai=a[o]|0;if((ai<<24>>24|0)==0){break}else if((ai<<24>>24|0)==10){aA=Q+1|0}else{aA=Q}o=o+1|0;Q=aA}aA=c[8454]|0;do{if((aA|0)==0){aB=0}else{if((a[aA]|0)==0){aB=aA;break}o=c[(c[3524]|0)+88>>2]|0;if((o|0)==0){aB=aA;break}cO[o&255](aA);aB=c[8454]|0}}while(0);aA=c[3524]|0;ay=+(aa(c[aA+16>>2]|0,Q)>>>0>>>0);aw=ay/+((c[aA+12>>2]|0)>>>0>>>0);h[4243]=aw;do{if((aB|0)==0){aC=aw}else{if((a[aB]|0)==0){aC=aw;break}Q=c[aA+88>>2]|0;if((Q|0)==0){aC=aw;break}cO[Q&255](179864);aC=+h[4243]}}while(0);if(aC<=.9){lg();hM();i=b;return}h[4243]=.05;lg();hM();i=b;return}function lm(){var b=0;if((a[33512]&1)==0){return}if(a[13032]|0){b=c[(c[3524]|0)+104>>2]|0;if((b|0)!=0){cS[b&511]()}a[13032]=0}a[33512]=0;b=e6(104120)|0;if((b|0)!=0){a[b+8|0]=0;c[b+16>>2]=1;c[b+24>>2]=0}if((a[33656]&1)!=0){g[178]=+h[4215];g[38]=+h[4216];g[184]=+h[4217];g[44]=+h[4218]}a[33656]=0;h[4212]=1.0;h[4211]=1.0;uE(33704,0,16);b=c[8453]|0;if((b|0)!=0){uu(b);c[8453]=0}lh();hM();return}function ln(b,d,e,f,g,h,i){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;j=c[3524]|0;if((e|0)==0){return}k=(i|0)!=0;do{if(k){if((a[i]|0)==0){break}l=c[j+88>>2]|0;if((l|0)==0){break}cO[l&255](i)}}while(0);do{if((g|0)==0){m=b;n=e;o=d;p=j+16|0}else{l=a[e]|0;if(l<<24>>24==0){q=e;r=0}else{s=e;t=0;u=l;while(1){l=s+1|0;v=(u<<24>>24==10&1)+t|0;w=a[l]|0;if(w<<24>>24==0){q=l;r=v;break}else{s=l;t=v;u=w}}}u=aa(r,g);t=j+16|0;s=aa(u,c[t>>2]|0)>>>1;if((h|0)==0){m=b;n=q;o=s+d|0;p=t;break}else{m=b-s|0;n=q;o=d;p=t;break}}}while(0);d=j+76|0;q=j+20|0;b=(h|0)==0;g=j+68|0;r=m;m=n;n=o;o=e;while(1){do{if((o|0)==0){x=m}else{e=a8(o|0,10)|0;if((e|0)==0){x=0;break}a[e]=0;x=e}}while(0);do{if((cO[c[d>>2]&255](f)|0)==0){e=aa(c[q>>2]|0,f);t=aa(e,lp(o)|0)>>>1;if(b){e=r-t|0;s=c[3524]|0;if((c[s+96>>2]&128|0)==0){if((e|0)<=0){break}if(!((c[s+8>>2]|0)>>>0>e>>>0&(n|0)>0)){break}if((c[s+12>>2]|0)>>>0<=n>>>0){break}}cR[c[g>>2]&127](e,n,o);break}else{e=n-t|0;t=c[3524]|0;if((c[t+96>>2]&128|0)==0){if((r|0)<=0){break}if(!((c[t+8>>2]|0)>>>0>r>>>0&(e|0)>0)){break}if((c[t+12>>2]|0)>>>0<=e>>>0){break}}cR[c[g>>2]&127](r,e,o);break}}else{e=c[3524]|0;if((c[e+96>>2]&128|0)==0){if((r|0)<=0){break}if(!((c[e+8>>2]|0)>>>0>r>>>0&(n|0)>0)){break}if((c[e+12>>2]|0)>>>0<=n>>>0){break}}cR[c[g>>2]&127](r,n,o)}}while(0);do{if((h|0)==(-270|0)|(h|0)==90){y=(c[p>>2]|0)+r|0;z=n}else{e=c[p>>2]|0;if((h|0)==(-90|0)|(h|0)==270){y=r-e|0;z=n;break}else{y=r;z=n-e|0;break}}}while(0);if((x|0)==0){break}a[x]=10;r=y;m=x;n=z;o=x+1|0}if(!k){return}if((a[i]|0)==0){return}i=c[j+88>>2]|0;if((i|0)==0){return}cO[i&255](179864);return}function lo(){var b=0;c[8026]=0;if((a[14080]&1)==0){return}if(a[13032]|0){b=c[(c[3524]|0)+104>>2]|0;if((b|0)!=0){cS[b&511]()}a[13032]=0}if(a[14088]|0){cS[c[(c[3524]|0)+44>>2]&511]();a[14088]=0}if((a[14080]&1)==0){return}cS[c[(c[3524]|0)+40>>2]&511]();a[14080]=0;c[10028]=0;return}function lp(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;d=c[3524]|0;e=c[d+96>>2]|0;if((e&8192|0)==0){do{if((a8(b|0,10)|0)==0){if((e&32|0)!=0){break}if((c[11252]|0)!=15){f=uA(b|0)|0;return f|0}g=a[b]|0;if(g<<24>>24==0){f=0;return f|0}else{h=0;i=0;j=g}while(1){if((j&-64)<<24>>24==-128){k=i}else{k=((j&255)>226?2:1)+i|0}g=h+1|0;l=a[b+g|0]|0;if(l<<24>>24==0){f=k;break}else{h=g;i=k;j=l}}return f|0}}while(0);c[3524]=238024;cR[c[59523]&127](0,0,b);j=c[(c[3524]|0)+8>>2]|0;c[3524]=d;f=j;return f|0}if((cy(b|0,203320)|0)==0){f=uA(b|0)|0;return f|0}j=a[b]|0;if(j<<24>>24==0){f=0;return f|0}else{m=b;n=0;o=j}L15011:while(1){j=m;b=o;L15013:while(1){d=b<<24>>24;L15015:do{if((d|0)==91){if(b<<24>>24==0){p=j}else{k=b;i=j;while(1){h=i+1|0;if(k<<24>>24==93){q=h;break L15015}e=a[h]|0;if(e<<24>>24==0){p=h;break}else{k=e;i=h}}}q=p+1|0}else if((d|0)==92){r=j;s=11030;break L15013}else if((d|0)==123|(d|0)==125|(d|0)==36|(d|0)==95|(d|0)==94){q=j+1|0}else{s=11034;break L15013}}while(0);d=a[q]|0;if(d<<24>>24==0){f=n;s=11046;break L15011}else{j=q;b=d}}L15024:do{if((s|0)==11030){while(1){s=0;b=r+1|0;d=a[b]|0;if(d<<24>>24==0){t=b;break L15024}if((bO(d<<24>>24|0)|0)==0){t=b;break}else{r=b;s=11030}}}else if((s|0)==11034){s=0;t=j+1|0}}while(0);j=n+1|0;b=a[t]|0;if(b<<24>>24==0){f=j;s=11049;break}else{m=t;n=j;o=b}}if((s|0)==11049){return f|0}else if((s|0)==11046){return f|0}return 0}function lq(a,b,d,e,f,g){a=a|0;b=b|0;d=+d;e=+e;f=+f;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;h=i;i=i+3048|0;j=h|0;k=h+8|0;l=h+16|0;m=h+24|0;n=h+32|0;o=h+3032|0;p=h+3040|0;if(e<0.0){q=e;while(1){r=q+360.0;if(r<0.0){q=r}else{s=r;break}}}else{s=e}if(f>360.0){e=f;while(1){q=e+-360.0;if(q>360.0){e=q}else{t=q;break}}}else{t=f}if(t>2]|0)>>>0>>>0)/+((c[v+28>>2]|0)>>>0>>>0);v=n|0;c[n+8>>2]=g;e=+(a>>>0>>>0);q=+(b>>>0>>>0);if((w|0)>0){x=0;y=0;while(1){r=(s+ +(x|0)*3.0)*.017453292519943295;z=n+(y*12&-1)|0;c[z>>2]=~~(e+ +S(+r)*d);A=n+(y*12&-1)+4|0;c[A>>2]=~~(q+f*+T(+r)*d);c[o>>2]=a;c[p>>2]=b;B=((fl(o,p,z,A)|0)!=0&1)+y|0;A=x+1|0;if((A|0)<(w|0)){x=A;y=B}else{C=B;break}}}else{C=0}s=u*.017453292519943295;y=n+(C*12&-1)|0;c[y>>2]=~~(e+ +S(+s)*d);x=n+(C*12&-1)+4|0;c[x>>2]=~~(q+f*+T(+s)*d);w=(((fl(o,p,y,x)|0)==0)<<31>>31)+C|0;d=+P(+t);if(d>.1&d<359.9){C=w+1|0;c[n+(C*12&-1)>>2]=a;c[n+(C*12&-1)+4>>2]=b;b=w+2|0;c[n+(b*12&-1)>>2]=c[n>>2];c[n+(b*12&-1)+4>>2]=c[n+4>>2];D=b}else{D=w}if((g|0)!=0){g=c[(c[3524]|0)+148>>2]|0;if((g|0)==0){i=h;return}cN[g&255](D+1|0,v);i=h;return}if((D|0)<=0){i=h;return}v=0;while(1){g=c[n+(v*12&-1)+4>>2]|0;w=v+1|0;b=c[n+(w*12&-1)>>2]|0;C=c[n+(w*12&-1)+4>>2]|0;c[j>>2]=c[n+(v*12&-1)>>2];c[k>>2]=g;c[l>>2]=b;c[m>>2]=C;C=c[3524]|0;if((fl(j,k,l,m)|0)!=0){cN[c[C+56>>2]&255](c[j>>2]|0,c[k>>2]|0);cN[c[C+60>>2]&255](c[l>>2]|0,c[m>>2]|0)}if((w|0)<(D|0)){v=w}else{break}}i=h;return}function lr(a,b){a=a|0;b=b|0;return uK(c[6224+((c[a>>2]|0)*184&-1)>>2]|0,c[6224+((c[b>>2]|0)*184&-1)>>2]|0)|0}function ls(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,j=0;a=i;i=i+152|0;b=a|0;d=ut(1024)|0;do{if((d|0)==0){gk();e=ut(1024)|0;if((e|0)!=0){f=e;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=75488,v)|0)}else{f=d}}while(0);d=0;do{c[b+(d<<2)>>2]=d;d=d+1|0;}while(d>>>0<37);bM(b|0,37,4,2);gq();uD(f|0,75064,28);d=c[8250]|0;if((d|0)==(c[m>>2]|0)){if((c[8238]|0)<((c[6318]|0)-2|0)){g=d}else{aI(125440,23,1,d|0);do{e=a1(c[o>>2]|0)|0}while(!((e|0)==(-1|0)|(e|0)==10));c[8238]=0;g=c[m>>2]|0}aK(f|0,g|0);c[8238]=(c[8238]|0)+1;h=0}else{aK(f|0,d|0);h=0}do{d=c[b+(h<<2)>>2]|0;g=c[6228+(d*184&-1)>>2]|0;be(f|0,74576,(v=i,i=i+16|0,c[v>>2]=c[6224+(d*184&-1)>>2],c[v+8>>2]=g,v)|0);g=c[8250]|0;if((g|0)==(c[m>>2]|0)){if((c[8238]|0)<((c[6318]|0)-2|0)){j=g}else{aI(125440,23,1,g|0);do{d=a1(c[o>>2]|0)|0}while(!((d|0)==(-1|0)|(d|0)==10));c[8238]=0;j=c[m>>2]|0}aK(f|0,j|0);c[8238]=(c[8238]|0)+1}else{aK(f|0,g|0)}h=h+1|0;}while(h>>>0<37);h=c[8250]|0;if((h|0)==(c[m>>2]|0)){uu(f);i=a;return}a2(h|0);uu(f);i=a;return}function lt(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0;b=i;i=i+152|0;d=b|0;e=ut(555)|0;do{if((e|0)==0){gk();f=ut(555)|0;if((f|0)!=0){g=f;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=74144,v)|0);return 0}else{g=e}}while(0);e=0;do{c[d+(e<<2)>>2]=e;e=e+1|0;}while(e>>>0<37);bM(d|0,37,4,2);e=g;w=32;a[e]=w&255;w=w>>8;a[e+1|0]=w&255;e=0;f=uA(g|0)|0;do{be(g+f|0,73368,(v=i,i=i+8|0,c[v>>2]=c[6224+((c[d+(e<<2)>>2]|0)*184&-1)>>2],v)|0);e=e+1|0;f=uA(g|0)|0}while(e>>>0<37);e=f+1|0;f=ut(e)|0;if((f|0)!=0){h=f;j=uB(h|0,g|0)|0;uu(g);i=b;return h|0}gk();f=ut(e)|0;if((f|0)==0){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=72784,v)|0);return 0}else{h=f;j=uB(h|0,g|0)|0;uu(g);i=b;return h|0}return 0}function lu(a,b){a=+a;b=+b;return 0}function lv(a){a=a|0;return(a|0)==0&1|0}function lw(a){a=a|0;return(a|0)==0&1|0}function lx(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0;e=i;f=(a_(b|0,223552,d|0)|0)==0;g=f?3:d;d=f?222936:b;b=0;f=0;j=0;while(1){k=c[6224+(b*184&-1)>>2]|0;if((a_(d|0,k|0,g|0)|0)==0){l=6224+(b*184&-1)|0;if((g|0)==(uA(k|0)|0)){n=0;o=l;break}else{p=j|(f|0)!=0;q=l}}else{p=j;q=f}l=b+1|0;if(l>>>0<37){b=l;f=q;j=p}else{n=p;o=q;break}}if((o|0)==0|n){r=0;i=e;return r|0}c[3524]=o;a[14080]=0;if((c[o+48>>2]|0)==2){s=o}else{n=c[m>>2]|0;aI(222416,73,1,n|0);s=c[3524]|0}n=s+72|0;if((c[n>>2]|0)==0){c[n>>2]=12;t=c[3524]|0}else{t=s}s=t+76|0;if((c[s>>2]|0)==0){c[s>>2]=124;u=c[3524]|0}else{u=t}t=u+80|0;if((c[t>>2]|0)==0){c[t>>2]=60;w=c[3524]|0}else{w=u}u=w+84|0;if((c[u>>2]|0)==0){c[u>>2]=48;x=c[3524]|0}else{x=w}w=x+92|0;if((c[w>>2]|0)==0){c[w>>2]=10;y=c[3524]|0}else{y=x}x=y+112|0;if((c[x>>2]|0)==0){c[x>>2]=34;z=c[3524]|0}else{z=y}y=z+168|0;if((c[y>>2]|0)==0){c[y>>2]=144;A=c[3524]|0}else{A=z}z=A+176|0;if(+h[z>>3]<=0.0){h[z>>3]=1.0}if((a[37400]&1)!=0){z=c[m>>2]|0;y=c[A>>2]|0;cf(z|0,221648,(v=i,i=i+8|0,c[v>>2]=y,v)|0)}c[7271]=-1;r=o;i=e;return r|0}function ly(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;e=c[3524]|0;if((d|0)<0){cN[c[e+56>>2]&255](a,b);cN[c[e+60>>2]&255](a,b);return}f=(d|0)%6&-1;g=+h[1630];d=~~(g*+((c[e+28>>2]|0)>>>0>>>0)*.5);i=~~(g*+((c[e+24>>2]|0)>>>0>>>0)*.5);if((f|0)==0){j=e+56|0;k=a-d|0;cN[c[j>>2]&255](k,b);l=e+60|0;cN[c[l>>2]&255](k,b);cN[c[l>>2]&255](d+a|0,b);k=b-i|0;cN[c[j>>2]&255](a,k);cN[c[l>>2]&255](a,k);cN[c[l>>2]&255](a,i+b|0);return}else if((f|0)==3){l=e+56|0;k=a-d|0;j=b-i|0;cN[c[l>>2]&255](k,j);m=e+60|0;cN[c[m>>2]&255](k,j);n=d+a|0;cN[c[m>>2]&255](n,j);o=i+b|0;cN[c[m>>2]&255](n,o);cN[c[m>>2]&255](k,o);cN[c[m>>2]&255](k,j);cN[c[l>>2]&255](a,b);cN[c[m>>2]&255](a,b);return}else if((f|0)==2){m=e+56|0;l=a-d|0;cN[c[m>>2]&255](l,b);j=e+60|0;cN[c[j>>2]&255](l,b);k=d+a|0;cN[c[j>>2]&255](k,b);o=b-i|0;cN[c[m>>2]&255](a,o);cN[c[j>>2]&255](a,o);n=i+b|0;cN[c[j>>2]&255](a,n);cN[c[m>>2]&255](l,o);cN[c[j>>2]&255](l,o);cN[c[j>>2]&255](k,n);cN[c[m>>2]&255](l,n);cN[c[j>>2]&255](l,n);cN[c[j>>2]&255](k,o);return}else if((f|0)==4){o=e+56|0;k=a-d|0;cN[c[o>>2]&255](k,b);j=e+60|0;cN[c[j>>2]&255](a,b-i|0);cN[c[j>>2]&255](d+a|0,b);cN[c[j>>2]&255](a,i+b|0);cN[c[j>>2]&255](k,b);cN[c[o>>2]&255](a,b);cN[c[j>>2]&255](a,b);return}else if((f|0)==5){j=e+56|0;o=((i<<2|0)/3&-1)+b|0;cN[c[j>>2]&255](a,o);k=e+60|0;n=(d<<2|0)/3&-1;l=b-((i<<1|0)/3&-1)|0;cN[c[k>>2]&255](a-n|0,l);cN[c[k>>2]&255](n+a|0,l);cN[c[k>>2]&255](a,o);cN[c[j>>2]&255](a,b);cN[c[k>>2]&255](a,b);return}else if((f|0)==1){f=e+56|0;k=a-d|0;j=b-i|0;cN[c[f>>2]&255](k,j);o=e+60|0;cN[c[o>>2]&255](k,j);e=d+a|0;a=i+b|0;cN[c[o>>2]&255](e,a);cN[c[f>>2]&255](k,a);cN[c[o>>2]&255](k,a);cN[c[o>>2]&255](e,j);return}else{return}}function lz(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;b=i;i=i+24|0;d=b|0;e=c[13898]|0;if((e|0)>=(c[8272]|0)){f=lx(225016,7)|0;g=c[13898]|0;h=g-1|0;uf(h,224456,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}j=c[1054]|0;L15188:do{if((a[j+(e*40&-1)|0]&1)==0){k=c[10036]|0;l=c[j+(e*40&-1)+36>>2]|0;m=j+(e*40&-1)+32|0}else{n=c[j+(e*40&-1)+36>>2]|0;o=j+(e*40&-1)+32|0;p=c[10036]|0;q=0;while(1){if((q|0)>=(n|0)){break}if((a[p+((c[o>>2]|0)+q|0)|0]|0)==(a[q+103664|0]|0)){q=q+1|0}else{k=p;l=n;m=o;break L15188}}if((q|0)!=1){k=p;l=n;m=o;break}f=lx(225016,7)|0;g=c[13898]|0;h=g-1|0;uf(h,224456,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}}while(0);e=lx(k+(c[m>>2]|0)|0,l)|0;l=c[13898]|0;L15197:do{if((e|0)==0){m=c[1054]|0;k=(a[m+(l*40&-1)|0]&1)==0;if(k){r=11176}else{j=c[10036]|0;s=a[j+(c[m+(l*40&-1)+32>>2]|0)|0]|0;if((s<<24>>24|0)==39|(s<<24>>24|0)==34){t=j}else{r=11176}}if((r|0)==11176){j=c[10810]|0;if((j|0)==0){r=11196;break}s=c[8272]|0;u=m+(l*40&-1)+36|0;w=m+(l*40&-1)+32|0;x=c[10036]|0;y=j;L15204:while(1){j=c[y+4>>2]|0;L15206:do{if(!((s|0)<=(l|0)|k)){z=c[u>>2]|0;A=0;while(1){if((A|0)>=(z|0)){break}if((a[x+((c[w>>2]|0)+A|0)|0]|0)==(a[j+A|0]|0)){A=A+1|0}else{break L15206}}if((a[j+A|0]|0)==0){break L15204}}}while(0);j=c[y>>2]|0;if((j|0)==0){r=11196;break L15197}else{y=j}}if((a[y+8|0]&1)!=0){r=11196;break}if((c[y+16>>2]|0)==3){t=x}else{r=11196;break}}L15216:do{if((l|0)<(c[8272]|0)){L15218:do{if(!k){w=c[m+(l*40&-1)+36>>2]|0;u=m+(l*40&-1)+32|0;s=0;while(1){if((s|0)>=(w|0)){break}if((a[t+((c[u>>2]|0)+s|0)|0]|0)==(a[s+103664|0]|0)){s=s+1|0}else{break L15218}}if((s|0)==1){B=0;break L15216}}}while(0);a[14176]=1;is(d);a[14176]=0;if((c[d>>2]|0)==3){B=c[d+8>>2]|0;break}else{c[13898]=l;B=0;break}}else{B=0}}while(0);m=lx(B,uA(B|0)|0)|0;uu(B);C=m}else{r=11196}}while(0);if((r|0)==11196){c[13898]=l+1;C=e}if((C|0)==0){f=lx(225016,7)|0;g=c[13898]|0;h=g-1|0;uf(h,224456,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else{i=b;return C|0}return 0}function lA(a){a=+a;return}function lB(a){a=a|0;return}function lC(a){a=+a;h[1630]=a>=0.0?a:1.0;return}function lD(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,R=0,V=0,W=0,Z=0,_=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0.0,ar=0.0,as=0.0,at=0.0,au=0,av=0,aw=0,ax=0,ay=0,az=0,aA=0,aB=0,aC=0,aD=0.0,aE=0.0,aF=0.0,aG=0,aH=0.0,aI=0,aJ=0,aK=0,aL=0,aM=0,aN=0,aO=0,aP=0,aQ=0,aR=0.0,aS=0.0,aT=0.0,aU=0.0,aV=0.0,aW=0.0,aX=0,aY=0,aZ=0,a_=0,a$=0,a0=0,a1=0;g=i;i=i+480|0;j=g|0;k=g+8|0;l=g+16|0;m=g+24|0;n=g+32|0;o=g+40|0;p=g+48|0;q=g+56|0;r=g+64|0;s=g+72|0;t=g+80|0;u=g+88|0;v=g+96|0;w=g+104|0;x=g+112|0;y=g+120|0;z=g+128|0;A=g+136|0;B=g+144|0;C=g+152|0;D=g+160|0;E=g+168|0;F=g+176|0;G=g+184|0;H=g+192|0;I=g+200|0;J=g+208|0;K=g+216|0;L=g+224|0;M=g+232|0;N=g+240|0;O=g+248|0;R=g+256|0;V=g+264|0;W=g+272|0;Z=g+280|0;_=g+288|0;$=g+296|0;aa=g+304|0;ab=g+312|0;ac=g+320|0;ad=g+328|0;ae=g+336|0;af=g+344|0;ag=g+352|0;ah=g+360|0;ai=g+368|0;aj=g+376|0;ak=g+384|0;al=g+392|0;am=g+400|0;an=g+408|0;ao=g+416|0;ap=c[3524]|0;aq=+(((c[ap+24>>2]|0)+(c[ap+28>>2]|0)|0)>>>0>>>0)*.5;ar=+(a-d|0);as=+(b-e|0);at=+Q(+(ar*ar+as*as));au=(f|0)<0?-f|0:f;av=c[13542]|0;aw=(c[ap+96>>2]&128|0)==0;ax=aw?55520:0;c[13542]=ax;do{if((f|0)==0){ay=0;az=0}else{L15241:do{if(+P(+at)<2.220446049250313e-16){aA=0;aB=0}else{aC=c[12910]|0;if((aC|0)<1){aD=aq;aE=aD*.3/at;aF=aD*2.0/at;aD=aF>.3?.3:aF;aF=aE>aD?aE:aD;aD=ar*.96593;aE=as*.25882;aG=~~((aD-aE)*aF);aH=as*.96593;aI=~~((ar*.25882+aH)*aF);aJ=~~((aD+aE)*aF);aK=~~((ar*-.25882+aH)*aF);aL=(aG+aJ|0)/2&-1;aM=(aI+aK|0)/2&-1;aN=aG;aO=aK;aP=aJ;aQ=aI}else{aF=+h[6458]*.017453292519943295;aH=+h[6457]*.017453292519943295;aE=+Y(+(-0.0-as),+(-0.0-ar));aD=+(aC|0);aR=at*.5;if(aD>aR){aS=aD/aR;aT=+X(+(+U(+aF)*aS));aU=aR;aV=+X(+(aS*+U(+aH)));aW=aT}else{aU=aD;aV=aH;aW=aF}aF=+T(+aW);aH=aF/+T(+aV);aF=aW-aE;aC=-~~(aU*+S(+aF))|0;aI=~~(aU*+T(+aF));aF=-0.0-aU;aD=aE+aW;aT=+S(+aD)*aF;aS=+T(+aD)*aF;aF=aU*aH;aH=aE+aV;aJ=~~(aT+aF*+S(+aH));aL=aJ;aM=~~(aS+aF*+T(+aH));aN=aC;aO=~~aS;aP=~~aT;aQ=aI}do{if((au&1|0)!=0){do{if((c[12912]|0)==2){if(aw){aI=(c[ax>>2]|0)>(d|0)&1;aC=(c[ax+4>>2]|0)<(d|0)?aI|2:aI;aI=(c[ax+8>>2]|0)>(e|0)?aC|4:aC;if((((c[ax+12>>2]|0)<(e|0)?aI|8:aI)|0)!=0){aX=ax;break}}aI=aL+d|0;c[ao>>2]=aI;aC=aM+e|0;c[ao+4>>2]=aC;c[ao+12>>2]=aN+d;c[ao+16>>2]=aQ+e;c[ao+24>>2]=d;c[ao+28>>2]=e;c[ao+36>>2]=aP+d;c[ao+40>>2]=aO+e;c[ao+48>>2]=aI;c[ao+52>>2]=aC;c[ao+8>>2]=1601;aC=c[ap+148>>2]|0;if((aC|0)==0){aX=ax;break}cN[aC&255](5,ao|0);aX=c[13542]|0}else{aX=ax}}while(0);if((aX|0)!=0){aC=(c[aX>>2]|0)>(d|0)&1;aI=(c[aX+4>>2]|0)<(d|0)?aC|2:aC;aC=(c[aX+8>>2]|0)>(e|0)?aI|4:aI;if((((c[aX+12>>2]|0)<(e|0)?aC|8:aC)|0)!=0){break}}if((c[12912]|0)==0){c[L>>2]=aN+d;c[M>>2]=aQ+e;c[N>>2]=d;c[O>>2]=e;aC=c[3524]|0;if((fl(L,M,N,O)|0)!=0){cN[c[aC+56>>2]&255](c[L>>2]|0,c[M>>2]|0);cN[c[aC+60>>2]&255](c[N>>2]|0,c[O>>2]|0)}c[H>>2]=d;c[I>>2]=e;c[J>>2]=aP+d;c[K>>2]=aO+e;aC=c[3524]|0;if((fl(H,I,J,K)|0)==0){break}cN[c[aC+56>>2]&255](c[H>>2]|0,c[I>>2]|0);cN[c[aC+60>>2]&255](c[J>>2]|0,c[K>>2]|0);break}aC=aL+d|0;aI=aM+e|0;aJ=aN+d|0;aK=aQ+e|0;c[ag>>2]=aC;c[ah>>2]=aI;c[ai>>2]=aJ;c[aj>>2]=aK;aG=c[3524]|0;if((fl(ag,ah,ai,aj)|0)!=0){cN[c[aG+56>>2]&255](c[ag>>2]|0,c[ah>>2]|0);cN[c[aG+60>>2]&255](c[ai>>2]|0,c[aj>>2]|0)}c[ac>>2]=aJ;c[ad>>2]=aK;c[ae>>2]=d;c[af>>2]=e;aK=c[3524]|0;if((fl(ac,ad,ae,af)|0)!=0){cN[c[aK+56>>2]&255](c[ac>>2]|0,c[ad>>2]|0);cN[c[aK+60>>2]&255](c[ae>>2]|0,c[af>>2]|0)}aK=aP+d|0;aJ=aO+e|0;c[_>>2]=d;c[$>>2]=e;c[aa>>2]=aK;c[ab>>2]=aJ;aG=c[3524]|0;if((fl(_,$,aa,ab)|0)!=0){cN[c[aG+56>>2]&255](c[_>>2]|0,c[$>>2]|0);cN[c[aG+60>>2]&255](c[aa>>2]|0,c[ab>>2]|0)}c[R>>2]=aK;c[V>>2]=aJ;c[W>>2]=aC;c[Z>>2]=aI;aI=c[3524]|0;if((fl(R,V,W,Z)|0)==0){break}cN[c[aI+56>>2]&255](c[R>>2]|0,c[V>>2]|0);cN[c[aI+60>>2]&255](c[W>>2]|0,c[Z>>2]|0)}}while(0);if((au&2|0)==0){aA=aL;aB=aM;break}aI=c[13542]|0;if((aI|0)!=0){aC=(c[aI>>2]|0)>(a|0)&1;aJ=(c[aI+4>>2]|0)<(a|0)?aC|2:aC;aC=(c[aI+8>>2]|0)>(b|0)?aJ|4:aJ;if((((c[aI+12>>2]|0)<(b|0)?aC|8:aC)|0)!=0){aA=aL;aB=aM;break}}aC=c[12912]|0;do{if((aC|0)==2){aI=a-aL|0;c[ao>>2]=aI;aJ=b-aM|0;c[ao+4>>2]=aJ;c[ao+12>>2]=a-aN;c[ao+16>>2]=b-aQ;c[ao+24>>2]=a;c[ao+28>>2]=b;c[ao+36>>2]=a-aP;c[ao+40>>2]=b-aO;c[ao+48>>2]=aI;c[ao+52>>2]=aJ;c[ao+8>>2]=1601;aJ=c[ap+148>>2]|0;if((aJ|0)==0){break}cN[aJ&255](5,ao|0);aY=c[12912]|0;aZ=11240}else{aY=aC;aZ=11240}}while(0);do{if((aZ|0)==11240){if((aY|0)!=0){break}c[n>>2]=a-aP;c[o>>2]=b-aO;c[p>>2]=a;c[q>>2]=b;aC=c[3524]|0;if((fl(n,o,p,q)|0)!=0){cN[c[aC+56>>2]&255](c[n>>2]|0,c[o>>2]|0);cN[c[aC+60>>2]&255](c[p>>2]|0,c[q>>2]|0)}c[j>>2]=a;c[k>>2]=b;c[l>>2]=a-aN;c[m>>2]=b-aQ;aC=c[3524]|0;if((fl(j,k,l,m)|0)==0){aA=aL;aB=aM;break L15241}cN[c[aC+56>>2]&255](c[j>>2]|0,c[k>>2]|0);cN[c[aC+60>>2]&255](c[l>>2]|0,c[m>>2]|0);aA=aL;aB=aM;break L15241}}while(0);aC=a-aL|0;aJ=b-aM|0;aI=a-aP|0;aK=b-aO|0;c[D>>2]=aC;c[E>>2]=aJ;c[F>>2]=aI;c[G>>2]=aK;aG=c[3524]|0;if((fl(D,E,F,G)|0)!=0){cN[c[aG+56>>2]&255](c[D>>2]|0,c[E>>2]|0);cN[c[aG+60>>2]&255](c[F>>2]|0,c[G>>2]|0)}c[z>>2]=aI;c[A>>2]=aK;c[B>>2]=a;c[C>>2]=b;aK=c[3524]|0;if((fl(z,A,B,C)|0)!=0){cN[c[aK+56>>2]&255](c[z>>2]|0,c[A>>2]|0);cN[c[aK+60>>2]&255](c[B>>2]|0,c[C>>2]|0)}aK=a-aN|0;aI=b-aQ|0;c[v>>2]=a;c[w>>2]=b;c[x>>2]=aK;c[y>>2]=aI;aG=c[3524]|0;if((fl(v,w,x,y)|0)!=0){cN[c[aG+56>>2]&255](c[v>>2]|0,c[w>>2]|0);cN[c[aG+60>>2]&255](c[x>>2]|0,c[y>>2]|0)}c[r>>2]=aK;c[s>>2]=aI;c[t>>2]=aC;c[u>>2]=aJ;aJ=c[3524]|0;if((fl(r,s,t,u)|0)==0){aA=aL;aB=aM;break}cN[c[aJ+56>>2]&255](c[r>>2]|0,c[s>>2]|0);cN[c[aJ+60>>2]&255](c[t>>2]|0,c[u>>2]|0);aA=aL;aB=aM}}while(0);if((f|0)>-1){ay=aB;az=aA;break}c[13542]=av;i=g;return}}while(0);do{if((au&2|0)==0){a_=a;a$=b}else{aA=+P(+at)>=2.220446049250313e-16;if(!(aA&(c[12912]|0)!=0)){a_=a;a$=b;break}a_=a-az|0;a$=b-ay|0}}while(0);do{if((au&1|0)==0){a0=d;a1=e}else{b=+P(+at)>=2.220446049250313e-16;if(!(b&(c[12912]|0)!=0)){a0=d;a1=e;break}a0=az+d|0;a1=ay+e|0}}while(0);c[ak>>2]=a_;c[al>>2]=a$;c[am>>2]=a0;c[an>>2]=a1;a1=c[3524]|0;if((fl(ak,al,am,an)|0)==0){c[13542]=av;i=g;return}cN[c[a1+56>>2]&255](c[ak>>2]|0,c[al>>2]|0);cN[c[a1+60>>2]&255](c[am>>2]|0,c[an>>2]|0);c[13542]=av;i=g;return}function lE(){var b=0,d=0,e=0,f=0,g=0,h=0;b=i;d=bU(215528)|0;do{if((d|0)!=0){if((a[d]|0)==0){break}e=uA(d|0)|0;f=e6(215528)|0;g=bP(d|0)|0;c[f+16>>2]=3;c[f+24>>2]=g;a[f+8|0]=0;f=a8(d|0,32)|0;if((f|0)==0){h=e}else{h=f-d|0}if((lx(d,h)|0)==0){f=c[m>>2]|0;cf(f|0,220472,(v=i,i=i+8|0,c[v>>2]=d,v)|0);break}f=c[3524]|0;if((aY(c[f>>2]|0,222936)|0)==0){i=b;return}cS[c[f+32>>2]&511]();i=b;return}}while(0);lx(225016,7);i=b;return}function lF(b){b=b|0;var d=0;d=c[11232]|0;c[11232]=d+1;a[d]=b&255;return}function lG(){var b=0,d=0,e=0,f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0.0,I=0.0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0.0,T=0,U=0,V=0,W=0.0,X=0,Y=0,Z=0,_=0,$=0,ab=0,ac=0,ad=0,ae=0,af=0.0,ag=0,ah=0.0,ai=0.0,aj=0.0,ak=0;b=i;i=i+224|0;d=b|0;e=b+16|0;f=b+72|0;j=b+136|0;k=c[3524]|0;l=k+96|0;m=(c[l>>2]&32|0)!=0;if(!m){dL(bP(218776)|0)}if((a[14080]&1)==0){lk()}do{if(a[14088]|0){if((a[33512]&1)==0){break}if(!(a[13032]|0)){break}n=c[(c[3524]|0)+104>>2]|0;if((n|0)!=0){cS[n&511]()}a[13032]=0}else{cS[c[(c[3524]|0)+52>>2]&511]();a[14088]=1}}while(0);cM[c[(c[3524]|0)+168>>2]&511](0);n=c[3524]|0;if((c[n+96>>2]&16|0)!=0){c[7271]=-1}c[13880]=0;c[13881]=(c[n+8>>2]|0)-1;c[13882]=0;c[13883]=(c[n+12>>2]|0)-1;a[25280]=0;n=~~(+((c[k+8>>2]|0)>>>0>>>0)*+g[178]);o=~~(+((c[k+12>>2]|0)>>>0>>>0)*+g[38]);p=+h[3817];q=k+28|0;r=~~(p*+((c[q>>2]|0)>>>0>>>0));s=k+24|0;t=~~(p*+((c[s>>2]|0)>>>0>>>0)*1.25);u=k+16|0;w=c[u>>2]|0;x=t>>>0>>0?w:t;cM[c[k+168>>2]&511](2);t=k+112|0;cK[c[t>>2]&63](1.0);w=k+64|0;cM[c[w>>2]&511](-2);y=k+56|0;cN[c[y>>2]&255](0,0);z=k+60|0;A=n-1|0;cN[c[z>>2]&255](A,0);B=o-1|0;cN[c[z>>2]&255](A,B);cN[c[z>>2]&255](0,B);cN[c[z>>2]&255](0,0);cM[c[w>>2]&511](0);C=c[c[3524]>>2]|0;if((aY(C|0,225016)|0)==0){uf(-1,218360,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}D=f|0;uB(D|0,C|0);uD(f+(uA(D|0)|0)|0,217760,16);f=k+76|0;cO[c[f>>2]&255](0);C=k+68|0;E=k+20|0;p=+(o>>>0>>>0);cR[c[C>>2]&127](c[E>>2]<<1,~~(p- +((c[u>>2]|0)>>>0>>>0)*.5),D);if((c[k+124>>2]|0)!=0){cR[c[C>>2]&127]((c[E>>2]|0)*5&-1,((c[u>>2]|0)*-3&-1)+o|0,217152)}cM[c[w>>2]&511](-2);cM[c[w>>2]&511](-1);D=n>>>1;cN[c[y>>2]&255](D,0);cN[c[z>>2]&255](D,B);F=o>>>1;cN[c[y>>2]&255](0,F);cN[c[z>>2]&255](A,F);cM[c[w>>2]&511](3);cN[c[y>>2]&255](((c[E>>2]|0)*-10&-1)+D|0,((c[u>>2]|0)>>>1)+F|0);cN[c[z>>2]&255](((c[E>>2]|0)*10&-1)+D|0,((c[u>>2]|0)>>>1)+F|0);cN[c[z>>2]&255](((c[E>>2]|0)*10&-1)+D|0,F-((c[u>>2]|0)>>>1)|0);cN[c[z>>2]&255](((c[E>>2]|0)*-10&-1)+D|0,F-((c[u>>2]|0)>>>1)|0);cN[c[z>>2]&255](((c[E>>2]|0)*-10&-1)+D|0,((c[u>>2]|0)>>>1)+F|0);cR[c[C>>2]&127](((c[E>>2]|0)*-10&-1)+D|0,F,216528);cR[c[C>>2]&127](((c[E>>2]|0)*-10&-1)+D|0,~~(+(F>>>0>>>0)+ +((c[u>>2]|0)>>>0>>>0)*1.4),216048);cM[c[w>>2]&511](-2);do{if((c[l>>2]&32|0)!=0){A=bP(215568)|0;cR[c[C>>2]&127](~~(+(n>>>0>>>0)*.5),~~(p*.4),A);uu(A);if(m){break}dL(bP(215048)|0)}}while(0);cO[c[f>>2]&255](0);cR[c[C>>2]&127](D,((c[u>>2]|0)*6&-1)+F|0,214488);m=(cO[c[f>>2]&255](1)|0)==0;l=c[C>>2]|0;if(m){cR[l&127](D-(((c[E>>2]|0)*13&-1)>>>1)|0,((c[u>>2]|0)*5&-1)+F|0,213832)}else{cR[l&127](D,((c[u>>2]|0)*5&-1)+F|0,213832)}l=(cO[c[f>>2]&255](2)|0)==0;m=c[C>>2]|0;if(l){cR[m&127](((c[E>>2]|0)*-15&-1)+D|0,(c[u>>2]<<2)+F|0,213336)}else{cR[m&127](D,(c[u>>2]<<2)+F|0,213336)}cM[c[w>>2]&511](1);m=k+72|0;l=(cO[c[m>>2]&255](-270)|0)==0;A=c[f>>2]|0;if(l){cO[A&255](0);cR[c[C>>2]&127](c[E>>2]<<1,F-(c[u>>2]<<1)|0,211168)}else{l=(cO[A&255](1)|0)==0;A=c[C>>2]|0;G=c[u>>2]|0;if(l){cR[A&127](G,F-(((c[E>>2]|0)*21&-1)>>>1)|0,212752)}else{cR[A&127](G,F,212752)}G=c[f>>2]|0;cO[G&255](0);G=c[m>>2]|0;cO[G&255](45);cR[c[C>>2]&127]((c[u>>2]|0)*3&-1,F,212104);G=c[f>>2]|0;cO[G&255](0);G=c[m>>2]|0;cO[G&255](-45);cR[c[C>>2]&127](c[u>>2]<<1,F,211576)}cO[c[f>>2]&255](0);cO[c[m>>2]&255](0);cM[c[w>>2]&511](-2);cM[c[w>>2]&511](4);H=+(D>>>0>>>0);cN[c[y>>2]&255](~~(H+ +((c[q>>2]|0)>>>0>>>0)*(+h[8304]+1.0)),B);I=+h[8304];cN[c[z>>2]&255](~~(H+ +((c[q>>2]|0)>>>0>>>0)*(I+1.0)),~~(p-I*+((c[s>>2]|0)>>>0>>>0)));cN[c[y>>2]&255](D,~~(p- +((c[s>>2]|0)>>>0>>>0)*(+h[8304]+1.0)));I=+h[8304];cN[c[z>>2]&255](~~(H+I*+((c[q>>2]|0)>>>0>>>0)),~~(p-(I+1.0)*+((c[s>>2]|0)>>>0>>>0)));B=(cO[c[f>>2]&255](2)|0)==0;m=c[C>>2]|0;F=c[E>>2]|0;if(B){cR[m&127]((F*-14&-1)+D|0,(o-(c[s>>2]<<1)|0)-((c[u>>2]|0)>>>1)|0,210688)}else{cR[m&127](D-F|0,(o-(c[s>>2]<<1)|0)-((c[u>>2]|0)>>>1)|0,210688)}cO[c[f>>2]&255](0);cM[c[w>>2]&511](-2);F=(n-r|0)+((c[E>>2]|0)*-6&-1)|0;cK[c[k+92>>2]&63](+h[3817]);D=o-x|0;if((D|0)>(x|0)){m=d|0;B=d+4|0;G=d+8|0;A=e|0;l=k+80|0;J=(r|0)/2&-1;r=-2;K=D;while(1){D=r+1|0;L=c[8798]|0;M=(L|0)>0;N=D;L15390:while(1){O=43264;while(1){P=c[O>>2]|0;if((P|0)==0){break}if((c[P+4>>2]|0)==(N|0)){Q=11322;break L15390}else{O=P|0}}O=N-1|0;if(!((N|0)>(L|0)&M)){R=O;S=1.0;T=0;U=1;V=O;W=0.0;break}N=((O|0)%(L|0)&-1)+1|0}do{if((Q|0)==11322){Q=0;L=c[P+12>>2]|0;I=+h[P+24>>3];M=c[P+48>>2]|0;O=c[P+52>>2]|0;H=+h[P+56>>3];if((c[(c[3524]|0)+96>>2]&1024|0)!=0){R=N;S=I;T=0;U=M;V=O;W=H;break}X=a[P+40|0]&1;Y=X<<24>>24==0;R=L;S=I;T=X;U=Y?1:M;V=Y?L:O;W=H}}while(0);c[m>>2]=U;c[B>>2]=V;h[G>>3]=W;cK[c[(c[3524]|0)+112>>2]&63](S);N=c[(c[3524]|0)+64>>2]|0;if((R|0)<-5){cM[N&511](-2)}else{cM[N&511](R)}N=c[3524]|0;do{if(T<<24>>24==0){if((c[N+96>>2]&1024|0)!=0){break}c[m>>2]=1;c[B>>2]=R;Q=11332}else{Q=11332}}while(0);if((Q|0)==11332){Q=0;fn(d,N)}be(A|0,21e4,(v=i,i=i+8|0,c[v>>2]=D,v)|0);O=(cO[c[f>>2]&255](2)|0)==0;L=c[C>>2]|0;if(O){O=uA(A|0)|0;Y=F-aa(c[E>>2]|0,O)|0;cR[L&127](Y,K,A)}else{cR[L&127](F,K,A)}cN[c[y>>2]&255]((c[E>>2]|0)+F|0,K);cN[c[z>>2]&255]((c[E>>2]<<2)+F|0,K);if((r|0)>-2){cR[c[l>>2]&127]((((c[E>>2]|0)*5&-1)+F|0)+J|0,K,r)}L=K-x|0;if((L|0)>(x|0)){r=D;K=L}else{Z=A;break}}}else{Z=e|0}cK[c[t>>2]&63](1.0);cM[c[w>>2]&511](0);S=+(n>>>0>>>0);e=~~(S*.375);A=~~(p*.25);K=(c[q>>2]|0)*7&-1;r=(c[s>>2]|0)*7&-1;x=c[12912]|0;c[12912]=0;J=k+84|0;cI[c[J>>2]&63](e,A,K+e|0,A,1);c[12912]=1;cI[c[J>>2]&63](e,A,e-K|0,A,1);c[12912]=2;cI[c[J>>2]&63](e,A,e,r+A|0,1);c[12912]=1;cI[c[J>>2]&63](e,A,e,A-r|0,1);c[12912]=x;x=(c[q>>2]|0)*5&-1;q=(c[s>>2]|0)*5&-1;s=e-x|0;r=A-q|0;K=x+e|0;x=q+A|0;cI[c[J>>2]&63](s,r,K,x,3);cI[c[J>>2]&63](s,x,e,A,0);c[12912]=1;cI[c[J>>2]&63](e,A,K,r,2);cO[c[f>>2]&255](0);r=(o>>>0)/25>>>0;K=~~(S*.075);A=((n>>>0)/10>>>0)+K|0;e=1;J=r;while(1){cK[c[t>>2]&63](+(e|0));cM[c[w>>2]&511](-2);cN[c[y>>2]&255](K,J);cN[c[z>>2]&255](A,J);be(Z|0,209288,(v=i,i=i+16|0,c[v>>2]=e,c[v+8>>2]=0,v)|0);cR[c[C>>2]&127](A,J,Z);x=e+1|0;if((x|0)<7){e=x;J=J+r|0}else{break}}cR[c[C>>2]&127](K,r*7&-1,208960);r=~~(S*.5);K=(n>>>0)/40>>>0;J=o>>>3;cK[c[t>>2]&63](1.0);cM[c[w>>2]&511](-2);cO[c[f>>2]&255](1);W=+(J|0);cR[c[C>>2]&127]((K*7&-1)+r|0,~~(W+ +((c[u>>2]|0)>>>0>>>0)*1.5),208328);t=k+108|0;o=(n>>>0)/80>>>0;H=+(K|0)*1.5;e=0;A=r;while(1){r=c[t>>2]|0;if((r|0)!=0){cI[r&63](e<<4|2,A,0,K,J)}cN[c[y>>2]&255](A,0);cN[c[z>>2]&255](A,J);r=A+K|0;cN[c[z>>2]&255](r,J);cN[c[z>>2]&255](r,0);cN[c[z>>2]&255](A,0);be(Z|0,207744,(v=i,i=i+8|0,c[v>>2]=e,v)|0);cR[c[C>>2]&127](o+A|0,~~(W+ +((c[u>>2]|0)>>>0>>>0)*.5),Z);r=e+1|0;if((r|0)<10){e=r;A=~~(H+ +(A|0))}else{break}}A=~~(S*.7);e=~~(p*.83);Z=(n>>>0)/20>>>0;if((c[k+148>>2]|0)==0){_=206240}else{p=+(Z|0);k=j|0;n=j|0;o=j+72|0;z=j+4|0;J=j+76|0;K=j+8|0;y=0;while(1){t=aa(y,Z);S=+(t+A|0);H=+(e-((t|0)/2&-1)|0);t=~~(S+p);c[n>>2]=t;r=~~(H+p*0.0);c[z>>2]=r;c[j+12>>2]=~~(S+p*.5000000000000001);c[j+16>>2]=~~(H+p*.8660254037844386);c[j+24>>2]=~~(S+p*-.4999999999999998);c[j+28>>2]=~~(H+p*.8660254037844387);c[j+36>>2]=~~(S+p*-1.0);c[j+40>>2]=~~(H+p*1.2246467991473532e-16);c[j+48>>2]=~~(S+p*-.5000000000000004);c[j+52>>2]=~~(H+p*-.8660254037844384);c[j+60>>2]=~~(S+p*.5000000000000001);c[j+64>>2]=~~(H+p*-.8660254037844386);c[o>>2]=t;c[J>>2]=r;r=c[w>>2]|0;if((y|0)==0){cM[r&511](2);$=1601}else{cM[r&511](1);$=804}c[K>>2]=$;cN[c[(c[3524]|0)+148>>2]&255](7,k);r=y+1|0;if((r|0)<2){y=r}else{_=206944;break}}}cM[c[w>>2]&511](-2);if((cO[c[f>>2]&255](1)|0)!=0){ab=0;ac=c[C>>2]|0;ad=ab+A|0;ae=Z+e|0;af=+(ae|0);ag=c[u>>2]|0;ah=+(ag>>>0>>>0);ai=ah*.5;aj=af+ai;ak=~~aj;cR[ac&127](ad,ak,_);lh();i=b;return}f=c[E>>2]|0;ab=aa(uA(_|0)|0,f)>>>1;ac=c[C>>2]|0;ad=ab+A|0;ae=Z+e|0;af=+(ae|0);ag=c[u>>2]|0;ah=+(ag>>>0>>>0);ai=ah*.5;aj=af+ai;ak=~~aj;cR[ac&127](ad,ak,_);lh();i=b;return}function lH(b,d,e,f,g,i){b=b|0;d=+d;e=+e;f=f|0;g=g|0;i=i|0;var j=0.0;if((i|0)==4){h[29743]=+h[29742];h[29741]=+h[29740];return}else if((i|0)==3){h[29742]=+h[29743];h[29740]=+h[29741];return}else{if(a[237976]|0){return}a[237976]=1;h[29750]=0.0;h[29751]=d>2.0?1.0:d;h[29752]=e;j=d+e;if(+h[29749]e){h[29748]=e}c[59492]=i;a[237952]=f&1;return}}function lI(){var b=0.0,d=0.0,e=0.0;b=+h[29750];if(!(a[237976]|0)){return}h[29750]=0.0;do{if((a[237952]&1)==0){d=+h[29743]}else{if((c[59492]|0)==1){e=b*.5+ +h[29743];h[29743]=e;d=e;break}else{e=b+ +h[29743];h[29743]=e;d=e;break}}}while(0);b=+h[29745];h[29745]=b>d?b:d;a[237976]=0;return}function lJ(b,d,e,f,g,j,k,l){b=b|0;d=d|0;e=e|0;f=+f;g=+g;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0,u=0.0,w=0,x=0,y=0,z=0,A=0,B=0.0,C=0,D=0,E=0,F=0,G=0.0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0.0,P=0.0,Q=0.0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0.0,_=0,$=0.0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0;m=i;i=i+48|0;n=m|0;o=m+8|0;p=m+16|0;q=m+40|0;r=q;c[n>>2]=b;cS[c[(c[3524]|0)+160>>2]&511]();s=f+g;if(s>+h[5612]){h[5612]=s}if(+h[5611]>g){h[5611]=g}b=c[n>>2]|0;t=a[b]|0;L15478:do{if(t<<24>>24!=0){s=f*.8;u=f;w=q;x=r+1|0;y=r+2|0;z=m+24|0;A=l;B=g;C=b;D=t;L15480:while(1){E=c[11252]|0;do{if(D<<24>>24<0){if(!((E|0)==15|(E|0)==0)){F=11393;break}c[p>>2]=C;cJ[c[(c[3524]|0)+156>>2]&15](e,f,B,j,k,A);if(!(ug(o,p)|0)){cM[c[(c[3524]|0)+164>>2]&511](a[c[n>>2]|0]|0);G=B;H=A;break}I=c[n>>2]|0;J=c[p>>2]|0;if(I>>>0>>0){K=I;while(1){L=c[(c[3524]|0)+164>>2]|0;c[n>>2]=K+1;cM[L&511](a[K]|0);L=c[n>>2]|0;if(L>>>0>>0){K=L}else{M=L;break}}}else{M=I}c[n>>2]=M-1;G=B;H=A}else{F=11393}}while(0);L15492:do{if((F|0)==11393){F=0;K=D<<24>>24;if((K&128|0)!=0&(E|0)==14){cJ[c[(c[3524]|0)+156>>2]&15](e,f,B,j,k,A);J=c[(c[3524]|0)+164>>2]|0;L=c[n>>2]|0;c[n>>2]=L+1;cM[J&511](a[L]|0);cM[c[(c[3524]|0)+164>>2]&511](a[c[n>>2]|0]|0);G=B;H=A;break}do{if((K|0)==125){F=11396;break L15480}else if((K|0)==64){cS[c[(c[3524]|0)+160>>2]&511]();cJ[c[(c[3524]|0)+156>>2]&15](e,f,B,j,k,3);L=(c[n>>2]|0)+1|0;c[n>>2]=L;c[n>>2]=lJ(L,0,e,f,B,j,k,A)|0;cJ[c[(c[3524]|0)+156>>2]&15](e,f,B,j,k,4);G=B;H=A;break L15492}else if((K|0)==38){cS[c[(c[3524]|0)+160>>2]&511]();L=(c[n>>2]|0)+1|0;c[n>>2]=L;c[n>>2]=lJ(L,0,e,f,B,j,0,A)|0;G=B;H=A;break L15492}else if((K|0)==40|(K|0)==41){cJ[c[(c[3524]|0)+156>>2]&15](e,f,B,j,k,A);L=c[3524]|0;if((c[L+96>>2]&16|0)==0){N=L}else{cM[c[L+164>>2]&511](92);N=c[3524]|0}cM[c[N+164>>2]&511](a[c[n>>2]|0]|0);G=B;H=A;break L15492}else if((K|0)==123){L=C;do{L=L+1|0;c[n>>2]=L;}while((a[L]|0)==32);do{if((A|0)==2){O=+uz(L,n);P=u*O;if((c[(c[3524]|0)+96>>2]&16|0)!=0){Q=P;break}Q=B+P}else{Q=B}}while(0);L=c[n>>2]|0;if((a[L]|0)==47){J=L;while(1){R=J+1|0;c[n>>2]=R;S=a[R]|0;if((S<<24>>24|0)==45){T=R;F=11405;break}else if((S<<24>>24|0)==32){J=R}else{U=R;V=S;break}}if((F|0)==11405){while(1){F=0;J=T+1|0;c[n>>2]=J;S=a[J]|0;if(S<<24>>24==32){T=J;F=11405}else{U=J;V=S;break}}}L15518:do{if(V<<24>>24<33){W=U;X=V}else{S=V;J=U;while(1){if((S<<24>>24|0)==61|(S<<24>>24|0)==42|(S<<24>>24|0)==125){W=J;X=S;break L15518}R=J+1|0;c[n>>2]=R;Y=a[R]|0;if(Y<<24>>24<33){W=R;X=Y;break}else{S=Y;J=R}}}}while(0);do{if((X<<24>>24|0)==61){c[n>>2]=W+1;a[W]=0;P=+uz(c[n>>2]|0,n);if(P==0.0){Z=u;break}Z=P*+h[5613]}else if((X<<24>>24|0)==125){uh(-1,204816,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);J=c[n>>2]|0;c[n>>2]=J+1;a[J]=0;Z=u}else if((X<<24>>24|0)==42){c[n>>2]=W+1;a[W]=0;P=+uz(c[n>>2]|0,n);if(P==0.0){Z=u;break}Z=P*f}else{c[n>>2]=W+1;a[W]=0;Z=u}}while(0);J=c[n>>2]|0;if((a[J]|0)==32){S=J;while(1){R=S+1|0;c[n>>2]=R;if((a[R]|0)==32){S=R}else{_=R;break}}}else{_=J}$=Z;aa=(a[U]|0)==0?e:U;ab=X;ac=W;ad=_}else{$=u;aa=e;ab=0;ac=0;ad=L}c[n>>2]=lJ(ad,1,aa,$,Q,j,k,A)|0;cS[c[(c[3524]|0)+160>>2]&511]();if((ac|0)==0){G=Q;H=A;break L15492}a[ac]=ab;G=Q;H=A;break L15492}else if((K|0)==95|(K|0)==94){cS[c[(c[3524]|0)+160>>2]&511]();c[n>>2]=lJ((c[n>>2]|0)+1|0,0,e,s,B+(D<<24>>24==94?.5:-.30000001192092896)*f,j,k,A)|0;G=B;H=A;break L15492}else if((K|0)==126){cS[c[(c[3524]|0)+160>>2]&511]();S=(c[n>>2]|0)+1|0;c[n>>2]=S;c[n>>2]=lJ(S,0,e,f,B,j,k,1)|0;cS[c[(c[3524]|0)+160>>2]&511]();S=c[n>>2]|0;if((a[S]|0)==0){G=B;H=A;break L15492}R=S+1|0;c[n>>2]=R;c[n>>2]=lJ(R,0,e,f,B,0,k,2)|0;G=B;H=0;break L15492}else if((K|0)==92){R=a[C+1|0]|0;if((R-48&255)<8){c[q>>2]=0;cJ[c[(c[3524]|0)+156>>2]&15](e,f,B,j,k,A);S=c[n>>2]|0;Y=S+1|0;c[n>>2]=Y;a[w]=a[Y]|0;Y=S+2|0;do{if(((a[Y]|0)-48&255)<8){c[n>>2]=Y;a[x]=a[Y]|0;ae=S+3|0;if(((a[ae]|0)-48&255)>=8){break}c[n>>2]=ae;a[y]=a[ae]|0}}while(0);S=aE(w|0,0,8)|0;be(z|0,44912,(v=i,i=i+8|0,c[v>>2]=S,v)|0);S=a[z]|0;if(S<<24>>24==0){G=B;H=A;break L15492}else{af=z;ag=S}while(1){cM[c[(c[3524]|0)+164>>2]&511](ag<<24>>24);S=af+1|0;Y=a[S]|0;if(Y<<24>>24==0){G=B;H=A;break L15492}else{af=S;ag=Y}}}Y=c[3524]|0;do{if((c[Y+96>>2]&16|0)==0){ah=C}else{if((R<<24>>24|0)==92|(R<<24>>24|0)==40|(R<<24>>24|0)==41){cJ[c[Y+156>>2]&15](e,f,B,j,k,A);cM[c[(c[3524]|0)+164>>2]&511](92);ah=c[n>>2]|0;break}if((aZ(204560,R<<24>>24|0,8)|0)!=0){ah=C;break}cJ[c[Y+156>>2]&15](e,f,B,j,k,A);cM[c[(c[3524]|0)+164>>2]&511](92);cM[c[(c[3524]|0)+164>>2]&511](92);G=B;H=A;break L15492}}while(0);Y=ah+1|0;c[n>>2]=Y;R=a[Y]|0;if(R<<24>>24==0){uh(-1,204288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);G=B;H=A;break L15492}if(!(R<<24>>24==38&(c[11252]|0)==0)){break}R=c[3524]|0;if((aY(c[R>>2]|0,204032)|0)!=0){break}cJ[c[R+156>>2]&15](e,f,B,j,k,A);cM[c[(c[3524]|0)+164>>2]&511](-2);G=B;H=A;break L15492}}while(0);cJ[c[(c[3524]|0)+156>>2]&15](e,f,B,j,k,A);cM[c[(c[3524]|0)+164>>2]&511](a[c[n>>2]|0]|0);G=B;H=A}}while(0);if(!d){break}E=c[n>>2]|0;if((a[E]|0)==0){break L15478}K=E+1|0;c[n>>2]=K;E=a[K]|0;if(E<<24>>24==0){break L15478}else{A=H;B=G;C=K;D=E}}do{if((F|0)==11396){if(d){ai=C;i=m;return ai|0}else{uh(-1,205424,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);break}}}while(0);cS[c[(c[3524]|0)+160>>2]&511]();ai=c[n>>2]|0;i=m;return ai|0}}while(0);cS[c[(c[3524]|0)+160>>2]&511]();ai=c[n>>2]|0;i=m;return ai|0}function lK(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;e=b|0;f=c[e>>2]|0;g=43280;while(1){h=c[g>>2]|0;if((h|0)==0){break}if((c[h+4>>2]|0)==(d|0)){i=11457;break}else{g=h|0}}if((i|0)==11457){g=b;j=h+8|0;c[g>>2]=c[j>>2];c[g+4>>2]=c[j+4>>2];c[g+8>>2]=c[j+8>>2];c[g+12>>2]=c[j+12>>2];c[g+16>>2]=c[j+16>>2];c[g+20>>2]=c[j+20>>2];c[g+24>>2]=c[j+24>>2];c[g+28>>2]=c[j+28>>2];c[g+32>>2]=c[j+32>>2];c[g+36>>2]=c[j+36>>2];c[g+40>>2]=c[j+40>>2];c[g+44>>2]=c[j+44>>2];c[g+48>>2]=c[j+48>>2];c[g+52>>2]=c[j+52>>2];c[e>>2]=f;if((a[b+32|0]&1)!=0){return}c[b+40>>2]=1;c[b+44>>2]=c[b+4>>2];return}j=c[8798]|0;g=(j|0)>0;h=d;L15586:while(1){d=43264;while(1){k=c[d>>2]|0;if((k|0)==0){break}if((c[k+4>>2]|0)==(h|0)){break L15586}else{d=k|0}}l=h-1|0;if(!((h|0)>(j|0)&g)){i=11469;break}h=((l|0)%(j|0)&-1)+1|0}if((i|0)==11469){c[b+4>>2]=l;c[b+40>>2]=1;c[b+44>>2]=l;c[b+8>>2]=l;return}l=b;i=k+8|0;c[l>>2]=c[i>>2];c[l+4>>2]=c[i+4>>2];c[l+8>>2]=c[i+8>>2];c[l+12>>2]=c[i+12>>2];c[l+16>>2]=c[i+16>>2];c[l+20>>2]=c[i+20>>2];c[l+24>>2]=c[i+24>>2];c[l+28>>2]=c[i+28>>2];c[l+32>>2]=c[i+32>>2];c[l+36>>2]=c[i+36>>2];c[l+40>>2]=c[i+40>>2];c[l+44>>2]=c[i+44>>2];c[l+48>>2]=c[i+48>>2];c[l+52>>2]=c[i+52>>2];c[e>>2]=f;if((c[(c[3524]|0)+96>>2]&1024|0)!=0){c[b+4>>2]=h;a[b+32|0]=0;return}if((a[b+32|0]&1)!=0){return}c[b+40>>2]=1;c[b+44>>2]=c[b+4>>2];return}function lL(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0.0,l=0,m=0,n=0;f=i;h[29751]=1.0;a[237976]=0;h[29749]=1.0;h[29748]=0.0;h[29745]=0.0;uF(44912,202200,16);do{if((a[37456]&1)==0){if((cy(e|0,201600)|0)==0){break}h[29743]=+(b>>>0>>>0);h[29741]=+(d>>>0>>>0);g=e;do{j=lJ(g,1,179864,+h[29751],0.0,1,1,0)|0;if((a[j]|0)==0){break}cS[c[(c[3524]|0)+160>>2]&511]();if((a[j]|0)==125){uh(-1,203744,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{uh(-1,203528,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=j+1|0;}while((a[g]|0)!=0);k=+h[29743];if(k>0.0&k<1.0){h[29743]=1.0}c[(c[3524]|0)+8>>2]=~~+h[29745];c[(c[3524]|0)+12>>2]=~~((+h[29749]- +h[29748])*10.0+.5);i=f;return}}while(0);if((c[11252]|0)==15){d=a[e]|0;if(d<<24>>24==0){l=0}else{b=0;g=0;j=d;while(1){if((j&-64)<<24>>24==-128){m=g}else{m=((j&255)>226?2:1)+g|0}d=b+1|0;n=a[e+d|0]|0;if(n<<24>>24==0){l=m;break}else{b=d;g=m;j=n}}}c[(c[3524]|0)+8>>2]=l}else{l=uA(e|0)|0;c[(c[3524]|0)+8>>2]=l}c[(c[3524]|0)+12>>2]=10;i=f;return}function lM(){a[13048|0]=0;return}function lN(){return}function lO(a,b){a=a|0;b=b|0;return}function lP(a){a=a|0;return}function lQ(a,b,c){a=a|0;b=b|0;c=c|0;return}function lR(a){a=a|0;c[59236]=a;return 1}function lS(a){a=a|0;c[56732]=a;return 1}function lT(b){b=b|0;var d=0.0,e=0.0,f=0.0;if((b|0)==10){d=+h[29750];if(a[237976]|0){h[29750]=0.0;do{if((a[237952]&1)==0){e=+h[29743]}else{if((c[59492]|0)==1){f=d*.5+ +h[29743];h[29743]=f;e=f;break}else{f=d+ +h[29743];h[29743]=f;e=f;break}}}while(0);d=+h[29745];h[29745]=d>e?d:e;a[237976]=0}a[237976]=1;e=+h[29751];h[29748]=+h[29748]-e;h[29752]=+h[29752]-e;h[29743]=0.0}if((c[11252]|0)!=15){h[29750]=+h[29751]+ +h[29750];return}if((b&192|0)==128){return}e=+h[29751];d=e+ +h[29750];h[29750]=d;if(b>>>0<=235){return}h[29750]=d+e;return}function lU(a){a=a|0;var b=0;b=(a|0)<-2?-2:a;c[59226]=b>>>0>3?b&3:b;return}function lV(){c[59226]=3;aI(152264,54,1,c[10030]|0);return}function lW(){aD(c[10030]|0);return}function lX(){var a=0;if((c[59234]|0)>0){a=c[10030]|0;aI(152912,16,1,a|0);c[59234]=0}aI(152336,4,1,c[10030]|0);return}function lY(){var a=0,b=0,d=0.0;a=i;b=c[3524]|0;d=+((c[b+12>>2]|0)>>>0>>>0)/300.0;cf(c[10030]|0,152464,(v=i,i=i+16|0,h[v>>3]=+((c[b+8>>2]|0)>>>0>>>0)/300.0,h[v+8>>3]=d,v)|0);d=+g[59222];cf(c[10030]|0,152432,(v=i,i=i+16|0,h[v>>3]=+g[59224],h[v+8>>3]=d,v)|0);i=a;return}function lZ(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;if((c[59234]|0)>0){e=c[10030]|0;aI(152912,16,1,e|0);c[59234]=0}cf(c[10030]|0,152480,(v=i,i=i+16|0,h[v>>3]=+(a>>>0>>>0)/300.0,h[v+8>>3]=+(b>>>0>>>0)/300.0,v)|0);c[59234]=1;i=d;return}function l_(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0.0,j=0.0,k=0,l=0;d=i;e=c[10030]|0;if((c[59234]|0)==1){f=c[236912+((c[59226]|0)+2<<2)>>2]|0;g=+(a>>>0>>>0)/300.0;j=+(b>>>0>>>0)/300.0;cf(e|0,152664,(v=i,i=i+24|0,c[v>>2]=f,h[v+8>>3]=g,h[v+16>>3]=j,v)|0);k=c[59234]|0;l=k+1|0;c[59234]=l;i=d;return}else{j=+(a>>>0>>>0)/300.0;g=+(b>>>0>>>0)/300.0;cf(e|0,152624,(v=i,i=i+16|0,h[v>>3]=j,h[v+8>>3]=g,v)|0);k=c[59234]|0;l=k+1|0;c[59234]=l;i=d;return}}function l$(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;if((c[59234]|0)>0){f=c[10030]|0;aI(152912,16,1,f|0);c[59234]=0}cf(c[10030]|0,103640,(v=i,i=i+8|0,c[v>>2]=d,v)|0);d=c[59236]|0;if((d|0)==1){f=c[10030]|0;aF(32,f|0)}else if((d|0)==0){aI(152848,6,1,c[10030]|0)}else if((d|0)==2){aI(152840,6,1,c[10030]|0)}cf(c[10030]|0,152712,(v=i,i=i+16|0,h[v>>3]=+(a>>>0>>>0)/300.0,h[v+8>>3]=+(b>>>0>>>0)/300.0,v)|0);i=e;return}function l0(a){a=a|0;if((c[59234]|0)<=0){return 0}aI(152912,16,1,c[10030]|0);c[59234]=0;return 0}function l1(a,b,d){a=a|0;b=b|0;d=d|0;cM[c[(c[3524]|0)+64>>2]&511](0);ly(a,b,d);return}function l2(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0.0,l=0.0,m=0.0,n=0.0;g=i;if((c[59234]|0)>0){j=c[10030]|0;aI(152912,16,1,j|0);c[59234]=0}j=c[10030]|0;k=+(a>>>0>>>0)/300.0;l=+(b>>>0>>>0)/300.0;m=+(d>>>0>>>0)/300.0;n=+(e>>>0>>>0)/300.0;if((f|0)==0){cf(j|0,152984,(v=i,i=i+32|0,h[v>>3]=k,h[v+8>>3]=l,h[v+16>>3]=m,h[v+24>>3]=n,v)|0);i=g;return}else{cf(j|0,153024,(v=i,i=i+32|0,h[v>>3]=k,h[v+8>>3]=l,h[v+16>>3]=m,h[v+24>>3]=n,v)|0);i=g;return}}function l3(){aI(153080,10,1,c[10030]|0);return}function l4(){aI(153112,11,1,c[10030]|0);return}function l5(){aI(153144,9,1,c[10030]|0);return}function l6(){aI(153304,23,1,c[10030]|0);c[57146]=0;aI(153392,9,1,c[10030]|0);return}function l7(a,b){a=a|0;b=b|0;var d=0;d=i;cf(c[10030]|0,153328,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=439-b,v)|0);i=d;return}function l8(a,b){a=a|0;b=b|0;var d=0;d=i;cf(c[10030]|0,153344,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=439-b,v)|0);i=d;return}function l9(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=(a|0)<-2?-2:a;if((c[57208]|0)==0){if((d|0)>8){e=(d|0)%9&-1}else{e=d}a=c[10030]|0;f=e+2|0;e=c[228712+(f<<2)>>2]|0;cf(a|0,153376,(v=i,i=i+8|0,c[v>>2]=e,v)|0);e=c[10030]|0;a=c[228592+(f<<2)>>2]|0;cf(e|0,153368,(v=i,i=i+8|0,c[v>>2]=a,v)|0);i=b;return}else{if((d|0)>14){g=(d|0)%15&-1}else{g=d}d=c[10030]|0;a=g+2|0;g=c[228760+(a<<2)>>2]|0;cf(d|0,153376,(v=i,i=i+8|0,c[v>>2]=g,v)|0);g=c[10030]|0;d=c[228640+(a<<2)>>2]|0;cf(g|0,153368,(v=i,i=i+8|0,c[v>>2]=d,v)|0);i=b;return}}function ma(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;f=i;if((c[57146]|0)==1){g=b-11|0;h=c[10030]|0;j=439-d|0;cf(h|0,153328,(v=i,i=i+16|0,c[v>>2]=g,c[v+8>>2]=j,v)|0)}else{j=c[10030]|0;g=430-d|0;cf(j|0,153328,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=g,v)|0)}aF(84,c[10030]|0);aF(39,c[10030]|0);g=a[e]|0;if(g<<24>>24==0){k=c[10030]|0;l=aF(39,k|0)|0;m=c[10030]|0;n=aF(10,m|0)|0;i=f;return}else{o=e;p=g}do{aF(p<<24>>24|0,c[10030]|0);if((a[o]|0)==39){g=c[10030]|0;aF(39,g|0)}o=o+1|0;p=a[o]|0;}while(p<<24>>24!=0);k=c[10030]|0;l=aF(39,k|0)|0;m=c[10030]|0;n=aF(10,m|0)|0;i=f;return}function mb(a){a=a|0;var b=0;b=(a|0)!=0;c[57146]=b&1;a=c[10030]|0;if(b){aI(153416|0,10,1,a|0);return 1}else{aI(153392|0,9,1,a|0);return 1}return 0}function mc(){aI(153552,24,1,c[10030]|0);aI(153520,20,1,c[10030]|0);aD(c[10030]|0);return}function md(){aI(153584,13,1,c[10030]|0);aD(c[10030]|0);return}function me(){aI(153704,9,1,c[10030]|0);aD(c[10030]|0);return}function mf(){aI(153720,11,1,c[10030]|0);aD(c[10030]|0);return}function mg(a,b){a=a|0;b=b|0;aI(153736,3,1,c[10030]|0);t0(a,b);aD(c[10030]|0);return}function mh(a,b){a=a|0;b=b|0;aI(153760,3,1,c[10030]|0);t0(a,b);aD(c[10030]|0);return}function mi(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;b=(a|0)<-2?-2:a;if((b|0)==(-1|0)){a=c[10030]|0;aI(153824,4,1,a|0)}else if((b|0)==(-2|0)){aI(153800,4,1,c[10030]|0)}else{aI(153792,3,1,c[10030]|0);a=(b|0)%14&-1;d=a+2|0;e=(d|0)>-1?d:-2-a|0;a=e>>>10;f=e>>>4&63|64;g=e&15|(d>>31)+48&-16;if((a|0)==0){if((f|0)!=64){h=11606}}else{d=a+64|0;a=c[10030]|0;aF(d|0,a|0);h=11606}if((h|0)==11606){h=c[10030]|0;aF(f|0,h|0)}aF(g|0,c[10030]|0)}aI(153784,3,1,c[10030]|0);g=(b|0)>0?(b|0)%8&-1:0;b=(g|0)>-1?g:-g|0;h=b>>>10;f=b>>>4&63|64;a=b&15|(g>>31)+48&-16;do{if((h|0)==0){if((f|0)!=64){break}i=c[10030]|0;j=aF(a|0,i|0)|0;k=c[10030]|0;l=aD(k|0)|0;return}else{g=h+64|0;b=c[10030]|0;aF(g|0,b|0)}}while(0);aF(f|0,c[10030]|0);i=c[10030]|0;j=aF(a|0,i|0)|0;k=c[10030]|0;l=aD(k|0)|0;return}function mj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;if((c[56732]|0)==0){e=b-29|0;f=c[10030]|0;aI(153736,3,1,f|0);t0(a,e);e=c[10030]|0;aD(e|0);e=c[10030]|0;aI(154080,5,1,e|0)}else{e=a+19|0;a=c[10030]|0;aI(153736,3,1,a|0);t0(e,b);b=c[10030]|0;aD(b|0);b=c[10030]|0;aI(153952,6,1,b|0)}aI(153920,3,1,c[10030]|0);b=uA(d|0)|0;e=(b|0)>-1?b:-b|0;a=e>>>10;f=e>>>4&63|64;g=e&15|(b>>31)+48&-16;do{if((a|0)==0){if((f|0)!=64){break}h=c[10030]|0;i=aF(g|0,h|0)|0;j=c[10030]|0;k=aK(d|0,j|0)|0;l=c[10030]|0;m=aD(l|0)|0;return}else{b=a+64|0;e=c[10030]|0;aF(b|0,e|0)}}while(0);aF(f|0,c[10030]|0);h=c[10030]|0;i=aF(g|0,h|0)|0;j=c[10030]|0;k=aK(d|0,j|0)|0;l=c[10030]|0;m=aD(l|0)|0;return}function mk(){var b=0,d=0,e=0,f=0,j=0,k=0,l=0,m=0,n=0.0,o=0.0,p=0,q=0,r=0.0;b=i;i=i+24|0;d=b|0;g[59224]=0.0;g[59222]=0.0;e=c[13898]|0;L15781:do{if((e|0)<(c[8272]|0)){f=c[1054]|0;L15783:do{if((a[f+(e*40&-1)|0]&1)!=0){j=c[f+(e*40&-1)+36>>2]|0;k=f+(e*40&-1)+32|0;l=c[10036]|0;m=0;while(1){if((m|0)>=(j|0)){break}if((a[l+((c[k>>2]|0)+m|0)|0]|0)==(a[m+103664|0]|0)){m=m+1|0}else{break L15783}}if((m|0)==1){break L15781}}}while(0);f=is(d)|0;k=c[f>>2]|0;if((k|0)==2){n=+h[f+8>>3]}else if((k|0)==1){n=+(c[f+8>>2]|0)}else if((k|0)==3){n=+uz(c[f+8>>2]|0,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}o=n;f=c[13898]|0;if((f|0)>=(c[8272]|0)){break}k=c[1054]|0;L15797:do{if((a[k+(f*40&-1)|0]&1)!=0){l=c[k+(f*40&-1)+36>>2]|0;j=k+(f*40&-1)+32|0;p=c[10036]|0;q=0;while(1){if((q|0)>=(l|0)){break}if((a[p+((c[j>>2]|0)+q|0)|0]|0)==(a[q+103664|0]|0)){q=q+1|0}else{break L15797}}if((q|0)==1){break L15781}}}while(0);f=is(d)|0;k=c[f>>2]|0;if((k|0)==3){r=+uz(c[f+8>>2]|0,0)}else if((k|0)==2){r=+h[f+8>>3]}else if((k|0)==1){r=+(c[f+8>>2]|0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g[59224]=o;g[59222]=r}}while(0);r=+g[59222];be(13048,152224,(v=i,i=i+16|0,h[v>>3]=+g[59224],h[v+8>>3]=r,v)|0);i=b;return}function ml(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0.0;b=i;i=i+24|0;d=b|0;e=c[13898]|0;L15812:do{if((e|0)<(c[8272]|0)){f=c[1054]|0;L15814:do{if((a[f+(e*40&-1)|0]&1)!=0){g=c[f+(e*40&-1)+36>>2]|0;j=f+(e*40&-1)+32|0;k=c[10036]|0;l=0;while(1){if((l|0)>=(g|0)){break}if((a[k+((c[j>>2]|0)+l|0)|0]|0)==(a[l+103664|0]|0)){l=l+1|0}else{break L15814}}if((l|0)==1){m=0;break L15812}}}while(0);f=is(d)|0;j=c[f>>2]|0;if((j|0)==2){n=+h[f+8>>3]}else if((j|0)==1){n=+(c[f+8>>2]|0)}else if((j|0)==3){n=+uz(c[f+8>>2]|0,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}m=(~~n|0)==16}else{m=0}}while(0);c[57208]=m&1;d=m?153072:170216;uD(13048,d|0,(uA(d|0)|0)+1|0);i=b;return}function mm(){return}function mn(){return}function mo(a){a=a|0;var b=0;b=(a|0)<0?0:a&7;c[60208]=240840+(b<<2);c[60222]=b;return}function mp(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;aI(154096,3,1,c[10030]|0);e=(d|0)>0?(d|0)%11&-1:0;d=(e|0)>-1?e:-e|0;f=d>>>10;g=d>>>4&63|64;h=d&15|(e>>31)+48&-16;if((f|0)==0){if((g|0)!=64){i=11668}}else{e=f+64|0;f=c[10030]|0;aF(e|0,f|0);i=11668}if((i|0)==11668){i=c[10030]|0;aF(g|0,i|0)}aF(h|0,c[10030]|0);aI(154088,3,1,c[10030]|0);t0(a,b);aD(c[10030]|0);return}function mq(){aF(29,c[10030]|0);aF(32,c[10030]|0);aF(108,c[10030]|0);aF(32,c[10030]|0);aF(64,c[10030]|0);aF(31,c[10030]|0);return}function mr(){aI(154304,2,1,c[10030]|0);aD(c[10030]|0);aB(1);return}function ms(a,b){a=a|0;b=b|0;aF(29,c[10030]|0);aF(b>>>5&31|32|0,c[10030]|0);aF(b&31|96|0,c[10030]|0);aF(a>>>5&31|32|0,c[10030]|0);aF(a&31|64|0,c[10030]|0);c[60220]=a;c[60218]=b;return}function mt(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;if((c[60222]|0)<1){d=b>>>5&31|32;e=c[10030]|0;aF(d|0,e|0);e=b&31|96;d=c[10030]|0;aF(e|0,d|0);d=a>>>5&31|32;e=c[10030]|0;aF(d|0,e|0);e=a&31|64;d=c[10030]|0;aF(e|0,d|0);c[60220]=a;c[60218]=b;return}d=c[60220]|0;e=c[60218]|0;f=a-d|0;g=b-e|0;h=(f|0)>-1;i=(h?f:-f|0)<<1;j=(g|0)>-1;k=(j?g:-g|0)<<1;l=f>>31|1;f=g>>31|1;do{if((i|0)<(k|0)){if((e|0)==(b|0)){m=d;n=b;break}g=j^1;o=e;p=d;q=i-(k>>1)|0;while(1){t$(p,o,0);if((q|0)<1&((q|0)!=0|g)){r=q;s=p}else{r=q-k|0;s=p+l|0}t=o+f|0;if((t|0)==(b|0)){m=s;n=b;break}else{o=t;p=s;q=r+i|0}}}else{if((d|0)==(a|0)){m=a;n=e;break}q=h^1;p=e;o=d;g=k-(i>>1)|0;while(1){t$(o,p,0);if((g|0)<1&((g|0)!=0|q)){u=g;v=p}else{u=g-i|0;v=p+f|0}t=o+l|0;if((t|0)==(a|0)){m=a;n=v;break}else{p=v;o=t;g=u+k|0}}}}while(0);t$(m,n,1);c[60220]=a;c[60218]=b;return}function mu(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=b-11|0;aF(29,c[10030]|0);aF(f>>>5&31|32|0,c[10030]|0);aF(f&31|96|0,c[10030]|0);aF(a>>>5&31|32|0,c[10030]|0);aF(a&31|64|0,c[10030]|0);cf(c[10030]|0,154112,(v=i,i=i+8|0,c[v>>2]=d,v)|0);i=e;return}function mv(){aI(154432,6,1,c[10030]|0);aD(c[10030]|0);aB(1);return}function mw(){aI(154120,6,1,c[10030]|0);aD(c[10030]|0);aB(1);return}function mx(a,b){a=a|0;b=b|0;aF(29,c[10030]|0);aF(b>>>5&31|32|0,c[10030]|0);aF(b&31|96|0,c[10030]|0);aF(a>>>5&31|32|0,c[10030]|0);aF(a&31|64|0,c[10030]|0);return}function my(a,b){a=a|0;b=b|0;aF(b>>>5&31|32|0,c[10030]|0);aF(b&31|96|0,c[10030]|0);aF(a>>>5&31|32|0,c[10030]|0);aF(a&31|64|0,c[10030]|0);return}function mz(b){b=b|0;var d=0,e=0,f=0;d=i;e=(b|0)<-2?-2:b;if((e|0)>9){f=(e|0)%10&-1}else{f=e}cf(c[10030]|0,154424,(v=i,i=i+8|0,c[v>>2]=a[154144+(f+2|0)|0]|0,v)|0);c[8836]=f;i=d;return}function mA(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;g=c[8836]|0;cf(c[10030]|0,154424,(v=i,i=i+8|0,c[v>>2]=96,v)|0);c[8836]=0;h=d-11|0;aF(29,c[10030]|0);aF(h>>>5&31|32|0,c[10030]|0);aF(h&31|96|0,c[10030]|0);aF(b>>>5&31|32|0,c[10030]|0);aF(b&31|64|0,c[10030]|0);cf(c[10030]|0,154112,(v=i,i=i+8|0,c[v>>2]=e,v)|0);e=(g|0)<-2?-2:g;if((e|0)>9){j=(e|0)%10&-1}else{j=e}cf(c[10030]|0,154424,(v=i,i=i+8|0,c[v>>2]=a[154144+(j+2|0)|0]|0,v)|0);c[8836]=j;i=f;return}function mB(){aI(154160,3,1,c[10030]|0);return}function mC(){aI(154432,6,1,c[10030]|0);aI(154304,2,1,c[10030]|0);return}function mD(b){b=b|0;var e=0,f=0,g=0;e=i;do{if((b|0)==0){f=0}else{g=uA(b|0)|0;if((g|0)==0){f=0;break}f=((d[b+(g-1|0)|0]|0)<<24)-822083584>>24}}while(0);cf(c[10030]|0,154424,(v=i,i=i+8|0,c[v>>2]=a[154344+((f-1|0)>>>0<3?f:0)|0]|0,v)|0);i=e;return 1}function mE(){aI(154432,6,1,c[10030]|0);return}function mF(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0.0,an=0.0,ao=0,ap=0.0,aq=0,ar=0,as=0,at=0.0,au=0.0,av=0.0,aw=0.0,ax=0.0,ay=0,az=0,aA=0;b=i;i=i+240|0;d=b|0;e=b+24|0;f=b+48|0;g=b+72|0;j=b+96|0;k=b+120|0;l=b+144|0;m=b+168|0;n=b+192|0;o=b+216|0;if((c[13898]|0)==2){p=2}else{h[30427]=10.0;h[6936]=10.0;h[6935]=1.0;a[243104]=0;a[243312]=0;uu(c[60826]|0);c[60826]=0;uu(c[60774]|0);c[60774]=0;uu(c[60778]|0);c[60778]=0;h[6931]=1.0;a[55512]=0;h[6938]=1.0;a[243424]=0;p=c[13898]|0}q=c[8272]|0;L15888:do{if((p|0)<(q|0)){r=n|0;s=n+8|0;t=m|0;u=m+8|0;w=l|0;x=l+8|0;y=k|0;z=k+8|0;A=j|0;B=j+8|0;C=g|0;D=g+8|0;E=f|0;F=f+8|0;G=e|0;H=e+8|0;I=d|0;J=d+8|0;K=o|0;L=o+8|0;M=0;N=p;O=q;L15890:while(1){P=c[1054]|0;Q=P+(N*40&-1)|0;L15892:do{if((a[Q]&1)!=0){R=c[P+(N*40&-1)+36>>2]|0;S=P+(N*40&-1)+32|0;T=c[10036]|0;U=0;while(1){if((U|0)>=(R|0)){break}if((a[T+((c[S>>2]|0)+U|0)|0]|0)==(a[U+103664|0]|0)){U=U+1|0}else{break L15892}}if((U|0)==1){V=M;break L15888}}}while(0);W=N+1|0;c[13898]=W;S=c[60782]|0;L15899:do{if((S|0)==0){X=243128}else{T=c[P+(N*40&-1)+36>>2]|0;R=c[P+(N*40&-1)+32>>2]|0;Y=(a[Q]&1)==0;Z=(T|0)>0;_=c[10036]|0;$=243128;aa=S;while(1){L15903:do{if(!Y){if(Z){ab=0;ac=0;ad=R;while(1){ae=a[aa+ab|0]|0;if(ae<<24>>24==(a[_+(ab+ad|0)|0]|0)){af=ad;ag=ac}else{if(ae<<24>>24!=36){break L15903}af=ad-1|0;ag=1}ah=ab+1|0;if((ah|0)<(ag+T|0)){ab=ah;ac=ag;ad=af}else{break}}if((ag|0)==0){ai=ah}else{X=$;break L15899}}else{ai=0}ad=a[aa+ai|0]|0;if((ad<<24>>24|0)==36|(ad<<24>>24|0)==0){X=$;break L15899}}}while(0);ad=$+8|0;ac=c[ad>>2]|0;if((ac|0)==0){X=ad;break}else{$=ad;aa=ac}}}}while(0);S=c[X+4>>2]|0;do{if((S|0)==3){if((W|0)>=(O|0)){aj=11782;break L15890}L15919:do{if((a[P+(W*40&-1)|0]&1)!=0){Q=c[P+(W*40&-1)+36>>2]|0;aa=P+(W*40&-1)+32|0;$=c[10036]|0;T=0;while(1){if((T|0)>=(Q|0)){break}if((a[$+((c[aa>>2]|0)+T|0)|0]|0)==(a[T+103664|0]|0)){T=T+1|0}else{break L15919}}if((T|0)==1){aj=11782;break L15890}}}while(0);a[14176]=1;is(k);a[14176]=0;if((c[y>>2]|0)!=3){aj=11781;break L15890}aa=c[z>>2]|0;c[60826]=aa;if((aa|0)==0){aj=11784;break L15890}if((a[aa+(b4(aa|0,218288)|0)|0]|0)!=0){aj=11787;break L15890}a[243104]=1;ak=M}else if((S|0)==7){a[243312]=1;ak=M}else if((S|0)==8){L15932:do{if((W|0)<(O|0)){L15934:do{if((a[P+(W*40&-1)|0]&1)!=0){aa=c[P+(W*40&-1)+36>>2]|0;$=P+(W*40&-1)+32|0;Q=c[10036]|0;_=0;while(1){if((_|0)>=(aa|0)){break}if((a[Q+((c[$>>2]|0)+_|0)|0]|0)==(a[_+103664|0]|0)){_=_+1|0}else{break L15934}}if((_|0)==1){al=0;break L15932}}}while(0);a[14176]=1;is(f);a[14176]=0;if((c[E>>2]|0)==3){al=c[F>>2]|0;break}else{c[13898]=W;al=0;break}}else{al=0}}while(0);c[60778]=al;ak=M}else if((S|0)==9){c[(c[3524]|0)+68>>2]=46;T=(c[3524]|0)+96|0;c[T>>2]=c[T>>2]|32;ak=M}else if((S|0)==5){if((W|0)>=(O|0)){aj=11770;break L15890}L15948:do{if((a[P+(W*40&-1)|0]&1)!=0){T=c[P+(W*40&-1)+36>>2]|0;$=P+(W*40&-1)+32|0;Q=c[10036]|0;aa=0;while(1){if((aa|0)>=(T|0)){break}if((a[Q+((c[$>>2]|0)+aa|0)|0]|0)==(a[aa+103664|0]|0)){aa=aa+1|0}else{break L15948}}if((aa|0)==1){aj=11770;break L15890}}}while(0);a[14176]=1;is(l);a[14176]=0;if((c[w>>2]|0)!=3){aj=11769;break L15890}$=c[x>>2]|0;c[60774]=$;if(($|0)==0){aj=11772;break L15890}else{ak=M}}else if((S|0)==13){a[55512]=1;ak=M}else if((S|0)==14){$=is(o)|0;Q=c[$>>2]|0;if((Q|0)==2){am=+h[$+8>>3]}else if((Q|0)==3){am=+uz(c[$+8>>2]|0,0)}else if((Q|0)==1){am=+(c[$+8>>2]|0)}else{aj=11854;break L15890}if((c[K>>2]|0)==3){uu(c[L>>2]|0);c[K>>2]=1}h[6938]=am;if(am>.2){ak=M;break}h[6938]=1.0;ak=M}else if((S|0)==0){L15968:do{if((W|0)<(O|0)){L15970:do{if((a[P+(W*40&-1)|0]&1)!=0){$=c[P+(W*40&-1)+36>>2]|0;Q=P+(W*40&-1)+32|0;T=c[10036]|0;R=0;while(1){if((R|0)>=($|0)){break}if((a[T+((c[Q>>2]|0)+R|0)|0]|0)==(a[R+103664|0]|0)){R=R+1|0}else{break L15970}}if((R|0)==1){aj=11735;break L15968}}}while(0);aa=is(n)|0;Q=c[aa>>2]|0;if((Q|0)==3){an=+uz(c[aa+8>>2]|0,0)}else if((Q|0)==1){an=+(c[aa+8>>2]|0)}else if((Q|0)==2){an=+h[aa+8>>3]}else{aj=11740;break L15890}if((c[r>>2]|0)==3){uu(c[s>>2]|0);c[r>>2]=1}aa=~~(+(~~an|0)*10.0);c[13836]=aa;Q=c[13898]|0;L15985:do{if((c[8272]|0)>(Q|0)){T=c[1054]|0;if((a[T+(Q*40&-1)|0]&1)==0){ao=aa;break}$=c[T+(Q*40&-1)+36>>2]|0;_=T+(Q*40&-1)+32|0;T=c[10036]|0;Z=0;while(1){if((Z|0)>=($|0)){break}if((a[T+((c[_>>2]|0)+Z|0)|0]|0)==(a[Z+148464|0]|0)){Z=Z+1|0}else{ao=aa;break L15985}}if((Z|0)!=1){ao=aa;break}c[13898]=Q+1;_=is(m)|0;T=c[_>>2]|0;if((T|0)==2){ap=+h[_+8>>3]}else if((T|0)==3){ap=+uz(c[_+8>>2]|0,0)}else if((T|0)==1){ap=+(c[_+8>>2]|0)}else{aj=11753;break L15890}if((c[t>>2]|0)==3){uu(c[u>>2]|0);c[t>>2]=1}c[13832]=~~(+(~~ap|0)*10.0);ao=c[13836]|0}else{ao=aa}}while(0);if((ao|0)<1){c[13836]=6e3;aq=6e3}else{aq=ao}if((c[13832]|0)>=1){ar=aq;break}c[13832]=4e3;ar=aq}else{aj=11735}}while(0);if((aj|0)==11735){aj=0;c[13836]=6e3;c[13832]=4e3;ar=6e3}c[(c[3524]|0)+8>>2]=ar;c[(c[3524]|0)+12>>2]=c[13832];ak=M}else if((S|0)==10){c[(c[3524]|0)+68>>2]=118;aa=(c[3524]|0)+96|0;c[aa>>2]=c[aa>>2]&-33;ak=M}else if((S|0)==4){a[243104]=0;ak=M}else if((S|0)==1){uu(c[13874]|0);as=c[13898]|0;if((as|0)>=(c[8272]|0)){aj=11798;break L15890}aa=c[1054]|0;L16013:do{if((a[aa+(as*40&-1)|0]&1)!=0){Q=c[aa+(as*40&-1)+36>>2]|0;_=aa+(as*40&-1)+32|0;T=c[10036]|0;$=0;while(1){if(($|0)>=(Q|0)){break}if((a[T+((c[_>>2]|0)+$|0)|0]|0)==(a[$+103664|0]|0)){$=$+1|0}else{break L16013}}if(($|0)==1){aj=11798;break L15890}}}while(0);a[14176]=1;is(j);a[14176]=0;if((c[A>>2]|0)!=3){aj=11797;break L15890}aa=c[B>>2]|0;c[13874]=aa;if((aa|0)==0){aj=11800;break L15890}do{if((a[aa]|0)==0){at=+h[30427];h[6936]=at;au=at}else{_=bk(aa|0,148464)|0;if((a[aa+_|0]|0)!=44){au=+h[6936];break}T=aa+(_+1|0)|0;ca(T|0,148448,(v=i,i=i+8|0,c[v>>2]=55488,v)|0);at=+h[6936];if(at>0.0){au=at;break}at=+h[30427];h[6936]=at;au=at}}while(0);c[(c[3524]|0)+16>>2]=~~(au*+h[6935]*10.0);c[(c[3524]|0)+20>>2]=~~(+h[6936]*+h[6935]*.8*10.0);ak=M}else if((S|0)==15){a[55440]=1;ak=M}else if((S|0)==16){a[55440]=0;ak=M}else if((S|0)==12){a[55512]=0;ak=M}else if((S|0)==2){aa=is(g)|0;T=c[aa>>2]|0;if((T|0)==2){av=+h[aa+8>>3]}else if((T|0)==3){av=+uz(c[aa+8>>2]|0,0)}else if((T|0)==1){av=+(c[aa+8>>2]|0)}else{aj=11813;break L15890}if((c[C>>2]|0)==3){uu(c[D>>2]|0);c[C>>2]=1}at=av>0.0?av:10.0;h[30427]=at;h[6936]=at;ak=M}else if((S|0)==17){aa=hK()|0;be(243424,164384,(v=i,i=i+24|0,c[v>>2]=aa>>>16&255,c[v+8>>2]=aa>>>8&255,c[v+16>>2]=aa&255,v)|0);ak=aa}else if((S|0)==11){aa=is(d)|0;T=c[aa>>2]|0;if((T|0)==1){aw=+(c[aa+8>>2]|0)}else if((T|0)==2){aw=+h[aa+8>>3]}else if((T|0)==3){aw=+uz(c[aa+8>>2]|0,0)}else{aj=11843;break L15890}if((c[I>>2]|0)==3){uu(c[J>>2]|0);c[I>>2]=1}h[6935]=aw;if(aw>0.0){ak=M;break}h[6935]=1.0;ak=M}else if((S|0)==6){aa=is(e)|0;T=c[aa>>2]|0;if((T|0)==2){ax=+h[aa+8>>3]}else if((T|0)==3){ax=+uz(c[aa+8>>2]|0,0)}else if((T|0)==1){ax=+(c[aa+8>>2]|0)}else{aj=11834;break L15890}if((c[G>>2]|0)==3){uu(c[H>>2]|0);c[G>>2]=1}h[6931]=ax;if(ax>0.0){ak=M;break}h[6931]=1.0;ak=M}else{uh(N,217704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);ak=M}}while(0);S=c[13898]|0;P=c[8272]|0;if((S|0)<(P|0)){M=ak;N=S;O=P}else{V=ak;break L15888}}if((aj|0)==11843){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aj|0)==11800){ay=c[13898]|0;uf(ay,154936,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aj|0)==11781){c[13898]=W;aj=11782}else if((aj|0)==11769){c[13898]=W;aj=11770}else if((aj|0)==11813){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aj|0)==11854){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aj|0)==11787){uf((c[13898]|0)-1|0,154976,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aj|0)==11797){c[13898]=as;aj=11798}else if((aj|0)==11834){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aj|0)==11784){az=c[13898]|0;uf(az,155080,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aj|0)==11740){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aj|0)==11772){aA=c[13898]|0;uf(aA,155136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aj|0)==11753){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((aj|0)==11798){c[13874]=0;ay=as;uf(ay,154936,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aj|0)==11782){c[60826]=0;az=W;uf(az,155080,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((aj|0)==11770){c[60774]=0;aA=W;uf(aA,155136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}else{V=0}}while(0);c[(c[3524]|0)+16>>2]=~~(+h[6936]*+h[6935]*10.0);c[(c[3524]|0)+20>>2]=~~(+h[6936]*+h[6935]*.8*10.0);be(13048,(a[55512]|0?95248:154912)|0,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);ax=+h[6938];if(a[55512]&ax!=1.0){aA=13048+(uA(13048)|0)|0;be(aA|0,154888,(v=i,i=i+8|0,h[v>>3]=ax,v)|0)}aA=13048+(uA(13048)|0)|0;be(aA|0,(a[55440]|0?154872:154864)|0,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);aA=13048+(uA(13048)|0)|0;W=c[3524]|0;aj=~~(+((c[W+12>>2]|0)>>>0>>>0)/10.0);be(aA|0,154848,(v=i,i=i+16|0,c[v>>2]=~~(+((c[W+8>>2]|0)>>>0>>>0)/10.0),c[v+8>>2]=aj,v)|0);aj=13048+(uA(13048)|0)|0;ax=+h[6936];aw=+h[6931];be(aj|0,154816,(v=i,i=i+24|0,c[v>>2]=(c[(c[3524]|0)+68>>2]|0)==46?154784:179864,h[v+8>>3]=ax,h[v+16>>3]=aw,v)|0);aj=13048+(uA(13048)|0)|0;be(aj|0,154712,(v=i,i=i+8|0,h[v>>3]=+h[6935],v)|0);if((a[243424]|0)!=0){aj=13048+(uA(13048)|0)|0;be(aj|0,170616,(v=i,i=i+8|0,c[v>>2]=V,v)|0)}V=c[60826]|0;aj=13048+(uA(13048)|0)|0;do{if((V|0)==0){uD(aj|0,154600,12);if(a[243312]|0){uD(13048+(uA(13048)|0)|0,154568,9)}W=c[60774]|0;if((W|0)==0){break}aA=13048+(uA(13048)|0)|0;be(aA|0,154544,(v=i,i=i+8|0,c[v>>2]=W,v)|0)}else{be(aj|0,154624,(v=i,i=i+8|0,c[v>>2]=V,v)|0)}}while(0);V=c[60778]|0;if((V|0)==0){i=b;return}be(13048+(uA(13048)|0)|0,154512,(v=i,i=i+8|0,c[v>>2]=V,v)|0);i=b;return}function mG(){return}function mH(){return}function mI(a){a=a|0;c[13840]=-a;return 1}function mJ(){var b=0,d=0,e=0,f=0,g=0,j=0.0,k=0,l=0,m=0,n=0;b=i;if(a[55472]|0){d=c[10030]|0;aI(165112,14,1,d|0);if(!(a[72328]|0)){d=c[10030]|0;aI(165528,17,1,d|0)}a[55472]=0;a[72328]=1}aI(159504,62,1,c[10030]|0);cf(c[10030]|0,159472,(v=i,i=i+8|0,c[v>>2]=~~(+((c[(c[3524]|0)+8>>2]|0)>>>0>>>0)/10.0),v)|0);cf(c[10030]|0,159440,(v=i,i=i+8|0,c[v>>2]=~~(+((c[(c[3524]|0)+12>>2]|0)>>>0>>>0)/10.0),v)|0);cf(c[10030]|0,159408,(v=i,i=i+8|0,h[v>>3]=+(c[7938]|0)/10.0,v)|0);cf(c[10030]|0,159320,(v=i,i=i+8|0,h[v>>3]=+(c[7939]|0)/10.0,v)|0);cf(c[10030]|0,159248,(v=i,i=i+8|0,h[v>>3]=+(((c[(c[3524]|0)+12>>2]|0)-(c[7940]|0)|0)>>>0>>>0)/10.0,v)|0);cf(c[10030]|0,159216,(v=i,i=i+8|0,h[v>>3]=+(((c[(c[3524]|0)+12>>2]|0)-(c[7941]|0)|0)>>>0>>>0)/10.0,v)|0);cf(c[10030]|0,159176,(v=i,i=i+8|0,h[v>>3]=+((c[7939]|0)-(c[7938]|0)|0)/10.0,v)|0);cf(c[10030]|0,159016,(v=i,i=i+8|0,h[v>>3]=+((c[7941]|0)-(c[7940]|0)|0)/10.0,v)|0);e7(1);do{if((c[16546]|0)!=1){d=e6(72800)|0;do{if((d|0)!=0){e=c[d+16>>2]|0;if((e|0)==1){f=c[10030]|0;g=c[d+24>>2]|0;cf(f|0,158984,(v=i,i=i+16|0,c[v>>2]=158952,c[v+8>>2]=g,v)|0);break}else if((e|0)==2){j=+h[d+24>>3];cf(c[10030]|0,158936,(v=i,i=i+16|0,c[v>>2]=158952,h[v+8>>3]=j,v)|0);break}else{break}}}while(0);d=e6(72544)|0;if((d|0)==0){break}e=c[d+16>>2]|0;if((e|0)==1){g=c[10030]|0;f=c[d+24>>2]|0;cf(g|0,158984,(v=i,i=i+16|0,c[v>>2]=158912,c[v+8>>2]=f,v)|0);break}else if((e|0)==2){j=+h[d+24>>3];cf(c[10030]|0,158936,(v=i,i=i+16|0,c[v>>2]=158912,h[v+8>>3]=j,v)|0);break}else{break}}}while(0);d=e6(225256)|0;do{if((d|0)!=0){e=c[d+16>>2]|0;if((e|0)==1){f=c[10030]|0;g=c[d+24>>2]|0;cf(f|0,158984,(v=i,i=i+16|0,c[v>>2]=158856,c[v+8>>2]=g,v)|0);break}else if((e|0)==2){j=+h[d+24>>3];cf(c[10030]|0,158936,(v=i,i=i+16|0,c[v>>2]=158856,h[v+8>>3]=j,v)|0);break}else{break}}}while(0);d=e6(225200)|0;do{if((d|0)!=0){e=c[d+16>>2]|0;if((e|0)==1){g=c[10030]|0;f=c[d+24>>2]|0;cf(g|0,158984,(v=i,i=i+16|0,c[v>>2]=158832,c[v+8>>2]=f,v)|0);break}else if((e|0)==2){j=+h[d+24>>3];cf(c[10030]|0,158936,(v=i,i=i+16|0,c[v>>2]=158832,h[v+8>>3]=j,v)|0);break}else{break}}}while(0);if((a[30528]&1)!=0){d=c[10030]|0;j=(c[17366]&1|0)==0?+h[8687]:0.0;cf(d|0,158760,(v=i,i=i+8|0,h[v>>3]=j,v)|0)}do{if((c[17261]&3|0)==0){d=c[10030]|0;aI(158560,33,1,d|0)}else{d=e6(224936)|0;do{if((d|0)!=0){e=c[d+16>>2]|0;if((e|0)==1){f=c[10030]|0;g=c[d+24>>2]|0;cf(f|0,158984,(v=i,i=i+16|0,c[v>>2]=158736,c[v+8>>2]=g,v)|0);break}else if((e|0)==2){j=+h[d+24>>3];cf(c[10030]|0,158936,(v=i,i=i+16|0,c[v>>2]=158736,h[v+8>>3]=j,v)|0);break}else{break}}}while(0);d=e6(224872)|0;if((d|0)==0){break}e=c[d+16>>2]|0;if((e|0)==1){g=c[10030]|0;f=c[d+24>>2]|0;cf(g|0,158984,(v=i,i=i+16|0,c[v>>2]=158664,c[v+8>>2]=f,v)|0);break}else if((e|0)==2){j=+h[d+24>>3];cf(c[10030]|0,158936,(v=i,i=i+16|0,c[v>>2]=158664,h[v+8>>3]=j,v)|0);break}else{break}}}while(0);do{if((c[17089]&3|0)==0){d=c[10030]|0;aI(158424,33,1,d|0)}else{d=e6(224640)|0;do{if((d|0)!=0){e=c[d+16>>2]|0;if((e|0)==1){f=c[10030]|0;g=c[d+24>>2]|0;cf(f|0,158984,(v=i,i=i+16|0,c[v>>2]=158520,c[v+8>>2]=g,v)|0);break}else if((e|0)==2){j=+h[d+24>>3];cf(c[10030]|0,158936,(v=i,i=i+16|0,c[v>>2]=158520,h[v+8>>3]=j,v)|0);break}else{break}}}while(0);d=e6(224432)|0;if((d|0)==0){break}e=c[d+16>>2]|0;if((e|0)==2){g=c[10030]|0;j=+h[d+24>>3];cf(g|0,158936,(v=i,i=i+16|0,c[v>>2]=158480,h[v+8>>3]=j,v)|0);break}else if((e|0)==1){e=c[d+24>>2]|0;cf(c[10030]|0,158984,(v=i,i=i+16|0,c[v>>2]=158480,c[v+8>>2]=e,v)|0);break}else{break}}}while(0);cf(c[10030]|0,158392,(v=i,i=i+8|0,c[v>>2]=a[66164]&1,v)|0);cf(c[10030]|0,158360,(v=i,i=i+8|0,c[v>>2]=a[65476]&1,v)|0);if((a[30528]&1)!=0){e=c[10030]|0;d=a[69604]&1;cf(e|0,158328,(v=i,i=i+8|0,c[v>>2]=d,v)|0)}aI(158192,75,1,c[10030]|0);aI(158112,76,1,c[10030]|0);d=c[10030]|0;if((c[16546]|0)==1){j=+h[8255];cf(d|0,158064,(v=i,i=i+8|0,h[v>>3]=j,v)|0);e=c[10030]|0;j=+h[8256];cf(e|0,157952,(v=i,i=i+8|0,h[v>>3]=j,v)|0);e=c[10030]|0;g=c[8510]|0;do{if((g|0)==0){f=c[8506]|0;if((f|0)==4){k=223560;break}k=(f|0)==5?223536:223520}else{k=g}}while(0);cf(e|0,157896,(v=i,i=i+8|0,c[v>>2]=k,v)|0)}else{aI(157856,30,1,d|0)}aI(86144,2,1,c[10030]|0);if(a[243104]|0){l=c[10030]|0;m=aD(l|0)|0;i=b;return}d=c[60778]|0;cf(c[10030]|0,157664,(v=i,i=i+8|0,c[v>>2]=(d|0)!=0?d:179864,v)|0);if(a[243312]|0){d=c[10030]|0;k=c[60778]|0;e=(k|0)!=0?k:179864;cf(d|0,156600,(v=i,i=i+40|0,c[v>>2]=e,c[v+8>>2]=e,c[v+16>>2]=e,c[v+24>>2]=e,c[v+32>>2]=e,v)|0);e=c[13858]|0;d=e+5|0;if((d-((d|0)%6&-1)|0)>=1){d=1;k=e;do{e=(d|0)%6&-1;if((e|0)==1){g=c[10030]|0;aI(156592,6,1,g|0);n=c[13858]|0}else{n=k}g=c[10030]|0;if((d|0)>(n|0)){aI(156256,28,1,g|0)}else{cf(g|0,156408,(v=i,i=i+16|0,c[v>>2]=d,c[v+8>>2]=d,v)|0)}if((e|0)==0){e=c[10030]|0;aI(156248,7,1,e|0)}d=d+1|0;k=c[13858]|0;e=k+5|0;}while((d|0)<=(e-((e|0)%6&-1)|0))}d=c[10030]|0;aI(156152,72,1,d|0);d=c[10030]|0;aI(155832,262,1,d|0);if((c[17261]&3|0)!=0){d=c[10030]|0;aI(155680,105,1,d|0)}if((c[17089]&3|0)!=0){d=c[10030]|0;aI(155568,105,1,d|0)}d=c[10030]|0;aI(155536,28,1,d|0);d=c[10030]|0;aI(155504,10,1,d|0)}d=c[3524]|0;k=~~(+((c[d+12>>2]|0)>>>0>>>0)/10.0);cf(c[10030]|0,155296,(v=i,i=i+16|0,c[v>>2]=~~(+((c[d+8>>2]|0)>>>0>>>0)/10.0),c[v+8>>2]=k,v)|0);if(a[243312]|0){k=c[10030]|0;aI(155248,19,1,k|0)}aI(155168,24,1,c[10030]|0);l=c[10030]|0;m=aD(l|0)|0;i=b;return}function mK(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0;b=i;c[13864]=-5;c[13840]=0;a[55472]=0;c[13842]=-1;a[55390]=0;a[55408]=0;uD(55372,163848,17);c[13858]=0;d=c[60778]|0;if((d|0)==0){e=bP(221464)|0;c[60778]=e;f=e}else{f=d}d=uA(f|0)|0;do{if((a[f]|0)!=0){if((a[f+(d-1|0)|0]|0)==47){break}e=db(f,d+2|0,221440)|0;c[60778]=e;g=e+(uA(e|0)|0)|0;w=47;a[g]=w&255;w=w>>8;a[g+1|0]=w&255}}while(0);d=c[10030]|0;if(a[243104]|0){f=c[60826]|0;cf(d|0,161488,(v=i,i=i+16|0,c[v>>2]=f,c[v+8>>2]=f,v)|0);f=c[10030]|0;g=c[60826]|0;e=(a[30528]&1)!=0?225e3:224992;j=c[3524]|0;k=~~(+((c[j+8>>2]|0)>>>0>>>0)/10.0);l=~~(+((c[j+12>>2]|0)>>>0>>>0)/10.0);cf(f|0,160752,(v=i,i=i+64|0,c[v>>2]=g,c[v+8>>2]=g,c[v+16>>2]=g,c[v+24>>2]=g,c[v+32>>2]=g,c[v+40>>2]=e,c[v+48>>2]=k,c[v+56>>2]=l,v)|0)}else{l=c[60774]|0;k=(l|0)!=0?l:162656;cf(d|0,162680,(v=i,i=i+8|0,c[v>>2]=k,v)|0);k=c[11252]|0;if((k|0)==15|(k|0)==0){d=c[10030]|0;aI(162584,68,1,d|0);m=c[11252]|0}else{m=k}k=c[10030]|0;d=c[60778]|0;l=(m|0)==15?162360:162344;cf(k|0,162424,(v=i,i=i+24|0,c[v>>2]=d,c[v+8>>2]=l,c[v+16>>2]=d,v)|0);if(a[55512]|0){d=c[10030]|0;l=c[60778]|0;cf(d|0,162272,(v=i,i=i+8|0,c[v>>2]=l,v)|0)}l=c[10030]|0;if(a[243312]|0){d=c[60778]|0;cf(l|0,162144,(v=i,i=i+8|0,c[v>>2]=d,v)|0);d=c[10030]|0;k=c[60778]|0;cf(d|0,162048,(v=i,i=i+8|0,c[v>>2]=k,v)|0)}else{aI(161928,70,1,l|0)}l=c[10030]|0;aI(161664,257,1,l|0)}cf(c[10030]|0,160720,(v=i,i=i+16|0,c[v>>2]=40152,c[v+8>>2]=40160,v)|0);aI(159864,807,1,c[10030]|0);if(a[55512]|0){l=c[10030]|0;k=~~(+h[6938]*200.0);cf(l|0,159832,(v=i,i=i+8|0,c[v>>2]=k,v)|0)}k=a[55440]|0;cf(c[10030]|0,159776,(v=i,i=i+16|0,c[v>>2]=k?131936:137232,c[v+8>>2]=k?131936:75184,v)|0);if((a[243424]|0)==0){n=c[10030]|0;o=+h[6931];p=cf(n|0,159584,(v=i,i=i+8|0,h[v>>3]=o,v)|0)|0;i=b;return}k=c[3524]|0;l=~~(+((c[k+8>>2]|0)>>>0>>>0)/10.0);d=~~(+((c[k+12>>2]|0)>>>0>>>0)/10.0);cf(c[10030]|0,159696,(v=i,i=i+24|0,c[v>>2]=243424,c[v+8>>2]=l,c[v+16>>2]=d,v)|0);n=c[10030]|0;o=+h[6931];p=cf(n|0,159584,(v=i,i=i+8|0,h[v>>3]=o,v)|0)|0;i=b;return}function mL(b,d){b=b|0;d=d|0;var e=0,f=0;e=i;f=a[55472]|0;if(f&(c[13838]|0)==(b|0)&(c[13834]|0)==(d|0)){i=e;return}if(!f){f=c[10030]|0;aI(162736,17,1,f|0);a[55472]=1;a[72328]=0}f=(c[13832]|0)-d|0;cf(c[10030]|0,162768,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=f,v)|0);c[13838]=b;c[13834]=d;i=e;return}function mM(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;f=c[13838]|0;g=c[13834]|0;if((f|0)==(b|0)&(g|0)==(d|0)){i=e;return}if(!(a[55472]|0)){h=c[10030]|0;aI(162736,17,1,h|0);a[55472]=1;a[72328]=0;h=c[10030]|0;j=(c[13832]|0)-g|0;cf(h|0,162768,(v=i,i=i+16|0,c[v>>2]=f,c[v+8>>2]=j,v)|0);c[13838]=f;c[13834]=g}g=(c[13832]|0)-d|0;cf(c[10030]|0,162808,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=g,v)|0);c[13838]=b;c[13834]=d;i=e;return}function mN(b){b=b|0;var d=0,e=0,f=0;d=i;if((c[13864]|0)==(b|0)){i=d;return}c[13864]=b;if(a[55472]|0){e=c[10030]|0;aI(165112,14,1,e|0);if(!(a[72328]|0)){e=c[10030]|0;aI(165528,17,1,e|0)}a[55472]=0;a[72328]=1}if((b|0)>13){f=(b|0)%14&-1}else{f=b}b=(f|0)>-3;e=b?f:-3;if(b|(a[243424]|0)==0){b=c[243320+(e+3<<2)>>2]|0;uB(55372,b|0)}else{uB(55372,243424)}if((aY(55372,55390)|0)!=0){b=c[10030]|0;cf(b|0,164320,(v=i,i=i+8|0,c[v>>2]=55372,v)|0);uB(55390,55372)}if(!(a[55512]|0)){i=d;return}if((e-1|0)>>>0<4){b=c[10030]|0;f=e+1|0;cf(b|0,162968,(v=i,i=i+8|0,c[v>>2]=f,v)|0);i=d;return}f=c[10030]|0;if((e|0)==-1){aI(162920,26,1,f|0);i=d;return}else{aI(164808,19,1,f|0);i=d;return}}function mO(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0.0,m=0;f=i;if((e|0)==0){i=f;return}if((a[e]|0)==0){i=f;return}if(a[55472]|0){g=c[10030]|0;aI(165112,14,1,g|0);if(!(a[72328]|0)){g=c[10030]|0;aI(165528,17,1,g|0)}a[55472]=0;a[72328]=1}g=c[13840]|0;j=c[10030]|0;k=~~(+(c[13832]|0)+50.0- +(d>>>0>>>0));l=+h[6936]*+h[6935];d=c[13866]|0;if((g|0)==0){cf(j|0,164024,(v=i,i=i+32|0,c[v>>2]=b,c[v+8>>2]=k,h[v+16>>3]=l,c[v+24>>2]=d,v)|0)}else{cf(j|0,164152,(v=i,i=i+40|0,c[v>>2]=b,c[v+8>>2]=k,c[v+16>>2]=g,h[v+24>>3]=l,c[v+32>>2]=d,v)|0)}d=e;g=a[e]|0;do{if((g<<24>>24|0)==34|(g<<24>>24|0)==92){e=c[10030]|0;aF(92,e|0);m=a[d]|0}else{m=g}d=d+1|0;aF(m<<24>>24|0,c[10030]|0);g=a[d]|0;}while(g<<24>>24!=0);aI(163984,4,1,c[10030]|0);i=f;return}function mP(a){a=a|0;if((a|0)==2){c[13866]=164216}else if((a|0)==1){c[13866]=173184}else{c[13866]=179864}return 1}function mQ(a){a=a|0;return 0}function mR(a){a=+a;h[30390]=a<0.0?1.0:a;return}function mS(b,d,e,f,g,i){b=b|0;d=+d;e=+e;f=f|0;g=g|0;i=i|0;if((i|0)==3){c[59636]=c[13838];c[59634]=c[13834];return}else if((i|0)==4){c[13838]=c[59636];c[13834]=c[59634];return}else{if(a[238512]|0){return}a[238512]=1;c[11232]=43856;h[29815]=d;h[29816]=e*10.0;a[238496]=g&1;a[238480]=f&1;a[238504]=(i|0)!=0&1;return}}function mT(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0.0,j=0;f=i;g=+h[30390]*.6*100.0;j=(e|0)%9&-1;if(g<=0.0&(j|0)>-1){i=f;return}if(a[55472]|0){e=c[10030]|0;aI(165112,14,1,e|0);if(!(a[72328]|0)){e=c[10030]|0;aI(165528,17,1,e|0)}a[55472]=0;a[72328]=1}do{if((j|0)==4|(j|0)==6|(j|0)==8){if((aY(55408,55372)|0)==0){break}e=c[10030]|0;cf(e|0,164776,(v=i,i=i+8|0,c[v>>2]=55372,v)|0);uB(55408,55372)}else if(!((j|0)==0|(j|0)==1|(j|0)==2|(j|0)==3|(j|0)==5|(j|0)==7)){e=(c[13832]|0)-d|0;cf(c[10030]|0,164256,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=e,v)|0);i=f;return}}while(0);e=(c[13832]|0)-d|0;cf(c[10030]|0,164232,(v=i,i=i+32|0,c[v>>2]=j,c[v+8>>2]=b,c[v+16>>2]=e,h[v+24>>3]=g,v)|0);i=f;return}function mU(b){b=b|0;var d=0,e=0,f=0,g=0.0,j=0,k=0.0;d=i;do{if((b|0)==0){e=12072}else{if((a[b]|0)==0){e=12072;break}f=bk(b|0,148464)|0;if((a[b+f|0]|0)!=44){g=+h[6936];break}j=b+(f+1|0)|0;ca(j|0,148448,(v=i,i=i+8|0,c[v>>2]=55488,v)|0);k=+h[6936];if(k>0.0){g=k;break}k=+h[30427];h[6936]=k;g=k}}while(0);if((e|0)==12072){k=+h[30427];h[6936]=k;g=k}c[(c[3524]|0)+16>>2]=~~(g*+h[6935]*10.0);c[(c[3524]|0)+20>>2]=~~(+h[6936]*+h[6935]*.8*10.0);i=d;return 1}function mV(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;h=i;tW(b);if(a[55512]|0){b=c[10030]|0;aI(164808,19,1,b|0);c[13864]=-5}if((aY(55408,243392)|0)!=0){b=c[10030]|0;cf(b|0,164776,(v=i,i=i+8|0,c[v>>2]=243392,v)|0);uB(55408,243392)}b=(c[13832]|0)-(g+e|0)|0;cf(c[10030]|0,164272,(v=i,i=i+32|0,c[v>>2]=d,c[v+8>>2]=b,c[v+16>>2]=f,c[v+24>>2]=g,v)|0);i=h;return}function mW(b){b=+b;var d=0,e=0;d=i;if(a[55472]|0){e=c[10030]|0;aI(165112,14,1,e|0);if(!(a[72328]|0)){e=c[10030]|0;aI(165528,17,1,e|0)}a[55472]=0;a[72328]=1}if(+(c[13842]|0)==b){i=d;return}cf(c[10030]|0,164296,(v=i,i=i+8|0,h[v>>3]=+h[6931]*b,v)|0);c[13842]=~~b;i=d;return}function mX(b){b=b|0;var e=0,f=0,g=0;e=i;i=i+8|0;f=e|0;g=c[b>>2]|0;if((g|0)==5){fr(+h[b+8>>3],f)}else if((g|0)==1){mN(c[b+4>>2]|0);i=e;return}else if((g|0)==3){g=c[b+4>>2]|0;a[f|0]=g>>>16&255;a[f+1|0]=g>>>8&255;a[f+2|0]=g&255}else{i=e;return}if(a[55472]|0){g=c[10030]|0;aI(165112,14,1,g|0);if(!(a[72328]|0)){g=c[10030]|0;aI(165528,17,1,g|0)}a[55472]=0;a[72328]=1}g=d[f+1|0]|0;b=d[f+2|0]|0;be(55372,164384,(v=i,i=i+24|0,c[v>>2]=d[f|0]|0,c[v+8>>2]=g,c[v+16>>2]=b,v)|0);if((aY(55372,55390)|0)!=0){b=c[10030]|0;cf(b|0,164320,(v=i,i=i+8|0,c[v>>2]=55372,v)|0);uB(55390,55372)}c[13864]=-5;i=e;return}function mY(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;if(a[55472]|0){f=c[10030]|0;aI(165112,14,1,f|0);if(!(a[72328]|0)){f=c[10030]|0;aI(165528,17,1,f|0)}a[55472]=0;a[72328]=1}if(a[55512]|0){f=c[10030]|0;aI(164808,19,1,f|0);c[13864]=-5}f=d+8|0;g=c[f>>2]|0;do{if(!((g|0)==1601|(g|0)==3)){tW(g);if((aY(55408,243392)|0)==0){break}h=c[10030]|0;cf(h|0,164776,(v=i,i=i+8|0,c[v>>2]=243392,v)|0);uB(55408,243392)}}while(0);g=(c[13832]|0)-(c[d+4>>2]|0)|0;cf(c[10030]|0,164760,(v=i,i=i+16|0,c[v>>2]=c[d>>2],c[v+8>>2]=g,v)|0);if((b|0)>1){g=1;do{h=(c[13832]|0)-(c[d+(g*12&-1)+4>>2]|0)|0;cf(c[10030]|0,164744,(v=i,i=i+16|0,c[v>>2]=c[d+(g*12&-1)>>2],c[v+8>>2]=h,v)|0);g=g+1|0;}while((g|0)<(b|0))}b=c[f>>2]|0;if((b|0)==1601|(b|0)==3){b=c[10030]|0;aI(164680,8,1,b|0);i=e;return}else{b=c[10030]|0;aI(164736,7,1,b|0);i=e;return}}function mZ(){var b=0.0,d=0,e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0.0;if(!(a[238512]|0)){return}a[238512]=0;a[c[11232]|0]=0;b=+h[6936];d=c[13838]|0;e=c[13834]|0;f=43856+(uA(43856)|0)|0;g=a[43856]|0;L16425:do{if(g<<24>>24==0){i=0}else{j=(c[11252]|0)==15;k=0;l=43856;m=g;while(1){n=m<<24>>24;if((n&128|0)==0){do{if((aZ(165104,n|0,5)|0)==0){if((aZ(165088,n|0,9)|0)!=0){o=k+10|0;break}if((aZ(165080,n|0,4)|0)!=0){o=k+12|0;break}if((aZ(165072,n|0,8)|0)!=0){o=k+14|0;break}if((aZ(165032,n|0,15)|0)!=0){o=k+16|0;break}if((aZ(165008,n|0,18)|0)!=0){o=k+18|0;break}if((aZ(164944,n|0,10)|0)!=0){o=k+24|0;break}if((aZ(164840,n|0,2)|0)==0){o=k+20|0;break}else{o=k+30|0;break}}else{o=k+8|0}}while(0);p=l+1|0;q=o}else{do{if(j){if((n&224|0)==192){r=l+2|0;break}if((n&240|0)==224){r=l+3|0;break}else{r=l+4|0;break}}else{r=l+1|0}}while(0);n=k+18|0;if(r>>>0>f>>>0){i=n;break L16425}else{p=r;q=n}}n=a[p]|0;if(n<<24>>24==0){i=q;break}else{k=q;l=p;m=n}}}}while(0);s=+h[29815];t=s*+(i|0)*10.0/25.0;h[6936]=s;s=+(c[13840]|0)*1.5707963267948966/90.0;u=+T(+s);v=+h[29816];i=~~(+(d|0)+u*v);d=~~(+(e|0)+v*+S(+s));do{if((a[238496]&1)!=0){if(a[238488]|0){break}mO(i,d,43856)}}while(0);do{if((a[238504]&1)==0){if((a[238480]&1)==0){break}s=+(c[13840]|0)*1.5707963267948966/90.0;v=t*+S(+s);c[13838]=~~(v+ +(c[13838]|0));v=t*+T(+s);c[13834]=~~(+(c[13834]|0)-v)}else{v=+(c[13840]|0)*1.5707963267948966/90.0;s=t*+S(+v)*.5;c[13838]=~~(+(c[13838]|0)+s);s=t*+T(+v)*.5;c[13834]=~~(+(c[13834]|0)-s)}}while(0);h[6936]=b;return}function m_(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=c[60826]|0;f=(e|0)!=0?e:165512;if((b|0)==0|(b|0)==10){c[13858]=0;i=d;return}else if((b|0)==6){e=(c[13858]|0)+1|0;c[13858]=e;if(a[55472]|0){g=c[10030]|0;aI(165112,14,1,g|0);if(!(a[72328]|0)){g=c[10030]|0;aI(165528,17,1,g|0)}a[55472]=0;a[72328]=1;h=c[13858]|0}else{h=e}cf(c[10030]|0,165424,(v=i,i=i+32|0,c[v>>2]=f,c[v+8>>2]=h,c[v+16>>2]=f,c[v+24>>2]=h,v)|0);i=d;return}else if((b|0)==7){if(a[55472]|0){h=c[10030]|0;aI(165112,14,1,h|0);if(!(a[72328]|0)){h=c[10030]|0;aI(165528,17,1,h|0)}a[55472]=0;a[72328]=1}h=c[13858]|0;cf(c[10030]|0,165376,(v=i,i=i+16|0,c[v>>2]=f,c[v+8>>2]=h,v)|0);c[13864]=-5;c[13842]=-1;a[55390]=0;a[55408]=0;i=d;return}else if((b|0)==3){aI(165224,94,1,c[10030]|0);i=d;return}else if((b|0)==4){aI(165160,43,1,c[10030]|0);i=d;return}else{i=d;return}}function m$(b){b=b|0;if((b|0)!=1){return}aI(165528,17,1,c[10030]|0);a[72328]=1;return}function m0(){var b=0,d=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0.0,Y=0.0,Z=0,_=0,$=0,ab=0.0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0.0,ao=0;b=i;i=i+120|0;d=b|0;f=b+24|0;g=b+48|0;j=b+72|0;k=b+96|0;l=b+104|0;m=b+112|0;if((c[13898]|0)==2){n=2}else{tV();n=c[13898]|0}o=c[8272]|0;L16513:do{if((n|0)<(o|0)){p=d|0;q=d+8|0;r=f|0;s=f+8|0;t=j|0;u=j+8|0;w=g|0;x=g+8|0;y=n;z=o;L16515:while(1){A=c[1054]|0;B=a[A+(y*40&-1)|0]|0;C=(B&1)==0;L16517:do{if(!C){D=c[A+(y*40&-1)+36>>2]|0;E=A+(y*40&-1)+32|0;F=c[10036]|0;G=0;while(1){if((G|0)>=(D|0)){break}if((a[F+((c[E>>2]|0)+G|0)|0]|0)==(a[G+103664|0]|0)){G=G+1|0}else{break L16517}}if((G|0)==1){break L16513}}}while(0);E=c[60494]|0;L16524:do{if((E|0)==0){H=241976}else{F=c[A+(y*40&-1)+36>>2]|0;D=c[A+(y*40&-1)+32>>2]|0;I=(F|0)>0;J=c[10036]|0;K=241976;L=E;while(1){L16528:do{if(!C){if(I){M=0;N=0;O=D;while(1){P=a[L+M|0]|0;if(P<<24>>24==(a[J+(M+O|0)|0]|0)){Q=O;R=N}else{if(P<<24>>24!=36){break L16528}Q=O-1|0;R=1}S=M+1|0;if((S|0)<(R+F|0)){M=S;N=R;O=Q}else{break}}if((R|0)==0){T=S}else{H=K;break L16524}}else{T=0}O=a[L+T|0]|0;if((O<<24>>24|0)==36|(O<<24>>24|0)==0){H=K;break L16524}}}while(0);O=K+8|0;N=c[O>>2]|0;if((N|0)==0){H=O;break}else{K=O;L=N}}}}while(0);E=c[H+4>>2]|0;L16541:do{if((E|0)==12){c[13898]=y+1;L=hK()|0;c[13828]=L;if((c[13554]|0)==0){c[13554]=1;K=ut(16)|0;if((K|0)==0){gk();F=ut(16)|0;if((F|0)==0){U=12256;break L16515}else{V=F}}else{V=K}K=V;c[13550]=K;c[K>>2]=0;W=c[13828]|0}else{W=L}c[(c[13550]|0)+4>>2]=W>>>16&255;c[(c[13550]|0)+8>>2]=(c[13828]|0)>>>8&255;c[(c[13550]|0)+12>>2]=c[13828]&255}else if((E|0)==7){a[54576]=0;c[13898]=y+1}else if((E|0)==8){a[54576]=1;c[13898]=y+1}else if((E|0)==1){a[54400]=0;c[13898]=y+1}else if((E|0)==4){a[54472]=0;L=(c[3524]|0)+96|0;c[L>>2]=c[L>>2]&-1025;c[13898]=(c[13898]|0)+1}else if((E|0)==0){a[54400]=1;c[13898]=y+1}else if((E|0)==5){a[54336]=0;c[13898]=y+1}else if((E|0)==9){L=y+1|0;c[13898]=L;if((L|0)>=(z|0)){break}L16557:do{if((a[A+(L*40&-1)|0]&1)!=0){K=c[A+(L*40&-1)+36>>2]|0;F=A+(L*40&-1)+32|0;J=c[10036]|0;D=0;while(1){if((D|0)>=(K|0)){break}if((a[J+((c[F>>2]|0)+D|0)|0]|0)==(a[D+103664|0]|0)){D=D+1|0}else{break L16557}}if((D|0)==1){break L16541}}}while(0);L=is(j)|0;F=c[L>>2]|0;if((F|0)==2){X=+h[L+8>>3]}else if((F|0)==3){X=+uz(c[L+8>>2]|0,0)}else if((F|0)==1){X=+(c[L+8>>2]|0)}else{U=12233;break L16515}if((c[t>>2]|0)==3){uu(c[u>>2]|0);c[t>>2]=1}L=~~X;c[13622]=L;if(!((L|0)==0|L>>>0>1e4)){break}uh(c[13898]|0,166032,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);c[13622]=1}else if((E|0)==2){tV();c[13898]=(c[13898]|0)+1}else if((E|0)==10){L=y+1|0;c[13898]=L;if((L|0)>=(z|0)){break}L16666:do{if((a[A+(L*40&-1)|0]&1)!=0){F=c[A+(L*40&-1)+36>>2]|0;J=A+(L*40&-1)+32|0;K=c[10036]|0;I=0;while(1){if((I|0)>=(F|0)){break}if((a[K+((c[J>>2]|0)+I|0)|0]|0)==(a[I+103664|0]|0)){I=I+1|0}else{break L16666}}if((I|0)==1){break L16541}}}while(0);L=is(g)|0;J=c[L>>2]|0;if((J|0)==2){Y=+h[L+8>>3]}else if((J|0)==1){Y=+(c[L+8>>2]|0)}else if((J|0)==3){Y=+uz(c[L+8>>2]|0,0)}else{U=12248;break L16515}if((c[w>>2]|0)==3){uu(c[x>>2]|0);c[w>>2]=1}L=~~Y;c[13604]=L;if(L>>>0<=1e4){break}uh(c[13898]|0,166008,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);c[13604]=432}else if((E|0)==6){a[54336]=1;c[13898]=y+1}else if((E|0)==11){a[54424]=1;c[13898]=y+1}else if((E|0)==3){a[54472]=1;L=(c[3524]|0)+96|0;c[L>>2]=c[L>>2]|1024;c[13898]=(c[13898]|0)+1}else{L=c[10036]|0;J=c[A+(y*40&-1)+32>>2]|0;K=L+J|0;if((a[K]|0)==120){if((ca(K|0,165992,(v=i,i=i+24|0,c[v>>2]=k,c[v+8>>2]=l,c[v+16>>2]=m,v)|0)|0)!=3){U=12261;break L16515}K=c[13554]|0;F=c[13552]|0;if((K|0)<(F|0)){Z=K}else{K=(F<<1)+4|0;c[13552]=K;F=db(c[13550]|0,K*12&-1|4,167368)|0;c[13550]=F;c[F>>2]=0;Z=c[13554]|0}c[(c[13550]|0)+((Z*3&-1)+1<<2)>>2]=e[k>>1]|0;c[(c[13550]|0)+(((c[13554]|0)*3&-1)+2<<2)>>2]=e[l>>1]|0;c[(c[13550]|0)+(((c[13554]|0)*3&-1)+3<<2)>>2]=e[m>>1]|0;c[13554]=(c[13554]|0)+1;c[13898]=(c[13898]|0)+1;break}L16582:do{if((z|0)<=(y|0)|C){_=y;$=B}else{F=c[A+(y*40&-1)+36>>2]|0;K=0;while(1){if((K|0)>=(F|0)){break}if((a[L+(J+K|0)|0]|0)==(a[K+124352|0]|0)){K=K+1|0}else{_=y;$=B;break L16582}}if((K|0)!=4){_=y;$=B;break}F=y+1|0;c[13898]=F;_=F;$=a[A+(F*40&-1)|0]|0}}while(0);J=($&1)==0;if(J){U=12273}else{F=a[L+(c[A+(_*40&-1)+32>>2]|0)|0]|0;if(!((F<<24>>24|0)==39|(F<<24>>24|0)==34)){U=12273}}L16592:do{if((U|0)==12273){U=0;F=c[10810]|0;L16594:do{if((F|0)!=0){I=A+(_*40&-1)+36|0;D=A+(_*40&-1)+32|0;G=F;L16596:while(1){N=c[G+4>>2]|0;L16598:do{if(!((z|0)<=(_|0)|J)){O=c[I>>2]|0;M=0;while(1){if((M|0)>=(O|0)){break}if((a[L+((c[D>>2]|0)+M|0)|0]|0)==(a[N+M|0]|0)){M=M+1|0}else{break L16598}}if((a[N+M|0]|0)==0){break L16596}}}while(0);N=c[G>>2]|0;if((N|0)==0){break L16594}else{G=N}}if((a[G+8|0]&1)!=0){break}if((c[G+16>>2]|0)==3){break L16592}}}while(0);F=is(d)|0;K=c[F>>2]|0;if((K|0)==2){ab=+h[F+8>>3]}else if((K|0)==3){ab=+uz(c[F+8>>2]|0,0)}else if((K|0)==1){ab=+(c[F+8>>2]|0)}else{U=12321;break L16515}if((c[p>>2]|0)==3){uu(c[q>>2]|0);c[p>>2]=1}c[13628]=~~ab;break L16541}}while(0);L16617:do{if((_|0)<(z|0)){L16619:do{if(!J){F=c[A+(_*40&-1)+36>>2]|0;K=A+(_*40&-1)+32|0;D=0;while(1){if((D|0)>=(F|0)){break}if((a[L+((c[K>>2]|0)+D|0)|0]|0)==(a[D+103664|0]|0)){D=D+1|0}else{break L16619}}if((D|0)==1){ac=0;break L16617}}}while(0);a[14176]=1;is(f);a[14176]=0;if((c[r>>2]|0)==3){ac=c[s>>2]|0;break}else{c[13898]=_;ac=0;break}}else{ac=0}}while(0);L=a8(ac|0,44)|0;do{if((L|0)!=0){if((ca(L+1|0,21e4,(v=i,i=i+8|0,c[v>>2]=54512,v)|0)|0)!=1){break}a[L]=0}}while(0);L16634:do{if((a[ac]|0)==0){L=uA(54528)|0;J=c[13630]|0;K=c[J>>2]|0;if((K|0)==0){ad=J;U=12305;break}else{ae=0;af=K}while(1){if((uA(af|0)|0)==(L|0)){if((uJ(54528,af|0,L|0)|0)==0){ag=ae;ah=J;U=12304;break L16634}}K=ae+1|0;F=c[J+(K<<4)>>2]|0;if((F|0)==0){ad=J;U=12305;break}else{ae=K;af=F}}}else{J=uA(ac|0)|0;L=c[13630]|0;F=c[L>>2]|0;if((F|0)==0){ad=L;U=12305;break}else{ai=0;aj=F}while(1){if((uA(aj|0)|0)==(J|0)){if((uJ(ac|0,aj|0,J|0)|0)==0){ag=ai;ah=L;U=12304;break L16634}}F=ai+1|0;K=c[L+(F<<4)>>2]|0;if((K|0)==0){ad=L;U=12305;break}else{ai=F;aj=K}}}}while(0);do{if((U|0)==12304){U=0;if((ag|0)==-1){ad=ah;U=12305;break}uu(ac);ak=ag;al=c[13630]|0}}while(0);if((U|0)==12305){U=0;L=0;while(1){if((c[ad+(L<<4)>>2]|0)==0){break}else{L=L+1|0}}J=(L<<4)+32|0;K=ut(J)|0;if((K|0)==0){gk();F=ut(J)|0;if((F|0)==0){U=12309;break L16515}else{am=F}}else{am=K}K=am;c[am>>2]=ac;h[am+8>>3]=1.0;if((L|0)>=0){F=c[13630]|0;J=0;while(1){G=J+1|0;I=K+(G<<4)|0;N=F+(J<<4)|0;c[I>>2]=c[N>>2];c[I+4>>2]=c[N+4>>2];c[I+8>>2]=c[N+8>>2];c[I+12>>2]=c[N+12>>2];if((G|0)>(L|0)){break}else{J=G}}}c[13630]=K;ak=0;al=K}uF(54528,c[al+(ak<<4)>>2]|0,32)}}while(0);y=c[13898]|0;z=c[8272]|0;if((y|0)>=(z|0)){break L16513}}if((U|0)==12321){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((U|0)==12233){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((U|0)==12256){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=167368,v)|0)}else if((U|0)==12248){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((U|0)==12261){uf(c[13898]|0,165952,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((U|0)==12309){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=166248,v)|0)}}}while(0);U=(c[3524]|0)+8|0;if(a[54400]|0){c[U>>2]=23478;c[(c[3524]|0)+12>>2]=32585}else{c[U>>2]=32585;c[(c[3524]|0)+12>>2]=23478}U=uA(54528)|0;ak=c[13630]|0;al=c[ak>>2]|0;L16698:do{if((al|0)==0){an=1.0}else{am=0;ac=al;while(1){if((uA(ac|0)|0)==(U|0)){if((uJ(54528,ac|0,U|0)|0)==0){break}}ad=am+1|0;ag=c[ak+(ad<<4)>>2]|0;if((ag|0)==0){an=1.0;break L16698}else{am=ad;ac=ag}}an=+h[ak+(am<<4)+8>>3]}}while(0);ak=c[3524]|0;c[ak+16>>2]=aa((((c[ak+8>>2]|0)+182|0)>>>0)/((c[13604]|0)>>>0)>>>0,c[13628]|0);ak=c[3524]|0;c[ak+20>>2]=~~(an*+(aa((((c[ak+8>>2]|0)+182|0)>>>0)/((c[13604]|0)>>>0)>>>0,c[13628]|0)>>>0>>>0)*.527);ak=c[13628]|0;be(242752,165944,(v=i,i=i+16|0,c[v>>2]=54528,c[v+8>>2]=ak,v)|0);ak=a[54472]|0?116408:116440;U=a[54336]|0?185368:185408;al=a[54576]|0?131504:131584;ac=a[54424]|0?165816:179864;ag=c[13604]|0;ad=c[13622]|0;ah=c[13628]|0;be(13048,165832,(v=i,i=i+72|0,c[v>>2]=a[54400]|0?78720:78704,c[v+8>>2]=ak,c[v+16>>2]=U,c[v+24>>2]=al,c[v+32>>2]=ac,c[v+40>>2]=ag,c[v+48>>2]=ad,c[v+56>>2]=54528,c[v+64>>2]=ah,v)|0);ah=c[13554]|0;do{if((ah|0)>0){ad=0;ag=ah;while(1){ac=uA(13048)|0;if((ac+9|0)>>>0>=1024){ao=ag;break}al=ad*3&-1;U=c[13550]|0;ak=c[U+(al+2<<2)>>2]|0;aj=c[U+(al+3<<2)>>2]|0;be(ac+13048|0,165744,(v=i,i=i+24|0,c[v>>2]=c[U+(al+1<<2)>>2],c[v+8>>2]=ak,c[v+16>>2]=aj,v)|0);aj=ad+1|0;ak=c[13554]|0;if((aj|0)<(ak|0)){ad=aj;ag=ak}else{ao=ak;break}}if((ao|0)<96){break}i=b;return}}while(0);ao=db(c[13550]|0,1156,167368)|0;c[13550]=ao;c[ao>>2]=0;ao=c[13554]|0;if((ao|0)<96){ah=ao;ag=ao*3&-1;do{c[(c[13550]|0)+(ag+1<<2)>>2]=(c[(c[7642]|0)+(ah<<3)+4>>2]|0)>>>16&255;c[(c[13550]|0)+(ag+2<<2)>>2]=(c[(c[7642]|0)+(ah<<3)+4>>2]|0)>>>8&255;ag=ag+3|0;c[(c[13550]|0)+(ag<<2)>>2]=c[(c[7642]|0)+(ah<<3)+4>>2]&255;ah=ah+1|0;}while((ah|0)<96)}c[13554]=96;i=b;return}function m1(){c[13596]=0;c[13598]=0;uu(c[13602]|0);return}function m2(){var a=0,b=0,d=0,e=0;a=i;c[13596]=0;c[13598]=0;c[13626]=0;h[6804]=0.0;c[13616]=1;c[13617]=1;b=ut(65528)|0;if((b|0)!=0){d=b;e=d;c[13602]=e;i=a;return}gk();b=ut(65528)|0;if((b|0)==0){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=166104,v)|0)}else{d=b;e=d;c[13602]=e;i=a;return}}function m3(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;b=i;i=i+24|0;d=b|0;e=b+8|0;f=b+16|0;g=c[13656]|0;if((g|0)!=0){h=c[13602]|0;tY(4,1,g<<1);L16730:do{if((g|0)>0){j=d;k=d+1|0;l=0;while(1){m=c[h+(l<<2)>>2]|0;if((m|0)<=-32769){n=12355;break}if((m|0)>=32768){n=12357;break}a[j]=m>>>8&255;a[k]=m&255;aI(j|0,1,2,c[10030]|0);l=l+1|0;if((l|0)>=(g|0)){break L16730}}if((n|0)==12357){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}else if((n|0)==12355){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}}}while(0);c[13656]=0}n=f;a[n]=0;a[f+1|0]=-96;aI(n|0,1,2,c[10030]|0);n=e;a[n]=0;a[e+1|0]=64;aI(n|0,1,2,c[10030]|0);i=b;return}function m4(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0.0;b=i;i=i+832|0;d=b|0;e=b+8|0;f=b+16|0;g=b+24|0;j=b+32|0;k=b+40|0;l=b+48|0;m=b+56|0;n=b+64|0;o=b+72|0;p=b+80|0;q=b+88|0;r=b+96|0;s=b+104|0;t=b+112|0;u=b+120|0;w=b+128|0;x=b+136|0;y=b+144|0;z=b+152|0;A=b+160|0;B=b+168|0;C=b+176|0;D=b+184|0;E=b+192|0;F=b+200|0;G=b+208|0;H=b+216|0;I=b+224|0;J=b+232|0;K=b+240|0;L=b+248|0;M=b+256|0;N=b+320|0;O=b+328|0;P=b+336|0;Q=b+344|0;R=b+352|0;S=b+360|0;T=b+368|0;U=b+376|0;V=b+384|0;W=b+392|0;X=b+400|0;Y=b+408|0;Z=b+416|0;_=b+424|0;$=b+432|0;ab=b+440|0;ac=b+448|0;ad=b+456|0;ae=b+464|0;af=b+472|0;ag=b+480|0;ah=b+488|0;ai=b+496|0;aj=b+504|0;ak=b+512|0;al=b+520|0;am=b+784|0;an=c[3524]|0;ao=c[8244]|0;if((ao|0)==0){t_(0,1,1,0)}else{t_(0,1,(uA(ao|0)|0)+1|0,ao)}ao=L;a[ao]=16;a[L+1|0]=34;aI(ao|0,1,2,c[10030]|0);ao=al;L=c[60528]|0;if((L|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((L|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[ao]=L>>>8&255;a[al+1|0]=L&255;aI(ao|0,1,2,c[10030]|0);ao=b+528|0;L=a[54472]|0?0:2;be(ao|0,166264,(v=i,i=i+24|0,c[v>>2]=40152,c[v+8>>2]=40160,c[v+16>>2]=L,v)|0);t_(1,2,uA(ao|0)|0,ao);c[60558]=54;ao=K;a[ao]=17;a[K+1|0]=127;aI(ao|0,1,2,c[10030]|0);ao=J;a[ao]=0;a[J+1|0]=-38;aI(ao|0,1,2,c[10030]|0);ao=ak;J=ak+1|0;ak=0;while(1){K=c[242232+(ak<<2)>>2]|0;if((K|0)<=-32769){ap=12370;break}if((K|0)>=32768){ap=12372;break}a[ao]=K>>>8&255;a[J]=K&255;aI(ao|0,1,2,c[10030]|0);K=ak+1|0;if((K|0)<109){ak=K}else{ap=12374;break}}if((ap|0)==12374){ak=I;a[ak]=16;a[I+1|0]=98;I=c[10030]|0;aI(ak|0,1,2,I|0);I=aj;ak=c[60530]|0;if((ak|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((ak|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[I]=ak>>>8&255;a[aj+1|0]=ak&255;ak=c[10030]|0;aI(I|0,1,2,ak|0);ak=H;a[ak]=16;a[H+1|0]=-126;H=c[10030]|0;aI(ak|0,1,2,H|0);H=ai;ak=c[60552]|0;if((ak|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((ak|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[H]=ak>>>8&255;a[ai+1|0]=ak&255;ak=c[10030]|0;aI(H|0,1,2,ak|0);ak=G;a[ak]=16;a[G+1|0]=-90;G=c[10030]|0;aI(ak|0,1,2,G|0);G=ah;ak=ah+1|0;ah=c[60540]|0;if((ah|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((ah|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[G]=ah>>>8&255;a[ak]=ah&255;ah=c[10030]|0;aI(G|0,1,2,ah|0);ah=c[60541]|0;if((ah|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((ah|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[G]=ah>>>8&255;a[ak]=ah&255;ah=c[10030]|0;aI(G|0,1,2,ah|0);ah=c[60542]|0;if((ah|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((ah|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[G]=ah>>>8&255;a[ak]=ah&255;ah=c[10030]|0;aI(G|0,1,2,ah|0);ah=F;a[ah]=16;a[F+1|0]=-62;F=c[10030]|0;aI(ah|0,1,2,F|0);F=ag;ah=c[60554]|0;if((ah|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((ah|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[F]=ah>>>8&255;a[ag+1|0]=ah&255;ah=c[10030]|0;aI(F|0,1,2,ah|0);ah=E;a[ah]=16;a[E+1|0]=-30;E=c[10030]|0;aI(ah|0,1,2,E|0);E=af;ah=c[60678]|0;if((ah|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((ah|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[E]=ah>>>8&255;a[af+1|0]=ah&255;ah=c[10030]|0;aI(E|0,1,2,ah|0);ah=D;a[ah]=17;a[D+1|0]=2;D=c[10030]|0;aI(ah|0,1,2,D|0);D=ae;ah=c[60680]|0;if((ah|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((ah|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[D]=ah>>>8&255;a[ae+1|0]=ah&255;ah=c[10030]|0;aI(D|0,1,2,ah|0);ah=C;a[ah]=17;a[C+1|0]=34;C=c[10030]|0;aI(ah|0,1,2,C|0);C=ad;ah=c[13620]|0;if((ah|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((ah|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[C]=ah>>>8&255;a[ad+1|0]=ah&255;ah=c[10030]|0;aI(C|0,1,2,ah|0);ah=B;a[ah]=17;a[B+1|0]=76;B=c[10030]|0;aI(ah|0,1,2,B|0);B=ac;ah=ac+1|0;ac=c[60670]|0;if((ac|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((ac|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[B]=ac>>>8&255;a[ah]=ac&255;ac=c[10030]|0;aI(B|0,1,2,ac|0);ac=c[60671]|0;if((ac|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((ac|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[B]=ac>>>8&255;a[ah]=ac&255;ac=c[10030]|0;aI(B|0,1,2,ac|0);ac=c[60672]|0;if((ac|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((ac|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[B]=ac>>>8&255;a[ah]=ac&255;ac=c[10030]|0;aI(B|0,1,2,ac|0);ac=c[60673]|0;if((ac|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((ac|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[B]=ac>>>8&255;a[ah]=ac&255;ac=c[10030]|0;aI(B|0,1,2,ac|0);ac=c[60674]|0;if((ac|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((ac|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[B]=ac>>>8&255;a[ah]=ac&255;ac=c[10030]|0;aI(B|0,1,2,ac|0);ac=c[60675]|0;if((ac|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((ac|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[B]=ac>>>8&255;a[ah]=ac&255;ac=c[10030]|0;aI(B|0,1,2,ac|0);if(!(a[54424]|0)){ac=c[13630]|0;B=c[ac>>2]|0;if((B|0)==0){aq=0}else{ah=0;C=0;ad=B;while(1){B=(C+1|0)+(uA(ad|0)|0)|0;D=ah+1|0;ae=c[ac+(D<<4)>>2]|0;if((ae|0)==0){aq=B;break}else{ah=D;C=B;ad=ae}}}ad=aq+1|0;C=ut(ad)|0;do{if((C|0)==0){gk();ah=ut(ad)|0;if((ah|0)!=0){ar=ah;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=166248,v)|0)}else{ar=C}}while(0);C=c[c[13630]>>2]|0;if((C|0)!=0){ad=0;ah=ar;ac=C;while(1){C=uA(ac|0)|0;a[ah]=C&255;uB(ah+1|0,c[(c[13630]|0)+(ad<<4)>>2]|0);ae=ad+1|0;B=c[(c[13630]|0)+(ae<<4)>>2]|0;if((B|0)==0){break}else{ad=ae;ah=ah+(C+1|0)|0;ac=B}}}ac=aq&1;tY(1,13,aq);ah=c[10030]|0;aI(ar|0,1,aq|0,ah|0);if((ac|0)!=0){ac=c[10030]|0;ah=a[241912]|0;aF(ah|0,ac|0)}uu(ar)}ar=A;a[ar]=0;a[A+1|0]=105;A=c[10030]|0;aI(ar|0,1,2,A|0);A=c[10030]|0;aF(8,A|0);A=c[10030]|0;aI(166208,1,8,A|0);A=c[10030]|0;ar=a[241896]|0;aF(ar|0,A|0);A=z;a[A]=32;a[z+1|0]=38;z=c[10030]|0;aI(A|0,1,2,z|0);z=ab;A=ab+1|0;ab=c[60536]|0;if((ab|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((ab|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[z]=ab>>>8&255;a[A]=ab&255;ab=c[10030]|0;aI(z|0,1,2,ab|0);ab=c[60537]|0;if((ab|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((ab|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[z]=ab>>>8&255;a[A]=ab&255;ab=c[10030]|0;aI(z|0,1,2,ab|0);ab=c[60538]|0;if((ab|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((ab|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[z]=ab>>>8&255;a[A]=ab&255;ab=c[10030]|0;aI(z|0,1,2,ab|0);ab=y;a[ab]=32;a[y+1|0]=66;y=c[10030]|0;aI(ab|0,1,2,y|0);y=$;ab=c[60676]|0;if((ab|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((ab|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[y]=ab>>>8&255;a[$+1|0]=ab&255;ab=c[10030]|0;aI(y|0,1,2,ab|0);ab=x;a[ab]=32;a[x+1|0]=98;x=c[10030]|0;aI(ab|0,1,2,x|0);x=_;ab=c[60546]|0;if((ab|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((ab|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[x]=ab>>>8&255;a[_+1|0]=ab&255;ab=c[10030]|0;aI(x|0,1,2,ab|0);ab=w;a[ab]=32;a[w+1|0]=-126;w=c[10030]|0;aI(ab|0,1,2,w|0);w=Z;ab=c[60544]|0;if((ab|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((ab|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[w]=ab>>>8&255;a[Z+1|0]=ab&255;ab=c[10030]|0;aI(w|0,1,2,ab|0);ab=u;a[ab]=32;a[u+1|0]=-94;u=c[10030]|0;aI(ab|0,1,2,u|0);u=Y;ab=c[60668]|0;if((ab|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((ab|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[u]=ab>>>8&255;a[Y+1|0]=ab&255;ab=c[10030]|0;aI(u|0,1,2,ab|0);ab=an+8|0;c[60534]=(c[ab>>2]|0)+182;u=an+12|0;c[60535]=(c[u>>2]|0)+182;Y=t;a[Y]=32;a[t+1|0]=-56;t=c[10030]|0;aI(Y|0,1,2,t|0);t=X;Y=X+1|0;X=c[60532]|0;if((X|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((X|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[t]=X>>>8&255;a[Y]=X&255;X=c[10030]|0;aI(t|0,1,2,X|0);X=c[60533]|0;if((X|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((X|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[t]=X>>>8&255;a[Y]=X&255;X=c[10030]|0;aI(t|0,1,2,X|0);X=c[60534]|0;if((X|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((X|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[t]=X>>>8&255;a[Y]=X&255;X=c[10030]|0;aI(t|0,1,2,X|0);X=c[60535]|0;if((X|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((X|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[t]=X>>>8&255;a[Y]=X&255;X=c[10030]|0;aI(t|0,1,2,X|0);X=W;a[X]=0;a[W+1|0]=-128;W=c[10030]|0;aI(X|0,1,2,W|0);L16932:do{if(!(a[54472]|0)){W=((c[13554]|0)*12&-1)+4|0;X=c[13550]|0;tY(5,34,W>>>1);t=W>>>2;if((t|0)==0){break}W=V;Y=V+1|0;w=0;while(1){Z=c[X+(w<<2)>>2]|0;if((Z|0)<=-32769){ap=12445;break}if((Z|0)>=32768){ap=12447;break}a[W]=Z>>>8&255;a[Y]=Z&255;aI(W|0,1,2,c[10030]|0);w=w+1|0;if((w|0)>=(t|0)){break L16932}}if((ap|0)==12447){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}else if((ap|0)==12445){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}}}while(0);V=s;a[V]=80;a[s+1|0]=66;s=c[10030]|0;aI(V|0,1,2,s|0);s=U;V=c[60548]|0;if((V|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((V|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[s]=V>>>8&255;a[U+1|0]=V&255;V=c[10030]|0;aI(s|0,1,2,V|0);c[13624]=aa((((c[(c[3524]|0)+8>>2]|0)+182|0)>>>0)/((c[13604]|0)>>>0)>>>0,c[13622]|0);V=r;a[V]=80;a[r+1|0]=98;r=c[10030]|0;aI(V|0,1,2,r|0);r=T;V=c[13624]|0;if((V|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((V|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[r]=V>>>8&255;a[T+1|0]=V&255;V=c[10030]|0;aI(r|0,1,2,V|0);V=q;a[V]=83;a[q+1|0]=-126;q=c[10030]|0;aI(V|0,1,2,q|0);q=S;V=c[13624]|0;if((V|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((V|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[q]=V>>>8&255;a[S+1|0]=V&255;V=c[10030]|0;aI(q|0,1,2,V|0);V=p;a[V]=83;a[p+1|0]=98;p=c[10030]|0;aI(V|0,1,2,p|0);p=R;V=c[60548]|0;if((V|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((V|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[p]=V>>>8&255;a[R+1|0]=V&255;V=c[10030]|0;aI(p|0,1,2,V|0);do{if(a[54472]|0){c[13658]=1}else{if((c[13658]|0)==3){break}c[13658]=3;c[13615]=3;V=c[13656]|0;if((V|0)!=0){p=c[13602]|0;tY(4,1,V<<1);L16972:do{if((V|0)>0){R=g;q=g+1|0;S=0;while(1){r=c[p+(S<<2)>>2]|0;if((r|0)<=-32769){ap=12472;break}if((r|0)>=32768){ap=12474;break}a[R]=r>>>8&255;a[q]=r&255;aI(R|0,1,2,c[10030]|0);S=S+1|0;if((S|0)>=(V|0)){break L16972}}if((ap|0)==12472){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}else if((ap|0)==12474){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}}}while(0);c[13656]=0}V=f;a[V]=80;a[f+1|0]=-126;p=c[10030]|0;aI(V|0,1,2,p|0);p=o;V=c[13658]|0;if((V|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((V|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[p]=V>>>8&255;a[o+1|0]=V&255;V=c[10030]|0;aI(p|0,1,2,V|0);V=n;a[V]=81;a[n+1|0]=-62;p=c[10030]|0;aI(V|0,1,2,p|0);p=Q;V=c[13658]|0;if((V|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((V|0)<32768){a[p]=V>>>8&255;a[Q+1|0]=V&255;V=c[10030]|0;aI(p|0,1,2,V|0);break}else{uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}}}while(0);c[13646]=c[13586];c[13647]=c[13587];c[13648]=c[13588];c[13649]=c[13589];c[13650]=c[13590];c[13651]=c[13591];c[13652]=c[13592];c[13653]=c[13593];c[13654]=c[13594];c[13655]=c[13595];c[13611]=c[an+16>>2];an=m;a[an]=82;a[m+1|0]=-62;m=c[10030]|0;aI(an|0,1,2,m|0);m=P;an=c[60550]|0;if((an|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((an|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[m]=an>>>8&255;a[P+1|0]=an&255;an=c[10030]|0;aI(m|0,1,2,an|0);an=l;a[an]=83;a[l+1|0]=2;l=c[10030]|0;aI(an|0,1,2,l|0);l=O;an=c[60556]|0;if((an|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((an|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[l]=an>>>8&255;a[O+1|0]=an&255;an=c[10030]|0;aI(l|0,1,2,an|0);an=am|0;am=c[13628]|0;be(an|0,166136,(v=i,i=i+16|0,c[v>>2]=54528,c[v+8>>2]=am,v)|0);nc(an);as=+h[3817];an=~~((as<0.0?1.0:as)*+((c[(c[3524]|0)+28>>2]|0)>>>0>>>0)*.5);c[13568]=an;c[13558]=(an*12&-1|0)/17&-1;c[13556]=(an*13&-1|0)/15&-1;c[13562]=(an|0)/2&-1;c[13564]=(an*36&-1|0)/29&-1;c[13566]=(an*14&-1|0)/13&-1;c[13560]=(an*18&-1|0)/29&-1;an=a[54472]|0;if(!((c[13554]|0)>0&(an^1))){i=b;return}do{if(!(an|(c[13658]|0)==0)){c[13658]=0;c[13615]=0;am=c[13656]|0;if((am|0)!=0){l=c[13602]|0;tY(4,1,am<<1);L17016:do{if((am|0)>0){O=e;m=e+1|0;P=0;while(1){Q=c[l+(P<<2)>>2]|0;if((Q|0)<=-32769){ap=12500;break}if((Q|0)>=32768){ap=12502;break}a[O]=Q>>>8&255;a[m]=Q&255;aI(O|0,1,2,c[10030]|0);P=P+1|0;if((P|0)>=(am|0)){break L17016}}if((ap|0)==12500){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}else if((ap|0)==12502){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}}}while(0);c[13656]=0}am=d;a[am]=80;a[d+1|0]=-126;l=c[10030]|0;aI(am|0,1,2,l|0);l=k;am=c[13658]|0;if((am|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((am|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[l]=am>>>8&255;a[k+1|0]=am&255;am=c[10030]|0;aI(l|0,1,2,am|0);am=j;a[am]=81;a[j+1|0]=-62;l=c[10030]|0;aI(am|0,1,2,l|0);l=N;am=c[13658]|0;if((am|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((am|0)<32768){a[l]=am>>>8&255;a[N+1|0]=am&255;am=c[10030]|0;aI(l|0,1,2,am|0);break}else{uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}}}while(0);N=c[ab>>2]|0;ab=c[u>>2]|0;c[M>>2]=0;c[M+4>>2]=0;c[M+12>>2]=N;c[M+16>>2]=0;c[M+24>>2]=N;c[M+28>>2]=ab;c[M+36>>2]=0;c[M+40>>2]=ab;c[M+48>>2]=0;c[M+52>>2]=0;c[M+8>>2]=1;no(5,M|0);i=b;return}else if((ap|0)==12370){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}else if((ap|0)==12372){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}}function m5(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;e=i;i=i+8|0;f=e|0;g=c[3524]|0;h=c[g+8>>2]|0;j=h>>>0>b>>>0?b:h;h=c[g+12>>2]|0;g=h>>>0>d>>>0?d:h;if((j|0)==(c[13598]|0)&(g|0)==(c[13596]|0)){i=e;return}h=c[13656]|0;if((h|0)!=0){d=c[13602]|0;tY(4,1,h<<1);L17049:do{if((h|0)>0){b=f;k=f+1|0;l=0;while(1){m=c[d+(l<<2)>>2]|0;if((m|0)<=-32769){n=12579;break}if((m|0)>=32768){n=12581;break}a[b]=m>>>8&255;a[k]=m&255;aI(b|0,1,2,c[10030]|0);l=l+1|0;if((l|0)>=(h|0)){break L17049}}if((n|0)==12579){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}else if((n|0)==12581){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}}}while(0);c[13656]=0}c[13598]=j;c[13596]=g;i=e;return}function m6(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;e=i;i=i+16|0;f=e|0;g=e+8|0;h=c[3524]|0;j=c[h+8>>2]|0;k=j>>>0>b>>>0?b:j;j=c[h+12>>2]|0;h=j>>>0>d>>>0?d:j;j=c[13598]|0;if((k|0)==(j|0)&(h|0)==(c[13596]|0)){i=e;return}d=c[13656]|0;do{if((d|0)>16380){b=c[13602]|0;l=d<<1;L17067:do{if(a[54560]|0){tY(4,7,l);m=g;n=g+1|0;o=0;while(1){p=c[b+(o<<2)>>2]|0;if((p|0)<=-32769){q=12593;break}if((p|0)>=32768){q=12595;break}a[m]=p>>>8&255;a[n]=p&255;aI(m|0,1,2,c[10030]|0);o=o+1|0;if((o|0)>=(d|0)){break L17067}}if((q|0)==12595){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}else if((q|0)==12593){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}}else{tY(4,1,l);o=f;m=f+1|0;n=0;while(1){p=c[b+(n<<2)>>2]|0;if((p|0)<=-32769){q=12599;break}if((p|0)>=32768){q=12601;break}a[o]=p>>>8&255;a[m]=p&255;aI(o|0,1,2,c[10030]|0);n=n+1|0;if((n|0)>=(d|0)){break L17067}}if((q|0)==12601){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}else if((q|0)==12599){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}}}while(0);b=c[13598]|0;c[13656]=1;c[c[13602]>>2]=b;b=(c[13596]|0)+182|0;l=c[13656]|0;c[13656]=l+1;c[(c[13602]|0)+(l<<2)>>2]=b}else{if((d|0)!=0){break}c[13656]=1;c[c[13602]>>2]=j;b=(c[13596]|0)+182|0;l=c[13656]|0;c[13656]=l+1;c[(c[13602]|0)+(l<<2)>>2]=b}}while(0);j=c[13656]|0;c[13656]=j+1;c[(c[13602]|0)+(j<<2)>>2]=k;j=c[13656]|0;c[13656]=j+1;c[(c[13602]|0)+(j<<2)>>2]=h+182;c[13598]=k;c[13596]=h;i=e;return}function m7(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=i;i=i+40|0;e=d|0;f=d+8|0;g=d+16|0;h=d+24|0;j=d+32|0;k=(b|0)<-3?-3:b;if((k|0)==(c[13626]|0)){i=d;return}c[13626]=k;do{if((k|0)>-1){l=(k>>>0)%9>>>0;m=12616}else{if((k|0)==-4){if(a[54472]|0){break}else{n=0;m=12619;break}}else{if((k|0)<-2){break}else{l=k;m=12616;break}}}}while(0);do{if((m|0)==12616){if(a[54472]|0){c[13658]=1;n=1;m=12619;break}else{n=l+3|0;m=12619;break}}}while(0);do{if((m|0)==12619){if((n|0)==(c[13658]|0)){break}c[13658]=n;c[13615]=n;l=c[13656]|0;if((l|0)!=0){b=c[13602]|0;tY(4,1,l<<1);L17109:do{if((l|0)>0){o=f;p=f+1|0;q=0;while(1){r=c[b+(q<<2)>>2]|0;if((r|0)<=-32769){m=12624;break}if((r|0)>=32768){m=12626;break}a[o]=r>>>8&255;a[p]=r&255;aI(o|0,1,2,c[10030]|0);q=q+1|0;if((q|0)>=(l|0)){break L17109}}if((m|0)==12626){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}else if((m|0)==12624){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}}}while(0);c[13656]=0}l=e;a[l]=80;a[e+1|0]=-126;b=c[10030]|0;aI(l|0,1,2,b|0);b=h;l=c[13658]|0;if((l|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((l|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[b]=l>>>8&255;a[h+1|0]=l&255;l=c[10030]|0;aI(b|0,1,2,l|0);l=g;a[l]=81;a[g+1|0]=-62;b=c[10030]|0;aI(l|0,1,2,b|0);b=j;l=c[13658]|0;if((l|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((l|0)<32768){a[b]=l>>>8&255;a[j+1|0]=l&255;l=c[10030]|0;aI(b|0,1,2,l|0);break}else{uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}}}while(0);if(a[54576]|0){tT((k|0)==-1?2:0);i=d;return}else{tT(k);i=d;return}}function m8(a){a=a|0;c[13612]=a;return 1}function m9(b){b=b|0;var c=0;if(a[54336]|0){c=(b|0)==0&1;return c|0}else{h[6804]=+(b|0)*1.5707963267948966/90.0;c=1;return c|0}return 0}function na(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0.0,C=0.0,D=0.0;f=i;i=i+88|0;g=f|0;j=f+8|0;k=f+16|0;l=f+24|0;m=f+32|0;n=f+40|0;o=f+48|0;p=f+56|0;q=f+64|0;r=f+72|0;s=f+80|0;if(b>>>0>32767|d>>>0>32767){i=f;return}else{t=e}while(1){u=a[t]|0;if(u<<24>>24==0){w=12726;break}if((aM(u&255|0)|0)==0){break}else{t=t+1|0}}if((w|0)==12726){i=f;return}t=c[13656]|0;if((t|0)!=0){u=c[13602]|0;tY(4,1,t<<1);L17156:do{if((t|0)>0){x=m;y=m+1|0;z=0;while(1){A=c[u+(z<<2)>>2]|0;if((A|0)<=-32769){w=12659;break}if((A|0)>=32768){w=12661;break}a[x]=A>>>8&255;a[y]=A&255;aI(x|0,1,2,c[10030]|0);z=z+1|0;if((z|0)>=(t|0)){break L17156}}if((w|0)==12661){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}else if((w|0)==12659){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}}}while(0);c[13656]=0}w=c[13610]|0;do{if((c[13648]|0)!=(w|0)){c[13648]=w;t=l;a[t]=81;a[l+1|0]=66;u=c[10030]|0;aI(t|0,1,2,u|0);u=s;t=c[13610]|0;if((t|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((t|0)<32768){a[u]=t>>>8&255;a[s+1|0]=t&255;t=c[10030]|0;aI(u|0,1,2,t|0);break}else{uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}}}while(0);s=c[13612]|0;do{if((c[13650]|0)!=(s|0)){c[13650]=s;if((s|0)==2){c[60488]=3}else if((s|0)==1){c[60488]=2}else if((s|0)==0){c[60488]=1}else{uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=103960,v)|0)}l=k;a[l]=82;a[k+1|0]=76;w=c[10030]|0;aI(l|0,1,2,w|0);w=r;l=r+1|0;t=c[60488]|0;if((t|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((t|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[w]=t>>>8&255;a[l]=t&255;t=c[10030]|0;aI(w|0,1,2,t|0);t=c[60489]|0;if((t|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((t|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[w]=t>>>8&255;a[l]=t&255;t=c[10030]|0;aI(w|0,1,2,t|0);t=c[60490]|0;if((t|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((t|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[w]=t>>>8&255;a[l]=t&255;t=c[10030]|0;aI(w|0,1,2,t|0);t=c[60491]|0;if((t|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((t|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[w]=t>>>8&255;a[l]=t&255;t=c[10030]|0;aI(w|0,1,2,t|0);t=c[60492]|0;if((t|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((t|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[w]=t>>>8&255;a[l]=t&255;t=c[10030]|0;aI(w|0,1,2,t|0);t=c[60493]|0;if((t|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((t|0)<32768){a[w]=t>>>8&255;a[l]=t&255;t=c[10030]|0;aI(w|0,1,2,t|0);break}else{uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}}}while(0);r=c[13611]|0;do{if((c[13649]|0)!=(r|0)){c[13649]=r;k=r<<1;s=(k|0)/3&-1;t=j;a[t]=81;a[j+1|0]=-30;w=c[10030]|0;aI(t|0,1,2,w|0);w=q;if((k|0)<=-98307){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((k|0)<98304){a[w]=s>>>8&255;a[q+1|0]=s&255;s=c[10030]|0;aI(w|0,1,2,s|0);break}else{uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}}}while(0);B=+h[6804];do{if(+h[6823]!=B){h[6823]=B;C=+(c[13611]|0);D=B+1.5707963267948966;c[60484]=~~(C*+S(+D));c[60485]=~~(C*+T(+D));c[60486]=~~(C*+S(+B));c[60487]=~~(C*+T(+B));q=g;a[q]=82;a[g+1|0]=8;j=c[10030]|0;aI(q|0,1,2,j|0);j=p;q=p+1|0;r=c[60484]|0;if((r|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((r|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[j]=r>>>8&255;a[q]=r&255;r=c[10030]|0;aI(j|0,1,2,r|0);r=c[60485]|0;if((r|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((r|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[j]=r>>>8&255;a[q]=r&255;r=c[10030]|0;aI(j|0,1,2,r|0);r=c[60486]|0;if((r|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((r|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[j]=r>>>8&255;a[q]=r&255;r=c[10030]|0;aI(j|0,1,2,r|0);r=c[60487]|0;if((r|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((r|0)<32768){a[j]=r>>>8&255;a[q]=r&255;r=c[10030]|0;aI(j|0,1,2,r|0);break}else{uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}}}while(0);c[60480]=b;c[60481]=d+182;d=uA(e|0)|0;b=((d|0)>254?3:1)+d|0;p=(b&1|0)==0;tY(4,4,b+6|0);b=o;g=o+1|0;o=c[60480]|0;if((o|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((o|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[b]=o>>>8&255;a[g]=o&255;aI(b|0,1,2,c[10030]|0);o=c[60481]|0;if((o|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((o|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[b]=o>>>8&255;a[g]=o&255;aI(b|0,1,2,c[10030]|0);o=c[60482]|0;if((o|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((o|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[b]=o>>>8&255;a[g]=o&255;aI(b|0,1,2,c[10030]|0);b=c[10030]|0;do{if((d|0)<255){o=d<<24>>24;aF(o|0,b|0)}else{o=a[241888]|0;aF(o|0,b|0);o=n;if((d|0)<32768){a[o]=d>>>8&255;a[n+1|0]=d&255;g=c[10030]|0;aI(o|0,1,2,g|0);break}else{uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}}}while(0);aI(e|0,1,d|0,c[10030]|0);if(!p){p=c[10030]|0;d=a[241880]|0;aF(d|0,p|0)}c[13596]=-2e3;c[13598]=-2e3;i=f;return}function nb(a){a=+a;var b=0;b=~~((a<0.0?1.0:a)*+((c[(c[3524]|0)+28>>2]|0)>>>0>>>0)*.5);c[13568]=b;c[13558]=(b*12&-1|0)/17&-1;c[13556]=(b*13&-1|0)/15&-1;c[13562]=(b|0)/2&-1;c[13564]=(b*36&-1|0)/29&-1;c[13566]=(b*14&-1|0)/13&-1;c[13560]=(b*18&-1|0)/29&-1;return}function nc(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0,q=0,r=0,s=0,t=0;d=i;i=i+8|0;e=d|0;f=c[3524]|0;g=a8(b|0,44)|0;if((b|0)==0){j=12758}else{if((a[b]|0)==0){j=12758}else{k=b}}if((j|0)==12758){k=242752}j=(g|0)!=0;if(j){l=g-k|0}else{l=uA(k|0)|0}b=c[13630]|0;m=c[b>>2]|0;L17297:do{if((m|0)==0){n=0;o=1.0}else{p=0;q=m;while(1){if((uA(q|0)|0)==(l|0)){if((uJ(k|0,q|0,l|0)|0)==0){break}}r=p+1|0;s=c[b+(r<<4)>>2]|0;if((s|0)==0){n=0;o=1.0;break L17297}else{p=r;q=s}}n=p+1|0;o=+h[b+(p<<4)+8>>3]}}while(0);l=(n|0)==0?1:n;c[13610]=l;n=c[b+(l-1<<4)>>2]|0;l=uA(n|0)|0;b=(l|0)>31?31:l;uF(54528,n|0,b|0);a[b+54528|0]=0;b=c[13628]|0;c[e>>2]=b;if(j){j=g+1|0;ca(j|0,21e4,(v=i,i=i+8|0,c[v>>2]=e,v)|0);t=c[e>>2]|0}else{t=b}b=aa((((c[(c[3524]|0)+8>>2]|0)+182|0)>>>0)/((c[13604]|0)>>>0)>>>0,t);c[f+16>>2]=b;c[f+20>>2]=~~(o*+(aa((((c[(c[3524]|0)+8>>2]|0)+182|0)>>>0)/((c[13604]|0)>>>0)>>>0,c[e>>2]|0)>>>0>>>0)*.527);c[13611]=b;i=d;return 1}function nd(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;g=i;i=i+64|0;h=g|0;c[h>>2]=b;c[h+4>>2]=d;j=e+b|0;c[h+12>>2]=j;c[h+16>>2]=d;c[h+24>>2]=j;j=f+d|0;c[h+28>>2]=j;c[h+36>>2]=b;c[h+40>>2]=j;c[h+48>>2]=b;c[h+52>>2]=d;c[h+8>>2]=a;no(5,h|0);i=g;return}function ne(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;f=i;i=i+112|0;g=f|0;h=f+8|0;j=f+16|0;k=f+24|0;l=f+32|0;m=f+40|0;n=f+48|0;o=f+56|0;p=f+64|0;q=f+72|0;r=f+80|0;s=f+88|0;t=f+96|0;u=f+104|0;if((e|0)<0){m5(b,d);m6(b+1|0,d);i=f;return}w=(e|0)%13&-1;e=c[13656]|0;if((e|0)!=0){x=c[13602]|0;tY(4,1,e<<1);L17316:do{if((e|0)>0){y=q;z=q+1|0;A=0;while(1){B=c[x+(A<<2)>>2]|0;if((B|0)<=-32769){C=12777;break}if((B|0)>=32768){C=12779;break}a[y]=B>>>8&255;a[z]=B&255;aI(y|0,1,2,c[10030]|0);A=A+1|0;if((A|0)>=(e|0)){break L17316}}if((C|0)==12777){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}else if((C|0)==12779){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}}}while(0);c[13656]=0}e=c[13642]|0;tT(0);if((w|0)>2){c[13616]=1}if((w|0)==12|(w|0)==10|(w|0)==8|(w|0)==6|(w|0)==4){c[13613]=0;c[13615]=c[13658];D=c[13616]|0}else{c[13613]=1;c[13616]=0;c[13614]=c[13658];D=0}do{if((c[13654]|0)!=(D|0)){c[13654]=D;x=p;a[x]=82;a[p+1|0]=-62;q=c[10030]|0;aI(x|0,1,2,q|0);q=u;x=c[13616]|0;if((x|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((x|0)<32768){a[q]=x>>>8&255;a[u+1|0]=x&255;x=c[10030]|0;aI(q|0,1,2,x|0);break}else{uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}}}while(0);u=c[13615]|0;do{if((c[13653]|0)!=(u|0)){c[13653]=u;p=o;a[p]=82;a[o+1|0]=-30;D=c[10030]|0;aI(p|0,1,2,D|0);D=t;p=c[13615]|0;if((p|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((p|0)<32768){a[D]=p>>>8&255;a[t+1|0]=p&255;p=c[10030]|0;aI(D|0,1,2,p|0);break}else{uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}}}while(0);t=c[13651]|0;o=c[13613]|0;do{if((t|0)==(o|0)){E=t}else{c[13651]=o;u=n;a[u]=83;a[n+1|0]=-62;p=c[10030]|0;aI(u|0,1,2,p|0);p=s;u=c[13651]|0;if((u|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((u|0)<32768){a[p]=u>>>8&255;a[s+1|0]=u&255;u=c[10030]|0;aI(p|0,1,2,u|0);E=c[13651]|0;break}else{uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}}}while(0);do{if((E|0)!=0){s=c[13614]|0;if((c[13652]|0)==(s|0)){break}c[13652]=s;s=m;a[s]=83;a[m+1|0]=-94;n=c[10030]|0;aI(s|0,1,2,n|0);n=r;s=c[13652]|0;if((s|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((s|0)<32768){a[n]=s>>>8&255;a[r+1|0]=s&255;s=c[10030]|0;aI(n|0,1,2,s|0);break}else{uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}}}while(0);do{if((w|0)==0){m5(b-(c[13568]|0)|0,d);m6((c[13568]|0)+b|0,d);m5(b,d-(c[13568]|0)|0);m6(b,(c[13568]|0)+d|0)}else if((w|0)==2){m5(b,d-(c[13568]|0)|0);m6(b,(c[13568]|0)+d|0);m5((c[13556]|0)+b|0,d-(c[13562]|0)|0);m6(b-(c[13556]|0)|0,(c[13562]|0)+d|0);m5((c[13556]|0)+b|0,(c[13562]|0)+d|0);m6(b-(c[13556]|0)|0,d-(c[13562]|0)|0)}else if((w|0)==1){r=c[13558]|0;m5(b-r|0,d-r|0);r=c[13558]|0;m6(r+b|0,r+d|0);r=c[13558]|0;m5(b-r|0,r+d|0);r=c[13558]|0;m6(r+b|0,d-r|0)}else if((w|0)==3|(w|0)==4){r=c[13558]|0;m5(b-r|0,d-r|0);r=c[13558]|0;m6(r+b|0,d-r|0);r=c[13558]|0;m6(r+b|0,r+d|0);r=c[13558]|0;m6(b-r|0,r+d|0);r=c[13656]|0;if((r|0)==0){break}m=c[13602]|0;tY(4,7,r<<1);L17377:do{if((r|0)>0){E=l;s=l+1|0;n=0;while(1){o=c[m+(n<<2)>>2]|0;if((o|0)<=-32769){C=12820;break}if((o|0)>=32768){C=12822;break}a[E]=o>>>8&255;a[s]=o&255;aI(E|0,1,2,c[10030]|0);n=n+1|0;if((n|0)>=(r|0)){break L17377}}if((C|0)==12822){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}else if((C|0)==12820){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}}}while(0);c[13656]=0}else if((w|0)==5|(w|0)==6){m5(b,d-(c[13568]|0)|0);m6((c[13562]|0)+b|0,d-(c[13556]|0)|0);m6((c[13556]|0)+b|0,d-(c[13562]|0)|0);m6((c[13568]|0)+b|0,d);m6((c[13556]|0)+b|0,(c[13562]|0)+d|0);m6((c[13562]|0)+b|0,(c[13556]|0)+d|0);m6(b,(c[13568]|0)+d|0);m6(b-(c[13562]|0)|0,(c[13556]|0)+d|0);m6(b-(c[13556]|0)|0,(c[13562]|0)+d|0);m6(b-(c[13568]|0)|0,d);m6(b-(c[13556]|0)|0,d-(c[13562]|0)|0);m6(b-(c[13562]|0)|0,d-(c[13556]|0)|0);r=c[13656]|0;if((r|0)==0){break}m=c[13602]|0;tY(4,7,r<<1);L17389:do{if((r|0)>0){n=k;E=k+1|0;s=0;while(1){o=c[m+(s<<2)>>2]|0;if((o|0)<=-32769){C=12829;break}if((o|0)>=32768){C=12831;break}a[n]=o>>>8&255;a[E]=o&255;aI(n|0,1,2,c[10030]|0);s=s+1|0;if((s|0)>=(r|0)){break L17389}}if((C|0)==12829){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}else if((C|0)==12831){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}}}while(0);c[13656]=0}else if((w|0)==7|(w|0)==8){m5(b,(c[13564]|0)+d|0);m6(b-(c[13566]|0)|0,d-(c[13560]|0)|0);m6((c[13566]|0)+b|0,d-(c[13560]|0)|0);r=c[13656]|0;if((r|0)==0){break}m=c[13602]|0;tY(4,7,r<<1);L17401:do{if((r|0)>0){s=j;n=j+1|0;E=0;while(1){o=c[m+(E<<2)>>2]|0;if((o|0)<=-32769){C=12838;break}if((o|0)>=32768){C=12840;break}a[s]=o>>>8&255;a[n]=o&255;aI(s|0,1,2,c[10030]|0);E=E+1|0;if((E|0)>=(r|0)){break L17401}}if((C|0)==12840){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}else if((C|0)==12838){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}}}while(0);c[13656]=0}else if((w|0)==11|(w|0)==12){m5(b-(c[13568]|0)|0,d);m6(b,d-(c[13568]|0)|0);m6((c[13568]|0)+b|0,d);m6(b,(c[13568]|0)+d|0);r=c[13656]|0;if((r|0)==0){break}m=c[13602]|0;tY(4,7,r<<1);L17413:do{if((r|0)>0){E=g;s=g+1|0;n=0;while(1){o=c[m+(n<<2)>>2]|0;if((o|0)<=-32769){C=12856;break}if((o|0)>=32768){C=12858;break}a[E]=o>>>8&255;a[s]=o&255;aI(E|0,1,2,c[10030]|0);n=n+1|0;if((n|0)>=(r|0)){break L17413}}if((C|0)==12858){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}else if((C|0)==12856){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}}}while(0);c[13656]=0}else if((w|0)==9|(w|0)==10){m5(b,d-(c[13564]|0)|0);m6(b-(c[13566]|0)|0,(c[13560]|0)+d|0);m6((c[13566]|0)+b|0,(c[13560]|0)+d|0);r=c[13656]|0;if((r|0)==0){break}m=c[13602]|0;tY(4,7,r<<1);L17425:do{if((r|0)>0){n=h;E=h+1|0;s=0;while(1){o=c[m+(s<<2)>>2]|0;if((o|0)<=-32769){C=12847;break}if((o|0)>=32768){C=12849;break}a[n]=o>>>8&255;a[E]=o&255;aI(n|0,1,2,c[10030]|0);s=s+1|0;if((s|0)>=(r|0)){break L17425}}if((C|0)==12849){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}else if((C|0)==12847){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}}}while(0);c[13656]=0}}while(0);tT(e);i=f;return}function nf(b){b=+b;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=i;i=i+24|0;e=d|0;f=d+8|0;g=d+16|0;h=~~((b>0.0?b:.5)*+((c[13622]|0)>>>0>>>0)*+((((c[(c[3524]|0)+8>>2]|0)+182|0)>>>0)/((c[13604]|0)>>>0)>>>0>>>0>>>0));if((h|0)==(c[13624]|0)){i=d;return}j=c[13656]|0;if((j|0)!=0){k=c[13602]|0;tY(4,1,j<<1);L17443:do{if((j|0)>0){l=f;m=f+1|0;n=0;while(1){o=c[k+(n<<2)>>2]|0;if((o|0)<=-32769){p=12870;break}if((o|0)>=32768){p=12872;break}a[l]=o>>>8&255;a[m]=o&255;aI(l|0,1,2,c[10030]|0);n=n+1|0;if((n|0)>=(j|0)){break L17443}}if((p|0)==12872){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}else if((p|0)==12870){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}}}while(0);c[13656]=0}c[13624]=h;h=e;a[h]=80;a[e+1|0]=98;aI(h|0,1,2,c[10030]|0);h=g;e=c[13624]|0;if((e|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((e|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[h]=e>>>8&255;a[g+1|0]=e&255;aI(h|0,1,2,c[10030]|0);tT(c[13642]|0);i=d;return}function ng(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=i;i=i+8|0;e=d|0;if((b|0)==0){f=(c[13620]|0)-96|0;i=d;return f|0}g=c[b+28>>2]|0;c[13582]=g;j=g+96|0;if((j|0)>(c[13552]|0)){c[13552]=j;c[13550]=db(c[13550]|0,(j*12&-1)+4|0,167368)|0;k=c[13582]|0}else{k=g}L17469:do{if((k|0)>0){g=b+32|0;j=0;l=289;while(1){c[(c[13550]|0)+(l<<2)>>2]=~~(+h[(c[g>>2]|0)+(j*24&-1)>>3]*255.9);c[(c[13550]|0)+(l+1<<2)>>2]=~~(+h[(c[g>>2]|0)+(j*24&-1)+8>>3]*255.9);c[(c[13550]|0)+(l+2<<2)>>2]=~~(+h[(c[g>>2]|0)+(j*24&-1)+16>>3]*255.9);m=j+1|0;n=c[13582]|0;if((m|0)>=(n|0)){o=n;break L17469}j=m;l=l+3|0}}else{o=k}}while(0);k=o+96|0;c[13554]=k;o=(k*12&-1)+4|0;k=c[13550]|0;tY(5,34,o>>>1);b=o>>>2;if((b|0)==0){f=0;i=d;return f|0}o=e;l=e+1|0;e=0;while(1){j=c[k+(e<<2)>>2]|0;if((j|0)<=-32769){p=12893;break}if((j|0)>=32768){p=12895;break}a[o]=j>>>8&255;a[l]=j&255;aI(o|0,1,2,c[10030]|0);j=e+1|0;if((j|0)<(b|0)){e=j}else{f=0;p=12901;break}}if((p|0)==12893){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0);return 0}else if((p|0)==12895){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0);return 0}else if((p|0)==12901){i=d;return f|0}return 0}function nh(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0.0,L=0;d=i;i=i+80|0;e=d|0;f=d+8|0;g=d+16|0;j=d+24|0;k=d+32|0;l=d+40|0;m=d+48|0;n=d+56|0;o=d+64|0;p=d+72|0;q=c[b>>2]|0;L17487:do{if((q|0)==1){r=b+4|0;s=c[r>>2]|0;do{if((s|0)>-1){t=(s>>>0)%9>>>0;u=12908}else{if((s|0)==-4){if(a[54472]|0){break}else{w=0;u=12911;break}}else{if((s|0)<-2){break}else{t=s;u=12908;break}}}}while(0);do{if((u|0)==12908){if(a[54472]|0){c[13658]=1;w=1;u=12911;break}else{w=t+3|0;u=12911;break}}}while(0);do{if((u|0)==12911){if((w|0)==(c[13658]|0)){break}c[13658]=w;c[13615]=w;s=c[13656]|0;if((s|0)!=0){x=c[13602]|0;tY(4,1,s<<1);L17506:do{if((s|0)>0){y=f;z=f+1|0;A=0;while(1){B=c[x+(A<<2)>>2]|0;if((B|0)<=-32769){u=12916;break}if((B|0)>=32768){u=12918;break}a[y]=B>>>8&255;a[z]=B&255;aI(y|0,1,2,c[10030]|0);A=A+1|0;if((A|0)>=(s|0)){break L17506}}if((u|0)==12916){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}else if((u|0)==12918){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}}}while(0);c[13656]=0}s=e;a[s]=80;a[e+1|0]=-126;x=c[10030]|0;aI(s|0,1,2,x|0);x=m;s=c[13658]|0;if((s|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((s|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[x]=s>>>8&255;a[m+1|0]=s&255;s=c[10030]|0;aI(x|0,1,2,s|0);s=l;a[s]=81;a[l+1|0]=-62;x=c[10030]|0;aI(s|0,1,2,x|0);x=p;s=c[13658]|0;if((s|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((s|0)<32768){a[x]=s>>>8&255;a[p+1|0]=s&255;s=c[10030]|0;aI(x|0,1,2,s|0);break}else{uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}}}while(0);c[13626]=c[r>>2];i=d;return}else if((q|0)==3){s=c[b+4>>2]|0;x=s>>>16&255;A=s>>>8&255;y=s&255;s=c[13554]|0;if((s|0)<=0){C=0;break}z=c[13550]|0;B=0;D=1;E=65536;F=0;while(1){G=(c[z+(D<<2)>>2]|0)-x|0;H=(c[z+(D+1<<2)>>2]|0)-A|0;I=(c[z+(D+2<<2)>>2]|0)-y|0;J=aa(G,G);G=aa(H,H)+J|0;J=G+aa(I,I)|0;I=(J|0)<(E|0);G=I?B:F;if((J|0)<32){C=G;break L17487}H=B+1|0;if((H|0)<(s|0)){B=H;D=D+3|0;E=I?J:E;F=G}else{C=G;break}}}else if((q|0)==5){K=+h[b+8>>3];F=c[13582]|0;if(K>0.0){L=~~(K*+(F|0))}else{L=0}E=(L|0)<(F|0)?L:F-1|0;c[13615]=E;C=E+96|0}else{i=d;return}}while(0);c[13615]=C;if((c[13658]|0)==(C|0)){i=d;return}c[13658]=C;c[13626]=C;C=c[13656]|0;if((C|0)!=0){L=c[13602]|0;tY(4,1,C<<1);L17546:do{if((C|0)>0){b=k;q=k+1|0;p=0;while(1){l=c[L+(p<<2)>>2]|0;if((l|0)<=-32769){u=12943;break}if((l|0)>=32768){u=12945;break}a[b]=l>>>8&255;a[q]=l&255;aI(b|0,1,2,c[10030]|0);p=p+1|0;if((p|0)>=(C|0)){break L17546}}if((u|0)==12945){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}else if((u|0)==12943){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}}}while(0);c[13656]=0}u=j;a[u]=80;a[j+1|0]=-126;aI(u|0,1,2,c[10030]|0);u=o;j=c[13658]|0;if((j|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((j|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[u]=j>>>8&255;a[o+1|0]=j&255;aI(u|0,1,2,c[10030]|0);u=g;a[u]=81;a[g+1|0]=-62;aI(u|0,1,2,c[10030]|0);u=n;g=c[13658]|0;if((g|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((g|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[u]=g>>>8&255;a[n+1|0]=g&255;aI(u|0,1,2,c[10030]|0);i=d;return}function ni(){c[13330]=0;a[53312]=0;return}function nj(){var a=0,b=0,d=0;a=i;b=~~(+((c[13326]|0)>>>0>>>0)/10.0+.5+0.0);d=~~(+((c[13324]|0)>>>0>>>0)/10.0+.5+0.0);cf(c[10030]|0,167816,(v=i,i=i+64|0,c[v>>2]=0,c[v+8>>2]=0,c[v+16>>2]=b,c[v+24>>2]=d,c[v+32>>2]=0,c[v+40>>2]=0,c[v+48>>2]=b,c[v+56>>2]=d,v)|0);i=a;return}function nk(){aI(199192,10,1,c[10030]|0);return}function nl(){if(!(a[53312]|0)){c[13330]=0;return}aI(169392,2,1,c[10030]|0);a[53312]=0;c[13330]=0;return}function nm(b,d){b=b|0;d=d|0;var e=0,f=0;e=i;if(a[53312]|0){f=c[10030]|0;aI(169392,2,1,f|0)}cf(c[10030]|0,167984,(v=i,i=i+16|0,h[v>>3]=+(b>>>0>>>0)/10.0,h[v+8>>3]=+(d>>>0>>>0)/10.0,v)|0);c[13330]=(c[13330]|0)+1;a[53312]=1;i=e;return}function nn(b,d){b=b|0;d=d|0;var e=0,f=0.0,g=0.0;e=i;f=+(b>>>0>>>0)/10.0;g=+(d>>>0>>>0)/10.0;cf(c[10030]|0,168040,(v=i,i=i+16|0,h[v>>3]=f,h[v+8>>3]=g,v)|0);d=(c[13330]|0)+1|0;c[13330]=d;a[53312]=1;if((d|0)<=399){i=e;return}cf(c[10030]|0,168016,(v=i,i=i+16|0,h[v>>3]=f,h[v+8>>3]=g,v)|0);c[13330]=0;i=e;return}function no(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;e=i;i=i+72|0;f=e|0;g=e+8|0;h=e+16|0;j=e+24|0;k=e+32|0;l=e+40|0;m=e+48|0;n=e+56|0;o=e+64|0;p=c[d+8>>2]|0;q=(p>>4|0)%6&-1;r=p&15;do{if((r|0)==1|(r|0)==4){c[13616]=1;s=1}else if((r|0)==2|(r|0)==5){if((q|0)==0){c[13616]=0;s=0;break}else if((q|0)==3){c[13616]=1;s=1;break}else{c[13616]=3;c[13617]=c[242728+(q<<2)>>2];s=3;break}}else{c[13615]=0;c[13616]=1;s=1}}while(0);do{if((c[13654]|0)!=(s|0)){c[13654]=s;q=k;a[q]=82;a[k+1|0]=-62;r=c[10030]|0;aI(q|0,1,2,r|0);r=o;q=c[13616]|0;if((q|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((q|0)<32768){a[r]=q>>>8&255;a[o+1|0]=q&255;q=c[10030]|0;aI(r|0,1,2,q|0);break}else{uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}}}while(0);o=c[13615]|0;do{if((c[13653]|0)!=(o|0)){c[13653]=o;k=j;a[k]=82;a[j+1|0]=-30;s=c[10030]|0;aI(k|0,1,2,s|0);s=n;k=c[13615]|0;if((k|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((k|0)<32768){a[s]=k>>>8&255;a[n+1|0]=k&255;k=c[10030]|0;aI(s|0,1,2,k|0);break}else{uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}}}while(0);n=c[13617]|0;do{if((c[13655]|0)!=(n|0)&(c[13616]|0)==3){c[13655]=n;j=h;a[j]=83;a[h+1|0]=2;o=c[10030]|0;aI(j|0,1,2,o|0);o=m;j=c[13617]|0;if((j|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((j|0)<32768){a[o]=j>>>8&255;a[m+1|0]=j&255;j=c[10030]|0;aI(o|0,1,2,j|0);break}else{uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}}}while(0);c[13613]=0;do{if((c[13651]|0)!=0){c[13651]=0;m=g;a[m]=83;a[g+1|0]=-62;h=c[10030]|0;aI(m|0,1,2,h|0);h=l;m=c[13651]|0;if((m|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((m|0)<32768){a[h]=m>>>8&255;a[l+1|0]=m&255;m=c[10030]|0;aI(h|0,1,2,m|0);break}else{uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}}}while(0);m5(c[d>>2]|0,c[d+4>>2]|0);a[54560]=1;if((b|0)>1){l=1;do{m6(c[d+(l*12&-1)>>2]|0,c[d+(l*12&-1)+4>>2]|0);l=l+1|0;}while((l|0)<(b|0))}b=c[13656]|0;if((b|0)==0){a[54560]=0;i=e;return}l=c[13602]|0;tY(4,7,b<<1);L17640:do{if((b|0)>0){d=f;g=f+1|0;m=0;while(1){h=c[l+(m<<2)>>2]|0;if((h|0)<=-32769){t=13015;break}if((h|0)>=32768){t=13017;break}a[d]=h>>>8&255;a[g]=h&255;aI(d|0,1,2,c[10030]|0);m=m+1|0;if((m|0)>=(b|0)){break L17640}}if((t|0)==13015){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}else if((t|0)==13017){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}}}while(0);c[13656]=0;a[54560]=0;i=e;return}function np(){var b=0,d=0,e=0,f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0.0,M=0,N=0,O=0.0,P=0,Q=0.0,R=0,S=0,T=0,U=0,V=0.0,W=0.0,X=0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ab=0,ac=0.0;b=i;i=i+24|0;d=b|0;e=c[13898]|0;f=c[8272]|0;L17652:do{if((e|0)<(f|0)){j=e;k=f;L17653:while(1){l=c[1054]|0;m=(a[l+(j*40&-1)|0]&1)==0;L17655:do{if(!m){n=c[l+(j*40&-1)+36>>2]|0;o=l+(j*40&-1)+32|0;p=c[10036]|0;q=0;while(1){if((q|0)>=(n|0)){break}if((a[p+((c[o>>2]|0)+q|0)|0]|0)==(a[q+103664|0]|0)){q=q+1|0}else{break L17655}}if((q|0)==1){r=k;s=j;break L17652}}}while(0);o=c[60232]|0;L17662:do{if((o|0)==0){t=240928}else{p=c[l+(j*40&-1)+36>>2]|0;n=c[l+(j*40&-1)+32>>2]|0;u=(p|0)>0;w=c[10036]|0;x=240928;y=o;while(1){L17666:do{if(!m){if(u){z=0;A=0;B=n;while(1){C=a[y+z|0]|0;if(C<<24>>24==(a[w+(z+B|0)|0]|0)){D=B;E=A}else{if(C<<24>>24!=36){break L17666}D=B-1|0;E=1}F=z+1|0;if((F|0)<(E+p|0)){z=F;A=E;B=D}else{break}}if((E|0)==0){G=F}else{t=x;break L17662}}else{G=0}B=a[y+G|0]|0;if((B<<24>>24|0)==36|(B<<24>>24|0)==0){t=x;break L17662}}}while(0);B=x+8|0;A=c[B>>2]|0;if((A|0)==0){t=B;break}else{x=B;y=A}}}}while(0);o=c[t+4>>2]|0;L17679:do{if((o|0)==0){a[53408]=0;uD(53352,167792,17);c[13336]=22;g[13332]=12.0;c[13326]=5960;c[13324]=7200;y=j+1|0;c[13898]=y;H=y}else if((o|0)==2){a[53408]=1;y=j+1|0;c[13898]=y;H=y}else if((o|0)==1){a[53408]=0;y=j+1|0;c[13898]=y;H=y}else{do{if(!m){y=l+(j*40&-1)+32|0;x=c[y>>2]|0;p=c[10036]|0;w=a[p+x|0]|0;if(!((w<<24>>24|0)==39|(w<<24>>24|0)==34)){break}w=(c[l+(j*40&-1)+36>>2]|0)-2|0;n=(w|0)>49?49:w;if((n|0)>0){w=x;x=0;while(1){u=w+1|0;q=x+1|0;a[x+53352|0]=a[p+u|0]|0;if((q|0)==(n|0)){I=n;break}else{w=u;x=q}}}else{I=0}a[I+53352|0]=0;if((a[p+(c[y>>2]|0)|0]|0)==34){ua(53352)}else{x=53352;w=53352;while(1){n=a[w]|0;if((n<<24>>24|0)==0){break}else if((n<<24>>24|0)==39){q=w+1|0;u=(a[q]|0)==39?q:w;J=u;K=a[u]|0}else{J=w;K=n}a[x]=K;x=x+1|0;w=J+1|0}a[x]=0}w=(c[13898]|0)+1|0;c[13898]=w;H=w;break L17679}}while(0);w=is(d)|0;y=c[w>>2]|0;if((y|0)==2){L=+h[w+8>>3]}else if((y|0)==3){L=+uz(c[w+8>>2]|0,0)}else if((y|0)==1){L=+(c[w+8>>2]|0)}else{break L17653}w=~~L;c[13336]=w;c[13898]=(c[13898]|0)+1;c[(c[3524]|0)+16>>2]=~~(+(w|0)*10.0);c[(c[3524]|0)+20>>2]=~~(+(c[13336]|0)*10.0*6.0/10.0);H=c[13898]|0}}while(0);l=c[8272]|0;if((H|0)<(l|0)){j=H;k=l}else{r=l;s=H;break L17652}}uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{r=f;s=e}}while(0);L17709:do{if((s|0)<(r|0)){e=c[1054]|0;L17711:do{if((a[e+(s*40&-1)|0]&1)!=0){f=c[e+(s*40&-1)+36>>2]|0;H=e+(s*40&-1)+32|0;J=c[10036]|0;K=0;while(1){if((K|0)>=(f|0)){break}if((a[J+((c[H>>2]|0)+K|0)|0]|0)==(a[K+103664|0]|0)){K=K+1|0}else{break L17711}}if((K|0)==1){M=s;N=r;break L17709}}}while(0);e=is(d)|0;H=c[e>>2]|0;if((H|0)==3){O=+uz(c[e+8>>2]|0,0)}else if((H|0)==2){O=+h[e+8>>3]}else if((H|0)==1){O=+(c[e+8>>2]|0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}e=~~(O*720.0);c[13326]=e;H=(c[13898]|0)+1|0;c[13898]=H;L17724:do{if((H|0)<(c[8272]|0)){J=c[1054]|0;L17726:do{if((a[J+(H*40&-1)|0]&1)!=0){f=c[J+(H*40&-1)+36>>2]|0;I=J+(H*40&-1)+32|0;t=c[10036]|0;G=0;while(1){if((G|0)>=(f|0)){break}if((a[t+((c[I>>2]|0)+G|0)|0]|0)==(a[G+103664|0]|0)){G=G+1|0}else{break L17726}}if((G|0)==1){P=e;break L17724}}}while(0);J=is(d)|0;K=c[J>>2]|0;if((K|0)==3){Q=+uz(c[J+8>>2]|0,0)}else if((K|0)==1){Q=+(c[J+8>>2]|0)}else if((K|0)==2){Q=+h[J+8>>3]}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}c[13324]=~~(Q*720.0);c[13898]=(c[13898]|0)+1;P=c[13326]|0}else{P=e}}while(0);c[(c[3524]|0)+8>>2]=P;c[(c[3524]|0)+12>>2]=c[13324];c[(c[3524]|0)+24>>2]=((c[13324]|0)>>>0)/80>>>0;c[(c[3524]|0)+28>>2]=((c[13324]|0)>>>0)/80>>>0;M=c[13898]|0;N=c[8272]|0}else{M=s;N=r}}while(0);if((M|0)>=(N|0)){R=a[53408]|0;S=R?116440:116408;T=c[13336]|0;U=c[13326]|0;V=+(U>>>0>>>0);W=V/720.0;X=c[13324]|0;Y=+(X>>>0>>>0);Z=Y/720.0;_=+g[13332];$=_;aa=$/10.0;ab=be(13048,167736,(v=i,i=i+48|0,c[v>>2]=S,c[v+8>>2]=53352,c[v+16>>2]=T,h[v+24>>3]=W,h[v+32>>3]=Z,h[v+40>>3]=aa,v)|0)|0;i=b;return}N=c[1054]|0;L17744:do{if((a[N+(M*40&-1)|0]&1)!=0){r=c[N+(M*40&-1)+36>>2]|0;s=N+(M*40&-1)+32|0;P=c[10036]|0;e=0;while(1){if((e|0)>=(r|0)){break}if((a[P+((c[s>>2]|0)+e|0)|0]|0)==(a[e+103664|0]|0)){e=e+1|0}else{break L17744}}if((e|0)!=1){break}R=a[53408]|0;S=R?116440:116408;T=c[13336]|0;U=c[13326]|0;V=+(U>>>0>>>0);W=V/720.0;X=c[13324]|0;Y=+(X>>>0>>>0);Z=Y/720.0;_=+g[13332];$=_;aa=$/10.0;ab=be(13048,167736,(v=i,i=i+48|0,c[v>>2]=S,c[v+8>>2]=53352,c[v+16>>2]=T,h[v+24>>3]=W,h[v+32>>3]=Z,h[v+40>>3]=aa,v)|0)|0;i=b;return}}while(0);M=is(d)|0;d=c[M>>2]|0;if((d|0)==1){ac=+(c[M+8>>2]|0)}else if((d|0)==2){ac=+h[M+8>>3]}else if((d|0)==3){ac=+uz(c[M+8>>2]|0,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g[13332]=ac*10.0;c[13898]=(c[13898]|0)+1;R=a[53408]|0;S=R?116440:116408;T=c[13336]|0;U=c[13326]|0;V=+(U>>>0>>>0);W=V/720.0;X=c[13324]|0;Y=+(X>>>0>>>0);Z=Y/720.0;_=+g[13332];$=_;aa=$/10.0;ab=be(13048,167736,(v=i,i=i+48|0,c[v>>2]=S,c[v+8>>2]=53352,c[v+16>>2]=T,h[v+24>>3]=W,h[v+32>>3]=Z,h[v+40>>3]=aa,v)|0)|0;i=b;return}function nq(a){a=a|0;c[13354]=a;return 1}function nr(a){a=a|0;c[13334]=a;return 1}function ns(a,b){a=a|0;b=b|0;c[11678]=a;c[11674]=b;return}function nt(){var b=0,d=0,e=0,f=0;b=aa(c[11672]|0,c[11676]|0);if((b|0)<=0){return}d=b;b=c[11684]|0;e=c[11680]|0;while(1){a[b]=32;a[e]=0;f=d-1|0;if((f|0)>0){d=f;b=b+1|0;e=e+1|0}else{break}}return}function nu(b){b=b|0;var d=0,e=0,f=0.0;d=i;if(a[53312]|0){e=c[10030]|0;aI(169392,2,1,e|0);a[53312]=0}do{if((b|0)==3){e=c[10030]|0;f=+g[13332]/10.0;cf(e|0,168928,(v=i,i=i+8|0,h[v>>3]=f,v)|0);e=c[10030]|0;if(a[53408]|0){aI(168520,10,1,e|0);break}else{aI(168496,20,1,e|0);break}}else if((b|0)==8){cf(c[10030]|0,168928,(v=i,i=i+8|0,h[v>>3]=+g[13332]/10.0,v)|0);e=c[10030]|0;if(a[53408]|0){aI(168120,16,1,e|0);break}else{aI(168088,30,1,e|0);break}}else if((b|0)==6){cf(c[10030]|0,168928,(v=i,i=i+8|0,h[v>>3]=+g[13332]/10.0,v)|0);e=c[10030]|0;if(a[53408]|0){aI(168912,10,1,e|0);break}else{aI(168288,22,1,e|0);break}}else if((b|0)==5){cf(c[10030]|0,168928,(v=i,i=i+8|0,h[v>>3]=+g[13332]/10.0,v)|0);e=c[10030]|0;if(a[53408]|0){aI(168432,10,1,e|0);break}else{aI(168368,22,1,e|0);break}}else if((b|0)==1){cf(c[10030]|0,168928,(v=i,i=i+8|0,h[v>>3]=+g[13332]/10.0,v)|0);e=c[10030]|0;if(a[53408]|0){aI(168768,10,1,e|0);break}else{aI(168696,18,1,e|0);break}}else if((b|0)==(-2|0)){cf(c[10030]|0,168928,(v=i,i=i+8|0,h[v>>3]=+g[13332]/10.0,v)|0);e=c[10030]|0;if(a[53408]|0){aI(168912,10,1,e|0);break}else{aI(168896,15,1,e|0);break}}else if((b|0)==4){cf(c[10030]|0,168488,(v=i,i=i+8|0,h[v>>3]=+g[13332]/10.0,v)|0);e=c[10030]|0;if(a[53408]|0){aI(168472,10,1,e|0);break}else{aI(168448,22,1,e|0);break}}else if((b|0)==(-1|0)){cf(c[10030]|0,168928,(v=i,i=i+8|0,h[v>>3]=+g[13332]/10.0,v)|0);e=c[10030]|0;if(a[53408]|0){aI(168912,10,1,e|0);break}else{aI(168824,18,1,e|0);break}}else if((b|0)==0){cf(c[10030]|0,168928,(v=i,i=i+8|0,h[v>>3]=+g[13332]/10.0,v)|0);e=c[10030]|0;if(a[53408]|0){aI(168808,10,1,e|0);break}else{aI(168784,15,1,e|0);break}}else if((b|0)==2){cf(c[10030]|0,168928,(v=i,i=i+8|0,h[v>>3]=+g[13332]/10.0,v)|0);e=c[10030]|0;if(a[53408]|0){aI(168616,10,1,e|0);break}else{aI(168576,18,1,e|0);break}}else if((b|0)==7){cf(c[10030]|0,168928,(v=i,i=i+8|0,h[v>>3]=+g[13332]/10.0,v)|0);e=c[10030]|0;if(a[53408]|0){aI(168232,12,1,e|0);break}else{aI(168184,26,1,e|0);break}}}while(0);c[13330]=0;i=d;return}function nv(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0.0,m=0.0;f=i;if(a[53312]|0){g=c[10030]|0;aI(169392,2,1,g|0);a[53312]=0}g=c[13334]|0;if((g|0)==2){j=c[10030]|0;k=c[13336]|0;cf(j|0,169240,(v=i,i=i+24|0,c[v>>2]=53352,c[v+8>>2]=k,c[v+16>>2]=k,v)|0)}else if((g|0)==0){k=c[13336]|0;cf(c[10030]|0,169368,(v=i,i=i+24|0,c[v>>2]=53352,c[v+8>>2]=k,c[v+16>>2]=k,v)|0)}else if((g|0)==1){g=c[13336]|0;cf(c[10030]|0,169264,(v=i,i=i+24|0,c[v>>2]=53352,c[v+8>>2]=g,c[v+16>>2]=g,v)|0)}g=c[10030]|0;l=+(b>>>0>>>0)/10.0;if((c[13354]|0)==0){m=+(d>>>0>>>0)/10.0- +(c[13336]|0)/3.0;cf(g|0,169064,(v=i,i=i+16|0,h[v>>3]=l,h[v+8>>3]=m,v)|0)}else{m=l- +(c[13336]|0)/3.0;l=+(d>>>0>>>0)/10.0;cf(g|0,168968,(v=i,i=i+16|0,h[v>>3]=m,h[v+8>>3]=l,v)|0)}aF(40,c[10030]|0);g=e;while(1){e=a[g]|0;d=g+1|0;b=e<<24>>24;if((e<<24>>24|0)==40|(e<<24>>24|0)==41|(e<<24>>24|0)==92){k=c[10030]|0;aF(92,k|0)}else if((e<<24>>24|0)==0){break}aF(b|0,c[10030]|0);g=d}aI(168944,5,1,c[10030]|0);c[13330]=0;i=f;return}function nw(){var a=0;a=c[11684]|0;if((a|0)!=0){uu(a)}c[11684]=0;return}function nx(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;aF(12,c[10030]|0);b=c[11672]|0;if((b|0)>0){d=b}else{e=c[10030]|0;f=aD(e|0)|0;return}do{d=d-1|0;b=c[11676]|0;g=aa(b,d);h=c[11684]|0;i=b;while(1){if((i|0)<=0){break}j=i-1|0;if((a[h+(g+j|0)|0]|0)==32){i=j}else{k=0;l=b;m=h;n=13169;break}}L17850:do{if((n|0)==13169){while(1){n=0;h=a[m+(aa(l,d)+k|0)|0]|0;aF(h|0,c[10030]|0);h=k+1|0;if((h|0)>=(i|0)){break L17850}k=h;l=c[11676]|0;m=c[11684]|0;n=13169}}}while(0);i=(d|0)>0;if(i|a[46744]^1){h=c[10030]|0;aF(10,h|0)}}while(i);e=c[10030]|0;f=aD(e|0)|0;return}function ny(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0.0,J=0.0;b=i;i=i+48|0;d=b|0;e=b+24|0;f=c[13898]|0;L17860:do{if((f|0)<(c[8272]|0)){g=d|0;j=d+8|0;k=e|0;l=e+8|0;m=f;L17862:while(1){n=c[1054]|0;o=(a[n+(m*40&-1)|0]&1)==0;L17864:do{if(!o){p=c[n+(m*40&-1)+36>>2]|0;q=n+(m*40&-1)+32|0;r=c[10036]|0;s=0;while(1){if((s|0)>=(p|0)){break}if((a[r+((c[q>>2]|0)+s|0)|0]|0)==(a[s+103664|0]|0)){s=s+1|0}else{break L17864}}if((s|0)==1){break L17860}}}while(0);q=c[60192]|0;L17871:do{if((q|0)==0){t=240768}else{r=c[n+(m*40&-1)+36>>2]|0;p=c[n+(m*40&-1)+32>>2]|0;u=(r|0)>0;w=c[10036]|0;x=240768;y=q;while(1){L17875:do{if(!o){if(u){z=0;A=0;B=p;while(1){C=a[y+z|0]|0;if(C<<24>>24==(a[w+(z+B|0)|0]|0)){D=B;E=A}else{if(C<<24>>24!=36){break L17875}D=B-1|0;E=1}F=z+1|0;if((F|0)<(E+r|0)){z=F;A=E;B=D}else{break}}if((E|0)==0){G=F}else{t=x;break L17871}}else{G=0}B=a[y+G|0]|0;if((B<<24>>24|0)==36|(B<<24>>24|0)==0){t=x;break L17871}}}while(0);B=x+8|0;A=c[B>>2]|0;if((A|0)==0){t=B;break}else{x=B;y=A}}}}while(0);o=c[t+4>>2]|0;if((o|0)==4){c[13898]=m+1;H=13201}else if((o|0)==0){c[13898]=m+1;a[46744]=0}else if((o|0)==3){c[13898]=m+1;c[(c[3524]|0)+68>>2]=104;q=(c[3524]|0)+96|0;c[q>>2]=c[q>>2]&-33}else if((o|0)==1){c[13898]=m+1;a[46744]=1}else if((o|0)==2){c[13898]=m+1;c[(c[3524]|0)+68>>2]=74;o=(c[3524]|0)+96|0;c[o>>2]=c[o>>2]|32}else{H=13201}L17894:do{if((H|0)==13201){H=0;o=is(d)|0;q=c[o>>2]|0;if((q|0)==2){I=+h[o+8>>3]}else if((q|0)==3){I=+uz(c[o+8>>2]|0,0)}else if((q|0)==1){I=+(c[o+8>>2]|0)}else{H=13205;break L17862}if((c[g>>2]|0)==3){uu(c[j>>2]|0);c[g>>2]=1}o=~~I;q=c[13898]|0;if((q|0)>=(c[8272]|0)){break}n=c[1054]|0;y=(a[n+(q*40&-1)|0]&1)==0;L17905:do{if(!y){x=c[n+(q*40&-1)+36>>2]|0;r=n+(q*40&-1)+32|0;w=c[10036]|0;p=0;while(1){if((p|0)>=(x|0)){H=13213;break}if((a[w+((c[r>>2]|0)+p|0)|0]|0)==(a[p+103664|0]|0)){p=p+1|0}else{break}}if((H|0)==13213){H=0;if((p|0)==1){break L17894}}if(y){break}r=c[n+(q*40&-1)+36>>2]|0;w=n+(q*40&-1)+32|0;x=c[10036]|0;u=0;while(1){if((u|0)>=(r|0)){break}if((a[x+((c[w>>2]|0)+u|0)|0]|0)==(a[u+148464|0]|0)){u=u+1|0}else{break L17905}}if((u|0)!=1){break}c[13898]=q+1}}while(0);q=is(e)|0;n=c[q>>2]|0;if((n|0)==1){J=+(c[q+8>>2]|0)}else if((n|0)==2){J=+h[q+8>>3]}else if((n|0)==3){J=+uz(c[q+8>>2]|0,0)}else{H=13224;break L17862}if((c[k>>2]|0)==3){uu(c[l>>2]|0);c[k>>2]=1}q=~~J;c[(c[3524]|0)+8>>2]=o;c[11676]=o;c[(c[3524]|0)+12>>2]=q;c[11672]=q}}while(0);m=c[13898]|0;if((m|0)>=(c[8272]|0)){break L17860}}if((H|0)==13224){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((H|0)==13205){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);H=(c[(c[3524]|0)+68>>2]|0)==74?217456:179864;e=c[11676]|0;d=c[11672]|0;be(13048,169488,(v=i,i=i+32|0,c[v>>2]=a[46744]|0?136208:179864,c[v+8>>2]=H,c[v+16>>2]=e,c[v+24>>2]=d,v)|0);i=b;return}function nz(){var a=0,b=0,d=0,e=0,f=0;a=i;b=c[11684]|0;if((b|0)!=0){uu(b)}b=aa((c[11676]<<1)+2|0,(c[11672]|0)+1|0);d=ut(b)|0;do{if((d|0)==0){gk();e=ut(b)|0;if((e|0)!=0){f=e;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=169528,v)|0)}else{f=d}}while(0);c[11684]=f;c[11680]=f+aa(c[11672]|0,c[11676]|0);i=a;return}function nA(){c[59832]=0;c[59834]=0;c[11664]=0;g[11668]=0.0;a[920]=0;return}function nB(){c[59832]=0;c[59834]=0;return}function nC(a){a=a|0;c[11666]=a;return 1}function nD(b,d,e,f,g,i){b=b|0;d=+d;e=+e;f=f|0;g=g|0;i=i|0;if((i|0)==3){c[59572]=c[11678];c[59570]=c[11674];return}else if((i|0)==4){b=c[59570]|0;c[11678]=c[59572];c[11674]=b;return}else{if(a[238320]|0){return}a[238320]=1;c[11232]=43856;h[29791]=e*2.0;a[238304]=g&1;c[59578]=i;a[238296]=f&1;return}}function nE(a){a=a|0;c[11664]=(((a|0)>-1?a:-a|0)|0)%7&-1;return}function nF(a){a=a|0;g[11668]=(a|0)!=0?90.0:0.0;return 1}function nG(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;e=c[11674]|0;f=d-e|0;g=(f|0)>-1?f:-f|0;f=c[11678]|0;h=b-f|0;i=(h|0)>-1?h:-h|0;if((g|0)>(i|0)){j=a[46728]|0;k=j<<24>>24;if((k|0)==1){l=1;m=43;n=58}else if((k|0)==2){l=2;m=43;n=124}else{l=3;m=j;n=j}j=c[11676]|0;do{if(j>>>0>>0|(c[11672]|0)>>>0>>0){o=e}else{k=aa(j,e)+f|0;if((a[(c[11680]|0)+k|0]|0|0)>=(l|0)){o=e;break}a[(c[11684]|0)+k|0]=m;k=aa(c[11676]|0,e)+f|0;a[(c[11680]|0)+k|0]=l&255;o=c[11674]|0}}while(0);j=d-o|0;k=(j|0)>-1?j:-j|0;if((k|0)>1){p=l&255;q=1;r=o;o=j;j=k;while(1){k=c[11678]|0;s=~~(+(q|0)*+(b-k|0)/+(j|0)+.5)+k|0;k=aa(o>>31|1,q)+r|0;t=c[11676]|0;do{if(t>>>0>>0|(c[11672]|0)>>>0>>0){u=r}else{v=s+aa(t,k)|0;if((a[(c[11680]|0)+v|0]|0|0)>=(l|0)){u=r;break}a[(c[11684]|0)+v|0]=n;v=aa(c[11676]|0,k)+s|0;a[(c[11680]|0)+v|0]=p;u=c[11674]|0}}while(0);s=q+1|0;k=d-u|0;t=(k|0)>-1?k:-k|0;if((s|0)<(t|0)){q=s;r=u;o=k;j=t}else{break}}}j=c[11676]|0;if(j>>>0>>0|(c[11672]|0)>>>0>>0){c[11678]=b;c[11674]=d;return}o=aa(j,d)+b|0;if((a[(c[11680]|0)+o|0]|0|0)>=(l|0)){c[11678]=b;c[11674]=d;return}a[(c[11684]|0)+o|0]=m;m=aa(c[11676]|0,d)+b|0;a[(c[11680]|0)+m|0]=l&255;c[11678]=b;c[11674]=d;return}l=a[46728]|0;m=l<<24>>24;if((i|0)<=(g|0)){g=(m-1|0)>>>0<2;o=g?m:3;if((i|0)<0){c[11678]=b;c[11674]=d;return}i=g?43:l;g=o&255;j=0;u=f;r=h;h=e;while(1){q=aa(r>>31|1,j)+u|0;p=aa(d-h>>31|1,j)+h|0;n=c[11676]|0;do{if(n>>>0>>0|(c[11672]|0)>>>0

>>0){w=u}else{t=aa(p,n)+q|0;if((a[(c[11680]|0)+t|0]|0|0)>=(o|0)){w=u;break}a[(c[11684]|0)+t|0]=i;t=aa(c[11676]|0,p)+q|0;a[(c[11680]|0)+t|0]=g;w=c[11678]|0}}while(0);q=j+1|0;p=b-w|0;if((q|0)>(((p|0)>-1?p:-p|0)|0)){break}j=q;u=w;r=p;h=c[11674]|0}c[11678]=b;c[11674]=d;return}if((m|0)==2){x=2;y=43;z=45}else if((m|0)==1){x=1;y=43;z=46}else{x=3;y=l;z=l}l=c[11676]|0;do{if(l>>>0>>0|(c[11672]|0)>>>0>>0){A=f}else{m=aa(l,e)+f|0;if((a[(c[11680]|0)+m|0]|0|0)>=(x|0)){A=f;break}a[(c[11684]|0)+m|0]=y;m=aa(c[11676]|0,e)+f|0;a[(c[11680]|0)+m|0]=x&255;A=c[11678]|0}}while(0);f=b-A|0;e=(f|0)>-1?f:-f|0;if((e|0)>1){l=x&255;m=1;h=A;A=f;f=e;while(1){e=aa(A>>31|1,m)+h|0;r=c[11674]|0;w=~~(+(m|0)*+(d-r|0)/+(f|0)+.5)+r|0;r=c[11676]|0;do{if(r>>>0>>0|(c[11672]|0)>>>0>>0){B=h}else{u=aa(w,r)+e|0;if((a[(c[11680]|0)+u|0]|0|0)>=(x|0)){B=h;break}a[(c[11684]|0)+u|0]=z;u=aa(c[11676]|0,w)+e|0;a[(c[11680]|0)+u|0]=l;B=c[11678]|0}}while(0);e=m+1|0;w=b-B|0;r=(w|0)>-1?w:-w|0;if((e|0)<(r|0)){m=e;h=B;A=w;f=r}else{break}}}f=c[11676]|0;if(f>>>0>>0|(c[11672]|0)>>>0>>0){c[11678]=b;c[11674]=d;return}A=aa(f,d)+b|0;if((a[(c[11680]|0)+A|0]|0|0)>=(x|0)){c[11678]=b;c[11674]=d;return}a[(c[11684]|0)+A|0]=y;y=aa(c[11676]|0,d)+b|0;a[(c[11680]|0)+y|0]=x&255;c[11678]=b;c[11674]=d;return}function nH(b){b=b|0;if((b|0)==(-1|0)){a[46728]=1;return}else if((b|0)==(-2|0)){a[46728]=2;return}else{if((b|0)<-2){a[46728]=32;return}else{a[46728]=a[240816+((b|0)%7&-1)|0]|0;return}}}function nI(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;if((e|0)==-1){f=46}else{f=((e|0)%26&-1)+65&255}e=c[11676]|0;if(e>>>0>>0|(c[11672]|0)>>>0>>0){return}g=aa(e,d)+b|0;if((a[(c[11680]|0)+g|0]|0)>=4){return}a[(c[11684]|0)+g|0]=f;f=aa(c[11676]|0,d)+b|0;a[(c[11680]|0)+f|0]=4;return}function nJ(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;f=uA(e|0)|0;g=c[11676]|0;if((f+b|0)>>>0>g>>>0){h=g-f|0;i=(h|0)<0?0:h}else{i=b}if(i>>>0>>0){j=e;k=i;l=g}else{return}while(1){g=a[j]|0;if(g<<24>>24==0){m=13328;break}do{if(l>>>0>>0|(c[11672]|0)>>>0>>0){n=l}else{i=aa(l,d)+k|0;if((a[(c[11680]|0)+i|0]|0)>=5){n=l;break}a[(c[11684]|0)+i|0]=g;i=aa(c[11676]|0,d)+k|0;a[(c[11680]|0)+i|0]=5;n=c[11676]|0}}while(0);g=k+1|0;if(g>>>0>>0){j=j+1|0;k=g;l=n}else{m=13329;break}}if((m|0)==13329){return}else if((m|0)==13328){return}}function nK(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0;g=a[46728]|0;h=c[11678]|0;i=c[11674]|0;a[46728]=62;c[11678]=b;c[11674]=d;nG(e,f);a[46728]=g;c[11678]=h<<24>>24;c[11674]=i<<24>>24;return}function nL(){var b=0,d=0,e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0;if(!(a[238320]|0)){return}b=c[11678]|0;a[c[11232]|0]=0;d=uA(43856)|0;e=c[11676]|0;L18067:do{if((b|0)<(e|0)){f=b;g=43856;i=e;while(1){j=a[g]|0;if(j<<24>>24==0){break L18067}do{if((a[238304]&1)==0){k=i}else{l=~~(+(c[11674]|0)+ +h[29791]);if(i>>>0>>0|(c[11672]|0)>>>0>>0){k=i;break}m=aa(l,i)+f|0;if((a[(c[11680]|0)+m|0]|0)>=5){k=i;break}a[(c[11684]|0)+m|0]=j;m=aa(c[11676]|0,l)+f|0;a[(c[11680]|0)+m|0]=5;k=c[11676]|0}}while(0);j=f+1|0;if((j|0)<(k|0)){f=j;g=g+1|0;i=k}else{break}}}}while(0);do{if((a[238296]&1)!=0){if((c[59578]|0)==1){c[11678]=(c[11678]|0)+((d|0)/2&-1);break}else{c[11678]=(c[11678]|0)+d;break}}}while(0);a[238320]=0;return}function nM(){var b=0;if(a[920]|0){b=c[10030]|0;aI(170576,11,1,b|0)}aI(169584,19,1,c[10030]|0);return}function nN(){var a=0,b=0,d=0.0,e=0.0;a=i;b=c[3524]|0;d=+((c[b+8>>2]|0)>>>0>>>0)/60.0;e=+((c[b+12>>2]|0)>>>0>>>0)/60.0;cf(c[10030]|0,240336,(v=i,i=i+72|0,h[v>>3]=d,h[v+8>>3]=e,h[v+16>>3]=d,h[v+24>>3]=e,c[v+32>>2]=170312,h[v+40>>3]=1.456,h[v+48>>3]=.0351,h[v+56>>3]=1.0,c[v+64>>2]=169624,v)|0);cf(c[10030]|0,239344,(v=i,i=i+8|0,c[v>>2]=7,v)|0);cf(c[10030]|0,169824,(v=i,i=i+8|0,c[v>>2]=7,v)|0);cf(c[10030]|0,169776,(v=i,i=i+24|0,c[v>>2]=103960,c[v+8>>2]=169624,c[v+16>>2]=170112,v)|0);cf(c[10030]|0,169776,(v=i,i=i+24|0,c[v>>2]=170288,c[v+8>>2]=170288,c[v+16>>2]=170104,v)|0);cf(c[10030]|0,169776,(v=i,i=i+24|0,c[v>>2]=170224,c[v+8>>2]=170224,c[v+16>>2]=170080,v)|0);cf(c[10030]|0,169776,(v=i,i=i+24|0,c[v>>2]=40160,c[v+8>>2]=40160,c[v+16>>2]=170008,v)|0);cf(c[10030]|0,169776,(v=i,i=i+24|0,c[v>>2]=170216,c[v+8>>2]=170216,c[v+16>>2]=169992,v)|0);cf(c[10030]|0,169776,(v=i,i=i+24|0,c[v>>2]=170208,c[v+8>>2]=170208,c[v+16>>2]=169976,v)|0);cf(c[10030]|0,169776,(v=i,i=i+24|0,c[v>>2]=174448,c[v+8>>2]=174448,c[v+16>>2]=169952,v)|0);aI(169632,79,1,c[10030]|0);i=a;return}function nO(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0;e=i;c[59834]=b;c[59832]=d;if(a[920]|0){f=c[10030]|0;aI(170576,11,1,f|0);g=c[59834]|0;j=c[59832]|0}else{g=b;j=d}a[920]=0;d=c[11664]|0;b=c[35224+(d<<2)>>2]|0;f=c[35256+(d<<2)>>2]|0;cf(c[10030]|0,169856,(v=i,i=i+48|0,c[v>>2]=b,c[v+8>>2]=f,c[v+16>>2]=b,c[v+24>>2]=f,h[v+32>>3]=+(g>>>0>>>0)/60.0,h[v+40>>3]=+(j>>>0>>>0)/60.0,v)|0);i=e;return}function nP(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;e=i;c[59834]=b;c[59832]=d;a[920]=1;f=c[11664]|0;g=c[35256+(f<<2)>>2]|0;cf(c[10030]|0,170144,(v=i,i=i+32|0,c[v>>2]=c[35224+(f<<2)>>2],c[v+8>>2]=g,h[v+16>>3]=+(b>>>0>>>0)/60.0,h[v+24>>3]=+(d>>>0>>>0)/60.0,v)|0);i=e;return}function nQ(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0;f=i;j=a[e]|0;if(j<<24>>24==0){i=f;return}else{k=0;l=j}while(1){j=k+1|0;if(l<<24>>24==0){break}k=j;l=a[e+j|0]|0}if(a[920]|0){l=c[10030]|0;aI(170576,11,1,l|0)}a[920]=0;cf(c[10030]|0,170552,(v=i,i=i+8|0,c[v>>2]=103960,v)|0);m=+g[11668];l=c[11666]|0;do{if(m!=90.0){if((l|0)==0){n=+(d>>>0>>>0)-31.2;o=n;p=+(b>>>0>>>0)+ +(k|0)*70.55999999999999;q=n;r=+(b>>>0>>>0);break}else if((l|0)==2){n=+(d>>>0>>>0)-31.2;o=n;p=+(b>>>0>>>0);q=n;r=+(b>>>0>>>0)- +(k|0)*70.55999999999999;break}else if((l|0)==1){n=+(d>>>0>>>0)-31.2;o=n;p=+(b>>>0>>>0);q=n;r=+(b>>>0>>>0)- +(k|0)*70.55999999999999*.5;break}else{o=1.0;p=1.0;q=1.0;r=1.0;break}}else{if((l|0)==2){n=+(b>>>0>>>0)+31.2;o=+(d>>>0>>>0);p=n;q=+(d>>>0>>>0)- +(k|0)*100.8;r=n;break}else if((l|0)==0){n=+(b>>>0>>>0)+31.2;o=+(d>>>0>>>0)+ +(k|0)*70.55999999999999;p=n;q=+(d>>>0>>>0);r=n;break}else if((l|0)==1){n=+(b>>>0>>>0)+31.2;o=+(d>>>0>>>0);p=n;q=+(d>>>0>>>0)- +(k|0)*70.55999999999999*.5;r=n;break}else{o=1.0;p=1.0;q=1.0;r=1.0;break}}}while(0);cf(c[10030]|0,170480,(v=i,i=i+48|0,h[v>>3]=r/60.0,h[v+8>>3]=q/60.0,h[v+16>>3]=1.456,c[v+24>>2]=e,h[v+32>>3]=m,c[v+40>>2]=170312,v)|0);e=c[11666]|0;if((e|0)==0){i=f;return}cf(c[10030]|0,170424,(v=i,i=i+24|0,c[v>>2]=e,h[v+8>>3]=p/60.0,h[v+16>>3]=o/60.0,v)|0);i=f;return}function nR(){var b=0,d=0,e=0,f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0.0,aA=0.0,aB=0,aC=0,aD=0,aE=0,aF=0,aG=0,aH=0,aI=0,aJ=0,aK=0,aL=0,aM=0,aN=0,aO=0,aP=0,aQ=0,aR=0,aS=0,aT=0,aU=0.0,aV=0,aW=0,aX=0.0,aY=0,aZ=0,a_=0,a$=0.0,a0=0.0,a1=0.0,a2=0;b=i;i=i+192|0;d=b|0;e=b+24|0;f=b+48|0;j=b+72|0;k=b+96|0;l=b+120|0;m=b+144|0;n=b+168|0;o=c[13898]|0;p=o-1|0;q=c[1054]|0;r=c[q+(p*40&-1)+36>>2]|0;L18121:do{if((a[q+(p*40&-1)|0]&1)!=0&(r|0)>0){s=c[10036]|0;t=0;u=0;w=c[q+(p*40&-1)+32>>2]|0;while(1){if((a[t+171032|0]|0)==(a[s+(t+w|0)|0]|0)){x=w;y=u}else{if((t|0)!=7){z=13384;break L18121}x=w-1|0;y=1}A=t+1|0;if((A|0)<(y+r|0)){t=A;u=y;w=x}else{break}}if((y|0)!=0){B=o;break}if((t|0)==6|(t|0)==10){B=o}else{z=13384}}else{z=13384}}while(0);if((z|0)==13384){c[(c[3524]|0)+8>>2]=27002;c[(c[3524]|0)+12>>2]=20252;a[46232]=0;a[45624]=0;c[11564]=16777215;a[45056]=0;B=c[13898]|0}o=c[8272]|0;L18134:do{if((B|0)<(o|0)){y=f|0;x=f+8|0;r=l|0;p=l+8|0;q=m|0;w=m+8|0;u=e|0;s=e+8|0;A=d|0;C=d+8|0;D=j|0;E=j+8|0;F=k|0;G=k+8|0;H=0;I=B;J=o;L18136:while(1){K=c[1054]|0;L=a[K+(I*40&-1)|0]|0;M=(L&1)==0;N=c[K+(I*40&-1)+36>>2]|0;O=K+(I*40&-1)+32|0;L18138:do{if(M){P=c[O>>2]|0;z=13456}else{Q=c[10036]|0;R=0;while(1){if((R|0)>=(N|0)){z=13392;break}if((a[Q+((c[O>>2]|0)+R|0)|0]|0)==(a[R+103664|0]|0)){R=R+1|0}else{break}}if((z|0)==13392){z=0;if((R|0)==1){S=H;T=I;break L18134}}Q=c[O>>2]|0;if(!((N|0)>0&(M^1))){P=Q;z=13456;break}U=c[10036]|0;V=0;W=0;X=Q;while(1){if((a[V+170976|0]|0)==(a[U+(V+X|0)|0]|0)){Y=X;Z=W}else{if((V|0)!=2){break}Y=X-1|0;Z=1}_=V+1|0;if((_|0)<(Z+N|0)){V=_;W=Z;X=Y}else{z=13399;break}}do{if((z|0)==13399){z=0;if((Z|0)==0){if(!((V|0)==1|(V|0)==7)){break}}a[45952]=a[216600]|0;a[45953|0]=a[216601|0]|0;a[45954|0]=a[216602|0]|0;a[45955|0]=a[216603|0]|0;a[45956|0]=a[216604|0]|0;a[45957|0]=a[216605|0]|0;g[11486]=12.0;a[45624]=0;a[46232]=0;X=(c[3524]|0)+96|0;c[X>>2]=c[X>>2]&-1025;c[13898]=(c[13898]|0)+1;$=H;break L18138}}while(0);if(M){P=Q;z=13456;break}L18160:do{if((N|0)>0){V=c[10036]|0;X=0;W=0;U=Q;while(1){if((a[X+184472|0]|0)==(a[V+(X+U|0)|0]|0)){aa=U;ab=W}else{if((X|0)!=1){break L18160}aa=U-1|0;ab=1}R=X+1|0;if((R|0)<(ab+N|0)){X=R;W=ab;U=aa}else{break}}if((ab|0)==0){if(!((X|0)==0|(X|0)==10)){break}}a[45624]=1;U=(c[3524]|0)+96|0;c[U>>2]=c[U>>2]|1024;c[13898]=(c[13898]|0)+1;$=H;break L18138}}while(0);if(!((N|0)>0&(M^1))){P=Q;z=13456;break}U=c[10036]|0;W=0;V=0;R=Q;while(1){if((a[W+115600|0]|0)==(a[U+(W+R|0)|0]|0)){ac=R;ad=V}else{if((W|0)!=1){z=13421;break}ac=R-1|0;ad=1}_=W+1|0;if((_|0)<(ad+N|0)){W=_;V=ad;R=ac}else{z=13419;break}}do{if((z|0)==13419){z=0;if((ad|0)!=0){break}if(!((W|0)==0|(W|0)==5)){z=13421}}}while(0);L18183:do{if((z|0)==13421){z=0;if(M){P=Q;z=13456;break L18138}L18186:do{if((N|0)>0){W=c[10036]|0;R=0;V=0;U=Q;while(1){if((a[R+115536|0]|0)==(a[W+(R+U|0)|0]|0)){ae=U;af=V}else{if((R|0)!=1){break L18186}ae=U-1|0;af=1}_=R+1|0;if((_|0)<(af+N|0)){R=_;V=af;U=ae}else{break}}if((af|0)!=0){break L18183}if((R|0)==0|(R|0)==6){break L18183}}}while(0);if(!((N|0)>0&(M^1))){P=Q;z=13456;break L18138}X=c[10036]|0;U=0;V=0;W=Q;while(1){if((a[U+129104|0]|0)==(a[X+(U+W|0)|0]|0)){ag=W;ah=V}else{if((U|0)!=2){break}ag=W-1|0;ah=1}_=U+1|0;if((_|0)<(ah+N|0)){U=_;V=ah;W=ag}else{z=13437;break}}do{if((z|0)==13437){z=0;if((ah|0)==0){if(!((U|0)==1|(U|0)==6)){break}}a[46232]=1;c[13898]=I+1;$=H;break L18138}}while(0);if(M){P=Q;z=13456;break L18138}L18211:do{if((N|0)>0){U=c[10036]|0;W=0;V=0;X=Q;while(1){if((a[W+217776|0]|0)==(a[U+(W+X|0)|0]|0)){ai=X;aj=V}else{if((W|0)!=5){break L18211}ai=X-1|0;aj=1}_=W+1|0;if((_|0)<(aj+N|0)){W=_;V=aj;X=ai}else{break}}if((aj|0)==0){if(!((W|0)==4|(W|0)==7)){break}}a[45616]=1;c[13898]=I+1;$=H;break L18138}}while(0);if(!((N|0)>0&(M^1))){P=Q;z=13456;break L18138}X=c[10036]|0;V=0;do{if((a[V+137232|0]|0)!=(a[X+(V+Q|0)|0]|0)){P=Q;z=13456;break L18138}V=V+1|0;}while((V|0)<(N|0));if((V|0)!=4){P=Q;z=13456;break L18138}a[45616]=0;c[13898]=I+1;$=H;break L18138}}while(0);a[45624]=0;Q=(c[3524]|0)+96|0;c[Q>>2]=c[Q>>2]&-1025;c[13898]=(c[13898]|0)+1;$=H}}while(0);L18232:do{if((z|0)==13456){z=0;O=(J|0)>(I|0);L18234:do{if(O){if(M){ak=I;al=K;am=N;an=P;ao=L;break}Q=c[10036]|0;X=0;while(1){if((X|0)>=(N|0)){break}if((a[Q+(P+X|0)|0]|0)==(a[X+128480|0]|0)){X=X+1|0}else{z=13462;break L18234}}if((X|0)==2){z=13470}else{z=13462}}else{z=13462}}while(0);L18241:do{if((z|0)==13462){z=0;L18243:do{if((N|0)>0&(M^1)){Q=c[10036]|0;V=0;U=0;R=P;while(1){if((a[V+128560|0]|0)==(a[Q+(V+R|0)|0]|0)){ap=R;aq=U}else{if((V|0)!=5){break}ap=R-1|0;aq=1}_=V+1|0;if((_|0)<(aq+N|0)){V=_;U=aq;R=ap}else{z=13468;break}}if((z|0)==13468){z=0;if((aq|0)!=0){z=13470;break L18241}if((V|0)==4|(V|0)==10){z=13470;break L18241}}if(!((N|0)>0&(M^1))){break}R=c[10036]|0;U=0;Q=0;W=P;while(1){if((a[U+115496|0]|0)==(a[R+(U+W|0)|0]|0)){ar=W;as=Q}else{if((U|0)!=1){break L18243}ar=W-1|0;as=1}_=U+1|0;if((_|0)<(as+N|0)){U=_;Q=as;W=ar}else{break}}if((as|0)==0){if(!((U|0)==0|(U|0)==5)){break}}a[46232]=0;c[13898]=I+1;$=H;break L18232}}while(0);L18267:do{if(O){if(M){ak=I;al=K;am=N;an=P;ao=L;break L18241}X=c[10036]|0;W=0;while(1){if((W|0)>=(N|0)){break}if((a[X+(P+W|0)|0]|0)==(a[W+128296|0]|0)){W=W+1|0}else{z=13494;break L18267}}if((W|0)!=2){z=13494}}else{z=13494}}while(0);do{if((z|0)==13494){z=0;if(!((N|0)>0&(M^1))){ak=I;al=K;am=N;an=P;ao=L;break L18241}X=c[10036]|0;U=0;Q=0;R=P;while(1){if((a[U+128400|0]|0)==(a[X+(U+R|0)|0]|0)){at=R;au=Q}else{if((U|0)!=5){break}at=R-1|0;au=1}V=U+1|0;if((V|0)<(au+N|0)){U=V;Q=au;R=at}else{z=13500;break}}if((z|0)==13500){z=0;if((au|0)!=0){break}if((U|0)==4|(U|0)==9){break}}if(M){ak=I;al=K;am=N;an=P;ao=L;break L18241}L18288:do{if((N|0)>0){R=c[10036]|0;Q=0;X=0;W=P;while(1){if((a[Q+122880|0]|0)==(a[R+(Q+W|0)|0]|0)){av=W;aw=X}else{if((Q|0)!=3){break L18288}av=W-1|0;aw=1}V=Q+1|0;if((V|0)<(aw+N|0)){Q=V;X=aw;W=av}else{break}}if((aw|0)==0){if(!((Q|0)==8|(Q|0)==2)){break}}c[13898]=I+1;c[(c[3524]|0)+68>>2]=124;W=(c[3524]|0)+96|0;c[W>>2]=c[W>>2]|32;$=H;break L18232}}while(0);if(!((N|0)>0&(M^1))){ak=I;al=K;am=N;an=P;ao=L;break L18241}U=c[10036]|0;W=0;X=0;R=P;while(1){if((a[W+121536|0]|0)==(a[U+(W+R|0)|0]|0)){ax=R;ay=X}else{if((W|0)!=5){ak=I;al=K;am=N;an=P;ao=L;break L18241}ax=R-1|0;ay=1}V=W+1|0;if((V|0)<(ay+N|0)){W=V;X=ay;R=ax}else{break}}if((ay|0)==0){if(!((W|0)==4|(W|0)==10)){ak=I;al=K;am=N;an=P;ao=L;break L18241}}c[13898]=I+1;c[(c[3524]|0)+68>>2]=102;R=(c[3524]|0)+96|0;c[R>>2]=c[R>>2]&-33;R=c[13898]|0;X=c[1054]|0;ak=R;al=X;am=c[X+(R*40&-1)+36>>2]|0;an=c[X+(R*40&-1)+32>>2]|0;ao=a[X+(R*40&-1)|0]|0;break L18241}}while(0);c[13898]=I+1;R=is(j)|0;X=c[R>>2]|0;if((X|0)==1){az=+(c[R+8>>2]|0)}else if((X|0)==2){az=+h[R+8>>3]}else if((X|0)==3){az=+uz(c[R+8>>2]|0,0)}else{z=13506;break L18136}if((c[D>>2]|0)==3){uu(c[E>>2]|0);c[D>>2]=1}h[5704]=az;if(az>=.1){$=H;break L18232}h[5704]=1.0;$=H;break L18232}}while(0);if((z|0)==13470){z=0;c[13898]=I+1;O=is(k)|0;R=c[O>>2]|0;if((R|0)==2){aA=+h[O+8>>3]}else if((R|0)==1){aA=+(c[O+8>>2]|0)}else if((R|0)==3){aA=+uz(c[O+8>>2]|0,0)}else{z=13474;break L18136}if((c[F>>2]|0)==3){uu(c[G>>2]|0);c[F>>2]=1}h[5778]=aA;if(aA>=.5){$=H;break}h[5778]=1.0;$=H;break}L18334:do{if((ao&1)!=0&(am|0)>0){O=c[10036]|0;R=0;X=0;U=an;while(1){if((a[R+170936|0]|0)==(a[O+(R+U|0)|0]|0)){aB=U;aC=X}else{if((R|0)!=4){aD=H;aE=ak;aF=al;aG=am;aH=an;aI=ao;break L18334}aB=U-1|0;aC=1}V=R+1|0;if((V|0)<(aC+am|0)){R=V;X=aC;U=aB}else{break}}if((aC|0)==0){if(!((R|0)==3|(R|0)==10)){aD=H;aE=ak;aF=al;aG=am;aH=an;aI=ao;break}}c[13898]=ak+1;U=hK()|0;c[11564]=U>>>16&255|U&65280|U<<16&16711680;X=c[13898]|0;O=c[1054]|0;aD=U;aE=X;aF=O;aG=c[O+(X*40&-1)+36>>2]|0;aH=c[O+(X*40&-1)+32>>2]|0;aI=a[O+(X*40&-1)|0]|0}else{aD=H;aE=ak;aF=al;aG=am;aH=an;aI=ao}}while(0);L18347:do{if((aI&1)!=0&(aG|0)>0){X=c[10036]|0;O=0;U=0;V=aH;while(1){if((a[O+170920|0]|0)==(a[X+(O+V|0)|0]|0)){aJ=V;aK=U}else{if((O|0)!=5){aL=aE;aM=aG;aN=aH;aO=aI;break L18347}aJ=V-1|0;aK=1}_=O+1|0;if((_|0)<(aK+aG|0)){O=_;U=aK;V=aJ}else{break}}if((aK|0)==0){if(!((O|0)==4|(O|0)==14)){aL=aE;aM=aG;aN=aH;aO=aI;break}}V=aE+1|0;c[13898]=V;a[45056]=1;aL=V;aM=c[aF+(V*40&-1)+36>>2]|0;aN=c[aF+(V*40&-1)+32>>2]|0;aO=a[aF+(V*40&-1)|0]|0}else{aL=aE;aM=aG;aN=aH;aO=aI}}while(0);V=(aO&1)==0;L18360:do{if((aM|0)>0&(V^1)){U=c[10036]|0;X=0;R=0;_=aN;while(1){if((a[X+90488|0]|0)==(a[U+(X+_|0)|0]|0)){aP=_;aQ=R}else{if((X|0)!=2){break L18360}aP=_-1|0;aQ=1}aR=X+1|0;if((aR|0)<(aQ+aM|0)){X=aR;R=aQ;_=aP}else{break}}if((aQ|0)==0){if(!((X|0)==4|(X|0)==1)){break}}_=aL+1|0;c[13898]=_;L18372:do{if((_|0)<(c[8272]|0)){L18374:do{if((a[aF+(_*40&-1)|0]&1)!=0){R=c[aF+(_*40&-1)+36>>2]|0;U=aF+(_*40&-1)+32|0;O=c[10036]|0;aR=0;while(1){if((aR|0)>=(R|0)){break}if((a[O+((c[U>>2]|0)+aR|0)|0]|0)==(a[aR+103664|0]|0)){aR=aR+1|0}else{break L18374}}if((aR|0)==1){aS=1024;aT=768;z=13584;break L18372}}}while(0);W=is(e)|0;U=c[W>>2]|0;if((U|0)==1){aU=+(c[W+8>>2]|0)}else if((U|0)==2){aU=+h[W+8>>3]}else if((U|0)==3){aU=+uz(c[W+8>>2]|0,0)}else{z=13566;break L18136}if((c[u>>2]|0)==3){uu(c[s>>2]|0);c[u>>2]=1}W=~~aU;U=c[13898]|0;L18389:do{if((c[8272]|0)>(U|0)){O=c[1054]|0;if((a[O+(U*40&-1)|0]&1)==0){aV=768;break}R=c[O+(U*40&-1)+36>>2]|0;Q=O+(U*40&-1)+32|0;O=c[10036]|0;aW=0;while(1){if((aW|0)>=(R|0)){break}if((a[O+((c[Q>>2]|0)+aW|0)|0]|0)==(a[aW+148464|0]|0)){aW=aW+1|0}else{aV=768;break L18389}}if((aW|0)!=1){aV=768;break}c[13898]=U+1;Q=is(d)|0;O=c[Q>>2]|0;if((O|0)==3){aX=+uz(c[Q+8>>2]|0,0)}else if((O|0)==1){aX=+(c[Q+8>>2]|0)}else if((O|0)==2){aX=+h[Q+8>>3]}else{z=13579;break L18136}if((c[A>>2]|0)==3){uu(c[C>>2]|0);c[A>>2]=1}aV=~~aX}else{aV=768}}while(0);if((W|0)>0){aS=W;aT=aV;z=13584}else{aY=aV}}else{aS=1024;aT=768;z=13584}}while(0);if((z|0)==13584){z=0;c[(c[3524]|0)+8>>2]=~~(+(aS|0)*26.37);aY=aT}if((aY|0)>0){c[(c[3524]|0)+12>>2]=~~(+(aY|0)*26.37)}_=c[3524]|0;c[_+28>>2]=((c[_+8>>2]|0)>>>0)/160>>>0;_=c[3524]|0;c[_+24>>2]=c[_+28>>2];$=aD;break L18232}}while(0);_=c[8272]|0;X=(_|0)>(aL|0);L18413:do{if(V|X^1){aZ=aL}else{U=c[10036]|0;Q=0;while(1){if((Q|0)>=(aM|0)){z=13592;break}if((a[U+(aN+Q|0)|0]|0)==(a[Q+128096|0]|0)){Q=Q+1|0}else{break}}do{if((z|0)==13592){z=0;if((Q|0)!=9){break}O=aL+1|0;c[13898]=O;L18421:do{if((O|0)<(_|0)){L18423:do{if((a[aF+(O*40&-1)|0]&1)!=0){R=c[aF+(O*40&-1)+36>>2]|0;aR=aF+(O*40&-1)+32|0;a_=0;while(1){if((a_|0)>=(R|0)){break}if((a[U+((c[aR>>2]|0)+a_|0)|0]|0)==(a[a_+103664|0]|0)){a_=a_+1|0}else{break L18423}}if((a_|0)==1){z=13606;break L18421}}}while(0);aW=is(f)|0;aR=c[aW>>2]|0;if((aR|0)==1){a$=+(c[aW+8>>2]|0)}else if((aR|0)==2){a$=+h[aW+8>>3]}else if((aR|0)==3){a$=+uz(c[aW+8>>2]|0,0)}else{z=13603;break L18136}if((c[y>>2]|0)==3){uu(c[x>>2]|0);c[y>>2]=1}h[5710]=a$;if(a$>0.0){$=aD;break L18232}}else{z=13606}}while(0);if((z|0)==13606){z=0;h[5710]=-1.0}h[5710]=1.0;$=aD;break L18232}}while(0);if(V|X^1){aZ=aL;break}U=c[10036]|0;Q=0;while(1){if((Q|0)>=(aM|0)){break}if((a[U+(aN+Q|0)|0]|0)==(a[Q+124352|0]|0)){Q=Q+1|0}else{aZ=aL;break L18413}}if((Q|0)!=4){aZ=aL;break}U=aL+1|0;c[13898]=U;aZ=U}}while(0);if((aZ|0)>=(_|0)){S=aD;T=aZ;break L18134}L18450:do{if((a[aF+(aZ*40&-1)|0]&1)!=0){X=c[aF+(aZ*40&-1)+36>>2]|0;V=aF+(aZ*40&-1)+32|0;U=c[10036]|0;O=0;while(1){if((O|0)>=(X|0)){break}if((a[U+((c[V>>2]|0)+O|0)|0]|0)==(a[O+103664|0]|0)){O=O+1|0}else{break L18450}}if((O|0)==1){S=aD;T=aZ;break L18134}}}while(0);a[14176]=1;is(l);a[14176]=0;if((c[r>>2]|0)!=3){z=13622;break L18136}_=c[p>>2]|0;if((_|0)==0){z=13624;break L18136}V=bh(_|0,44)|0;do{if((V|0)!=0){if((ca(V+1|0,170912,(v=i,i=i+8|0,c[v>>2]=45944,v)|0)|0)!=1){break}a[V]=0}}while(0);if((a[_]|0)!=0){uF(45952,_|0,255)}uu(_);if((a[(c[1054]|0)+((c[13898]|0)*40&-1)|0]&1)!=0){$=aD;break}V=is(m)|0;U=c[V>>2]|0;if((U|0)==2){a0=+h[V+8>>3]}else if((U|0)==3){a0=+uz(c[V+8>>2]|0,0)}else if((U|0)==1){a0=+(c[V+8>>2]|0)}else{z=13635;break L18136}if((c[q>>2]|0)==3){uu(c[w>>2]|0);c[q>>2]=1}g[11486]=+(~~a0|0);$=aD}}while(0);L=c[13898]|0;N=c[8272]|0;if((L|0)<(N|0)){H=$;I=L;J=N}else{S=$;T=L;break L18134}}if((z|0)==13603){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==13622){c[13898]=aZ;S=aD;T=aZ;break}else if((z|0)==13579){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==13624){S=aD;T=c[13898]|0;break}else if((z|0)==13474){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==13566){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==13506){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((z|0)==13635){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}else{S=0;T=B}}while(0);L18486:do{if((T|0)<(c[8272]|0)){B=c[1054]|0;L18488:do{if((a[B+(T*40&-1)|0]&1)!=0){z=c[B+(T*40&-1)+36>>2]|0;aD=B+(T*40&-1)+32|0;aZ=c[10036]|0;$=0;while(1){if(($|0)>=(z|0)){break}if((a[aZ+((c[aD>>2]|0)+$|0)|0]|0)==(a[$+103664|0]|0)){$=$+1|0}else{break L18488}}if(($|0)==1){break L18486}}}while(0);B=is(n)|0;aD=c[B>>2]|0;if((aD|0)==1){a1=+(c[B+8>>2]|0)}else if((aD|0)==2){a1=+h[B+8>>3]}else if((aD|0)==3){a1=+uz(c[B+8>>2]|0,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}B=n|0;if((c[B>>2]|0)==3){uu(c[n+8>>2]|0);c[B>>2]=1}g[11486]=+(~~a1|0)}}while(0);n4(0);n=a[46232]|0?131584:131504;T=a[45616]|0?137776:137232;a1=+g[11486];be(13048,170872,(v=i,i=i+40|0,c[v>>2]=a[45624]|0?116408:116440,c[v+8>>2]=n,c[v+16>>2]=T,c[v+24>>2]=45952,h[v+32>>3]=a1,v)|0);T=c[3524]|0;if((c[T+96>>2]&32|0)!=0){uD(13048+(uA(13048)|0)|0,170856,11)}a1=+h[5710];if(a1!=1.0){n=13048+(uA(13048)|0)|0;be(n|0,170824,(v=i,i=i+8|0,h[v>>3]=a1,v)|0);a2=c[3524]|0}else{a2=T}T=c[a2+8>>2]|0;n=c[a2+12>>2]|0;if(!((T|0)==27002&(n|0)==20252)){a2=13048+(uA(13048)|0)|0;B=~~(+(T>>>0>>>0)/26.37+.5);T=~~(+(n>>>0>>>0)/26.37+.5);be(a2|0,170728,(v=i,i=i+16|0,c[v>>2]=B,c[v+8>>2]=T,v)|0)}a1=+h[5704];if(a1!=1.0){T=13048+(uA(13048)|0)|0;be(T|0,170680,(v=i,i=i+8|0,h[v>>3]=a1,v)|0)}a1=+h[5778];if(a1!=1.0){T=13048+(uA(13048)|0)|0;be(T|0,170640,(v=i,i=i+8|0,h[v>>3]=a1,v)|0)}if((S|0)==0){i=b;return}be(13048+(uA(13048)|0)|0,170616,(v=i,i=i+8|0,c[v>>2]=S,v)|0);i=b;return}function nS(){c[11296]=0;c[11298]=0;c[11412]=0;c[11262]=0;a[45664]=0;return}function nT(){c[11296]=0;c[11298]=0;a[45664]=0;return}function nU(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0;b=i;i=i+8|0;d=b|0;e=d;tN();a[45664]=0;f=d;g=e+3|0;a[g]=0;h=e+2|0;a[h]=0;j=e+1|0;a[j]=0;a[f]=27;aI(f|0,1,4,c[10030]|0);a[g]=0;a[h]=0;a[j]=0;a[f]=16;aI(f|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;e=c[11300]|0;a[g]=e>>>24&255;a[h]=e>>>16&255;a[j]=e>>>8&255;a[f]=e&255;aI(f|0,1,4,c[10030]|0);e=(c[(c[3524]|0)+12>>2]|0)-(c[11301]|0)|0;a[g]=e>>>24&255;a[h]=e>>>16&255;a[j]=e>>>8&255;a[f]=e&255;aI(f|0,1,4,c[10030]|0);a[g]=0;a[h]=0;a[j]=0;a[f]=37;aI(f|0,1,4,c[10030]|0);a[g]=0;a[h]=0;a[j]=0;a[f]=12;aI(f|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[g]=-128;a[h]=0;a[j]=0;a[f]=10;aI(f|0,1,4,c[10030]|0);a[g]=0;a[h]=0;a[j]=0;a[f]=40;aI(f|0,1,4,c[10030]|0);a[g]=0;a[h]=0;a[j]=0;a[f]=12;aI(f|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[g]=0;a[h]=0;a[j]=0;a[f]=2;aI(f|0,1,4,c[10030]|0);a[g]=0;a[h]=0;a[j]=0;a[f]=37;aI(f|0,1,4,c[10030]|0);a[g]=0;a[h]=0;a[j]=0;a[f]=12;aI(f|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[g]=-128;a[h]=0;a[j]=0;a[f]=7;aI(f|0,1,4,c[10030]|0);a[g]=0;a[h]=0;a[j]=0;a[f]=40;aI(f|0,1,4,c[10030]|0);a[g]=0;a[h]=0;a[j]=0;a[f]=12;aI(f|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[g]=0;a[h]=0;a[j]=0;a[f]=1;aI(f|0,1,4,c[10030]|0);a[g]=0;a[h]=0;a[j]=0;a[f]=37;aI(f|0,1,4,c[10030]|0);a[g]=0;a[h]=0;a[j]=0;a[f]=12;aI(f|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[g]=-128;a[h]=0;a[j]=0;a[f]=0;aI(f|0,1,4,c[10030]|0);a[g]=0;a[h]=0;a[j]=0;a[f]=40;aI(f|0,1,4,c[10030]|0);a[g]=0;a[h]=0;a[j]=0;a[f]=12;aI(f|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[g]=0;a[h]=0;a[j]=0;a[f]=3;aI(f|0,1,4,c[10030]|0);a[g]=0;a[h]=0;a[j]=0;a[f]=14;aI(f|0,1,4,c[10030]|0);a[g]=0;a[h]=0;a[j]=0;a[f]=20;aI(f|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;c[d>>2]=0;aI(f|0,1,4,c[10030]|0);a[g]=0;a[h]=0;a[j]=0;a[f]=16;aI(f|0,1,4,c[10030]|0);a[g]=0;a[h]=0;a[j]=0;a[f]=20;aI(f|0,1,4,c[10030]|0);d=bc(c[10030]|0)|0;cp(c[10030]|0,48,0);a[g]=d>>>24&255;a[h]=d>>>16&255;a[j]=d>>>8&255;a[f]=d&255;aI(f|0,1,4,c[10030]|0);d=c[11294]|0;a[g]=d>>>24&255;a[h]=d>>>16&255;a[j]=d>>>8&255;a[f]=d&255;aI(f|0,1,4,c[10030]|0);cp(c[10030]|0,0,0);i=b;return}function nV(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0.0,k=0,l=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;b=i;i=i+64|0;d=b|0;e=b+48|0;f=b+56|0;g=f;h=c[3524]|0;j=+((c[h+8>>2]|0)>>>0>>>0)/26.37;k=~~(j+.5);l=+((c[h+12>>2]|0)>>>0>>>0)/26.37;h=~~(l+.5);m=~~(j*.263671875+.5);n=~~(l*.2604166666666667+.5);c[11294]=0;o=f;p=g+3|0;a[p]=0;q=g+2|0;a[q]=0;r=g+1|0;a[r]=0;a[o]=1;aI(o|0,1,4,c[10030]|0);a[p]=0;a[q]=0;a[r]=0;a[o]=100;aI(o|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;c[f>>2]=0;aI(o|0,1,4,c[10030]|0);c[f>>2]=0;aI(o|0,1,4,c[10030]|0);g=~~(+((c[(c[3524]|0)+8>>2]|0)>>>0>>>0)/26.37);a[p]=g>>>24&255;a[q]=g>>>16&255;a[r]=g>>>8&255;a[o]=g&255;aI(o|0,1,4,c[10030]|0);g=~~(+((c[(c[3524]|0)+12>>2]|0)>>>0>>>0)/26.37);a[p]=g>>>24&255;a[q]=g>>>16&255;a[r]=g>>>8&255;a[o]=g&255;aI(o|0,1,4,c[10030]|0);c[f>>2]=0;aI(o|0,1,4,c[10030]|0);c[f>>2]=0;aI(o|0,1,4,c[10030]|0);g=c[(c[3524]|0)+8>>2]|0;a[p]=g>>>24&255;a[q]=g>>>16&255;a[r]=g>>>8&255;a[o]=g&255;aI(o|0,1,4,c[10030]|0);g=c[(c[3524]|0)+12>>2]|0;a[p]=g>>>24&255;a[q]=g>>>16&255;a[r]=g>>>8&255;a[o]=g&255;aI(o|0,1,4,c[10030]|0);a[p]=70;a[q]=77;a[r]=69;a[o]=32;aI(o|0,1,4,c[10030]|0);a[p]=0;a[q]=1;a[r]=0;a[o]=0;aI(o|0,1,4,c[10030]|0);c[f>>2]=0;aI(o|0,1,4,c[10030]|0);c[f>>2]=0;aI(o|0,1,4,c[10030]|0);g=e|0;s=e+1|0;a[s]=0;a[g]=4;aI(g|0,1,2,c[10030]|0);a[s]=0;a[g]=0;aI(g|0,1,2,c[10030]|0);c[f>>2]=0;aI(o|0,1,4,c[10030]|0);c[f>>2]=0;aI(o|0,1,4,c[10030]|0);c[f>>2]=0;aI(o|0,1,4,c[10030]|0);a[p]=k>>>24&255;a[q]=k>>>16&255;a[r]=k>>>8&255;a[o]=k&255;aI(o|0,1,4,c[10030]|0);a[p]=h>>>24&255;a[q]=h>>>16&255;a[r]=h>>>8&255;a[o]=h&255;aI(o|0,1,4,c[10030]|0);a[p]=m>>>24&255;a[q]=m>>>16&255;a[r]=m>>>8&255;a[o]=m&255;aI(o|0,1,4,c[10030]|0);a[p]=n>>>24&255;a[q]=n>>>16&255;a[r]=n>>>8&255;a[o]=n&255;aI(o|0,1,4,c[10030]|0);c[f>>2]=0;aI(o|0,1,4,c[10030]|0);c[f>>2]=0;aI(o|0,1,4,c[10030]|0);c[f>>2]=0;aI(o|0,1,4,c[10030]|0);a[45664]=1;a[p]=0;a[q]=0;a[r]=0;a[o]=17;aI(o|0,1,4,c[10030]|0);a[p]=0;a[q]=0;a[r]=0;a[o]=12;aI(o|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[p]=0;a[q]=0;a[r]=0;a[o]=8;aI(o|0,1,4,c[10030]|0);a[p]=0;a[q]=0;a[r]=0;a[o]=9;aI(o|0,1,4,c[10030]|0);a[p]=0;a[q]=0;a[r]=0;a[o]=16;aI(o|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;n=c[(c[3524]|0)+8>>2]|0;a[p]=n>>>24&255;a[q]=n>>>16&255;a[r]=n>>>8&255;a[o]=n&255;aI(o|0,1,4,c[10030]|0);n=c[(c[3524]|0)+12>>2]|0;a[p]=n>>>24&255;a[q]=n>>>16&255;a[r]=n>>>8&255;a[o]=n&255;aI(o|0,1,4,c[10030]|0);a[p]=0;a[q]=0;a[r]=0;a[o]=11;aI(o|0,1,4,c[10030]|0);a[p]=0;a[q]=0;a[r]=0;a[o]=16;aI(o|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;n=~~(+((c[(c[3524]|0)+8>>2]|0)>>>0>>>0)/26.37);a[p]=n>>>24&255;a[q]=n>>>16&255;a[r]=n>>>8&255;a[o]=n&255;aI(o|0,1,4,c[10030]|0);n=~~(+((c[(c[3524]|0)+12>>2]|0)>>>0>>>0)/26.37);a[p]=n>>>24&255;a[q]=n>>>16&255;a[r]=n>>>8&255;a[o]=n&255;aI(o|0,1,4,c[10030]|0);if((c[11564]|0)!=16777215){n=c[3524]|0;m=c[n+8>>2]|0;h=c[n+12>>2]|0;c[d>>2]=0;c[d+4>>2]=0;c[d+12>>2]=m;c[d+16>>2]=0;c[d+24>>2]=m;c[d+28>>2]=h;c[d+36>>2]=0;c[d+40>>2]=h;c[d+8>>2]=0;n9(4,d|0)}a[p]=0;a[q]=0;a[r]=0;a[o]=38;aI(o|0,1,4,c[10030]|0);a[p]=0;a[q]=0;a[r]=0;a[o]=28;aI(o|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[p]=0;a[q]=0;a[r]=0;a[o]=1;aI(o|0,1,4,c[10030]|0);d=a[45616]|0;a[p]=0;a[q]=0;a[r]=d?0:34;a[o]=0;aI(o|0,1,4,c[10030]|0);a[p]=0;a[q]=0;a[r]=0;a[o]=1;aI(o|0,1,4,c[10030]|0);c[f>>2]=0;aI(o|0,1,4,c[10030]|0);c[f>>2]=0;aI(o|0,1,4,c[10030]|0);a[p]=0;a[q]=0;a[r]=0;a[o]=37;aI(o|0,1,4,c[10030]|0);a[p]=0;a[q]=0;a[r]=0;a[o]=12;aI(o|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[p]=0;a[q]=0;a[r]=0;a[o]=1;aI(o|0,1,4,c[10030]|0);a[p]=0;a[q]=0;a[r]=0;a[o]=18;aI(o|0,1,4,c[10030]|0);a[p]=0;a[q]=0;a[r]=0;a[o]=12;aI(o|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[p]=0;a[q]=0;a[r]=0;a[o]=1;aI(o|0,1,4,c[10030]|0);a[p]=0;a[q]=0;a[r]=0;a[o]=39;aI(o|0,1,4,c[10030]|0);a[p]=0;a[q]=0;a[r]=0;a[o]=24;aI(o|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[p]=0;a[q]=0;a[r]=0;a[o]=3;aI(o|0,1,4,c[10030]|0);a[p]=0;a[q]=0;a[r]=0;a[o]=1;aI(o|0,1,4,c[10030]|0);c[f>>2]=0;aI(o|0,1,4,c[10030]|0);c[f>>2]=0;aI(o|0,1,4,c[10030]|0);a[p]=0;a[q]=0;a[r]=0;a[o]=37;aI(o|0,1,4,c[10030]|0);a[p]=0;a[q]=0;a[r]=0;a[o]=12;aI(o|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[p]=0;a[q]=0;a[r]=0;a[o]=3;aI(o|0,1,4,c[10030]|0);n4(0);c[11280]=-5;c[11562]=-5;i=b;return}function nW(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;e=c[3524]|0;if((c[e+8>>2]|0)>>>0>a>>>0){if((c[e+12>>2]|0)>>>0>b>>>0){f=b;g=a}else{h=13676}}else{h=13676}if((h|0)==13676){uh(-1,171048,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=b,v)|0);h=c[3524]|0;e=c[h+8>>2]|0;j=c[h+12>>2]|0;f=j>>>0>b>>>0?b:j;g=e>>>0>a>>>0?a:e}if((g|0)==(c[11298]|0)&(f|0)==(c[11296]|0)){i=d;return}tN();c[11298]=g;c[11296]=f;i=d;return}function nX(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=c[3524]|0;if((c[e+8>>2]|0)>>>0>a>>>0){if((c[e+12>>2]|0)>>>0<=b>>>0){f=13684}}else{f=13684}if((f|0)==13684){uh(-1,171144,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=b,v)|0)}if((c[11298]|0)==(a|0)&(c[11296]|0)==(b|0)){i=d;return}f=c[11560]|0;if((f<<1|0)>102){tN();g=c[11560]|0}else{g=f}if((g|0)==0){c[11300]=c[11298];c[11301]=c[11296];c[11560]=1;h=1}else{h=g}g=h<<1;c[45200+(g<<2)>>2]=a;c[11298]=a;c[45200+((g|1)<<2)>>2]=b;c[11296]=b;c[11560]=h+1;i=d;return}function nY(b){b=b|0;var d=0,e=0,f=0;tN();d=(b|0)==-3?-4:b;c[11412]=d;if((d|0)==-4){e=46256}else{if((d|0)<0|a[45624]){f=7}else{f=(d|0)%15&-1}e=238816+(f<<2)|0}c[11562]=c[e>>2];tN();tL(d);return}function nZ(a){a=a|0;do{if((a|0)==0){if((c[11262]|0)==0){break}c[11262]=0;tO()}else if((a|0)==(-270|0)){if((c[11262]|0)==900){break}c[11262]=900;tO()}else{c[11262]=a*10&-1;tO()}}while(0);return 1}function n_(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;i=i+8|0;e=d|0;c[11414]=b;if((b|0)==2){f=10}else if((b|0)==1){f=14}else{f=8}b=e|0;g=e+3|0;a[g]=0;h=e+2|0;a[h]=0;j=e+1|0;a[j]=0;a[b]=22;aI(b|0,1,4,c[10030]|0);a[g]=0;a[h]=0;a[j]=0;a[b]=12;aI(b|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[g]=0;a[h]=0;a[j]=0;a[b]=f;aI(b|0,1,4,c[10030]|0);i=d;return 1}function n$(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0.0,z=0,A=0,B=0;f=i;i=i+8|0;g=f|0;h=g;j=i;i=i+4|0;i=i+7>>3<<3;k=i;i=i+4|0;i=i+7>>3<<3;l=i;i=i+4|0;i=i+7>>3<<3;m=i;i=i+4|0;i=i+7>>3<<3;n=uA(e|0)|0;do{if(((c[11252]|0)-14|0)>>>0<2){c[l>>2]=e;o=uA(e|0)|0;c[k>>2]=o;p=(o<<1)+2|0;c[j>>2]=p;q=ut(p)|0;do{if((q|0)==0){gk();r=ut(p)|0;if((r|0)!=0){s=r;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=171392,v)|0)}else{s=q}}while(0);c[m>>2]=s;q=bi(171336,((c[11252]|0)==15?171384:171360)|0)|0;if((q|0)==-1){uh(-1,171312,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);t=s;u=o;w=n;break}if((aG(q|0,l|0,k|0,m|0,j|0)|0)==-1){uh(-1,171280,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}cz(q|0);q=p-(c[j>>2]|0)|0;t=s;u=(q|0)/2&-1;w=q}else{t=0;u=n;w=n}}while(0);if((w|0)<1){i=f;return}tN();if((c[11280]|0)!=(c[11562]|0)){n=g;s=h+3|0;a[s]=0;j=h+2|0;a[j]=0;m=h+1|0;a[m]=0;a[n]=24;k=c[10030]|0;aI(n|0,1,4,k|0);a[s]=0;a[j]=0;a[m]=0;a[n]=12;k=c[10030]|0;aI(n|0,1,4,k|0);c[11294]=(c[11294]|0)+1;k=c[11562]|0;a[s]=k>>>24&255;a[j]=k>>>16&255;a[m]=k>>>8&255;a[n]=k&255;k=c[10030]|0;aI(n|0,1,4,k|0);c[11280]=c[11562]}k=(w|0)%4&-1;if((k|0)==0){x=w}else{x=(w+4|0)-k|0}k=((c[11252]|0)-14|0)>>>0<2;n=g;m=h+3|0;a[m]=0;j=h+2|0;a[j]=0;s=h+1|0;a[s]=0;if(k){a[n]=84;k=c[10030]|0;aI(n|0,1,4,k|0);k=((u<<2)+76|0)+x|0;a[m]=k>>>24&255;a[j]=k>>>16&255;a[s]=k>>>8&255;a[n]=k&255;k=c[10030]|0;aI(n|0,1,4,k|0)}else{a[n]=83;k=c[10030]|0;aI(n|0,1,4,k|0);k=((u<<2)+76|0)+x|0;a[m]=k>>>24&255;a[j]=k>>>16&255;a[s]=k>>>8&255;a[n]=k&255;k=c[10030]|0;aI(n|0,1,4,k|0)}c[11294]=(c[11294]|0)+1;c[g>>2]=0;aI(n|0,1,4,c[10030]|0);c[g>>2]=0;aI(n|0,1,4,c[10030]|0);c[g>>2]=0;aI(n|0,1,4,c[10030]|0);c[g>>2]=0;aI(n|0,1,4,c[10030]|0);a[m]=0;a[j]=0;a[s]=0;a[n]=1;aI(n|0,1,4,c[10030]|0);a[m]=65;a[j]=-46;a[s]=-11;a[n]=-61;aI(n|0,1,4,c[10030]|0);a[m]=65;a[j]=-46;a[s]=-11;a[n]=-61;aI(n|0,1,4,c[10030]|0);y=+((c[(c[3524]|0)+16>>2]|0)>>>1>>>0>>>0);k=~~(y*+T(+(+(c[11262]|0)*.0017453292519944445)))+b|0;a[m]=k>>>24&255;a[j]=k>>>16&255;a[s]=k>>>8&255;a[n]=k&255;aI(n|0,1,4,c[10030]|0);k=c[3524]|0;b=(c[k+12>>2]|0)-d|0;y=+((c[k+16>>2]|0)>>>1>>>0>>>0);k=~~(y*+S(+(+(c[11262]|0)*.0017453292519944445)))+b|0;a[m]=k>>>24&255;a[j]=k>>>16&255;a[s]=k>>>8&255;a[n]=k&255;aI(n|0,1,4,c[10030]|0);a[m]=u>>>24&255;a[j]=u>>>16&255;a[s]=u>>>8&255;a[n]=u&255;aI(n|0,1,4,c[10030]|0);a[m]=0;a[j]=0;a[s]=0;a[n]=76;aI(n|0,1,4,c[10030]|0);c[g>>2]=0;aI(n|0,1,4,c[10030]|0);c[g>>2]=0;aI(n|0,1,4,c[10030]|0);c[g>>2]=0;aI(n|0,1,4,c[10030]|0);c[g>>2]=0;aI(n|0,1,4,c[10030]|0);c[g>>2]=0;aI(n|0,1,4,c[10030]|0);c[g>>2]=0;aI(n|0,1,4,c[10030]|0);g=(x|0)>0;do{if(((c[11252]|0)-14|0)>>>0<2){if(g){k=0;do{if((k|0)<(w|0)){z=a[t+k|0]|0}else{z=0}aF(z|0,c[10030]|0);k=k+1|0;}while((k|0)<(x|0))}uu(t)}else{if(g){A=0}else{break}do{if((A|0)<(w|0)){B=a[e+A|0]|0}else{B=0}aF(B|0,c[10030]|0);A=A+1|0;}while((A|0)<(x|0))}}while(0);if((u|0)>0){x=0;do{a[m]=0;a[j]=0;a[s]=1;a[n]=44;aI(n|0,1,4,c[10030]|0);x=x+1|0;}while((x|0)<(u|0))}c[11296]=-2e3;c[11298]=-2e3;i=f;return}function n0(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0,aA=0,aB=0,aC=0,aD=0,aE=0,aF=0,aG=0,aH=0,aJ=0,aK=0,aL=0,aM=0,aN=0,aO=0,aP=0,aQ=0,aR=0,aS=0,aT=0,aU=0,aV=0,aW=0,aX=0,aY=0,aZ=0,a_=0,a$=0,a0=0,a1=0,a2=0,a3=0,a4=0,a5=0,a6=0,a7=0,a8=0,a9=0,ba=0,bb=0,bc=0,bd=0,be=0,bf=0,bg=0,bh=0,bi=0,bj=0,bk=0,bl=0,bm=0,bn=0,bo=0,bp=0,bq=0,br=0,bs=0,bt=0,bu=0,bv=0,bw=0,bx=0,by=0,bz=0,bA=0,bB=0,bC=0,bD=0,bE=0,bF=0,bG=0,bH=0,bI=0,bJ=0,bK=0,bL=0,bM=0,bN=0,bO=0,bP=0,bQ=0,bR=0,bS=0,bT=0,bU=0,bV=0,bW=0,bX=0,bY=0,bZ=0,b_=0,b$=0,b0=0,b1=0,b2=0;f=i;i=i+8|0;g=f|0;h=g;j=i;i=i+144|0;k=j|0;c[j+8>>2]=1601;tN();l=c[11554]|0;c[11554]=0;c[11552]=(c[11552]|0)+1;if((e-69|0)>>>0<5){m=c[11562]|0;c[11562]=c[11564];if((e|0)==71){n0(b,d,8);c[11562]=m;n0(b,d,7);c[11554]=l;n=c[11552]|0;o=n+1|0;c[11552]=o;i=f;return}else if((e|0)==73){n0(b,d,12);c[11562]=m;n0(b,d,11);c[11554]=l;n=c[11552]|0;o=n+1|0;c[11552]=o;i=f;return}else if((e|0)==69){n0(b,d,4);c[11562]=m;n0(b,d,3);c[11554]=l;n=c[11552]|0;o=n+1|0;c[11552]=o;i=f;return}else if((e|0)==70){n0(b,d,6);c[11562]=m;n0(b,d,5);c[11554]=l;n=c[11552]|0;o=n+1|0;c[11552]=o;i=f;return}else if((e|0)==72){n0(b,d,10);c[11562]=m;n0(b,d,9);c[11554]=l;n=c[11552]|0;o=n+1|0;c[11552]=o;i=f;return}else{c[11562]=m;c[11554]=l;n=c[11552]|0;o=n+1|0;c[11552]=o;i=f;return}}m=c[3524]|0;if((c[m+8>>2]|0)>>>0>b>>>0){if((c[m+12>>2]|0)>>>0>d>>>0){p=d;q=b;r=m}else{s=13753}}else{s=13753}if((s|0)==13753){uh(-1,171048,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=d,v)|0);m=c[3524]|0;t=c[m+8>>2]|0;u=c[m+12>>2]|0;p=u>>>0>d>>>0?d:u;q=t>>>0>b>>>0?b:t;r=m}if((q|0)==(c[11298]|0)&(p|0)==(c[11296]|0)){w=r}else{tN();c[11298]=q;c[11296]=p;w=c[3524]|0}r=b+1|0;if((c[w+8>>2]|0)>>>0>r>>>0){if((c[w+12>>2]|0)>>>0>d>>>0){x=q;y=p}else{s=13758}}else{s=13758}if((s|0)==13758){uh(-1,171144,(v=i,i=i+16|0,c[v>>2]=r,c[v+8>>2]=d,v)|0);x=c[11298]|0;y=c[11296]|0}if(!((x|0)==(r|0)&(y|0)==(d|0))){y=c[11560]|0;if((y<<1|0)>102){tN();z=c[11560]|0}else{z=y}if((z|0)==0){c[11300]=c[11298];c[11301]=c[11296];c[11560]=1;A=1}else{A=z}z=A<<1;c[45200+(z<<2)>>2]=r;c[11298]=r;c[45200+((z|1)<<2)>>2]=d;c[11296]=d;c[11560]=A+1}A=(e|0)%13&-1;if((A|0)==10){c[j>>2]=b;c[j+4>>2]=d-(c[11274]|0);e=c[11276]|0;c[j+12>>2]=b-e;z=(c[11270]|0)+d|0;c[j+16>>2]=z;c[j+24>>2]=e+b;c[j+28>>2]=z;n9(3,k);c[11554]=l;n=c[11552]|0;o=n+1|0;c[11552]=o;i=f;return}else if((A|0)==11){z=b-(c[11278]|0)|0;e=c[3524]|0;if((c[e+8>>2]|0)>>>0>z>>>0){if((c[e+12>>2]|0)>>>0>d>>>0){B=d;C=z;D=r;E=d;F=e}else{s=13949}}else{s=13949}if((s|0)==13949){uh(-1,171048,(v=i,i=i+16|0,c[v>>2]=z,c[v+8>>2]=d,v)|0);e=c[3524]|0;y=c[e+8>>2]|0;x=c[e+12>>2]|0;B=x>>>0>d>>>0?d:x;C=y>>>0>z>>>0?z:y;D=c[11298]|0;E=c[11296]|0;F=e}if((C|0)==(D|0)&(B|0)==(E|0)){G=F;H=D;I=E}else{tN();c[11298]=C;c[11296]=B;G=c[3524]|0;H=C;I=B}B=d-(c[11278]|0)|0;if((c[G+8>>2]|0)>>>0>b>>>0){if((c[G+12>>2]|0)>>>0>B>>>0){J=H;K=I}else{s=13954}}else{s=13954}if((s|0)==13954){uh(-1,171144,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=B,v)|0);J=c[11298]|0;K=c[11296]|0}if(!((J|0)==(b|0)&(K|0)==(B|0))){K=c[11560]|0;if((K<<1|0)>102){tN();L=c[11560]|0}else{L=K}if((L|0)==0){c[11300]=c[11298];c[11301]=c[11296];c[11560]=1;M=1}else{M=L}L=M<<1;c[45200+(L<<2)>>2]=b;c[11298]=b;c[45200+((L|1)<<2)>>2]=B;c[11296]=B;c[11560]=M+1}M=(c[11278]|0)+b|0;L=c[3524]|0;if((c[L+8>>2]|0)>>>0>M>>>0){if((c[L+12>>2]|0)>>>0>d>>>0){N=b;O=B}else{s=13963}}else{s=13963}if((s|0)==13963){uh(-1,171144,(v=i,i=i+16|0,c[v>>2]=M,c[v+8>>2]=d,v)|0);N=c[11298]|0;O=c[11296]|0}if(!((N|0)==(M|0)&(O|0)==(d|0))){O=c[11560]|0;if((O<<1|0)>102){tN();P=c[11560]|0}else{P=O}if((P|0)==0){c[11300]=c[11298];c[11301]=c[11296];c[11560]=1;Q=1}else{Q=P}P=Q<<1;c[45200+(P<<2)>>2]=M;c[11298]=M;c[45200+((P|1)<<2)>>2]=d;c[11296]=d;c[11560]=Q+1}Q=(c[11278]|0)+d|0;P=c[3524]|0;if((c[P+8>>2]|0)>>>0>b>>>0){if((c[P+12>>2]|0)>>>0>Q>>>0){R=M;S=d}else{s=13972}}else{s=13972}if((s|0)==13972){uh(-1,171144,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=Q,v)|0);R=c[11298]|0;S=c[11296]|0}if(!((R|0)==(b|0)&(S|0)==(Q|0))){S=c[11560]|0;if((S<<1|0)>102){tN();T=c[11560]|0}else{T=S}if((T|0)==0){c[11300]=c[11298];c[11301]=c[11296];c[11560]=1;U=1}else{U=T}T=U<<1;c[45200+(T<<2)>>2]=b;c[11298]=b;c[45200+((T|1)<<2)>>2]=Q;c[11296]=Q;c[11560]=U+1}tP();c[11554]=l;n=c[11552]|0;o=n+1|0;c[11552]=o;i=f;return}else if((A|0)==12){U=c[11278]|0;c[j>>2]=b-U;c[j+4>>2]=d;c[j+12>>2]=b;c[j+16>>2]=d-U;c[j+24>>2]=U+b;c[j+28>>2]=d;c[j+36>>2]=b;c[j+40>>2]=U+d;n9(4,k);c[11554]=l;n=c[11552]|0;o=n+1|0;c[11552]=o;i=f;return}else if((A|0)==4){U=c[11268]|0;Q=b-U|0;c[j>>2]=Q;T=d-U|0;c[j+4>>2]=T;S=U+b|0;c[j+12>>2]=S;c[j+16>>2]=T;c[j+24>>2]=S;S=U+d|0;c[j+28>>2]=S;c[j+36>>2]=Q;c[j+40>>2]=S;n9(4,k);c[11554]=l;n=c[11552]|0;o=n+1|0;c[11552]=o;i=f;return}else if((A|0)==5){S=(c[(c[3524]|0)+12>>2]|0)-d|0;Q=g;U=h+3|0;a[U]=0;T=h+2|0;a[T]=0;R=h+1|0;a[R]=0;a[Q]=37;aI(Q|0,1,4,c[10030]|0);a[U]=0;a[T]=0;a[R]=0;a[Q]=12;aI(Q|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[U]=-128;a[T]=0;a[R]=0;a[Q]=7;aI(Q|0,1,4,c[10030]|0);a[U]=0;a[T]=0;a[R]=0;a[Q]=37;aI(Q|0,1,4,c[10030]|0);a[U]=0;a[T]=0;a[R]=0;a[Q]=12;aI(Q|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[U]=-128;a[T]=0;a[R]=0;a[Q]=0;aI(Q|0,1,4,c[10030]|0);a[U]=0;a[T]=0;a[R]=0;a[Q]=40;aI(Q|0,1,4,c[10030]|0);a[U]=0;a[T]=0;a[R]=0;a[Q]=12;aI(Q|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[U]=0;a[T]=0;a[R]=0;a[Q]=3;aI(Q|0,1,4,c[10030]|0);a[U]=0;a[T]=0;a[R]=0;a[Q]=39;aI(Q|0,1,4,c[10030]|0);a[U]=0;a[T]=0;a[R]=0;a[Q]=24;aI(Q|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[U]=0;a[T]=0;a[R]=0;a[Q]=3;aI(Q|0,1,4,c[10030]|0);a[U]=0;a[T]=0;a[R]=0;a[Q]=1;aI(Q|0,1,4,c[10030]|0);c[g>>2]=0;aI(Q|0,1,4,c[10030]|0);c[g>>2]=0;aI(Q|0,1,4,c[10030]|0);a[U]=0;a[T]=0;a[R]=0;a[Q]=37;aI(Q|0,1,4,c[10030]|0);a[U]=0;a[T]=0;a[R]=0;a[Q]=12;aI(Q|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[U]=0;a[T]=0;a[R]=0;a[Q]=3;aI(Q|0,1,4,c[10030]|0);a[U]=0;a[T]=0;a[R]=0;a[Q]=40;aI(Q|0,1,4,c[10030]|0);a[U]=0;a[T]=0;a[R]=0;a[Q]=12;aI(Q|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[U]=0;a[T]=0;a[R]=0;a[Q]=1;aI(Q|0,1,4,c[10030]|0);a[U]=0;a[T]=0;a[R]=0;a[Q]=38;aI(Q|0,1,4,c[10030]|0);a[U]=0;a[T]=0;a[R]=0;a[Q]=28;aI(Q|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[U]=0;a[T]=0;a[R]=0;a[Q]=1;aI(Q|0,1,4,c[10030]|0);M=a[45616]|0;a[U]=0;a[T]=0;a[R]=M?0:34;a[Q]=0;aI(Q|0,1,4,c[10030]|0);a[U]=0;a[T]=0;a[R]=0;a[Q]=1;aI(Q|0,1,4,c[10030]|0);c[g>>2]=0;aI(Q|0,1,4,c[10030]|0);M=c[11562]|0;a[U]=M>>>24&255;a[T]=M>>>16&255;a[R]=M>>>8&255;a[Q]=M&255;aI(Q|0,1,4,c[10030]|0);a[U]=0;a[T]=0;a[R]=0;a[Q]=37;aI(Q|0,1,4,c[10030]|0);a[U]=0;a[T]=0;a[R]=0;a[Q]=12;aI(Q|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[U]=0;a[T]=0;a[R]=0;a[Q]=1;aI(Q|0,1,4,c[10030]|0);a[U]=0;a[T]=0;a[R]=0;a[Q]=42;aI(Q|0,1,4,c[10030]|0);a[U]=0;a[T]=0;a[R]=0;a[Q]=24;aI(Q|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;M=b-(c[11278]|0)|0;a[U]=M>>>24&255;a[T]=M>>>16&255;a[R]=M>>>8&255;a[Q]=M&255;aI(Q|0,1,4,c[10030]|0);M=S-(c[11278]|0)|0;a[U]=M>>>24&255;a[T]=M>>>16&255;a[R]=M>>>8&255;a[Q]=M&255;aI(Q|0,1,4,c[10030]|0);M=(c[11278]|0)+b|0;a[U]=M>>>24&255;a[T]=M>>>16&255;a[R]=M>>>8&255;a[Q]=M&255;aI(Q|0,1,4,c[10030]|0);M=(c[11278]|0)+S|0;a[U]=M>>>24&255;a[T]=M>>>16&255;a[R]=M>>>8&255;a[Q]=M&255;aI(Q|0,1,4,c[10030]|0);c[11554]=l;n=c[11552]|0;o=n+1|0;c[11552]=o;i=f;return}else if((A|0)==6){Q=(c[(c[3524]|0)+12>>2]|0)-d|0;M=g;R=h+3|0;a[R]=0;T=h+2|0;a[T]=0;U=h+1|0;a[U]=0;a[M]=37;aI(M|0,1,4,c[10030]|0);a[R]=0;a[T]=0;a[U]=0;a[M]=12;aI(M|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[R]=-128;a[T]=0;a[U]=0;a[M]=0;aI(M|0,1,4,c[10030]|0);a[R]=0;a[T]=0;a[U]=0;a[M]=40;aI(M|0,1,4,c[10030]|0);a[R]=0;a[T]=0;a[U]=0;a[M]=12;aI(M|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[R]=0;a[T]=0;a[U]=0;a[M]=3;aI(M|0,1,4,c[10030]|0);a[R]=0;a[T]=0;a[U]=0;a[M]=39;aI(M|0,1,4,c[10030]|0);a[R]=0;a[T]=0;a[U]=0;a[M]=24;aI(M|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[R]=0;a[T]=0;a[U]=0;a[M]=3;aI(M|0,1,4,c[10030]|0);c[g>>2]=0;aI(M|0,1,4,c[10030]|0);h=c[11562]|0;a[R]=h>>>24&255;a[T]=h>>>16&255;a[U]=h>>>8&255;a[M]=h&255;aI(M|0,1,4,c[10030]|0);c[g>>2]=0;aI(M|0,1,4,c[10030]|0);a[R]=0;a[T]=0;a[U]=0;a[M]=37;aI(M|0,1,4,c[10030]|0);a[R]=0;a[T]=0;a[U]=0;a[M]=12;aI(M|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[R]=0;a[T]=0;a[U]=0;a[M]=3;aI(M|0,1,4,c[10030]|0);a[R]=0;a[T]=0;a[U]=0;a[M]=42;aI(M|0,1,4,c[10030]|0);a[R]=0;a[T]=0;a[U]=0;a[M]=24;aI(M|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;g=b-(c[11278]|0)|0;a[R]=g>>>24&255;a[T]=g>>>16&255;a[U]=g>>>8&255;a[M]=g&255;aI(M|0,1,4,c[10030]|0);g=Q-(c[11278]|0)|0;a[R]=g>>>24&255;a[T]=g>>>16&255;a[U]=g>>>8&255;a[M]=g&255;aI(M|0,1,4,c[10030]|0);g=(c[11278]|0)+b|0;a[R]=g>>>24&255;a[T]=g>>>16&255;a[U]=g>>>8&255;a[M]=g&255;aI(M|0,1,4,c[10030]|0);g=(c[11278]|0)+Q|0;a[R]=g>>>24&255;a[T]=g>>>16&255;a[U]=g>>>8&255;a[M]=g&255;aI(M|0,1,4,c[10030]|0);c[11554]=l;n=c[11552]|0;o=n+1|0;c[11552]=o;i=f;return}else if((A|0)==7){M=(c[11274]|0)+d|0;g=c[3524]|0;if((c[g+8>>2]|0)>>>0>b>>>0){if((c[g+12>>2]|0)>>>0>M>>>0){V=b;W=M;s=13902}else{s=13901}}else{s=13901}if((s|0)==13901){uh(-1,171048,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=M,v)|0);g=c[3524]|0;U=c[g+8>>2]|0;T=U>>>0>b>>>0?b:U;U=c[g+12>>2]|0;R=U>>>0>M>>>0?M:U;U=c[11298]|0;M=c[11296]|0;if((T|0)==(U|0)&(R|0)==(M|0)){X=g;Y=U;Z=M}else{V=T;W=R;s=13902}}if((s|0)==13902){tN();c[11298]=V;c[11296]=W;X=c[3524]|0;Y=V;Z=W}W=b-(c[11276]|0)|0;V=d-(c[11270]|0)|0;if((c[X+8>>2]|0)>>>0>W>>>0){if((c[X+12>>2]|0)>>>0>V>>>0){_=Y;$=Z}else{s=13905}}else{s=13905}if((s|0)==13905){uh(-1,171144,(v=i,i=i+16|0,c[v>>2]=W,c[v+8>>2]=V,v)|0);_=c[11298]|0;$=c[11296]|0}if(!((_|0)==(W|0)&($|0)==(V|0))){$=c[11560]|0;if(($<<1|0)>102){tN();aa=c[11560]|0}else{aa=$}if((aa|0)==0){c[11300]=c[11298];c[11301]=c[11296];c[11560]=1;ab=1}else{ab=aa}aa=ab<<1;c[45200+(aa<<2)>>2]=W;c[11298]=W;c[45200+((aa|1)<<2)>>2]=V;c[11296]=V;c[11560]=ab+1}ab=(c[11276]|0)+b|0;aa=d-(c[11270]|0)|0;$=c[3524]|0;if((c[$+8>>2]|0)>>>0>ab>>>0){if((c[$+12>>2]|0)>>>0>aa>>>0){ac=W;ad=V}else{s=13914}}else{s=13914}if((s|0)==13914){uh(-1,171144,(v=i,i=i+16|0,c[v>>2]=ab,c[v+8>>2]=aa,v)|0);ac=c[11298]|0;ad=c[11296]|0}if(!((ac|0)==(ab|0)&(ad|0)==(aa|0))){ad=c[11560]|0;if((ad<<1|0)>102){tN();ae=c[11560]|0}else{ae=ad}if((ae|0)==0){c[11300]=c[11298];c[11301]=c[11296];c[11560]=1;af=1}else{af=ae}ae=af<<1;c[45200+(ae<<2)>>2]=ab;c[11298]=ab;c[45200+((ae|1)<<2)>>2]=aa;c[11296]=aa;c[11560]=af+1}tP();c[11554]=l;n=c[11552]|0;o=n+1|0;c[11552]=o;i=f;return}else if((A|0)==1){af=c[11268]|0;aa=b-af|0;ae=d-af|0;af=c[3524]|0;if((c[af+8>>2]|0)>>>0>aa>>>0){if((c[af+12>>2]|0)>>>0>ae>>>0){ag=ae;ah=aa;ai=r;aj=d;ak=af}else{s=13796}}else{s=13796}if((s|0)==13796){uh(-1,171048,(v=i,i=i+16|0,c[v>>2]=aa,c[v+8>>2]=ae,v)|0);af=c[3524]|0;ab=c[af+8>>2]|0;ad=c[af+12>>2]|0;ag=ad>>>0>ae>>>0?ae:ad;ah=ab>>>0>aa>>>0?aa:ab;ai=c[11298]|0;aj=c[11296]|0;ak=af}if((ah|0)==(ai|0)&(ag|0)==(aj|0)){al=ak;am=ai;an=aj}else{tN();c[11298]=ah;c[11296]=ag;al=c[3524]|0;am=ah;an=ag}ag=c[11268]|0;ah=ag+b|0;aj=ag+d|0;if((c[al+8>>2]|0)>>>0>ah>>>0){if((c[al+12>>2]|0)>>>0>aj>>>0){ao=am;ap=an}else{s=13801}}else{s=13801}if((s|0)==13801){uh(-1,171144,(v=i,i=i+16|0,c[v>>2]=ah,c[v+8>>2]=aj,v)|0);ao=c[11298]|0;ap=c[11296]|0}if(!((ao|0)==(ah|0)&(ap|0)==(aj|0))){ap=c[11560]|0;if((ap<<1|0)>102){tN();aq=c[11560]|0}else{aq=ap}if((aq|0)==0){c[11300]=c[11298];c[11301]=c[11296];c[11560]=1;ar=1}else{ar=aq}aq=ar<<1;c[45200+(aq<<2)>>2]=ah;c[11298]=ah;c[45200+((aq|1)<<2)>>2]=aj;c[11296]=aj;c[11560]=ar+1}ar=c[11268]|0;aq=b-ar|0;ap=ar+d|0;ar=c[3524]|0;if((c[ar+8>>2]|0)>>>0>aq>>>0){if((c[ar+12>>2]|0)>>>0>ap>>>0){as=ap;at=aq;au=ah;av=aj;aw=ar}else{s=13810}}else{s=13810}if((s|0)==13810){uh(-1,171048,(v=i,i=i+16|0,c[v>>2]=aq,c[v+8>>2]=ap,v)|0);ar=c[3524]|0;aj=c[ar+8>>2]|0;ah=c[ar+12>>2]|0;as=ah>>>0>ap>>>0?ap:ah;at=aj>>>0>aq>>>0?aq:aj;au=c[11298]|0;av=c[11296]|0;aw=ar}if((at|0)==(au|0)&(as|0)==(av|0)){ax=aw;ay=au;az=av}else{tN();c[11298]=at;c[11296]=as;ax=c[3524]|0;ay=at;az=as}as=c[11268]|0;at=as+b|0;av=d-as|0;if((c[ax+8>>2]|0)>>>0>at>>>0){if((c[ax+12>>2]|0)>>>0>av>>>0){aA=ay;aB=az}else{s=13815}}else{s=13815}if((s|0)==13815){uh(-1,171144,(v=i,i=i+16|0,c[v>>2]=at,c[v+8>>2]=av,v)|0);aA=c[11298]|0;aB=c[11296]|0}if((aA|0)==(at|0)&(aB|0)==(av|0)){c[11554]=l;n=c[11552]|0;o=n+1|0;c[11552]=o;i=f;return}aB=c[11560]|0;if((aB<<1|0)>102){tN();aC=c[11560]|0}else{aC=aB}if((aC|0)==0){c[11300]=c[11298];c[11301]=c[11296];c[11560]=1;aD=1}else{aD=aC}aC=aD<<1;c[45200+(aC<<2)>>2]=at;c[11298]=at;c[45200+((aC|1)<<2)>>2]=av;c[11296]=av;c[11560]=aD+1;c[11554]=l;n=c[11552]|0;o=n+1|0;c[11552]=o;i=f;return}else if((A|0)==8){c[j>>2]=b;c[j+4>>2]=(c[11274]|0)+d;aD=c[11276]|0;c[j+12>>2]=b-aD;av=d-(c[11270]|0)|0;c[j+16>>2]=av;c[j+24>>2]=aD+b;c[j+28>>2]=av;n9(3,k);c[11554]=l;n=c[11552]|0;o=n+1|0;c[11552]=o;i=f;return}else if((A|0)==9){k=d-(c[11274]|0)|0;av=c[3524]|0;if((c[av+8>>2]|0)>>>0>b>>>0){if((c[av+12>>2]|0)>>>0>k>>>0){aE=b;aF=k;s=13926}else{s=13925}}else{s=13925}if((s|0)==13925){uh(-1,171048,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=k,v)|0);av=c[3524]|0;j=c[av+8>>2]|0;aD=j>>>0>b>>>0?b:j;j=c[av+12>>2]|0;aC=j>>>0>k>>>0?k:j;j=c[11298]|0;k=c[11296]|0;if((aD|0)==(j|0)&(aC|0)==(k|0)){aG=av;aH=j;aJ=k}else{aE=aD;aF=aC;s=13926}}if((s|0)==13926){tN();c[11298]=aE;c[11296]=aF;aG=c[3524]|0;aH=aE;aJ=aF}aF=b-(c[11276]|0)|0;aE=(c[11270]|0)+d|0;if((c[aG+8>>2]|0)>>>0>aF>>>0){if((c[aG+12>>2]|0)>>>0>aE>>>0){aK=aH;aL=aJ}else{s=13929}}else{s=13929}if((s|0)==13929){uh(-1,171144,(v=i,i=i+16|0,c[v>>2]=aF,c[v+8>>2]=aE,v)|0);aK=c[11298]|0;aL=c[11296]|0}if(!((aK|0)==(aF|0)&(aL|0)==(aE|0))){aL=c[11560]|0;if((aL<<1|0)>102){tN();aM=c[11560]|0}else{aM=aL}if((aM|0)==0){c[11300]=c[11298];c[11301]=c[11296];c[11560]=1;aN=1}else{aN=aM}aM=aN<<1;c[45200+(aM<<2)>>2]=aF;c[11298]=aF;c[45200+((aM|1)<<2)>>2]=aE;c[11296]=aE;c[11560]=aN+1}aN=(c[11276]|0)+b|0;aM=(c[11270]|0)+d|0;aL=c[3524]|0;if((c[aL+8>>2]|0)>>>0>aN>>>0){if((c[aL+12>>2]|0)>>>0>aM>>>0){aO=aF;aP=aE}else{s=13938}}else{s=13938}if((s|0)==13938){uh(-1,171144,(v=i,i=i+16|0,c[v>>2]=aN,c[v+8>>2]=aM,v)|0);aO=c[11298]|0;aP=c[11296]|0}if(!((aO|0)==(aN|0)&(aP|0)==(aM|0))){aP=c[11560]|0;if((aP<<1|0)>102){tN();aQ=c[11560]|0}else{aQ=aP}if((aQ|0)==0){c[11300]=c[11298];c[11301]=c[11296];c[11560]=1;aR=1}else{aR=aQ}aQ=aR<<1;c[45200+(aQ<<2)>>2]=aN;c[11298]=aN;c[45200+((aQ|1)<<2)>>2]=aM;c[11296]=aM;c[11560]=aR+1}tP();c[11554]=l;n=c[11552]|0;o=n+1|0;c[11552]=o;i=f;return}else if((A|0)==2){aR=d-(c[11278]|0)|0;aM=c[3524]|0;if((c[aM+8>>2]|0)>>>0>b>>>0){if((c[aM+12>>2]|0)>>>0>aR>>>0){aS=b;aT=aR;s=13825}else{s=13824}}else{s=13824}if((s|0)==13824){uh(-1,171048,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=aR,v)|0);aM=c[3524]|0;aQ=c[aM+8>>2]|0;aN=aQ>>>0>b>>>0?b:aQ;aQ=c[aM+12>>2]|0;aP=aQ>>>0>aR>>>0?aR:aQ;aQ=c[11298]|0;aR=c[11296]|0;if((aN|0)==(aQ|0)&(aP|0)==(aR|0)){aU=aM;aV=aQ;aW=aR}else{aS=aN;aT=aP;s=13825}}if((s|0)==13825){tN();c[11298]=aS;c[11296]=aT;aU=c[3524]|0;aV=aS;aW=aT}aT=(c[11278]|0)+d|0;if((c[aU+8>>2]|0)>>>0>b>>>0){if((c[aU+12>>2]|0)>>>0>aT>>>0){aX=aV;aY=aW}else{s=13828}}else{s=13828}if((s|0)==13828){uh(-1,171144,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=aT,v)|0);aX=c[11298]|0;aY=c[11296]|0}if(!((aX|0)==(b|0)&(aY|0)==(aT|0))){aY=c[11560]|0;if((aY<<1|0)>102){tN();aZ=c[11560]|0}else{aZ=aY}if((aZ|0)==0){c[11300]=c[11298];c[11301]=c[11296];c[11560]=1;a_=1}else{a_=aZ}aZ=a_<<1;c[45200+(aZ<<2)>>2]=b;c[11298]=b;c[45200+((aZ|1)<<2)>>2]=aT;c[11296]=aT;c[11560]=a_+1}a_=(c[11266]|0)+b|0;aZ=d-(c[11272]|0)|0;aY=c[3524]|0;if((c[aY+8>>2]|0)>>>0>a_>>>0){if((c[aY+12>>2]|0)>>>0>aZ>>>0){a$=aZ;a0=a_;a1=b;a2=aT;a3=aY}else{s=13837}}else{s=13837}if((s|0)==13837){uh(-1,171048,(v=i,i=i+16|0,c[v>>2]=a_,c[v+8>>2]=aZ,v)|0);aY=c[3524]|0;aT=c[aY+8>>2]|0;aX=c[aY+12>>2]|0;a$=aX>>>0>aZ>>>0?aZ:aX;a0=aT>>>0>a_>>>0?a_:aT;a1=c[11298]|0;a2=c[11296]|0;a3=aY}if((a0|0)==(a1|0)&(a$|0)==(a2|0)){a4=a3;a5=a1;a6=a2}else{tN();c[11298]=a0;c[11296]=a$;a4=c[3524]|0;a5=a0;a6=a$}a$=b-(c[11266]|0)|0;a0=(c[11272]|0)+d|0;if((c[a4+8>>2]|0)>>>0>a$>>>0){if((c[a4+12>>2]|0)>>>0>a0>>>0){a7=a5;a8=a6}else{s=13842}}else{s=13842}if((s|0)==13842){uh(-1,171144,(v=i,i=i+16|0,c[v>>2]=a$,c[v+8>>2]=a0,v)|0);a7=c[11298]|0;a8=c[11296]|0}if(!((a7|0)==(a$|0)&(a8|0)==(a0|0))){a8=c[11560]|0;if((a8<<1|0)>102){tN();a9=c[11560]|0}else{a9=a8}if((a9|0)==0){c[11300]=c[11298];c[11301]=c[11296];c[11560]=1;ba=1}else{ba=a9}a9=ba<<1;c[45200+(a9<<2)>>2]=a$;c[11298]=a$;c[45200+((a9|1)<<2)>>2]=a0;c[11296]=a0;c[11560]=ba+1}ba=(c[11266]|0)+b|0;a9=(c[11272]|0)+d|0;a8=c[3524]|0;if((c[a8+8>>2]|0)>>>0>ba>>>0){if((c[a8+12>>2]|0)>>>0>a9>>>0){bb=a9;bc=ba;bd=a$;be=a0;bf=a8}else{s=13851}}else{s=13851}if((s|0)==13851){uh(-1,171048,(v=i,i=i+16|0,c[v>>2]=ba,c[v+8>>2]=a9,v)|0);a8=c[3524]|0;a0=c[a8+8>>2]|0;a$=c[a8+12>>2]|0;bb=a$>>>0>a9>>>0?a9:a$;bc=a0>>>0>ba>>>0?ba:a0;bd=c[11298]|0;be=c[11296]|0;bf=a8}if((bc|0)==(bd|0)&(bb|0)==(be|0)){bg=bf;bh=bd;bi=be}else{tN();c[11298]=bc;c[11296]=bb;bg=c[3524]|0;bh=bc;bi=bb}bb=b-(c[11266]|0)|0;bc=d-(c[11272]|0)|0;if((c[bg+8>>2]|0)>>>0>bb>>>0){if((c[bg+12>>2]|0)>>>0>bc>>>0){bj=bh;bk=bi}else{s=13856}}else{s=13856}if((s|0)==13856){uh(-1,171144,(v=i,i=i+16|0,c[v>>2]=bb,c[v+8>>2]=bc,v)|0);bj=c[11298]|0;bk=c[11296]|0}if((bj|0)==(bb|0)&(bk|0)==(bc|0)){c[11554]=l;n=c[11552]|0;o=n+1|0;c[11552]=o;i=f;return}bk=c[11560]|0;if((bk<<1|0)>102){tN();bl=c[11560]|0}else{bl=bk}if((bl|0)==0){c[11300]=c[11298];c[11301]=c[11296];c[11560]=1;bm=1}else{bm=bl}bl=bm<<1;c[45200+(bl<<2)>>2]=bb;c[11298]=bb;c[45200+((bl|1)<<2)>>2]=bc;c[11296]=bc;c[11560]=bm+1;c[11554]=l;n=c[11552]|0;o=n+1|0;c[11552]=o;i=f;return}else if((A|0)==0){bm=b-(c[11278]|0)|0;bc=c[3524]|0;if((c[bc+8>>2]|0)>>>0>bm>>>0){if((c[bc+12>>2]|0)>>>0>d>>>0){bn=d;bo=bm;bp=r;bq=d;br=bc}else{s=13768}}else{s=13768}if((s|0)==13768){uh(-1,171048,(v=i,i=i+16|0,c[v>>2]=bm,c[v+8>>2]=d,v)|0);bc=c[3524]|0;bl=c[bc+8>>2]|0;bb=c[bc+12>>2]|0;bn=bb>>>0>d>>>0?d:bb;bo=bl>>>0>bm>>>0?bm:bl;bp=c[11298]|0;bq=c[11296]|0;br=bc}if((bo|0)==(bp|0)&(bn|0)==(bq|0)){bs=br;bt=bp;bu=bq}else{tN();c[11298]=bo;c[11296]=bn;bs=c[3524]|0;bt=bo;bu=bn}bn=(c[11278]|0)+b|0;if((c[bs+8>>2]|0)>>>0>bn>>>0){if((c[bs+12>>2]|0)>>>0>d>>>0){bv=bt;bw=bu}else{s=13773}}else{s=13773}if((s|0)==13773){uh(-1,171144,(v=i,i=i+16|0,c[v>>2]=bn,c[v+8>>2]=d,v)|0);bv=c[11298]|0;bw=c[11296]|0}if(!((bv|0)==(bn|0)&(bw|0)==(d|0))){bw=c[11560]|0;if((bw<<1|0)>102){tN();bx=c[11560]|0}else{bx=bw}if((bx|0)==0){c[11300]=c[11298];c[11301]=c[11296];c[11560]=1;by=1}else{by=bx}bx=by<<1;c[45200+(bx<<2)>>2]=bn;c[11298]=bn;c[45200+((bx|1)<<2)>>2]=d;c[11296]=d;c[11560]=by+1}by=d-(c[11278]|0)|0;bx=c[3524]|0;if((c[bx+8>>2]|0)>>>0>b>>>0){if((c[bx+12>>2]|0)>>>0>by>>>0){bz=by;bA=b;bB=bn;bC=d;bD=bx}else{s=13782}}else{s=13782}if((s|0)==13782){uh(-1,171048,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=by,v)|0);bx=c[3524]|0;bn=c[bx+8>>2]|0;bw=c[bx+12>>2]|0;bz=bw>>>0>by>>>0?by:bw;bA=bn>>>0>b>>>0?b:bn;bB=c[11298]|0;bC=c[11296]|0;bD=bx}if((bA|0)==(bB|0)&(bz|0)==(bC|0)){bE=bD;bF=bB;bG=bC}else{tN();c[11298]=bA;c[11296]=bz;bE=c[3524]|0;bF=bA;bG=bz}bz=(c[11278]|0)+d|0;if((c[bE+8>>2]|0)>>>0>b>>>0){if((c[bE+12>>2]|0)>>>0>bz>>>0){bH=bF;bI=bG}else{s=13787}}else{s=13787}if((s|0)==13787){uh(-1,171144,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=bz,v)|0);bH=c[11298]|0;bI=c[11296]|0}if((bH|0)==(b|0)&(bI|0)==(bz|0)){c[11554]=l;n=c[11552]|0;o=n+1|0;c[11552]=o;i=f;return}bI=c[11560]|0;if((bI<<1|0)>102){tN();bJ=c[11560]|0}else{bJ=bI}if((bJ|0)==0){c[11300]=c[11298];c[11301]=c[11296];c[11560]=1;bK=1}else{bK=bJ}bJ=bK<<1;c[45200+(bJ<<2)>>2]=b;c[11298]=b;c[45200+((bJ|1)<<2)>>2]=bz;c[11296]=bz;c[11560]=bK+1;c[11554]=l;n=c[11552]|0;o=n+1|0;c[11552]=o;i=f;return}else if((A|0)==3){A=c[11268]|0;bK=b-A|0;bz=d-A|0;A=c[3524]|0;if((c[A+8>>2]|0)>>>0>bK>>>0){if((c[A+12>>2]|0)>>>0>bz>>>0){bL=bz;bM=bK;bN=r;bO=d;bP=A}else{s=13865}}else{s=13865}if((s|0)==13865){uh(-1,171048,(v=i,i=i+16|0,c[v>>2]=bK,c[v+8>>2]=bz,v)|0);A=c[3524]|0;r=c[A+8>>2]|0;bJ=c[A+12>>2]|0;bL=bJ>>>0>bz>>>0?bz:bJ;bM=r>>>0>bK>>>0?bK:r;bN=c[11298]|0;bO=c[11296]|0;bP=A}if((bM|0)==(bN|0)&(bL|0)==(bO|0)){bQ=bP;bR=bN;bS=bO}else{tN();c[11298]=bM;c[11296]=bL;bQ=c[3524]|0;bR=bM;bS=bL}bL=c[11268]|0;bM=bL+b|0;bO=d-bL|0;if((c[bQ+8>>2]|0)>>>0>bM>>>0){if((c[bQ+12>>2]|0)>>>0>bO>>>0){bT=bR;bU=bS}else{s=13870}}else{s=13870}if((s|0)==13870){uh(-1,171144,(v=i,i=i+16|0,c[v>>2]=bM,c[v+8>>2]=bO,v)|0);bT=c[11298]|0;bU=c[11296]|0}if(!((bT|0)==(bM|0)&(bU|0)==(bO|0))){bU=c[11560]|0;if((bU<<1|0)>102){tN();bV=c[11560]|0}else{bV=bU}if((bV|0)==0){c[11300]=c[11298];c[11301]=c[11296];c[11560]=1;bW=1}else{bW=bV}bV=bW<<1;c[45200+(bV<<2)>>2]=bM;c[11298]=bM;c[45200+((bV|1)<<2)>>2]=bO;c[11296]=bO;c[11560]=bW+1}bW=c[11268]|0;bV=bW+b|0;bU=bW+d|0;bW=c[3524]|0;if((c[bW+8>>2]|0)>>>0>bV>>>0){if((c[bW+12>>2]|0)>>>0>bU>>>0){bX=bM;bY=bO}else{s=13879}}else{s=13879}if((s|0)==13879){uh(-1,171144,(v=i,i=i+16|0,c[v>>2]=bV,c[v+8>>2]=bU,v)|0);bX=c[11298]|0;bY=c[11296]|0}if(!((bX|0)==(bV|0)&(bY|0)==(bU|0))){bY=c[11560]|0;if((bY<<1|0)>102){tN();bZ=c[11560]|0}else{bZ=bY}if((bZ|0)==0){c[11300]=c[11298];c[11301]=c[11296];c[11560]=1;b_=1}else{b_=bZ}bZ=b_<<1;c[45200+(bZ<<2)>>2]=bV;c[11298]=bV;c[45200+((bZ|1)<<2)>>2]=bU;c[11296]=bU;c[11560]=b_+1}b_=c[11268]|0;bZ=b-b_|0;b=b_+d|0;d=c[3524]|0;if((c[d+8>>2]|0)>>>0>bZ>>>0){if((c[d+12>>2]|0)>>>0>b>>>0){b$=bV;b0=bU}else{s=13888}}else{s=13888}if((s|0)==13888){uh(-1,171144,(v=i,i=i+16|0,c[v>>2]=bZ,c[v+8>>2]=b,v)|0);b$=c[11298]|0;b0=c[11296]|0}if(!((b$|0)==(bZ|0)&(b0|0)==(b|0))){b0=c[11560]|0;if((b0<<1|0)>102){tN();b1=c[11560]|0}else{b1=b0}if((b1|0)==0){c[11300]=c[11298];c[11301]=c[11296];c[11560]=1;b2=1}else{b2=b1}b1=b2<<1;c[45200+(b1<<2)>>2]=bZ;c[11298]=bZ;c[45200+((b1|1)<<2)>>2]=b;c[11296]=b;c[11560]=b2+1}tP();c[11554]=l;n=c[11552]|0;o=n+1|0;c[11552]=o;i=f;return}else{c[11554]=l;n=c[11552]|0;o=n+1|0;c[11552]=o;i=f;return}}function n1(a){a=a|0;return 0}function n2(){return}function n3(b,d,e,f,i,j){b=b|0;d=+d;e=+e;f=f|0;i=i|0;j=j|0;if((j|0)==3){c[59568]=c[11298];c[59566]=c[11296];return}else if((j|0)==4){c[11298]=c[59568];c[11296]=c[59566];return}else{if(a[238232]|0){return}a[238232]=1;c[11232]=43856;c[59562]=b;g[59560]=d;g[59564]=+h[5710]*e;a[238216]=i&1;c[59556]=j;return}}function n4(b){b=b|0;var d=0,e=0,f=0,j=0,k=0,l=0.0;d=i;i=i+8|0;e=d|0;L19029:do{if((b|0)!=45688){do{if((b|0)!=0){if((a[b]|0)==0){break}f=bk(b|0,148464)|0;do{if((f|0)>0){j=f+1|0;k=(j|0)<32?j:32;uF(45688,b|0,k|0);if((uA(b|0)|0)>>>0>>0){break}a[45688+((k|0)==0?0:k-1|0)|0]=0}}while(0);if(f>>>0>=(uA(b|0)|0)>>>0){break L19029}if((ca(b+(f+1|0)|0,205104,(v=i,i=i+8|0,c[v>>2]=e,v)|0)|0)==0){break L19029}g[11418]=+g[e>>2];break L19029}}while(0);uB(45688,45952);g[11418]=+g[11486]}}while(0);do{if((aY(238560,45688)|0)==0){if(+g[59638]!=+g[11418]){break}i=d;return 1}}while(0);uF(238560,45688,256);if((uA(45688)|0)>>>0>=256){a[238815]=0}l=+g[11418];g[59638]=l;c[(c[3524]|0)+20>>2]=~~(+h[5710]*l*35.28*.6);c[(c[3524]|0)+16>>2]=~~(+h[5710]*+g[11418]*35.28*1.3);tO();i=d;return 1}function n5(a){a=+a;var b=0;b=~~((a<0.0?1.0:a)*+((c[(c[3524]|0)+28>>2]|0)>>>0>>>0));c[11278]=b;c[11268]=~~+O(+(+(b|0)*.707+.5));c[11266]=(b*13&-1|0)/15&-1;c[11272]=(b|0)/2&-1;c[11274]=(b*36&-1|0)/29&-1;c[11276]=(b*14&-1|0)/13&-1;c[11270]=(b*18&-1|0)/29&-1;return}function n6(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;g=i;i=i+48|0;h=g|0;c[h>>2]=b;c[h+4>>2]=d;j=e+b|0;c[h+12>>2]=j;c[h+16>>2]=d;c[h+24>>2]=j;j=f+d|0;c[h+28>>2]=j;c[h+36>>2]=b;c[h+40>>2]=j;c[h+8>>2]=a;n9(4,h|0);i=g;return}function n7(a){a=+a;var b=0.0;tN();b=+h[5704]*a;if(b==+h[5705]){return}h[5705]=b;c[11552]=(c[11552]|0)+1;return}function n8(b){b=b|0;var e=0,f=0,g=0,j=0,k=0;e=i;i=i+8|0;f=e|0;tN();g=c[b>>2]|0;if((g|0)==5){fr(+h[b+8>>3],f);c[11562]=(d[f+1|0]|0)<<8|(d[f|0]|0)|(d[f+2|0]|0)<<16}else if((g|0)==3){f=c[b+4>>2]|0;c[11562]=f>>>16&255|f&65280|f<<16&16711680}else if((g|0)==1){g=c[b+4>>2]|0;if((g|0)==-4){j=46256}else{if((g|0)<0|a[45624]){k=7}else{k=(g|0)%15&-1}j=238816+(k<<2)|0}c[11562]=c[j>>2];tN()}c[11554]=c[11412];c[11552]=(c[11552]|0)+1;i=e;return}function n9(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0;e=i;i=i+8|0;f=e|0;g=f;h=c[11562]|0;j=c[d+8>>2]|0;k=j>>4;l=j&15;j=h&255;m=h>>>8;n=m&255;o=h>>>16;p=o&255;q=h>>>24&255;if((l|0)==0){r=c[11564]|0;s=r>>>24&255;t=r>>>16&255;u=r>>>8&255;v=r&255}else if((l|0)==2){w=k*12&-1;x=14054}else if((l|0)==1){w=k;x=14054}else{s=q;t=p;u=n;v=j}do{if((x|0)==14054){if(w>>>0>=100){s=q;t=p;u=n;v=j;break}y=+(w|0)/100.0;k=((~~(y*+(h&255|0))+(~~((1.0-y)*255.0)*65793&-1)|0)+(~~(y*+(m&255|0))<<8)|0)+(~~(y*+(o&255|0))<<16)|0;s=k>>>24&255;t=k>>>16&255;u=k>>>8&255;v=k&255}}while(0);if((c[11552]|0)>0){tL(c[11554]|0);c[11552]=0}o=f;m=g+3|0;a[m]=0;h=g+2|0;a[h]=0;w=g+1|0;a[w]=0;a[o]=37;aI(o|0,1,4,c[10030]|0);a[m]=0;a[h]=0;a[w]=0;a[o]=12;aI(o|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[m]=-128;a[h]=0;a[w]=0;a[o]=7;aI(o|0,1,4,c[10030]|0);a[m]=0;a[h]=0;a[w]=0;a[o]=37;aI(o|0,1,4,c[10030]|0);a[m]=0;a[h]=0;a[w]=0;a[o]=12;aI(o|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[m]=-128;a[h]=0;a[w]=0;a[o]=0;aI(o|0,1,4,c[10030]|0);a[m]=0;a[h]=0;a[w]=0;a[o]=40;aI(o|0,1,4,c[10030]|0);a[m]=0;a[h]=0;a[w]=0;a[o]=12;aI(o|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[m]=0;a[h]=0;a[w]=0;a[o]=3;aI(o|0,1,4,c[10030]|0);a[m]=0;a[h]=0;a[w]=0;a[o]=39;aI(o|0,1,4,c[10030]|0);a[m]=0;a[h]=0;a[w]=0;a[o]=24;aI(o|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[m]=0;a[h]=0;a[w]=0;a[o]=3;aI(o|0,1,4,c[10030]|0);c[f>>2]=0;aI(o|0,1,4,c[10030]|0);a[m]=s;a[h]=t;a[w]=u;a[o]=v;aI(o|0,1,4,c[10030]|0);c[f>>2]=0;aI(o|0,1,4,c[10030]|0);a[m]=0;a[h]=0;a[w]=0;a[o]=37;aI(o|0,1,4,c[10030]|0);a[m]=0;a[h]=0;a[w]=0;a[o]=12;aI(o|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[m]=0;a[h]=0;a[w]=0;a[o]=3;aI(o|0,1,4,c[10030]|0);a[m]=0;a[h]=0;a[w]=0;a[o]=40;aI(o|0,1,4,c[10030]|0);a[m]=0;a[h]=0;a[w]=0;a[o]=12;aI(o|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[m]=0;a[h]=0;a[w]=0;a[o]=1;aI(o|0,1,4,c[10030]|0);a[m]=0;a[h]=0;a[w]=0;a[o]=38;aI(o|0,1,4,c[10030]|0);a[m]=0;a[h]=0;a[w]=0;a[o]=28;aI(o|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[m]=0;a[h]=0;a[w]=0;a[o]=1;aI(o|0,1,4,c[10030]|0);g=a[45616]|0;a[m]=0;a[h]=0;a[w]=g?0:34;a[o]=0;aI(o|0,1,4,c[10030]|0);c[f>>2]=0;aI(o|0,1,4,c[10030]|0);c[f>>2]=0;aI(o|0,1,4,c[10030]|0);a[m]=s;a[h]=t;a[w]=u;a[o]=v;aI(o|0,1,4,c[10030]|0);a[m]=0;a[h]=0;a[w]=0;a[o]=37;aI(o|0,1,4,c[10030]|0);a[m]=0;a[h]=0;a[w]=0;a[o]=12;aI(o|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[m]=0;a[h]=0;a[w]=0;a[o]=1;aI(o|0,1,4,c[10030]|0);a[m]=0;a[h]=0;a[w]=0;a[o]=3;aI(o|0,1,4,c[10030]|0);v=(b<<3)+28|0;a[m]=v>>>24&255;a[h]=v>>>16&255;a[w]=v>>>8&255;a[o]=v&255;aI(o|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;c[f>>2]=0;aI(o|0,1,4,c[10030]|0);c[f>>2]=0;aI(o|0,1,4,c[10030]|0);c[f>>2]=0;aI(o|0,1,4,c[10030]|0);c[f>>2]=0;aI(o|0,1,4,c[10030]|0);a[m]=b>>>24&255;a[h]=b>>>16&255;a[w]=b>>>8&255;a[o]=b&255;aI(o|0,1,4,c[10030]|0);if((b|0)>0){z=0}else{c[11412]=-5;c[11554]=-5;i=e;return}do{f=c[d+(z*12&-1)>>2]|0;a[m]=f>>>24&255;a[h]=f>>>16&255;a[w]=f>>>8&255;a[o]=f&255;aI(o|0,1,4,c[10030]|0);f=(c[(c[3524]|0)+12>>2]|0)-(c[d+(z*12&-1)+4>>2]|0)|0;a[m]=f>>>24&255;a[h]=f>>>16&255;a[w]=f>>>8&255;a[o]=f&255;aI(o|0,1,4,c[10030]|0);z=z+1|0;}while((z|0)<(b|0));c[11412]=-5;c[11554]=-5;i=e;return}function oa(){var b=0,d=0,e=0,f=0.0,h=0,j=0,k=0.0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0;b=i;i=i+256|0;if(!(a[238232]|0)){i=b;return}a[c[11232]|0]=0;a[238232]=0;d=c[11298]|0;e=c[11296]|0;f=+g[11418];h=b|0;uB(h|0,45688);g[11418]=+g[59560];n4(c[59562]|0);g[11418]=f;uB(45688,h|0);h=b4(43856,73808)|0;if((h|0)>0){f=+(aa(c[(c[3524]|0)+20>>2]|0,h)>>>0>>>0)*.8;j=c[11262]|0;k=+(j|0)*.0017453292519944445;l=~~(+(d>>>0>>>0)+ +S(+k)*f);m=~~(+(e>>>0>>>0)+ +T(+k)*f);c[11298]=l;c[11296]=m;n=l;o=m;p=h+43856|0;q=j}else{n=d;o=e;p=43856;q=c[11262]|0}f=+(q|0)*.0017453292519944445;k=+T(+f);r=+g[59564];q=~~(k*r*26.37);e=~~(+S(+f)*r*26.37);do{if((a[238216]&1)!=0){if(a[238208]|0){break}n$(n-q|0,e+o|0,p)}}while(0);r=+((uA(p|0)|0)>>>0>>>0);if(a[45056]|0){s=r*.8*+((c[(c[3524]|0)+20>>2]|0)>>>0>>>0)}else{e=a[p]|0;L19099:do{if(e<<24>>24==0){t=0;u=0}else{q=uA(p|0)|0;d=1;j=0;h=0;m=e;while(1){l=m<<24>>24;v=((aZ(171640,l|0,18)|0)!=0&1)+j|0;if((m-65&255)<26){w=14075}else{if((aZ(171632,l|0,5)|0)==0){x=h}else{w=14075}}if((w|0)==14075){w=0;x=h+1|0}y=v+((aZ(171608,l|0,10)|0)!=0&1)|0;if(d>>>0>=q>>>0){t=y;u=x;break L19099}l=a[p+d|0]|0;d=d+1|0;j=y;h=x;m=l}}}while(0);s=(+(-t|0)*.2+(r*.8+ +(u|0)*.3))*+((c[(c[3524]|0)+20>>2]|0)>>>0>>>0)}r=+(~~s|0);s=+(c[11262]|0)*.0017453292519944445;f=+S(+s);u=~~(+(n>>>0>>>0)+r*f);c[11298]=u;k=+T(+s);n=~~(+(o>>>0>>>0)+r*k);c[11296]=n;if((c[59556]|0)!=1){i=b;return}s=r*.5;c[11298]=~~(+(u|0)-s*f);c[11296]=~~(+(n|0)-s*k);i=b;return}function ob(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0.0,P=0.0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ab=0.0,ac=0.0,ad=0,ae=0,af=0.0,ag=0,ah=0.0,ai=0,aj=0.0,ak=0,al=0,am=0,an=0,ao=0,ap=0.0,aq=0.0,ar=0,as=0.0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0.0,aA=0.0,aB=0.0,aC=0.0,aD=0.0,aE=0.0,aF=0.0,aG=0,aH=0,aI=0,aJ=0;b=i;i=i+424|0;d=b|0;e=b+24|0;f=b+48|0;g=b+72|0;j=b+96|0;k=b+120|0;l=b+144|0;m=b+168|0;n=c[13898]|0;o=c[8272]|0;L19117:do{if((n|0)<(o|0)){p=l|0;q=l+8|0;r=k|0;s=k+8|0;t=j|0;u=j+8|0;w=g|0;x=g+8|0;y=f|0;z=f+8|0;A=e|0;B=e+8|0;C=d|0;D=d+8|0;E=0.0;F=0.0;G=n;H=o;L19119:while(1){I=c[1054]|0;J=(a[I+(G*40&-1)|0]&1)==0;L19121:do{if(!J){K=c[I+(G*40&-1)+36>>2]|0;L=I+(G*40&-1)+32|0;M=c[10036]|0;N=0;while(1){if((N|0)>=(K|0)){break}if((a[M+((c[L>>2]|0)+N|0)|0]|0)==(a[N+103664|0]|0)){N=N+1|0}else{break L19121}}if((N|0)==1){O=E;P=F;break L19117}}}while(0);L=c[59286]|0;L19128:do{if((L|0)==0){Q=237144}else{M=c[I+(G*40&-1)+36>>2]|0;K=c[I+(G*40&-1)+32>>2]|0;R=(M|0)>0;S=c[10036]|0;T=237144;U=L;while(1){L19132:do{if(!J){if(R){V=0;W=0;X=K;while(1){Y=a[U+V|0]|0;if(Y<<24>>24==(a[S+(V+X|0)|0]|0)){Z=X;_=W}else{if(Y<<24>>24!=36){break L19132}Z=X-1|0;_=1}$=V+1|0;if(($|0)<(_+M|0)){V=$;W=_;X=Z}else{break}}if((_|0)==0){aa=$}else{Q=T;break L19128}}else{aa=0}X=a[U+aa|0]|0;if((X<<24>>24|0)==36|(X<<24>>24|0)==0){Q=T;break L19128}}}while(0);X=T+8|0;W=c[X>>2]|0;if((W|0)==0){Q=X;break}else{T=X;U=W}}}}while(0);J=c[Q+4>>2]|0;do{if((J|0)==0){a[237032]=0;c[13898]=G+1;ab=F;ac=E}else if((J|0)==1){a[237032]=1;c[13898]=G+1;ab=F;ac=E}else if((J|0)==17){c[59264]=c[59264]&-7|2;c[59444]=0;c[13898]=G+1;ab=F;ac=E}else if((J|0)==16){c[59264]=4;c[13898]=G+1;ab=F;ac=E}else if((J|0)==19){c[59264]=c[59264]|1;c[13898]=G+1;ab=F;ac=E}else if((J|0)==3){a[237464]=1;c[13898]=G+1;ab=F;ac=E}else if((J|0)==7){a[237096]=0;c[13898]=G+1;ab=F;ac=E}else if((J|0)==8){ad=G+1|0;c[13898]=ad;if((ad|0)>=(H|0)){ae=14288;break L19119}L19155:do{if((a[I+(ad*40&-1)|0]&1)!=0){L=c[I+(ad*40&-1)+36>>2]|0;U=I+(ad*40&-1)+32|0;T=c[10036]|0;M=0;while(1){if((M|0)>=(L|0)){break}if((a[T+((c[U>>2]|0)+M|0)|0]|0)==(a[M+103664|0]|0)){M=M+1|0}else{break L19155}}if((M|0)==1){ae=14289;break L19119}}}while(0);U=is(l)|0;T=c[U>>2]|0;if((T|0)==1){af=+(c[U+8>>2]|0)}else if((T|0)==2){af=+h[U+8>>3]}else if((T|0)==3){af=+uz(c[U+8>>2]|0,0)}else{ae=14130;break L19119}if((c[p>>2]|0)==3){uu(c[q>>2]|0);c[p>>2]=1}U=c[13898]|0;T=c[8272]|0;L19170:do{if((T|0)>(U|0)){L=c[1054]|0;if((a[L+(U*40&-1)|0]&1)==0){ag=U;break}S=c[L+(U*40&-1)+36>>2]|0;K=L+(U*40&-1)+32|0;L=c[10036]|0;R=0;while(1){if((R|0)>=(S|0)){break}if((a[L+((c[K>>2]|0)+R|0)|0]|0)==(a[R+148464|0]|0)){R=R+1|0}else{ag=U;break L19170}}if((R|0)!=1){ag=U;break}K=U+1|0;c[13898]=K;ag=K}else{ag=U}}while(0);if((ag|0)>=(T|0)){ae=14286;break L19119}U=c[1054]|0;L19180:do{if((a[U+(ag*40&-1)|0]&1)!=0){K=c[U+(ag*40&-1)+36>>2]|0;L=U+(ag*40&-1)+32|0;S=c[10036]|0;M=0;while(1){if((M|0)>=(K|0)){break}if((a[S+((c[L>>2]|0)+M|0)|0]|0)==(a[M+103664|0]|0)){M=M+1|0}else{break L19180}}if((M|0)==1){ae=14287;break L19119}}}while(0);U=is(k)|0;T=c[U>>2]|0;if((T|0)==1){ah=+(c[U+8>>2]|0)}else if((T|0)==2){ah=+h[U+8>>3]}else if((T|0)==3){ah=+uz(c[U+8>>2]|0,0)}else{ae=14151;break L19119}if((c[r>>2]|0)==3){uu(c[s>>2]|0);c[r>>2]=1}if(!(af<2.0|ah<2.0|af>99.0|ah>99.0)){ab=af;ac=ah;break}if(af!=0.0|ah!=0.0){ae=14156;break L19119}else{ab=0.0;ac=0.0}}else if((J|0)==18){c[59264]=c[59264]|8;c[13898]=G+1;ab=F;ac=E}else if((J|0)==12){ai=G+1|0;c[13898]=ai;if((ai|0)>=(H|0)){ae=14290;break L19119}L19199:do{if((a[I+(ai*40&-1)|0]&1)!=0){U=c[I+(ai*40&-1)+36>>2]|0;T=I+(ai*40&-1)+32|0;L=c[10036]|0;S=0;while(1){if((S|0)>=(U|0)){break}if((a[L+((c[T>>2]|0)+S|0)|0]|0)==(a[S+103664|0]|0)){S=S+1|0}else{break L19199}}if((S|0)==1){ae=14291;break L19119}}}while(0);T=is(e)|0;L=c[T>>2]|0;if((L|0)==1){aj=+(c[T+8>>2]|0)}else if((L|0)==2){aj=+h[T+8>>3]}else if((L|0)==3){aj=+uz(c[T+8>>2]|0,0)}else{ae=14214;break L19119}if((c[A>>2]|0)==3){uu(c[B>>2]|0);c[A>>2]=1}T=~~aj;c[59446]=T;if(T>>>0>99){ae=14218;break L19119}c[59344]=T;ab=F;ac=E}else if((J|0)==2){a[237464]=0;c[13898]=G+1;ab=F;ac=E}else if((J|0)==15){a[237072]=0;c[13898]=G+1;ab=F;ac=E}else if((J|0)==20){ak=G+1|0;c[13898]=ak;if((ak|0)>=(H|0)){ae=14284;break L19119}T=c[I+(ak*40&-1)+36>>2]|0;L19219:do{if((a[I+(ak*40&-1)|0]&1)==0){al=c[10036]|0;am=I+(ak*40&-1)+32|0}else{L=I+(ak*40&-1)+32|0;U=c[10036]|0;M=0;while(1){if((M|0)>=(T|0)){break}if((a[U+((c[L>>2]|0)+M|0)|0]|0)==(a[M+103664|0]|0)){M=M+1|0}else{al=U;am=L;break L19219}}if((M|0)==1){ae=14285;break L19119}else{al=U;am=L}}}while(0);S=(T|0)>49?49:T;K=c[am>>2]|0;R=0;while(1){N=R+1|0;a[R+236976|0]=a[al+K|0]|0;if((N|0)==(S|0)){break}else{K=K+1|0;R=N}}a[S+236976|0]=0;an=G+2|0;c[13898]=an;if((aY(236976,173280)|0)==0){ab=F;ac=E;break}if((aY(236976,173088)|0)==0){ab=F;ac=E}else{ae=14249;break L19119}}else if((J|0)==14){a[237072]=1;c[13898]=G+1;ab=F;ac=E}else if((J|0)==13){ao=G+1|0;c[13898]=ao;if((ao|0)>=(H|0)){ae=14297;break L19119}L19234:do{if((a[I+(ao*40&-1)|0]&1)!=0){R=c[I+(ao*40&-1)+36>>2]|0;K=I+(ao*40&-1)+32|0;T=c[10036]|0;N=0;while(1){if((N|0)>=(R|0)){break}if((a[T+((c[K>>2]|0)+N|0)|0]|0)==(a[N+103664|0]|0)){N=N+1|0}else{break L19234}}if((N|0)==1){ae=14296;break L19119}}}while(0);S=is(d)|0;K=c[S>>2]|0;if((K|0)==2){ap=+h[S+8>>3]}else if((K|0)==3){ap=+uz(c[S+8>>2]|0,0)}else if((K|0)==1){ap=+(c[S+8>>2]|0)}else{ae=14231;break L19119}if((c[C>>2]|0)==3){uu(c[D>>2]|0);c[C>>2]=1}S=~~ap;if((S-2|0)>>>0>=99999){ae=14236;break L19119}c[59278]=S-1;ab=F;ac=E}else if((J|0)==10){c[13898]=G+1;S=is(g)|0;K=c[S>>2]|0;if((K|0)==1){aq=+(c[S+8>>2]|0)}else if((K|0)==2){aq=+h[S+8>>3]}else if((K|0)==3){aq=+uz(c[S+8>>2]|0,0)}else{ae=14182;break L19119}if((c[w>>2]|0)==3){uu(c[x>>2]|0);c[w>>2]=1}c[59442]=~~aq;ab=F;ac=E}else if((J|0)==11){ar=G+1|0;c[13898]=ar;if((ar|0)>=(H|0)){ae=14295;break L19119}L19261:do{if((a[I+(ar*40&-1)|0]&1)!=0){S=c[I+(ar*40&-1)+36>>2]|0;K=I+(ar*40&-1)+32|0;T=c[10036]|0;R=0;while(1){if((R|0)>=(S|0)){break}if((a[T+((c[K>>2]|0)+R|0)|0]|0)==(a[R+103664|0]|0)){R=R+1|0}else{break L19261}}if((R|0)==1){ae=14294;break L19119}}}while(0);K=is(f)|0;T=c[K>>2]|0;if((T|0)==1){as=+(c[K+8>>2]|0)}else if((T|0)==2){as=+h[K+8>>3]}else if((T|0)==3){as=+uz(c[K+8>>2]|0,0)}else{ae=14197;break L19119}if((c[y>>2]|0)==3){uu(c[z>>2]|0);c[y>>2]=1}K=~~as;c[59448]=K;if((K-1|0)>>>0>9){ae=14202;break L19119}else{ab=F;ac=E}}else if((J|0)==9){at=G+1|0;c[13898]=at;if((at|0)>=(H|0)){au=at;ae=14282;break L19119}K=(a[I+(at*40&-1)|0]&1)==0;L19278:do{if(!K){T=c[I+(at*40&-1)+36>>2]|0;S=I+(at*40&-1)+32|0;N=c[10036]|0;L=0;while(1){if((L|0)>=(T|0)){ae=14162;break}if((a[N+((c[S>>2]|0)+L|0)|0]|0)==(a[L+103664|0]|0)){L=L+1|0}else{break}}if((ae|0)==14162){ae=0;if((L|0)==1){au=at;ae=14281;break L19119}}if(K){break}S=c[I+(at*40&-1)+36>>2]|0;N=I+(at*40&-1)+32|0;T=c[10036]|0;R=0;while(1){if((R|0)>=(S|0)){break}if((a[T+((c[N>>2]|0)+R|0)|0]|0)==(a[R+103664|0]|0)){R=R+1|0}else{break L19278}}if((R|0)==1){au=at;ae=14279;break L19119}}}while(0);a[14176]=1;is(j);a[14176]=0;if((c[t>>2]|0)!=3){ae=14169;break L19119}K=c[u>>2]|0;if((K|0)==0){ae=14171;break L19119}N=bk(K|0,148464)|0;ca(K+(N+1|0)|0,21e4,(v=i,i=i+8|0,c[v>>2]=237768,v)|0);a[K+N|0]=0;N=237480;while(1){T=c[N>>2]|0;if((T|0)==0){av=-1;break}if((a_(K|0,T|0,uA(K|0)|0)|0)==0){ae=14176;break}else{N=N+8|0}}if((ae|0)==14176){ae=0;av=c[N+4>>2]|0}c[59444]=(av|0)<0?0:av;uu(K);ab=F;ac=E}else if((J|0)==5){a[237472]=1;c[13898]=G+1;ab=F;ac=E}else if((J|0)==6){a[237096]=1;c[13898]=G+1;ab=F;ac=E}else if((J|0)==4){a[237472]=0;c[13898]=G+1;ab=F;ac=E}else{ae=14250;break L19119}}while(0);J=c[13898]|0;I=c[8272]|0;if((J|0)<(I|0)){E=ac;F=ab;G=J;H=I}else{O=ac;P=ab;break L19117}}if((ae|0)==14171){au=c[13898]|0;uf(au,116592,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ae|0)==14294){uf(ar,172856,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ae|0)==14295){uf(ar,172856,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ae|0)==14296){uf(ao,172696,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ae|0)==14291){uf(ai,172784,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ae|0)==14297){uf(ao,172696,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ae|0)==14130){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ae|0)==14202){uf((c[13898]|0)-1|0,172816,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ae|0)==14285){uf(ak,172624,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ae|0)==14286){uf(ag,172904,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ae|0)==14287){uf(ag,172904,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ae|0)==14279){uf(au,116592,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ae|0)==14281){uf(au,116592,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ae|0)==14249){uf(an,172552,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ae|0)==14250){uf(G,95448,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ae|0)==14214){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ae|0)==14288){uf(ad,172904,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ae|0)==14289){uf(ad,172904,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ae|0)==14290){uf(ai,172784,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ae|0)==14197){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ae|0)==14236){uf(c[13898]|0,172656,(v=i,i=i+8|0,c[v>>2]=1e5,v)|0)}else if((ae|0)==14282){uf(au,116592,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ae|0)==14284){uf(ak,172624,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ae|0)==14182){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ae|0)==14151){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ae|0)==14156){uf(c[13898]|0,130744,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ae|0)==14231){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ae|0)==14169){c[13898]=at;au=at;uf(au,116592,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((ae|0)==14218){uf((c[13898]|0)-1|0,172744,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}else{O=0.0;P=0.0}}while(0);ae=c[59264]|0;au=m|0;if((ae|0)==4){uD(au|0,172520,12)}else{m=(ae&2|0)!=0?172480:179864;at=(ae&8|0)!=0?172440:179864;ak=(ae&1|0)!=0?172408:179864;be(au|0,172512,(v=i,i=i+24|0,c[v>>2]=m,c[v+8>>2]=at,c[v+16>>2]=ak,v)|0)}ak=a[237464]|0;at=(c[59278]|0)+1|0;m=a[237096]|0?78720:78704;ae=a[237472]|0?172248:172264;ai=a[237072]|0?131504:131584;ad=c[237480+(c[59444]<<3)>>2]|0;an=c[59442]|0;if((an|0)>0){aw=an}else{aw=ak?16:10}an=c[59448]|0;ag=c[59446]|0;be(13048,172304,(v=i,i=i+136|0,c[v>>2]=a[237032]|0?116440:116408,c[v+8>>2]=ak?172296:172288,c[v+16>>2]=172272,c[v+24>>2]=at,c[v+32>>2]=m,c[v+40>>2]=ae,c[v+48>>2]=ai,c[v+56>>2]=au,c[v+64>>2]=124352,c[v+72>>2]=ad,c[v+80>>2]=aw,c[v+88>>2]=208960,c[v+96>>2]=an,c[v+104>>2]=172240,c[v+112>>2]=ag,c[v+120>>2]=172200,c[v+128>>2]=236976,v)|0);ag=P>0.0&O>0.0;L19344:do{if(ag){an=~~P;do{if(P- +(an|0)==0.0){aw=~~O;if(O- +(aw|0)!=0.0){break}ad=13048+(uA(13048)|0)|0;be(ad|0,172160,(v=i,i=i+16|0,c[v>>2]=an,c[v+8>>2]=aw,v)|0);break L19344}}while(0);an=13048+(uA(13048)|0)|0;be(an|0,172120,(v=i,i=i+16|0,h[v>>3]=P,h[v+8>>3]=O,v)|0)}}while(0);an=(c[59442]|0)<1;if(a[237464]|0){if(an){c[59442]=16}G=a[237472]|0;c[(c[3524]|0)+8>>2]=G?9e3:9600;c[(c[3524]|0)+12>>2]=G?6750:6e3;aw=G?90:105;c[(c[3524]|0)+24>>2]=aw;c[(c[3524]|0)+28>>2]=aw;ax=G;ay=G?900:1200}else{if(an){c[59442]=10}an=a[237472]|0;c[(c[3524]|0)+8>>2]=an?5400:6e3;c[(c[3524]|0)+12>>2]=3600;G=an?67:75;c[(c[3524]|0)+24>>2]=G;c[(c[3524]|0)+28>>2]=G;ax=an;ay=an?900:1200}c[59242]=ay;c[59240]=ax?900:1200;if(a[237096]|0){ay=c[3524]|0;an=ay+8|0;G=c[an>>2]|0;c[an>>2]=c[ay+12>>2];c[(c[3524]|0)+12>>2]=G}if(ag){ab=ax?450.0:1200.0;c[(c[3524]|0)+8>>2]=~~(P*ab);c[(c[3524]|0)+12>>2]=~~(O*ab)}ag=c[59442]|0;if(ax){az=+(ag*450&-1|0)*2.54}else{az=+(ag*1200&-1|0)}c[(c[3524]|0)+16>>2]=~~(az/72.0*3.0*.25);ag=c[59442]|0;if(ax){aA=+(ag*450&-1|0)*2.54;aB=aA/72.0;aC=aB*3.0;aD=aC*.25;aE=aD*6.0;aF=aE/10.0;aG=~~aF;aH=c[3524]|0;aI=aH+20|0;c[aI>>2]=aG;aJ=c[59448]|0;c[59262]=aJ;i=b;return}else{aA=+(ag*1200&-1|0);aB=aA/72.0;aC=aB*3.0;aD=aC*.25;aE=aD*6.0;aF=aE/10.0;aG=~~aF;aH=c[3524]|0;aI=aH+20|0;c[aI>>2]=aG;aJ=c[59448]|0;c[59262]=aJ;i=b;return}}function oc(){c[59270]=0;c[59272]=0;a[237104]=0;return}function od(a){a=a|0;var b=0;if((a|0)==1){c[59364]=1;b=1}else if((a|0)==0){c[59364]=0;b=1}else if((a|0)==2){c[59364]=2;b=1}else{c[59364]=0;b=0}return b|0}function oe(a){a=a|0;g[59456]=+(a|0)*1.5707963267948966/90.0;return 1}function of(a){a=+a;var b=0.0;h[29725]=a<0.0?1.0:a;b=+(c[59442]|0)*a/10.0;h[1630]=b>=0.0?b:1.0;return}function og(){var b=0,d=0,e=0,f=0;b=i;c[59270]=0;c[59272]=0;a[237104]=0;ol(-1);c[59364]=0;g[59456]=0.0;a[237136]=0;a[237432]=1;c[59356]=0;c[59354]=c[59262];a[237392]=1;c[59346]=c[59344];g[59360]=0.0;if((aY(236976,173280)|0)==0){d=c[10030]|0;e=a[237096]|0?198816:198832;f=a[237472]|0?173096:173160;cf(d|0,173232,(v=i,i=i+40|0,c[v>>2]=e,c[v+8>>2]=173184,c[v+16>>2]=f,c[v+24>>2]=1200,c[v+32>>2]=2,v)|0);i=b;return}if((aY(236976,173088)|0)!=0){i=b;return}f=a[237472]|0;cf(c[10030]|0,173048,(v=i,i=i+72|0,c[v>>2]=a[237096]|0?198816:198832,c[v+8>>2]=173184,c[v+16>>2]=f?173096:173160,c[v+24>>2]=f?173032:173040,h[v+32>>3]=100.0,c[v+40>>2]=172944,c[v+48>>2]=-2,c[v+56>>2]=1200,c[v+64>>2]=2,v)|0);i=b;return}function oh(){tK(a[237104]&1);c[59270]=0;c[59272]=0;aD(c[10030]|0);return}function oi(){tK(a[237104]&1);c[59270]=0;c[59272]=0;aD(c[10030]|0);return}function oj(b,d){b=b|0;d=d|0;var e=0,f=0;e=c[59272]|0;f=c[59270]|0;c[59272]=b;c[59270]=d;if((e|0)==(b|0)&(f|0)==(d|0)){return}tK(a[237104]&1);return}function ok(b,d){b=b|0;d=d|0;var e=0,f=0;if(a[237104]|0){e=(c[59280]<<3)+8|0}else{f=c[59454]|0;c[59352]=f;c[59350]=f;c[59356]=c[59260];g[59360]=+g[59266];c[59346]=c[59344];c[59354]=c[59262];c[59280]=0;f=db(c[59282]|0,8,173288)|0;c[59282]=f;c[f+(c[59280]<<3)>>2]=(c[59272]|0)+(c[59242]|0);c[(c[59282]|0)+(c[59280]<<3)+4>>2]=((c[59240]|0)+(c[(c[3524]|0)+12>>2]|0)|0)-(c[59270]|0);c[59280]=1;a[237104]=1;e=16}f=db(c[59282]|0,e,173288)|0;c[59282]=f;c[f+(c[59280]<<3)>>2]=(c[59242]|0)+b;c[(c[59282]|0)+(c[59280]<<3)+4>>2]=((c[(c[3524]|0)+12>>2]|0)-d|0)+(c[59240]|0);f=(c[59280]|0)+1|0;c[59280]=f;if((f|0)<=(c[59278]|0)){c[59272]=b;c[59270]=d;return}tK(a[237104]&1);c[59272]=b;c[59270]=d;return}function ol(b){b=b|0;var d=0,e=0,f=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0;d=c[59260]|0;e=~~+g[59266];f=c[59454]|0;i=c[59344]|0;j=c[59262]|0;k=c[59446]|0;c[59344]=k;l=~~(+h[29726]*+(c[59448]|0));m=(l|0)<1?1:l;c[59262]=m;c[59454]=-1;n=(b|0)<-2?-2:b;do{if((n|0)==0|(n|0)==(-2|0)){c[59260]=0;g[59266]=0.0;if(!(a[237032]&(n|0)==0)){o=0;p=0.0;q=-1;r=k;s=m;break}c[59454]=4;o=0;p=0.0;q=4;r=k;s=m}else if((n|0)==(-1|0)){c[59260]=2;if(a[237072]|0){c[59260]=0;t=0}else{t=2}g[59266]=4.0;if(!(a[237032]|0)){o=t;p=4.0;q=-1;r=k;s=m;break}c[59454]=0;o=t;p=4.0;q=0;r=k;s=m}else{b=((n|0)/1e3&-1)+k|0;c[59344]=b;u=(n|0)%1e3&-1;v=(u+99|0)>>>0<199?l:(u|0)/100&-1;w=(v|0)<1?1:v;c[59262]=w;v=(u|0)%100&-1;if(a[237032]|0){u=(v|0)>8&1;c[59260]=u;x=c[237336+(((v|0)%9&-1)<<2)>>2]|0;c[59454]=x;y=(v|0)/9&-1;z=u;A=x}else{if((v|0)==0){B=0}else{B=((v|0)%2&-1)+1|0}c[59260]=B;y=(v+1|0)/2&-1;z=B;A=-1}C=+(y*3&-1|0);g[59266]=C;if(!(a[237072]|0)){o=z;p=C;q=A;r=b;s=w;break}c[59260]=0;o=0;p=C;q=A;r=b;s=w}}while(0);do{if((o|0)==(d|0)){if(!(p==+(e|0)&(q|0)==(f|0)&(r|0)==(i|0)&(s|0)==(j|0))){break}return}}while(0);tK(a[237104]&1);return}function om(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0,t=0,u=0,w=0;f=i;c[59260]=0;if((((e|0)%100&-1)-49|0)>>>0<50){j=e}else{k=(e|0)%13&-1;if((k|0)==12){l=78}else if((k|0)==8){l=88}else if((k|0)==4){l=68}else if((k|0)==10){l=98}else if((k|0)==6){c[59260]=0;tK(a[237104]&1);e=(c[59344]|0)-1|0;m=c[59454]|0;n=(c[59242]|0)+b|0;o=c[3524]|0;p=((c[o+12>>2]|0)-d|0)+(c[59240]|0)|0;q=~~(+h[29725]*+((c[o+16>>2]|0)>>>0>>>0)*.25+1.0);o=c[59262]|0;r=+g[59266];cf(c[10030]|0,173528,(v=i,i=i+128|0,c[v>>2]=c[59260],c[v+8>>2]=o,c[v+16>>2]=m,c[v+24>>2]=m,c[v+32>>2]=(e|0)<0?0:e,c[v+40>>2]=0,c[v+48>>2]=20,h[v+56>>3]=r,c[v+64>>2]=n,c[v+72>>2]=p,c[v+80>>2]=q,c[v+88>>2]=q,c[v+96>>2]=n,c[v+104>>2]=p,c[v+112>>2]=n,c[v+120>>2]=p-q,v)|0);i=f;return}else if((k|0)==7){l=84}else if((k|0)==11){l=74}else if((k|0)==3){c[59260]=0;tK(a[237104]&1);q=(c[59344]|0)-1|0;p=c[59454]|0;n=(c[59242]|0)+b|0;e=((c[(c[3524]|0)+12>>2]|0)-d|0)+(c[59240]|0)|0;m=c[59262]|0;r=+g[59266];cf(c[10030]|0,173472,(v=i,i=i+64|0,c[v>>2]=c[59260],c[v+8>>2]=m,c[v+16>>2]=p,c[v+24>>2]=p,c[v+32>>2]=(q|0)<0?0:q,c[v+40>>2]=0,c[v+48>>2]=-1,h[v+56>>3]=r,v)|0);q=~~(+h[29725]*+((c[(c[3524]|0)+16>>2]|0)>>>0>>>0)*.25+1.0);p=n-q|0;m=e-q|0;o=q+e|0;e=q+n|0;cf(c[10030]|0,173424,(v=i,i=i+80|0,c[v>>2]=p,c[v+8>>2]=m,c[v+16>>2]=p,c[v+24>>2]=o,c[v+32>>2]=e,c[v+40>>2]=o,c[v+48>>2]=e,c[v+56>>2]=m,c[v+64>>2]=p,c[v+72>>2]=m,v)|0);i=f;return}else if((k|0)==9){l=94}else if((k|0)==5){c[59260]=0;tK(a[237104]&1);m=(c[59344]|0)-1|0;p=c[59454]|0;e=(c[59242]|0)+b|0;o=c[3524]|0;n=((c[o+12>>2]|0)-d|0)+(c[59240]|0)|0;q=~~(+h[29725]*+((c[o+16>>2]|0)>>>0>>>0)*.25+1.0);o=c[59262]|0;r=+g[59266];cf(c[10030]|0,173528,(v=i,i=i+128|0,c[v>>2]=c[59260],c[v+8>>2]=o,c[v+16>>2]=p,c[v+24>>2]=p,c[v+32>>2]=(m|0)<0?0:m,c[v+40>>2]=0,c[v+48>>2]=-1,h[v+56>>3]=r,c[v+64>>2]=e,c[v+72>>2]=n,c[v+80>>2]=q,c[v+88>>2]=q,c[v+96>>2]=e,c[v+104>>2]=n,c[v+112>>2]=e,c[v+120>>2]=n-q,v)|0);i=f;return}else{ly(b,d,k);i=f;return}c[59260]=0;j=l}tK(a[237104]&1);if((j|0)>1e3){s=((j|0)/1e3&-1)+(c[59446]|0)|0}else{s=c[59344]|0}l=s-1|0;s=(j|0)%1e3&-1;j=(l|0)<0?0:l;do{if((s|0)<100){t=c[59454]|0}else{if(a[237032]|0){t=((s|0)/100&-1)-1|0;break}else{t=(s|0)>699?7:-1;break}}}while(0);l=(s|0)%100&-1;s=(l+1|0)%10&-1;if((s|0)<5){u=(a[237032]^1)<<31>>31}else{u=c[59454]|0}if((s|0)==5|(s|0)==0){w=-1}else{w=((s|0)%5&-1)*5&-1}s=(c[59242]|0)+b|0;b=c[3524]|0;k=((c[b+12>>2]|0)-d|0)+(c[59240]|0)|0;if((l-40|0)>>>0<19){d=~~(+h[29725]*+((c[b+16>>2]|0)>>>0>>>0)*.25+1.0);b=c[10030]|0;q=c[59260]|0;n=c[59262]|0;r=+g[59266];e=k-d|0;cf(b|0,173528,(v=i,i=i+128|0,c[v>>2]=q,c[v+8>>2]=n,c[v+16>>2]=u,c[v+24>>2]=t,c[v+32>>2]=j,c[v+40>>2]=0,c[v+48>>2]=w,h[v+56>>3]=r,c[v+64>>2]=s,c[v+72>>2]=k,c[v+80>>2]=d,c[v+88>>2]=d,c[v+96>>2]=s,c[v+104>>2]=k,c[v+112>>2]=s,c[v+120>>2]=e,v)|0);i=f;return}e=c[59262]|0;r=+g[59266];cf(c[10030]|0,173472,(v=i,i=i+64|0,c[v>>2]=c[59260],c[v+8>>2]=e,c[v+16>>2]=u,c[v+24>>2]=t,c[v+32>>2]=j,c[v+40>>2]=0,c[v+48>>2]=w,h[v+56>>3]=r,v)|0);if((l-59|0)>>>0<10){w=~~(+h[29725]*+((c[(c[3524]|0)+16>>2]|0)>>>0>>>0)*.25+1.0);j=c[10030]|0;t=s-w|0;u=k-w|0;e=w+k|0;d=w+s|0;cf(j|0,173424,(v=i,i=i+80|0,c[v>>2]=t,c[v+8>>2]=u,c[v+16>>2]=t,c[v+24>>2]=e,c[v+32>>2]=d,c[v+40>>2]=e,c[v+48>>2]=d,c[v+56>>2]=u,c[v+64>>2]=t,c[v+72>>2]=u,v)|0);i=f;return}if((l-69|0)>>>0<10){u=~~(+h[29725]*+((c[(c[3524]|0)+16>>2]|0)>>>0>>>0)/3.0+1.0);t=c[10030]|0;d=s-u|0;e=u+k|0;j=u+s|0;w=k-u|0;cf(t|0,173424,(v=i,i=i+80|0,c[v>>2]=d,c[v+8>>2]=k,c[v+16>>2]=s,c[v+24>>2]=e,c[v+32>>2]=j,c[v+40>>2]=k,c[v+48>>2]=s,c[v+56>>2]=w,c[v+64>>2]=d,c[v+72>>2]=k,v)|0);i=f;return}if((l-79|0)>>>0<10){d=~~(+h[29725]*+((c[(c[3524]|0)+16>>2]|0)>>>0>>>0)/3.0+1.0);w=(d<<2|0)/7&-1;j=c[10030]|0;e=s-d|0;t=w+k|0;u=k-(w<<1)|0;w=d+s|0;cf(j|0,173392,(v=i,i=i+64|0,c[v>>2]=e,c[v+8>>2]=t,c[v+16>>2]=s,c[v+24>>2]=u,c[v+32>>2]=w,c[v+40>>2]=t,c[v+48>>2]=e,c[v+56>>2]=t,v)|0);i=f;return}if((l-89|0)>>>0>=10){i=f;return}l=~~(+h[29725]*+((c[(c[3524]|0)+16>>2]|0)>>>0>>>0)/3.0+1.0);t=(l<<2|0)/7&-1;e=s-l|0;w=k-t|0;cf(c[10030]|0,173392,(v=i,i=i+64|0,c[v>>2]=e,c[v+8>>2]=w,c[v+16>>2]=s,c[v+24>>2]=(t<<1)+k,c[v+32>>2]=l+s,c[v+40>>2]=w,c[v+48>>2]=e,c[v+56>>2]=w,v)|0);i=f;return}function on(b,d,e,f,j){b=b|0;d=d|0;e=e|0;f=f|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0,u=0,w=0.0,x=0.0,y=0.0,z=0.0,A=0;k=i;tK(a[237104]&1);l=(c[59356]|0)==2&1;m=a[237432]&1;n=c[59260]|0;o=c[59262]|0;p=c[59454]|0;q=c[59344]|0;r=a[237392]<<31>>31;s=+g[59266];t=(j|0)!=0;u=(j|0)==2;cf(c[10030]|0,173752,(v=i,i=i+128|0,c[v>>2]=2,c[v+8>>2]=m,c[v+16>>2]=n,c[v+24>>2]=o,c[v+32>>2]=p,c[v+40>>2]=p,c[v+48>>2]=q,c[v+56>>2]=0,c[v+64>>2]=r,h[v+72>>3]=s,c[v+80>>2]=0,c[v+88>>2]=l,c[v+96>>2]=0,c[v+104>>2]=t&1,c[v+112>>2]=u&1,c[v+120>>2]=2,v)|0);do{if(t){l=c[12910]|0;if((l|0)==0){r=c[(c[3524]|0)+28>>2]|0;w=+(r>>>0>>>0);x=+(((r>>>1)+1|0)>>>0>>>0)}else{s=+(l|0);y=+h[6458]*3.141592653589793/180.0;z=s*2.0*+T(+y);w=s*+S(+y);x=z}z=+h[6457];if(z<70.0){A=2}else{A=z>110.0?3:1}l=(c[12912]|0)==2&1;r=c[10030]|0;cf(r|0,173640,(v=i,i=i+40|0,c[v>>2]=A,c[v+8>>2]=l,h[v+16>>3]=1.0,h[v+24>>3]=x,h[v+32>>3]=w,v)|0);if(!u){break}r=c[10030]|0;cf(r|0,173640,(v=i,i=i+40|0,c[v>>2]=A,c[v+8>>2]=l,h[v+16>>3]=1.0,h[v+24>>3]=x,h[v+32>>3]=w,v)|0)}}while(0);A=c[59240]|0;u=(c[(c[3524]|0)+12>>2]|0)+A|0;cf(c[10030]|0,173608,(v=i,i=i+32|0,c[v>>2]=(c[59242]|0)+b,c[v+8>>2]=u-d,c[v+16>>2]=A+e,c[v+24>>2]=u-f,v)|0);c[59272]=e;c[59270]=f;i=k;return}function oo(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0,s=0,t=0,u=0.0,w=0.0;f=i;if((a[e]|0)==0){i=f;return}j=uA(e|0)<<1|1;k=ut(j)|0;do{if((k|0)==0){gk();l=ut(j)|0;if((l|0)!=0){m=l;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=173376,v)|0)}else{m=k}}while(0);k=m;j=e;while(1){l=a[j]|0;if(l<<24>>24==92){a[k]=92;n=k+1|0;o=a[j]|0}else{n=k;o=l}a[n]=o;if((a[j]|0)==0){break}else{k=n+1|0;j=j+1|0}}tK(a[237104]&1);p=+g[59456];q=p;j=c[3524]|0;n=c[j+16>>2]|0;if(p==0.0){r=b;s=n>>>1}else{p=+(n>>>0>>>0);k=~~(p*+T(+q)*.25)+b|0;r=k;s=~~(p*+S(+q)*.25)}k=c[10030]|0;b=c[59364]|0;o=c[59454]|0;l=c[59444]|0;p=+(c[59442]|0);t=c[59264]|0;u=+((c[j+20>>2]|0)>>>0>>>0);w=u*+((uA(e|0)|0)>>>0>>>0);e=(c[59242]|0)+r|0;r=((s-d|0)+(c[j+12>>2]|0)|0)+(c[59240]|0)|0;cf(k|0,173312,(v=i,i=i+112|0,c[v>>2]=4,c[v+8>>2]=b,c[v+16>>2]=o,c[v+24>>2]=0,c[v+32>>2]=-1,c[v+40>>2]=l,h[v+48>>3]=p,h[v+56>>3]=q,c[v+64>>2]=t,h[v+72>>3]=+(n>>>0>>>0),h[v+80>>3]=w,c[v+88>>2]=e,c[v+96>>2]=r,c[v+104>>2]=m,v)|0);uu(m);i=f;return}function op(a){a=+a;h[29726]=a;return}function oq(b,d,e,f,j){b=b|0;d=d|0;e=e|0;f=f|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0;k=i;tK(a[237104]&1);l=c[59454]|0;c[59352]=l;m=b&15;do{if((m|0)==1|(m|0)==4){n=b>>4;o=(n|0)<0?0:n;n=(o|0)>100?20:(o|0)/5&-1;if((l|0)==(-1|0)|(l|0)==0){p=n;q=l;break}p=40-n|0;q=l}else if((m|0)==2|(m|0)==5){n=b>>4;p=(n|0)<0?41:n+41|0;q=7}else{p=20;q=7}}while(0);b=(c[59242]|0)+d|0;d=((c[(c[3524]|0)+12>>2]|0)-e|0)+(c[59240]|0)|0;e=a[237432]&1;m=c[59356]|0;n=c[59354]|0;o=c[59346]|0;r=+g[59360];s=b+f|0;f=d-j|0;cf(c[10030]|0,173808,(v=i,i=i+208|0,c[v>>2]=2,c[v+8>>2]=e,c[v+16>>2]=m,c[v+24>>2]=n,c[v+32>>2]=l,c[v+40>>2]=q,c[v+48>>2]=o,c[v+56>>2]=0,c[v+64>>2]=p,h[v+72>>3]=r,c[v+80>>2]=0,c[v+88>>2]=0,c[v+96>>2]=0,c[v+104>>2]=0,c[v+112>>2]=0,c[v+120>>2]=5,c[v+128>>2]=b,c[v+136>>2]=d,c[v+144>>2]=s,c[v+152>>2]=d,c[v+160>>2]=s,c[v+168>>2]=f,c[v+176>>2]=b,c[v+184>>2]=f,c[v+192>>2]=b,c[v+200>>2]=d,v)|0);i=k;return}function or(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0;d=i;if((b|0)==0){e=128;i=d;return e|0}tK(a[237104]&1);if(a[237136]|0){f=c[m>>2]|0;aI(173976,34,1,f|0);e=0;i=d;return e|0}a[237136]=1;f=a[237032]^1;g=c[5163]|0;if(!((g|0)==103|f)){if((c[5169]|0)<=0){e=0;i=d;return e|0}j=b+32|0;b=0;while(1){k=c[j>>2]|0;l=~~(+h[k+(b*24&-1)>>3]*255.0+.5);n=~~(+h[k+(b*24&-1)+8>>3]*255.0+.5);o=~~(+h[k+(b*24&-1)+16>>3]*255.0+.5);cf(c[10030]|0,174016,(v=i,i=i+40|0,c[v>>2]=0,c[v+8>>2]=b+32,c[v+16>>2]=l,c[v+24>>2]=n,c[v+32>>2]=o,v)|0);o=b+1|0;if((o|0)<(c[5169]|0)){b=o}else{e=0;break}}i=d;return e|0}if((g|0)==114&f){f=c[m>>2]|0;aI(174040,57,1,f|0)}f=c[5169]|0;if((f|0)>0){p=0;q=f}else{e=0;i=d;return e|0}while(1){f=~~(+(p|0)*255.0/+(q-1|0)+.5);cf(c[10030]|0,174016,(v=i,i=i+40|0,c[v>>2]=0,c[v+8>>2]=p+32,c[v+16>>2]=f,c[v+24>>2]=f,c[v+32>>2]=f,v)|0);f=p+1|0;g=c[5169]|0;if((f|0)<(g|0)){p=f;q=g}else{e=0;break}}i=d;return e|0}function os(b){b=b|0;var d=0.0,e=0,f=0,g=0;d=+h[b+8>>3];e=c[b>>2]|0;if((e|0)==5){if(d>0.0){f=~~(d*+(c[5169]|0))}else{f=0}if(!(a[237136]|0)){g=c[m>>2]|0;aI(174104,29,1,g|0)}g=(f|0)>127?159:f+32|0;if((c[59454]|0)==(g|0)){return}tK(a[237104]&1);c[59454]=g;return}else if((e|0)==1){ol(c[b+4>>2]|0);return}else{return}}function ot(b,d){b=b|0;d=d|0;var e=0,f=0,j=0,k=0,l=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0;e=i;tK(a[237104]&1);f=c[59356]|0;j=c[59454]|0;k=c[59346]|0;l=+g[59360];cf(c[10030]|0,174184,(v=i,i=i+128|0,c[v>>2]=2,c[v+8>>2]=3,c[v+16>>2]=f,c[v+24>>2]=0,c[v+32>>2]=j,c[v+40>>2]=j,c[v+48>>2]=k,c[v+56>>2]=0,c[v+64>>2]=20,h[v+72>>3]=l,c[v+80>>2]=0,c[v+88>>2]=0,c[v+96>>2]=0,c[v+104>>2]=0,c[v+112>>2]=0,c[v+120>>2]=b+1,v)|0);k=c[10030]|0;j=c[59242]|0;if((b|0)>0){f=b-1|0;m=0;n=0;o=k;p=j;while(1){q=((c[59240]|0)+(c[(c[3524]|0)+12>>2]|0)|0)-(c[d+(m*12&-1)+4>>2]|0)|0;cf(o|0,174136,(v=i,i=i+16|0,c[v>>2]=(c[d+(m*12&-1)>>2]|0)+p,c[v+8>>2]=q,v)|0);if((n|0)<5|(m|0)==(f|0)){r=n+1|0}else{q=c[10030]|0;aI(84248,2,1,q|0);r=0}q=m+1|0;s=c[10030]|0;t=c[59242]|0;if((q|0)<(b|0)){m=q;n=r;o=s;p=t}else{u=r;w=s;x=t;break}}}else{u=0;w=k;x=j}j=((c[59240]|0)+(c[(c[3524]|0)+12>>2]|0)|0)-(c[d+4>>2]|0)|0;cf(w|0,174136,(v=i,i=i+16|0,c[v>>2]=(c[d>>2]|0)+x,c[v+8>>2]=j,v)|0);if((u|0)==-1){i=e;return}aF(10,c[10030]|0);i=e;return}function ou(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;if((b|0)==6){tK(a[237104]&1);e=c[10030]|0;aF(54,e|0);e=c[10030]|0;f=c[59242]|0;g=(c[7938]|0)+f|0;h=(c[59240]|0)+(c[(c[3524]|0)+12>>2]|0)|0;j=h-(c[7941]|0)|0;k=(c[7939]|0)+f|0;f=h-(c[7940]|0)|0;cf(e|0,174424,(v=i,i=i+32|0,c[v>>2]=g,c[v+8>>2]=j,c[v+16>>2]=k,c[v+24>>2]=f,v)|0);f=c[10030]|0;k=(c[59362]|0)+1|0;c[59362]=k;cf(f|0,174400,(v=i,i=i+8|0,c[v>>2]=k,v)|0);i=d;return}else if((b|0)==7){tK(a[237104]&1);cf(c[10030]|0,174320,(v=i,i=i+8|0,c[v>>2]=c[59362],v)|0);aI(174256,3,1,c[10030]|0);i=d;return}else if((b|0)==0){c[59362]=0;i=d;return}else{i=d;return}}function ov(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0;a=i;b=ut(28)|0;do{if((b|0)==0){gk();d=ut(28)|0;if((d|0)!=0){e=d;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{e=b}}while(0);b=e;c[e>>2]=0;c[e+12>>2]=7;c[e+4>>2]=2048;c[e+8>>2]=0;d=ut(8192)|0;do{if((d|0)==0){gk();f=ut(8192)|0;if((f|0)!=0){g=f;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{g=d}}while(0);d=e+16|0;c[d>>2]=g;g=ut(8192)|0;do{if((g|0)==0){gk();f=ut(8192)|0;if((f|0)!=0){h=f;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{h=g}}while(0);g=e+20|0;c[g>>2]=h;h=ut(2048)|0;do{if((h|0)==0){gk();f=ut(2048)|0;if((f|0)!=0){j=f;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{j=h}}while(0);c[e+24>>2]=j;do{if((c[d>>2]|0)==0){k=0}else{if((c[g>>2]|0)==0){k=0;break}uE(j|0,0,2048);k=b}}while(0);c[59112]=k;c[59113]=k;k=ut(28)|0;do{if((k|0)==0){gk();b=ut(28)|0;if((b|0)!=0){l=b;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{l=k}}while(0);k=l;c[l>>2]=2;c[l+12>>2]=1;c[l+4>>2]=3072;c[l+8>>2]=0;b=ut(12288)|0;do{if((b|0)==0){gk();j=ut(12288)|0;if((j|0)!=0){m=j;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{m=b}}while(0);b=l+16|0;c[b>>2]=m;m=ut(12288)|0;do{if((m|0)==0){gk();j=ut(12288)|0;if((j|0)!=0){n=j;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{n=m}}while(0);m=l+20|0;c[m>>2]=n;n=ut(3072)|0;do{if((n|0)==0){gk();j=ut(3072)|0;if((j|0)!=0){o=j;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{o=n}}while(0);c[l+24>>2]=o;do{if((c[b>>2]|0)==0){p=0}else{if((c[m>>2]|0)==0){p=0;break}uE(o|0,0,3072);p=k}}while(0);c[59114]=p;c[59115]=c[59112];p=ut(28)|0;do{if((p|0)==0){gk();k=ut(28)|0;if((k|0)!=0){q=k;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{q=p}}while(0);p=q;c[q>>2]=4;c[q+12>>2]=5;c[q+4>>2]=1024;c[q+8>>2]=0;k=ut(4096)|0;do{if((k|0)==0){gk();o=ut(4096)|0;if((o|0)!=0){r=o;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{r=k}}while(0);k=q+16|0;c[k>>2]=r;r=ut(4096)|0;do{if((r|0)==0){gk();o=ut(4096)|0;if((o|0)!=0){s=o;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{s=r}}while(0);r=q+20|0;c[r>>2]=s;s=ut(1024)|0;do{if((s|0)==0){gk();o=ut(1024)|0;if((o|0)!=0){t=o;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{t=s}}while(0);c[q+24>>2]=t;do{if((c[k>>2]|0)==0){u=0}else{if((c[r>>2]|0)==0){u=0;break}uE(t|0,0,1024);u=p}}while(0);c[59116]=u;u=ut(28)|0;do{if((u|0)==0){gk();p=ut(28)|0;if((p|0)!=0){w=p;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{w=u}}while(0);u=w;c[w>>2]=5;c[w+12>>2]=6;c[w+4>>2]=256;c[w+8>>2]=0;p=ut(1024)|0;do{if((p|0)==0){gk();t=ut(1024)|0;if((t|0)!=0){x=t;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{x=p}}while(0);p=w+16|0;c[p>>2]=x;x=ut(1024)|0;do{if((x|0)==0){gk();t=ut(1024)|0;if((t|0)!=0){y=t;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{y=x}}while(0);x=w+20|0;c[x>>2]=y;y=ut(256)|0;do{if((y|0)==0){gk();t=ut(256)|0;if((t|0)!=0){z=t;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{z=y}}while(0);c[w+24>>2]=z;do{if((c[p>>2]|0)==0){A=0}else{if((c[x>>2]|0)==0){A=0;break}uE(z|0,0,256);A=u}}while(0);c[59117]=A;A=ut(28)|0;do{if((A|0)==0){gk();u=ut(28)|0;if((u|0)!=0){B=u;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{B=A}}while(0);A=B;c[B>>2]=6;c[B+12>>2]=8;c[B+4>>2]=256;c[B+8>>2]=0;u=ut(1024)|0;do{if((u|0)==0){gk();z=ut(1024)|0;if((z|0)!=0){C=z;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{C=u}}while(0);u=B+16|0;c[u>>2]=C;C=ut(1024)|0;do{if((C|0)==0){gk();z=ut(1024)|0;if((z|0)!=0){D=z;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{D=C}}while(0);C=B+20|0;c[C>>2]=D;D=ut(256)|0;do{if((D|0)==0){gk();z=ut(256)|0;if((z|0)!=0){E=z;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{E=D}}while(0);c[B+24>>2]=E;do{if((c[u>>2]|0)==0){F=0}else{if((c[C>>2]|0)==0){F=0;break}uE(E|0,0,256);F=A}}while(0);c[59118]=F;F=ut(28)|0;do{if((F|0)==0){gk();A=ut(28)|0;if((A|0)!=0){G=A;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{G=F}}while(0);F=G;c[G>>2]=7;c[G+12>>2]=9;c[G+4>>2]=128;c[G+8>>2]=0;A=ut(512)|0;do{if((A|0)==0){gk();E=ut(512)|0;if((E|0)!=0){H=E;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{H=A}}while(0);A=G+16|0;c[A>>2]=H;H=ut(512)|0;do{if((H|0)==0){gk();E=ut(512)|0;if((E|0)!=0){I=E;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{I=H}}while(0);H=G+20|0;c[H>>2]=I;I=ut(128)|0;do{if((I|0)==0){gk();E=ut(128)|0;if((E|0)!=0){J=E;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{J=I}}while(0);c[G+24>>2]=J;do{if((c[A>>2]|0)==0){K=0}else{if((c[H>>2]|0)==0){K=0;break}uE(J|0,0,128);K=F}}while(0);c[59119]=K;K=ut(28)|0;do{if((K|0)==0){gk();F=ut(28)|0;if((F|0)!=0){L=F;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{L=K}}while(0);K=L;c[L>>2]=8;c[L+12>>2]=10;c[L+4>>2]=128;c[L+8>>2]=0;F=ut(512)|0;do{if((F|0)==0){gk();J=ut(512)|0;if((J|0)!=0){M=J;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{M=F}}while(0);F=L+16|0;c[F>>2]=M;M=ut(512)|0;do{if((M|0)==0){gk();J=ut(512)|0;if((J|0)!=0){N=J;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{N=M}}while(0);M=L+20|0;c[M>>2]=N;N=ut(128)|0;do{if((N|0)==0){gk();J=ut(128)|0;if((J|0)!=0){O=J;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{O=N}}while(0);c[L+24>>2]=O;do{if((c[F>>2]|0)==0){P=0}else{if((c[M>>2]|0)==0){P=0;break}uE(O|0,0,128);P=K}}while(0);c[59120]=P;P=ut(28)|0;do{if((P|0)==0){gk();K=ut(28)|0;if((K|0)!=0){Q=K;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{Q=P}}while(0);P=Q;c[Q>>2]=9;c[Q+12>>2]=6;c[Q+4>>2]=64;c[Q+8>>2]=0;K=ut(256)|0;do{if((K|0)==0){gk();O=ut(256)|0;if((O|0)!=0){R=O;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{R=K}}while(0);K=Q+16|0;c[K>>2]=R;R=ut(256)|0;do{if((R|0)==0){gk();O=ut(256)|0;if((O|0)!=0){S=O;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{S=R}}while(0);R=Q+20|0;c[R>>2]=S;S=ut(64)|0;do{if((S|0)==0){gk();O=ut(64)|0;if((O|0)!=0){T=O;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{T=S}}while(0);c[Q+24>>2]=T;do{if((c[K>>2]|0)==0){U=0}else{if((c[R>>2]|0)==0){U=0;break}uE(T|0,0,64);U=P}}while(0);c[59121]=U;U=ut(28)|0;do{if((U|0)==0){gk();P=ut(28)|0;if((P|0)!=0){V=P;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{V=U}}while(0);U=V;c[V>>2]=10;c[V+12>>2]=4;c[V+4>>2]=64;c[V+8>>2]=0;P=ut(256)|0;do{if((P|0)==0){gk();T=ut(256)|0;if((T|0)!=0){W=T;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{W=P}}while(0);P=V+16|0;c[P>>2]=W;W=ut(256)|0;do{if((W|0)==0){gk();T=ut(256)|0;if((T|0)!=0){X=T;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{X=W}}while(0);W=V+20|0;c[W>>2]=X;X=ut(64)|0;do{if((X|0)==0){gk();T=ut(64)|0;if((T|0)!=0){Y=T;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{Y=X}}while(0);c[V+24>>2]=Y;do{if((c[P>>2]|0)==0){Z=0}else{if((c[W>>2]|0)==0){Z=0;break}uE(Y|0,0,64);Z=U}}while(0);c[59122]=Z;Z=ut(28)|0;do{if((Z|0)==0){gk();U=ut(28)|0;if((U|0)!=0){_=U;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{_=Z}}while(0);Z=_;c[_>>2]=11;c[_+12>>2]=11;c[_+4>>2]=512;c[_+8>>2]=0;U=ut(2048)|0;do{if((U|0)==0){gk();Y=ut(2048)|0;if((Y|0)!=0){$=Y;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{$=U}}while(0);U=_+16|0;c[U>>2]=$;$=ut(2048)|0;do{if(($|0)==0){gk();Y=ut(2048)|0;if((Y|0)!=0){aa=Y;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{aa=$}}while(0);$=_+20|0;c[$>>2]=aa;aa=ut(512)|0;do{if((aa|0)==0){gk();Y=ut(512)|0;if((Y|0)!=0){ab=Y;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{ab=aa}}while(0);c[_+24>>2]=ab;if((c[U>>2]|0)==0){ac=0;c[59123]=ac;ad=c[59122]|0;c[59128]=ad;c[59108]=0;ae=c[10030]|0;af=aI(174480,10,1,ae|0)|0;ag=c[10030]|0;ah=aD(ag|0)|0;i=a;return}if((c[$>>2]|0)==0){ac=0;c[59123]=ac;ad=c[59122]|0;c[59128]=ad;c[59108]=0;ae=c[10030]|0;af=aI(174480,10,1,ae|0)|0;ag=c[10030]|0;ah=aD(ag|0)|0;i=a;return}uE(ab|0,0,512);ac=Z;c[59123]=ac;ad=c[59122]|0;c[59128]=ad;c[59108]=0;ae=c[10030]|0;af=aI(174480,10,1,ae|0)|0;ag=c[10030]|0;ah=aD(ag|0)|0;i=a;return}function ow(a){a=a|0;var b=0,d=0;b=(a|0)<-2?-2:a;if((b|0)>8){d=(b|0)%9&-1}else{d=b}b=c[236448+(d+2<<2)>>2]|0;if((b|0)==(c[59128]|0)){c[59106]=(c[59106]|0)+1;return}else{c[59128]=b;return}}function ox(){var a=0,b=0;a=2;do{b=c[236448+(a<<2)>>2]|0;uu(c[b+16>>2]|0);uu(c[b+20>>2]|0);uu(c[b+24>>2]|0);uu(b);a=a+1|0;}while((a|0)<12);return}function oy(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;a=c[59112]|0;b=c[59108]|0;if((c[a+12>>2]|0)==(b|0)){tJ(a);d=c[59108]|0}else{d=b}b=c[59113]|0;if((c[b+12>>2]|0)==(d|0)){tJ(b);e=c[59108]|0}else{e=d}d=c[59114]|0;if((c[d+12>>2]|0)==(e|0)){tJ(d);f=c[59108]|0}else{f=e}e=c[59115]|0;if((c[e+12>>2]|0)==(f|0)){tJ(e);g=c[59108]|0}else{g=f}f=c[59116]|0;if((c[f+12>>2]|0)==(g|0)){tJ(f);h=c[59108]|0}else{h=g}g=c[59117]|0;if((c[g+12>>2]|0)==(h|0)){tJ(g);i=c[59108]|0}else{i=h}h=c[59118]|0;if((c[h+12>>2]|0)==(i|0)){tJ(h);j=c[59108]|0}else{j=i}i=c[59119]|0;if((c[i+12>>2]|0)==(j|0)){tJ(i);k=c[59108]|0}else{k=j}j=c[59120]|0;if((c[j+12>>2]|0)==(k|0)){tJ(j);l=c[59108]|0}else{l=k}k=c[59121]|0;if((c[k+12>>2]|0)==(l|0)){tJ(k);m=c[59108]|0}else{m=l}l=c[59122]|0;if((c[l+12>>2]|0)==(m|0)){tJ(l);n=c[59108]|0}else{n=m}m=c[59123]|0;if((c[m+12>>2]|0)==(n|0)){tJ(m);o=0}else{o=0}do{m=236448+(o<<2)|0;tJ(c[m>>2]|0);n=c[(c[m>>2]|0)+12>>2]|0;m=c[59112]|0;if((c[m+12>>2]|0)==(n|0)){tJ(m)}m=c[59113]|0;if((c[m+12>>2]|0)==(n|0)){tJ(m)}m=c[59114]|0;if((c[m+12>>2]|0)==(n|0)){tJ(m)}m=c[59115]|0;if((c[m+12>>2]|0)==(n|0)){tJ(m)}m=c[59116]|0;if((c[m+12>>2]|0)==(n|0)){tJ(m)}m=c[59117]|0;if((c[m+12>>2]|0)==(n|0)){tJ(m)}m=c[59118]|0;if((c[m+12>>2]|0)==(n|0)){tJ(m)}m=c[59119]|0;if((c[m+12>>2]|0)==(n|0)){tJ(m)}m=c[59120]|0;if((c[m+12>>2]|0)==(n|0)){tJ(m)}m=c[59121]|0;if((c[m+12>>2]|0)==(n|0)){tJ(m)}m=c[59122]|0;if((c[m+12>>2]|0)==(n|0)){tJ(m)}m=c[59123]|0;if((c[m+12>>2]|0)==(n|0)){tJ(m)}o=o+1|0;}while((o|0)<12);aI(174496,5,1,c[10030]|0);aD(c[10030]|0);return}function oz(){aI(174504,8,1,c[10030]|0);c[59096]=-200;c[59098]=-200;c[59124]=800;c[59126]=800;a[236440]=1;c[59104]=0;c[59102]=0;c[59106]=0;c[59100]=0;return}function oA(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;e=c[59128]|0;f=c[e+8>>2]|0;do{if((f|0)>0){g=f-1|0;h=(c[e+16>>2]|0)+(g<<2)|0;do{if((c[h>>2]|0)==(b|0)){if((c[(c[e+20>>2]|0)+(g<<2)>>2]|0)!=(d|0)){break}c[59104]=(c[59104]|0)+1;return}}while(0);if((a[(c[e+24>>2]|0)+g|0]&1)==0){break}c[h>>2]=b;i=c[59128]|0;c[(c[i+20>>2]|0)+((c[i+8>>2]|0)-1<<2)>>2]=d;c[59104]=(c[59104]|0)+1;return}}while(0);if((f|0)==(c[e+4>>2]|0)){tI();i=c[59128]|0;j=i;k=c[i+8>>2]|0}else{j=e;k=f}c[(c[j+16>>2]|0)+(k<<2)>>2]=b;b=c[59128]|0;c[(c[b+20>>2]|0)+(c[b+8>>2]<<2)>>2]=d;d=c[59128]|0;a[(c[d+24>>2]|0)+(c[d+8>>2]|0)|0]=1;d=(c[59128]|0)+8|0;c[d>>2]=(c[d>>2]|0)+1;return}function oB(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=c[59128]|0;f=c[e+8>>2]|0;do{if((f|0)>2){g=f-1|0;if((c[(c[e+16>>2]|0)+(g<<2)>>2]|0)!=(b|0)){break}if((c[(c[e+20>>2]|0)+(g<<2)>>2]|0)!=(d|0)){break}if((a[(c[e+24>>2]|0)+g|0]&1)!=0){break}c[59102]=(c[59102]|0)+1;return}}while(0);if((f|0)==(c[e+4>>2]|0)){tI();g=c[59128]|0;h=g;i=c[g+8>>2]|0}else{h=e;i=f}c[(c[h+16>>2]|0)+(i<<2)>>2]=b;b=c[59128]|0;c[(c[b+20>>2]|0)+(c[b+8>>2]<<2)>>2]=d;d=c[59128]|0;a[(c[d+24>>2]|0)+(c[d+8>>2]|0)|0]=0;d=(c[59128]|0)+8|0;c[d>>2]=(c[d>>2]|0)+1;return}function oC(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;i=i+32|0;if((a[e]|0)==0){i=f;return}aI(174736,3,1,c[10030]|0);if(!(a[236440]|0)){g=c[10030]|0;aF(115,g|0);a[236440]=1}g=f+16|0;h=d-(c[59124]|0)|0;be(g|0,174720,(v=i,i=i+16|0,c[v>>2]=b-(c[59126]|0),c[v+8>>2]=h,v)|0);h=f|0;be(h|0,174712,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=d,v)|0);j=uA(g|0)|0;k=j>>>0<(uA(h|0)|0)>>>0;j=c[10030]|0;if(k){aK(g|0,j|0)}else{aK(h|0,j|0)}aK(e|0,c[10030]|0);c[59126]=b;c[59098]=b;c[59124]=d;c[59096]=d;i=f;return}function oD(a){a=a|0;var b=0;b=i;cf(c[10030]|0,174744,(v=i,i=i+8|0,c[v>>2]=(a|0)!=0?2:1,v)|0);i=b;return 1}function oE(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0,aA=0;f=c[59128]|0;g=c[f+12>>2]|0;h=(g|0)!=1;do{if(h){i=c[59114]|0;if((i|0)==(f|0)){c[59106]=(c[59106]|0)+1;j=g;k=f;break}else{c[59128]=i;j=g;k=i;break}}else{j=0;k=f}}while(0);if((e|0)<0){f=c[59123]|0;c[59128]=f;g=c[f+8>>2]|0;do{if((g|0)>2){i=g-1|0;if((c[(c[f+16>>2]|0)+(i<<2)>>2]|0)!=(b|0)){l=14737;break}if((c[(c[f+20>>2]|0)+(i<<2)>>2]|0)!=(d|0)){l=14737;break}if((a[(c[f+24>>2]|0)+i|0]&1)!=0){l=14737;break}c[59102]=(c[59102]|0)+1}else{l=14737}}while(0);if((l|0)==14737){if((g|0)==(c[f+4>>2]|0)){tI();i=c[59128]|0;m=i;n=c[i+8>>2]|0}else{m=f;n=g}c[(c[m+16>>2]|0)+(n<<2)>>2]=b;n=c[59128]|0;c[(c[n+20>>2]|0)+(c[n+8>>2]<<2)>>2]=d;n=c[59128]|0;a[(c[n+24>>2]|0)+(c[n+8>>2]|0)|0]=0;n=(c[59128]|0)+8|0;c[n>>2]=(c[n>>2]|0)+1}c[59128]=k}k=(e|0)%9&-1;L19947:do{if((k|0)==6){e=b+2|0;n=d+2|0;oA(e,n);m=b-2|0;g=d-2|0;f=c[59128]|0;i=c[f+8>>2]|0;do{if((i|0)>2){o=i-1|0;if((c[(c[f+16>>2]|0)+(o<<2)>>2]|0)!=(m|0)){l=14891;break}if((c[(c[f+20>>2]|0)+(o<<2)>>2]|0)!=(g|0)){l=14891;break}if((a[(c[f+24>>2]|0)+o|0]&1)!=0){l=14891;break}c[59102]=(c[59102]|0)+1}else{l=14891}}while(0);if((l|0)==14891){if((i|0)==(c[f+4>>2]|0)){tI();o=c[59128]|0;p=o;q=c[o+8>>2]|0}else{p=f;q=i}c[(c[p+16>>2]|0)+(q<<2)>>2]=m;o=c[59128]|0;c[(c[o+20>>2]|0)+(c[o+8>>2]<<2)>>2]=g;o=c[59128]|0;a[(c[o+24>>2]|0)+(c[o+8>>2]|0)|0]=0;o=(c[59128]|0)+8|0;c[o>>2]=(c[o>>2]|0)+1}oA(m,n);o=c[59128]|0;r=c[o+8>>2]|0;do{if((r|0)>2){s=r-1|0;if((c[(c[o+16>>2]|0)+(s<<2)>>2]|0)!=(e|0)){break}if((c[(c[o+20>>2]|0)+(s<<2)>>2]|0)!=(g|0)){break}if((a[(c[o+24>>2]|0)+s|0]&1)!=0){break}c[59102]=(c[59102]|0)+1;break L19947}}while(0);if((r|0)==(c[o+4>>2]|0)){tI();n=c[59128]|0;t=n;u=c[n+8>>2]|0}else{t=o;u=r}c[(c[t+16>>2]|0)+(u<<2)>>2]=e;n=c[59128]|0;c[(c[n+20>>2]|0)+(c[n+8>>2]<<2)>>2]=g;n=c[59128]|0;a[(c[n+24>>2]|0)+(c[n+8>>2]|0)|0]=0;n=(c[59128]|0)+8|0;c[n>>2]=(c[n>>2]|0)+1}else if((k|0)==2){n=b-2|0;oA(n,d);m=b+2|0;i=d+2|0;f=c[59128]|0;s=c[f+8>>2]|0;do{if((s|0)>2){v=s-1|0;if((c[(c[f+16>>2]|0)+(v<<2)>>2]|0)!=(m|0)){l=14795;break}if((c[(c[f+20>>2]|0)+(v<<2)>>2]|0)!=(i|0)){l=14795;break}if((a[(c[f+24>>2]|0)+v|0]&1)!=0){l=14795;break}c[59102]=(c[59102]|0)+1;w=f}else{l=14795}}while(0);if((l|0)==14795){if((s|0)==(c[f+4>>2]|0)){tI();g=c[59128]|0;x=g;y=c[g+8>>2]|0}else{x=f;y=s}c[(c[x+16>>2]|0)+(y<<2)>>2]=m;g=c[59128]|0;c[(c[g+20>>2]|0)+(c[g+8>>2]<<2)>>2]=i;g=c[59128]|0;a[(c[g+24>>2]|0)+(c[g+8>>2]|0)|0]=0;g=(c[59128]|0)+8|0;c[g>>2]=(c[g>>2]|0)+1;w=c[59128]|0}g=d-2|0;e=c[w+8>>2]|0;do{if((e|0)>2){r=e-1|0;if((c[(c[w+16>>2]|0)+(r<<2)>>2]|0)!=(m|0)){l=14803;break}if((c[(c[w+20>>2]|0)+(r<<2)>>2]|0)!=(g|0)){l=14803;break}if((a[(c[w+24>>2]|0)+r|0]&1)!=0){l=14803;break}c[59102]=(c[59102]|0)+1;z=w}else{l=14803}}while(0);if((l|0)==14803){if((e|0)==(c[w+4>>2]|0)){tI();i=c[59128]|0;A=i;B=c[i+8>>2]|0}else{A=w;B=e}c[(c[A+16>>2]|0)+(B<<2)>>2]=m;i=c[59128]|0;c[(c[i+20>>2]|0)+(c[i+8>>2]<<2)>>2]=g;i=c[59128]|0;a[(c[i+24>>2]|0)+(c[i+8>>2]|0)|0]=0;i=(c[59128]|0)+8|0;c[i>>2]=(c[i>>2]|0)+1;z=c[59128]|0}i=c[z+8>>2]|0;do{if((i|0)>2){s=i-1|0;if((c[(c[z+16>>2]|0)+(s<<2)>>2]|0)!=(n|0)){break}if((c[(c[z+20>>2]|0)+(s<<2)>>2]|0)!=(d|0)){break}if((a[(c[z+24>>2]|0)+s|0]&1)!=0){break}c[59102]=(c[59102]|0)+1;break L19947}}while(0);if((i|0)==(c[z+4>>2]|0)){tI();g=c[59128]|0;C=g;D=c[g+8>>2]|0}else{C=z;D=i}c[(c[C+16>>2]|0)+(D<<2)>>2]=n;g=c[59128]|0;c[(c[g+20>>2]|0)+(c[g+8>>2]<<2)>>2]=d;g=c[59128]|0;a[(c[g+24>>2]|0)+(c[g+8>>2]|0)|0]=0;g=(c[59128]|0)+8|0;c[g>>2]=(c[g>>2]|0)+1}else if((k|0)==3){g=b+2|0;oA(g,d);m=b-2|0;e=d+2|0;s=c[59128]|0;f=c[s+8>>2]|0;do{if((f|0)>2){r=f-1|0;if((c[(c[s+16>>2]|0)+(r<<2)>>2]|0)!=(m|0)){l=14819;break}if((c[(c[s+20>>2]|0)+(r<<2)>>2]|0)!=(e|0)){l=14819;break}if((a[(c[s+24>>2]|0)+r|0]&1)!=0){l=14819;break}c[59102]=(c[59102]|0)+1;E=s}else{l=14819}}while(0);if((l|0)==14819){if((f|0)==(c[s+4>>2]|0)){tI();n=c[59128]|0;F=n;G=c[n+8>>2]|0}else{F=s;G=f}c[(c[F+16>>2]|0)+(G<<2)>>2]=m;n=c[59128]|0;c[(c[n+20>>2]|0)+(c[n+8>>2]<<2)>>2]=e;n=c[59128]|0;a[(c[n+24>>2]|0)+(c[n+8>>2]|0)|0]=0;n=(c[59128]|0)+8|0;c[n>>2]=(c[n>>2]|0)+1;E=c[59128]|0}n=d-2|0;i=c[E+8>>2]|0;do{if((i|0)>2){r=i-1|0;if((c[(c[E+16>>2]|0)+(r<<2)>>2]|0)!=(m|0)){l=14827;break}if((c[(c[E+20>>2]|0)+(r<<2)>>2]|0)!=(n|0)){l=14827;break}if((a[(c[E+24>>2]|0)+r|0]&1)!=0){l=14827;break}c[59102]=(c[59102]|0)+1;H=E}else{l=14827}}while(0);if((l|0)==14827){if((i|0)==(c[E+4>>2]|0)){tI();e=c[59128]|0;I=e;J=c[e+8>>2]|0}else{I=E;J=i}c[(c[I+16>>2]|0)+(J<<2)>>2]=m;e=c[59128]|0;c[(c[e+20>>2]|0)+(c[e+8>>2]<<2)>>2]=n;e=c[59128]|0;a[(c[e+24>>2]|0)+(c[e+8>>2]|0)|0]=0;e=(c[59128]|0)+8|0;c[e>>2]=(c[e>>2]|0)+1;H=c[59128]|0}e=c[H+8>>2]|0;do{if((e|0)>2){f=e-1|0;if((c[(c[H+16>>2]|0)+(f<<2)>>2]|0)!=(g|0)){break}if((c[(c[H+20>>2]|0)+(f<<2)>>2]|0)!=(d|0)){break}if((a[(c[H+24>>2]|0)+f|0]&1)!=0){break}c[59102]=(c[59102]|0)+1;break L19947}}while(0);if((e|0)==(c[H+4>>2]|0)){tI();n=c[59128]|0;K=n;L=c[n+8>>2]|0}else{K=H;L=e}c[(c[K+16>>2]|0)+(L<<2)>>2]=g;n=c[59128]|0;c[(c[n+20>>2]|0)+(c[n+8>>2]<<2)>>2]=d;n=c[59128]|0;a[(c[n+24>>2]|0)+(c[n+8>>2]|0)|0]=0;n=(c[59128]|0)+8|0;c[n>>2]=(c[n>>2]|0)+1}else if((k|0)==0){n=b-2|0;m=d-2|0;oA(n,m);i=d+2|0;f=c[59128]|0;s=c[f+8>>2]|0;do{if((s|0)>2){r=s-1|0;if((c[(c[f+16>>2]|0)+(r<<2)>>2]|0)!=(b|0)){l=14747;break}if((c[(c[f+20>>2]|0)+(r<<2)>>2]|0)!=(i|0)){l=14747;break}if((a[(c[f+24>>2]|0)+r|0]&1)!=0){l=14747;break}c[59102]=(c[59102]|0)+1;M=f}else{l=14747}}while(0);if((l|0)==14747){if((s|0)==(c[f+4>>2]|0)){tI();g=c[59128]|0;N=g;O=c[g+8>>2]|0}else{N=f;O=s}c[(c[N+16>>2]|0)+(O<<2)>>2]=b;g=c[59128]|0;c[(c[g+20>>2]|0)+(c[g+8>>2]<<2)>>2]=i;g=c[59128]|0;a[(c[g+24>>2]|0)+(c[g+8>>2]|0)|0]=0;g=(c[59128]|0)+8|0;c[g>>2]=(c[g>>2]|0)+1;M=c[59128]|0}g=b+2|0;e=c[M+8>>2]|0;do{if((e|0)>2){r=e-1|0;if((c[(c[M+16>>2]|0)+(r<<2)>>2]|0)!=(g|0)){l=14755;break}if((c[(c[M+20>>2]|0)+(r<<2)>>2]|0)!=(m|0)){l=14755;break}if((a[(c[M+24>>2]|0)+r|0]&1)!=0){l=14755;break}c[59102]=(c[59102]|0)+1;P=M}else{l=14755}}while(0);if((l|0)==14755){if((e|0)==(c[M+4>>2]|0)){tI();i=c[59128]|0;Q=i;R=c[i+8>>2]|0}else{Q=M;R=e}c[(c[Q+16>>2]|0)+(R<<2)>>2]=g;i=c[59128]|0;c[(c[i+20>>2]|0)+(c[i+8>>2]<<2)>>2]=m;i=c[59128]|0;a[(c[i+24>>2]|0)+(c[i+8>>2]|0)|0]=0;i=(c[59128]|0)+8|0;c[i>>2]=(c[i>>2]|0)+1;P=c[59128]|0}i=c[P+8>>2]|0;do{if((i|0)>2){s=i-1|0;if((c[(c[P+16>>2]|0)+(s<<2)>>2]|0)!=(n|0)){break}if((c[(c[P+20>>2]|0)+(s<<2)>>2]|0)!=(m|0)){break}if((a[(c[P+24>>2]|0)+s|0]&1)!=0){break}c[59102]=(c[59102]|0)+1;break L19947}}while(0);if((i|0)==(c[P+4>>2]|0)){tI();g=c[59128]|0;S=g;T=c[g+8>>2]|0}else{S=P;T=i}c[(c[S+16>>2]|0)+(T<<2)>>2]=n;g=c[59128]|0;c[(c[g+20>>2]|0)+(c[g+8>>2]<<2)>>2]=m;g=c[59128]|0;a[(c[g+24>>2]|0)+(c[g+8>>2]|0)|0]=0;g=(c[59128]|0)+8|0;c[g>>2]=(c[g>>2]|0)+1}else if((k|0)==5){oA(b,d+2|0);g=d-2|0;e=c[59128]|0;s=c[e+8>>2]|0;do{if((s|0)>2){f=s-1|0;if((c[(c[e+16>>2]|0)+(f<<2)>>2]|0)!=(b|0)){l=14875;break}if((c[(c[e+20>>2]|0)+(f<<2)>>2]|0)!=(g|0)){l=14875;break}if((a[(c[e+24>>2]|0)+f|0]&1)!=0){l=14875;break}c[59102]=(c[59102]|0)+1}else{l=14875}}while(0);if((l|0)==14875){if((s|0)==(c[e+4>>2]|0)){tI();m=c[59128]|0;U=m;V=c[m+8>>2]|0}else{U=e;V=s}c[(c[U+16>>2]|0)+(V<<2)>>2]=b;m=c[59128]|0;c[(c[m+20>>2]|0)+(c[m+8>>2]<<2)>>2]=g;m=c[59128]|0;a[(c[m+24>>2]|0)+(c[m+8>>2]|0)|0]=0;m=(c[59128]|0)+8|0;c[m>>2]=(c[m>>2]|0)+1}oA(b-2|0,d);m=b+2|0;n=c[59128]|0;i=c[n+8>>2]|0;do{if((i|0)>2){f=i-1|0;if((c[(c[n+16>>2]|0)+(f<<2)>>2]|0)!=(m|0)){break}if((c[(c[n+20>>2]|0)+(f<<2)>>2]|0)!=(d|0)){break}if((a[(c[n+24>>2]|0)+f|0]&1)!=0){break}c[59102]=(c[59102]|0)+1;break L19947}}while(0);if((i|0)==(c[n+4>>2]|0)){tI();g=c[59128]|0;W=g;X=c[g+8>>2]|0}else{W=n;X=i}c[(c[W+16>>2]|0)+(X<<2)>>2]=m;g=c[59128]|0;c[(c[g+20>>2]|0)+(c[g+8>>2]<<2)>>2]=d;g=c[59128]|0;a[(c[g+24>>2]|0)+(c[g+8>>2]|0)|0]=0;g=(c[59128]|0)+8|0;c[g>>2]=(c[g>>2]|0)+1}else if((k|0)==1){g=b-2|0;s=d+2|0;oA(g,s);e=d-2|0;f=c[59128]|0;r=c[f+8>>2]|0;do{if((r|0)>2){o=r-1|0;if((c[(c[f+16>>2]|0)+(o<<2)>>2]|0)!=(b|0)){l=14771;break}if((c[(c[f+20>>2]|0)+(o<<2)>>2]|0)!=(e|0)){l=14771;break}if((a[(c[f+24>>2]|0)+o|0]&1)!=0){l=14771;break}c[59102]=(c[59102]|0)+1;Y=f}else{l=14771}}while(0);if((l|0)==14771){if((r|0)==(c[f+4>>2]|0)){tI();m=c[59128]|0;Z=m;_=c[m+8>>2]|0}else{Z=f;_=r}c[(c[Z+16>>2]|0)+(_<<2)>>2]=b;m=c[59128]|0;c[(c[m+20>>2]|0)+(c[m+8>>2]<<2)>>2]=e;m=c[59128]|0;a[(c[m+24>>2]|0)+(c[m+8>>2]|0)|0]=0;m=(c[59128]|0)+8|0;c[m>>2]=(c[m>>2]|0)+1;Y=c[59128]|0}m=b+2|0;i=c[Y+8>>2]|0;do{if((i|0)>2){n=i-1|0;if((c[(c[Y+16>>2]|0)+(n<<2)>>2]|0)!=(m|0)){l=14779;break}if((c[(c[Y+20>>2]|0)+(n<<2)>>2]|0)!=(s|0)){l=14779;break}if((a[(c[Y+24>>2]|0)+n|0]&1)!=0){l=14779;break}c[59102]=(c[59102]|0)+1;$=Y}else{l=14779}}while(0);if((l|0)==14779){if((i|0)==(c[Y+4>>2]|0)){tI();e=c[59128]|0;aa=e;ab=c[e+8>>2]|0}else{aa=Y;ab=i}c[(c[aa+16>>2]|0)+(ab<<2)>>2]=m;e=c[59128]|0;c[(c[e+20>>2]|0)+(c[e+8>>2]<<2)>>2]=s;e=c[59128]|0;a[(c[e+24>>2]|0)+(c[e+8>>2]|0)|0]=0;e=(c[59128]|0)+8|0;c[e>>2]=(c[e>>2]|0)+1;$=c[59128]|0}e=c[$+8>>2]|0;do{if((e|0)>2){r=e-1|0;if((c[(c[$+16>>2]|0)+(r<<2)>>2]|0)!=(g|0)){break}if((c[(c[$+20>>2]|0)+(r<<2)>>2]|0)!=(s|0)){break}if((a[(c[$+24>>2]|0)+r|0]&1)!=0){break}c[59102]=(c[59102]|0)+1;break L19947}}while(0);if((e|0)==(c[$+4>>2]|0)){tI();m=c[59128]|0;ac=m;ad=c[m+8>>2]|0}else{ac=$;ad=e}c[(c[ac+16>>2]|0)+(ad<<2)>>2]=g;m=c[59128]|0;c[(c[m+20>>2]|0)+(c[m+8>>2]<<2)>>2]=s;m=c[59128]|0;a[(c[m+24>>2]|0)+(c[m+8>>2]|0)|0]=0;m=(c[59128]|0)+8|0;c[m>>2]=(c[m>>2]|0)+1}else if((k|0)==4){m=b-2|0;i=d-2|0;oA(m,i);r=d+2|0;f=c[59128]|0;n=c[f+8>>2]|0;do{if((n|0)>2){o=n-1|0;if((c[(c[f+16>>2]|0)+(o<<2)>>2]|0)!=(m|0)){l=14843;break}if((c[(c[f+20>>2]|0)+(o<<2)>>2]|0)!=(r|0)){l=14843;break}if((a[(c[f+24>>2]|0)+o|0]&1)!=0){l=14843;break}c[59102]=(c[59102]|0)+1;ae=f}else{l=14843}}while(0);if((l|0)==14843){if((n|0)==(c[f+4>>2]|0)){tI();s=c[59128]|0;af=s;ag=c[s+8>>2]|0}else{af=f;ag=n}c[(c[af+16>>2]|0)+(ag<<2)>>2]=m;s=c[59128]|0;c[(c[s+20>>2]|0)+(c[s+8>>2]<<2)>>2]=r;s=c[59128]|0;a[(c[s+24>>2]|0)+(c[s+8>>2]|0)|0]=0;s=(c[59128]|0)+8|0;c[s>>2]=(c[s>>2]|0)+1;ae=c[59128]|0}s=b+2|0;g=c[ae+8>>2]|0;do{if((g|0)>2){e=g-1|0;if((c[(c[ae+16>>2]|0)+(e<<2)>>2]|0)!=(s|0)){l=14851;break}if((c[(c[ae+20>>2]|0)+(e<<2)>>2]|0)!=(r|0)){l=14851;break}if((a[(c[ae+24>>2]|0)+e|0]&1)!=0){l=14851;break}c[59102]=(c[59102]|0)+1;ah=ae}else{l=14851}}while(0);if((l|0)==14851){if((g|0)==(c[ae+4>>2]|0)){tI();n=c[59128]|0;ai=n;aj=c[n+8>>2]|0}else{ai=ae;aj=g}c[(c[ai+16>>2]|0)+(aj<<2)>>2]=s;n=c[59128]|0;c[(c[n+20>>2]|0)+(c[n+8>>2]<<2)>>2]=r;n=c[59128]|0;a[(c[n+24>>2]|0)+(c[n+8>>2]|0)|0]=0;n=(c[59128]|0)+8|0;c[n>>2]=(c[n>>2]|0)+1;ah=c[59128]|0}n=c[ah+8>>2]|0;do{if((n|0)>2){f=n-1|0;if((c[(c[ah+16>>2]|0)+(f<<2)>>2]|0)!=(s|0)){l=14859;break}if((c[(c[ah+20>>2]|0)+(f<<2)>>2]|0)!=(i|0)){l=14859;break}if((a[(c[ah+24>>2]|0)+f|0]&1)!=0){l=14859;break}c[59102]=(c[59102]|0)+1;ak=ah}else{l=14859}}while(0);if((l|0)==14859){if((n|0)==(c[ah+4>>2]|0)){tI();r=c[59128]|0;al=r;am=c[r+8>>2]|0}else{al=ah;am=n}c[(c[al+16>>2]|0)+(am<<2)>>2]=s;r=c[59128]|0;c[(c[r+20>>2]|0)+(c[r+8>>2]<<2)>>2]=i;r=c[59128]|0;a[(c[r+24>>2]|0)+(c[r+8>>2]|0)|0]=0;r=(c[59128]|0)+8|0;c[r>>2]=(c[r>>2]|0)+1;ak=c[59128]|0}r=c[ak+8>>2]|0;do{if((r|0)>2){g=r-1|0;if((c[(c[ak+16>>2]|0)+(g<<2)>>2]|0)!=(m|0)){break}if((c[(c[ak+20>>2]|0)+(g<<2)>>2]|0)!=(i|0)){break}if((a[(c[ak+24>>2]|0)+g|0]&1)!=0){break}c[59102]=(c[59102]|0)+1;break L19947}}while(0);if((r|0)==(c[ak+4>>2]|0)){tI();s=c[59128]|0;an=s;ao=c[s+8>>2]|0}else{an=ak;ao=r}c[(c[an+16>>2]|0)+(ao<<2)>>2]=m;s=c[59128]|0;c[(c[s+20>>2]|0)+(c[s+8>>2]<<2)>>2]=i;s=c[59128]|0;a[(c[s+24>>2]|0)+(c[s+8>>2]|0)|0]=0;s=(c[59128]|0)+8|0;c[s>>2]=(c[s>>2]|0)+1}else{s=d-2|0;oA(b,s);n=b-2|0;g=c[59128]|0;f=c[g+8>>2]|0;do{if((f|0)>2){e=f-1|0;if((c[(c[g+16>>2]|0)+(e<<2)>>2]|0)!=(n|0)){l=14907;break}if((c[(c[g+20>>2]|0)+(e<<2)>>2]|0)!=(d|0)){l=14907;break}if((a[(c[g+24>>2]|0)+e|0]&1)!=0){l=14907;break}c[59102]=(c[59102]|0)+1;ap=g}else{l=14907}}while(0);if((l|0)==14907){if((f|0)==(c[g+4>>2]|0)){tI();i=c[59128]|0;aq=i;ar=c[i+8>>2]|0}else{aq=g;ar=f}c[(c[aq+16>>2]|0)+(ar<<2)>>2]=n;i=c[59128]|0;c[(c[i+20>>2]|0)+(c[i+8>>2]<<2)>>2]=d;i=c[59128]|0;a[(c[i+24>>2]|0)+(c[i+8>>2]|0)|0]=0;i=(c[59128]|0)+8|0;c[i>>2]=(c[i>>2]|0)+1;ap=c[59128]|0}i=d+2|0;m=c[ap+8>>2]|0;do{if((m|0)>2){r=m-1|0;if((c[(c[ap+16>>2]|0)+(r<<2)>>2]|0)!=(b|0)){l=14915;break}if((c[(c[ap+20>>2]|0)+(r<<2)>>2]|0)!=(i|0)){l=14915;break}if((a[(c[ap+24>>2]|0)+r|0]&1)!=0){l=14915;break}c[59102]=(c[59102]|0)+1;as=ap}else{l=14915}}while(0);if((l|0)==14915){if((m|0)==(c[ap+4>>2]|0)){tI();n=c[59128]|0;at=n;au=c[n+8>>2]|0}else{at=ap;au=m}c[(c[at+16>>2]|0)+(au<<2)>>2]=b;n=c[59128]|0;c[(c[n+20>>2]|0)+(c[n+8>>2]<<2)>>2]=i;n=c[59128]|0;a[(c[n+24>>2]|0)+(c[n+8>>2]|0)|0]=0;n=(c[59128]|0)+8|0;c[n>>2]=(c[n>>2]|0)+1;as=c[59128]|0}n=b+2|0;f=c[as+8>>2]|0;do{if((f|0)>2){g=f-1|0;if((c[(c[as+16>>2]|0)+(g<<2)>>2]|0)!=(n|0)){l=14923;break}if((c[(c[as+20>>2]|0)+(g<<2)>>2]|0)!=(d|0)){l=14923;break}if((a[(c[as+24>>2]|0)+g|0]&1)!=0){l=14923;break}c[59102]=(c[59102]|0)+1;av=as}else{l=14923}}while(0);if((l|0)==14923){if((f|0)==(c[as+4>>2]|0)){tI();i=c[59128]|0;aw=i;ax=c[i+8>>2]|0}else{aw=as;ax=f}c[(c[aw+16>>2]|0)+(ax<<2)>>2]=n;i=c[59128]|0;c[(c[i+20>>2]|0)+(c[i+8>>2]<<2)>>2]=d;i=c[59128]|0;a[(c[i+24>>2]|0)+(c[i+8>>2]|0)|0]=0;i=(c[59128]|0)+8|0;c[i>>2]=(c[i>>2]|0)+1;av=c[59128]|0}i=c[av+8>>2]|0;do{if((i|0)>2){m=i-1|0;if((c[(c[av+16>>2]|0)+(m<<2)>>2]|0)!=(b|0)){break}if((c[(c[av+20>>2]|0)+(m<<2)>>2]|0)!=(s|0)){break}if((a[(c[av+24>>2]|0)+m|0]&1)!=0){break}c[59102]=(c[59102]|0)+1;break L19947}}while(0);if((i|0)==(c[av+4>>2]|0)){tI();n=c[59128]|0;ay=n;az=c[n+8>>2]|0}else{ay=av;az=i}c[(c[ay+16>>2]|0)+(az<<2)>>2]=b;n=c[59128]|0;c[(c[n+20>>2]|0)+(c[n+8>>2]<<2)>>2]=s;n=c[59128]|0;a[(c[n+24>>2]|0)+(c[n+8>>2]|0)|0]=0;n=(c[59128]|0)+8|0;c[n>>2]=(c[n>>2]|0)+1}}while(0);if(!h){return}h=(j|0)<-2?-2:j;if((h|0)>8){aA=(h|0)%9&-1}else{aA=h}h=c[236448+(aA+2<<2)>>2]|0;if((h|0)==(c[59128]|0)){c[59106]=(c[59106]|0)+1;return}else{c[59128]=h;return}}function oF(){return}function oG(){return}function oH(){return}function oI(){return}function oJ(){aI(174776,14,1,c[10030]|0);return}function oK(){aI(174800,6,1,c[10030]|0);return}function oL(a,b){a=a|0;b=b|0;var d=0;d=i;cf(c[10030]|0,174824,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=b,v)|0);i=d;return}function oM(a,b){a=a|0;b=b|0;var d=0;d=i;cf(c[10030]|0,174848,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=b,v)|0);i=d;return}function oN(a){a=a|0;var b=0;b=i;cf(c[10030]|0,174880,(v=i,i=i+8|0,c[v>>2]=c[236584+(((a+2|0)%11&-1)<<2)>>2],v)|0);i=b;return}function oO(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;cf(c[10030]|0,174824,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=b-5,v)|0);cf(c[10030]|0,174976,(v=i,i=i+8|0,c[v>>2]=d,v)|0);i=e;return}function oP(a){a=a|0;var b=0;b=i;cf(c[10030]|0,175008,(v=i,i=i+8|0,c[v>>2]=(a|0)!=0?2:1,v)|0);i=b;return 1}function oQ(){var b=0;b=c[10030]|0;if(a[235320]|0){aI(175320|0,13,1,b|0);c[58826]=1;return}else{aI(175360|0,10,1,b|0);c[58826]=1;return}}function oR(){var a=0,b=0,d=0;a=i;aI(175544,29,1,c[10030]|0);b=c[11252]|0;if((b|0)==6){d=175480}else{d=(b|0)==1?175480:179864}cf(c[10030]|0,175512,(v=i,i=i+40|0,c[v>>2]=d,c[v+8>>2]=1e4,c[v+16>>2]=7500,h[v+24>>3]=.2,h[v+32>>3]=.4,v)|0);c[58832]=0;i=a;return}function oS(a,b){a=a|0;b=b|0;var d=0;d=i;if((c[58822]|0)==(a|0)&(c[58820]|0)==(b|0)){i=d;return}cf(c[10030]|0,175584,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=b,v)|0);c[58826]=1;c[58822]=a;c[58820]=b;i=d;return}function oT(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=c[10030]|0;if((c[58826]|0)==0){cf(e|0,175600,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=b,v)|0);c[58822]=a;c[58820]=b;i=d;return}else{cf(e|0,175616,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=b,v)|0);c[58826]=0;c[58822]=a;c[58820]=b;i=d;return}}function oU(a){a=a|0;var b=0,d=0;b=i;d=((((a|0)<-2?0:a+2|0)|0)%(c[58828]|0)&-1)+1|0;if((c[58824]|0)==(d|0)){i=b;return}cf(c[10030]|0,175648,(v=i,i=i+8|0,c[v>>2]=d,v)|0);c[58824]=d;c[58826]=1;i=b;return}function oV(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;do{if((c[58832]|0)==1){g=b+15|0;if((c[58822]|0)==(g|0)&(c[58820]|0)==(d|0)){break}h=c[10030]|0;cf(h|0,175584,(v=i,i=i+16|0,c[v>>2]=g,c[v+8>>2]=d,v)|0);c[58826]=1;c[58822]=g;c[58820]=d}else{g=d-15|0;if((c[58822]|0)==(b|0)&(c[58820]|0)==(g|0)){break}h=c[10030]|0;cf(h|0,175584,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=g,v)|0);c[58826]=1;c[58822]=b;c[58820]=g}}while(0);b=c[11252]|0;if((b|0)==6){d=c[10030]|0;aI(175688,2,1,d|0);d=a[e]|0;if(d<<24>>24!=0){g=e;h=d;do{d=h&255;do{if(h<<24>>24<0){j=38152+(d-128<<2)|0;if((a[j]|0)==0){k=14990;break}l=c[10030]|0;aK(j|0,l|0)}else{k=14990}}while(0);if((k|0)==14990){k=0;l=c[10030]|0;aF(d|0,l|0)}g=g+1|0;h=a[g]|0;}while(h<<24>>24!=0)}h=c[10030]|0;aI(175664,2,1,h|0);i=f;return}h=c[10030]|0;if((b|0)!=1){cf(h|0,177872,(v=i,i=i+8|0,c[v>>2]=e,v)|0);i=f;return}aI(175688,2,1,h|0);h=a[e]|0;if(h<<24>>24!=0){b=e;e=h;do{h=e&255;do{if(e<<24>>24<0){g=37640+(h-128<<2)|0;if((a[g]|0)==0){k=14998;break}l=c[10030]|0;aK(g|0,l|0)}else{k=14998}}while(0);if((k|0)==14998){k=0;d=c[10030]|0;aF(h|0,d|0)}b=b+1|0;e=a[b]|0;}while(e<<24>>24!=0)}aI(175664,2,1,c[10030]|0);i=f;return}function oW(a){a=a|0;var b=0;if((a|0)==(-90|0)|(a|0)==270){c[58832]=-1;b=c[10030]|0;aI(175768,8,1,b|0);return 1}b=(a|0)!=0;c[58832]=b&1;a=c[10030]|0;if(b){aI(175720,7,1,a|0);return 1}else{aI(175816,7,1,a|0);return 1}return 0}function oX(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0;b=i;c[58828]=6;a[235320]=0;d=c[13898]|0;e=c[8272]|0;L20300:do{if((d|0)<(e|0)){f=d;g=6;j=e;L20301:while(1){k=c[1054]|0;l=(a[k+(f*40&-1)|0]&1)==0;L20303:do{if(l){m=15032}else{n=c[k+(f*40&-1)+36>>2]|0;o=k+(f*40&-1)+32|0;p=c[10036]|0;q=0;while(1){if((q|0)>=(n|0)){m=15020;break}if((a[p+((c[o>>2]|0)+q|0)|0]|0)==(a[q+103664|0]|0)){q=q+1|0}else{break}}if((m|0)==15020){m=0;if((q|0)==1){r=g;break L20300}}if(l){m=15032;break}if((n|0)<=0){m=15044;break L20301}p=c[10036]|0;s=0;t=0;u=c[o>>2]|0;while(1){if((a[s+175248|0]|0)==(a[p+(s+u|0)|0]|0)){w=u;x=t}else{if((s|0)!=3){break}w=u-1|0;x=1}y=s+1|0;if((y|0)<(x+n|0)){s=y;t=x;u=w}else{m=15028;break}}do{if((m|0)==15028){m=0;if((x|0)==0){if(!((s|0)==2|(s|0)==5)){break}}a[235320]=1;z=g;A=f;B=j;break L20303}}while(0);if(l){m=15032}else{m=15043;break L20301}}}while(0);if((m|0)==15032){m=0;l=c[k+(f*40&-1)+8>>2]|0;if((l|0)==1){C=+(c[k+(f*40&-1)+16>>2]|0)}else if((l|0)==3){C=+uz(c[k+(f*40&-1)+16>>2]|0,0)}else if((l|0)==2){C=+h[k+(f*40&-1)+16>>3]}else{m=15036;break}l=~~C;c[58828]=l;if((l|0)<1){m=15039;break}z=l;A=c[13898]|0;B=c[8272]|0}l=A+1|0;c[13898]=l;if((l|0)<(B|0)){f=l;g=z;j=B}else{r=z;break L20300}}if((m|0)==15036){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((m|0)==15043){uf(f,175176,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((m|0)==15039){c[58828]=6;uf(c[13898]|0,175216,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((m|0)==15044){uf(f,175176,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}else{r=6}}while(0);m=a[235320]|0?175144:175024;be(13048,175160,(v=i,i=i+16|0,c[v>>2]=r,c[v+8>>2]=m,v)|0);i=b;return}function oY(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0.0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0.0,at=0.0,au=0.0,av=0,aw=0,ax=0,ay=0,az=0;b=i;d=c[13898]|0;e=c[8272]|0;L20341:do{if((d|0)<(e|0)){f=c[1054]|0;g=(a[f+(d*40&-1)|0]&1)==0;if(g){j=d;break}k=c[f+(d*40&-1)+36>>2]|0;l=f+(d*40&-1)+32|0;m=c[10036]|0;n=0;while(1){if((n|0)>=(k|0)){o=15050;break}if((a[m+((c[l>>2]|0)+n|0)|0]|0)==(a[n+103664|0]|0)){n=n+1|0}else{break}}if((o|0)==15050){if((n|0)==1){j=d;break}}if(!((k|0)>0&(g^1))){j=d;break}m=c[10036]|0;p=0;q=0;r=c[l>>2]|0;while(1){if((a[p+176888|0]|0)==(a[m+(p+r|0)|0]|0)){s=r;t=q}else{if((p|0)!=1){j=d;break L20341}s=r-1|0;t=1}u=p+1|0;if((u|0)<(t+k|0)){p=u;q=t;r=s}else{break}}if((t|0)==0){if(!((p|0)==0|(p|0)==4)){j=d;break}}r=d+1|0;c[13898]=r;if((r|0)>=(e|0)){uf(r,176848,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}q=(a[f+(r*40&-1)|0]&1)==0;k=c[f+(r*40&-1)+36>>2]|0;L20364:do{if(q){w=c[10036]|0;x=f+(r*40&-1)+32|0}else{m=f+(r*40&-1)+32|0;l=c[10036]|0;g=0;while(1){if((g|0)>=(k|0)){break}if((a[l+((c[m>>2]|0)+g|0)|0]|0)==(a[g+103664|0]|0)){g=g+1|0}else{w=l;x=m;break L20364}}if((g|0)!=1){w=l;x=m;break}uf(r,176848,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);f=(k|0)>0;p=c[58058]|0;L20373:do{if((p|0)==0){o=15075}else{if(q){o=15075;break}if(f){n=0;u=0;y=c[x>>2]|0;while(1){z=a[p+n|0]|0;if(z<<24>>24==(a[w+(n+y|0)|0]|0)){A=y;B=u}else{if(z<<24>>24!=36){o=15075;break L20373}A=y-1|0;B=1}C=n+1|0;if((C|0)<(B+k|0)){n=C;u=B;y=A}else{break}}if((B|0)==0){D=C}else{E=0;break}}else{D=0}y=a[p+D|0]|0;if((y<<24>>24|0)==36|(y<<24>>24|0)==0){E=0}else{o=15075}}}while(0);L20385:do{if((o|0)==15075){p=c[58063]|0;if((p|0)==0){uf(r,176848,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if(q){uf(r,176848,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}do{if(f){y=0;u=0;n=c[x>>2]|0;while(1){m=a[p+y|0]|0;if(m<<24>>24==(a[w+(y+n|0)|0]|0)){F=n;G=u}else{if(m<<24>>24!=36){o=15225;break}F=n-1|0;G=1}H=y+1|0;if((H|0)<(G+k|0)){y=H;u=G;n=F}else{o=15223;break}}if((o|0)==15225){uf(r,176848,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((o|0)==15223){if((G|0)==0){I=H;break}else{E=1;break L20385}}}else{I=0}}while(0);n=a[p+I|0]|0;if((n<<24>>24|0)==36|(n<<24>>24|0)==0){E=1;break}uf(r,176848,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);c[58068]=232232+(E*20&-1);r=d+2|0;c[13898]=r;j=r}else{j=d}}while(0);d=(j|0)<(e|0);L20407:do{if(d){e=c[1054]|0;E=(a[e+(j*40&-1)|0]&1)==0;L20409:do{if(!E){I=c[e+(j*40&-1)+36>>2]|0;H=e+(j*40&-1)+32|0;G=c[10036]|0;F=0;while(1){if((F|0)>=(I|0)){o=15084;break}if((a[G+((c[H>>2]|0)+F|0)|0]|0)==(a[F+103664|0]|0)){F=F+1|0}else{break}}if((o|0)==15084){if((F|0)==1){break}}if(!((I|0)>0&(E^1))){break}G=c[10036]|0;p=0;w=0;x=c[H>>2]|0;while(1){if((a[p+176824|0]|0)==(a[G+(p+x|0)|0]|0)){J=x;K=w}else{if((p|0)!=3){break L20409}J=x-1|0;K=1}D=p+1|0;if((D|0)<(K+I|0)){p=D;w=K;x=J}else{break}}if((K|0)==0){if(!((p|0)==2|(p|0)==8)){break}}c[(c[58068]|0)+12>>2]=52e3;c[(c[58068]|0)+16>>2]=33940;c[58070]=176808;c[13898]=(c[13898]|0)+1;break L20407}}while(0);if(!d){break}E=c[1054]|0;e=(a[E+(j*40&-1)|0]&1)==0;L20430:do{if(!e){x=c[E+(j*40&-1)+36>>2]|0;w=E+(j*40&-1)+32|0;I=c[10036]|0;G=0;while(1){if((G|0)>=(x|0)){o=15099;break}if((a[I+((c[w>>2]|0)+G|0)|0]|0)==(a[G+103664|0]|0)){G=G+1|0}else{break}}if((o|0)==15099){if((G|0)==1){break}}if(!((x|0)>0&(e^1))){break}I=c[10036]|0;p=0;H=0;F=c[w>>2]|0;while(1){if((a[p+176760|0]|0)==(a[I+(p+F|0)|0]|0)){L=F;M=H}else{if((p|0)!=5){break L20430}L=F-1|0;M=1}D=p+1|0;if((D|0)<(M+x|0)){p=D;H=M;F=L}else{break}}if((M|0)==0){if(!((p|0)==4|(p|0)==10)){break}}c[(c[58068]|0)+12>>2]=45333;c[(c[58068]|0)+16>>2]=33940;c[58070]=176704;c[13898]=(c[13898]|0)+1;break L20407}}while(0);if(!d){break}e=c[1054]|0;E=(a[e+(j*40&-1)|0]&1)==0;L20451:do{if(!E){F=c[e+(j*40&-1)+36>>2]|0;H=e+(j*40&-1)+32|0;x=c[10036]|0;I=0;while(1){if((I|0)>=(F|0)){o=15114;break}if((a[x+((c[H>>2]|0)+I|0)|0]|0)==(a[I+103664|0]|0)){I=I+1|0}else{break}}if((o|0)==15114){if((I|0)==1){break}}if(!((F|0)>0&(E^1))){break}x=c[10036]|0;p=0;w=0;G=c[H>>2]|0;while(1){if((a[p+176680|0]|0)==(a[x+(p+G|0)|0]|0)){N=G;O=w}else{if((p|0)!=3){break L20451}N=G-1|0;O=1}D=p+1|0;if((D|0)<(O+F|0)){p=D;w=O;G=N}else{break}}if((O|0)==0){if(!((p|0)==2|(p|0)==5)){break}}c[(c[58068]|0)+12>>2]=13e3;c[(c[58068]|0)+16>>2]=7440;c[58070]=176664;c[13898]=(c[13898]|0)+1;break L20407}}while(0);if(!d){break}E=c[1054]|0;e=(a[E+(j*40&-1)|0]&1)==0;if(e){break}G=c[E+(j*40&-1)+36>>2]|0;w=E+(j*40&-1)+32|0;E=c[10036]|0;F=0;while(1){if((F|0)>=(G|0)){o=15129;break}if((a[E+((c[w>>2]|0)+F|0)|0]|0)==(a[F+103664|0]|0)){F=F+1|0}else{break}}if((o|0)==15129){if((F|0)==1){break}}if(!((G|0)>0&(e^1))){break}E=c[10036]|0;x=0;H=0;I=c[w>>2]|0;while(1){if((a[x+176656|0]|0)==(a[E+(x+I|0)|0]|0)){P=I;Q=H}else{if((x|0)!=3){break L20407}P=I-1|0;Q=1}D=x+1|0;if((D|0)<(Q+G|0)){x=D;H=Q;I=P}else{break}}if((Q|0)==0){if(!((x|0)==2|(x|0)==6)){break}}c[(c[58068]|0)+12>>2]=1e4;c[(c[58068]|0)+16>>2]=7440;c[58070]=176648;c[13898]=(c[13898]|0)+1}}while(0);Q=c[58070]|0;be(13048,84616,(v=i,i=i+16|0,c[v>>2]=c[(c[58068]|0)+4>>2],c[v+8>>2]=Q,v)|0);Q=c[3524]|0;P=c[13898]|0;j=c[8272]|0;if((P|0)>=(j|0)){R=uA(13048)|0;S=R+13048|0;T=a[236376]|0;U=T?116408:116440;V=c[58868]|0;W=T?1:V;X=a[235336]|0;Y=X?131584:131504;Z=c[59090]|0;_=Z+4|0;$=c[_>>2]|0;aa=Z+12|0;ab=c[aa>>2]|0;ac=(ab|0)!=0;ad=ac?176184:176112;ae=Z+24|0;af=Z+16|0;ag=ac?ae:af;ah=+h[ag>>3];ai=a[28152]|0;aj=ai?176072:176024;ak=be(S|0,176232,(v=i,i=i+56|0,c[v>>2]=U,c[v+8>>2]=W,c[v+16>>2]=Y,c[v+24>>2]=$,c[v+32>>2]=ad,h[v+40>>3]=ah,c[v+48>>2]=aj,v)|0)|0;i=b;return}d=Q+16|0;O=Q+20|0;Q=P;P=j;L20494:while(1){j=c[1054]|0;N=(a[j+(Q*40&-1)|0]&1)==0;L20496:do{if(!N){M=c[j+(Q*40&-1)+36>>2]|0;L=j+(Q*40&-1)+32|0;K=c[10036]|0;J=0;while(1){if((J|0)>=(M|0)){break}if((a[K+((c[L>>2]|0)+J|0)|0]|0)==(a[J+103664|0]|0)){J=J+1|0}else{break L20496}}if((J|0)==1){o=15233;break L20494}}}while(0);x=c[58848]|0;L20503:do{if((x|0)==0){al=235392}else{L=c[j+(Q*40&-1)+36>>2]|0;K=c[j+(Q*40&-1)+32>>2]|0;M=(L|0)>0;p=c[10036]|0;I=235392;H=x;while(1){L20507:do{if(!N){if(M){G=0;E=0;w=K;while(1){e=a[H+G|0]|0;if(e<<24>>24==(a[p+(G+w|0)|0]|0)){am=w;an=E}else{if(e<<24>>24!=36){break L20507}am=w-1|0;an=1}ao=G+1|0;if((ao|0)<(an+L|0)){G=ao;E=an;w=am}else{break}}if((an|0)==0){ap=ao}else{al=I;break L20503}}else{ap=0}w=a[H+ap|0]|0;if((w<<24>>24|0)==36|(w<<24>>24|0)==0){al=I;break L20503}}}while(0);w=I+8|0;E=c[w>>2]|0;if((E|0)==0){al=w;break}else{I=w;H=E}}}}while(0);N=c[al+4>>2]|0;L20520:do{if((N|0)==2){a[235336]=0;x=Q+1|0;c[13898]=x;aq=x}else if((N|0)==5){ar=Q+1|0;c[13898]=ar;if((ar|0)>=(P|0)){o=15237;break L20494}L20524:do{if((a[j+(ar*40&-1)|0]&1)!=0){x=c[j+(ar*40&-1)+36>>2]|0;H=j+(ar*40&-1)+32|0;I=c[10036]|0;L=0;while(1){if((L|0)>=(x|0)){break}if((a[I+((c[H>>2]|0)+L|0)|0]|0)==(a[L+103664|0]|0)){L=L+1|0}else{break L20524}}if((L|0)==1){o=15236;break L20494}}}while(0);H=c[j+(ar*40&-1)+8>>2]|0;if((H|0)==2){as=+h[j+(ar*40&-1)+16>>3]}else if((H|0)==3){as=+uz(c[j+(ar*40&-1)+16>>2]|0,0)}else if((H|0)==1){as=+(c[j+(ar*40&-1)+16>>2]|0)}else{o=15205;break L20494}h[29422]=as;if(as<=0.0){o=15210;break L20494}h[29421]=as;H=~~(as*1016.0/72.0);c[d>>2]=H;c[O>>2]=(H<<1>>>0)/3>>>0;H=c[59090]|0;at=+h[29422];if((c[H+12>>2]|0)==0){h[H+16>>3]=216.0/(at*2.0)}else{h[H+24>>3]=at}H=(c[13898]|0)+1|0;c[13898]=H;aq=H}else if((N|0)==0){a[236376]=1;H=Q+1|0;c[13898]=H;aq=H}else if((N|0)==1){a[236376]=0;H=Q+1|0;c[13898]=H;if((H|0)>=(P|0)){aq=H;break}if((a[j+(H*40&-1)|0]&1)!=0){I=c[j+(H*40&-1)+36>>2]|0;x=j+(H*40&-1)+32|0;p=c[10036]|0;K=0;while(1){if((K|0)>=(I|0)){aq=H;break L20520}if((a[p+((c[x>>2]|0)+K|0)|0]|0)==(a[K+103664|0]|0)){K=K+1|0}else{aq=H;break L20520}}}K=c[j+(H*40&-1)+8>>2]|0;if((K|0)==2){au=+h[j+(H*40&-1)+16>>3]}else if((K|0)==1){au=+(c[j+(H*40&-1)+16>>2]|0)}else if((K|0)==3){au=+uz(c[j+(H*40&-1)+16>>2]|0,0)}else{o=15169;break L20494}K=~~au;c[58868]=K;if((K|0)<1){o=15171;break L20494}K=(c[13898]|0)+1|0;c[13898]=K;aq=K}else if((N|0)==7){K=Q+1|0;c[13898]=K;a[28152]=1;aq=K}else if((N|0)==8){K=Q+1|0;c[13898]=K;aq=K}else if((N|0)==3){a[235336]=1;K=Q+1|0;c[13898]=K;aq=K}else if((N|0)==4){av=Q+1|0;c[13898]=av;if((av|0)>=(P|0)){o=15232;break L20494}K=(a[j+(av*40&-1)|0]&1)==0;x=c[j+(av*40&-1)+36>>2]|0;p=j+(av*40&-1)+32|0;L20561:do{if(!K){I=c[10036]|0;M=0;while(1){if((M|0)>=(x|0)){break}if((a[I+((c[p>>2]|0)+M|0)|0]|0)==(a[M+103664|0]|0)){M=M+1|0}else{break L20561}}if((M|0)==1){o=15231;break L20494}}}while(0);H=(x|0)>0;I=c[10036]|0;L=0;L20568:while(1){J=c[235528+(L*48&-1)>>2]|0;L20570:do{if(!((J|0)==0|K)){if(H){E=0;w=0;G=c[p>>2]|0;while(1){e=a[J+E|0]|0;if(e<<24>>24==(a[I+(E+G|0)|0]|0)){aw=G;ax=w}else{if(e<<24>>24!=36){break L20570}aw=G-1|0;ax=1}ay=E+1|0;if((ay|0)<(ax+x|0)){E=ay;w=ax;G=aw}else{break}}if((ax|0)==0){az=ay}else{break L20568}}else{az=0}G=a[J+az|0]|0;if((G<<24>>24|0)==36|(G<<24>>24|0)==0){break L20568}}}while(0);J=L+1|0;if(J>>>0<17){L=J}else{o=15193;break L20494}}c[59090]=235528+(L*48&-1);c[59088]=L;c[59086]=L;x=Q+2|0;c[13898]=x;aq=x}else if((N|0)==6){x=Q+1|0;c[13898]=x;a[28152]=0;aq=x}else{aq=Q}}while(0);N=c[8272]|0;if((aq|0)<(N|0)){Q=aq;P=N}else{o=15235;break}}if((o|0)==15231){uf(av,176384,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((o|0)==15232){uf(av,176384,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((o|0)==15233){R=uA(13048)|0;S=R+13048|0;T=a[236376]|0;U=T?116408:116440;V=c[58868]|0;W=T?1:V;X=a[235336]|0;Y=X?131584:131504;Z=c[59090]|0;_=Z+4|0;$=c[_>>2]|0;aa=Z+12|0;ab=c[aa>>2]|0;ac=(ab|0)!=0;ad=ac?176184:176112;ae=Z+24|0;af=Z+16|0;ag=ac?ae:af;ah=+h[ag>>3];ai=a[28152]|0;aj=ai?176072:176024;ak=be(S|0,176232,(v=i,i=i+56|0,c[v>>2]=U,c[v+8>>2]=W,c[v+16>>2]=Y,c[v+24>>2]=$,c[v+32>>2]=ad,h[v+40>>3]=ah,c[v+48>>2]=aj,v)|0)|0;i=b;return}else if((o|0)==15193){uf(av,176384,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((o|0)==15235){R=uA(13048)|0;S=R+13048|0;T=a[236376]|0;U=T?116408:116440;V=c[58868]|0;W=T?1:V;X=a[235336]|0;Y=X?131584:131504;Z=c[59090]|0;_=Z+4|0;$=c[_>>2]|0;aa=Z+12|0;ab=c[aa>>2]|0;ac=(ab|0)!=0;ad=ac?176184:176112;ae=Z+24|0;af=Z+16|0;ag=ac?ae:af;ah=+h[ag>>3];ai=a[28152]|0;aj=ai?176072:176024;ak=be(S|0,176232,(v=i,i=i+56|0,c[v>>2]=U,c[v+8>>2]=W,c[v+16>>2]=Y,c[v+24>>2]=$,c[v+32>>2]=ad,h[v+40>>3]=ah,c[v+48>>2]=aj,v)|0)|0;i=b;return}else if((o|0)==15205){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((o|0)==15171){c[58868]=6;uf(c[13898]|0,176608,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((o|0)==15210){uf(c[13898]|0,176336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((o|0)==15169){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((o|0)==15236){uf(ar,176336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((o|0)==15237){uf(ar,176336,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}function oZ(){var a=0,b=0;a=i;b=c[3524]|0;cf(c[10030]|0,176968,(v=i,i=i+8|0,c[v>>2]=c[(c[58068]|0)+8>>2],v)|0);c[b+8>>2]=c[(c[58068]|0)+12>>2];c[b+12>>2]=c[(c[58068]|0)+16>>2];aI(177432,4,1,c[10030]|0);i=a;return}function o_(){aI(177008,7,1,c[10030]|0);return}function o$(){var b=0;if(a[235520]|0){b=c[10030]|0;aI(125976,2,1,b|0);a[235520]=0}aI(177024,10,1,c[10030]|0);return}function o0(){var b=0,d=0,e=0,f=0.0,g=0;b=i;aI(177432,4,1,c[10030]|0);d=c[59090]|0;e=c[d+12>>2]|0;cf(c[10030]|0,177408,(v=i,i=i+16|0,c[v>>2]=c[d+8>>2],c[v+8>>2]=e,v)|0);e=c[59090]|0;d=c[10030]|0;if((c[e+12>>2]|0)==0){f=+h[e+16>>3];cf(d|0,180656,(v=i,i=i+8|0,h[v>>3]=f,v)|0)}else{f=+h[e+24>>3];cf(d|0,180672,(v=i,i=i+8|0,h[v>>3]=f,v)|0)}d=c[59090]|0;e=c[d+36>>2]|0;g=c[d+40>>2]|0;cf(c[10030]|0,180632,(v=i,i=i+24|0,c[v>>2]=c[d+32>>2],c[v+8>>2]=e,c[v+16>>2]=g,v)|0);if(!(a[235336]|0)){c[58832]=0;a[235520]=0;a[235512]=1;c[58826]=1;i=b;return}aI(177112,255,1,c[10030]|0);c[58832]=0;a[235520]=0;a[235512]=1;c[58826]=1;i=b;return}function o1(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;if(a[235520]|0){e=b-(c[58822]|0)|0;f=d-(c[58820]|0)|0;g=c[10030]|0;aF(60,g|0);h=f;i=e}else{e=c[10030]|0;aI(177464,3,1,e|0);if(a[235512]|0){a[235512]=0;e=c[10030]|0;aF(61,e|0);j=d;k=b}else{j=d-(c[58820]|0)|0;k=b-(c[58822]|0)|0}a[235520]=1;h=j;i=k}k=i<<1;i=(k|0)<0?1-k|0:k;k=i&63;j=i>>6;if((j|0)>0){i=k;e=j;while(1){aF(i+63|0,c[10030]|0);j=e&63;f=e>>6;if((f|0)>0){i=j;e=f}else{l=j;break}}}else{l=k}aF((l<<24)-1090519040>>24|0,c[10030]|0);l=h<<1;h=(l|0)<0?1-l|0:l;l=h&63;k=h>>6;if((k|0)>0){m=l;n=k}else{o=l;p=o<<24;q=p-1090519040|0;r=q>>24;s=c[10030]|0;t=aF(r|0,s|0)|0;u=c[10030]|0;v=aF(10,u|0)|0;c[58822]=b;c[58820]=d;return}while(1){aF(m+63|0,c[10030]|0);l=n&63;k=n>>6;if((k|0)>0){m=l;n=k}else{o=l;break}}p=o<<24;q=p-1090519040|0;r=q>>24;s=c[10030]|0;t=aF(r|0,s|0)|0;u=c[10030]|0;v=aF(10,u|0)|0;c[58822]=b;c[58820]=d;return}function o2(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;if(a[235520]|0){e=d-(c[58820]|0)|0;f=b-(c[58822]|0)|0}else{g=c[10030]|0;aI(177472,2,1,g|0);if(a[235512]|0){a[235512]=0;g=c[10030]|0;aF(61,g|0);h=d;i=b}else{h=d-(c[58820]|0)|0;i=b-(c[58822]|0)|0}a[235520]=1;e=h;f=i}i=f<<1;f=(i|0)<0?1-i|0:i;i=f&63;h=f>>6;if((h|0)>0){f=i;g=h;while(1){aF(f+63|0,c[10030]|0);h=g&63;j=g>>6;if((j|0)>0){f=h;g=j}else{k=h;break}}}else{k=i}aF((k<<24)-1090519040>>24|0,c[10030]|0);k=e<<1;e=(k|0)<0?1-k|0:k;k=e&63;i=e>>6;if((i|0)>0){l=k;m=i}else{n=k;o=n<<24;p=o-1090519040|0;q=p>>24;r=c[10030]|0;s=aF(q|0,r|0)|0;t=c[10030]|0;u=aF(10,t|0)|0;c[58822]=b;c[58820]=d;return}while(1){aF(l+63|0,c[10030]|0);k=m&63;i=m>>6;if((i|0)>0){l=k;m=i}else{n=k;break}}o=n<<24;p=o-1090519040|0;q=p>>24;r=c[10030]|0;s=aF(q|0,r|0)|0;t=c[10030]|0;u=aF(10,t|0)|0;c[58822]=b;c[58820]=d;return}function o3(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;if(a[235520]|0){e=c[10030]|0;aI(125976,2,1,e|0);a[235520]=0}e=(b|0)>-1;if(a[236376]|0){if(e){if(a[235336]|0){c[59092]=(b&7)+1}f=(b>>>0)%24>>>0}else{f=b}if((f|0)==(c[58846]|0)){i=d;return}do{if((f|0)>-1){g=c[10030]|0;h=c[235344+(f>>>3<<2)>>2]|0;if(a[235336]|0){j=c[59092]|0;k=c[235480+((f&7)<<2)>>2]|0;cf(g|0,177704,(v=i,i=i+24|0,c[v>>2]=h,c[v+8>>2]=j,c[v+16>>2]=k,v)|0);break}else{cf(g|0,177696,(v=i,i=i+8|0,c[v>>2]=h,v)|0);break}}else{if((f|0)==(-2|0)){h=c[10030]|0;aI(177680,6,1,h|0);break}else if((f|0)==(-1|0)){aI(177664,11,1,c[10030]|0);break}else{break}}}while(0);c[58846]=f;i=d;return}else{if(e){if(a[235336]|0){c[59092]=(b&7)+1}l=((b+2|0)%(c[58868]|0)&-1)+1|0}else{l=b}if((l|0)==(c[58846]|0)){i=d;return}do{if((l|0)>-1){b=c[10030]|0;if(a[235336]|0){e=c[59092]|0;cf(b|0,177848,(v=i,i=i+16|0,c[v>>2]=l,c[v+8>>2]=e,v)|0);break}else{cf(b|0,177768,(v=i,i=i+8|0,c[v>>2]=l,v)|0);break}}else{if((l|0)==(-2|0)){b=c[10030]|0;aI(177744,15,1,b|0);break}else if((l|0)==(-1|0)){aI(177720,20,1,c[10030]|0);break}else{break}}}while(0);c[58826]=1;c[58846]=l;i=d;return}}function o4(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;g=(c[(c[3524]|0)+16>>2]|0)>>>2;if((c[58832]|0)==1){o1(g+b|0,d)}else{o1(b,d-g|0)}if(a[235520]|0){g=c[10030]|0;aI(125976,2,1,g|0);a[235520]=0}cf(c[10030]|0,177872,(v=i,i=i+8|0,c[v>>2]=e,v)|0);a[235512]=1;i=f;return}function o5(b){b=b|0;var d=0,e=0;if((b|0)==(-90|0)|(b|0)==270){d=-1}else{d=(b|0)!=0&1}c[58832]=d;if(a[235520]|0){b=c[10030]|0;aF(59,b|0);a[235520]=0;e=c[58832]|0}else{e=d}if((e|0)==1){d=c[10030]|0;aI(177968,5,1,d|0);return 1}d=c[10030]|0;if((e|0)==-1){aI(177960,6,1,d|0);return 1}else{aI(177912,5,1,d|0);return 1}return 0}function o6(b){b=b|0;var d=0,e=0;if(a[235520]|0){d=c[10030]|0;aI(125976,2,1,d|0);a[235520]=0}if((b|0)==2){d=c[10030]|0;aI(177984,3,1,d|0);e=1;return e|0}else if((b|0)==1){aI(177992,3,1,c[10030]|0);e=1;return e|0}else if((b|0)==0){aI(178e3,3,1,c[10030]|0);e=1;return e|0}else{e=0;return e|0}return 0}function o7(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0;f=i;g=(e|0)<0;if(!(a[28152]|0)){if(g){tH(b,d,e);i=f;return}j=~~(+h[29420]*106.0*.5);k=(e|0)%6&-1;if((k|0)==4){l=(j<<2|0)/3&-1;m=l+d|0;o1(b,m);n=d-((j<<1|0)/3&-1)|0;o2(b-l|0,n);o2(l+b|0,n);o2(b,m);o1(b,d);o2(b,d);i=f;return}else if((k|0)==5){m=b-j|0;o1(m,d);o2(m,d);n=j+b|0;o2(n,d);l=d-j|0;o1(b,l);o2(b,l);o=j+d|0;o2(b,o);o1(m,l);o2(m,l);o2(n,o);o1(m,o);o2(m,o);o2(n,l);i=f;return}else if((k|0)==2){l=b-j|0;n=d-j|0;o1(l,n);o2(l,n);o=j+b|0;o2(o,n);m=j+d|0;o2(o,m);o2(l,m);o2(l,n);o1(b,d);o2(b,d);i=f;return}else if((k|0)==3){n=b-j|0;l=d-j|0;o1(n,l);o2(n,l);m=j+b|0;o=j+d|0;o2(m,o);o1(n,o);o2(n,o);o2(m,l);i=f;return}else if((k|0)==0){l=b-j|0;o1(l,d);o2(b,d-j|0);o2(j+b|0,d);o2(b,j+d|0);o2(l,d);o1(b,d);o2(b,d);i=f;return}else if((k|0)==1){k=b-j|0;o1(k,d);o2(k,d);o2(j+b|0,d);k=d-j|0;o1(b,k);o2(b,k);o2(b,j+d|0);i=f;return}else{i=f;return}}if(g){tH(b,d,e);i=f;return}g=~~(+h[29420]*106.0*.5);j=(e|0)%75&-1;if((j|0)==52){e=(g|0)/2&-1;k=b-e|0;l=e+d|0;o1(k,l);o2(b-g|0,d);m=d-e|0;o2(k,m);o=c[10030]|0;aI(125976,2,1,o|0);a[235520]=0;o=c[10030]|0;aI(179152,5,1,o|0);o2(b,d);o=e+b|0;o2(o,m);o2(b,d-g|0);o2(k,m);e=c[10030]|0;aI(125976,2,1,e|0);a[235520]=0;e=c[10030]|0;aI(179120,11,1,e|0);o1(o,m);o2(g+b|0,d);o2(o,l);m=c[10030]|0;aI(125976,2,1,m|0);a[235520]=0;m=c[10030]|0;aI(179152,5,1,m|0);o2(b,g+d|0);o2(k,l);o2(b,d);o2(o,l);l=c[10030]|0;aI(125976,2,1,l|0);a[235520]=0;l=c[10030]|0;aI(179120,11,1,l|0);i=f;return}else if((j|0)==13){l=((g*3&-1|0)/4&-1)+d|0;o1(b,l);p=+(b>>>0>>>0);q=+(g|0);r=q*2.8531695488854605*.25;s=+(d>>>0>>>0);o=~~(s+q*.9270509831248421*.25);o2(~~(p-r),o);t=q*1.7633557568774194*.25;k=~~(s-q*2.4270509831248424*.25);o2(~~(p-t),k);o2(~~(p+t),k);o2(~~(p+r),o);o2(b,l);o1(b,d);o2(b,d);i=f;return}else if((j|0)==38){l=d-g|0;o1(b,l);o=g+b|0;o2(o,l);o2(o,d);o1(b-g|0,l);aI(125976,2,1,c[10030]|0);a[235520]=0;l=g+d|0;cf(c[10030]|0,178224,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=l,v)|0);o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178224,(v=i,i=i+16|0,c[v>>2]=o,c[v+8>>2]=l,v)|0);i=f;return}else if((j|0)==14){l=((g*3&-1|0)/4&-1)+d|0;o1(b,l);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179152,5,1,c[10030]|0);r=+(b>>>0>>>0);p=+(g|0);t=p*2.8531695488854605*.25;q=+(d>>>0>>>0);o=~~(q+p*.9270509831248421*.25);o2(~~(r-t),o);s=p*1.7633557568774194*.25;k=~~(q-p*2.4270509831248424*.25);o2(~~(r-s),k);o2(~~(r+s),k);o2(~~(r+t),o);o2(b,l);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179120,11,1,c[10030]|0);i=f;return}else if((j|0)==68){l=((g*3&-1|0)/4&-1)+d|0;o1(b,l);t=+(b>>>0>>>0);r=+(g|0);s=r*2.8531695488854605*.25;p=+(d>>>0>>>0);o=~~(p+r*.9270509831248421*.25);o2(~~(t-s),o);q=r*1.7633557568774194*.25;k=~~(p-r*2.4270509831248424*.25);o2(~~(t-q),k);o2(~~(t+q),k);o2(~~(t+s),o);o2(b,l);i=f;return}else if((j|0)==33){l=b-g|0;o1(l,d);o=d-g|0;o2(l,o);k=g+b|0;o2(k,o);o=g+d|0;o2(k,o);o2(b,o);o1(l,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178224,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=o,v)|0);i=f;return}else if((j|0)==46){o1(b-g|0,d-g|0);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178224,(v=i,i=i+16|0,c[v>>2]=g+b,c[v+8>>2]=g+d,v)|0);i=f;return}else if((j|0)==22){o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178624,(v=i,i=i+16|0,c[v>>2]=g,c[v+8>>2]=g,v)|0);i=f;return}else if((j|0)==34){o=b-g|0;o1(o,d);l=d-g|0;o2(o,l);k=g+b|0;o2(k,l);o2(k,d);o1(o,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178224,(v=i,i=i+16|0,c[v>>2]=k,c[v+8>>2]=g+d,v)|0);i=f;return}else if((j|0)==37){k=d-g|0;o1(b,k);o=g+b|0;o2(o,k);l=g+d|0;o2(o,l);o2(b,l);o1(b-g|0,k);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178224,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=l,v)|0);i=f;return}else if((j|0)==3){l=(g*3&-1|0)/4&-1;k=b-l|0;o=d-l|0;o1(k,o);m=l+b|0;o2(m,o);e=l+d|0;o2(m,e);o2(k,e);o2(k,o);o1(b,d);o2(b,d);i=f;return}else if((j|0)==5){o1(b,d);o2(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,179248,(v=i,i=i+8|0,h[v>>3]=+(g|0)*3.0*.25,v)|0);i=f;return}else if((j|0)==10){o=g*3&-1;k=d-((o|0)/4&-1)|0;o1(b,k);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179152,5,1,c[10030]|0);s=+(b>>>0>>>0);t=+(g|0)*5.196152422706632*.125;e=((o|0)/8&-1)+d|0;o2(~~(s-t),e);o2(~~(s+t),e);o2(b,k);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179120,11,1,c[10030]|0);i=f;return}else if((j|0)==58){k=(g|0)/2&-1;e=b-k|0;o=d-k|0;o1(e,o);o2(b,d-g|0);m=k+b|0;o2(m,o);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179152,5,1,c[10030]|0);o2(b,d);o2(e,o);o2(b-g|0,d);o2(b,g+d|0);o2(g+b|0,d);o2(m,o);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179120,11,1,c[10030]|0);i=f;return}else if((j|0)==51){o=(g|0)/2&-1;m=o+b|0;e=d-o|0;o1(m,e);o2(g+b|0,d);o2(b,g+d|0);o2(b-g|0,d);k=b-o|0;o2(k,e);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179152,5,1,c[10030]|0);o2(b,d);o2(m,e);o2(b,d-g|0);o2(k,e);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179120,11,1,c[10030]|0);i=f;return}else if((j|0)==36){e=d-g|0;o1(b,e);k=g+b|0;o2(k,e);o2(k,d);m=g+d|0;o1(b,m);o=b-g|0;o2(o,m);o2(o,d);o1(o,e);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178224,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=d,v)|0);o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178224,(v=i,i=i+16|0,c[v>>2]=k,c[v+8>>2]=m,v)|0);i=f;return}else if((j|0)==42){m=b-g|0;o1(m,d);k=d-g|0;o2(m,k);o2(b,k);aI(125976,2,1,c[10030]|0);a[235520]=0;k=g+d|0;cf(c[10030]|0,178224,(v=i,i=i+16|0,c[v>>2]=g+b,c[v+8>>2]=k,v)|0);o1(m,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178224,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=k,v)|0);i=f;return}else if((j|0)==67){k=(g*3&-1|0)/4&-1;m=b-k|0;o1(m,d);o2(b,d-k|0);o2(k+b|0,d);o2(b,k+d|0);o2(m,d);i=f;return}else if((j|0)==71){m=g*3&-1;k=((m|0)/4&-1)+d|0;o1(b,k);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179152,5,1,c[10030]|0);t=+(b>>>0>>>0);s=+(g|0)*5.196152422706632*.125;e=d-((m|0)/8&-1)|0;o2(~~(t-s),e);o2(~~(t+s),e);o2(b,k);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(178056,22,1,c[10030]|0);i=f;return}else if((j|0)==63){k=(g*3&-1|0)/4&-1;e=b-k|0;m=d-k|0;o1(e,m);o=k+b|0;o2(o,m);l=k+d|0;o2(o,l);o2(e,l);o2(e,m);i=f;return}else if((j|0)==27){o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178328,(v=i,i=i+16|0,c[v>>2]=g,c[v+8>>2]=g,v)|0);i=f;return}else if((j|0)==15){o1(b,g+d|0);o2(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,179104,(v=i,i=i+8|0,c[v>>2]=g,v)|0);i=f;return}else if((j|0)==60){m=(g|0)/2&-1;e=b-m|0;l=m+d|0;o1(e,l);o2(b-g|0,d);o=d-m|0;o2(e,o);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179152,5,1,c[10030]|0);o2(b,d-g|0);o2(g+b|0,d);o2(b,g+d|0);o2(e,l);o2(b,d);o2(e,o);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179120,11,1,c[10030]|0);i=f;return}else if((j|0)==29){o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178264,(v=i,i=i+16|0,c[v>>2]=g,c[v+8>>2]=g,v)|0);i=f;return}else if((j|0)==69){o1(b-g|0,d-g|0);aI(125976,2,1,c[10030]|0);a[235520]=0;o=(g*3&-1|0)/4&-1;cf(c[10030]|0,178192,(v=i,i=i+16|0,c[v>>2]=o+b,c[v+8>>2]=o+d,v)|0);i=f;return}else if((j|0)==59){o=(g|0)/2&-1;e=o+b|0;l=o+d|0;o1(e,l);o2(b,g+d|0);o2(b-g|0,d);m=b-o|0;k=d-o|0;o2(m,k);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179152,5,1,c[10030]|0);o2(e,l);o2(g+b|0,d);o2(b,d-g|0);o2(m,k);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179120,11,1,c[10030]|0);i=f;return}else if((j|0)==31){k=b-g|0;m=d-g|0;o1(k,m);l=g+b|0;o2(l,m);e=g+d|0;o2(l,e);o2(k,e);o2(k,m);o1(b,e);o2(b,d);i=f;return}else if((j|0)==0){e=b-g|0;o1(e,d);o2(e,d);o2(g+b|0,d);e=d-g|0;o1(b,e);o2(b,e);o2(b,g+d|0);i=f;return}else if((j|0)==9){e=g*3&-1;m=d-((e|0)/4&-1)|0;o1(b,m);s=+(b>>>0>>>0);t=+(g|0)*5.196152422706632*.125;k=((e|0)/8&-1)+d|0;o2(~~(s-t),k);o2(~~(s+t),k);o2(b,m);o1(b,d);o2(b,d);i=f;return}else if((j|0)==61){m=(g|0)/2&-1;k=m+b|0;e=m+d|0;o1(k,e);o2(b,g+d|0);l=b-m|0;o2(l,e);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179152,5,1,c[10030]|0);o2(b-g|0,d);o2(b,d-g|0);o2(g+b|0,d);o2(k,e);o2(b,d);o2(l,e);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179120,11,1,c[10030]|0);i=f;return}else if((j|0)==48){e=(g|0)/2&-1;l=b-e|0;k=e+d|0;o1(l,k);o2(b-g|0,d);o2(b,d-g|0);o2(g+b|0,d);m=e+b|0;o2(m,k);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179152,5,1,c[10030]|0);o2(b,g+d|0);o2(l,k);o2(b,d);o2(m,k);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179120,11,1,c[10030]|0);i=f;return}else if((j|0)==16){o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,179008,(v=i,i=i+16|0,c[v>>2]=g,c[v+8>>2]=g,v)|0);i=f;return}else if((j|0)==1){k=b-g|0;m=d-g|0;o1(k,m);o2(k,m);l=g+b|0;e=g+d|0;o2(l,e);o1(k,e);o2(k,e);o2(l,m);i=f;return}else if((j|0)==55){m=(g|0)/2&-1;l=m+b|0;e=m+d|0;o1(l,e);o2(b,g+d|0);o2(b-g|0,d);o2(b,d-g|0);k=d-m|0;o2(l,k);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179152,5,1,c[10030]|0);o2(b,d);o2(l,e);o2(g+b|0,d);o2(l,k);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179120,11,1,c[10030]|0);i=f;return}else if((j|0)==7){k=g*3&-1;l=((k|0)/4&-1)+d|0;o1(b,l);t=+(b>>>0>>>0);s=+(g|0)*5.196152422706632*.125;e=d-((k|0)/8&-1)|0;o2(~~(t-s),e);o2(~~(t+s),e);o2(b,l);o1(b,d);o2(b,d);i=f;return}else if((j|0)==39){l=g+b|0;o1(l,d);e=g+d|0;o2(l,e);k=b-g|0;o2(k,e);e=d-g|0;o2(k,e);o2(b,e);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178224,(v=i,i=i+16|0,c[v>>2]=l,c[v+8>>2]=d,v)|0);i=f;return}else if((j|0)==28){o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178296,(v=i,i=i+16|0,c[v>>2]=g,c[v+8>>2]=g,v)|0);i=f;return}else if((j|0)==20){o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178752,(v=i,i=i+32|0,c[v>>2]=g,c[v+8>>2]=g,c[v+16>>2]=g,c[v+24>>2]=g,v)|0);i=f;return}else if((j|0)==64){o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,179248,(v=i,i=i+8|0,h[v>>3]=+(g|0)*3.0*.25,v)|0);i=f;return}else if((j|0)==65){l=g*3&-1;e=((l|0)/4&-1)+d|0;o1(b,e);s=+(b>>>0>>>0);t=+(g|0)*5.196152422706632*.125;k=d-((l|0)/8&-1)|0;o2(~~(s-t),k);o2(~~(s+t),k);o2(b,e);i=f;return}else if((j|0)==66){e=g*3&-1;k=d-((e|0)/4&-1)|0;o1(b,k);t=+(b>>>0>>>0);s=+(g|0)*5.196152422706632*.125;l=((e|0)/8&-1)+d|0;o2(~~(t-s),l);o2(~~(t+s),l);o2(b,k);i=f;return}else if((j|0)==62){k=b-g|0;o1(k,d);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179152,5,1,c[10030]|0);o2(b,d-g|0);o2(g+b|0,d);o2(b,g+d|0);o2(k,d);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179120,11,1,c[10030]|0);i=f;return}else if((j|0)==8){k=g*3&-1;l=((k|0)/4&-1)+d|0;o1(b,l);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179152,5,1,c[10030]|0);s=+(b>>>0>>>0);t=+(g|0)*5.196152422706632*.125;e=d-((k|0)/8&-1)|0;o2(~~(s-t),e);o2(~~(s+t),e);o2(b,l);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179120,11,1,c[10030]|0);i=f;return}else if((j|0)==11){l=(g*3&-1|0)/4&-1;e=b-l|0;o1(e,d);o2(b,d-l|0);o2(l+b|0,d);o2(b,l+d|0);o2(e,d);o1(b,d);o2(b,d);i=f;return}else if((j|0)==70){o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178096,(v=i,i=i+8|0,h[v>>3]=+(g|0)*3.0*.25,v)|0);i=f;return}else if((j|0)==21){o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178720,(v=i,i=i+16|0,c[v>>2]=g,c[v+8>>2]=g,v)|0);i=f;return}else if((j|0)==44){e=g+d|0;o1(b,e);l=b-g|0;o2(l,e);o2(l,d);o1(l,d-g|0);aI(125976,2,1,c[10030]|0);a[235520]=0;l=g+b|0;cf(c[10030]|0,178224,(v=i,i=i+16|0,c[v>>2]=l,c[v+8>>2]=d,v)|0);o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178224,(v=i,i=i+16|0,c[v>>2]=l,c[v+8>>2]=e,v)|0);i=f;return}else if((j|0)==45){e=g+b|0;o1(e,d);l=g+d|0;o2(e,l);o2(b,l);k=b-g|0;o1(k,d-g|0);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178224,(v=i,i=i+16|0,c[v>>2]=e,c[v+8>>2]=d,v)|0);o1(k,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178224,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=l,v)|0);i=f;return}else if((j|0)==43){l=g+b|0;o1(l,d);k=g+d|0;o2(l,k);e=b-g|0;o2(e,k);o2(e,d);o1(e,d-g|0);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178224,(v=i,i=i+16|0,c[v>>2]=l,c[v+8>>2]=d,v)|0);i=f;return}else if((j|0)==53){l=(g|0)/2&-1;e=l+b|0;k=d-l|0;o1(e,k);o2(g+b|0,d);o2(b,g+d|0);m=b-l|0;o=l+d|0;o2(m,o);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179152,5,1,c[10030]|0);o2(b-g|0,d);o2(b,d-g|0);o2(e,k);o2(m,o);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179120,11,1,c[10030]|0);i=f;return}else if((j|0)==56){o=(g|0)/2&-1;m=b-o|0;k=o+d|0;o1(m,k);o2(b-g|0,d);o2(b,d-g|0);e=o+b|0;l=d-o|0;o2(e,l);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179152,5,1,c[10030]|0);o2(m,k);o2(b,g+d|0);o2(g+b|0,d);o2(e,l);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179120,11,1,c[10030]|0);i=f;return}else if((j|0)==18){o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178904,(v=i,i=i+16|0,c[v>>2]=g,c[v+8>>2]=g,v)|0);i=f;return}else if((j|0)==73){l=(g*3&-1|0)/4&-1;e=b-l|0;o1(e,d);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179152,5,1,c[10030]|0);o2(b,d-l|0);o2(l+b|0,d);o2(b,l+d|0);o2(e,d);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(178056,22,1,c[10030]|0);i=f;return}else if((j|0)==50){e=(g|0)/2&-1;l=b-e|0;k=d-e|0;o1(l,k);o2(b,d-g|0);o2(g+b|0,d);m=e+b|0;o=e+d|0;o2(m,o);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179152,5,1,c[10030]|0);o2(l,k);o2(b-g|0,d);o2(b,g+d|0);o2(m,o);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179120,11,1,c[10030]|0);i=f;return}else if((j|0)==2){o=b-g|0;o1(o,d);o2(o,d);m=g+b|0;o2(m,d);k=d-g|0;o1(b,k);o2(b,k);l=g+d|0;o2(b,l);o1(o,k);o2(o,k);o2(m,l);o1(o,l);o2(o,l);o2(m,k);i=f;return}else if((j|0)==12){k=(g*3&-1|0)/4&-1;m=b-k|0;o1(m,d);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179152,5,1,c[10030]|0);o2(b,d-k|0);o2(k+b|0,d);o2(b,k+d|0);o2(m,d);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179120,11,1,c[10030]|0);i=f;return}else if((j|0)==17){o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178960,(v=i,i=i+16|0,c[v>>2]=g,c[v+8>>2]=g,v)|0);i=f;return}else if((j|0)==4){m=(g*3&-1|0)/4&-1;o1(b-m|0,d-m|0);aI(125976,2,1,c[10030]|0);a[235520]=0;t=+(m|0);cf(c[10030]|0,179264,(v=i,i=i+16|0,h[v>>3]=+(b>>>0>>>0)+t,h[v+8>>3]=+(d>>>0>>>0)+t,v)|0);i=f;return}else if((j|0)==72){m=g*3&-1;k=d-((m|0)/4&-1)|0;o1(b,k);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179152,5,1,c[10030]|0);t=+(b>>>0>>>0);s=+(g|0)*5.196152422706632*.125;l=((m|0)/8&-1)+d|0;o2(~~(t-s),l);o2(~~(t+s),l);o2(b,k);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(178056,22,1,c[10030]|0);i=f;return}else if((j|0)==35){k=d-g|0;o1(b,k);l=g+b|0;o2(l,k);m=g+d|0;o2(l,m);l=b-g|0;o2(l,m);o2(l,d);o1(l,k);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178224,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=d,v)|0);i=f;return}else if((j|0)==32){k=g+d|0;o1(b,k);l=b-g|0;o2(l,k);m=d-g|0;o2(l,m);l=g+b|0;o2(l,m);o2(l,d);o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178224,(v=i,i=i+16|0,c[v>>2]=l,c[v+8>>2]=k,v)|0);i=f;return}else if((j|0)==47){k=b-g|0;o1(k,d);o2(b,d-g|0);o2(g+b|0,d);o2(b,g+d|0);o2(k,d);k=(g|0)/2&-1;o1(b-k|0,k+d|0);o2(b,d);i=f;return}else if((j|0)==40){k=g+d|0;o1(b,k);l=b-g|0;o2(l,k);m=d-g|0;o2(l,m);o2(b,m);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178224,(v=i,i=i+16|0,c[v>>2]=g+b,c[v+8>>2]=k,v)|0);i=f;return}else if((j|0)==24){o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178496,(v=i,i=i+16|0,c[v>>2]=g,c[v+8>>2]=g,v)|0);i=f;return}else if((j|0)==6){o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,179192,(v=i,i=i+8|0,h[v>>3]=+(g|0)*3.0*.25,v)|0);i=f;return}else if((j|0)==41){k=b-g|0;o1(k,d);m=d-g|0;o2(k,m);o2(b,m);l=g+b|0;o1(l,d);o=g+d|0;o2(l,o);o2(b,o);o1(k,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178224,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=o,v)|0);o1(b,m);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178224,(v=i,i=i+16|0,c[v>>2]=l,c[v+8>>2]=d,v)|0);i=f;return}else if((j|0)==25){o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178392,(v=i,i=i+32|0,c[v>>2]=g,c[v+8>>2]=g,c[v+16>>2]=g,c[v+24>>2]=g,v)|0);i=f;return}else if((j|0)==19){o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178872,(v=i,i=i+16|0,c[v>>2]=g,c[v+8>>2]=g,v)|0);i=f;return}else if((j|0)==23){o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178536,(v=i,i=i+16|0,c[v>>2]=g,c[v+8>>2]=g,v)|0);i=f;return}else if((j|0)==26){o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178360,(v=i,i=i+16|0,c[v>>2]=g,c[v+8>>2]=g,v)|0);i=f;return}else if((j|0)==30){o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,178240,(v=i,i=i+8|0,c[v>>2]=g,v)|0);i=f;return}else if((j|0)==49){l=(g|0)/2&-1;m=b-l|0;o=d-l|0;o1(m,o);o2(b,d-g|0);o2(g+b|0,d);o2(b,g+d|0);k=l+d|0;o2(m,k);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179152,5,1,c[10030]|0);o2(b-g|0,d);o2(m,o);o2(b,d);o2(m,k);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179120,11,1,c[10030]|0);i=f;return}else if((j|0)==74){k=((g*3&-1|0)/4&-1)+d|0;o1(b,k);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179152,5,1,c[10030]|0);s=+(b>>>0>>>0);t=+(g|0);q=t*2.8531695488854605*.25;r=+(d>>>0>>>0);m=~~(r+t*.9270509831248421*.25);o2(~~(s-q),m);p=t*1.7633557568774194*.25;o=~~(r-t*2.4270509831248424*.25);o2(~~(s-p),o);o2(~~(s+p),o);o2(~~(s+q),m);o2(b,k);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(178056,22,1,c[10030]|0);i=f;return}else if((j|0)==57){k=(g|0)/2&-1;m=k+b|0;o=k+d|0;o1(m,o);o2(b,g+d|0);l=b-k|0;o2(l,o);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179152,5,1,c[10030]|0);o2(b,d);e=d-k|0;o2(l,e);o2(b-g|0,d);o2(l,o);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179120,11,1,c[10030]|0);o1(l,e);o2(b,d-g|0);o2(m,e);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179152,5,1,c[10030]|0);o2(b,d);o2(m,o);o2(g+b|0,d);o2(m,e);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179120,11,1,c[10030]|0);i=f;return}else if((j|0)==54){j=(g|0)/2&-1;e=j+b|0;m=d-j|0;o1(e,m);o2(g+b|0,d);o=j+d|0;o2(e,o);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179152,5,1,c[10030]|0);o2(b,g+d|0);o2(b-g|0,d);o2(b,d-g|0);o2(e,m);o2(b,d);o2(e,o);aI(125976,2,1,c[10030]|0);a[235520]=0;aI(179120,11,1,c[10030]|0);i=f;return}else{i=f;return}}function o8(a){a=+a;h[29420]=a>=0.0?a:1.0;return}function o9(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0.0,n=0,o=0.0;d=i;i=i+64|0;e=d|0;f=d+56|0;g=c[3524]|0;if(a[235520]|0){j=c[10030]|0;aI(125976,2,1,j|0);a[235520]=0}j=bk(b|0,148464)|0;k=e|0;uF(k|0,b|0,j|0);a[e+j|0]=0;e=0;while(1){if(e>>>0>=17){break}l=c[235528+(e*48&-1)>>2]|0;if((a_(k|0,l|0,bk(l|0,180784)|0)|0)==0){break}else{e=e+1|0}}k=e>>>0>16?c[59088]|0:e;c[f>>2]=0;ca(b+(j+1|0)|0,21e4,(v=i,i=i+8|0,c[v>>2]=f,v)|0);j=c[f>>2]|0;if((j|0)>0){m=+(j|0)}else{m=+h[29422]}if(m==+h[29421]&(k|0)==(c[59086]|0)){n=0;i=d;return n|0}c[59090]=235528+(k*48&-1);c[59086]=k;h[29421]=m;k=~~(m*1016.0/72.0);c[g+16>>2]=k;c[g+20>>2]=(k<<1>>>0)/3>>>0;k=c[59090]|0;g=c[k+12>>2]|0;cf(c[10030]|0,180696,(v=i,i=i+16|0,c[v>>2]=c[k+8>>2],c[v+8>>2]=g,v)|0);g=c[59090]|0;m=+h[29421];if((c[g+12>>2]|0)==0){o=216.0/(m*2.0);h[g+16>>3]=o;k=c[10030]|0;cf(k|0,180656,(v=i,i=i+8|0,h[v>>3]=o,v)|0)}else{h[g+24>>3]=m;g=c[10030]|0;cf(g|0,180672,(v=i,i=i+8|0,h[v>>3]=m,v)|0)}g=c[59090]|0;k=c[g+36>>2]|0;j=c[g+40>>2]|0;cf(c[10030]|0,180632,(v=i,i=i+24|0,c[v>>2]=c[g+32>>2],c[v+8>>2]=k,c[v+16>>2]=j,v)|0);n=1;i=d;return n|0}function pa(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0.0,N=0,O=0,P=0.0,Q=0.0;b=i;i=i+24|0;d=b|0;e=c[13898]|0;f=c[8272]|0;if((e|0)<(f|0)){g=e;j=f}else{k=c[58772]|0;l=a[234984]|0;m=l?78720:78704;n=c[58574]|0;o=c[58572]|0;p=be(13048,180808,(v=i,i=i+32|0,c[v>>2]=k,c[v+8>>2]=m,c[v+16>>2]=n,c[v+24>>2]=o,v)|0)|0;i=b;return}L20934:while(1){f=c[1054]|0;e=(a[f+(g*40&-1)|0]&1)==0;L20936:do{if(!e){q=c[f+(g*40&-1)+36>>2]|0;r=f+(g*40&-1)+32|0;s=c[10036]|0;t=0;while(1){if((t|0)>=(q|0)){break}if((a[s+((c[r>>2]|0)+t|0)|0]|0)==(a[t+103664|0]|0)){t=t+1|0}else{break L20936}}if((t|0)==1){u=15625;break L20934}}}while(0);r=c[58760]|0;L20943:do{if((r|0)==0){w=235040}else{s=c[f+(g*40&-1)+36>>2]|0;q=c[f+(g*40&-1)+32>>2]|0;x=(s|0)>0;y=c[10036]|0;z=235040;A=r;while(1){L20947:do{if(!e){if(x){B=0;C=0;D=q;while(1){E=a[A+B|0]|0;if(E<<24>>24==(a[y+(B+D|0)|0]|0)){F=D;G=C}else{if(E<<24>>24!=36){break L20947}F=D-1|0;G=1}H=B+1|0;if((H|0)<(G+s|0)){B=H;C=G;D=F}else{break}}if((G|0)==0){I=H}else{w=z;break L20943}}else{I=0}D=a[A+I|0]|0;if((D<<24>>24|0)==36|(D<<24>>24|0)==0){w=z;break L20943}}}while(0);D=z+8|0;C=c[D>>2]|0;if((C|0)==0){w=D;break}else{z=D;A=C}}}}while(0);r=c[w+4>>2]|0;L20960:do{if((r|0)==0){a[234984]=1;a[235e3]=1;a[234992]=1;a[235272]=1;a[235264]=1;c[13898]=g+1}else if((r|0)==1){a[234984]=0;c[13898]=g+1}else{L20963:do{if(!((j|0)<=(g|0)|e)){A=c[f+(g*40&-1)+36>>2]|0;z=f+(g*40&-1)+32|0;s=c[10036]|0;y=0;while(1){if((y|0)>=(A|0)){break}if((a[s+((c[z>>2]|0)+y|0)|0]|0)==(a[y+78280|0]|0)){y=y+1|0}else{break L20963}}if((y|0)!=1){break}J=g+1|0;c[13898]=J;z=(j|0)>(J|0);if(!z){u=15629;break L20934}if((a[f+(J*40&-1)|0]&1)!=0){A=c[f+(J*40&-1)+36>>2]|0;q=f+(J*40&-1)+32|0;x=0;while(1){if((x|0)>=(A|0)){u=15562;break}if((a[s+((c[q>>2]|0)+x|0)|0]|0)==(a[x+78864|0]|0)){x=x+1|0}else{break}}do{if((u|0)==15562){u=0;if((x|0)!=1){break}if((c[58576]|0)!=0){tG()}q=c[10030]|0;aF(219,q|0);c[13898]=(c[13898]|0)+1;break L20960}}while(0);if(!z){u=15627;break L20934}}x=(a[f+(J*40&-1)|0]&1)==0;L20984:do{if(x){u=15578}else{q=c[f+(J*40&-1)+36>>2]|0;A=f+(J*40&-1)+32|0;y=0;while(1){if((y|0)>=(q|0)){u=15571;break}if((a[s+((c[A>>2]|0)+y|0)|0]|0)==(a[y+103664|0]|0)){y=y+1|0}else{break}}if((u|0)==15571){u=0;if((y|0)==1){u=15628;break L20934}}if(x){u=15578;break}A=c[f+(J*40&-1)+36>>2]|0;q=f+(J*40&-1)+32|0;t=0;while(1){if((t|0)>=(A|0)){break}if((a[s+((c[q>>2]|0)+t|0)|0]|0)==(a[t+148464|0]|0)){t=t+1|0}else{u=15578;break L20984}}if((t|0)==1){K=J;L=j}else{u=15578}}}while(0);if((u|0)==15578){u=0;s=is(d)|0;x=c[s>>2]|0;if((x|0)==2){M=+h[s+8>>3]}else if((x|0)==1){M=+(c[s+8>>2]|0)}else if((x|0)==3){M=+uz(c[s+8>>2]|0,0)}else{u=15582;break L20934}c[58574]=~~M;K=c[13898]|0;L=c[8272]|0}if((L|0)<=(K|0)){u=15631;break L20934}s=c[1054]|0;if((a[s+(K*40&-1)|0]&1)==0){u=15632;break L20934}x=c[s+(K*40&-1)+36>>2]|0;z=s+(K*40&-1)+32|0;q=c[10036]|0;A=0;while(1){if((A|0)>=(x|0)){break}if((a[q+((c[z>>2]|0)+A|0)|0]|0)==(a[A+148464|0]|0)){A=A+1|0}else{u=15633;break L20934}}if((A|0)!=1){u=15630;break L20934}z=K+1|0;c[13898]=z;L21012:do{if((L|0)>(z|0)){if((a[s+(z*40&-1)|0]&1)==0){u=15597;break}x=c[s+(z*40&-1)+36>>2]|0;y=s+(z*40&-1)+32|0;C=0;while(1){if((C|0)>=(x|0)){break}if((a[q+((c[y>>2]|0)+C|0)|0]|0)==(a[C+78864|0]|0)){C=C+1|0}else{u=15597;break L21012}}if((C|0)==1){N=z;O=L}else{u=15597}}else{u=15597}}while(0);if((u|0)==15597){u=0;z=is(d)|0;q=c[z>>2]|0;if((q|0)==3){P=+uz(c[z+8>>2]|0,0)}else if((q|0)==2){P=+h[z+8>>3]}else if((q|0)==1){P=+(c[z+8>>2]|0)}else{u=15601;break L20934}c[58572]=~~P;N=c[13898]|0;O=c[8272]|0}if((O|0)<=(N|0)){u=15621;break L20934}z=c[1054]|0;if((a[z+(N*40&-1)|0]&1)==0){u=15623;break L20934}q=c[z+(N*40&-1)+36>>2]|0;s=z+(N*40&-1)+32|0;z=c[10036]|0;A=0;while(1){if((A|0)>=(q|0)){break}if((a[z+((c[s>>2]|0)+A|0)|0]|0)==(a[A+78864|0]|0)){A=A+1|0}else{u=15622;break L20934}}if((A|0)!=1){u=15620;break L20934}c[13898]=N+1;break L20960}}while(0);s=is(d)|0;z=c[s>>2]|0;if((z|0)==2){Q=+h[s+8>>3]}else if((z|0)==3){Q=+uz(c[s+8>>2]|0,0)}else if((z|0)==1){Q=+(c[s+8>>2]|0)}else{u=15616;break L20934}s=~~Q;z=(s|0)<8?8:s;c[58772]=z;if((z|0)<=15){break}c[58772]=15}}while(0);f=c[13898]|0;e=c[8272]|0;if((f|0)<(e|0)){g=f;j=e}else{u=15624;break}}if((u|0)==15633){uf(K,78920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==15632){uf(K,78920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==15625){k=c[58772]|0;l=a[234984]|0;m=l?78720:78704;n=c[58574]|0;o=c[58572]|0;p=be(13048,180808,(v=i,i=i+32|0,c[v>>2]=k,c[v+8>>2]=m,c[v+16>>2]=n,c[v+24>>2]=o,v)|0)|0;i=b;return}else if((u|0)==15627){uf(J,78976,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==15628){uf(J,78976,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==15582){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==15621){uf(N,78824,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==15622){uf(N,78824,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==15601){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==15623){uf(N,78824,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==15624){k=c[58772]|0;l=a[234984]|0;m=l?78720:78704;n=c[58574]|0;o=c[58572]|0;p=be(13048,180808,(v=i,i=i+32|0,c[v>>2]=k,c[v+8>>2]=m,c[v+16>>2]=n,c[v+24>>2]=o,v)|0)|0;i=b;return}else if((u|0)==15629){uf(J,78976,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==15630){uf(K,78920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==15616){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==15631){uf(K,78920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((u|0)==15620){uf(N,78824,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}function pb(){return}function pc(){var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,x=0;d=i;i=i+24|0;e=d|0;f=c[3524]|0;g=a[235272]|0?2340:3300;c[58758]=((a[234992]|0?2490:3480)-g|0)/2&-1;h=a[235264]|0?3300:2340;c[58756]=((a[235e3]|0?3480:2490)-h|0)/2&-1;j=(g|0)/(c[58574]|0)&-1;c[58742]=j;c[58738]=j;g=(h|0)/(c[58572]|0)&-1;c[58740]=g;c[58736]=g;c[f+8>>2]=j;c[f+12>>2]=c[58736];aI(180888,37,1,c[10030]|0);if(a[234984]|0){f=c[10030]|0;aF(137,f|0);f=c[10030]|0;aF(13,f|0);f=c[10030]|0;aF(3520,f|0)}aF(205,c[10030]|0);f=a[234984]|0;aF((f?120:24)|(f?0:5)|0,c[10030]|0);f=32;do{b[234432+(f<<1)>>1]=f&65535;f=f+1|0;}while((f|0)<127);b[117217]=225;b[117218]=233;b[117219]=-3800;b[117220]=241;b[117221]=249;b[117222]=-3672;b[117223]=162;b[117224]=163;b[117225]=164;b[117226]=165;b[117227]=167;b[117228]=171;b[117229]=182;b[117230]=-4190;b[117231]=191;b[117232]=187;b[117233]=188;b[117234]=189;b[117235]=190;b[117236]=210;b[117237]=211;b[117238]=251;b[117239]=-4304;b[117240]=212;b[117241]=137;b[117242]=176;b[117243]=161;b[117244]=139;b[117245]=133;b[117246]=140;b[117247]=-4287;b[117248]=8738;b[117250]=186;b[117252]=164;b[117255]=185;b[117343]=-4250;f=32;do{a[f+234688|0]=f&255;f=f+1|0;}while((f|0)<128);uE(234816,-128|0,126);a[234849]=27;a[234850]=7;a[234851]=8;a[234852]=120;a[234853]=10;a[234854]=124;a[234855]=11;a[234856]=25;a[234857]=21;a[234858]=45;a[234859]=12;a[234860]=83;a[234861]=45;a[234862]=20;a[234863]=126;a[234864]=26;a[234865]=12;a[234866]=1;a[234867]=2;a[234868]=29;a[234869]=52;a[234870]=13;a[234871]=5;a[234872]=28;a[234873]=3;a[234874]=45;a[234875]=16;a[234876]=17;a[234877]=18;a[234878]=19;a[234879]=15;uE(234880,65,5);a[234885]=3;a[234886]=1;a[234887]=67;w=1162167621;a[234888]=w&255;w=w>>8;a[234889|0]=w&255;w=w>>8;a[234890|0]=w&255;w=w>>8;a[234891|0]=w&255;w=1229539657;a[234892]=w&255;w=w>>8;a[234893|0]=w&255;w=w>>8;a[234894|0]=w&255;w=w>>8;a[234895|0]=w&255;a[234896]=68;a[234897]=78;uE(234898,79,5);a[234903]=13;a[234904]=2;w=1431655765;a[234905]=w&255;w=w>>8;a[234906|0]=w&255;w=w>>8;a[234907|0]=w&255;w=w>>8;a[234908|0]=w&255;a[234909]=89;a[234910]=32;a[234911]=22;uE(234912,97,5);a[234917]=6;a[234918]=4;a[234919]=99;w=1701143909;a[234920]=w&255;w=w>>8;a[234921|0]=w&255;w=w>>8;a[234922|0]=w&255;w=w>>8;a[234923|0]=w&255;w=1768515945;a[234924]=w&255;w=w>>8;a[234925|0]=w&255;w=w>>8;a[234926|0]=w&255;w=w>>8;a[234927|0]=w&255;a[234928]=100;a[234929]=110;uE(234930,111,5);a[234935]=10;a[234936]=5;w=1970632053;a[234937]=w&255;w=w>>8;a[234938|0]=w&255;w=w>>8;a[234939|0]=w&255;w=w>>8;a[234940|0]=w&255;a[234941]=121;a[234942]=32;a[234943]=121;f=0;j=0;do{j=((b[234432+(f<<1)>>1]|0)!=0&1)+j|0;f=f+1|0;}while((f|0)<127);aF(222,c[10030]|0);aF(1,c[10030]|0);aF(j&255|0,c[10030]|0);j=0;do{f=b[234432+(j<<1)>>1]|0;if(f<<16>>16!=0){g=(f&65535)>>>8;h=c[10030]|0;aF(j|0,h|0);h=g&65535;g=c[10030]|0;aF(h|0,g|0);g=f&255;f=c[10030]|0;aF(g|0,f|0);f=c[10030]|0;aF(1,f|0)}j=j+1|0;}while((j|0)<127);j=c[58772]|0;f=e|0;e=235096+(j<<2)|0;if((c[e>>2]|0)==0){be(f|0,180880,(v=i,i=i+16|0,c[v>>2]=180824,c[v+8>>2]=j,v)|0);g=c[10030]|0;aF(221,g|0);g=c[10030]|0;aF(j|0,g|0);g=c[10030]|0;aF(1,g|0);g=c[10030]|0;aF(1,g|0);g=c[10030]|0;aK(f|0,g|0);g=c[10030]|0;aF(0,g|0);c[e>>2]=j}e=j*5&-1;c[58770]=e;c[58744]=(e|0)/2&-1;c[58812]=(e|0)/3&-1;c[(c[3524]|0)+16>>2]=e;c[(c[3524]|0)+20>>2]=c[58744];aF(207,c[10030]|0);aF(j|0,c[10030]|0);aF(210,c[10030]|0);j=c[58744]|0;aF(j>>>8|0,c[10030]|0);aF(j|0,c[10030]|0);aF(208,c[10030]|0);j=c[58770]|0;aF(j>>>8|0,c[10030]|0);aF(j|0,c[10030]|0);if((c[58576]|0)!=0){tG()}if((c[58814]|0)==0){k=c[10030]|0;l=aF(135,k|0)|0;m=c[10030]|0;n=aF(0,m|0)|0;o=c[10030]|0;p=aF(0,o|0)|0;q=c[10030]|0;r=aF(137,q|0)|0;s=c[10030]|0;t=aF(0,s|0)|0;u=c[10030]|0;x=aF(0,u|0)|0;ph(-1);a[234312]=1;c[58576]=0;i=d;return}c[58814]=0;aF(206,c[10030]|0);aF(0,c[10030]|0);k=c[10030]|0;l=aF(135,k|0)|0;m=c[10030]|0;n=aF(0,m|0)|0;o=c[10030]|0;p=aF(0,o|0)|0;q=c[10030]|0;r=aF(137,q|0)|0;s=c[10030]|0;t=aF(0,s|0)|0;u=c[10030]|0;x=aF(0,u|0)|0;ph(-1);a[234312]=1;c[58576]=0;i=d;return}function pd(){if((c[58576]|0)!=0){tG()}aF(255,c[10030]|0);return}function pe(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,i=0;if((c[58576]|0)!=0){tG()}a=c[58580]|0;b=c[58574]|0;d=c[58572]|0;if((a|0)<(aa(d,b)|0)){e=a;f=b;g=d}else{if((c[58576]|0)!=0){tG()}d=c[10030]|0;aF(219,d|0);c[58580]=0;e=0;f=c[58574]|0;g=c[58572]|0}c[58580]=e+1;d=c[58758]|0;b=c[58742]|0;a=aa(b,(e|0)%(f|0)&-1)+d|0;d=c[58756]|0;h=c[58740]|0;i=aa((g-1|0)-((e|0)/(f|0)&-1)|0,h)+d|0;c[58754]=a+((b-(c[58738]|0)|0)/2&-1);c[58752]=i+((h-(c[58736]|0)|0)/2&-1);return}function pf(a,b){a=a|0;b=b|0;if((c[58576]|0)!=0){tG()}c[58472]=(c[58754]|0)+a;c[58372]=(c[58752]|0)+b;c[58576]=1;return}function pg(b,d){b=b|0;d=d|0;var e=0,f=0;e=c[58576]|0;c[233888+(e<<2)>>2]=(c[58754]|0)+b;c[233488+(e<<2)>>2]=(c[58752]|0)+d;f=e+1|0;c[58576]=f;if(f>>>0<(a[234312]|0?100:0)>>>0){return}tG();c[58472]=(c[58754]|0)+b;c[58372]=(c[58752]|0)+d;c[58576]=1;return}function ph(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;if((c[58576]|0)!=0){tG()}d=(b|0)<-2?-2:b;if((d|0)==-2){e=4}else{b=((d|0)/8&-1)<<1;e=(b|0)<1?1:b}b=((d|0)%8&-1)+2|0;if((c[58766]|0)==(b|0)){return}c[58766]=b;aF(232,c[10030]|0);aF(e|0,c[10030]|0);aF(237,c[10030]|0);aF(0,c[10030]|0);aF(237,c[10030]|0);d=234328+(b*10&-1)|0;f=uA(d|0)|0;aF(f|0,c[10030]|0);f=a[d]|0;if(f<<24>>24==0){return}g=aa(f<<24>>24,e);aF(g>>>8|0,c[10030]|0);aF(g|0,c[10030]|0);if((uA(d|0)|0)>>>0>1){h=1}else{return}while(1){g=h+1|0;f=aa(a[234328+(b*10&-1)+h|0]|0,e);aF(f>>>8|0,c[10030]|0);aF(f|0,c[10030]|0);if(g>>>0<(uA(d|0)|0)>>>0){h=g}else{break}}return}function pi(a){a=a|0;if((c[58576]|0)!=0){tG()}if((c[58814]|0)==(a|0)){return 1}c[58814]=a;aF(206,c[10030]|0);aF(((a|0)==0?0:7)|0,c[10030]|0);return 1}function pj(a){a=a|0;if((c[58576]|0)!=0){tG()}c[58768]=a;return 1}function pk(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;b=i;d=c[13898]|0;e=c[8272]|0;L21144:do{if((d|0)<(e|0)){f=d;g=e;while(1){h=c[1054]|0;j=(a[h+(f*40&-1)|0]&1)==0;L21147:do{if(!j){k=c[h+(f*40&-1)+36>>2]|0;l=h+(f*40&-1)+32|0;n=c[10036]|0;o=0;while(1){if((o|0)>=(k|0)){break}if((a[n+((c[l>>2]|0)+o|0)|0]|0)==(a[o+103664|0]|0)){o=o+1|0}else{break L21147}}if((o|0)==1){break L21144}}}while(0);l=c[58164]|0;L21154:do{if((l|0)==0){p=232656}else{n=c[h+(f*40&-1)+36>>2]|0;k=c[h+(f*40&-1)+32>>2]|0;q=(n|0)>0;r=c[10036]|0;s=232656;t=l;while(1){L21158:do{if(!j){if(q){u=0;w=0;x=k;while(1){y=a[t+u|0]|0;if(y<<24>>24==(a[r+(u+x|0)|0]|0)){z=x;A=w}else{if(y<<24>>24!=36){break L21158}z=x-1|0;A=1}B=u+1|0;if((B|0)<(A+n|0)){u=B;w=A;x=z}else{break}}if((A|0)==0){C=B}else{p=s;break L21154}}else{C=0}x=a[t+C|0]|0;if((x<<24>>24|0)==36|(x<<24>>24|0)==0){p=s;break L21154}}}while(0);x=s+8|0;w=c[x>>2]|0;if((w|0)==0){p=x;break}else{s=x;t=w}}}}while(0);j=c[p+4>>2]|0;if((j|0)==0){a[34768]=1;l=f+1|0;c[13898]=l;D=l;E=g}else if((j|0)==3){a[34256]=0;l=f+1|0;c[13898]=l;D=l;E=g}else if((j|0)==2){a[34256]=1;l=f+1|0;c[13898]=l;D=l;E=g}else if((j|0)==1){a[34768]=0;j=f+1|0;c[13898]=j;D=j;E=g}else{aI(181208,337,1,c[m>>2]|0);j=(c[13898]|0)+1|0;c[13898]=j;D=j;E=c[8272]|0}if((D|0)<(E|0)){f=D;g=E}else{break}}}}while(0);E=a[34256]|0?181144:181176;be(13048,84616,(v=i,i=i+16|0,c[v>>2]=a[34768]|0?116408:181192,c[v+8>>2]=E,v)|0);i=b;return}function pl(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0;f=i;if((c[58576]|0)!=0){tG()}g=c[58810]|0;if((g|0)!=0){uu(g)}g=(uA(e|0)|0)+2|0;h=ut(g)|0;do{if((h|0)==0){gk();j=ut(g)|0;if((j|0)!=0){k=j;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=180928,v)|0)}else{k=h}}while(0);c[58810]=k;h=a[e]|0;if(h<<24>>24==0){l=k;m=1}else{g=e;e=k;k=1;j=h;while(1){h=j&255;do{if((h|0)==92){n=g+1|0;o=a[n]|0;if(o<<24>>24!=92){p=n;q=o;r=15734;break}a[e]=10;s=k+1|0;t=n}else if((h|0)==32){a[e]=-128;s=k;t=g}else{p=g;q=j;r=15734}}while(0);if((r|0)==15734){r=0;a[e]=a[234688+(q&255)|0]|0;s=k;t=p}h=e+1|0;n=t+1|0;o=a[n]|0;if(o<<24>>24==0){l=h;m=s;break}else{g=n;e=h;k=s;j=o}}}a[l]=10;a[l+1|0]=0;l=(c[58814]|0)==0;j=aa(c[58770]|0,m);m=c[58810]|0;if(l){u=m;w=b;x=(((j|0)/2&-1)+d|0)-(c[58770]|0)|0}else{u=m;w=(((j|0)/-2&-1)+b|0)+(c[58770]|0)|0;x=d}L21204:while(1){d=u;b=w;while(1){j=a8(d|0,10)|0;if((j|0)==0){break L21204}a[j]=0;m=(c[58814]|0)==0;l=c[58812]|0;s=b-(m?0:l)|0;k=(m?l:0)+x|0;l=uA(d|0)|0;e=aa(c[58744]|0,l);l=c[58768]|0;do{if((l|0)==1){g=(e|0)/2&-1;if(m){y=k;z=b-g|0;break}else{y=x-g|0;z=s;break}}else if((l|0)==2){if(m){y=k;z=b-e|0;break}else{y=x-e|0;z=s;break}}else{y=k;z=s}}while(0);aF(135,c[10030]|0);s=(c[58754]|0)+z|0;aF(s>>>8|0,c[10030]|0);aF(s|0,c[10030]|0);aF(137,c[10030]|0);s=(c[58752]|0)+y|0;aF(s>>>8|0,c[10030]|0);aF(s|0,c[10030]|0);aF(209,c[10030]|0);s=c[58754]|0;if((c[58814]|0)==1){k=s+y|0;e=k>>>8;m=c[10030]|0;aF(e|0,m|0);m=c[10030]|0;aF(k|0,m|0)}else{m=s+z|0;s=m>>>8;k=c[10030]|0;aF(s|0,k|0);k=c[10030]|0;aF(m|0,k|0)}aK(d|0,c[10030]|0);A=j+1|0;B=c[58770]|0;if((c[58814]|0)==0){break}else{d=A;b=B+b|0}}u=A;w=b;x=x-B|0}i=f;return}function pm(a){a=a|0;c[8546]=a;return 1}function pn(){var b=0,d=0,e=0,f=0,h=0;b=i;if(a[34544]|a[34552]){i=b;return}a[34544]=1;a[34552]=0;d=c[8619]|0;if((d|0)==34464){e=1;f=0}else{h=d;do{d=c[h+12>>2]|0;c[8619]=d;c[d+8>>2]=34464;uu(h);h=c[8619]|0;}while((h|0)!=34464);e=a[34544]|0;f=a[34552]|0}c[8619]=34464;c[8618]=34464;g[8616]=0.0;g[8617]=9.99899959564209;a[34336]=0;a[34272]=0;a[34192]=0;if(e&f){uD(34480,183216,21)}uE(34560,0,160);cf(c[10030]|0,181648,(v=i,i=i+48|0,c[v>>2]=40152,c[v+8>>2]=40160,c[v+16>>2]=72,c[v+24>>2]=9,c[v+32>>2]=40,c[v+40>>2]=56,v)|0);i=b;return}function po(){if(!(a[34544]&(a[34552]^1))){return}aI(182144,19,1,c[10030]|0);a[34544]=0;c[8680]=-1;return}function pp(){var b=0,d=0,e=0,f=0;b=i;if(!(a[34544]&a[34552])){i=b;return}if(!(a[34256]|0)){tF()}aI(182248,117,1,c[10030]|0);d=0;do{e=c[34564+(d<<3)>>2]|0;do{if((e|0)!=0){if((c[34560+(d<<3)>>2]|0)!=1){break}f=c[10030]|0;cf(f|0,182216,(v=i,i=i+8|0,c[v>>2]=e,v)|0)}}while(0);d=d+1|0;}while((d|0)<20);cf(c[10030]|0,182168,(v=i,i=i+8|0,c[v>>2]=c[8680],v)|0);a[34552]=0;i=b;return}function pq(){var b=0,d=0,e=0,f=0,j=0;b=i;if(!(a[34544]&(a[34552]^1))){i=b;return}a[34552]=1;c[8680]=(c[8680]|0)+1;d=c[8619]|0;if((d|0)==34464){e=1;f=1}else{j=d;do{d=c[j+12>>2]|0;c[8619]=d;c[d+8>>2]=34464;uu(j);j=c[8619]|0;}while((j|0)!=34464);e=a[34544]|0;f=a[34552]|0}c[8619]=34464;c[8618]=34464;g[8616]=0.0;g[8617]=9.99899959564209;a[34336]=0;a[34272]=0;a[34192]=0;if(e&f){uD(34480,183216,21)}uE(34560,0,160);f=c[8680]|0;cf(c[10030]|0,182384,(v=i,i=i+32|0,c[v>>2]=f,h[v+8>>3]=+(f|0)*10.1,h[v+16>>3]=15.0,h[v+24>>3]=10.0,v)|0);i=b;return}function pr(b,c){b=b|0;c=c|0;if(!(a[34544]&a[34552])){return}if(!(a[34256]|0)){tF()}g[8616]=+(b>>>0>>>0)/1.0e3;g[8617]=+(9999-c|0)/1.0e3;return}function ps(b){b=b|0;var d=0,e=0,f=0;d=i;if(!(a[34544]&a[34552])){i=d;return}if(!(a[34256]|0)){tF()}do{if((b|0)<0){do{if((b|0)==-1){c[8566]=24;if(a[34768]|0){break}uD(34192,182904,17)}else{c[8566]=16;if(a[34768]|0){break}uD(34192,182904,17)}}while(0);uD(34272,182856,20);uD(34120,182824,25)}else{e=(b|0)%16&-1;c[8566]=e;uD(34272,182800,20);if(a[34768]|0){break}f=((e|0)%6&-1)+2|0;be(34192,182776,(v=i,i=i+8|0,c[v>>2]=f,v)|0);if(a[34768]|0){break}f=((c[8566]|0)%6&-1)+2|0;be(34120,182664,(v=i,i=i+8|0,c[v>>2]=f,v)|0)}}while(0);be(34336,182648,(v=i,i=i+8|0,c[v>>2]=c[34400+(((c[8566]|0)%16&-1)<<2)>>2],v)|0);i=d;return}function pt(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,j=0,k=0,l=0.0,m=0,n=0,o=0;f=i;if(!(a[34544]&a[34552])){i=f;return}if(a[34256]|0){j=1;k=1}else{tF();j=a[34544]|0;k=a[34552]|0}if(j&k){if(!(a[34256]|0)){tF()}g[8616]=+(b>>>0>>>0)/1.0e3;g[8617]=+(10063-d|0)/1.0e3}if((a[e]|0)==0){i=f;return}cf(c[10030]|0,183024,(v=i,i=i+40|0,c[v>>2]=(c[8566]|0)+1,c[v+8>>2]=34336,c[v+16>>2]=34272,c[v+24>>2]=34192,c[v+32>>2]=34120,v)|0);if((c[8682]|0)!=72){d=c[10030]|0;cf(d|0,183328,(v=i,i=i+8|0,c[v>>2]=72,v)|0);c[8682]=72}l=+g[8617];d=c[8546]|0;cf(c[10030]|0,182960,(v=i,i=i+40|0,h[v>>3]=+g[8616],h[v+8>>3]=l,c[v+16>>2]=34480,c[v+24>>2]=d,c[v+32>>2]=e,v)|0);e=(c[8566]|0)+1|0;L21319:do{if(a[34544]&a[34552]){d=0;while(1){if((d|0)>=20){break L21319}m=34564+(d<<3)|0;b=c[m>>2]|0;n=(b|0)==0;o=(b|0)==(e|0);if(n|o){break}else{d=d+1|0}}b=34560+(d<<3)|0;if(n){c[m>>2]=e;c[b>>2]=0;break}if(!o){break}c[b>>2]=1}}while(0);a[34336]=0;a[34272]=0;a[34192]=0;a[34480]=0;i=f;return}function pu(b){b=b|0;var c=0;do{if(a[34544]&a[34552]){if((b|0)==0){uD(34480,183216,21);c=1;break}else if((b|0)==2){uD(34480,183136,22);c=1;break}else if((b|0)==1){uD(34480,183184,23);c=1;break}else{c=0;break}}else{c=0}}while(0);return c|0}function pv(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0,s=0,t=0;f=i;if((e|0)<0){j=-1}else{j=(e|0)%6&-1}if(!(a[34544]&a[34552])){i=f;return}if(a[34256]|0){k=1;l=1}else{tF();k=a[34544]|0;l=a[34552]|0}if(k&l){if(a[34256]|0){m=1;n=1}else{tF();m=a[34544]|0;n=a[34552]|0}g[8616]=+(b>>>0>>>0)/1.0e3;g[8617]=+(9999-d|0)/1.0e3;o=m;p=n}else{o=k;p=l}if(o&p){uD(34480,183184,23)}cf(c[10030]|0,183424,(v=i,i=i+16|0,c[v>>2]=(c[8566]|0)+1,c[v+8>>2]=34120,v)|0);p=c[33548+(j<<4)>>2]|0;if((c[8682]|0)!=(p|0)){o=c[10030]|0;cf(o|0,183328,(v=i,i=i+8|0,c[v>>2]=p,v)|0);c[8682]=p}q=+g[8617]+ +g[33544+(j<<4)>>2];p=c[33536+(j<<4)>>2]|0;cf(c[10030]|0,183368,(v=i,i=i+32|0,h[v>>3]=+g[8616]+ +g[33540+(j<<4)>>2],h[v+8>>3]=q,c[v+16>>2]=34480,c[v+24>>2]=p,v)|0);aI(183360,3,1,c[10030]|0);p=(c[8566]|0)+1|0;L21360:do{if(a[34544]&a[34552]){j=0;while(1){if((j|0)>=20){break L21360}r=34564+(j<<3)|0;o=c[r>>2]|0;s=(o|0)==0;t=(o|0)==(p|0);if(s|t){break}else{j=j+1|0}}o=34560+(j<<3)|0;if(s){c[r>>2]=p;c[o>>2]=0;break}if(!t){break}c[o>>2]=1}}while(0);a[34480]=0;i=f;return}function pw(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;j=i;k=b&15;if((k|0)==1){l=0}else if((k|0)==2){l=c[34736+(((b>>4|0)%8&-1)<<2)>>2]|0}else{l=7}cf(c[10030]|0,183520,(v=i,i=i+16|0,c[v>>2]=(c[8566]|0)+1,c[v+8>>2]=34192,v)|0);cf(c[10030]|0,183696,(v=i,i=i+8|0,c[v>>2]=l,v)|0);cf(c[10030]|0,183464,(v=i,i=i+32|0,h[v>>3]=+(d>>>0>>>0)/1.0e3,h[v+8>>3]=+(((9999-e|0)-g|0)>>>0>>>0)/1.0e3,h[v+16>>3]=+(f>>>0>>>0)/1.0e3,h[v+24>>3]=+(g>>>0>>>0)/1.0e3,v)|0);aI(183600,4,1,c[10030]|0);g=(c[8566]|0)+1|0;if(a[34544]&a[34552]){m=0}else{i=j;return}while(1){if((m|0)>=20){n=15879;break}o=34564+(m<<3)|0;f=c[o>>2]|0;p=(f|0)==0;q=(f|0)==(g|0);if(p|q){break}else{m=m+1|0}}if((n|0)==15879){i=j;return}n=34560+(m<<3)|0;if(p){c[o>>2]=g;c[n>>2]=0;i=j;return}if(!q){i=j;return}c[n>>2]=1;i=j;return}function px(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0.0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;e=i;cf(c[10030]|0,183712,(v=i,i=i+8|0,c[v>>2]=(c[8566]|0)+1,v)|0);cf(c[10030]|0,183696,(v=i,i=i+8|0,c[v>>2]=0,v)|0);cf(c[10030]|0,183648,(v=i,i=i+8|0,c[v>>2]=b,v)|0);f=c[10030]|0;if((b|0)>0){g=0;j=f;while(1){k=+(9999-(c[d+(g*12&-1)+4>>2]|0)|0)/1.0e3;cf(j|0,183624,(v=i,i=i+16|0,h[v>>3]=+(c[d+(g*12&-1)>>2]|0)/1.0e3,h[v+8>>3]=k,v)|0);l=g+1|0;m=c[10030]|0;if((l|0)<(b|0)){g=l;j=m}else{n=m;break}}}else{n=f}aI(183600,4,1,n|0);n=(c[8566]|0)+1|0;if(a[34544]&a[34552]){o=0}else{i=e;return}while(1){if((o|0)>=20){p=15896;break}q=34564+(o<<3)|0;f=c[q>>2]|0;r=(f|0)==0;s=(f|0)==(n|0);if(r|s){break}else{o=o+1|0}}if((p|0)==15896){i=e;return}p=34560+(o<<3)|0;if(r){c[q>>2]=n;c[p>>2]=0;i=e;return}if(!s){i=e;return}c[p>>2]=1;i=e;return}function py(b,d){b=b|0;d=d|0;var e=0,f=0.0,h=0.0,j=0;e=i;if(!(a[34544]&a[34552])){i=e;return}f=+(b>>>0>>>0)/1.0e3;h=+(9999-d|0)/1.0e3;d=ut(16)|0;do{if((d|0)==0){gk();b=ut(16)|0;if((b|0)!=0){j=b;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=182608,v)|0)}else{j=d}}while(0);c[(c[8619]|0)+8>>2]=j;c[(c[(c[8619]|0)+8>>2]|0)+8>>2]=34464;j=c[8619]|0;c[(c[j+8>>2]|0)+12>>2]=j;j=c[(c[8619]|0)+8>>2]|0;c[8619]=j;g[j>>2]=f;g[(c[8619]|0)+4>>2]=h;if(!(a[34256]|0)){i=e;return}tF();i=e;return}function pz(){var b=0,d=0,e=0,f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0,aA=0,aB=0,aC=0,aD=0,aE=0,aF=0,aG=0,aH=0,aI=0,aJ=0,aK=0,aL=0,aM=0,aN=0,aO=0,aP=0,aQ=0,aR=0,aS=0,aT=0,aU=0,aV=0,aW=0,aX=0,aZ=0,a_=0,a$=0,a0=0,a1=0,a2=0,a3=0,a4=0,a5=0,a6=0,a7=0,a8=0,a9=0,ba=0,bb=0,bc=0,bd=0.0,bf=0.0,bg=0.0,bi=0.0,bj=0.0,bk=0.0,bl=0.0,bm=0,bn=0,bo=0,bp=0,bq=0.0,br=0,bs=0,bt=0,bu=0,bv=0,bw=0,bx=0,by=0,bz=0,bA=0,bB=0,bC=0,bD=0,bE=0,bF=0,bG=0,bH=0,bI=0,bJ=0,bK=0,bL=0,bM=0,bN=0,bO=0,bP=0,bQ=0,bR=0,bS=0,bT=0,bU=0,bV=0,bW=0,bX=0,bY=0,bZ=0,b_=0,b$=0,b0=0,b1=0,b2=0,b3=0,b4=0,b5=0,b6=0,b7=0,b8=0,b9=0,cb=0,cc=0,cd=0,ce=0,cf=0,cg=0,ch=0,ci=0,cj=0,ck=0,cl=0,cm=0,cn=0,co=0,cp=0,cq=0,cr=0,cs=0,ct=0,cu=0,cv=0,cw=0,cx=0,cz=0,cA=0,cB=0,cC=0,cD=0,cE=0,cF=0,cG=0,cH=0,cI=0.0,cJ=0.0,cK=0,cL=0;b=i;i=i+1272|0;d=b|0;e=b+24|0;f=b+48|0;j=b+72|0;k=b+96|0;l=b+120|0;m=b+144|0;n=b+168|0;o=b+192|0;p=b+1248|0;q=b+1256|0;r=b+1264|0;s=b+216|0;uE(s|0,0,1025);if((c[13898]|0)!=2){a[28824]=0}t=c[3524]|0;u=c[t>>2]|0;do{if((aY(u|0,168936)|0)==0){c[7118]=28e3;w=28e3}else{if((aY(u|0,169984)|0)==0){c[7118]=28304;w=28304;break}if((aY(u|0,170664)|0)==0){c[7118]=43680;w=43680;break}else{c[7118]=30304;w=30304;break}}}while(0);if((c[w>>2]|0)==3){w=c[7112]|0;if((w|0)!=0){uu(w)}c[7112]=0}else{c[t+88>>2]=90}t=c[13898]|0;w=c[8272]|0;L21446:do{if((t|0)<(w|0)){u=c[1054]|0;x=(a[u+(t*40&-1)|0]&1)==0;L21448:do{if(!x){y=c[u+(t*40&-1)+36>>2]|0;z=u+(t*40&-1)+32|0;A=c[10036]|0;B=0;while(1){if((B|0)>=(y|0)){break}if((a[A+((c[z>>2]|0)+B|0)|0]|0)==(a[B+103664|0]|0)){B=B+1|0}else{break L21448}}if((B|0)==1){C=t;D=w;break L21446}}}while(0);z=c[57330]|0;L21455:do{if((z|0)==0){E=229320}else{A=c[u+(t*40&-1)+36>>2]|0;y=c[u+(t*40&-1)+32>>2]|0;F=(A|0)>0;G=c[10036]|0;H=229320;I=z;while(1){L21459:do{if(!x){if(F){J=0;K=0;L=y;while(1){M=a[I+J|0]|0;if(M<<24>>24==(a[G+(J+L|0)|0]|0)){N=L;O=K}else{if(M<<24>>24!=36){break L21459}N=L-1|0;O=1}Q=J+1|0;if((Q|0)<(O+A|0)){J=Q;K=O;L=N}else{break}}if((O|0)==0){R=Q}else{E=H;break L21455}}else{R=0}L=a[I+R|0]|0;if((L<<24>>24|0)==36|(L<<24>>24|0)==0){E=H;break L21455}}}while(0);L=H+8|0;K=c[L>>2]|0;if((K|0)==0){E=L;break}else{H=L;I=K}}}}while(0);if((c[E+4>>2]|0)!=3){C=t;D=w;break}x=c[7118]|0;z=c[x>>2]|0;if((z|0)==2){uD(x|0,43536,144)}else if((z|0)==0){uD(x|0,27856,144)}else if((z|0)==3){u=x+32|0;I=c[u>>2]|0;if((I|0)==0){S=x}else{H=u;u=I;while(1){c[H>>2]=c[u>>2];uu(c[u+4>>2]|0);uu(c[u+8>>2]|0);uu(c[u+12>>2]|0);uu(u);I=c[7118]|0;A=I+32|0;G=c[A>>2]|0;if((G|0)==0){S=I;break}else{H=A;u=G}}}uD(S|0,30160,144)}else if((z|0)==1){uD(x|0,28160,144)}u=(c[3524]|0)+96|0;c[u>>2]=c[u>>2]&-33;u=(c[13898]|0)+1|0;c[13898]=u;H=c[8272]|0;if((u|0)>=(H|0)){C=u;D=H;break}G=c[1054]|0;if((a[G+(u*40&-1)|0]&1)==0){T=c[3524]|0;U=T|0;V=c[U>>2]|0;uf(u,134056,(v=i,i=i+8|0,c[v>>2]=V,v)|0)}A=c[G+(u*40&-1)+36>>2]|0;I=G+(u*40&-1)+32|0;G=c[10036]|0;y=0;while(1){if((y|0)>=(A|0)){break}if((a[G+((c[I>>2]|0)+y|0)|0]|0)==(a[y+103664|0]|0)){y=y+1|0}else{W=16364;break}}if((W|0)==16364){T=c[3524]|0;U=T|0;V=c[U>>2]|0;uf(u,134056,(v=i,i=i+8|0,c[v>>2]=V,v)|0)}if((y|0)==1){C=u;D=H;break}T=c[3524]|0;U=T|0;V=c[U>>2]|0;uf(u,134056,(v=i,i=i+8|0,c[v>>2]=V,v)|0)}else{C=t;D=w}}while(0);L21495:do{if((C|0)<(D|0)){w=e|0;t=e+8|0;V=d|0;U=d+8|0;T=o|0;S=o+8|0;E=n|0;R=n+8|0;Q=m|0;O=m+8|0;N=l|0;I=l+8|0;G=k|0;A=k+8|0;x=j|0;z=j+8|0;F=f|0;B=f+8|0;K=0;L=0;J=0;M=0;X=0;Y=0;Z=0;_=0;$=0;aa=0;ab=0;ac=0;ad=0;ae=0;af=0;ag=0;ah=0;ai=0;aj=0;ak=0;al=C;am=D;L21497:while(1){an=c[1054]|0;ao=(a[an+(al*40&-1)|0]&1)==0;L21499:do{if(!ao){ap=c[an+(al*40&-1)+36>>2]|0;aq=an+(al*40&-1)+32|0;ar=c[10036]|0;as=0;while(1){if((as|0)>=(ap|0)){break}if((a[ar+((c[aq>>2]|0)+as|0)|0]|0)==(a[as+103664|0]|0)){as=as+1|0}else{break L21499}}if((as|0)==1){break L21495}}}while(0);aq=c[57330]|0;L21506:do{if((aq|0)==0){at=229320}else{ar=c[an+(al*40&-1)+36>>2]|0;ap=c[an+(al*40&-1)+32>>2]|0;au=(ar|0)>0;av=c[10036]|0;aw=229320;ax=aq;while(1){L21510:do{if(!ao){if(au){ay=0;az=0;aA=ap;while(1){aB=a[ax+ay|0]|0;if(aB<<24>>24==(a[av+(ay+aA|0)|0]|0)){aC=aA;aD=az}else{if(aB<<24>>24!=36){break L21510}aC=aA-1|0;aD=1}aE=ay+1|0;if((aE|0)<(aD+ar|0)){ay=aE;az=aD;aA=aC}else{break}}if((aD|0)==0){aF=aE}else{at=aw;break L21506}}else{aF=0}aA=a[ax+aF|0]|0;if((aA<<24>>24|0)==36|(aA<<24>>24|0)==0){at=aw;break L21506}}}while(0);aA=aw+8|0;az=c[aA>>2]|0;if((az|0)==0){at=aA;break}else{aw=aA;ax=az}}}}while(0);ao=c[at+4>>2]|0;L21523:do{if((ao|0)==12){if(aa){W=16377;break L21497}aq=c[7118]|0;if(((c[aq>>2]|0)-2|0)>>>0>=2){W=16378;break L21497}a[aq+18|0]=0;c[13898]=(c[13898]|0)+1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=1;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==1){if(ak){W=16375;break L21497}aq=c[7118]|0;if((c[aq>>2]|0)!=3){W=16376;break L21497}c[aq+12>>2]=2;c[13898]=(c[13898]|0)+1;aG=1;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==10){if(J){W=16058;break L21497}a[(c[7118]|0)+17|0]=1;aq=(c[3524]|0)+96|0;c[aq>>2]=c[aq>>2]&-1025;c[13898]=(c[13898]|0)+1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=1;aZ=L;a_=K}else if((ao|0)==24){c[p>>2]=0;a$=al+1|0;c[13898]=a$;if((c[c[7118]>>2]|0)!=3){W=16139;break L21497}aq=a[an+(a$*40&-1)|0]|0;L21534:do{if((am|0)>(a$|0)){if((aq&1)==0){W=16145;break}ax=c[an+(a$*40&-1)+36>>2]|0;aw=an+(a$*40&-1)+32|0;ar=c[10036]|0;av=0;while(1){if((av|0)>=(ax|0)){break}if((a[ar+((c[aw>>2]|0)+av|0)|0]|0)==(a[av+186440|0]|0)){av=av+1|0}else{W=16145;break L21534}}if((av|0)!=3){a0=ax;a1=aw;W=16148;break}ar=al+2|0;c[13898]=ar;a2=0;a3=ar}else{W=16145}}while(0);if((W|0)==16145){W=0;a0=c[an+(a$*40&-1)+36>>2]|0;a1=an+(a$*40&-1)+32|0;W=16148}L21544:do{if((W|0)==16148){W=0;if(!((aq&1)!=0&(a0|0)>0)){a2=0;a3=a$;break}ar=c[10036]|0;ap=0;au=0;as=c[a1>>2]|0;while(1){if((a[ap+186432|0]|0)==(a[ar+(ap+as|0)|0]|0)){a4=as;a5=au}else{if((ap|0)!=3){a2=0;a3=a$;break L21544}a4=as-1|0;a5=1}az=ap+1|0;if((az|0)<(a5+a0|0)){ap=az;au=a5;as=a4}else{break}}if((a5|0)==0){if(!((ap|0)==2|(ap|0)==6)){a2=0;a3=a$;break}}as=al+2|0;c[13898]=as;a2=1;a3=as}}while(0);if((a3|0)>=(am|0)){W=16165;break L21497}L21559:do{if((a[an+(a3*40&-1)|0]&1)!=0){aq=c[an+(a3*40&-1)+36>>2]|0;as=an+(a3*40&-1)+32|0;au=c[10036]|0;ar=0;while(1){if((ar|0)>=(aq|0)){break}if((a[au+((c[as>>2]|0)+ar|0)|0]|0)==(a[ar+103664|0]|0)){ar=ar+1|0}else{break L21559}}if((ar|0)==1){W=16165;break L21497}}}while(0);a[14176]=1;is(k);a[14176]=0;if((c[G>>2]|0)!=3){W=16164;break L21497}as=c[A>>2]|0;c[p>>2]=as;if((as|0)==0){W=16167;break L21497}as=c[(c[7118]|0)+32>>2]|0;au=ut(16)|0;if((au|0)==0){gk();aq=ut(16)|0;if((aq|0)==0){W=16171;break L21497}else{a6=aq}}else{a6=au}au=a6;aq=c[(c[1054]|0)+((c[13898]|0)*40&-1)+36>>2]|0;ap=ut(aq)|0;if((ap|0)==0){gk();aw=ut(aq)|0;if((aw|0)==0){W=16174;break L21497}else{a7=aw}}else{a7=ap}a8=a6+4|0;c[a8>>2]=a7;iQ(p);ap=c[p>>2]|0;c[a8>>2]=ap;c[a6+12>>2]=0;do{if(a2){c[a6>>2]=0}else{if((a[ap]|0)==60){c[a6+8>>2]=0;c[a6>>2]=0}else{aw=hB(ap)|0;c[a6+8>>2]=aw;if((aw|0)==0){W=16178;break L21497}c[a6>>2]=0}aw=c[8804]|0;if((aw|0)==0){W=16184}else{aq=aw;while(1){aw=c[aq+48>>2]|0;if((aw|0)==0){break}else{aq=aw}}if((a[aq+12|0]&1)==0){W=16184}}if((W|0)==16184){W=0;if((a[37400]&1)==0){break}}tD(au,0)}}while(0);ap=(c[7118]|0)+32|0;if((c[ap>>2]|0)==0){if(a2){uh((c[13898]|0)-1|0,186216,(v=i,i=i+8|0,c[v>>2]=c[a8>>2],v)|0);aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K;break}else{c[ap>>2]=au;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K;break}}do{if((as|0)==0){a9=0}else{ar=c[a8>>2]|0;aw=a2^1;ax=0;av=as;az=0;while(1){ba=av+4|0;aA=(aY(c[ba>>2]|0,ar|0)|0)!=0;if(!(aA|aw)){break}bb=ax|aA^1;aA=c[av>>2]|0;if((aA|0)==0){W=16196;break}else{ax=bb;az=av;av=aA}}if((W|0)==16196){W=0;if(bb){aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K;break L21523}else{a9=av;break}}ax=c[av>>2]|0;if((az|0)==0){c[ap>>2]=ax}else{c[az>>2]=ax}uu(c[ba>>2]|0);uu(c[av+8>>2]|0);uu(c[av+12>>2]|0);uu(av);aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K;break L21523}}while(0);if(a2){uh((c[13898]|0)-1|0,186216,(v=i,i=i+8|0,c[v>>2]=c[a8>>2],v)|0);aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K;break}else{c[a9>>2]=au;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K;break}}else if((ao|0)==13){if(M){W=16069;break L21497}a[(c[7118]|0)+19|0]=1;c[13898]=(c[13898]|0)+1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=1;aX=J;aZ=L;a_=K}else if((ao|0)==33){if(ae){W=16332;break L21497}ap=c[7118]|0;if(((c[ap>>2]|0)-2|0)>>>0<2){W=16333;break L21497}a[ap+96|0]=1;c[13898]=(c[13898]|0)+1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=1;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==34){if(ae){W=16373;break L21497}ap=c[7118]|0;if(((c[ap>>2]|0)-2|0)>>>0<2){W=16374;break L21497}a[ap+96|0]=0;c[13898]=(c[13898]|0)+1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=1;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==21){if(Z){W=16112;break L21497}a[(c[7118]|0)+30|0]=0;c[13898]=(c[13898]|0)+1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=1;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==23){if(_){W=16118;break L21497}a[(c[7118]|0)+31|0]=0;c[13898]=(c[13898]|0)+1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=1;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==22){if(_){W=16115;break L21497}a[(c[7118]|0)+31|0]=1;c[13898]=(c[13898]|0)+1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=1;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==25){ap=c[7118]|0;if((c[ap>>2]|0)!=3){W=16205;break L21497}as=ap+32|0;ap=c[as>>2]|0;if((ap|0)==0){bc=al}else{ax=as;as=ap;do{c[ax>>2]=c[as>>2];uu(c[as+4>>2]|0);uu(c[as+8>>2]|0);uu(c[as+12>>2]|0);uu(as);ax=(c[7118]|0)+32|0;as=c[ax>>2]|0;}while((as|0)!=0);bc=c[13898]|0}c[13898]=bc+1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==41){a[(c[7118]|0)+114|0]=0;c[13898]=(c[13898]|0)+1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==42){c[13898]=al+1;as=hK()|0;ax=c[7118]|0;h[ax+120>>3]=+(as>>>16&255|0)/255.0;h[ax+128>>3]=+(as>>>8&255|0)/255.0;h[ax+136>>3]=+(as&255|0)/255.0;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==17){if(K){W=16338;break L21497}as=c[7118]|0;if((c[as>>2]|0)!=3){W=16339;break L21497}a[as+29|0]=0;a[(c[7118]|0)+28|0]=1;c[13898]=(c[13898]|0)+1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=1}else if((ao|0)==5){if(aj){W=16344;break L21497}if((c[c[7118]>>2]|0)!=3){W=16345;break L21497}c[(c[3524]|0)+68>>2]=116;c[(c[3524]|0)+88>>2]=90;as=(c[3524]|0)+96|0;c[as>>2]=c[as>>2]&-33;c[13898]=(c[13898]|0)+1;aG=ak;aH=1;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==2){if(ak){W=16334;break L21497}as=c[7118]|0;if((c[as>>2]|0)!=3){W=16335;break L21497}c[as+12>>2]=0;c[13898]=(c[13898]|0)+1;aG=1;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==19){if(K){W=16348;break L21497}as=c[7118]|0;if((c[as>>2]|0)!=3){W=16349;break L21497}a[as+28|0]=0;c[13898]=(c[13898]|0)+1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=1}else if((ao|0)==20){if(Z){W=16109;break L21497}a[(c[7118]|0)+30|0]=1;c[13898]=(c[13898]|0)+1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=1;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==28){if(L){W=15990;break L21497}a[(c[7118]|0)+16|0]=0;c[13898]=(c[13898]|0)+1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=1;a_=K}else if((ao|0)==3){W=15992;break L21497}else if((ao|0)==4){if(aj){W=16347;break L21497}if((c[c[7118]>>2]|0)!=3){W=16346;break L21497}c[(c[3524]|0)+68>>2]=86;c[(c[3524]|0)+88>>2]=126;as=(c[3524]|0)+96|0;c[as>>2]=c[as>>2]|32;c[13898]=(c[13898]|0)+1;aG=ak;aH=1;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==38){if(ac){W=16379;break L21497}if((c[c[7118]>>2]|0)!=2){W=16380;break L21497}uu(c[10956]|0);c[10956]=0;c[13898]=(c[13898]|0)+1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=1;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==16){if(Y){W=16086;break L21497}c[13898]=al+1;as=is(m)|0;ax=c[as>>2]|0;if((ax|0)==1){bd=+(c[as+8>>2]|0)}else if((ax|0)==2){bd=+h[as+8>>3]}else if((ax|0)==3){bd=+uz(c[as+8>>2]|0,0)}else{W=16091;break L21497}if((c[Q>>2]|0)==3){uu(c[O>>2]|0);c[Q>>2]=1}g[(c[7118]|0)+24>>2]=bd;as=(c[7118]|0)+24|0;if(+g[as>>2]>0.0){aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=1;aV=X;aW=M;aX=J;aZ=L;a_=K;break}g[as>>2]=1.0;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=1;aV=X;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==30){if(ai){W=16121;break L21497}as=al+1|0;c[13898]=as;L21670:do{if((as|0)<(am|0)){L21672:do{if((a[an+(as*40&-1)|0]&1)!=0){ax=c[an+(as*40&-1)+36>>2]|0;au=an+(as*40&-1)+32|0;ap=c[10036]|0;aw=0;while(1){if((aw|0)>=(ax|0)){break}if((a[ap+((c[au>>2]|0)+aw|0)|0]|0)==(a[aw+103664|0]|0)){aw=aw+1|0}else{break L21672}}if((aw|0)==1){bf=-1.0;break L21670}}}while(0);av=is(l)|0;az=c[av>>2]|0;if((az|0)==3){bg=+uz(c[av+8>>2]|0,0)}else if((az|0)==1){bg=+(c[av+8>>2]|0)}else if((az|0)==2){bg=+h[av+8>>3]}else{W=16132;break L21497}if((c[N>>2]|0)==3){uu(c[I>>2]|0);c[N>>2]=1}bf=bg}else{bf=-1.0}}while(0);g[(c[7118]|0)+92>>2]=bf;as=(c[7118]|0)+92|0;if(+g[as>>2]>=0.0){aG=ak;aH=aj;aI=1;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K;break}g[as>>2]=1.0;aG=ak;aH=aj;aI=1;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==43){c[13898]=al+1;as=c[7118]|0;h[as+136>>3]=-1.0;h[as+128>>3]=-1.0;h[as+120>>3]=-1.0;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==26){if($){W=16214;break L21497}c[13898]=al+1;as=is(j)|0;av=c[as>>2]|0;if((av|0)==1){bi=+(c[as+8>>2]|0)}else if((av|0)==2){bi=+h[as+8>>3]}else if((av|0)==3){bi=+uz(c[as+8>>2]|0,0)}else{W=16219;break L21497}if((c[x>>2]|0)==3){uu(c[z>>2]|0);c[x>>2]=1}c[(c[7118]|0)+100>>2]=~~bi;as=(c[7118]|0)+100|0;if((c[as>>2]|0)<2){c[as>>2]=2}as=c[13898]|0;if((as|0)>=(c[8272]|0)){aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=1;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K;break}av=c[1054]|0;az=(a[av+(as*40&-1)|0]&1)==0;if(az){aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=1;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K;break}au=c[av+(as*40&-1)+36>>2]|0;ap=av+(as*40&-1)+32|0;ax=c[10036]|0;ar=0;while(1){if((ar|0)>=(au|0)){W=16229;break}if((a[ax+((c[ap>>2]|0)+ar|0)|0]|0)==(a[ar+103664|0]|0)){ar=ar+1|0}else{break}}if((W|0)==16229){W=0;if((ar|0)==1){aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=1;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K;break}}if(az){aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=1;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K;break}ap=c[av+(as*40&-1)+36>>2]|0;ax=av+(as*40&-1)+32|0;au=c[10036]|0;aq=0;while(1){if((aq|0)>=(ap|0)){break}if((a[au+((c[ax>>2]|0)+aq|0)|0]|0)==(a[aq+148464|0]|0)){aq=aq+1|0}else{aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=1;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K;break L21523}}if((aq|0)!=1){aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=1;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K;break}c[13898]=as+1;ax=is(f)|0;au=c[ax>>2]|0;if((au|0)==1){bj=+(c[ax+8>>2]|0)}else if((au|0)==2){bj=+h[ax+8>>3]}else if((au|0)==3){bj=+uz(c[ax+8>>2]|0,0)}else{W=16239;break L21497}if((c[F>>2]|0)==3){uu(c[B>>2]|0);c[F>>2]=1}bk=+P(+bj);h[(c[7118]|0)+104>>3]=bk;if(bk<1.0){aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=1;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else{W=16243;break L21497}}else if((ao|0)==14){if(M){W=16072;break L21497}a[(c[7118]|0)+19|0]=0;c[13898]=(c[13898]|0)+1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=1;aX=J;aZ=L;a_=K}else if((ao|0)==15){if(X){W=16075;break L21497}c[13898]=al+1;ax=is(n)|0;au=c[ax>>2]|0;if((au|0)==1){bl=+(c[ax+8>>2]|0)}else if((au|0)==2){bl=+h[ax+8>>3]}else if((au|0)==3){bl=+uz(c[ax+8>>2]|0,0)}else{W=16080;break L21497}if((c[E>>2]|0)==3){uu(c[R>>2]|0);c[E>>2]=1}g[(c[7118]|0)+20>>2]=bl;ax=(c[7118]|0)+20|0;if(+g[ax>>2]>0.0){aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=1;aW=M;aX=J;aZ=L;a_=K;break}g[ax>>2]=1.0;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=1;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==35){if(af){W=16352;break L21497}ax=c[7118]|0;if((c[ax>>2]|0)==3){W=16353;break L21497}a[ax+112|0]=1;ax=c[7118]|0;if((c[ax>>2]|0)==2){a[ax+30|0]=1}c[13898]=(c[13898]|0)+1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=1;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==18){if(K){W=16340;break L21497}ax=c[7118]|0;if((c[ax>>2]|0)!=3){W=16341;break L21497}a[ax+29|0]=1;a[(c[7118]|0)+28|0]=1;c[13898]=(c[13898]|0)+1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=1}else if((ao|0)==31){if(ad){W=16343;break L21497}ax=c[7118]|0;if((c[ax>>2]|0)>>>0>=2){W=16342;break L21497}a[ax+97|0]=1;c[13898]=(c[13898]|0)+1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=1;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==9){if(J){W=16055;break L21497}a[(c[7118]|0)+17|0]=0;ax=(c[3524]|0)+96|0;c[ax>>2]=c[ax>>2]|1024;c[13898]=(c[13898]|0)+1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=1;aZ=L;a_=K}else if((ao|0)==27){if(L){W=15987;break L21497}a[(c[7118]|0)+16|0]=1;c[13898]=(c[13898]|0)+1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=1;a_=K}else if((ao|0)==8){if(ab){W=16358;break L21497}ax=c[7118]|0;if((c[ax>>2]|0)!=2){W=16359;break L21497}a[ax+113|0]=0;c[13898]=(c[13898]|0)+1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=1;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==39){c[13898]=al+1;a[28824]=1;c[7204]=s4(q,r,1)|0;c[(c[3524]|0)+8>>2]=~~(+g[q>>2]*10.0*72.0/+(c[10032]|0));c[(c[3524]|0)+12>>2]=~~(+g[r>>2]*10.0*72.0/+(c[10032]|0));ax=c[3524]|0;c[10962]=c[ax+8>>2]<<1;c[10960]=c[ax+12>>2]<<1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==29){ax=al+1|0;c[13898]=ax;bm=ax;W=16246}else if((ao|0)==7){if(ab){W=16355;break L21497}ax=c[7118]|0;if((c[ax>>2]|0)!=2){W=16354;break L21497}a[ax+113|0]=1;c[13898]=(c[13898]|0)+1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=1;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==37){if(ac){W=16369;break L21497}if((c[c[7118]>>2]|0)!=2){W=16370;break L21497}c[13898]=al+1;uu(c[10956]|0);c[10956]=0;bn=c[13898]|0;if((bn|0)>=(c[8272]|0)){W=16020;break L21497}ax=c[1054]|0;L21766:do{if((a[ax+(bn*40&-1)|0]&1)!=0){au=c[ax+(bn*40&-1)+36>>2]|0;ap=ax+(bn*40&-1)+32|0;av=c[10036]|0;az=0;while(1){if((az|0)>=(au|0)){break}if((a[av+((c[ap>>2]|0)+az|0)|0]|0)==(a[az+103664|0]|0)){az=az+1|0}else{break L21766}}if((az|0)==1){W=16020;break L21497}}}while(0);a[14176]=1;is(o);a[14176]=0;if((c[T>>2]|0)!=3){W=16019;break L21497}ax=c[S>>2]|0;c[10956]=ax;if((ax|0)==0){W=16022;break L21497}else{aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=1;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}}else if((ao|0)==0){if(ak){W=16337;break L21497}ax=c[7118]|0;if((c[ax>>2]|0)!=3){W=16336;break L21497}c[ax+12>>2]=1;c[13898]=(c[13898]|0)+1;aG=1;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==32){if(ad){W=16367;break L21497}ax=c[7118]|0;if((c[ax>>2]|0)>>>0>=2){W=16368;break L21497}a[ax+97|0]=0;c[13898]=(c[13898]|0)+1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=1;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==11){if(aa){W=16372;break L21497}ax=c[7118]|0;if(((c[ax>>2]|0)-2|0)>>>0>=2){W=16371;break L21497}a[ax+18|0]=1;c[13898]=(c[13898]|0)+1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=1;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==36){if(af){W=16357;break L21497}ax=c[7118]|0;if((c[ax>>2]|0)==3){W=16356;break L21497}a[ax+112|0]=0;c[13898]=(c[13898]|0)+1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=1;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else if((ao|0)==40){a[(c[7118]|0)+114|0]=1;c[13898]=(c[13898]|0)+1;aG=ak;aH=aj;aI=ai;aJ=ah;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}else{bm=al;W=16246}}while(0);L21787:do{if((W|0)==16246){W=0;L21789:do{if((bm|0)<(am|0)){L21791:do{if((a[an+(bm*40&-1)|0]&1)!=0){ao=c[an+(bm*40&-1)+36>>2]|0;ax=an+(bm*40&-1)+32|0;as=c[10036]|0;aq=0;while(1){if((aq|0)>=(ao|0)){break}if((a[as+((c[ax>>2]|0)+aq|0)|0]|0)==(a[aq+103664|0]|0)){aq=aq+1|0}else{break L21791}}if((aq|0)==1){break L21789}}}while(0);a[14176]=1;is(e);a[14176]=0;if((c[w>>2]|0)!=3){c[13898]=bm;break}az=c[t>>2]|0;if((az|0)==0){break}if(ag){W=16256;break L21497}ax=c[7118]|0;if(((c[ax>>2]|0)-2|0)>>>0>=2){W=16268;break L21497}as=bh(az|0,44)|0;do{if((as|0)==0){bo=ah}else{if((ca(as+1|0,205104,(v=i,i=i+8|0,c[v>>2]=ax+88,v)|0)|0)!=1){bo=ah;break}a[as]=0;bo=1}}while(0);if((a[az]|0)!=0){do{if((cy(az|0,186120)|0)!=0){uh((c[13898]|0)-1|0,185976,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);uh(-1,185920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);as=cy(az|0,186120)|0;if((as|0)==0){break}else{bp=as}do{a[bp]=45;bp=cy(az|0,186120)|0;}while((bp|0)!=0)}}while(0);a[(c[7118]|0)+86|0]=0;aq=(c[7118]|0)+36|0;uF(aq|0,az|0,50)}uu(az);aG=ak;aH=aj;aI=ai;aJ=bo;aK=1;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K;break L21787}}while(0);if(ah){W=16270;break L21497}aq=is(d)|0;as=c[aq>>2]|0;if((as|0)==1){bq=+(c[aq+8>>2]|0)}else if((as|0)==2){bq=+h[aq+8>>3]}else if((as|0)==3){bq=+uz(c[aq+8>>2]|0,0)}else{W=16275;break L21497}if((c[V>>2]|0)==3){uu(c[U>>2]|0);c[V>>2]=1}g[(c[7118]|0)+88>>2]=bq;aG=ak;aH=aj;aI=ai;aJ=1;aK=ag;aL=af;aM=ae;aN=ad;aO=ac;aP=ab;aQ=aa;aR=$;aS=_;aT=Z;aU=Y;aV=X;aW=M;aX=J;aZ=L;a_=K}}while(0);an=c[13898]|0;aq=c[8272]|0;if((an|0)<(aq|0)){K=a_;L=aZ;J=aX;M=aW;X=aV;Y=aU;Z=aT;_=aS;$=aR;aa=aQ;ab=aP;ac=aO;ad=aN;ae=aM;af=aL;ag=aK;ah=aJ;ai=aI;aj=aH;ak=aG;al=an;am=aq}else{break L21495}}if((W|0)==16352){br=c[3524]|0;bs=br|0;bt=c[bs>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=bt,v)|0)}else if((W|0)==16353){br=c[3524]|0;bs=br|0;bt=c[bs>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=bt,v)|0)}else if((W|0)==16354){bu=c[3524]|0;bv=bu|0;bw=c[bv>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=bw,v)|0)}else if((W|0)==16355){bu=c[3524]|0;bv=bu|0;bw=c[bv>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=bw,v)|0)}else if((W|0)==16356){bx=c[3524]|0;by=bx|0;bz=c[by>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=bz,v)|0)}else if((W|0)==16357){bx=c[3524]|0;by=bx|0;bz=c[by>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=bz,v)|0)}else if((W|0)==16358){bA=c[3524]|0;bB=bA|0;bC=c[bB>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=bC,v)|0)}else if((W|0)==16359){bA=c[3524]|0;bB=bA|0;bC=c[bB>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=bC,v)|0)}else if((W|0)==16367){bD=c[3524]|0;bE=bD|0;bF=c[bE>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=bF,v)|0)}else if((W|0)==16368){bD=c[3524]|0;bE=bD|0;bF=c[bE>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=bF,v)|0)}else if((W|0)==16369){bG=c[3524]|0;bH=bG|0;bI=c[bH>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=bI,v)|0)}else if((W|0)==16370){bG=c[3524]|0;bH=bG|0;bI=c[bH>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=bI,v)|0)}else if((W|0)==16371){bJ=c[3524]|0;bK=bJ|0;bL=c[bK>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=bL,v)|0)}else if((W|0)==16372){bJ=c[3524]|0;bK=bJ|0;bL=c[bK>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=bL,v)|0)}else if((W|0)==16373){bM=c[3524]|0;bN=bM|0;bO=c[bN>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=bO,v)|0)}else if((W|0)==16374){bM=c[3524]|0;bN=bM|0;bO=c[bN>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=bO,v)|0)}else if((W|0)==16375){bP=c[3524]|0;bQ=bP|0;bR=c[bQ>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=bR,v)|0)}else if((W|0)==16376){bP=c[3524]|0;bQ=bP|0;bR=c[bQ>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=bR,v)|0)}else if((W|0)==16377){bS=c[3524]|0;bT=bS|0;bU=c[bT>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=bU,v)|0)}else if((W|0)==16378){bS=c[3524]|0;bT=bS|0;bU=c[bT>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=bU,v)|0)}else if((W|0)==16379){bV=c[3524]|0;bW=bV|0;bX=c[bW>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=bX,v)|0)}else if((W|0)==16380){bV=c[3524]|0;bW=bV|0;bX=c[bW>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=bX,v)|0)}else if((W|0)==16256){uf(c[13898]|0,134056,(v=i,i=i+8|0,c[v>>2]=c[c[3524]>>2],v)|0)}else if((W|0)==16332){bY=c[3524]|0;bZ=bY|0;b_=c[bZ>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=b_,v)|0)}else if((W|0)==16333){bY=c[3524]|0;bZ=bY|0;b_=c[bZ>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=b_,v)|0)}else if((W|0)==16334){b$=c[3524]|0;b0=b$|0;b1=c[b0>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=b1,v)|0)}else if((W|0)==16335){b$=c[3524]|0;b0=b$|0;b1=c[b0>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=b1,v)|0)}else if((W|0)==16336){b2=c[3524]|0;b3=b2|0;b4=c[b3>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=b4,v)|0)}else if((W|0)==16337){b2=c[3524]|0;b3=b2|0;b4=c[b3>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=b4,v)|0)}else if((W|0)==16338){b5=c[3524]|0;b6=b5|0;b7=c[b6>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=b7,v)|0)}else if((W|0)==16339){b5=c[3524]|0;b6=b5|0;b7=c[b6>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=b7,v)|0)}else if((W|0)==16340){b8=c[3524]|0;b9=b8|0;cb=c[b9>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=cb,v)|0)}else if((W|0)==16341){b8=c[3524]|0;b9=b8|0;cb=c[b9>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=cb,v)|0)}else if((W|0)==16342){cc=c[3524]|0;cd=cc|0;ce=c[cd>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=ce,v)|0)}else if((W|0)==16343){cc=c[3524]|0;cd=cc|0;ce=c[cd>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=ce,v)|0)}else if((W|0)==16344){cf=c[3524]|0;cg=cf|0;ch=c[cg>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=ch,v)|0)}else if((W|0)==16345){cf=c[3524]|0;cg=cf|0;ch=c[cg>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=ch,v)|0)}else if((W|0)==16346){ci=c[3524]|0;cj=ci|0;ck=c[cj>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=ck,v)|0)}else if((W|0)==16347){ci=c[3524]|0;cj=ci|0;ck=c[cj>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=ck,v)|0)}else if((W|0)==16348){cl=c[3524]|0;cm=cl|0;cn=c[cm>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=cn,v)|0)}else if((W|0)==16349){cl=c[3524]|0;cm=cl|0;cn=c[cm>>2]|0;uf(al,134056,(v=i,i=i+8|0,c[v>>2]=cn,v)|0)}else if((W|0)==16139){uf(a$,134056,(v=i,i=i+8|0,c[v>>2]=c[c[3524]>>2],v)|0)}else if((W|0)==16112){uf(al,134056,(v=i,i=i+8|0,c[v>>2]=c[c[3524]>>2],v)|0)}else if((W|0)==16115){uf(al,134056,(v=i,i=i+8|0,c[v>>2]=c[c[3524]>>2],v)|0)}else if((W|0)==16091){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((W|0)==16109){uf(al,134056,(v=i,i=i+8|0,c[v>>2]=c[c[3524]>>2],v)|0)}else if((W|0)==16205){uf(al,134056,(v=i,i=i+8|0,c[v>>2]=c[c[3524]>>2],v)|0)}else if((W|0)==16178){uf((c[13898]|0)-1|0,219072,(v=i,i=i+8|0,c[v>>2]=c[a8>>2],v)|0)}else if((W|0)==16275){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((W|0)==16219){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((W|0)==16080){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((W|0)==16019){c[13898]=bn;W=16020}else if((W|0)==16239){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((W|0)==16132){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((W|0)==15992){uf(al,134056,(v=i,i=i+8|0,c[v>>2]=c[c[3524]>>2],v)|0)}else if((W|0)==16086){uf(al,134056,(v=i,i=i+8|0,c[v>>2]=c[c[3524]>>2],v)|0)}else if((W|0)==16121){uf(al,134056,(v=i,i=i+8|0,c[v>>2]=c[c[3524]>>2],v)|0)}else if((W|0)==16214){uf(al,134056,(v=i,i=i+8|0,c[v>>2]=c[c[3524]>>2],v)|0)}else if((W|0)==16072){uf(al,134056,(v=i,i=i+8|0,c[v>>2]=c[c[3524]>>2],v)|0)}else if((W|0)==16268){uf((c[13898]|0)-1|0,185864,(v=i,i=i+16|0,c[v>>2]=c[c[3524]>>2],c[v+8>>2]=185832,v)|0)}else if((W|0)==16270){uf(c[13898]|0,134056,(v=i,i=i+8|0,c[v>>2]=c[c[3524]>>2],v)|0)}else if((W|0)==16075){uf(al,134056,(v=i,i=i+8|0,c[v>>2]=c[c[3524]>>2],v)|0)}else if((W|0)==16058){uf(al,134056,(v=i,i=i+8|0,c[v>>2]=c[c[3524]>>2],v)|0)}else if((W|0)==16055){uf(al,134056,(v=i,i=i+8|0,c[v>>2]=c[c[3524]>>2],v)|0)}else if((W|0)==16069){uf(al,134056,(v=i,i=i+8|0,c[v>>2]=c[c[3524]>>2],v)|0)}else if((W|0)==15987){uf(al,134056,(v=i,i=i+8|0,c[v>>2]=c[c[3524]>>2],v)|0)}else if((W|0)==16243){uf((c[13898]|0)-1|0,186184,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((W|0)==16171){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=186328,v)|0)}else if((W|0)==16022){co=c[13898]|0;uf(co,134392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((W|0)==15990){uf(al,134056,(v=i,i=i+8|0,c[v>>2]=c[c[3524]>>2],v)|0)}else if((W|0)==16174){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=186296,v)|0)}else if((W|0)==16164){c[13898]=a3;W=16165}else if((W|0)==16167){cp=c[13898]|0;uf(cp,217824,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((W|0)==16118){uf(al,134056,(v=i,i=i+8|0,c[v>>2]=c[c[3524]>>2],v)|0)}if((W|0)==16020){c[10956]=0;co=bn;uf(co,134392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((W|0)==16165){c[p>>2]=0;cp=a3;uf(cp,217824,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);cp=c[7118]|0;a3=c[cp>>2]|0;do{if((a3|0)==3){g[7202]=+g[cp+88>>2]}else if((a3|0)==2){g[7202]=+g[cp+88>>2]*2.0}else if((a3|0)==1|(a3|0)==0){bq=+g[cp+88>>2];if(bq>0.0){g[7202]=bq*2.0;break}else{g[7202]=20.0;break}}}while(0);c[(c[3524]|0)+16>>2]=~~(+g[7202]*+g[cp+92>>2]*10.0);cp=c[7118]|0;bq=+g[7202]*+g[cp+92>>2]*10.0;if((a[cp+112|0]&1)==0){c[(c[3524]|0)+20>>2]=~~(bq*6.0/10.0)}else{c[(c[3524]|0)+20>>2]=~~(bq*5.0/10.0)}bq=+g[7202];be(229744,185824,(v=i,i=i+16|0,c[v>>2]=(c[7118]|0)+36,h[v+8>>3]=bq,v)|0);cp=c[7118]|0;a3=c[cp>>2]|0;do{if((a3|0)==3){p=c[cp+32>>2]|0;if((p|0)==0){cq=cp;cr=0;W=16298;break}else{cs=p;ct=0}do{ct=(ct+12|0)+(uA(c[cs+4>>2]|0)|0)|0;cs=c[cs>>2]|0;}while((cs|0)!=0);al=ct+1|0;co=ut(al)|0;do{if((co|0)==0){gk();bn=ut(al)|0;if((bn|0)!=0){cu=bn;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=185800,v)|0)}else{cu=co}}while(0);co=p;al=cu;do{be(al|0,185784,(v=i,i=i+8|0,c[v>>2]=c[co+4>>2],v)|0);al=al+(uA(al|0)|0)|0;co=c[co>>2]|0;}while((co|0)!=0);co=c[7118]|0;cv=cu;cw=co;cx=c[co>>2]|0;W=16297}else{cv=0;cw=cp;cx=a3;W=16297}}while(0);do{if((W|0)==16297){if((cx|0)==3){cq=cw;cr=cv;W=16298;break}else if((cx|0)==2){a[13048]=0;cz=cv;break}else{a3=(a[cw+96|0]&1)!=0?185320:179864;be(13048,199128,(v=i,i=i+16|0,c[v>>2]=(a[cw+97|0]&1)!=0?185408:185368,c[v+8>>2]=a3,v)|0);cz=cv;break}}}while(0);if((W|0)==16298){W=c[cq+12>>2]|0;if((W|0)==0){cA=199032}else{cA=(W|0)==1?78720:78704}W=(c[(c[3524]|0)+68>>2]|0)==86?217456:185688;if((a[cq+28|0]&1)==0){cB=185496}else{cB=(a[cq+29|0]&1)!=0?185600:185528}be(13048,185752,(v=i,i=i+24|0,c[v>>2]=cA,c[v+8>>2]=W,c[v+16>>2]=cB,v)|0);cz=cr}cr=c[7118]|0;cB=(a[cr+17|0]&1)!=0?116440:116408;W=(a[cr+18|0]&1)!=0?185096:185080;cA=(a[cr+19|0]&1)!=0?131504:131584;bq=+g[cr+20>>2];bl=+g[cr+24>>2];cq=(a[cr+30|0]&1)!=0?137776:137232;cv=(a[cr+31|0]&1)!=0?185032:185008;be(s|0,185256,(v=i,i=i+64|0,c[v>>2]=(a[cr+16|0]&1)!=0?185184:185112,c[v+8>>2]=cB,c[v+16>>2]=W,c[v+24>>2]=cA,h[v+32>>3]=bq,h[v+40>>3]=bl,c[v+48>>2]=cq,c[v+56>>2]=cv,v)|0);uC(13048,s|0);cv=c[7118]|0;bl=+h[cv+120>>3];if(bl<0.0){uD(13048+(uA(13048)|0)|0,184912,19);cC=cv}else{cq=~~(bl*255.0);cA=~~(+h[cv+128>>3]*255.0);W=~~(+h[cv+136>>3]*255.0);be(s|0,184960,(v=i,i=i+24|0,c[v>>2]=cq,c[v+8>>2]=cA,c[v+16>>2]=W,v)|0);uC(13048,s|0);cC=c[7118]|0}bl=+h[cC+104>>3];be(s|0,184848,(v=i,i=i+16|0,c[v>>2]=c[cC+100>>2],h[v+8>>3]=bl,v)|0);uC(13048,s|0);cC=c[7118]|0;W=c[cC>>2]|0;if(W>>>0<2){cA=(a[cC+97|0]&1)!=0?185408:185368;cq=(a[cC+96|0]&1)!=0?184832:184816;be(s|0,184840,(v=i,i=i+16|0,c[v>>2]=cA,c[v+8>>2]=cq,v)|0);uC(13048,s|0);cq=c[7118]|0;cD=cq;cE=c[cq>>2]|0}else{cD=cC;cE=W}if((cE|0)==2){cE=(a[cD+113|0]&1)!=0?133784:133640;be(s|0,73368,(v=i,i=i+8|0,c[v>>2]=cE,v)|0);cE=c[10956]|0;if((cE|0)==0){uD(s|0,184720,10)}else{be(s|0,184800,(v=i,i=i+8|0,c[v>>2]=cE,v)|0)}uC(13048,s|0)}do{if((c[11252]|0)==15){cE=c[7118]|0;if((c[cE>>2]|0)!=3){break}cD=(a[cE+114|0]&1)!=0?179864:136208;be(s|0,184664,(v=i,i=i+8|0,c[v>>2]=cD,v)|0);uC(13048,s|0)}}while(0);if(a[28824]|0){cD=c[3524]|0;bl=+((c[cD+8>>2]|0)>>>0>>>0);if((c[7204]|0)==2){bq=bl*2.54/720.0;bj=+((c[cD+12>>2]|0)>>>0>>>0)*2.54/720.0;be(s|0,90672,(v=i,i=i+16|0,h[v>>3]=bq,h[v+8>>3]=bj,v)|0)}else{bj=bl/720.0;bl=+((c[cD+12>>2]|0)>>>0>>>0)/720.0;be(s|0,90632,(v=i,i=i+16|0,h[v>>3]=bj,h[v+8>>3]=bl,v)|0)}uC(13048,s|0)}cD=c[7118]|0;cE=c[cD>>2]|0;do{if((cE|0)==3){W=cD+36|0;bl=+g[cD+88>>2];cC=(cz|0)!=0?cz:179864;be(s|0,184608,(v=i,i=i+24|0,c[v>>2]=W,h[v+8>>3]=bl,c[v+16>>2]=cC,v)|0)}else if((cE|0)==2){bl=+g[cD+88>>2];be(s|0,184552,(v=i,i=i+16|0,c[v>>2]=cD+36,h[v+8>>3]=bl,v)|0)}else{bl=+g[cD+88>>2];if(bl!=0.0){bj=bl;be(s|0,184536,(v=i,i=i+8|0,h[v>>3]=bj,v)|0);break}else{a[s]=0;break}}}while(0);if((cz|0)==0){cF=uC(13048,s|0)|0;cG=c[7118]|0;cH=cG+92|0;cI=+g[cH>>2];cJ=cI;cK=be(s|0,184512,(v=i,i=i+8|0,h[v>>3]=cJ,v)|0)|0;cL=uC(13048,s|0)|0;i=b;return}uu(cz);cF=uC(13048,s|0)|0;cG=c[7118]|0;cH=cG+92|0;cI=+g[cH>>2];cJ=cI;cK=be(s|0,184512,(v=i,i=i+8|0,h[v>>3]=cJ,v)|0)|0;cL=uC(13048,s|0)|0;i=b;return}function pA(){var b=0,d=0,e=0,f=0,j=0,k=0,l=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,x=0.0,y=0.0,z=0.0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,aA=0;b=i;i=i+4400|0;d=b|0;e=b+8|0;f=b+40|0;j=b+296|0;k=b+304|0;l=c[(c[7118]|0)+12>>2]|0;if((l|0)==1){if(!(a[28824]|0)){c[(c[3524]|0)+8>>2]=5040;c[(c[3524]|0)+12>>2]=7200}n=c[3524]|0;o=+((c[n+8>>2]|0)>>>0>>>0);p=+g[184];q=o*(p+ +g[178])/10.0;r=+((c[n+12>>2]|0)>>>0>>>0);s=+g[44];t=r*(s+ +g[38])/10.0;h[n+176>>3]=10.0;u=t;x=q;y=r*s/10.0;z=o*p/10.0}else if((l|0)==0){do{if(a[28824]|0){c[(c[3524]|0)+8>>2]=c[10962];c[(c[3524]|0)+12>>2]=c[10960]}else{c[(c[3524]|0)+8>>2]=7200;n=(c[3524]|0)+12|0;if((a[(c[7118]|0)+112|0]&1)==0){c[n>>2]=5040;break}else{c[n>>2]=4320;break}}}while(0);n=c[3524]|0;p=+((c[n+8>>2]|0)>>>0>>>0);o=+g[184];s=p*(o+ +g[178])/20.0;r=+((c[n+12>>2]|0)>>>0>>>0);q=+g[44];t=r*(q+ +g[38])/20.0;h[n+176>>3]=20.0;u=t;x=s;y=r*q/20.0;z=p*o/20.0}else if((l|0)==2){if(!(a[28824]|0)){c[(c[3524]|0)+8>>2]=7200;c[(c[3524]|0)+12>>2]=5040}l=c[3524]|0;o=+((c[l+8>>2]|0)>>>0>>>0);p=+g[184];q=o*(p+ +g[178])/10.0;r=+((c[l+12>>2]|0)>>>0>>>0);s=+g[44];t=r*(1.0- +g[38]-s)/10.0;h[l+176>>3]=10.0;u=q;x=r*(1.0-s)/10.0;y=o*p/10.0;z=t}else{uf(-1,199080,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}l=~~u;n=~~x;A=~~y;B=~~z;uB(28840,(c[7118]|0)+36|0);g[7208]=+g[7202];C=c[7118]|0;D=c[C>>2]|0;do{if((D|0)==2){E=k|0;F=c[8244]|0;if((F|0)==0){break}G=uA(F|0)|0;H=G-4|0;if((bh(F|0,46)|0)!=(F+H|0)){uf(-1,187368,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}F=G+5|0;G=ut(F)|0;do{if((G|0)==0){gk();I=ut(F)|0;if((I|0)!=0){J=I;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=187344,v)|0)}else{J=G}}while(0);G=c[8244]|0;uB(J|0,G|0);G=(c[8244]|0)+H|0;do{if((a_(G|0,187336,4)|0)==0){K=16417}else{if((a_(G|0,187312,4)|0)==0){K=16417;break}if((a[(c[7118]|0)+113|0]&1)==0){be(E|0,186952,(v=i,i=i+8|0,c[v>>2]=199032,v)|0)}else{be(E|0,186960,(v=i,i=i+8|0,c[v>>2]=199032,v)|0)}F=J+H|0;I=(uA(E|0)|0)+1|0;uF(F|0,E|0,I|0);I=bF(J|0,134520)|0;c[10028]=I;L=I}}while(0);do{if((K|0)==16417){if((a[(c[7118]|0)+113|0]&1)!=0){uf(-1,187264,(v=i,i=i+8|0,c[v>>2]=187208,v)|0)}E=G;w=2019914798;a[E]=w&255;w=w>>8;a[E+1|0]=w&255;w=w>>8;a[E+2|0]=w&255;w=w>>8;a[E+3|0]=w&255;c[10028]=c[10030];c[10030]=bF(c[8244]|0,137896)|0;uh(-1,187016,(v=i,i=i+16|0,c[v>>2]=c[8244],c[v+8>>2]=J,v)|0);if((c[10030]|0)==0){uf(-1,186984,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{L=c[10028]|0;break}}}while(0);if((L|0)==0){uf(-1,186896,(v=i,i=i+8|0,c[v>>2]=J,v)|0)}G=(uA(J|0)|0)-3|0;E=ut(G)|0;do{if((E|0)==0){gk();H=ut(G)|0;if((H|0)!=0){M=H;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=186872,v)|0)}else{M=E}}while(0);c[7112]=M;E=(uA(J|0)|0)-4|0;uF(M|0,J|0,E|0);E=(uA(J|0)|0)-4|0;a[(c[7112]|0)+E|0]=0;uu(J)}else if((D|0)==3){c[10028]=c[10030]}else{E=c[8244]|0;if((E|0)==0){if((a[C+96|0]&1)!=0){G=c[m>>2]|0;aI(186464,61,1,G|0);a[(c[7118]|0)+96|0]=0}c[10028]=c[10030];break}G=bh(E|0,46)|0;if((G|0)==0){N=a8(E|0,0)|0}else{N=G}if((a[C+96|0]&1)==0){c[10028]=c[10030];break}G=N;H=db(c[7112]|0,(5-E|0)+G|0,186784)|0;c[7112]=H;if((H|0)==0){E=c[m>>2]|0;I=c[8244]|0;cf(E|0,186600,(v=i,i=i+8|0,c[v>>2]=I,v)|0);I=c[m>>2]|0;aI(186560,27,1,I|0);a[(c[7118]|0)+96|0]=0;c[10028]=c[10030];break}I=c[8244]|0;uF(H|0,I|0,(G+1|0)-I|0);I=(c[7112]|0)+(G-(c[8244]|0)|0)|0;w=7565358;a[I]=w&255;w=w>>8;a[I+1|0]=w&255;w=w>>8;a[I+2|0]=w&255;w=w>>8;a[I+3|0]=w&255;I=bF(c[7112]|0,137896)|0;c[10028]=I;if((I|0)!=0){break}cf(c[m>>2]|0,186696,(v=i,i=i+8|0,c[v>>2]=c[7112],v)|0);uu(c[7112]|0);c[7112]=0;a[(c[7118]|0)+96|0]=0;c[10028]=c[10030]}}while(0);N=c[7118]|0;C=(c[N>>2]|0)==3;D=c[N+4>>2]|0;J=c[N+8>>2]|0;N=c[3524]|0;M=(c[N+68>>2]|0)==86;L=M?238344:0;a[28912]=C&1;c[7226]=D;c[7224]=J;c[7120]=0;cG(j|0);k=bg(aN(j|0)|0)|0;a[k+((uA(k|0)|0)-1|0)|0]=0;j=c[c[7118]>>2]|0;do{if((j|0)==2){do{if((c[10030]|0)==0){I=(uA(c[8244]|0)|0)+1|0;G=ut(I)|0;do{if((G|0)==0){gk();H=ut(I)|0;if((H|0)!=0){O=H;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=129080,v)|0)}else{O=G}}while(0);G=c[8244]|0;uB(O|0,G|0);lj(O);G=c[8244]|0;if((O|0)==(G|0)|(O|0)==0){P=G;break}uu(O);K=16439}else{K=16439}}while(0);if((K|0)==16439){P=c[8244]|0}if((P|0)==0){uj(c[13898]|0,193824,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}G=c[10030]|0;if((G|0)==0){Q=0;R=0;S=0}else{cf(G|0,193768,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);G=c[11252]|0;if((G|0)==1){T=193704}else if((G|0)==2){T=193640}else if((G|0)==3){T=193624}else if((G|0)==4){T=193616}else if((G|0)==5){T=193560}else if((G|0)==6){T=96912}else if((G|0)==7){T=90808}else if((G|0)==9){T=75288}else if((G|0)==10){T=222760}else if((G|0)==12){T=193552}else if((G|0)==13){T=193480}else if((G|0)==16){uf(-1,193408,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{T=0}c[1402]=-1;c[10882]=0;G=(c[7118]|0)+36|0;do{if((a[G]|0)==0){U=0;V=0;W=0}else{if((aY(G|0,126024)|0)==0){U=0;V=0;W=0;break}I=(uA(G|0)|0)+1|0;H=ut(I)|0;do{if((H|0)==0){gk();E=ut(I)|0;if((E|0)!=0){X=E;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=193376,v)|0)}else{X=H}}while(0);H=(uA((c[7118]|0)+36|0)|0)+1|0;I=ut(H)|0;do{if((I|0)==0){gk();E=ut(H)|0;if((E|0)!=0){Y=E;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=193376,v)|0)}else{Y=I}}while(0);I=(uA((c[7118]|0)+36|0)|0)+1|0;H=ut(I)|0;do{if((H|0)==0){gk();E=ut(I)|0;if((E|0)!=0){Z=E;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=193376,v)|0)}else{Z=H}}while(0);H=(c[7118]|0)+36|0;uB(X|0,H|0);a[Y]=0;a[Z]=0;H=a8(X|0,44)|0;if((H|0)==0){U=Z;V=Y;W=X;break}a[H]=0;I=H+1|0;uB(Y|0,I|0);I=a8(Y|0,44)|0;if((I|0)==0){U=Z;V=Y;W=X;break}a[I]=0;H=I+1|0;uB(Z|0,H|0);U=Z;V=Y;W=X}}while(0);G=c[7118]|0;if((a[G+113|0]&1)!=0){H=c[10030]|0;z=+g[G+88>>2];G=~~(z+-10.0);I=~~z;cf(H|0,192864,(v=i,i=i+24|0,c[v>>2]=G,c[v+8>>2]=I,c[v+16>>2]=I,v)|0);do{if((W|0)!=0){if((a[W]|0)==0){break}I=c[10030]|0;cf(I|0,192816,(v=i,i=i+8|0,c[v>>2]=W,v)|0)}}while(0);do{if((V|0)!=0){if((a[V]|0)==0){break}I=c[10030]|0;cf(I|0,192784,(v=i,i=i+8|0,c[v>>2]=V,v)|0)}}while(0);do{if((U|0)!=0){if((a[U]|0)==0){break}I=c[10030]|0;cf(I|0,192752,(v=i,i=i+8|0,c[v>>2]=U,v)|0)}}while(0);I=c[10030]|0;aI(192648,57,1,I|0);if((T|0)!=0){I=c[10030]|0;cf(I|0,192544,(v=i,i=i+8|0,c[v>>2]=T,v)|0)}I=c[10030]|0;G=c[3524]|0;z=+((c[G+8>>2]|0)>>>0>>>0)*+g[178]/20.0;y=+((c[G+12>>2]|0)>>>0>>>0)*+g[38]/20.0;G=c[10956]|0;H=(G|0)!=0?G:191528;cf(I|0,191600,(v=i,i=i+40|0,h[v>>3]=z,h[v+8>>3]=y,h[v+16>>3]=z,h[v+24>>3]=y,c[v+32>>2]=H,v)|0)}H=c[10030]|0;aI(191384,12,1,H|0);if((T|0)!=0){H=c[10030]|0;cf(H|0,191184,(v=i,i=i+16|0,c[v>>2]=T,c[v+8>>2]=T,v)|0)}do{if((a[(c[7118]|0)+113|0]&1)==0){H=(W|0)!=0;do{if(H){if((a[W]|0)==0){break}I=c[10030]|0;cf(I|0,191152,(v=i,i=i+8|0,c[v>>2]=W,v)|0)}}while(0);I=(V|0)!=0;do{if(I){if((a[V]|0)==0){break}G=c[10030]|0;cf(G|0,191104,(v=i,i=i+8|0,c[v>>2]=V,v)|0)}}while(0);do{if((U|0)==0){if(H|I){K=16496}}else{if((a[U]|0)==0){K=16496;break}G=c[10030]|0;cf(G|0,191080,(v=i,i=i+8|0,c[v>>2]=U,v)|0);K=16496}}while(0);if((K|0)==16496){I=c[10030]|0;aI(191064,14,1,I|0)}I=c[10956]|0;if((I|0)==0){break}H=c[10030]|0;cf(H|0,154696,(v=i,i=i+8|0,c[v>>2]=I,v)|0)}}while(0);I=c[10030]|0;H=c[7118]|0;G=(a[H+17|0]&1)!=0?225e3:224992;E=(a[H+18|0]&1)!=0?225e3:224992;cf(I|0,189944,(v=i,i=i+16|0,c[v>>2]=G,c[v+8>>2]=E,v)|0);E=c[10030]|0;aI(189536,396,1,E|0);E=c[10030]|0;if((a[(c[7118]|0)+112|0]&1)==0){aI(188600,593,1,E|0)}else{aI(189272,260,1,E|0)}E=c[10030]|0;aI(187688,837,1,E|0);E=c[10030]|0;G=c[3524]|0;y=+((c[G+8>>2]|0)>>>0>>>0)*+g[178];z=+((c[G+12>>2]|0)>>>0>>>0)*+g[38];cf(E|0,187608,(v=i,i=i+24|0,h[v>>3]=.05,h[v+8>>3]=y,h[v+16>>3]=z,v)|0);Q=U;R=V;S=W}E=c[7118]|0;z=+h[E+120>>3];if(z>=0.0){G=c[10030]|0;y=+h[E+128>>3];x=+h[E+136>>3];cf(G|0,187528,(v=i,i=i+24|0,h[v>>3]=z,h[v+8>>3]=y,h[v+16>>3]=x,v)|0);G=c[10030]|0;E=c[3524]|0;x=+((c[E+8>>2]|0)>>>0>>>0)*+g[178];y=+((c[E+12>>2]|0)>>>0>>>0)*+g[38];cf(G|0,187432,(v=i,i=i+16|0,h[v>>3]=x,h[v+8>>3]=y,v)|0)}if((S|0)!=0){uu(S)}if((R|0)!=0){uu(R)}if((Q|0)==0){break}uu(Q)}else if((j|0)==1){cf(c[10030]|0,195248,(v=i,i=i+8|0,h[v>>3]=.05,v)|0);G=c[3524]|0;E=~~(+g[38]*+((c[G+12>>2]|0)>>>0>>>0));cf(c[10030]|0,195216,(v=i,i=i+16|0,c[v>>2]=~~(+g[178]*+((c[G+8>>2]|0)>>>0>>>0)),c[v+8>>2]=E,v)|0);K=16513}else if((j|0)==0){cf(c[10030]|0,194104,(v=i,i=i+8|0,h[v>>3]=.05,v)|0);E=c[3524]|0;G=~~(+g[38]*+((c[E+12>>2]|0)>>>0>>>0));cf(c[10030]|0,194064,(v=i,i=i+16|0,c[v>>2]=~~(+g[178]*+((c[E+8>>2]|0)>>>0>>>0)),c[v+8>>2]=G,v)|0);K=16513}}while(0);if((K|0)==16513){j=c[10028]|0;Q=c[10030]|0;if((j|0)==(Q|0)){aI(193952,21,1,j|0)}else{j=c[3524]|0;R=~~(+g[178]*+((c[j+8>>2]|0)>>>0>>>0)/20.0+.5);S=~~(+g[38]*+((c[j+12>>2]|0)>>>0>>>0)/20.0+.5);j=c[7112]|0;W=bh(j|0,47)|0;V=(W|0)==0?j:W+1|0;W=R*10&-1;cf(Q|0,194008,(v=i,i=i+32|0,c[v>>2]=V,c[v+8>>2]=R,c[v+16>>2]=S,c[v+24>>2]=W,v)|0)}c[7036]=0}W=c[10028]|0;if((c[(c[7118]|0)+12>>2]|0)==0){aI(198992,24,1,W|0)}else{aI(198968,15,1,W|0)}W=c[8244]|0;if((W|0)!=0){S=c[10028]|0;cf(S|0,198936,(v=i,i=i+8|0,c[v>>2]=W,v)|0)}cf(c[10028]|0,230952,(v=i,i=i+32|0,c[v>>2]=40152,c[v+8>>2]=40160,c[v+16>>2]=k,c[v+24>>2]=C?198928:179864,v)|0);W=D+B|0;B=J+A|0;A=D+n|0;n=J+l|0;cf(c[10028]|0,198896,(v=i,i=i+32|0,c[v>>2]=W,c[v+8>>2]=B,c[v+16>>2]=A,c[v+24>>2]=n,v)|0);l=c[7118]|0;do{if((c[l>>2]|0)==3){J=c[l+12>>2]|0;if((J|0)==0){_=l;break}D=c[10028]|0;S=(J|0)==2?198832:198816;cf(D|0,198872,(v=i,i=i+8|0,c[v>>2]=S,v)|0);_=c[7118]|0}else{_=l}}while(0);if((c[_+12>>2]|0)==0){$=_;aa=224992}else{_=c[10028]|0;aI(198792,17,1,_|0);_=c[7118]|0;$=_;aa=(c[_+12>>2]|0)==2?225e3:224992}_=(a[$+18|0]&1)!=0?225e3:224992;l=(a[$+19|0]&1)!=0?225e3:224992;y=+g[$+20>>2];S=(a[$+16|0]&1)!=0?225e3:224992;D=(a[$+30|0]&1)!=0?225e3:224992;J=(a[$+31|0]&1)!=0?225e3:224992;x=+g[$+24>>2]*5.0;z=+h[$+120>>3];u=+h[$+128>>3];t=+h[$+136>>3];R=(c[N+16>>2]|0)/-3&-1;cf(c[10028]|0,230144,(v=i,i=i+136|0,c[v>>2]=(a[$+17|0]&1)!=0?225e3:224992,c[v+8>>2]=_,c[v+16>>2]=l,h[v+24>>3]=y,c[v+32>>2]=aa,c[v+40>>2]=S,c[v+48>>2]=D,c[v+56>>2]=J,h[v+64>>3]=x,h[v+72>>3]=z,h[v+80>>3]=u,h[v+88>>3]=t,c[v+96>>2]=R,h[v+104>>3]=10.0,h[v+112>>3]=10.0,h[v+120>>3]=31.5,h[v+128>>3]=31.5,v)|0);cf(c[10028]|0,198632,(v=i,i=i+64|0,c[v>>2]=W,c[v+8>>2]=B,c[v+16>>2]=A,c[v+24>>2]=B,c[v+32>>2]=A,c[v+40>>2]=n,c[v+48>>2]=W,c[v+56>>2]=n,v)|0);n=f|0;f=tE(198600)|0;if((f|0)!=0){if((a6(n|0,256,f|0)|0)!=0){do{aK(n|0,c[10028]|0);}while((a6(n|0,256,f|0)|0)!=0)}az(f|0)}do{if(C){f=c[11252]|0;if((f|0)==12){W=tE(198296)|0;if((W|0)==0){break}if((a6(n|0,256,W|0)|0)!=0){do{aK(n|0,c[10028]|0);}while((a6(n|0,256,W|0)|0)!=0)}az(W|0);break}else if((f|0)==9){A=tE(198384)|0;if((A|0)==0){break}if((a6(n|0,256,A|0)|0)!=0){do{aK(n|0,c[10028]|0);}while((a6(n|0,256,A|0)|0)!=0)}az(A|0);break}else if((f|0)==15){W=tE(198232)|0;if((W|0)!=0){if((a6(n|0,256,W|0)|0)!=0){do{aK(n|0,c[10028]|0);}while((a6(n|0,256,W|0)|0)!=0)}az(W|0)}if((c[18090]|0)!=0){break}A=e|0;c[d>>2]=0;B=tE(195944)|0;if((B|0)==0){break}if((a6(n|0,256,B|0)|0)!=0){do{R=a[n]|0;do{if(!((R<<24>>24|0)==35|(R<<24>>24|0)==10)){J=aE(n|0,d|0,16)|0;if(J>>>0>255){if((a[(c[7118]|0)+114|0]&1)==0){break}}D=(c[d>>2]|0)+1|0;c[d>>2]=D;S=(a8(D|0,59)|0)-D|0;uF(A|0,D|0,S|0);a[e+S|0]=0;S=c[18088]|0;if(((c[18086]|0)+8|0)>>>0>S>>>0){D=S+2048|0;c[18088]=D;S=db(c[18090]|0,D,195936)|0;c[18090]=S;ab=S}else{ab=c[18090]|0}c[ab+(c[7114]<<3)>>2]=J;J=bP(A|0)|0;c[(c[18090]|0)+(c[7114]<<3)+4>>2]=J;c[18086]=(c[18086]|0)+8;c[7114]=(c[7114]|0)+1}}while(0);}while((a6(n|0,256,B|0)|0)!=0)}az(B|0);break}else if((f|0)==10){A=tE(198328)|0;if((A|0)==0){break}if((a6(n|0,256,A|0)|0)!=0){do{aK(n|0,c[10028]|0);}while((a6(n|0,256,A|0)|0)!=0)}az(A|0);break}else if((f|0)==1){B=tE(198552)|0;if((B|0)==0){break}if((a6(n|0,256,B|0)|0)!=0){do{aK(n|0,c[10028]|0);}while((a6(n|0,256,B|0)|0)!=0)}az(B|0);break}else if((f|0)==2){A=tE(198488)|0;if((A|0)==0){break}if((a6(n|0,256,A|0)|0)!=0){do{aK(n|0,c[10028]|0);}while((a6(n|0,256,A|0)|0)!=0)}az(A|0);break}else if((f|0)==11|(f|0)==3){B=tE(198472)|0;if((B|0)==0){break}if((a6(n|0,256,B|0)|0)!=0){do{aK(n|0,c[10028]|0);}while((a6(n|0,256,B|0)|0)!=0)}az(B|0);break}else if((f|0)==4){A=tE(198456)|0;if((A|0)==0){break}if((a6(n|0,256,A|0)|0)!=0){do{aK(n|0,c[10028]|0);}while((a6(n|0,256,A|0)|0)!=0)}az(A|0);break}else if((f|0)==5){B=tE(198440)|0;if((B|0)==0){break}if((a6(n|0,256,B|0)|0)!=0){do{aK(n|0,c[10028]|0);}while((a6(n|0,256,B|0)|0)!=0)}az(B|0);break}else if((f|0)==6){A=tE(198424)|0;if((A|0)==0){break}if((a6(n|0,256,A|0)|0)!=0){do{aK(n|0,c[10028]|0);}while((a6(n|0,256,A|0)|0)!=0)}az(A|0);break}else if((f|0)==7){B=tE(198408)|0;if((B|0)==0){break}if((a6(n|0,256,B|0)|0)!=0){do{aK(n|0,c[10028]|0);}while((a6(n|0,256,B|0)|0)!=0)}az(B|0);break}else if((f|0)==13){A=tE(198272)|0;if((A|0)==0){break}if((a6(n|0,256,A|0)|0)!=0){do{aK(n|0,c[10028]|0);}while((a6(n|0,256,A|0)|0)!=0)}az(A|0);break}else{break}}}while(0);n=c[7118]|0;do{if((c[n>>2]|0)==2){if((a[n+112|0]&1)==0){ac=n;break}ab=c[10028]|0;aI(196392,51,1,ab|0);ab=c[10028]|0;aI(196344,29,1,ab|0);ab=c[10028]|0;aI(196312,28,1,ab|0);ab=c[10028]|0;aI(196216,66,1,ab|0);ab=c[10028]|0;aI(196136,28,1,ab|0);ab=c[10028]|0;aI(196080,39,1,ab|0);ab=c[10028]|0;aI(196032,39,1,ab|0);ab=c[10028]|0;aI(195960,53,1,ab|0);ac=c[7118]|0}else{ac=n}}while(0);if((a[ac+28|0]&1)!=0){n=c[10028]|0;ab=(a[ac+29|0]&1)!=0?225e3:224992;cf(n|0,198176,(v=i,i=i+8|0,c[v>>2]=ab,v)|0)}do{if(M){ab=c[L>>2]|0;if((ab|0)==0){break}else{ad=L;ae=ab}do{ad=ad+4|0;aK(ae|0,c[10028]|0);ae=c[ad>>2]|0;}while((ae|0)!=0)}}while(0);if(C){C=c[7118]|0;ae=c[C+32>>2]|0;if((ae|0)==0){af=C}else{C=ae;do{tD(C,1);ae=c[C+12>>2]|0;if((ae|0)!=0){tz(ae)}C=c[C>>2]|0;}while((C|0)!=0);af=c[7118]|0}tz(af+36|0)}af=bU(131496)|0;if((af|0)==0){C=bU(130312)|0;if((C|0)==0){ag=0;ah=0;ai=1}else{aj=C;K=16610}}else{aj=af;K=16610}do{if((K|0)==16610){af=bP(aj|0)|0;if((af|0)==0){ag=0;ah=0;ai=1;break}if((a[af]|0)==0){ag=0;ah=af;ai=0;break}C=uA(af|0)<<1|1;ae=ut(C)|0;do{if((ae|0)==0){gk();ad=ut(C)|0;if((ad|0)!=0){ak=ad;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=197984,v)|0)}else{ak=ae}}while(0);ae=a[af]|0;if(ae<<24>>24==0){al=ak}else{C=af;ad=ak;L=ae;while(1){if((aZ(198168,L<<24>>24|0,4)|0)==0){am=ad;an=L}else{a[ad]=92;am=ad+1|0;an=a[C]|0}ae=C+1|0;M=am+1|0;a[am]=an;A=a[ae]|0;if(A<<24>>24==0){al=M;break}else{C=ae;ad=M;L=A}}}a[al]=0;ag=ak;ah=af;ai=0}}while(0);ak=c[8244]|0;do{if((ak|0)==0){ao=0}else{if((a[ak]|0)==0){ao=0;break}al=uA(ak|0)<<1|1;an=ut(al)|0;do{if((an|0)==0){gk();am=ut(al)|0;if((am|0)!=0){ap=am;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=197984,v)|0)}else{ap=an}}while(0);an=a[ak]|0;if(an<<24>>24==0){aq=ap}else{al=ak;af=ap;am=an;while(1){if((aZ(198168,am<<24>>24|0,4)|0)==0){ar=af;as=am}else{a[af]=92;ar=af+1|0;as=a[al]|0}an=al+1|0;aj=ar+1|0;a[ar]=as;K=a[an]|0;if(K<<24>>24==0){aq=aj;break}else{al=an;af=aj;am=K}}}a[aq]=0;ao=ap}}while(0);ap=(ao|0)!=0;aq=(ag|0)!=0;cf(c[10028]|0,229800,(v=i,i=i+40|0,c[v>>2]=ap?ao:179864,c[v+8>>2]=40152,c[v+16>>2]=40160,c[v+24>>2]=aq?ag:179864,c[v+32>>2]=k,v)|0);if(!ai){uu(ah)}if(aq){uu(ag)}if(!ap){at=c[10028]|0;au=aI(198144,16,1,at|0)|0;av=c[3524]|0;aw=av+68|0;ax=c[aw>>2]|0;ay=(ax|0)==86;aA=ay?2:1;c[59584]=aA;i=b;return}uu(ao);at=c[10028]|0;au=aI(198144,16,1,at|0)|0;av=c[3524]|0;aw=av+68|0;ax=c[aw>>2]|0;ay=(ax|0)==86;aA=ay?2:1;c[59584]=aA;i=b;return}function pB(a){a=a|0;c[7230]=a;return 1}function pC(a){a=a|0;c[7198]=a;return 1}function pD(){var b=0,d=0,e=0;b=i;aI(199192,10,1,c[10028]|0);do{if((a[28912]&1)!=0){d=c[10028]|0;aI(199160,17,1,d|0);d=c[57760]|0;if((d|0)==0){break}else{e=d}while(1){d=c[e+4>>2]|0;cf(c[10028]|0,199128,(v=i,i=i+16|0,c[v>>2]=c[e>>2],c[v+8>>2]=(d|0)!=0?73808:140136,v)|0);uu(c[c[57760]>>2]|0);uu(c[57760]|0);c[57760]=d;if((d|0)==0){break}else{e=d}}}}while(0);if((c[(c[7118]|0)+12>>2]|0)==0){i=b;return}cf(c[10028]|0,199112,(v=i,i=i+8|0,c[v>>2]=c[7120],v)|0);i=b;return}function pE(){c[7116]=0;aI(199208,29,1,c[10028]|0);return}function pF(){var b=0,d=0,e=0,f=0,j=0,k=0.0,l=0.0;b=i;d=c[3524]|0;e=(c[7120]|0)+1|0;c[7120]=e;cf(c[10028]|0,202176,(v=i,i=i+16|0,c[v>>2]=e,c[v+8>>2]=e,v)|0);if((c[(c[3524]|0)+68>>2]|0)==86&(c[59584]|0)==1){e=c[59586]|0;if((e|0)!=0){f=238344;j=e;do{f=f+4|0;aK(j|0,c[10028]|0);j=c[f>>2]|0;}while((j|0)!=0)}j=c[m>>2]|0;aI(202120,53,1,j|0);c[59584]=2}j=c[7224]|0;k=((c[(c[7118]|0)+12>>2]|0)==0?.5:1.0)/10.0;cf(c[10028]|0,202048,(v=i,i=i+32|0,c[v>>2]=c[7226],c[v+8>>2]=j,h[v+16>>3]=k,h[v+24>>3]=k,v)|0);if((c[(c[7118]|0)+12>>2]|0)==2){j=c[10028]|0;f=-(c[(c[3524]|0)+12>>2]|0)|0;cf(j|0,202016,(v=i,i=i+8|0,c[v>>2]=f,v)|0)}aI(201976,18,1,c[10028]|0);if((a[28912]&1)!=0){f=c[10028]|0;j=(c[7118]|0)+36|0;e=c[d+16>>2]|0;cf(f|0,201872,(v=i,i=i+16|0,c[v>>2]=j,c[v+8>>2]=e,v)|0)}c[7116]=0;a[228944]=0;c[57326]=-4e3;c[57328]=-4e3;c[57234]=0;c[57432]=-5;h[28715]=-5.0;h[28714]=-5.0;g[7200]=-1.0;if((c[c[7118]>>2]|0)==2){i=b;return}aI(201808,56,1,c[10028]|0);e=c[10028]|0;if((c[(c[7118]|0)+12>>2]|0)==0){j=c[3524]|0;k=+((c[j+8>>2]|0)>>>0>>>0)*+g[178];l=+((c[j+12>>2]|0)>>>0>>>0)*+g[38];cf(e|0,201752,(v=i,i=i+16|0,h[v>>3]=k,h[v+8>>3]=l,v)|0)}else{aI(201632,46,1,e|0)}aI(201616,5,1,c[10028]|0);i=b;return}function pG(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;i=i+64|0;f=e|0;g=e+32|0;h=c[57328]|0;j=b-h|0;k=c[57326]|0;l=d-k|0;do{if((h|0)==(b|0)&(k|0)==(d|0)){if(!(a[228944]|0)){break}i=e;return}}while(0);k=f|0;be(k|0,202376|0,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=d,v)|0);f=g|0;be(f|0,202240|0,(v=i,i=i+16|0,c[v>>2]=j,c[v+8>>2]=l,v)|0);L22391:do{if(a[229704]|0){l=c[10028]|0;cf(l|0,202208|0,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=d,v)|0);a[229704]=0}else{l=uA(f|0)|0;do{if(l>>>0<(uA(k|0)|0)>>>0){if(!(a[228944]|0)){break}j=c[10028]|0;aK(f|0,j|0);c[57234]=(c[57234]|0)+1;break L22391}}while(0);l=c[10028]|0;aK(k|0,l|0)}}while(0);a[228944]=1;c[7116]=(c[7116]|0)+1;c[57328]=b;c[57326]=d;i=e;return}function pH(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;i=i+64|0;f=c[57328]|0;g=c[57326]|0;if((f|0)==(b|0)&(g|0)==(d|0)){i=e;return}h=e|0;be(h|0,202608,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=d,v)|0);j=e+32|0;be(j|0,202560,(v=i,i=i+16|0,c[v>>2]=b-f,c[v+8>>2]=d-g,v)|0);if(!(a[228944]|0)){pG(c[57328]|0,c[57326]|0)}g=uA(j|0)|0;f=g>>>0<(uA(h|0)|0)>>>0;g=c[10028]|0;do{if(f){aK(j|0,g|0);c[57234]=(c[57234]|0)+1;k=(c[7116]|0)+1|0;c[7116]=k;if((k|0)<=104){break}k=c[10028]|0;cf(k|0,202480,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=d,v)|0);c[7116]=1}else{aK(h|0,g|0);c[7116]=1}}while(0);a[228944]=1;c[57328]=b;c[57326]=d;i=e;return}function pI(b){b=b|0;var d=0,e=0,f=0,g=0;d=i;e=c[7118]|0;do{if((c[e>>2]|0)==2){if((a[e+112|0]&1)==0){f=16692;break}g=(b|0)%4&-1}else{f=16692}}while(0);if((f|0)==16692){g=(b|0)%9&-1}b=g+3|0;g=(b|0)<0?0:b;if((c[57432]|0)==(g|0)){i=d;return}a[228944]=0;if((c[7116]|0)!=0){b=c[10028]|0;aI(215952,7,1,b|0);c[7116]=0;a[228944]=0}c[57432]=g;h[28714]=+h[28715];cf(c[10028]|0,202624,(v=i,i=i+8|0,c[v>>2]=a[g+93672|0]|0,v)|0);c[7116]=0;i=d;return}function pJ(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;g=c[7118]|0;do{if((c[g>>2]|0)==2){if((a[g+112|0]&1)==0){break}if((e|0)<0){h=0}else{h=(e&7)+1|0}j=c[10028]|0;k=c[228960+(h<<2)>>2]|0;cf(j|0,202896,(v=i,i=i+24|0,c[v>>2]=b,c[v+8>>2]=d,c[v+16>>2]=k,v)|0);a[228944]=0;c[7116]=0;c[57432]=-5;i=f;return}}while(0);if((e|0)<0){l=0}else{l=((e>>>0)%75>>>0)+1|0}e=c[229e3+(l<<2)>>2]|0;cf(c[10028]|0,202896,(v=i,i=i+24|0,c[v>>2]=b,c[v+8>>2]=d,c[v+16>>2]=e,v)|0);a[228944]=0;c[7116]=0;c[57432]=-5;i=f;return}function pK(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;lD(b,d,e,f,g);if((a[(c[7118]|0)+19|0]&1)!=0|(g|0)==0){return}if((c[7116]|0)!=0){h=c[10028]|0;aI(215952,7,1,h|0);c[7116]=0;a[228944]=0}aI(204880,19,1,c[10028]|0);lD(b,d,e,f,-g|0);if((c[7116]|0)!=0){g=c[10028]|0;aI(215952,7,1,g|0);c[7116]=0;a[228944]=0}aI(212688,9,1,c[10028]|0);return}function pL(b){b=b|0;var d=0,e=0,f=0,j=0,k=0,l=0,m=0.0,n=0.0;d=i;i=i+8|0;e=d|0;if((b|0)==0){f=16722}else{if((a[b]|0)==0){f=16722}else{j=b}}if((f|0)==16722){j=229744}f=bk(j|0,148464)|0;g[e>>2]=+g[7202];if((a[j+f|0]|0)==44){b=j+(f+1|0)|0;ca(b|0,205104,(v=i,i=i+8|0,c[v>>2]=e,v)|0)}do{if((f|0)==0){b=bP(229744)|0;k=bk(b|0,148464)|0;l=b}else{if((j|0)==0){k=f;l=0;break}k=f;l=bP(j|0)|0}}while(0);a[l+k|0]=0;if((k|0)!=0){j=0;do{f=l+j|0;if((a[f]|0)==32){a[f]=45}j=j+1|0;}while(j>>>0>>0)}if((c[c[7118]>>2]|0)==3){tz(l);k=c[10028]|0;m=+g[e>>2]*+g[(c[7118]|0)+92>>2]*10.0;cf(k|0,205064,(v=i,i=i+16|0,c[v>>2]=l,h[v+8>>3]=m,v)|0);m=+g[e>>2];if(m!=+g[7200]){k=c[10028]|0;j=-~~(m*+g[(c[7118]|0)+92>>2]*10.0/3.0)|0;cf(k|0,205040,(v=i,i=i+8|0,c[v>>2]=j,v)|0);n=+g[e>>2]}else{n=m}g[7200]=n}uu(l);c[(c[3524]|0)+16>>2]=~~(+g[e>>2]*+g[(c[7118]|0)+92>>2]*10.0);c[(c[3524]|0)+20>>2]=~~(+g[e>>2]*+g[(c[7118]|0)+92>>2]*10.0*6.0/10.0);i=d;return 1}function pM(a){a=+a;var b=0;b=i;cf(c[10028]|0,205136,(v=i,i=i+8|0,h[v>>3]=a,v)|0);i=b;return}function pN(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0.0,n=0.0;j=i;if((c[7116]|0)!=0){k=c[10028]|0;aI(215952,7,1,k|0);c[7116]=0;a[228944]=0}k=b&15;if((k|0)==3){l=c[10028]|0;cf(l|0,205808,(v=i,i=i+32|0,c[v>>2]=d,c[v+8>>2]=e,c[v+16>>2]=f,c[v+24>>2]=g,v)|0);a[228944]=0;c[57432]=-5;i=j;return}else if((k|0)==5){aI(205528,32,1,c[10028]|0)}else if((k|0)==1|(k|0)==4){m=+(b>>4|0)/100.0;n=m<0.0?0.0:m;cf(c[10028]|0,205672,(v=i,i=i+40|0,h[v>>3]=n>1.0?1.0:n,c[v+8>>2]=d,c[v+16>>2]=e,c[v+24>>2]=f,c[v+32>>2]=g,v)|0);a[228944]=0;c[57432]=-5;i=j;return}else if((k|0)!=2){cf(c[10028]|0,205464,(v=i,i=i+32|0,c[v>>2]=d,c[v+8>>2]=e,c[v+16>>2]=f,c[v+24>>2]=g,v)|0);a[228944]=0;c[57432]=-5;i=j;return}k=(b>>4|0)%8&-1;if((k|0)==7){b=c[10028]|0;cf(b|0,205184,(v=i,i=i+48|0,c[v>>2]=d,c[v+8>>2]=e,c[v+16>>2]=f,c[v+24>>2]=g,c[v+32>>2]=40,c[v+40>>2]=-30,v)|0);a[228944]=0;c[57432]=-5;i=j;return}else if((k|0)==3){cf(c[10028]|0,205240,(v=i,i=i+32|0,c[v>>2]=d,c[v+8>>2]=e,c[v+16>>2]=f,c[v+24>>2]=g,v)|0);a[228944]=0;c[57432]=-5;i=j;return}else if((k|0)==1){cf(c[10028]|0,205352,(v=i,i=i+48|0,c[v>>2]=d,c[v+8>>2]=e,c[v+16>>2]=f,c[v+24>>2]=g,c[v+32>>2]=80,c[v+40>>2]=-45,v)|0);a[228944]=0;c[57432]=-5;i=j;return}else if((k|0)==2){cf(c[10028]|0,205312,(v=i,i=i+48|0,c[v>>2]=d,c[v+8>>2]=e,c[v+16>>2]=f,c[v+24>>2]=g,c[v+32>>2]=40,c[v+40>>2]=45,v)|0);a[228944]=0;c[57432]=-5;i=j;return}else if((k|0)==5){cf(c[10028]|0,205184,(v=i,i=i+48|0,c[v>>2]=d,c[v+8>>2]=e,c[v+16>>2]=f,c[v+24>>2]=g,c[v+32>>2]=80,c[v+40>>2]=-45,v)|0);a[228944]=0;c[57432]=-5;i=j;return}else if((k|0)==6){cf(c[10028]|0,205184,(v=i,i=i+48|0,c[v>>2]=d,c[v+8>>2]=e,c[v+16>>2]=f,c[v+24>>2]=g,c[v+32>>2]=40,c[v+40>>2]=30,v)|0);a[228944]=0;c[57432]=-5;i=j;return}else if((k|0)==4){cf(c[10028]|0,205184,(v=i,i=i+48|0,c[v>>2]=d,c[v+8>>2]=e,c[v+16>>2]=f,c[v+24>>2]=g,c[v+32>>2]=80,c[v+40>>2]=45,v)|0);a[228944]=0;c[57432]=-5;i=j;return}else{cf(c[10028]|0,205464,(v=i,i=i+32|0,c[v>>2]=d,c[v+8>>2]=e,c[v+16>>2]=f,c[v+24>>2]=g,v)|0);a[228944]=0;c[57432]=-5;i=j;return}}function pO(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0;f=i;i=i+16|0;g=f|0;h=f+8|0;c[g>>2]=e;if((e|0)==0){b7()}pG(b,d);d=c[7230]|0;if((d|0)!=0){b=c[10028]|0;cf(b|0,202848,(v=i,i=i+8|0,c[v>>2]=d,v)|0)}L22516:do{if((c[11252]|0)==15){d=e;while(1){b=a[d]|0;if(b<<24>>24==0){j=16796;break L22516}if(b<<24>>24<0){break}else{d=d+1|0}}aF(91,c[10028]|0);ug(h,g);d=c[h>>2]|0;do{if((d|0)!=0){b=0;k=d;while(1){l=(b|0)==1;do{if(k>>>0<256){if(l){m=k}else{n=c[10028]|0;aF(40,n|0);m=c[h>>2]|0}if((m-40|0)>>>0<2|(m|0)==92){n=c[10028]|0;aF(92,n|0);o=c[h>>2]|0}else{o=m}n=o<<24>>24;p=c[10028]|0;aF(n|0,p|0);q=1}else{if(l){p=c[10028]|0;aF(41,p|0)}p=c[10028]|0;aF(47,p|0);p=c[7114]|0;n=c[18090]|0;r=c[h>>2]|0;s=0;while(1){if((s|0)>=(p|0)){t=p;break}if((c[n+(s<<3)>>2]|0)==(r|0)){j=16786;break}else{s=s+1|0}}if((j|0)==16786){j=0;r=c[n+(s<<3)+4>>2]|0;p=c[10028]|0;aK(r|0,p|0);t=c[7114]|0}if((s|0)<(t|0)){q=2;break}p=c[h>>2]|0;cf(c[10028]|0,(p>>>0>65535?215776:215728)|0,(v=i,i=i+8|0,c[v>>2]=p,v)|0);q=2}}while(0);ug(h,g);l=c[h>>2]|0;if((l|0)==0){break}else{b=q;k=l}}if((q|0)!=1){break}aF(41,c[10028]|0)}}while(0);d=c[7198]|0;if((d|0)==1){k=c[10028]|0;aI(202768,9,1,k|0);break}else if((d|0)==0){aI(202832,9,1,c[10028]|0);break}else if((d|0)==2){aI(202736,9,1,c[10028]|0);break}else{break}}else{j=16796}}while(0);do{if((j|0)==16796){q=c[10028]|0;aF(40,q|0);q=e+1|0;c[g>>2]=q;t=a[e]|0;o=t<<24>>24;c[h>>2]=o;if(t<<24>>24!=0){m=t;t=q;q=o;while(1){if((m-40&255)<2|m<<24>>24==92){o=c[10028]|0;aF(92,o|0);u=c[h>>2]|0}else{u=q}aF(u<<24>>24|0,c[10028]|0);w=t+1|0;o=a[t]|0;d=o<<24>>24;c[h>>2]=d;if(o<<24>>24==0){break}else{m=o;t=w;q=d}}c[g>>2]=w}q=c[7198]|0;if((q|0)==2){t=c[10028]|0;aI(202632,8,1,t|0);break}else if((q|0)==1){aI(202648,8,1,c[10028]|0);break}else if((q|0)==0){aI(202680,8,1,c[10028]|0);break}else{break}}}while(0);if((c[7230]|0)==0){c[7116]=0;a[228944]=0;i=f;return}aI(212688,9,1,c[10028]|0);c[7116]=0;a[228944]=0;i=f;return}function pP(b){b=+b;var d=0,e=0;d=i;e=c[7116]|0;if((e|0)!=0&+h[28714]==b){i=d;return}if((e|0)!=0){e=c[10028]|0;aI(215952,7,1,e|0);c[7116]=0;a[228944]=0}h[28715]=b;c[57432]=-5;cf(c[10028]|0,205832,(v=i,i=i+8|0,h[v>>3]=b,v)|0);i=d;return}function pQ(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0;d=i;i=i+8|0;e=d|0;if((b|0)==0){i=d;return 0}aI(210952,29,1,c[10028]|0);cf(c[10028]|0,210928,(v=i,i=i+8|0,c[v>>2]=c[5168],v)|0);f=0;do{aK(c[34936+(f<<2)>>2]|0,c[10028]|0);f=f+1|0;}while((f|0)!=27);f=c[5163]|0;L22585:do{if((f|0)==100){g=c[10028]|0;aI(210800,28,1,g|0);ty();g=c[b+44>>2]|0;j=c[b+40>>2]|0;tA(209040,g,j,0);tA(209e3,g,j,8);tA(208976,g,j,16);tA(208856,g,j,24)}else if((f|0)==99|(f|0)==102){c[e>>2]=0;aI(210800,28,1,c[10028]|0);ty();j=c[7118]|0;g=fs(0,c[j+100>>2]|0,+h[j+104>>3],e)|0;j=c[e>>2]|0;tA(209040,g,j,0);tA(209e3,g,j,8);tA(208976,g,j,16);tA(208856,g,j,24);uu(g)}else if((f|0)==103){aI(210856,29,1,c[10028]|0)}else if((f|0)==114){aI(210856,29,1,c[10028]|0);if((a[20684]|0)!=0){g=c[7122]|0;if((a[g]|0)==0){break}else{k=0;l=0;n=g}while(1){g=c[28488+((l|1)<<2)>>2]|0;cf(c[10028]|0,207920,(v=i,i=i+24|0,c[v>>2]=k,c[v+8>>2]=n,c[v+16>>2]=g,v)|0);k=k+1|0;l=k<<1;n=c[28488+(l<<2)>>2]|0;if((a[n]|0)==0){break L22585}}}g=c[5164]|0;j=(g|0)>-1?g:-g|0;g=j<<1;o=c[28488+(g<<2)>>2]|0;p=c[28488+((g|1)<<2)>>2]|0;cf(c[10028]|0,207920,(v=i,i=i+24|0,c[v>>2]=j,c[v+8>>2]=o,c[v+16>>2]=p,v)|0);p=c[5165]|0;o=(p|0)>-1?p:-p|0;p=c[5164]|0;if((o|0)==(((p|0)>-1?p:-p|0)|0)){q=p}else{p=c[10028]|0;j=o<<1;g=c[28488+(j<<2)>>2]|0;r=c[28488+((j|1)<<2)>>2]|0;cf(p|0,207920,(v=i,i=i+24|0,c[v>>2]=o,c[v+8>>2]=g,c[v+16>>2]=r,v)|0);q=c[5164]|0}r=c[5166]|0;g=(r|0)>-1?r:-r|0;if((g|0)==(((q|0)>-1?q:-q|0)|0)){break}r=c[5165]|0;if((g|0)==(((r|0)>-1?r:-r|0)|0)){break}r=g<<1;o=c[28488+(r<<2)>>2]|0;p=c[28488+((r|1)<<2)>>2]|0;cf(c[10028]|0,207920,(v=i,i=i+24|0,c[v>>2]=g,c[v+8>>2]=o,c[v+16>>2]=p,v)|0)}else{cf(c[m>>2]|0,210704,(v=i,i=i+24|0,c[v>>2]=210640,c[v+8>>2]=2883,c[v+16>>2]=f<<24>>24,v)|0)}}while(0);aI(210600,37,1,c[10028]|0);aI(210528,67,1,c[10028]|0);cf(c[10028]|0,210480,(v=i,i=i+8|0,h[v>>3]=+h[2705],v)|0);aI(209304,12,1,c[10028]|0);f=c[b+48>>2]|0;if((f|0)==121){b=c[10028]|0;aI(209160,5,1,b|0)}else if((f|0)==114){aI(209216,5,1,c[10028]|0)}else if((f|0)==120){aI(209152,5,1,c[10028]|0)}else if((f|0)==99){aI(209200,5,1,c[10028]|0)}else if((f|0)==104){aI(209208,5,1,c[10028]|0)}else{cf(c[m>>2]|0,209064,(v=i,i=i+24|0,c[v>>2]=210640,c[v+8>>2]=2794,c[v+16>>2]=f<<24>>24,v)|0);aI(209216,5,1,c[10028]|0)}aI(209056,5,1,c[10028]|0);f=c[10028]|0;if((c[5163]|0)==103){aI(210440,30,1,f|0)}else{aI(210368,51,1,f|0)}aI(210312,55,1,c[10028]|0);aI(210184,53,1,c[10028]|0);aI(210040,42,1,c[10028]|0);aI(210008,5,1,c[10028]|0);aI(209864,27,1,c[10028]|0);f=c[5164]|0;if((f|0)<0){b=c[10028]|0;aI(209784,11,1,b|0);s=c[5164]|0}else{s=f}cf(c[10028]|0,209696,(v=i,i=i+8|0,c[v>>2]=(s|0)>-1?s:-s|0,v)|0);s=c[5165]|0;if((s|0)<0){f=c[10028]|0;aI(209784,11,1,f|0);t=c[5165]|0}else{t=s}cf(c[10028]|0,209664,(v=i,i=i+8|0,c[v>>2]=(t|0)>-1?t:-t|0,v)|0);t=c[5166]|0;if((c[5165]|c[5164]|t|0)<0){s=c[10028]|0;aI(84248,2,1,s|0);u=c[5166]|0}else{u=t}if((u|0)<0){t=c[10028]|0;aI(209784,11,1,t|0);w=c[5166]|0}else{w=u}cf(c[10028]|0,209648,(v=i,i=i+8|0,c[v>>2]=(w|0)>-1?w:-w|0,v)|0);aI(209584,42,1,c[10028]|0);aI(209568,11,1,c[10028]|0);aI(209552,3,1,c[10028]|0);aI(209344,55,1,c[10028]|0);aI(213784,9,1,c[10028]|0);i=d;return 0}function pR(){var b=0;if((c[7116]|0)!=0){b=c[10028]|0;aI(215952,7,1,b|0);c[7116]=0;a[228944]=0}aI(211040,30,1,c[10028]|0);return}function pS(b){b=b|0;var d=0,e=0.0,f=0,g=0,j=0,k=0.0,l=0.0,m=0,n=0,o=0,p=0;d=i;c[57432]=-5;e=+h[28715];if(+h[28714]!=e){h[28714]=e;f=c[10028]|0;aI(211272,3,1,f|0)}f=b|0;g=c[f>>2]|0;if((g|0)==3){j=c[b+4>>2]|0;e=+(j>>>16&255|0)/255.0;k=+(j>>>8&255|0)/255.0;l=+(j&255|0)/255.0;if((c[7116]|0)!=0){j=c[10028]|0;aI(215952,7,1,j|0);c[7116]=0;a[228944]=0}j=c[10028]|0;cf(j|0,211112,(v=i,i=i+24|0,h[v>>3]=e,h[v+8>>3]=k,h[v+16>>3]=l,v)|0);m=16871}else if((g|0)==1){j=c[b+4>>2]|0;if((c[7116]|0)!=0){n=c[10028]|0;aI(215952,7,1,n|0);c[7116]=0;a[228944]=0}n=c[7118]|0;do{if((c[n>>2]|0)==2){if((a[n+112|0]&1)==0){m=16866;break}o=(j|0)%4&-1}else{m=16866}}while(0);if((m|0)==16866){o=(j|0)%9&-1}j=o+3|0;cf(c[10028]|0,211192,(v=i,i=i+8|0,c[v>>2]=a[93672+((j|0)<0?0:j)|0]|0,v)|0);m=16871}else{p=g}if((m|0)==16871){p=c[f>>2]|0}if((p|0)!=5){i=d;return}l=+h[b+8>>3];do{if(l>0.0){b=c[10028]|0;if(l<1.0){k=+(~~(l*1.0e4+.5)|0)*1.0e-4;be(25336,141840,(v=i,i=i+8|0,h[v>>3]=k,v)|0);p=(a[25336]|0)==48&(a[25337]|0)==46?25337:25336;cf(b|0,211072,(v=i,i=i+8|0,c[v>>2]=p,v)|0);break}else{aI(211080,4,1,b|0);break}}else{b=c[10028]|0;aI(211104,4,1,b|0)}}while(0);a[228944]=0;i=d;return}function pT(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0;e=i;f=c[d+8>>2]|0;if(a[228944]&(c[7116]|0)!=0){g=c[10028]|0;aI(215952,7,1,g|0);c[7116]=0;a[228944]=0}if((b|0)==4&(f|0)==1601){g=c[10028]|0;j=d|0;k=c[j>>2]|0;l=d+4|0;m=c[l>>2]|0;cf(g|0,211680,(v=i,i=i+16|0,c[v>>2]=k,c[v+8>>2]=m,v)|0);m=c[10028]|0;k=c[d+24>>2]|0;g=(c[d+36>>2]|0)-k|0;n=c[d+28>>2]|0;o=(c[d+40>>2]|0)-n|0;p=c[d+12>>2]|0;q=k-p|0;k=c[d+16>>2]|0;r=n-k|0;n=p-(c[j>>2]|0)|0;j=k-(c[l>>2]|0)|0;cf(m|0,211600,(v=i,i=i+48|0,c[v>>2]=g,c[v+8>>2]=o,c[v+16>>2]=q,c[v+24>>2]=r,c[v+32>>2]=n,c[v+40>>2]=j,v)|0);a[228944]=0;i=e;return}j=f>>4;n=f&15;aI(211544,6,1,c[10028]|0);f=c[d+4>>2]|0;cf(c[10028]|0,211680,(v=i,i=i+16|0,c[v>>2]=c[d>>2],c[v+8>>2]=f,v)|0);if((b|0)>1){f=1;do{r=c[10028]|0;q=c[d+(f*12&-1)>>2]|0;if(((f|0)%105&-1|0)==0){o=c[d+(f*12&-1)+4>>2]|0;cf(r|0,211480,(v=i,i=i+16|0,c[v>>2]=q,c[v+8>>2]=o,v)|0)}else{o=f-1|0;g=q-(c[d+(o*12&-1)>>2]|0)|0;q=(c[d+(f*12&-1)+4>>2]|0)-(c[d+(o*12&-1)+4>>2]|0)|0;cf(r|0,211528,(v=i,i=i+16|0,c[v>>2]=g,c[v+8>>2]=q,v)|0)}f=f+1|0;}while((f|0)<(b|0))}if((n|0)==1|(n|0)==4){s=+(j|0)/100.0;t=s<0.0?0.0:s;b=c[10028]|0;if(t<1.0){s=t;cf(b|0,211448,(v=i,i=i+8|0,h[v>>3]=s,v)|0);a[228944]=0;i=e;return}else{aI(211464,12,1,b|0);a[228944]=0;i=e;return}}else if((n|0)==5){aI(211416,31,1,c[10028]|0)}else if((n|0)!=2){aI(211464,12,1,c[10028]|0);a[228944]=0;i=e;return}n=(j|0)%8&-1;j=c[10028]|0;if((n|0)==0){cf(j|0,211400,(v=i,i=i+8|0,h[v>>3]=.5,v)|0);a[228944]=0;i=e;return}else{cf(j|0,211360,(v=i,i=i+8|0,c[v>>2]=n,v)|0);a[228944]=0;i=e;return}}function pU(){if(!(a[237912]|0)){return}aI(215624,3,1,c[10028]|0);a[237912]=0;return}function pV(b,e,f,g,j){b=b|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0.0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0.0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0,aA=0,aB=0,aC=0,aD=0,aE=0,aG=0,aH=0,aJ=0,aK=0,aL=0,aM=0,aN=0,aO=0,aP=0,aQ=0,aR=0,aS=0,aT=0,aU=0,aV=0,aW=0,aX=0;k=i;i=i+24|0;l=k|0;n=k+8|0;o=k+16|0;p=c[5168]|0;q=(p|0)>0?p:256;do{if((q|0)>1){p=1;r=0;do{r=r+1&65535;p=p<<1;}while((p|0)<(q|0));if(r<<16>>16==0|(r&65535)>12){s=r;break}do{if((r&65535)>8){t=12}else{if((r&65535)>4){t=8;break}t=(r&65535)>2?4:r}}while(0);r=(j|0)==1;do{if(r){u=16922}else{p=c[5163]|0;if((p|0)==103){u=16922;break}else if((p|0)!=114){w=1.0;x=0;break}if((a[(c[7118]|0)+17|0]&1)==0){u=16922}else{w=1.0;x=0}}}while(0);if((u|0)==16922){w=+((1<<(t&65535))-1|0)/+(q-1|0);x=1}p=t&65535;y=a[(c[7118]|0)+16|0]&1;z=l|0;A=aa(aa(aa(r?3:1,b),p)+7|0,e);if(y<<24>>24==0){y=((A>>>5)*5&-1)+7|0;B=((y|0)/78&-1)+y|0}else{y=(A>>>2)+1|0;B=((y|0)/78&-1)+y|0}y=ut(B)|0;do{if((y|0)==0){gk();A=ut(B)|0;if((A|0)!=0){C=A;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=211936,v)|0)}else{C=y}}while(0);y=aa(e,b);if(r){D=y*3&-1;E=b*3&-1}else{D=y;E=b}L22728:do{if((D|0)==0){F=C}else{G=+(q|0);A=q-1|0;H=A&65535;I=l+1|0;J=l+2|0;K=l+3|0;L=l+4|0;M=32;N=0;O=0;P=0;Q=C;R=78;S=f;T=D;while(1){U=S+8|0;V=~~(G*+h[S>>3]);W=~~(w*+((((V&65535|0)>(A|0)?H:V)&65535)>>>0));V=M&65535;if((M&65535)<(t&65535)){X=p-V|0;Y=(W&65535)>>>((X&65535)>>>0)|O<>16==0){do{if((a[(c[7118]|0)+16|0]&1)==0){if((ab|0)!=0){X=(ab>>>0)/52200625>>>0;V=X&255;a[z]=V;ad=aa(X,-52200625)+ab|0;X=(ad>>>0)/614125>>>0;a[I]=X&255;ae=((X&255)*-614125&-1)+ad|0;ad=(ae>>>0)/7225>>>0;a[J]=ad&255;X=ae+((ad&255)*-7225&-1)|0;ad=(X>>>0)/85>>>0;a[K]=ad&255;a[L]=X+((ad&255)*-85&-1)&255;ad=Q+1|0;a[Q]=V+33&255;V=R<<16>>16==1;X=V?Q+2|0:ad;a[ad]=V?10:0;ad=X+1|0;a[X]=(a[I]|0)+33&255;ae=V?77:R-2&65535;V=ae<<16>>16==0;af=V?X+2|0:ad;a[ad]=V?10:0;ad=af+1|0;a[af]=(a[J]|0)+33&255;X=V?77:ae-1&65535;ae=X<<16>>16==0;V=ae?af+2|0:ad;a[ad]=ae?10:0;ad=V+1|0;a[V]=(a[K]|0)+33&255;af=ae?77:X-1&65535;X=af<<16>>16==0;ae=X?V+2|0:ad;a[ad]=X?10:0;ad=ae+1|0;a[ae]=(a[L]|0)+33&255;V=X?77:af-1&65535;af=V<<16>>16==0;a[ad]=af?10:0;ag=af?78:V;ah=af?ae+2|0:ad;break}ad=Q+1|0;a[Q]=122;ae=R-1&65535;if(ae<<16>>16!=0){ag=ae;ah=ad;break}a[ad]=10;ag=78;ah=Q+2|0}else{ad=ab>>>4;ae=ab>>>8;af=ab>>>12;V=ab>>>16;X=ab>>>20;ai=ab>>>24;aj=ab>>>28;ak=Q+1|0;be(Q|0,211896,(v=i,i=i+8|0,c[v>>2]=aj,v)|0);aj=R-1&65535;if(aj<<16>>16==0){a[ak]=10;al=78;am=Q+2|0}else{al=aj;am=ak}ak=am+1|0;aj=ai&15;be(am|0,211896,(v=i,i=i+8|0,c[v>>2]=aj,v)|0);aj=al-1&65535;if(aj<<16>>16==0){a[ak]=10;an=78;ao=am+2|0}else{an=aj;ao=ak}ak=ao+1|0;aj=X&15;be(ao|0,211896,(v=i,i=i+8|0,c[v>>2]=aj,v)|0);aj=an-1&65535;if(aj<<16>>16==0){a[ak]=10;ap=78;aq=ao+2|0}else{ap=aj;aq=ak}ak=aq+1|0;aj=V&15;be(aq|0,211896,(v=i,i=i+8|0,c[v>>2]=aj,v)|0);aj=ap-1&65535;if(aj<<16>>16==0){a[ak]=10;ar=78;as=aq+2|0}else{ar=aj;as=ak}ak=as+1|0;aj=af&15;be(as|0,211896,(v=i,i=i+8|0,c[v>>2]=aj,v)|0);aj=ar-1&65535;if(aj<<16>>16==0){a[ak]=10;at=78;au=as+2|0}else{at=aj;au=ak}ak=au+1|0;aj=ae&15;be(au|0,211896,(v=i,i=i+8|0,c[v>>2]=aj,v)|0);aj=at-1&65535;if(aj<<16>>16==0){a[ak]=10;av=78;aw=au+2|0}else{av=aj;aw=ak}ak=aw+1|0;aj=ad&15;be(aw|0,211896,(v=i,i=i+8|0,c[v>>2]=aj,v)|0);aj=av-1&65535;if(aj<<16>>16==0){a[ak]=10;ax=78;ay=aw+2|0}else{ax=aj;ay=ak}ak=ay+1|0;aj=ab&15;be(ay|0,211896,(v=i,i=i+8|0,c[v>>2]=aj,v)|0);aj=ax-1&65535;if(aj<<16>>16!=0){ag=aj;ah=ak;break}a[ak]=10;ag=78;ah=ay+2|0}}while(0);if(Z<<16>>16==0){az=0}else{ak=W&65535;aj=Z&65535;az=ak-(ak>>>(aj>>>0)<=32){F=aB;break}S=4-(T>>>3)|0;if((a[(c[7118]|0)+16|0]&1)==0){R=aC<>>0)/52200625>>>0;Q=T&255;a[z]=Q;P=aa(T,-52200625)+R|0;R=(P>>>0)/614125>>>0;a[I]=R&255;T=((R&255)*-614125&-1)+P|0;P=(T>>>0)/7225>>>0;a[J]=P&255;R=T+((P&255)*-7225&-1)|0;P=(R>>>0)/85>>>0;a[K]=P&255;a[L]=R+((P&255)*-85&-1)&255;if((S|0)<0){F=aB;break}P=aB+1|0;a[aB]=Q+33&255;Q=aA-1&65535;R=Q<<16>>16==0;T=R?aB+2|0:P;a[P]=R?10:0;if((S|0)<1){F=T;break}else{aG=1;aH=Q;aJ=R;aK=T}while(1){T=aG+1|0;R=aK+1|0;a[aK]=(a[l+aG|0]|0)+33&255;Q=aJ?77:aH-1&65535;P=Q<<16>>16==0;O=P?aK+2|0:R;a[R]=P?10:0;if((T|0)>(S|0)){F=O;break L22728}else{aG=T;aH=Q;aJ=P;aK=O}}}L=S<<1;if((L|0)>0){aL=aC;aM=L}else{F=aB;break}while(1){K=aM-1|0;a[n+K|0]=aL&15;if((K|0)>0){aL=aL>>>4;aM=K}else{aN=aB;aO=aA;aP=0;break}}while(1){S=aN+1|0;be(aN|0,211896,(v=i,i=i+8|0,c[v>>2]=d[n+aP|0]|0,v)|0);K=aO-1&65535;if(K<<16>>16==0){a[S]=10;aQ=78;aR=aN+2|0}else{aQ=K;aR=S}S=aP+1|0;if((S|0)<(L|0)){aN=aR;aO=aQ;aP=S}else{F=aR;break}}}}while(0);if((a[(c[7118]|0)+16|0]&1)==0){a[F]=a[211872]|0;a[F+1|0]=a[211873|0]|0;a[F+2|0]=a[211874|0]|0;aS=F+2|0}else{aS=F}z=aS-C|0;if((z|0)>(B|0)){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=211696,v)|0)}aI(214464,15,1,c[10028]|0);r=c[g+24>>2]|0;L=c[g+28>>2]|0;S=c[g+40>>2]|0;K=c[g+36>>2]|0;cf(c[10028]|0,214416,(v=i,i=i+64|0,c[v>>2]=r,c[v+8>>2]=L,c[v+16>>2]=r,c[v+24>>2]=S,c[v+32>>2]=K,c[v+40>>2]=S,c[v+48>>2]=K,c[v+56>>2]=L,v)|0);do{if(x){if((a[(c[7118]|0)+16|0]&1)==0){L=c[10028]|0;aI(214344,62,1,L|0);L=c[10028]|0;K=g|0;S=c[K>>2]|0;r=g+4|0;J=c[r>>2]|0;cf(L|0,214312,(v=i,i=i+16|0,c[v>>2]=S,c[v+8>>2]=J,v)|0);J=c[10028]|0;S=g+12|0;L=(c[S>>2]|0)-(c[K>>2]|0)|0;cf(J|0,214296,(v=i,i=i+8|0,c[v>>2]=L,v)|0);L=c[10028]|0;J=(c[g+16>>2]|0)-(c[r>>2]|0)|0;cf(L|0,214272,(v=i,i=i+8|0,c[v>>2]=J,v)|0);J=c[10028]|0;L=(c[K>>2]|0)-(c[S>>2]|0)|0;cf(J|0,214296,(v=i,i=i+8|0,c[v>>2]=L,v)|0);L=c[10028]|0;J=c[K>>2]|0;K=c[r>>2]|0;cf(L|0,214256,(v=i,i=i+16|0,c[v>>2]=J,c[v+8>>2]=K,v)|0);K=c[10028]|0;aI(214128,67,1,K|0);K=c[10028]|0;cf(K|0,213920,(v=i,i=i+8|0,c[v>>2]=z,v)|0);K=c[10028]|0;aI(213848,38,1,K|0);tx(b,e,g,j,t);K=c[10028]|0;aI(213784,9,1,K|0);break}else{tx(b,e,g,j,t);break}}else{K=q-1|0;G=1.0/+(K|0);if((a[(c[7118]|0)+16|0]&1)==0){J=c[10028]|0;aI(214344,62,1,J|0);J=c[10028]|0;L=g|0;r=c[L>>2]|0;S=g+4|0;I=c[S>>2]|0;cf(J|0,214312,(v=i,i=i+16|0,c[v>>2]=r,c[v+8>>2]=I,v)|0);I=c[10028]|0;r=g+12|0;J=(c[r>>2]|0)-(c[L>>2]|0)|0;cf(I|0,214296,(v=i,i=i+8|0,c[v>>2]=J,v)|0);J=c[10028]|0;I=g+16|0;O=(c[I>>2]|0)-(c[S>>2]|0)|0;cf(J|0,214272,(v=i,i=i+8|0,c[v>>2]=O,v)|0);O=c[10028]|0;J=(c[L>>2]|0)-(c[r>>2]|0)|0;cf(O|0,214296,(v=i,i=i+8|0,c[v>>2]=J,v)|0);J=c[10028]|0;O=c[L>>2]|0;P=c[S>>2]|0;cf(J|0,214256,(v=i,i=i+16|0,c[v>>2]=O,c[v+8>>2]=P,v)|0);P=c[10028]|0;cf(P|0,213648,(v=i,i=i+8|0,c[v>>2]=z,v)|0);P=c[10028]|0;aI(213608,4,1,P|0);aT=L;aU=S;aV=r;aW=I}else{aT=g|0;aU=g+4|0;aV=g+12|0;aW=g+16|0}I=c[10028]|0;aI(213600,6,1,I|0);I=c[10028]|0;r=c[aT>>2]|0;S=c[aU>>2]|0;cf(I|0,213576,(v=i,i=i+16|0,c[v>>2]=r,c[v+8>>2]=S,v)|0);S=c[10028]|0;r=(c[aV>>2]|0)-(c[aT>>2]|0)|0;I=(c[aW>>2]|0)-(c[aU>>2]|0)|0;cf(S|0,213528,(v=i,i=i+16|0,c[v>>2]=r,c[v+8>>2]=I,v)|0);I=c[10028]|0;aI(213504,17,1,I|0);I=c[10028]|0;cf(I|0,213456,(v=i,i=i+8|0,c[v>>2]=K,v)|0);K=o|0;I=o+1|0;r=o+2|0;S=0;L=0;while(1){fr(G*+(S|0),o);if(L<<16>>16==0){P=c[10028]|0;aI(152656,3,1,P|0);aX=8}else{aX=L}P=d[I]|0;O=d[r]|0;cf(c[10028]|0,213376,(v=i,i=i+24|0,c[v>>2]=d[K]|0,c[v+8>>2]=P,c[v+16>>2]=O,v)|0);O=S+1|0;if((O|0)<(q|0)){S=O;L=aX-1&65535}else{break}}aI(213312,21,1,c[10028]|0);aI(213272,15,1,c[10028]|0);cf(c[10028]|0,213216,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=e,v)|0);cf(c[10028]|0,213144,(v=i,i=i+24|0,c[v>>2]=p,c[v+8>>2]=b,c[v+16>>2]=e,v)|0);cf(c[10028]|0,213120,(v=i,i=i+8|0,c[v>>2]=(1<>>3;cf(L|0,213920,(v=i,i=i+8|0,c[v>>2]=S,v)|0);S=c[10028]|0;aI(213056,55,1,S|0)}aI(212936,29,1,c[10028]|0);aI(212896,30,1,c[10028]|0);if((a[(c[7118]|0)+16|0]&1)!=0){break}aI(213784,9,1,c[10028]|0)}}while(0);if((z|0)>0){y=0;p=C;while(1){aF(a[p]|0|0,c[10028]|0);S=y+1|0;if((S|0)<(z|0)){y=S;p=p+1|0}else{break}}}p=c[10028]|0;if((a[(c[7118]|0)+16|0]&1)==0){aI(212776,39,1,p|0)}else{aI(212832,10,1,p|0)}aI(212688,9,1,c[10028]|0);aI(212656,13,1,c[10028]|0);uu(C);i=k;return}else{s=0}}while(0);cf(c[m>>2]|0,214504,(v=i,i=i+8|0,c[v>>2]=s&65535,v)|0);i=k;return}function pW(b,d,e,f,g,j){b=b|0;d=+d;e=+e;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0;k=i;if((j|0)==4){l=c[10028]|0;aI(215544,10,1,l|0);i=k;return}else if((j|0)==3){aI(215600,7,1,c[10028]|0);i=k;return}else{if(a[237912]|0){i=k;return}l=(uA(b|0)|0)+40|0;uu(c[59476]|0);m=ut(l)|0;do{if((m|0)==0){gk();n=ut(l)|0;if((n|0)!=0){o=n;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=215504,v)|0)}else{o=m}}while(0);c[59476]=o;tz(b);a0(c[59476]|0,l|0,215400,(v=i,i=i+48|0,c[v>>2]=b,h[v+8>>3]=d,h[v+16>>3]=e,c[v+24>>2]=f?225e3:224992,c[v+32>>2]=g?225e3:224992,c[v+40>>2]=j,v)|0);cf(c[10028]|0,215368,(v=i,i=i+8|0,c[v>>2]=c[59476],v)|0);a[237912]=1;i=k;return}}function pX(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;i=i+16|0;e=d|0;f=d+8|0;g=c[11252]|0;if((g|0)!=15){h=(g|0)==14;g=c[10028]|0;aF(b|0,g|0);if(!h){i=d;return}if(a[238472]|0){a[238472]=0;if((b|0)!=92){i=d;return}h=c[10028]|0;aF(92,h|0);i=d;return}else{if((b&128|0)==0){i=d;return}a[238472]=1;i=d;return}}if((b&128|0)==0){h=c[10028]|0;aF(b|0,h|0);i=d;return}h=c[59616]|0;if((h|0)==0){do{if((b&224|0)==192){j=2;k=17022}else{if((b&240|0)==224){j=3;k=17022;break}g=(b&248|0)==240;c[59614]=g?4:0;if(g){break}g=c[10028]|0;aF(b|0,g|0);i=d;return}}while(0);if((k|0)==17022){c[59614]=j}c[59616]=1;a[238448]=b&255;i=d;return}j=h+1|0;c[59616]=j;a[h+238448|0]=b&255;b=c[59614]|0;if((j|0)<(b|0)){i=d;return}c[e>>2]=0;c[f>>2]=238448;a[b+238448|0]=0;c[59616]=0;ug(e,f);f=c[e>>2]|0;if(f>>>0<256){b=c[10028]|0;aF(f|0,b|0);i=d;return}if(a[237912]|0){b=c[10028]|0;aI(215624,3,1,b|0);a[237912]=0}cf(c[10028]|0,215784,(v=i,i=i+8|0,c[v>>2]=c[59476],v)|0);b=c[7114]|0;f=c[18090]|0;j=c[e>>2]|0;h=0;while(1){if((h|0)>=(b|0)){l=b;break}if((c[f+(h<<3)>>2]|0)==(j|0)){k=17034;break}else{h=h+1|0}}if((k|0)==17034){k=c[f+(h<<3)+4>>2]|0;f=c[10028]|0;aK(k|0,f|0);l=c[7114]|0}if((h|0)>=(l|0)){l=c[10028]|0;h=c[e>>2]|0;e=h>>>0>65535?215776:215728;cf(l|0,e|0,(v=i,i=i+8|0,c[v>>2]=h,v)|0)}aI(89968,2,1,c[10028]|0);a[237912]=0;i=d;return}function pY(a){a=a|0;var b=0,d=0,e=0;b=i;if((a|0)==13){d=c[10028]|0;cf(d|0,93784,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);i=b;return}else if((a|0)==7){cf(c[10028]|0,215840,(v=i,i=i+8|0,c[v>>2]=c[57434],v)|0);i=b;return}else if((a|0)==0){c[57434]=0;i=b;return}else if((a|0)==6){d=c[10028]|0;e=(c[57434]|0)+1|0;c[57434]=e;cf(d|0,215920,(v=i,i=i+8|0,c[v>>2]=e,v)|0);i=b;return}else if((a|0)==12){cf(c[10028]|0,93800,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);i=b;return}else{i=b;return}}function pZ(b){b=b|0;var d=0;if((b|0)==0){if((c[7116]|0)!=0){d=c[10028]|0;aI(215952,7,1,d|0);c[7116]=0;a[228944]=0}a[229704]=1;return}else if((b|0)==1){aI(78256,2,1,c[10028]|0);if((c[7116]|0)==0){return}aI(215952,7,1,c[10028]|0);c[7116]=0;a[228944]=0;return}else{return}}function p_(){aI(215984,51,1,c[10030]|0);return}function p$(){aI(216040,6,1,c[10030]|0);return}function p0(){aI(216080,9,1,c[10030]|0);return}function p1(){aI(216176,5,1,c[10030]|0);return}function p2(a,b){a=a|0;b=b|0;var d=0;d=i;cf(c[10030]|0,216272,(v=i,i=i+16|0,c[v>>2]=a+1e3,c[v+8>>2]=6999-b,v)|0);i=d;return}function p3(a,b){a=a|0;b=b|0;var d=0;d=i;cf(c[10030]|0,216304,(v=i,i=i+16|0,c[v>>2]=a+1e3,c[v+8>>2]=6999-b,v)|0);i=d;return}function p4(a){a=a|0;var b=0,d=0;b=i;c[6954]=a;if((a|0)>8){d=(a|0)%9&-1}else{d=a}a=d+2|0;cf(c[10030]|0,216464,(v=i,i=i+8|0,c[v>>2]=c[228840+(a<<2)>>2],v)|0);d=c[228888+(a<<2)>>2]|0;if((d|0)==1){a=c[10030]|0;aI(216400,16,1,a|0);i=b;return}else if((d|0)==3){aI(216352,16,1,c[10030]|0);i=b;return}else if((d|0)==2){aI(216376,16,1,c[10030]|0);i=b;return}else{aI(216344,4,1,c[10030]|0);i=b;return}}function p5(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;cf(c[10030]|0,216272,(v=i,i=i+16|0,c[v>>2]=b+1e3,c[v+8>>2]=6959-d,v)|0);aI(216552,5,1,c[10030]|0);d=e;while(1){e=a[d]|0;b=d+1|0;g=e<<24>>24;if((e<<24>>24|0)==94){h=c[10030]|0;aF(94,h|0)}else if((e<<24>>24|0)==0){break}aF(g|0,c[10030]|0);d=b}aI(216504,6,1,c[10030]|0);p4(c[6954]|0);i=f;return}function p6(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0.0,_=0,$=0.0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0,at=0.0,au=0,av=0,aw=0,ax=0,ay=0,az=0,aA=0,aB=0,aC=0,aD=0,aE=0,aF=0,aG=0,aH=0,aI=0,aJ=0,aK=0,aL=0.0,aM=0,aN=0;b=i;i=i+200|0;d=b|0;e=b+24|0;f=b+48|0;g=b+72|0;j=b+96|0;k=b+120|0;l=b+144|0;m=b+168|0;n=b+192|0;if((c[13898]|0)==2){o=2}else{c[56738]=6e3;c[56734]=4800;a[228464]=0;uu(c[57106]|0);c[57106]=bP(216600)|0;h[28551]=12.0;p=c[57122]|0;if((p|0)!=0){uu(p)}c[57122]=0;a[228312]=0;a[226968]=0;uu(c[57076]|0);c[57076]=0;uu(c[56744]|0);c[56744]=0;a[228360]=0;a[228336]=0;o=c[13898]|0}p=c[8272]|0;L22958:do{if((o|0)<(p|0)){q=k|0;r=k+8|0;s=j|0;t=j+8|0;u=g|0;w=g+8|0;x=d|0;y=d+8|0;z=e|0;A=e+8|0;B=f|0;C=f+8|0;D=m|0;E=m+8|0;F=l|0;G=l+8|0;H=o;I=p;L22960:while(1){J=c[1054]|0;K=(a[J+(H*40&-1)|0]&1)==0;L=c[J+(H*40&-1)+36>>2]|0;M=J+(H*40&-1)+32|0;L22962:do{if(K){N=c[M>>2]|0;O=17164}else{P=c[10036]|0;Q=0;while(1){if((Q|0)>=(L|0)){O=17114;break}if((a[P+((c[M>>2]|0)+Q|0)|0]|0)==(a[Q+103664|0]|0)){Q=Q+1|0}else{break}}if((O|0)==17114){O=0;if((Q|0)==1){break L22958}}P=c[M>>2]|0;if(!((L|0)>0&(K^1))){N=P;O=17164;break}R=c[10036]|0;S=0;T=0;U=P;while(1){if((a[S+218680|0]|0)==(a[R+(S+U|0)|0]|0)){V=U;W=T}else{if((S|0)!=1){N=P;O=17164;break L22962}V=U-1|0;W=1}X=S+1|0;if((X|0)<(W+L|0)){S=X;T=W;U=V}else{break}}if((W|0)==0){if(!((S|0)==4|(S|0)==0)){N=P;O=17164;break}}Y=H+1|0;c[13898]=Y;if((Y|0)>=(I|0)){O=17424;break L22960}L22982:do{if((a[J+(Y*40&-1)|0]&1)!=0){U=c[J+(Y*40&-1)+36>>2]|0;T=J+(Y*40&-1)+32|0;R=c[10036]|0;Q=0;while(1){if((Q|0)>=(U|0)){break}if((a[R+((c[T>>2]|0)+Q|0)|0]|0)==(a[Q+103664|0]|0)){Q=Q+1|0}else{break L22982}}if((Q|0)==1){O=17425;break L22960}}}while(0);P=is(m)|0;S=c[P>>2]|0;if((S|0)==1){Z=+(c[P+8>>2]|0)}else if((S|0)==3){Z=+uz(c[P+8>>2]|0,0)}else if((S|0)==2){Z=+h[P+8>>3]}else{O=17134;break L22960}if((c[D>>2]|0)==3){uu(c[E>>2]|0);c[D>>2]=1}if(Z<2.0){O=17138;break L22960}c[56738]=~~(Z*10.0);P=c[13898]|0;S=c[8272]|0;L22998:do{if((S|0)>(P|0)){T=c[1054]|0;if((a[T+(P*40&-1)|0]&1)==0){_=P;break}R=c[T+(P*40&-1)+36>>2]|0;U=T+(P*40&-1)+32|0;T=c[10036]|0;X=0;while(1){if((X|0)>=(R|0)){break}if((a[T+((c[U>>2]|0)+X|0)|0]|0)==(a[X+148464|0]|0)){X=X+1|0}else{_=P;break L22998}}if((X|0)!=1){_=P;break}U=P+1|0;c[13898]=U;_=U}else{_=P}}while(0);if((_|0)>=(S|0)){O=17439;break L22960}P=c[1054]|0;L23008:do{if((a[P+(_*40&-1)|0]&1)!=0){U=c[P+(_*40&-1)+36>>2]|0;T=P+(_*40&-1)+32|0;R=c[10036]|0;Q=0;while(1){if((Q|0)>=(U|0)){break}if((a[R+((c[T>>2]|0)+Q|0)|0]|0)==(a[Q+103664|0]|0)){Q=Q+1|0}else{break L23008}}if((Q|0)==1){O=17440;break L22960}}}while(0);P=is(l)|0;S=c[P>>2]|0;if((S|0)==2){$=+h[P+8>>3]}else if((S|0)==1){$=+(c[P+8>>2]|0)}else if((S|0)==3){$=+uz(c[P+8>>2]|0,0)}else{O=17157;break L22960}if((c[F>>2]|0)==3){uu(c[G>>2]|0);c[F>>2]=1}if($<2.0){O=17161;break L22960}c[56734]=~~($*10.0)}}while(0);L23025:do{if((O|0)==17164){O=0;M=(I|0)>(H|0);L23027:do{if(M){if(K){O=17427;break L22960}P=c[10036]|0;S=0;while(1){if((S|0)>=(L|0)){break}if((a[P+(N+S|0)|0]|0)==(a[S+218536|0]|0)){S=S+1|0}else{O=17170;break L23027}}if((S|0)!=5){O=17170}}else{O=17170}}while(0);L23034:do{if((O|0)==17170){O=0;L23036:do{if((L|0)>0&(K^1)){P=c[10036]|0;Q=0;T=0;R=N;while(1){if((a[Q+218504|0]|0)==(a[P+(Q+R|0)|0]|0)){aa=R;ab=T}else{if((Q|0)!=4){break}aa=R-1|0;ab=1}U=Q+1|0;if((U|0)<(ab+L|0)){Q=U;T=ab;R=aa}else{O=17176;break}}if((O|0)==17176){O=0;if((ab|0)!=0){break L23034}if((Q|0)==3|(Q|0)==7){break L23034}}if(!((L|0)>0&(K^1))){break}R=c[10036]|0;T=0;P=0;U=N;while(1){if((a[T+130272|0]|0)==(a[R+(T+U|0)|0]|0)){ac=U;ad=P}else{if((T|0)!=5){break L23036}ac=U-1|0;ad=1}X=T+1|0;if((X|0)<(ad+L|0)){T=X;P=ad;U=ac}else{break}}if((ad|0)==0){if(!((T|0)==10|(T|0)==4)){break}}c[13898]=H+1;a[226968]=1;break L23025}}while(0);L23060:do{if(M){if(K){O=17431;break L22960}S=c[10036]|0;U=0;while(1){if((U|0)>=(L|0)){O=17193;break}if((a[S+(N+U|0)|0]|0)==(a[U+218432|0]|0)){U=U+1|0}else{break}}do{if((O|0)==17193){O=0;if((U|0)!=4){break}ae=H+1|0;c[13898]=ae;if((ae|0)>=(I|0)){O=17202;break L22960}L23070:do{if((a[J+(ae*40&-1)|0]&1)!=0){T=c[J+(ae*40&-1)+36>>2]|0;P=J+(ae*40&-1)+32|0;R=0;while(1){if((R|0)>=(T|0)){break}if((a[S+((c[P>>2]|0)+R|0)|0]|0)==(a[R+103664|0]|0)){R=R+1|0}else{break L23070}}if((R|0)==1){O=17202;break L22960}}}while(0);a[14176]=1;is(k);a[14176]=0;if((c[q>>2]|0)!=3){O=17201;break L22960}P=c[r>>2]|0;c[57076]=P;if((P|0)==0){O=17204;break L22960}if((a[P+(b4(P|0,218288)|0)|0]|0)==0){break L23025}else{O=17207;break L22960}}}while(0);if(!M){break}if(K){O=17430;break L22960}S=c[10036]|0;U=0;while(1){if((U|0)>=(L|0)){break}if((a[S+(N+U|0)|0]|0)==(a[U+221440|0]|0)){U=U+1|0}else{break L23060}}if((U|0)!=5){break}P=H+1|0;c[13898]=P;L23087:do{if((P|0)<(I|0)){L23089:do{if((a[J+(P*40&-1)|0]&1)!=0){T=c[J+(P*40&-1)+36>>2]|0;Q=J+(P*40&-1)+32|0;X=0;while(1){if((X|0)>=(T|0)){break}if((a[S+((c[Q>>2]|0)+X|0)|0]|0)==(a[X+103664|0]|0)){X=X+1|0}else{break L23089}}if((X|0)==1){af=0;break L23087}}}while(0);a[14176]=1;is(j);a[14176]=0;if((c[s>>2]|0)==3){af=c[t>>2]|0;break}else{c[13898]=P;af=0;break}}else{af=0}}while(0);c[56744]=af;break L23025}}while(0);L23101:do{if((L|0)>0&(K^1)){P=c[10036]|0;S=0;U=0;Q=N;while(1){if((a[S+218224|0]|0)==(a[P+(S+Q|0)|0]|0)){ag=Q;ah=U}else{if((S|0)!=1){break}ag=Q-1|0;ah=1}T=S+1|0;if((T|0)<(ah+L|0)){S=T;U=ah;Q=ag}else{O=17230;break}}do{if((O|0)==17230){O=0;if((ah|0)==0){if(!((S|0)==7|(S|0)==0)){break}}c[13898]=H+1;a[228464]=1;break L23025}}while(0);if(!((L|0)>0&(K^1))){O=17352;break}S=c[10036]|0;Q=0;U=0;P=N;while(1){if((a[Q+218152|0]|0)==(a[S+(Q+P|0)|0]|0)){ai=P;aj=U}else{if((Q|0)!=2){break}ai=P-1|0;aj=1}T=Q+1|0;if((T|0)<(aj+L|0)){Q=T;U=aj;P=ai}else{O=17239;break}}do{if((O|0)==17239){O=0;if((aj|0)==0){if(!((Q|0)==5|(Q|0)==1)){break}}c[13898]=H+1;a[228464]=0;break L23025}}while(0);if(!((L|0)>0&(K^1))){O=17352;break}Q=c[10036]|0;P=0;U=0;S=N;while(1){if((a[P+122880|0]|0)==(a[Q+(P+S|0)|0]|0)){ak=S;al=U}else{if((P|0)!=3){break}ak=S-1|0;al=1}T=P+1|0;if((T|0)<(al+L|0)){P=T;U=al;S=ak}else{O=17248;break}}do{if((O|0)==17248){O=0;if((al|0)==0){if(!((P|0)==8|(P|0)==2)){break}}c[13898]=H+1;c[(c[3524]|0)+68>>2]=2;S=(c[3524]|0)+96|0;c[S>>2]=c[S>>2]|32;break L23025}}while(0);if(!((L|0)>0&(K^1))){O=17352;break}P=c[10036]|0;S=0;U=0;Q=N;while(1){if((a[S+121536|0]|0)==(a[P+(S+Q|0)|0]|0)){am=Q;an=U}else{if((S|0)!=5){break}am=Q-1|0;an=1}T=S+1|0;if((T|0)<(an+L|0)){S=T;U=an;Q=am}else{O=17257;break}}do{if((O|0)==17257){O=0;if((an|0)==0){if(!((S|0)==10|(S|0)==4)){break}}c[13898]=H+1;c[(c[3524]|0)+68>>2]=68;Q=(c[3524]|0)+96|0;c[Q>>2]=c[Q>>2]&-33;break L23025}}while(0);if(!((L|0)>0&(K^1))){O=17352;break}S=c[10036]|0;Q=0;U=0;P=N;while(1){if((a[Q+218144|0]|0)==(a[S+(Q+P|0)|0]|0)){ao=P;ap=U}else{if((Q|0)!=2){O=17268;break}ao=P-1|0;ap=1}T=Q+1|0;if((T|0)<(ap+L|0)){Q=T;U=ap;P=ao}else{O=17266;break}}do{if((O|0)==17266){O=0;if((ap|0)!=0){break}if(!((Q|0)==1|(Q|0)==5)){O=17268}}}while(0);L23164:do{if((O|0)==17268){O=0;if(K){O=17352;break L23101}L23167:do{if((L|0)>0){Q=c[10036]|0;P=0;do{if((a[P+124352|0]|0)!=(a[Q+(P+N|0)|0]|0)){break L23167}P=P+1|0;}while((P|0)<(L|0));if((P|0)==4){break L23164}}}while(0);if(!((L|0)>0&(K^1))){O=17352;break L23101}Q=c[10036]|0;X=0;U=0;S=N;while(1){if((a[X+218024|0]|0)==(a[Q+(X+S|0)|0]|0)){aq=S;ar=U}else{if((X|0)!=2){break}aq=S-1|0;ar=1}T=X+1|0;if((T|0)<(ar+L|0)){X=T;U=ar;S=aq}else{O=17306;break}}do{if((O|0)==17306){O=0;if((ar|0)==0){if(!((X|0)==5|(X|0)==1)){break}}as=H+1|0;c[13898]=as;if((as|0)>=(I|0)){O=17438;break L22960}L23187:do{if((a[J+(as*40&-1)|0]&1)!=0){S=c[J+(as*40&-1)+36>>2]|0;U=J+(as*40&-1)+32|0;Q=c[10036]|0;T=0;while(1){if((T|0)>=(S|0)){break}if((a[Q+((c[U>>2]|0)+T|0)|0]|0)==(a[T+103664|0]|0)){T=T+1|0}else{break L23187}}if((T|0)==1){O=17437;break L22960}}}while(0);P=is(e)|0;U=c[P>>2]|0;if((U|0)==1){at=+(c[P+8>>2]|0)}else if((U|0)==2){at=+h[P+8>>3]}else if((U|0)==3){at=+uz(c[P+8>>2]|0,0)}else{O=17319;break L22960}if((c[z>>2]|0)==3){uu(c[A>>2]|0);c[z>>2]=1}h[28551]=at;break L23025}}while(0);if(!((L|0)>0&(K^1))){O=17352;break L23101}X=c[10036]|0;P=0;while(1){if((a[P+217952|0]|0)!=(a[X+(P+N|0)|0]|0)){break}au=P+1|0;if((au|0)<(L|0)){P=au}else{O=17327;break}}do{if((O|0)==17327){O=0;if((au|0)!=8){break}av=H+1|0;c[13898]=av;if((av|0)>=(I|0)){O=17336;break L22960}L23211:do{if((a[J+(av*40&-1)|0]&1)!=0){P=c[J+(av*40&-1)+36>>2]|0;X=J+(av*40&-1)+32|0;U=c[10036]|0;Q=0;while(1){if((Q|0)>=(P|0)){break}if((a[U+((c[X>>2]|0)+Q|0)|0]|0)==(a[Q+103664|0]|0)){Q=Q+1|0}else{break L23211}}if((Q|0)==1){O=17336;break L22960}}}while(0);a[14176]=1;is(d);a[14176]=0;if((c[x>>2]|0)!=3){O=17335;break L22960}X=c[y>>2]|0;c[n>>2]=X;if((X|0)==0){O=17338;break L22960}iQ(n);aw=c[n>>2]|0;if((a[aw]|0)==60){ax=aw}else{ax=hB(aw)|0}c[57122]=ax;if((ax|0)==0){O=17343;break L22960}else{break L23025}}}while(0);if(!((L|0)>0&(K^1))){O=17352;break L23101}X=c[10036]|0;U=0;P=0;T=N;while(1){if((a[U+128400|0]|0)==(a[X+(U+T|0)|0]|0)){ay=T;az=P}else{if((U|0)!=5){O=17352;break L23101}ay=T-1|0;az=1}S=U+1|0;if((S|0)<(az+L|0)){U=S;P=az;T=ay}else{break}}if((az|0)!=0){break L23101}if((U|0)==4|(U|0)==9){break L23101}else{O=17352;break L23101}}}while(0);aA=H+1|0;c[13898]=aA;if((aA|0)>=(I|0)){aB=aA;O=17445;break L22960}L23235:do{if((a[J+(aA*40&-1)|0]&1)!=0){T=c[J+(aA*40&-1)+36>>2]|0;P=J+(aA*40&-1)+32|0;X=c[10036]|0;S=0;while(1){if((S|0)>=(T|0)){break}if((a[X+((c[P>>2]|0)+S|0)|0]|0)==(a[S+103664|0]|0)){S=S+1|0}else{break L23235}}if((S|0)==1){aB=aA;O=17446;break L22960}}}while(0);a[14176]=1;is(f);a[14176]=0;if((c[B>>2]|0)!=3){O=17281;break L22960}P=c[C>>2]|0;if((P|0)==0){O=17283;break L22960}X=bh(P|0,44)|0;do{if((X|0)!=0){if((ca(X+1|0,148448,(v=i,i=i+8|0,c[v>>2]=228408,v)|0)|0)!=1){break}a[X]=0}}while(0);if((a[P]|0)==0){uu(P);break L23025}X=aQ(P|0,75096)|0;if((X|0)==0){aC=aQ(P|0,75048)|0}else{aC=X}X=aQ(P|0,74992)|0;if((X|0)==0){aD=aQ(P|0,74976)|0}else{aD=X}uu(c[57106]|0);c[57106]=P;if((aD|0)==0){c[57098]=77432}else{c[57098]=74936;X=uA(P|0)|0;a[P+(X-(uA(aD|0)|0)|0)|0]=0}if((aC|0)==0){c[57094]=77432;break L23025}else{c[57094]=74928;X=uA(P|0)|0;T=X-(uA(aC|0)|0)|0;a[(c[57106]|0)+T|0]=0;break L23025}}else{O=17352}}while(0);L23264:do{if((O|0)==17352){O=0;L23266:do{if(M){if(K){O=17429;break L22960}T=c[10036]|0;X=0;while(1){if((X|0)>=(L|0)){break}if((a[T+(N+X|0)|0]|0)==(a[X+128296|0]|0)){X=X+1|0}else{break L23266}}if((X|0)==2){break L23264}}}while(0);L23274:do{if((L|0)>0&(K^1)){P=c[10036]|0;T=0;S=0;U=N;while(1){if((a[T+217776|0]|0)==(a[P+(T+U|0)|0]|0)){aE=U;aF=S}else{if((T|0)!=5){break L23274}aE=U-1|0;aF=1}R=T+1|0;if((R|0)<(aF+L|0)){T=R;S=aF;U=aE}else{break}}if((aF|0)==0){if(!((T|0)==7|(T|0)==4)){break}}c[13898]=H+1;a[226984]=1;break L23025}}while(0);L23287:do{if(M){L23289:do{if(!K){U=c[10036]|0;S=0;while(1){if((S|0)>=(L|0)){break}if((a[U+(N+S|0)|0]|0)==(a[S+137232|0]|0)){S=S+1|0}else{break L23289}}if((S|0)!=4){break}c[13898]=H+1;a[226984]=0;break L23025}}while(0);if(!M){break}if(K){O=17428;break L22960}T=c[10036]|0;U=0;while(1){if((U|0)>=(L|0)){break}if((a[T+(N+U|0)|0]|0)==(a[U+131504|0]|0)){U=U+1|0}else{break L23287}}if((U|0)!=5){break}c[13898]=H+1;a[228520]=0;break L23025}}while(0);if(!((L|0)>0&(K^1))){O=17434;break L22960}T=c[10036]|0;P=0;X=0;R=N;while(1){if((a[P+217752|0]|0)==(a[T+(P+R|0)|0]|0)){aG=R;aH=X}else{if((P|0)!=4){break}aG=R-1|0;aH=1}aI=P+1|0;if((aI|0)<(aH+L|0)){P=aI;X=aH;R=aG}else{O=17396;break}}do{if((O|0)==17396){O=0;if((aH|0)==0){if(!((P|0)==6|(P|0)==3)){break}}c[13898]=H+1;a[228520]=1;break L23025}}while(0);if(!((L|0)>0&(K^1))){O=17432;break L22960}P=c[10036]|0;R=0;X=0;T=N;while(1){if((a[R+217736|0]|0)==(a[P+(R+T|0)|0]|0)){aJ=T;aK=X}else{if((R|0)!=5){O=17426;break L22960}aJ=T-1|0;aK=1}aI=R+1|0;if((aI|0)<(aK+L|0)){R=aI;X=aK;T=aJ}else{break}}if((aK|0)==0){if(!((R|0)==10|(R|0)==4)){O=17433;break L22960}}c[13898]=H+1;c[57136]=hK()|0;break L23025}}while(0);c[13898]=H+1;T=is(g)|0;X=c[T>>2]|0;if((X|0)==3){aL=+uz(c[T+8>>2]|0,0)}else if((X|0)==1){aL=+(c[T+8>>2]|0)}else if((X|0)==2){aL=+h[T+8>>3]}else{O=17362;break L22960}if((c[u>>2]|0)==3){uu(c[w>>2]|0);c[u>>2]=1}h[28540]=aL;if(aL>0.0){break L23025}h[28540]=1.0;break L23025}}while(0);c[13898]=H+1;a[228312]=1}}while(0);L=c[13898]|0;K=c[8272]|0;if((L|0)<(K|0)){H=L;I=K}else{break L22958}}if((O|0)==17343){uf(c[13898]|0,219072,(v=i,i=i+8|0,c[v>>2]=aw,v)|0)}else if((O|0)==17134){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17434){uf(H,217704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17437){uf(as,217992,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17438){uf(as,217992,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17440){uf(_,218600,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17445){uf(aB,116592,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17362){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17161){uf(c[13898]|0,218544,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17424){uf(Y,218656,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17425){uf(Y,218656,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17426){uf(H,217704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17427){uf(H,217704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17428){uf(H,217704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17439){uf(_,218600,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17335){c[13898]=av;O=17336}else if((O|0)==17446){uf(aB,116592,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17281){c[13898]=aA;aB=aA;uf(aB,116592,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17283){aB=c[13898]|0;uf(aB,116592,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17338){aM=c[13898]|0;uf(aM,217824,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17429){uf(H,217704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17430){uf(H,217704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17431){uf(H,217704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17432){uf(H,217704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17433){uf(H,217704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17319){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17157){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17207){uf((c[13898]|0)-1|0,218240,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17138){uf(c[13898]|0,218632,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17201){c[13898]=ae;O=17202}else if((O|0)==17204){aN=c[13898]|0;uf(aN,218392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((O|0)==17336){c[n>>2]=0;aM=av;uf(aM,217824,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((O|0)==17202){c[57076]=0;aN=ae;uf(aN,218392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);qj(179864);aN=~~(+((c[56734]|0)>>>0>>>0)/10.0);ae=a[228464]|0?217584:217656;O=(c[(c[3524]|0)+68>>2]|0)==2?217456:179864;aM=c[57108]|0;aL=+h[28552];be(13048,217664,(v=i,i=i+48|0,c[v>>2]=~~(+((c[56738]|0)>>>0>>>0)/10.0),c[v+8>>2]=aN,c[v+16>>2]=ae,c[v+24>>2]=O,c[v+32>>2]=aM,h[v+40>>3]=aL,v)|0);if(a[228312]|0){uD(13048+(uA(13048)|0)|0,217392,9)}if(a[226968]|0){uD(13048+(uA(13048)|0)|0,217272,12)}aM=c[57076]|0;if((aM|0)!=0){O=13048+(uA(13048)|0)|0;be(O|0,217200,(v=i,i=i+8|0,c[v>>2]=aM,v)|0)}aM=c[57122]|0;if((aM|0)!=0){O=13048+(uA(13048)|0)|0;be(O|0,217096,(v=i,i=i+8|0,c[v>>2]=aM,v)|0)}aM=13048+(uA(13048)|0)|0;be(aM|0,(a[226984]|0?132112:217056)|0,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);aM=13048+(uA(13048)|0)|0;be(aM|0,(a[228520]|0?217032:217e3)|0,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);aL=+h[28540];if(aL!=1.0){aM=13048+(uA(13048)|0)|0;be(aM|0,216912,(v=i,i=i+8|0,h[v>>3]=aL,v)|0)}aM=c[57136]|0;if((aM|0)<=-1){i=b;return}be(13048+(uA(13048)|0)|0,216792,(v=i,i=i+8|0,c[v>>2]=aM,v)|0);i=b;return}function p7(){aI(222944,8,1,c[10030]|0);return}function p8(){var b=0,d=0,e=0,f=0.0,g=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,x=0,y=0.0,z=0.0,A=0,B=0,C=0,D=0,E=0;b=i;i=i+512|0;d=b|0;e=b+256|0;f=+h[28571];h[28376]=f;a[227016]=a[84376]|0;a[227017|0]=a[84377|0]|0;a[227018|0]=a[84378|0]|0;a[227019|0]=a[84379|0]|0;a[227020|0]=a[84380|0]|0;a[227021|0]=a[84381|0]|0;h[28378]=f;a[227032]=a[89416]|0;a[227033|0]=a[89417|0]|0;a[227034|0]=a[89418|0]|0;a[227035|0]=a[89419|0]|0;a[227036|0]=a[89420|0]|0;a[227037|0]=a[89421|0]|0;h[28380]=f;a[227048]=a[89352]|0;a[227049|0]=a[89353|0]|0;a[227050|0]=a[89354|0]|0;a[227051|0]=a[89355|0]|0;a[227052|0]=a[89356|0]|0;h[28382]=f;c[56766]=6579570;h[28384]=f;a[227080]=a[89296]|0;a[227081|0]=a[89297|0]|0;a[227082|0]=a[89298|0]|0;a[227083|0]=a[89299|0]|0;a[227084|0]=a[89300|0]|0;a[227085|0]=a[89301|0]|0;h[28386]=f;a[227096]=a[89328]|0;a[227097|0]=a[89329|0]|0;a[227098|0]=a[89330|0]|0;a[227099|0]=a[89331|0]|0;a[227100|0]=a[89332|0]|0;h[28388]=f;a[227112]=a[89248]|0;a[227113|0]=a[89249|0]|0;a[227114|0]=a[89250|0]|0;a[227115|0]=a[89251|0]|0;a[227116|0]=a[89252|0]|0;h[28390]=f;be(227128,222904,(v=i,i=i+24|0,c[v>>2]=21,c[v+8>>2]=117,c[v+16>>2]=69,v)|0);h[28392]=+h[28571];be(227144,222904,(v=i,i=i+24|0,c[v>>2]=0,c[v+8>>2]=0,c[v+16>>2]=148,v)|0);h[28394]=+h[28571];be(227160,222904,(v=i,i=i+24|0,c[v>>2]=255,c[v+8>>2]=153,c[v+16>>2]=0,v)|0);h[28396]=+h[28571];be(227176,222904,(v=i,i=i+24|0,c[v>>2]=0,c[v+8>>2]=153,c[v+16>>2]=161,v)|0);h[28398]=+h[28571];be(227192,222904,(v=i,i=i+24|0,c[v>>2]=214,c[v+8>>2]=214,c[v+16>>2]=69,v)|0);h[28400]=+h[28571];be(227208,222904,(v=i,i=i+24|0,c[v>>2]=163,c[v+8>>2]=145,c[v+16>>2]=255,v)|0);h[28402]=+h[28571];be(227224,222904,(v=i,i=i+24|0,c[v>>2]=255,c[v+8>>2]=204,c[v+16>>2]=0,v)|0);h[28404]=+h[28571];be(227240,222904,(v=i,i=i+24|0,c[v>>2]=214,c[v+8>>2]=0,c[v+16>>2]=120,v)|0);h[28406]=+h[28571];be(227256,222904,(v=i,i=i+24|0,c[v>>2]=171,c[v+8>>2]=214,c[v+16>>2]=0,v)|0);g=c[57136]|0;if((g|0)>-1){j=g>>>16&255;k=g>>>8&255;l=g&255;be(227016,222904,(v=i,i=i+24|0,c[v>>2]=j,c[v+8>>2]=k,c[v+16>>2]=l,v)|0)}c[57144]=-3;c[(c[3524]|0)+8>>2]=c[56738];c[(c[3524]|0)+12>>2]=c[56734];f=+h[28552];c[57114]=~~(f*10.0);l=~~(f*.25*10.0);c[57112]=l;c[57110]=l;c[(c[3524]|0)+20>>2]=~~(f*.7*10.0);c[(c[3524]|0)+16>>2]=((c[57112]|0)+(c[57114]|0)|0)+(c[57110]|0);l=c[3524]|0;c[l+28>>2]=(c[l+16>>2]|0)>>>1;l=c[3524]|0;c[l+24>>2]=(c[l+16>>2]|0)>>>1;l=c[11252]|0;if((l|0)==6){n=222720}else if((l|0)==14){n=222200}else if((l|0)==13){n=222296}else if((l|0)==1){n=222880}else if((l|0)==9){n=222584}else if((l|0)==12){n=222392}else if((l|0)==2){n=222832}else if((l|0)==4){n=222768}else if((l|0)==10){n=222496}else if((l|0)==8){n=222656}else if((l|0)==7){n=222696}else if((l|0)==3){n=222800}else if((l|0)==5){n=179864}else{n=222152}cf(c[10030]|0,222e3,(v=i,i=i+8|0,c[v>>2]=n,v)|0);if(a[228312]|0){n=c[10030]|0;aI(221896,69,1,n|0)}if(!(a[228464]|0)){n=c[10030]|0;l=c[3524]|0;k=~~(+((c[l+8>>2]|0)>>>0>>>0)/10.0);j=~~(+((c[l+12>>2]|0)>>>0>>>0)/10.0);cf(n|0,221864,(v=i,i=i+16|0,c[v>>2]=k,c[v+8>>2]=j,v)|0)}j=c[3524]|0;k=~~(+((c[j+12>>2]|0)>>>0>>>0)/10.0);cf(c[10030]|0,221816,(v=i,i=i+16|0,c[v>>2]=~~(+((c[j+8>>2]|0)>>>0>>>0)/10.0),c[v+8>>2]=k,v)|0);aI(221760,36,1,c[10030]|0);aI(221680,44,1,c[10030]|0);aI(221632,3,1,c[10030]|0);k=c[57076]|0;cf(c[10030]|0,221608,(v=i,i=i+8|0,c[v>>2]=(k|0)!=0?k:221552,v)|0);cf(c[10030]|0,221496,(v=i,i=i+16|0,c[v>>2]=40152,c[v+8>>2]=40160,v)|0);k=c[56744]|0;if((k|0)==0){j=bP(221464)|0;c[56744]=j;o=j}else{o=k}k=uA(o|0)|0;do{if((a[o]|0)!=0){if((a[o+(k-1|0)|0]|0)==47){break}j=db(o,k+2|0,221440)|0;c[56744]=j;n=j+(uA(j|0)|0)|0;w=47;a[n]=w&255;w=w>>8;a[n+1|0]=w&255}}while(0);do{if(a[228312]|0){if(a[226968]|0){k=(uA(c[56744]|0)|0)+18|0;o=ut(k)|0;do{if((o|0)==0){gk();n=ut(k)|0;if((n|0)!=0){p=n;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=221224,v)|0)}else{p=o}}while(0);o=c[56744]|0;uB(p|0,o|0);o=uA(p|0)|0;k=(o|0)==0?0:o-1|0;o=a[p+k|0]|0;if(!((o<<24>>24|0)==47|(o<<24>>24|0)==0)){a[p+(k+1|0)|0]=47;a[p+(k+2|0)|0]=0}uD(p+(uA(p|0)|0)|0,221256,15);k=bF(p|0,193632)|0;if((k|0)==0){uh(-1,221176,(v=i,i=i+8|0,c[v>>2]=p,v)|0)}else{o=c[10030]|0;aI(221096,65,1,o|0);o=e|0;n=(a6(o|0,256,k|0)|0)==0;j=c[10030]|0;if(n){q=j}else{n=j;while(1){aK(o|0,n|0);j=(a6(o|0,256,k|0)|0)==0;l=c[10030]|0;if(j){q=l;break}else{n=l}}}aI(223416,14,1,q|0);az(k|0)}uu(p)}else{n=c[10030]|0;o=c[56744]|0;cf(n|0,221312,(v=i,i=i+8|0,c[v>>2]=o,v)|0)}o=c[10030]|0;if(!(a[228312]|0)){r=o;s=17490;break}aI(221032,57,1,o|0);o=c[10030]|0;n=c[3524]|0;l=~~(+((c[n+8>>2]|0)>>>0>>>0)/10.0);j=~~(+((c[n+12>>2]|0)>>>0>>>0)/10.0);cf(o|0,220984,(v=i,i=i+32|0,c[v>>2]=0,c[v+8>>2]=0,c[v+16>>2]=l,c[v+24>>2]=j,v)|0);j=c[10030]|0;l=c[57136]|0;o=(l|0)>0?l:16777215;cf(j|0,220920,(v=i,i=i+8|0,c[v>>2]=o,v)|0);o=c[10030]|0;aI(220824,89,1,o|0);o=c[10030]|0;aI(220712,56,1,o|0);o=c[10030]|0;aI(220560,111,1,o|0)}else{r=c[10030]|0;s=17490}}while(0);if((s|0)==17490){aI(220520,25,1,r|0);r=c[10030]|0;s=c[3524]|0;p=~~(+((c[s+8>>2]|0)>>>0>>>0)/10.0);q=~~(+((c[s+12>>2]|0)>>>0>>>0)/10.0);cf(r|0,220984,(v=i,i=i+32|0,c[v>>2]=0,c[v+8>>2]=0,c[v+16>>2]=p,c[v+24>>2]=q,v)|0);q=c[57136]|0;p=c[10030]|0;if((q|0)>-1){cf(p|0,220448,(v=i,i=i+8|0,c[v>>2]=q,v)|0)}else{aI(77208,12,1,p|0)}p=c[10030]|0;aI(220440,3,1,p|0)}aI(220400,7,1,c[10030]|0);p=c[57122]|0;if((p|0)==0){t=c[3524]|0;u=t+28|0;x=c[u>>2]|0;y=+(x>>>0>>>0);z=20.0/y;A=c[10030]|0;B=cf(A|0,219192,(v=i,i=i+56|0,h[v>>3]=z,h[v+8>>3]=z,h[v+16>>3]=z,h[v+24>>3]=z,h[v+32>>3]=z,h[v+40>>3]=z,h[v+48>>3]=z,v)|0)|0;i=b;return}q=d|0;do{if((a[p]|0)==60){if(!(a[14168]|0)){uf(-1,145320,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}d=p+1|0;r=bt(d|0,193632)|0;if((r|0)!=0){C=1;D=r;break}uf(-1,219160,(v=i,i=i+8|0,c[v>>2]=d,v)|0)}else{d=bF(p|0,193632)|0;if((d|0)!=0){C=0;D=d;break}uf(-1,219072,(v=i,i=i+8|0,c[v>>2]=p,v)|0)}}while(0);if((a6(q|0,255,D|0)|0)==0){E=0}else{d=0;while(1){r=aQ(q|0,219056)|0;if((r|0)!=0){s=c[m>>2]|0;cf(s|0,218992,(v=i,i=i+16|0,c[v>>2]=p,c[v+8>>2]=r,v)|0)}aK(q|0,c[10030]|0);r=d+1|0;if((a6(q|0,255,D|0)|0)==0){E=r;break}else{d=r}}}do{if(C){d=a2(D|0)|0;if((d|0)==0){break}uf(-1,218832,(v=i,i=i+16|0,c[v>>2]=p+1,c[v+8>>2]=d,v)|0)}else{az(D|0)}}while(0);if((E|0)!=0){t=c[3524]|0;u=t+28|0;x=c[u>>2]|0;y=+(x>>>0>>>0);z=20.0/y;A=c[10030]|0;B=cf(A|0,219192,(v=i,i=i+56|0,h[v>>3]=z,h[v+8>>3]=z,h[v+16>>3]=z,h[v+24>>3]=z,h[v+32>>3]=z,h[v+40>>3]=z,h[v+48>>3]=z,v)|0)|0;i=b;return}if(C){uf(-1,218792,(v=i,i=i+8|0,c[v>>2]=p+1,v)|0)}else{uf(-1,218744,(v=i,i=i+8|0,c[v>>2]=p,v)|0)}}function p9(a){a=a|0;c[57140]=a;return 1}function qa(a){a=a|0;c[57138]=a;return 1}function qb(){var b=0,d=0,e=0,f=0.0,g=0,j=0,k=0;b=i;if(a[227272]|0){if(a[228352]|0){d=c[10030]|0;aI(78232,6,1,d|0);a[228352]=0}d=c[10030]|0;aI(78240,9,1,d|0);c[56816]=0;a[227272]=0}if(a[228352]|0){d=c[10030]|0;aI(78232,6,1,d|0);a[228352]=0}if(a[228344]|0){d=c[10030]|0;aI(77776,5,1,d|0);a[228344]=0;c[57120]=-1}if(a[228312]|0){d=c[10030]|0;aI(73376,42,1,d|0);d=c[10030]|0;aI(73296,61,1,d|0);d=c[10030]|0;e=~~(+((c[(c[3524]|0)+8>>2]|0)>>>0>>>0)/10.0);cf(d|0,73248,(v=i,i=i+8|0,c[v>>2]=e,v)|0);e=c[10030]|0;d=~~(+((c[(c[3524]|0)+12>>2]|0)>>>0>>>0)/10.0);cf(e|0,73192,(v=i,i=i+8|0,c[v>>2]=d,v)|0);d=c[10030]|0;f=+(c[7938]|0)/10.0;cf(d|0,73160,(v=i,i=i+8|0,h[v>>3]=f,v)|0);d=c[10030]|0;f=+(c[7939]|0)/10.0;cf(d|0,73120,(v=i,i=i+8|0,h[v>>3]=f,v)|0);d=c[10030]|0;f=+(((c[(c[3524]|0)+12>>2]|0)-(c[7940]|0)|0)>>>0>>>0)/10.0;cf(d|0,73088,(v=i,i=i+8|0,h[v>>3]=f,v)|0);d=c[10030]|0;f=+(((c[(c[3524]|0)+12>>2]|0)-(c[7941]|0)|0)>>>0>>>0)/10.0;cf(d|0,73056,(v=i,i=i+8|0,h[v>>3]=f,v)|0);d=c[10030]|0;f=+((c[7939]|0)-(c[7938]|0)|0)/10.0;cf(d|0,72960,(v=i,i=i+8|0,h[v>>3]=f,v)|0);d=c[10030]|0;f=+((c[7941]|0)-(c[7940]|0)|0)/10.0;cf(d|0,72872,(v=i,i=i+8|0,h[v>>3]=f,v)|0);e7(1);do{if((c[16546]|0)!=1){d=e6(72800)|0;do{if((d|0)!=0){e=c[d+16>>2]|0;if((e|0)==2){g=c[10030]|0;f=+h[d+24>>3];cf(g|0,72560,(v=i,i=i+16|0,c[v>>2]=72688,h[v+8>>3]=f,v)|0);break}else if((e|0)==1){e=c[d+24>>2]|0;cf(c[10030]|0,72752,(v=i,i=i+16|0,c[v>>2]=72688,c[v+8>>2]=e,v)|0);break}else{break}}}while(0);d=e6(72544)|0;if((d|0)==0){break}e=c[d+16>>2]|0;if((e|0)==1){g=c[10030]|0;j=c[d+24>>2]|0;cf(g|0,72752,(v=i,i=i+16|0,c[v>>2]=72528,c[v+8>>2]=j,v)|0);break}else if((e|0)==2){f=+h[d+24>>3];cf(c[10030]|0,72560,(v=i,i=i+16|0,c[v>>2]=72528,h[v+8>>3]=f,v)|0);break}else{break}}}while(0);d=e6(225256)|0;do{if((d|0)!=0){e=c[d+16>>2]|0;if((e|0)==2){j=c[10030]|0;f=+h[d+24>>3];cf(j|0,72560,(v=i,i=i+16|0,c[v>>2]=225240,h[v+8>>3]=f,v)|0);break}else if((e|0)==1){e=c[d+24>>2]|0;cf(c[10030]|0,72752,(v=i,i=i+16|0,c[v>>2]=225240,c[v+8>>2]=e,v)|0);break}else{break}}}while(0);d=e6(225200)|0;do{if((d|0)!=0){e=c[d+16>>2]|0;if((e|0)==2){j=c[10030]|0;f=+h[d+24>>3];cf(j|0,72560,(v=i,i=i+16|0,c[v>>2]=225128,h[v+8>>3]=f,v)|0);break}else if((e|0)==1){e=c[d+24>>2]|0;cf(c[10030]|0,72752,(v=i,i=i+16|0,c[v>>2]=225128,c[v+8>>2]=e,v)|0);break}else{break}}}while(0);d=c[10030]|0;e=(a[30528]&1)!=0?225e3:224992;cf(d|0,225024,(v=i,i=i+8|0,c[v>>2]=e,v)|0);if((a[30528]&1)!=0){e=c[10030]|0;f=(c[17366]&1|0)==0?+h[8687]:0.0;cf(e|0,224952,(v=i,i=i+8|0,h[v>>3]=f,v)|0)}do{if((c[17261]&3|0)==0){e=c[10030]|0;aI(224720,37,1,e|0)}else{e=e6(224936)|0;do{if((e|0)!=0){d=c[e+16>>2]|0;if((d|0)==1){j=c[10030]|0;g=c[e+24>>2]|0;cf(j|0,72752,(v=i,i=i+16|0,c[v>>2]=224920,c[v+8>>2]=g,v)|0);break}else if((d|0)==2){f=+h[e+24>>3];cf(c[10030]|0,72560,(v=i,i=i+16|0,c[v>>2]=224920,h[v+8>>3]=f,v)|0);break}else{break}}}while(0);e=e6(224872)|0;if((e|0)==0){break}d=c[e+16>>2]|0;if((d|0)==2){g=c[10030]|0;f=+h[e+24>>3];cf(g|0,72560,(v=i,i=i+16|0,c[v>>2]=224832,h[v+8>>3]=f,v)|0);break}else if((d|0)==1){d=c[e+24>>2]|0;cf(c[10030]|0,72752,(v=i,i=i+16|0,c[v>>2]=224832,c[v+8>>2]=d,v)|0);break}else{break}}}while(0);do{if((c[17089]&3|0)==0){d=c[10030]|0;aI(224096,37,1,d|0)}else{d=e6(224640)|0;do{if((d|0)!=0){e=c[d+16>>2]|0;if((e|0)==1){g=c[10030]|0;j=c[d+24>>2]|0;cf(g|0,72752,(v=i,i=i+16|0,c[v>>2]=224528,c[v+8>>2]=j,v)|0);break}else if((e|0)==2){f=+h[d+24>>3];cf(c[10030]|0,72560,(v=i,i=i+16|0,c[v>>2]=224528,h[v+8>>3]=f,v)|0);break}else{break}}}while(0);d=e6(224432)|0;if((d|0)==0){break}e=c[d+16>>2]|0;if((e|0)==1){j=c[10030]|0;g=c[d+24>>2]|0;cf(j|0,72752,(v=i,i=i+16|0,c[v>>2]=224320,c[v+8>>2]=g,v)|0);break}else if((e|0)==2){f=+h[d+24>>3];cf(c[10030]|0,72560,(v=i,i=i+16|0,c[v>>2]=224320,h[v+8>>3]=f,v)|0);break}else{break}}}while(0);d=c[10030]|0;e=a[66164]&1;cf(d|0,224040,(v=i,i=i+8|0,c[v>>2]=e,v)|0);e=c[10030]|0;d=a[65476]&1;cf(e|0,223976,(v=i,i=i+8|0,c[v>>2]=d,v)|0);if((a[30528]&1)!=0){d=c[10030]|0;e=a[69604]&1;cf(d|0,223896,(v=i,i=i+8|0,c[v>>2]=e,v)|0)}e=c[10030]|0;if((c[16546]|0)==1){f=+h[8255];cf(e|0,223808,(v=i,i=i+8|0,h[v>>3]=f,v)|0);d=c[10030]|0;f=+h[8256];cf(d|0,223728,(v=i,i=i+8|0,h[v>>3]=f,v)|0);d=c[10030]|0;g=c[8510]|0;do{if((g|0)==0){j=c[8506]|0;if((j|0)==4){k=223560;break}k=(j|0)==5?223536:223520}else{k=g}}while(0);cf(d|0,223648,(v=i,i=i+8|0,c[v>>2]=k,v)|0)}else{aI(223432,34,1,e|0)}e=c[10030]|0;aI(223416,14,1,e|0)}aI(77776,5,1,c[10030]|0);if(!(a[228312]|0)){i=b;return}aI(223344,67,1,c[10030]|0);aI(223288,37,1,c[10030]|0);aI(223240,31,1,c[10030]|0);if(!(a[228312]|0)){i=b;return}if(!(a[228336]|0)){i=b;return}cf(c[10030]|0,223112,(v=i,i=i+8|0,c[v>>2]=~~(+((c[(c[3524]|0)+12>>2]|0)>>>0>>>0)/10.0)-26,v)|0);aI(222992,42,1,c[10030]|0);i=b;return}function qc(){tu();c[57120]=-1;c[57118]=0;a[228352]=0;a[228528]=0;a[227272]=0;c[56736]=-1;c[56740]=-1;return}function qd(a,b){a=a|0;b=b|0;if((c[56740]|0)==(a|0)&(c[56736]|0)==(b|0)){return}tv(a,b);return}function qe(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0.0;e=i;f=c[56740]|0;g=c[56736]|0;if((f|0)==(b|0)&(g|0)==(d|0)){i=e;return}if(!(a[227272]|0)){tv(f,g)}j=+((c[(c[3524]|0)+12>>2]|0)-d|0)/10.0;cf(c[10030]|0,73912,(v=i,i=i+16|0,h[v>>3]=+(b>>>0>>>0)/10.0,h[v+8>>3]=j,v)|0);g=(c[56816]|0)+1|0;c[56816]=g;if((g&7|0)==0){g=c[10030]|0;aI(73904,3,1,g|0)}c[56740]=b;c[56736]=d;i=e;return}function qf(b){b=b|0;var d=0;a[228528]=0;if((c[57144]|0)==(b|0)){return}if(a[227272]|0){if(a[228352]|0){d=c[10030]|0;aI(78232,6,1,d|0);a[228352]=0}d=c[10030]|0;aI(78240,9,1,d|0);c[56816]=0;a[227272]=0}if(a[228352]|0){d=c[10030]|0;aI(78232,6,1,d|0);a[228352]=0}if(a[228344]|0){d=c[10030]|0;aI(77776,5,1,d|0);a[228344]=0;c[57120]=-1}c[57144]=b;tu();return}function qg(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0.0,n=0,o=0;g=i;if(a[227272]|0){if(a[228352]|0){j=c[10030]|0;aI(78232,6,1,j|0);a[228352]=0}j=c[10030]|0;aI(78240,9,1,j|0);c[56816]=0;a[227272]=0}j=c[57138]|0;if((j|0)==1){k=74560}else if((j|0)==0){k=74592}else{k=74552}j=((c[57140]|0)%180&-1|0)==0;l=((c[57114]|0)-(c[57112]|0)|0)/2&-1;m=+(((j?l:0)-e|0)+(c[(c[3524]|0)+12>>2]|0)|0)/10.0;cf(c[10030]|0,74504,(v=i,i=i+16|0,h[v>>3]=+((j?0:l)+b|0)/10.0,h[v+8>>3]=m,v)|0);b=c[57140]|0;if((b|0)!=0){l=c[10030]|0;j=-b|0;cf(l|0,74488,(v=i,i=i+8|0,c[v>>2]=j,v)|0)}aI(74456,27,1,c[10030]|0);j=a[228528]|0;do{if(j<<24>>24==3){l=c[10030]|0;b=d[226992]|0;e=d[228368]|0;n=d[228536]|0;cf(l|0,74424,(v=i,i=i+24|0,c[v>>2]=b,c[v+8>>2]=e,c[v+16>>2]=n,v)|0)}else{n=c[10030]|0;if(j<<24>>24==1){e=c[57082]|0;aK(e|0,n|0);break}e=c[57144]|0;if((e|0)>12){o=(e|0)%13&-1}else{o=e}e=o+3|0;b=227016+(((e|0)<0?0:e<<16>>16)<<4)|0;aK(b|0,n|0)}}while(0);m=+h[28552];cf(c[10030]|0,74384,(v=i,i=i+16|0,c[v>>2]=c[57108],h[v+8>>3]=m,v)|0);o=c[57096]|0;do{if((o|0)!=0){if((aY(o|0,77432)|0)==0){break}j=c[10030]|0;cf(j|0,74280,(v=i,i=i+8|0,c[v>>2]=o,v)|0)}}while(0);o=c[57100]|0;do{if((o|0)!=0){if((aY(o|0,77432)|0)==0){break}j=c[10030]|0;cf(j|0,74256,(v=i,i=i+8|0,c[v>>2]=o,v)|0)}}while(0);cf(c[10030]|0,74160,(v=i,i=i+8|0,c[v>>2]=k,v)|0);k=(aQ(f|0,74128)|0)==0;o=c[10030]|0;if(k){aI(74024,8,1,o|0)}else{aI(74096,29,1,o|0)}if(a[237856]|0){i=g;return}o=a[f]|0;if(o<<24>>24!=0){k=f;f=o;do{o=f<<24>>24;L23666:do{if((o|0)==60){j=c[10030]|0;aI(74016,4,1,j|0)}else if((o|0)==38){do{if((a[k+1|0]|0)==35){if((a[k+2|0]|0)!=120){break}j=c[10030]|0;aF(38,j|0);break L23666}}while(0);aI(74008,5,1,c[10030]|0)}else{aF(o|0,c[10030]|0)}}while(0);k=k+1|0;f=a[k]|0;}while(f<<24>>24!=0)}aI(73992,14,1,c[10030]|0);i=g;return}function qh(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0.0;g=i;i=i+64|0;j=g|0;k=a[228528]|0;do{if(k<<24>>24==3){l=j|0;m=d[226992]|0;n=d[228368]|0;o=d[228536]|0;be(l|0,74880,(v=i,i=i+24|0,c[v>>2]=m,c[v+8>>2]=n,c[v+16>>2]=o,v)|0)}else{o=j|0;if(k<<24>>24==1){n=c[57082]|0;be(o|0,74864,(v=i,i=i+8|0,c[v>>2]=n,v)|0);break}else{a[o]=0;break}}}while(0);if(a[227272]|0){if(a[228352]|0){k=c[10030]|0;aI(78232,6,1,k|0);a[228352]=0}k=c[10030]|0;aI(78240,9,1,k|0);c[56816]=0;a[227272]=0}k=c[10030]|0;if((f|0)<0){p=+(b>>>0>>>0)/10.0;q=+((c[(c[3524]|0)+12>>2]|0)-e|0)/10.0;o=j|0;cf(k|0,74760,(v=i,i=i+24|0,h[v>>3]=p,h[v+8>>3]=q,c[v+16>>2]=o,v)|0);c[56740]=b;c[56736]=e;i=g;return}else{o=(f|0)%13&-1;q=+(b>>>0>>>0)/10.0;f=c[3524]|0;p=+((c[f+12>>2]|0)-e|0)/10.0;r=+h[1630]*+((c[f+28>>2]|0)>>>0>>>0)/20.0;f=j|0;cf(k|0,74656,(v=i,i=i+40|0,c[v>>2]=o,h[v+8>>3]=q,h[v+16>>3]=p,h[v+24>>3]=r,c[v+32>>2]=f,v)|0);c[56740]=b;c[56736]=e;i=g;return}}function qi(b){b=b|0;var d=0;c[59472]=(c[59472]|0)+1;do{if((b|0)==38){d=c[11232]|0;c[11232]=d+1;a[d]=38;d=c[11232]|0;c[11232]=d+1;a[d]=97;d=c[11232]|0;c[11232]=d+1;a[d]=109;d=c[11232]|0;c[11232]=d+1;a[d]=112;d=c[11232]|0;c[11232]=d+1;a[d]=59;return}else if((b|0)==60){d=c[11232]|0;c[11232]=d+1;a[d]=38;d=c[11232]|0;c[11232]=d+1;a[d]=108;d=c[11232]|0;c[11232]=d+1;a[d]=116;d=c[11232]|0;c[11232]=d+1;a[d]=59;return}else if((b|0)==(-2|0)){if((c[11252]|0)!=0){break}d=c[11232]|0;c[11232]=d+1;a[d]=38;return}}while(0);d=c[11232]|0;c[11232]=d+1;a[d]=b&255;return}function qj(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0.0;d=i;do{if((b|0)==0){e=17680}else{if((a[b]|0)==0){e=17680;break}f=aQ(b|0,75096)|0;if((f|0)==0){g=aQ(b|0,75048)|0}else{g=f}f=aQ(b|0,74992)|0;if((f|0)==0){j=aQ(b|0,74976)|0}else{j=f}f=bk(b|0,148464)|0;if((f|0)>0){uu(c[57108]|0);k=bP(b|0)|0;c[57108]=k;if((j|0)==0){c[57100]=77432}else{c[57100]=74936;l=uA(b|0)|0;a[k+(l-(uA(j|0)|0)|0)|0]=0}if((g|0)==0){c[57096]=77432}else{c[57096]=74928;l=uA(b|0)|0;k=l-(uA(g|0)|0)|0;a[(c[57108]|0)+k|0]=0}a[(c[57108]|0)+f|0]=0}if((a[b+f|0]|0)!=44){break}k=b+(f+1|0)|0;ca(k|0,148448,(v=i,i=i+8|0,c[v>>2]=228416,v)|0)}}while(0);if((e|0)==17680){uu(c[57108]|0);e=c[57106]|0;if((e|0)==0){m=0}else{m=bP(e|0)|0}c[57108]=m;h[28552]=+h[28551];c[57100]=c[57098];c[57096]=c[57094]}n=+h[28552];c[57114]=~~(n*10.0);m=~~(n*.25*10.0);c[57112]=m;c[57110]=m;c[(c[3524]|0)+20>>2]=~~(n*.7*10.0);c[(c[3524]|0)+16>>2]=((c[57112]|0)+(c[57114]|0)|0)+(c[57110]|0);i=d;return 1}function qk(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;g=i;i=i+48|0;h=g|0;c[h>>2]=b;c[h+4>>2]=d;j=e+b|0;c[h+12>>2]=j;c[h+16>>2]=d;c[h+24>>2]=j;j=f+d|0;c[h+28>>2]=j;c[h+36>>2]=b;c[h+40>>2]=j;c[h+8>>2]=a;qp(4,h|0);i=g;return}function ql(b){b=+b;var d=0;if(+h[28571]==b){return}h[28571]=b;h[28376]=b;h[28378]=b;h[28380]=b;h[28382]=b;h[28384]=b;h[28386]=b;h[28388]=b;h[28390]=b;h[28392]=b;h[28394]=b;h[28396]=b;h[28398]=b;h[28400]=b;h[28402]=b;h[28404]=b;h[28406]=b;if(a[227272]|0){if(a[228352]|0){d=c[10030]|0;aI(78232|0,6,1,d|0);a[228352]=0}d=c[10030]|0;aI(78240|0,9,1,d|0);c[56816]=0;a[227272]=0}if(a[228352]|0){d=c[10030]|0;aI(78232|0,6,1,d|0);a[228352]=0}if(a[228344]|0){d=c[10030]|0;aI(77776|0,5,1,d|0);a[228344]=0;c[57120]=-1}tu();return}function qm(b){b=b|0;var d=0;if(a[228352]|0){d=c[10030]|0;aI(78232,6,1,d|0);a[228352]=0}if((b|0)==0){return 0}c[56821]=c[b+4>>2];c[56822]=c[b+8>>2];c[56823]=c[b+12>>2];c[56824]=c[b+16>>2];a[227300]=a[b+20|0]|0;return 0}function qn(){if(!(a[228352]|0)){return}aI(78232,6,1,c[10030]|0);a[228352]=0;return}function qo(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0;d=i;i=i+8|0;e=d|0;f=c[b>>2]|0;if((f|0)==3){g=c[b+4>>2]|0;j=g>>>16&255;a[e|0]=j;a[e+1|0]=g>>>8&255;a[e+2|0]=g&255;k=j}else if((f|0)==1){j=c[b+4>>2]|0;if((j|0)>12){l=(j|0)%13&-1}else{l=j}j=l+3|0;c[57082]=227016+(((j|0)<0?0:j<<16>>16)<<4);a[228528]=1;i=d;return}else if((f|0)==5){fr(+h[b+8>>3],e);k=a[e|0]|0}else{i=d;return}a[228528]=3;b=e|0;do{if(k<<24>>24==(a[226992]|0)){if((a[e+1|0]|0)!=(a[228368]|0)){break}if((a[e+2|0]|0)!=(a[228536]|0)){break}i=d;return}}while(0);if(a[227272]|0){if(a[228352]|0){k=c[10030]|0;aI(78232,6,1,k|0);a[228352]=0}k=c[10030]|0;aI(78240,9,1,k|0);c[56816]=0;a[227272]=0}a[226992]=a[b]|0;a[228368]=a[e+1|0]|0;a[228536]=a[e+2|0]|0;i=d;return}function qp(b,e){b=b|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0.0;f=i;g=e+8|0;j=c[g>>2]|0;k=j>>4;l=j&15;c[g>>2]=l;do{if((l|0)==5|(l|0)==2){g=(k|0)%8&-1;if((g|0)==(c[57120]|0)){break}c[57120]=g;if(a[227272]|0){if(a[228352]|0){j=c[10030]|0;aI(78232,6,1,j|0);a[228352]=0}j=c[10030]|0;aI(78240,9,1,j|0);c[56816]=0;a[227272]=0}j=(c[57118]|0)+1|0;c[57118]=j;m=c[10030]|0;cf(m|0,76176,(v=i,i=i+8|0,c[v>>2]=j,v)|0);if((g|0)==7){n=76328;o=75816}else if((g|0)==5){n=76328;o=75896}else if((g|0)==3){n=76584;o=76e3}else if((g|0)==2){n=76328;o=76032}else if((g|0)==6){n=76328;o=75856}else if((g|0)==4){n=76328;o=75920}else if((g|0)==1){n=76328;o=76104}else{n=76328;o=179864}do{if((a[o]|0)!=0){g=(aY(n|0,76584)|0)==0?75712:75792;j=a[228528]|0;if(j<<24>>24==3){m=c[10030]|0;p=d[226992]|0;q=d[228368]|0;r=d[228536]|0;cf(m|0,75592,(v=i,i=i+48|0,c[v>>2]=g,c[v+8>>2]=n,c[v+16>>2]=p,c[v+24>>2]=q,c[v+32>>2]=r,c[v+40>>2]=o,v)|0);break}r=c[10030]|0;if(j<<24>>24==1){j=c[57082]|0;cf(r|0,75504,(v=i,i=i+32|0,c[v>>2]=g,c[v+8>>2]=n,c[v+16>>2]=j,c[v+24>>2]=o,v)|0);break}else{cf(r|0,75424,(v=i,i=i+24|0,c[v>>2]=g,c[v+8>>2]=n,c[v+16>>2]=o,v)|0);break}}}while(0);g=c[10030]|0;aI(75400,22,1,g|0)}}while(0);if(!(a[228352]|0)){if(a[227272]|0){o=c[10030]|0;aI(78240,9,1,o|0);c[56816]=0;a[227272]=0}o=c[10030]|0;aI(76352,55,1,o|0);a[228352]=1}aI(77136,11,1,c[10030]|0);do{if((l|0)==0){o=c[10030]|0;cf(o|0,77072,(v=i,i=i+8|0,c[v>>2]=227016,v)|0)}else if((l|0)==2|(l|0)==5){cf(c[10030]|0,76808,(v=i,i=i+8|0,c[v>>2]=c[57118],v)|0)}else if((l|0)==1|(l|0)==4){o=a[228528]|0;do{if(o<<24>>24==3){n=c[10030]|0;g=d[226992]|0;r=d[228368]|0;j=d[228536]|0;cf(n|0,76552,(v=i,i=i+32|0,c[v>>2]=76584,c[v+8>>2]=g,c[v+16>>2]=r,c[v+24>>2]=j,v)|0)}else{j=c[10030]|0;if(o<<24>>24==1){r=c[57082]|0;cf(j|0,76480,(v=i,i=i+16|0,c[v>>2]=76584,c[v+8>>2]=r,v)|0);break}else{cf(j|0,76448,(v=i,i=i+8|0,c[v>>2]=76584,v)|0);break}}}while(0);if(k>>>0>=100){break}cf(c[10030]|0,76904,(v=i,i=i+8|0,h[v>>3]=+(k|0)*.01,v)|0)}else{o=a[228528]|0;if(o<<24>>24==3){j=c[10030]|0;r=d[226992]|0;g=d[228368]|0;n=d[228536]|0;cf(j|0,76552,(v=i,i=i+32|0,c[v>>2]=76584,c[v+8>>2]=r,c[v+16>>2]=g,c[v+24>>2]=n,v)|0);break}n=c[10030]|0;if(o<<24>>24==1){o=c[57082]|0;cf(n|0,76480,(v=i,i=i+16|0,c[v>>2]=76584,c[v+8>>2]=o,v)|0);break}else{cf(n|0,76448,(v=i,i=i+8|0,c[v>>2]=76584,v)|0);break}}}while(0);aI(76704,11,1,c[10030]|0);k=c[10030]|0;if((b|0)>0){s=0;t=k}else{u=k;w=aI(76624,4,1,u|0)|0;i=f;return}while(1){x=+((c[(c[3524]|0)+12>>2]|0)-(c[e+(s*12&-1)+4>>2]|0)|0)/10.0;cf(t|0,76648,(v=i,i=i+24|0,h[v>>3]=+(c[e+(s*12&-1)>>2]|0)/10.0,h[v+8>>3]=x,c[v+16>>2]=((s|0)%16&-1|0)==15?140136:73808,v)|0);k=s+1|0;l=c[10030]|0;if((k|0)<(b|0)){s=k;t=l}else{u=l;break}}w=aI(76624,4,1,u|0)|0;i=f;return}function qq(b,d,e,f,g,j){b=b|0;d=+d;e=+e;f=f|0;g=g|0;j=j|0;var k=0,l=0.0,m=0.0,n=0;f=i;if((j|0)==2){if(a[237880]|0){a[237880]=0;a[c[11232]|0]=0;k=c[10030]|0;cf(k|0,77712,(v=i,i=i+8|0,c[v>>2]=43856,v)|0)}k=c[10030]|0;l=+(c[59472]|0)*.5;m=+h[29737]-e;cf(k|0,77608,(v=i,i=i+16|0,h[v>>3]=l,h[v+8>>3]=m,v)|0);h[29737]=e;h[29731]=0.0;c[11232]=43856;c[59472]=0;a[237880]=1;i=f;return}else if((j|0)==4){h[29731]=+(c[59472]|0)*-.5;h[29737]=+h[29737]-e;c[59472]=0;i=f;return}else if((j|0)==3){c[59472]=0;i=f;return}else{if(a[237880]|0){i=f;return}a[237880]=1;c[11232]=43856;aI(77600,6,1,c[10030]|0);j=c[57108]|0;if((aY(j|0,b|0)|0)!=0){uu(j);if((b|0)==0){n=0}else{n=bP(b|0)|0}c[57108]=n;b=c[10030]|0;cf(b|0,77568,(v=i,i=i+8|0,c[v>>2]=n,v)|0)}if(+h[28552]!=d){h[28552]=d;n=c[10030]|0;cf(n|0,77544,(v=i,i=i+8|0,h[v>>3]=d,v)|0)}n=c[57096]|0;do{if((n|0)!=0){if((aY(n|0,77432)|0)==0){break}b=c[10030]|0;cf(b|0,77368,(v=i,i=i+8|0,c[v>>2]=n,v)|0)}}while(0);n=c[57100]|0;do{if((n|0)!=0){if((aY(n|0,77432)|0)==0){break}b=c[10030]|0;cf(b|0,77288,(v=i,i=i+8|0,c[v>>2]=n,v)|0)}}while(0);d=+h[29731];if(d!=0.0){n=c[10030]|0;cf(n|0,77256,(v=i,i=i+8|0,h[v>>3]=d,v)|0);h[29731]=0.0}d=+h[29737];if(d!=e){n=c[10030]|0;m=d-e;cf(n|0,77240,(v=i,i=i+8|0,h[v>>3]=m,v)|0);h[29737]=e}if(!g){g=c[10030]|0;aI(77208,12,1,g|0)}if(a[237872]|0){g=c[10030]|0;aI(77184,21,1,g|0)}aF(62,c[10030]|0);i=f;return}}function qr(){var b=0;b=i;if(!(a[237880]|0)){i=b;return}a[237880]=0;a[c[11232]|0]=0;cf(c[10030]|0,77712,(v=i,i=i+8|0,c[v>>2]=43856,v)|0);i=b;return}function qs(d){d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;i=i+8|0;f=e|0;b[f>>1]=0;if((d|0)==0|(d|0)==10){c[56750]=0;i=e;return}else if((d|0)==6){if(a[227272]|0){if(a[228352]|0){g=c[10030]|0;aI(78232,6,1,g|0);a[228352]=0}g=c[10030]|0;aI(78240,9,1,g|0);c[56816]=0;a[227272]=0}if(a[228352]|0){g=c[10030]|0;aI(78232,6,1,g|0);a[228352]=0}if(a[228344]|0){g=c[10030]|0;aI(77776,5,1,g|0);a[228344]=0;c[57120]=-1}g=(c[56750]|0)+1|0;c[56750]=g;h=c[57076]|0;j=(h|0)!=0?h:78208;do{if((a[33512]&1)!=0){h=c[8415]|0;if((h|0)>=26){break}a[f]=h+97&255}}while(0);cf(c[10030]|0,78184,(v=i,i=i+24|0,c[v>>2]=j,c[v+8>>2]=g,c[v+16>>2]=f,v)|0);g=c[56750]|0;cf(c[10030]|0,78072,(v=i,i=i+24|0,c[v>>2]=j,c[v+8>>2]=g,c[v+16>>2]=f,v)|0);c[57144]=-5;i=e;return}else if((d|0)==9){if(!(a[228312]|0)){i=e;return}if(a[227272]|0){if(a[228352]|0){g=c[10030]|0;aI(78232,6,1,g|0);a[228352]=0}g=c[10030]|0;aI(78240,9,1,g|0);c[56816]=0;a[227272]=0}if(a[228352]|0){g=c[10030]|0;aI(78232,6,1,g|0);a[228352]=0}aI(78232,6,1,c[10030]|0);c[57144]=-5;i=e;return}else if((d|0)==7){if(a[227272]|0){if(a[228352]|0){g=c[10030]|0;aI(78232,6,1,g|0);a[228352]=0}g=c[10030]|0;aI(78240,9,1,g|0);c[56816]=0;a[227272]=0}if(a[228352]|0){g=c[10030]|0;aI(78232,6,1,g|0);a[228352]=0}if(a[228344]|0){g=c[10030]|0;aI(77776,5,1,g|0);a[228344]=0;c[57120]=-1}aI(78232,6,1,c[10030]|0);c[57144]=-5;i=e;return}else if((d|0)==3){a[228360]=1;a[228336]=1;i=e;return}else if((d|0)==4){a[228360]=0;i=e;return}else if((d|0)==8){if(!(a[228312]|0)){i=e;return}if(a[227272]|0){if(a[228352]|0){d=c[10030]|0;aI(78232,6,1,d|0);a[228352]=0}d=c[10030]|0;aI(78240,9,1,d|0);c[56816]=0;a[227272]=0}if(a[228352]|0){d=c[10030]|0;aI(78232,6,1,d|0);a[228352]=0}d=c[57076]|0;g=(d|0)!=0?d:78208;do{if((a[33512]&1)!=0){d=c[8415]|0;if((d|0)>=26){break}a[f]=d+97&255}}while(0);aI(77992,25,1,c[10030]|0);d=c[56750]|0;cf(c[10030]|0,77856,(v=i,i=i+24|0,c[v>>2]=g,c[v+8>>2]=d,c[v+16>>2]=f,v)|0);aI(77816,2,1,c[10030]|0);i=e;return}else{i=e;return}}function qt(b){b=b|0;if((b|0)!=1){return}aI(78256,2,1,c[10030]|0);if(!(a[227272]|0)){return}if(a[228352]|0){b=c[10030]|0;aI(78232,6,1,b|0);a[228352]=0}aI(78240,9,1,c[10030]|0);c[56816]=0;a[227272]=0;return}function qu(){var b=0,d=0,e=0,f=0;b=i;if((a[33512]&1)==0){d=c[766]|0}else{c[772]=100;if((c[520]|0)>>>0>1){e=c[m>>2]|0;aI(79400,34,1,e|0);c[520]=1}c[766]=1;d=1}e=c[772]|0;f=c[778]|0;cf(c[10030]|0,79224,(v=i,i=i+56|0,c[v>>2]=a[225808]&1,c[v+8>>2]=e,c[v+16>>2]=d,c[v+24>>2]=25680,c[v+32>>2]=f,c[v+40>>2]=40152,c[v+48>>2]=40160,v)|0);a[46624]=0;c[9372]=0;c[524]=0;i=b;return}function qv(){var a=0;tt();c[9372]=0;c[524]=0;c[522]=1;c[526]=1;a=c[10030]|0;if((a|0)==0){return}aD(a|0);return}function qw(){tt();return}function qx(){var b=0,d=0,e=0,f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0.0,P=0,Q=0,R=0.0,S=0,T=0,U=0.0,V=0.0,W=0;b=i;i=i+80|0;d=b|0;e=b+24|0;f=b+48|0;j=b+72|0;k=c[13898]|0;l=c[8272]|0;L23998:do{if((k|0)<(l|0)){m=d|0;n=d+8|0;o=k;p=l;L24000:while(1){q=c[1054]|0;r=(a[q+(o*40&-1)|0]&1)==0;L24002:do{if(!r){s=c[q+(o*40&-1)+36>>2]|0;t=q+(o*40&-1)+32|0;u=c[10036]|0;w=0;while(1){if((w|0)>=(s|0)){break}if((a[u+((c[t>>2]|0)+w|0)|0]|0)==(a[w+103664|0]|0)){w=w+1|0}else{break L24002}}if((w|0)==1){break L23998}}}while(0);t=c[56580]|0;L24009:do{if((t|0)==0){x=226320}else{u=c[q+(o*40&-1)+36>>2]|0;s=c[q+(o*40&-1)+32>>2]|0;y=(u|0)>0;z=c[10036]|0;A=226320;B=t;while(1){L24013:do{if(!r){if(y){C=0;D=0;E=s;while(1){F=a[B+C|0]|0;if(F<<24>>24==(a[z+(C+E|0)|0]|0)){G=E;H=D}else{if(F<<24>>24!=36){break L24013}G=E-1|0;H=1}I=C+1|0;if((I|0)<(H+u|0)){C=I;D=H;E=G}else{break}}if((H|0)==0){J=I}else{x=A;break L24009}}else{J=0}E=a[B+J|0]|0;if((E<<24>>24|0)==36|(E<<24>>24|0)==0){x=A;break L24009}}}while(0);E=A+8|0;D=c[E>>2]|0;if((D|0)==0){x=E;break}else{A=E;B=D}}}}while(0);r=c[x+4>>2]|0;if((r|0)==4){a[225808]=1;c[13898]=o+1}else if((r|0)==5){K=o+1|0;c[13898]=K;if((K|0)>=(p|0)){L=18029;break}t=(a[q+(K*40&-1)|0]&1)==0;L24030:do{if(t){L=17953}else{B=c[q+(K*40&-1)+36>>2]|0;A=q+(K*40&-1)+32|0;u=c[10036]|0;z=0;while(1){if((z|0)>=(B|0)){L=17946;break}if((a[u+((c[A>>2]|0)+z|0)|0]|0)==(a[z+103664|0]|0)){z=z+1|0}else{break}}if((L|0)==17946){L=0;if((z|0)==1){L=18030;break L24000}}if(t){L=17953;break}A=c[q+(K*40&-1)+36>>2]|0;u=q+(K*40&-1)+32|0;B=c[10036]|0;s=0;while(1){if((s|0)>=(A|0)){break}if((a[B+((c[u>>2]|0)+s|0)|0]|0)==(a[s+148464|0]|0)){s=s+1|0}else{L=17953;break L24030}}if((s|0)==1){M=K;N=p}else{L=17953}}}while(0);if((L|0)==17953){L=0;t=is(e)|0;u=c[t>>2]|0;if((u|0)==1){O=+(c[t+8>>2]|0)}else if((u|0)==3){O=+uz(c[t+8>>2]|0,0)}else if((u|0)==2){O=+h[t+8>>3]}else{L=17957;break}c[518]=~~O;M=c[13898]|0;N=c[8272]|0}if((N|0)<=(M|0)){L=18025;break}t=c[1054]|0;if((a[t+(M*40&-1)|0]&1)==0){L=18028;break}u=c[t+(M*40&-1)+36>>2]|0;B=t+(M*40&-1)+32|0;A=c[10036]|0;z=0;while(1){if((z|0)>=(u|0)){break}if((a[A+((c[B>>2]|0)+z|0)|0]|0)==(a[z+148464|0]|0)){z=z+1|0}else{L=18026;break L24000}}if((z|0)!=1){L=18027;break}B=M+1|0;c[13898]=B;L24058:do{if((N|0)>(B|0)){if((a[t+(B*40&-1)|0]&1)==0){L=17972;break}u=c[t+(B*40&-1)+36>>2]|0;y=t+(B*40&-1)+32|0;w=0;while(1){if((w|0)>=(u|0)){break}if((a[A+((c[y>>2]|0)+w|0)|0]|0)==(a[w+78864|0]|0)){w=w+1|0}else{L=17972;break L24058}}if((w|0)==1){P=B;Q=N}else{L=17972}}else{L=17972}}while(0);if((L|0)==17972){L=0;B=is(e)|0;A=c[B>>2]|0;if((A|0)==1){R=+(c[B+8>>2]|0)}else if((A|0)==2){R=+h[B+8>>3]}else if((A|0)==3){R=+uz(c[B+8>>2]|0,0)}else{L=17976;break}c[516]=~~R;P=c[13898]|0;Q=c[8272]|0}if((Q|0)<=(P|0)){L=18031;break}B=c[1054]|0;if((a[B+(P*40&-1)|0]&1)==0){L=18032;break}A=c[B+(P*40&-1)+36>>2]|0;t=B+(P*40&-1)+32|0;B=c[10036]|0;z=0;while(1){if((z|0)>=(A|0)){break}if((a[B+((c[t>>2]|0)+z|0)|0]|0)==(a[z+78864|0]|0)){z=z+1|0}else{L=18033;break L24000}}if((z|0)!=1){L=18034;break}c[13898]=P+1;c[520]=aa(c[518]|0,c[516]|0)}else if((r|0)==10){uD(25680,90584,10);uD(25424,90584,10);c[778]=18;c[(c[3524]|0)+16>>2]=18;c[(c[3524]|0)+20>>2]=(((c[778]|0)*6&-1)>>>0)/10>>>0;a[225808]=0;a[225792]=0;t=(c[3524]|0)+96|0;c[t>>2]=c[t>>2]&-1025;a[225800]=0;c[520]=1;c[522]=1;c[526]=1;c[518]=1;c[516]=1;c[772]=100;h[6448]=1.0;h[6449]=1.0;c[13898]=(c[13898]|0)+1}else if((r|0)==0){a[225792]=1;t=(c[3524]|0)+96|0;c[t>>2]=c[t>>2]|1024;c[13898]=(c[13898]|0)+1}else if((r|0)==1){a[225792]=0;t=(c[3524]|0)+96|0;c[t>>2]=c[t>>2]&-1025;c[13898]=(c[13898]|0)+1}else if((r|0)==8){t=o+1|0;c[13898]=t;S=t;L=17989}else if((r|0)==3){a[225808]=0;c[13898]=o+1}else if((r|0)==6){a[225800]=1;c[13898]=o+1}else if((r|0)==7){a[225800]=0;c[13898]=o+1}else if((r|0)==2){T=o+1|0;c[13898]=T;if((T|0)>=(p|0)){L=18024;break}L24089:do{if((a[q+(T*40&-1)|0]&1)!=0){t=c[q+(T*40&-1)+36>>2]|0;B=q+(T*40&-1)+32|0;A=c[10036]|0;y=0;while(1){if((y|0)>=(t|0)){break}if((a[A+((c[B>>2]|0)+y|0)|0]|0)==(a[y+103664|0]|0)){y=y+1|0}else{break L24089}}if((y|0)==1){L=18023;break L24000}}}while(0);z=is(e)|0;B=c[z>>2]|0;if((B|0)==1){U=+(c[z+8>>2]|0)}else if((B|0)==2){U=+h[z+8>>3]}else if((B|0)==3){U=+uz(c[z+8>>2]|0,0)}else{L=17936;break}h[6449]=U;if(U<=0.0){L=17938;break}}else{S=o;L=17989}L24101:do{if((L|0)==17989){L=0;L24103:do{if((S|0)<(p|0)){L24105:do{if((a[q+(S*40&-1)|0]&1)!=0){z=c[q+(S*40&-1)+36>>2]|0;B=q+(S*40&-1)+32|0;A=c[10036]|0;t=0;while(1){if((t|0)>=(z|0)){break}if((a[A+((c[B>>2]|0)+t|0)|0]|0)==(a[t+103664|0]|0)){t=t+1|0}else{break L24105}}if((t|0)==1){break L24103}}}while(0);a[14176]=1;is(d);a[14176]=0;if((c[m>>2]|0)!=3){c[13898]=S;break}B=c[n>>2]|0;if((B|0)==0){break}A=bk(B|0,148464)|0;do{if((a[B+A|0]|0)==44){if((ca(B+(A+1|0)|0,148448,(v=i,i=i+8|0,c[v>>2]=j,v)|0)|0)!=1){break}c[778]=~~(+h[j>>3]+.5)}}while(0);if((A|0)>0){uF(25680,B|0,255);a[A+25680|0]=0}uB(25424,25680);uu(B);break L24101}}while(0);if((r|0)==8){L=18006;break L24000}y=is(f)|0;z=c[y>>2]|0;if((z|0)==2){V=+h[y+8>>3]}else if((z|0)==3){V=+uz(c[y+8>>2]|0,0)}else if((z|0)==1){V=+(c[y+8>>2]|0)}else{L=18011;break L24000}y=~~V;c[778]=y;c[(c[3524]|0)+16>>2]=y;c[(c[3524]|0)+20>>2]=(((c[778]|0)*6&-1)>>>0)/10>>>0}}while(0);o=c[13898]|0;p=c[8272]|0;if((o|0)>=(p|0)){break L23998}}if((L|0)==18023){uf(T,79152,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((L|0)==18033){uf(P,78824,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((L|0)==18024){uf(T,79152,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((L|0)==18025){uf(M,78920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((L|0)==18028){uf(M,78920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((L|0)==17976){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((L|0)==18030){uf(K,78976,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((L|0)==18034){uf(P,78824,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((L|0)==18029){uf(K,78976,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((L|0)==18031){uf(P,78824,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((L|0)==18006){uf(c[13898]|0,78800,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((L|0)==18027){uf(M,78920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((L|0)==17938){uf((c[13898]|0)-1|0,79096,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((L|0)==18026){uf(M,78920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((L|0)==18032){uf(P,78824,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((L|0)==17936){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((L|0)==18011){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((L|0)==17957){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);L=a[225808]|0;P=c[518]|0;V=+g[178]*+(((P*1030&-1)-80|0)>>>0>>>0);do{if(L){U=14.0e4/V;M=c[516]|0;R=95.0e3/(+g[38]*+(((M*714&-1)-80|0)>>>0>>>0));c[772]=~~(U>>0>>>0));c[772]=~~(R>2]=L?78704:78720,c[v+8>>2]=P,c[v+16>>2]=W,v)|0);uC(13048,(a[225792]|0?78656:95304)|0);W=13048+(uA(13048)|0)|0;be(W|0,78504,(v=i,i=i+8|0,h[v>>3]=+h[6449],v)|0);W=13048+(uA(13048)|0)|0;P=c[778]|0;be(W|0,78416,(v=i,i=i+24|0,c[v>>2]=a[225800]|0?131504:131584,c[v+8>>2]=25680,c[v+16>>2]=P,v)|0);i=b;return}function qy(a){a=a|0;if((a|0)==180|(a|0)==(-180|0)){c[780]=2}else if((a|0)==(-270|0)|(a|0)==90){c[780]=3}else if((a|0)==(-90|0)|(a|0)==270){c[780]=1}else{c[780]=0}return 1}function qz(a){a=a|0;c[776]=a;return 1}function qA(){var b=0,d=0,e=0.0,f=0,h=0,i=0;tt();if((a[33512]&1)==0){b=c[524]|0;if(b>>>0>=(c[520]|0)>>>0){d=c[m>>2]|0;aI(79440,40,1,d|0);return}d=b+1|0;c[524]=d;e=+(5e3/((c[772]|0)>>>0)>>>0>>>0>>>0);b=c[526]|0;f=~~(e+ +g[178]*+((b-1|0)>>>0>>>0)*1030.0);c[514]=f;h=c[522]|0;i=~~(e+ +g[38]*+(((h*714&-1)-80|0)>>>0>>>0));c[512]=i;if(((d>>>0)%((c[518]|0)>>>0)>>>0|0)==0){c[526]=1;c[522]=h+1}else{c[526]=b+1}c[554]=f;c[552]=i}else{i=a[225808]|0;c[(c[3524]|0)+8>>2]=i?1400:950;c[(c[3524]|0)+12>>2]=i?950:1400;c[554]=50;f=i?1e3:1450;c[552]=f;c[512]=f;c[514]=50}c[9372]=0;c[774]=0;c[780]=0;c[768]=1;c[770]=0;c[776]=0;a[25936]=a[89416]|0;a[25937|0]=a[89417|0]|0;a[25938|0]=a[89418|0]|0;a[25939|0]=a[89419|0]|0;a[25940|0]=a[89420|0]|0;a[25941|0]=a[89421|0]|0;a[26448]=a[28976]|0;a[26449|0]=a[28977|0]|0;a[26450|0]=a[28978|0]|0;return}function qB(b,d){b=b|0;d=d|0;c[554]=(c[514]|0)+b;c[552]=(c[512]|0)-d;if(!(a[46624]|0)){return}tt();return}function qC(b,d){b=b|0;d=d|0;var e=0,f=0;e=(c[514]|0)+b|0;b=(c[512]|0)-d|0;if(a[46624]|0){f=c[9372]|0}else{c[666]=c[554];c[566]=c[552];c[9372]=1;a[46624]=1;f=1}c[2664+(f<<2)>>2]=e;c[2264+(f<<2)>>2]=b;c[554]=e;c[552]=b;b=f+1|0;c[9372]=b;a[46624]=1;if((b|0)!=100){return}tt();return}function qD(b){b=b|0;var d=0;tt();if((b|0)>-1){d=((b|0)%10&-1)+2|0}else{d=(b|0)<-2?0:b+2|0}if(a[225792]|0){a[25936]=a[89416]|0;a[25937|0]=a[89417|0]|0;a[25938|0]=a[89418|0]|0;a[25939|0]=a[89419|0]|0;a[25940|0]=a[89420|0]|0;a[25941|0]=a[89421|0]|0;a[26448]=a[28976]|0;a[26449|0]=a[28977|0]|0;a[26450|0]=a[28978|0]|0}else{b=c[28928+(d<<2)>>2]|0;uB(25936,b|0);b=28976+(d*3&-1)|0;a[26448]=a[b]|0;a[26449|0]=a[b+1|0]|0;a[26450|0]=a[b+2|0]|0}c[768]=~~(+h[6448]*+h[6449]*+((c[2112+(d<<2)>>2]|0)>>>0>>>0)+.5);if(!(a[225800]|0)){c[770]=c[2160+(d<<2)>>2];return}if((d|0)==1){c[770]=5;return}else{c[770]=0;return}}function qE(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;g=c[3524]|0;tt();if((a[e]|0)==0){i=f;return}h=((c[512]|0)-d|0)-((c[g+16>>2]|0)>>>1)|0;g=(c[514]|0)+b|0;b=c[778]|0;d=c[780]|0;j=(d|0)!=0?1:c[776]|0;k=c[774]|0;cf(c[10030]|0,79720,(v=i,i=i+72|0,c[v>>2]=25936,c[v+8>>2]=g,c[v+16>>2]=h,c[v+24>>2]=25680,c[v+32>>2]=b,c[v+40>>2]=j,c[v+48>>2]=d,c[v+56>>2]=k,c[v+64>>2]=e,v)|0);c[774]=(c[774]|0)+2;i=f;return}function qF(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,g=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0,p=0,q=0.0,r=0.0;e=i;f=+(((c[514]|0)+a|0)>>>0>>>0);g=+(((c[512]|0)-b|0)>>>0>>>0);j=+h[3817]*8.0;k=j==0.0?.1:j;tt();do{if((d|0)!=-1){b=(d|0)%63&-1;if((b|0)==27){a=c[10030]|0;aI(83312,8,1,a|0);a=c[10030]|0;j=f-k;l=g-k;m=f+k;n=g+k;o=c[774]|0;c[774]=o+1;cf(a|0,82792,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=j,h[v+16>>3]=l,h[v+24>>3]=m,h[v+32>>3]=n,c[v+40>>2]=o,v)|0);o=c[10030]|0;n=k*2.0;a=c[774]|0;c[774]=a+1;cf(o|0,80304,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=j,h[v+16>>3]=l,h[v+24>>3]=f,h[v+32>>3]=g,h[v+40>>3]=j,h[v+48>>3]=g,h[v+56>>3]=m,h[v+64>>3]=g,h[v+72>>3]=n,h[v+80>>3]=n,c[v+88>>2]=a,v)|0);a=c[774]|0;o=a+2|0;p=c[10030]|0;c[774]=a+3;cf(p|0,83632,(v=i,i=i+8|0,c[v>>2]=o,v)|0);i=e;return}else if((b|0)==50){aI(83312,8,1,c[10030]|0);n=g+k;m=g-k;j=f-k;o=c[774]|0;cf(c[10030]|0,82320,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=n,h[v+24>>3]=f+k,h[v+32>>3]=g,h[v+40>>3]=f,h[v+48>>3]=m,h[v+56>>3]=j,h[v+64>>3]=g,h[v+72>>3]=f,h[v+80>>3]=n,c[v+88>>2]=o,v)|0);n=k*.5;o=c[774]|0;cf(c[10030]|0,82216,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=j,h[v+16>>3]=g,h[v+24>>3]=f,h[v+32>>3]=m,h[v+40>>3]=f+n,h[v+48>>3]=g-n,h[v+56>>3]=f-n,h[v+64>>3]=g+n,h[v+72>>3]=j,h[v+80>>3]=g,c[v+88>>2]=o,v)|0);o=c[774]|0;p=c[10030]|0;c[774]=o+3;cf(p|0,83632,(v=i,i=i+8|0,c[v>>2]=o+2,v)|0);i=e;return}else if((b|0)==10){j=g+k;n=g-k*.75;o=c[774]|0;cf(c[10030]|0,82472,(v=i,i=i+80|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=j,h[v+24>>3]=f-k,h[v+32>>3]=n,h[v+40>>3]=f+k,h[v+48>>3]=n,h[v+56>>3]=f,h[v+64>>3]=j,c[v+72>>2]=o,v)|0);c[774]=(c[774]|0)+1;i=e;return}else if((b|0)==39){aI(83312,8,1,c[10030]|0);o=c[10030]|0;j=f+k;n=g+k;p=c[774]|0;c[774]=p+1;cf(o|0,82960,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=f-k,h[v+16>>3]=g-k,h[v+24>>3]=j,h[v+32>>3]=n,c[v+40>>2]=p,v)|0);p=c[10030]|0;o=c[774]|0;c[774]=o+1;cf(p|0,82880,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=g,h[v+24>>3]=j,h[v+32>>3]=n,c[v+40>>2]=o,v)|0);o=c[774]|0;p=c[10030]|0;c[774]=o+3;cf(p|0,83632,(v=i,i=i+8|0,c[v>>2]=o+2,v)|0);i=e;return}else if((b|0)==26){aI(83312,8,1,c[10030]|0);o=c[10030]|0;n=f-k;j=g-k;m=g+k;p=c[774]|0;c[774]=p+1;cf(o|0,82792,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=n,h[v+16>>3]=j,h[v+24>>3]=f+k,h[v+32>>3]=m,c[v+40>>2]=p,v)|0);p=c[10030]|0;l=k*2.0;o=c[774]|0;c[774]=o+1;cf(p|0,80448,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=n,h[v+16>>3]=j,h[v+24>>3]=f,h[v+32>>3]=g,h[v+40>>3]=f,h[v+48>>3]=m,h[v+56>>3]=n,h[v+64>>3]=g,h[v+72>>3]=l,h[v+80>>3]=l,c[v+88>>2]=o,v)|0);o=c[774]|0;p=c[10030]|0;c[774]=o+3;cf(p|0,83632,(v=i,i=i+8|0,c[v>>2]=o+2,v)|0);i=e;return}else if((b|0)==1){l=f-k;n=g-k;m=f+k;j=g+k;o=c[774]|0;cf(c[10030]|0,83432,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=l,h[v+16>>3]=n,h[v+24>>3]=m,h[v+32>>3]=j,c[v+40>>2]=o+1,c[v+48>>2]=25936,h[v+56>>3]=l,h[v+64>>3]=j,h[v+72>>3]=m,h[v+80>>3]=n,c[v+88>>2]=o+2,v)|0);o=c[774]|0;p=c[10030]|0;c[774]=o+5;cf(p|0,83632,(v=i,i=i+8|0,c[v>>2]=o+4,v)|0);i=e;return}else if((b|0)==41){aI(83312,8,1,c[10030]|0);o=c[10030]|0;n=f-k;m=g-k;j=f+k;l=g+k;p=c[774]|0;c[774]=p+1;cf(o|0,82960,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=n,h[v+16>>3]=m,h[v+24>>3]=j,h[v+32>>3]=l,c[v+40>>2]=p,v)|0);p=c[10030]|0;o=c[774]|0;c[774]=o+1;cf(p|0,82880,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=n,h[v+16>>3]=m,h[v+24>>3]=f,h[v+32>>3]=g,c[v+40>>2]=o,v)|0);o=c[10030]|0;p=c[774]|0;c[774]=p+1;cf(o|0,82880,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=g,h[v+24>>3]=j,h[v+32>>3]=l,c[v+40>>2]=p,v)|0);p=c[774]|0;o=c[10030]|0;c[774]=p+4;cf(o|0,83632,(v=i,i=i+8|0,c[v>>2]=p+3,v)|0);i=e;return}else if((b|0)==31){aI(83312,8,1,c[10030]|0);p=c[10030]|0;l=g-k;o=c[774]|0;c[774]=o+1;cf(p|0,82960,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=f-k,h[v+16>>3]=l,h[v+24>>3]=f+k,h[v+32>>3]=g+k,c[v+40>>2]=o,v)|0);o=c[10030]|0;j=k*.25;p=c[774]|0;c[774]=p+1;cf(o|0,82880,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=f-j,h[v+16>>3]=l,h[v+24>>3]=f+j,h[v+32>>3]=g,c[v+40>>2]=p,v)|0);p=c[774]|0;o=c[10030]|0;c[774]=p+3;cf(o|0,83632,(v=i,i=i+8|0,c[v>>2]=p+2,v)|0);i=e;return}else if((b|0)==57){aI(83312,8,1,c[10030]|0);j=g+k;l=f+k;m=f-k;p=c[774]|0;cf(c[10030]|0,82320,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=j,h[v+24>>3]=l,h[v+32>>3]=g,h[v+40>>3]=f,h[v+48>>3]=g-k,h[v+56>>3]=m,h[v+64>>3]=g,h[v+72>>3]=f,h[v+80>>3]=j,c[v+88>>2]=p,v)|0);j=k*.5;n=f-j;q=g-j;r=g+j;p=c[774]|0;cf(c[10030]|0,82216,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=m,h[v+16>>3]=g,h[v+24>>3]=n,h[v+32>>3]=q,h[v+40>>3]=f,h[v+48>>3]=g,h[v+56>>3]=n,h[v+64>>3]=r,h[v+72>>3]=m,h[v+80>>3]=g,c[v+88>>2]=p,v)|0);m=f+j;p=c[774]|0;cf(c[10030]|0,82216,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=g,h[v+24>>3]=m,h[v+32>>3]=q,h[v+40>>3]=l,h[v+48>>3]=g,h[v+56>>3]=m,h[v+64>>3]=r,h[v+72>>3]=f,h[v+80>>3]=g,c[v+88>>2]=p,v)|0);p=c[774]|0;o=c[10030]|0;c[774]=p+4;cf(o|0,83632,(v=i,i=i+8|0,c[v>>2]=p+3,v)|0);i=e;return}else if((b|0)==43){aI(83312,8,1,c[10030]|0);p=c[10030]|0;r=f-k;m=f+k;l=g+k;o=c[774]|0;c[774]=o+1;cf(p|0,82960,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=r,h[v+16>>3]=g-k,h[v+24>>3]=m,h[v+32>>3]=l,c[v+40>>2]=o,v)|0);o=c[10030]|0;p=c[774]|0;c[774]=p+1;cf(o|0,82880,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=r,h[v+16>>3]=g,h[v+24>>3]=m,h[v+32>>3]=l,c[v+40>>2]=p,v)|0);p=c[774]|0;o=c[10030]|0;c[774]=p+3;cf(o|0,83632,(v=i,i=i+8|0,c[v>>2]=p+2,v)|0);i=e;return}else if((b|0)==12){l=g+k;p=c[774]|0;cf(c[10030]|0,82216,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=l,h[v+24>>3]=f+k,h[v+32>>3]=g,h[v+40>>3]=f,h[v+48>>3]=g-k,h[v+56>>3]=f-k,h[v+64>>3]=g,h[v+72>>3]=f,h[v+80>>3]=l,c[v+88>>2]=p,v)|0);c[774]=(c[774]|0)+1;i=e;return}else if((b|0)==52){aI(83312,8,1,c[10030]|0);l=g+k;m=g-k;p=c[774]|0;cf(c[10030]|0,82320,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=l,h[v+24>>3]=f+k,h[v+32>>3]=g,h[v+40>>3]=f,h[v+48>>3]=m,h[v+56>>3]=f-k,h[v+64>>3]=g,h[v+72>>3]=f,h[v+80>>3]=l,c[v+88>>2]=p,v)|0);r=k*.5;q=f-r;j=g-r;n=f+r;p=c[774]|0;cf(c[10030]|0,82216,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=q,h[v+16>>3]=j,h[v+24>>3]=f,h[v+32>>3]=m,h[v+40>>3]=n,h[v+48>>3]=j,h[v+56>>3]=f,h[v+64>>3]=g,h[v+72>>3]=q,h[v+80>>3]=j,c[v+88>>2]=p,v)|0);j=g+r;p=c[774]|0;cf(c[10030]|0,82216,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=q,h[v+16>>3]=j,h[v+24>>3]=f,h[v+32>>3]=g,h[v+40>>3]=n,h[v+48>>3]=j,h[v+56>>3]=f,h[v+64>>3]=l,h[v+72>>3]=q,h[v+80>>3]=j,c[v+88>>2]=p,v)|0);p=c[774]|0;o=c[10030]|0;c[774]=p+4;cf(o|0,83632,(v=i,i=i+8|0,c[v>>2]=p+3,v)|0);i=e;return}else if((b|0)==8){j=g-k;q=g+k*.75;p=c[774]|0;cf(c[10030]|0,82472,(v=i,i=i+80|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=j,h[v+24>>3]=f+k,h[v+32>>3]=q,h[v+40>>3]=f-k,h[v+48>>3]=q,h[v+56>>3]=f,h[v+64>>3]=j,c[v+72>>2]=p,v)|0);c[774]=(c[774]|0)+1;i=e;return}else if((b|0)==29){aI(83312,8,1,c[10030]|0);p=c[10030]|0;j=f-k;q=g-k;l=f+k;o=c[774]|0;c[774]=o+1;cf(p|0,82792,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=j,h[v+16>>3]=q,h[v+24>>3]=l,h[v+32>>3]=g+k,c[v+40>>2]=o,v)|0);o=c[10030]|0;n=k*2.0;p=c[774]|0;c[774]=p+1;cf(o|0,80048,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=j,h[v+16>>3]=q,h[v+24>>3]=f,h[v+32>>3]=g,h[v+40>>3]=f,h[v+48>>3]=q,h[v+56>>3]=l,h[v+64>>3]=g,h[v+72>>3]=n,h[v+80>>3]=n,c[v+88>>2]=p,v)|0);p=c[774]|0;o=c[10030]|0;c[774]=p+3;cf(o|0,83632,(v=i,i=i+8|0,c[v>>2]=p+2,v)|0);i=e;return}else if((b|0)==45){aI(83312,8,1,c[10030]|0);p=c[10030]|0;n=f-k;l=g-k;q=f+k;j=g+k;o=c[774]|0;c[774]=o+1;cf(p|0,82960,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=n,h[v+16>>3]=l,h[v+24>>3]=q,h[v+32>>3]=j,c[v+40>>2]=o,v)|0);o=c[10030]|0;p=c[774]|0;c[774]=p+1;cf(o|0,82880,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=n,h[v+16>>3]=l,h[v+24>>3]=f,h[v+32>>3]=g,c[v+40>>2]=p,v)|0);p=c[10030]|0;o=c[774]|0;c[774]=o+1;cf(p|0,82880,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=n,h[v+16>>3]=g,h[v+24>>3]=q,h[v+32>>3]=j,c[v+40>>2]=o,v)|0);o=c[774]|0;p=c[10030]|0;c[774]=o+4;cf(p|0,83632,(v=i,i=i+8|0,c[v>>2]=o+3,v)|0);i=e;return}else if((b|0)==49){aI(83312,8,1,c[10030]|0);j=g+k;q=f-k;o=c[774]|0;cf(c[10030]|0,82320,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=j,h[v+24>>3]=f+k,h[v+32>>3]=g,h[v+40>>3]=f,h[v+48>>3]=g-k,h[v+56>>3]=q,h[v+64>>3]=g,h[v+72>>3]=f,h[v+80>>3]=j,c[v+88>>2]=o,v)|0);j=k*.5;n=f-j;o=c[774]|0;cf(c[10030]|0,82216,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=q,h[v+16>>3]=g,h[v+24>>3]=n,h[v+32>>3]=g-j,h[v+40>>3]=f,h[v+48>>3]=g,h[v+56>>3]=n,h[v+64>>3]=g+j,h[v+72>>3]=q,h[v+80>>3]=g,c[v+88>>2]=o,v)|0);o=c[774]|0;p=c[10030]|0;c[774]=o+3;cf(p|0,83632,(v=i,i=i+8|0,c[v>>2]=o+2,v)|0);i=e;return}else if((b|0)==14){q=g-k;j=g-k*.25;n=k*.625;l=g+k;o=c[774]|0;cf(c[10030]|0,81840,(v=i,i=i+112|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=q,h[v+24>>3]=f+k,h[v+32>>3]=j,h[v+40>>3]=f+n,h[v+48>>3]=l,h[v+56>>3]=f-n,h[v+64>>3]=l,h[v+72>>3]=f-k,h[v+80>>3]=j,h[v+88>>3]=f,h[v+96>>3]=q,c[v+104>>2]=o,v)|0);c[774]=(c[774]|0)+1;i=e;return}else if((b|0)==47){aI(83312,8,1,c[10030]|0);q=g+k;o=c[774]|0;cf(c[10030]|0,82320,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=q,h[v+24>>3]=f+k,h[v+32>>3]=g,h[v+40>>3]=f,h[v+48>>3]=g-k,h[v+56>>3]=f-k,h[v+64>>3]=g,h[v+72>>3]=f,h[v+80>>3]=q,c[v+88>>2]=o,v)|0);q=k*.625;j=f-q;l=k*.375;n=g-l;r=k*.125;o=c[774]|0;cf(c[10030]|0,82216,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=j,h[v+16>>3]=n,h[v+24>>3]=f-l,h[v+32>>3]=g-q,h[v+40>>3]=f+r,h[v+48>>3]=g-r,h[v+56>>3]=f-r,h[v+64>>3]=g+r,h[v+72>>3]=j,h[v+80>>3]=n,c[v+88>>2]=o,v)|0);o=c[10030]|0;p=c[774]|0;c[774]=p+1;cf(o|0,83632,(v=i,i=i+8|0,c[v>>2]=p,v)|0);c[774]=(c[774]|0)+2;i=e;return}else if((b|0)==30){p=c[774]|0;cf(c[10030]|0,82736,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=f-k,h[v+16>>3]=g-k,h[v+24>>3]=f+k,h[v+32>>3]=g+k,c[v+40>>2]=p,v)|0);c[774]=(c[774]|0)+1;i=e;return}else if((b|0)==4){p=c[774]|0;cf(c[10030]|0,82880,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=f-k,h[v+16>>3]=g-k,h[v+24>>3]=f+k,h[v+32>>3]=g+k,c[v+40>>2]=p,v)|0);c[774]=(c[774]|0)+1;i=e;return}else if((b|0)==23){aI(83312,8,1,c[10030]|0);p=c[10030]|0;n=f-k;j=g-k;r=f+k;q=g+k;o=c[774]|0;c[774]=o+1;cf(p|0,82792,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=n,h[v+16>>3]=j,h[v+24>>3]=r,h[v+32>>3]=q,c[v+40>>2]=o,v)|0);o=c[10030]|0;l=k*2.0;p=c[774]|0;c[774]=p+1;cf(o|0,80720,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=n,h[v+16>>3]=j,h[v+24>>3]=f,h[v+32>>3]=g,h[v+40>>3]=f,h[v+48>>3]=q,h[v+56>>3]=r,h[v+64>>3]=g,h[v+72>>3]=l,h[v+80>>3]=l,c[v+88>>2]=p,v)|0);p=c[774]|0;o=c[10030]|0;c[774]=p+3;cf(o|0,83632,(v=i,i=i+8|0,c[v>>2]=p+2,v)|0);i=e;return}else if((b|0)==11){l=g+k;p=c[774]|0;cf(c[10030]|0,82320,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=l,h[v+24>>3]=f+k,h[v+32>>3]=g,h[v+40>>3]=f,h[v+48>>3]=g-k,h[v+56>>3]=f-k,h[v+64>>3]=g,h[v+72>>3]=f,h[v+80>>3]=l,c[v+88>>2]=p,v)|0);c[774]=(c[774]|0)+1;i=e;return}else if((b|0)==56){aI(83312,8,1,c[10030]|0);l=g+k;r=f+k;q=g-k;p=c[774]|0;cf(c[10030]|0,82320,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=l,h[v+24>>3]=r,h[v+32>>3]=g,h[v+40>>3]=f,h[v+48>>3]=q,h[v+56>>3]=f-k,h[v+64>>3]=g,h[v+72>>3]=f,h[v+80>>3]=l,c[v+88>>2]=p,v)|0);l=k*.5;j=f-l;n=g-l;p=c[774]|0;cf(c[10030]|0,82216,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=j,h[v+16>>3]=n,h[v+24>>3]=f,h[v+32>>3]=q,h[v+40>>3]=r,h[v+48>>3]=g,h[v+56>>3]=f+l,h[v+64>>3]=g+l,h[v+72>>3]=j,h[v+80>>3]=n,c[v+88>>2]=p,v)|0);p=c[774]|0;o=c[10030]|0;c[774]=p+3;cf(o|0,83632,(v=i,i=i+8|0,c[v>>2]=p+2,v)|0);i=e;return}else if((b|0)==20){aI(83312,8,1,c[10030]|0);p=c[10030]|0;n=f-k;j=g-k;l=f+k;r=g+k;o=c[774]|0;c[774]=o+1;cf(p|0,82792,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=n,h[v+16>>3]=j,h[v+24>>3]=l,h[v+32>>3]=r,c[v+40>>2]=o,v)|0);o=c[10030]|0;q=k*2.0;p=c[774]|0;c[774]=p+1;cf(o|0,81608,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=n,h[v+16>>3]=j,h[v+24>>3]=f,h[v+32>>3]=g,h[v+40>>3]=l,h[v+48>>3]=g,h[v+56>>3]=f,h[v+64>>3]=j,h[v+72>>3]=q,h[v+80>>3]=q,c[v+88>>2]=p,v)|0);p=c[10030]|0;o=c[774]|0;c[774]=o+1;cf(p|0,81160,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=n,h[v+16>>3]=j,h[v+24>>3]=f,h[v+32>>3]=g,h[v+40>>3]=n,h[v+48>>3]=g,h[v+56>>3]=f,h[v+64>>3]=r,h[v+72>>3]=q,h[v+80>>3]=q,c[v+88>>2]=o,v)|0);o=c[774]|0;p=c[10030]|0;c[774]=o+4;cf(p|0,83632,(v=i,i=i+8|0,c[v>>2]=o+3,v)|0);i=e;return}else if((b|0)==28){aI(83312,8,1,c[10030]|0);o=c[10030]|0;q=f-k;r=g-k;p=c[774]|0;c[774]=p+1;cf(o|0,82792,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=q,h[v+16>>3]=r,h[v+24>>3]=f+k,h[v+32>>3]=g+k,c[v+40>>2]=p,v)|0);p=c[10030]|0;n=k*2.0;o=c[774]|0;c[774]=o+1;cf(p|0,80200,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=q,h[v+16>>3]=r,h[v+24>>3]=f,h[v+32>>3]=g,h[v+40>>3]=q,h[v+48>>3]=g,h[v+56>>3]=f,h[v+64>>3]=r,h[v+72>>3]=n,h[v+80>>3]=n,c[v+88>>2]=o,v)|0);o=c[774]|0;p=c[10030]|0;c[774]=o+3;cf(p|0,83632,(v=i,i=i+8|0,c[v>>2]=o+2,v)|0);i=e;return}else if((b|0)==19){aI(83312,8,1,c[10030]|0);o=c[10030]|0;n=f-k;r=g-k;q=g+k;p=c[774]|0;c[774]=p+1;cf(o|0,82792,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=n,h[v+16>>3]=r,h[v+24>>3]=f+k,h[v+32>>3]=q,c[v+40>>2]=p,v)|0);p=c[10030]|0;j=k*2.0;o=c[774]|0;c[774]=o+1;cf(p|0,81160,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=n,h[v+16>>3]=r,h[v+24>>3]=f,h[v+32>>3]=g,h[v+40>>3]=n,h[v+48>>3]=g,h[v+56>>3]=f,h[v+64>>3]=q,h[v+72>>3]=j,h[v+80>>3]=j,c[v+88>>2]=o,v)|0);o=c[774]|0;p=c[10030]|0;c[774]=o+3;cf(p|0,83632,(v=i,i=i+8|0,c[v>>2]=o+2,v)|0);i=e;return}else if((b|0)==17){aI(83312,8,1,c[10030]|0);o=c[10030]|0;j=f-k;q=g-k;p=c[774]|0;c[774]=p+1;cf(o|0,82792,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=j,h[v+16>>3]=q,h[v+24>>3]=f+k,h[v+32>>3]=g+k,c[v+40>>2]=p,v)|0);p=c[10030]|0;n=k*2.0;o=c[774]|0;c[774]=o+1;cf(p|0,81472,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=j,h[v+16>>3]=q,h[v+24>>3]=f,h[v+32>>3]=g,h[v+40>>3]=f,h[v+48>>3]=q,h[v+56>>3]=j,h[v+64>>3]=g,h[v+72>>3]=n,h[v+80>>3]=n,c[v+88>>2]=o,v)|0);o=c[774]|0;p=c[10030]|0;c[774]=o+3;cf(p|0,83632,(v=i,i=i+8|0,c[v>>2]=o+2,v)|0);i=e;return}else if((b|0)==59){aI(83312,8,1,c[10030]|0);n=g+k;j=f+k;o=c[774]|0;cf(c[10030]|0,82320,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=n,h[v+24>>3]=j,h[v+32>>3]=g,h[v+40>>3]=f,h[v+48>>3]=g-k,h[v+56>>3]=f-k,h[v+64>>3]=g,h[v+72>>3]=f,h[v+80>>3]=n,c[v+88>>2]=o,v)|0);q=k*.5;r=f-q;l=g+q;o=c[774]|0;cf(c[10030]|0,82216,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=r,h[v+16>>3]=l,h[v+24>>3]=f+q,h[v+32>>3]=g-q,h[v+40>>3]=j,h[v+48>>3]=g,h[v+56>>3]=f,h[v+64>>3]=n,h[v+72>>3]=r,h[v+80>>3]=l,c[v+88>>2]=o,v)|0);o=c[774]|0;p=c[10030]|0;c[774]=o+3;cf(p|0,83632,(v=i,i=i+8|0,c[v>>2]=o+2,v)|0);i=e;return}else if((b|0)==7){l=g-k;r=g+k*.75;o=c[774]|0;cf(c[10030]|0,82600,(v=i,i=i+80|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=l,h[v+24>>3]=f+k,h[v+32>>3]=r,h[v+40>>3]=f-k,h[v+48>>3]=r,h[v+56>>3]=f,h[v+64>>3]=l,c[v+72>>2]=o,v)|0);c[774]=(c[774]|0)+1;i=e;return}else if((b|0)==60){aI(83312,8,1,c[10030]|0);l=g+k;r=f+k;n=g-k;o=c[774]|0;cf(c[10030]|0,82320,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=l,h[v+24>>3]=r,h[v+32>>3]=g,h[v+40>>3]=f,h[v+48>>3]=n,h[v+56>>3]=f-k,h[v+64>>3]=g,h[v+72>>3]=f,h[v+80>>3]=l,c[v+88>>2]=o,v)|0);j=k*.5;q=f-j;m=g-j;o=c[774]|0;cf(c[10030]|0,79928,(v=i,i=i+128|0,c[v>>2]=25936,h[v+8>>3]=q,h[v+16>>3]=m,h[v+24>>3]=f,h[v+32>>3]=n,h[v+40>>3]=r,h[v+48>>3]=g,h[v+56>>3]=f,h[v+64>>3]=l,h[v+72>>3]=q,h[v+80>>3]=g+j,h[v+88>>3]=f,h[v+96>>3]=g,h[v+104>>3]=q,h[v+112>>3]=m,c[v+120>>2]=o,v)|0);o=c[774]|0;p=c[10030]|0;c[774]=o+3;cf(p|0,83632,(v=i,i=i+8|0,c[v>>2]=o+2,v)|0);i=e;return}else if((b|0)==35){aI(83312,8,1,c[10030]|0);o=c[10030]|0;m=f-k;q=g+k;p=c[774]|0;c[774]=p+1;cf(o|0,82960,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=m,h[v+16>>3]=g-k,h[v+24>>3]=f+k,h[v+32>>3]=q,c[v+40>>2]=p,v)|0);p=c[10030]|0;o=c[774]|0;c[774]=o+1;cf(p|0,82880,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=m,h[v+16>>3]=g,h[v+24>>3]=f,h[v+32>>3]=q,c[v+40>>2]=o,v)|0);o=c[774]|0;p=c[10030]|0;c[774]=o+3;cf(p|0,83632,(v=i,i=i+8|0,c[v>>2]=o+2,v)|0);i=e;return}else if((b|0)==61){aI(83312,8,1,c[10030]|0);q=g+k;m=f+k;j=f-k;o=c[774]|0;cf(c[10030]|0,82320,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=q,h[v+24>>3]=m,h[v+32>>3]=g,h[v+40>>3]=f,h[v+48>>3]=g-k,h[v+56>>3]=j,h[v+64>>3]=g,h[v+72>>3]=f,h[v+80>>3]=q,c[v+88>>2]=o,v)|0);l=k*.5;r=g-l;o=c[774]|0;cf(c[10030]|0,79928,(v=i,i=i+128|0,c[v>>2]=25936,h[v+8>>3]=j,h[v+16>>3]=g,h[v+24>>3]=f-l,h[v+32>>3]=r,h[v+40>>3]=f,h[v+48>>3]=g,h[v+56>>3]=f+l,h[v+64>>3]=r,h[v+72>>3]=m,h[v+80>>3]=g,h[v+88>>3]=f,h[v+96>>3]=q,h[v+104>>3]=j,h[v+112>>3]=g,c[v+120>>2]=o,v)|0);o=c[774]|0;p=c[10030]|0;c[774]=o+3;cf(p|0,83632,(v=i,i=i+8|0,c[v>>2]=o+2,v)|0);i=e;return}else if((b|0)==54){aI(83312,8,1,c[10030]|0);j=g+k;q=g-k;m=f-k;o=c[774]|0;cf(c[10030]|0,82320,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=j,h[v+24>>3]=f+k,h[v+32>>3]=g,h[v+40>>3]=f,h[v+48>>3]=q,h[v+56>>3]=m,h[v+64>>3]=g,h[v+72>>3]=f,h[v+80>>3]=j,c[v+88>>2]=o,v)|0);r=k*.5;l=f+r;o=c[774]|0;cf(c[10030]|0,79928,(v=i,i=i+128|0,c[v>>2]=25936,h[v+8>>3]=m,h[v+16>>3]=g,h[v+24>>3]=f,h[v+32>>3]=q,h[v+40>>3]=l,h[v+48>>3]=g-r,h[v+56>>3]=f,h[v+64>>3]=g,h[v+72>>3]=l,h[v+80>>3]=g+r,h[v+88>>3]=f,h[v+96>>3]=j,h[v+104>>3]=m,h[v+112>>3]=g,c[v+120>>2]=o,v)|0);o=c[774]|0;p=c[10030]|0;c[774]=o+3;cf(p|0,83632,(v=i,i=i+8|0,c[v>>2]=o+2,v)|0);i=e;return}else if((b|0)==6){o=c[774]|0;cf(c[10030]|0,82736,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=f-k,h[v+16>>3]=g-k,h[v+24>>3]=f+k,h[v+32>>3]=g+k,c[v+40>>2]=o,v)|0);c[774]=(c[774]|0)+1;i=e;return}else if((b|0)==40){aI(83312,8,1,c[10030]|0);o=c[10030]|0;m=g-k;j=f+k;r=g+k;p=c[774]|0;c[774]=p+1;cf(o|0,82960,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=f-k,h[v+16>>3]=m,h[v+24>>3]=j,h[v+32>>3]=r,c[v+40>>2]=p,v)|0);p=c[10030]|0;o=c[774]|0;c[774]=o+1;cf(p|0,82880,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=m,h[v+24>>3]=j,h[v+32>>3]=r,c[v+40>>2]=o,v)|0);o=c[774]|0;p=c[10030]|0;c[774]=o+3;cf(p|0,83632,(v=i,i=i+8|0,c[v>>2]=o+2,v)|0);i=e;return}else if((b|0)==15){aI(83312,8,1,c[10030]|0);o=c[10030]|0;r=f-k;j=g-k;p=c[774]|0;c[774]=p+1;cf(o|0,82792,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=r,h[v+16>>3]=j,h[v+24>>3]=f+k,h[v+32>>3]=g+k,c[v+40>>2]=p,v)|0);p=c[10030]|0;m=k*.342;l=g-k*.94;q=k*2.0;o=c[774]|0;c[774]=o+1;cf(p|0,81704,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=r,h[v+16>>3]=j,h[v+24>>3]=f,h[v+32>>3]=g,h[v+40>>3]=f+m,h[v+48>>3]=l,h[v+56>>3]=f-m,h[v+64>>3]=l,h[v+72>>3]=q,h[v+80>>3]=q,c[v+88>>2]=o,v)|0);o=c[774]|0;p=c[10030]|0;c[774]=o+3;cf(p|0,83632,(v=i,i=i+8|0,c[v>>2]=o+2,v)|0);i=e;return}else if((b|0)==2){aI(83312,8,1,c[10030]|0);o=c[10030]|0;q=g-k;l=g+k;p=c[774]|0;c[774]=p+1;cf(o|0,83184,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=q+-1.0,h[v+24>>3]=f,h[v+32>>3]=l+1.0,c[v+40>>2]=p,v)|0);p=c[10030]|0;m=f-k;j=f+k;o=c[774]|0;c[774]=o+1;cf(p|0,83112,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=m+-1.0,h[v+16>>3]=g,h[v+24>>3]=j+1.0,h[v+32>>3]=g,c[v+40>>2]=o,v)|0);o=c[10030]|0;p=c[774]|0;c[774]=p+1;cf(o|0,83024,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=m,h[v+16>>3]=q,h[v+24>>3]=j,h[v+32>>3]=l,c[v+40>>2]=p,v)|0);p=c[10030]|0;o=c[774]|0;c[774]=o+1;cf(p|0,83024,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=m,h[v+16>>3]=l,h[v+24>>3]=j,h[v+32>>3]=q,c[v+40>>2]=o,v)|0);o=c[774]|0;p=c[10030]|0;c[774]=o+5;cf(p|0,83632,(v=i,i=i+8|0,c[v>>2]=o+4,v)|0);i=e;return}else if((b|0)==18){aI(83312,8,1,c[10030]|0);o=c[10030]|0;q=f-k;j=g-k;l=f+k;p=c[774]|0;c[774]=p+1;cf(o|0,82792,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=q,h[v+16>>3]=j,h[v+24>>3]=l,h[v+32>>3]=g+k,c[v+40>>2]=p,v)|0);p=c[10030]|0;m=k*2.0;o=c[774]|0;c[774]=o+1;cf(p|0,81368,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=q,h[v+16>>3]=j,h[v+24>>3]=f,h[v+32>>3]=g,h[v+40>>3]=l,h[v+48>>3]=g,h[v+56>>3]=q,h[v+64>>3]=g,h[v+72>>3]=m,h[v+80>>3]=m,c[v+88>>2]=o,v)|0);o=c[774]|0;p=c[10030]|0;c[774]=o+3;cf(p|0,83632,(v=i,i=i+8|0,c[v>>2]=o+2,v)|0);i=e;return}else if((b|0)==38){aI(83312,8,1,c[10030]|0);o=c[10030]|0;m=f-k;q=g-k;l=f+k;j=g+k;p=c[774]|0;c[774]=p+1;cf(o|0,82960,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=m,h[v+16>>3]=q,h[v+24>>3]=l,h[v+32>>3]=j,c[v+40>>2]=p,v)|0);p=c[10030]|0;o=c[774]|0;c[774]=o+1;cf(p|0,82880,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=m,h[v+16>>3]=q,h[v+24>>3]=l,h[v+32>>3]=g,c[v+40>>2]=o,v)|0);o=c[10030]|0;p=c[774]|0;c[774]=p+1;cf(o|0,82880,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=m,h[v+16>>3]=g,h[v+24>>3]=f,h[v+32>>3]=j,c[v+40>>2]=p,v)|0);p=c[774]|0;o=c[10030]|0;c[774]=p+4;cf(o|0,83632,(v=i,i=i+8|0,c[v>>2]=p+3,v)|0);i=e;return}else if((b|0)==51){aI(83312,8,1,c[10030]|0);j=g+k;p=c[774]|0;cf(c[10030]|0,82320,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=j,h[v+24>>3]=f+k,h[v+32>>3]=g,h[v+40>>3]=f,h[v+48>>3]=g-k,h[v+56>>3]=f-k,h[v+64>>3]=g,h[v+72>>3]=f,h[v+80>>3]=j,c[v+88>>2]=p,v)|0);m=k*.5;l=f-m;q=g+m;p=c[774]|0;cf(c[10030]|0,82216,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=l,h[v+16>>3]=q,h[v+24>>3]=f,h[v+32>>3]=g,h[v+40>>3]=f+m,h[v+48>>3]=q,h[v+56>>3]=f,h[v+64>>3]=j,h[v+72>>3]=l,h[v+80>>3]=q,c[v+88>>2]=p,v)|0);p=c[774]|0;o=c[10030]|0;c[774]=p+3;cf(o|0,83632,(v=i,i=i+8|0,c[v>>2]=p+2,v)|0);i=e;return}else if((b|0)==34){aI(83312,8,1,c[10030]|0);p=c[10030]|0;q=f-k;l=g-k;j=f+k;o=c[774]|0;c[774]=o+1;cf(p|0,82960,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=q,h[v+16>>3]=l,h[v+24>>3]=j,h[v+32>>3]=g+k,c[v+40>>2]=o,v)|0);o=c[10030]|0;p=c[774]|0;c[774]=p+1;cf(o|0,82880,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=q,h[v+16>>3]=l,h[v+24>>3]=j,h[v+32>>3]=g,c[v+40>>2]=p,v)|0);p=c[774]|0;o=c[10030]|0;c[774]=p+3;cf(o|0,83632,(v=i,i=i+8|0,c[v>>2]=p+2,v)|0);i=e;return}else if((b|0)==0){p=c[774]|0;cf(c[10030]|0,83736,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=g-k+-1.0,h[v+24>>3]=f,h[v+32>>3]=g+k+1.0,c[v+40>>2]=p+1,c[v+48>>2]=25936,h[v+56>>3]=f-k+-1.0,h[v+64>>3]=g,h[v+72>>3]=f+k+1.0,h[v+80>>3]=g,c[v+88>>2]=p+2,v)|0);p=c[774]|0;o=c[10030]|0;c[774]=p+5;cf(o|0,83632,(v=i,i=i+8|0,c[v>>2]=p+4,v)|0);i=e;return}else if((b|0)==9){j=g+k;l=g-k*.75;p=c[774]|0;cf(c[10030]|0,82600,(v=i,i=i+80|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=j,h[v+24>>3]=f-k,h[v+32>>3]=l,h[v+40>>3]=f+k,h[v+48>>3]=l,h[v+56>>3]=f,h[v+64>>3]=j,c[v+72>>2]=p,v)|0);c[774]=(c[774]|0)+1;i=e;return}else if((b|0)==3){p=c[774]|0;cf(c[10030]|0,82960,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=f-k,h[v+16>>3]=g-k,h[v+24>>3]=f+k,h[v+32>>3]=g+k,c[v+40>>2]=p,v)|0);c[774]=(c[774]|0)+1;i=e;return}else if((b|0)==46){p=c[774]|0;cf(c[10030]|0,82880,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=f-k,h[v+16>>3]=g-k,h[v+24>>3]=f+k,h[v+32>>3]=g+k,c[v+40>>2]=p,v)|0);c[774]=(c[774]|0)+1;i=e;return}else if((b|0)==55){aI(83312,8,1,c[10030]|0);j=g+k;l=f+k;p=c[774]|0;cf(c[10030]|0,82320,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=j,h[v+24>>3]=l,h[v+32>>3]=g,h[v+40>>3]=f,h[v+48>>3]=g-k,h[v+56>>3]=f-k,h[v+64>>3]=g,h[v+72>>3]=f,h[v+80>>3]=j,c[v+88>>2]=p,v)|0);j=k*.5;q=f+j;p=c[774]|0;cf(c[10030]|0,82216,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=g,h[v+24>>3]=q,h[v+32>>3]=g-j,h[v+40>>3]=l,h[v+48>>3]=g,h[v+56>>3]=q,h[v+64>>3]=g+j,h[v+72>>3]=f,h[v+80>>3]=g,c[v+88>>2]=p,v)|0);p=c[774]|0;o=c[10030]|0;c[774]=p+3;cf(o|0,83632,(v=i,i=i+8|0,c[v>>2]=p+2,v)|0);i=e;return}else if((b|0)==37){aI(83312,8,1,c[10030]|0);p=c[10030]|0;j=f-k;q=g-k;l=g+k;o=c[774]|0;c[774]=o+1;cf(p|0,82960,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=j,h[v+16>>3]=q,h[v+24>>3]=f+k,h[v+32>>3]=l,c[v+40>>2]=o,v)|0);o=c[10030]|0;p=c[774]|0;c[774]=p+1;cf(o|0,82880,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=j,h[v+16>>3]=q,h[v+24>>3]=f,h[v+32>>3]=l,c[v+40>>2]=p,v)|0);p=c[774]|0;o=c[10030]|0;c[774]=p+3;cf(o|0,83632,(v=i,i=i+8|0,c[v>>2]=p+2,v)|0);i=e;return}else if((b|0)==22){aI(83312,8,1,c[10030]|0);p=c[10030]|0;l=f-k;q=g-k;j=f+k;m=g+k;o=c[774]|0;c[774]=o+1;cf(p|0,82792,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=l,h[v+16>>3]=q,h[v+24>>3]=j,h[v+32>>3]=m,c[v+40>>2]=o,v)|0);o=c[10030]|0;r=k*2.0;p=c[774]|0;c[774]=p+1;cf(o|0,80872,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=l,h[v+16>>3]=q,h[v+24>>3]=f,h[v+32>>3]=g,h[v+40>>3]=j,h[v+48>>3]=g,h[v+56>>3]=f,h[v+64>>3]=m,h[v+72>>3]=r,h[v+80>>3]=r,c[v+88>>2]=p,v)|0);p=c[774]|0;o=c[10030]|0;c[774]=p+3;cf(o|0,83632,(v=i,i=i+8|0,c[v>>2]=p+2,v)|0);i=e;return}else if((b|0)==48){aI(83312,8,1,c[10030]|0);r=g+k;m=g-k;p=c[774]|0;cf(c[10030]|0,82320,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=r,h[v+24>>3]=f+k,h[v+32>>3]=g,h[v+40>>3]=f,h[v+48>>3]=m,h[v+56>>3]=f-k,h[v+64>>3]=g,h[v+72>>3]=f,h[v+80>>3]=r,c[v+88>>2]=p,v)|0);r=k*.5;j=f-r;q=g-r;p=c[774]|0;cf(c[10030]|0,82216,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=j,h[v+16>>3]=q,h[v+24>>3]=f,h[v+32>>3]=m,h[v+40>>3]=f+r,h[v+48>>3]=q,h[v+56>>3]=f,h[v+64>>3]=g,h[v+72>>3]=j,h[v+80>>3]=q,c[v+88>>2]=p,v)|0);p=c[774]|0;o=c[10030]|0;c[774]=p+3;cf(o|0,83632,(v=i,i=i+8|0,c[v>>2]=p+2,v)|0);i=e;return}else if((b|0)==21){aI(83312,8,1,c[10030]|0);p=c[10030]|0;q=f-k;j=g-k;r=g+k;o=c[774]|0;c[774]=o+1;cf(p|0,82792,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=q,h[v+16>>3]=j,h[v+24>>3]=f+k,h[v+32>>3]=r,c[v+40>>2]=o,v)|0);o=c[10030]|0;m=k*2.0;p=c[774]|0;c[774]=p+1;cf(o|0,81040,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=q,h[v+16>>3]=j,h[v+24>>3]=f,h[v+32>>3]=g,h[v+40>>3]=f,h[v+48>>3]=j,h[v+56>>3]=f,h[v+64>>3]=r,h[v+72>>3]=m,h[v+80>>3]=m,c[v+88>>2]=p,v)|0);p=c[774]|0;o=c[10030]|0;c[774]=p+3;cf(o|0,83632,(v=i,i=i+8|0,c[v>>2]=p+2,v)|0);i=e;return}else if((b|0)==5){p=c[774]|0;cf(c[10030]|0,82792,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=f-k,h[v+16>>3]=g-k,h[v+24>>3]=f+k,h[v+32>>3]=g+k,c[v+40>>2]=p,v)|0);c[774]=(c[774]|0)+1;i=e;return}else if((b|0)==25){aI(83312,8,1,c[10030]|0);p=c[10030]|0;m=f-k;r=g-k;j=f+k;q=g+k;o=c[774]|0;c[774]=o+1;cf(p|0,82792,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=m,h[v+16>>3]=r,h[v+24>>3]=j,h[v+32>>3]=q,c[v+40>>2]=o,v)|0);o=c[10030]|0;l=k*2.0;p=c[774]|0;c[774]=p+1;cf(o|0,81472,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=m,h[v+16>>3]=r,h[v+24>>3]=f,h[v+32>>3]=g,h[v+40>>3]=f,h[v+48>>3]=r,h[v+56>>3]=m,h[v+64>>3]=g,h[v+72>>3]=l,h[v+80>>3]=l,c[v+88>>2]=p,v)|0);p=c[10030]|0;o=c[774]|0;c[774]=o+1;cf(p|0,80720,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=m,h[v+16>>3]=r,h[v+24>>3]=f,h[v+32>>3]=g,h[v+40>>3]=f,h[v+48>>3]=q,h[v+56>>3]=j,h[v+64>>3]=g,h[v+72>>3]=l,h[v+80>>3]=l,c[v+88>>2]=o,v)|0);o=c[774]|0;p=c[10030]|0;c[774]=o+4;cf(p|0,83632,(v=i,i=i+8|0,c[v>>2]=o+3,v)|0);i=e;return}else if((b|0)==42){aI(83312,8,1,c[10030]|0);o=c[10030]|0;l=f-k;j=g-k;q=f+k;r=g+k;p=c[774]|0;c[774]=p+1;cf(o|0,82960,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=l,h[v+16>>3]=j,h[v+24>>3]=q,h[v+32>>3]=r,c[v+40>>2]=p,v)|0);p=c[10030]|0;o=c[774]|0;c[774]=o+1;cf(p|0,82880,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=l,h[v+16>>3]=j,h[v+24>>3]=q,h[v+32>>3]=g,c[v+40>>2]=o,v)|0);o=c[10030]|0;p=c[774]|0;c[774]=p+1;cf(o|0,82880,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=g,h[v+24>>3]=q,h[v+32>>3]=r,c[v+40>>2]=p,v)|0);p=c[774]|0;o=c[10030]|0;c[774]=p+4;cf(o|0,83632,(v=i,i=i+8|0,c[v>>2]=p+3,v)|0);i=e;return}else if((b|0)==58){aI(83312,8,1,c[10030]|0);r=g+k;q=f+k;j=g-k;l=f-k;p=c[774]|0;cf(c[10030]|0,82320,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=r,h[v+24>>3]=q,h[v+32>>3]=g,h[v+40>>3]=f,h[v+48>>3]=j,h[v+56>>3]=l,h[v+64>>3]=g,h[v+72>>3]=f,h[v+80>>3]=r,c[v+88>>2]=p,v)|0);r=k*.5;m=g+r;p=c[774]|0;cf(c[10030]|0,79928,(v=i,i=i+128|0,c[v>>2]=25936,h[v+8>>3]=l,h[v+16>>3]=g,h[v+24>>3]=f,h[v+32>>3]=j,h[v+40>>3]=q,h[v+48>>3]=g,h[v+56>>3]=f+r,h[v+64>>3]=m,h[v+72>>3]=f,h[v+80>>3]=g,h[v+88>>3]=f-r,h[v+96>>3]=m,h[v+104>>3]=l,h[v+112>>3]=g,c[v+120>>2]=p,v)|0);p=c[774]|0;o=c[10030]|0;c[774]=p+3;cf(o|0,83632,(v=i,i=i+8|0,c[v>>2]=p+2,v)|0);i=e;return}else if((b|0)==32){aI(83312,8,1,c[10030]|0);p=c[10030]|0;l=g-k;m=f+k;o=c[774]|0;c[774]=o+1;cf(p|0,82960,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=f-k,h[v+16>>3]=l,h[v+24>>3]=m,h[v+32>>3]=g+k,c[v+40>>2]=o,v)|0);o=c[10030]|0;p=c[774]|0;c[774]=p+1;cf(o|0,82880,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=l,h[v+24>>3]=m,h[v+32>>3]=g,c[v+40>>2]=p,v)|0);p=c[774]|0;o=c[10030]|0;c[774]=p+3;cf(o|0,83632,(v=i,i=i+8|0,c[v>>2]=p+2,v)|0);i=e;return}else if((b|0)==(-1|0)){break}else if((b|0)==13){m=g-k;l=g-k*.25;r=k*.625;q=g+k;p=c[774]|0;cf(c[10030]|0,82080,(v=i,i=i+112|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=m,h[v+24>>3]=f+k,h[v+32>>3]=l,h[v+40>>3]=f+r,h[v+48>>3]=q,h[v+56>>3]=f-r,h[v+64>>3]=q,h[v+72>>3]=f-k,h[v+80>>3]=l,h[v+88>>3]=f,h[v+96>>3]=m,c[v+104>>2]=p,v)|0);c[774]=(c[774]|0)+1;i=e;return}else if((b|0)==24){aI(83312,8,1,c[10030]|0);p=c[10030]|0;m=f-k;l=g-k;q=g+k;o=c[774]|0;c[774]=o+1;cf(p|0,82792,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=m,h[v+16>>3]=l,h[v+24>>3]=f+k,h[v+32>>3]=q,c[v+40>>2]=o,v)|0);o=c[10030]|0;r=k*2.0;p=c[774]|0;c[774]=p+1;cf(o|0,80616,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=m,h[v+16>>3]=l,h[v+24>>3]=f,h[v+32>>3]=g,h[v+40>>3]=f,h[v+48>>3]=q,h[v+56>>3]=f,h[v+64>>3]=l,h[v+72>>3]=r,h[v+80>>3]=r,c[v+88>>2]=p,v)|0);p=c[774]|0;o=c[10030]|0;c[774]=p+3;cf(o|0,83632,(v=i,i=i+8|0,c[v>>2]=p+2,v)|0);i=e;return}else if((b|0)==62){r=g+k;p=c[774]|0;cf(c[10030]|0,82216,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=r,h[v+24>>3]=f+k,h[v+32>>3]=g,h[v+40>>3]=f,h[v+48>>3]=g-k,h[v+56>>3]=f-k,h[v+64>>3]=g,h[v+72>>3]=f,h[v+80>>3]=r,c[v+88>>2]=p,v)|0);c[774]=(c[774]|0)+1;i=e;return}else if((b|0)==53){aI(83312,8,1,c[10030]|0);r=g+k;l=f-k;p=c[774]|0;cf(c[10030]|0,82320,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=r,h[v+24>>3]=f+k,h[v+32>>3]=g,h[v+40>>3]=f,h[v+48>>3]=g-k,h[v+56>>3]=l,h[v+64>>3]=g,h[v+72>>3]=f,h[v+80>>3]=r,c[v+88>>2]=p,v)|0);q=k*.5;p=c[774]|0;cf(c[10030]|0,82216,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=l,h[v+16>>3]=g,h[v+24>>3]=f-q,h[v+32>>3]=g-q,h[v+40>>3]=f+q,h[v+48>>3]=g+q,h[v+56>>3]=f,h[v+64>>3]=r,h[v+72>>3]=l,h[v+80>>3]=g,c[v+88>>2]=p,v)|0);p=c[774]|0;o=c[10030]|0;c[774]=p+3;cf(o|0,83632,(v=i,i=i+8|0,c[v>>2]=p+2,v)|0);i=e;return}else if((b|0)==44){aI(83312,8,1,c[10030]|0);p=c[10030]|0;l=f-k;r=g-k;q=f+k;m=g+k;o=c[774]|0;c[774]=o+1;cf(p|0,82960,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=l,h[v+16>>3]=r,h[v+24>>3]=q,h[v+32>>3]=m,c[v+40>>2]=o,v)|0);o=c[10030]|0;p=c[774]|0;c[774]=p+1;cf(o|0,82880,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=r,h[v+24>>3]=q,h[v+32>>3]=g,c[v+40>>2]=p,v)|0);p=c[10030]|0;o=c[774]|0;c[774]=o+1;cf(p|0,82880,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=l,h[v+16>>3]=g,h[v+24>>3]=q,h[v+32>>3]=m,c[v+40>>2]=o,v)|0);o=c[774]|0;p=c[10030]|0;c[774]=o+4;cf(p|0,83632,(v=i,i=i+8|0,c[v>>2]=o+3,v)|0);i=e;return}else if((b|0)==33){aI(83312,8,1,c[10030]|0);o=c[10030]|0;m=f-k;q=g-k;p=c[774]|0;c[774]=p+1;cf(o|0,82960,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=m,h[v+16>>3]=q,h[v+24>>3]=f+k,h[v+32>>3]=g+k,c[v+40>>2]=p,v)|0);p=c[10030]|0;o=c[774]|0;c[774]=o+1;cf(p|0,82880,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=m,h[v+16>>3]=q,h[v+24>>3]=f,h[v+32>>3]=g,c[v+40>>2]=o,v)|0);o=c[774]|0;p=c[10030]|0;c[774]=o+3;cf(p|0,83632,(v=i,i=i+8|0,c[v>>2]=o+2,v)|0);i=e;return}else if((b|0)==36){aI(83312,8,1,c[10030]|0);o=c[10030]|0;q=f-k;m=g-k;l=f+k;r=g+k;p=c[774]|0;c[774]=p+1;cf(o|0,82960,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=q,h[v+16>>3]=m,h[v+24>>3]=l,h[v+32>>3]=r,c[v+40>>2]=p,v)|0);p=c[10030]|0;o=c[774]|0;c[774]=o+1;cf(p|0,82880,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=m,h[v+24>>3]=l,h[v+32>>3]=g,c[v+40>>2]=o,v)|0);o=c[10030]|0;p=c[774]|0;c[774]=p+1;cf(o|0,82880,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=q,h[v+16>>3]=g,h[v+24>>3]=f,h[v+32>>3]=r,c[v+40>>2]=p,v)|0);p=c[774]|0;o=c[10030]|0;c[774]=p+4;cf(o|0,83632,(v=i,i=i+8|0,c[v>>2]=p+3,v)|0);i=e;return}else if((b|0)==16){aI(83312,8,1,c[10030]|0);b=c[10030]|0;r=f-k;q=g-k;l=f+k;p=c[774]|0;c[774]=p+1;cf(b|0,82792,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=r,h[v+16>>3]=q,h[v+24>>3]=l,h[v+32>>3]=g+k,c[v+40>>2]=p,v)|0);p=c[10030]|0;m=k*2.0;b=c[774]|0;c[774]=b+1;cf(p|0,81608,(v=i,i=i+96|0,c[v>>2]=25936,h[v+8>>3]=r,h[v+16>>3]=q,h[v+24>>3]=f,h[v+32>>3]=g,h[v+40>>3]=l,h[v+48>>3]=g,h[v+56>>3]=f,h[v+64>>3]=q,h[v+72>>3]=m,h[v+80>>3]=m,c[v+88>>2]=b,v)|0);b=c[774]|0;p=c[10030]|0;c[774]=b+3;cf(p|0,83632,(v=i,i=i+8|0,c[v>>2]=b+2,v)|0);i=e;return}else{i=e;return}}}while(0);d=c[10030]|0;b=c[774]|0;c[774]=b+1;cf(d|0,83880,(v=i,i=i+48|0,c[v>>2]=25936,h[v+8>>3]=f,h[v+16>>3]=g,h[v+24>>3]=f+1.0,h[v+32>>3]=g+1.0,c[v+40>>2]=b,v)|0);i=e;return}function qG(a){a=+a;return}function qH(a){a=a|0;return 0}function qI(){return}function qJ(){return}function qK(){return}function qL(a){a=+a;h[6448]=a<0.0?1.0:a;return}function qM(a,b){a=a|0;b=b|0;c[1082]=a;c[1080]=1e3-b;return}function qN(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0;f=i;tt();g=c[514]|0;h=g+d|0;d=c[512]|0;j=d-e|0;e=c[768]|0;k=c[774]|0;l=c[770]|0;cf(c[10030]|0,83952,(v=i,i=i+72|0,c[v>>2]=25936,c[v+8>>2]=2,c[v+16>>2]=g+a,c[v+24>>2]=d-b,c[v+32>>2]=h,c[v+40>>2]=j,c[v+48>>2]=e,c[v+56>>2]=k,c[v+64>>2]=l,v)|0);c[774]=(c[774]|0)+1;c[554]=h;c[552]=j;i=f;return}function qO(b){b=b|0;var d=0,e=0,f=0;d=i;if((b|0)==0){e=18229}else{if((a[b]|0)==0){e=18229}else{f=b}}if((e|0)==18229){f=25424}e=bk(f|0,148464)|0;if((e|0)>0){uF(25680,f|0,e|0);a[e+25680|0]=0}ca(f+(e+1|0)|0,21e4,(v=i,i=i+8|0,c[v>>2]=3112,v)|0);i=d;return 1}function qP(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;g=i;i=i+48|0;h=g|0;c[h>>2]=b;c[h+4>>2]=d;j=e+b|0;c[h+12>>2]=j;c[h+16>>2]=d;c[h+24>>2]=j;j=f+d|0;c[h+28>>2]=j;c[h+36>>2]=b;c[h+40>>2]=j;c[h+8>>2]=a;qR(4,h|0);i=g;return}function qQ(b){b=b|0;var e=0,f=0,g=0,j=0;e=i;f=c[b>>2]|0;if((f|0)==1){g=c[b+4>>2]|0;tt();if((g|0)>-1){j=((g|0)%10&-1)+2|0}else{j=(g|0)<-2?0:g+2|0}if(a[225792]|0){a[25936]=a[89416]|0;a[25937|0]=a[89417|0]|0;a[25938|0]=a[89418|0]|0;a[25939|0]=a[89419|0]|0;a[25940|0]=a[89420|0]|0;a[25941|0]=a[89421|0]|0;a[26448]=a[28976]|0;a[26449|0]=a[28977|0]|0;a[26450|0]=a[28978|0]|0}else{g=c[28928+(j<<2)>>2]|0;uB(25936,g|0);g=28976+(j*3&-1)|0;a[26448]=a[g]|0;a[26449|0]=a[g+1|0]|0;a[26450|0]=a[g+2|0]|0}c[768]=~~(+h[6448]*+h[6449]*+((c[2112+(j<<2)>>2]|0)>>>0>>>0)+.5);if(!(a[225800]|0)){c[770]=c[2160+(j<<2)>>2];i=e;return}if((j|0)==1){c[770]=5;i=e;return}else{c[770]=0;i=e;return}}else if((f|0)==5){fr(+h[b+8>>3],26448);j=d[26449]|0;g=d[26450]|0;be(25936,84104,(v=i,i=i+24|0,c[v>>2]=d[26448]|0,c[v+8>>2]=j,c[v+16>>2]=g,v)|0);i=e;return}else if((f|0)==3){f=c[b+4>>2]|0;b=f>>>16;a[26448]=b&255;g=f>>>8;a[26449]=g&255;a[26450]=f&255;be(25936,84104,(v=i,i=i+24|0,c[v>>2]=b&255,c[v+8>>2]=g&255,c[v+16>>2]=f&255,v)|0);i=e;return}else{i=e;return}}function qR(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0.0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;f=i;i=i+256|0;g=f|0;h=c[e+8>>2]|0;j=h>>4;k=h&15;if(a[46624]|0){tt()}if((k|0)==4|(k|0)==1){h=g|0;l=+(100-j|0)*.01;do{if(l<0.0){m=0.0}else{if(l<=1.0){m=l;break}m=1.0}}while(0);n=d[26448]|0;o=~~(+(n|0)+m*+(n^255|0));n=d[26449]|0;p=~~(+(n|0)+m*+(n^255|0));n=d[26450]|0;q=~~(+(n|0)+m*+(n^255|0));be(h|0,84104,(v=i,i=i+24|0,c[v>>2]=o,c[v+8>>2]=p,c[v+16>>2]=q,v)|0);r=1}else if((k|0)==0){q=g|0;a[q]=a[84376]|0;a[q+1|0]=a[84377|0]|0;a[q+2|0]=a[84378|0]|0;a[q+3|0]=a[84379|0]|0;a[q+4|0]=a[84380|0]|0;a[q+5|0]=a[84381|0]|0;r=2}else if((k|0)==5|(k|0)==2){k=c[2224+(((j|0)%10&-1)<<2)>>2]|0;uB(g|0,25936);r=k}else{uB(g|0,25936);r=1}cf(c[10030]|0,84328,(v=i,i=i+16|0,c[v>>2]=g,c[v+8>>2]=b+1,v)|0);g=e|0;k=e+4|0;j=(c[512]|0)-(c[k>>2]|0)|0;cf(c[10030]|0,84280,(v=i,i=i+16|0,c[v>>2]=(c[514]|0)+(c[g>>2]|0),c[v+8>>2]=j,v)|0);j=c[10030]|0;if((b|0)>1){s=1;t=j}else{u=j;w=c[g>>2]|0;x=c[514]|0;y=x+w|0;z=c[512]|0;A=c[k>>2]|0;B=z-A|0;C=cf(u|0,84160,(v=i,i=i+16|0,c[v>>2]=y,c[v+8>>2]=B,v)|0)|0;D=c[10030]|0;E=c[774]|0;F=cf(D|0,84120,(v=i,i=i+16|0,c[v>>2]=r,c[v+8>>2]=E,v)|0)|0;G=c[774]|0;H=G+1|0;c[774]=H;i=f;return}while(1){j=(c[512]|0)-(c[e+(s*12&-1)+4>>2]|0)|0;cf(t|0,84280,(v=i,i=i+16|0,c[v>>2]=(c[514]|0)+(c[e+(s*12&-1)>>2]|0),c[v+8>>2]=j,v)|0);j=s+1|0;if((j&7|0)==0){q=c[10030]|0;aI(84248,2,1,q|0)}q=c[10030]|0;if((j|0)<(b|0)){s=j;t=q}else{u=q;break}}w=c[g>>2]|0;x=c[514]|0;y=x+w|0;z=c[512]|0;A=c[k>>2]|0;B=z-A|0;C=cf(u|0,84160,(v=i,i=i+16|0,c[v>>2]=y,c[v+8>>2]=B,v)|0)|0;D=c[10030]|0;E=c[774]|0;F=cf(D|0,84120,(v=i,i=i+16|0,c[v>>2]=r,c[v+8>>2]=E,v)|0)|0;G=c[774]|0;H=G+1|0;c[774]=H;i=f;return}function qS(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;b=i;a[4304]=0;a[4336]=0;d=c[13898]|0;e=c[8272]|0;L24421:do{if((d|0)<(e|0)){f=c[1054]|0;g=d;h=0;j=0;while(1){k=(a[f+(g*40&-1)|0]&1)==0;L24425:do{if(!k){l=c[f+(g*40&-1)+36>>2]|0;m=f+(g*40&-1)+32|0;n=c[10036]|0;o=0;while(1){if((o|0)>=(l|0)){break}if((a[n+((c[m>>2]|0)+o|0)|0]|0)==(a[o+103664|0]|0)){o=o+1|0}else{break L24425}}if((o|0)==1){p=h;q=j;break L24421}}}while(0);m=c[56574]|0;L24432:do{if((m|0)==0){r=226296}else{n=c[f+(g*40&-1)+36>>2]|0;l=c[f+(g*40&-1)+32>>2]|0;s=(n|0)>0;t=c[10036]|0;u=226296;w=m;while(1){L24436:do{if(!k){if(s){x=0;y=0;z=l;while(1){A=a[w+x|0]|0;if(A<<24>>24==(a[t+(x+z|0)|0]|0)){B=z;C=y}else{if(A<<24>>24!=36){break L24436}B=z-1|0;C=1}D=x+1|0;if((D|0)<(C+n|0)){x=D;y=C;z=B}else{break}}if((C|0)==0){E=D}else{r=u;break L24432}}else{E=0}z=a[w+E|0]|0;if((z<<24>>24|0)==36|(z<<24>>24|0)==0){r=u;break L24432}}}while(0);z=u+8|0;y=c[z>>2]|0;if((y|0)==0){r=z;break}else{u=z;w=y}}}}while(0);k=c[r+4>>2]|0;if((k|0)==0){a[4304]=1;m=g+1|0;c[13898]=m;F=1;G=j;H=m}else if((k|0)==1){a[4336]=1;k=g+1|0;c[13898]=k;F=h;G=1;H=k}else{k=g+1|0;c[13898]=k;F=h;G=j;H=k}if((H|0)<(e|0)){g=H;h=F;j=G}else{p=F;q=G;break}}}else{p=0;q=0}}while(0);be(13048,84616,(v=i,i=i+16|0,c[v>>2]=p?84608:179864,c[v+8>>2]=q?84576:179864,v)|0);i=b;return}function qT(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0;b=i;d=c[10030]|0;if(a[4304]|0){aI(87648,3,1,d|0);if((a[37384]&1)!=0){e=c[10030]|0;f=aD(e|0)|0;i=b;return}g=c[10030]|0;aI(87560,23,1,g|0);g=c[10030]|0;j=c[7938]|0;k=c[7939]|0;l=1e3-(c[7941]|0)|0;m=1e3-(c[7940]|0)|0;cf(g|0,87528,(v=i,i=i+32|0,c[v>>2]=j,c[v+8>>2]=k,c[v+16>>2]=l,c[v+24>>2]=m,v)|0);m=c[10030]|0;aI(87648,3,1,m|0);m=c[10030]|0;aI(87440,25,1,m|0);m=c[10030]|0;n=+h[8255];o=+h[8256];p=+h[8169];q=+h[8170];r=+h[8599];s=+h[8600];t=+h[8513];u=+h[8514];cf(m|0,87360,(v=i,i=i+64|0,h[v>>3]=n,h[v+8>>3]=o,h[v+16>>3]=p,h[v+24>>3]=q,h[v+32>>3]=r,h[v+40>>3]=s,h[v+48>>3]=t,h[v+56>>3]=u,v)|0);m=c[10030]|0;aI(87648,3,1,m|0);if(!(a[4336]|0)){e=c[10030]|0;f=aD(e|0)|0;i=b;return}m=c[10030]|0;aI(87336,17,1,m|0);m=c[10030]|0;aI(87136,88,1,m|0);m=c[10030]|0;aI(87072,41,1,m|0);m=c[10030]|0;aI(86960,43,1,m|0);m=c[10030]|0;aI(86840,107,1,m|0);m=c[10030]|0;aI(86816,9,1,m|0);m=c[10030]|0;aI(86600,72,1,m|0);m=c[10030]|0;aI(86520,72,1,m|0);m=c[10030]|0;aI(86384,72,1,m|0);m=c[10030]|0;aI(86248,72,1,m|0);m=c[10030]|0;aI(86232,11,1,m|0);m=c[10030]|0;aI(86144,2,1,m|0);m=c[10030]|0;aI(87648,3,1,m|0);e=c[10030]|0;f=aD(e|0)|0;i=b;return}else{aI(86144,2,1,d|0);if((a[37384]&1)!=0){e=c[10030]|0;f=aD(e|0)|0;i=b;return}d=c[10030]|0;aI(86024,27,1,d|0);d=c[10030]|0;m=c[7938]|0;l=c[7939]|0;k=1e3-(c[7941]|0)|0;j=1e3-(c[7940]|0)|0;cf(d|0,85936,(v=i,i=i+32|0,c[v>>2]=m,c[v+8>>2]=l,c[v+16>>2]=k,c[v+24>>2]=j,v)|0);j=c[10030]|0;aI(86144,2,1,j|0);j=c[10030]|0;aI(85896,29,1,j|0);j=c[10030]|0;u=+h[8255];t=+h[8256];s=+h[8169];r=+h[8170];q=+h[8599];p=+h[8600];o=+h[8513];n=+h[8514];cf(j|0,85856,(v=i,i=i+64|0,h[v>>3]=u,h[v+8>>3]=t,h[v+16>>3]=s,h[v+24>>3]=r,h[v+32>>3]=q,h[v+40>>3]=p,h[v+48>>3]=o,h[v+56>>3]=n,v)|0);j=c[10030]|0;aI(86144,2,1,j|0);if(!(a[4336]|0)){e=c[10030]|0;f=aD(e|0)|0;i=b;return}j=c[10030]|0;aI(85712,72,1,j|0);j=c[10030]|0;aI(85648,60,1,j|0);j=c[10030]|0;aI(85552,35,1,j|0);j=c[10030]|0;aI(85408,94,1,j|0);j=c[10030]|0;aI(86816,9,1,j|0);j=c[10030]|0;aI(85232,103,1,j|0);j=c[10030]|0;aI(84968,103,1,j|0);j=c[10030]|0;aI(84840,103,1,j|0);j=c[10030]|0;aI(84632,81,1,j|0);j=c[10030]|0;aI(86144,2,1,j|0);j=c[10030]|0;aI(86144,2,1,j|0);e=c[10030]|0;f=aD(e|0)|0;i=b;return}}function qU(){var b=0;b=c[10030]|0;if(a[4304]|0){aI(87976|0,314,1,b|0)}else{aI(87656|0,305,1,b|0)}c[1094]=0;c[1080]=0;c[1082]=0;return}function qV(a){a=a|0;c[1094]=(a|0)<-2?0:a+2&7;return}function qW(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0.0,n=0,o=0,p=0.0,q=0.0,r=0,s=0,t=0,u=0.0,w=0.0,x=0,y=0.0,z=0,A=0,B=0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0,Q=0,S=0,T=0.0,U=0.0,V=0.0,W=0,X=0,Y=0,Z=0.0,_=0.0,$=0.0,aa=0.0,ab=0.0,ac=0.0,ad=0.0,ae=0.0,af=0.0,ag=0.0,ah=0.0,ai=0.0;e=i;do{if(a[4336]|0){if((a[37384]&1)!=0){break}f=c[10030]|0;if(a[4304]|0){aI(89232,11,1,f|0);break}else{aI(89104,12,1,f|0);break}}}while(0);f=1e3-d|0;g=c[10030]|0;j=c[1082]|0;k=c[1080]|0;l=c[4344+(c[1094]<<2)>>2]|0;m=+h[539];if(a[4304]|0){cf(g|0,88928,(v=i,i=i+48|0,c[v>>2]=j,c[v+8>>2]=k,c[v+16>>2]=b,c[v+24>>2]=f,c[v+32>>2]=l,h[v+40>>3]=m,v)|0)}else{cf(g|0,88712,(v=i,i=i+48|0,c[v>>2]=j,c[v+8>>2]=k,c[v+16>>2]=b,c[v+24>>2]=f,c[v+32>>2]=l,h[v+40>>3]=m,v)|0)}do{if(a[4336]|0){if((a[37384]&1)!=0){break}l=c[10030]|0;k=a[66164]&1;j=k<<24>>24!=0;if(a[4304]|0){if(j){m=+h[8255];g=c[1082]|0;n=c[7938]|0;o=c[7939]|0;p=+h[8256];q=+R(+(+h[8271]),+(m+ +(g-n|0)/+(o-n|0)*(p-m)));r=g;s=n;t=o;u=m;w=p}else{p=+h[8255];o=c[1082]|0;n=c[7938]|0;g=c[7939]|0;m=+h[8256];q=p+ +(o-n|0)/+(g-n|0)*(m-p);r=o;s=n;t=g;u=p;w=m}g=(a[65476]&1)==0;if(g){m=+h[8169];n=c[1080]|0;o=c[7940]|0;x=c[7941]|0;p=+h[8170];y=m+ +((1e3-n|0)-o|0)/+(x-o|0)*(p-m);z=n;A=o;B=x;C=m;D=p}else{p=+h[8169];x=c[1080]|0;o=c[7940]|0;n=c[7941]|0;m=+h[8170];y=+R(+(+h[8185]),+(p+ +((1e3-x|0)-o|0)/+(n-o|0)*(m-p)));z=x;A=o;B=n;C=p;D=m}n=(a[68916]&1)==0;if(n){m=+h[8599];p=+h[8600];E=m+ +(r-s|0)/+(t-s|0)*(p-m);F=m;G=p}else{p=+h[8599];m=+h[8600];E=+R(+(+h[8615]),+(p+ +(r-s|0)/+(t-s|0)*(m-p)));F=p;G=m}o=(a[68228]&1)==0;if(o){m=+h[8513];p=+h[8514];H=m+ +((1e3-z|0)-A|0)/+(B-A|0)*(p-m);I=m;J=p}else{p=+h[8513];m=+h[8514];H=+R(+(+h[8529]),+(p+ +((1e3-z|0)-A|0)/+(B-A|0)*(m-p)));I=p;J=m}if(k<<24>>24==0){K=u+ +((b-s|0)>>>0>>>0)/+(t-s|0)*(w-u)}else{K=+R(+(+h[8271]),+(u+ +((b-s|0)>>>0>>>0)/+(t-s|0)*(w-u)))}if(g){L=C+ +((d-A|0)>>>0>>>0)/+(B-A|0)*(D-C)}else{L=+R(+(+h[8185]),+(C+ +((d-A|0)>>>0>>>0)/+(B-A|0)*(D-C)))}if(n){M=F+ +((b-s|0)>>>0>>>0)/+(t-s|0)*(G-F)}else{M=+R(+(+h[8615]),+(F+ +((b-s|0)>>>0>>>0)/+(t-s|0)*(G-F)))}if(o){N=I+ +((d-A|0)>>>0>>>0)/+(B-A|0)*(J-I)}else{N=+R(+(+h[8529]),+(I+ +((d-A|0)>>>0>>>0)/+(B-A|0)*(J-I)))}cf(l|0,88632,(v=i,i=i+64|0,h[v>>3]=q,h[v+8>>3]=y,h[v+16>>3]=E,h[v+24>>3]=H,h[v+32>>3]=K,h[v+40>>3]=L,h[v+48>>3]=M,h[v+56>>3]=N,v)|0);o=c[10030]|0;if((a[66164]&1)==0){aI(88544,4,1,o|0)}else{m=+h[8255];n=c[7938]|0;p=+R(+(+h[8271]),+(m+(+(((c[1082]|0)+b|0)>>>0>>>0)*.5- +(n|0))/+((c[7939]|0)-n|0)*(+h[8256]-m)));cf(o|0,88624,(v=i,i=i+8|0,h[v>>3]=p,v)|0)}o=c[10030]|0;if((a[65476]&1)==0){aI(88544,4,1,o|0)}else{p=+h[8169];n=c[7940]|0;m=+R(+(+h[8185]),+(p+(1.0e3- +(((c[1080]|0)+f|0)>>>0>>>0)*.5- +(n|0))/+((c[7941]|0)-n|0)*(+h[8170]-p)));cf(o|0,88624,(v=i,i=i+8|0,h[v>>3]=m,v)|0)}o=c[10030]|0;if((a[68916]&1)==0){aI(88544,4,1,o|0)}else{m=+h[8599];n=c[7938]|0;p=+R(+(+h[8615]),+(m+(+(((c[1082]|0)+b|0)>>>0>>>0)*.5- +(n|0))/+((c[7939]|0)-n|0)*(+h[8600]-m)));cf(o|0,88624,(v=i,i=i+8|0,h[v>>3]=p,v)|0)}o=c[10030]|0;if((a[68228]&1)==0){aI(88528,3,1,o|0)}else{p=+h[8513];n=c[7940]|0;m=+R(+(+h[8529]),+(p+(1.0e3- +(((c[1080]|0)+f|0)>>>0>>>0)*.5- +(n|0))/+((c[7941]|0)-n|0)*(+h[8514]-p)));cf(o|0,88536,(v=i,i=i+8|0,h[v>>3]=m,v)|0)}o=c[10030]|0;aI(88480,4,1,o|0);c[1082]=b;c[1080]=f;i=e;return}else{if(j){m=+h[8255];j=c[1082]|0;o=c[7938]|0;n=c[7939]|0;p=+h[8256];O=+R(+(+h[8271]),+(m+ +(j-o|0)/+(n-o|0)*(p-m)));P=j;Q=o;S=n;T=m;U=p}else{p=+h[8255];n=c[1082]|0;o=c[7938]|0;j=c[7939]|0;m=+h[8256];O=p+ +(n-o|0)/+(j-o|0)*(m-p);P=n;Q=o;S=j;T=p;U=m}j=(a[65476]&1)==0;if(j){m=+h[8169];o=c[1080]|0;n=c[7940]|0;g=c[7941]|0;p=+h[8170];V=m+ +((1e3-o|0)-n|0)/+(g-n|0)*(p-m);W=o;X=n;Y=g;Z=m;_=p}else{p=+h[8169];g=c[1080]|0;n=c[7940]|0;o=c[7941]|0;m=+h[8170];V=+R(+(+h[8185]),+(p+ +((1e3-g|0)-n|0)/+(o-n|0)*(m-p)));W=g;X=n;Y=o;Z=p;_=m}o=(a[68916]&1)==0;if(o){m=+h[8599];p=+h[8600];$=m+ +(P-Q|0)/+(S-Q|0)*(p-m);aa=m;ab=p}else{p=+h[8599];m=+h[8600];$=+R(+(+h[8615]),+(p+ +(P-Q|0)/+(S-Q|0)*(m-p)));aa=p;ab=m}n=(a[68228]&1)==0;if(n){m=+h[8513];p=+h[8514];ac=m+ +((1e3-W|0)-X|0)/+(Y-X|0)*(p-m);ad=m;ae=p}else{p=+h[8513];m=+h[8514];ac=+R(+(+h[8529]),+(p+ +((1e3-W|0)-X|0)/+(Y-X|0)*(m-p)));ad=p;ae=m}if(k<<24>>24==0){af=T+ +((b-Q|0)>>>0>>>0)/+(S-Q|0)*(U-T)}else{af=+R(+(+h[8271]),+(T+ +((b-Q|0)>>>0>>>0)/+(S-Q|0)*(U-T)))}if(j){ag=Z+ +((d-X|0)>>>0>>>0)/+(Y-X|0)*(_-Z)}else{ag=+R(+(+h[8185]),+(Z+ +((d-X|0)>>>0>>>0)/+(Y-X|0)*(_-Z)))}if(o){ah=aa+ +((b-Q|0)>>>0>>>0)/+(S-Q|0)*(ab-aa)}else{ah=+R(+(+h[8615]),+(aa+ +((b-Q|0)>>>0>>>0)/+(S-Q|0)*(ab-aa)))}if(n){ai=ad+ +((d-X|0)>>>0>>>0)/+(Y-X|0)*(ae-ad)}else{ai=+R(+(+h[8529]),+(ad+ +((d-X|0)>>>0>>>0)/+(Y-X|0)*(ae-ad)))}cf(l|0,88424,(v=i,i=i+64|0,h[v>>3]=O,h[v+8>>3]=V,h[v+16>>3]=$,h[v+24>>3]=ac,h[v+32>>3]=af,h[v+40>>3]=ag,h[v+48>>3]=ah,h[v+56>>3]=ai,v)|0);l=c[10030]|0;if((a[66164]&1)==0){aI(88384,3,1,l|0)}else{m=+h[8255];n=c[7938]|0;p=+R(+(+h[8271]),+(m+(+(((c[1082]|0)+b|0)>>>0>>>0)*.5- +(n|0))/+((c[7939]|0)-n|0)*(+h[8256]-m)));cf(l|0,88536,(v=i,i=i+8|0,h[v>>3]=p,v)|0)}l=c[10030]|0;if((a[65476]&1)==0){aI(88384,3,1,l|0)}else{p=+h[8169];n=c[7940]|0;m=+R(+(+h[8185]),+(p+(1.0e3- +(((c[1080]|0)+f|0)>>>0>>>0)*.5- +(n|0))/+((c[7941]|0)-n|0)*(+h[8170]-p)));cf(l|0,88536,(v=i,i=i+8|0,h[v>>3]=m,v)|0)}l=c[10030]|0;if((a[68916]&1)==0){aI(88384,3,1,l|0)}else{m=+h[8599];n=c[7938]|0;p=+R(+(+h[8615]),+(m+(+(((c[1082]|0)+b|0)>>>0>>>0)*.5- +(n|0))/+((c[7939]|0)-n|0)*(+h[8600]-m)));cf(l|0,88536,(v=i,i=i+8|0,h[v>>3]=p,v)|0)}l=c[10030]|0;if((a[68228]&1)==0){aI(88384,3,1,l|0)}else{p=+h[8513];n=c[7940]|0;m=+R(+(+h[8529]),+(p+(1.0e3- +(((c[1080]|0)+f|0)>>>0>>>0)*.5- +(n|0))/+((c[7941]|0)-n|0)*(+h[8514]-p)));cf(l|0,88536,(v=i,i=i+8|0,h[v>>3]=m,v)|0)}l=c[10030]|0;aI(88360,2,1,l|0);c[1082]=b;c[1080]=f;i=e;return}}}while(0);if(!(a[4304]|0)){c[1082]=b;c[1080]=f;i=e;return}aI(125976,2,1,c[10030]|0);c[1082]=b;c[1080]=f;i=e;return}function qX(a){a=+a;h[539]=a;return}function qY(){c[58300]=0;c[58302]=0;a[233344]=0;return}function qZ(c){c=c|0;var d=0;if((c|0)==1){a[4384]=a[89896]|0;a[4385|0]=a[89897|0]|0;a[4386|0]=a[89898|0]|0;a[4387|0]=a[89899|0]|0;a[4388|0]=a[89900|0]|0;a[4389|0]=a[89901|0]|0;a[4390|0]=a[89902|0]|0;d=1;return d|0}else if((c|0)==0){b[2192]=119;d=1;return d|0}else if((c|0)==2){b[2192]=101;d=1;return d|0}else{b[2192]=119;d=0;return d|0}return 0}function q_(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;i=i+8|0;e=d|0;do{if((b|0)!=0){if((a[b]|0)==0){break}c[e>>2]=0;f=bk(b|0,148464)|0;g=f+1|0;h=ut(g)|0;if((h|0)==0){j=0;i=d;return j|0}uF(h|0,b|0,f|0);a[h+f|0]=0;if(f>>>0<(uA(b|0)|0)>>>0){f=b+g|0;ca(f|0,21e4,(v=i,i=i+8|0,c[v>>2]=e,v)|0)}f=c[10030]|0;if(a[4304]|0){cf(f|0,90232,(v=i,i=i+8|0,c[v>>2]=h,v)|0);g=c[e>>2]|0;if((g|0)!=0){k=c[10030]|0;cf(k|0,90144,(v=i,i=i+8|0,c[v>>2]=g,v)|0)}g=c[10030]|0;aI(90072,5,1,g|0)}else{cf(f|0,90024,(v=i,i=i+8|0,c[v>>2]=h,v)|0);f=c[e>>2]|0;if((f|0)!=0){g=c[10030]|0;cf(g|0,90008,(v=i,i=i+8|0,c[v>>2]=f,v)|0)}f=c[10030]|0;aI(89968,2,1,f|0)}uu(h);j=1;i=d;return j|0}}while(0);e=c[10030]|0;if(a[4304]|0){aI(90408,13,1,e|0);j=1;i=d;return j|0}else{aI(90384,20,1,e|0);j=1;i=d;return j|0}return 0}function q$(){var b=0;b=i;a[45024]=0;c[58300]=0;c[58302]=0;cf(c[10030]|0,90952,(v=i,i=i+8|0,h[v>>3]=.24089999999999998,v)|0);q9(-1);g[58284]=0.0;i=b;return}function q0(){var b=0,d=0,e=0,f=0;b=i;s7(2,0.0,0.0,0.0,0.0);if((a[233336]&1)!=0){d=c[10030]|0;e=c[58302]|0;f=c[58300]|0;cf(d|0,99e3,(v=i,i=i+24|0,c[v>>2]=e,c[v+8>>2]=f,c[v+16>>2]=100896,v)|0)}a[233336]=0;aI(99040,14,1,c[10030]|0);c[58300]=0;c[58302]=0;a[233344]=0;i=b;return}function q1(){var b=0,d=0,e=0;b=i;if(!(a[35312]|0)){c[(c[3524]|0)+8>>2]=1500;c[(c[3524]|0)+12>>2]=900}d=c[3524]|0;e=~~(+g[38]*+((c[d+12>>2]|0)>>>0>>>0));cf(c[10030]|0,91320,(v=i,i=i+16|0,c[v>>2]=~~(+g[178]*+((c[d+8>>2]|0)>>>0>>>0)),c[v+8>>2]=e,v)|0);if((aY(233408,91216)|0)==0){i=b;return}e=c[58350]|0;cf(c[10030]|0,91112,(v=i,i=i+16|0,c[v>>2]=233408,c[v+8>>2]=e,v)|0);i=b;return}function q2(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;if((a[233336]&1)!=0){f=c[10030]|0;g=c[58302]|0;h=c[58300]|0;cf(f|0,99e3,(v=i,i=i+24|0,c[v>>2]=g,c[v+8>>2]=h,c[v+16>>2]=100896,v)|0)}a[233336]=0;c[58302]=b;c[58300]=d;a[233344]=0;i=e;return}function q3(b,d){b=b|0;d=d|0;var e=0,f=0.0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0,E=0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0;e=i;f=+g[58366];if(f==0.0){j=c[58302]|0;k=c[58300]|0;if(!(a[45024]|0)){s6(j,b,k,d);c[58302]=b;c[58300]=d;i=e;return}if(!(a[233344]|0)){l=c[10030]|0;cf(l|0,100208,(v=i,i=i+16|0,c[v>>2]=j,c[v+8>>2]=k,v)|0)}if(!((j|0)==(b|0)&(k|0)==(d|0))){k=c[10030]|0;cf(k|0,100168,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=d,v)|0)}c[58302]=b;c[58300]=d;a[233344]=1;c[58302]=b;c[58300]=d;i=e;return}k=c[58302]|0;j=c[58300]|0;l=a[233344]|0;if(!l){g[58370]=1.0}m=(k|0)==(b|0);do{if(m&(j|0)==(d|0)){if(l){break}n=c[10030]|0;cf(n|0,100920,(v=i,i=i+24|0,c[v>>2]=b,c[v+8>>2]=d,c[v+16>>2]=100896,v)|0)}else{o=f/.24089999999999998;do{if(m){if((d-j|0)>0){p=o;q=0.0;break}p=-0.0-o;q=0.0}else{r=(+(d|0)- +(j|0))/(+(b|0)- +(k|0));s=+(b-k>>31|1|0)*(o/+Q(+(r*r+1.0)));p=r*s;q=s}}while(0);o=1.0- +g[58370];s=+(k|0)+q*o;r=+(d|0);t=+(b|0);do{if(q*(t-s)<0.0){u=-1.0;w=-1.0}else{x=+(j|0)+p*o;y=s;z=-1.0;A=-1.0;n=0;while(1){if(p*(r-x)<0.0){B=z;C=A;D=n;break}E=n+1|0;F=q+y;if(q*(t-F)<0.0){B=y;C=x;D=E;break}else{A=x;x=p+x;z=y;y=F;n=E}}if((D|0)==1){n=c[10030]|0;y=B;z=C;cf(n|0,91472,(v=i,i=i+24|0,h[v>>3]=y,h[v+8>>3]=z,c[v+16>>2]=100896,v)|0);u=C;w=B;break}if((D|0)<=0){u=C;w=B;break}cf(c[10030]|0,91432,(v=i,i=i+48|0,c[v>>2]=k,c[v+8>>2]=j,h[v+16>>3]=q,h[v+24>>3]=p,c[v+32>>2]=D,c[v+40>>2]=100896,v)|0);u=C;w=B}}while(0);if(q!=0.0){if(w<0.0){n=b-k|0;if(q<0.0){G=-0.0-q}else{G=q}g[58370]=+(((n|0)>-1?n:-n|0)|0)/G+ +g[58370];break}s=t-w;if(s<0.0){H=-0.0-s}else{H=s}if(q<0.0){I=-0.0-q}else{I=q}g[58370]=H/I;break}else{if(u<0.0){n=d-j|0;if(p<0.0){J=-0.0-p}else{J=p}g[58370]=+(((n|0)>-1?n:-n|0)|0)/J+ +g[58370];break}s=r-u;if(s<0.0){K=-0.0-s}else{K=s}if(p<0.0){L=-0.0-p}else{L=p}g[58370]=K/L;break}}}while(0);a[233336]=+g[58370]>0.0&1;a[233344]=1;c[58302]=b;c[58300]=d;i=e;return}function q4(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;f=i;g=1e3-d|0;if(a[4304]|0){d=c[10030]|0;h=c[4344+(c[1094]<<2)>>2]|0;cf(d|0,89728,(v=i,i=i+40|0,c[v>>2]=b,c[v+8>>2]=g,c[v+16>>2]=e,c[v+24>>2]=h,c[v+32>>2]=4384,v)|0);i=f;return}else{j=0;k=0}while(1){h=a[e+k|0]|0;if((h<<24>>24|0)==0){break}else if((h<<24>>24|0)==91|(h<<24>>24|0)==93){l=j+1|0}else{l=j}j=l+1|0;k=k+1|0}k=j+1|0;j=ut(k)|0;do{if((j|0)==0){gk();l=ut(k)|0;if((l|0)!=0){m=l;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=89696,v)|0)}else{m=j}}while(0);j=0;k=0;while(1){l=e+k|0;h=a[l]|0;if((h<<24>>24|0)==0){break}else if((h<<24>>24|0)==91|(h<<24>>24|0)==93){a[m+j|0]=92;n=j+1|0;o=a[l]|0}else{n=j;o=h}a[m+n|0]=o;j=n+1|0;k=k+1|0}a[m+j|0]=0;j=c[4344+(c[1094]<<2)>>2]|0;cf(c[10030]|0,89472,(v=i,i=i+40|0,c[v>>2]=b,c[v+8>>2]=g,c[v+16>>2]=m,c[v+24>>2]=j,c[v+32>>2]=4384,v)|0);uu(m);i=f;return}function q5(){var b=0,d=0,e=0,f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0.0,J=0.0,K=0.0;b=i;i=i+40|0;d=b|0;e=b+24|0;f=b+32|0;a[35312]=0;j=c[13898]|0;L24745:do{if((j|0)<(c[8272]|0)){k=d|0;l=d+8|0;m=j;while(1){n=c[1054]|0;o=(a[n+(m*40&-1)|0]&1)==0;L24749:do{if(!o){p=c[n+(m*40&-1)+36>>2]|0;q=n+(m*40&-1)+32|0;r=c[10036]|0;s=0;while(1){if((s|0)>=(p|0)){break}if((a[r+((c[q>>2]|0)+s|0)|0]|0)==(a[s+103664|0]|0)){s=s+1|0}else{break L24749}}if((s|0)==1){break L24745}}}while(0);q=c[58320]|0;L24756:do{if((q|0)==0){t=233280}else{r=c[n+(m*40&-1)+36>>2]|0;p=c[n+(m*40&-1)+32>>2]|0;u=(r|0)>0;x=c[10036]|0;y=233280;z=q;while(1){L24760:do{if(!o){if(u){A=0;B=0;C=p;while(1){D=a[z+A|0]|0;if(D<<24>>24==(a[x+(A+C|0)|0]|0)){E=C;F=B}else{if(D<<24>>24!=36){break L24760}E=C-1|0;F=1}G=A+1|0;if((G|0)<(F+r|0)){A=G;B=F;C=E}else{break}}if((F|0)==0){H=G}else{t=y;break L24756}}else{H=0}C=a[z+H|0]|0;if((C<<24>>24|0)==36|(C<<24>>24|0)==0){t=y;break L24756}}}while(0);C=y+8|0;B=c[C>>2]|0;if((B|0)==0){t=C;break}else{y=C;z=B}}}}while(0);o=c[t+4>>2]|0;if((o|0)==5){a[35288]=0;c[13898]=m+1}else if((o|0)==2){c[58352]=6516580;c[13898]=m+1}else if((o|0)==4){a[35288]=1;c[13898]=m+1}else if((o|0)==1){c[58352]=7499107;c[13898]=m+1}else if((o|0)==0){a[233408]=a[90944]|0;a[233409|0]=a[90945|0]|0;a[233410|0]=a[90946|0]|0;a[233411|0]=a[90947|0]|0;a[233412|0]=a[90948|0]|0;c[13898]=m+1}else if((o|0)==3){g[e>>2]=5.0;g[f>>2]=3.0;c[13898]=m+1;a[35312]=1;c[8826]=s4(e,f,1)|0;c[(c[3524]|0)+8>>2]=~~(+g[e>>2]*300.0/72.0);c[(c[3524]|0)+12>>2]=~~(+g[f>>2]*300.0/72.0)}else{o=is(d)|0;q=c[o>>2]|0;if((q|0)==3){I=+uz(c[o+8>>2]|0,0)}else if((q|0)==1){I=+(c[o+8>>2]|0)}else if((q|0)==2){I=+h[o+8>>3]}else{break}if((c[k>>2]|0)==3){uu(c[l>>2]|0);c[k>>2]=1}c[58350]=~~I}m=c[13898]|0;if((m|0)>=(c[8272]|0)){break L24745}}uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);c[(c[3524]|0)+16>>2]=((c[58350]|0)*300&-1|0)/72&-1;c[(c[3524]|0)+20>>2]=((c[58350]|0)*300&-1|0)/144&-1;if((aY(233408,91216)|0)==0){uF(13048,90848,1024)}else{d=(a[233410]|0)==116?90800:90792;f=c[58350]|0;be(13048,90816,(v=i,i=i+16|0,c[v>>2]=d,c[v+8>>2]=f,v)|0)}do{if(a[35312]|0){f=(c[8826]|0)==2;d=13048+(uA(13048)|0)|0;e=c[3524]|0;I=+((c[e+8>>2]|0)>>>0>>>0);if(f){J=I*2.54/300.0;K=+((c[e+12>>2]|0)>>>0>>>0)*2.54/300.0;be(d|0,90672,(v=i,i=i+16|0,h[v>>3]=J,h[v+8>>3]=K,v)|0);break}else{K=I/300.0;I=+((c[e+12>>2]|0)>>>0>>>0)/300.0;be(d|0,90632,(v=i,i=i+16|0,h[v>>3]=K,h[v+8>>3]=I,v)|0);break}}}while(0);d=a[35288]|0;e=13048+(uA(13048)|0)|0;if(d){d=e;f=d|0;w=1953460768;a[f]=w&255;w=w>>8;a[f+1|0]=w&255;w=w>>8;a[f+2|0]=w&255;w=w>>8;a[f+3|0]=w&255;f=d+4|0;w=6648929;a[f]=w&255;w=w>>8;a[f+1|0]=w&255;w=w>>8;a[f+2|0]=w&255;w=w>>8;a[f+3|0]=w&255;i=b;return}else{uD(e|0,90568,10);i=b;return}}function q6(a){a=a|0;c[8830]=a;return 1}function q7(a){a=a|0;c[8824]=a;return 1}function q8(){a[45024]=0;c[58300]=0;c[58302]=0;return}function q9(b){b=b|0;var d=0,e=0,f=0,j=0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0;d=i;if((b|0)>5){e=(b|0)%6&-1}else{e=b}if(!(a[45024]|0)){s7(2,0.0,0.0,0.0,0.0)}if((a[233336]&1)!=0){b=c[10030]|0;f=c[58302]|0;j=c[58300]|0;cf(b|0,99e3,(v=i,i=i+24|0,c[v>>2]=f,c[v+8>>2]=j,c[v+16>>2]=100896,v)|0)}a[233336]=0;j=(e|0)>-1;if(j){k=+g[233352+(e<<3)>>2]}else{k=.4000000059604645}do{if(k!=+g[58284]){f=c[10030]|0;l=k*-.5;m=k;cf(f|0,91544,(v=i,i=i+24|0,h[v>>3]=l,h[v+8>>3]=m,h[v+16>>3]=m,v)|0);if(!(a[45024]|0)){n=m;break}f=c[10030]|0;cf(f|0,91496,(v=i,i=i+8|0,h[v>>3]=m,v)|0);n=m}else{n=k}}while(0);g[58284]=k;g[58368]=n/.24089999999999998;if(!j){o=0.0;g[58366]=o;a[233344]=0;i=d;return}o=+g[233356+(e<<3)>>2];g[58366]=o;a[233344]=0;i=d;return}function ra(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0;f=i;g=a[e]|0;if(g<<24>>24==0){i=f;return}if(a[35288]|0){h=0}else{j=0;k=g;while(1){g=j+1|0;if(k<<24>>24==92){l=j+2|0;m=(a[e+g|0]|0)==92}else{l=g;m=0}g=a[e+l|0]|0;if(g<<24>>24==0|m){h=m;break}else{j=l;k=g}}}cf(c[10030]|0,99752,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=d,v)|0);d=c[8830]|0;if(a[35288]&(d|0)!=0){b=c[10030]|0;cf(b|0,91600,(v=i,i=i+8|0,c[v>>2]=d,v)|0)}d=a[e]|0;do{if((d<<24>>24|0)==123|(d<<24>>24|0)==91){b=c[10030]|0;cf(b|0,99720,(v=i,i=i+8|0,c[v>>2]=e,v)|0)}else{b=c[10030]|0;k=c[233184+(c[8824]<<2)>>2]|0;if(h){cf(b|0,99536,(v=i,i=i+16|0,c[v>>2]=k,c[v+8>>2]=e,v)|0);break}else{cf(b|0,99696,(v=i,i=i+16|0,c[v>>2]=k,c[v+8>>2]=e,v)|0);break}}}while(0);if(!(a[35288]&(c[8830]|0)!=0)){i=f;return}aF(125,c[10030]|0);i=f;return}function rb(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;if((a[233336]&1)!=0){g=c[10030]|0;h=c[58302]|0;j=c[58300]|0;cf(g|0,99e3,(v=i,i=i+24|0,c[v>>2]=h,c[v+8>>2]=j,c[v+16>>2]=100896,v)|0)}a[233336]=0;c[58302]=b;c[58300]=d;a[233344]=0;if((e|0)<0){k=92632}else{k=c[233216+(((e|0)%15&-1)<<2)>>2]|0}cf(c[10030]|0,99e3,(v=i,i=i+24|0,c[v>>2]=b,c[v+8>>2]=d,c[v+16>>2]=k,v)|0);i=f;return}function rc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;s5(a,b,d,e,1,f);c[58302]=d;c[58300]=e;return}function rd(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0;g=i;j=a&15;do{if((j|0)==1){if((a>>4|0)>=50){break}i=g;return}else if((j|0)==0){i=g;return}else if((j|0)==2){if((a&16|0)!=0){break}i=g;return}}while(0);cf(c[10030]|0,92704,(v=i,i=i+32|0,c[v>>2]=b,c[v+8>>2]=d,h[v+16>>3]=+(e>>>0>>>0)*.24089999999999998,h[v+24>>3]=+(f>>>0>>>0)*.24089999999999998,v)|0);i=g;return}function re(){var b=0;b=i;a[45024]=1;c[58300]=0;c[58302]=0;cf(c[10030]|0,92776,(v=i,i=i+8|0,h[v>>3]=.24089999999999998,v)|0);q9(-1);i=b;return}function rf(){aI(99040,14,1,c[10030]|0);return}function rg(){var b=0,d=0,e=0;b=i;d=c[c[7118]>>2]|0;do{if((d|0)==1){e=c[10030]|0;aI(93200,35,1,e|0)}else if((d|0)==0){aI(93096,39,1,c[10030]|0)}else if((d|0)==2){pD();e=c[10030]|0;if((e|0)==0){break}cf(e|0,93272,(v=i,i=i+8|0,c[v>>2]=c[7112],v)|0);if((a[(c[7118]|0)+113|0]&1)==0){break}aI(93240,15,1,c[10030]|0)}}while(0);d=c[7112]|0;if((d|0)!=0){uu(d);c[7112]=0}d=c[10028]|0;if((d|0)==0|(d|0)==(c[10030]|0)){i=b;return}az(d|0);c[10028]=0;i=b;return}function rh(b){b=b|0;var d=0,e=0,f=0,g=0,j=0;d=i;i=i+16|0;e=d|0;f=e;c[f>>2]=c[59458];c[f+4>>2]=c[59459];c[f+8>>2]=c[59460];c[f+12>>2]=c[59461];c[e+4>>2]=b;f=c[7118]|0;do{if((c[f>>2]|0)==2){if((a[f+112|0]&1)==0){g=18637;break}j=(b|0)%4&-1}else{g=18637}}while(0);if((g|0)==18637){j=(b|0)%9&-1}b=j+3|0;j=(b|0)<0?0:b;if((c[57432]|0)==(j|0)){rj(e);i=d;return}a[228944]=0;if((c[7116]|0)!=0){b=c[10028]|0;aI(215952,7,1,b|0);c[7116]=0;a[228944]=0}c[57432]=j;h[28714]=+h[28715];cf(c[10028]|0,202624,(v=i,i=i+8|0,c[v>>2]=a[j+93672|0]|0,v)|0);c[7116]=0;rj(e);i=d;return}function ri(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;g=c[10030]|0;if((g|0)==0){i=f;return}if(a[5688]|0){h=g}else{aK(5624,g|0);a[5688]=1;h=c[10030]|0}cf(h|0,93440,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=d,v)|0);d=c[7230]|0;if((d|0)!=0){b=c[10030]|0;cf(b|0,93424,(v=i,i=i+8|0,c[v>>2]=d,v)|0)}d=a[e]|0;do{if((d<<24>>24|0)==123|(d<<24>>24|0)==91){b=c[10030]|0;cf(b|0,94528,(v=i,i=i+8|0,c[v>>2]=e,v)|0)}else{b=c[7198]|0;if((b|0)==2){h=c[10030]|0;cf(h|0,94296,(v=i,i=i+8|0,c[v>>2]=e,v)|0);break}else if((b|0)==0){cf(c[10030]|0,94496,(v=i,i=i+8|0,c[v>>2]=e,v)|0);break}else if((b|0)==1){cf(c[10030]|0,94392,(v=i,i=i+8|0,c[v>>2]=e,v)|0);break}else{break}}}while(0);if((c[7230]|0)!=0){e=c[10030]|0;aF(125,e|0)}aI(94160,3,1,c[10030]|0);i=f;return}function rj(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0,s=0,t=0,u=0.0;d=i;i=i+24|0;e=d|0;f=b;if((uG(5608,f|0,16)|0)==0){i=d;return}c[1402]=c[f>>2];c[1403]=c[f+4>>2];c[1404]=c[f+8>>2];c[1405]=c[f+12>>2];f=b|0;do{if((c[f>>2]|0)==1){g=c[7118]|0;if((a[g+17|0]&1)!=0){j=18673;break}k=c[b+4>>2]|0;do{if((c[g>>2]|0)==2){if((a[g+112|0]&1)==0){j=18668;break}l=(k|0)%4&-1}else{j=18668}}while(0);if((j|0)==18668){l=(k|0)%9&-1}g=l+3|0;m=(g|0)<0?0:g;if((c[57432]|0)==(m|0)){break}a[228944]=0;if((c[7116]|0)!=0){g=c[10028]|0;aI(215952,7,1,g|0);c[7116]=0;a[228944]=0}c[57432]=m;h[28714]=+h[28715];g=c[10028]|0;n=a[m+93672|0]|0;cf(g|0,202624,(v=i,i=i+8|0,c[v>>2]=n,v)|0);c[7116]=0}else{j=18673}}while(0);if((j|0)==18673){pS(b)}a[5688]=0;j=c[f>>2]|0;if((j|0)==3){l=c[b+4>>2]|0;o=+(l>>>16&255|0)/255.0;p=+(l>>>8&255|0)/255.0;q=+(l&255|0)/255.0;be(5624,93720,(v=i,i=i+24|0,h[v>>3]=o,h[v+8>>3]=p,h[v+16>>3]=q,v)|0);r=c[f>>2]|0}else{r=j}if((r|0)==1){j=c[b+4>>2]|0;if((a[(c[7118]|0)+112|0]&1)==0){s=(j|0)%9&-1}else{s=(j|0)%4&-1}j=a[93672+(s+3|0)|0]|0;be(5624,93688,(v=i,i=i+8|0,c[v>>2]=j,v)|0);t=c[f>>2]|0}else{t=r}if((t|0)!=5){i=d;return}q=+h[b+8>>3];if((a[(c[7118]|0)+18|0]&1)==0){fq(q,e);p=+h[e>>3];o=+h[e+8>>3];u=+h[e+16>>3];be(5624,93720,(v=i,i=i+24|0,h[v>>3]=p,h[v+8>>3]=o,h[v+16>>3]=u,v)|0);i=d;return}if(q<=0.0){be(5624,93592,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);i=d;return}if(q<1.0){u=+(~~(q*1.0e4+.5)|0)*1.0e-4;be(25336,141840,(v=i,i=i+8|0,h[v>>3]=u,v)|0);e=(a[25336]|0)==48&(a[25337]|0)==46?25337:25336;be(5624,93464,(v=i,i=i+8|0,c[v>>2]=e,v)|0);i=d;return}else{be(5624,93528,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);i=d;return}}function rk(b){b=b|0;var d=0,e=0;d=i;do{if((b|0)==0){c[10882]=0}else if((b|0)==2){e=c[10882]|0;if((e|0)==2){break}else if((e|0)==1){aI(94096,7,1,c[10030]|0)}c[10882]=2;aI(93984,35,1,c[10030]|0);a[5688]=0}else if((b|0)==12){e=c[10028]|0;if((e|0)==0|(e|0)==(c[10030]|0)){break}cf(e|0,93800,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((b|0)==1){e=c[10882]|0;if((e|0)==1){break}else if((e|0)==2){aI(94096,7,1,c[10030]|0)}c[10882]=1;aI(94024,34,1,c[10030]|0);a[5688]=0}else if((b|0)==5){if(((c[10882]|0)-1|0)>>>0<2){e=c[10030]|0;aI(94096,7,1,e|0)}c[10882]=0}else if((b|0)==13){e=c[10028]|0;if((e|0)==0|(e|0)==(c[10030]|0)){break}cf(e|0,93784,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);i=d;return}function rl(){var b=0,d=0,e=0.0,f=0,j=0.0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;b=i;c[7116]=0;aI(199208,29,1,c[10028]|0);d=c[10028]|0;if((d|0)==(c[10030]|0)){aI(94992,6,1,d|0)}d=c[7118]|0;e=+g[d+88>>2];do{if(e!=0.0){if((c[d>>2]|0)!=1){break}f=c[10030]|0;j=e;cf(f|0,94888,(v=i,i=i+8|0,h[v>>3]=j,v)|0)}}while(0);d=c[7036]|0;if((d|0)==0){i=b;return}else{k=d}do{d=c[k+4>>2]|0;cf(c[10030]|0,94840,(v=i,i=i+16|0,c[v>>2]=c[k>>2],c[v+8>>2]=d,v)|0);d=c[7118]|0;do{if((a[d+97|0]&1)==0){l=d}else{f=c[k+8>>2]|0;if((f|0)==0){l=d;break}m=c[10030]|0;n=360-f|0;cf(m|0,94696,(v=i,i=i+8|0,c[v>>2]=n,v)|0);l=c[7118]|0}}while(0);d=(c[l>>2]|0)==1;do{if(d){n=c[k+16>>2]|0;m=a[n]|0;if(!((m<<24>>24|0)==123|(m<<24>>24|0)==91)){o=18724;break}m=c[10030]|0;cf(m|0,94528,(v=i,i=i+8|0,c[v>>2]=n,v)|0)}else{o=18724}}while(0);do{if((o|0)==18724){o=0;n=c[k+12>>2]|0;if((n|0)==0){m=c[10030]|0;f=d?94496:94424;p=c[k+16>>2]|0;cf(m|0,f|0,(v=i,i=i+8|0,c[v>>2]=p,v)|0);break}else if((n|0)==2){cf(c[10030]|0,(d?94296:94272)|0,(v=i,i=i+8|0,c[v>>2]=c[k+16>>2],v)|0);break}else if((n|0)==1){cf(c[10030]|0,(d?94392:94328)|0,(v=i,i=i+8|0,c[v>>2]=c[k+16>>2],v)|0);break}else{break}}}while(0);do{if((a[(c[7118]|0)+97|0]&1)!=0){if((c[k+8>>2]|0)==0){break}d=c[10030]|0;aI(94208,50,1,d|0)}}while(0);aI(94160,3,1,c[10030]|0);k=c[k+20>>2]|0;}while((k|0)!=0);k=c[7036]|0;if((k|0)==0){i=b;return}else{q=k}while(1){k=c[q+20>>2]|0;uu(c[q+16>>2]|0);uu(c[7036]|0);c[7036]=k;if((k|0)==0){break}else{q=k}}i=b;return}function rm(){var b=0;b=i;c[59762]=0;c[59764]=0;c[59760]=0;c[59828]=0;a[239320]=0;c[11600]=0;cf(c[10030]|0,95608,(v=i,i=i+8|0,h[v>>3]=.12,v)|0);i=b;return}function rn(){var b=0;if(a[239320]|0){b=c[10030]|0;aF(10,b|0);a[239320]=0}c[59762]=0;c[59764]=0;return}function ro(){var b=0;if(a[239320]|0){b=c[10030]|0;aF(10,b|0);a[239320]=0}aI(99040,14,1,c[10030]|0);return}function rp(){var b=0,d=0,e=0.0,f=0.0,j=0,k=0.0;b=i;d=c[3524]|0;e=+((c[d+8>>2]|0)>>>0>>>0);f=+((c[d+12>>2]|0)>>>0>>>0);j=~~(f*+g[38]);k=+g[184];cf(c[10030]|0,95784,(v=i,i=i+32|0,c[v>>2]=~~(e*+g[178]),c[v+8>>2]=j,c[v+16>>2]=~~(e*k),c[v+24>>2]=~~(f*k),v)|0);if(a[46352]|0){k=+((c[d+16>>2]|0)>>>0>>>0)*.12+.5;d=c[10030]|0;j=~~k;f=k*1.2;cf(d|0,95712,(v=i,i=i+16|0,c[v>>2]=j,h[v+8>>3]=f,v)|0);i=b;return}else{j=c[10030]|0;aI(95688,14,1,j|0);i=b;return}}function rq(b,d){b=b|0;d=d|0;var e=0;if(a[239320]|0){e=c[10030]|0;aF(10,e|0);a[239320]=0}c[59764]=b;c[59762]=d;return}function rr(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;do{if(a[239320]|0){f=c[59828]|0;c[59828]=f+1;if((f|0)<=49){break}f=c[10030]|0;g=c[239216+(c[11584]<<5)+((c[59760]|0)+2<<2)>>2]|0;h=c[59764]|0;j=c[59762]|0;cf(f|0,96248,(v=i,i=i+24|0,c[v>>2]=g,c[v+8>>2]=h,c[v+16>>2]=j,v)|0);c[59828]=1}else{a[239320]=1;j=c[10030]|0;h=c[239216+(c[11584]<<5)+((c[59760]|0)+2<<2)>>2]|0;g=c[59764]|0;f=c[59762]|0;cf(j|0,96272,(v=i,i=i+24|0,c[v>>2]=h,c[v+8>>2]=g,c[v+16>>2]=f,v)|0);c[59828]=1}}while(0);cf(c[10030]|0,96200,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=d,v)|0);c[59764]=b;c[59762]=d;i=e;return}function rs(b){b=b|0;var d=0,e=0;if(a[239320]|0){d=c[10030]|0;aF(10,d|0);a[239320]=0}c[59760]=(b|0)%((c[46304+(c[11584]<<2)>>2]|0)-2|0)&-1;if(!(a[46392]|0)){return}c[11600]=b;if((b|0)<0){e=0}else{e=((b|0)%6&-1)+1|0}c[11600]=e;aK(c[46360+(e<<2)>>2]|0,c[10030]|0);return}function rt(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;if((a[e]|0)==0){i=f;return}g=c[c[3524]>>2]|0;h=ut(24)|0;do{if((h|0)==0){gk();j=ut(24)|0;if((j|0)!=0|(g|0)==0){k=j;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=g,v)|0)}else{k=h}}while(0);h=k;c[k>>2]=b;c[k+4>>2]=d;d=(uA(e|0)|0)+1|0;b=c[c[3524]>>2]|0;g=ut(d)|0;do{if((g|0)==0){gk();j=ut(d)|0;if((j|0)!=0|(b|0)==0){l=j;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=b,v)|0)}else{l=g}}while(0);c[k+16>>2]=l;uB(l|0,e|0);c[k+12>>2]=c[7198];c[k+8>>2]=c[7230];c[k+20>>2]=c[7036];c[7036]=h;i=f;return}function ru(){var b=0,e=0,f=0,j=0,k=0.0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0.0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0.0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0.0,U=0.0,V=0.0,W=0;b=i;i=i+24|0;e=b|0;a[46288]=0;a[46392]=0;c[11584]=0;c[11574]=0;f=c[13898]|0;j=c[8272]|0;L25079:do{if((f|0)<(j|0)){k=0.0;l=1;m=f;n=j;L25080:while(1){o=c[1054]|0;p=(a[o+(m*40&-1)|0]&1)==0;q=c[o+(m*40&-1)+36>>2]|0;r=o+(m*40&-1)+32|0;L25082:do{if(p){s=c[r>>2]|0;t=18835}else{o=c[10036]|0;u=0;while(1){if((u|0)>=(q|0)){t=18785;break}if((a[o+((c[r>>2]|0)+u|0)|0]|0)==(a[u+103664|0]|0)){u=u+1|0}else{break}}if((t|0)==18785){t=0;if((u|0)==1){w=k;x=l;break L25079}}o=c[r>>2]|0;if(!((q|0)>0&(p^1))){s=o;t=18835;break}y=c[10036]|0;z=0;A=0;B=o;while(1){if((a[z+184456|0]|0)==(a[y+(z+B|0)|0]|0)){C=B;D=A}else{if((z|0)!=3){break}C=B-1|0;D=1}E=z+1|0;if((E|0)<(D+q|0)){z=E;A=D;B=C}else{t=18792;break}}do{if((t|0)==18792){t=0;if((D|0)==0){if(!((z|0)==2|(z|0)==7)){break}}a[46352]=0;a[46392]=0;a[46288]=0;c[11584]=0;c[11574]=0;c[(c[3524]|0)+8>>2]=3e3;c[(c[3524]|0)+12>>2]=1800;a[239208]=0;c[13898]=(c[13898]|0)+1;F=1;G=k;break L25082}}while(0);if(p){s=o;t=18835;break}L25105:do{if((q|0)>0){z=c[10036]|0;B=0;A=0;y=o;while(1){if((a[B+115600|0]|0)==(a[z+(B+y|0)|0]|0)){H=y;I=A}else{if((B|0)!=1){t=18804;break L25105}H=y-1|0;I=1}u=B+1|0;if((u|0)<(I+q|0)){B=u;A=I;y=H}else{break}}if((I|0)!=0){break}if(!((B|0)==0|(B|0)==5)){t=18804}}else{t=18804}}while(0);do{if((t|0)==18804){t=0;if(!((q|0)>0&(p^1))){s=o;t=18835;break L25082}y=c[10036]|0;A=0;z=0;u=o;while(1){if((a[A+115536|0]|0)==(a[y+(A+u|0)|0]|0)){J=u;K=z}else{if((A|0)!=1){break}J=u-1|0;K=1}E=A+1|0;if((E|0)<(K+q|0)){A=E;z=K;u=J}else{t=18810;break}}if((t|0)==18810){t=0;if((K|0)!=0){break}if((A|0)==0|(A|0)==6){break}}if(p){s=o;t=18835;break L25082}L25129:do{if((q|0)>0){u=c[10036]|0;z=0;y=0;B=o;while(1){if((a[z+95544|0]|0)==(a[u+(z+B|0)|0]|0)){L=B;M=y}else{if((z|0)!=1){break L25129}L=B-1|0;M=1}E=z+1|0;if((E|0)<(M+q|0)){z=E;y=M;B=L}else{break}}if((M|0)==0){if(!((z|0)==0|(z|0)==6)){break}}a[46288]=1;c[13898]=m+1;F=l;G=k;break L25082}}while(0);if(!((q|0)>0&(p^1))){s=o;t=18835;break L25082}A=c[10036]|0;B=0;y=0;u=o;while(1){if((a[B+129104|0]|0)==(a[A+(B+u|0)|0]|0)){N=u;O=y}else{if((B|0)!=2){s=o;t=18835;break L25082}N=u-1|0;O=1}E=B+1|0;if((E|0)<(O+q|0)){B=E;y=O;u=N}else{break}}if((O|0)==0){if(!((B|0)==1|(B|0)==6)){s=o;t=18835;break L25082}}if(!(a[46392]|0)){c[11584]=1}c[13898]=m+1;F=l;G=k;break L25082}}while(0);a[46392]=1;c[11584]=2;c[13898]=m+1;F=l;G=k}}while(0);L25157:do{if((t|0)==18835){t=0;L25159:do{if((n|0)>(m|0)){if(p){break}r=c[10036]|0;o=0;while(1){if((o|0)>=(q|0)){break}if((a[r+(s+o|0)|0]|0)==(a[o+130496|0]|0)){o=o+1|0}else{t=18842;break L25159}}if((o|0)!=4){t=18842;break}c[13898]=m+1;r=s4(46280,46272,1)|0;c[(c[3524]|0)+8>>2]=~~(+g[11570]/.12);c[(c[3524]|0)+12>>2]=~~(+g[11568]/.12);a[239208]=1;F=r;G=k;break L25157}else{t=18842}}while(0);L25167:do{if((t|0)==18842){t=0;if(!((q|0)>0&(p^1))){break}r=c[10036]|0;B=0;u=0;y=s;while(1){if((a[B+95520|0]|0)==(a[r+(B+y|0)|0]|0)){P=y;Q=u}else{if((B|0)!=1){break}P=y-1|0;Q=1}A=B+1|0;if((A|0)<(Q+q|0)){B=A;u=Q;y=P}else{t=18848;break}}do{if((t|0)==18848){t=0;if((Q|0)==0){if(!((B|0)==0|(B|0)==5)){break}}c[11574]=1;c[13898]=m+1;F=l;G=k;break L25157}}while(0);if(!((q|0)>0&(p^1))){break}B=c[10036]|0;y=0;u=0;r=s;while(1){if((a[y+95512|0]|0)==(a[B+(y+r|0)|0]|0)){R=r;S=u}else{if((y|0)!=1){break L25167}R=r-1|0;S=1}o=y+1|0;if((o|0)<(S+q|0)){y=o;u=S;r=R}else{break}}if((S|0)==0){if(!((y|0)==0|(y|0)==4)){break}}c[11574]=2;c[13898]=m+1;F=l;G=k;break L25157}}while(0);if(((d[(c[10036]|0)+s|0]|0)-48|0)>>>0>=10){t=18869;break L25080}r=is(e)|0;u=c[r>>2]|0;if((u|0)==3){T=+uz(c[r+8>>2]|0,0)}else if((u|0)==1){T=+(c[r+8>>2]|0)}else if((u|0)==2){T=+h[r+8>>3]}else{t=18865;break L25080}U=T;if(U<1.0|U>100.0){t=18867;break L25080}a[46352]=1;V=U/.12;c[(c[3524]|0)+16>>2]=~~V;c[(c[3524]|0)+20>>2]=~~(V*.5);F=l;G=U}}while(0);q=c[13898]|0;p=c[8272]|0;if((q|0)<(p|0)){k=G;l=F;m=q;n=p}else{w=G;x=F;break L25079}}if((t|0)==18869){uf(m,95448,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==18865){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((t|0)==18867){uf(c[13898]|0,95472,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}else{w=0.0;x=1}}while(0);t=(c[11584]|0)==1?95248:179864;F=a[46288]|0?95224:179864;e=c[11574]|0;if((e|0)==1){W=95216}else{W=(e|0)==2?95152:179864}be(13048,95392,(v=i,i=i+32|0,c[v>>2]=a[46392]|0?95304:179864,c[v+8>>2]=t,c[v+16>>2]=F,c[v+24>>2]=W,v)|0);if(a[46352]|0){W=13048+(uA(13048)|0)|0;F=~~w;be(W|0,95144,(v=i,i=i+8|0,c[v>>2]=F,v)|0)}if(!(a[239208]|0)){i=b;return}F=13048+(uA(13048)|0)|0;W=c[3524]|0;w=+((c[W+8>>2]|0)>>>0>>>0);if((x|0)==2){G=w*2.54/600.0;T=+((c[W+12>>2]|0)>>>0>>>0)*2.54/600.0;be(F|0,95024,(v=i,i=i+16|0,h[v>>3]=G,h[v+8>>3]=T,v)|0);i=b;return}else{T=w/600.0;w=+((c[W+12>>2]|0)>>>0>>>0)/600.0;be(F|0,95e3,(v=i,i=i+16|0,h[v>>3]=T,h[v+8>>3]=w,v)|0);i=b;return}}function rv(a){a=a|0;c[11586]=a;return 1}function rw(a){a=a|0;c[1044]=a;return 1}function rx(a){a=a|0;c[11602]=(a|0)!=0&1;return 1}function ry(a){a=a|0;c[1050]=(a|0)!=0&1;return 1}function rz(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;b=c[13898]|0;if((b|0)>=(c[8272]|0)){return}d=c[1054]|0;e=(a[d+(b*40&-1)|0]&1)==0;if(e){return}f=c[d+(b*40&-1)+36>>2]|0;g=d+(b*40&-1)+32|0;d=c[10036]|0;h=0;while(1){if((h|0)>=(f|0)){i=18891;break}if((a[d+((c[g>>2]|0)+h|0)|0]|0)==(a[h+103664|0]|0)){h=h+1|0}else{break}}do{if((i|0)==18891){if((h|0)!=1){break}return}}while(0);h=c[g>>2]|0;if(!((f|0)>0&(e^1))){return}g=c[10036]|0;d=0;j=0;k=h;while(1){if((a[d+101280|0]|0)==(a[g+(d+k|0)|0]|0)){l=k;m=j}else{if((d|0)!=2){break}l=k-1|0;m=1}n=d+1|0;if((n|0)<(m+f|0)){d=n;j=m;k=l}else{i=18898;break}}do{if((i|0)==18898){if((m|0)==0){if(!((d|0)==1|(d|0)==10)){break}}a[231056]=1;c[13898]=b+1;return}}while(0);if(!((f|0)>0&(e^1))){return}e=c[10036]|0;d=0;m=0;l=h;while(1){if((a[d+101232|0]|0)==(a[e+(d+l|0)|0]|0)){o=l;p=m}else{if((d|0)!=1){i=18918;break}o=l-1|0;p=1}h=d+1|0;if((h|0)<(p+f|0)){d=h;m=p;l=o}else{break}}if((i|0)==18918){return}do{if((p|0)==0){if((d|0)==0|(d|0)==4){break}return}}while(0);a[231048]=1;c[13898]=b+1;return}function rA(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;if(a[239320]|0){g=c[10030]|0;aF(10,g|0);a[239320]=0}cf(c[10030]|0,99752,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=d,v)|0);d=a[e]|0;if((d<<24>>24|0)==123|(d<<24>>24|0)==91){d=c[10030]|0;cf(d|0,99720,(v=i,i=i+8|0,c[v>>2]=e,v)|0);i=f;return}d=c[11602]|0;if((d|0)==0){b=c[11586]|0;if((b|0)==0){g=c[10030]|0;aI(97304,18,1,g|0)}else if((b|0)==2){aI(97152,18,1,c[10030]|0)}else if((b|0)==1){aI(97240,15,1,c[10030]|0)}b=c[10030]|0;cf(b|0,97128,(v=i,i=i+8|0,c[v>>2]=e,v)|0);i=f;return}else if((d|0)==1){d=c[11586]|0;if(a[46288]|0){if((d|0)==1){b=c[10030]|0;aI(97024,43,1,b|0)}else if((d|0)==0){aI(97080,44,1,c[10030]|0)}else if((d|0)==2){aI(96952,44,1,c[10030]|0)}b=c[10030]|0;cf(b|0,96920,(v=i,i=i+8|0,c[v>>2]=e,v)|0);i=f;return}if((d|0)==1){b=c[10030]|0;aI(96824,30,1,b|0)}else if((d|0)==0){aI(96856,31,1,c[10030]|0)}else if((d|0)==2){aI(96720,31,1,c[10030]|0)}d=(uA(e|0)|0)-1|0;if((d|0)>0){b=0;do{cf(c[10030]|0,96672,(v=i,i=i+8|0,c[v>>2]=a[e+b|0]|0,v)|0);b=b+1|0;}while((b|0)<(d|0))}aF(a[e+d|0]|0|0,c[10030]|0);aI(96616,4,1,c[10030]|0);i=f;return}else{i=f;return}}function rB(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;if(a[239320]|0){g=c[10030]|0;aF(10,g|0);a[239320]=0}c[59764]=b;c[59762]=d;if((e|0)<0){h=100128}else{g=c[11574]|0;h=c[239064+(g*48&-1)+(((e|0)%(c[46320+(g<<2)>>2]|0)&-1)<<2)>>2]|0}cf(c[10030]|0,99e3,(v=i,i=i+24|0,c[v>>2]=b,c[v+8>>2]=d,c[v+16>>2]=h,v)|0);i=f;return}function rC(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;s5(a,b,d,e,2,f);c[59764]=d;c[59762]=e;return}function rD(){var b=0,d=0,e=0,f=0,g=0.0;b=i;a[3280]=1;a[3648]=1;c[814]=0;c[816]=0;ts();c[916]=-1;d=a[3648]|0?39:-2;e=c[818]|0;f=c[914]|0;g=+h[523];cf(c[10030]|0,225816,(v=i,i=i+48|0,c[v>>2]=a[3280]|0?30:0,c[v+8>>2]=d,c[v+16>>2]=e,c[v+24>>2]=f,h[v+32>>3]=g,h[v+40>>3]=.001,v)|0);i=b;return}function rE(){ts();c[814]=0;c[816]=0;return}function rF(){ts();aI(99040,14,1,c[10030]|0);return}function rG(){var a=0,b=0,d=0,e=0,f=0;a=i;b=c[3524]|0;d=b+8|0;e=c[d>>2]|0;f=b+12|0;b=c[f>>2]|0;cf(c[10030]|0,226256,(v=i,i=i+48|0,c[v>>2]=179864,c[v+8>>2]=e,c[v+16>>2]=b,c[v+24>>2]=0,c[v+32>>2]=0,c[v+40>>2]=179864,v)|0);b=(c[d>>2]|0)-876|0;e=c[f>>2]|0;cf(c[10030]|0,226256,(v=i,i=i+48|0,c[v>>2]=99408,c[v+8>>2]=b,c[v+16>>2]=e,c[v+24>>2]=876,c[v+32>>2]=0,c[v+40>>2]=99360,v)|0);e=(c[d>>2]|0)-215|0;b=c[f>>2]|0;cf(c[10030]|0,226256,(v=i,i=i+48|0,c[v>>2]=99408,c[v+8>>2]=e,c[v+16>>2]=b,c[v+24>>2]=0,c[v+32>>2]=0,c[v+40>>2]=99336,v)|0);b=(c[d>>2]|0)-1091|0;e=c[f>>2]|0;cf(c[10030]|0,226256,(v=i,i=i+48|0,c[v>>2]=99408,c[v+8>>2]=b,c[v+16>>2]=e,c[v+24>>2]=876,c[v+32>>2]=0,c[v+40>>2]=99288,v)|0);e=c[d>>2]|0;b=(c[f>>2]|0)-379|0;cf(c[10030]|0,226256,(v=i,i=i+48|0,c[v>>2]=99408,c[v+8>>2]=e,c[v+16>>2]=b,c[v+24>>2]=0,c[v+32>>2]=0,c[v+40>>2]=99272,v)|0);b=c[d>>2]|0;e=(c[f>>2]|0)-533|0;cf(c[10030]|0,226256,(v=i,i=i+48|0,c[v>>2]=99408,c[v+8>>2]=b,c[v+16>>2]=e,c[v+24>>2]=0,c[v+32>>2]=533,c[v+40>>2]=99176,v)|0);e=c[d>>2]|0;d=(c[f>>2]|0)-912|0;cf(c[10030]|0,226256,(v=i,i=i+48|0,c[v>>2]=99408,c[v+8>>2]=e,c[v+16>>2]=d,c[v+24>>2]=0,c[v+32>>2]=533,c[v+40>>2]=99120,v)|0);aI(99064,15,1,c[10030]|0);i=a;return}function rH(a,b){a=a|0;b=b|0;ts();c[816]=a;c[814]=b;return}function rI(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;do{if(a[4192]|0){f=c[918]|0;if((f|0)<=99){g=f;break}ts();a[4192]=1;f=c[3680+(((c[916]|0)+2|0)*12&-1)>>2]|0;if((f|0)==2){h=(c[914]|0)*3&-1}else if((f|0)==3){h=(c[914]|0)*5&-1}else if((f|0)==1){h=c[914]|0}else{h=1}f=c[10030]|0;cf(f|0,99928,(v=i,i=i+8|0,c[v>>2]=h,v)|0);f=c[814]|0;c[8030]=c[816];c[8031]=f;c[918]=1;g=1}else{a[4192]=1;f=c[3680+(((c[916]|0)+2|0)*12&-1)>>2]|0;if((f|0)==1){j=c[914]|0}else if((f|0)==3){j=(c[914]|0)*5&-1}else if((f|0)==2){j=(c[914]|0)*3&-1}else{j=1}f=c[10030]|0;cf(f|0,99928,(v=i,i=i+8|0,c[v>>2]=j,v)|0);f=c[814]|0;c[8030]=c[816];c[8031]=f;c[918]=1;g=1}}while(0);c[32120+(g<<3)>>2]=b;c[32124+(g<<3)>>2]=d;c[918]=g+1;c[816]=b;c[814]=d;i=e;return}function rJ(b){b=b|0;var d=0,e=0;ts();d=(b|0)<-2?-2:b;b=a[3648]|0?39:-2;if((d|0)<(b|0)){e=d;c[916]=e;return}e=(d|0)%(b|0)&-1;c[916]=e;return}function rK(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;ts();cf(c[10030]|0,99752,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=d,v)|0);d=a[e]|0;if((d<<24>>24|0)==123|(d<<24>>24|0)==91){d=c[10030]|0;cf(d|0,99720,(v=i,i=i+8|0,c[v>>2]=e,v)|0);i=f;return}d=c[1050]|0;if((d|0)==1){b=c[1044]|0;if((b|0)==0){g=99688}else if((b|0)==2){g=99616}else if((b|0)==1){g=104096}else{g=0}b=c[10030]|0;cf(b|0,99536,(v=i,i=i+16|0,c[v>>2]=g,c[v+8>>2]=e,v)|0);i=f;return}else if((d|0)==0){d=c[1044]|0;if((d|0)==0){h=104096}else if((d|0)==1){h=179864}else if((d|0)==2){h=104088}else{h=0}cf(c[10030]|0,99696,(v=i,i=i+16|0,c[v>>2]=h,c[v+8>>2]=e,v)|0);i=f;return}else{i=f;return}}function rL(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0;e=i;ts();c[816]=a;c[814]=b;cf(c[10030]|0,100152,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=b,v)|0);if((d|0)<0){b=c[10030]|0;aI(100128,17,1,b|0);f=c[10030]|0;g=aI(100056,4,1,f|0)|0;i=e;return}b=(d|0)%30&-1;d=c[3288+(b*12&-1)>>2]|0;if((d|0)==3){a=c[914]|0;j=c[10030]|0;cf(j|0,99928,(v=i,i=i+8|0,c[v>>2]=a,v)|0);a=c[10030]|0;cf(a|0,99984,(v=i,i=i+8|0,h[v>>3]=1.0,v)|0)}else if((d|0)==2){cf(c[10030]|0,99928,(v=i,i=i+8|0,c[v>>2]=c[914],v)|0);cf(c[10030]|0,99984,(v=i,i=i+8|0,h[v>>3]=.5,v)|0)}else if((d|0)==1){cf(c[10030]|0,99928,(v=i,i=i+8|0,c[v>>2]=c[914],v)|0);cf(c[10030]|0,99984,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0)}else if((d|0)==0){cf(c[10030]|0,99928,(v=i,i=i+8|0,c[v>>2]=(c[914]|0)*3&-1,v)|0)}d=c[3292+(b*12&-1)>>2]|0;if((d|0)==3){k=~~(+(c[818]|0)*2.0)}else if((d|0)==2){k=~~(+(c[818]|0)*1.4142)}else if((d|0)==1){k=c[818]|0}else{k=0}cM[c[3296+(b*12&-1)>>2]&511](k);f=c[10030]|0;g=aI(100056,4,1,f|0)|0;i=e;return}function rM(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;s5(a,b,d,e,1,f);c[816]=d;c[814]=e;return}function rN(){var b=0;g[57768]=0.0;g[57770]=0.0;if(a[231184]|0){b=c[10030]|0;aF(10,b|0);a[231184]=0}c[57766]=-1;cp(c[10030]|0,0,0);aI(101352,47,1,c[10030]|0);a[231136]=0;return}function rO(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0.0,n=0,o=0.0,p=0.0;b=i;i=i+24|0;d=b|0;e=c[13898]|0;L25387:do{if((e|0)<(c[8272]|0)){f=c[1054]|0;L25389:do{if((a[f+(e*40&-1)|0]&1)!=0){g=c[f+(e*40&-1)+36>>2]|0;j=f+(e*40&-1)+32|0;k=c[10036]|0;l=0;while(1){if((l|0)>=(g|0)){break}if((a[k+((c[j>>2]|0)+l|0)|0]|0)==(a[l+103664|0]|0)){l=l+1|0}else{break L25389}}if((l|0)==1){break L25387}}}while(0);f=is(d)|0;j=c[f>>2]|0;if((j|0)==1){m=+(c[f+8>>2]|0)}else if((j|0)==2){m=+h[f+8>>3]}else if((j|0)==3){m=+uz(c[f+8>>2]|0,0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=~~m;if((f|0)<=0){break}c[818]=f}}while(0);e=c[13898]|0;L25404:do{if((e|0)<(c[8272]|0)){f=c[1054]|0;L25406:do{if((a[f+(e*40&-1)|0]&1)!=0){j=c[f+(e*40&-1)+36>>2]|0;k=f+(e*40&-1)+32|0;g=c[10036]|0;n=0;while(1){if((n|0)>=(j|0)){break}if((a[g+((c[k>>2]|0)+n|0)|0]|0)==(a[n+103664|0]|0)){n=n+1|0}else{break L25406}}if((n|0)==1){break L25404}}}while(0);f=is(d)|0;k=c[f>>2]|0;if((k|0)==2){o=+h[f+8>>3]}else if((k|0)==3){o=+uz(c[f+8>>2]|0,0)}else if((k|0)==1){o=+(c[f+8>>2]|0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}f=~~o;if((f|0)<=0){break}c[914]=f}}while(0);e=c[13898]|0;L25421:do{if((e|0)<(c[8272]|0)){f=c[1054]|0;L25423:do{if((a[f+(e*40&-1)|0]&1)!=0){k=c[f+(e*40&-1)+36>>2]|0;g=f+(e*40&-1)+32|0;j=c[10036]|0;l=0;while(1){if((l|0)>=(k|0)){break}if((a[j+((c[g>>2]|0)+l|0)|0]|0)==(a[l+103664|0]|0)){l=l+1|0}else{break L25423}}if((l|0)==1){break L25421}}}while(0);f=is(d)|0;g=c[f>>2]|0;if((g|0)==3){p=+uz(c[f+8>>2]|0,0)}else if((g|0)==1){p=+(c[f+8>>2]|0)}else if((g|0)==2){p=+h[f+8>>3]}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if(p<=0.0){break}h[523]=p}}while(0);d=c[914]|0;p=+h[523];be(13048,99024,(v=i,i=i+24|0,c[v>>2]=c[818],c[v+8>>2]=d,h[v+16>>3]=p,v)|0);i=b;return}function rP(a){a=a|0;c[57794]=a;return 1}function rQ(a){a=a|0;c[56722]=a;return 1}function rR(a){a=a|0;c[56636]=a;return 1}function rS(a){a=a|0;c[58056]=(a|0)!=0&1;return 1}function rT(a,b){a=a|0;b=b|0;c[58246]=a;c[58244]=b;c[58254]=0;h[29126]=+(c[232736+((c[58242]|0)*24&-1)>>2]|0);return}function rU(){var b=0;if(a[231184]|0){b=c[10030]|0;aF(10,b|0);a[231184]=0}g[57768]=0.0;g[57770]=0.0;return}function rV(){var b=0;if(a[231184]|0){b=c[10030]|0;aF(10,b|0);a[231184]=0}aI(101400,32,1,c[10030]|0);return}function rW(){var b=0,d=0,e=0.0,f=0.0,j=0.0,k=0.0;b=i;aI(103264,160,1,c[10030]|0);aI(102784,449,1,c[10030]|0);aI(102488,280,1,c[10030]|0);aI(101736,747,1,c[10030]|0);aI(101616,83,1,c[10030]|0);if(!(a[231048]|0)){d=c[10030]|0;aI(101512,43,1,d|0)}e=+g[184];f=+g[44];j=e+ +g[178];k=f+ +g[38];cf(c[10030]|0,101448,(v=i,i=i+32|0,h[v>>3]=e,h[v+8>>3]=f,h[v+16>>3]=j,h[v+24>>3]=k,v)|0);i=b;return}function rX(b,d){b=b|0;d=d|0;var e=0;if(a[231184]|0){e=c[10030]|0;aF(10,e|0);a[231184]=0}g[57770]=+(b>>>0>>>0)/1.0e4;g[57768]=+(d>>>0>>>0)/1.0e4;return}function rY(b,d){b=b|0;d=d|0;var e=0,f=0,j=0,k=0.0,l=0.0;e=i;do{if(a[231184]|0){f=c[57792]|0;c[57792]=f+1;if((f|0)<=99){break}f=c[10030]|0;j=c[231144+((c[57766]|0)+2<<2)>>2]|0;k=+g[57770];l=+g[57768];cf(f|0,104992,(v=i,i=i+24|0,c[v>>2]=j,h[v+8>>3]=k,h[v+16>>3]=l,v)|0);c[57792]=1}else{a[231184]=1;j=c[10030]|0;f=c[231144+((c[57766]|0)+2<<2)>>2]|0;l=+g[57770];k=+g[57768];cf(j|0,104992,(v=i,i=i+24|0,c[v>>2]=f,h[v+8>>3]=l,h[v+16>>3]=k,v)|0);c[57792]=1}}while(0);k=+(b>>>0>>>0)/1.0e4;g[57770]=k;l=+(d>>>0>>>0)/1.0e4;g[57768]=l;cf(c[10030]|0,103688,(v=i,i=i+16|0,h[v>>3]=k,h[v+8>>3]=l,v)|0);i=e;return}function rZ(b){b=b|0;var d=0,e=0;if(a[231184]|0){d=c[10030]|0;aF(10,d|0);a[231184]=0}if((b|0)>3){e=(b|0)%4&-1}else{e=b}c[57766]=(e|0)<-2?-2:e;return}function r_(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0.0;g=i;i=i+8|0;j=g|0;if(a[231184]|0){k=c[10030]|0;aF(10,k|0);a[231184]=0}if((a[f]|0)==0){i=g;return}aI(104112,5,1,c[10030]|0);k=c[57794]|0;if((k|0)==0){l=c[10030]|0;aI(104096,3,1,l|0)}else if((k|0)==2){aI(104088,3,1,c[10030]|0)}if((c[58056]|0)==1){k=c[10030]|0;aI(104040,3,1,k|0)}cf(c[10030]|0,104e3,(v=i,i=i+16|0,h[v>>3]=+(d>>>0>>>0)/1.0e4,h[v+8>>3]=+(e>>>0>>>0)/1.0e4,v)|0);if(a[231056]|0){e=c[10030]|0;cf(e|0,103976,(v=i,i=i+8|0,c[v>>2]=f,v)|0);i=g;return}uz(f,j);e=c[j>>2]|0;if((e|0)==(f|0)){uB(231192,f|0)}else{d=e-f|0;e=d+1|0;uF(231192,f|0,e|0);if((uA(f|0)|0)>>>0>=e>>>0){a[231192+((e|0)==0?0:d)|0]=0}d=a8(231192,101)|0;if((d|0)==0){e=a8(231192,69)|0;if((e|0)!=0){m=e;n=19097}}else{m=d;n=19097}do{if((n|0)==19097){a[m]=0;o=+uz(231192,0);d=bW(m+1|0)|0;if(o==0.0){b[115596]=48;break}if(o==1.0){be(231192,103944,(v=i,i=i+8|0,c[v>>2]=d,v)|0);break}e=~~o;f=(d|0)==1;if(o==+(e|0)){if(f){be(231192,103848,(v=i,i=i+8|0,c[v>>2]=e,v)|0);break}else{be(231192,103800,(v=i,i=i+16|0,c[v>>2]=e,c[v+8>>2]=d,v)|0);break}}else{if(f){be(231192,103760,(v=i,i=i+8|0,h[v>>3]=o,v)|0);break}else{be(231192,103728,(v=i,i=i+16|0,h[v>>3]=o,c[v+8>>2]=d,v)|0);break}}}}while(0);m=c[j>>2]|0;uC(231192,m|0)}cf(c[10030]|0,103976,(v=i,i=i+8|0,c[v>>2]=231192,v)|0);i=g;return}function r$(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,j=0,k=0.0,l=0.0;f=i;if(a[231184]|0){j=c[10030]|0;aF(10,j|0);a[231184]=0}k=+(b>>>0>>>0)/1.0e4;g[57770]=k;l=+(d>>>0>>>0)/1.0e4;g[57768]=l;d=c[10030]|0;if((e|0)<0){cf(d|0,105032,(v=i,i=i+24|0,h[v>>3]=k,h[v+8>>3]=l,h[v+16>>3]=25.0e-5,v)|0);i=f;return}else{b=c[231088+(((e|0)%12&-1)<<2)>>2]|0;cf(d|0,104992,(v=i,i=i+24|0,c[v>>2]=b,h[v+8>>3]=k,h[v+16>>3]=l,v)|0);i=f;return}}function r0(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var j=0,k=0.0,l=0.0;j=i;k=+(d>>>0>>>0)/1.0e4;l=+(e>>>0>>>0)/1.0e4;cf(c[10030]|0,105176,(v=i,i=i+40|0,c[v>>2]=(f|0)!=0?105128:179864,h[v+8>>3]=+(a>>>0>>>0)/1.0e4,h[v+16>>3]=+(b>>>0>>>0)/1.0e4,h[v+24>>3]=k,h[v+32>>3]=l,v)|0);g[57770]=k;g[57768]=l;i=j;return}function r1(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0.0,o=0.0,p=0.0;d=i;if((b|0)==0){e=128;i=d;return e|0}L25532:do{if(!(a[231136]|0)){a[231136]=1;f=c[5163]|0;if((f|0)==103){g=c[5169]|0;if((g|0)>0){j=0;k=g}else{break}while(1){cf(c[10030]|0,105632,(v=i,i=i+16|0,c[v>>2]=j,h[v+8>>3]=+(~~(+(j|0)/+(k-1|0)*1.0e3)|0)*.001,v)|0);j=j+1|0;k=c[5169]|0;if((j|0)>=(k|0)){break L25532}}}else if((f|0)!=114){break}if((c[5169]|0)<=0){break}g=b+32|0;l=0;do{m=c[g>>2]|0;n=+(~~(+h[m+(l*24&-1)>>3]*1.0e3)|0)*.001;o=+(~~(+h[m+(l*24&-1)+8>>3]*1.0e3)|0)*.001;p=+(~~(+h[m+(l*24&-1)+16>>3]*1.0e3)|0)*.001;cf(c[10030]|0,105552,(v=i,i=i+32|0,c[v>>2]=l,h[v+8>>3]=n,h[v+16>>3]=o,h[v+24>>3]=p,v)|0);l=l+1|0;}while((l|0)<(c[5169]|0))}}while(0);aI(105272,85,1,c[10030]|0);e=0;i=d;return e|0}function r2(b){b=b|0;var d=0.0,e=0;d=+h[b+8>>3];if((c[b>>2]|0)!=5){return}if(d>0.0){e=~~(d*+(c[5169]|0))}else{e=0}if(!(a[231136]|0)){b=c[m>>2]|0;aI(105680,35,1,b|0)}c[58054]=(e|0)>127?127:e;return}function r3(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0.0;d=i;cf(c[10030]|0,105856,(v=i,i=i+8|0,c[v>>2]=c[58054],v)|0);if((a|0)>0){e=0}else{f=c[10030]|0;g=aF(10,f|0)|0;i=d;return}do{if(((e|0)%8&-1|0)==7){j=c[10030]|0;aF(10,j|0)}k=+(c[b+(e*12&-1)+4>>2]|0)/1.0e4;cf(c[10030]|0,105760,(v=i,i=i+16|0,h[v>>3]=+(c[b+(e*12&-1)>>2]|0)/1.0e4,h[v+8>>3]=k,v)|0);e=e+1|0;}while((e|0)<(a|0));f=c[10030]|0;g=aF(10,f|0)|0;i=d;return}function r4(){var b=0;c[56608]=0;c[56610]=0;if(a[226552]|0){b=c[10030]|0;aF(10,b|0);a[226552]=0}c[56606]=-1;aI(106128,39,1,c[10030]|0);return}function r5(){var b=0;if(a[226552]|0){b=c[10030]|0;aF(10,b|0);a[226552]=0}c[56608]=0;c[56610]=0;return}function r6(){var b=0;if(a[226552]|0){b=c[10030]|0;aF(10,b|0);a[226552]=0}aI(106248,14,1,c[10030]|0);return}function r7(){var a=0;a=i;cf(c[10030]|0,226560,(v=i,i=i+16|0,h[v>>3]=.24089999496936798,c[v+8>>2]=3,v)|0);c[56632]=0;c[56606]=0;i=a;return}function r8(b,d){b=b|0;d=d|0;var e=0;if(a[226552]|0){e=c[10030]|0;aF(10,e|0);a[226552]=0}c[56610]=b;c[56608]=d;return}function r9(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;do{if(a[226552]|0){f=c[56630]|0;c[56630]=f+1;if((f|0)<=4){break}f=c[10030]|0;aI(106424,8,1,f|0);c[56630]=1}else{a[226552]=1;f=c[56606]|0;g=c[56632]|0;if((f|0)!=(g|0)){h=c[226496+(f+2<<2)>>2]|0;if((h|0)==(c[226496+(g+2<<2)>>2]|0)){j=f}else{f=c[10030]|0;cf(f|0,106544,(v=i,i=i+8|0,c[v>>2]=h,v)|0);j=c[56606]|0}c[56632]=j}h=c[10030]|0;f=c[56610]|0;g=c[56608]|0;cf(h|0,106504,(v=i,i=i+16|0,c[v>>2]=f,c[v+8>>2]=g,v)|0);c[56630]=1}}while(0);cf(c[10030]|0,106360,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=d,v)|0);c[56610]=b;c[56608]=d;i=e;return}function sa(b){b=b|0;var d=0,e=0;if(a[226552]|0){d=c[10030]|0;aF(10,d|0);a[226552]=0}if((b|0)>2){e=(b|0)%3&-1}else{e=b}c[56606]=(e|0)>-2?e:-2;return}function sb(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;if(a[226552]|0){g=c[10030]|0;aF(10,g|0);a[226552]=0}cf(c[10030]|0,106848,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=d,v)|0);d=(c[56722]|0)==0?104:118;b=c[56636]|0;do{if((c[56634]|0)!=(b|0)){c[56634]=b;if((b|0)==1){g=c[10030]|0;aI(108272,17,1,g|0);break}else if((b|0)==2){aI(106656,17,1,c[10030]|0);break}else if((b|0)==0){aI(106736,17,1,c[10030]|0);break}else{break}}}while(0);cf(c[10030]|0,106624,(v=i,i=i+16|0,c[v>>2]=d,c[v+8>>2]=e,v)|0);i=f;return}function sc(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;if(a[226552]|0){g=c[10030]|0;aF(10,g|0);a[226552]=0}c[56610]=b;c[56608]=d;cf(c[10030]|0,108368,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=d,v)|0);if((c[56634]|0)!=1){d=c[10030]|0;aI(108272,17,1,d|0);c[56634]=1}if((e|0)<0){h=108192}else{h=c[226448+(((e|0)%12&-1)<<2)>>2]|0}cf(c[10030]|0,154696,(v=i,i=i+8|0,c[v>>2]=h,v)|0);i=f;return}function sd(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;g=i;cf(c[10030]|0,108416,(v=i,i=i+40|0,c[v>>2]=a,c[v+8>>2]=b,c[v+16>>2]=(f|0)==0?108:97,c[v+24>>2]=d,c[v+32>>2]=e,v)|0);c[56610]=d;c[56608]=e;i=g;return}function se(){c[58256]=0;a[233032]=0;aI(113088,165,1,c[10030]|0);aI(112768,208,1,c[10030]|0);aI(111168,1548,1,c[10030]|0);aI(110792,238,1,c[10030]|0);aI(109768,808,1,c[10030]|0);aI(109360,328,1,c[10030]|0);aI(108752,519,1,c[10030]|0);aI(108504,212,1,c[10030]|0);return}function sf(){aI(122176,5,1,c[10030]|0);return}function sg(){aI(113352,9,1,c[10030]|0);return}function sh(){var b=0,d=0,e=0;b=i;d=c[3524]|0;cf(c[10030]|0,113672,(v=i,i=i+24|0,c[v>>2]=c[58256],h[v+8>>3]=5.0,h[v+16>>3]=3.0,v)|0);c[58256]=(c[58256]|0)+1;e=c[d+12>>2]|0;cf(c[10030]|0,113504,(v=i,i=i+16|0,c[v>>2]=c[d+8>>2],c[v+8>>2]=e,v)|0);a[232720]=0;i=b;return}function si(a){a=a|0;c[58248]=a;return 1}function sj(b){b=b|0;a[233032]=(b|0)>0;return 1}function sk(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,w=0,x=0,y=0.0,z=0.0,A=0,B=0,C=0,D=0.0,E=0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0,L=0,M=0;d=i;e=c[58246]|0;f=c[58244]|0;g=(e|0)==(a|0)&(f|0)==(b|0);if((c[58250]|0)!=0){j=c[10030]|0;if(g){cf(j|0,113832,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=b,v)|0);c[58246]=a;c[58244]=b;i=d;return}else{cf(j|0,113728,(v=i,i=i+32|0,c[v>>2]=e,c[v+8>>2]=f,c[v+16>>2]=a,c[v+24>>2]=b,v)|0);c[58246]=a;c[58244]=b;i=d;return}}if(g){if((c[58254]&1|0)!=0){c[58246]=a;c[58244]=b;i=d;return}g=c[10030]|0;cf(g|0,113832,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=b,v)|0);c[58246]=a;c[58244]=b;i=d;return}k=+(e>>>0>>>0);l=+(f>>>0>>>0);m=+(a>>>0>>>0);n=m-k;o=+(b>>>0>>>0);p=o-l;q=+Q(+(n*n+p*p));r=n/q;n=p/q;p=+h[29126];g=c[58254]|0;if(p>2]=w,c[v+8>>2]=x,c[v+16>>2]=A,c[v+24>>2]=B,v)|0);D=+h[29126];E=c[58254]|0}else{D=q;E=j}c[58246]=A;c[58244]=B;F=u-D;C=E+1&3;c[58254]=C;G=+(c[232736+((c[58242]|0)*24&-1)+(C<<2)>>2]|0);h[29126]=G;if(G>2]=a,c[v+8>>2]=b,v)|0);c[58246]=a;c[58244]=b;i=d;return}else{cf(M|0,113728,(v=i,i=i+32|0,c[v>>2]=K,c[v+8>>2]=L,c[v+16>>2]=a,c[v+24>>2]=b,v)|0);c[58246]=a;c[58244]=b;i=d;return}}function sl(b){b=b|0;var d=0,e=0,f=0.0,j=0.0;d=i;if((b|0)>7){e=(b|0)%8&-1}else{e=b}b=e+2|0;e=(b|0)<0?0:b;f=+g[232732+(e*24&-1)>>2];if(!(f==+g[232732+((c[58242]|0)*24&-1)>>2]&a[232720])){b=c[10030]|0;j=f;cf(b|0,113976,(v=i,i=i+8|0,h[v>>3]=j,v)|0);a[232720]=1}c[58242]=e;c[58254]=0;h[29126]=+(c[232736+(e*24&-1)>>2]|0);c[58250]=c[232728+(e*24&-1)>>2];i=d;return}function sm(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0;f=i;if((e|0)==0){i=f;return}if((a[e]|0)==0){i=f;return}g=bP(e|0)|0;e=a[g]|0;L25673:do{if(e<<24>>24!=0){h=0;j=e;while(1){if(j<<24>>24==34){a[g+h|0]=39}k=h+1|0;if(k>>>0>=(uA(g|0)|0)>>>0){break L25673}h=k;j=a[g+k|0]|0}}}while(0);e=c[58248]|0;if((e|0)==2){l=3}else if((e|0)==0){l=1}else if((e|0)==1){l=2}else{l=0}e=a[233032]|0?90:0;cf(c[10030]|0,114256,(v=i,i=i+40|0,c[v>>2]=g,c[v+8>>2]=b,c[v+16>>2]=d,c[v+24>>2]=e,c[v+32>>2]=l,v)|0);uu(g);i=f;return}function sn(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;g=i;c[58246]=a;c[58244]=b;c[58254]=0;h[29126]=+(c[232736+((c[58242]|0)*24&-1)>>2]|0);sk(d,e);if((f|0)==0){i=g;return}cf(c[10030]|0,114408,(v=i,i=i+32|0,c[v>>2]=d-a,c[v+8>>2]=e-b,c[v+16>>2]=d,c[v+24>>2]=e,v)|0);i=g;return}function so(){var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0.0,L=0,M=0,N=0,O=0.0,P=0.0,Q=0,R=0;b=i;i=i+56|0;d=b|0;e=b+24|0;f=b+48|0;g=c[13898]|0;if((g|0)!=2){a[232616]=0;a[232304]=0;c[58074]=1;a[232648]=0;a[232640]=0;c[58078]=0;h[29067]=10.0;h[29036]=1.0;c[58080]=-1;a[232544]=a[116880]|0;a[232545|0]=a[116881|0]|0;a[232546|0]=a[116882|0]|0;a[232547|0]=a[116883|0]|0;a[232548|0]=a[116884|0]|0;a[232549|0]=a[116885|0]|0}j=c[8272]|0;L25696:do{if((g|0)<(j|0)){k=d|0;l=d+8|0;m=g;n=j;L25698:while(1){o=c[1054]|0;p=(a[o+(m*40&-1)|0]&1)==0;L25700:do{if(!p){q=c[o+(m*40&-1)+36>>2]|0;r=o+(m*40&-1)+32|0;s=c[10036]|0;t=0;while(1){if((t|0)>=(q|0)){break}if((a[s+((c[r>>2]|0)+t|0)|0]|0)==(a[t+103664|0]|0)){t=t+1|0}else{break L25700}}if((t|0)==1){break L25696}}}while(0);r=c[58086]|0;L25707:do{if((r|0)==0){u=232344}else{s=c[o+(m*40&-1)+36>>2]|0;q=c[o+(m*40&-1)+32>>2]|0;w=(s|0)>0;x=c[10036]|0;y=232344;z=r;while(1){L25711:do{if(!p){if(w){A=0;B=0;C=q;while(1){D=a[z+A|0]|0;if(D<<24>>24==(a[x+(A+C|0)|0]|0)){E=C;F=B}else{if(D<<24>>24!=36){break L25711}E=C-1|0;F=1}G=A+1|0;if((G|0)<(F+s|0)){A=G;B=F;C=E}else{break}}if((F|0)==0){H=G}else{u=y;break L25707}}else{H=0}C=a[z+H|0]|0;if((C<<24>>24|0)==36|(C<<24>>24|0)==0){u=y;break L25707}}}while(0);C=y+8|0;B=c[C>>2]|0;if((B|0)==0){u=C;break}else{y=C;z=B}}}}while(0);p=c[u+4>>2]|0;L25724:do{if((p|0)==14){r=m+1|0;c[13898]=r;if((r|0)>=(n|0)){break}L25727:do{if((a[o+(r*40&-1)|0]&1)==0){I=c[10036]|0;J=o+(r*40&-1)+32|0}else{z=c[o+(r*40&-1)+36>>2]|0;y=o+(r*40&-1)+32|0;s=c[10036]|0;x=0;while(1){if((x|0)>=(z|0)){break}if((a[s+((c[y>>2]|0)+x|0)|0]|0)==(a[x+103664|0]|0)){x=x+1|0}else{I=s;J=y;break L25727}}if((x|0)==1){break L25724}else{I=s;J=y}}}while(0);if((ca(I+(c[J>>2]|0)|0,21e4,(v=i,i=i+8|0,c[v>>2]=f,v)|0)|0)==1){c[58080]=c[f>>2]}c[13898]=(c[13898]|0)+1}else if((p|0)==4){c[58074]=0;a[232544]=a[116696]|0;a[232545|0]=a[116697|0]|0;a[232546|0]=a[116698|0]|0;a[232547|0]=a[116699|0]|0;a[232548|0]=a[116700|0]|0;a[232549|0]=a[116701|0]|0;a[232550|0]=a[116702|0]|0;c[13898]=m+1}else if((p|0)==0){a[232616]=0;c[13898]=m+1}else if((p|0)==9){c[58074]=2;c[58078]=1;c[13898]=m+1}else if((p|0)==3){a[232304]=0;c[13898]=m+1}else if((p|0)==1){a[232616]=1;c[13898]=m+1}else if((p|0)==8){c[58074]=2;c[58078]=2;c[13898]=m+1}else if((p|0)==7){c[58074]=2;a[232648]=1;c[13898]=m+1}else if((p|0)==15){c[58080]=-1;c[13898]=m+1}else if((p|0)==2){a[232304]=1;c[13898]=m+1}else if((p|0)==5){c[58074]=1;c[13898]=m+1}else if((p|0)==6){c[58074]=2;c[13898]=m+1}else if((p|0)==16){r=m+1|0;c[13898]=r;if((r|0)>=(n|0)){break}L25751:do{if((a[o+(r*40&-1)|0]&1)!=0){z=c[o+(r*40&-1)+36>>2]|0;q=o+(r*40&-1)+32|0;w=c[10036]|0;t=0;while(1){if((t|0)>=(z|0)){break}if((a[w+((c[q>>2]|0)+t|0)|0]|0)==(a[t+103664|0]|0)){t=t+1|0}else{break L25751}}if((t|0)==1){break L25724}}}while(0);r=is(e)|0;q=c[r>>2]|0;if((q|0)==3){K=+uz(c[r+8>>2]|0,0)}else if((q|0)==1){K=+(c[r+8>>2]|0)}else if((q|0)==2){K=+h[r+8>>3]}else{L=19304;break L25698}h[29036]=K}else if((p|0)==10){c[58078]=0;c[13898]=m+1}else if((p|0)==11){c[58074]=2;a[232640]=1;c[13898]=m+1}else if((p|0)==12){r=m+1|0;c[13898]=r;M=r;L=19307}else{M=m;L=19307}}while(0);L25766:do{if((L|0)==19307){L=0;L25768:do{if((M|0)<(n|0)){L25770:do{if((a[o+(M*40&-1)|0]&1)!=0){r=c[o+(M*40&-1)+36>>2]|0;q=o+(M*40&-1)+32|0;w=c[10036]|0;z=0;while(1){if((z|0)>=(r|0)){break}if((a[w+((c[q>>2]|0)+z|0)|0]|0)==(a[z+103664|0]|0)){z=z+1|0}else{break L25770}}if((z|0)==1){N=M;break L25768}}}while(0);a[14176]=1;is(d);a[14176]=0;if((c[k>>2]|0)!=3){c[13898]=M;N=M;break}t=c[l>>2]|0;if((t|0)==0){N=c[13898]|0;break}q=bk(t|0,148464)|0;if((q|0)>0){uF(232544,t|0,51);a[q+232544|0]=0}if((a[t+q|0]|0)==44){w=t+(q+1|0)|0;ca(w|0,148448,(v=i,i=i+8|0,c[v>>2]=232536,v)|0)}uu(t);break L25766}else{N=M}}while(0);if((p|0)==12){L=19324;break L25698}if((N|0)>=(c[8272]|0)){break}t=c[1054]|0;L25792:do{if((a[t+(N*40&-1)|0]&1)!=0){w=c[t+(N*40&-1)+36>>2]|0;q=t+(N*40&-1)+32|0;r=c[10036]|0;y=0;while(1){if((y|0)>=(w|0)){break}if((a[r+((c[q>>2]|0)+y|0)|0]|0)==(a[y+103664|0]|0)){y=y+1|0}else{break L25792}}if((y|0)==1){break L25766}}}while(0);t=is(e)|0;q=c[t>>2]|0;if((q|0)==1){O=+(c[t+8>>2]|0)}else if((q|0)==2){O=+h[t+8>>3]}else if((q|0)==3){O=+uz(c[t+8>>2]|0,0)}else{L=19335;break L25698}h[29067]=O;c[13898]=(c[13898]|0)+1}}while(0);m=c[13898]|0;n=c[8272]|0;if((m|0)>=(n|0)){break L25696}}if((L|0)==19304){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((L|0)==19324){uf(N,116592,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((L|0)==19335){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);O=+h[29067];do{if(O<5.0){h[29067]=5.0;P=12.0e3}else{if(O>99.99){h[29067]=99.99;P=239976.0;break}else{P=O*2400.0;break}}}while(0);c[(c[3524]|0)+16>>2]=~~(P*+h[29036]*11.0/720.0);P=+h[29067]*2400.0*+h[29036];if((c[58074]|0)==0){c[(c[3524]|0)+20>>2]=~~(P*6.0/720.0+.5)}else{c[(c[3524]|0)+20>>2]=~~(P*5.3/720.0+.5)}L=c[58078]|0;N=a[232616]|0?116440:116408;e=a[232304]|0?131504:131584;M=c[58074]|0;d=(M|0)==0;if((L|0)==0){if(d){Q=136208}else{Q=(M|0)==2?116352:179864}f=a[232648]|0?116296:179864;J=a[232640]|0?116192:179864;P=+h[29036];O=+h[29067];I=c[58080]|0;u=(I|0)>-1?179864:136208;be(13048,116512,(v=i,i=i+80|0,c[v>>2]=N,c[v+8>>2]=e,c[v+16>>2]=Q,c[v+24>>2]=f,c[v+32>>2]=J,h[v+40>>3]=P,c[v+48>>2]=232544,h[v+56>>3]=O,c[v+64>>2]=u,c[v+72>>2]=I,v)|0);i=b;return}else{if(d){R=136208}else{R=(M|0)==2?116352:179864}M=a[232648]|0?116296:179864;d=a[232640]|0?116192:179864;O=+h[29036];I=(L|0)==1?115960:115816;L=c[58080]|0;u=(L|0)>-1?179864:136208;be(13048,116072,(v=i,i=i+72|0,c[v>>2]=N,c[v+8>>2]=e,c[v+16>>2]=R,c[v+24>>2]=M,c[v+32>>2]=d,h[v+40>>3]=O,c[v+48>>2]=I,c[v+56>>2]=u,c[v+64>>2]=L,v)|0);i=b;return}}function sp(a){a=a|0;c[58158]=a;return 1}function sq(a){a=a|0;c[58130]=a;return 1}function sr(a){a=a|0;return 0}function ss(){return}function st(){var b=0,d=0,e=0,f=0,g=0.0,j=0,k=0;b=i;i=i+8|0;d=b|0;cG(d|0);c[58082]=0;c[58084]=0;e=c[10030]|0;f=bg(aN(d|0)|0)|0;cf(e|0,122032,(v=i,i=i+8|0,c[v>>2]=f,v)|0);f=c[58080]|0;if((f|0)>-1){e=c[10030]|0;cf(e|0,121880,(v=i,i=i+8|0,c[v>>2]=f,v)|0)}if((c[58074]|0)==2){f=c[10030]|0;aI(121552,247,1,f|0);f=c[10030]|0;if(a[232648]|0){aI(121472,33,1,f|0)}else{aI(121408,24,1,f|0)}f=c[58078]|0;if((f|0)==2){e=c[10030]|0;aI(120992,174,1,e|0)}else if((f|0)==1){aI(121240,124,1,c[10030]|0)}if(a[232640]|0){f=c[10030]|0;aI(120888,54,1,f|0)}f=c[10030]|0;aI(120824,31,1,f|0)}aI(120464,227,1,c[10030]|0);cf(c[10030]|0,120328,(v=i,i=i+8|0,h[v>>3]=+h[29036],v)|0);aI(119968,246,1,c[10030]|0);f=c[58074]|0;if((f|0)==0){e=c[10030]|0;g=+h[29067];cf(e|0,119792,(v=i,i=i+16|0,c[v>>2]=232544,h[v+8>>3]=g,v)|0)}else if((f|0)!=2){aI(119656,82,1,c[10030]|0);g=+h[29067];cf(c[10030]|0,119576,(v=i,i=i+16|0,c[v>>2]=232544,h[v+8>>3]=g,v)|0)}aI(119448,91,1,c[10030]|0);f=c[10030]|0;if(a[232616]|0){aI(119328,18,1,f|0)}else{aI(119248,19,1,f|0)}f=c[10030]|0;if(a[232304]|0){aI(119168,20,1,f|0);j=c[10030]|0;k=aI(117096,1968,1,j|0)|0;i=b;return}else{aI(119128,19,1,f|0);j=c[10030]|0;k=aI(117096,1968,1,j|0)|0;i=b;return}}function su(){var a=0,b=0;if((c[58074]|0)!=2){a=c[10030]|0;b=aI(122176,5,1,a|0)|0;return}aI(122728,10,1,c[10030]|0);aI(122648,12,1,c[10030]|0);aI(122520,16,1,c[10030]|0);aI(122424,5,1,c[10030]|0);aI(122312,10,1,c[10030]|0);a=c[10030]|0;b=aI(122176,5,1,a|0)|0;return}function sv(){var b=0;if(a[232528]|0){a[232528]=0;b=c[10030]|0;aI(125976,2,1,b|0)}aI(122792,8,1,c[10030]|0);return}function sw(){var b=0,d=0,e=0.0;b=i;c[58126]=-2;h[29062]=1.0;h[29061]=+h[3817];cf(c[10030]|0,123376,(v=i,i=i+24|0,c[v>>2]=c[58156],h[v+8>>3]=5.0,h[v+16>>3]=3.0,v)|0);d=c[3524]|0;e=+((c[d+12>>2]|0)>>>0>>>0)/10.0;cf(c[10030]|0,123080,(v=i,i=i+16|0,h[v>>3]=+((c[d+8>>2]|0)>>>0>>>0)/10.0,h[v+8>>3]=e,v)|0);cf(c[10030]|0,122896,(v=i,i=i+8|0,h[v>>3]=+h[3817],v)|0);c[58156]=(c[58156]|0)+1;a[232608]=0;i=b;return}function sx(b,d){b=b|0;d=d|0;var e=0;if((c[58084]|0)==(b|0)&(c[58082]|0)==(d|0)){return}if(a[232528]|0){a[232528]=0;e=c[10030]|0;aI(125976,2,1,e|0)}c[58084]=b;c[58082]=d;return}function sy(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0.0,l=0.0;e=i;f=c[58084]|0;g=c[58082]|0;if((f|0)==(b|0)&(g|0)==(d|0)){i=e;return}do{if(a[232528]|0){j=c[58128]|0;c[58128]=j+1;if((j|0)<=4){break}j=c[10030]|0;aF(10,j|0);c[58128]=1}else{a[232528]=1;j=c[10030]|0;k=+(f|0)/10.0;l=+(g|0)/10.0;cf(j|0,123728,(v=i,i=i+16|0,h[v>>3]=k,h[v+8>>3]=l,v)|0);c[58128]=2}}while(0);c[58084]=b;c[58082]=d;cf(c[10030]|0,123552,(v=i,i=i+16|0,h[v>>3]=+(b|0)/10.0,h[v+8>>3]=+(d|0)/10.0,v)|0);i=e;return}function sz(b){b=b|0;var d=0,e=0;d=i;if((b|0)>7){e=(b|0)%8&-1}else{e=b}if(a[232528]|0){a[232528]=0;b=c[10030]|0;aI(125976,2,1,b|0)}do{if(a[232608]|0){c[58126]=e+1;a[232608]=0}else{if((c[58126]|0)!=(e|0)){break}i=d;return}}while(0);cf(c[10030]|0,123808,(v=i,i=i+8|0,c[v>>2]=e,v)|0);c[58126]=e;i=d;return}function sA(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0.0,q=0.0;f=i;if((e|0)==0){i=f;return}if((a[e]|0)==0){i=f;return}g=bP(e|0)|0;if(a[232528]|0){a[232528]=0;e=c[10030]|0;aI(125976,2,1,e|0)}e=c[58130]|0;if((e|0)==0){j=1}else if((e|0)==1){j=2}else if((e|0)==2){j=3}else{j=0}e=c[58074]|0;do{if((e|0)==0){k=a[g]|0;L25932:do{if(k<<24>>24!=0){l=0;m=k;while(1){if(m<<24>>24==34){a[g+l|0]=39}n=l+1|0;if(n>>>0>=(uA(g|0)|0)>>>0){break L25932}l=n;m=a[g+n|0]|0}}}while(0);k=c[10030]|0;if(a[232600]|0){o=+h[29067];p=+(b>>>0>>>0)/10.0;q=+(d>>>0>>>0)/10.0;m=c[58158]|0;cf(k|0,124232,(v=i,i=i+56|0,c[v>>2]=g,c[v+8>>2]=232544,h[v+16>>3]=o,h[v+24>>3]=p,h[v+32>>3]=q,c[v+40>>2]=m,c[v+48>>2]=j,v)|0);break}else{q=+(b>>>0>>>0)/10.0;p=+(d>>>0>>>0)/10.0;m=c[58158]|0;cf(k|0,124152,(v=i,i=i+40|0,c[v>>2]=g,h[v+8>>3]=q,h[v+16>>3]=p,c[v+24>>2]=m,c[v+32>>2]=j,v)|0);break}}else{if(!(a[232600]|0)){m=c[10030]|0;p=+(b>>>0>>>0)/10.0;q=+(d>>>0>>>0)/10.0;k=c[58158]|0;cf(m|0,123912,(v=i,i=i+40|0,c[v>>2]=g,h[v+8>>3]=p,h[v+16>>3]=q,c[v+24>>2]=k,c[v+32>>2]=j,v)|0);break}k=c[10030]|0;if((e|0)==2){q=+(b>>>0>>>0)/10.0;p=+(d>>>0>>>0)/10.0;m=c[58158]|0;cf(k|0,123912,(v=i,i=i+40|0,c[v>>2]=g,h[v+8>>3]=q,h[v+16>>3]=p,c[v+24>>2]=m,c[v+32>>2]=j,v)|0);break}else{p=+h[29067];q=+(b>>>0>>>0)/10.0;o=+(d>>>0>>>0)/10.0;m=c[58158]|0;cf(k|0,123992,(v=i,i=i+56|0,c[v>>2]=232544,h[v+8>>3]=p,c[v+16>>2]=g,h[v+24>>3]=q,h[v+32>>3]=o,c[v+40>>2]=m,c[v+48>>2]=j,v)|0);break}}}while(0);uu(g);i=f;return}function sB(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0;f=i;if(a[232528]|0){a[232528]=0;g=c[10030]|0;aI(125976,2,1,g|0)}if((e|0)>9){j=(e|0)%10&-1}else{j=e}cf(c[10030]|0,124360,(v=i,i=i+24|0,c[v>>2]=j,h[v+8>>3]=+(b>>>0>>>0)/10.0,h[v+16>>3]=+(d>>>0>>>0)/10.0,v)|0);i=f;return}function sC(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0;j=i;if(!((c[58084]|0)==(b|0)&(c[58082]|0)==(d|0))){if(a[232528]|0){a[232528]=0;k=c[10030]|0;aI(125976,2,1,k|0)}c[58084]=b;c[58082]=d}if((g|0)!=0){k=c[10030]|0;l=(g|0)==1?124720:124632;m=+(b>>>0>>>0)/10.0;n=+(d>>>0>>>0)/10.0;o=+(e>>>0>>>0)/10.0;p=+(f>>>0>>>0)/10.0;cf(k|0,124776,(v=i,i=i+40|0,c[v>>2]=l,h[v+8>>3]=m,h[v+16>>3]=n,h[v+24>>3]=o,h[v+32>>3]=p,v)|0);c[58084]=e;c[58082]=f;i=j;return}if((b|0)==(e|0)&(d|0)==(f|0)){c[58084]=e;c[58082]=f;i=j;return}cf(c[10030]|0,124504,(v=i,i=i+32|0,h[v>>3]=+(b>>>0>>>0)/10.0,h[v+8>>3]=+(d>>>0>>>0)/10.0,h[v+16>>3]=+(e>>>0>>>0)/10.0,h[v+24>>3]=+(f>>>0>>>0)/10.0,v)|0);c[58084]=e;c[58082]=f;i=j;return}function sD(b){b=b|0;var d=0,e=0,f=0,g=0,j=0.0;d=i;do{if((a[b]|0)==0){e=0}else{f=bk(b|0,148464)|0;if(f>>>0<51){uF(232544,b|0,51)}g=b+(f+1|0)|0;ca(g|0,148448,(v=i,i=i+8|0,c[v>>2]=232536,v)|0);j=+h[29067];if(j<5.0){h[29067]=5.0;e=1;break}if(j<100.0){e=1;break}h[29067]=99.99;e=1}}while(0);a[232600]=e;i=d;return 1}function sE(b){b=+b;var d=0,e=0.0,f=0;d=i;e=b<0.0?1.0:b;if(+h[29061]==e){i=d;return}if(a[232528]|0){a[232528]=0;f=c[10030]|0;aI(125976,2,1,f|0)}cf(c[10030]|0,124896,(v=i,i=i+8|0,h[v>>3]=e,v)|0);h[29061]=e;i=d;return}function sF(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0;j=i;k=b>>4;l=b&15;if(a[232528]|0){a[232528]=0;b=c[10030]|0;aI(125976,2,1,b|0)}if((l|0)==0){b=c[10030]|0;m=+(d>>>0>>>0)/10.0;n=+(e>>>0>>>0)/10.0;o=+((f+d|0)>>>0>>>0)/10.0;p=+((g+e|0)>>>0>>>0)/10.0;cf(b|0,125216,(v=i,i=i+64|0,h[v>>3]=m,h[v+8>>3]=n,h[v+16>>3]=o,h[v+24>>3]=n,h[v+32>>3]=o,h[v+40>>3]=p,h[v+48>>3]=m,h[v+56>>3]=p,v)|0);i=j;return}else if((l|0)==2|(l|0)==5){q=k*12&-1}else{q=k}if((q|0)<100){p=+(100-q|0)*.01;q=c[10030]|0;m=1.0-p;cf(q|0,126664,(v=i,i=i+16|0,h[v>>3]=m,h[v+8>>3]=p,v)|0);a[232608]=1}else{q=c[10030]|0;aI(126536,25,1,q|0)}p=+(d>>>0>>>0)/10.0;m=+(e>>>0>>>0)/10.0;o=+((f+d|0)>>>0>>>0)/10.0;n=+((g+e|0)>>>0>>>0)/10.0;cf(c[10030]|0,124968,(v=i,i=i+64|0,h[v>>3]=p,h[v+8>>3]=m,h[v+16>>3]=o,h[v+24>>3]=m,h[v+32>>3]=o,h[v+40>>3]=n,h[v+48>>3]=p,h[v+56>>3]=n,v)|0);i=j;return}function sG(b){b=+b;var d=0,e=0;d=i;if(+h[29062]==b){i=d;return}if(a[232528]|0){a[232528]=0;e=c[10030]|0;aI(125976,2,1,e|0)}cf(c[10030]|0,125384,(v=i,i=i+8|0,h[v>>3]=b,v)|0);h[29062]=b;i=d;return}function sH(b){b=b|0;var d=0,e=0,f=0.0,g=0,j=0.0,k=0,l=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0;d=i;i=i+24|0;e=d|0;f=+h[b+8>>3];a[232608]=1;if(a[232528]|0){a[232528]=0;g=c[10030]|0;aI(125976,2,1,g|0)}if(!(a[232616]|0)){j=f<.001?0.0:f;g=c[10030]|0;cf(g|0,125848,(v=i,i=i+8|0,h[v>>3]=j,v)|0);i=d;return}g=b|0;k=c[g>>2]|0;if((k|0)==1){l=c[b+4>>2]|0;if((l|0)>7){m=(l|0)%8&-1}else{m=l}do{if((m|0)==-1){l=c[10030]|0;aI(125736,21,1,l|0)}else{if((m|0)<=-1){break}l=c[10030]|0;cf(l|0,125576,(v=i,i=i+8|0,c[v>>2]=m,v)|0)}}while(0);n=c[g>>2]|0}else{n=k}if((n|0)==5){k=c[5169]|0;do{if((k|0)==0){o=f}else{j=+(k|0);if(f>=+(k-1|0)/j){o=1.0;break}o=+O(+(f*j))/j}}while(0);fq(o,e);p=+h[e>>3]}else if((n|0)==3){n=c[b+4>>2]|0;o=+(n>>>16&255|0)/255.0;h[e>>3]=o;h[e+8>>3]=+(n>>>8&255|0)/255.0;h[e+16>>3]=+(n&255|0)/255.0;p=o}else{i=d;return}n=e|0;if(p<1.0e-4){h[n>>3]=0.0}b=e+8|0;p=+h[b>>3];if(p<1.0e-4){h[b>>3]=0.0;q=0.0}else{q=p}b=e+16|0;p=+h[b>>3];if(p<1.0e-4){h[b>>3]=0.0;r=0.0}else{r=p}cf(c[10030]|0,125464,(v=i,i=i+24|0,h[v>>3]=+h[n>>3],h[v+8>>3]=q,h[v+16>>3]=r,v)|0);i=d;return}function sI(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0,p=0,q=0;e=i;f=c[d+8>>2]|0;g=f>>4;j=f&15;if(a[232528]|0){a[232528]=0;f=c[10030]|0;aI(125976,2,1,f|0)}if((j|0)==0){f=c[10030]|0;aI(126768,23,1,f|0)}else if((j|0)==1|(j|0)==4){k=g;l=19531}else if((j|0)==2|(j|0)==5){k=g*12&-1;l=19531}do{if((l|0)==19531){if((k|0)<100){m=+(100-k|0)*.01;g=c[10030]|0;n=1.0-m;cf(g|0,126664,(v=i,i=i+16|0,h[v>>3]=n,h[v+8>>3]=m,v)|0);break}else{g=c[10030]|0;aI(126536,25,1,g|0);break}}}while(0);aI(126432,5,1,c[10030]|0);k=c[10030]|0;if((b|0)<=0){o=k;p=aI(126072,27,1,o|0)|0;i=e;return}l=b-1|0;g=0;j=k;while(1){m=+(c[d+(g*12&-1)+4>>2]|0)/10.0;k=g+1|0;if((g|0)<(l|0)){q=((k|0)%5&-1|0)==0?126232:126152}else{q=126152}cf(j|0,126296,(v=i,i=i+24|0,h[v>>3]=+(c[d+(g*12&-1)>>2]|0)/10.0,h[v+8>>3]=m,c[v+16>>2]=q,v)|0);f=c[10030]|0;if((k|0)<(b|0)){g=k;j=f}else{o=f;break}}p=aI(126072,27,1,o|0)|0;i=e;return}function sJ(){var b=0,d=0,e=0,f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0.0,T=0,U=0,V=0,W=0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ab=0.0,ac=0,ad=0,ae=0,af=0;b=i;i=i+1184|0;d=b|0;e=b+8|0;f=b+32|0;j=b+56|0;k=b+1112|0;l=b+1120|0;m=b+1128|0;n=b+80|0;uE(n|0,0,1025);o=c[13898]|0;p=c[8272]|0;L26069:do{if((o|0)<(p|0)){q=f|0;r=f+8|0;s=m|0;t=e|0;u=e+8|0;w=m+50|0;x=o;y=p;L26071:while(1){z=c[1054]|0;A=(a[z+(x*40&-1)|0]&1)==0;L26073:do{if(!A){B=c[z+(x*40&-1)+36>>2]|0;C=z+(x*40&-1)+32|0;D=c[10036]|0;E=0;while(1){if((E|0)>=(B|0)){break}if((a[D+((c[C>>2]|0)+E|0)|0]|0)==(a[E+103664|0]|0)){E=E+1|0}else{break L26073}}if((E|0)==1){break L26069}}}while(0);C=c[60336]|0;L26080:do{if((C|0)==0){F=241344}else{D=c[z+(x*40&-1)+36>>2]|0;B=c[z+(x*40&-1)+32>>2]|0;G=(D|0)>0;H=c[10036]|0;I=241344;J=C;while(1){L26084:do{if(!A){if(G){K=0;L=0;M=B;while(1){N=a[J+K|0]|0;if(N<<24>>24==(a[H+(K+M|0)|0]|0)){O=M;P=L}else{if(N<<24>>24!=36){break L26084}O=M-1|0;P=1}Q=K+1|0;if((Q|0)<(P+D|0)){K=Q;L=P;M=O}else{break}}if((P|0)==0){R=Q}else{F=I;break L26080}}else{R=0}M=a[J+R|0]|0;if((M<<24>>24|0)==36|(M<<24>>24|0)==0){F=I;break L26080}}}while(0);M=I+8|0;L=c[M>>2]|0;if((L|0)==0){F=M;break}else{I=M;J=L}}}}while(0);A=c[F+4>>2]|0;L26097:do{if((A|0)==21){c[13898]=x+1;C=is(j)|0;J=c[C>>2]|0;if((J|0)==2){S=+h[C+8>>3]}else if((J|0)==3){S=+uz(c[C+8>>2]|0,0)}else if((J|0)==1){S=+(c[C+8>>2]|0)}else{T=19615;break L26071}h[30158]=S}else if((A|0)==7){U=x+1|0;c[13898]=U;if((U|0)>=(y|0)){V=U;T=19660;break L26071}L26106:do{if((a[z+(U*40&-1)|0]&1)!=0){C=c[z+(U*40&-1)+36>>2]|0;J=z+(U*40&-1)+32|0;I=c[10036]|0;D=0;while(1){if((D|0)>=(C|0)){break}if((a[I+((c[J>>2]|0)+D|0)|0]|0)==(a[D+103664|0]|0)){D=D+1|0}else{break L26106}}if((D|0)==1){V=U;T=19662;break L26071}}}while(0);a[14176]=1;is(f);a[14176]=0;if((c[q>>2]|0)!=3){T=19578;break L26071}J=c[r>>2]|0;if((J|0)==0){T=19580;break L26071}I=c[60308]|0;if((I|0)!=0){uu(I);c[60308]=0}if((a[J]|0)==0){uu(J);break}else{c[60308]=J;break}}else if((A|0)==4){c[13898]=x+1;a[241228]=1}else if((A|0)==27){uE(s|0,0,51);J=x+1|0;c[13898]=J;if((J|0)>=(y|0)){break}L26124:do{if((a[z+(J*40&-1)|0]&1)!=0){I=c[z+(J*40&-1)+36>>2]|0;C=z+(J*40&-1)+32|0;H=c[10036]|0;B=0;while(1){if((B|0)>=(I|0)){break}if((a[H+((c[C>>2]|0)+B|0)|0]|0)==(a[B+103664|0]|0)){B=B+1|0}else{break L26124}}if((B|0)==1){break L26097}}}while(0);a[14176]=1;is(e);a[14176]=0;if((c[t>>2]|0)!=3){c[13898]=J;break}C=c[u>>2]|0;if((C|0)==0){break}h[d>>3]=0.0;H=bh(C|0,44)|0;if((H|0)==0){W=uA(C|0)|0;X=0.0}else{I=H+1|0;ca(I|0,148448,(v=i,i=i+8|0,c[v>>2]=d,v)|0);W=H-C|0;X=+h[d>>3]}H=W>>>0>50?50:W;uD(s|0,C|0,H);a[m+H|0]=0;uF(241280,s|0,51);a[w]=0;uu(C);if(X>0.0){h[30167]=X;break}if(X>=0.0){break}h[30167]=12.0}else if((A|0)==11){c[13898]=x+1;a[241237]=1}else if((A|0)==16){c[13898]=x+1;c[60311]=0}else if((A|0)==18){c[13898]=x+1;c[60311]=2}else if((A|0)==1){c[13898]=x+1;C=s4(k,l,2)|0;Y=+(c[10032]|0);Z=+g[k>>2]/Y;h[30151]=Z;_=+g[l>>2]/Y;h[30152]=_;c[60306]=C;if((C|0)!=2){break}h[30151]=Z*2.54;h[30152]=_*2.54}else if((A|0)==19){c[13898]=x+1;C=is(j)|0;H=c[C>>2]|0;if((H|0)==3){$=+uz(c[C+8>>2]|0,0)}else if((H|0)==1){$=+(c[C+8>>2]|0)}else if((H|0)==2){$=+h[C+8>>3]}else{T=19603;break L26071}h[30156]=$}else if((A|0)==0){c[13898]=x+1;C=c[60308]|0;if((C|0)!=0){uu(C);c[60308]=0}uD(241208,241072,136)}else if((A|0)==25){uh(x,134168,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((A|0)==10){c[13898]=x+1;a[241236]=0;C=(c[3524]|0)+96|0;c[C>>2]=c[C>>2]|1024}else if((A|0)==22){c[13898]=x+1;c[60318]=0}else if((A|0)==17){c[13898]=x+1;c[60311]=1}else if((A|0)==2){c[13898]=x+1;h[30151]=5.0;h[30152]=3.0;c[60306]=1}else if((A|0)==3){c[13898]=x+1;a[241228]=0}else if((A|0)==26){c[13898]=x+1;a[241280]=0;h[30167]=12.0}else if((A|0)==8){c[13898]=x+1;C=c[60308]|0;if((C|0)==0){break}uu(C);c[60308]=0}else if((A|0)==14){c[13898]=x+1;c[60310]=1}else if((A|0)==13){c[13898]=x+1;c[60310]=0}else if((A|0)==6){c[13898]=x+1;a[241229]=0}else if((A|0)==20){c[13898]=x+1;C=is(j)|0;H=c[C>>2]|0;if((H|0)==1){aa=+(c[C+8>>2]|0)}else if((H|0)==3){aa=+uz(c[C+8>>2]|0,0)}else if((H|0)==2){aa=+h[C+8>>3]}else{T=19609;break L26071}h[30157]=aa}else if((A|0)==12){c[13898]=x+1;a[241237]=0}else if((A|0)==23){c[13898]=x+1;c[60318]=1}else if((A|0)==5){c[13898]=x+1;a[241229]=1}else if((A|0)==24){c[13898]=x+1;c[60319]=0}else if((A|0)==9){c[13898]=x+1;a[241236]=1;C=(c[3524]|0)+96|0;c[C>>2]=c[C>>2]&-1025}else if((A|0)==15){c[13898]=x+1;c[60310]=2}else{T=19639;break L26071}}while(0);A=c[13898]|0;z=c[8272]|0;if((A|0)<(z|0)){x=A;y=z}else{break L26069}}if((T|0)==19578){c[13898]=U;V=U;uf(V,134392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((T|0)==19639){uf(x,134056,(v=i,i=i+8|0,c[v>>2]=c[c[3524]>>2],v)|0)}else if((T|0)==19603){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((T|0)==19660){uf(V,134392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((T|0)==19662){uf(V,134392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((T|0)==19615){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((T|0)==19580){V=c[13898]|0;uf(V,134392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((T|0)==19609){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}}while(0);aa=+h[30167];h[30211]=aa;c[(c[3524]|0)+16>>2]=~~(aa*2540.0/72.27*+h[30158]+.5);T=c[3524]|0;c[T+20>>2]=~~(+((c[T+16>>2]|0)>>>0>>>0)*.4895+.5);aa=+h[30151];if((c[60306]|0)==1){c[(c[3524]|0)+8>>2]=~~(aa*2540.0+.5);c[(c[3524]|0)+12>>2]=~~(+h[30152]*2540.0+.5)}else{c[(c[3524]|0)+8>>2]=~~(aa*1.0e3+.5);c[(c[3524]|0)+12>>2]=~~(+h[30152]*1.0e3+.5)}T=(c[60306]|0)==1?145600:145440;aa=+h[30152];V=(a[241228]&1)!=0?133784:133640;U=(a[241229]&1)!=0?133504:133320;j=(c[60308]|0)==0?133016:132832;a0(13048,1025,133912,(v=i,i=i+56|0,h[v>>3]=+h[30151],c[v+8>>2]=T,h[v+16>>3]=aa,c[v+24>>2]=T,c[v+32>>2]=V,c[v+40>>2]=U,c[v+48>>2]=j,v)|0);if((c[60308]|0)!=0){j=1025-(uA(13048)|0)|0;ck(13048,132696,j|0);j=c[60308]|0;U=1025-(uA(13048)|0)|0;ck(13048,j|0,U|0);U=1025-(uA(13048)|0)|0;ck(13048,132584,U|0)}U=(a[241236]&1)!=0?132472:132384;ck(13048,U|0,1025-(uA(13048)|0)|0);U=c[60310]|0;if((U|0)==1){j=1025-(uA(13048)|0)|0;ck(13048,132112,j|0)}else if((U|0)==0){ck(13048,132272,1025-(uA(13048)|0)|0)}else if((U|0)==2){ck(13048,132032,1025-(uA(13048)|0)|0)}U=c[60311]|0;if((U|0)==0){j=1025-(uA(13048)|0)|0;ck(13048,137232,j|0)}else if((U|0)==2){ck(13048,137168,1025-(uA(13048)|0)|0)}else if((U|0)==1){ck(13048,131936,1025-(uA(13048)|0)|0)}aa=+h[30156];$=+h[30157];X=+h[30158];a0(n|0,1025,131664,(v=i,i=i+32|0,c[v>>2]=(a[241237]&1)!=0?131584:131504,h[v+8>>3]=aa,h[v+16>>3]=$,h[v+24>>3]=X,v)|0);ck(13048,n|0,1025-(uA(13048)|0)|0);U=c[60318]|0;if((U|0)==1){j=1025-(uA(13048)|0)|0;ck(13048,131408,j|0);ab=+h[30167];ac=a0(n|0,1025,131176,(v=i,i=i+16|0,c[v>>2]=241280,h[v+8>>3]=ab,v)|0)|0;ad=uA(13048)|0;ae=1025-ad|0;af=ck(13048,n|0,ae|0)|0;i=b;return}else if((U|0)==0){ck(13048,131240,1025-(uA(13048)|0)|0);ab=+h[30167];ac=a0(n|0,1025,131176,(v=i,i=i+16|0,c[v>>2]=241280,h[v+8>>3]=ab,v)|0)|0;ad=uA(13048)|0;ae=1025-ad|0;af=ck(13048,n|0,ae|0)|0;i=b;return}else{ab=+h[30167];ac=a0(n|0,1025,131176,(v=i,i=i+16|0,c[v>>2]=241280,h[v+8>>3]=ab,v)|0)|0;ad=uA(13048)|0;ae=1025-ad|0;af=ck(13048,n|0,ae|0)|0;i=b;return}}function sK(a){a=a|0;c[60468]=a;return 1}function sL(a){a=a|0;c[60416]=a;return 1}function sM(a){a=a|0;if((a|0)!=0){c[60410]=a}return 0}function sN(){var b=0,d=0,e=0,f=0,g=0.0,j=0.0;b=i;i=i+112|0;d=b|0;cG(d|0);c[60256]=0;c[60258]=0;c[60266]=0;a[241056]=0;c[60464]=0;c[60418]=0;cf(c[10030]|0,140680,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);do{if((a[241229]&1)!=0){e=b+8|0;if((bw(e|0,100,140512,aN(d|0)|0)|0)==0){break}f=c[10030]|0;cf(f|0,140320,(v=i,i=i+8|0,c[v>>2]=e,v)|0)}}while(0);aF(10,c[10030]|0);cf(c[10030]|0,139952,(v=i,i=i+40|0,c[v>>2]=40152,c[v+8>>2]=40160,c[v+16>>2]=240968,c[v+24>>2]=103960,c[v+32>>2]=240976,v)|0);cf(c[10030]|0,139760,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);if((a[241228]&1)==0){i=b;return}if((c[11252]|0)==15){d=c[10030]|0;aI(139560,25,1,d|0)}aI(139312,24,1,c[10030]|0);if((a[241236]&1)!=0){d=c[10030]|0;aI(139136,30,1,d|0)}d=c[60308]|0;if((d|0)!=0){e=c[10030]|0;cf(e|0,154696,(v=i,i=i+8|0,c[v>>2]=d,v)|0)}g=+h[30167];if(g==12.0){j=g}else{d=c[10030]|0;cf(d|0,138800,(v=i,i=i+8|0,h[v>>3]=g,v)|0);j=+h[30167]}d=(a[241280]|0)!=0?148464:179864;cf(c[10030]|0,138568,(v=i,i=i+24|0,c[v>>2]=241280,c[v+8>>2]=d,h[v+16>>3]=j,v)|0);aI(138336,39,1,c[10030]|0);aI(138080,9,1,c[10030]|0);d=c[60310]|0;if((d|0)==1){e=c[10030]|0;aI(137776,7,1,e|0)}else if((d|0)==2){aI(137632,7,1,c[10030]|0)}else if((d|0)==0){aI(137912,7,1,c[10030]|0)}cf(c[10030]|0,137496,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);aI(137328,12,1,c[10030]|0);d=c[60311]|0;if((d|0)==1){e=c[10030]|0;aI(137776,7,1,e|0)}else if((d|0)==2){aI(137168,7,1,c[10030]|0)}else if((d|0)==0){aI(137232,4,1,c[10030]|0)}cf(c[10030]|0,137008,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);cf(c[10030]|0,136744,(v=i,i=i+8|0,c[v>>2]=(a[241237]&1)!=0?136424:136208,v)|0);cf(c[10030]|0,136008,(v=i,i=i+8|0,h[v>>3]=+h[30156],v)|0);cf(c[10030]|0,135744,(v=i,i=i+8|0,h[v>>3]=+h[30157],v)|0);cf(c[10030]|0,135608,(v=i,i=i+8|0,h[v>>3]=+h[30158],v)|0);cf(c[10030]|0,135456,(v=i,i=i+8|0,c[v>>2]=(c[60318]|0)==0?135312:135192,v)|0);cf(c[10030]|0,134944,(v=i,i=i+8|0,c[v>>2]=(c[60418]|0)==0?134816:134640,v)|0);aI(134536,13,1,c[10030]|0);i=b;return}function sO(){var b=0;b=c[10030]|0;if((a[241228]&1)==0){aI(140840,10,1,b|0);return}else{aI(140968,10,1,b|0);return}}function sP(){var b=0;if((c[60266]|0)!=0){s2()}aI(141472,55,1,c[10030]|0);b=c[10030]|0;if((a[241228]&1)==0){aI(141112,20,1,b|0);return}else{aI(141320,17,1,b|0);return}}function sQ(){var b=0,d=0,e=0,f=0,g=0.0,j=0.0,k=0.0,l=0,m=0;b=i;d=(a[241228]&1)==0;e=c[10030]|0;f=(c[60464]|0)+1|0;c[60464]=f;if(d){cf(e|0,146344,(v=i,i=i+8|0,c[v>>2]=f,v)|0)}else{cf(e|0,146528,(v=i,i=i+8|0,c[v>>2]=f,v)|0)}cf(c[10030]|0,146160,(v=i,i=i+8|0,c[v>>2]=40152,v)|0);cf(c[10030]|0,145992,(v=i,i=i+8|0,c[v>>2]=240968,v)|0);g=+h[30151];f=(c[60306]|0)==1;j=f?2.54:1.0;k=+h[30152];e=f?145600:145440;cf(c[10030]|0,145792,(v=i,i=i+48|0,h[v>>3]=g*j,h[v+8>>3]=k*j,h[v+16>>3]=g,c[v+24>>2]=e,h[v+32>>3]=k,c[v+40>>2]=e,v)|0);e=c[10030]|0;if((c[60418]|0)==0){cf(e|0,145080,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{cf(e|0,144816,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}cf(c[10030]|0,144624,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);cf(c[10030]|0,144392,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);cf(c[10030]|0,144624,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);cf(c[10030]|0,144136,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);cf(c[10030]|0,144008,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);cf(c[10030]|0,143912,(v=i,i=i+8|0,h[v>>3]=+h[30158],v)|0);cf(c[10030]|0,143832,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);cf(c[10030]|0,143688,(v=i,i=i+8|0,h[v>>3]=+h[30204],v)|0);cf(c[10030]|0,143472,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);cf(c[10030]|0,143328,(v=i,i=i+8|0,h[v>>3]=+h[30206],v)|0);cf(c[10030]|0,143184,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);cf(c[10030]|0,144624,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);if(!(a[31104]|0)){c[60414]=-3;c[60256]=0;c[60258]=0;c[60266]=0;a[241056]=0;i=b;return}e=c[60410]|0;if((e|0)==0){c[60414]=-3;c[60256]=0;c[60258]=0;c[60266]=0;a[241056]=0;i=b;return}aI(143016,16,1,c[10030]|0);f=c[5163]|0;if((f|0)==103){d=c[10030]|0;aI(142832,16,1,d|0)}else if((f|0)==114){d=c[5165]|0;l=c[5166]|0;cf(c[10030]|0,142624,(v=i,i=i+24|0,c[v>>2]=c[5164],c[v+8>>2]=d,c[v+16>>2]=l,v)|0)}else if((f|0)==100){aI(142352,21,1,c[10030]|0);l=c[e+44>>2]|0;d=c[e+40>>2]|0;aI(142248,7,1,c[10030]|0);if((d|0)>0){e=0;do{if((e|0)>0){m=c[10030]|0;aF(44,m|0)}k=+h[l+(e<<5)+16>>3];g=+h[l+(e<<5)+24>>3];cf(c[10030]|0,142144,(v=i,i=i+24|0,h[v>>3]=+h[l+(e<<5)+8>>3],h[v+8>>3]=k,h[v+16>>3]=g,v)|0);e=e+1|0;}while((e|0)<(d|0));aI(142e3,12,1,c[10030]|0);e=0;do{if((e|0)>0){m=c[10030]|0;aF(44,m|0)}cf(c[10030]|0,141840,(v=i,i=i+8|0,h[v>>3]=+h[l+(e<<5)>>3],v)|0);e=e+1|0;}while((e|0)<(d|0))}else{aI(142e3,12,1,c[10030]|0)}aF(41,c[10030]|0)}else if((f|0)==102){aI(142512,21,1,c[10030]|0)}aI(150696,3,1,c[10030]|0);c[60414]=-3;c[60256]=0;c[60258]=0;c[60266]=0;a[241056]=0;i=b;return}function sR(a,b){a=a|0;b=b|0;if((c[60258]|0)==(a|0)&(c[60256]|0)==(b|0)){return}if((c[60266]|0)!=0){s2()}c[60258]=a;c[60256]=b;return}function sS(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0.0,m=0.0,n=0,o=0;e=i;f=c[60258]|0;g=c[60256]|0;j=c[60266]|0;k=(j|0)==0;if((f|0)==(b|0)&(g|0)==(d|0)){if(!k){i=e;return}a[241056]=1;i=e;return}if(k){a[241056]=0;c[60262]=f;c[60260]=g;c[60266]=2;k=c[10030]|0;l=+(f|0)*.001;m=+(g|0)*.001;cf(k|0,146712,(v=i,i=i+16|0,h[v>>3]=l,h[v+8>>3]=m,v)|0)}else{if((j&3|0)==2){j=c[10030]|0;aI(152656,3,1,j|0);c[60266]=2;n=c[60258]|0;o=c[60256]|0}else{n=f;o=g}g=c[10030]|0;m=+(n|0)*.001;l=+(o|0)*.001;cf(g|0,152248,(v=i,i=i+16|0,h[v>>3]=m,h[v+8>>3]=l,v)|0)}c[60258]=b;c[60256]=d;c[60266]=(c[60266]|0)+1;i=e;return}function sT(b){b=b|0;var d=0;d=i;do{if((c[60414]|0)==(b|0)){if(a[241864]|0){break}i=d;return}}while(0);if((c[60266]|0)!=0){s2()}cf(c[10030]|0,146984,(v=i,i=i+8|0,c[v>>2]=b,v)|0);c[60414]=b;a[241864]=0;i=d;return}function sU(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0;f=i;i=i+32|0;g=f|0;uD(g|0,240992,30);if((e|0)==0){i=f;return}if((a[e]|0)==0){i=f;return}if((c[60266]|0)!=0){s2()}j=c[60416]|0;if((j|0)==2){k=2}else if((j|0)==0){k=1}else{k=0}j=e;while(1){if((a[j]|0)!=32){break}j=j+1|0}cf(c[10030]|0,148128,(v=i,i=i+16|0,h[v>>3]=+(b>>>0>>>0)*.001,h[v+8>>3]=+(d>>>0>>>0)*.001,v)|0);d=c[60468]|0;if((d|0)!=0){b=c[10030]|0;cf(b|0,147984,(v=i,i=i+8|0,c[v>>2]=d,v)|0)}cf(c[10030]|0,147776,(v=i,i=i+8|0,c[v>>2]=g+(k*10&-1),v)|0);if((a[241696]|0)!=0){k=c[10030]|0;cf(k|0,147528,(v=i,i=i+8|0,c[v>>2]=241696,v)|0)}cf(c[10030]|0,147256,(v=i,i=i+8|0,c[v>>2]=j,v)|0);i=f;return}function sV(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=i;if((c[60266]|0)!=0){s2()}cf(c[10030]|0,148360,(v=i,i=i+24|0,h[v>>3]=+(a>>>0>>>0)*.001,h[v+8>>3]=+(b>>>0>>>0)*.001,c[v+16>>2]=d,v)|0);i=e;return}function sW(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;lD(a,b,c,d,e);return}function sX(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0.0,m=0;d=i;i=i+64|0;e=d|0;f=d+8|0;g=f|0;uE(g|0,0,51);h[e>>3]=0.0;j=bh(b|0,44)|0;if((j|0)==0){k=uA(b|0)|0;l=0.0}else{m=j+1|0;ca(m|0,148448,(v=i,i=i+8|0,c[v>>2]=e,v)|0);k=j-b|0;l=+h[e>>3]}h[30210]=l;e=k>>>0>50?50:k;uD(241800,b|0,e);a[e+241800|0]=0;uF(241696,241800,101);l=+h[30210];do{if(l>0.0){h[30211]=l;a0(g|0,51,148688,(v=i,i=i+8|0,h[v>>3]=l,v)|0);e=101-(uA(241696)|0)|0;ck(241696,g|0,e|0);a[f+50|0]=0}else{if(l!=0.0){break}h[30211]=+h[30167]}}while(0);c[(c[3524]|0)+16>>2]=~~(+h[30211]*2540.0/72.27*+h[30158]+.5);f=c[3524]|0;c[f+20>>2]=~~(+((c[f+16>>2]|0)>>>0>>>0)*.4895+.5);l=+h[30151];if((c[60306]|0)==1){c[(c[3524]|0)+8>>2]=~~(l*2540.0+.5);c[(c[3524]|0)+12>>2]=~~(+h[30152]*2540.0+.5);i=d;return 1}else{c[(c[3524]|0)+8>>2]=~~(l*1.0e3+.5);c[(c[3524]|0)+12>>2]=~~(+h[30152]*1.0e3+.5);i=d;return 1}return 0}function sY(a){a=+a;var b=0;b=i;if(+h[30204]==a){i=b;return}if((c[60266]|0)!=0){s2()}cf(c[10030]|0,148808,(v=i,i=i+8|0,h[v>>3]=a,v)|0);h[30204]=a;i=b;return}function sZ(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;g=i;if((c[60266]|0)!=0){s2()}cf(c[10030]|0,148936,(v=i,i=i+32|0,h[v>>3]=+(e>>>0>>>0)*.001,h[v+8>>3]=+(f>>>0>>>0)*.001,h[v+16>>3]=+(b>>>0>>>0)*.001,h[v+24>>3]=+(d>>>0>>>0)*.001,v)|0);s3(a);i=g;return}function s_(a){a=+a;var b=0,d=0.0;b=i;d=a<0.0?1.0:a;if(+h[30206]==d){i=b;return}if((c[60266]|0)!=0){s2()}cf(c[10030]|0,149264,(v=i,i=i+8|0,h[v>>3]=d,v)|0);h[30206]=d;i=b;return}function s$(b){b=b|0;var d=0,e=0,f=0,g=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0,o=0,p=0,q=0,r=0.0,s=0,t=0.0;d=i;i=i+24|0;e=d|0;if((c[60266]|0)!=0){s2()}f=c[b>>2]|0;if((f|0)==3){g=c[b+4>>2]|0;j=+(g>>>16&255|0)/255.0;k=+(g>>>8&255|0)/255.0;l=+(g&255|0)/255.0;g=c[10030]|0;cf(g|0,149808,(v=i,i=i+24|0,h[v>>3]=j,h[v+8>>3]=k,h[v+16>>3]=l,v)|0);a[241864]=1;i=d;return}else if((f|0)==5){l=+h[b+8>>3];k=l<0.0?0.0:l;l=k>1.0?1.0:k;cf(c[10030]|0,149664,(v=i,i=i+8|0,h[v>>3]=l,v)|0);g=c[5168]|0;L26414:do{if((g|0)==0){m=l}else{k=+O(+(+(g|0)*l))/+(g-1|0);if((c[5163]|0)!=100){m=k;break}n=c[5172]|0;if((n|0)<3&k==0.0){m=k;break}o=c[5173]|0;p=0;j=k;while(1){if((p|0)>=(n|0)){m=j;break L26414}k=+h[o+(p<<5)>>3];q=p+1|0;r=+h[o+(q<<5)>>3];s=r>l;do{if(k<=l&s){if(!(jr)){t=j;break}t=(k+r)*.5}else{t=j}}while(0);if(s){m=t;break}else{p=q;j=t}}}}while(0);fq(m,e);m=+h[e+8>>3];t=+h[e+16>>3];cf(c[10030]|0,149808,(v=i,i=i+24|0,h[v>>3]=+h[e>>3],h[v+8>>3]=m,h[v+16>>3]=t,v)|0);a[241864]=1;i=d;return}else if((f|0)==1){cf(c[10030]|0,150024,(v=i,i=i+8|0,c[v>>2]=c[b+4>>2],v)|0);a[241864]=1;i=d;return}else{uh(-1,149512,(v=i,i=i+8|0,c[v>>2]=f,v)|0);i=d;return}}function s0(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0.0;d=i;if((a|0)<3){i=d;return}if((c[60266]|0)!=0){s2()}e=b|0;f=a-1|0;g=b+4|0;if((c[e>>2]|0)==(c[b+(f*12&-1)>>2]|0)){j=(c[g>>2]|0)==(c[b+(f*12&-1)+4>>2]|0)?f:a}else{j=a}aI(153544,5,1,c[10030]|0);k=+(c[g>>2]|0)*.001;cf(c[10030]|0,153096,(v=i,i=i+16|0,h[v>>3]=+(c[e>>2]|0)*.001,h[v+8>>3]=k,v)|0);if((j|0)>1){e=1;do{if((e&3|0)==0){g=c[10030]|0;aI(152656,3,1,g|0)}k=+(c[b+(e*12&-1)+4>>2]|0)*.001;cf(c[10030]|0,152248,(v=i,i=i+16|0,h[v>>3]=+(c[b+(e*12&-1)>>2]|0)*.001,h[v+8>>3]=k,v)|0);e=e+1|0;}while((e|0)<(j|0))}aI(151984,9,1,c[10030]|0);s3(c[b+8>>2]|0);i=d;return}function s1(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0.0,x=0.0,y=0.0,z=0,A=0,B=0,C=0.0,D=0,E=0.0,F=0,G=0.0,H=0,I=0;g=i;i=i+24|0;j=g|0;k=e+24|0;l=e|0;do{if((c[k>>2]|0)>(c[l>>2]|0)){m=19853}else{if((c[e+4>>2]|0)>(c[e+28>>2]|0)){m=19853;break}if((c[e+12>>2]|0)>(c[e+36>>2]|0)){m=19853;break}if((c[e+40>>2]|0)>(c[e+16>>2]|0)){m=19853}else{n=0}}}while(0);if((m|0)==19853){n=1}if((c[60418]|0)==1){i=g;return}do{if((f|0)==0){m=c[10030]|0;cf(m|0,159568,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);m=aa(b,a);if((m|0)!=0){o=j|0;p=j+8|0;q=j+16|0;r=0;s=0;while(1){if((s|0)>15){t=c[10030]|0;cf(t|0,158976,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);u=1}else{u=s+1|0}w=+h[d+(r<<3)>>3];t=c[5168]|0;L26467:do{if((t|0)==0){x=w}else{y=+O(+(w*+(t|0)))/+(t-1|0);if((c[5163]|0)!=100){x=y;break}z=c[5172]|0;if((z|0)<3&y==0.0){x=y;break}A=c[5173]|0;B=0;C=y;while(1){if((B|0)>=(z|0)){x=C;break L26467}y=+h[A+(B<<5)>>3];D=B+1|0;E=+h[A+(D<<5)>>3];F=E>w;do{if(y<=w&F){if(!(CE)){G=C;break}G=(y+E)*.5}else{G=C}}while(0);if(F){x=G;break}else{B=D;C=G}}}}while(0);fq(x,j);t=~~(+h[p>>3]*255.0)&255;B=~~(+h[q>>3]*255.0)&255;cf(c[10030]|0,158504,(v=i,i=i+24|0,c[v>>2]=~~(+h[o>>3]*255.0)&255,c[v+8>>2]=t,c[v+16>>2]=B,v)|0);B=r+1|0;if(B>>>0>>0){r=B;s=u}else{break}}}s=c[10030]|0;aI(157888,3,1,s|0)}else{s=(f|0)==2;r=s?4:3;m=c[10030]|0;cf(m|0,159568,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);m=aa(b,a);o=(m|0)==0;if(!o){q=0;p=0;while(1){if((p|0)>15){B=c[10030]|0;cf(B|0,158976,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);H=1}else{H=p+1|0}B=aa(q,r);cf(c[10030]|0,155792,(v=i,i=i+8|0,c[v>>2]=~~(+h[d+(B<<3)>>3]*255.0)&255,v)|0);cf(c[10030]|0,155792,(v=i,i=i+8|0,c[v>>2]=~~(+h[d+(B+1<<3)>>3]*255.0)&255,v)|0);cf(c[10030]|0,155792,(v=i,i=i+8|0,c[v>>2]=~~(+h[d+(B+2<<3)>>3]*255.0)&255,v)|0);B=q+1|0;if(B>>>0>>0){q=B;p=H}else{break}}}p=c[10030]|0;aI(157888,3,1,p|0);if(!s){break}p=c[10030]|0;cf(p|0,154920,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);if(!o){p=0;q=0;while(1){if((q|0)>47){B=c[10030]|0;cf(B|0,158976,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);I=1}else{I=q+1|0}B=c[10030]|0;t=~~(+h[d+(aa(p,r)+3<<3)>>3]*255.0)&255;cf(B|0,155792,(v=i,i=i+8|0,c[v>>2]=t,v)|0);t=p+1|0;if(t>>>0>>0){p=t;q=I}else{break}}}q=c[10030]|0;aI(157888,3,1,q|0)}}while(0);if(n){I=c[10030]|0;aI(154584,14,1,I|0)}I=c[l>>2]|0;x=+((c[e+12>>2]|0)-I|0)*.001;l=c[e+16>>2]|0;G=+((c[e+4>>2]|0)-l|0)*.001;cf(c[10030]|0,154224,(v=i,i=i+48|0,c[v>>2]=b,c[v+8>>2]=a,h[v+16>>3]=x,h[v+24>>3]=G,h[v+32>>3]=+(I|0)*.001,h[v+40>>3]=+(l|0)*.001,v)|0);if(!n){i=g;return}n=c[k>>2]|0;k=c[e+40>>2]|0;G=+((c[e+28>>2]|0)-k|0)*.001;cf(c[10030]|0,153832,(v=i,i=i+32|0,h[v>>3]=+((c[e+36>>2]|0)-n|0)*.001,h[v+8>>3]=G,h[v+16>>3]=+(n|0)*.001,h[v+24>>3]=+(k|0)*.001,v)|0);i=g;return}function s2(){var b=0,d=0,e=0.0,f=0.0,g=0,j=0;b=i;if(a[241056]|0){d=c[10030]|0;e=+(c[60258]|0)*.001;f=+(c[60256]|0)*.001;cf(d|0,150512,(v=i,i=i+16|0,h[v>>3]=e,h[v+8>>3]=f,v)|0);a[241056]=0;c[60266]=0;i=b;return}d=c[60258]|0;g=c[60256]|0;j=c[10030]|0;if((d|0)==(c[60262]|0)&(g|0)==(c[60260]|0)){aI(150352,21,1,j|0);c[60266]=0;i=b;return}else{f=+(d|0)*.001;e=+(g|0)*.001;cf(j|0,150176,(v=i,i=i+16|0,h[v>>3]=f,h[v+8>>3]=e,v)|0);c[60266]=0;i=b;return}}function s3(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0.0;b=i;d=a>>4;e=(d|0)<0?0:d;f=(e|0)>100?100:e;aI(151736,9,1,c[10030]|0);e=a&15;if((e|0)==1){g=19900}else if((e|0)==5){aI(151568,12,1,c[10030]|0);g=19903}else if((e|0)==2){g=19903}else if((e|0)==4){aI(151568,12,1,c[10030]|0);g=19900}else if((e|0)!=3){aI(150840,11,1,c[10030]|0)}do{if((g|0)==19900){if((f|0)>=100){break}e=c[10030]|0;j=+(f|0)*.01;cf(e|0,151328,(v=i,i=i+8|0,h[v>>3]=j,v)|0)}else if((g|0)==19903){cf(c[10030]|0,151024,(v=i,i=i+8|0,c[v>>2]=d,v)|0)}}while(0);aI(150696,3,1,c[10030]|0);i=b;return}function s4(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0,u=0,w=0,x=0,y=0,z=0,A=0.0,B=0.0,C=0,D=0.0,E=0,F=0,G=0.0,H=0.0,I=0,J=0.0;f=i;i=i+48|0;j=f|0;k=f+24|0;l=c[13898]|0;if((l|0)>=(c[8272]|0)){uf(l,131024,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}m=c[1054]|0;L26528:do{if((a[m+(l*40&-1)|0]&1)!=0){n=c[m+(l*40&-1)+36>>2]|0;o=m+(l*40&-1)+32|0;p=c[10036]|0;q=0;while(1){if((q|0)>=(n|0)){break}if((a[p+((c[o>>2]|0)+q|0)|0]|0)==(a[q+103664|0]|0)){q=q+1|0}else{break L26528}}if((q|0)!=1){break}uf(l,131024,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}}while(0);l=is(k)|0;m=c[l>>2]|0;if((m|0)==1){r=+(c[l+8>>2]|0)}else if((m|0)==3){r=+uz(c[l+8>>2]|0,0)}else if((m|0)==2){r=+h[l+8>>3]}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}l=k|0;if((c[l>>2]|0)==3){uu(c[k+8>>2]|0);c[l>>2]=1}s=r;g[b>>2]=s;l=c[13898]|0;k=c[1054]|0;m=c[k+(l*40&-1)+36>>2]|0;o=c[k+(l*40&-1)+32>>2]|0;p=(a[k+(l*40&-1)|0]&1)==0;L26545:do{if((m|0)>0&(p^1)){k=c[10036]|0;n=0;t=0;u=o;while(1){if((a[n+130912|0]|0)==(a[k+(n+u|0)|0]|0)){w=u;x=t}else{if((n|0)!=2){y=19929;break L26545}w=u-1|0;x=1}z=n+1|0;if((z|0)<(x+m|0)){n=z;t=x;u=w}else{break}}if((x|0)==0){if(!((n|0)==6|(n|0)==1)){y=19929;break}}c[13898]=l+1;A=+g[b>>2];y=19936}else{y=19929}}while(0);do{if((y|0)==19929){L26559:do{if((c[8272]|0)<=(l|0)|p){y=19935}else{x=c[10036]|0;w=0;while(1){if((w|0)>=(m|0)){break}if((a[x+(o+w|0)|0]|0)==(a[w+145440|0]|0)){w=w+1|0}else{y=19935;break L26559}}if((w|0)!=2){y=19935;break}c[13898]=l+1;B=+g[b>>2]}}while(0);if((y|0)==19935){if((e|0)==1){A=s;y=19936;break}else if((e|0)==2){B=s}else{C=e;break}}g[b>>2]=+(c[10032]|0)/2.54*B;C=2}}while(0);if((y|0)==19936){g[b>>2]=A*+(c[10032]|0);C=1}e=c[13898]|0;l=e+1|0;c[13898]=l;if((c[8272]|0)<=(e|0)){uf(l,131024,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}o=c[1054]|0;if((a[o+(e*40&-1)|0]&1)==0){uf(l,131024,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}m=c[o+(e*40&-1)+36>>2]|0;p=o+(e*40&-1)+32|0;e=c[10036]|0;o=0;while(1){if((o|0)>=(m|0)){break}if((a[e+((c[p>>2]|0)+o|0)|0]|0)==(a[o+148464|0]|0)){o=o+1|0}else{y=19976;break}}if((y|0)==19976){uf(l,131024,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}if((o|0)!=1){uf(l,131024,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}l=is(j)|0;o=c[l>>2]|0;if((o|0)==2){D=+h[l+8>>3]}else if((o|0)==3){D=+uz(c[l+8>>2]|0,0)}else if((o|0)==1){D=+(c[l+8>>2]|0)}else{uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}l=j|0;if((c[l>>2]|0)==3){uu(c[j+8>>2]|0);c[l>>2]=1}A=D;g[d>>2]=A;l=c[13898]|0;j=c[1054]|0;o=c[j+(l*40&-1)+36>>2]|0;p=c[j+(l*40&-1)+32>>2]|0;e=(a[j+(l*40&-1)|0]&1)==0;L26596:do{if((o|0)>0&(e^1)){j=c[10036]|0;m=0;n=0;x=p;while(1){if((a[m+130912|0]|0)==(a[j+(m+x|0)|0]|0)){E=x;F=n}else{if((m|0)!=2){y=19961;break L26596}E=x-1|0;F=1}u=m+1|0;if((u|0)<(F+o|0)){m=u;n=F;x=E}else{break}}if((F|0)==0){if(!((m|0)==6|(m|0)==1)){y=19961;break}}c[13898]=l+1;G=+g[d>>2];y=19968}else{y=19961}}while(0);do{if((y|0)==19961){L26610:do{if((c[8272]|0)<=(l|0)|e){y=19967}else{F=c[10036]|0;E=0;while(1){if((E|0)>=(o|0)){break}if((a[F+(p+E|0)|0]|0)==(a[E+145440|0]|0)){E=E+1|0}else{y=19967;break L26610}}if((E|0)!=2){y=19967;break}c[13898]=l+1;H=+g[d>>2]}}while(0);if((y|0)==19967){if((C|0)==1){G=A;y=19968;break}else if((C|0)==2){H=A}else{I=C;J=A;break}}D=+(c[10032]|0)/2.54*H;g[d>>2]=D;I=2;J=D}}while(0);if((y|0)==19968){H=G*+(c[10032]|0);g[d>>2]=H;I=1;J=H}if(+g[b>>2]<1.0|J<1.0){uf(c[13898]|0,130744,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else{i=f;return I|0}return 0}function s5(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0,u=0.0,w=0,x=0.0,y=0;j=i;k=e-b|0;l=f-d|0;if((e|0)==(b|0)){m=c[10030]|0;n=(h|0)!=0?101096:101088;o=l>>31|1;p=(l|0)>-1?l:-l|0;cf(m|0,101128,(v=i,i=i+40|0,c[v>>2]=e,c[v+8>>2]=d,c[v+16>>2]=n,c[v+24>>2]=o,c[v+32>>2]=p,v)|0);i=j;return}if((f|0)==(d|0)){p=c[10030]|0;o=(h|0)!=0?101096:101088;n=k>>31|1;m=(k|0)>-1?k:-k|0;cf(p|0,101032,(v=i,i=i+40|0,c[v>>2]=b,c[v+8>>2]=f,c[v+16>>2]=o,c[v+24>>2]=n,c[v+32>>2]=m,v)|0);i=j;return}q=+(l|0)/+(k|0);if(q<0.0){r=-0.0-q}else{r=q}q=0.0;m=233040;n=0;o=1;while(1){s=r- +(c[m+4>>2]|0)/+(o|0);if((n|0)==0){t=19990}else{if(s<0.0){u=-0.0-s}else{u=s}if(u=0.0){w=m;x=s;break}w=m;x=-0.0-s}}while(0);p=m+8|0;y=c[p>>2]|0;if((y|0)==0){break}else{q=x;m=p;n=w;o=y}}if(x==0.0){o=c[10030]|0;n=(h|0)!=0?101096:101088;m=aa(c[w>>2]|0,k>>31|1);t=aa(c[w+4>>2]|0,l>>31|1);y=(k|0)>-1?k:-k|0;cf(o|0,100984,(v=i,i=i+48|0,c[v>>2]=b,c[v+8>>2]=d,c[v+16>>2]=n,c[v+24>>2]=m,c[v+32>>2]=t,c[v+40>>2]=y,v)|0);i=j;return}do{if(a[45024]|0){q9(0);if(!(a[233344]|0)){y=c[10030]|0;cf(y|0,100208,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=d,v)|0)}y=c[10030]|0;cf(y|0,100168,(v=i,i=i+16|0,c[v>>2]=e,c[v+8>>2]=f,v)|0);c[58302]=e;c[58300]=f;a[233344]=1}else{if((g|0)==1){q9(0);s6(b,e,d,f);break}if(a[239320]|0){y=c[10030]|0;aF(10,y|0);a[239320]=0}c[59764]=b;c[59762]=d;rr(e,f)}}while(0);if((h|0)==0){i=j;return}h=c[10030]|0;d=aa(c[w>>2]|0,k>>31|1);k=aa(c[w+4>>2]|0,l>>31|1);cf(h|0,100952,(v=i,i=i+32|0,c[v>>2]=e,c[v+8>>2]=f,c[v+16>>2]=d,c[v+24>>2]=k,v)|0);i=j;return}function s6(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var j=0,k=0,l=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ab=0.0,ac=0.0,ad=0.0;j=i;k=(b|0)==(d|0);l=(e|0)==(f|0);m=a[233344]|0;if(k&l){if(m){i=j;return}s7(2,0.0,0.0,0.0,0.0);n=c[10030]|0;cf(n|0,100920,(v=i,i=i+24|0,c[v>>2]=b,c[v+8>>2]=e,c[v+16>>2]=100896,v)|0);i=j;return}n=m&1;a[233344]=1;if(k){o=+(e|0);s7(n,+(b|0),o,+g[58368],+(f|0)-o);i=j;return}if(l){o=+(b|0);s7(n,o,+(e|0),+(d|0)-o,+g[58368]);i=j;return}o=+(d|0);p=+(b|0);q=o-p;r=+(f|0);s=+(e|0);t=r-s;u=t/q;n=u>=0.0;if(n){w=u}else{w=-0.0-u}if(w<=1.0){l=q>=0.0;if(l){x=q}else{x=-0.0-q}if(n){y=u}else{y=-0.0-u}w=+g[58368];z=w;if(x<(1.0/y+.25)*z){if(l){A=q}else{A=-0.0-q}B=A}else{if(n){C=u}else{C=-0.0-u}B=(1.0/C+.25)*z}C=B;k=t>=0.0;if(k){D=t}else{D=-0.0-t}m=w=0.0;if(k){H=E}else{H=-0.0-E}if(H*2.0+.5<1.0){G=20046;break}if(k){I=E}else{I=-0.0-E}k=~~(I*2.0+.5);if((k|0)==1){G=20046;break}A=E/+(k|0);y=(q-(l?1.0:-1.0)*C)/+(k-1|0);m=c[10030]|0;x=y;if(y<0.0){J=p-C}else{J=p}K=J;if(A<0.0){L=-0.0-A}else{L=A}M=s-(L-D)*.5;N=A;A=B;O=L*.24089999999999998;cf(m|0,100624,(v=i,i=i+56|0,h[v>>3]=K,h[v+8>>3]=M,h[v+16>>3]=x,h[v+24>>3]=N,c[v+32>>2]=k,h[v+40>>3]=A,h[v+48>>3]=O,v)|0);P=y}}while(0);if((G|0)==20046){l=c[10030]|0;k=(d|0)>=(b|0)?b:d;L=(s+r-w)*.5;w=B;B=z*.24089999999999998;cf(l|0,100728,(v=i,i=i+32|0,c[v>>2]=k,h[v+8>>3]=L,h[v+16>>3]=w,h[v+24>>3]=B,v)|0);P=q}B=C*.5;C=q-B*(P>=0.0?1.0:-1.0);k=c[10030]|0;P=C;if(C<0.0){Q=p-B}else{Q=p}C=Q;Q=+g[58368];w=s-Q*.5;L=t;z=B*.24089999999999998;B=Q*.24089999999999998;cf(k|0,100464,(v=i,i=i+48|0,h[v>>3]=C,h[v+8>>3]=w,h[v+16>>3]=P,h[v+24>>3]=L,h[v+32>>3]=z,h[v+40>>3]=B,v)|0);a[233344]=0;i=j;return}k=t>=0.0;if(k){R=t}else{R=-0.0-t}if(n){S=u}else{S=-0.0-u}B=+g[58368];z=B;if(R<(S+.25)*z){if(k){T=t}else{T=-0.0-t}U=T}else{if(n){V=u}else{V=-0.0-u}U=(V+.25)*z}V=U;n=q>=0.0;if(n){W=q}else{W=-0.0-q}l=B=0.0;if(n){Z=X}else{Z=-0.0-X}if(Z*2.0+.5<1.0){G=20079;break}if(n){_=X}else{_=-0.0-X}n=~~(_*2.0+.5);if((n|0)==1){G=20079;break}u=X/+(n|0);T=(t-(k?1.0:-1.0)*V)/+(n-1|0);l=c[10030]|0;d=u>=0.0;if(d){$=u}else{$=-0.0-u}S=p-($-W)*.5;if(T<0.0){aa=s-V}else{aa=s}R=aa;L=u;P=T;if(d){ab=u}else{ab=-0.0-u}u=ab*.24089999999999998;w=U;cf(l|0,100624,(v=i,i=i+56|0,h[v>>3]=S,h[v+8>>3]=R,h[v+16>>3]=L,h[v+24>>3]=P,c[v+32>>2]=n,h[v+40>>3]=u,h[v+48>>3]=w,v)|0);ac=T}}while(0);if((G|0)==20079){G=c[10030]|0;ab=(p+o-B)*.5;k=(f|0)>=(e|0)?e:f;B=z*.24089999999999998;z=U;cf(G|0,100408,(v=i,i=i+32|0,h[v>>3]=ab,c[v+8>>2]=k,h[v+16>>3]=B,h[v+24>>3]=z,v)|0);ac=t}z=V*.5;V=t-z*(ac>=0.0?1.0:-1.0);ac=+g[58368];if(V<0.0){ad=s-z}else{ad=s}cf(c[10030]|0,100464,(v=i,i=i+48|0,h[v>>3]=p-ac*.5,h[v+8>>3]=ad,h[v+16>>3]=q,h[v+24>>3]=V,h[v+32>>3]=ac*.24089999999999998,h[v+40>>3]=z*.24089999999999998,v)|0);a[233344]=0;i=j;return}function s7(b,d,e,f,j){b=b|0;d=+d;e=+e;f=+f;j=+j;var k=0,l=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0;k=i;l=(b|0)==2;do{if(l){if(a[233176]|0){m=20111}}else{if(f==0.0|j==0.0){i=k;return}n=a[233176]|0;if((b|0)!=1|n^1){if(n){m=20111;break}else{m=20118;break}}do{if((~~+g[58288]|0)==(~~d|0)){if(+g[58290]!=f){m=20105;break}o=+g[58292];if(o*j<0.0){break}g[58292]=o+j;i=k;return}else{m=20105}}while(0);do{if((m|0)==20105){if((~~+g[58286]|0)!=(~~e|0)){break}if(+g[58292]!=j){break}o=+g[58290];if(o*f<0.0){break}g[58290]=o+f;i=k;return}}while(0);if(n){m=20111}else{m=20118}}}while(0);do{if((m|0)==20111){o=+g[58290];if(o<0.0){g[58288]=o+ +g[58288];p=-0.0-o;g[58290]=p;q=p}else{q=o}o=+g[58292];if(o<0.0){g[58286]=o+ +g[58286];p=-0.0-o;g[58292]=p;r=p}else{r=o}o=+g[58368];b=c[10030]|0;p=+g[58288];s=+g[58286];if(q>3]=p,h[v+8>>3]=s,c[v+16>>2]=100896,v)|0);m=20118;break}else{t=(-0.0-o)*.24089999999999998*.5;o=q*.24089999999999998;u=r*.24089999999999998;cf(b|0,100288|0,(v=i,i=i+40|0,h[v>>3]=p,h[v+8>>3]=s,h[v+16>>3]=t,h[v+24>>3]=o,h[v+32>>3]=u,v)|0);m=20118;break}}}while(0);do{if((m|0)==20118){if(l){break}g[58288]=d;g[58286]=e;g[58290]=f;g[58292]=j;a[233176]=1;i=k;return}}while(0);a[233176]=0;i=k;return}function s8(a){a=a|0;var b=0,d=0;b=i;d=~~(+(a|0)*1.4142);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=0,c[v+8>>2]=d,v)|0);a=-d|0;cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=0,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=0,c[v+8>>2]=a,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=d,c[v+8>>2]=0,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=0,c[v+8>>2]=d,v)|0);aI(99872,14,1,c[10030]|0);i=b;return}function s9(a){a=a|0;var b=0,d=0;b=i;cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=0,c[v+8>>2]=a,v)|0);d=-a|0;cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=0,c[v+8>>2]=d,v)|0);aI(99872,14,1,c[10030]|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=0,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=d,c[v+8>>2]=0,v)|0);aI(99872,14,1,c[10030]|0);i=b;return}function ta(a){a=a|0;var b=0,d=0;b=i;cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=a,v)|0);d=-a|0;cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=d,c[v+8>>2]=a,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=d,c[v+8>>2]=d,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=d,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=a,v)|0);aI(99872,14,1,c[10030]|0);i=b;return}function tb(a){a=a|0;var b=0,d=0;b=i;d=~~(+(a|0)/1.4142);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=d,c[v+8>>2]=d,v)|0);a=-d|0;cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=a,v)|0);aI(99872,14,1,c[10030]|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=d,c[v+8>>2]=a,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=d,v)|0);aI(99872,14,1,c[10030]|0);i=b;return}function tc(a){a=a|0;var b=0,d=0,e=0;b=i;d=~~(+(a|0)/1.6119);a=~~(+(d|0)*1.7321);e=-d<<1;cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=0,c[v+8>>2]=e,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=-a,c[v+8>>2]=d,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=d,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=0,c[v+8>>2]=e,v)|0);aI(99872,14,1,c[10030]|0);i=b;return}function td(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=(a|0)/2&-1;a=~~(+(d|0)*1.7321);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=0,c[v+8>>2]=d<<1,v)|0);e=-d|0;cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=0,c[v+8>>2]=e<<1,v)|0);aI(99872,14,1,c[10030]|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=d,v)|0);f=-a|0;cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=f,c[v+8>>2]=e,v)|0);aI(99872,14,1,c[10030]|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=e,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=f,c[v+8>>2]=d,v)|0);aI(99872,14,1,c[10030]|0);i=b;return}function te(a){a=a|0;var b=0;b=i;cf(c[10030]|0,99888,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=a,v)|0);i=b;return}function tf(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=(a|0)/2&-1;a=~~(+(d|0)*1.7321);e=d<<1;cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=0,c[v+8>>2]=e,v)|0);f=-a|0;cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=f,c[v+8>>2]=d,v)|0);g=-d|0;cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=f,c[v+8>>2]=g,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=0,c[v+8>>2]=g<<1,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=g,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=d,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=0,c[v+8>>2]=e,v)|0);aI(99872,14,1,c[10030]|0);i=b;return}function tg(a){a=a|0;var b=0,d=0;b=i;cf(c[10030]|0,99888,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=a,v)|0);cf(c[10030]|0,99984,(v=i,i=i+8|0,h[v>>3]=0.0,v)|0);d=(a|0)/2&-1;cf(c[10030]|0,99888,(v=i,i=i+16|0,c[v>>2]=d,c[v+8>>2]=d,v)|0);i=b;return}function th(a){a=a|0;var b=0;b=i;cf(c[10030]|0,99888,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=a,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=0,c[v+8>>2]=a,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=0,c[v+8>>2]=-a,v)|0);aI(99872,14,1,c[10030]|0);i=b;return}function ti(a){a=a|0;var b=0;b=i;cf(c[10030]|0,99888,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=a,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=0,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=-a,c[v+8>>2]=0,v)|0);aI(99872,14,1,c[10030]|0);i=b;return}function tj(a){a=a|0;var b=0,d=0;b=i;cf(c[10030]|0,99888,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=a,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=0,c[v+8>>2]=a,v)|0);d=-a|0;cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=0,c[v+8>>2]=d,v)|0);aI(99872,14,1,c[10030]|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=0,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=d,c[v+8>>2]=0,v)|0);aI(99872,14,1,c[10030]|0);i=b;return}function tk(a){a=a|0;var b=0,d=0;b=i;cf(c[10030]|0,99888,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=a,v)|0);d=~~(+(a|0)/1.4142);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=d,c[v+8>>2]=d,v)|0);a=-d|0;cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=a,v)|0);aI(99872,14,1,c[10030]|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=d,c[v+8>>2]=a,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=d,v)|0);aI(99872,14,1,c[10030]|0);i=b;return}function tl(a){a=a|0;var b=0;b=i;cf(c[10030]|0,99888,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=a,v)|0);td(a);i=b;return}function tm(a){a=a|0;var b=0,d=0;b=i;cf(c[10030]|0,99888,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=a,v)|0);cf(c[10030]|0,99984,(v=i,i=i+8|0,h[v>>3]=1.0,v)|0);d=(a|0)/2&-1;cf(c[10030]|0,99888,(v=i,i=i+16|0,c[v>>2]=d,c[v+8>>2]=d,v)|0);i=b;return}function tn(a){a=a|0;var b=0,d=0;b=i;cf(c[10030]|0,99888,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=a,v)|0);cf(c[10030]|0,99984,(v=i,i=i+8|0,h[v>>3]=1.0,v)|0);d=~~(+(~~(+(a|0)/1.5)|0)*1.4142);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=0,c[v+8>>2]=d,v)|0);a=-d|0;cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=0,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=0,c[v+8>>2]=a,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=d,c[v+8>>2]=0,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=0,c[v+8>>2]=d,v)|0);aI(99872,14,1,c[10030]|0);i=b;return}function to(a){a=a|0;var b=0,d=0;b=i;cf(c[10030]|0,99888,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=a,v)|0);cf(c[10030]|0,99984,(v=i,i=i+8|0,h[v>>3]=1.0,v)|0);d=~~(+(a|0)/1.5);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=d,c[v+8>>2]=d,v)|0);a=-d|0;cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=d,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=a,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=d,c[v+8>>2]=a,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=d,c[v+8>>2]=d,v)|0);aI(99872,14,1,c[10030]|0);i=b;return}function tp(a){a=a|0;var b=0,d=0,e=0;b=i;cf(c[10030]|0,99888,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=a,v)|0);cf(c[10030]|0,99984,(v=i,i=i+8|0,h[v>>3]=1.0,v)|0);d=~~(+(~~(+(a|0)/1.5)|0)/1.6119);a=~~(+(d|0)*1.7321);e=-d<<1;cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=0,c[v+8>>2]=e,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=-a,c[v+8>>2]=d,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=d,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=0,c[v+8>>2]=e,v)|0);aI(99872,14,1,c[10030]|0);i=b;return}function tq(a){a=a|0;var b=0;b=i;cf(c[10030]|0,99888,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=a,v)|0);cf(c[10030]|0,99984,(v=i,i=i+8|0,h[v>>3]=1.0,v)|0);tf(~~(+(a|0)/1.2));i=b;return}function tr(a){a=a|0;var b=0,d=0;b=i;cf(c[10030]|0,99888,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=a,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=0,c[v+8>>2]=a,v)|0);d=-a|0;cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=0,c[v+8>>2]=d,v)|0);aI(99872,14,1,c[10030]|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=0,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=d,c[v+8>>2]=0,v)|0);aI(99872,14,1,c[10030]|0);d=~~(+(a|0)/1.4142);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=d,c[v+8>>2]=d,v)|0);a=-d|0;cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=a,v)|0);aI(99872,14,1,c[10030]|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=d,c[v+8>>2]=a,v)|0);cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=d,v)|0);aI(99872,14,1,c[10030]|0);i=b;return}function ts(){var b=0,d=0,e=0,f=0.0,g=0;b=i;if(!(a[4192]|0)){i=b;return}if((c[918]|0)>0){d=0;do{e=-(c[32124+(d<<3)>>2]|0)|0;cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=c[32120+(d<<3)>>2],c[v+8>>2]=e,v)|0);aI(99440,2,1,c[10030]|0);d=d+1|0;}while((d|0)<(c[918]|0))}d=(c[916]|0)+2|0;e=c[3684+(d*12&-1)>>2]|0;if((e|0)==1){f=+h[523]}else if((e|0)==3){f=+h[523]*3.0}else if((e|0)==2){f=+h[523]*2.0}else{f=1.0}e=c[3688+(d*12&-1)>>2]|0;if((e|0)==1){d=c[10030]|0;cf(d|0,99448,(v=i,i=i+8|0,h[v>>3]=f,v)|0)}else if((e|0)==3){cf(c[10030]|0,99480,(v=i,i=i+8|0,h[v>>3]=f,v)|0);if((c[918]|0)>0){d=0;do{g=-(c[32124+(d<<3)>>2]|0)|0;cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=c[32120+(d<<3)>>2],c[v+8>>2]=g,v)|0);aI(99440,2,1,c[10030]|0);d=d+1|0;}while((d|0)<(c[918]|0))}cf(c[10030]|0,99448,(v=i,i=i+8|0,h[v>>3]=f*.5,v)|0)}else if((e|0)==0){aI(99872,14,1,c[10030]|0)}else if((e|0)==4){cf(c[10030]|0,99480,(v=i,i=i+8|0,h[v>>3]=f,v)|0);if((c[918]|0)>0){d=0;do{g=-(c[32124+(d<<3)>>2]|0)|0;cf(c[10030]|0,99784,(v=i,i=i+16|0,c[v>>2]=c[32120+(d<<3)>>2],c[v+8>>2]=g,v)|0);aI(99440,2,1,c[10030]|0);d=d+1|0;}while((d|0)<(c[918]|0))}cf(c[10030]|0,99448,(v=i,i=i+8|0,h[v>>3]=f/3.0,v)|0)}else if((e|0)==2){cf(c[10030]|0,99480,(v=i,i=i+8|0,h[v>>3]=f,v)|0)}a[4192]=0;i=b;return}function tt(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;b=i;if(!(a[46624]|0)){i=b;return}d=c[9372]|0;cf(c[10030]|0,84056,(v=i,i=i+16|0,c[v>>2]=25936,c[v+8>>2]=d,v)|0);d=(c[9372]|0)-1|0;e=c[10030]|0;if((d|0)>0){f=0;g=e;while(1){h=c[2264+(f<<2)>>2]|0;cf(g|0,84280,(v=i,i=i+16|0,c[v>>2]=c[2664+(f<<2)>>2],c[v+8>>2]=h,v)|0);h=f+1|0;if((h&7|0)==0){j=c[10030]|0;aI(84248,2,1,j|0)}j=(c[9372]|0)-1|0;k=c[10030]|0;if((h|0)<(j|0)){f=h;g=k}else{l=j;m=k;break}}}else{l=d;m=e}e=c[2264+(l<<2)>>2]|0;d=c[768]|0;g=c[774]|0;f=c[770]|0;cf(m|0,84016,(v=i,i=i+40|0,c[v>>2]=c[2664+(l<<2)>>2],c[v+8>>2]=e,c[v+16>>2]=d,c[v+24>>2]=g,c[v+32>>2]=f,v)|0);c[774]=(c[774]|0)+1;a[46624]=0;c[9372]=0;f=c[10030]|0;if((f|0)==0){i=b;return}aD(f|0);i=b;return}function tu(){var b=0,e=0,f=0,g=0,j=0,k=0,l=0;b=i;if(a[228352]|0){e=c[10030]|0;aI(78232,6,1,e|0);a[228352]=0}if(a[228344]|0){i=b;return}e=c[57144]|0;if((e|0)>12){f=(e|0)%13&-1}else{f=e}e=f+3|0;cf(c[10030]|0,75352,(v=i,i=i+8|0,c[v>>2]=227016+(((e|0)<0?0:e<<16>>16)<<4),v)|0);e=a[228528]|0;do{if(e<<24>>24==3){f=c[10030]|0;g=d[226992]|0;j=d[228368]|0;k=d[228536]|0;cf(f|0,75328,(v=i,i=i+24|0,c[v>>2]=g,c[v+8>>2]=j,c[v+16>>2]=k,v)|0)}else{k=c[10030]|0;if(e<<24>>24==1){j=c[57082]|0;aK(j|0,k|0);break}else{aI(75272,12,1,k|0);break}}}while(0);e=c[57144]|0;if((e|0)>12){l=(e|0)%13&-1}else{l=e}e=l+3|0;l=a[226984]|0;cf(c[10030]|0,75208,(v=i,i=i+24|0,h[v>>3]=+h[227008+(((e|0)<0?0:e<<16>>16)<<4)>>3]*+h[28540],c[v+8>>2]=l?131936:137232,c[v+16>>2]=l?131936:75184,v)|0);aI(75104,3,1,c[10030]|0);a[228344]=1;i=b;return}function tv(b,e){b=b|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0.0;f=i;g=a[227272]|0;do{if((c[56816]|0)>>>0>512){if(!g){j=20201;break}if(a[228352]|0){k=c[10030]|0;aI(78232,6,1,k|0);a[228352]=0}k=c[10030]|0;aI(78240,9,1,k|0);c[56816]=0;a[227272]=0;j=20201}else{if(!g){j=20201}}}while(0);if((j|0)==20201){if(a[228352]|0){g=c[10030]|0;aI(78232,6,1,g|0);a[228352]=0}g=c[10030]|0;aI(73816,7,1,g|0);g=a[228528]|0;if((g<<24>>24|0)==3){k=c[10030]|0;l=d[226992]|0;m=d[228368]|0;n=d[228536]|0;cf(k|0,73768,(v=i,i=i+24|0,c[v>>2]=l,c[v+8>>2]=m,c[v+16>>2]=n,v)|0)}else if((g<<24>>24|0)==1){cf(c[10030]|0,73752,(v=i,i=i+8|0,c[v>>2]=c[57082],v)|0)}g=c[57144]|0;do{if(a[228520]|0){n=(g|0)%5&-1;if((n|0)<=0){j=20209;break}m=c[10030]|0;l=c[228496+(n<<2)>>2]|0;cf(m|0,73720,(v=i,i=i+8|0,c[v>>2]=l,v)|0)}else{j=20209}}while(0);do{if((j|0)==20209){if((g|0)!=-1){break}l=c[10030]|0;cf(l|0,73720,(v=i,i=i+8|0,c[v>>2]=73656,v)|0)}}while(0);if(a[228360]|0){g=c[10030]|0;aI(73696,17,1,g|0)}g=c[10030]|0;aI(73688,4,1,g|0);a[227272]=1}o=+((c[(c[3524]|0)+12>>2]|0)-e|0)/10.0;cf(c[10030]|0,73840,(v=i,i=i+16|0,h[v>>3]=+(b>>>0>>>0)/10.0,h[v+8>>3]=o,v)|0);g=(c[56816]|0)+1|0;c[56816]=g;if((g&7|0)!=0){c[56740]=b;c[56736]=e;i=f;return}aI(73904,3,1,c[10030]|0);c[56740]=b;c[56736]=e;i=f;return}function tw(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0.0,j=0,k=0,l=0.0;f=i;g=+h[28552];uu(c[59466]|0);j=c[57108]|0;if((j|0)==0){k=0}else{k=bP(j|0)|0}c[59466]=k;if((a[37456]&1)!=0){a[237856]=0;qg(b,d,e);i=f;return}a[237856]=1;qg(b,d,e);a[237856]=0;if((aQ(e|0,74128)|0)!=0){a[237872]=1}c[59472]=0;h[5613]=1.0;uF(44912,216760,16);d=e;do{e=lJ(d,1,c[59466]|0,g,0.0,1,1,0)|0;if((a[e]|0)==0){break}cS[c[(c[3524]|0)+160>>2]&511]();if((a[e]|0)==125){uh(-1,203744,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{uh(-1,203528,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}d=e+1|0;}while((a[d]|0)!=0);uu(c[57108]|0);c[57108]=c[59466];c[59466]=0;l=+h[29737];if(+h[28552]!=g|l!=0.0){d=c[10030]|0;cf(d|0,216688,(v=i,i=i+16|0,h[v>>3]=g,h[v+8>>3]=l,v)|0);h[28552]=g;h[29737]=0.0}a[237872]=0;aI(73992,14,1,c[10030]|0);i=f;return}function tx(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0;h=i;j=(a[(c[7118]|0)+16|0]&1)!=0?179864:74128;cf(c[10028]|0,212640,(v=i,i=i+8|0,c[v>>2]=j,v)|0);if((c[5163]|0)==103){k=c[10028]|0;cf(k|0,212480,(v=i,i=i+8|0,c[v>>2]=j,v)|0)}k=e|0;l=c[k>>2]|0;m=e+4|0;n=c[m>>2]|0;cf(c[10028]|0,212456,(v=i,i=i+24|0,c[v>>2]=j,c[v+8>>2]=l,c[v+16>>2]=n,v)|0);n=(c[e+12>>2]|0)-(c[k>>2]|0)|0;k=(c[e+16>>2]|0)-(c[m>>2]|0)|0;cf(c[10028]|0,212400,(v=i,i=i+24|0,c[v>>2]=j,c[v+8>>2]=n,c[v+16>>2]=k,v)|0);k=g&65535;cf(c[10028]|0,212384,(v=i,i=i+32|0,c[v>>2]=j,c[v+8>>2]=b,c[v+16>>2]=d,c[v+24>>2]=k,v)|0);cf(c[10028]|0,212328,(v=i,i=i+24|0,c[v>>2]=j,c[v+8>>2]=b,c[v+16>>2]=d,v)|0);g=c[10028]|0;if((a[(c[7118]|0)+16|0]&1)==0){aI(211992,36,1,g|0)}else{n=(aa(aa(aa(d,b),k),(f|0)==1?3:1)+7|0)>>>3;cf(g|0,212216,(v=i,i=i+8|0,c[v>>2]=n,v)|0);n=c[10028]|0;aI(212128,41,1,n|0)}n=c[10028]|0;if((f|0)==1){cf(n|0,211968,(v=i,i=i+16|0,c[v>>2]=j,c[v+8>>2]=j,v)|0);i=h;return}else{cf(n|0,211952,(v=i,i=i+8|0,c[v>>2]=j,v)|0);i=h;return}}function ty(){aK(208808,c[10028]|0);aK(208736,c[10028]|0);aK(208680,c[10028]|0);aK(208648,c[10028]|0);aK(208592,c[10028]|0);aK(208408,c[10028]|0);aK(208344,c[10028]|0);aK(208256,c[10028]|0);aK(208200,c[10028]|0);aK(208152,c[10028]|0);aK(208136,c[10028]|0);aK(208080,c[10028]|0);aK(208024,c[10028]|0);aK(207952,c[10028]|0);return}function tz(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;e=(aY(b|0,215352)|0)==0?77280:b;b=231040;while(1){f=c[b>>2]|0;if((f|0)==0){break}if((aY(c[f>>2]|0,e|0)|0)==0){g=20276;break}else{b=f+4|0}}if((g|0)==20276){i=d;return}if((cy(e|0,215312)|0)!=0){i=d;return}g=ut(8)|0;do{if((g|0)==0){gk();b=ut(8)|0;if((b|0)!=0){h=b;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=215288,v)|0)}else{h=g}}while(0);if((e|0)==0){j=0}else{j=bP(e|0)|0}e=h;c[e>>2]=j;c[h+4>>2]=c[57760];c[57760]=h;h=c[11252]|0;if((h|0)==5){k=214984}else if((h|0)==13){k=214760}else if((h|0)==9){k=214840}else if((h|0)==1|(h|0)==15){k=215232}else if((h|0)==10){k=214816}else if((h|0)==4){k=215016}else if((h|0)==2){k=215152}else if((h|0)==7){k=214920}else if((h|0)==6){k=214944}else if((h|0)==3|(h|0)==11){k=215072}else if((h|0)==12){k=214864}else{i=d;return}if(a[237912]|0){h=c[10028]|0;aI(215624,3,1,h|0);a[237912]=0}cf(c[10028]|0,214648,(v=i,i=i+16|0,c[v>>2]=c[e>>2],c[v+8>>2]=k,v)|0);i=d;return}function tA(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;g=i;cf(c[10028]|0,208848,(v=i,i=i+8|0,c[v>>2]=b,v)|0);if((e|0)<=0){j=c[10028]|0;k=aI(208840,6,1,j|0)|0;i=g;return}l=(uA(b|0)|0)+4|0;b=0;while(1){be(25336,141840,(v=i,i=i+8|0,h[v>>3]=+(~~(+h[(d+(b<<5)|0)+f>>3]*1.0e4+.5)|0)*1.0e-4,v)|0);m=(a[25336]|0)==48&(a[25337]|0)==46?25337:25336;n=(l+1|0)+(uA(m|0)|0)|0;if((n|0)>77){o=c[10028]|0;aI(152656,3,1,o|0);p=(uA(m|0)|0)+3|0}else{p=n}cf(c[10028]|0,73368,(v=i,i=i+8|0,c[v>>2]=m,v)|0);m=b+1|0;if((m|0)<(e|0)){l=p;b=m}else{break}}j=c[10028]|0;k=aI(208840,6,1,j|0)|0;i=g;return}function tB(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,j=0,k=0,l=0.0;f=i;if((a[37456]&1)!=0){pO(b,d,e);i=f;return}if((a[e]|0)==0){i=f;return}if((c[7116]|0)!=0){j=c[10028]|0;aI(215952,7,1,j|0);c[7116]=0;a[228944]=0}pG(b,d);d=c[7230]|0;if((d|0)!=0){b=c[10028]|0;cf(b|0,199456,(v=i,i=i+8|0,c[v>>2]=d,v)|0)}aI(199448,2,1,c[10028]|0);h[5612]=-1.0e3;h[5611]=1.0e3;h[5613]=+g[(c[7118]|0)+92>>2]*10.0;uF(44912,199440,16);a[237912]=0;d=e;do{e=lJ(d,1,28840,+g[7208]*+g[(c[7118]|0)+92>>2]*10.0,0.0,1,1,0)|0;b=a[e]|0;if(b<<24>>24==0){break}if(a[237912]|0){j=c[10028]|0;aI(215624,3,1,j|0);a[237912]=0;k=a[e]|0}else{k=b}if(k<<24>>24==125){uh(-1,203744,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{uh(-1,203528,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}d=e+1|0;}while((a[d]|0)!=0);l=+h[5611]+ +h[5612];h[5612]=l;cf(c[10028]|0,199384,(v=i,i=i+8|0,h[v>>3]=(-0.0-l)/3.0,v)|0);d=c[7198]|0;if((d|0)==1){k=c[10028]|0;aI(199288,7,1,k|0)}else if((d|0)==0){aI(199360,7,1,c[10028]|0)}else if((d|0)==2){aI(199240,7,1,c[10028]|0)}if((c[7230]|0)!=0){d=c[10028]|0;aI(212688,9,1,d|0)}c[7116]=0;a[228944]=0;i=f;return}function tC(b){b=b|0;var d=0,e=0,f=0.0,h=0.0,j=0,k=0.0;d=i;if((a[37456]&1)!=0){pL(b);i=d;return 1}if((a[b]|0)==0){e=(c[7118]|0)+36|0;uB(28840,e|0);f=+g[7202];g[7208]=f;h=f}else{e=bk(b|0,148464)|0;if((e|0)!=0&e>>>0<51){uF(28840,b|0,e|0);a[e+28840|0]=0;tz(28840)}g[7208]=+g[7202];j=b+(e+1|0)|0;ca(j|0,205104,(v=i,i=i+8|0,c[v>>2]=28832,v)|0);h=+g[7208]}f=+g[(c[7118]|0)+92>>2];k=h*f;c[(c[3524]|0)+16>>2]=~~(k*f*10.0);c[(c[3524]|0)+20>>2]=~~(k*+g[(c[7118]|0)+92>>2]*10.0*6.0/10.0);i=d;return 1}function tD(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;e=i;i=i+520|0;f=e|0;g=e+256|0;if((b|0)==0){i=e;return}h=g|0;a[h]=0;j=e+264|0;a[j]=0;if(d){k=c[10028]|0;l=b+4|0;n=c[l>>2]|0;cf(k|0,197960,(v=i,i=i+8|0,c[v>>2]=n,v)|0);o=l}else{o=b+4|0}l=c[o>>2]|0;do{if((a[l]|0)!=60){n=uA(l|0)|0;if(n>>>0>3){k=l+(n-3|0)|0;uB(h|0,k|0)}else{uB(h|0,l|0)}a[h]=uI(a[h]|0|0)&255;k=g+1|0;a[k]=uI(a[k]|0|0)&255;k=g+2|0;a[k]=uI(a[k]|0|0)&255;if((c[b+8>>2]|0)!=0){break}uf(-1,219072,(v=i,i=i+8|0,c[v>>2]=c[o>>2],v)|0)}}while(0);L27092:do{if((a[h]|0)==0){if(!(a[14168]|0)){uf(-1,145320,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=(c[o>>2]|0)+1|0;uB(j|0,g|0);g=bt(j|0,193632)|0;if((g|0)!=0){p=g;q=1;break}uf(-1,219160,(v=i,i=i+8|0,c[v>>2]=(c[o>>2]|0)+1,v)|0)}else{do{if((aY(h|0,197944)|0)!=0){if((aY(h|0,197896)|0)==0){break}if((aY(h|0,197648)|0)!=0){if((aY(h|0,197488)|0)!=0){uh(-1,197360,(v=i,i=i+8|0,c[v>>2]=c[o>>2],v)|0)}g=bF(c[b+8>>2]|0,193632)|0;if((g|0)!=0){p=g;q=0;break L27092}uf(-1,219072,(v=i,i=i+8|0,c[v>>2]=c[o>>2],v)|0)}if(!(a[14168]|0)){uf(-1,145320,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=bU(197624)|0;l=c[b+8>>2]|0;if((g|0)==0){be(j|0,197560,(v=i,i=i+8|0,c[v>>2]=l,v)|0)}else{be(j|0,g|0,(v=i,i=i+8|0,c[v>>2]=l,v)|0)}if((a[j]|0)==0){uf(-1,197496,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}l=bt(j|0,193632)|0;if((l|0)!=0){p=l;q=1;break L27092}uf(-1,197672,(v=i,i=i+8|0,c[v>>2]=j,v)|0)}}while(0);if(!(a[14168]|0)){uf(-1,145320,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}l=bU(197856)|0;g=c[b+8>>2]|0;if((l|0)==0){be(j|0,197784,(v=i,i=i+8|0,c[v>>2]=g,v)|0)}else{be(j|0,l|0,(v=i,i=i+8|0,c[v>>2]=g,v)|0)}if((a[j]|0)==0){uf(-1,197704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}g=bt(j|0,193632)|0;if((g|0)!=0){p=g;q=1;break}uf(-1,197672,(v=i,i=i+8|0,c[v>>2]=j,v)|0)}}while(0);h=f|0;L27133:do{if((a6(h|0,255,p|0)|0)==0){r=0;s=0;t=20384}else{g=f+1|0;l=b+12|0;k=b+8|0;n=0;u=0;L27135:while(1){do{if((u|0)==0){if((a_(h|0,197328,14)|0)==0){break}if((a_(h|0,197304,11)|0)==0){break}if(q){uh(-1,197240,(v=i,i=i+8|0,c[v>>2]=j,v)|0);break}else{uh(-1,197192,(v=i,i=i+8|0,c[v>>2]=c[o>>2],v)|0);break}}}while(0);do{if((a_(h|0,197176,9)|0)==0){w=(uA(h|0)|0)-9|0;x=ut(w)|0;if((x|0)==0){gk();y=ut(w)|0;if((y|0)==0){break L27135}else{z=y}}else{z=x}x=(a8(g|0,47)|0)+1|0;uB(z|0,x|0);a[a8(z|0,32)|0]=0;if((z|0)==0){A=0}else{A=bP(z|0)|0}c[l>>2]=A;if(d){B=z;t=20382;break}x=c[k>>2]|0;y=c[m>>2]|0;w=c[o>>2]|0;if((x|0)==0){cf(y|0,197016,(v=i,i=i+16|0,c[v>>2]=w,c[v+8>>2]=z,v)|0)}else{cf(y|0,197104,(v=i,i=i+24|0,c[v>>2]=w,c[v+8>>2]=z,c[v+16>>2]=x,v)|0)}if(q){C=z;t=20381}else{D=z;E=u;t=20387;break L27133}}else{C=n;t=20381}}while(0);if((t|0)==20381){t=0;if(d){B=C;t=20382}else{F=C}}if((t|0)==20382){t=0;x=c[10028]|0;aK(h|0,x|0);F=B}x=u+1|0;if((a6(h|0,255,p|0)|0)==0){r=F;s=x;t=20384;break L27133}else{n=F;u=x}}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=197160,v)|0)}}while(0);do{if((t|0)==20384){if(!q){D=r;E=s;t=20387;break}F=a2(p|0)|0;if((F|0)==0){G=r;H=s;break}uf(-1,196840,(v=i,i=i+16|0,c[v>>2]=j,c[v+8>>2]=F,v)|0)}}while(0);if((t|0)==20387){az(p|0);G=D;H=E}if((H|0)==0){if(q){uf(-1,218792,(v=i,i=i+8|0,c[v>>2]=j,v)|0)}else{uf(-1,218744,(v=i,i=i+8|0,c[v>>2]=c[o>>2],v)|0)}}do{if(d){o=c[10028]|0;aI(196784,13,1,o|0);if((G|0)==0){i=e;return}if((aY(G|0,196752)|0)!=0){break}o=c[10028]|0;aI(196648,32,1,o|0);o=c[10028]|0;aI(196568,57,1,o|0);o=c[10028]|0;aI(196488,70,1,o|0);o=c[10028]|0;aI(196456,31,1,o|0);o=c[10028]|0;aI(196784,13,1,o|0);t=20396}else{t=20396}}while(0);do{if((t|0)==20396){if((G|0)!=0){break}i=e;return}}while(0);uu(G);i=e;return}function tE(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,n=0,o=0,p=0;d=i;e=bP(195896|0)|0;f=c[57238]|0;if((f|0)==0){g=20410}else{h=uA(f|0)|0;f=(h+4|0)+(uA(b|0)|0)|0;h=ut(f)|0;do{if((h|0)==0){gk();j=ut(f)|0;if((j|0)!=0){k=j;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=195784,v)|0);return 0}else{k=h}}while(0);h=c[57238]|0;uB(k|0,h|0);h=uA(k|0)|0;f=(h|0)==0?0:h-1|0;h=a[k+f|0]|0;if(!((h<<24>>24|0)==47|(h<<24>>24|0)==0)){a[k+(f+1|0)|0]=47;a[k+(f+2|0)|0]=0}uC(k|0,b|0);f=bF(k|0,193632|0)|0;uu(k);if((f|0)==0){g=20410}else{l=f}}do{if((g|0)==20410){f=bU(195768|0)|0;if((f|0)!=0){k=uA(f|0)|0;h=(k+4|0)+(uA(b|0)|0)|0;k=ut(h)|0;do{if((k|0)==0){gk();j=ut(h)|0;if((j|0)!=0){n=j;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=195784,v)|0);return 0}else{n=k}}while(0);uB(n|0,f|0);k=uA(n|0)|0;h=(k|0)==0?0:k-1|0;k=a[n+h|0]|0;if(!((k<<24>>24|0)==47|(k<<24>>24|0)==0)){a[n+(h+1|0)|0]=47;a[n+(h+2|0)|0]=0}uC(n|0,b|0);h=bF(n|0,193632|0)|0;uu(n);if((h|0)!=0){l=h;break}}h=uA(e|0)|0;k=(h+4|0)+(uA(b|0)|0)|0;h=ut(k)|0;do{if((h|0)==0){gk();j=ut(k)|0;if((j|0)!=0){o=j;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=195784,v)|0);return 0}else{o=h}}while(0);uB(o|0,e|0);h=uA(o|0)|0;k=(h|0)==0?0:h-1|0;h=a[o+k|0]|0;if(!((h<<24>>24|0)==47|(h<<24>>24|0)==0)){a[o+(k+1|0)|0]=47;a[o+(k+2|0)|0]=0}uC(o|0,b|0);k=bF(o|0,193632|0)|0;uu(o);uu(e);if((k|0)!=0){p=k;i=d;return p|0}k=hA(b,193632)|0;if((k|0)==0){h=c[m>>2]|0;cf(h|0,195704|0,(v=i,i=i+8|0,c[v>>2]=b,v)|0);uq(2,0);h=c[m>>2]|0;cf(h|0,195600|0,(v=i,i=i+8|0,c[v>>2]=b,v)|0);h=c[m>>2]|0;aI(195528|0,49,1,h|0);h=c[m>>2]|0;aI(195448|0,34,1,h|0);uf(-1,195432,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else{p=k;i=d;return p|0}}}while(0);uu(e);p=l;i=d;return p|0}function tF(){var b=0,d=0,e=0,f=0,j=0,k=0.0,l=0,m=0,n=0;b=i;if(!(a[34544]&a[34552])){i=b;return}d=c[8618]|0;if((d|0)==34464){i=b;return}else{e=1;f=d}while(1){j=e+1|0;d=c[f+8>>2]|0;if((d|0)==34464){break}else{e=j;f=d}}if((e|0)<=0){i=b;return}cf(c[10030]|0,183280,(v=i,i=i+32|0,c[v>>2]=(c[8566]|0)+1,c[v+8>>2]=34336,c[v+16>>2]=34272,c[v+24>>2]=34192,v)|0);cf(c[10030]|0,183648,(v=i,i=i+8|0,c[v>>2]=j,v)|0);e=0;f=34464;while(1){if((e&3|0)==0){d=c[10030]|0;aI(73904,3,1,d|0)}k=+g[f+4>>2];cf(c[10030]|0,183624,(v=i,i=i+16|0,h[v>>3]=+g[f>>2],h[v+8>>3]=k,v)|0);d=e+1|0;if((d|0)<(j|0)){e=d;f=c[f+8>>2]|0}else{break}}aI(183600,4,1,c[10030]|0);f=(c[8566]|0)+1|0;L27243:do{if(a[34544]&a[34552]){e=0;while(1){if((e|0)>=20){break L27243}l=34564+(e<<3)|0;j=c[l>>2]|0;m=(j|0)==0;n=(j|0)==(f|0);if(m|n){break}else{e=e+1|0}}j=34560+(e<<3)|0;if(m){c[l>>2]=f;c[j>>2]=0;break}if(!n){break}c[j>>2]=1}}while(0);a[34336]=0;a[34272]=0;a[34192]=0;n=c[8619]|0;g[8616]=+g[n>>2];g[8617]=+g[n+4>>2];if((n|0)!=34464){f=n;do{n=c[f+12>>2]|0;c[8619]=n;c[n+8>>2]=34464;uu(f);f=c[8619]|0;}while((f|0)!=34464)}c[8619]=34464;c[8618]=34464;i=b;return}function tG(){var a=0,b=0,d=0,e=0,f=0,g=0;aF(230,c[10030]|0);a=c[58576]|0;aF(a>>>8|0,c[10030]|0);aF(a|0,c[10030]|0);if((c[58576]|0)==0){c[58576]=0;b=c[10030]|0;d=aF(234,b|0)|0;e=c[10030]|0;f=aF(15,e|0)|0;return}else{g=0}do{a=c[233888+(g<<2)>>2]|0;aF(a>>>8|0,c[10030]|0);aF(a|0,c[10030]|0);a=c[233488+(g<<2)>>2]|0;aF(a>>>8|0,c[10030]|0);aF(a|0,c[10030]|0);g=g+1|0;}while(g>>>0<(c[58576]|0)>>>0);c[58576]=0;b=c[10030]|0;d=aF(234,b|0)|0;e=c[10030]|0;f=aF(15,e|0)|0;return}function tH(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0.0,l=0,m=0.0,n=0.0,o=0,p=0.0,q=0,r=0.0,s=0,t=0,u=0;f=i;g=~~(+h[29420]*106.0*.5);if((e|0)==(-3|0)){o1(b,d);j=c[10030]|0;aI(125976,2,1,j|0);a[235520]=0;j=c[10030]|0;k=+(g|0)*3.0*.25;cf(j|0,179248,(v=i,i=i+8|0,h[v>>3]=k,v)|0);i=f;return}else if((e|0)==(-15|0)){j=b-g|0;l=d-g|0;o1(j,l);k=+(b>>>0>>>0);m=+(g|0);n=m*4.242640687119286*.125;o=~~(k-n);p=+(d>>>0>>>0);q=~~(p-n);o2(o,q);r=m*1.4142135623730951*.5;o1(~~(k+r),~~(p-r));s=~~(k+n);o2(s,q);q=g+b|0;t=g+d|0;o1(q,t);u=~~(p+n);o2(s,u);o1(~~(k-r),~~(p+r));o2(o,u);o1(j,d);j=(g*3&-1|0)/4&-1;o2(b-j|0,d);o1(j+b|0,d);o2(q,d);o1(b,l);o2(b,d-j|0);o1(b,j+d|0);o2(b,t);o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,179192,(v=i,i=i+8|0,h[v>>3]=m*3.0*.25,v)|0);i=f;return}else if((e|0)==(-7|0)){m=+(b>>>0>>>0);r=+(g|0);p=r*1.4142135623730951*.5;t=~~(m-p);k=+(d>>>0>>>0);j=~~(k-p);o1(t,j);n=r*4.242640687119286*.125;l=~~(m-n);q=~~(k-n);o2(l,q);u=~~(m+p);o1(u,j);j=~~(m+n);o2(j,q);q=~~(k+p);o1(u,q);u=~~(k+n);o2(j,u);o1(t,q);o2(l,u);o1(b-g|0,d);u=(g*3&-1|0)/4&-1;o2(b-u|0,d);o1(u+b|0,d);o2(g+b|0,d);o1(b,d-g|0);o2(b,d-u|0);o1(b,u+d|0);o2(b,g+d|0);o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,179192,(v=i,i=i+8|0,h[v>>3]=r*3.0*.25,v)|0);i=f;return}else if((e|0)==(-12|0)){r=+(b>>>0>>>0);n=+(g|0);k=n*1.4142135623730951*.5;p=+(d>>>0>>>0);u=~~(p+k);o1(~~(r+k),u);m=n*4.242640687119286*.125;l=~~(p+m);o2(~~(r+m),l);o1(~~(r-k),u);o2(~~(r-m),l);o1(b-g|0,d);l=(g*3&-1|0)/4&-1;o2(b-l|0,d);o1(l+b|0,d);o2(g+b|0,d);o1(b,d-g|0);o2(b,d-l|0);o1(b,l+d|0);o2(b,g+d|0);o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;m=n*3.0*.25;cf(c[10030]|0,178032,(v=i,i=i+8|0,h[v>>3]=m,v)|0);cf(c[10030]|0,178008,(v=i,i=i+8|0,h[v>>3]=m,v)|0);i=f;return}else if((e|0)==(-19|0)){l=d-g|0;o1(b,l);u=(g|0)/2&-1;o2(b,d-u|0);o1(b,u+d|0);o2(b,g+d|0);o1(b,l);u=(g|0)/4&-1;q=d-((g*3&-1|0)/4&-1)|0;o2(b-u|0,q);o1(b,l);o2(u+b|0,q);o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,179248,(v=i,i=i+8|0,h[v>>3]=+(g|0)*.5,v)|0);i=f;return}else if((e|0)==(-16|0)){q=b-g|0;o1(q,d-g|0);m=+(b>>>0>>>0);n=+(g|0);r=n*4.242640687119286*.125;u=~~(m-r);k=+(d>>>0>>>0);o2(u,~~(k-r));l=g+b|0;t=g+d|0;o1(l,t);j=~~(k+r);o2(~~(m+r),j);r=n*1.4142135623730951*.5;o1(~~(m-r),~~(k+r));o2(u,j);o1(q,d);q=(g*3&-1|0)/4&-1;o2(b-q|0,d);o1(q+b|0,d);o2(l,d);o1(b,q+d|0);o2(b,t);o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,179192,(v=i,i=i+8|0,h[v>>3]=n*3.0*.25,v)|0);i=f;return}else if((e|0)==(-10|0)){o1(b-g|0,d);t=(g*3&-1|0)/4&-1;o2(b-t|0,d);o1(t+b|0,d);o2(g+b|0,d);o1(b,d-g|0);o2(b,d-t|0);o1(b,t+d|0);o2(b,g+d|0);o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;n=+(g|0)*3.0*.25;cf(c[10030]|0,178032,(v=i,i=i+8|0,h[v>>3]=n,v)|0);cf(c[10030]|0,178008,(v=i,i=i+8|0,h[v>>3]=n,v)|0);i=f;return}else if((e|0)==(-2|0)){o1(b-g|0,d);t=(g*3&-1|0)/4&-1;q=b-t|0;o2(q,d);l=t+b|0;o1(l,d);o2(g+b|0,d);o1(b,d-g|0);j=d-t|0;o2(b,j);u=t+d|0;o1(b,u);o2(b,g+d|0);o1(q,j);o2(l,j);o2(l,u);o2(q,u);o2(q,j);j=(g|0)/2&-1;q=j+d|0;o1(b-j|0,q);o2(b,d-j|0);o2(j+b|0,q);i=f;return}else if((e|0)==(-20|0)){o1(b-g|0,d-g|0);o2(g+b|0,g+d|0);o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,179248,(v=i,i=i+8|0,h[v>>3]=+(g|0)*3.0*.25,v)|0);i=f;return}else if((e|0)==(-13|0)){o1(b-g|0,d-g|0);n=+(b>>>0>>>0);r=+(g|0);k=r*4.242640687119286*.125;m=+(d>>>0>>>0);o2(~~(n-k),~~(m-k));o1(g+b|0,g+d|0);o2(~~(n+k),~~(m+k));o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,179192,(v=i,i=i+8|0,h[v>>3]=r*3.0*.25,v)|0);i=f;return}else if((e|0)==(-14|0)){q=b-g|0;j=d-g|0;o1(q,j);r=+(b>>>0>>>0);k=+(g|0);m=k*4.242640687119286*.125;u=~~(r-m);n=+(d>>>0>>>0);l=~~(n-m);o2(u,l);p=k*1.4142135623730951*.5;o1(~~(r+p),~~(n-p));t=~~(r+m);o2(t,l);l=g+b|0;o=g+d|0;o1(l,o);s=~~(n+m);o2(t,s);o1(~~(r-p),~~(n+p));o2(u,s);o1(q,d);q=(g*3&-1|0)/4&-1;o2(b-q|0,d);o1(q+b|0,d);o2(l,d);o1(b,j);o2(b,d-q|0);o1(b,q+d|0);o2(b,o);o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,179248,(v=i,i=i+8|0,h[v>>3]=k*3.0*.25,v)|0);i=f;return}else if((e|0)==(-4|0)){o1(b-g|0,d);o=(g*3&-1|0)/4&-1;o2(b-o|0,d);o1(o+b|0,d);o2(g+b|0,d);o1(b,d-g|0);o2(b,d-o|0);o1(b,o+d|0);o2(b,g+d|0);o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,179248,(v=i,i=i+8|0,h[v>>3]=+(g|0)*3.0*.25,v)|0);i=f;return}else if((e|0)==(-6|0)){k=+(b>>>0>>>0);p=+(g|0);n=p*1.4142135623730951*.5;o=~~(k-n);r=+(d>>>0>>>0);q=~~(r-n);o1(o,q);m=p*4.242640687119286*.125;j=~~(k-m);l=~~(r-m);o2(j,l);s=~~(k+n);o1(s,q);q=~~(k+m);o2(q,l);l=~~(r+n);o1(s,l);s=~~(r+m);o2(q,s);o1(o,l);o2(j,s);o1(b-g|0,d);s=(g*3&-1|0)/4&-1;o2(b-s|0,d);o1(s+b|0,d);o2(g+b|0,d);o1(b,d-g|0);o2(b,d-s|0);o1(b,s+d|0);o2(b,g+d|0);o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,179248,(v=i,i=i+8|0,h[v>>3]=p*3.0*.25,v)|0);i=f;return}else if((e|0)==(-5|0)){o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,179192,(v=i,i=i+8|0,h[v>>3]=+(g|0)*3.0*.25,v)|0);i=f;return}else if((e|0)==(-9|0)){p=+(b>>>0>>>0);m=+(g|0);r=m*1.4142135623730951*.5;s=~~(p-r);n=+(d>>>0>>>0);j=~~(n-r);o1(s,j);k=m*4.242640687119286*.125;l=~~(p-k);o=~~(n-k);o2(l,o);q=~~(p+r);o1(q,j);j=~~(p+k);o2(j,o);o=~~(n+r);o1(q,o);q=~~(n+k);o2(j,q);o1(s,o);o2(l,q);o1(b-g|0,d);q=(g*3&-1|0)/4&-1;o2(b-q|0,d);o1(q+b|0,d);o2(g+b|0,d);o1(b,d-g|0);o2(b,d-q|0);o1(b,q+d|0);o2(b,g+d|0);o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;k=m*3.0*.25;cf(c[10030]|0,178032,(v=i,i=i+8|0,h[v>>3]=k,v)|0);cf(c[10030]|0,178008,(v=i,i=i+8|0,h[v>>3]=k,v)|0);i=f;return}else if((e|0)==(-18|0)){o1(b-g|0,d);o2(g+b|0,d);o1(b,d-g|0);o2(b,g+d|0);o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,179248,(v=i,i=i+8|0,h[v>>3]=+(g|0)*3.0*.25,v)|0);i=f;return}else if((e|0)==(-17|0)){q=b-g|0;l=d-g|0;o1(q,l);k=+(b>>>0>>>0);m=+(g|0);n=m*4.242640687119286*.125;o=~~(k-n);r=+(d>>>0>>>0);s=~~(r-n);o2(o,s);p=m*1.4142135623730951*.5;o1(~~(k+p),~~(r-p));j=~~(k+n);o2(j,s);s=g+b|0;u=g+d|0;o1(s,u);t=~~(r+n);o2(j,t);o1(~~(k-p),~~(r+p));o2(o,t);o1(q,d);q=(g*3&-1|0)/4&-1;o2(b-q|0,d);o1(q+b|0,d);o2(s,d);o1(b,l);o2(b,d-q|0);o1(b,q+d|0);o2(b,u);o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;p=m*3.0*.25;cf(c[10030]|0,178032,(v=i,i=i+8|0,h[v>>3]=p,v)|0);cf(c[10030]|0,178008,(v=i,i=i+8|0,h[v>>3]=p,v)|0);i=f;return}else if((e|0)==(-8|0)){p=+(b>>>0>>>0);m=+(g|0);r=m*1.4142135623730951*.5;k=+(d>>>0>>>0);u=~~(k+r);o1(~~(p+r),u);n=m*4.242640687119286*.125;q=~~(k+n);o2(~~(p+n),q);o1(~~(p-r),u);o2(~~(p-n),q);o1(b-g|0,d);q=(g*3&-1|0)/4&-1;o2(b-q|0,d);o1(q+b|0,d);o2(g+b|0,d);o1(b,q+d|0);o2(b,g+d|0);o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,179192,(v=i,i=i+8|0,h[v>>3]=m*3.0*.25,v)|0);i=f;return}else if((e|0)==(-11|0)){m=+(b>>>0>>>0);n=+(g|0);p=n*1.4142135623730951*.5;r=+(d>>>0>>>0);e=~~(r+p);o1(~~(m+p),e);k=n*4.242640687119286*.125;q=~~(r+k);o2(~~(m+k),q);o1(~~(m-p),e);o2(~~(m-k),q);o1(b-g|0,d);q=(g*3&-1|0)/4&-1;o2(b-q|0,d);o1(q+b|0,d);o2(g+b|0,d);o1(b,d-g|0);o2(b,d-q|0);o1(b,q+d|0);o2(b,g+d|0);o1(b,d);aI(125976,2,1,c[10030]|0);a[235520]=0;cf(c[10030]|0,179248,(v=i,i=i+8|0,h[v>>3]=n*3.0*.25,v)|0);i=f;return}else{o1(b,d);o2(b,d);i=f;return}}function tI(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;b=i;d=c[59128]|0;e=(c[d+8>>2]|0)-1|0;f=c[(c[d+16>>2]|0)+(e<<2)>>2]|0;g=c[(c[d+20>>2]|0)+(e<<2)>>2]|0;tJ(d);d=c[59128]|0;e=c[d>>2]|0;h=c[d+4>>2]|0;j=h<<1;k=c[d+12>>2]|0;d=ut(28)|0;do{if((d|0)==0){gk();l=ut(28)|0;if((l|0)!=0){m=l;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{m=d}}while(0);d=m;l=m;c[l>>2]=e;c[m+12>>2]=k;c[m+4>>2]=j;c[m+8>>2]=0;k=h<<3;h=ut(k)|0;do{if((h|0)==0){gk();e=ut(k)|0;if((e|0)!=0){n=e;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{n=h}}while(0);h=m+16|0;c[h>>2]=n;n=ut(k)|0;do{if((n|0)==0){gk();e=ut(k)|0;if((e|0)!=0){o=e;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{o=n}}while(0);n=m+20|0;c[n>>2]=o;o=ut(j)|0;do{if((o|0)==0){gk();k=ut(j)|0;if((k|0)!=0){p=k;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=174680,v)|0)}else{p=o}}while(0);c[m+24>>2]=p;do{if((c[h>>2]|0)!=0){if((c[n>>2]|0)==0){break}uE(p|0,0,j|0);if((m|0)==0){break}o=c[59128]|0;c[236448+(c[l>>2]<<2)>>2]=d;if((c[l>>2]|0)==0){c[59113]=d;c[59115]=d}c[59128]=d;uu(c[o+16>>2]|0);uu(c[o+20>>2]|0);uu(c[o+24>>2]|0);uu(o)}}while(0);c[c[(c[59128]|0)+16>>2]>>2]=f;c[c[(c[59128]|0)+20>>2]>>2]=g;a[c[(c[59128]|0)+24>>2]|0]=1;c[(c[59128]|0)+8>>2]=1;c[59100]=(c[59100]|0)+1;i=b;return}function tJ(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;d=i;e=b+8|0;if((c[e>>2]|0)==0){i=d;return}f=c[b+16>>2]|0;g=c[b+20>>2]|0;h=c[b+24>>2]|0;if(a[236440]|0){j=c[10030]|0;aI(174600,4,1,j|0);a[236440]=0}j=b+12|0;b=c[j>>2]|0;do{if((c[59108]|0)!=(b|0)){if((c[e>>2]|0)<=1){if((a[h]&1)!=0){break}}k=c[10030]|0;cf(k|0,174584,(v=i,i=i+8|0,c[v>>2]=b,v)|0);c[59108]=c[j>>2]}}while(0);aI(174520,3,1,c[10030]|0);j=(c[f>>2]|0)-(c[59098]|0)|0;b=(c[g>>2]|0)-(c[59096]|0)|0;k=c[10030]|0;if((j|0)>-17&(b|0)>-17&(j|0)<16&(b|0)<16){aF(106,k|0);l=1}else{aF(105,k|0);l=0}k=c[e>>2]|0;if((k|0)>0){m=b;b=j;j=0;n=l;l=k;while(1){k=(j|0)>0;if(k){o=j-1|0;p=(c[f+(j<<2)>>2]|0)-(c[f+(o<<2)>>2]|0)|0;q=(c[g+(j<<2)>>2]|0)-(c[g+(o<<2)>>2]|0)|0}else{p=b;q=m}L27354:do{if((p|q|0)==0){do{if(k){if((a[h+(j-1|0)|0]&1)!=0){break}if((a[h+j|0]&1)!=0){break}c[59102]=(c[59102]|0)+1;r=n;s=p;t=q;break L27354}}while(0);if((a[h+j|0]&1)==0){u=p;w=q;x=20552;break}c[59104]=(c[59104]|0)+1;r=n;s=p;t=q}else{do{if(k){o=j+1|0;if((o|0)>=(l|0)){break}if((a[h+j|0]&1)==0){break}if((a[h+o|0]&1)==0){break}c[59104]=(c[59104]|0)+1;r=n;s=p;t=q;break L27354}}while(0);if((p|0)>-17&(q|0)>-17&(p|0)<16&(q|0)<16|k^1){u=p;w=q;x=20552;break}o=j+2|0;if((o|0)>=(l|0)){u=p;w=q;x=20552;break}if((a[h+j|0]&1)==0){u=p;w=q;x=20552;break}y=j+1|0;if((a[h+y|0]&1)!=0){u=p;w=q;x=20552;break}if((a[h+o|0]&1)==0){u=p;w=q;x=20552;break}o=f+(y<<2)|0;z=c[o>>2]|0;A=j-1|0;B=f+(A<<2)|0;C=z-(c[B>>2]|0)|0;if((C|0)<=-17){u=p;w=q;x=20552;break}D=g+(y<<2)|0;y=g+(A<<2)|0;A=(c[D>>2]|0)-(c[y>>2]|0)|0;if(!((A|0)>-17&(C|0)<16&(A|0)<16)){u=p;w=q;x=20552;break}A=f+(j<<2)|0;c[o>>2]=c[A>>2];c[A>>2]=z;z=c[D>>2]|0;o=g+(j<<2)|0;c[D>>2]=c[o>>2];c[o>>2]=z;u=(c[A>>2]|0)-(c[B>>2]|0)|0;w=z-(c[y>>2]|0)|0;x=20552}}while(0);do{if((x|0)==20552){x=0;if((u|0)>-17&(w|0)>-17&(u|0)<16&(w|0)<16){if(!n){k=c[10030]|0;aF(106,k|0)}if((a[h+j|0]&1)!=0){k=c[10030]|0;aF(97,k|0)}k=a[236552+(u+16|0)|0]|0;y=c[10030]|0;aF(k|0,y|0);y=a[236552+(w+16|0)|0]|0;k=c[10030]|0;aF(y|0,k|0);r=1;s=u;t=w;break}k=((u|0)>0?1:-1)+u|0;y=(k|0)/2&-1;z=((w|0)>0?1:-1)+w|0;B=(z|0)/2&-1;if(n&(k|0)>-34&(z|0)>-34&(k|0)<32&(z|0)<32){z=h+j|0;if((a[z]&1)!=0){k=c[10030]|0;aF(97,k|0)}k=a[236552+(y+16|0)|0]|0;A=c[10030]|0;aF(k|0,A|0);A=a[236552+(B+16|0)|0]|0;k=c[10030]|0;aF(A|0,k|0);if((a[z]&1)!=0){z=c[10030]|0;aF(97,z|0)}z=a[236552+((u+16|0)-y|0)|0]|0;y=c[10030]|0;aF(z|0,y|0);y=a[236552+((w+16|0)-B|0)|0]|0;B=c[10030]|0;aF(y|0,B|0);r=1;s=u;t=w;break}else{if(n){B=c[10030]|0;aF(105,B|0)}if((a[h+j|0]&1)!=0){B=c[10030]|0;aF(97,B|0)}B=f+(j<<2)|0;y=a[236520+(c[B>>2]>>5)|0]|0;z=c[10030]|0;aF(y|0,z|0);z=a[236520+(c[B>>2]&31)|0]|0;B=c[10030]|0;aF(z|0,B|0);B=g+(j<<2)|0;z=a[236520+(c[B>>2]>>5)|0]|0;y=c[10030]|0;aF(z|0,y|0);y=a[236520+(c[B>>2]&31)|0]|0;B=c[10030]|0;aF(y|0,B|0);r=0;s=u;t=w;break}}}while(0);B=j+1|0;y=c[e>>2]|0;if((B|0)<(y|0)){m=t;b=s;j=B;n=r;l=y}else{break}}}aF(90,c[10030]|0);c[59098]=c[f+((c[e>>2]|0)-1<<2)>>2];c[59096]=c[g+((c[e>>2]|0)-1<<2)>>2];c[e>>2]=0;i=d;return}function tK(b){b=b|0;var d=0,e=0,f=0,j=0,k=0,l=0,m=0,n=0.0,o=0,p=0;d=i;if((b|0)!=1){a[237104]=0;i=d;return}b=c[59356]|0;e=a[237432]&1;f=c[59354]|0;j=c[59352]|0;k=c[59350]|0;l=c[59346]|0;m=a[237392]<<31>>31;n=+g[59360];o=c[59280]|0;cf(c[10030]|0,174184,(v=i,i=i+128|0,c[v>>2]=2,c[v+8>>2]=e,c[v+16>>2]=b,c[v+24>>2]=f,c[v+32>>2]=j,c[v+40>>2]=k,c[v+48>>2]=l,c[v+56>>2]=0,c[v+64>>2]=m,h[v+72>>3]=n,c[v+80>>2]=0,c[v+88>>2]=(b|0)==2&1,c[v+96>>2]=0,c[v+104>>2]=0,c[v+112>>2]=0,c[v+120>>2]=o,v)|0);do{if((c[59280]|0)>0){o=0;b=0;while(1){m=c[59282]|0;l=c[m+(b<<3)+4>>2]|0;cf(c[10030]|0,174136,(v=i,i=i+16|0,c[v>>2]=c[m+(b<<3)>>2],c[v+8>>2]=l,v)|0);l=o+1|0;do{if((o|0)>4){if((b|0)==((c[59280]|0)-1|0)){p=l;break}m=c[10030]|0;aI(84248,2,1,m|0);p=0}else{p=l}}while(0);l=b+1|0;if((l|0)<(c[59280]|0)){o=p;b=l}else{break}}if((p|0)==0){break}aF(10,c[10030]|0)}}while(0);uu(c[59282]|0);c[59282]=0;a[237104]=0;i=d;return}function tL(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0.0;d=i;i=i+8|0;e=d|0;f=e;c[11554]=b;if((b|0)>-1){g=(b|0)%5&-1}else{g=b}b=(g|0)==-1?2:g;g=(b|0)>0&a[46232];j=e;k=f+3|0;a[k]=0;l=f+2|0;a[l]=0;m=f+1|0;a[m]=0;a[j]=37;aI(j|0,1,4,c[10030]|0);a[k]=0;a[l]=0;a[m]=0;a[j]=12;aI(j|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[k]=-128;a[l]=0;a[m]=0;a[j]=7;aI(j|0,1,4,c[10030]|0);a[k]=0;a[l]=0;a[m]=0;a[j]=40;aI(j|0,1,4,c[10030]|0);a[k]=0;a[l]=0;a[m]=0;a[j]=12;aI(j|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[k]=0;a[l]=0;a[m]=0;a[j]=1;aI(j|0,1,4,c[10030]|0);a[k]=0;a[l]=0;a[m]=0;a[j]=38;aI(j|0,1,4,c[10030]|0);a[k]=0;a[l]=0;a[m]=0;a[j]=28;aI(j|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[k]=0;a[l]=0;a[m]=0;a[j]=1;aI(j|0,1,4,c[10030]|0);f=a[45616]|0;a[k]=0;a[l]=0;a[m]=f?0:34;a[j]=0;aI(j|0,1,4,c[10030]|0);f=~~(+h[5705]*26.37);a[k]=f>>>24&255;a[l]=f>>>16&255;a[m]=f>>>8&255;a[j]=f&255;aI(j|0,1,4,c[10030]|0);c[e>>2]=0;aI(j|0,1,4,c[10030]|0);e=c[11562]|0;a[k]=e>>>24&255;a[l]=e>>>16&255;a[m]=e>>>8&255;a[j]=e&255;aI(j|0,1,4,c[10030]|0);a[k]=0;a[l]=0;a[m]=0;a[j]=37;aI(j|0,1,4,c[10030]|0);a[k]=0;a[l]=0;a[m]=0;a[j]=12;aI(j|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[k]=0;a[l]=0;a[m]=0;a[j]=1;aI(j|0,1,4,c[10030]|0);j=(c[3524]|0)+60|0;if(g){c[j>>2]=78;g=b<<3;n=+h[5778];c[11282]=~~(+(c[238880+(g-8<<2)>>2]|0)*n*26.37);b=~~(+(c[238880+(g-7<<2)>>2]|0)*n*26.37);c[11283]=b;c[11284]=~~(+(c[238880+(g-6<<2)>>2]|0)*n*26.37);c[11285]=~~(+(c[238880+(g-5<<2)>>2]|0)*n*26.37);c[11286]=~~(+(c[238880+(g-4<<2)>>2]|0)*n*26.37);c[11287]=~~(+(c[238880+(g-3<<2)>>2]|0)*n*26.37);c[11288]=~~(+(c[238880+(g-2<<2)>>2]|0)*n*26.37);c[11289]=~~(+(c[238880+(g-1<<2)>>2]|0)*n*26.37);c[11292]=b;c[11290]=1;c[11552]=0;i=d;return}else{c[j>>2]=48;c[11552]=0;i=d;return}}function tM(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,ab=0;d=i;e=c[3524]|0;if((c[e+8>>2]|0)>>>0>a>>>0){if((c[e+12>>2]|0)>>>0<=b>>>0){f=20596}}else{f=20596}if((f|0)==20596){uh(-1,171568,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=b,v)|0)}e=c[11298]|0;g=a-e|0;h=c[11296]|0;j=b-h|0;k=(g|0)>-1?g:-g|0;l=j*10&-1;m=(l|0)>-1?l:-l|0;l=k*10&-1;do{if((l|0)<(m|0)){n=((((aa((k*25&-1|0)/(m|0)&-1,k)|0)/6&-1)*5&-1)+((m|0)/2&-1)|0)/5&-1}else{if((k|0)==0){i=d;return}else{n=(aa((m|0)/(k|0)&-1,(m|0)/24&-1)+l|0)/10&-1;break}}}while(0);l=c[11292]|0;m=c[11290]|0;if((n|0)>(l|0)){k=n;o=l;l=m;p=e;q=h;r=e;s=h;while(1){t=k-o|0;u=a-((aa(t,g)|0)/(n|0)&-1)|0;w=b-((aa(t,j)|0)/(n|0)&-1)|0;x=c[3524]|0;y=(c[x+8>>2]|0)>>>0>u>>>0;do{if((l&1|0)==0){if(y){if((c[x+12>>2]|0)>>>0>w>>>0){z=w;A=u;B=p;C=q;D=r;E=s}else{f=20614}}else{f=20614}if((f|0)==20614){f=0;uh(-1,171048,(v=i,i=i+16|0,c[v>>2]=u,c[v+8>>2]=w,v)|0);F=c[3524]|0;G=c[F+8>>2]|0;H=c[F+12>>2]|0;F=c[11298]|0;I=c[11296]|0;z=H>>>0>w>>>0?w:H;A=G>>>0>u>>>0?u:G;B=F;C=I;D=F;E=I}if((A|0)==(B|0)&(z|0)==(C|0)){J=B;K=C;L=D;M=E;break}tN();c[11298]=A;c[11296]=z;J=A;K=z;L=A;M=z}else{if(y){if((c[x+12>>2]|0)>>>0>w>>>0){N=r;O=s}else{f=20605}}else{f=20605}if((f|0)==20605){f=0;uh(-1,171144,(v=i,i=i+16|0,c[v>>2]=u,c[v+8>>2]=w,v)|0);N=c[11298]|0;O=c[11296]|0}if((N|0)==(u|0)&(O|0)==(w|0)){J=u;K=w;L=u;M=w;break}I=c[11560]|0;if((I<<1|0)>102){tN();P=c[11560]|0}else{P=I}if((P|0)==0){c[11300]=c[11298];c[11301]=c[11296];c[11560]=1;Q=1}else{Q=P}I=Q<<1;c[45200+(I<<2)>>2]=u;c[11298]=u;c[45200+((I|1)<<2)>>2]=w;c[11296]=w;c[11560]=Q+1;J=u;K=w;L=u;M=w}}while(0);w=(c[11290]|0)+1|0;u=(w|0)>7?0:w;c[11290]=u;w=c[45128+(u<<2)>>2]|0;c[11292]=w;if((t|0)>(w|0)){k=t;o=w;l=u;p=J;q=K;r=L;s=M}else{R=t;S=J;T=K;U=u;break}}}else{R=n;S=e;T=h;U=m}m=c[3524]|0;h=(c[m+8>>2]|0)>>>0>a>>>0;do{if((U&1|0)==0){if(h){if((c[m+12>>2]|0)>>>0>b>>>0){V=b;W=a;X=S;Y=T}else{f=20630}}else{f=20630}if((f|0)==20630){uh(-1,171048,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=b,v)|0);e=c[3524]|0;n=c[e+8>>2]|0;K=c[e+12>>2]|0;V=K>>>0>b>>>0?b:K;W=n>>>0>a>>>0?a:n;X=c[11298]|0;Y=c[11296]|0}if((W|0)==(X|0)&(V|0)==(Y|0)){break}tN();c[11298]=W;c[11296]=V}else{if(h){if((c[m+12>>2]|0)>>>0>b>>>0){Z=S;_=T}else{f=20621}}else{f=20621}if((f|0)==20621){uh(-1,171144,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=b,v)|0);Z=c[11298]|0;_=c[11296]|0}if((Z|0)==(a|0)&(_|0)==(b|0)){break}n=c[11560]|0;if((n<<1|0)>102){tN();$=c[11560]|0}else{$=n}if(($|0)==0){c[11300]=c[11298];c[11301]=c[11296];c[11560]=1;ab=1}else{ab=$}n=ab<<1;c[45200+(n<<2)>>2]=a;c[11298]=a;c[45200+((n|1)<<2)>>2]=b;c[11296]=b;c[11560]=ab+1}}while(0);c[11292]=(c[11292]|0)-R;i=d;return}function tN(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;b=i;i=i+8|0;d=b|0;e=c[11560]|0;if((e|0)==0){i=b;return}if((c[11552]|0)>0){tL(c[11554]|0);c[11552]=0;f=c[11560]|0}else{f=e}e=d|0;g=d+3|0;a[g]=0;h=d+2|0;a[h]=0;j=d+1|0;a[j]=0;a[e]=27;aI(e|0,1,4,c[10030]|0);a[g]=0;a[h]=0;a[j]=0;a[e]=16;aI(e|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;d=c[11300]|0;a[g]=d>>>24&255;a[h]=d>>>16&255;a[j]=d>>>8&255;a[e]=d&255;aI(e|0,1,4,c[10030]|0);d=(c[(c[3524]|0)+12>>2]|0)-(c[11301]|0)|0;a[g]=d>>>24&255;a[h]=d>>>16&255;a[j]=d>>>8&255;a[e]=d&255;aI(e|0,1,4,c[10030]|0);do{if((f|0)<3){a[g]=0;a[h]=0;a[j]=0;a[e]=54;d=c[10030]|0;aI(e|0,1,4,d|0);a[g]=0;a[h]=0;a[j]=0;a[e]=16;d=c[10030]|0;aI(e|0,1,4,d|0);c[11294]=(c[11294]|0)+1;d=c[11302]|0;a[g]=d>>>24&255;a[h]=d>>>16&255;a[j]=d>>>8&255;a[e]=d&255;d=c[10030]|0;aI(e|0,1,4,d|0);d=(c[(c[3524]|0)+12>>2]|0)-(c[11303]|0)|0;a[g]=d>>>24&255;a[h]=d>>>16&255;a[j]=d>>>8&255;a[e]=d&255;d=c[10030]|0;aI(e|0,1,4,d|0)}else{if((c[11560]<<1|0)>2){k=2}else{break}while(1){a[g]=0;a[h]=0;a[j]=0;a[e]=54;aI(e|0,1,4,c[10030]|0);a[g]=0;a[h]=0;a[j]=0;a[e]=16;aI(e|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;d=c[45200+(k<<2)>>2]|0;a[g]=d>>>24&255;a[h]=d>>>16&255;a[j]=d>>>8&255;a[e]=d&255;aI(e|0,1,4,c[10030]|0);d=k+2|0;l=(c[(c[3524]|0)+12>>2]|0)-(c[45200+((k|1)<<2)>>2]|0)|0;a[g]=l>>>24&255;a[h]=l>>>16&255;a[j]=l>>>8&255;a[e]=l&255;aI(e|0,1,4,c[10030]|0);if((d|0)<(c[11560]<<1|0)){k=d}else{break}}}}while(0);c[11560]=0;i=b;return}function tO(){var b=0,d=0,e=0,f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;b=i;i=i+8|0;d=b|0;e=d;f=i;i=i+32|0;if(!(a[45664]|0)){i=b;return}j=uA(45688)|0;k=j>>>0<31?j:31;j=aQ(45688,75096)|0;if((j|0)==0){l=aQ(45688,75048)|0;if((l|0)==0){m=1;n=-112;o=k}else{p=l;q=20651}}else{p=j;q=20651}if((q|0)==20651){j=p-45688|0;m=2;n=-68;o=(j|0)<(k|0)?j:k}k=aQ(45688,74992)|0;if((k|0)==0){j=aQ(45688,74976)|0;if((j|0)==0){r=0;s=o}else{t=j;q=20654}}else{t=k;q=20654}if((q|0)==20654){k=t-45688|0;r=1;s=(k|0)<(o|0)?k:o}o=aQ(45688,171536)|0;if((o|0)==0){k=aQ(45688,171480)|0;if((k|0)==0){u=0;v=s}else{w=k;q=20657}}else{w=o;q=20657}if((q|0)==20657){o=w-45688|0;u=1;v=(o|0)<(s|0)?o:s}s=aQ(45688,171448)|0;do{if((s|0)==0){o=aQ(45688,171424)|0;if((o|0)!=0){x=o;q=20661;break}o=aQ(45688,171408)|0;if((o|0)==0){y=0;z=v}else{x=o;q=20661}}else{x=s;q=20661}}while(0);if((q|0)==20661){q=x-45688|0;y=1;z=(q|0)<(v|0)?q:v}v=f|0;q=z+1|0;uF(v|0,45688,q|0);if((uA(45688)|0)>>>0>=q>>>0){a[f+((q|0)==0?0:z)|0]=0}z=d;q=e+3|0;a[q]=0;x=e+2|0;a[x]=0;s=e+1|0;a[s]=0;a[z]=37;aI(z|0,1,4,c[10030]|0);a[q]=0;a[x]=0;a[s]=0;a[z]=12;aI(z|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[q]=-128;a[x]=0;a[s]=0;a[z]=10;aI(z|0,1,4,c[10030]|0);a[q]=0;a[x]=0;a[s]=0;a[z]=40;aI(z|0,1,4,c[10030]|0);a[q]=0;a[x]=0;a[s]=0;a[z]=12;aI(z|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[q]=0;a[x]=0;a[s]=0;a[z]=2;aI(z|0,1,4,c[10030]|0);a[q]=0;a[x]=0;a[s]=0;a[z]=82;aI(z|0,1,4,c[10030]|0);a[q]=0;a[x]=0;a[s]=1;a[z]=76;aI(z|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[q]=0;a[x]=0;a[s]=0;a[z]=2;aI(z|0,1,4,c[10030]|0);e=~~(+h[5710]*(-0.0- +g[11418])*35.28);a[q]=e>>>24&255;a[x]=e>>>16&255;a[s]=e>>>8&255;a[z]=e&255;aI(z|0,1,4,c[10030]|0);c[d>>2]=0;aI(z|0,1,4,c[10030]|0);e=c[11262]|0;a[q]=e>>>24&255;a[x]=e>>>16&255;a[s]=e>>>8&255;a[z]=e&255;aI(z|0,1,4,c[10030]|0);e=c[11262]|0;a[q]=e>>>24&255;a[x]=e>>>16&255;a[s]=e>>>8&255;a[z]=e&255;aI(z|0,1,4,c[10030]|0);a[q]=0;a[x]=0;a[s]=m;a[z]=n;aI(z|0,1,4,c[10030]|0);aF(r|0,c[10030]|0);aF(u|0,c[10030]|0);aF(y|0,c[10030]|0);y=c[11252]|0;if((y|0)==9|(y|0)==2){u=c[10030]|0;aF(-18|0,u|0)}else if((y|0)==8){aF(-120|0,c[10030]|0)}else if((y|0)==11|(y|0)==3){aF(-94|0,c[10030]|0)}else if((y|0)==12|(y|0)==13){aF(-14|0,c[10030]|0)}else{aF(1,c[10030]|0)}aF(0,c[10030]|0);aF(0,c[10030]|0);aF(0,c[10030]|0);aF(0,c[10030]|0);y=0;while(1){if(y>>>0<(uA(v|0)|0)>>>0){A=a[f+y|0]|0}else{A=0}aF(A|0,c[10030]|0);aF(0,c[10030]|0);u=y+1|0;if((u|0)<32){y=u}else{B=0;break}}while(1){if(B>>>0<(uA(v|0)|0)>>>0){C=a[f+B|0]|0}else{C=0}aF(C|0,c[10030]|0);aF(0,c[10030]|0);y=B+1|0;if((y|0)<64){B=y}else{D=0;break}}do{aF(0,c[10030]|0);aF(0,c[10030]|0);D=D+1|0;}while((D|0)<32);c[d>>2]=0;aI(z|0,1,4,c[10030]|0);c[d>>2]=0;aI(z|0,1,4,c[10030]|0);c[d>>2]=0;aI(z|0,1,4,c[10030]|0);c[d>>2]=0;aI(z|0,1,4,c[10030]|0);c[d>>2]=0;aI(z|0,1,4,c[10030]|0);c[d>>2]=0;aI(z|0,1,4,c[10030]|0);aF(0,c[10030]|0);aF(0,c[10030]|0);aF(0,c[10030]|0);aF(0,c[10030]|0);aF(0,c[10030]|0);aF(0,c[10030]|0);aF(0,c[10030]|0);aF(0,c[10030]|0);aF(0,c[10030]|0);aF(0,c[10030]|0);aF(0,c[10030]|0);aF(0,c[10030]|0);a[q]=0;a[x]=0;a[s]=0;a[z]=37;aI(z|0,1,4,c[10030]|0);a[q]=0;a[x]=0;a[s]=0;a[z]=12;aI(z|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;a[q]=0;a[x]=0;a[s]=0;a[z]=2;aI(z|0,1,4,c[10030]|0);i=b;return}function tP(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0;b=i;i=i+8|0;d=b|0;if((c[11560]|0)==0){i=b;return}if((c[11552]|0)>0){tL(c[11554]|0);c[11552]=0}e=d|0;f=d+3|0;a[f]=0;g=d+2|0;a[g]=0;h=d+1|0;a[h]=0;a[e]=27;aI(e|0,1,4,c[10030]|0);a[f]=0;a[g]=0;a[h]=0;a[e]=16;aI(e|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;d=c[11300]|0;a[f]=d>>>24&255;a[g]=d>>>16&255;a[h]=d>>>8&255;a[e]=d&255;aI(e|0,1,4,c[10030]|0);d=(c[(c[3524]|0)+12>>2]|0)-(c[11301]|0)|0;a[f]=d>>>24&255;a[g]=d>>>16&255;a[h]=d>>>8&255;a[e]=d&255;aI(e|0,1,4,c[10030]|0);d=2;while(1){j=(d|0)<(c[11560]<<1|0);a[f]=0;a[g]=0;a[h]=0;a[e]=54;aI(e|0,1,4,c[10030]|0);a[f]=0;a[g]=0;a[h]=0;a[e]=16;aI(e|0,1,4,c[10030]|0);c[11294]=(c[11294]|0)+1;if(!j){break}j=c[45200+(d<<2)>>2]|0;a[f]=j>>>24&255;a[g]=j>>>16&255;a[h]=j>>>8&255;a[e]=j&255;aI(e|0,1,4,c[10030]|0);j=(c[(c[3524]|0)+12>>2]|0)-(c[45200+((d|1)<<2)>>2]|0)|0;a[f]=j>>>24&255;a[g]=j>>>16&255;a[h]=j>>>8&255;a[e]=j&255;aI(e|0,1,4,c[10030]|0);d=d+2|0}d=c[11300]|0;a[f]=d>>>24&255;a[g]=d>>>16&255;a[h]=d>>>8&255;a[e]=d&255;aI(e|0,1,4,c[10030]|0);d=(c[(c[3524]|0)+12>>2]|0)-(c[11301]|0)|0;a[f]=d>>>24&255;a[g]=d>>>16&255;a[h]=d>>>8&255;a[e]=d&255;aI(e|0,1,4,c[10030]|0);c[11560]=0;i=b;return}function tQ(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;f=i;i=i+8|0;j=f|0;if((e|0)==0){i=f;return}if((a[e]|0)==0){i=f;return}do{if((a[37456]&1)==0){if((cy(e|0,170608)|0)==0){break}k=c[3524]|0;if((c[k+8>>2]|0)>>>0>b>>>0){if((c[k+12>>2]|0)>>>0>d>>>0){l=d;m=b}else{n=20699}}else{n=20699}if((n|0)==20699){uh(-1,171048,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=d,v)|0);k=c[3524]|0;o=c[k+8>>2]|0;p=c[k+12>>2]|0;l=p>>>0>d>>>0?d:p;m=o>>>0>b>>>0?b:o}if(!((m|0)==(c[11298]|0)&(l|0)==(c[11296]|0))){tN();c[11298]=m;c[11296]=l}if((c[11280]|0)!=(c[11562]|0)){o=j|0;p=j+3|0;a[p]=0;k=j+2|0;a[k]=0;q=j+1|0;a[q]=0;a[o]=24;r=c[10030]|0;aI(o|0,1,4,r|0);a[p]=0;a[k]=0;a[q]=0;a[o]=12;r=c[10030]|0;aI(o|0,1,4,r|0);c[11294]=(c[11294]|0)+1;r=c[11562]|0;a[p]=r>>>24&255;a[k]=r>>>16&255;a[q]=r>>>8&255;a[o]=r&255;r=c[10030]|0;aI(o|0,1,4,r|0);c[11280]=c[11562]}h[5613]=1.0;uF(44912,170592,16);a[238232]=0;c[59556]=0;c[59562]=45688;g[59560]=+g[11418];if(((c[11414]|0)-1|0)>>>0<2){a[238208]=1}r=j|0;o=j+3|0;a[o]=0;q=j+2|0;a[q]=0;k=j+1|0;a[k]=0;a[r]=22;p=c[10030]|0;aI(r|0,1,4,p|0);a[o]=0;a[q]=0;a[k]=0;a[r]=12;p=c[10030]|0;aI(r|0,1,4,p|0);c[11294]=(c[11294]|0)+1;a[o]=0;a[q]=0;a[k]=0;a[r]=24;k=c[10030]|0;aI(r|0,1,4,k|0);k=e;do{r=lJ(k,1,c[59562]|0,+g[59560],0.0,1,1,0)|0;if((a[r]|0)==0){break}cS[c[(c[3524]|0)+160>>2]&511]();if((a[r]|0)==125){uh(-1,203744,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{uh(-1,203528,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}k=r+1|0;}while((a[k]|0)!=0);k=c[11414]|0;if((k-1|0)>>>0<2){r=(c[11298]|0)-b|0;if((c[11262]|0)==0){s=0}else{s=(c[11296]|0)-d|0}c[11414]=0;a[238208]=0;if((k|0)==2){tQ(b-r|0,d-s|0,e)}else if((k|0)==1){tQ(b-((r|0)/2&-1)|0,d-((s|0)/2&-1)|0,e)}c[11414]=k}tO();g[59564]=0.0;i=f;return}}while(0);n$(b,d,e);i=f;return}function tR(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;f=i;do{if((a[37456]&1)==0){if((cy(e|0,170608)|0)==0){break}h[5613]=1.0;a[238320]=0;uF(44912,216760,16);c[11678]=b;c[11674]=d;g=e;while(1){j=lJ(g,1,179864,1.0,0.0,1,1,0)|0;if((a[j]|0)==0){k=20745;break}cS[c[(c[3524]|0)+160>>2]&511]();if((a[j]|0)==125){uh(-1,203744,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{uh(-1,203528,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}l=j+1|0;if((a[l]|0)==0){k=20743;break}else{g=l}}if((k|0)==20745){i=f;return}else if((k|0)==20743){i=f;return}}}while(0);g=uA(e|0)|0;l=c[11676]|0;if((g+b|0)>>>0>l>>>0){j=l-g|0;m=(j|0)<0?0:j}else{m=b}if(m>>>0>>0){n=e;o=m;p=l}else{i=f;return}while(1){l=a[n]|0;if(l<<24>>24==0){k=20742;break}do{if(p>>>0>>0|(c[11672]|0)>>>0>>0){q=p}else{m=aa(p,d)+o|0;if((a[(c[11680]|0)+m|0]|0)>=5){q=p;break}a[(c[11684]|0)+m|0]=l;m=aa(c[11676]|0,d)+o|0;a[(c[11680]|0)+m|0]=5;q=c[11676]|0}}while(0);l=o+1|0;if(l>>>0>>0){n=n+1|0;o=l;p=q}else{k=20744;break}}if((k|0)==20742){i=f;return}else if((k|0)==20744){i=f;return}}function tS(){var a=0,b=0,d=0;a=c[13656]|0;if((a|0)==0){return}b=c[13602]|0;tY(4,1,a<<1);if((a|0)>0){d=0;do{tZ(c[b+(d<<2)>>2]|0);d=d+1|0;}while((d|0)<(a|0))}c[13656]=0;return}function tT(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;if((c[13642]|0)==(a|0)){return}c[13642]=a;tS();if((a|0)>8){b=(a|0)%9&-1}else{b=a}a=(c[3524]|0)+60|0;if((b|0)<1){c[a>>2]=106;return}c[a>>2]=80;a=b<<3;b=c[13624]|0;d=c[242808+(a-8<<2)>>2]|0;if((d|0)==0){e=0}else{e=(aa(d<<1,b)>>>0)/3>>>0}c[13570]=e;e=c[242808+(a-7<<2)>>2]|0;if((e|0)==0){f=0}else{f=(aa(e<<1,b)>>>0)/3>>>0}c[13571]=f;e=c[242808+(a-6<<2)>>2]|0;if((e|0)==0){g=0}else{g=(aa(e<<1,b)>>>0)/3>>>0}c[13572]=g;g=c[242808+(a-5<<2)>>2]|0;if((g|0)==0){h=0}else{h=(aa(g<<1,b)>>>0)/3>>>0}c[13573]=h;h=c[242808+(a-4<<2)>>2]|0;if((h|0)==0){i=0}else{i=(aa(h<<1,b)>>>0)/3>>>0}c[13574]=i;i=c[242808+(a-3<<2)>>2]|0;if((i|0)==0){j=0}else{j=(aa(i<<1,b)>>>0)/3>>>0}c[13575]=j;j=c[242808+(a-2<<2)>>2]|0;if((j|0)==0){k=0}else{k=(aa(j<<1,b)>>>0)/3>>>0}c[13576]=k;k=c[242808+(a-1<<2)>>2]|0;if((k|0)==0){l=0}else{l=(aa(k<<1,b)>>>0)/3>>>0}c[13577]=l;c[13580]=f;c[13578]=1;return}function tU(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;d=c[3524]|0;e=c[d+8>>2]|0;f=e>>>0>a>>>0?a:e;e=c[d+12>>2]|0;d=e>>>0>b>>>0?b:e;e=f-(c[13598]|0)|0;b=d-(c[13596]|0)|0;a=(e|0)>-1?e:-e|0;g=b*10&-1;h=(g|0)>-1?g:-g|0;g=a*10&-1;do{if((g|0)<(h|0)){i=((((aa((a*25&-1|0)/(h|0)&-1,a)|0)/6&-1)*5&-1)+((h|0)/2&-1)|0)/5&-1}else{if((a|0)==0){return}else{i=(aa((h|0)/(a|0)&-1,(h|0)/24&-1)+g|0)/10&-1;break}}}while(0);g=c[13580]|0;h=c[13578]|0;if((i|0)>(g|0)){a=i;j=g;g=h;while(1){k=a-j|0;l=f-((aa(k,e)|0)/(i|0)&-1)|0;m=d-((aa(k,b)|0)/(i|0)&-1)|0;if((g&1|0)==0){m5(l,m)}else{m6(l,m)}m=(c[13578]|0)+1|0;l=(m|0)>7?0:m;c[13578]=l;m=c[54280+(l<<2)>>2]|0;c[13580]=m;if((k|0)>(m|0)){a=k;j=m;g=l}else{n=k;o=l;break}}}else{n=i;o=h}if((o&1|0)==0){m5(f,d)}else{m6(f,d)}c[13580]=(c[13580]|0)-n;return}function tV(){var b=0,d=0,e=0,f=0.0,g=0,i=0,j=0,k=0;uD(54528,89360,15);b=uA(54528)|0;d=c[13630]|0;e=c[d>>2]|0;L27708:do{if((e|0)==0){f=1.0}else{g=0;i=e;while(1){if((uA(i|0)|0)==(b|0)){if((uJ(54528,i|0,b|0)|0)==0){break}}j=g+1|0;k=c[d+(j<<4)>>2]|0;if((k|0)==0){f=1.0;break L27708}else{g=j;i=k}}f=+h[d+(g<<4)+8>>3]}}while(0);c[13628]=12;d=c[3524]|0;c[d+16>>2]=((((c[d+8>>2]|0)+182|0)>>>0)/((c[13604]|0)>>>0)>>>0)*12&-1;d=c[3524]|0;c[d+20>>2]=~~(f*+(aa((((c[d+8>>2]|0)+182|0)>>>0)/((c[13604]|0)>>>0)>>>0,c[13628]|0)>>>0>>>0)*.527);c[13622]=1;a[54472]=0;c[13604]=432;a[54400]=0;a[54336]=0;a[54576]=0;a[54424]=0;c[13646]=c[13586];c[13647]=c[13587];c[13648]=c[13588];c[13649]=c[13589];c[13650]=c[13590];c[13651]=c[13591];c[13652]=c[13592];c[13653]=c[13593];c[13654]=c[13594];c[13655]=c[13595];c[13554]=0;return}function tW(a){a=a|0;var b=0,d=0,e=0.0,f=0,g=0.0,j=0;b=i;d=a>>4;e=+(d|0)/100.0;f=a&15;do{if((f|0)==0){uD(243392,164560,23);i=b;return}else if((f|0)==2|(f|0)==5){a=(d|0)%5&-1;if((a|0)==4){g=.5;j=20811;break}else if((a|0)==2){g=.25;j=20811;break}else if((a|0)==1){j=20810;break}else if((a|0)==0){g=0.0;j=20811;break}else if((a|0)==3){g=.75;j=20811;break}else{j=20809;break}}else if((f|0)==4){be(243392,164584,(v=i,i=i+24|0,c[v>>2]=55376,h[v+8>>3]=e,c[v+16>>2]=0,v)|0);i=b;return}else if((f|0)==1){j=20809}else{be(243392,164424,(v=i,i=i+16|0,c[v>>2]=55372,c[v+8>>2]=0,v)|0);i=b;return}}while(0);if((j|0)==20809){if(e==1.0){j=20810}else{g=e;j=20811}}if((j|0)==20810){uB(243392,55372);i=b;return}else if((j|0)==20811){j=bW(55376)|0;f=bW(55380)|0;e=(1.0-g)*255.0;d=~~(e+g*+(bW(55384)|0));be(243392,164536,(v=i,i=i+32|0,c[v>>2]=~~(e+g*+(j|0)),c[v+8>>2]=~~(e+g*+(f|0)),c[v+16>>2]=d,c[v+24>>2]=0,v)|0);i=b;return}}function tX(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0.0,j=0,k=0,l=0,m=0,n=0;f=i;g=+h[6936];if((a[e]|0)==0){i=f;return}do{if((a[37456]&1)==0){if((cy(e|0,170608)|0)==0){break}j=a[55472]|0;if(!(j&(c[13838]|0)==(b|0)&(c[13834]|0)==(d|0))){if(!j){j=c[10030]|0;aI(162736,17,1,j|0);a[55472]=1;a[72328]=0}j=c[10030]|0;k=(c[13832]|0)-d|0;cf(j|0,162768,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=k,v)|0);c[13838]=b;c[13834]=d}h[5613]=1.0;uF(44912,216760,16);a[238512]=0;h[29815]=+h[6936];k=c[13866]|0;if((aY(k|0,164216)|0)==0){l=20829}else{if((aY(k|0,173184)|0)==0){l=20829}else{m=e}}if((l|0)==20829){a[238488]=1;m=e}do{k=lJ(m,1,179864,g,0.0,1,1,0)|0;if((a[k]|0)==0){break}cS[c[(c[3524]|0)+160>>2]&511]();if((a[k]|0)==125){uh(-1,203744,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else{uh(-1,203528,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}m=k+1|0;}while((a[m]|0)!=0);k=c[13866]|0;if((aY(k|0,164216)|0)==0){l=20837}else{if((aY(k|0,173184)|0)==0){l=20837}}if((l|0)==20837){j=(c[13838]|0)-b|0;if((c[13840]|0)==0){n=0}else{n=(c[13834]|0)-d|0}c[13866]=179864;a[238488]=0;do{if((aY(k|0,164216)|0)==0){tX(b-j|0,d-n|0,e)}else{if((aY(k|0,173184)|0)!=0){break}tX(b-((j|0)/2&-1)|0,d-((n|0)/2&-1)|0,e)}}while(0);c[13866]=k}h[6936]=g;h[29816]=0.0;i=f;return}}while(0);mO(b,d,e);i=f;return}function tY(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;i=i+24|0;g=f|0;h=f+8|0;j=f+16|0;if(b>>>0>=16){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167440,v)|0)}if(d>>>0>=128){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167408,v)|0)}if((e|0)<=-1){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167384,v)|0)}k=d<<5&4064|b<<12&61440;if((e|0)<31){b=k|e&31;d=j;if(b>>>0>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[d]=k>>>8&255;a[j+1|0]=b&255;b=c[10030]|0;aI(d|0,1,2,b|0);i=f;return}b=k|31;d=h;if(b>>>0>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[d]=k>>>8&255;a[h+1|0]=b&255;aI(d|0,1,2,c[10030]|0);d=g;if((e|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((e|0)>=32768){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}a[d]=e>>>8&255;a[g+1|0]=e&255;aI(d|0,1,2,c[10030]|0);i=f;return}function tZ(b){b=b|0;var d=0,e=0,f=0;d=i;i=i+8|0;e=d|0;if((b|0)<=-32769){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167584,v)|0)}if((b|0)<32768){f=e;a[f]=b>>>8&255;a[e+1|0]=b&255;b=c[10030]|0;aI(f|0,1,2,b|0);i=d;return}else{uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}}function t_(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0;g=i;i=i+8|0;h=g|0;j=((e|0)>254?3:1)+e|0;k=j&1;l=(k|0)==0;tY(b,d,j);j=c[10030]|0;do{if((e|0)<255){d=e<<24>>24;aF(d|0,j|0)}else{d=a[241904]|0;aF(d|0,j|0);d=h;if((e|0)<32768){a[d]=e>>>8&255;a[h+1|0]=e&255;b=c[10030]|0;aI(d|0,1,2,b|0);break}else{uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=167472,v)|0)}}}while(0);do{if((f|0)==0){h=k+e|0;if((h|0)>0){m=0}else{break}do{aF(0,c[10030]|0);m=m+1|0;}while((m|0)<(h|0))}else{aI(f|0,1,e|0,c[10030]|0)}}while(0);if(l){i=g;return}aF(a[241896]|0|0,c[10030]|0);i=g;return}function t$(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;f=c[60208]|0;g=c[f>>2]|0;h=a[240824]|0;if((g&1|0)==0){if(h){i=c[60230]|0;j=c[60226]|0;k=c[10030]|0;aF(29,k|0);k=j>>>5&31|32;l=c[10030]|0;aF(k|0,l|0);l=j&31|96;j=c[10030]|0;aF(l|0,j|0);j=i>>>5&31|32;l=c[10030]|0;aF(j|0,l|0);l=i&31|64;i=c[10030]|0;aF(l|0,i|0);i=c[60228]|0;l=c[60224]|0;j=l>>>5&31|32;k=c[10030]|0;aF(j|0,k|0);k=l&31|96;l=c[10030]|0;aF(k|0,l|0);l=i>>>5&31|32;k=c[10030]|0;aF(l|0,k|0);k=i&31|64;i=c[10030]|0;aF(k|0,i|0);a[240824]=0;i=c[60208]|0;m=i;n=c[i>>2]|0}else{m=f;n=g}c[m>>2]=n>>>1;return}c[60228]=b;if(h){c[60224]=d}else{c[60230]=b;c[60224]=d;c[60226]=d;a[240824]=1}c[f>>2]=(c[f>>2]|0)>>>1|-2147483648;if((e|0)==0){return}e=c[60230]|0;f=c[60226]|0;aF(29,c[10030]|0);aF(f>>>5&31|32|0,c[10030]|0);aF(f&31|96|0,c[10030]|0);aF(e>>>5&31|32|0,c[10030]|0);aF(e&31|64|0,c[10030]|0);e=c[60228]|0;f=c[60224]|0;aF(f>>>5&31|32|0,c[10030]|0);aF(f&31|96|0,c[10030]|0);aF(e>>>5&31|32|0,c[10030]|0);aF(e&31|64|0,c[10030]|0);a[240824]=0;return}function t0(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;e=b>>>0>4095?4095:b;b=d>>>0>3131?3131:d;d=(e>>>7)+32|0;f=e>>>2&31|64;g=(b>>>7)+32|0;h=b>>>2&31|96;i=e&3|b<<2&12|96;if((a[226904]|0|0)!=(g|0)){b=c[10030]|0;aF(g|0,b|0)}if((a[226920]|0|0)!=(i|0)){b=c[10030]|0;aF(i|0,b|0)}do{if((a[226896]|0|0)==(h|0)){if((a[226920]|0|0)!=(i|0)){j=20908;break}b=a[226912]|0;if((b<<24>>24|0)==(d|0)){k=b}else{j=20908}}else{j=20908}}while(0);if((j|0)==20908){j=c[10030]|0;aF(h|0,j|0);k=a[226912]|0}if((k<<24>>24|0)==(d|0)){l=c[10030]|0;m=aF(f|0,l|0)|0;n=d&255;a[226912]=n;o=g&255;a[226904]=o;p=h&255;a[226896]=p;q=i&255;a[226920]=q;return}aF(d|0,c[10030]|0);l=c[10030]|0;m=aF(f|0,l|0)|0;n=d&255;a[226912]=n;o=g&255;a[226904]=o;p=h&255;a[226896]=p;q=i&255;a[226920]=q;return}function t1(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0;g=i;i=i+8|0;j=g|0;c[j>>2]=b;b=e+12|0;c[b>>2]=1;k=e|0;c[k>>2]=0;l=e+4|0;c[l>>2]=0;m=e+8|0;c[m>>2]=0;n=e+16|0;c[n>>2]=0;o=e+20|0;c[o>>2]=2e3;h[f>>3]=0.0;c[e+24>>2]=-1;p=e+28|0;c[p>>2]=-1;q=d;d=0;r=0;L27863:while(1){s=q;L27865:while(1){t=a[s]|0;do{if((t<<24>>24|0)==37){break L27865}else if((t<<24>>24|0)==0){break L27863}else if((t<<24>>24|0)==32){u=c[j>>2]|0;if((a[u]|0)==32){w=u}else{break}do{w=w+1|0;c[j>>2]=w;}while((a[w]|0)==32)}else{u=c[j>>2]|0;if(t<<24>>24!=(a[u]|0)){break L27863}c[j>>2]=u+1}}while(0);s=s+1|0}t=a[s+1|0]|0;do{if((t|0)==109){u=c[j>>2]|0;x=a[u]|0;do{if((x-48&255)<10){y=u+1|0;z=(x<<24>>24)-48|0;A=a[y]|0;if((A-48&255)>=10){B=y;C=z;break}B=u+2|0;C=((z*10&-1)-48|0)+(A<<24>>24)|0}else{B=u;C=0}}while(0);c[j>>2]=B;c[n>>2]=C-1;D=d;E=r+1|0}else if((t|0)==66){u=c[j>>2]|0;x=0;while(1){if((x|0)>=12){F=20933;break}A=40552+(x<<5)|0;G=uA(A|0)|0;if((uJ(u|0,A|0,G|0)|0)==0){F=20932;break}else{x=x+1|0}}if((F|0)==20932){F=0;c[j>>2]=u+G;H=x}else if((F|0)==20933){F=0;uh(-2,199248,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);H=0}c[n>>2]=H;D=d;E=r}else if((t|0)==106){A=c[j>>2]|0;z=a[A]|0;do{if((z-48&255)<10){y=A+1|0;I=(z<<24>>24)-48|0;J=a[y]|0;if((J-48&255)>=10){K=y;L=I;break}y=A+2|0;M=((I*10&-1)-48|0)+(J<<24>>24)|0;J=a[y]|0;if((J-48&255)>=10){K=y;L=M;break}K=A+3|0;L=((M*10&-1)-48|0)+(J<<24>>24)|0}else{K=A;L=0}}while(0);c[j>>2]=K;c[p>>2]=L-1;D=d+1|0;E=r+1|0}else if((t|0)==100){A=c[j>>2]|0;z=a[A]|0;do{if((z-48&255)<10){x=A+1|0;u=(z<<24>>24)-48|0;J=a[x]|0;if((J-48&255)>=10){N=x;O=u;break}N=A+2|0;O=((u*10&-1)-48|0)+(J<<24>>24)|0}else{N=A;O=0}}while(0);c[b>>2]=O;c[j>>2]=N;D=d;E=r+1|0}else if((t|0)==115){t3(e,+uz(c[j>>2]|0,j)+-946684800.0);D=d;E=r}else if((t|0)==98){A=c[j>>2]|0;z=0;while(1){if((z|0)>=12){F=20928;break}J=72368+(z<<3)|0;P=uA(J|0)|0;if((uJ(A|0,J|0,P|0)|0)==0){F=20927;break}else{z=z+1|0}}if((F|0)==20928){F=0;uh(-2,115608,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);Q=0}else if((F|0)==20927){F=0;c[j>>2]=A+P;Q=z}c[n>>2]=Q;D=d;E=r}else if((t|0)==77){J=c[j>>2]|0;u=a[J]|0;do{if((u-48&255)<10){x=J+1|0;M=(u<<24>>24)-48|0;y=a[x]|0;if((y-48&255)>=10){R=x;S=M;break}R=J+2|0;S=((M*10&-1)-48|0)+(y<<24>>24)|0}else{R=J;S=0}}while(0);c[l>>2]=S;c[j>>2]=R;D=d;E=r}else if((t|0)==89){J=c[j>>2]|0;u=a[J]|0;do{if((u-48&255)<10){z=J+1|0;A=(u<<24>>24)-48|0;y=a[z]|0;if((y-48&255)>=10){T=z;U=A;break}z=J+2|0;M=((A*10&-1)-48|0)+(y<<24>>24)|0;y=a[z]|0;if((y-48&255)>=10){T=z;U=M;break}z=J+3|0;A=((M*10&-1)-48|0)+(y<<24>>24)|0;y=a[z]|0;if((y-48&255)>=10){T=z;U=A;break}T=J+4|0;U=((A*10&-1)-48|0)+(y<<24>>24)|0}else{T=J;U=0}}while(0);c[o>>2]=U;c[j>>2]=T;D=d;E=r+1|0}else if((t|0)==83){J=c[j>>2]|0;u=a[J]|0;do{if((u-48&255)<10){y=J+1|0;A=(u<<24>>24)-48|0;z=a[y]|0;if((z-48&255)>=10){V=y;W=A;break}V=J+2|0;W=((A*10&-1)-48|0)+(z<<24>>24)|0}else{V=J;W=0}}while(0);c[k>>2]=W;c[j>>2]=V;J=a[V]|0;if(J<<24>>24!=46){u=c[12886]|0;if((u|0)==0){D=d;E=r;break}if(J<<24>>24!=(a[u]|0)){D=d;E=r;break}}h[f>>3]=+uz(V,0);D=d;E=r}else if((t|0)==72){u=c[j>>2]|0;J=a[u]|0;do{if((J-48&255)<10){z=u+1|0;A=(J<<24>>24)-48|0;y=a[z]|0;if((y-48&255)>=10){X=z;Y=A;break}X=u+2|0;Y=((A*10&-1)-48|0)+(y<<24>>24)|0}else{X=u;Y=0}}while(0);c[m>>2]=Y;c[j>>2]=X;D=d;E=r}else if((t|0)==121){u=c[j>>2]|0;J=a[u]|0;if((J-48&255)<10){y=u+1|0;A=(J<<24>>24)-48|0;J=a[y]|0;if((J-48&255)<10){Z=u+2|0;_=((A*10&-1)-48|0)+(J<<24>>24)|0}else{Z=y;_=A}c[o>>2]=_;c[j>>2]=Z;if((_|0)<69){$=_;F=20945}else{aa=_}}else{c[o>>2]=0;c[j>>2]=u;$=0;F=20945}if((F|0)==20945){F=0;u=$+100|0;c[o>>2]=u;aa=u}c[o>>2]=aa+1900;D=d;E=r+1|0}else{uh(-2,148656,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);D=d;E=r}}while(0);q=s+2|0;d=D;r=E}E=c[k>>2]|0;if((E|0)>59){c[l>>2]=(c[l>>2]|0)+((E|0)/60&-1);c[k>>2]=(E|0)%60&-1}E=c[l>>2]|0;if((E|0)>59){c[m>>2]=(c[m>>2]|0)+((E|0)/60&-1);c[l>>2]=(E|0)%60&-1}E=c[m>>2]|0;if((E|0)>23){l=(E|0)/24&-1;if((d|0)!=0){c[p>>2]=(c[p>>2]|0)+l}c[b>>2]=(c[b>>2]|0)+l;c[m>>2]=(E|0)%24&-1}if((r|0)==0){ab=c[j>>2]|0;i=g;return ab|0}do{if((d|0)==0){r=c[n>>2]|0;if((r|0)<0){uf(-2,116496,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else{ac=r;ad=c[b>>2]|0;break}}else{r=c[p>>2]|0;if((r|0)<0){uf(-2,131384,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else{c[n>>2]=0;E=r+1|0;c[b>>2]=E;ac=0;ad=E;break}}}while(0);if((ad|0)<1){uf(-2,103704,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}if((ac|0)>11){c[o>>2]=(c[o>>2]|0)+((ac|0)/12&-1);p=(ac|0)%12&-1;c[n>>2]=p;ae=p;af=ad}else{ae=ac;af=ad}while(1){ad=c[34056+(ae<<2)>>2]|0;do{if((ae|0)==1){ac=c[o>>2]|0;if((ac&3|0)!=0){ag=0;break}ag=(((ac|0)%100&-1|0)!=0|((ac|0)%400&-1|0)==0)&1}else{ag=0}}while(0);s=ag+ad|0;if((af|0)<=(s|0)){break}ac=ae+1|0;c[n>>2]=ac;if((ac|0)==12){c[o>>2]=(c[o>>2]|0)+1;c[n>>2]=0;ah=0}else{ah=ac}ac=af-s|0;c[b>>2]=ac;ae=ah;af=ac}ab=c[j>>2]|0;i=g;return ab|0}function t2(a){a=a|0;var b=0,d=0,e=0.0,f=0.0,g=0.0,h=0,i=0.0,j=0,k=0.0,l=0.0,m=0.0,n=0,o=0.0,p=0.0;b=c[a+20>>2]|0;do{if((b|0)<2e3){d=b;e=0.0;while(1){if((d&3|0)==0){f=((d|0)%100&-1|0)!=0|((d|0)%400&-1|0)==0?366.0:365.0}else{f=365.0}g=e-f;h=d+1|0;if((h|0)<2e3){d=h;e=g}else{i=g;break}}}else{if((b|0)>2e3){j=2e3;k=0.0}else{i=0.0;break}while(1){if((j&3|0)==0){l=((j|0)%100&-1|0)!=0|((j|0)%400&-1|0)==0?366.0:365.0}else{l=365.0}e=k+l;d=j+1|0;if((d|0)<(b|0)){j=d;k=e}else{i=e;break}}}}while(0);j=c[a+12>>2]|0;if((j|0)>0){d=c[a+16>>2]|0;if((d|0)>0){h=0;k=i;while(1){l=+(c[34056+(h<<2)>>2]|0);do{if((h|0)==1){if((b&3|0)!=0){m=0.0;break}m=+((((b|0)%100&-1|0)!=0|((b|0)%400&-1|0)==0)&1|0)}else{m=0.0}}while(0);f=k+(l+m);n=h+1|0;if((n|0)<(d|0)){h=n;k=f}else{o=f;break}}}else{o=i}p=o+(+(j|0)+-1.0)}else{p=i+ +(c[a+28>>2]|0)}return+(+(c[a>>2]|0)+(+(c[a+4>>2]|0)+(p*24.0+ +(c[a+8>>2]|0))*60.0)*60.0)}function t3(a,b){a=a|0;b=+b;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0,q=0,r=0.0,s=0,t=0,u=0.0,w=0,x=0,y=0,z=0.0,A=0,B=0;d=i;if(+P(+b)>1.0e12){uh(-1,96560,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);e=-1;i=d;return e|0}f=a+20|0;c[f>>2]=2e3;g=a|0;h=a+4|0;j=a+8|0;k=a+16|0;l=a+28|0;c[l>>2]=0;m=a+12|0;uE(a|0,0,20);L28020:do{if(b<0.0){n=6;o=b;p=2e3;do{p=p-1|0;if((p&3|0)==0){q=((p|0)%100&-1|0)!=0|((p|0)%400&-1|0)==0?366:365}else{q=365}o=o+ +(q|0)*86400.0;n=(n+371|0)-q|0;}while(o<0.0);c[f>>2]=p;r=o;s=n;t=p}else{u=b;w=6;x=2e3;while(1){if((x&3|0)==0){y=((x|0)%100&-1|0)!=0|((x|0)%400&-1|0)==0?366:365}else{y=365}z=+(y|0)*86400.0;if(u>2]=A;u=u-z;w=(w-364|0)+y|0;x=A}}}while(0);y=~~(r/86400.0);c[l>>2]=y;b=r- +(y|0)*86400.0;l=(~~b|0)/3600&-1;c[j>>2]=l;r=b- +(l*3600&-1|0);l=(~~r|0)/60&-1;c[h>>2]=l;c[g>>2]=~~(r- +(l*60&-1|0));c[a+24>>2]=(y+s|0)%7&-1;s=y;y=0;while(1){a=c[34056+(y<<2)>>2]|0;do{if((y|0)==1){if((t&3|0)!=0){B=0;break}B=(((t|0)%100&-1|0)!=0|((t|0)%400&-1|0)==0)&1}else{B=0}}while(0);l=B+a|0;if((s|0)<(l|0)){break}g=y+1|0;c[k>>2]=g;s=s-l|0;y=g}c[m>>2]=s+1;e=0;i=d;return e|0}function t4(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=+g;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,P=0,Q=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0.0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0;j=i;uE(b|0,0,d|0);k=f+16|0;l=f+24|0;m=f+12|0;n=f+8|0;o=f+28|0;p=f+4|0;q=f|0;r=f+20|0;s=e;e=0;t=b;L28044:while(1){b=a[s]|0;do{if((b<<24>>24|0)==0){u=e;w=21166;break L28044}else if((b<<24>>24|0)==37){x=s+1|0;y=(a[x]|0)==48;z=y&1;A=y?s+2|0:x;x=a[A]|0;if((x-48&255)<10){B=0;C=A;D=x;while(1){E=((B*10&-1)-48|0)+(D<<24>>24)|0;F=C+1|0;G=a[F]|0;if((G-48&255)<10){B=E;C=F;D=G}else{H=E;I=F;J=G;break}}}else{H=0;I=A;J=x}if(J<<24>>24==46){D=I+1|0;C=a[D]|0;if((C-48&255)<10){B=0;G=D;F=C;while(1){E=((B*10&-1)-48|0)+(F<<24>>24)|0;K=G+1|0;L=a[K]|0;if((L-48&255)<10){B=E;G=K;F=L}else{M=E;N=K;P=L;break}}}else{M=0;N=D;P=C}Q=N;S=(M|0)>6?6:M;T=P}else{Q=I;S=0;T=J}F=T<<24>>24;do{if((F|0)==77){if((H|0)==0){U=y?z:1;V=2}else{U=z;V=H}if((V+e|0)>>>0>d>>>0){u=0;w=21167;break L28044}G=(U|0)!=0?90536:82208;B=c[p>>2]|0;be(t|0,G|0,(v=i,i=i+16|0,c[v>>2]=V,c[v+8>>2]=B,v)|0);w=21140}else if((F|0)==84){if((t4(t,d-e|0,179088,f,0.0)|0)==0){u=0;w=21143;break L28044}else{w=21140}}else if((F|0)==72){if((H|0)==0){W=y?z:1;X=2}else{W=z;X=H}if((X+e|0)>>>0>d>>>0){u=0;w=21171;break L28044}B=c[n>>2]|0;be(t|0,((W|0)!=0?90536:82208)|0,(v=i,i=i+16|0,c[v>>2]=X,c[v+8>>2]=B,v)|0);w=21140}else if((F|0)==37){if((e+1|0)>>>0>d>>>0){u=0;w=21144;break L28044}a[t]=37;Y=t;Z=e}else if((F|0)==87){B=c[o>>2]|0;G=c[l>>2]|0;do{if((B|0)>(G|0)){x=B-G|0;A=(G|0)>0?x+7|0:x;x=(A|0)/7&-1;if(((A|0)%7&-1|0)<=2){_=x;break}_=x+1|0}else{_=(B|0)==(G|0)&(G|0)==0?52:((c[m>>2]|0)-B|0)>4?52:1}}while(0);if((H|0)==0){$=y?z:1;aa=2}else{$=z;aa=H}if((aa+e|0)>>>0>d>>>0){u=0;w=21154;break L28044}be(t|0,(($|0)!=0?90536:82208)|0,(v=i,i=i+16|0,c[v>>2]=aa,c[v+8>>2]=_,v)|0);w=21140}else if((F|0)==108){B=(H|0)==0?2:H;if((B+e|0)>>>0>d>>>0){u=0;w=21147;break L28044}G=(((c[n>>2]|0)+11|0)%12&-1)+1|0;be(t|0,(y?90536:82208)|0,(v=i,i=i+16|0,c[v>>2]=B,c[v+8>>2]=G,v)|0);w=21140}else if((F|0)==121){if((H|0)==0){ab=y?z:1;ac=2}else{ab=z;ac=H}if((ac+e|0)>>>0>d>>>0){u=0;w=21148;break L28044}G=(c[r>>2]|0)%100&-1;be(t|0,((ab|0)!=0?90536:82208)|0,(v=i,i=i+16|0,c[v>>2]=ac,c[v+8>>2]=G,v)|0);w=21140}else if((F|0)==98|(F|0)==104){G=72368+(c[k>>2]<<3)|0;if(((uA(G|0)|0)+e|0)>>>0>d>>>0){u=0;w=21149;break L28044}uB(t|0,G|0);w=21140}else if((F|0)==73){if((H|0)==0){ad=y?z:1;ae=2}else{ad=z;ae=H}if((ae+e|0)>>>0>d>>>0){u=0;w=21155;break L28044}G=(((c[n>>2]|0)+11|0)%12&-1)+1|0;be(t|0,((ad|0)!=0?90536:82208)|0,(v=i,i=i+16|0,c[v>>2]=ae,c[v+8>>2]=G,v)|0);w=21140}else if((F|0)==65){G=40936+(c[l>>2]<<5)|0;if(((uA(G|0)|0)+e|0)>>>0>d>>>0){u=0;w=21150;break L28044}uB(t|0,G|0);w=21140}else if((F|0)==112){if((e+2|0)>>>0>d>>>0){u=0;w=21151;break L28044}G=(c[n>>2]|0)<12?215536:209856;a[t]=a[G]|0;a[t+1|0]=a[G+1|0]|0;a[t+2|0]=a[G+2|0]|0;w=21140}else if((F|0)==100){if((H|0)==0){af=y?z:1;ag=2}else{af=z;ag=H}if((ag+e|0)>>>0>d>>>0){u=0;w=21168;break L28044}G=c[m>>2]|0;be(t|0,((af|0)!=0?90536:82208)|0,(v=i,i=i+16|0,c[v>>2]=ag,c[v+8>>2]=G,v)|0);w=21140}else if((F|0)==89){if((H|0)==0){ah=y?z:1;ai=4}else{ah=z;ai=H}if((ai+e|0)>>>0>d>>>0){u=0;w=21169;break L28044}G=c[r>>2]|0;be(t|0,((ah|0)!=0?90536:82208)|0,(v=i,i=i+16|0,c[v>>2]=ai,c[v+8>>2]=G,v)|0);w=21140}else if((F|0)==107){G=(H|0)==0?2:H;if((G+e|0)>>>0>d>>>0){u=0;w=21152;break L28044}B=c[n>>2]|0;be(t|0,(y?90536:82208)|0,(v=i,i=i+16|0,c[v>>2]=G,c[v+8>>2]=B,v)|0);w=21140}else if((F|0)==109){if((H|0)==0){aj=y?z:1;ak=2}else{aj=z;ak=H}if((ak+e|0)>>>0>d>>>0){u=0;w=21161;break L28044}B=(c[k>>2]|0)+1|0;be(t|0,((aj|0)!=0?90536:82208)|0,(v=i,i=i+16|0,c[v>>2]=ak,c[v+8>>2]=B,v)|0);w=21140}else if((F|0)==114){if((t4(t,d-e|0,204248,f,0.0)|0)==0){u=0;w=21156;break L28044}else{w=21140}}else if((F|0)==66){B=40552+(c[k>>2]<<5)|0;if(((uA(B|0)|0)+e|0)>>>0>d>>>0){u=0;w=21157;break L28044}uB(t|0,B|0);w=21140}else if((F|0)==68){if((t4(t,d-e|0,75032,f,0.0)|0)==0){u=0;w=21158;break L28044}else{w=21140}}else if((F|0)==82){if((t4(t,d-e|0,199880,f,0.0)|0)==0){u=0;w=21159;break L28044}else{w=21140}}else if((F|0)==115){if((e+12|0)>>>0>d>>>0){u=0;w=21160;break L28044}al=+t2(f);be(t|0,74984,(v=i,i=i+8|0,h[v>>3]=al,v)|0);w=21140}else if((F|0)==106){if((H|0)==0){am=y?z:1;an=3}else{am=z;an=H}if((an+e|0)>>>0>d>>>0){u=0;w=21146;break L28044}B=(c[o>>2]|0)+1|0;be(t|0,((am|0)!=0?90536:82208)|0,(v=i,i=i+16|0,c[v>>2]=an,c[v+8>>2]=B,v)|0);w=21140}else if((F|0)==119){if((H|0)==0){ao=y?z:1;ap=2}else{ao=z;ap=H}if((ap+e|0)>>>0>d>>>0){u=0;w=21165;break L28044}B=c[l>>2]|0;be(t|0,((ao|0)!=0?90536:82208)|0,(v=i,i=i+16|0,c[v>>2]=ap,c[v+8>>2]=B,v)|0);w=21140}else if((F|0)==97){B=72464+(c[l>>2]<<3)|0;if(((uA(B|0)|0)+e|0)>>>0>d>>>0){u=0;w=21164;break L28044}uB(t|0,B|0);w=21140}else if((F|0)==85){B=c[o>>2]|0;G=c[l>>2]|0;do{if((B|0)>(G|0)){x=(G>>31|6)+(B-G|0)|0;A=(x|0)/7&-1;if(((x|0)%7&-1|0)<=1){aq=A;break}aq=A+1|0}else{aq=((c[m>>2]|0)-B|0)>4?52:1}}while(0);if((H|0)==0){ar=y?z:1;as=2}else{ar=z;as=H}if((as+e|0)>>>0>d>>>0){u=0;w=21153;break L28044}be(t|0,((ar|0)!=0?90536:82208)|0,(v=i,i=i+16|0,c[v>>2]=as,c[v+8>>2]=aq,v)|0);w=21140}else if((F|0)==83){if((H|0)==0){at=y?z:1;au=2}else{at=z;au=H}if((au+e|0)>>>0>d>>>0){u=0;w=21163;break L28044}B=c[q>>2]|0;be(t|0,((at|0)!=0?90536:82208)|0,(v=i,i=i+16|0,c[v>>2]=au,c[v+8>>2]=B,v)|0);if((S|0)<=0){w=21140;break}al=+R(10.0,+(+(S|0)));B=~~+O(+(al*g+.5));if(((e+1|0)+S|0)>>>0>d>>>0){u=0;w=21162;break L28044}G=~~al;be(t+(uA(t|0)|0)|0,184248,(v=i,i=i+16|0,c[v>>2]=S,c[v+8>>2]=(B|0)<(G|0)?B:G-1|0,v)|0);w=21140}else if((F|0)==70){if((t4(t,d-e|0,222376,f,0.0)|0)==0){u=0;w=21170;break L28044}else{w=21140}}else{w=21140}}while(0);if((w|0)==21140){w=0;if((a[t]|0)==0){av=Q;aw=e;ax=t;break}else{Y=t;Z=e}}while(1){F=Y+1|0;z=Z+1|0;if((a[F]|0)==0){av=Q;aw=z;ax=F;break}else{Y=F;Z=z}}}else{if(e>>>0>=d>>>0){u=0;w=21145;break L28044}a[t]=b;av=s;aw=e+1|0;ax=t+1|0}}while(0);s=av+1|0;e=aw;t=ax}if((w|0)==21169){i=j;return u|0}else if((w|0)==21170){i=j;return u|0}else if((w|0)==21154){i=j;return u|0}else if((w|0)==21155){i=j;return u|0}else if((w|0)==21156){i=j;return u|0}else if((w|0)==21171){i=j;return u|0}else if((w|0)==21166){i=j;return u|0}else if((w|0)==21167){i=j;return u|0}else if((w|0)==21168){i=j;return u|0}else if((w|0)==21147){i=j;return u|0}else if((w|0)==21148){i=j;return u|0}else if((w|0)==21157){i=j;return u|0}else if((w|0)==21158){i=j;return u|0}else if((w|0)==21149){i=j;return u|0}else if((w|0)==21150){i=j;return u|0}else if((w|0)==21151){i=j;return u|0}else if((w|0)==21143){i=j;return u|0}else if((w|0)==21152){i=j;return u|0}else if((w|0)==21153){i=j;return u|0}else if((w|0)==21162){i=j;return u|0}else if((w|0)==21163){i=j;return u|0}else if((w|0)==21159){i=j;return u|0}else if((w|0)==21160){i=j;return u|0}else if((w|0)==21161){i=j;return u|0}else if((w|0)==21144){i=j;return u|0}else if((w|0)==21145){i=j;return u|0}else if((w|0)==21146){i=j;return u|0}else if((w|0)==21164){i=j;return u|0}else if((w|0)==21165){i=j;return u|0}return 0}function t5(){var d=0,e=0,f=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,aA=0,aB=0,aC=0,aD=0,aE=0,aF=0,aG=0,aH=0,aJ=0,aK=0,aL=0,aM=0,aN=0,aO=0,aP=0,aQ=0.0,aR=0,aS=0,aT=0.0,aU=0,aV=0,aW=0,aX=0,aZ=0,a$=0,a0=0,a1=0,a2=0,a3=0,a4=0,a5=0,a6=0,a7=0,a8=0,a9=0,ba=0,bb=0,bc=0,bd=0.0,be=0,bf=0,bg=0,bh=0,bi=0,bj=0,bk=0.0,bl=0,bm=0,bn=0,bo=0,bp=0,bq=0,br=0,bs=0,bt=0,bu=0,bv=0,bw=0,bx=0,by=0,bz=0,bB=0.0,bC=0,bD=0,bE=0,bF=0,bG=0;d=i;i=i+176|0;e=d|0;f=d+32|0;j=d+56|0;k=d+64|0;l=d+88|0;n=d+112|0;o=d+136|0;p=d+152|0;c[13898]=(c[13898]|0)+1;c[6074]=iw()|0;q=c[13898]|0;r=c[1054]|0;s=c[r+(q*40&-1)+36>>2]|0;t=c[r+(q*40&-1)+32>>2]|0;u=(a[r+(q*40&-1)|0]&1)==0;r=(s|0)>0;x=c[10036]|0;y=21960;z=96232;L28193:while(1){L28195:do{if(!u){if(r){A=0;B=0;C=t;while(1){D=a[z+A|0]|0;if(D<<24>>24==(a[x+(A+C|0)|0]|0)){E=C;F=B}else{if(D<<24>>24!=36){break L28195}E=C-1|0;F=1}G=A+1|0;if((G|0)<(F+s|0)){A=G;B=F;C=E}else{break}}if((F|0)==0){H=G}else{I=y;break L28193}}else{H=0}C=a[z+H|0]|0;if((C<<24>>24|0)==36|(C<<24>>24|0)==0){I=y;break L28193}}}while(0);C=y+8|0;B=c[C>>2]|0;if((B|0)==0){I=C;break}else{y=C;z=B}}z=c[I+4>>2]|0;if((z|0)==0){J=q}else{I=q+1|0;c[13898]=I;J=I}I=p|0;q=p+8|0;y=o|0;H=o+2|0;G=o+1|0;F=o+6|0;E=o+5|0;s=o+3|0;x=o+7|0;t=n|0;r=n+8|0;u=l|0;B=l+8|0;C=k|0;A=k+8|0;D=f|0;K=f+8|0;L=j|0;j=e|0;L28211:while(1){L28213:do{if((z|0)==11){L28215:do{if((J|0)<(c[8272]|0)){e=c[1054]|0;if((a[e+(J*40&-1)|0]&1)==0){M=21687;break L28211}N=c[e+(J*40&-1)+36>>2]|0;O=e+(J*40&-1)+32|0;e=c[10036]|0;P=0;while(1){if((P|0)>=(N|0)){M=21252;break}Q=c[O>>2]|0;if((a[e+(Q+P|0)|0]|0)==(a[P+103664|0]|0)){P=P+1|0}else{R=Q;break}}if((M|0)==21252){M=0;if((P|0)==1){M=21254;break}R=c[O>>2]|0}if((N|0)>0){S=0;T=0;U=R}else{M=21686;break L28211}while(1){if((a[S+144616|0]|0)==(a[e+(S+U|0)|0]|0)){V=U;W=T}else{if((S|0)!=1){X=0;Y=0;Z=R;break}V=U-1|0;W=1}Q=S+1|0;if((Q|0)<(W+N|0)){S=Q;T=W;U=V}else{M=21260;break}}do{if((M|0)==21260){M=0;if((W|0)==0){if(!((S|0)==0|(S|0)==6)){X=0;Y=0;Z=R;break}}a[54144]=0;break L28215}}while(0);while(1){if((a[X+143008|0]|0)==(a[e+(X+Z|0)|0]|0)){_=Z;$=Y}else{if((X|0)!=1){aa=0;ab=0;ac=R;break}_=Z-1|0;$=1}O=X+1|0;if((O|0)<($+N|0)){X=O;Y=$;Z=_}else{M=21267;break}}do{if((M|0)==21267){M=0;if(($|0)==0){if(!((X|0)==0|(X|0)==3)){aa=0;ab=0;ac=R;break}}a[54160]=0;break L28215}}while(0);while(1){if((a[aa+141464|0]|0)==(a[e+(aa+ac|0)|0]|0)){ad=ac;ae=ab}else{if((aa|0)!=1){M=21685;break L28211}ad=ac-1|0;ae=1}O=aa+1|0;if((O|0)<(ae+N|0)){aa=O;ab=ae;ac=ad}else{break}}if((ae|0)==0){if(!((aa|0)==0|(aa|0)==3)){M=21684;break L28211}}a[54152]=0}else{M=21254}}while(0);if((M|0)==21254){M=0;a[54144]=0;a[54160]=0;a[54152]=0}c[13898]=J+1}else if((z|0)==36){a[43472]=0}else if((z|0)==37){c[8732]=0}else if((z|0)==42){c[14100]=4;h[7052]=-1.0}else if((z|0)==39){c[8786]=4;h[4395]=-1.0}else if((z|0)==40){c[6598]=4;h[3301]=-1.0}else if((z|0)==59){if((a[32936]&1)==0){break}a[32936]=0;if((a[30528]&1)!=0){break}b[12272]=120;w=121;a[24595]=w&255;w=w>>8;a[24596|0]=w&255;if((a[37400]&1)==0){break}aI(184192,51,1,c[m>>2]|0)}else if((z|0)==89){t6(11)}else if((z|0)==90){uh(J,222320,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);h[8132]=1.0;h[8133]=.5;h[8218]=1.0;h[8219]=.5;h[8304]=1.0;h[8305]=.5;h[8390]=1.0;h[8391]=.5;h[8476]=1.0;h[8477]=.5;h[8562]=1.0;h[8563]=.5;h[8648]=1.0;h[8649]=.5;h[8734]=1.0;h[8735]=.5;h[8820]=1.0;h[8821]=.5;h[8906]=1.0;h[8907]=.5;h[8992]=1.0;h[8993]=.5}else if((z|0)==91|(z|0)==119){h[77]=.5;a[624]=0}else if((z|0)==92){L28273:do{if((J|0)<(c[8272]|0)){N=c[1054]|0;e=(a[N+(J*40&-1)|0]&1)==0;O=c[N+(J*40&-1)+36>>2]|0;L28275:do{if(e){af=c[10036]|0;ag=N+(J*40&-1)+32|0}else{P=N+(J*40&-1)+32|0;Q=c[10036]|0;ah=0;while(1){if((ah|0)>=(O|0)){break}if((a[Q+((c[P>>2]|0)+ah|0)|0]|0)==(a[ah+103664|0]|0)){ah=ah+1|0}else{af=Q;ag=P;break L28275}}if((ah|0)==1){break L28273}else{af=Q;ag=P}}}while(0);N=c[ag>>2]|0;ai=(O|0)>0;aj=56720;ak=77416;L28283:while(1){L28285:do{if(!e){if(ai){al=0;am=0;an=N;while(1){ao=a[ak+al|0]|0;if(ao<<24>>24==(a[af+(al+an|0)|0]|0)){ap=an;aq=am}else{if(ao<<24>>24!=36){break L28285}ap=an-1|0;aq=1}ar=al+1|0;if((ar|0)<(aq+O|0)){al=ar;am=aq;an=ap}else{break}}if((aq|0)==0){as=ar}else{at=aj;break L28283}}else{as=0}an=a[ak+as|0]|0;if((an<<24>>24|0)==36|(an<<24>>24|0)==0){at=aj;break L28283}}}while(0);P=aj+8|0;Q=c[P>>2]|0;if((Q|0)==0){at=P;break}else{aj=P;ak=Q}}ak=c[at+4>>2]|0;if((ak|0)>-1){uD(64813+(ak*688&-1)|0,82192,15);c[13898]=J+1;break L28213}else{uh(J,75e3,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);break L28213}}}while(0);uD(64813,82192,15);uD(65501,82192,15);uD(66189,82192,15);uD(66877,82192,15);uD(67565,82192,15);uD(68253,82192,15);uD(68941,82192,15);uD(69629,82192,15);uD(70317,82192,15);uD(71005,82192,15);uD(71693,82192,15)}else if((z|0)==61){c[7662]=0;if((c[12890]|0)==352){c[12890]=18}if((c[10058]|0)!=352){break}c[10058]=1}else if((z|0)==21){ak=c[10568]|0;if((ak|0)!=0){uu(ak)}c[10568]=0;a[42568]=0}else if((z|0)==102|(z|0)==105){c[16574]=1}else if((z|0)==50){c[17120]=0;h[8561]=10.0}else if((z|0)==127){t6(5)}else if((z|0)==121|(z|0)==124){c[16574]=1}else if((z|0)==54){c[16260]=0;h[8131]=10.0}else if((z|0)==145){t6(0)}else if((z|0)==139|(z|0)==142){c[16574]=1}else if((z|0)==68){c[16776]=0;h[8389]=10.0}else if((z|0)==66){t6(3)}else if((z|0)==71|(z|0)==73){c[16574]=1}else if((z|0)==110){c[16546]=0}else if((z|0)==129){c[16374]=0}else if((z|0)==93){uE(j|0,0,28);uu(c[1183]|0);c[1183]=0;uu(c[1184]|0);c[1184]=0;c[1204]=4;c[1205]=4;c[1206]=4;c[1207]=c[j>>2];c[4832>>2]=c[j+4>>2];c[4836>>2]=c[j+8>>2];c[4840>>2]=c[j+12>>2];c[4844>>2]=c[j+16>>2];c[4848>>2]=c[j+20>>2];c[4852>>2]=c[j+24>>2];c[1186]=0;c[1164]=0;c[1166]=1}else if((z|0)==94){uE(j|0,0,28);uu(c[1119]|0);c[1119]=0;uu(c[1120]|0);c[1120]=0;c[1140]=4;c[1141]=4;c[1142]=4;c[1143]=c[j>>2];c[4576>>2]=c[j+4>>2];c[4580>>2]=c[j+8>>2];c[4584>>2]=c[j+12>>2];c[4588>>2]=c[j+16>>2];c[4592>>2]=c[j+20>>2];c[4596>>2]=c[j+24>>2];c[1122]=0;}else if((z|0)==99){if(a[20368]|0){a[20368]=0;g[3538]=+g[5090];g[3536]=+g[5088];g[3534]=+g[5086];c[16336]=c[16336]^2;c[17024]=c[17024]^2}c[5094]=0;c[18072]=0;g[3536]=30.0;g[3538]=60.0;g[3534]=1.0;g[3540]=0.0;g[3532]=1.0}else if((z|0)==151){h[11]=1.0e-8}else if((z|0)==138){c[16202]=0}else if((z|0)==70){c[16718]=0}else if((z|0)==101){c[17234]=0}else if((z|0)==120){c[17062]=0}else if((z|0)==113){uu(c[16629]|0);c[16629]=0;uu(c[16630]|0);uD(66456,51296,192)}else if((z|0)==132){uu(c[16457]|0);c[16457]=0;uu(c[16458]|0);uD(65768,51296,192);c[16455]=-270}else if((z|0)==141){uu(c[16285]|0);c[16285]=0;uu(c[16286]|0);uD(65080,51296,192)}else if((z|0)==147){t6(7)}else if((z|0)==65){c[16680]=0}else if((z|0)==149){c[17368]=0}else if((z|0)==95){c[17540]=0}else if((z|0)==96){c[17712]=0}else if((z|0)==100){c[17884]=0}else if((z|0)==150){a[27776]=0;c[13898]=J+1}else if((z|0)==153){c[16664]=c[12782];c[66660>>2]=c[12783];c[66664>>2]=c[12784];c[66668>>2]=c[12785];c[66672>>2]=c[12786];c[66676>>2]=c[12787];c[66680>>2]=c[12788];c[66684>>2]=c[12789];c[66688>>2]=c[12790];c[66692>>2]=c[12791];c[66696>>2]=c[12792];c[66700>>2]=c[12793];c[66704>>2]=c[12794];c[66708>>2]=c[12795]}else if((z|0)==155){c[16492]=c[12782];c[65972>>2]=c[12783];c[65976>>2]=c[12784];c[65980>>2]=c[12785];c[65984>>2]=c[12786];c[65988>>2]=c[12787];c[65992>>2]=c[12788];c[65996>>2]=c[12789];c[66e3>>2]=c[12790];c[66004>>2]=c[12791];c[66008>>2]=c[12792];c[66012>>2]=c[12793];c[66016>>2]=c[12794];c[66020>>2]=c[12795]}else if((z|0)==157){c[16320]=c[12782];c[65284>>2]=c[12783];c[65288>>2]=c[12784];c[65292>>2]=c[12785];c[65296>>2]=c[12786];c[65300>>2]=c[12787];c[65304>>2]=c[12788];c[65308>>2]=c[12789];c[65312>>2]=c[12790];c[65316>>2]=c[12791];c[65320>>2]=c[12792];c[65324>>2]=c[12793];c[65328>>2]=c[12794];c[65332>>2]=c[12795]}else if((z|0)==154){c[17352]=c[12782];c[69412>>2]=c[12783];c[69416>>2]=c[12784];c[69420>>2]=c[12785];c[69424>>2]=c[12786];c[69428>>2]=c[12787];c[69432>>2]=c[12788];c[69436>>2]=c[12789];c[69440>>2]=c[12790];c[69444>>2]=c[12791];c[69448>>2]=c[12792];c[69452>>2]=c[12793];c[69456>>2]=c[12794];c[69460>>2]=c[12795]}else if((z|0)==156){c[17180]=c[12782];c[68724>>2]=c[12783];c[68728>>2]=c[12784];c[68732>>2]=c[12785];c[68736>>2]=c[12786];c[68740>>2]=c[12787];c[68744>>2]=c[12788];c[68748>>2]=c[12789];c[68752>>2]=c[12790];c[68756>>2]=c[12791];c[68760>>2]=c[12792];c[68764>>2]=c[12793];c[68768>>2]=c[12794];c[68772>>2]=c[12795]}else if((z|0)==152){c[16320]=c[12782];c[65284>>2]=c[12783];c[65288>>2]=c[12784];c[65292>>2]=c[12785];c[65296>>2]=c[12786];c[65300>>2]=c[12787];c[65304>>2]=c[12788];c[65308>>2]=c[12789];c[65312>>2]=c[12790];c[65316>>2]=c[12791];c[65320>>2]=c[12792];c[65324>>2]=c[12793];c[65328>>2]=c[12794];c[65332>>2]=c[12795];c[16492]=c[12782];c[65972>>2]=c[12783];c[65976>>2]=c[12784];c[65980>>2]=c[12785];c[65984>>2]=c[12786];c[65988>>2]=c[12787];c[65992>>2]=c[12788];c[65996>>2]=c[12789];c[66e3>>2]=c[12790];c[66004>>2]=c[12791];c[66008>>2]=c[12792];c[66012>>2]=c[12793];c[66016>>2]=c[12794];c[66020>>2]=c[12795];c[16664]=c[12782];c[66660>>2]=c[12783];c[66664>>2]=c[12784];c[66668>>2]=c[12785];c[66672>>2]=c[12786];c[66676>>2]=c[12787];c[66680>>2]=c[12788];c[66684>>2]=c[12789];c[66688>>2]=c[12790];c[66692>>2]=c[12791];c[66696>>2]=c[12792];c[66700>>2]=c[12793];c[66704>>2]=c[12794];c[66708>>2]=c[12795];c[16836]=c[12782];c[67348>>2]=c[12783];c[67352>>2]=c[12784];c[67356>>2]=c[12785];c[67360>>2]=c[12786];c[67364>>2]=c[12787];c[67368>>2]=c[12788];c[67372>>2]=c[12789];c[67376>>2]=c[12790];c[67380>>2]=c[12791];c[67384>>2]=c[12792];c[67388>>2]=c[12793];c[67392>>2]=c[12794];c[67396>>2]=c[12795];c[17008]=c[12782];c[68036>>2]=c[12783];c[68040>>2]=c[12784];c[68044>>2]=c[12785];c[68048>>2]=c[12786];c[68052>>2]=c[12787];c[68056>>2]=c[12788];c[68060>>2]=c[12789];c[68064>>2]=c[12790];c[68068>>2]=c[12791];c[68072>>2]=c[12792];c[68076>>2]=c[12793];c[68080>>2]=c[12794];c[68084>>2]=c[12795];c[17180]=c[12782];c[68724>>2]=c[12783];c[68728>>2]=c[12784];c[68732>>2]=c[12785];c[68736>>2]=c[12786];c[68740>>2]=c[12787];c[68744>>2]=c[12788];c[68748>>2]=c[12789];c[68752>>2]=c[12790];c[68756>>2]=c[12791];c[68760>>2]=c[12792];c[68764>>2]=c[12793];c[68768>>2]=c[12794];c[68772>>2]=c[12795];c[17352]=c[12782];c[69412>>2]=c[12783];c[69416>>2]=c[12784];c[69420>>2]=c[12785];c[69424>>2]=c[12786];c[69428>>2]=c[12787];c[69432>>2]=c[12788];c[69436>>2]=c[12789];c[69440>>2]=c[12790];c[69444>>2]=c[12791];c[69448>>2]=c[12792];c[69452>>2]=c[12793];c[69456>>2]=c[12794];c[69460>>2]=c[12795];c[17524]=c[12782];c[70100>>2]=c[12783];c[70104>>2]=c[12784];c[70108>>2]=c[12785];c[70112>>2]=c[12786];c[70116>>2]=c[12787];c[70120>>2]=c[12788];c[70124>>2]=c[12789];c[70128>>2]=c[12790];c[70132>>2]=c[12791];c[70136>>2]=c[12792];c[70140>>2]=c[12793];c[70144>>2]=c[12794];c[70148>>2]=c[12795];c[17696]=c[12782];c[70788>>2]=c[12783];c[70792>>2]=c[12784];c[70796>>2]=c[12785];c[70800>>2]=c[12786];c[70804>>2]=c[12787];c[70808>>2]=c[12788];c[70812>>2]=c[12789];c[70816>>2]=c[12790];c[70820>>2]=c[12791];c[70824>>2]=c[12792];c[70828>>2]=c[12793];c[70832>>2]=c[12794];c[70836>>2]=c[12795];c[17868]=c[12782];c[71476>>2]=c[12783];c[71480>>2]=c[12784];c[71484>>2]=c[12785];c[71488>>2]=c[12786];c[71492>>2]=c[12787];c[71496>>2]=c[12788];c[71500>>2]=c[12789];c[71504>>2]=c[12790];c[71508>>2]=c[12791];c[71512>>2]=c[12792];c[71516>>2]=c[12793];c[71520>>2]=c[12794];c[71524>>2]=c[12795];c[18040]=c[12782];c[72164>>2]=c[12783];c[72168>>2]=c[12784];c[72172>>2]=c[12785];c[72176>>2]=c[12786];c[72180>>2]=c[12787];c[72184>>2]=c[12788];c[72188>>2]=c[12789];c[72192>>2]=c[12790];c[72196>>2]=c[12791];c[72200>>2]=c[12792];c[72204>>2]=c[12793];c[72208>>2]=c[12794];c[72212>>2]=c[12795]}else if((z|0)==5){L28351:do{if((J|0)<(c[8272]|0)){ak=c[1054]|0;aj=(a[ak+(J*40&-1)|0]&1)==0;O=c[ak+(J*40&-1)+36>>2]|0;L28353:do{if(aj){au=c[10036]|0;av=ak+(J*40&-1)+32|0}else{N=ak+(J*40&-1)+32|0;ai=c[10036]|0;e=0;while(1){if((e|0)>=(O|0)){M=21222;break}if((a[ai+((c[N>>2]|0)+e|0)|0]|0)==(a[e+103664|0]|0)){e=e+1|0}else{aw=0;break}}if((M|0)==21222){M=0;if((e|0)==1){break L28351}else{aw=0}}while(1){if((aw|0)>=(O|0)){M=21226;break}if((a[ai+((c[N>>2]|0)+aw|0)|0]|0)==(a[aw+150688|0]|0)){aw=aw+1|0}else{ax=0;M=21227;break}}if((M|0)==21226){M=0;if((aw|0)!=2){ax=0;M=21227}}if((M|0)==21227){while(1){M=0;if((ax|0)>=(O|0)){break}if((a[ai+((c[N>>2]|0)+ax|0)|0]|0)==(a[ax+137768|0]|0)){ax=ax+1|0;M=21227}else{au=ai;av=N;break L28353}}if((ax|0)!=3){au=ai;av=N;break}}c[16335]=0;c[16507]=0;c[13898]=J+1;break L28213}}while(0);ak=c[av>>2]|0;e=(O|0)>0;Q=56720;P=77416;L28373:while(1){L28375:do{if(!aj){if(e){ah=0;an=0;am=ak;while(1){al=a[P+ah|0]|0;if(al<<24>>24==(a[au+(ah+am|0)|0]|0)){ay=am;aA=an}else{if(al<<24>>24!=36){break L28375}ay=am-1|0;aA=1}aB=ah+1|0;if((aB|0)<(aA+O|0)){ah=aB;an=aA;am=ay}else{break}}if((aA|0)==0){aC=aB}else{aD=Q;break L28373}}else{aC=0}am=a[P+aC|0]|0;if((am<<24>>24|0)==36|(am<<24>>24|0)==0){aD=Q;break L28373}}}while(0);N=Q+8|0;ai=c[N>>2]|0;if((ai|0)==0){aD=N;break}else{Q=N;P=ai}}P=c[aD+4>>2]|0;if((P|0)<=-1){break L28213}c[64652+(P*688&-1)>>2]=0;c[13898]=J+1;break L28213}}while(0);c[16163]=0;c[16335]=0;c[16507]=0;c[16679]=0;c[16851]=0;c[17023]=0;c[17195]=0;c[17367]=0;c[17539]=0;c[17711]=0;c[17883]=0}else if((z|0)==62){uD(54016,50688,112);a[54016]=110}else if((z|0)==77){h[3818]=1.0}else if((z|0)==78){h[3817]=1.0}else if((z|0)==79){if((a[30528]&1)==0){break}a[30528]=0;P=(a[32936]&1)==0;if(!(P|(c[17539]|0)==0)){h[8773]=-5.0;h[8774]=-5.0}if(!P){break}b[12272]=120;if((a[37400]&1)==0){break}aI(199840,33,1,c[m>>2]|0)}else if((z|0)==87){P=43240;while(1){Q=c[P>>2]|0;if((Q|0)==0){aE=0;break}if((aY(215528,c[Q+4>>2]|0)|0)==0){aE=Q;break}else{P=Q|0}}if((a[33512]&1)!=0){lm()}c[8026]=0;do{if((a[14080]&1)!=0){if(a[13032]|0){P=c[(c[3524]|0)+104>>2]|0;if((P|0)!=0){cS[P&511]()}a[13032]=0}if(a[14088]|0){cS[c[(c[3524]|0)+44>>2]&511]();a[14088]=0}if((a[14080]&1)==0){break}cS[c[(c[3524]|0)+40>>2]&511]();a[14080]=0;c[10028]=0}}while(0);if((aE|0)!=0){P=c[aE+24>>2]|0;c[3524]=lx(P,uA(P|0)|0)|0}a[25280]=0}else if((z|0)==12){c[13366]=5;c[13378]=0;c[13368]=4;c[13374]=5;c[13372]=0}else if((z|0)==60){c[13898]=J+1;aI(193712,29,1,c[m>>2]|0)}else if((z|0)==23){uE(y|0,0,11);P=c[1054]|0;Q=c[P+(J*40&-1)+36>>2]|0;O=c[P+(J*40&-1)+32>>2]|0;ak=(a[P+(J*40&-1)|0]&1)==0;e=(Q|0)>0;aj=c[10036]|0;ai=56720;N=77416;L28426:while(1){L28428:do{if(!ak){if(e){am=0;an=0;ah=O;while(1){al=a[N+am|0]|0;if(al<<24>>24==(a[aj+(am+ah|0)|0]|0)){aF=ah;aG=an}else{if(al<<24>>24!=36){break L28428}aF=ah-1|0;aG=1}aH=am+1|0;if((aH|0)<(aG+Q|0)){am=aH;an=aG;ah=aF}else{break}}if((aG|0)==0){aJ=aH}else{aK=ai;break L28426}}else{aJ=0}ah=a[N+aJ|0]|0;if((ah<<24>>24|0)==36|(ah<<24>>24|0)==0){aK=ai;break L28426}}}while(0);ah=ai+8|0;an=c[ah>>2]|0;if((an|0)==0){aK=ah;break}else{ai=ah;N=an}}N=c[aK+4>>2]|0;L28441:do{if((N|0)>-1){a[o+N|0]=1;aL=J;aM=c[8272]|0}else{ai=c[8272]|0;e=(ai|0)>(J|0);L28443:do{if(e){if(ak){aL=J;aM=ai;break L28441}else{aN=0}while(1){if((aN|0)>=(Q|0)){M=21306;break}if((a[aj+(aN+O|0)|0]|0)==(a[aN+150688|0]|0)){aN=aN+1|0}else{aO=0;M=21307;break}}if((M|0)==21306){M=0;if((aN|0)!=2){aO=0;M=21307}}if((M|0)==21307){while(1){M=0;if((aO|0)>=(Q|0)){break}if((a[aj+(aO+O|0)|0]|0)==(a[aO+148800|0]|0)){aO=aO+1|0;M=21307}else{break L28443}}if((aO|0)!=2){break}}a[G]=1;a[H]=1;an=J+1|0;c[13898]=an;aL=an;aM=ai;break L28441}}while(0);if(ak){M=21313}else{an=a[aj+O|0]|0;if(!((an<<24>>24|0)==39|(an<<24>>24|0)==34)){M=21313}}do{if((M|0)==21313){M=0;if(!e){break}if(ak){aL=J;aM=ai;break L28441}else{aP=0}while(1){if((aP|0)>=(Q|0)){break}if((a[aj+(aP+O|0)|0]|0)==(a[aP+103664|0]|0)){aP=aP+1|0}else{aL=J;aM=ai;break L28441}}if((aP|0)!=1){aL=J;aM=ai;break L28441}}}while(0);uE(y|0,1,11);aL=J;aM=ai}}while(0);if((aL|0)<(aM|0)){if((a[P+(aL*40&-1)|0]&1)==0){break}O=c[P+(aL*40&-1)+36>>2]|0;Q=P+(aL*40&-1)+32|0;ak=0;while(1){if((ak|0)>=(O|0)){break}if((a[aj+((c[Q>>2]|0)+ak|0)|0]|0)==(a[ak+103664|0]|0)){ak=ak+1|0}else{break L28213}}if((ak|0)!=1){break}}if((a[H]&1)!=0){c[16560]=6758437;a[66188]=1}if((a[G]&1)!=0){c[16388]=6758437;a[65500]=1}if((a[y]&1)!=0){c[16216]=6758437;a[64812]=1}if((a[F]&1)!=0){c[17248]=6758437;a[68940]=1}if((a[E]&1)!=0){c[17076]=6758437;a[68252]=1}if((a[s]&1)!=0){c[16732]=6758437;a[66876]=1}if((a[x]&1)==0){break}c[17420]=6758437;a[69628]=1}else if((z|0)==3){h[9040]=1.0}else if((z|0)==48){c[16604]=0;h[8303]=10.0}else if((z|0)==6){h[7077]=0.0}else if((z|0)==8){c[11692]=0}else if((z|0)==32){if((c[8272]|0)<=(J|0)){break}Q=c[1054]|0;aj=(a[Q+(J*40&-1)|0]&1)==0;L28502:do{if(!aj){O=c[Q+(J*40&-1)+36>>2]|0;P=Q+(J*40&-1)+32|0;N=c[10036]|0;e=0;while(1){if((e|0)>=(O|0)){M=21386;break}if((a[N+((c[P>>2]|0)+e|0)|0]|0)==(a[e+166752|0]|0)){e=e+1|0}else{break}}do{if((M|0)==21386){M=0;if((e|0)!=5){break}c[8798]=0;c[13898]=J+1;break L28213}}while(0);if(aj){break}e=c[Q+(J*40&-1)+36>>2]|0;P=Q+(J*40&-1)+32|0;N=c[10036]|0;O=0;while(1){if((O|0)>=(e|0)){break}if((a[N+((c[P>>2]|0)+O|0)|0]|0)==(a[O+103664|0]|0)){O=O+1|0}else{break L28502}}if((O|0)==1){break L28213}}}while(0);Q=is(l)|0;aj=c[Q>>2]|0;if((aj|0)==1){aQ=+(c[Q+8>>2]|0)}else if((aj|0)==2){aQ=+h[Q+8>>3]}else if((aj|0)==3){aQ=+uz(c[Q+8>>2]|0,0)}else{M=21397;break L28211}if((c[u>>2]|0)==3){uu(c[B>>2]|0);c[u>>2]=1}Q=~~aQ;aj=0;ak=43264;while(1){aR=c[ak>>2]|0;if((aR|0)==0){break L28213}aS=aR|0;if((c[aR+4>>2]|0)==(Q|0)){break}else{aj=aR;ak=aS}}ak=c[aS>>2]|0;if((c[10816]|0)==(aR|0)){c[10816]=ak}else{c[aj>>2]=ak}uu(aR)}else if((z|0)==20){ak=c[12886]|0;if((ak|0)!=0){uu(ak)}c[12886]=0;uu(c[8270]|0);c[8270]=0}else if((z|0)==27){iY(c[10828]|0);c[10828]=0;c[9344]=10;c[9342]=10}else if((z|0)==30){L28539:do{if((J|0)<(c[8272]|0)){ak=c[1054]|0;L28541:do{if((a[ak+(J*40&-1)|0]&1)!=0){Q=c[ak+(J*40&-1)+36>>2]|0;P=ak+(J*40&-1)+32|0;N=c[10036]|0;e=0;while(1){if((e|0)>=(Q|0)){break}if((a[N+((c[P>>2]|0)+e|0)|0]|0)==(a[e+103664|0]|0)){e=e+1|0}else{break L28541}}if((e|0)==1){break L28539}}}while(0);ak=is(n)|0;O=c[ak>>2]|0;if((O|0)==1){aT=+(c[ak+8>>2]|0)}else if((O|0)==2){aT=+h[ak+8>>3]}else if((O|0)==3){aT=+uz(c[ak+8>>2]|0,0)}else{M=21361;break L28211}if((c[t>>2]|0)==3){uu(c[r>>2]|0);c[t>>2]=1}ak=~~aT;aU=c[13898]|0;if((aU|0)<(c[8272]|0)){O=c[1054]|0;if((a[O+(aU*40&-1)|0]&1)==0){M=21683;break L28211}P=c[O+(aU*40&-1)+36>>2]|0;N=O+(aU*40&-1)+32|0;O=c[10036]|0;Q=0;while(1){if((Q|0)>=(P|0)){break}if((a[O+((c[N>>2]|0)+Q|0)|0]|0)==(a[Q+103664|0]|0)){Q=Q+1|0}else{M=21681;break L28211}}if((Q|0)==1){aV=43288;aW=0}else{M=21682;break L28211}}else{aV=43288;aW=0}while(1){aX=c[aV>>2]|0;if((aX|0)==0){break L28213}aZ=aX|0;if((c[aX+4>>2]|0)==(ak|0)){break}else{aV=aZ;aW=aX}}ak=c[aZ>>2]|0;if((aW|0)==0){c[10822]=ak}else{c[aW>>2]=ak}ak=c[aX+60>>2]|0;if((ak|0)!=0){uu(ak)}ak=c[aX+64>>2]|0;if((ak|0)!=0){uu(ak)}uu(aX);break L28213}}while(0);aj=c[10822]|0;if((aj|0)==0){break}else{a$=aj}do{c[10822]=c[a$>>2];aj=c[a$+60>>2]|0;if((aj|0)!=0){uu(aj)}aj=c[a$+64>>2]|0;if((aj|0)!=0){uu(aj)}uu(a$);a$=c[10822]|0;}while((a$|0)!=0)}else if((z|0)==33){uq(32,0)}else if((z|0)==34){uu(c[12908]|0);bA(5,179864);bA(2,179864);aj=bA(5,0)|0;if((aj|0)==0){a0=0}else{a0=bP(aj|0)|0}c[12908]=a0}else if((z|0)==35){L28592:do{if((J|0)<(c[8272]|0)){aj=c[1054]|0;ak=c[aj+(J*40&-1)+36>>2]|0;L28594:do{if((a[aj+(J*40&-1)|0]&1)!=0){Q=aj+(J*40&-1)+32|0;N=c[10036]|0;O=0;while(1){if((O|0)>=(ak|0)){break}if((a[N+((c[Q>>2]|0)+O|0)|0]|0)==(a[O+103664|0]|0)){O=O+1|0}else{break L28594}}if((O|0)==1){a1=0;M=21418;break L28592}}}while(0);if((ak|0)>0){Q=0;N=J;e=aj;while(1){a2=e+(N*40&-1)+32|0;a3=(c[a2>>2]|0)+Q|0;P=(c[10036]|0)+a3|0;ai=a[P]|0;do{if(ai<<24>>24==114){an=(a[69604]&1)==0;a[69604]=0;h[8701]=0.0;if(an){a4=N;a5=e;a6=7;break}ju();a4=c[13898]|0;a5=c[1054]|0;a6=7}else{do{if((a_(P|0,108208,2)|0)==0){a7=6}else{if((a_(P|0,108120,2)|0)==0){a7=5;break}if((a_(P|0,124768,2)|0)==0){a7=4;break}if((a_(P|0,88416,2)|0)==0){a7=3;break}if(ai<<24>>24==120){a7=2;break}if(ai<<24>>24==121){a7=1;break}if(ai<<24>>24==122){a7=0}else{M=21423;break L28211}}}while(0);an=c[56724+(a7<<3)>>2]|0;a[64788+(an*688&-1)|0]=0;h[64792+(an*688&-1)>>3]=0.0;a4=N;a5=e;a6=a7}}while(0);ai=(uA(c[56720+(a6<<3)>>2]|0)|0)+Q|0;if((ai|0)<(c[a5+(a4*40&-1)+36>>2]|0)){Q=ai;N=a4;e=a5}else{a8=a4;break}}}else{a8=J}c[13898]=a8+1}else{a1=0;M=21418}}while(0);if((M|0)==21418){while(1){M=0;if((a1|0)!=7){a[64788+(a1*688&-1)|0]=0;h[64792+(a1*688&-1)>>3]=0.0;e=a1+1|0;if((e|0)<11){a1=e;M=21418;continue}else{break}}e=(a[69604]&1)==0;a[69604]=0;h[8701]=0.0;if(e){a1=8;M=21418;continue}ju();a1=8;M=21418}}c[6928]=0}else if((z|0)==17){c[11732]=10;c[11756]=10;c[11734]=1;c[11752]=1;h[5865]=1.0;h[5864]=1.0;a[47032]=0}else if((z|0)==18){b[12272]=120;w=121;a[24595]=w&255;w=w>>8;a[24596|0]=w&255}else if((z|0)==19){c[11252]=0}else if((z|0)==84){a[46752]=0}else if((z|0)==86){e=c[3526]|0;if((e|0)!=0){az(e|0)}c[3526]=0;a[14112]=0}else if((z|0)==24){a[65036]=0;a[65037]=0;a[65724]=0;a[65725]=0;a[66412]=0;a[66413]=0;a[67100]=0;a[67101]=0;a[67788]=0;a[67789]=0;a[68476]=0;a[68477]=0;a[69164]=0;a[69165]=0;a[69852]=0;a[69853]=0;a[70540]=0;a[70541]=0;a[71228]=0;a[71229]=0;a[71916]=0;a[71917]=0}else if((z|0)==25){a[38984]=0}else if((z|0)==26){M=21341;break L28211}else if((z|0)==13){c[11690]=0}else if((z|0)==28){a[36120]=0}else if((z|0)==29){a[36288]=0}else if((z|0)==44){c[8496]=0;hM()}else if((z|0)==45){lm()}else if((z|0)==41){c[1066]=4;h[535]=-1.0}else if((z|0)==15){e=c[1054]|0;N=c[e+(J*40&-1)+36>>2]|0;Q=c[e+(J*40&-1)+32>>2]|0;L28643:do{if((a[e+(J*40&-1)|0]&1)==0){M=21452}else{if((N|0)<=0){a[47712]=0;break}aj=c[10036]|0;ak=0;ai=0;P=Q;while(1){if((a[ak+115448|0]|0)==(a[aj+(ak+P|0)|0]|0)){a9=P;ba=ai}else{if((ak|0)!=4){M=21452;break L28643}a9=P-1|0;ba=1}bb=ak+1|0;if((bb|0)<(ba+N|0)){ak=bb;ai=ba;P=a9}else{break}}if((ba|0)!=0|(bb|0)==4){a[47712]=0}else{a[47712]=0;if((bb|0)!=8){break}}c[13898]=J+1;break L28213}}while(0);if((M|0)==21452){M=0;a[47712]=0}uu(c[8528]|0);c[8528]=0;a[47120]=0;uu(c[11948]|0);c[11948]=bP(199184)|0;N=c[12168]|0;Q=c[11862]|0;if((Q|0)>0){e=0;P=Q;while(1){Q=N+(e*232&-1)+224|0;ai=c[Q>>2]|0;if((ai|0)==0){bc=P}else{uu(ai);c[Q>>2]=0;bc=c[11862]|0}Q=e+1|0;if((Q|0)<(bc|0)){e=Q;P=bc}else{break}}}c[11862]=0;c[12202]=c[12200];c[12206]=0}else if((z|0)==9){h[7030]=-1.0;a[56232]=1}else if((z|0)==10){a[35888]=0}else if((z|0)==4){L28672:do{if((J|0)<(c[8272]|0)){P=c[1054]|0;L28674:do{if((a[P+(J*40&-1)|0]&1)!=0){e=c[P+(J*40&-1)+36>>2]|0;N=P+(J*40&-1)+32|0;Q=c[10036]|0;ai=0;while(1){if((ai|0)>=(e|0)){break}if((a[Q+((c[N>>2]|0)+ai|0)|0]|0)==(a[ai+103664|0]|0)){ai=ai+1|0}else{break L28674}}if((ai|0)==1){break L28672}}}while(0);P=is(p)|0;N=c[P>>2]|0;if((N|0)==2){bd=+h[P+8>>3]}else if((N|0)==3){bd=+uz(c[P+8>>2]|0,0)}else if((N|0)==1){bd=+(c[P+8>>2]|0)}else{M=21199;break L28211}if((c[I>>2]|0)==3){uu(c[q>>2]|0);c[I>>2]=1}P=~~bd;be=c[13898]|0;if((be|0)<(c[8272]|0)){N=c[1054]|0;if((a[N+(be*40&-1)|0]&1)==0){M=21690;break L28211}Q=c[N+(be*40&-1)+36>>2]|0;e=N+(be*40&-1)+32|0;N=c[10036]|0;ak=0;while(1){if((ak|0)>=(Q|0)){break}if((a[N+((c[e>>2]|0)+ak|0)|0]|0)==(a[ak+103664|0]|0)){ak=ak+1|0}else{M=21691;break L28211}}if((ak|0)==1){bf=43304;bg=0}else{M=21692;break L28211}}else{bf=43304;bg=0}while(1){bh=c[bf>>2]|0;if((bh|0)==0){M=21215;break L28211}bi=bh|0;if((c[bh+4>>2]|0)==(P|0)){break}else{bf=bi;bg=bh}}P=c[bi>>2]|0;if((bg|0)==0){c[10826]=P}else{c[bg>>2]=P}uu(bh);break L28213}}while(0);P=c[10826]|0;if((P|0)==0){break}else{bj=P}do{c[10826]=c[bj>>2];uu(bj);bj=c[10826]|0;}while((bj|0)!=0)}else if((z|0)==64){uu(c[16801]|0);c[16801]=0;uu(c[16802]|0);uD(67144,51296,192);c[16799]=-270}else if((z|0)==104){uu(c[17317]|0);c[17317]=0;uu(c[17318]|0);uD(69208,51296,192)}else if((z|0)==123){uu(c[17145]|0);c[17145]=0;uu(c[17146]|0);uD(68520,51296,192);c[17143]=-270}else if((z|0)==116){c[16508]=0}else if((z|0)==107){c[17196]=0}else if((z|0)==135){c[16336]=0}else if((z|0)==126){c[17024]=0}else if((z|0)==144){c[16164]=0}else if((z|0)==80){ea(0,0)}else if((z|0)==81){uu(c[57238]|0);c[57238]=0}else if((z|0)==75){L28718:do{if((J|0)<(c[8272]|0)){P=c[1054]|0;L28720:do{if((a[P+(J*40&-1)|0]&1)!=0){ak=c[P+(J*40&-1)+36>>2]|0;e=P+(J*40&-1)+32|0;N=c[10036]|0;Q=0;while(1){if((Q|0)>=(ak|0)){break}if((a[N+((c[e>>2]|0)+Q|0)|0]|0)==(a[Q+103664|0]|0)){Q=Q+1|0}else{break L28720}}if((Q|0)==1){break L28718}}}while(0);P=is(k)|0;e=c[P>>2]|0;if((e|0)==1){bk=+(c[P+8>>2]|0)}else if((e|0)==2){bk=+h[P+8>>3]}else if((e|0)==3){bk=+uz(c[P+8>>2]|0,0)}else{M=21503;break L28211}if((c[C>>2]|0)==3){uu(c[A>>2]|0);c[C>>2]=1}P=~~bk;bl=c[13898]|0;if((bl|0)<(c[8272]|0)){e=c[1054]|0;if((a[e+(bl*40&-1)|0]&1)==0){M=21694;break L28211}N=c[e+(bl*40&-1)+36>>2]|0;ak=e+(bl*40&-1)+32|0;e=c[10036]|0;ai=0;while(1){if((ai|0)>=(N|0)){break}if((a[e+((c[ak>>2]|0)+ai|0)|0]|0)==(a[ai+103664|0]|0)){ai=ai+1|0}else{M=21693;break L28211}}if((ai|0)==1){bm=43272;bn=0}else{M=21695;break L28211}}else{bm=43272;bn=0}while(1){bo=c[bm>>2]|0;if((bo|0)==0){break L28213}bp=bo|0;if((c[bo+4>>2]|0)==(P|0)){break}else{bm=bp;bn=bo}}P=c[bp>>2]|0;if((bn|0)==0){c[10818]=P}else{c[bn>>2]=P}if((c[bo+12>>2]|0)==4){uu(c[(bo+104|0)+4>>2]|0)}uu(bo);break L28213}}while(0);P=c[10818]|0;if((P|0)==0){break}else{bq=P}do{c[10818]=c[bq>>2];if((c[bq+12>>2]|0)==4){uu(c[(bq+104|0)+4>>2]|0)}uu(bq);bq=c[10818]|0;}while((bq|0)!=0)}else if((z|0)==117){t6(2)}else if((z|0)==111|(z|0)==114){c[16574]=1}else if((z|0)==52){c[16432]=0;h[8217]=10.0}else if((z|0)==136){t6(1)}else if((z|0)==130|(z|0)==133){c[16574]=1}else if((z|0)==46){c[17292]=0;h[8647]=10.0}else if((z|0)==108){t6(6)}else if((z|0)==56){h[3296]=0.0;h[4384]=0.0;h[7048]=0.0;h[531]=0.0}else if((z|0)==57){g[184]=0.0;g[44]=0.0}else if((z|0)==58){if((a[33512]&1)!=0){M=21466;break L28211}lj(0);P=c[8244]|0;if((P|0)==0){break}uu(P);c[8244]=0}else if((z|0)==82){iO(c[10814]|0);c[10814]=0;iY(c[10828]|0);c[10828]=0;c[6352]=100;c[6350]=100}else if((z|0)==83){g[178]=1.0;g[38]=1.0;g[2]=1.0}else if((z|0)==85){P=c[8272]|0;L28774:do{if((J|0)<(P|0)){ai=c[1054]|0;ak=(a[ai+(J*40&-1)|0]&1)==0;e=c[ai+(J*40&-1)+36>>2]|0;L28776:do{if(ak){br=c[10036]|0;bs=ai+(J*40&-1)+32|0}else{N=ai+(J*40&-1)+32|0;aj=c[10036]|0;O=0;while(1){if((O|0)>=(e|0)){break}if((a[aj+((c[N>>2]|0)+O|0)|0]|0)==(a[O+103664|0]|0)){O=O+1|0}else{br=aj;bs=N;break L28776}}if((O|0)==1){break L28774}else{br=aj;bs=N}}}while(0);Q=c[bs>>2]|0;an=(e|0)>0;ah=21680;am=116616;L28784:while(1){L28786:do{if(!ak){if(an){al=0;ao=0;bt=Q;while(1){bu=a[am+al|0]|0;if(bu<<24>>24==(a[br+(al+bt|0)|0]|0)){bv=bt;bw=ao}else{if(bu<<24>>24!=36){break L28786}bv=bt-1|0;bw=1}bx=al+1|0;if((bx|0)<(bw+e|0)){al=bx;ao=bw;bt=bv}else{break}}if((bw|0)==0){by=bx}else{bz=ah;break L28784}}else{by=0}bt=a[am+by|0]|0;if((bt<<24>>24|0)==36|(bt<<24>>24|0)==0){bz=ah;break L28784}}}while(0);N=ah+8|0;aj=c[N>>2]|0;if((aj|0)==0){bz=N;break}else{ah=N;am=aj}}am=c[bz+4>>2]|0;if((am|0)==4){c[12372]=0;c[12373]=100;c[12374]=0;c[12376]=0;c[13898]=J+1;break L28213}else if((am|0)==10){c[9670]=3;c[9671]=2;c[13898]=J+1;break L28213}else if((am|0)==5){t8(c[10824]|0);c[10824]=0;c[13898]=(c[13898]|0)+1;break L28213}else if((am|0)==8){uD(49160,1144,272);c[13898]=J+1;break L28213}else if((am|0)==1){c[12890]=18;c[13898]=J+1;break L28213}else if((am|0)==2){c[10058]=1;c[13898]=J+1;break L28213}else if((am|0)==3){ah=J+1|0;c[13898]=ah;L28807:do{if((ah|0)<(P|0)){L28809:do{if((a[ai+(ah*40&-1)|0]&1)!=0){e=c[ai+(ah*40&-1)+36>>2]|0;Q=ai+(ah*40&-1)+32|0;an=0;while(1){if((an|0)>=(e|0)){break}if((a[br+((c[Q>>2]|0)+an|0)|0]|0)==(a[an+103664|0]|0)){an=an+1|0}else{break L28809}}if((an|0)==1){break L28807}}}while(0);Q=is(f)|0;e=c[Q>>2]|0;if((e|0)==2){bB=+h[Q+8>>3]}else if((e|0)==3){bB=+uz(c[Q+8>>2]|0,0)}else if((e|0)==1){bB=+(c[Q+8>>2]|0)}else{M=21560;break L28211}if((c[D>>2]|0)==3){uu(c[K>>2]|0);c[D>>2]=1}Q=~~bB;e=0;ak=43280;while(1){bC=c[ak>>2]|0;if((bC|0)==0){break L28213}bD=bC|0;if((c[bC+4>>2]|0)==(Q|0)){break}else{e=bC;ak=bD}}ak=c[bD>>2]|0;if((c[10820]|0)==(bC|0)){c[10820]=ak}else{c[e>>2]=ak}uu(bC);break L28213}}while(0);ah=c[10820]|0;if((ah|0)==0){break L28213}else{bE=ah}while(1){c[10820]=c[bE>>2];uu(bE);bE=c[10820]|0;if((bE|0)==0){break L28213}}}else if((am|0)==6){uD(50800,1688,272);c[13898]=J+1;break L28213}else if((am|0)==7){uD(49520,1416,272);c[13898]=J+1;break L28213}else if((am|0)==11){uE(L|0,0,3);ah=56248;c[ah>>2]=0;c[ah+4>>2]=0;h[7032]=1.5;a[56264]=1;a[56265]=a[L]|0;a[56266|0]=a[L+1|0]|0;a[56267|0]=a[L+2|0]|0;c[14067]=6;c[14068]=252;c[14069]=0;h[7035]=1.0;c[14072]=1;c[14073]=0;c[13898]=J+1;break L28213}else{M=21577;break L28211}}}while(0);c[12890]=18;c[10058]=1;P=c[10820]|0;if((P|0)==0){bF=J}else{ah=P;do{c[10820]=c[ah>>2];uu(ah);ah=c[10820]|0;}while((ah|0)!=0);bF=c[13898]|0}c[12372]=0;c[12373]=100;c[12374]=0;c[12376]=0;uD(49160,1144,272);uD(50800,1688,272);uD(49520,1416,272);c[9670]=3;c[9671]=2;uE(L|0,0,3);ah=56248;c[ah>>2]=0;c[ah+4>>2]=0;h[7032]=1.5;a[56264]=1;a[56265]=a[L]|0;a[56266|0]=a[L+1|0]|0;a[56267|0]=a[L+2|0]|0;c[14067]=6;c[14068]=252;c[14069]=0;h[7035]=1.0;c[14072]=1;c[14073]=0;c[13898]=bF+1}else{M=21675;break L28211}}while(0);if(!(ix(c[6074]|0)|0)){M=21678;break}c[13898]=J}if((M|0)==21692){uf(be,135968,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((M|0)==21693){uf(bl,170992,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((M|0)==21694){uf(bl,170992,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((M|0)==21695){uf(bl,170992,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((M|0)==21215){uf(be,134376,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((M|0)==21675){uf(J,148616,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((M|0)==21678){e7(0);bl=c[6074]|0;if((bl|0)==0){c[6074]=0;i=d;return}else{bG=bl}while(1){bl=c[bG>>2]|0;uu(c[bG+12>>2]|0);uu(bG);if((bl|0)==0){break}else{bG=bl}}c[6074]=0;i=d;return}else if((M|0)==21503){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((M|0)==21560){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((M|0)==21577){uf(J,209800,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((M|0)==21423){c[a2>>2]=a3;uf(c[13898]|0,174808,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((M|0)==21341){uf(J,153432,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((M|0)==21361){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((M|0)==21466){uf(J,179040,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((M|0)==21199){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((M|0)==21397){uf(-1,213288,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((M|0)==21681){uf(aU,161624,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((M|0)==21682){uf(aU,161624,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((M|0)==21683){uf(aU,161624,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((M|0)==21684){uf(J,139712,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((M|0)==21685){uf(J,139712,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((M|0)==21686){uf(J,139712,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((M|0)==21687){uf(J,139712,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((M|0)==21690){uf(be,135968,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((M|0)==21691){uf(be,135968,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}function t6(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0;d=i;i=i+32|0;e=d|0;uE(e|0,0,28);f=b>>>0<11;g=f?b:0;j=f?b+1|0:11;if(g>>>0>>0){k=g}else{i=d;return}do{c[64916+(k*688&-1)>>2]=0;g=64924+(k*688&-1)|0;b=c[g>>2]|0;if((b|0)!=0){uu(b);c[g>>2]=0}uE(64928+(k*688&-1)|0,0,16);c[64984+(k*688&-1)>>2]=4;c[64988+(k*688&-1)>>2]=4;c[64992+(k*688&-1)>>2]=4;g=(64648+(k*688&-1)|0)+348|0;c[g>>2]=c[e>>2];c[g+4>>2]=c[e+4>>2];c[g+8>>2]=c[e+8>>2];c[g+12>>2]=c[e+12>>2];c[g+16>>2]=c[e+16>>2];c[g+20>>2]=c[e+20>>2];c[g+24>>2]=c[e+24>>2];a[65024+(k*688&-1)|0]=0;c[65032+(k*688&-1)>>2]=0;h[65056+(k*688&-1)>>3]=1.0;h[65064+(k*688&-1)>>3]=.5;a[65072+(k*688&-1)|0]=1;a[65272+(k*688&-1)|0]=0;g=64944+(k*688&-1)|0;b=c[g>>2]|0;if((b|0)!=0){f=b;while(1){b=c[f+16>>2]|0;l=c[f+8>>2]|0;if((l|0)!=0){uu(l)}uu(f);if((b|0)==0){break}else{f=b}}}c[g>>2]=0;k=k+1|0;}while(k>>>0>>0);i=d;return}function t7(){var d=0,e=0,f=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0.0,K=0;d=i;i=i+40|0;e=d|0;f=d+8|0;j=a[37400]&1;c[13898]=(c[13898]|0)+1;e7(4);k=c[13898]|0;l=c[1054]|0;n=c[l+(k*40&-1)+36>>2]|0;o=c[l+(k*40&-1)+32>>2]|0;p=(a[l+(k*40&-1)|0]&1)==0;L28894:do{if((n|0)>0&(p^1)){l=c[10036]|0;q=0;r=0;s=o;while(1){if((a[q+131368|0]|0)==(a[l+(q+s|0)|0]|0)){t=s;u=r}else{if((q|0)!=3){break L28894}t=s-1|0;u=1}x=q+1|0;if((x|0)<(u+n|0)){q=x;r=u;s=t}else{break}}if((u|0)==0){if(!((q|0)==10|(q|0)==2)){break}}c[13898]=k+1;i=d;return}}while(0);L28908:do{if(!((c[8272]|0)<=(k|0)|p)){u=c[10036]|0;t=0;while(1){if((t|0)>=(n|0)){break}if((a[u+(o+t|0)|0]|0)==(a[t+116488|0]|0)){t=t+1|0}else{break L28908}}if((t|0)!=4){break}u=c[14128]|0;if((u|0)==0){y=k}else{q=u;while(1){u=q+12|0;s=c[u>>2]|0;if((s|0)!=0){uu(s);c[u>>2]=0}u=c[q+24>>2]|0;uu(q);if((u|0)==0){break}else{q=u}}y=c[13898]|0}c[14128]=0;c[13898]=y+1;i=d;return}}while(0);a[37400]=0;iO(c[10814]|0);c[10814]=0;iY(c[10828]|0);c[10828]=0;c[6352]=100;c[6350]=100;iY(0);c[10828]=0;c[9344]=10;c[9342]=10;y=c[10826]|0;if((y|0)!=0){k=y;do{c[10826]=c[k>>2];uu(k);k=c[10826]|0;}while((k|0)!=0)}t8(c[10824]|0);c[10824]=0;k=c[10822]|0;if((k|0)!=0){y=k;do{c[10822]=c[y>>2];k=c[y+60>>2]|0;if((k|0)!=0){uu(k)}k=c[y+64>>2]|0;if((k|0)!=0){uu(k)}uu(y);y=c[10822]|0;}while((y|0)!=0)}y=c[10820]|0;if((y|0)!=0){k=y;do{c[10820]=c[k>>2];uu(k);k=c[10820]|0;}while((k|0)!=0)}k=c[10818]|0;if((k|0)!=0){y=k;do{c[10818]=c[y>>2];if((c[y+12>>2]|0)==4){uu(c[(y+104|0)+4>>2]|0)}uu(y);y=c[10818]|0;}while((y|0)!=0)}uD(49160,1144,272);uD(50800,1688,272);uD(49520,1416,272);do{if((a[30528]&1)!=0){a[30528]=0;y=(a[32936]&1)==0;if(!(y|(c[17539]|0)==0)){h[8773]=-5.0;h[8774]=-5.0}if(!y){break}b[12272]=120;if((a[37400]&1)==0){break}y=c[m>>2]|0;aI(199840,33,1,y|0)}}while(0);do{if((a[32936]&1)!=0){a[32936]=0;if((a[30528]&1)!=0){break}b[12272]=120;w=121;a[24595]=w&255;w=w>>8;a[24596|0]=w&255;if((a[37400]&1)==0){break}y=c[m>>2]|0;aI(184192,51,1,y|0)}}while(0);b[12272]=120;w=121;a[24595]=w&255;w=w>>8;a[24596|0]=w&255;y=f|0;uE(y|0,0,28);uu(c[1119]|0);c[1119]=0;uu(c[1120]|0);c[1120]=0;c[1140]=4;c[1141]=4;c[1142]=4;c[1143]=c[y>>2];c[4576>>2]=c[y+4>>2];c[4580>>2]=c[y+8>>2];c[4584>>2]=c[y+12>>2];c[4588>>2]=c[y+16>>2];c[4592>>2]=c[y+20>>2];c[4596>>2]=c[y+24>>2];c[1122]=0;uD(36120,26456,1240);a[36288]=0;f=c[13898]|0;L28963:do{if((f|0)<(c[8272]|0)){k=c[1054]|0;o=(a[k+(f*40&-1)|0]&1)==0;n=c[k+(f*40&-1)+36>>2]|0;L28965:do{if(o){z=c[10036]|0;A=k+(f*40&-1)+32|0}else{p=k+(f*40&-1)+32|0;q=c[10036]|0;t=0;while(1){if((t|0)>=(n|0)){break}if((a[q+((c[p>>2]|0)+t|0)|0]|0)==(a[t+103664|0]|0)){t=t+1|0}else{z=q;A=p;break L28965}}if((t|0)==1){B=21758;break L28963}else{z=q;A=p}}}while(0);k=c[A>>2]|0;u=(n|0)>0;s=56720;r=77416;L28973:while(1){L28975:do{if(!o){if(u){l=0;x=0;C=k;while(1){D=a[r+l|0]|0;if(D<<24>>24==(a[z+(l+C|0)|0]|0)){E=C;F=x}else{if(D<<24>>24!=36){break L28975}E=C-1|0;F=1}G=l+1|0;if((G|0)<(F+n|0)){l=G;x=F;C=E}else{break}}if((F|0)==0){H=G}else{I=s;break L28973}}else{H=0}C=a[r+H|0]|0;if((C<<24>>24|0)==36|(C<<24>>24|0)==0){I=s;break L28973}}}while(0);p=s+8|0;q=c[p>>2]|0;if((q|0)==0){I=p;break}else{s=p;r=q}}r=c[I+4>>2]|0;if((r|0)>-1){uD(64813+(r*688&-1)|0,82192,15);c[13898]=f+1;break}else{uh(f,75e3,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);break}}else{B=21758}}while(0);if((B|0)==21758){uD(64813,82192,15);uD(65501,82192,15);uD(66189,82192,15);uD(66877,82192,15);uD(67565,82192,15);uD(68253,82192,15);uD(68941,82192,15);uD(69629,82192,15);uD(70317,82192,15);uD(71005,82192,15);uD(71693,82192,15)}if(a[20368]|0){a[20368]=0;g[3538]=+g[5090];g[3536]=+g[5088];g[3534]=+g[5086];c[16336]=c[16336]^2;c[17024]=c[17024]^2}c[5094]=0;c[18072]=0;g[3536]=30.0;g[3538]=60.0;g[3534]=1.0;g[3540]=0.0;g[3532]=1.0;B=0;L28997:do{c[64864+(B*688&-1)>>2]=6758437;a[64812+(B*688&-1)|0]=1;c[64808+(B*688&-1)>>2]=0;f=65280+(B*688&-1)|0;c[f>>2]=c[12782];c[f+4>>2]=c[12783];c[f+8>>2]=c[12784];c[f+12>>2]=c[12785];c[f+16>>2]=c[12786];c[f+20>>2]=c[12787];c[f+24>>2]=c[12788];c[f+28>>2]=c[12789];c[f+32>>2]=c[12790];c[f+36>>2]=c[12791];c[f+40>>2]=c[12792];c[f+44>>2]=c[12793];c[f+48>>2]=c[12794];c[f+52>>2]=c[12795];c[64656+(B*688&-1)>>2]=0;f=65140+(B*688&-1)|0;uu(c[f>>2]|0);c[f>>2]=0;f=65144+(B*688&-1)|0;uu(c[f>>2]|0);c[f>>2]=0;c[65224+(B*688&-1)>>2]=4;c[65228+(B*688&-1)>>2]=4;c[65232+(B*688&-1)>>2]=4;c[65152+(B*688&-1)>>2]=0;uD(65080+(B*688&-1)|0,51296,192);if((B|0)==5|(B|0)==3|(B|0)==1){c[65132+(B*688&-1)>>2]=-270}c[64652+(B*688&-1)>>2]=3;J=+h[56816+(B*24&-1)>>3];h[64680+(B*688&-1)>>3]=J;h[64696+(B*688&-1)>>3]=J;J=+h[56824+(B*24&-1)>>3];h[64688+(B*688&-1)>>3]=J;h[64704+(B*688&-1)>>3]=J;c[64728+(B*688&-1)>>2]=0;c[64732+(B*688&-1)>>2]=0;t6(B);c[64916+(B*688&-1)>>2]=c[56836+(B*24&-1)>>2];h[65048+(B*688&-1)>>3]=10.0;uD(64920+(B*688&-1)|0,51184,112);c[65040+(B*688&-1)>>2]=1;do{if((B|0)==7){f=(a[69604]&1)==0;a[69604]=0;h[8701]=0.0;if(f){B=B+1|0;continue L28997}else{ju();break}}else{a[64788+(B*688&-1)|0]=0;h[64792+(B*688&-1)>>3]=0.0}}while(0);B=B+1|0;}while(B>>>0<11);a[27776]=1;B=e|0;uE(B|0,0,3);e=56248;c[e>>2]=0;c[e+4>>2]=0;h[7032]=1.5;a[56264]=1;a[56265]=a[B]|0;a[56266|0]=a[B+1|0]|0;a[56267|0]=a[B+2|0]|0;c[14067]=6;c[14068]=252;c[14069]=0;h[7035]=1.0;c[14072]=1;c[14073]=0;h[7030]=-1.0;a[56232]=1;a[54144]=0;a[54160]=1;a[54152]=0;c[14074]=c[12768];c[14075]=c[12769];c[14076]=c[12770];c[14077]=c[12771];c[14078]=c[12772];c[14079]=c[12773];c[14080]=c[12774];c[14081]=c[12775];c[14082]=c[12776];c[14083]=c[12777];c[14084]=c[12778];c[14085]=c[12779];c[14086]=c[12780];c[14087]=c[12781];c[11692]=31;a[46752]=1;c[12890]=18;c[10058]=1;c[10859]=0;c[10851]=0;h[7077]=1.0;c[14156]=1;a[65036]=0;a[65037]=0;a[65724]=0;a[65725]=0;a[66412]=0;a[66413]=0;a[67100]=0;a[67101]=0;a[67788]=0;a[67789]=0;a[68476]=0;a[68477]=0;a[69164]=0;a[69165]=0;a[69852]=0;a[69853]=0;a[70540]=0;a[70541]=0;a[71228]=0;a[71229]=0;a[71916]=0;a[71917]=0;c[10012]=c[12358];c[10013]=c[12359];c[10014]=c[12360];c[10015]=c[12361];c[10016]=c[12362];c[10017]=c[12363];c[10018]=c[12364];c[10019]=c[12365];c[10020]=c[12366];c[10021]=c[12367];c[10022]=c[12368];c[10023]=c[12369];c[10024]=c[12370];c[10025]=c[12371];c[8694]=c[12358];c[8695]=c[12359];c[8696]=c[12360];c[8697]=c[12361];c[8698]=c[12362];c[8699]=c[12363];c[8700]=c[12364];c[8701]=c[12365];c[8702]=c[12366];c[8703]=c[12367];c[8704]=c[12368];c[8705]=c[12369];c[8706]=c[12370];c[8707]=c[12371];h[3815]=0.0;c[10026]=-1;c[6928]=0;c[9742]=1;c[9734]=3;c[9738]=1;a[38944]=0;a[38960]=0;c[9744]=0;a[38984]=0;a[35888]=1;a[53520]=a[96552]|0;a[53521|0]=a[96553|0]|0;a[53522|0]=a[96554|0]|0;a[53523|0]=a[96555|0]|0;a[53524|0]=a[96556|0]|0;a[53525|0]=a[96557|0]|0;h[9040]=1.0;c[8732]=0;g[178]=1.0;g[38]=1.0;g[2]=1.0;g[18074]=0.0;g[184]=0.0;g[44]=0.0;uE(y|0,0,28);uu(c[1183]|0);c[1183]=0;uu(c[1184]|0);c[1184]=0;c[1204]=4;c[1205]=4;c[1206]=4;c[1207]=c[y>>2];c[4832>>2]=c[y+4>>2];c[4836>>2]=c[y+8>>2];c[4840>>2]=c[y+12>>2];c[4844>>2]=c[y+16>>2];c[4848>>2]=c[y+20>>2];c[4852>>2]=c[y+24>>2];c[1186]=0;c[1164]=0;c[1166]=1;h[3296]=0.0;h[4384]=0.0;h[7048]=0.0;h[531]=0.0;c[11690]=0;c[13366]=5;c[13378]=0;c[13368]=4;c[13374]=5;c[13372]=0;h[11]=1.0e-8;c[11732]=10;c[11756]=10;c[11734]=1;c[11752]=1;h[5865]=1.0;h[5864]=1.0;a[47032]=0;h[77]=.5;a[624]=0;c[14100]=4;h[7052]=-1.0;c[8786]=4;h[4395]=-1.0;c[6598]=4;h[3301]=-1.0;c[1066]=4;h[535]=-1.0;h[3817]=1.0;h[3818]=1.0;b[15316]=115;a[30639]=98;a[30640]=0;a[30641]=97;a[30642]=52;c[7661]=0;c[7662]=0;c[7663]=4;c[7664]=1;c[7665]=1;uD(54016,50688,112);if((c[11254]|0)!=0){c[5163]=114;c[5164]=7;c[5165]=5;c[5166]=15;a[20668]=112;a[20684]=0;c[5168]=0;c[5172]=0;uu(c[5173]|0);c[5173]=0;uu(c[5170]|0);c[5170]=0;c[5174]=114;h[2705]=1.5;c[7640]=48}y=c[12168]|0;B=c[11862]|0;if((B|0)>0){e=0;f=B;while(1){B=y+(e*232&-1)+224|0;I=c[B>>2]|0;if((I|0)==0){K=f}else{uu(I);c[B>>2]=0;K=c[11862]|0}B=e+1|0;if((B|0)<(K|0)){e=B;f=K}else{break}}}c[11862]=0;c[12202]=c[12200];c[12206]=0;c[12372]=0;c[12373]=100;c[12374]=0;c[12376]=0;c[9670]=3;c[9671]=2;uu(c[8528]|0);c[8528]=0;a[47120]=0;uu(c[11948]|0);c[11948]=bP(199184)|0;K=c[10568]|0;if((K|0)!=0){uu(K)}c[10568]=0;a[42568]=0;e7(0);a[37400]=j;i=d;return}function t8(a){a=a|0;if((a|0)==0){return}else{t8(c[a>>2]|0);uu(a);return}}function t9(b){b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=c[1054]|0;L29029:do{if((a[e+(b*40&-1)|0]&1)==0){f=e}else{if((bO(d[(c[10036]|0)+(c[e+(b*40&-1)+32>>2]|0)|0]|0|0)|0)==0){g=c[1054]|0;if((a[(c[10036]|0)+(c[g+(b*40&-1)+32>>2]|0)|0]|0)!=95){f=g;break}}g=b+1|0;h=c[1054]|0;if((c[8272]|0)<=(g|0)){f=h;break}if((a[h+(g*40&-1)|0]&1)==0){f=h;break}i=c[h+(g*40&-1)+36>>2]|0;j=h+(g*40&-1)+32|0;g=c[10036]|0;k=0;while(1){if((k|0)>=(i|0)){break}if((a[g+((c[j>>2]|0)+k|0)|0]|0)==(a[k+115e3|0]|0)){k=k+1|0}else{f=h;break L29029}}if((k|0)==1){l=1}else{f=h;break}return l|0}}while(0);if((a[f+(b*40&-1)|0]&1)==0){l=0;return l|0}do{if((bO(d[(c[10036]|0)+(c[f+(b*40&-1)+32>>2]|0)|0]|0|0)|0)==0){if((a[(c[10036]|0)+(c[(c[1054]|0)+(b*40&-1)+32>>2]|0)|0]|0)==95){break}else{l=0}return l|0}}while(0);f=b+1|0;if((c[8272]|0)<=(f|0)){l=0;return l|0}e=c[1054]|0;if((a[e+(f*40&-1)|0]&1)==0){l=0;return l|0}j=c[e+(f*40&-1)+36>>2]|0;g=e+(f*40&-1)+32|0;f=c[10036]|0;i=0;while(1){if((i|0)>=(j|0)){break}if((a[f+((c[g>>2]|0)+i|0)|0]|0)==(a[i+199040|0]|0)){i=i+1|0}else{l=0;m=21849;break}}if((m|0)==21849){return l|0}if((i|0)!=1){l=0;return l|0}i=b+2|0;if((a[e+(i*40&-1)|0]&1)==0){l=0;return l|0}do{if((bO(d[f+(c[e+(i*40&-1)+32>>2]|0)|0]|0|0)|0)==0){if((a[(c[10036]|0)+(c[(c[1054]|0)+(i*40&-1)+32>>2]|0)|0]|0)==95){break}else{l=0}return l|0}}while(0);i=b+3|0;b=c[8272]|0;L29071:do{if((b|0)>(i|0)){e=i;f=b;while(1){g=c[1054]|0;if((a[g+(e*40&-1)|0]&1)==0){n=e;o=f;break L29071}j=c[g+(e*40&-1)+36>>2]|0;p=g+(e*40&-1)+32|0;q=c[10036]|0;r=0;while(1){if((r|0)>=(j|0)){break}if((a[q+((c[p>>2]|0)+r|0)|0]|0)==(a[r+148464|0]|0)){r=r+1|0}else{n=e;o=f;break L29071}}if((r|0)!=1){n=e;o=f;break L29071}p=e+1|0;if((a[g+(p*40&-1)|0]&1)==0){l=0;m=21856;break}if((bO(d[q+(c[g+(p*40&-1)+32>>2]|0)|0]|0|0)|0)==0){if((a[(c[10036]|0)+(c[(c[1054]|0)+(p*40&-1)+32>>2]|0)|0]|0)!=95){l=0;m=21859;break}}p=e+2|0;j=c[8272]|0;if((j|0)>(p|0)){e=p;f=j}else{n=p;o=j;break L29071}}if((m|0)==21859){return l|0}else if((m|0)==21856){return l|0}}else{n=i;o=b}}while(0);if((o|0)<=(n|0)){l=0;return l|0}b=c[1054]|0;if((a[b+(n*40&-1)|0]&1)==0){l=0;return l|0}i=c[b+(n*40&-1)+36>>2]|0;f=b+(n*40&-1)+32|0;e=c[10036]|0;h=0;while(1){if((h|0)>=(i|0)){break}if((a[e+((c[f>>2]|0)+h|0)|0]|0)==(a[h+131272|0]|0)){h=h+1|0}else{l=0;m=21858;break}}if((m|0)==21858){return l|0}if((h|0)!=1){l=0;return l|0}h=n+1|0;if((o|0)<=(h|0)){l=0;return l|0}if((a[b+(h*40&-1)|0]&1)==0){l=0;return l|0}o=c[b+(h*40&-1)+36>>2]|0;n=b+(h*40&-1)+32|0;h=0;while(1){if((h|0)>=(o|0)){break}if((a[e+((c[n>>2]|0)+h|0)|0]|0)==(a[h+115e3|0]|0)){h=h+1|0}else{l=0;m=21851;break}}if((m|0)==21851){return l|0}l=(h|0)==1&1;return l|0}function ua(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;i=i+16|0;e=d|0;f=d+8|0;g=b;h=b;L29117:while(1){b=a[g]|0;if((b<<24>>24|0)==0){break}else if((b<<24>>24|0)!=92){j=g+1|0;do{if((a[47120]|0)!=0&b<<24>>24==34){if((a[j]|0)!=34){break}a[h]=34;g=g+2|0;h=h+1|0;continue L29117}}while(0);a[h]=b;g=j;h=h+1|0;continue}k=g+1|0;l=a[k]|0;if((l<<24>>24|0)==34){a[h]=34;g=g+2|0;h=h+1|0;continue}else if((l<<24>>24|0)==114){a[h]=13;g=g+2|0;h=h+1|0;continue}else if((l<<24>>24|0)==92){a[h]=92;g=g+2|0;h=h+1|0;continue}else if((l<<24>>24|0)==116){a[h]=9;g=g+2|0;h=h+1|0;continue}else if((l<<24>>24|0)==110){a[h]=10;g=g+2|0;h=h+1|0;continue}else{if((l-48&255)>=8){g=k;h=h;continue}if((ca(k|0,(l<<24>>24==48?134368:132688)|0,(v=i,i=i+16|0,c[v>>2]=e,c[v+8>>2]=f,v)|0)|0)>0){a[h]=c[e>>2]&255;g=g+((c[f>>2]|0)+1|0)|0;h=h+1|0;continue}else{a[h]=92;a[h+1|0]=a[k]|0;g=g+2|0;h=h+2|0;continue}}}a[h]=0;i=d;return}function ub(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;f=c[1054]|0;g=c[f+(e*40&-1)+32>>2]|0;h=c[f+(e*40&-1)+36>>2]|0;e=(g-1|0)+h|0;i=db(c[b>>2]|0,(g+h|0)-(c[f+(d*40&-1)+32>>2]|0)|0,116456)|0;c[b>>2]=i;f=(c[(c[1054]|0)+(d*40&-1)+32>>2]|0)+1|0;L29139:do{if((f|0)<(e|0)){h=i;g=f;while(1){j=a[(c[10036]|0)+g|0]|0;if(j<<24>>24==0){k=h;break L29139}l=h+1|0;a[h]=j;j=g+1|0;if((j|0)<(e|0)){h=l;g=j}else{k=l;break}}}else{k=i}}while(0);a[k]=0;k=c[b>>2]|0;if((a[(c[10036]|0)+(c[(c[1054]|0)+(d*40&-1)+32>>2]|0)|0]|0)==34){ua(k);return}else{m=k;n=k}while(1){k=a[n]|0;if((k<<24>>24|0)==39){d=n+1|0;b=(a[d]|0)==39?d:n;o=b;p=a[b]|0}else if((k<<24>>24|0)==0){break}else{o=n;p=k}a[m]=p;m=m+1|0;n=o+1|0}a[m]=0;return}function uc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=uA(a|0)|0;f=(e+1|0)+(uA(b|0)|0)|0;e=ut(f)|0;do{if((e|0)==0){gk();g=ut(f)|0;if((g|0)!=0){h=g;break}uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=96488,v)|0);return 0}else{h=e}}while(0);uB(h|0,a|0);uC(h|0,b|0);i=d;return h|0}function ud(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=+f;g=+g;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0,G=0.0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0.0,Z=0,_=0.0,$=0,aa=0,ab=0.0,ac=0,ad=0,ae=0,af=0,ag=0,ai=0;j=i;i=i+2144|0;k=j|0;l=j+1032|0;m=j+2064|0;n=j+2072|0;o=j+2080|0;p=j+2088|0;q=j+2096|0;r=j+2104|0;s=j+2112|0;t=j+2120|0;u=j+2128|0;w=j+2136|0;c[m>>2]=0;x=k|0;y=k+1024|0;a[x]=0;k=c[8270]|0;do{if((k|0)!=0){if((aY(k|0,139696)|0)==0){break}bA(4,k|0)}}while(0);k=l|0;z=l+1|0;A=l+2|0;l=y;B=~~g;C=~~g>>>0;D=ah(O(g/4294967296.0),4294967295.0)>>>0;E=g/3.141592653589793;F=e;e=0;G=0.0;H=x;I=0;L29164:while(1){J=F;K=H;while(1){L=a[J]|0;M=J+1|0;if(L<<24>>24!=37){N=K+1|0;a[K]=L;if(L<<24>>24==0|(y|0)==(N|0)){Q=21902;break L29164}else{J=M;K=N;continue}}if((a[M]|0)!=37){break}a[K]=37;J=J+2|0;K=K+1|0}a[k]=37;if((a[M]|0)==35){a[z]=35;R=M;S=A;T=1}else{R=J;S=z;T=I}N=R;L=S;L29176:while(1){U=N+1|0;V=a[U]|0;do{if(V<<24>>24==46){W=46}else{if(((V&255)-48|0)>>>0<10){W=V;break}if((V<<24>>24|0)==45|(V<<24>>24|0)==43|(V<<24>>24|0)==32|(V<<24>>24|0)==39){W=V}else{break L29176}}}while(0);a[L]=W;N=U;L=L+1|0}J=V<<24>>24;do{if((J|0)==108){a[L]=102;a[L+1|0]=0;ue(f,g,0,n,m,k);X=l-K|0;Y=+h[n>>3];a0(K|0,X|0,k|0,(v=i,i=i+8|0,h[v>>3]=Y,v)|0);Z=1;_=f}else if((J|0)==115){a[L]=102;a[L+1|0]=0;ue(1.0,g,1,p,m,k);a0(K|0,l-K|0,k|0,(v=i,i=i+8|0,h[v>>3]=+h[p>>3],v)|0);Z=1;_=1.0}else if((J|0)==84){a[L]=100;a[L+1|0]=0;if(e){if(G!=1.0){Q=21934;break L29164}X=c[m>>2]|0;c[s>>2]=X;$=X}else{ue(1.0,g,0,0,s,74984);$=c[s>>2]|0}a0(K|0,l-K|0,k|0,(v=i,i=i+8|0,c[v>>2]=$,v)|0);Z=e;_=G}else if((J|0)==83){a[L]=100;a[L+1|0]=0;if(e){if(G!=1.0){Q=21940;break L29164}X=c[m>>2]|0;c[t>>2]=X;aa=X}else{ue(1.0,g,1,0,t,74984);aa=c[t>>2]|0}a0(K|0,l-K|0,k|0,(v=i,i=i+8|0,c[v>>2]=aa,v)|0);Z=e;_=G}else if((J|0)==98){a[L]=102;a[L+1|0]=0;ue(3.010299956639812,g,0,q,m,k);a0(K|0,l-K|0,k|0,(v=i,i=i+8|0,h[v>>3]=+h[q>>3],v)|0);Z=1;_=3.010299956639812}else if((J|0)==76){a[L]=100;a[L+1|0]=0;if(e){if(G!=f){Q=21929;break L29164}c[r>>2]=c[m>>2];ab=G}else{ab=f}ue(f,g,0,0,r,74984);a0(K|0,l-K|0,k|0,(v=i,i=i+8|0,c[v>>2]=c[r>>2],v)|0);Z=e;_=ab}else if((J|0)==101|(J|0)==69|(J|0)==102|(J|0)==70|(J|0)==103|(J|0)==71){a[L]=V;a[L+1|0]=0;a0(K|0,l-K|0,k|0,(v=i,i=i+8|0,h[v>>3]=g,v)|0);Z=e;_=G}else if((J|0)==99){a[L]=99;a[L+1|0]=0;if(e){if(G!=1.0){Q=21946;break L29164}X=c[m>>2]|0;c[u>>2]=X;ac=X}else{ue(1.0,g,1,0,u,74984);ac=c[u>>2]|0}X=ac+24|0;if(X>>>0<49){ad=(X|0)/3&-1;c[u>>2]=ad;X=l-K|0;ae=a[ad+204216|0]|0;a0(K|0,X|0,k|0,(v=i,i=i+8|0,c[v>>2]=ae,v)|0);Z=e;_=G;break}else{ae=l-K|0;a0(K|0,ae|0,199792,(v=i,i=i+8|0,c[v>>2]=ac,v)|0);Z=e;_=G;break}}else if((J|0)==116){a[L]=102;a[L+1|0]=0;ue(1.0,g,0,o,m,k);a0(K|0,l-K|0,k|0,(v=i,i=i+8|0,h[v>>3]=+h[o>>3],v)|0);Z=1;_=1.0}else if((J|0)==120|(J|0)==88|(J|0)==111|(J|0)==79){if(+P(+g)<2147483647.0){a[L]=V;a[L+1|0]=0;ae=l-K|0;a0(K|0,ae|0,k|0,(v=i,i=i+8|0,c[v>>2]=B,v)|0);Z=e;_=G;break}else{a[L]=108;a[L+1|0]=108;a[L+2|0]=a[U]|0;a[L+3|0]=0;ae=l-K|0;a0(K|0,ae|0,k|0,(v=i,i=i+16|0,c[v>>2]=C,c[v+8>>2]=D,v)|0);Z=e;_=G;break}}else if((J|0)==80){a[L]=102;a[L+1|0]=0;a0(K|0,l-K|0,k|0,(v=i,i=i+8|0,h[v>>3]=E,v)|0);Z=e;_=G}else if((J|0)==66){a[L]=99;a[L+1|0]=105;a[L+2|0]=0;if(e){if(G!=3.010299956639812){Q=21954;break L29164}ae=c[m>>2]|0;c[w>>2]=ae;af=ae}else{ue(3.010299956639812,g,0,0,w,74984);af=c[w>>2]|0}if((af-1|0)>>>0<8){ae=l-K|0;X=a[af+184160|0]|0;a0(K|0,ae|0,k|0,(v=i,i=i+8|0,c[v>>2]=X,v)|0);Z=e;_=G;break}if((af|0)>8){X=l-K|0;ae=af-8|0;a0(K|0,X|0,178992,(v=i,i=i+8|0,c[v>>2]=ae,v)|0);Z=e;_=G;break}if((af|0)>=0){Z=e;_=G;break}a0(K|0,l-K|0,174792,(v=i,i=i+8|0,c[v>>2]=af*10&-1,v)|0);Z=e;_=G}else{Q=21963;break L29164}}while(0);if(T){if((U|0)!=(cy(U|0,166744)|0)){Q=21969;break}}L=c[12886]|0;do{if((L|0)!=0){J=uA(L|0)|0;ae=a[c[b$()>>2]|0]|0;X=a8(K|0,ae|0)|0;if((X|0)==0){break}ad=K;ag=X;do{X=uA(ag|0)|0;ai=ag+J|0;if(((ai-ad|0)+X|0)>>>0>d>>>0){Q=21977;break L29164}uH(ai|0,ag+1|0,X|0);uD(ag|0,c[12886]|0,J);ag=a8(ai|0,ae|0)|0;}while((ag|0)!=0)}}while(0);F=N+2|0;e=Z;G=_;H=K+(uA(K|0)|0)|0;I=T}if((Q|0)==21902){uF(b|0,x|0,d|0);if((uA(x|0)|0)>>>0>=d>>>0){a[b+((d|0)==0?0:d-1|0)|0]=0}d=c[8270]|0;if((d|0)==0){i=j;return}if((aY(d|0,139696)|0)==0){i=j;return}bA(4,139696);i=j;return}else if((Q|0)==21940){uf(-1,215448,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==21946){uf(-1,209728,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==21929){uf(-1,82024,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==21954){uf(-1,193648,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==21969){j=c[8270]|0;if((j|0)==0){uf(-1,170952,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((aY(j|0,139696)|0)==0){uf(-1,170952,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}bA(4,139696);uf(-1,170952,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==21977){uf(-1,161576,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==21963){j=c[8270]|0;if((j|0)==0){uf(-1,170952,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((aY(j|0,139696)|0)==0){uf(-1,170952,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}bA(4,139696);uf(-1,170952,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((Q|0)==21934){uf(-1,222240,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}function ue(a,b,d,e,f,g){a=+a;b=+b;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0.0,l=0.0,m=0,n=0,o=0,p=0,q=0.0,r=0,s=0,t=0.0,u=0,w=0.0,x=0,y=0.0,z=0;j=i;if(b==0.0){if((e|0)!=0){h[e>>3]=0.0}if((f|0)==0){i=j;return}c[f>>2]=0;i=j;return}if(b<0.0){k=-0.0-b;l=-1.0}else{k=b;l=1.0}b=+bQ(+k)/a;m=~~+O(+b);k=+R(10.0,+((b- +(m|0))*a));if(d){if(a!=1.0){uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=127848,v)|0)}n=(m|0)%3&-1;if((n|0)==2){o=m;p=22001}else if((n|0)==(-1|0)){o=m-3|0;p=22001}else if((n|0)==0){q=k;r=m}else if((n|0)==1){s=m;p=22003}else if((n|0)==(-2|0)){s=m-3|0;p=22003}else{uf(-1,126488,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}if((p|0)==22001){q=k*100.0;r=o}else if((p|0)==22003){q=k*10.0;r=s}t=q;u=r-((r|0)%3&-1)|0}else{t=k;u=m}do{if((g|0)==0){w=t;x=u}else{if(d){y=1.0e3}else{y=+R(10.0,+a)}m=a8(g|0,46)|0;if((m|0)==0){z=0}else{z=aE(m+1|0,0,10)|0}if(t+ +R(10.0,+(+(-z|0)))*.5>3]=l*w}if((f|0)==0){i=j;return}c[f>>2]=x;i=j;return}function uf(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0;f=i;i=i+144|0;g=f|0;h=f+16|0;uE(h|0,0,128);do{if((b|0)==(-2|0)){f=c[11932]|0;j=c[8802]|0;if(!((c[12892]|0)!=0&(f|0)!=0&(j|0)!=0)){break}k=c[m>>2]|0;l=(uA(j|0)|0)>>>0>77?76168:179864;n=c[11900]|0;cf(k|0,76792,(v=i,i=i+32|0,c[v>>2]=j,c[v+8>>2]=l,c[v+16>>2]=f,c[v+24>>2]=n,v)|0)}else if((b|0)!=(-1|0)){if((a[25280]&1)==0){n=c[m>>2]|0;f=c[12906]|0;l=(f|0)!=0?f:179864;f=c[10036]|0;cf(n|0,153408,(v=i,i=i+16|0,c[v>>2]=l,c[v+8>>2]=f,v)|0)}f=c[12906]|0;do{if((f|0)!=0){if((a[f]|0)==0){break}else{o=f}do{aF(32,c[m>>2]|0);o=o+1|0;}while((a[o]|0)!=0)}}while(0);if((c[(c[1054]|0)+(b*40&-1)+32>>2]|0)>0){f=0;do{aF(((a[(c[10036]|0)+f|0]|0)==9?9:32)|0,c[m>>2]|0);f=f+1|0;}while((f|0)<(c[(c[1054]|0)+(b*40&-1)+32>>2]|0))}aI(148792,2,1,c[m>>2]|0)}}while(0);b=c[12906]|0;do{if((b|0)!=0){if((a[b]|0)==0){break}else{p=b}do{aF(32,c[m>>2]|0);p=p+1|0;}while((a[p]|0)!=0)}}while(0);L29346:do{if((a[37400]&1)==0){p=c[8804]|0;do{if((p|0)!=0){b=c[p+4>>2]|0;if((b|0)==0){break}o=c[m>>2]|0;f=c[9354]|0;cf(o|0,146696,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=f,v)|0);break L29346}}while(0);p=c[m>>2]|0;f=c[9354]|0;cf(p|0,144600,(v=i,i=i+8|0,c[v>>2]=f,v)|0)}}while(0);f=g;c[f>>2]=e;c[f+4>>2]=0;b9(h|0,128,d|0,g|0);cf(c[m>>2]|0,141456,(v=i,i=i+8|0,c[v>>2]=h,v)|0);aI(139704,2,1,c[m>>2]|0);g=c[8270]|0;do{if((g|0)!=0){if((aY(g|0,139696)|0)==0){break}bA(4,139696)}}while(0);a[43504]=0;c[6932]=0;c[13544]=0;a[14176]=0;a[25288]=0;a[37408]=0;e7(2);g=e6(137752)|0;if((g|0)==0){iL()}d=g+8|0;do{if((a[d]&1)==0){if((aY(c[g+24>>2]|0,h|0)|0)==0){iL()}f=g+16|0;if((c[f>>2]|0)!=3){q=f;break}uu(c[g+24>>2]|0);c[f>>2]=1;q=f}else{a[d]=0;q=g+16|0}}while(0);d=bP(h|0)|0;c[q>>2]=3;c[g+24>>2]=d;iL()}function ug(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=c[b>>2]|0;c[b>>2]=e+1;f=d[e]|0;if((f&128|0)==0){c[a>>2]=f;g=1;return g|0}if((f&224|0)==192){e=f&31;c[a>>2]=e;h=d[c[b>>2]|0]|0;if((h&192|0)!=128){c[a>>2]=65535;g=0;return g|0}c[a>>2]=e<<6|h&63;c[b>>2]=(c[b>>2]|0)+1;if((c[a>>2]|0)>>>0>=128){g=1;return g|0}c[a>>2]=65535;g=0;return g|0}if((f&240|0)==224){h=f&15;c[a>>2]=h;e=d[c[b>>2]|0]|0;do{if((e&192|0)==128){c[a>>2]=h<<6|e&63;i=(c[b>>2]|0)+1|0;c[b>>2]=i;j=d[i]|0;if((j&192|0)!=128){break}c[a>>2]=c[a>>2]<<6|j&63;c[b>>2]=(c[b>>2]|0)+1;if((c[a>>2]|0)>>>0>=2048){g=1;return g|0}c[a>>2]=65535;g=0;return g|0}}while(0);c[a>>2]=65535;g=0;return g|0}if((f&248|0)==240){e=f&7;c[a>>2]=e;h=d[c[b>>2]|0]|0;do{if((h&192|0)==128){c[a>>2]=e<<6|h&63;j=(c[b>>2]|0)+1|0;c[b>>2]=j;i=d[j]|0;if((i&192|0)!=128){break}c[a>>2]=c[a>>2]<<6|i&63;i=(c[b>>2]|0)+1|0;c[b>>2]=i;j=d[i]|0;if((j&192|0)!=128){break}c[a>>2]=c[a>>2]<<6|j&63;c[b>>2]=(c[b>>2]|0)+1;if((c[a>>2]|0)>>>0>=65536){g=1;return g|0}c[a>>2]=65535;g=0;return g|0}}while(0);c[a>>2]=65535;g=0;return g|0}if((f&252|0)==248){h=f&3;c[a>>2]=h;e=d[c[b>>2]|0]|0;do{if((e&192|0)==128){c[a>>2]=h<<6|e&63;j=(c[b>>2]|0)+1|0;c[b>>2]=j;i=d[j]|0;if((i&192|0)!=128){break}c[a>>2]=c[a>>2]<<6|i&63;i=(c[b>>2]|0)+1|0;c[b>>2]=i;j=d[i]|0;if((j&192|0)!=128){break}c[a>>2]=c[a>>2]<<6|j&63;j=(c[b>>2]|0)+1|0;c[b>>2]=j;i=d[j]|0;if((i&192|0)!=128){break}c[a>>2]=c[a>>2]<<6|i&63;c[b>>2]=(c[b>>2]|0)+1;if((c[a>>2]|0)>>>0>=2097152){g=1;return g|0}c[a>>2]=65535;g=0;return g|0}}while(0);c[a>>2]=65535;g=0;return g|0}if((f&254|0)!=252){c[a>>2]=65535;g=0;return g|0}e=f&1;c[a>>2]=e;f=d[c[b>>2]|0]|0;do{if((f&192|0)==128){c[a>>2]=e<<6|f&63;h=(c[b>>2]|0)+1|0;c[b>>2]=h;i=d[h]|0;if((i&192|0)!=128){break}c[a>>2]=c[a>>2]<<6|i&63;i=(c[b>>2]|0)+1|0;c[b>>2]=i;h=d[i]|0;if((h&192|0)!=128){break}c[a>>2]=c[a>>2]<<6|h&63;h=(c[b>>2]|0)+1|0;c[b>>2]=h;i=d[h]|0;if((i&192|0)!=128){break}c[a>>2]=c[a>>2]<<6|i&63;i=(c[b>>2]|0)+1|0;c[b>>2]=i;h=d[i]|0;if((h&192|0)!=128){break}c[a>>2]=c[a>>2]<<6|h&63;c[b>>2]=(c[b>>2]|0)+1;if((c[a>>2]|0)>>>0>=67108864){g=1;return g|0}c[a>>2]=65535;g=0;return g|0}}while(0);c[a>>2]=65535;g=0;return g|0}function uh(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,n=0,o=0,p=0;f=i;i=i+16|0;g=f|0;do{if((b|0)==(-2|0)){h=c[11932]|0;j=c[8802]|0;if(!((c[12892]|0)!=0&(h|0)!=0&(j|0)!=0)){break}k=c[m>>2]|0;l=(uA(j|0)|0)>>>0>77?76168:179864;n=c[11900]|0;cf(k|0,76792,(v=i,i=i+32|0,c[v>>2]=j,c[v+8>>2]=l,c[v+16>>2]=h,c[v+24>>2]=n,v)|0)}else if((b|0)!=(-1|0)){if((a[25280]&1)==0){n=c[m>>2]|0;h=c[12906]|0;l=(h|0)!=0?h:179864;h=c[10036]|0;cf(n|0,153408,(v=i,i=i+16|0,c[v>>2]=l,c[v+8>>2]=h,v)|0)}h=c[12906]|0;do{if((h|0)!=0){if((a[h]|0)==0){break}else{o=h}do{aF(32,c[m>>2]|0);o=o+1|0;}while((a[o]|0)!=0)}}while(0);if((c[(c[1054]|0)+(b*40&-1)+32>>2]|0)>0){h=0;do{aF(((a[(c[10036]|0)+h|0]|0)==9?9:32)|0,c[m>>2]|0);h=h+1|0;}while((h|0)<(c[(c[1054]|0)+(b*40&-1)+32>>2]|0))}aI(148792,2,1,c[m>>2]|0)}}while(0);b=c[12906]|0;do{if((b|0)!=0){if((a[b]|0)==0){break}else{p=b}do{aF(32,c[m>>2]|0);p=p+1|0;}while((a[p]|0)!=0)}}while(0);L29463:do{if((a[37400]&1)==0){p=c[8804]|0;do{if((p|0)!=0){b=c[p+4>>2]|0;if((b|0)==0){break}o=c[m>>2]|0;h=c[9354]|0;cf(o|0,146696,(v=i,i=i+16|0,c[v>>2]=b,c[v+8>>2]=h,v)|0);break L29463}}while(0);p=c[m>>2]|0;h=c[9354]|0;cf(p|0,144600,(v=i,i=i+8|0,c[v>>2]=h,v)|0)}}while(0);aI(135952,9,1,c[m>>2]|0);h=g;c[h>>2]=e;c[h+4>>2]=0;bX(c[m>>2]|0,d|0,g|0);aF(10,c[m>>2]|0);i=f;return}function ui(b,c){b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0;d=b;while(1){if((aM(a[d]|0|0)|0)==0){e=c;break}else{d=d+1|0}}while(1){if((aM(a[e]|0|0)|0)==0){break}else{e=e+1|0}}c=uA(d|0)|0;b=uA(e|0)|0;f=c;while(1){g=f-1|0;if((aM(a[d+g|0]|0|0)|0)==0){h=b;break}else{f=g}}do{h=h-1|0;}while((aM(a[e+h|0]|0|0)|0)!=0);if((g|0)!=(h|0)){i=0;return i|0}i=(a_(d|0,e|0,f|0)|0)==0;return i|0}function uj(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0;f=i;i=i+16|0;g=f|0;do{if((b|0)==(-2|0)){f=c[11932]|0;h=c[8802]|0;if(!((c[12892]|0)!=0&(f|0)!=0&(h|0)!=0)){break}j=c[m>>2]|0;k=(uA(h|0)|0)>>>0>77?76168:179864;l=c[11900]|0;cf(j|0,76792,(v=i,i=i+32|0,c[v>>2]=h,c[v+8>>2]=k,c[v+16>>2]=f,c[v+24>>2]=l,v)|0)}else if((b|0)!=(-1|0)){if((a[25280]&1)==0){l=c[m>>2]|0;f=c[12906]|0;k=(f|0)!=0?f:179864;f=c[10036]|0;cf(l|0,153408,(v=i,i=i+16|0,c[v>>2]=k,c[v+8>>2]=f,v)|0)}f=c[12906]|0;do{if((f|0)!=0){if((a[f]|0)==0){break}else{n=f}do{aF(32,c[m>>2]|0);n=n+1|0;}while((a[n]|0)!=0)}}while(0);if((c[(c[1054]|0)+(b*40&-1)+32>>2]|0)>0){f=0;do{aF(((a[(c[10036]|0)+f|0]|0)==9?9:32)|0,c[m>>2]|0);f=f+1|0;}while((f|0)<(c[(c[1054]|0)+(b*40&-1)+32>>2]|0))}aI(148792,2,1,c[m>>2]|0)}}while(0);b=c[12906]|0;do{if((b|0)!=0){if((a[b]|0)==0){break}else{o=b}do{aF(32,c[m>>2]|0);o=o+1|0;}while((a[o]|0)!=0)}}while(0);o=g;c[o>>2]=e;c[o+4>>2]=0;bX(c[m>>2]|0,d|0,g|0);aF(10,c[m>>2]|0);g=c[12906]|0;do{if((g|0)!=0){if((a[g]|0)==0){break}else{p=g}do{aF(32,c[m>>2]|0);p=p+1|0;}while((a[p]|0)!=0)}}while(0);if((a[37400]&1)!=0){aS(143e3);q=c[m>>2]|0;r=aF(10,q|0)|0;a[25288]=0;iL()}p=c[8804]|0;do{if((p|0)!=0){g=c[p+4>>2]|0;if((g|0)==0){break}d=c[m>>2]|0;o=c[9354]|0;cf(d|0,146696,(v=i,i=i+16|0,c[v>>2]=g,c[v+8>>2]=o,v)|0);aS(143e3);q=c[m>>2]|0;r=aF(10,q|0)|0;a[25288]=0;iL()}}while(0);cf(c[m>>2]|0,144600,(v=i,i=i+8|0,c[v>>2]=c[9354],v)|0);aS(143e3);q=c[m>>2]|0;r=aF(10,q|0)|0;a[25288]=0;iL()}function uk(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;i=i+16|0;f=e|0;a[33512]=0;lh();e=f|0;g=f;c[g>>2]=d;c[g+4>>2]=0;g=c[12906]|0;do{if((g|0)!=0){if((a[g]|0)==0){break}else{h=g}do{aF(32,c[m>>2]|0);h=h+1|0;}while((a[h]|0)!=0)}}while(0);L29528:do{if((a[37400]&1)==0){h=c[8804]|0;do{if((h|0)!=0){g=c[h+4>>2]|0;if((g|0)==0){break}d=c[m>>2]|0;f=c[9354]|0;cf(d|0,146696,(v=i,i=i+16|0,c[v>>2]=g,c[v+8>>2]=f,v)|0);break L29528}}while(0);h=c[m>>2]|0;f=c[9354]|0;cf(h|0,144600,(v=i,i=i+8|0,c[v>>2]=f,v)|0)}}while(0);bX(c[m>>2]|0,b|0,e|0);aI(139704,2,1,c[m>>2]|0);iL()}function ul(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,w=0,x=0.0,y=0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0,I=0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0,V=0.0,W=0.0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0;j=i;k=+h[a+(b<<6)+8>>3];l=+h[a+(b<<6)+16>>3];m=+h[a+(b<<6)+24>>3];n=+h[a+(d<<6)+8>>3];o=+h[a+(d<<6)+16>>3];p=+h[a+(d<<6)+24>>3];d=(c[a+(b<<6)>>2]|0)==0;q=d?n:k;r=d?o:l;s=d?p:m;t=d?k:n;n=d?l:o;o=d?m:p;d=t==-8.988465674311579e+307;b=n==-8.988465674311579e+307;a=(b?d?2:1:d&1)+(o==-8.988465674311579e+307&1)|0;if((a|0)>1){h[e>>3]=q;h[f>>3]=r;h[g>>3]=s;i=j;return}if((a|0)==1){h[e>>3]=q;h[f>>3]=r;h[g>>3]=s;if(d){h[e>>3]=(c[16508]&2|0)==0?+h[8255]:+h[8256];i=j;return}if(b){h[f>>3]=(c[16336]&2|0)==0?+h[8169]:+h[8170];i=j;return}else{h[g>>3]=(c[16164]&2|0)==0?+h[8083]:+h[8084];i=j;return}}do{if(q==t){if(r==n){h[e>>3]=q;h[f>>3]=r;b=so){w=19;break}else{w=18;break}}}else{if(ls){w=19;break}else{w=18;break}}}}while(0);if((w|0)==18){h[g>>3]=(d|0)==0?m:p;i=j;return}else if((w|0)==19){l=a?m:p;if(b){u=l;w=20}else{x=l;w=22}}do{if((w|0)==20){if(u>3<<3,c[v>>2]=0,v)|0)}if(((d|0)==0?p:m)<=o){break}uk(113944,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((w|0)==22){if(x>3<<3,c[v>>2]=0,v)|0)}if(((d|0)==0?p:m)<=s){break}uk(113944,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);h[g>>3]=(d|0)==0?p:m;i=j;return}if(s==o){h[e>>3]=q;h[g>>3]=s;b=rn){w=35;break}else{w=34;break}}}else{if(zr){w=35;break}else{w=34;break}}}}while(0);if((w|0)==34){h[f>>3]=(a|0)==0?k:l;i=j;return}else if((w|0)==35){z=y?k:l;if(b){A=z;w=36}else{B=z;w=38}}do{if((w|0)==36){if(A>3<<3,c[v>>2]=0,v)|0)}if(((a|0)==0?l:k)<=n){break}uk(113944,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((w|0)==38){if(B>3<<3,c[v>>2]=0,v)|0)}if(((a|0)==0?l:k)<=r){break}uk(113944,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);h[f>>3]=(a|0)==0?l:k;i=j;return}b=rn){w=54;break}else{w=49;break}}}else{if(pr){w=54;break}else{w=49;break}}}}while(0);do{if((w|0)==49){p=(y|0)==0?m:z;if(!(p!=r&p!=n)){w=54;break}k=s+(p-r)*((o-s)/(n-r));p=+h[8083];l=+h[8084];if(pl){w=54;break}}else{if(kp){w=54;break}}h[e>>3]=q;h[f>>3]=(c[16336]&2|0)==0?+h[8169]:+h[8170];h[g>>3]=k;i=j;return}}while(0);if((w|0)==54){k=d?m:z;if(b){C=k;w=55}else{D=k;w=57}}do{if((w|0)==55){if(Cl){break}}else{if(pk){break}}h[e>>3]=q;h[f>>3]=(c[16336]&2|0)==0?+h[8170]:+h[8169];h[g>>3]=p;i=j;return}}while(0);y=so){w=76;break}else{w=71;break}}}else{if(ls){w=76;break}else{w=71;break}}}}while(0);do{if((w|0)==71){l=(b|0)==0?k:p;if(!(l!=s&l!=o)){w=76;break}G=r+(l-s)*((n-r)/(o-s));if(mz){w=76;break}}else{if(Gm){w=76;break}}h[e>>3]=q;h[f>>3]=G;h[g>>3]=(c[16164]&2|0)==0?+h[8083]:+h[8084];i=j;return}}while(0);if((w|0)==76){G=d?k:p;if(y){E=G;w=77}else{F=G;w=79}}if((w|0)==77){if(Eo){break}}else if((w|0)==79){if(Fs){break}}G=(b|0)==0?p:k;if(!(G!=s&G!=o)){break}l=r+(G-s)*((n-r)/(o-s));if(mz){break}}else{if(lm){break}}h[e>>3]=q;h[f>>3]=l;h[g>>3]=(c[16164]&2|0)==0?+h[8084]:+h[8083];i=j;return}}while(0);do{if(r==n){if(o==s){h[f>>3]=r;h[g>>3]=s;a=qt){w=96;break}else{w=95;break}}}else{if(Dq){w=96;break}else{w=95;break}}}}while(0);if((w|0)==95){h[e>>3]=(H|0)==0?E:F;i=j;return}else if((w|0)==96){D=I?E:F;if(a){J=D;w=97}else{K=D;w=99}}do{if((w|0)==97){if(J>3<<3,c[v>>2]=0,v)|0)}if(((H|0)==0?F:E)<=t){break}uk(113944,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}else if((w|0)==99){if(K>3<<3,c[v>>2]=0,v)|0)}if(((H|0)==0?F:E)<=q){break}uk(113944,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0)}}while(0);h[e>>3]=(H|0)==0?F:E;i=j;return}a=qt){w=115;break}else{w=110;break}}}else{if(zq){w=115;break}else{w=110;break}}}}while(0);do{if((w|0)==110){z=(I|0)==0?m:D;if(!(z!=q&z!=t)){w=115;break}E=s+(z-q)*((o-s)/(t-q));F=+h[8083];k=+h[8084];if(Fk){w=115;break}}else{if(EF){w=115;break}}h[e>>3]=z;h[f>>3]=r;h[g>>3]=E;i=j;return}}while(0);if((w|0)==115){E=b?m:D;if(a){L=E;w=116}else{M=E;w=118}}do{if((w|0)==116){if(Lk){break}}else{if(zF){break}}h[e>>3]=E;h[f>>3]=r;h[g>>3]=z;i=j;return}}while(0);I=so){w=137;break}else{w=132;break}}}else{if(Fs){w=137;break}else{w=132;break}}}}while(0);do{if((w|0)==132){F=(a|0)==0?E:z;if(!(F!=s&F!=o)){w=137;break}k=q+(F-s)*((t-q)/(o-s));if(mD){w=137;break}}else{if(km){w=137;break}}h[e>>3]=k;h[f>>3]=r;h[g>>3]=(c[16164]&2|0)==0?+h[8083]:+h[8084];i=j;return}}while(0);if((w|0)==137){k=b?E:z;if(I){N=k;w=138}else{O=k;w=140}}if((w|0)==138){if(No){break}}else if((w|0)==140){if(Os){break}}k=(a|0)==0?z:E;if(!(k!=s&k!=o)){break}F=q+(k-s)*((t-q)/(o-s));if(mD){break}}else{if(Fm){break}}h[e>>3]=F;h[f>>3]=r;h[g>>3]=(c[16164]&2|0)==0?+h[8084]:+h[8083];i=j;return}}while(0);do{if(s==o){H=qt){w=161;break}else{w=156;break}}}else{if(Mq){w=161;break}else{w=156;break}}}}while(0);do{if((w|0)==156){M=(d|0)==0?N:O;if(!(M!=q&M!=t)){w=161;break}m=r+(M-q)*((n-r)/(t-q));D=+h[8169];E=+h[8170];if(DE){w=161;break}}else{if(mD){w=161;break}}h[e>>3]=M;h[f>>3]=m;h[g>>3]=s;i=j;return}}while(0);if((w|0)==161){m=P?N:O;if(H){Q=m;w=162}else{R=m;w=164}}do{if((w|0)==162){if(QE){break}}else{if(MD){break}}h[e>>3]=m;h[f>>3]=M;h[g>>3]=s;i=j;return}}while(0);d=rn){w=183;break}else{w=178;break}}}else{if(Dr){w=183;break}else{w=178;break}}}}while(0);do{if((w|0)==178){D=(H|0)==0?m:M;if(!(D!=r&D!=n)){w=183;break}E=q+(D-r)*((t-q)/(n-r));if(NO){w=183;break}}else{if(EN){w=183;break}}h[e>>3]=E;h[f>>3]=(c[16336]&2|0)==0?+h[8169]:+h[8170];h[g>>3]=s;i=j;return}}while(0);if((w|0)==183){E=P?m:M;if(d){S=E;w=184}else{T=E;w=186}}if((w|0)==184){if(Sn){U=y;V=O;W=N;break}}else if((w|0)==186){if(Tr){U=y;V=O;W=N;break}}E=(H|0)==0?M:m;if(!(E!=r&E!=n)){U=y;V=O;W=N;break}D=q+(E-r)*((t-q)/(n-r));if(NO){U=y;V=O;W=N;break}}else{if(DN){U=y;V=O;W=N;break}}h[e>>3]=D;h[f>>3]=(c[16336]&2|0)==0?+h[8170]:+h[8169];h[g>>3]=s;i=j;return}else{U=c[16508]|0;V=+h[8256];W=+h[8255]}}while(0);a=qt){w=208;break}else{w=200;break}}}else{if(Tq){w=208;break}else{w=200;break}}}}while(0);do{if((w|0)==200){T=(I|0)==0?W:V;if(!(T!=q&T!=t)){w=208;break}S=T-q;R=t-q;Q=r+S*((n-r)/R);D=s+S*((o-s)/R);R=+h[8169];S=+h[8170];if(RS){w=208;break}}else{if(QR){w=208;break}}R=+h[8083];S=+h[8084];if(RS){w=208;break}}else{if(DR){w=208;break}}h[e>>3]=T;h[f>>3]=Q;h[g>>3]=D;i=j;return}}while(0);if((w|0)==208){D=U?W:V;if(a){X=D;w=209}else{Y=D;w=211}}do{if((w|0)==209){if(XX){break}}else{if(QD){break}}D=+h[8083];X=+h[8084];if(DX){break}}else{if(TD){break}}h[e>>3]=Y;h[f>>3]=Q;h[g>>3]=T;i=j;return}}while(0);I=rn){w=236;break}else{w=228;break}}}else{if(Yr){w=236;break}else{w=228;break}}}}while(0);do{if((w|0)==228){Y=(a|0)==0?Q:T;if(!(Y!=r&Y!=n)){w=236;break}D=Y-r;Y=n-r;X=q+D*((t-q)/Y);R=s+D*((o-s)/Y);if(WV){w=236;break}}else{if(XW){w=236;break}}Y=+h[8083];D=+h[8084];if(YD){w=236;break}}else{if(RY){w=236;break}}h[e>>3]=X;h[f>>3]=(c[16336]&2|0)==0?+h[8169]:+h[8170];h[g>>3]=R;i=j;return}}while(0);if((w|0)==236){R=U?Q:T;if(I){Z=R;w=237}else{_=R;w=239}}do{if((w|0)==237){if(ZV){break}}else{if(RW){break}}_=+h[8083];Z=+h[8084];if(_Z){break}}else{if(X_){break}}h[e>>3]=R;h[f>>3]=(c[16336]&2|0)==0?+h[8170]:+h[8169];h[g>>3]=X;i=j;return}}while(0);a=so){w=264;break}else{w=256;break}}}else{if(_s){w=264;break}else{w=256;break}}}}while(0);do{if((w|0)==256){_=(I|0)==0?R:X;if(!(_!=s&_!=o)){w=264;break}Z=_-s;_=o-s;Y=q+Z*((t-q)/_);D=r+Z*((n-r)/_);if(WV){w=264;break}}else{if(YW){w=264;break}}if(QT){w=264;break}}else{if(DQ){w=264;break}}h[e>>3]=Y;h[f>>3]=D;h[g>>3]=(c[16164]&2|0)==0?+h[8083]:+h[8084];i=j;return}}while(0);if((w|0)==264){D=U?R:X;if(a){$=D;w=265}else{aa=D;w=267}}do{if((w|0)==265){if($V){break}}else{if(DW){break}}if(QT){break}}else{if(YQ){break}}h[e>>3]=D;h[f>>3]=Y;h[g>>3]=(c[16164]&2|0)==0?+h[8084]:+h[8083];i=j;return}}while(0);h[e>>3]=q;h[f>>3]=r;h[g>>3]=s;i=j;return}function um(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0,G=0.0,H=0.0,I=0.0;g=+h[a+(b<<6)+8>>3];i=+h[a+(b<<6)+16>>3];j=+h[a+(b<<6)+24>>3];k=+h[a+(c<<6)+8>>3];l=+h[a+(c<<6)+16>>3];m=+h[a+(c<<6)+24>>3];c=g==-8.988465674311579e+307;a=k==-8.988465674311579e+307;b=i==-8.988465674311579e+307;n=l==-8.988465674311579e+307;o=j==-8.988465674311579e+307;p=m==-8.988465674311579e+307;if((((((o&1)+(b&1)|0)+(a?c?2:1:c&1)|0)+(n&1)|0)+(p&1)|0)>1){q=0;return q|0}if(a|c){r=c?l:i;s=c?m:j;if((c?k:g)<=+h[8256]){q=0;return q|0}t=+h[8169];u=+h[8170];do{if(tu){q=0}else{break}return q|0}else{if(rt){q=0}else{break}return q|0}}while(0);t=+h[8083];u=+h[8084];do{if(tu){q=0}else{break}return q|0}else{if(st){q=0}else{break}return q|0}}while(0);h[d>>3]=+h[8255];h[e>>3]=r;h[f>>3]=s;h[d+8>>3]=+h[8256];h[e+8>>3]=r;h[f+8>>3]=s;q=1;return q|0}if(n|b){s=b?k:g;r=b?m:j;if((b?l:i)<=+h[8170]){q=0;return q|0}t=+h[8255];u=+h[8256];do{if(tu){q=0}else{break}return q|0}else{if(st){q=0}else{break}return q|0}}while(0);t=+h[8083];u=+h[8084];do{if(tu){q=0}else{break}return q|0}else{if(rt){q=0}else{break}return q|0}}while(0);h[d>>3]=s;h[e>>3]=+h[8169];h[f>>3]=r;h[d+8>>3]=s;h[e+8>>3]=+h[8170];h[f+8>>3]=r;q=1;return q|0}if(p|o){r=o?k:g;s=o?l:i;if((o?m:j)<=+h[8084]){q=0;return q|0}t=+h[8255];u=+h[8256];do{if(tu){q=0}else{break}return q|0}else{if(rt){q=0}else{break}return q|0}}while(0);t=+h[8169];u=+h[8170];do{if(tu){q=0}else{break}return q|0}else{if(st){q=0}else{break}return q|0}}while(0);h[d>>3]=r;h[e>>3]=s;h[f>>3]=+h[8083];h[d+8>>3]=r;h[e+8>>3]=s;h[f+8>>3]=+h[8084];q=1;return q|0}s=+h[8083];if((j>m?j:m)r){q=0;return q|0}t=+h[8255];if((g>k?g:k)u){q=0;return q|0}v=+h[8169];if((i>l?i:l)w){q=0;return q|0}n=g==k;c=i==l;a=j==m;if(n&c&a){q=0;return q|0}if(n){n=tu){q=0}else{break}return q|0}else{if(gt){q=0}else{break}return q|0}}while(0);do{if(vw){q=0}else{break}return q|0}else{if(iv){q=0}else{break}return q|0}}while(0);do{if(o){if(sm){q=0}else{break}return q|0}else{if(sj){q=0}else{break}return q|0}}while(0);h[d>>3]=g;h[e>>3]=i;h[f>>3]=+h[8083];h[d+8>>3]=g;h[e+8>>3]=i;h[f+8>>3]=+h[8084];q=1;return q|0}if(a){do{if(n){if(gu){q=0}else{break}return q|0}else{if(gt){q=0}else{break}return q|0}}while(0);do{if(sr){q=0}else{break}return q|0}else{if(js){q=0}else{break}return q|0}}while(0);do{if(b){if(vl){q=0}else{break}return q|0}else{if(vi){q=0}else{break}return q|0}}while(0);h[d>>3]=g;h[e>>3]=+h[8169];h[f>>3]=j;h[d+8>>3]=g;h[e+8>>3]=+h[8170];h[f+8>>3]=j;q=1;return q|0}else{do{if(n){if(ku){q=0}else{break}return q|0}else{if(kt){q=0}else{break}return q|0}}while(0);x=l-i;y=(v-i)/x;z=(w-i)/x;n=y>z;A=n?y:z;B=n?z:y;y=m-j;z=(s-j)/y;C=(r-j)/y;n=z>C;D=n?z:C;E=n?C:z;z=B>E?B:E;E=z>0.0?z:0.0;z=AD){q=0;return q|0}h[d>>3]=g;h[e>>3]=i+x*E;h[f>>3]=j+y*E;h[d+8>>3]=g;h[e+8>>3]=i+x*D;h[f+8>>3]=j+y*D;D=+h[8169];y=+h[8170];x=+h[e>>3];if(Dy)){F=385}}else{if(!(xD)){F=385}}do{if((F|0)==385){D=+h[8083];x=+h[8084];y=+h[f>>3];if(Dx){break}else{q=1}return q|0}else{if(yD){break}else{q=1}return q|0}}}while(0);q=0;return q|0}}if(!c){if(!a){D=k-g;y=(t-g)/D;x=(u-g)/D;c=y>x;E=c?y:x;z=c?x:y;y=l-i;x=(v-i)/y;A=(w-i)/y;c=x>A;B=c?x:A;C=c?A:x;x=m-j;A=(s-j)/x;G=(r-j)/x;c=A>G;H=c?A:G;I=c?G:A;A=z>C?z:C;c=I>0.0;n=A>(c?I:0.0);C=n|c^1?n?A:0.0:I;I=EB){q=0;return q|0}h[d>>3]=g+D*C;h[e>>3]=i+y*C;h[f>>3]=j+x*C;h[d+8>>3]=g+D*B;h[e+8>>3]=i+y*B;h[f+8>>3]=j+x*B;B=+h[8255];x=+h[8256];y=+h[d>>3];if(Bx)){F=428}}else{if(!(yB)){F=428}}do{if((F|0)==428){B=+h[8169];y=+h[8170];x=+h[e>>3];if(By){break}}else{if(xB){break}}B=+h[8083];x=+h[8084];y=+h[f>>3];if(Bx){break}else{q=1}return q|0}else{if(yB){break}else{q=1}return q|0}}}while(0);q=0;return q|0}do{if(sr){q=0}else{break}return q|0}else{if(ms){q=0}else{break}return q|0}}while(0);B=k-g;y=(t-g)/B;x=(u-g)/B;c=y>x;D=c?y:x;C=c?x:y;y=l-i;x=(v-i)/y;H=(w-i)/y;c=x>H;I=c?x:H;E=c?H:x;x=C>E?C:E;E=x>0.0?x:0.0;x=DI){q=0;return q|0}h[d>>3]=g+B*E;h[e>>3]=i+y*E;h[f>>3]=j;h[d+8>>3]=g+B*I;h[e+8>>3]=i+y*I;h[f+8>>3]=j;I=+h[8255];y=+h[8256];B=+h[d>>3];if(Iy)){F=420}}else{if(!(BI)){F=420}}do{if((F|0)==420){I=+h[8169];B=+h[8170];y=+h[e>>3];if(IB){break}else{q=1}return q|0}else{if(yI){break}else{q=1}return q|0}}}while(0);q=0;return q|0}c=vw){q=0}else{break}return q|0}else{if(iv){q=0}else{break}return q|0}}while(0);do{if(sr){q=0}else{break}return q|0}else{if(js){q=0}else{break}return q|0}}while(0);do{if(p){if(tk){q=0}else{break}return q|0}else{if(tg){q=0}else{break}return q|0}}while(0);h[d>>3]=t;h[e>>3]=i;h[f>>3]=j;h[d+8>>3]=+h[8256];h[e+8>>3]=i;h[f+8>>3]=j;q=1;return q|0}else{do{if(c){if(lw){q=0}else{break}return q|0}else{if(lv){q=0}else{break}return q|0}}while(0);v=k-g;k=(t-g)/v;t=(u-g)/v;c=k>t;u=c?k:t;l=c?t:k;k=m-j;m=(s-j)/k;s=(r-j)/k;c=m>s;r=c?m:s;t=c?s:m;m=l>t?l:t;t=m>0.0?m:0.0;m=ur){q=0;return q|0}h[d>>3]=g+v*t;h[e>>3]=i;h[f>>3]=j+k*t;h[d+8>>3]=g+v*r;h[e+8>>3]=i;h[f+8>>3]=j+k*r;r=+h[8255];k=+h[8256];j=+h[d>>3];if(rk)){F=408}}else{if(!(jr)){F=408}}do{if((F|0)==408){r=+h[8083];j=+h[8084];k=+h[f>>3];if(rj){break}else{q=1}return q|0}else{if(kr){break}else{q=1}return q|0}}}while(0);q=0;return q|0}return 0}function un(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0.0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0,D=0.0,E=0.0;g=i;i=i+64|0;j=f;f=i;i=i+16|0;c[f>>2]=c[j>>2];c[f+4>>2]=c[j+4>>2];c[f+8>>2]=c[j+8>>2];c[f+12>>2]=c[j+12>>2];j=g|0;k=g+16|0;l=g+24|0;m=g+32|0;n=g+40|0;o=g+48|0;p=c[e>>2]|0;q=c[e+4>>2]|0;r=e+8|0;s=e+16|0;t=+h[s>>3];u=+h[e+24>>3];v=e+32|0;w=a[v]|0;if((d|0)==0){x=~~(+h[b>>3]*+(c[180]|0))+(c[186]|0)|0;y=~~(+h[b+8>>3]*+(c[40]|0))+(c[46]|0)|0;h[e+48>>3]=+h[b+32>>3];z=j;A=e+40|0;c[z>>2]=c[A>>2];c[z+4>>2]=c[A+4>>2];c[z+8>>2]=c[A+8>>2];c[z+12>>2]=c[A+12>>2];do{if((p|0)!=0){A=c[(c[3524]|0)+92>>2]|0;if(u<0.0){cK[A&63](+h[3817]);break}else{cK[A&63](u);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[s>>3]);s=c[(c[3524]|0)+64>>2]|0;if((q|0)<-5){cM[s&511](-2)}else{cM[s&511](q)}s=c[3524]|0;do{if((a[v]&1)==0){if((c[s+96>>2]&1024|0)!=0){break}c[j>>2]=1;c[j+4>>2]=q;B=516}else{B=516}}while(0);if((B|0)==516){fn(j,s)}s=c[13542]|0;do{if((s|0)!=0){j=(c[s>>2]|0)>(x|0)&1;v=(c[s+4>>2]|0)<(x|0)?j|2:j;j=(c[s+8>>2]|0)>(y|0)?v|4:v;if((((c[s+12>>2]|0)<(y|0)?j|8:j)|0)==0){break}i=g;return}}while(0);cR[c[(c[3524]|0)+80>>2]&127](x,y,c[r>>2]|0);i=g;return}C=+(c[180]|0);y=c[186]|0;x=~~(+h[b>>3]*C)+y|0;D=+(c[40]|0);s=c[46]|0;j=~~(+h[b+8>>3]*D)+s|0;v=~~(C*+h[d>>3])+y|0;y=~~(D*+h[d+8>>3])+s|0;s=c[f>>2]|0;A=c[f+4>>2]|0;if((s|0)==6){E=(+h[b+32>>3]+ +h[d+32>>3])*.5}else{E=+h[f+8>>3]}f=o|0;c[f>>2]=s;s=o+4|0;c[s>>2]=A;h[o+8>>3]=E;do{if((p|0)!=0){A=c[(c[3524]|0)+92>>2]|0;if(u<0.0){cK[A&63](+h[3817]);break}else{cK[A&63](u);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](t);p=c[(c[3524]|0)+64>>2]|0;if((q|0)<-5){cM[p&511](-2)}else{cM[p&511](q)}p=c[3524]|0;do{if((w&1)==0){if((c[p+96>>2]&1024|0)!=0){break}c[f>>2]=1;c[s>>2]=q;B=532}else{B=532}}while(0);if((B|0)==532){fn(o,p)}p=c[r>>2]|0;if((p|0)==(-10|0)){fm(x,j,v,y,1);i=g;return}else if((p|0)==(-11|0)){fm(x,j,v,y,2);i=g;return}else{c[k>>2]=x;c[l>>2]=j;c[m>>2]=v;c[n>>2]=y;y=c[3524]|0;if((fl(k,l,m,n)|0)==0){i=g;return}cN[c[y+56>>2]&255](c[k>>2]|0,c[l>>2]|0);cN[c[y+60>>2]&255](c[m>>2]|0,c[n>>2]|0);i=g;return}}function uo(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0.0,m=0;e=i;i=i+16|0;f=e|0;do{if((a[38984]&1)!=0){if((a[46752]&1)==0){break}gt(b,0,d);i=e;return}}while(0);g=~~(+h[b>>3]*+(c[180]|0))+(c[186]|0)|0;j=~~(+h[b+8>>3]*+(c[40]|0))+(c[46]|0)|0;h[d+48>>3]=+h[b+32>>3];b=f;k=d+40|0;c[b>>2]=c[k>>2];c[b+4>>2]=c[k+4>>2];c[b+8>>2]=c[k+8>>2];c[b+12>>2]=c[k+12>>2];k=c[d+4>>2]|0;do{if((c[d>>2]|0)!=0){l=+h[d+24>>3];b=c[(c[3524]|0)+92>>2]|0;if(l<0.0){cK[b&63](+h[3817]);break}else{cK[b&63](l);break}}}while(0);cK[c[(c[3524]|0)+112>>2]&63](+h[d+16>>3]);b=c[(c[3524]|0)+64>>2]|0;if((k|0)<-5){cM[b&511](-2)}else{cM[b&511](k)}b=c[3524]|0;do{if((a[d+32|0]&1)==0){if((c[b+96>>2]&1024|0)!=0){break}c[f>>2]=1;c[f+4>>2]=k;m=558}else{m=558}}while(0);if((m|0)==558){fn(f,b)}b=c[13542]|0;do{if((b|0)!=0){f=(c[b>>2]|0)>(g|0)&1;m=(c[b+4>>2]|0)<(g|0)?f|2:f;f=(c[b+8>>2]|0)>(j|0)?m|4:m;if((((c[b+12>>2]|0)<(j|0)?f|8:f)|0)==0){break}i=e;return}}while(0);cR[c[(c[3524]|0)+80>>2]&127](g,j,c[d+8>>2]|0);i=e;return}function up(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0,p=0,q=0;e=i;i=i+32|0;f=e|0;g=e+8|0;j=e+16|0;k=e+24|0;do{if((a[38984]&1)!=0){if((a[46752]&1)==0){break}gt(30448,b,d);l=b;c[7612]=c[l>>2];c[7613]=c[l+4>>2];c[7614]=c[l+8>>2];c[7615]=c[l+12>>2];c[7616]=c[l+16>>2];c[7617]=c[l+20>>2];c[7618]=c[l+24>>2];c[7619]=c[l+28>>2];c[7620]=c[l+32>>2];c[7621]=c[l+36>>2];c[7622]=c[l+40>>2];c[7623]=c[l+44>>2];i=e;return}}while(0);if((a[d+32|0]&1)!=0){un(30448,b,d,d+40|0);d=b;c[7612]=c[d>>2];c[7613]=c[d+4>>2];c[7614]=c[d+8>>2];c[7615]=c[d+12>>2];c[7616]=c[d+16>>2];c[7617]=c[d+20>>2];c[7618]=c[d+24>>2];c[7619]=c[d+28>>2];c[7620]=c[d+32>>2];c[7621]=c[d+36>>2];c[7622]=c[d+40>>2];c[7623]=c[d+44>>2];i=e;return}m=+(c[180]|0);d=c[186]|0;n=+(c[40]|0);l=c[46]|0;o=~~(+h[3807]*n)+l|0;p=~~(m*+h[b>>3])+d|0;q=~~(n*+h[b+8>>3])+l|0;c[f>>2]=~~(+h[3806]*m)+d;c[g>>2]=o;c[j>>2]=p;c[k>>2]=q;q=c[3524]|0;if((fl(f,g,j,k)|0)!=0){cN[c[q+56>>2]&255](c[f>>2]|0,c[g>>2]|0);cN[c[q+60>>2]&255](c[j>>2]|0,c[k>>2]|0)}k=b;c[7612]=c[k>>2];c[7613]=c[k+4>>2];c[7614]=c[k+8>>2];c[7615]=c[k+12>>2];c[7616]=c[k+16>>2];c[7617]=c[k+20>>2];c[7618]=c[k+24>>2];c[7619]=c[k+28>>2];c[7620]=c[k+32>>2];c[7621]=c[k+36>>2];c[7622]=c[k+40>>2];c[7623]=c[k+44>>2];i=e;return}function uq(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0;e=i;do{if((b|0)==32){uu(c[8776]|0);c[8780]=0;c[8774]=0;c[8776]=0;c[8778]=0;f=582}else if((b|0)==1){if((c[8776]|0)==0){f=582;break}uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=198504,v)|0);return 0}else if((b|0)==4){if((d|0)==0){break}if((a[d]|0)==0){break}g=c[8782]|0;h=(c[8780]|0)-g|0;j=uA(d|0)|0;k=c[8776]|0;l=h+1|0;if((k|0)!=0&(g|0)!=0){uH(k|0,g|0,l|0);n=c[8776]|0}else{n=k}k=j+1|0;g=db(n,k+l|0,131160)|0;c[8776]=g;uH(g+k|0,g|0,l|0);uB(c[8776]|0,d|0);a[(c[8776]|0)+j|0]=58;j=c[8776]|0;c[8782]=j+k;c[8780]=j+(k+h|0);h=a8(j|0,58)|0;if((h|0)==0){break}else{o=h}do{a[o]=0;o=a8(o+1|0,58)|0;}while((o|0)!=0)}else if((b|0)==2){h=c[m>>2]|0;do{if((c[8776]|0)==0){aI(90464,19,1,h|0)}else{aI(116392,13,1,h|0);j=c[8776]|0;k=c[m>>2]|0;if(j>>>0<(c[8782]|0)>>>0){l=j;j=k;while(1){cf(j|0,103640,(v=i,i=i+8|0,c[v>>2]=l,v)|0);g=l+((uA(l|0)|0)+1|0)|0;p=c[m>>2]|0;if(g>>>0<(c[8782]|0)>>>0){l=g;j=p}else{q=p;break}}}else{q=k}aF(10,q|0);if((c[8782]|0)==0){break}j=c[m>>2]|0;aI(96440,30,1,j|0);j=c[8782]|0;l=c[m>>2]|0;if(j>>>0<(c[8780]|0)>>>0){p=j;j=l;while(1){cf(j|0,103640,(v=i,i=i+8|0,c[v>>2]=p,v)|0);g=p+((uA(p|0)|0)+1|0)|0;r=c[m>>2]|0;if(g>>>0<(c[8780]|0)>>>0){p=g;j=r}else{s=r;break}}}else{s=l}aF(10,s|0)}}while(0);cf(c[m>>2]|0,81808,(v=i,i=i+8|0,c[v>>2]=74944,v)|0)}else if((b|0)==16){c[8778]=c[8782];f=603}else if((b|0)==8){f=603}}while(0);if((f|0)==582){b=bU(148328)|0;do{if((b|0)==0){t=0}else{s=uA(b|0)|0;q=bP(b|0)|0;c[8776]=q;c[8780]=q+s;s=a8(q|0,58)|0;if((s|0)==0){t=q;break}else{u=s}do{a[u]=0;u=a8(u+1|0,58)|0;}while((u|0)!=0);t=c[8776]|0}}while(0);c[8782]=t}else if((f|0)==603){f=c[8776]|0;if((f|0)==0){w=0;i=e;return w|0}t=c[8774]|0;do{if((t|0)==0){c[8774]=f;u=c[8778]|0;if((u|0)!=0){x=f;y=u;break}u=c[8780]|0;c[8778]=u;x=f;y=u}else{u=t+((uA(t|0)|0)+1|0)|0;c[8774]=u;x=u;y=c[8778]|0}}while(0);if(x>>>0>>0){w=x;i=e;return w|0}c[8774]=0;c[8778]=0;w=0;i=e;return w|0}w=c[8776]|0;i=e;return w|0}function ur(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;e=i;i=i+256|0;f=e|0;if(!(a[42184]|0)){a[42184]=1;ur(1,0)}do{if((b|0)==32){uu(c[10554]|0);c[10552]=0;c[10548]=0;c[10554]=0;c[10550]=0;g=622}else if((b|0)==1){if((c[10554]|0)==0){g=622;break}uf(-1,113648,(v=i,i=i+8|0,c[v>>2]=222176,v)|0);return 0}else if((b|0)==4){if((d|0)==0){break}if((a[d]|0)==0){break}h=c[10556]|0;j=(c[10552]|0)-h|0;k=uA(d|0)|0;l=c[10554]|0;n=j+1|0;if((l|0)!=0&(h|0)!=0){uH(l|0,h|0,n|0);o=c[10554]|0}else{o=l}l=k+1|0;h=db(o,l+n|0,199664)|0;c[10554]=h;uH(h+l|0,h|0,n|0);uB(c[10554]|0,d|0);a[(c[10554]|0)+k|0]=58;k=c[10554]|0;c[10556]=k+l;c[10552]=k+(l+j|0);j=a8(k|0,58)|0;if((j|0)==0){break}else{p=j}do{a[p]=0;p=a8(p+1|0,58)|0;}while((p|0)!=0)}else if((b|0)==2){j=c[m>>2]|0;if((c[10554]|0)==0){aI(174752,19,1,j|0);break}aI(184128,13,1,j|0);j=c[10554]|0;k=c[m>>2]|0;if(j>>>0<(c[10556]|0)>>>0){l=j;j=k;while(1){cf(j|0,103640,(v=i,i=i+8|0,c[v>>2]=l,v)|0);n=l+((uA(l|0)|0)+1|0)|0;h=c[m>>2]|0;if(n>>>0<(c[10556]|0)>>>0){l=n;j=h}else{q=h;break}}}else{q=k}aF(10,q|0);if((c[10556]|0)==0){break}aI(178936,20,1,c[m>>2]|0);j=c[10556]|0;l=c[m>>2]|0;if(j>>>0<(c[10552]|0)>>>0){h=j;j=l;while(1){cf(j|0,103640,(v=i,i=i+8|0,c[v>>2]=h,v)|0);n=h+((uA(h|0)|0)+1|0)|0;r=c[m>>2]|0;if(n>>>0<(c[10552]|0)>>>0){h=n;j=r}else{s=r;break}}}else{s=l}aF(10,s|0)}else if((b|0)==16){c[10550]=c[10556];g=683}else if((b|0)==8){g=683}}while(0);if((g|0)==683){b=c[10554]|0;if((b|0)==0){t=0;i=e;return t|0}s=c[10548]|0;do{if((s|0)==0){c[10548]=b;q=c[10550]|0;if((q|0)!=0){u=b;w=q;break}q=c[10552]|0;c[10550]=q;u=b;w=q}else{q=s+((uA(s|0)|0)+1|0)|0;c[10548]=q;u=q;w=c[10550]|0}}while(0);if(u>>>0>>0){t=u;i=e;return t|0}c[10548]=0;c[10550]=0;t=0;i=e;return t|0}if((g|0)==622){u=bU(215376)|0;do{if((u|0)==0){w=f|0;s=42160;b=137720;L863:while(1){q=bP(b|0)|0;while(1){p=aQ(q|0,209688)|0;if((p|0)!=0){d=p+2|0;o=a8(d|0,41)|0;a[o]=0;j=bU(d|0)|0;a[o]=41;d=(j|0)!=0;if(d){x=uA(j|0)|0}else{x=0}h=((p+((uA(q|0)|0)+x|0)|0)-o|0)+1|0;k=ut(h)|0;if((k|0)==0){gk();r=ut(h)|0;if((r|0)==0){g=633;break L863}else{y=r}}else{y=k}k=p-q|0;uF(y|0,q|0,k|0);if(d){d=y+k|0;uB(d|0,j|0)}j=y+(x+k|0)|0;k=o+1|0;uB(j|0,k|0);uu(q);q=y;continue}k=aQ(q|0,204200)|0;if((k|0)==0){break}j=k+2|0;o=a8(j|0,96)|0;a[o]=0;if(!(a[14168]|0)){g=638;break L863}d=bt(j|0,193632)|0;if((d|0)!=0){a6(w|0,255,d|0);j=f+((uA(w|0)|0)-1|0)|0;if((a[j]|0)==10){a[j]=0}a2(d|0)}a[o]=96;d=uA(w|0)|0;j=((k+((uA(q|0)|0)+d|0)|0)-o|0)+1|0;p=ut(j)|0;if((p|0)==0){gk();r=ut(j)|0;if((r|0)==0){g=645;break L863}else{z=r}}else{z=p}p=k-q|0;uF(z|0,q|0,p|0);if((a[w]|0)!=0){k=z+p|0;uB(k|0,w|0)}uB(z+(d+p|0)|0,o+1|0);uu(q);q=z}o=q+((uA(q|0)|0)-1|0)|0;if((a[o]|0)==33){a[o]=0;A=1}else{A=0}o=aW(q|0)|0;if((o|0)!=0){bR(o|0);if(A){a[q+(uA(q|0)|0)|0]=33}o=uA(q|0)|0;p=c[10554]|0;if((p|0)==0){d=o+1|0;k=ut(d)|0;if((k|0)==0){gk();r=ut(d)|0;if((r|0)==0){g=658;break}else{B=r}}else{B=k}c[10554]=B;c[10552]=B;C=B}else{k=uA(p|0)|0;r=db(p,(o+2|0)+k|0,199664)|0;c[10554]=r;p=r+k|0;c[10552]=p;a[p]=58;p=(c[10552]|0)+1|0;c[10552]=p;a[p]=0;C=c[10552]|0}uB(C|0,q|0);c[10552]=(c[10552]|0)+o}o=s+4|0;if((q|0)!=0){uu(q)}p=c[o>>2]|0;if((p|0)==0){g=664;break}else{s=o;b=p}}if((g|0)==633){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=199664,v)|0);return 0}else if((g|0)==638){uf(-1,145320,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}else if((g|0)==645){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=199664,v)|0);return 0}else if((g|0)==658){uf(-1,225296,(v=i,i=i+8|0,c[v>>2]=199664,v)|0);return 0}else if((g|0)==664){b=c[10554]|0;if((b|0)==0){break}s=a8(b|0,58)|0;if((s|0)==0){break}else{D=s}do{a[D]=0;D=a8(D+1|0,58)|0;}while((D|0)!=0)}}else{s=uA(u|0)|0;b=bP(u|0)|0;c[10554]=b;c[10552]=b+s;s=a8(b|0,58)|0;if((s|0)==0){break}else{E=s}do{a[E]=0;E=a8(E+1|0,58)|0;}while((E|0)!=0)}}while(0);c[10556]=c[10554]}t=c[10554]|0;i=e;return t|0}function us(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;i=i+48|0;e=d|0;if((a|0)==32|(a|0)==1){uu(c[12908]|0);bA(5,179864);bA(2,179864);f=bA(5,0)|0;if((f|0)==0){g=0}else{g=bP(f|0)|0}c[12908]=g;h=c[12908]|0;i=d;return h|0}else if((a|0)==4){if((bA(5,b|0)|0)==0){uf(c[13898]|0,166696,(v=i,i=i+1|0,i=i+7>>3<<3,c[v>>2]=0,v)|0);return 0}uu(c[12908]|0);b=bA(5,0)|0;if((b|0)==0){j=0}else{j=bP(b|0)|0}c[12908]=j;j=e+24|0;uE(e|0,0,44);bw(40936,32,161480,e|0);bw(72464,8,153384,e|0);c[j>>2]=1;bw(40968,32,161480,e|0);bw(72472,8,153384,e|0);c[j>>2]=2;bw(41e3,32,161480,e|0);bw(72480,8,153384,e|0);c[j>>2]=3;bw(41032,32,161480,e|0);bw(72488,8,153384,e|0);c[j>>2]=4;bw(41064,32,161480,e|0);bw(72496,8,153384,e|0);c[j>>2]=5;bw(41096,32,161480,e|0);bw(72504,8,153384,e|0);c[j>>2]=6;bw(41128,32,161480,e|0);bw(72512,8,153384,e|0);j=e+16|0;b=0;do{c[j>>2]=b;bw(40552+(b<<5)|0,32,150680,e|0);bw(72368+(b<<3)|0,8,148784,e|0);b=b+1|0;}while((b|0)<12);h=c[12908]|0;i=d;return h|0}else if((a|0)==2){a=c[m>>2]|0;b=bA(2,0)|0;cf(a|0,146672,(v=i,i=i+8|0,c[v>>2]=b,v)|0);cf(c[m>>2]|0,144576,(v=i,i=i+8|0,c[v>>2]=c[44936+(c[11252]<<2)>>2],v)|0);b=c[m>>2]|0;a=bA(5,0)|0;cf(b|0,142976,(v=i,i=i+8|0,c[v>>2]=a,v)|0);a=c[8270]|0;cf(c[m>>2]|0,141432,(v=i,i=i+8|0,c[v>>2]=(a|0)!=0?a:139696,v)|0);h=c[12908]|0;i=d;return h|0}else{h=c[12908]|0;i=d;return h|0}return 0} -function ut(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ab=0,ac=0,ad=0,ae=0,af=0,ag=0,ah=0,ai=0,aj=0,ak=0,al=0,am=0,an=0,ao=0,ap=0,aq=0,ar=0,as=0,at=0,au=0,av=0,aw=0,ax=0,ay=0,az=0,aA=0,aB=0,aC=0,aD=0,aE=0,aF=0,aG=0;do{if(a>>>0<245){if(a>>>0<11){b=16}else{b=a+11&-8}d=b>>>3;e=c[56330]|0;f=e>>>(d>>>0);if((f&3|0)!=0){g=(f&1^1)+d|0;h=g<<1;i=225360+(h<<2)|0;j=225360+(h+2<<2)|0;h=c[j>>2]|0;k=h+8|0;l=c[k>>2]|0;do{if((i|0)==(l|0)){c[56330]=e&(1<>>0<(c[56334]|0)>>>0){ce();return 0;return 0}m=l+12|0;if((c[m>>2]|0)==(h|0)){c[m>>2]=i;c[j>>2]=l;break}else{ce();return 0;return 0}}}while(0);l=g<<3;c[h+4>>2]=l|3;j=h+(l|4)|0;c[j>>2]=c[j>>2]|1;n=k;return n|0}if(b>>>0<=(c[56332]|0)>>>0){o=b;break}if((f|0)!=0){j=2<>>12&16;i=j>>>(l>>>0);j=i>>>5&8;m=i>>>(j>>>0);i=m>>>2&4;p=m>>>(i>>>0);m=p>>>1&2;q=p>>>(m>>>0);p=q>>>1&1;r=(j|l|i|m|p)+(q>>>(p>>>0))|0;p=r<<1;q=225360+(p<<2)|0;m=225360+(p+2<<2)|0;p=c[m>>2]|0;i=p+8|0;l=c[i>>2]|0;do{if((q|0)==(l|0)){c[56330]=e&(1<>>0<(c[56334]|0)>>>0){ce();return 0;return 0}j=l+12|0;if((c[j>>2]|0)==(p|0)){c[j>>2]=q;c[m>>2]=l;break}else{ce();return 0;return 0}}}while(0);l=r<<3;m=l-b|0;c[p+4>>2]=b|3;q=p;e=q+b|0;c[q+(b|4)>>2]=m|1;c[q+l>>2]=m;l=c[56332]|0;if((l|0)!=0){q=c[56335]|0;d=l>>>3;l=d<<1;f=225360+(l<<2)|0;k=c[56330]|0;h=1<>2]|0;if(g>>>0>=(c[56334]|0)>>>0){s=g;t=d;break}ce();return 0;return 0}}while(0);c[t>>2]=q;c[s+12>>2]=q;c[q+8>>2]=s;c[q+12>>2]=f}c[56332]=m;c[56335]=e;n=i;return n|0}l=c[56331]|0;if((l|0)==0){o=b;break}h=(l&-l)-1|0;l=h>>>12&16;k=h>>>(l>>>0);h=k>>>5&8;p=k>>>(h>>>0);k=p>>>2&4;r=p>>>(k>>>0);p=r>>>1&2;d=r>>>(p>>>0);r=d>>>1&1;g=c[225624+((h|l|k|p|r)+(d>>>(r>>>0))<<2)>>2]|0;r=g;d=g;p=(c[g+4>>2]&-8)-b|0;while(1){g=c[r+16>>2]|0;if((g|0)==0){k=c[r+20>>2]|0;if((k|0)==0){break}else{u=k}}else{u=g}g=(c[u+4>>2]&-8)-b|0;k=g>>>0

- - - - -
- - - - - - - - -
- - - - - - - - - - - - - - -
- -
- - -
-

- - Instructions - -

-
-
    -
  1. - Run V8 with - --prof --log-timer-events, - or alternatively,
    - Chrome with - - --no-sandbox --js-flags="--prof --log-timer-events" - to produce v8.log. -
  2. -
  3. - Open - v8.log - on this page. Don't worry, it won't be uploaded anywhere. -
  4. -
  5. - Click "Start" to start number crunching. This will take a while. -
  6. -
  7. - Click "Show plot/profile" to switch between the statistical profile and - the timeline plot.
    - C++ items are missing in the statistical profile because symbol - information is not available.
    - Consider using the - - command-line utility - instead. -
  8. -
- If you expect multiple V8 instances to run concurrently, for example - with several tabs in Chrome,
- add the V8 flag --logfile=v8.%p.log - so that each instance writes to its own log file. -
-
- -
-

- - Credits - -

-
- -
-
- -
- - diff --git a/deps/v8/tools/profviz/profviz.js b/deps/v8/tools/profviz/profviz.js deleted file mode 100644 index a7593a6f65f31f..00000000000000 --- a/deps/v8/tools/profviz/profviz.js +++ /dev/null @@ -1,286 +0,0 @@ -// Copyright 2013 the V8 project authors. 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. - -var worker_scripts = [ - "../csvparser.js", - "../splaytree.js", - "../codemap.js", - "../consarray.js", - "../profile.js", - "../profile_view.js", - "../logreader.js", - "../arguments.js", - "../tickprocessor.js", - "composer.js", - "gnuplot-4.6.3-emscripten.js" -]; - - -function plotWorker() { - var worker = null; - - function initialize() { - ui.freeze(); - worker = new Worker("worker.js"); - running = false; - - worker.postMessage({ "call" : "load scripts", - "args" : worker_scripts }); - - worker.addEventListener("message", function(event) { - var call = delegateList[event.data["call"]]; - call(event.data["args"]); - }); - } - - function scriptLoaded() { - ui.thaw(); - } - - // Public methods. - this.run = function(filename, - resx, resy, - distortion, - range_start, range_end) { - var args = { - 'file' : filename, - 'resx' : resx, - 'resy' : resy, - 'distortion' : distortion, - 'range_start' : range_start, - 'range_end' : range_end - } - worker.postMessage({ 'call' : 'run', 'args' : args }); - } - - this.reset = function() { - if (worker) worker.terminate(); - initialize(); - } - - var delegateList = { - "log" : log, - "error" : logError, - "displayplot" : displayplot, - "displayprof" : displayprof, - "range" : setRange, - "script" : scriptLoaded, - "reset" : this.reset - } -} - - -function UIWrapper() { - var input_elements = ["range_start", - "range_end", - "distortion", - "start", - "file"]; - - var other_elements = ["log", - "plot", - "prof", - "instructions", - "credits", - "toggledisplay"]; - - for (var i in input_elements) { - var id = input_elements[i]; - this[id] = document.getElementById(id); - } - - for (var i in other_elements) { - var id = other_elements[i]; - this[id] = document.getElementById(id); - } - - this.freeze = function() { - this.plot.style.webkitFilter = "grayscale(1)"; - this.prof.style.color = "#bbb"; - for (var i in input_elements) { - this[input_elements[i]].disabled = true; - } - } - - this.thaw = function() { - this.plot.style.webkitFilter = ""; - this.prof.style.color = "#000"; - for (var i in input_elements) { - this[input_elements[i]].disabled = false; - } - } - - this.reset = function() { - this.thaw(); - this.log.value = ""; - this.range_start.value = "automatic"; - this.range_end.value = "automatic"; - this.toggle("plot"); - this.plot.src = ""; - this.prof.value = ""; - } - - this.toggle = function(mode) { - if (mode) this.toggledisplay.next_mode = mode; - if (this.toggledisplay.next_mode == "plot") { - this.toggledisplay.next_mode = "prof"; - this.plot.style.display = "block"; - this.prof.style.display = "none"; - this.toggledisplay.innerHTML = "Show profile"; - } else { - this.toggledisplay.next_mode = "plot"; - this.plot.style.display = "none"; - this.prof.style.display = "block"; - this.toggledisplay.innerHTML = "Show plot"; - } - } - - this.info = function(field) { - var down_arrow = "\u25bc"; - var right_arrow = "\u25b6"; - if (field && this[field].style.display != "none") field = null; // Toggle. - this.credits.style.display = "none"; - this.instructions.style.display = "none"; - if (!field) return; - this[field].style.display = "block"; - } -} - - -function log(text) { - ui.log.value += text; - ui.log.scrollTop = ui.log.scrollHeight; -} - - -function logError(text) { - if (ui.log.value.length > 0 && - ui.log.value[ui.log.value.length-1] != "\n") { - ui.log.value += "\n"; - } - ui.log.value += "ERROR: " + text + "\n"; - ui.log.scrollTop = ui.log.scrollHeight; - error_logged = true; -} - - -function displayplot(args) { - if (error_logged) { - log("Plot failed.\n\n"); - } else { - log("Displaying plot. Total time: " + - (Date.now() - timer) / 1000 + "ms.\n\n"); - var blob = new Blob([new Uint8Array(args.contents).buffer], - { "type" : "image\/svg+xml" }); - window.URL = window.URL || window.webkitURL; - ui.plot.src = window.URL.createObjectURL(blob); - } - - ui.thaw(); - ui.toggle("plot"); -} - - -function displayprof(args) { - if (error_logged) return; - ui.prof.value = args; - this.prof.style.color = ""; - ui.toggle("prof"); -} - - -function start(event) { - error_logged = false; - ui.freeze(); - - try { - var file = getSelectedFile(); - var distortion = getDistortion(); - var range = getRange(); - } catch (e) { - logError(e.message); - display(); - return; - } - - timer = Date.now(); - worker.run(file, kResX, kResY, distortion, range[0], range[1]); -} - - -function getSelectedFile() { - var file = ui.file.files[0]; - if (!file) throw Error("No valid file selected."); - return file; -} - - -function getDistortion() { - var input_distortion = - parseInt(ui.distortion.value, 10); - if (isNaN(input_distortion)) { - input_distortion = ui.distortion.value = 4500; - } - return input_distortion / 1000000; -} - - -function getRange() { - var input_start = - parseInt(ui.range_start.value, 10); - if (isNaN(input_start)) input_start = undefined; - var input_end = - parseInt(ui.range_end.value, 10); - if (isNaN(input_end)) input_end = undefined; - return [input_start, input_end]; -} - - -function setRange(args) { - ui.range_start.value = args.start.toFixed(1); - ui.range_end.value = args.end.toFixed(1); -} - - -function onload() { - kResX = 1200; - kResY = 600; - error_logged = false; - ui = new UIWrapper(); - ui.reset(); - ui.info(null); - worker = new plotWorker(); - worker.reset(); -} - - -var kResX; -var kResY; -var error_logged; -var ui; -var worker; -var timer; diff --git a/deps/v8/tools/profviz/stdio.js b/deps/v8/tools/profviz/stdio.js deleted file mode 100644 index 8ba12e3ce758a0..00000000000000 --- a/deps/v8/tools/profviz/stdio.js +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2013 the V8 project authors. 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. - -var processor = new ArgumentsProcessor(arguments); -var distortion_per_entry = 0; -var range_start_override = undefined; -var range_end_override = undefined; - -if (!processor.parse()) processor.printUsageAndExit(); -var result = processor.result(); -var distortion = parseInt(result.distortion); -if (isNaN(distortion)) processor.printUsageAndExit(); -// Convert picoseconds to milliseconds. -distortion_per_entry = distortion / 1000000; -var rangelimits = result.range.split(","); -var range_start = parseInt(rangelimits[0]); -var range_end = parseInt(rangelimits[1]); -if (!isNaN(range_start)) range_start_override = range_start; -if (!isNaN(range_end)) range_end_override = range_end; - -var kResX = 1600; -var kResY = 600; -function log_error(text) { - print(text); - quit(1); -} -var psc = new PlotScriptComposer(kResX, kResY, log_error); -psc.collectData(readline, distortion_per_entry); -psc.findPlotRange(range_start_override, range_end_override); -print("set terminal pngcairo size " + kResX + "," + kResY + - " enhanced font 'Helvetica,10'"); -psc.assembleOutput(print); diff --git a/deps/v8/tools/profviz/worker.js b/deps/v8/tools/profviz/worker.js deleted file mode 100644 index 95ed40b89bab3b..00000000000000 --- a/deps/v8/tools/profviz/worker.js +++ /dev/null @@ -1,171 +0,0 @@ -// Copyright 2013 the V8 project authors. 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. - -var delegateList = { - "load scripts" : load_scripts, - "run" : run, -} - -self.addEventListener("message", function(event) { - var call = delegateList[event.data["call"]]; - var result = call(event.data["args"]); -}, false); - - -function log(text) { - self.postMessage({ "call" : "log", "args" : text }); -} - - -function displayplot(content) { - self.postMessage({ "call" : "displayplot", "args" : content}); -} - - -function displayprof(content) { - self.postMessage({ "call" : "displayprof", "args" : content}); -} - - -function setRange(start, end) { - self.postMessage({ "call" : "range", - "args" : { "start" : start, "end" : end } }); -} - - -function time(name, fun) { - log(name + "..."); - var start = Date.now(); - fun(); - log(" took " + (Date.now() - start) / 1000 + "s.\n"); -} - - -function load_scripts(scripts) { - time("Loading scripts", - function() { for (var i in scripts) importScripts(scripts[i]); }); - self.postMessage({ "call" : "script" }); -} - - -function log_error(text) { - self.postMessage({"call": "error", "args": text}); - self.postMessage({"call": "reset"}); -} - - -function run(args) { - var file = args["file"]; - var resx = args["resx"]; - var resy = args["resy"]; - var distortion = args["distortion"]; - var range_start_override = args["range_start"]; - var range_end_override = args["range_end"]; - - var reader = new FileReaderSync(); - var content_lines; - - time("Reading log file (" + (file.size / 1024).toFixed(1) + " kB)", - function() { - var content = reader.readAsText(file); - content_lines = content.split("\n"); - }); - - time("Producing statistical profile", - function() { - var profile = ""; - print = function(text) { profile += text + "\n"; }; - // Dummy entries provider, as we cannot call nm. - var entriesProvider = new UnixCppEntriesProvider("", "", ""); - var targetRootFS = ""; - var separateIc = false; - var callGraphSize = 5; - var ignoreUnknown = true; - var stateFilter = null; - var range = range_start_override + "," + range_end_override; - - var tickProcessor = new TickProcessor(entriesProvider, - separateIc, - callGraphSize, - ignoreUnknown, - stateFilter, - distortion, - range); - for (var i = 0; i < content_lines.length; i++) { - tickProcessor.processLogLine(content_lines[i]); - } - tickProcessor.printStatistics(); - displayprof(profile); - }); - - var input_file_name = "input_temp"; - var output_file_name = "output.svg"; - - var psc = new PlotScriptComposer(resx, resy, log_error); - var objects = 0; - - time("Collecting events (" + content_lines.length + " entries)", - function() { - var line_cursor = 0; - var input = function() { return content_lines[line_cursor++]; }; - psc.collectData(input, distortion); - psc.findPlotRange(range_start_override, - range_end_override, - setRange); - }); - - time("Assembling plot script", - function() { - var plot_script = ""; - var output = function(text) { plot_script += text + "\n"; }; - output("set terminal svg size " + resx + "," + resy + - " enhanced font \"Helvetica,10\""); - output("set output \""+ output_file_name + "\""); - objects = psc.assembleOutput(output); - if (FS.findObject(input_file_name)) { - FS.deleteFile(input_file_name); - } - var arrc = Module["intArrayFromString"](plot_script, true); - FS.createDataFile("/", input_file_name, arrc); - }); - - time("Running gnuplot (" + objects + " objects)", - function() { Module.run([input_file_name]); }); - - displayplot(FS.findObject(output_file_name)); -} - - -var Module = { - "noInitialRun": true, - print: function(text) { - self.postMessage({"call": "error", "args": text}); - }, - printErr: function(text) { - self.postMessage({"call": "error", "args": text}); - }, -}; diff --git a/deps/v8/tools/sourcemap.mjs b/deps/v8/tools/sourcemap.mjs new file mode 100644 index 00000000000000..77af4133cfeaa8 --- /dev/null +++ b/deps/v8/tools/sourcemap.mjs @@ -0,0 +1,382 @@ +// Copyright 2013 the V8 project authors. 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. + +// This is a copy from blink dev tools, see: +// http://src.chromium.org/viewvc/blink/trunk/Source/devtools/front_end/SourceMap.js +// revision: 153407 + +// Added to make the file work without dev tools +export const WebInspector = {}; +WebInspector.ParsedURL = {}; +WebInspector.ParsedURL.completeURL = function(){}; +// start of original file content + +/* + * 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. + */ + +/** + * Implements Source Map V3 model. See http://code.google.com/p/closure-compiler/wiki/SourceMaps + * for format description. + * @constructor + * @param {string} sourceMappingURL + * @param {SourceMapV3} payload + */ +WebInspector.SourceMap = function(sourceMappingURL, payload) +{ + if (!WebInspector.SourceMap.prototype._base64Map) { + const base64Digits = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + WebInspector.SourceMap.prototype._base64Map = {}; + for (var i = 0; i < base64Digits.length; ++i) + WebInspector.SourceMap.prototype._base64Map[base64Digits.charAt(i)] = i; + } + + this._sourceMappingURL = sourceMappingURL; + this._reverseMappingsBySourceURL = {}; + this._mappings = []; + this._sources = {}; + this._sourceContentByURL = {}; + this._parseMappingPayload(payload); +} + +/** + * @param {string} sourceMapURL + * @param {string} compiledURL + * @param {function(WebInspector.SourceMap)} callback + */ +WebInspector.SourceMap.load = function(sourceMapURL, compiledURL, callback) +{ + NetworkAgent.loadResourceForFrontend(WebInspector.resourceTreeModel.mainFrame.id, sourceMapURL, undefined, contentLoaded.bind(this)); + + /** + * @param {?Protocol.Error} error + * @param {number} statusCode + * @param {NetworkAgent.Headers} headers + * @param {string} content + */ + function contentLoaded(error, statusCode, headers, content) + { + if (error || !content || statusCode >= 400) { + console.error("Could not load content for " + sourceMapURL + " : " + (error || ("HTTP status code: " + statusCode))); + callback(null); + return; + } + + if (content.slice(0, 3) === ")]}") + content = content.substring(content.indexOf('\n')); + try { + var payload = /** @type {SourceMapV3} */ (JSON.parse(content)); + var baseURL = sourceMapURL.startsWith("data:") ? compiledURL : sourceMapURL; + callback(new WebInspector.SourceMap(baseURL, payload)); + } catch(e) { + console.error(e.message); + callback(null); + } + } +} + +WebInspector.SourceMap.prototype = { + /** + * @return {Array.} + */ + sources: function() + { + return Object.keys(this._sources); + }, + + /** + * @param {string} sourceURL + * @return {string|undefined} + */ + sourceContent: function(sourceURL) + { + return this._sourceContentByURL[sourceURL]; + }, + + /** + * @param {string} sourceURL + * @param {WebInspector.ResourceType} contentType + * @return {WebInspector.ContentProvider} + */ + sourceContentProvider: function(sourceURL, contentType) + { + var lastIndexOfDot = sourceURL.lastIndexOf("."); + var extension = lastIndexOfDot !== -1 ? sourceURL.substr(lastIndexOfDot + 1) : ""; + var mimeType = WebInspector.ResourceType.mimeTypesForExtensions[extension.toLowerCase()]; + var sourceContent = this.sourceContent(sourceURL); + if (sourceContent) + return new WebInspector.StaticContentProvider(contentType, sourceContent, mimeType); + return new WebInspector.CompilerSourceMappingContentProvider(sourceURL, contentType, mimeType); + }, + + /** + * @param {SourceMapV3} mappingPayload + */ + _parseMappingPayload: function(mappingPayload) + { + if (mappingPayload.sections) + this._parseSections(mappingPayload.sections); + else + this._parseMap(mappingPayload, 0, 0); + }, + + /** + * @param {Array.} sections + */ + _parseSections: function(sections) + { + for (var i = 0; i < sections.length; ++i) { + var section = sections[i]; + this._parseMap(section.map, section.offset.line, section.offset.column); + } + }, + + /** + * @param {number} lineNumber in compiled resource + * @param {number} columnNumber in compiled resource + * @return {?Array} + */ + findEntry: function(lineNumber, columnNumber) + { + var first = 0; + var count = this._mappings.length; + while (count > 1) { + var step = count >> 1; + var middle = first + step; + var mapping = this._mappings[middle]; + if (lineNumber < mapping[0] || (lineNumber === mapping[0] && columnNumber < mapping[1])) + count = step; + else { + first = middle; + count -= step; + } + } + var entry = this._mappings[first]; + if (!first && entry && (lineNumber < entry[0] || (lineNumber === entry[0] && columnNumber < entry[1]))) + return null; + return entry; + }, + + /** + * @param {string} sourceURL of the originating resource + * @param {number} lineNumber in the originating resource + * @return {Array} + */ + findEntryReversed: function(sourceURL, lineNumber) + { + var mappings = this._reverseMappingsBySourceURL[sourceURL]; + for ( ; lineNumber < mappings.length; ++lineNumber) { + var mapping = mappings[lineNumber]; + if (mapping) + return mapping; + } + return this._mappings[0]; + }, + + /** + * @override + */ + _parseMap: function(map, lineNumber, columnNumber) + { + var sourceIndex = 0; + var sourceLineNumber = 0; + var sourceColumnNumber = 0; + var nameIndex = 0; + + var sources = []; + var originalToCanonicalURLMap = {}; + for (var i = 0; i < map.sources.length; ++i) { + var originalSourceURL = map.sources[i]; + var sourceRoot = map.sourceRoot || ""; + if (sourceRoot && !sourceRoot.endsWith("/")) + sourceRoot += "/"; + var href = sourceRoot + originalSourceURL; + var url = WebInspector.ParsedURL.completeURL(this._sourceMappingURL, href) || href; + originalToCanonicalURLMap[originalSourceURL] = url; + sources.push(url); + this._sources[url] = true; + + if (map.sourcesContent && map.sourcesContent[i]) + this._sourceContentByURL[url] = map.sourcesContent[i]; + } + + var stringCharIterator = new WebInspector.SourceMap.StringCharIterator(map.mappings); + var sourceURL = sources[sourceIndex]; + + while (true) { + if (stringCharIterator.peek() === ",") + stringCharIterator.next(); + else { + while (stringCharIterator.peek() === ";") { + lineNumber += 1; + columnNumber = 0; + stringCharIterator.next(); + } + if (!stringCharIterator.hasNext()) + break; + } + + columnNumber += this._decodeVLQ(stringCharIterator); + if (this._isSeparator(stringCharIterator.peek())) { + this._mappings.push([lineNumber, columnNumber]); + continue; + } + + var sourceIndexDelta = this._decodeVLQ(stringCharIterator); + if (sourceIndexDelta) { + sourceIndex += sourceIndexDelta; + sourceURL = sources[sourceIndex]; + } + sourceLineNumber += this._decodeVLQ(stringCharIterator); + sourceColumnNumber += this._decodeVLQ(stringCharIterator); + if (!this._isSeparator(stringCharIterator.peek())) + nameIndex += this._decodeVLQ(stringCharIterator); + + this._mappings.push([lineNumber, columnNumber, sourceURL, sourceLineNumber, sourceColumnNumber]); + } + + for (var i = 0; i < this._mappings.length; ++i) { + var mapping = this._mappings[i]; + var url = mapping[2]; + if (!url) + continue; + if (!this._reverseMappingsBySourceURL[url]) + this._reverseMappingsBySourceURL[url] = []; + var reverseMappings = this._reverseMappingsBySourceURL[url]; + var sourceLine = mapping[3]; + if (!reverseMappings[sourceLine]) + reverseMappings[sourceLine] = [mapping[0], mapping[1]]; + } + }, + + /** + * @param {string} char + * @return {boolean} + */ + _isSeparator: function(char) + { + return char === "," || char === ";"; + }, + + /** + * @param {WebInspector.SourceMap.StringCharIterator} stringCharIterator + * @return {number} + */ + _decodeVLQ: function(stringCharIterator) + { + // Read unsigned value. + var result = 0; + var shift = 0; + do { + var digit = this._base64Map[stringCharIterator.next()]; + result += (digit & this._VLQ_BASE_MASK) << shift; + shift += this._VLQ_BASE_SHIFT; + } while (digit & this._VLQ_CONTINUATION_MASK); + + // Fix the sign. + var negative = result & 1; + // Use unsigned right shift, so that the 32nd bit is properly shifted + // to the 31st, and the 32nd becomes unset. + result >>>= 1; + if (negate) { + // We need to OR 0x80000000 here to ensure the 32nd bit (the sign bit + // in a 32bit int) is always set for negative numbers. If `result` + // were 1, (meaning `negate` is true and all other bits were zeros), + // `result` would now be 0. But -0 doesn't flip the 32nd bit as + // intended. All other numbers will successfully set the 32nd bit + // without issue, so doing this is a noop for them. + return -result | 0x80000000; + } + return result; + }, + + _VLQ_BASE_SHIFT: 5, + _VLQ_BASE_MASK: (1 << 5) - 1, + _VLQ_CONTINUATION_MASK: 1 << 5 +} + +/** + * @constructor + * @param {string} string + */ +WebInspector.SourceMap.StringCharIterator = function(string) +{ + this._string = string; + this._position = 0; +} + +WebInspector.SourceMap.StringCharIterator.prototype = { + /** + * @return {string} + */ + next: function() + { + return this._string.charAt(this._position++); + }, + + /** + * @return {string} + */ + peek: function() + { + return this._string.charAt(this._position); + }, + + /** + * @return {boolean} + */ + hasNext: function() + { + return this._position < this._string.length; + } +} diff --git a/deps/v8/tools/splaytree.mjs b/deps/v8/tools/splaytree.mjs new file mode 100644 index 00000000000000..867274a787eeb8 --- /dev/null +++ b/deps/v8/tools/splaytree.mjs @@ -0,0 +1,327 @@ +// Copyright 2009 the V8 project authors. 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. + + +/** + * Constructs a Splay tree. A splay tree is a self-balancing binary + * search tree with the additional property that recently accessed + * elements are quick to access again. It performs basic operations + * such as insertion, look-up and removal in O(log(n)) amortized time. + * + * @constructor + */ +export function SplayTree() { +}; + + +/** + * Pointer to the root node of the tree. + * + * @type {SplayTree.Node} + * @private + */ +SplayTree.prototype.root_ = null; + + +/** + * @return {boolean} Whether the tree is empty. + */ +SplayTree.prototype.isEmpty = function() { + return !this.root_; +}; + + + +/** + * Inserts a node into the tree with the specified key and value if + * the tree does not already contain a node with the specified key. If + * the value is inserted, it becomes the root of the tree. + * + * @param {number} key Key to insert into the tree. + * @param {*} value Value to insert into the tree. + */ +SplayTree.prototype.insert = function(key, value) { + if (this.isEmpty()) { + this.root_ = new SplayTree.Node(key, value); + return; + } + // Splay on the key to move the last node on the search path for + // the key to the root of the tree. + this.splay_(key); + if (this.root_.key == key) { + return; + } + var node = new SplayTree.Node(key, value); + if (key > this.root_.key) { + node.left = this.root_; + node.right = this.root_.right; + this.root_.right = null; + } else { + node.right = this.root_; + node.left = this.root_.left; + this.root_.left = null; + } + this.root_ = node; +}; + + +/** + * Removes a node with the specified key from the tree if the tree + * contains a node with this key. The removed node is returned. If the + * key is not found, an exception is thrown. + * + * @param {number} key Key to find and remove from the tree. + * @return {SplayTree.Node} The removed node. + */ +SplayTree.prototype.remove = function(key) { + if (this.isEmpty()) { + throw Error('Key not found: ' + key); + } + this.splay_(key); + if (this.root_.key != key) { + throw Error('Key not found: ' + key); + } + var removed = this.root_; + if (!this.root_.left) { + this.root_ = this.root_.right; + } else { + var right = this.root_.right; + this.root_ = this.root_.left; + // Splay to make sure that the new root has an empty right child. + this.splay_(key); + // Insert the original right child as the right child of the new + // root. + this.root_.right = right; + } + return removed; +}; + + +/** + * Returns the node having the specified key or null if the tree doesn't contain + * a node with the specified key. + * + * @param {number} key Key to find in the tree. + * @return {SplayTree.Node} Node having the specified key. + */ +SplayTree.prototype.find = function(key) { + if (this.isEmpty()) { + return null; + } + this.splay_(key); + return this.root_.key == key ? this.root_ : null; +}; + + +/** + * @return {SplayTree.Node} Node having the minimum key value. + */ +SplayTree.prototype.findMin = function() { + if (this.isEmpty()) { + return null; + } + var current = this.root_; + while (current.left) { + current = current.left; + } + return current; +}; + + +/** + * @return {SplayTree.Node} Node having the maximum key value. + */ +SplayTree.prototype.findMax = function(opt_startNode) { + if (this.isEmpty()) { + return null; + } + var current = opt_startNode || this.root_; + while (current.right) { + current = current.right; + } + return current; +}; + + +/** + * @return {SplayTree.Node} Node having the maximum key value that + * is less or equal to the specified key value. + */ +SplayTree.prototype.findGreatestLessThan = function(key) { + if (this.isEmpty()) { + return null; + } + // Splay on the key to move the node with the given key or the last + // node on the search path to the top of the tree. + this.splay_(key); + // Now the result is either the root node or the greatest node in + // the left subtree. + if (this.root_.key <= key) { + return this.root_; + } else if (this.root_.left) { + return this.findMax(this.root_.left); + } else { + return null; + } +}; + + +/** + * @return {Array<*>} An array containing all the values of tree's nodes paired + * with keys. + */ +SplayTree.prototype.exportKeysAndValues = function() { + var result = []; + this.traverse_(function(node) { result.push([node.key, node.value]); }); + return result; +}; + + +/** + * @return {Array<*>} An array containing all the values of tree's nodes. + */ +SplayTree.prototype.exportValues = function() { + var result = []; + this.traverse_(function(node) { result.push(node.value); }); + return result; +}; + + +/** + * Perform the splay operation for the given key. Moves the node with + * the given key to the top of the tree. If no node has the given + * key, the last node on the search path is moved to the top of the + * tree. This is the simplified top-down splaying algorithm from: + * "Self-adjusting Binary Search Trees" by Sleator and Tarjan + * + * @param {number} key Key to splay the tree on. + * @private + */ +SplayTree.prototype.splay_ = function(key) { + if (this.isEmpty()) { + return; + } + // Create a dummy node. The use of the dummy node is a bit + // counter-intuitive: The right child of the dummy node will hold + // the L tree of the algorithm. The left child of the dummy node + // will hold the R tree of the algorithm. Using a dummy node, left + // and right will always be nodes and we avoid special cases. + var dummy, left, right; + dummy = left = right = new SplayTree.Node(null, null); + var current = this.root_; + while (true) { + if (key < current.key) { + if (!current.left) { + break; + } + if (key < current.left.key) { + // Rotate right. + var tmp = current.left; + current.left = tmp.right; + tmp.right = current; + current = tmp; + if (!current.left) { + break; + } + } + // Link right. + right.left = current; + right = current; + current = current.left; + } else if (key > current.key) { + if (!current.right) { + break; + } + if (key > current.right.key) { + // Rotate left. + var tmp = current.right; + current.right = tmp.left; + tmp.left = current; + current = tmp; + if (!current.right) { + break; + } + } + // Link left. + left.right = current; + left = current; + current = current.right; + } else { + break; + } + } + // Assemble. + left.right = current.left; + right.left = current.right; + current.left = dummy.right; + current.right = dummy.left; + this.root_ = current; +}; + + +/** + * Performs a preorder traversal of the tree. + * + * @param {function(SplayTree.Node)} f Visitor function. + * @private + */ +SplayTree.prototype.traverse_ = function(f) { + var nodesToVisit = [this.root_]; + while (nodesToVisit.length > 0) { + var node = nodesToVisit.shift(); + if (node == null) { + continue; + } + f(node); + nodesToVisit.push(node.left); + nodesToVisit.push(node.right); + } +}; + + +/** + * Constructs a Splay tree node. + * + * @param {number} key Key. + * @param {*} value Value. + */ +SplayTree.Node = function(key, value) { + this.key = key; + this.value = value; +}; + + +/** + * @type {SplayTree.Node} + */ +SplayTree.Node.prototype.left = null; + + +/** + * @type {SplayTree.Node} + */ +SplayTree.Node.prototype.right = null; diff --git a/deps/v8/tools/system-analyzer/app-model.mjs b/deps/v8/tools/system-analyzer/app-model.mjs index 821d3a2c1739b7..37fa5ae2f3336a 100644 --- a/deps/v8/tools/system-analyzer/app-model.mjs +++ b/deps/v8/tools/system-analyzer/app-model.mjs @@ -8,6 +8,7 @@ class State { #ic; #selectedMapLogEvents; #selectedIcLogEvents; + #selectedSourcePositionLogEvents; #nofChunks; #chunks; #icTimeline; @@ -81,6 +82,12 @@ class State { if (!value) return; this.#selectedMapLogEvents = value; } + get selectedSourcePositionLogEvents() { + return this.#selectedSourcePositionLogEvents; + } + set selectedSourcePositionLogEvents(value) { + this.#selectedSourcePositionLogEvents = value; + } get selectedIcLogEvents() { return this.#selectedIcLogEvents; } diff --git a/deps/v8/tools/system-analyzer/events.mjs b/deps/v8/tools/system-analyzer/events.mjs index d868b57a848e99..8e9a5a0b446bb3 100644 --- a/deps/v8/tools/system-analyzer/events.mjs +++ b/deps/v8/tools/system-analyzer/events.mjs @@ -30,4 +30,17 @@ class SelectTimeEvent extends CustomEvent { } } -export { SelectionEvent, FocusEvent, SelectTimeEvent }; +class SynchronizeSelectionEvent extends CustomEvent { + static name = 'syncselection'; + constructor(start, end) { + super(SynchronizeSelectionEvent.name, { bubbles: true, composed: true }); + this.start = start; + this.end = end; + } +} + + +export { + SelectionEvent, FocusEvent, SelectTimeEvent, + SynchronizeSelectionEvent +}; diff --git a/deps/v8/tools/system-analyzer/helper.mjs b/deps/v8/tools/system-analyzer/helper.mjs index 4570074c6df1e6..782b3f34569668 100644 --- a/deps/v8/tools/system-analyzer/helper.mjs +++ b/deps/v8/tools/system-analyzer/helper.mjs @@ -26,9 +26,9 @@ function defineCustomElement(path, generator) { let name = path.substring(path.lastIndexOf("/") + 1, path.length); path = path + '-template.html'; fetch(path) - .then(stream => stream.text()) - .then( - templateText => customElements.define(name, generator(templateText))); + .then(stream => stream.text()) + .then( + templateText => customElements.define(name, generator(templateText))); } // DOM Helpers @@ -104,7 +104,7 @@ class CSSColor { } -function transitionTypeToColor(type) { +function typeToColor(type) { switch (type) { case 'new': return CSSColor.green; @@ -120,16 +120,20 @@ function transitionTypeToColor(type) { return CSSColor.red; case 'LoadGlobalIC': return CSSColor.green; + case 'LoadIC': + return CSSColor.primaryColor; case 'StoreInArrayLiteralIC': return CSSColor.violet; + case 'StoreGlobalIC': + return CSSColor.blue; case 'StoreIC': return CSSColor.orange; case 'KeyedLoadIC': return CSSColor.red; case 'KeyedStoreIC': - return CSSColor.primaryColor; + return CSSColor.yellow; } - return CSSColor.primaryColor; + return CSSColor.secondaryColor; } @@ -149,7 +153,7 @@ function div(classes) { class V8CustomElement extends HTMLElement { constructor(templateText) { super(); - const shadowRoot = this.attachShadow({mode: 'open'}); + const shadowRoot = this.attachShadow({ mode: 'open' }); shadowRoot.innerHTML = templateText; } $(id) { @@ -160,7 +164,7 @@ class V8CustomElement extends HTMLElement { return this.shadowRoot.querySelectorAll(query); } - div(classes) {return div(classes)} + div(classes) { return div(classes) } table(className) { let node = document.createElement('table') @@ -178,12 +182,14 @@ class V8CustomElement extends HTMLElement { return node; } - tr(){ + tr() { return document.createElement('tr'); } removeAllChildren(node) { return removeAllChildren(node); } } -export {defineCustomElement, V8CustomElement, removeAllChildren, - $, div, transitionTypeToColor, CSSColor}; +export { + defineCustomElement, V8CustomElement, removeAllChildren, + $, div, typeToColor, CSSColor +}; diff --git a/deps/v8/tools/system-analyzer/ic-model.mjs b/deps/v8/tools/system-analyzer/ic-model.mjs index 93a3d612627a08..8340e9b7566ff3 100644 --- a/deps/v8/tools/system-analyzer/ic-model.mjs +++ b/deps/v8/tools/system-analyzer/ic-model.mjs @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import CustomIcProcessor from "./ic-processor.mjs"; +import Processor from "./processor.mjs"; // For compatibility with console scripts: print = console.log; @@ -24,8 +24,8 @@ export class Group { createSubGroups() { this.groups = {}; - for (let i = 0; i < CustomIcProcessor.kProperties.length; i++) { - let subProperty = CustomIcProcessor.kProperties[i]; + for (let i = 0; i < Processor.kProperties.length; i++) { + let subProperty = Processor.kProperties[i]; if (this.property == subProperty) continue; this.groups[subProperty] = Group.groupBy(this.entries, subProperty); } @@ -51,7 +51,7 @@ export class Group { group.percentage = Math.round(group.count / length * 100 * 100) / 100; result.push(group); } - result.sort((a, b) => {return b.count - a.count}); + result.sort((a, b) => { return b.count - a.count }); return result; } diff --git a/deps/v8/tools/system-analyzer/ic-panel-template.html b/deps/v8/tools/system-analyzer/ic-panel-template.html index 187e5880902b19..53c5eb77fcaa48 100644 --- a/deps/v8/tools/system-analyzer/ic-panel-template.html +++ b/deps/v8/tools/system-analyzer/ic-panel-template.html @@ -1,61 +1,60 @@ -

IC Panel

-

IC Explorer

0
@@ -74,26 +73,22 @@

IC Explorer

generic
-

Data

-

Trace Count: 0

- -

Result

-

+

Result

+

Group-Key: -

-

+

+

Filter by Time -

: - + -

- - - -
-

+

+ + + +
+

diff --git a/deps/v8/tools/system-analyzer/ic-panel.mjs b/deps/v8/tools/system-analyzer/ic-panel.mjs index 14ea97a303b7e0..a8f68c31f5d5f7 100644 --- a/deps/v8/tools/system-analyzer/ic-panel.mjs +++ b/deps/v8/tools/system-analyzer/ic-panel.mjs @@ -3,27 +3,29 @@ // found in the LICENSE file. import { Group } from './ic-model.mjs'; -import CustomIcProcessor from "./ic-processor.mjs"; -import { FocusEvent, SelectTimeEvent } from './events.mjs'; +import Processor from "./processor.mjs"; +import { MapLogEvent } from "./log/map.mjs"; +import { FocusEvent, SelectTimeEvent, SelectionEvent } from './events.mjs'; import { defineCustomElement, V8CustomElement } from './helper.mjs'; defineCustomElement('ic-panel', (templateText) => class ICPanel extends V8CustomElement { - //TODO(zcankara) Entries never set - #entries; - #filteredEntries; + #selectedLogEvents; + #timeline; constructor() { super(templateText); + this.initGroupKeySelect(); this.groupKey.addEventListener( 'change', e => this.updateTable(e)); this.$('#filterICTimeBtn').addEventListener( 'click', e => this.handleICTimeFilter(e)); } - - get entries() { - return this.#entries; + set timeline(value) { + console.assert(value !== undefined, "timeline undefined!"); + this.#timeline = value; + this.selectedLogEvents = this.#timeline.all; + this.updateCount(); } - get groupKey() { return this.$('#group-key'); } @@ -44,13 +46,18 @@ defineCustomElement('ic-panel', (templateText) => return this.querySelectorAll("span"); } - set filteredEntries(value) { - this.#filteredEntries = value; + set selectedLogEvents(value) { + this.#selectedLogEvents = value; + this.updateCount(); this.updateTable(); } - get filteredEntries() { - return this.#filteredEntries; + updateCount() { + this.count.innerHTML = this.selectedLogEvents.length; + } + + get selectedLogEvents() { + return this.#selectedLogEvents; } updateTable(event) { @@ -58,7 +65,7 @@ defineCustomElement('ic-panel', (templateText) => let key = select.options[select.selectedIndex].text; let tableBody = this.tableBody; this.removeAllChildren(tableBody); - let groups = Group.groupBy(this.filteredEntries, key, true); + let groups = Group.groupBy(this.selectedLogEvents, key, true); this.render(groups, tableBody); } @@ -93,11 +100,28 @@ defineCustomElement('ic-panel', (templateText) => } handleMapClick(e) { - this.dispatchEvent(new FocusEvent(e.target.parentNode.entry)); + const entry = e.target.parentNode.entry; + const id = entry.key; + const selectedMapLogEvents = + this.searchIcLogEventToMapLogEvent(id, entry.entries); + this.dispatchEvent(new SelectionEvent(selectedMapLogEvents)); + } + + searchIcLogEventToMapLogEvent(id, icLogEvents) { + // searches for mapLogEvents using the id, time + const selectedMapLogEventsSet = new Set(); + for (const icLogEvent of icLogEvents) { + const time = icLogEvent.time; + const selectedMap = MapLogEvent.get(id, time); + selectedMapLogEventsSet.add(selectedMap); + } + return Array.from(selectedMapLogEventsSet); } + //TODO(zcankara) Handle in the processor for events with source positions. handleFilePositionClick(e) { - this.dispatchEvent(new FocusEvent(e.target.parentNode.entry.key)); + const entry = e.target.parentNode.entry; + this.dispatchEvent(new FocusEvent(entry.filePosition)); } render(entries, parent) { @@ -110,7 +134,9 @@ defineCustomElement('ic-panel', (templateText) => //TODO(zcankara) Create one bound method and use it everywhere if (entry.property === "map") { tr.addEventListener('click', e => this.handleMapClick(e)); + tr.classList.add('clickable'); } else if (entry.property == "filePosition") { + tr.classList.add('clickable'); tr.addEventListener('click', e => this.handleFilePositionClick(e)); } @@ -182,9 +208,9 @@ defineCustomElement('ic-panel', (templateText) => initGroupKeySelect() { let select = this.groupKey; select.options.length = 0; - for (let i in CustomIcProcessor.kProperties) { + for (let i in Processor.kProperties) { let option = document.createElement("option"); - option.text = CustomIcProcessor.kProperties[i]; + option.text = Processor.kProperties[i]; select.add(option); } } diff --git a/deps/v8/tools/system-analyzer/ic-processor.mjs b/deps/v8/tools/system-analyzer/ic-processor.mjs deleted file mode 100644 index 2d468fd2661405..00000000000000 --- a/deps/v8/tools/system-analyzer/ic-processor.mjs +++ /dev/null @@ -1,282 +0,0 @@ -// Copyright 2020 the V8 project authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import {Event} from './event.mjs'; -import {Timeline} from './timeline.mjs'; - -/** - * Parser for dynamic code optimization state. - */ -function parseState(s) { - switch (s) { - case '': - return Profile.CodeState.COMPILED; - case '~': - return Profile.CodeState.OPTIMIZABLE; - case '*': - return Profile.CodeState.OPTIMIZED; - } - throw new Error('unknown code state: ' + s); -} - -class IcProcessor extends LogReader { - #profile; - MAJOR_VERSION = 8; - MINOR_VERSION = 5; - constructor() { - super(); - let propertyICParser = [ - parseInt, parseInt, parseInt, parseInt, parseString, parseString, - parseInt, parseString, parseString, parseString - ]; - LogReader.call(this, { - 'code-creation': { - parsers: [ - parseString, parseInt, parseInt, parseInt, parseInt, parseString, - parseVarArgs - ], - processor: this.processCodeCreation - }, - 'v8-version': { - parsers: [ - parseInt, parseInt, - ], - processor: this.processV8Version - }, - 'code-move': - {parsers: [parseInt, parseInt], processor: this.processCodeMove}, - 'code-delete': {parsers: [parseInt], processor: this.processCodeDelete}, - 'sfi-move': - {parsers: [parseInt, parseInt], processor: this.processFunctionMove}, - 'LoadGlobalIC': { - parsers: propertyICParser, - processor: this.processPropertyIC.bind(this, 'LoadGlobalIC') - }, - 'StoreGlobalIC': { - parsers: propertyICParser, - processor: this.processPropertyIC.bind(this, 'StoreGlobalIC') - }, - 'LoadIC': { - parsers: propertyICParser, - processor: this.processPropertyIC.bind(this, 'LoadIC') - }, - 'StoreIC': { - parsers: propertyICParser, - processor: this.processPropertyIC.bind(this, 'StoreIC') - }, - 'KeyedLoadIC': { - parsers: propertyICParser, - processor: this.processPropertyIC.bind(this, 'KeyedLoadIC') - }, - 'KeyedStoreIC': { - parsers: propertyICParser, - processor: this.processPropertyIC.bind(this, 'KeyedStoreIC') - }, - 'StoreInArrayLiteralIC': { - parsers: propertyICParser, - processor: this.processPropertyIC.bind(this, 'StoreInArrayLiteralIC') - }, - }); - this.#profile = new Profile(); - - this.LoadGlobalIC = 0; - this.StoreGlobalIC = 0; - this.LoadIC = 0; - this.StoreIC = 0; - this.KeyedLoadIC = 0; - this.KeyedStoreIC = 0; - this.StoreInArrayLiteralIC = 0; - } - get profile(){ - return this.#profile; - } - /** - * @override - */ - printError(str) { - print(str); - } - processString(string) { - let end = string.length; - let current = 0; - let next = 0; - let line; - let i = 0; - let entry; - while (current < end) { - next = string.indexOf('\n', current); - if (next === -1) break; - i++; - line = string.substring(current, next); - current = next + 1; - this.processLogLine(line); - } - } - processV8Version(majorVersion, minorVersion){ - if( - (majorVersion == this.MAJOR_VERSION && minorVersion <= this.MINOR_VERSION) - || (majorVersion < this.MAJOR_VERSION)){ - window.alert( - `Unsupported version ${majorVersion}.${minorVersion}. \n` + - `Please use the matching tool for given the V8 version.`); - } - } - processLogFile(fileName) { - this.collectEntries = true; - this.lastLogFileName_ = fileName; - let line; - while (line = readline()) { - this.processLogLine(line); - } - print(); - print('====================='); - print('LoadGlobal: ' + this.LoadGlobalIC); - print('StoreGlobal: ' + this.StoreGlobalIC); - print('Load: ' + this.LoadIC); - print('Store: ' + this.StoreIC); - print('KeyedLoad: ' + this.KeyedLoadIC); - print('KeyedStore: ' + this.KeyedStoreIC); - print('StoreInArrayLiteral: ' + this.StoreInArrayLiteralIC); - } - addEntry(entry) { - this.entries.push(entry); - } - processCodeCreation(type, kind, timestamp, start, size, name, maybe_func) { - if (maybe_func.length) { - let funcAddr = parseInt(maybe_func[0]); - let state = parseState(maybe_func[1]); - this.#profile.addFuncCode( - type, name, timestamp, start, size, funcAddr, state); - } else { - this.#profile.addCode(type, name, timestamp, start, size); - } - } - processCodeMove(from, to) { - this.#profile.moveCode(from, to); - } - processCodeDelete(start) { - this.#profile.deleteCode(start); - } - processFunctionMove(from, to) { - this.#profile.moveFunc(from, to); - } - formatName(entry) { - if (!entry) return ''; - let name = entry.func.getName(); - let re = /(.*):[0-9]+:[0-9]+$/; - let array = re.exec(name); - if (!array) return name; - return entry.getState() + array[1]; - } - - processPropertyIC( - type, pc, time, line, column, old_state, new_state, map, name, modifier, - slow_reason) { - this[type]++; - let entry = this.#profile.findEntry(pc); - print( - type + ' (' + old_state + '->' + new_state + modifier + ') at ' + - this.formatName(entry) + ':' + line + ':' + column + ' ' + name + - ' (map 0x' + map.toString(16) + ')' + - (slow_reason ? ' ' + slow_reason : '') + 'time: ' + time); - } -} - -// ================ - -IcProcessor.kProperties = [ - 'type', - 'category', - 'functionName', - 'filePosition', - 'state', - 'key', - 'map', - 'reason', - 'file' -]; - -class CustomIcProcessor extends IcProcessor { - #timeline = new Timeline(); - - functionName(pc) { - let entry = this.profile.findEntry(pc); - return this.formatName(entry); - } - - processPropertyIC( - type, pc, time, line, column, old_state, new_state, map, key, modifier, - slow_reason) { - let fnName = this.functionName(pc); - let entry = new IcLogEvent( - type, fnName, time, line, column, key, old_state, new_state, map, - slow_reason); - this.#timeline.push(entry); - } - - - get timeline(){ - return this.#timeline; - } - - processString(string) { - super.processString(string); - return this.timeline; - } -}; - -class IcLogEvent extends Event { - constructor( - type, fn_file, time, line, column, key, oldState, newState, map, reason, - additional) { - super(type, time); - this.category = 'other'; - if (this.type.indexOf('Store') !== -1) { - this.category = 'Store'; - } else if (this.type.indexOf('Load') !== -1) { - this.category = 'Load'; - } - let parts = fn_file.split(' '); - this.functionName = parts[0]; - this.file = parts[1]; - let position = line + ':' + column; - this.filePosition = this.file + ':' + position; - this.oldState = oldState; - this.newState = newState; - this.state = this.oldState + ' → ' + this.newState; - this.key = key; - this.map = map.toString(16); - this.reason = reason; - this.additional = additional; - } - - - parseMapProperties(parts, offset) { - let next = parts[++offset]; - if (!next.startsWith('dict')) return offset; - this.propertiesMode = next.substr(5) == '0' ? 'fast' : 'slow'; - this.numberOfOwnProperties = parts[++offset].substr(4); - next = parts[++offset]; - this.instanceType = next.substr(5, next.length - 6); - return offset; - } - - parsePositionAndFile(parts, start) { - // find the position of 'at' in the parts array. - let offset = start; - for (let i = start + 1; i < parts.length; i++) { - offset++; - if (parts[i] == 'at') break; - } - if (parts[offset] !== 'at') return -1; - this.position = parts.slice(start, offset).join(' '); - offset += 1; - this.isNative = parts[offset] == 'native' - offset += this.isNative ? 1 : 0; - this.file = parts[offset]; - return offset; - } -} - -export { CustomIcProcessor as default, IcLogEvent}; diff --git a/deps/v8/tools/system-analyzer/index.css b/deps/v8/tools/system-analyzer/index.css index 3eba296bacf713..c3defb5b8cd793 100644 --- a/deps/v8/tools/system-analyzer/index.css +++ b/deps/v8/tools/system-analyzer/index.css @@ -11,6 +11,7 @@ --error-color: #cf6679; --map-background-color: #5e5454; --timeline-background-color: #1f1f1f; + --file-reader-background-color: #ffffff80; --red: #dc6eae; --green: #aedc6e; --yellow: #eeff41; @@ -32,6 +33,7 @@ --error-color: #b00020; --map-background-color: #5e5454; --timeline-background-color: #fdfcfc; + --file-reader-background-color: #887e8b80; --red: #b71c1c; --green: #7db300; --yellow: #ffff00; @@ -132,6 +134,20 @@ button { .failure { background-color: var(--error-color); } + +.highlight { + background-color: var(--primary-color); + color: var(--on-primary-color); +} +.clickable:hover, +.mark:hover, +.clickable:active, +.mark:active { + background-color: var(--primary-color); + color: var(--on-primary-color); + cursor: pointer; +} + a:link { color: var(--secondary-color); background-color: transparent; diff --git a/deps/v8/tools/system-analyzer/index.html b/deps/v8/tools/system-analyzer/index.html index 56747406062ae5..c9104461147010 100644 --- a/deps/v8/tools/system-analyzer/index.html +++ b/deps/v8/tools/system-analyzer/index.html @@ -12,17 +12,6 @@ - - - - - - - - - - -
-

-

+
+ +
@@ -135,26 +136,42 @@ +
-
- -

Instructions

- Unified web interface for analyzing the trace information of the Maps/ICs + Unified web interface to analyse runtime information stored in the v8 log.

+ For generating log file from + d8: +

+ Log Options: +

+
+
--trace-maps:
+
Log + Maps
+
--trace_ic:
+
Log + + ICs
+
--log-source-code:
+
Log source code
+
+ Usage: +
    +
  • /path/do/d8 --trace-maps --trace_ic --log-source-code $FILE +
  • +
+ For generating a log file from Chrome:
    -
  • Visualize Map trees that have gathered
  • -
  • /path/to/d8 --trace-maps $FILE
  • -
  • Visualize IC events that have gathered
  • -
  • /path/to/d8 --trace_ic $FILE (your_script.js)
  • +
  • /path/to/chrome --user-data-dir=/var/tmp/chr1 --no-sandbox + --js-flags='--trace-ic --trace-maps --log-source-code’ + $WEBSITE_URL
-

Keyboard Shortcuts

+

Keyboard Shortcuts for Navigation

SHIFT + Arrow Up
Follow Map transition forward (first child)
diff --git a/deps/v8/tools/system-analyzer/index.mjs b/deps/v8/tools/system-analyzer/index.mjs index 5913d4ddc8889c..80e5b79948676d 100644 --- a/deps/v8/tools/system-analyzer/index.mjs +++ b/deps/v8/tools/system-analyzer/index.mjs @@ -2,23 +2,27 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import CustomIcProcessor from "./ic-processor.mjs"; -import { SelectionEvent, FocusEvent } from "./events.mjs"; -import { IcLogEvent } from "./ic-processor.mjs"; + +import { SelectionEvent, FocusEvent, SelectTimeEvent } from "./events.mjs"; import { State } from "./app-model.mjs"; -import { MapProcessor, MapLogEvent } from "./map-processor.mjs"; -import { SelectTimeEvent } from "./events.mjs"; +import { MapLogEvent } from "./log/map.mjs"; +import { IcLogEvent } from "./log/ic.mjs"; +import Processor from "./processor.mjs"; +import { SourcePosition } from "../profile.mjs"; import { $ } from "./helper.mjs"; import "./ic-panel.mjs"; import "./timeline-panel.mjs"; import "./map-panel.mjs"; import "./log-file-reader.mjs"; +import "./source-panel.mjs"; + + class App { #state; #view; #navigation; constructor(fileReaderId, mapPanelId, timelinePanelId, - icPanelId, mapTrackId, icTrackId) { + icPanelId, mapTrackId, icTrackId, sourcePanelId) { this.#view = { logFileReader: $(fileReaderId), icPanel: $(icPanelId), @@ -26,6 +30,7 @@ class App { timelinePanel: $(timelinePanelId), mapTrack: $(mapTrackId), icTrack: $(icTrackId), + sourcePanel: $(sourcePanelId) }; this.#state = new State(); this.#navigation = new Navigation(this.#state, this.#view); @@ -53,8 +58,10 @@ class App { this.showMapEntries(e.entries); } else if (e.entries[0] instanceof IcLogEvent) { this.showIcEntries(e.entries); + } else if (e.entries[0] instanceof SourcePosition) { + this.showSourcePositionEntries(e.entries); } else { - console.error("Undefined selection!"); + throw new Error("Unknown selection type!"); } } showMapEntries(entries) { @@ -63,8 +70,11 @@ class App { } showIcEntries(entries) { this.#state.selectedIcLogEvents = entries; - //TODO(zcankara) use selectedLogEvents - this.#view.icPanel.filteredEntries = this.#state.selectedIcLogEvents; + this.#view.icPanel.selectedLogEvents = this.#state.selectedIcLogEvents; + } + showSourcePositionEntries(entries) { + //TODO(zcankara) Handle multiple source position selection events + this.#view.sourcePanel.selectedSourcePositions = entries; } handleTimeRangeSelect(e) { @@ -75,16 +85,12 @@ class App { this.selectMapLogEvent(e.entry); } else if (e.entry instanceof IcLogEvent) { this.selectICLogEvent(e.entry); - } else if (typeof e.entry === 'string') { + } else if (e.entry instanceof SourcePosition) { this.selectSourcePositionEvent(e.entry); } else { - console.log("undefined"); + throw new Error("Unknown selection type!"); } } - handleClickSourcePositions(e) { - //TODO(zcankara) Handle source position - console.log("Entry containing source position: ", e.entries); - } selectTimeRange(start, end) { this.#state.timeSelection.start = start; this.#state.timeSelection.end = end; @@ -92,7 +98,7 @@ class App { this.#state.mapTimeline.selectTimeRange(start, end); this.#view.mapPanel.selectedMapLogEvents = this.#state.mapTimeline.selection; - this.#view.icPanel.filteredEntries = this.#state.icTimeline.selection; + this.#view.icPanel.selectedLogEvents = this.#state.icTimeline.selection; } selectMapLogEvent(entry) { this.#state.map = entry; @@ -101,34 +107,26 @@ class App { } selectICLogEvent(entry) { this.#state.ic = entry; - this.#view.icPanel.filteredEntries = [entry]; + this.#view.icPanel.selectedLogEvents = [entry]; } selectSourcePositionEvent(sourcePositions) { - console.log("source positions: ", sourcePositions); + if (!sourcePositions.script) return; + this.#view.sourcePanel.selectedSourcePositions = [sourcePositions]; } + handleFileUpload(e) { + this.restartApp(); $("#container").className = "initial"; } - // Map event log processing - handleLoadTextMapProcessor(text) { - let mapProcessor = new MapProcessor(); - return mapProcessor.processString(text); + restartApp() { + this.#state = new State(); + this.#navigation = new Navigation(this.#state, this.#view); } - // IC event file reading and log processing - loadICLogFile(fileData) { - let reader = new FileReader(); - reader.onload = (evt) => { - let icProcessor = new CustomIcProcessor(); - //TODO(zcankara) Assign timeline directly to the ic panel - //TODO(zcankara) Exe: this.#icPanel.timeline = document.state.icTimeline - //TODO(zcankara) Set the data of the State object first - this.#state.icTimeline = icProcessor.processString(fileData.chunk); - this.#view.icTrack.data = this.#state.icTimeline; - this.#view.icPanel.filteredEntries = this.#view.icTrack.data.all; - this.#view.icPanel.count.innerHTML = this.#view.icTrack.data.all.length; - }; - reader.readAsText(fileData.file); - this.#view.icPanel.initGroupKeySelect(); + // Event log processing + handleLoadTextProcessor(text) { + let logProcessor = new Processor(); + logProcessor.processString(text); + return logProcessor; } // call when a new file uploaded @@ -137,18 +135,22 @@ class App { $("#container").className = "loaded"; // instantiate the app logic let fileData = e.detail; - try { - const timeline = this.handleLoadTextMapProcessor(fileData.chunk); - // Transitions must be set before timeline for stats panel. - this.#state.mapTimeline = timeline; - this.#view.mapPanel.transitions = this.#state.mapTimeline.transitions; - this.#view.mapTrack.data = this.#state.mapTimeline; - this.#state.chunks = this.#view.mapTrack.chunks; - this.#view.mapPanel.timeline = this.#state.mapTimeline; - } catch (error) { - console.log(error); - } - this.loadICLogFile(fileData); + const processor = this.handleLoadTextProcessor(fileData.chunk); + const mapTimeline = processor.mapTimeline; + const icTimeline = processor.icTimeline; + //TODO(zcankara) Make sure only one instance of src event map ic id match + // Load map log events timeline. + this.#state.mapTimeline = mapTimeline; + // Transitions must be set before timeline for stats panel. + this.#view.mapPanel.transitions = this.#state.mapTimeline.transitions; + this.#view.mapTrack.data = mapTimeline; + this.#state.chunks = this.#view.mapTrack.chunks; + this.#view.mapPanel.timeline = mapTimeline; + // Load ic log events timeline. + this.#state.icTimeline = icTimeline; + this.#view.icPanel.timeline = icTimeline; + this.#view.icTrack.data = icTimeline; + this.#view.sourcePanel.data = processor.scripts this.fileLoaded = true; } diff --git a/deps/v8/tools/system-analyzer/log-file-reader-template.html b/deps/v8/tools/system-analyzer/log-file-reader-template.html index d4796d5994ee8e..e20ce1ea2070bc 100644 --- a/deps/v8/tools/system-analyzer/log-file-reader-template.html +++ b/deps/v8/tools/system-analyzer/log-file-reader-template.html @@ -2,9 +2,10 @@ Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. --> + + +
-
- - Drag and drop a v8.log file into this area, or click to choose from disk. - - -
-
-
-
+
+ + Drag and drop a v8.log file into this area, or click to choose from disk. + + +
+
+
+
diff --git a/deps/v8/tools/system-analyzer/log-file-reader.mjs b/deps/v8/tools/system-analyzer/log-file-reader.mjs index 85fce9adb217e4..4b5238d89d28a6 100644 --- a/deps/v8/tools/system-analyzer/log-file-reader.mjs +++ b/deps/v8/tools/system-analyzer/log-file-reader.mjs @@ -1,77 +1,80 @@ // Copyright 2020 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {defineCustomElement, V8CustomElement} from './helper.mjs'; +import { defineCustomElement, V8CustomElement } from './helper.mjs'; defineCustomElement('log-file-reader', (templateText) => - class LogFileReader extends V8CustomElement { - constructor() { - super(templateText); - this.addEventListener('click', e => this.handleClick(e)); - this.addEventListener('dragover', e => this.handleDragOver(e)); - this.addEventListener('drop', e => this.handleChange(e)); - this.$('#file').addEventListener('change', e => this.handleChange(e)); - this.$('#fileReader').addEventListener('keydown', - e => this.handleKeyEvent(e)); - } - - get section() { - return this.$('#fileReaderSection'); - } + class LogFileReader extends V8CustomElement { + constructor() { + super(templateText); + this.addEventListener('click', e => this.handleClick(e)); + this.addEventListener('dragover', e => this.handleDragOver(e)); + this.addEventListener('drop', e => this.handleChange(e)); + this.$('#file').addEventListener('change', e => this.handleChange(e)); + this.$('#fileReader').addEventListener('keydown', + e => this.handleKeyEvent(e)); + } - updateLabel(text) { - this.$('#label').innerText = text; - } + get section() { + return this.$('#fileReaderSection'); + } - handleKeyEvent(event) { - if (event.key == "Enter") this.handleClick(event); - } + updateLabel(text) { + this.$('#label').innerText = text; + } - handleClick(event) { - this.$('#file').click(); - } + handleKeyEvent(event) { + if (event.key == "Enter") this.handleClick(event); + } - handleChange(event) { - // Used for drop and file change. - event.preventDefault(); - this.dispatchEvent(new CustomEvent( - 'fileuploadstart', {bubbles: true, composed: true})); - var host = event.dataTransfer ? event.dataTransfer : event.target; - this.readFile(host.files[0]); - } + handleClick(event) { + this.$('#file').click(); + } - handleDragOver(event) { - event.preventDefault(); - } + handleChange(event) { + // Used for drop and file change. + event.preventDefault(); + this.dispatchEvent(new CustomEvent( + 'fileuploadstart', { bubbles: true, composed: true })); + var host = event.dataTransfer ? event.dataTransfer : event.target; + this.readFile(host.files[0]); + } - connectedCallback() { - this.$('#fileReader').focus(); - } + handleDragOver(event) { + event.preventDefault(); + } - readFile(file) { - if (!file) { - this.updateLabel('Failed to load file.'); - return; + connectedCallback() { + this.$('#fileReader').focus(); } - this.$('#fileReader').blur(); - this.section.className = 'loading'; - const reader = new FileReader(); - reader.onload = (e) => { - try { - let dataModel = Object.create(null); - dataModel.file = file; - dataModel.chunk = e.target.result; - this.updateLabel('Finished loading \'' + file.name + '\'.'); - this.dispatchEvent(new CustomEvent( - 'fileuploadend', {bubbles: true, composed: true, detail: dataModel})); - this.section.className = 'success'; - this.$('#fileReader').classList.add('done'); - } catch (err) { - console.error(err); - this.section.className = 'failure'; + + readFile(file) { + if (!file) { + this.updateLabel('Failed to load file.'); + return; } - }; - // Delay the loading a bit to allow for CSS animations to happen. - setTimeout(() => reader.readAsText(file), 0); + this.$('#fileReader').blur(); + this.section.className = 'loading'; + const reader = new FileReader(); + reader.onload = (e) => { + try { + let dataModel = Object.create(null); + dataModel.file = file; + dataModel.chunk = e.target.result; + this.updateLabel('Finished loading \'' + file.name + '\'.'); + this.dispatchEvent(new CustomEvent( + 'fileuploadend', { + bubbles: true, composed: true, + detail: dataModel + })); + this.section.className = 'success'; + this.$('#fileReader').classList.add('done'); + } catch (err) { + console.error(err); + this.section.className = 'failure'; + } + }; + // Delay the loading a bit to allow for CSS animations to happen. + setTimeout(() => reader.readAsText(file), 0); } -}); + }); diff --git a/deps/v8/tools/system-analyzer/log/ic.mjs b/deps/v8/tools/system-analyzer/log/ic.mjs new file mode 100644 index 00000000000000..5001e60c364979 --- /dev/null +++ b/deps/v8/tools/system-analyzer/log/ic.mjs @@ -0,0 +1,60 @@ +// Copyright 2020 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +import { Event } from './log.mjs'; + +class IcLogEvent extends Event { + constructor( + type, fn_file, time, line, column, key, oldState, newState, map, reason, + script, additional) { + super(type, time); + this.category = 'other'; + if (this.type.indexOf('Store') !== -1) { + this.category = 'Store'; + } else if (this.type.indexOf('Load') !== -1) { + this.category = 'Load'; + } + let parts = fn_file.split(' '); + this.functionName = parts[0]; + this.file = parts[1]; + let position = line + ':' + column; + this.filePosition = this.file + ':' + position; + this.oldState = oldState; + this.newState = newState; + this.state = this.oldState + ' → ' + this.newState; + this.key = key; + this.map = map; + this.reason = reason; + this.additional = additional; + this.script = script; + } + + + parseMapProperties(parts, offset) { + let next = parts[++offset]; + if (!next.startsWith('dict')) return offset; + this.propertiesMode = next.substr(5) == '0' ? 'fast' : 'slow'; + this.numberOfOwnProperties = parts[++offset].substr(4); + next = parts[++offset]; + this.instanceType = next.substr(5, next.length - 6); + return offset; + } + + parsePositionAndFile(parts, start) { + // find the position of 'at' in the parts array. + let offset = start; + for (let i = start + 1; i < parts.length; i++) { + offset++; + if (parts[i] == 'at') break; + } + if (parts[offset] !== 'at') return -1; + this.position = parts.slice(start, offset).join(' '); + offset += 1; + this.isNative = parts[offset] == 'native' + offset += this.isNative ? 1 : 0; + this.file = parts[offset]; + return offset; + } +} + +export { IcLogEvent }; diff --git a/deps/v8/tools/system-analyzer/event.mjs b/deps/v8/tools/system-analyzer/log/log.mjs similarity index 89% rename from deps/v8/tools/system-analyzer/event.mjs rename to deps/v8/tools/system-analyzer/log/log.mjs index 4ab6f34b416d34..2945f0e76b8387 100644 --- a/deps/v8/tools/system-analyzer/event.mjs +++ b/deps/v8/tools/system-analyzer/log/log.mjs @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. + class Event { #time; #type; @@ -10,12 +11,12 @@ class Event { this.#time = time; this.#type = type; } - get time(){ + get time() { return this.#time; } - get type(){ + get type() { return this.#type; } } -export {Event}; +export { Event }; diff --git a/deps/v8/tools/system-analyzer/log/map.mjs b/deps/v8/tools/system-analyzer/log/map.mjs new file mode 100644 index 00000000000000..38c8a9a63a7f1a --- /dev/null +++ b/deps/v8/tools/system-analyzer/log/map.mjs @@ -0,0 +1,296 @@ +// Copyright 2020 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import { typeToColor } from '../helper.mjs'; +import { Event } from './log.mjs'; + +// =========================================================================== +// Map Log Events + +const kChunkHeight = 250; +const kChunkWidth = 10; + +function define(prototype, name, fn) { + Object.defineProperty(prototype, name, { value: fn, enumerable: false }); +} + +define(Array.prototype, 'max', function (fn) { + if (this.length === 0) return undefined; + if (fn === undefined) fn = (each) => each; + let max = fn(this[0]); + for (let i = 1; i < this.length; i++) { + max = Math.max(max, fn(this[i])); + } + return max; +}) +define(Array.prototype, 'first', function () { + return this[0] +}); +define(Array.prototype, 'last', function () { + return this[this.length - 1] +}); + +// =========================================================================== +// Map Log Events + +class MapLogEvent extends Event { + edge = void 0; + children = []; + depth = 0; + // TODO(zcankara): Change this to private class field. + #isDeprecated = false; + deprecatedTargets = null; + leftId = 0; + rightId = 0; + filePosition = ''; + script = ''; + id = -1; + constructor(id, time) { + if (!time) throw new Error('Invalid time'); + super(id, time); + MapLogEvent.set(id, this); + this.id = id; + } + + finalizeRootMap(id) { + let stack = [this]; + while (stack.length > 0) { + let current = stack.pop(); + if (current.leftId !== 0) { + console.error('Skipping potential parent loop between maps:', current) + continue; + } + current.finalize(id) + id += 1; + current.children.forEach(edge => stack.push(edge.to)) + // TODO implement rightId + } + return id; + } + + finalize(id) { + // Initialize preorder tree traversal Ids for fast subtree inclusion checks + if (id <= 0) throw 'invalid id'; + let currentId = id; + this.leftId = currentId + } + + parent() { + if (this.edge === void 0) return void 0; + return this.edge.from; + } + + isDeprecated() { + return this.#isDeprecated; + } + + deprecate() { + this.#isDeprecated = true; + } + + isRoot() { + return this.edge === void 0 || this.edge.from === void 0; + } + + contains(map) { + return this.leftId < map.leftId && map.rightId < this.rightId; + } + + addEdge(edge) { + this.children.push(edge); + } + + chunkIndex(chunks) { + // Did anybody say O(n)? + for (let i = 0; i < chunks.length; i++) { + let chunk = chunks[i]; + if (chunk.isEmpty()) continue; + if (chunk.last().time < this.time) continue; + return i; + } + return -1; + } + + position(chunks) { + let index = this.chunkIndex(chunks); + let xFrom = (index + 1.5) * kChunkWidth; + let yFrom = kChunkHeight - chunks[index].yOffset(this); + return [xFrom, yFrom]; + } + + transitions() { + let transitions = Object.create(null); + let current = this; + while (current) { + let edge = current.edge; + if (edge && edge.isTransition()) { + transitions[edge.name] = edge; + } + current = current.parent() + } + return transitions; + } + + get type() { + return this.edge === void 0 ? 'new' : this.edge.type; + } + + isBootstrapped() { + return this.edge === void 0; + } + + getParents() { + let parents = []; + let current = this.parent(); + while (current) { + parents.push(current); + current = current.parent(); + } + return parents; + } + + static get(id, time = undefined) { + let maps = this.cache.get(id); + if (maps) { + for (let i = 1; i < maps.length; i++) { + if (maps[i].time > time) { + return maps[i - 1]; + } + } + // default return the latest + return (maps.length > 0) ? maps[maps.length - 1] : undefined; + } + } + + static set(id, map) { + if (this.cache.has(id)) { + this.cache.get(id).push(map); + } else { + this.cache.set(id, [map]); + } + } +} + +MapLogEvent.cache = new Map(); + +// =========================================================================== +class Edge { + constructor(type, name, reason, time, from, to) { + this.type = type; + this.name = name; + this.reason = reason; + this.time = time; + this.from = from; + this.to = to; + } + + getColor() { + return typeToColor(this.type); + } + + finishSetup() { + let from = this.from; + if (from) from.addEdge(this); + let to = this.to; + if (to === undefined) return; + to.edge = this; + if (from === undefined) return; + if (to === from) throw 'From and to must be distinct.'; + if (to.time < from.time) { + console.error('invalid time order'); + } + let newDepth = from.depth + 1; + if (to.depth > 0 && to.depth != newDepth) { + console.error('Depth has already been initialized'); + } + to.depth = newDepth; + } + + chunkIndex(chunks) { + // Did anybody say O(n)? + for (let i = 0; i < chunks.length; i++) { + let chunk = chunks[i]; + if (chunk.isEmpty()) continue; + if (chunk.last().time < this.time) continue; + return i; + } + return -1; + } + + parentEdge() { + if (!this.from) return undefined; + return this.from.edge; + } + + chainLength() { + let length = 0; + let prev = this; + while (prev) { + prev = this.parent; + length++; + } + return length; + } + + isTransition() { + return this.type === 'Transition' + } + + isFastToSlow() { + return this.type === 'Normalize' + } + + isSlowToFast() { + return this.type === 'SlowToFast' + } + + isInitial() { + return this.type === 'InitialMap' + } + + isBootstrapped() { + return this.type === 'new' + } + + isReplaceDescriptors() { + return this.type === 'ReplaceDescriptors' + } + + isCopyAsPrototype() { + return this.reason === 'CopyAsPrototype' + } + + isOptimizeAsPrototype() { + return this.reason === 'OptimizeAsPrototype' + } + + symbol() { + if (this.isTransition()) return '+'; + if (this.isFastToSlow()) return '⊡'; + if (this.isSlowToFast()) return '⊛'; + if (this.isReplaceDescriptors()) { + if (this.name) return '+'; + return '∥'; + } + return ''; + } + + toString() { + let s = this.symbol(); + if (this.isTransition()) return s + this.name; + if (this.isFastToSlow()) return s + this.reason; + if (this.isCopyAsPrototype()) return s + 'Copy as Prototype'; + if (this.isOptimizeAsPrototype()) { + return s + 'Optimize as Prototype'; + } + if (this.isReplaceDescriptors() && this.name) { + return this.type + ' ' + this.symbol() + this.name; + } + return this.type + ' ' + (this.reason ? this.reason : '') + ' ' + + (this.name ? this.name : '') + } +} + + +export { MapLogEvent, Edge, kChunkWidth, kChunkHeight }; diff --git a/deps/v8/tools/system-analyzer/map-panel-template.html b/deps/v8/tools/system-analyzer/map-panel-template.html index 94cae0e050c475..6363a6d7c3deee 100644 --- a/deps/v8/tools/system-analyzer/map-panel-template.html +++ b/deps/v8/tools/system-analyzer/map-panel-template.html @@ -1,9 +1,11 @@ -

Map Details

+
diff --git a/deps/v8/tools/system-analyzer/map-panel/map-details.mjs b/deps/v8/tools/system-analyzer/map-panel/map-details.mjs index dddccf7d8bc0bb..d471609dba814b 100644 --- a/deps/v8/tools/system-analyzer/map-panel/map-details.mjs +++ b/deps/v8/tools/system-analyzer/map-panel/map-details.mjs @@ -10,8 +10,8 @@ defineCustomElement( class MapDetails extends V8CustomElement { constructor() { super(templateText); - this.mapDetails.addEventListener("click", () => - this.handleClickSourcePositions() + this.#filePositionNode.addEventListener("click", e => + this.handleFilePositionClick(e) ); this.selectedMap = undefined; } @@ -19,23 +19,30 @@ defineCustomElement( return this.$("#mapDetails"); } + get #filePositionNode() { + return this.$("#filePositionNode"); + } + setSelectedMap(value) { this.selectedMap = value; } set mapDetails(map) { let details = ""; + let clickableDetails = ""; if (map) { - details += "ID: " + map.id; - details += "\nSource location: " + map.filePosition; + clickableDetails += "ID: " + map.id; + clickableDetails += "\nSource location: " + map.filePosition; details += "\n" + map.description; this.setSelectedMap(map); } + this.#filePositionNode.innerText = clickableDetails; + this.#filePositionNode.classList.add("clickable"); this.mapDetails.innerText = details; } - handleClickSourcePositions() { - this.dispatchEvent(new FocusEvent(this.selectedMap.filePosition)); + handleFilePositionClick() { + this.dispatchEvent(new FocusEvent(this.selectedMap.sourcePosition)); } } ); diff --git a/deps/v8/tools/system-analyzer/map-panel/map-transitions.mjs b/deps/v8/tools/system-analyzer/map-panel/map-transitions.mjs index 578e2bb358f470..d508b886949ee5 100644 --- a/deps/v8/tools/system-analyzer/map-panel/map-transitions.mjs +++ b/deps/v8/tools/system-analyzer/map-panel/map-transitions.mjs @@ -47,6 +47,7 @@ defineCustomElement( selectMap(map) { this.currentMap = map; + this.showMap(); this.dispatchEvent(new FocusEvent(map)); } @@ -66,7 +67,8 @@ defineCustomElement( // Timeline dbl click to show map transitions of selected maps this.transitionView.style.display = "none"; this.removeAllChildren(this.transitionView); - this.selectedMapLogEvents.forEach((map) => this.addMapAndParentTransitions(map)); + this.selectedMapLogEvents.forEach((map) => + this.addMapAndParentTransitions(map)); this.transitionView.style.display = ""; } diff --git a/deps/v8/tools/system-analyzer/map-processor.mjs b/deps/v8/tools/system-analyzer/map-processor.mjs deleted file mode 100644 index a1f056b4747e0c..00000000000000 --- a/deps/v8/tools/system-analyzer/map-processor.mjs +++ /dev/null @@ -1,538 +0,0 @@ -// Copyright 2020 the V8 project authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import {transitionTypeToColor} from './helper.mjs'; -import {Timeline} from './timeline.mjs'; - -// =========================================================================== -import {Event} from './event.mjs'; -const kChunkHeight = 250; -const kChunkWidth = 10; - -function define(prototype, name, fn) { - Object.defineProperty(prototype, name, {value: fn, enumerable: false}); -} - -define(Array.prototype, 'max', function(fn) { - if (this.length === 0) return undefined; - if (fn === undefined) fn = (each) => each; - let max = fn(this[0]); - for (let i = 1; i < this.length; i++) { - max = Math.max(max, fn(this[i])); - } - return max; -}) -define(Array.prototype, 'first', function() { - return this[0] -}); -define(Array.prototype, 'last', function() { - return this[this.length - 1] -}); -// =========================================================================== - -class MapProcessor extends LogReader { - #profile = new Profile(); - #timeline = new Timeline(); - #formatPCRegexp = /(.*):[0-9]+:[0-9]+$/; - MAJOR_VERSION = 7; - MINOR_VERSION = 6; - constructor() { - super(); - this.dispatchTable_ = { - __proto__: null, - 'code-creation': { - parsers: [ - parseString, parseInt, parseInt, parseInt, parseInt, parseString, - parseVarArgs - ], - processor: this.processCodeCreation - }, - 'v8-version': { - parsers: [ - parseInt, parseInt, - ], - processor: this.processV8Version - }, - 'code-move': { - parsers: [parseInt, parseInt], - 'sfi-move': - {parsers: [parseInt, parseInt], processor: this.processCodeMove}, - 'code-delete': {parsers: [parseInt], processor: this.processCodeDelete}, - processor: this.processFunctionMove - }, - 'map-create': - {parsers: [parseInt, parseString], processor: this.processMapCreate}, - 'map': { - parsers: [ - parseString, parseInt, parseString, parseString, parseInt, parseInt, - parseString, parseString, parseString - ], - processor: this.processMap - }, - 'map-details': { - parsers: [parseInt, parseString, parseString], - processor: this.processMapDetails - } - }; - } - - printError(str) { - console.error(str); - throw str - } - - processString(string) { - let end = string.length; - let current = 0; - let next = 0; - let line; - let i = 0; - let entry; - try { - while (current < end) { - next = string.indexOf('\n', current); - if (next === -1) break; - i++; - line = string.substring(current, next); - current = next + 1; - this.processLogLine(line); - } - } catch (e) { - console.error('Error occurred during parsing, trying to continue: ' + e); - } - return this.finalize(); - } - - processLogFile(fileName) { - this.collectEntries = true; - this.lastLogFileName_ = fileName; - let i = 1; - let line; - try { - while (line = readline()) { - this.processLogLine(line); - i++; - } - } catch (e) { - console.error( - 'Error occurred during parsing line ' + i + - ', trying to continue: ' + e); - } - return this.finalize(); - } - - finalize() { - // TODO(cbruni): print stats; - this.#timeline.transitions = new Map(); - let id = 0; - this.#timeline.forEach(map => { - if (map.isRoot()) id = map.finalizeRootMap(id + 1); - if (map.edge && map.edge.name) { - let edge = map.edge; - let list = this.#timeline.transitions.get(edge.name); - if (list === undefined) { - this.#timeline.transitions.set(edge.name, [edge]); - } else { - list.push(edge); - } - } - }); - return this.#timeline; - } - - addEntry(entry) { - this.entries.push(entry); - } - - /** - * Parser for dynamic code optimization state. - */ - parseState(s) { - switch (s) { - case '': - return Profile.CodeState.COMPILED; - case '~': - return Profile.CodeState.OPTIMIZABLE; - case '*': - return Profile.CodeState.OPTIMIZED; - } - throw new Error('unknown code state: ' + s); - } - - processCodeCreation(type, kind, timestamp, start, size, name, maybe_func) { - if (maybe_func.length) { - let funcAddr = parseInt(maybe_func[0]); - let state = this.parseState(maybe_func[1]); - this.#profile.addFuncCode( - type, name, timestamp, start, size, funcAddr, state); - } else { - this.#profile.addCode(type, name, timestamp, start, size); - } - } - - processV8Version(majorVersion, minorVersion){ - if( - (majorVersion == this.MAJOR_VERSION && minorVersion <= this.MINOR_VERSION) - || (majorVersion < this.MAJOR_VERSION)){ - window.alert( - `Unsupported version ${majorVersion}.${minorVersion}. \n` + - `Please use the matching tool for given the V8 version.`); - } - } - - processCodeMove(from, to) { - this.#profile.moveCode(from, to); - } - - processCodeDelete(start) { - this.#profile.deleteCode(start); - } - - processFunctionMove(from, to) { - this.#profile.moveFunc(from, to); - } - - formatPC(pc, line, column) { - let entry = this.#profile.findEntry(pc); - if (!entry) return '' - if (entry.type === 'Builtin') { - return entry.name; - } - let name = entry.func.getName(); - let array = this.#formatPCRegexp.exec(name); - if (array === null) { - entry = name; - } else { - entry = entry.getState() + array[1]; - } - return entry + ':' + line + ':' + column; - } - - processMap(type, time, from, to, pc, line, column, reason, name) { - let time_ = parseInt(time); - if (type === 'Deprecate') return this.deprecateMap(type, time_, from); - let from_ = this.getExistingMap(from, time_); - let to_ = this.getExistingMap(to, time_); - let edge = new Edge(type, name, reason, time, from_, to_); - to_.filePosition = this.formatPC(pc, line, column); - edge.finishSetup(); - } - - deprecateMap(type, time, id) { - this.getExistingMap(id, time).deprecate(); - } - - processMapCreate(time, id) { - // map-create events might override existing maps if the addresses get - // recycled. Hence we do not check for existing maps. - let map = this.createMap(id, time); - } - - processMapDetails(time, id, string) { - // TODO(cbruni): fix initial map logging. - let map = this.getExistingMap(id, time); - map.description = string; - } - - createMap(id, time) { - let map = new MapLogEvent(id, time); - this.#timeline.push(map); - return map; - } - - getExistingMap(id, time) { - if (id === '0x000000000000') return undefined; - let map = MapLogEvent.get(id, time); - if (map === undefined) { - console.error('No map details provided: id=' + id); - // Manually patch in a map to continue running. - return this.createMap(id, time); - }; - return map; - } -} - -// =========================================================================== - -class MapLogEvent extends Event { - edge = void 0; - children = []; - depth = 0; - // TODO(zcankara): Change this to private class field. - #isDeprecated = false; - deprecatedTargets = null; - leftId= 0; - rightId = 0; - filePosition = ''; - id = -1; - constructor(id, time) { - if (!time) throw new Error('Invalid time'); - super(id, time); - MapLogEvent.set(id, this); - this.id = id; - } - - finalizeRootMap(id) { - let stack = [this]; - while (stack.length > 0) { - let current = stack.pop(); - if (current.leftId !== 0) { - console.error('Skipping potential parent loop between maps:', current) - continue; - } - current.finalize(id) - id += 1; - current.children.forEach(edge => stack.push(edge.to)) - // TODO implement rightId - } - return id; - } - - finalize(id) { - // Initialize preorder tree traversal Ids for fast subtree inclusion checks - if (id <= 0) throw 'invalid id'; - let currentId = id; - this.leftId = currentId - } - - parent() { - if (this.edge === void 0) return void 0; - return this.edge.from; - } - - isDeprecated() { - return this.#isDeprecated; - } - - deprecate() { - this.#isDeprecated = true; - } - - isRoot() { - return this.edge === void 0 || this.edge.from === void 0; - } - - contains(map) { - return this.leftId < map.leftId && map.rightId < this.rightId; - } - - addEdge(edge) { - this.children.push(edge); - } - - chunkIndex(chunks) { - // Did anybody say O(n)? - for (let i = 0; i < chunks.length; i++) { - let chunk = chunks[i]; - if (chunk.isEmpty()) continue; - if (chunk.last().time < this.time) continue; - return i; - } - return -1; - } - - position(chunks) { - let index = this.chunkIndex(chunks); - let xFrom = (index + 0.5) * kChunkWidth; - let yFrom = kChunkHeight - chunks[index].yOffset(this); - return [xFrom, yFrom]; - } - - transitions() { - let transitions = Object.create(null); - let current = this; - while (current) { - let edge = current.edge; - if (edge && edge.isTransition()) { - transitions[edge.name] = edge; - } - current = current.parent() - } - return transitions; - } - - get type() { - return this.edge === void 0 ? 'new' : this.edge.type; - } - - isBootstrapped() { - return this.edge === void 0; - } - - getParents() { - let parents = []; - let current = this.parent(); - while (current) { - parents.push(current); - current = current.parent(); - } - return parents; - } - - static get(id, time = undefined) { - let maps = this.cache.get(id); - if (maps) { - for (let i = 0; i < maps.length; i++) { - // TODO: Implement time based map search - if (maps[i].time === time) { - return maps[i]; - } - } - // default return the latest - return maps[maps.length - 1]; - } - } - - static set(id, map) { - if (this.cache.has(id)) { - this.cache.get(id).push(map); - } else { - this.cache.set(id, [map]); - } - } -} - -MapLogEvent.cache = new Map(); - -// =========================================================================== -class Edge { - constructor(type, name, reason, time, from, to) { - this.type = type; - this.name = name; - this.reason = reason; - this.time = time; - this.from = from; - this.to = to; - } - - getColor() { - return transitionTypeToColor(this.type); - } - - finishSetup() { - let from = this.from; - if (from) from.addEdge(this); - let to = this.to; - if (to === undefined) return; - to.edge = this; - if (from === undefined) return; - if (to === from) throw 'From and to must be distinct.'; - if (to.time < from.time) { - console.error('invalid time order'); - } - let newDepth = from.depth + 1; - if (to.depth > 0 && to.depth != newDepth) { - console.error('Depth has already been initialized'); - } - to.depth = newDepth; - } - - chunkIndex(chunks) { - // Did anybody say O(n)? - for (let i = 0; i < chunks.length; i++) { - let chunk = chunks[i]; - if (chunk.isEmpty()) continue; - if (chunk.last().time < this.time) continue; - return i; - } - return -1; - } - - parentEdge() { - if (!this.from) return undefined; - return this.from.edge; - } - - chainLength() { - let length = 0; - let prev = this; - while (prev) { - prev = this.parent; - length++; - } - return length; - } - - isTransition() { - return this.type === 'Transition' - } - - isFastToSlow() { - return this.type === 'Normalize' - } - - isSlowToFast() { - return this.type === 'SlowToFast' - } - - isInitial() { - return this.type === 'InitialMap' - } - - isBootstrapped() { - return this.type === 'new' - } - - isReplaceDescriptors() { - return this.type === 'ReplaceDescriptors' - } - - isCopyAsPrototype() { - return this.reason === 'CopyAsPrototype' - } - - isOptimizeAsPrototype() { - return this.reason === 'OptimizeAsPrototype' - } - - symbol() { - if (this.isTransition()) return '+'; - if (this.isFastToSlow()) return '⊡'; - if (this.isSlowToFast()) return '⊛'; - if (this.isReplaceDescriptors()) { - if (this.name) return '+'; - return '∥'; - } - return ''; - } - - toString() { - let s = this.symbol(); - if (this.isTransition()) return s + this.name; - if (this.isFastToSlow()) return s + this.reason; - if (this.isCopyAsPrototype()) return s + 'Copy as Prototype'; - if (this.isOptimizeAsPrototype()) { - return s + 'Optimize as Prototype'; - } - if (this.isReplaceDescriptors() && this.name) { - return this.type + ' ' + this.symbol() + this.name; - } - return this.type + ' ' + (this.reason ? this.reason : '') + ' ' + - (this.name ? this.name : '') - } -} - - -// =========================================================================== -class ArgumentsProcessor extends BaseArgumentsProcessor { - getArgsDispatch() { - return { - '--range': - ['range', 'auto,auto', 'Specify the range limit as [start],[end]'], - '--source-map': [ - 'sourceMap', null, - 'Specify the source map that should be used for output' - ] - }; - } - - getDefaultResults() { - return { - logFileName: 'v8.log', - range: 'auto,auto', - }; - } -} - -export { MapProcessor, MapLogEvent, kChunkWidth, kChunkHeight}; diff --git a/deps/v8/tools/system-analyzer/processor.mjs b/deps/v8/tools/system-analyzer/processor.mjs new file mode 100644 index 00000000000000..0634174aefb646 --- /dev/null +++ b/deps/v8/tools/system-analyzer/processor.mjs @@ -0,0 +1,347 @@ +// Copyright 2020 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import { MapLogEvent, Edge } from "./log/map.mjs"; +import { IcLogEvent } from "./log/ic.mjs"; +import { Timeline } from "./timeline.mjs"; +import { LogReader, parseString, parseVarArgs } from "../logreader.mjs"; +import { Profile } from "../profile.mjs"; + +// =========================================================================== + + +class Processor extends LogReader { + #profile = new Profile(); + #mapTimeline = new Timeline(); + #icTimeline = new Timeline(); + #formatPCRegexp = /(.*):[0-9]+:[0-9]+$/; + MAJOR_VERSION = 7; + MINOR_VERSION = 6; + constructor() { + super(); + this.propertyICParser = [ + parseInt, parseInt, parseInt, parseInt, parseString, parseString, + parseString, parseString, parseString, parseString + ]; + this.dispatchTable_ = { + __proto__: null, + 'code-creation': { + parsers: [ + parseString, parseInt, parseInt, parseInt, parseInt, parseString, + parseVarArgs + ], + processor: this.processCodeCreation + }, + 'v8-version': { + parsers: [ + parseInt, parseInt, + ], + processor: this.processV8Version + }, + 'script-source': { + parsers: [parseInt, parseString, parseString], + processor: this.processScriptSource + }, + 'code-move': + { parsers: [parseInt, parseInt], processor: this.processCodeMove }, + 'code-delete': { parsers: [parseInt], processor: this.processCodeDelete }, + 'sfi-move': + { parsers: [parseInt, parseInt], processor: this.processFunctionMove }, + 'map-create': + { parsers: [parseInt, parseString], processor: this.processMapCreate }, + 'map': { + parsers: [ + parseString, parseInt, parseString, parseString, parseInt, parseInt, + parseInt, parseString, parseString + ], + processor: this.processMap + }, + 'map-details': { + parsers: [parseInt, parseString, parseString], + processor: this.processMapDetails + }, + 'LoadGlobalIC': { + parsers: this.propertyICParser, + processor: this.processPropertyIC.bind(this, 'LoadGlobalIC') + }, + 'StoreGlobalIC': { + parsers: this.propertyICParser, + processor: this.processPropertyIC.bind(this, 'StoreGlobalIC') + }, + 'LoadIC': { + parsers: this.propertyICParser, + processor: this.processPropertyIC.bind(this, 'LoadIC') + }, + 'StoreIC': { + parsers: this.propertyICParser, + processor: this.processPropertyIC.bind(this, 'StoreIC') + }, + 'KeyedLoadIC': { + parsers: this.propertyICParser, + processor: this.processPropertyIC.bind(this, 'KeyedLoadIC') + }, + 'KeyedStoreIC': { + parsers: this.propertyICParser, + processor: this.processPropertyIC.bind(this, 'KeyedStoreIC') + }, + 'StoreInArrayLiteralIC': { + parsers: this.propertyICParser, + processor: this.processPropertyIC.bind(this, 'StoreInArrayLiteralIC') + }, + }; + } + + printError(str) { + console.error(str); + throw str + } + + processString(string) { + let end = string.length; + let current = 0; + let next = 0; + let line; + let i = 0; + let entry; + try { + while (current < end) { + next = string.indexOf('\n', current); + if (next === -1) break; + i++; + line = string.substring(current, next); + current = next + 1; + this.processLogLine(line); + } + } catch (e) { + console.error('Error occurred during parsing, trying to continue: ' + e); + } + this.finalize(); + } + + processLogFile(fileName) { + this.collectEntries = true; + this.lastLogFileName_ = fileName; + let i = 1; + let line; + try { + while (line = readline()) { + this.processLogLine(line); + i++; + } + } catch (e) { + console.error( + 'Error occurred during parsing line ' + i + + ', trying to continue: ' + e); + } + this.finalize(); + } + + finalize() { + // TODO(cbruni): print stats; + this.#mapTimeline.transitions = new Map(); + let id = 0; + this.#mapTimeline.forEach(map => { + if (map.isRoot()) id = map.finalizeRootMap(id + 1); + if (map.edge && map.edge.name) { + let edge = map.edge; + let list = this.#mapTimeline.transitions.get(edge.name); + if (list === undefined) { + this.#mapTimeline.transitions.set(edge.name, [edge]); + } else { + list.push(edge); + } + } + }); + } + + /** + * Parser for dynamic code optimization state. + */ + parseState(s) { + switch (s) { + case '': + return Profile.CodeState.COMPILED; + case '~': + return Profile.CodeState.OPTIMIZABLE; + case '*': + return Profile.CodeState.OPTIMIZED; + } + throw new Error('unknown code state: ' + s); + } + + processCodeCreation(type, kind, timestamp, start, size, name, maybe_func) { + if (maybe_func.length) { + let funcAddr = parseInt(maybe_func[0]); + let state = this.parseState(maybe_func[1]); + this.#profile.addFuncCode( + type, name, timestamp, start, size, funcAddr, state); + } else { + this.#profile.addCode(type, name, timestamp, start, size); + } + } + + + processV8Version(majorVersion, minorVersion) { + if ( + (majorVersion == this.MAJOR_VERSION && minorVersion <= this.MINOR_VERSION) + || (majorVersion < this.MAJOR_VERSION)) { + window.alert( + `Unsupported version ${majorVersion}.${minorVersion}. \n` + + `Please use the matching tool for given the V8 version.`); + } + } + + processScriptSource(scriptId, url, source) { + this.#profile.addScriptSource(scriptId, url, source); + } + + processCodeMove(from, to) { + this.#profile.moveCode(from, to); + } + + processCodeDelete(start) { + this.#profile.deleteCode(start); + } + + processFunctionMove(from, to) { + this.#profile.moveFunc(from, to); + } + + formatName(entry) { + if (!entry) return ''; + let name = entry.func.getName(); + let re = /(.*):[0-9]+:[0-9]+$/; + let array = re.exec(name); + if (!array) return name; + return entry.getState() + array[1]; + } + + processPropertyIC( + type, pc, time, line, column, old_state, new_state, map, key, modifier, + slow_reason) { + let fnName = this.functionName(pc); + let parts = fnName.split(' '); + let fileName = parts[1]; + let script = this.getScript(fileName); + // TODO: Use SourcePosition here directly + let entry = new IcLogEvent( + type, fnName, time, line, column, key, old_state, new_state, map, + slow_reason, script); + if (script) { + entry.sourcePosition = script.addSourcePosition(line, column, entry); + } + this.#icTimeline.push(entry); + } + + functionName(pc) { + let entry = this.#profile.findEntry(pc); + return this.formatName(entry); + } + formatPC(pc, line, column) { + let entry = this.#profile.findEntry(pc); + if (!entry) return '' + if (entry.type === 'Builtin') { + return entry.name; + } + let name = entry.func.getName(); + let array = this.#formatPCRegexp.exec(name); + if (array === null) { + entry = name; + } else { + entry = entry.getState() + array[1]; + } + return entry + ':' + line + ':' + column; + } + + processFileName(filePositionLine) { + if (!(/\s/.test(filePositionLine))) return; + filePositionLine = filePositionLine.split(' '); + let file = filePositionLine[1].split(':')[0]; + return file; + } + + processMap(type, time, from, to, pc, line, column, reason, name) { + let time_ = parseInt(time); + if (type === 'Deprecate') return this.deprecateMap(type, time_, from); + let from_ = this.getExistingMap(from, time_); + let to_ = this.getExistingMap(to, time_); + // TODO: use SourcePosition directly. + let edge = new Edge(type, name, reason, time, from_, to_); + to_.filePosition = this.formatPC(pc, line, column); + let fileName = this.processFileName(to_.filePosition); + to_.script = this.getScript(fileName); + if (to_.script) { + to_.sourcePosition = to_.script.addSourcePosition(line, column, to_) + } + edge.finishSetup(); + } + + deprecateMap(type, time, id) { + this.getExistingMap(id, time).deprecate(); + } + + processMapCreate(time, id) { + // map-create events might override existing maps if the addresses get + // recycled. Hence we do not check for existing maps. + let map = this.createMap(id, time); + } + + processMapDetails(time, id, string) { + // TODO(cbruni): fix initial map logging. + let map = this.getExistingMap(id, time); + map.description = string; + } + + createMap(id, time) { + let map = new MapLogEvent(id, time); + this.#mapTimeline.push(map); + return map; + } + + getExistingMap(id, time) { + if (id === '0x000000000000') return undefined; + let map = MapLogEvent.get(id, time); + if (map === undefined) { + console.error('No map details provided: id=' + id); + // Manually patch in a map to continue running. + return this.createMap(id, time); + }; + return map; + } + + getScript(url) { + const script = this.#profile.getScript(url); + // TODO create placeholder script for empty urls. + if (script === undefined) { + console.error(`Could not find script for url: '${url}'`) + } + return script; + } + + get icTimeline() { + return this.#icTimeline; + } + + get mapTimeline() { + return this.#mapTimeline; + } + + get scripts() { + return this.#profile.scripts_.filter(script => script !== undefined); + } +} + +Processor.kProperties = [ + 'type', + 'category', + 'functionName', + 'filePosition', + 'state', + 'key', + 'map', + 'reason', + 'file' +]; + +export { Processor as default }; diff --git a/deps/v8/tools/system-analyzer/source-panel-template.html b/deps/v8/tools/system-analyzer/source-panel-template.html new file mode 100644 index 00000000000000..102d30ea282d02 --- /dev/null +++ b/deps/v8/tools/system-analyzer/source-panel-template.html @@ -0,0 +1,52 @@ + + + + + + +
+

Source Panel

+
+ + +
+
+

+  
+
diff --git a/deps/v8/tools/system-analyzer/source-panel.mjs b/deps/v8/tools/system-analyzer/source-panel.mjs new file mode 100644 index 00000000000000..a10f2bccd27ab5 --- /dev/null +++ b/deps/v8/tools/system-analyzer/source-panel.mjs @@ -0,0 +1,189 @@ +// Copyright 2020 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +import { V8CustomElement, defineCustomElement } from "./helper.mjs"; +import { SelectionEvent, FocusEvent } from "./events.mjs"; +import { MapLogEvent } from "./log/map.mjs"; +import { IcLogEvent } from "./log/ic.mjs"; + +defineCustomElement( + "source-panel", + (templateText) => + class SourcePanel extends V8CustomElement { + #selectedSourcePositions; + #scripts = []; + #script; + constructor() { + super(templateText); + this.scriptDropdown.addEventListener( + 'change', e => this.handleSelectScript(e)); + } + get script() { + return this.$('#script'); + } + get scriptNode() { + return this.$('.scriptNode'); + } + set script(script) { + this.#script = script; + this.renderSourcePanel(); + } + set selectedSourcePositions(sourcePositions) { + this.#selectedSourcePositions = sourcePositions; + } + get selectedSourcePositions() { + return this.#selectedSourcePositions; + } + set data(value) { + this.#scripts = value; + this.initializeScriptDropdown(); + this.script = this.#scripts[0]; + } + get scriptDropdown() { + return this.$("#script-dropdown"); + } + initializeScriptDropdown() { + this.#scripts.sort((a, b) => a.name.localeCompare(b.name)); + let select = this.scriptDropdown; + select.options.length = 0; + for (const script of this.#scripts) { + const option = document.createElement("option"); + option.text = `${script.name} (id=${script.id})`; + option.script = script; + select.add(option); + } + } + + renderSourcePanel() { + const builder = new LineBuilder(this, this.#script); + const scriptNode = builder.createScriptNode(); + const oldScriptNode = this.script.childNodes[1]; + this.script.replaceChild(scriptNode, oldScriptNode); + } + + handleSelectScript(e) { + const option = this.scriptDropdown.options[this.scriptDropdown.selectedIndex]; + this.script = option.script; + } + + handleSourcePositionClick(e) { + let icLogEvents = []; + let mapLogEvents = []; + for (const entry of e.target.sourcePosition.entries) { + if (entry instanceof MapLogEvent) { + mapLogEvents.push(entry); + } else if (entry instanceof IcLogEvent) { + icLogEvents.push(entry); + } + } + if (icLogEvents.length > 0 ) { + this.dispatchEvent(new SelectionEvent(icLogEvents)); + this.dispatchEvent(new FocusEvent(icLogEvents[0])); + } + if (mapLogEvents.length > 0) { + this.dispatchEvent(new SelectionEvent(mapLogEvents)); + this.dispatchEvent(new FocusEvent(mapLogEvents[0])); + } + } + + } +); + + +class SourcePositionIterator { + #entries; + #index = 0; + constructor(sourcePositions) { + this.#entries = sourcePositions; + } + + *forLine(lineIndex) { + while(!this.#done() && this.#current().line === lineIndex) { + yield this.#current(); + this.#next(); + } + } + + #current() { + return this.#entries[this.#index]; + } + + #done() { + return this.#index + 1 >= this.#entries.length; + } + + #next() { + this.#index++; + } +} + +function * lineIterator(source) { + let current = 0; + let line = 1; + while(current < source.length) { + const next = source.indexOf("\n", current); + if (next === -1) break; + yield [line, source.substring(current, next)]; + line++; + current = next + 1; + } + if (current < source.length) yield [line, source.substring(current)]; +} + +class LineBuilder { + #script + #clickHandler + #sourcePositions + + constructor(panel, script) { + this.#script = script; + this.#clickHandler = panel.handleSourcePositionClick.bind(panel); + // TODO: sort on script finalization. + script.sourcePositions.sort((a, b) => { + if (a.line === b.line) return a.column - b.column; + return a.line - b.line; + }) + this.#sourcePositions + = new SourcePositionIterator(script.sourcePositions); + + } + + createScriptNode() { + const scriptNode = document.createElement("pre"); + scriptNode.classList.add('scriptNode'); + for (let [lineIndex, line] of lineIterator(this.#script.source)) { + scriptNode.appendChild(this.#createLineNode(lineIndex, line)); + } + return scriptNode; + } + + #createLineNode(lineIndex, line) { + const lineNode = document.createElement("span"); + let columnIndex = 0; + for (const sourcePosition of this.#sourcePositions.forLine(lineIndex)) { + const nextColumnIndex = sourcePosition.column - 1; + lineNode.appendChild( + document.createTextNode( + line.substring(columnIndex, nextColumnIndex))); + columnIndex = nextColumnIndex; + + lineNode.appendChild( + this.#createMarkerNode(line[columnIndex], sourcePosition)); + columnIndex++; + } + lineNode.appendChild( + document.createTextNode(line.substring(columnIndex) + "\n")); + return lineNode; + } + + #createMarkerNode(text, sourcePosition) { + const marker = document.createElement("mark"); + marker.classList.add('marked'); + marker.textContent = text; + marker.sourcePosition = sourcePosition; + marker.onclick = this.#clickHandler; + return marker; + } + + +} \ No newline at end of file diff --git a/deps/v8/tools/system-analyzer/stats-panel-template.html b/deps/v8/tools/system-analyzer/stats-panel-template.html index 04094b5185aa63..7aa149a5881692 100644 --- a/deps/v8/tools/system-analyzer/stats-panel-template.html +++ b/deps/v8/tools/system-analyzer/stats-panel-template.html @@ -1,9 +1,11 @@ -

Timeline Panel

diff --git a/deps/v8/tools/system-analyzer/timeline-panel.mjs b/deps/v8/tools/system-analyzer/timeline-panel.mjs index 084dccca52c4b8..afe05c24bdd463 100644 --- a/deps/v8/tools/system-analyzer/timeline-panel.mjs +++ b/deps/v8/tools/system-analyzer/timeline-panel.mjs @@ -2,81 +2,92 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {defineCustomElement, V8CustomElement} from './helper.mjs'; +import { defineCustomElement, V8CustomElement } from './helper.mjs'; +import { SynchronizeSelectionEvent } from './events.mjs'; import './timeline/timeline-track.mjs'; defineCustomElement('timeline-panel', (templateText) => - class TimelinePanel extends V8CustomElement { - constructor() { - super(templateText); - this.timelineOverview.addEventListener( - 'mousemove', e => this.handleTimelineIndicatorMove(e)); - this.addEventListener( - 'overviewupdate', e => this.handleOverviewBackgroundUpdate(e)); - this.addEventListener( - 'scrolltrack', e => this.handleTrackScroll(e)); - this.backgroundCanvas = document.createElement('canvas'); - this.isLocked = false; - } + class TimelinePanel extends V8CustomElement { + #timeSelection = { start: 0, end: Infinity }; + constructor() { + super(templateText); + this.timelineOverview.addEventListener( + 'mousemove', e => this.handleTimelineIndicatorMove(e)); + this.addEventListener( + 'scrolltrack', e => this.handleTrackScroll(e)); + this.addEventListener( + SynchronizeSelectionEvent.name, e => this.handleMouseMoveSelection(e)); + this.backgroundCanvas = document.createElement('canvas'); + this.isLocked = false; + } - get timelineOverview() { - return this.$('#timelineOverview'); - } + get timelineOverview() { + return this.$('#timelineOverview'); + } - get timelineOverviewIndicator() { - return this.$('#timelineOverviewIndicator'); - } + get timelineOverviewIndicator() { + return this.$('#timelineOverviewIndicator'); + } - get timelineCanvas() { - return this.timelineTracks[0].timelineCanvas; - } + //TODO(zcankara) Remove dependency to timelineCanvas here + get timelineCanvas() { + return this.timelineTracks[0].timelineCanvas; + } + //TODO(zcankara) Remove dependency to timeline here + get timeline() { + return this.timelineTracks[0].timeline; + } + set nofChunks(count) { + for (const track of this.timelineTracks) { + track.nofChunks = count; + } + } + get nofChunks() { + return this.timelineTracks[0].nofChunks; + } + get timelineTracks() { + return this.$("slot").assignedNodes().filter( + track => track.nodeType === Node.ELEMENT_NODE); + } + handleTrackScroll(event) { + //TODO(zcankara) add forEachTrack helper method + for (const track of this.timelineTracks) { + track.scrollLeft = event.detail; + } + } - get timeline() { - return this.timelineTracks[0].timeline; - } - set nofChunks(count){ - for (const track of this.timelineTracks) { - track.nofChunks = count; + handleMouseMoveSelection(event) { + this.selectionMouseMove(event.start, event.end); } - } - get nofChunks(){ - return this.timelineTracks[0].nofChunks; - } - get timelineTracks(){ - return this.$("slot").assignedNodes().filter( - track => track.nodeType === Node.ELEMENT_NODE); - } - handleTrackScroll(event){ - //TODO(zcankara) add forEachTrack helper method - for (const track of this.timelineTracks) { - track.scrollLeft = event.detail; + + selectionMouseMove(start, end) { + for (const track of this.timelineTracks) { + track.startTime = start; + track.endTime = end; + } } - } - handleTimelineIndicatorMove(event) { - if (event.buttons == 0) return; - let timelineTotalWidth = this.timelineCanvas.offsetWidth; - let factor = this.timelineOverview.offsetWidth / timelineTotalWidth; - for (const track of this.timelineTracks) { - track.timelineIndicatorMove(event.movementX / factor); + + handleTimelineIndicatorMove(event) { + if (event.buttons == 0) return; + let timelineTotalWidth = this.timelineCanvas.offsetWidth; + let factor = this.timelineOverview.offsetWidth / timelineTotalWidth; + for (const track of this.timelineTracks) { + track.timelineIndicatorMove(event.movementX / factor); + } + this.updateOverviewWindow(); } - } - updateOverviewWindow() { - let indicator = this.timelineOverviewIndicator; - let totalIndicatorWidth = + updateOverviewWindow() { + let indicator = this.timelineOverviewIndicator; + let totalIndicatorWidth = this.timelineOverview.offsetWidth; - let div = this.timeline; - let timelineTotalWidth = this.timelineCanvas.offsetWidth; - let factor = totalIndicatorWidth / timelineTotalWidth; - let width = div.offsetWidth * factor; - let left = div.scrollLeft * factor; - indicator.style.width = width + 'px'; - indicator.style.left = left + 'px'; - } - - handleOverviewBackgroundUpdate(e){ - this.timelineOverview.style.backgroundImage = - 'url(' + e.detail + ')'; - } + let div = this.timeline; + let timelineTotalWidth = this.timelineCanvas.offsetWidth; + let factor = totalIndicatorWidth / timelineTotalWidth; + let width = div.offsetWidth * factor; + let left = div.scrollLeft * factor; + indicator.style.width = width + 'px'; + indicator.style.left = left + 'px'; + } -}); + }); diff --git a/deps/v8/tools/system-analyzer/timeline.mjs b/deps/v8/tools/system-analyzer/timeline.mjs index e1f3432f81d1bc..16e12cc4aa4886 100644 --- a/deps/v8/tools/system-analyzer/timeline.mjs +++ b/deps/v8/tools/system-analyzer/timeline.mjs @@ -5,29 +5,30 @@ class Timeline { #values; #selection; + #uniqueTypes; constructor() { this.#values = []; this.startTime = 0; this.endTime = 0; } - get all(){ + get all() { return this.#values; } - get selection(){ + get selection() { return this.#selection; } - set selection(value){ + set selection(value) { this.#selection = value; } - selectTimeRange(start, end){ - this.#selection = this.filter( + selectTimeRange(start, end) { + this.#selection = this.filter( e => e.time >= start && e.time <= end); } - getChunks(windowSizeMs){ + getChunks(windowSizeMs) { //TODO(zcankara) Fill this one return this.chunkSizes(windowSizeMs); } - get values(){ + get values() { //TODO(zcankara) Not to break something delete later return this.#values; } @@ -75,17 +76,35 @@ class Timeline { } first() { - return this.#values.first(); + return this.#values[0]; } last() { - return this.#values.last(); + return this.#values[this.#values.length - 1]; } duration() { return this.last().time - this.first().time; } + groupByTypes() { + this.#uniqueTypes = new Map(); + for (const entry of this.all) { + if (!this.#uniqueTypes.has(entry.type)) { + this.#uniqueTypes.set(entry.type, [entry]); + } else { + this.#uniqueTypes.get(entry.type).push(entry); + } + } + } + + get uniqueTypes() { + if (this.#uniqueTypes === undefined) { + this.groupByTypes(); + } + return this.#uniqueTypes; + } + forEachChunkSize(count, fn) { const increment = this.duration() / count; let currentTime = this.first().time + increment; @@ -216,11 +235,11 @@ class Chunk { return chunk; } - getBreakdown(event_fn){ + getBreakdown(event_fn) { if (event_fn === void 0) { event_fn = each => each; } - let breakdown = {__proto__: null}; + let breakdown = { __proto__: null }; this.items.forEach(each => { const type = event_fn(each); const v = breakdown[type]; @@ -229,10 +248,10 @@ class Chunk { return Object.entries(breakdown).sort((a, b) => a[1] - b[1]); } - filter(){ + filter() { return this.items.filter(map => !map.parent() || !this.has(map.parent())); } } -export {Timeline, Chunk}; +export { Timeline, Chunk }; diff --git a/deps/v8/tools/system-analyzer/timeline/timeline-track-template.html b/deps/v8/tools/system-analyzer/timeline/timeline-track-template.html index f4211750ef2d5e..93f30747be76c7 100644 --- a/deps/v8/tools/system-analyzer/timeline/timeline-track-template.html +++ b/deps/v8/tools/system-analyzer/timeline/timeline-track-template.html @@ -15,11 +15,6 @@ background-color: var(--timeline-background-color); } - #timeline::-webkit-scrollbar { - width: 0; - background-color: transparent; - } - #timelineLabel { transform: rotate(90deg); transform-origin: left bottom 0; @@ -65,29 +60,63 @@ opacity: 0.5; } - #timelineLegend { + #legend { position: relative; float: right; text-align: center; + width: 100%; + max-width: 280px; + padding-left: 20px; + padding-top: 10px; + } + + th, + td { + width: 200px; + text-align: center; + padding: 5px; } .timeline { background-color: var(--timeline-background-color); } - #timelineLegendContent { - float: right; - padding: 20px; - width: 200px; + #timeline .rightHandle, + #timeline .leftHandle { + background-color: rgba(200, 200, 200, 0.5); + height: 100%; + width: 5px; + position: absolute; + z-index: 3; + cursor: col-resize; + } + + #timeline .selection { + background-color: rgba(133, 68, 163, 0.5); + height: 100%; + position: absolute; + z-index: 2; }
-
-

Category

-
-
+
+ + + + + + + + + + + +
ColorTypeCountPercent
+
+
+
Frequency
diff --git a/deps/v8/tools/system-analyzer/timeline/timeline-track.mjs b/deps/v8/tools/system-analyzer/timeline/timeline-track.mjs index cfb0175bd670db..4905b782f22fb0 100644 --- a/deps/v8/tools/system-analyzer/timeline/timeline-track.mjs +++ b/deps/v8/tools/system-analyzer/timeline/timeline-track.mjs @@ -4,31 +4,138 @@ import { defineCustomElement, V8CustomElement, - transitionTypeToColor, CSSColor + typeToColor, CSSColor } from '../helper.mjs'; -import { kChunkWidth, kChunkHeight } from '../map-processor.mjs'; -import { SelectionEvent, FocusEvent, SelectTimeEvent } from '../events.mjs'; +import { kChunkWidth, kChunkHeight } from "../log/map.mjs"; +import { + SelectionEvent, FocusEvent, SelectTimeEvent, + SynchronizeSelectionEvent +} from '../events.mjs'; defineCustomElement('./timeline/timeline-track', (templateText) => class TimelineTrack extends V8CustomElement { + static SELECTION_OFFSET = 20; #timeline; #nofChunks = 400; #chunks; #selectedEntry; #timeToPixel; #timeSelection = { start: 0, end: Infinity }; + #isSelected = false; + #timeStartOffset; + #mouseDownTime; constructor() { super(templateText); - this.timeline.addEventListener("mousedown", - e => this.handleTimeRangeSelectionStart(e)); - this.timeline.addEventListener("mouseup", - e => this.handleTimeRangeSelectionEnd(e)); this.timeline.addEventListener("scroll", e => this.handleTimelineScroll(e)); + this.timeline.addEventListener("mousedown", + e => this.handleTimeSelectionMouseDown(e)); + this.timeline.addEventListener("mouseup", + e => this.handleTimeSelectionMouseUp(e)); + this.timeline.addEventListener("mousemove", + e => this.handleTimeSelectionMouseMove(e)); this.backgroundCanvas = document.createElement('canvas'); this.isLocked = false; } + handleTimeSelectionMouseDown(e) { + if (e.target.className === "chunk") return; + this.#isSelected = true; + this.#mouseDownTime = this.positionToTime(e.clientX); + } + handleTimeSelectionMouseMove(e) { + if (!this.#isSelected) return; + let mouseMoveTime = this.positionToTime(e.clientX); + let startTime = this.#mouseDownTime; + let endTime = mouseMoveTime; + if (this.isOnLeftHandle(e.clientX)) { + startTime = mouseMoveTime; + endTime = this.positionToTime(this.rightHandlePosX); + } else if (this.isOnRightHandle(e.clientX)) { + startTime = this.positionToTime(this.leftHandlePosX); + endTime = mouseMoveTime; + } + this.dispatchEvent(new SynchronizeSelectionEvent( + Math.min(startTime, endTime), + Math.max(startTime, endTime))); + } + handleTimeSelectionMouseUp(e) { + this.#isSelected = false; + this.dispatchEvent(new SelectTimeEvent(this.#timeSelection.start, + this.#timeSelection.end)); + } + isOnLeftHandle(posX) { + return (Math.abs(this.leftHandlePosX - posX) + <= TimelineTrack.SELECTION_OFFSET); + } + isOnRightHandle(posX) { + return (Math.abs(this.rightHandlePosX - posX) + <= TimelineTrack.SELECTION_OFFSET); + } + + + set startTime(value) { + console.assert( + value <= this.#timeSelection.end, + "Selection start time greater than end time!"); + this.#timeSelection.start = value; + this.updateSelection(); + } + set endTime(value) { + console.assert( + value > this.#timeSelection.start, + "Selection end time smaller than start time!"); + this.#timeSelection.end = value; + this.updateSelection(); + } + + updateSelection() { + let startTimePos = this.timeToPosition(this.#timeSelection.start); + let endTimePos = this.timeToPosition(this.#timeSelection.end); + this.leftHandle.style.left = startTimePos + "px"; + this.selection.style.left = startTimePos + "px"; + this.rightHandle.style.left = endTimePos + "px"; + this.selection.style.width = + Math.abs(this.rightHandlePosX - this.leftHandlePosX) + "px"; + } + + get leftHandlePosX() { + let leftHandlePosX = this.leftHandle.getBoundingClientRect().x; + return leftHandlePosX; + } + get rightHandlePosX() { + let rightHandlePosX = this.rightHandle.getBoundingClientRect().x; + return rightHandlePosX; + } + + // Maps the clicked x position to the x position on timeline canvas + positionOnTimeline(posX) { + let rect = this.timeline.getBoundingClientRect(); + let posClickedX = posX - rect.left + this.timeline.scrollLeft; + return posClickedX; + } + + positionToTime(posX) { + let posTimelineX = this.positionOnTimeline(posX) + this.#timeStartOffset; + return posTimelineX / this.#timeToPixel; + } + + timeToPosition(time) { + let posX = time * this.#timeToPixel; + posX -= this.#timeStartOffset + return posX; + } + + get leftHandle() { + return this.$('.leftHandle'); + } + get rightHandle() { + return this.$('.rightHandle'); + } + get selection() { + return this.$('.selection'); + } + get timelineCanvas() { return this.$('#timelineCanvas'); } @@ -41,15 +148,18 @@ defineCustomElement('./timeline/timeline-track', (templateText) => return this.$('#timeline'); } - get timelineLegendContent() { - return this.$('#timelineLegendContent'); + get timelineLegend() { + return this.$('#legend'); } + get timelineLegendContent() { + return this.$('#legendContent'); + } set data(value) { this.#timeline = value; this.updateChunks(); this.updateTimeline(); - this.updateStats(); + this.renderLegend(); } get data() { @@ -82,65 +192,53 @@ defineCustomElement('./timeline/timeline-track', (templateText) => this.timeline.scrollLeft = offset; } - updateStats() { - let unique = new Map(); - for (const entry of this.data.all) { - if (!unique.has(entry.type)) { - unique.set(entry.type, [entry]); - } else { - unique.get(entry.type).push(entry); - } - } - this.renderStatsWindow(unique); - } - - renderStatsWindow(unique) { + renderLegend() { + let timelineLegend = this.timelineLegend; let timelineLegendContent = this.timelineLegendContent; this.removeAllChildren(timelineLegendContent); - let fragment = document.createDocumentFragment(); + let row = this.tr(); + row.entries = this.data.all; + row.classList.add('clickable'); + row.addEventListener('dblclick', e => this.handleEntryTypeDblClick(e)); + row.appendChild(this.td("")); + let td = this.td("All"); + row.appendChild(td); + row.appendChild(this.td(this.data.all.length)); + row.appendChild(this.td("100%")); + timelineLegendContent.appendChild(row); let colorIterator = 0; - unique.forEach((entries, type) => { - let dt = document.createElement("dt"); - dt.innerHTML = entries.length; - dt.style.backgroundColor = transitionTypeToColor(type); - dt.style.color = CSSColor.surfaceColor; - fragment.appendChild(dt); - let dd = document.createElement("dd"); - dd.innerHTML = type; - dd.entries = entries; - dd.addEventListener('dblclick', e => this.handleEntryTypeDblClick(e)); - fragment.appendChild(dd); + this.#timeline.uniqueTypes.forEach((entries, type) => { + let row = this.tr(); + row.entries = entries; + row.classList.add('clickable'); + row.addEventListener('dblclick', e => this.handleEntryTypeDblClick(e)); + let color = typeToColor(type); + if (color !== null) { + let div = this.div(["colorbox"]); + div.style.backgroundColor = color; + row.appendChild(this.td(div)); + } else { + row.appendChild(this.td("")); + } + let td = this.td(type); + row.appendChild(td); + row.appendChild(this.td(entries.length)); + let percent = (entries.length / this.data.all.length) * 100; + row.appendChild(this.td(percent.toFixed(1) + "%")); + timelineLegendContent.appendChild(row); colorIterator += 1; }); - timelineLegendContent.appendChild(fragment); + timelineLegend.appendChild(timelineLegendContent); } handleEntryTypeDblClick(e) { - this.dispatchEvent(new SelectionEvent(e.target.entries)); + this.dispatchEvent(new SelectionEvent(e.target.parentNode.entries)); } timelineIndicatorMove(offset) { this.timeline.scrollLeft += offset; } - handleTimeRangeSelectionStart(e) { - this.#timeSelection.start = this.positionToTime(e.clientX); - } - - handleTimeRangeSelectionEnd(e) { - this.#timeSelection.end = this.positionToTime(e.clientX); - this.dispatchEvent(new SelectTimeEvent( - Math.min(this.#timeSelection.start, this.#timeSelection.end), - Math.max(this.#timeSelection.start, this.#timeSelection.end))); - } - - positionToTime(posX) { - let rect = this.timeline.getBoundingClientRect(); - let posClickedX = posX - rect.left + this.timeline.scrollLeft; - let selectedTime = posClickedX / this.#timeToPixel; - return selectedTime; - } - handleTimelineScroll(e) { let horizontal = e.currentTarget.scrollLeft; this.dispatchEvent(new CustomEvent( @@ -179,14 +277,14 @@ defineCustomElement('./timeline/timeline-track', (templateText) => let type, count; if (true) { chunk.getBreakdown(map => map.type).forEach(([type, count]) => { - ctx.fillStyle = transitionTypeToColor(type); + ctx.fillStyle = typeToColor(type); let height = count / total * kHeight; ctx.fillRect(0, y, kWidth, y + height); y += height; }); } else { chunk.items.forEach(map => { - ctx.fillStyle = transitionTypeToColor(map.type); + ctx.fillStyle = typeToColor(map.type); let y = chunk.yOffset(map); ctx.fillRect(0, y, kWidth, y + 1); }); @@ -205,6 +303,7 @@ defineCustomElement('./timeline/timeline-track', (templateText) => let end = this.data.endTime; let duration = end - start; this.#timeToPixel = chunks.length * kChunkWidth / duration; + this.#timeStartOffset = start * this.#timeToPixel; let addTimestamp = (time, name) => { let timeNode = this.div('timestamp'); timeNode.innerText = name; @@ -219,7 +318,8 @@ defineCustomElement('./timeline/timeline-track', (templateText) => if (chunk.isEmpty()) continue; let node = this.div(); node.className = 'chunk'; - node.style.left = (chunks[i].start * this.#timeToPixel) + 'px'; + node.style.left = + ((chunks[i].start - start) * this.#timeToPixel) + 'px'; node.style.height = height + 'px'; node.chunk = chunk; node.addEventListener('mousemove', e => this.handleChunkMouseMove(e)); @@ -242,7 +342,6 @@ defineCustomElement('./timeline/timeline-track', (templateText) => addTimestamp(time, ((time - start) / 1000) + ' ms'); time += interval; } - this.drawOverview(); this.redraw(); } @@ -269,35 +368,6 @@ defineCustomElement('./timeline/timeline-track', (templateText) => this.dispatchEvent(new SelectionEvent(maps)); } - drawOverview() { - const height = 50; - const kFactor = 2; - let canvas = this.backgroundCanvas; - canvas.height = height; - canvas.width = window.innerWidth; - let ctx = canvas.getContext('2d'); - let chunks = this.data.chunkSizes(canvas.width * kFactor); - let max = chunks.max(); - ctx.clearRect(0, 0, canvas.width, height); - ctx.fillStyle = CSSColor.onBackgroundColor; - ctx.beginPath(); - ctx.moveTo(0, height); - for (let i = 0; i < chunks.length; i++) { - ctx.lineTo(i / kFactor, height - chunks[i] / max * height); - } - ctx.lineTo(chunks.length, height); - ctx.strokeStyle = CSSColor.onBackgroundColor; - ctx.stroke(); - ctx.closePath(); - ctx.fill(); - let imageData = canvas.toDataURL('image/webp', 0.2); - this.dispatchEvent(new CustomEvent( - 'overviewupdate', { - bubbles: true, composed: true, - detail: imageData - })); - } - redraw() { let canvas = this.timelineCanvas; canvas.width = (this.chunks.length + 1) * kChunkWidth; @@ -313,7 +383,7 @@ defineCustomElement('./timeline/timeline-track', (templateText) => } setEdgeStyle(edge, ctx) { - let color = transitionTypeToColor(edge.type); + let color = typeToColor(edge.type); ctx.strokeStyle = color; ctx.fillStyle = color; } @@ -397,7 +467,6 @@ defineCustomElement('./timeline/timeline-track', (templateText) => ctx.lineTo(xTo, yTo); } if (!showLabel) { - ctx.strokeStyle = CSSColor.onBackgroundColor; ctx.stroke(); } else { let centerX, centerY; @@ -408,12 +477,11 @@ defineCustomElement('./timeline/timeline-track', (templateText) => centerX = xTo; centerY = yTo; } - ctx.strokeStyle = CSSColor.onBackgroundColor; ctx.moveTo(centerX, centerY); ctx.lineTo(centerX + offsetX, centerY - labelOffset); ctx.stroke(); ctx.textAlign = 'left'; - ctx.fillStyle = CSSColor.onBackgroundColor; + ctx.fillStyle = typeToColor(edge.type); ctx.fillText( edge.toString(), centerX + offsetX + 2, centerY - labelOffset); } @@ -425,7 +493,6 @@ defineCustomElement('./timeline/timeline-track', (templateText) => if (depth >= max) return; ctx.globalAlpha = 0.5 - depth * (0.3 / max); ctx.strokeStyle = CSSColor.timelineBackgroundColor; - const limit = Math.min(map.children.length, 100) for (let i = 0; i < limit; i++) { let edge = map.children[i]; diff --git a/deps/v8/tools/testrunner/base_runner.py b/deps/v8/tools/testrunner/base_runner.py index 4ca911cc580dd8..54a9e61b160a92 100644 --- a/deps/v8/tools/testrunner/base_runner.py +++ b/deps/v8/tools/testrunner/base_runner.py @@ -169,6 +169,7 @@ def __init__(self, build_config): self.asan = build_config['is_asan'] self.cfi_vptr = build_config['is_cfi'] + self.concurrent_marking = build_config['v8_enable_concurrent_marking'] self.dcheck_always_on = build_config['dcheck_always_on'] self.gcov_coverage = build_config['is_gcov_coverage'] self.is_android = build_config['is_android'] @@ -178,6 +179,8 @@ def __init__(self, build_config): self.msan = build_config['is_msan'] self.no_i18n = not build_config['v8_enable_i18n_support'] self.predictable = build_config['v8_enable_verify_predictable'] + self.simulator_run = (build_config['target_cpu'] != + build_config['v8_target_cpu']) self.tsan = build_config['is_tsan'] # TODO(machenbach): We only have ubsan not ubsan_vptr. self.ubsan_vptr = build_config['is_ubsan_vptr'] @@ -348,9 +351,6 @@ def _add_parser_default_options(self, parser): help="Path to a file for storing json results.") parser.add_option('--slow-tests-cutoff', type="int", default=100, help='Collect N slowest tests') - parser.add_option("--junitout", help="File name of the JUnit output") - parser.add_option("--junittestsuite", default="v8tests", - help="The testsuite name in the JUnit output file") parser.add_option("--exit-after-n-failures", type="int", default=100, help="Exit after the first N failures instead of " "running all tests. Pass 0 to disable this feature.") @@ -369,6 +369,10 @@ def _add_parser_default_options(self, parser): # Test config parser.add_option("--command-prefix", default="", help="Prepended to each shell command used to run a test") + parser.add_option('--dont-skip-slow-simulator-tests', + help='Don\'t skip more slow tests when using a' + ' simulator.', default=False, action='store_true', + dest='dont_skip_simulator_slow_tests') parser.add_option("--extra-flags", action="append", default=[], help="Additional flags to pass to each test command") parser.add_option("--isolates", action="store_true", default=False, @@ -627,13 +631,12 @@ def _get_statusfile_variables(self, options): self.build_config.arch in ['mipsel', 'mips', 'mips64', 'mips64el'] and self.build_config.mips_arch_variant) - # TODO(machenbach): In GN we can derive simulator run from - # target_arch != v8_target_arch in the dumped build config. return { "arch": self.build_config.arch, "asan": self.build_config.asan, "byteorder": sys.byteorder, "cfi_vptr": self.build_config.cfi_vptr, + "concurrent_marking": self.build_config.concurrent_marking, "dcheck_always_on": self.build_config.dcheck_always_on, "deopt_fuzzer": False, "endurance_fuzzer": False, @@ -652,7 +655,8 @@ def _get_statusfile_variables(self, options): "optimize_for_size": "--optimize-for-size" in options.extra_flags, "predictable": self.build_config.predictable, "simd_mips": simd_mips, - "simulator_run": False, + "simulator_run": self.build_config.simulator_run and + not options.dont_skip_simulator_slow_tests, "system": self.target_os, "tsan": self.build_config.tsan, "ubsan_vptr": self.build_config.ubsan_vptr, @@ -753,9 +757,6 @@ def _get_shard_info(self, options): def _create_progress_indicators(self, test_count, options): procs = [PROGRESS_INDICATORS[options.progress]()] - if options.junitout: - procs.append(progress.JUnitTestProgressIndicator(options.junitout, - options.junittestsuite)) if options.json_test_results: procs.append(progress.JsonTestProgressIndicator(self.framework_name)) diff --git a/deps/v8/tools/testrunner/local/junit_output.py b/deps/v8/tools/testrunner/local/junit_output.py deleted file mode 100644 index 52f31ec422a69b..00000000000000 --- a/deps/v8/tools/testrunner/local/junit_output.py +++ /dev/null @@ -1,49 +0,0 @@ -# Copyright 2013 the V8 project authors. 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. - - -import xml.etree.ElementTree as xml - - -class JUnitTestOutput: - def __init__(self, test_suite_name): - self.root = xml.Element("testsuite") - self.root.attrib["name"] = test_suite_name - - def HasRunTest(self, test_name, test_cmd, test_duration, test_failure): - testCaseElement = xml.Element("testcase") - testCaseElement.attrib["name"] = test_name - testCaseElement.attrib["cmd"] = test_cmd - testCaseElement.attrib["time"] = str(round(test_duration, 3)) - if len(test_failure): - failureElement = xml.Element("failure") - failureElement.text = test_failure - testCaseElement.append(failureElement) - self.root.append(testCaseElement) - - def FinishAndWrite(self, f): - xml.ElementTree(self.root).write(f, "UTF-8") diff --git a/deps/v8/tools/testrunner/local/statusfile.py b/deps/v8/tools/testrunner/local/statusfile.py index c8a1b307e41c2f..854abc66554b09 100644 --- a/deps/v8/tools/testrunner/local/statusfile.py +++ b/deps/v8/tools/testrunner/local/statusfile.py @@ -76,6 +76,7 @@ def __init__(self, path, variables): _rules: {variant: {test name: [rule]}} _prefix_rules: {variant: {test name prefix: [rule]}} """ + self.variables = variables with open(path) as f: self._rules, self._prefix_rules = ReadStatusFile(f.read(), variables) diff --git a/deps/v8/tools/testrunner/local/variants.py b/deps/v8/tools/testrunner/local/variants.py index e78571e14f483f..0f8e20536c20ac 100644 --- a/deps/v8/tools/testrunner/local/variants.py +++ b/deps/v8/tools/testrunner/local/variants.py @@ -16,8 +16,12 @@ "jitless": [["--jitless"]], "minor_mc": [["--minor-mc"]], "nci": [["--turbo-nci"]], - "nci_as_highest_tier": [["--turbo-nci-as-highest-tier"]], + "nci_as_midtier": [["--turbo-nci-as-midtier"]], "no_lfa": [["--no-lazy-feedback-allocation"]], + "no_local_heaps": [[ + "--no-local-heaps", + "--no-turbo-direct-heap-access", + "--no-finalize-streaming-on-background"]], # No optimization means disable all optimizations. OptimizeFunctionOnNextCall # would not force optimization too. It turns into a Nop. Please see # https://chromium-review.googlesource.com/c/452620/ for more discussion. @@ -26,8 +30,8 @@ # independent of JS optimizations, so we can combine those configs. "nooptimization": [["--no-opt", "--liftoff", "--no-wasm-tier-up"]], "slow_path": [["--force-slow-path"]], - "stress": [["--stress-opt", "--always-opt", "--no-liftoff", - "--stress-lazy-source-positions"]], + "stress": [["--stress-opt", "--no-liftoff", "--stress-lazy-source-positions"]], + "stress_concurrent_allocation": [["--stress-concurrent-allocation"]], "stress_js_bg_compile_wasm_code_gc": [["--stress-background-compile", "--stress-wasm-code-gc"]], "stress_incremental_marking": [["--stress-incremental-marking"]], @@ -42,6 +46,54 @@ "top_level_await": [["--harmony-top-level-await"]], } +# Flags that lead to a contradiction with the flags provided by the respective +# variant. This depends on the flags specified in ALL_VARIANT_FLAGS and on the +# implications defined in flag-definitions.h. +INCOMPATIBLE_FLAGS_PER_VARIANT = { + "assert_types": ["--no-assert-types"], + "jitless": ["--opt", "--liftoff", "--track-field-types", "--validate-asm"], + "no_wasm_traps": ["--wasm-trap-handler"], + "nooptimization": ["--opt", "--no-liftoff", "--predictable", "--wasm-tier-up"], + "slow_path": ["--no-force-slow-path"], + "stress_incremental_marking": ["--no-stress-incremental-marking"], + "stress_js_bg_compile_wasm_code_gc": ["--no-stress-background-compile"], + "stress": ["--no-stress-opt", "--always-opt", "--no-always-opt", "--liftoff", "--max-inlined-bytecode-size=*", + "--max-inlined-bytecode-size-cumulative=*", "--stress-inline"], + "turboprop": ["--turbo-inlining", "--interrupt-budget=*", "--no-turboprop"], + "code_serializer": ["--cache=after-execute", "--cache=full-code-cache", "--cache=none"], + "no_local_heaps": ["--concurrent-inlining", "--turboprop"], + "experimental_regexp": ["--no-enable-experimental-regexp-engine"], +} + +# Flags that lead to a contradiction under certain build variables. +# This corresponds to the build variables usable in status files as generated +# in _get_statusfile_variables in base_runner.py. +# The conflicts might be directly contradictory flags or be caused by the +# implications defined in flag-definitions.h. +INCOMPATIBLE_FLAGS_PER_BUILD_VARIABLE = { + "lite_mode": ["--no-lazy-feedback-allocation", "--max-semi-space-size=*"] + + INCOMPATIBLE_FLAGS_PER_VARIANT["jitless"], + "predictable": ["--liftoff", "--parallel-compile-tasks", + "--concurrent-recompilation", + "--wasm-num-compilation-tasks=*"], +} + +# Flags that lead to a contradiction when a certain extra-flag is present. +# Such extra-flags are defined for example in infra/testing/builders.pyl or in +# standard_runner.py. +# The conflicts might be directly contradictory flags or be caused by the +# implications defined in flag-definitions.h. +INCOMPATIBLE_FLAGS_PER_EXTRA_FLAG = { + "--concurrent-recompilation": ["--no-concurrent-recompilation", "--predictable"], + "--enable-armv8": ["--no-enable-armv8"], + "--gc-interval=*": ["--gc-interval=*"], + "--no-enable-sse3": ["--enable-sse3"], + "--no-enable-sse4-1": ["--enable-sse4-1"], + "--optimize-for-size": ["--max-semi-space-size=*"], + "--stress-flush-bytecode": ["--no-stress-flush-bytecode"], + "--stress-incremental-marking": INCOMPATIBLE_FLAGS_PER_VARIANT["stress_incremental_marking"], +} + SLOW_VARIANTS = set([ 'stress', 'stress_snapshot', diff --git a/deps/v8/tools/testrunner/num_fuzzer.py b/deps/v8/tools/testrunner/num_fuzzer.py index 7777f4c66d8e85..d5b243ba96d444 100755 --- a/deps/v8/tools/testrunner/num_fuzzer.py +++ b/deps/v8/tools/testrunner/num_fuzzer.py @@ -117,6 +117,10 @@ def _process_options(self, options): def _get_default_suite_names(self): return DEFAULT_SUITES + def _runner_flags(self): + """Extra default flags specific to the test runner implementation.""" + return ['--no-abort-on-contradictory-flags'] + def _get_statusfile_variables(self, options): variables = ( super(NumFuzzer, self)._get_statusfile_variables(options)) diff --git a/deps/v8/tools/testrunner/objects/testcase.py b/deps/v8/tools/testrunner/objects/testcase.py index ac4defd2d78d59..72ca01a4214182 100644 --- a/deps/v8/tools/testrunner/objects/testcase.py +++ b/deps/v8/tools/testrunner/objects/testcase.py @@ -34,6 +34,10 @@ from ..local import command from ..local import statusfile from ..local import utils +from ..local.variants import INCOMPATIBLE_FLAGS_PER_VARIANT +from ..local.variants import INCOMPATIBLE_FLAGS_PER_BUILD_VARIABLE +from ..local.variants import INCOMPATIBLE_FLAGS_PER_EXTRA_FLAG + FLAGS_PATTERN = re.compile(r"//\s+Flags:(.*)") @@ -84,8 +88,10 @@ def __init__(self, suite, path, name, test_config): # Outcomes self._statusfile_outcomes = None - self.expected_outcomes = None + self._expected_outcomes = None + self._checked_flag_contradictions = False self._statusfile_flags = None + self.expected_failure_reason = None self._prepare_outcomes() @@ -116,7 +122,7 @@ def not_flag(outcome): outcomes = self.suite.statusfile.get_outcomes(self.name, self.variant) self._statusfile_outcomes = filter(not_flag, outcomes) self._statusfile_flags = filter(is_flag, outcomes) - self.expected_outcomes = ( + self._expected_outcomes = ( self._parse_status_file_outcomes(self._statusfile_outcomes)) def _parse_status_file_outcomes(self, outcomes): @@ -141,6 +147,60 @@ def _parse_status_file_outcomes(self, outcomes): return outproc.OUTCOMES_FAIL return expected_outcomes or outproc.OUTCOMES_PASS + def allow_timeouts(self): + if self.expected_outcomes == outproc.OUTCOMES_PASS: + self._expected_outcomes = outproc.OUTCOMES_PASS_OR_TIMEOUT + elif self.expected_outcomes == outproc.OUTCOMES_FAIL: + self._expected_outcomes = outproc.OUTCOMES_FAIL_OR_TIMEOUT + elif statusfile.TIMEOUT not in self.expected_outcomes: + self._expected_outcomes = ( + self.expected_outcomes + [statusfile.TIMEOUT]) + + @property + def expected_outcomes(self): + def normalize_flag(flag): + return flag.replace("_", "-").replace("--no-", "--no") + + def has_flag(conflicting_flag, flags): + conflicting_flag = normalize_flag(conflicting_flag) + if conflicting_flag in flags: + return True + if conflicting_flag.endswith("*"): + return any(flag.startswith(conflicting_flag[:-1]) for flag in flags) + return False + + def check_flags(incompatible_flags, actual_flags, rule): + for incompatible_flag in incompatible_flags: + if has_flag(incompatible_flag, actual_flags): + self._statusfile_outcomes = outproc.OUTCOMES_FAIL + self._expected_outcomes = outproc.OUTCOMES_FAIL + self.expected_failure_reason = ("Rule " + rule + " in " + + "tools/testrunner/local/variants.py expected a flag " + + "contradiction error with " + incompatible_flag + ".") + + if not self._checked_flag_contradictions: + self._checked_flag_contradictions = True + + file_specific_flags = (self._get_source_flags() + self._get_suite_flags() + + self._get_statusfile_flags()) + file_specific_flags = [normalize_flag(flag) for flag in file_specific_flags] + extra_flags = [normalize_flag(flag) for flag in self._get_extra_flags()] + + if self.variant in INCOMPATIBLE_FLAGS_PER_VARIANT: + check_flags(INCOMPATIBLE_FLAGS_PER_VARIANT[self.variant], file_specific_flags, + "INCOMPATIBLE_FLAGS_PER_VARIANT[\""+self.variant+"\"]") + + for variable, incompatible_flags in INCOMPATIBLE_FLAGS_PER_BUILD_VARIABLE.items(): + if self.suite.statusfile.variables[variable]: + check_flags(incompatible_flags, file_specific_flags, + "INCOMPATIBLE_FLAGS_PER_BUILD_VARIABLE[\""+variable+"\"]") + + for extra_flag, incompatible_flags in INCOMPATIBLE_FLAGS_PER_EXTRA_FLAG.items(): + if has_flag(extra_flag, extra_flags): + check_flags(incompatible_flags, file_specific_flags, + "INCOMPATIBLE_FLAGS_PER_EXTRA_FLAG[\""+extra_flag+"\"]") + return self._expected_outcomes + @property def do_skip(self): return (statusfile.SKIP in self._statusfile_outcomes and @@ -183,9 +243,9 @@ def _get_cmd_params(self): """Gets command parameters and combines them in the following order: - files [empty by default] - random seed + - mode flags (based on chosen mode) - extra flags (from command line) - user flags (variant/fuzzer flags) - - mode flags (based on chosen mode) - source flags (from source code) [empty by default] - test-suite flags - statusfile flags @@ -196,9 +256,9 @@ def _get_cmd_params(self): return ( self._get_files_params() + self._get_random_seed_flags() + + self._get_mode_flags() + self._get_extra_flags() + self._get_variant_flags() + - self._get_mode_flags() + self._get_source_flags() + self._get_suite_flags() + self._get_statusfile_flags() diff --git a/deps/v8/tools/testrunner/standard_runner.py b/deps/v8/tools/testrunner/standard_runner.py index 99d36bf2f85044..ff5839111068d5 100755 --- a/deps/v8/tools/testrunner/standard_runner.py +++ b/deps/v8/tools/testrunner/standard_runner.py @@ -28,8 +28,6 @@ from testrunner.testproc.variant import VariantProc -ARCH_GUESS = utils.DefaultArch() - VARIANTS = ['default'] MORE_VARIANTS = [ @@ -109,11 +107,6 @@ def _add_parser_options(self, parser): help='Regard pass|fail tests (run|skip|dontcare)') parser.add_option('--quickcheck', default=False, action='store_true', help=('Quick check mode (skip slow tests)')) - parser.add_option('--dont-skip-slow-simulator-tests', - help='Don\'t skip more slow tests when using a' - ' simulator.', - default=False, action='store_true', - dest='dont_skip_simulator_slow_tests') # Stress modes parser.add_option('--gc-stress', @@ -282,19 +275,10 @@ def _get_statusfile_variables(self, options): variables = ( super(StandardTestRunner, self)._get_statusfile_variables(options)) - simulator_run = ( - not options.dont_skip_simulator_slow_tests and - self.build_config.arch in [ - 'arm64', 'arm', 'mipsel', 'mips', 'mips64', 'mips64el', 'ppc', - 'ppc64', 's390', 's390x'] and - bool(ARCH_GUESS) and - self.build_config.arch != ARCH_GUESS) - variables.update({ 'gc_stress': options.gc_stress or options.random_gc_stress, 'gc_fuzzer': options.random_gc_stress, 'novfp3': options.novfp3, - 'simulator_run': simulator_run, }) return variables diff --git a/deps/v8/tools/testrunner/testproc/expectation.py b/deps/v8/tools/testrunner/testproc/expectation.py index fdc9e3e1b040aa..285a599a742cea 100644 --- a/deps/v8/tools/testrunner/testproc/expectation.py +++ b/deps/v8/tools/testrunner/testproc/expectation.py @@ -14,14 +14,7 @@ def __init__(self): def _next_test(self, test): subtest = self._create_subtest(test, 'no_timeout') - if subtest.expected_outcomes == outproc.OUTCOMES_PASS: - subtest.expected_outcomes = outproc.OUTCOMES_PASS_OR_TIMEOUT - elif subtest.expected_outcomes == outproc.OUTCOMES_FAIL: - subtest.expected_outcomes = outproc.OUTCOMES_FAIL_OR_TIMEOUT - elif statusfile.TIMEOUT not in subtest.expected_outcomes: - subtest.expected_outcomes = ( - subtest.expected_outcomes + [statusfile.TIMEOUT]) - + subtest.allow_timeouts() return self._send_test(subtest) def _result_for(self, test, subtest, result): diff --git a/deps/v8/tools/testrunner/testproc/progress.py b/deps/v8/tools/testrunner/testproc/progress.py index d0e62046f41533..9ff943a5c2b4bd 100644 --- a/deps/v8/tools/testrunner/testproc/progress.py +++ b/deps/v8/tools/testrunner/testproc/progress.py @@ -15,7 +15,6 @@ from . import base from . import util -from ..local import junit_output def print_failure_header(test): @@ -149,7 +148,7 @@ def _message(self, test, result): outcome = 'FAIL' else: outcome = 'pass' - return 'Done running %s %s: %s' % ( + return '%s %s: %s' % ( test, test.variant or 'default', outcome) def _on_result_for(self, test, result): @@ -269,6 +268,8 @@ def _on_result_for(self, test, result): else: if test.is_fail: self.printFormatted('failure', "--- UNEXPECTED PASS ---") + if test.expected_failure_reason != None: + self.printFormatted('failure', test.expected_failure_reason) else: self.printFormatted('failure', "--- FAILED ---") @@ -347,45 +348,6 @@ def _clear_line(self, last_length): print(("\r" + (" " * last_length) + "\r"), end='') -class JUnitTestProgressIndicator(ProgressIndicator): - def __init__(self, junitout, junittestsuite): - super(JUnitTestProgressIndicator, self).__init__() - self._requirement = base.DROP_PASS_STDOUT - - self.outputter = junit_output.JUnitTestOutput(junittestsuite) - if junitout: - self.outfile = open(junitout, "w") - else: - self.outfile = sys.stdout - - def _on_result_for(self, test, result): - # TODO(majeski): Support for dummy/grouped results - fail_text = "" - output = result.output - if result.has_unexpected_output: - stdout = output.stdout.strip() - if len(stdout): - fail_text += "stdout:\n%s\n" % stdout - stderr = output.stderr.strip() - if len(stderr): - fail_text += "stderr:\n%s\n" % stderr - fail_text += "Command: %s" % result.cmd.to_string() - if output.HasCrashed(): - fail_text += "exit code: %d\n--- CRASHED ---" % output.exit_code - if output.HasTimedOut(): - fail_text += "--- TIMEOUT ---" - self.outputter.HasRunTest( - test_name=str(test), - test_cmd=result.cmd.to_string(relative=True), - test_duration=output.duration, - test_failure=fail_text) - - def finished(self): - self.outputter.FinishAndWrite(self.outfile) - if self.outfile != sys.stdout: - self.outfile.close() - - class JsonTestProgressIndicator(ProgressIndicator): def __init__(self, framework_name): super(JsonTestProgressIndicator, self).__init__() diff --git a/deps/v8/tools/tick-processor.html b/deps/v8/tools/tick-processor.html index 32f8d6608ef8ab..ecb794ec949c5b 100644 --- a/deps/v8/tools/tick-processor.html +++ b/deps/v8/tools/tick-processor.html @@ -42,24 +42,17 @@ margin-top: 0px; } - - - - - - - - - - - - + diff --git a/deps/v8/tools/tickprocessor-driver.mjs b/deps/v8/tools/tickprocessor-driver.mjs new file mode 100644 index 00000000000000..a8cce2f708f2cf --- /dev/null +++ b/deps/v8/tools/tickprocessor-driver.mjs @@ -0,0 +1,88 @@ +// Copyright 2012 the V8 project authors. 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. + +import { WebInspector} from "./sourcemap.mjs"; +import { + ArgumentsProcessor, TickProcessor, UnixCppEntriesProvider, + WindowsCppEntriesProvider, MacCppEntriesProvider, readFile, + } from "./tickprocessor.mjs"; + +// Tick Processor's code flow. + +function processArguments(args) { + var processor = new ArgumentsProcessor(args); + if (processor.parse()) { + return processor.result(); + } else { + processor.printUsageAndExit(); + } +} + +function initSourceMapSupport() { + // Pull dev tools source maps into our name space. + SourceMap = WebInspector.SourceMap; + + // Overwrite the load function to load scripts synchronously. + SourceMap.load = function(sourceMapURL) { + var content = readFile(sourceMapURL); + var sourceMapObject = (JSON.parse(content)); + return new SourceMap(sourceMapURL, sourceMapObject); + }; +} + +var entriesProviders = { + 'unix': UnixCppEntriesProvider, + 'windows': WindowsCppEntriesProvider, + 'mac': MacCppEntriesProvider +}; + +var params = processArguments(arguments); +var sourceMap = null; +if (params.sourceMap) { + initSourceMapSupport(); + sourceMap = SourceMap.load(params.sourceMap); +} +var tickProcessor = new TickProcessor( + new (entriesProviders[params.platform])(params.nm, params.objdump, params.targetRootFS, + params.apkEmbeddedLibrary), + params.separateIc, + params.separateBytecodes, + params.separateBuiltins, + params.separateStubs, + params.callGraphSize, + params.ignoreUnknown, + params.stateFilter, + params.distortion, + params.range, + sourceMap, + params.timedRange, + params.pairwiseTimedRange, + params.onlySummary, + params.runtimeTimerFilter, + params.preprocessJson); +tickProcessor.processLogFile(params.logFileName); +tickProcessor.printStatistics(); diff --git a/deps/v8/tools/tickprocessor.mjs b/deps/v8/tools/tickprocessor.mjs new file mode 100644 index 00000000000000..b5aff3b23f57fd --- /dev/null +++ b/deps/v8/tools/tickprocessor.mjs @@ -0,0 +1,983 @@ +// Copyright 2012 the V8 project authors. 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. + +import { LogReader, parseString, parseVarArgs } from "./logreader.mjs"; +import { BaseArgumentsProcessor, parseBool } from "./arguments.mjs"; +import { Profile, JsonProfile } from "./profile.mjs"; +import { ViewBuilder } from "./profile_view.mjs"; + + +export function inherits(childCtor, parentCtor) { + childCtor.prototype.__proto__ = parentCtor.prototype; +}; + + +function V8Profile(separateIc, separateBytecodes, separateBuiltins, + separateStubs) { + Profile.call(this); + var regexps = []; + if (!separateIc) regexps.push(V8Profile.IC_RE); + if (!separateBytecodes) regexps.push(V8Profile.BYTECODES_RE); + if (!separateBuiltins) regexps.push(V8Profile.BUILTINS_RE); + if (!separateStubs) regexps.push(V8Profile.STUBS_RE); + if (regexps.length > 0) { + this.skipThisFunction = function(name) { + for (var i=0; i this.range_end) { + return; + } + this.ticks_.total++; + if (vmState == TickProcessor.VmStates.GC) this.ticks_.gc++; + if (!this.includeTick(vmState)) { + this.ticks_.excluded++; + return; + } + if (is_external_callback) { + // Don't use PC when in external callback code, as it can point + // inside callback's code, and we will erroneously report + // that a callback calls itself. Instead we use tos_or_external_callback, + // as simply resetting PC will produce unaccounted ticks. + pc = tos_or_external_callback; + tos_or_external_callback = 0; + } else if (tos_or_external_callback) { + // Find out, if top of stack was pointing inside a JS function + // meaning that we have encountered a frameless invocation. + var funcEntry = this.profile_.findEntry(tos_or_external_callback); + if (!funcEntry || !funcEntry.isJSFunction || !funcEntry.isJSFunction()) { + tos_or_external_callback = 0; + } + } + + this.profile_.recordTick( + ns_since_start, vmState, + this.processStack(pc, tos_or_external_callback, stack)); +}; + + +TickProcessor.prototype.advanceDistortion = function() { + this.distortion += this.distortion_per_entry; +} + + +TickProcessor.prototype.processHeapSampleBegin = function(space, state, ticks) { + if (space != 'Heap') return; + this.currentProducerProfile_ = new CallTree(); +}; + + +TickProcessor.prototype.processHeapSampleEnd = function(space, state) { + if (space != 'Heap' || !this.currentProducerProfile_) return; + + print('Generation ' + this.generation_ + ':'); + var tree = this.currentProducerProfile_; + tree.computeTotalWeights(); + var producersView = this.viewBuilder_.buildView(tree); + // Sort by total time, desc, then by name, desc. + producersView.sort(function(rec1, rec2) { + return rec2.totalTime - rec1.totalTime || + (rec2.internalFuncName < rec1.internalFuncName ? -1 : 1); }); + this.printHeavyProfile(producersView.head.children); + + this.currentProducerProfile_ = null; + this.generation_++; +}; + + +TickProcessor.prototype.printStatistics = function() { + if (this.preprocessJson) { + this.profile_.writeJson(); + return; + } + + print('Statistical profiling result from ' + this.lastLogFileName_ + + ', (' + this.ticks_.total + + ' ticks, ' + this.ticks_.unaccounted + ' unaccounted, ' + + this.ticks_.excluded + ' excluded).'); + + if (this.ticks_.total == 0) return; + + var flatProfile = this.profile_.getFlatProfile(); + var flatView = this.viewBuilder_.buildView(flatProfile); + // Sort by self time, desc, then by name, desc. + flatView.sort(function(rec1, rec2) { + return rec2.selfTime - rec1.selfTime || + (rec2.internalFuncName < rec1.internalFuncName ? -1 : 1); }); + var totalTicks = this.ticks_.total; + if (this.ignoreUnknown_) { + totalTicks -= this.ticks_.unaccounted; + } + var printAllTicks = !this.onlySummary_; + + // Count library ticks + var flatViewNodes = flatView.head.children; + var self = this; + + var libraryTicks = 0; + if(printAllTicks) this.printHeader('Shared libraries'); + this.printEntries(flatViewNodes, totalTicks, null, + function(name) { return self.isSharedLibrary(name); }, + function(rec) { libraryTicks += rec.selfTime; }, printAllTicks); + var nonLibraryTicks = totalTicks - libraryTicks; + + var jsTicks = 0; + if(printAllTicks) this.printHeader('JavaScript'); + this.printEntries(flatViewNodes, totalTicks, nonLibraryTicks, + function(name) { return self.isJsCode(name); }, + function(rec) { jsTicks += rec.selfTime; }, printAllTicks); + + var cppTicks = 0; + if(printAllTicks) this.printHeader('C++'); + this.printEntries(flatViewNodes, totalTicks, nonLibraryTicks, + function(name) { return self.isCppCode(name); }, + function(rec) { cppTicks += rec.selfTime; }, printAllTicks); + + this.printHeader('Summary'); + this.printLine('JavaScript', jsTicks, totalTicks, nonLibraryTicks); + this.printLine('C++', cppTicks, totalTicks, nonLibraryTicks); + this.printLine('GC', this.ticks_.gc, totalTicks, nonLibraryTicks); + this.printLine('Shared libraries', libraryTicks, totalTicks, null); + if (!this.ignoreUnknown_ && this.ticks_.unaccounted > 0) { + this.printLine('Unaccounted', this.ticks_.unaccounted, + this.ticks_.total, null); + } + + if(printAllTicks) { + print('\n [C++ entry points]:'); + print(' ticks cpp total name'); + var c_entry_functions = this.profile_.getCEntryProfile(); + var total_c_entry = c_entry_functions[0].ticks; + for (var i = 1; i < c_entry_functions.length; i++) { + const c = c_entry_functions[i]; + this.printLine(c.name, c.ticks, total_c_entry, totalTicks); + } + + this.printHeavyProfHeader(); + var heavyProfile = this.profile_.getBottomUpProfile(); + var heavyView = this.viewBuilder_.buildView(heavyProfile); + // To show the same percentages as in the flat profile. + heavyView.head.totalTime = totalTicks; + // Sort by total time, desc, then by name, desc. + heavyView.sort(function(rec1, rec2) { + return rec2.totalTime - rec1.totalTime || + (rec2.internalFuncName < rec1.internalFuncName ? -1 : 1); }); + this.printHeavyProfile(heavyView.head.children); + } +}; + + +function padLeft(s, len) { + s = s.toString(); + if (s.length < len) { + var padLength = len - s.length; + if (!(padLength in padLeft)) { + padLeft[padLength] = new Array(padLength + 1).join(' '); + } + s = padLeft[padLength] + s; + } + return s; +}; + + +TickProcessor.prototype.printHeader = function(headerTitle) { + print('\n [' + headerTitle + ']:'); + print(' ticks total nonlib name'); +}; + + +TickProcessor.prototype.printLine = function( + entry, ticks, totalTicks, nonLibTicks) { + var pct = ticks * 100 / totalTicks; + var nonLibPct = nonLibTicks != null + ? padLeft((ticks * 100 / nonLibTicks).toFixed(1), 5) + '% ' + : ' '; + print(' ' + padLeft(ticks, 5) + ' ' + + padLeft(pct.toFixed(1), 5) + '% ' + + nonLibPct + + entry); +} + +TickProcessor.prototype.printHeavyProfHeader = function() { + print('\n [Bottom up (heavy) profile]:'); + print(' Note: percentage shows a share of a particular caller in the ' + + 'total\n' + + ' amount of its parent calls.'); + print(' Callers occupying less than ' + + TickProcessor.CALL_PROFILE_CUTOFF_PCT.toFixed(1) + + '% are not shown.\n'); + print(' ticks parent name'); +}; + + +TickProcessor.prototype.processProfile = function( + profile, filterP, func) { + for (var i = 0, n = profile.length; i < n; ++i) { + var rec = profile[i]; + if (!filterP(rec.internalFuncName)) { + continue; + } + func(rec); + } +}; + +TickProcessor.prototype.getLineAndColumn = function(name) { + var re = /:([0-9]+):([0-9]+)$/; + var array = re.exec(name); + if (!array) { + return null; + } + return {line: array[1], column: array[2]}; +} + +TickProcessor.prototype.hasSourceMap = function() { + return this.sourceMap != null; +}; + + +TickProcessor.prototype.formatFunctionName = function(funcName) { + if (!this.hasSourceMap()) { + return funcName; + } + var lc = this.getLineAndColumn(funcName); + if (lc == null) { + return funcName; + } + // in source maps lines and columns are zero based + var lineNumber = lc.line - 1; + var column = lc.column - 1; + var entry = this.sourceMap.findEntry(lineNumber, column); + var sourceFile = entry[2]; + var sourceLine = entry[3] + 1; + var sourceColumn = entry[4] + 1; + + return sourceFile + ':' + sourceLine + ':' + sourceColumn + ' -> ' + funcName; +}; + +TickProcessor.prototype.printEntries = function( + profile, totalTicks, nonLibTicks, filterP, callback, printAllTicks) { + var that = this; + this.processProfile(profile, filterP, function (rec) { + if (rec.selfTime == 0) return; + callback(rec); + var funcName = that.formatFunctionName(rec.internalFuncName); + if(printAllTicks) { + that.printLine(funcName, rec.selfTime, totalTicks, nonLibTicks); + } + }); +}; + + +TickProcessor.prototype.printHeavyProfile = function(profile, opt_indent) { + var self = this; + var indent = opt_indent || 0; + var indentStr = padLeft('', indent); + this.processProfile(profile, function() { return true; }, function (rec) { + // Cut off too infrequent callers. + if (rec.parentTotalPercent < TickProcessor.CALL_PROFILE_CUTOFF_PCT) return; + var funcName = self.formatFunctionName(rec.internalFuncName); + print(' ' + padLeft(rec.totalTime, 5) + ' ' + + padLeft(rec.parentTotalPercent.toFixed(1), 5) + '% ' + + indentStr + funcName); + // Limit backtrace depth. + if (indent < 2 * self.callGraphSize_) { + self.printHeavyProfile(rec.children, indent + 2); + } + // Delimit top-level functions. + if (indent == 0) { + print(''); + } + }); +}; + + +function CppEntriesProvider() { +}; + + +CppEntriesProvider.prototype.parseVmSymbols = function( + libName, libStart, libEnd, libASLRSlide, processorFunc) { + this.loadSymbols(libName); + + var lastUnknownSize; + var lastAdded; + + function inRange(funcInfo, start, end) { + return funcInfo.start >= start && funcInfo.end <= end; + } + + function addEntry(funcInfo) { + // Several functions can be mapped onto the same address. To avoid + // creating zero-sized entries, skip such duplicates. + // Also double-check that function belongs to the library address space. + + if (lastUnknownSize && + lastUnknownSize.start < funcInfo.start) { + // Try to update lastUnknownSize based on new entries start position. + lastUnknownSize.end = funcInfo.start; + if ((!lastAdded || !inRange(lastUnknownSize, lastAdded.start, + lastAdded.end)) && + inRange(lastUnknownSize, libStart, libEnd)) { + processorFunc(lastUnknownSize.name, lastUnknownSize.start, + lastUnknownSize.end); + lastAdded = lastUnknownSize; + } + } + lastUnknownSize = undefined; + + if (funcInfo.end) { + // Skip duplicates that have the same start address as the last added. + if ((!lastAdded || lastAdded.start != funcInfo.start) && + inRange(funcInfo, libStart, libEnd)) { + processorFunc(funcInfo.name, funcInfo.start, funcInfo.end); + lastAdded = funcInfo; + } + } else { + // If a funcInfo doesn't have an end, try to match it up with then next + // entry. + lastUnknownSize = funcInfo; + } + } + + while (true) { + var funcInfo = this.parseNextLine(); + if (funcInfo === null) { + continue; + } else if (funcInfo === false) { + break; + } + if (funcInfo.start < libStart - libASLRSlide && + funcInfo.start < libEnd - libStart) { + funcInfo.start += libStart; + } else { + funcInfo.start += libASLRSlide; + } + if (funcInfo.size) { + funcInfo.end = funcInfo.start + funcInfo.size; + } + addEntry(funcInfo); + } + addEntry({name: '', start: libEnd}); +}; + + +CppEntriesProvider.prototype.loadSymbols = function(libName) { +}; + + +CppEntriesProvider.prototype.parseNextLine = function() { + return false; +}; + + +export function UnixCppEntriesProvider(nmExec, objdumpExec, targetRootFS, apkEmbeddedLibrary) { + this.symbols = []; + // File offset of a symbol minus the virtual address of a symbol found in + // the symbol table. + this.fileOffsetMinusVma = 0; + this.parsePos = 0; + this.nmExec = nmExec; + this.objdumpExec = objdumpExec; + this.targetRootFS = targetRootFS; + this.apkEmbeddedLibrary = apkEmbeddedLibrary; + this.FUNC_RE = /^([0-9a-fA-F]{8,16}) ([0-9a-fA-F]{8,16} )?[tTwW] (.*)$/; +}; +inherits(UnixCppEntriesProvider, CppEntriesProvider); + + +UnixCppEntriesProvider.prototype.loadSymbols = function(libName) { + this.parsePos = 0; + if (this.apkEmbeddedLibrary && libName.endsWith('.apk')) { + libName = this.apkEmbeddedLibrary; + } + if (this.targetRootFS) { + libName = libName.substring(libName.lastIndexOf('/') + 1); + libName = this.targetRootFS + libName; + } + try { + this.symbols = [ + os.system(this.nmExec, ['-C', '-n', '-S', libName], -1, -1), + os.system(this.nmExec, ['-C', '-n', '-S', '-D', libName], -1, -1) + ]; + + const objdumpOutput = os.system(this.objdumpExec, ['-h', libName], -1, -1); + for (const line of objdumpOutput.split('\n')) { + const [,sectionName,,vma,,fileOffset] = line.trim().split(/\s+/); + if (sectionName === ".text") { + this.fileOffsetMinusVma = parseInt(fileOffset, 16) - parseInt(vma, 16); + } + } + } catch (e) { + // If the library cannot be found on this system let's not panic. + this.symbols = ['', '']; + } +}; + + +UnixCppEntriesProvider.prototype.parseNextLine = function() { + if (this.symbols.length == 0) { + return false; + } + var lineEndPos = this.symbols[0].indexOf('\n', this.parsePos); + if (lineEndPos == -1) { + this.symbols.shift(); + this.parsePos = 0; + return this.parseNextLine(); + } + + var line = this.symbols[0].substring(this.parsePos, lineEndPos); + this.parsePos = lineEndPos + 1; + var fields = line.match(this.FUNC_RE); + var funcInfo = null; + if (fields) { + funcInfo = { name: fields[3], start: parseInt(fields[1], 16) + this.fileOffsetMinusVma }; + if (fields[2]) { + funcInfo.size = parseInt(fields[2], 16); + } + } + return funcInfo; +}; + + +export function MacCppEntriesProvider(nmExec, objdumpExec, targetRootFS, apkEmbeddedLibrary) { + UnixCppEntriesProvider.call(this, nmExec, objdumpExec, targetRootFS, apkEmbeddedLibrary); + // Note an empty group. It is required, as UnixCppEntriesProvider expects 3 groups. + this.FUNC_RE = /^([0-9a-fA-F]{8,16})() (.*)$/; +}; +inherits(MacCppEntriesProvider, UnixCppEntriesProvider); + + +MacCppEntriesProvider.prototype.loadSymbols = function(libName) { + this.parsePos = 0; + libName = this.targetRootFS + libName; + + // It seems that in OS X `nm` thinks that `-f` is a format option, not a + // "flat" display option flag. + try { + this.symbols = [os.system(this.nmExec, ['-n', libName], -1, -1), '']; + } catch (e) { + // If the library cannot be found on this system let's not panic. + this.symbols = ''; + } +}; + + +export function WindowsCppEntriesProvider(_ignored_nmExec, _ignored_objdumpExec, targetRootFS, + _ignored_apkEmbeddedLibrary) { + this.targetRootFS = targetRootFS; + this.symbols = ''; + this.parsePos = 0; +}; +inherits(WindowsCppEntriesProvider, CppEntriesProvider); + + +WindowsCppEntriesProvider.FILENAME_RE = /^(.*)\.([^.]+)$/; + + +WindowsCppEntriesProvider.FUNC_RE = + /^\s+0001:[0-9a-fA-F]{8}\s+([_\?@$0-9a-zA-Z]+)\s+([0-9a-fA-F]{8}).*$/; + + +WindowsCppEntriesProvider.IMAGE_BASE_RE = + /^\s+0000:00000000\s+___ImageBase\s+([0-9a-fA-F]{8}).*$/; + + +// This is almost a constant on Windows. +WindowsCppEntriesProvider.EXE_IMAGE_BASE = 0x00400000; + + +WindowsCppEntriesProvider.prototype.loadSymbols = function(libName) { + libName = this.targetRootFS + libName; + var fileNameFields = libName.match(WindowsCppEntriesProvider.FILENAME_RE); + if (!fileNameFields) return; + var mapFileName = fileNameFields[1] + '.map'; + this.moduleType_ = fileNameFields[2].toLowerCase(); + try { + this.symbols = read(mapFileName); + } catch (e) { + // If .map file cannot be found let's not panic. + this.symbols = ''; + } +}; + + +WindowsCppEntriesProvider.prototype.parseNextLine = function() { + var lineEndPos = this.symbols.indexOf('\r\n', this.parsePos); + if (lineEndPos == -1) { + return false; + } + + var line = this.symbols.substring(this.parsePos, lineEndPos); + this.parsePos = lineEndPos + 2; + + // Image base entry is above all other symbols, so we can just + // terminate parsing. + var imageBaseFields = line.match(WindowsCppEntriesProvider.IMAGE_BASE_RE); + if (imageBaseFields) { + var imageBase = parseInt(imageBaseFields[1], 16); + if ((this.moduleType_ == 'exe') != + (imageBase == WindowsCppEntriesProvider.EXE_IMAGE_BASE)) { + return false; + } + } + + var fields = line.match(WindowsCppEntriesProvider.FUNC_RE); + return fields ? + { name: this.unmangleName(fields[1]), start: parseInt(fields[2], 16) } : + null; +}; + + +/** + * Performs very simple unmangling of C++ names. + * + * Does not handle arguments and template arguments. The mangled names have + * the form: + * + * ?LookupInDescriptor@JSObject@internal@v8@@...arguments info... + */ +WindowsCppEntriesProvider.prototype.unmangleName = function(name) { + // Empty or non-mangled name. + if (name.length < 1 || name.charAt(0) != '?') return name; + var nameEndPos = name.indexOf('@@'); + var components = name.substring(1, nameEndPos).split('@'); + components.reverse(); + return components.join('::'); +}; + + +export class ArgumentsProcessor extends BaseArgumentsProcessor { + getArgsDispatch() { + let dispatch = { + '-j': ['stateFilter', TickProcessor.VmStates.JS, + 'Show only ticks from JS VM state'], + '-g': ['stateFilter', TickProcessor.VmStates.GC, + 'Show only ticks from GC VM state'], + '-p': ['stateFilter', TickProcessor.VmStates.PARSER, + 'Show only ticks from PARSER VM state'], + '-b': ['stateFilter', TickProcessor.VmStates.BYTECODE_COMPILER, + 'Show only ticks from BYTECODE_COMPILER VM state'], + '-c': ['stateFilter', TickProcessor.VmStates.COMPILER, + 'Show only ticks from COMPILER VM state'], + '-o': ['stateFilter', TickProcessor.VmStates.OTHER, + 'Show only ticks from OTHER VM state'], + '-e': ['stateFilter', TickProcessor.VmStates.EXTERNAL, + 'Show only ticks from EXTERNAL VM state'], + '--filter-runtime-timer': ['runtimeTimerFilter', null, + 'Show only ticks matching the given runtime timer scope'], + '--call-graph-size': ['callGraphSize', TickProcessor.CALL_GRAPH_SIZE, + 'Set the call graph size'], + '--ignore-unknown': ['ignoreUnknown', true, + 'Exclude ticks of unknown code entries from processing'], + '--separate-ic': ['separateIc', parseBool, + 'Separate IC entries'], + '--separate-bytecodes': ['separateBytecodes', parseBool, + 'Separate Bytecode entries'], + '--separate-builtins': ['separateBuiltins', parseBool, + 'Separate Builtin entries'], + '--separate-stubs': ['separateStubs', parseBool, + 'Separate Stub entries'], + '--unix': ['platform', 'unix', + 'Specify that we are running on *nix platform'], + '--windows': ['platform', 'windows', + 'Specify that we are running on Windows platform'], + '--mac': ['platform', 'mac', + 'Specify that we are running on Mac OS X platform'], + '--nm': ['nm', 'nm', + 'Specify the \'nm\' executable to use (e.g. --nm=/my_dir/nm)'], + '--objdump': ['objdump', 'objdump', + 'Specify the \'objdump\' executable to use (e.g. --objdump=/my_dir/objdump)'], + '--target': ['targetRootFS', '', + 'Specify the target root directory for cross environment'], + '--apk-embedded-library': ['apkEmbeddedLibrary', '', + 'Specify the path of the embedded library for Android traces'], + '--range': ['range', 'auto,auto', + 'Specify the range limit as [start],[end]'], + '--distortion': ['distortion', 0, + 'Specify the logging overhead in picoseconds'], + '--source-map': ['sourceMap', null, + 'Specify the source map that should be used for output'], + '--timed-range': ['timedRange', true, + 'Ignore ticks before first and after last Date.now() call'], + '--pairwise-timed-range': ['pairwiseTimedRange', true, + 'Ignore ticks outside pairs of Date.now() calls'], + '--only-summary': ['onlySummary', true, + 'Print only tick summary, exclude other information'], + '--preprocess': ['preprocessJson', true, + 'Preprocess for consumption with web interface'] + }; + dispatch['--js'] = dispatch['-j']; + dispatch['--gc'] = dispatch['-g']; + dispatch['--compiler'] = dispatch['-c']; + dispatch['--other'] = dispatch['-o']; + dispatch['--external'] = dispatch['-e']; + dispatch['--ptr'] = dispatch['--pairwise-timed-range']; + return dispatch; + } + + getDefaultResults() { + return { + logFileName: 'v8.log', + platform: 'unix', + stateFilter: null, + callGraphSize: 5, + ignoreUnknown: false, + separateIc: true, + separateBytecodes: false, + separateBuiltins: true, + separateStubs: true, + preprocessJson: null, + targetRootFS: '', + nm: 'nm', + objdump: 'objdump', + range: 'auto,auto', + distortion: 0, + timedRange: false, + pairwiseTimedRange: false, + onlySummary: false, + runtimeTimerFilter: null, + }; + } +} diff --git a/deps/v8/tools/trace-maps-processor.py b/deps/v8/tools/trace-maps-processor.py deleted file mode 100755 index 4a29eab5dbed1b..00000000000000 --- a/deps/v8/tools/trace-maps-processor.py +++ /dev/null @@ -1,175 +0,0 @@ -#!/usr/bin/env python -# Copyright 2014 the V8 project authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# for py2/py3 compatibility -from __future__ import print_function - -import sys - - -action = sys.argv[1] - -if action in ["help", "-h", "--help"] or len(sys.argv) != 3: - print("Usage: %s , where action can be: \n" - "help Print this message\n" - "plain Print ASCII tree to stdout\n" - "dot Print dot file to stdout\n" - "count Count most frequent transition reasons\n" % sys.argv[0]) - sys.exit(0) - - -filename = sys.argv[2] -maps = {} -root_maps = [] -transitions = {} -annotations = {} - - -class Map(object): - - def __init__(self, pointer, origin): - self.pointer = pointer - self.origin = origin - - def __str__(self): - return "%s (%s)" % (self.pointer, self.origin) - - -class Transition(object): - - def __init__(self, from_map, to_map, reason): - self.from_map = from_map - self.to_map = to_map - self.reason = reason - - -def RegisterNewMap(raw_map): - if raw_map in annotations: - annotations[raw_map] += 1 - else: - annotations[raw_map] = 0 - return AnnotateExistingMap(raw_map) - - -def AnnotateExistingMap(raw_map): - return "%s_%d" % (raw_map, annotations[raw_map]) - - -def AddMap(pointer, origin): - pointer = RegisterNewMap(pointer) - maps[pointer] = Map(pointer, origin) - return pointer - - -def AddTransition(from_map, to_map, reason): - from_map = AnnotateExistingMap(from_map) - to_map = AnnotateExistingMap(to_map) - if from_map not in transitions: - transitions[from_map] = {} - targets = transitions[from_map] - if to_map in targets: - # Some events get printed twice, that's OK. In some cases, ignore the - # second output... - old_reason = targets[to_map].reason - if old_reason.startswith("ReplaceDescriptors"): - return - # ...and in others use it for additional detail. - if reason in []: - targets[to_map].reason = reason - return - # Unexpected duplicate events? Warn. - print("// warning: already have a transition from %s to %s, reason: %s" % - (from_map, to_map, targets[to_map].reason)) - return - targets[to_map] = Transition(from_map, to_map, reason) - - -with open(filename, "r") as f: - last_to_map = "" - for line in f: - if not line.startswith("[TraceMaps: "): continue - words = line.split(" ") - event = words[1] - if event == "InitialMap": - assert words[2] == "map=" - assert words[4] == "SFI=" - new_map = AddMap(words[3], "SFI#%s" % words[5]) - root_maps.append(new_map) - continue - if words[2] == "from=" and words[4] == "to=": - from_map = words[3] - to_map = words[5] - if from_map not in annotations: - print("// warning: unknown from_map %s" % from_map) - new_map = AddMap(from_map, "") - root_maps.append(new_map) - if to_map != last_to_map: - AddMap(to_map, " (%s)" % event) - last_to_map = to_map - if event in ["Transition", "NoTransition"]: - assert words[6] == "name=", line - reason = "%s: %s" % (event, words[7]) - elif event in ["Normalize", "ReplaceDescriptors", "SlowToFast"]: - assert words[6] == "reason=", line - reason = "%s: %s" % (event, words[7]) - if words[8].strip() != "]": - reason = "%s_%s" % (reason, words[8]) - else: - reason = event - AddTransition(from_map, to_map, reason) - continue - - -def PlainPrint(m, indent, label): - print("%s%s (%s)" % (indent, m, label)) - if m in transitions: - for t in transitions[m]: - PlainPrint(t, indent + " ", transitions[m][t].reason) - - -def CountTransitions(m): - if m not in transitions: return 0 - return len(transitions[m]) - - -def DotPrint(m, label): - print("m%s [label=\"%s\"]" % (m[2:], label)) - if m in transitions: - for t in transitions[m]: - # GraphViz doesn't like node labels looking like numbers, so use - # "m..." instead of "0x...". - print("m%s -> m%s" % (m[2:], t[2:])) - reason = transitions[m][t].reason - reason = reason.replace("\\", "BACKSLASH") - reason = reason.replace("\"", "\\\"") - DotPrint(t, reason) - - -if action == "plain": - root_maps = sorted(root_maps, key=CountTransitions, reverse=True) - for m in root_maps: - PlainPrint(m, "", maps[m].origin) - -elif action == "dot": - print("digraph g {") - for m in root_maps: - DotPrint(m, maps[m].origin) - print("}") - -elif action == "count": - reasons = {} - for s in transitions: - for t in transitions[s]: - reason = transitions[s][t].reason - if reason not in reasons: - reasons[reason] = 1 - else: - reasons[reason] += 1 - reasons_list = [] - for r in reasons: - reasons_list.append("%8d %s" % (reasons[r], r)) - reasons_list.sort(reverse=True) - for r in reasons_list[:20]: - print(r) diff --git a/deps/v8/tools/unittests/run_tests_test.py b/deps/v8/tools/unittests/run_tests_test.py index 8b3275172d55a4..4cd2bdefd512f1 100755 --- a/deps/v8/tools/unittests/run_tests_test.py +++ b/deps/v8/tools/unittests/run_tests_test.py @@ -177,7 +177,7 @@ def testPass(self): 'sweet/bananas', 'sweet/raspberries', ) - self.assertIn('Done running sweet/bananas default: pass', result.stdout, result) + self.assertIn('sweet/bananas default: pass', result.stdout, result) # TODO(majeski): Implement for test processors # self.assertIn('Total time:', result.stderr, result) # self.assertIn('sweet/bananas', result.stderr, result) @@ -199,10 +199,8 @@ def testShardedProc(self): # One of the shards gets one variant of each test. self.assertIn('2 tests ran', result.stdout, result) if shard == 1: - self.assertIn( - 'Done running sweet/raspberries default', result.stdout, result) - self.assertIn( - 'Done running sweet/raspberries stress', result.stdout, result) + self.assertIn('sweet/raspberries default', result.stdout, result) + self.assertIn('sweet/raspberries stress', result.stdout, result) self.assertEqual(0, result.returncode, result) else: self.assertIn( @@ -227,8 +225,8 @@ def testSharded(self): ) # One of the shards gets one variant of each test. self.assertIn('Running 2 tests', result.stdout, result) - self.assertIn('Done running sweet/bananas', result.stdout, result) - self.assertIn('Done running sweet/raspberries', result.stdout, result) + self.assertIn('sweet/bananas', result.stdout, result) + self.assertIn('sweet/raspberries', result.stdout, result) self.assertEqual(0, result.returncode, result) def testFail(self): @@ -241,7 +239,7 @@ def testFail(self): 'sweet/strawberries', infra_staging=False, ) - self.assertIn('Done running sweet/strawberries default: FAIL', result.stdout, result) + self.assertIn('sweet/strawberries default: FAIL', result.stdout, result) self.assertEqual(1, result.returncode, result) def check_cleaned_json_output( @@ -289,7 +287,7 @@ def testFailWithRerunAndJSON(self): 'sweet/strawberries', infra_staging=False, ) - self.assertIn('Done running sweet/strawberries default: FAIL', result.stdout, result) + self.assertIn('sweet/strawberries default: FAIL', result.stdout, result) # With test processors we don't count reruns as separated failures. # TODO(majeski): fix it? self.assertIn('1 tests failed', result.stdout, result) @@ -317,8 +315,7 @@ def testFlakeWithRerunAndJSON(self): 'sweet', infra_staging=False, ) - self.assertIn( - 'Done running sweet/bananaflakes default: pass', result.stdout, result) + self.assertIn('sweet/bananaflakes default: pass', result.stdout, result) self.assertIn('All tests succeeded', result.stdout, result) self.assertEqual(0, result.returncode, result) self.maxDiff = None @@ -489,8 +486,7 @@ def testPredictable(self): infra_staging=False, ) self.assertIn('1 tests ran', result.stdout, result) - self.assertIn( - 'Done running sweet/bananas default: FAIL', result.stdout, result) + self.assertIn('sweet/bananas default: FAIL', result.stdout, result) self.assertIn('Test had no allocation output', result.stdout, result) self.assertIn('--predictable --verify-predictable', result.stdout, result) self.assertEqual(1, result.returncode, result) @@ -624,7 +620,7 @@ def testExitAfterNFailures(self): self.assertIn('sweet/strawberries default: FAIL', result.stdout, result) self.assertIn('Too many failures, exiting...', result.stdout, result) self.assertIn('sweet/blackberries default: FAIL', result.stdout, result) - self.assertNotIn('Done running sweet/raspberries', result.stdout, result) + self.assertNotIn('sweet/raspberries', result.stdout, result) self.assertIn('2 tests failed', result.stdout, result) self.assertIn('3 tests ran', result.stdout, result) self.assertEqual(1, result.returncode, result) diff --git a/deps/v8/tools/unittests/testdata/testroot1/v8_build_config.json b/deps/v8/tools/unittests/testdata/testroot1/v8_build_config.json index 8b294d9d520155..8f8efc4f58cf52 100644 --- a/deps/v8/tools/unittests/testdata/testroot1/v8_build_config.json +++ b/deps/v8/tools/unittests/testdata/testroot1/v8_build_config.json @@ -17,6 +17,7 @@ "v8_enable_i18n_support": true, "v8_enable_verify_predictable": false, "v8_target_cpu": "x64", + "v8_enable_concurrent_marking": true, "v8_enable_verify_csa": false, "v8_enable_lite_mode": false, "v8_enable_pointer_compression": true diff --git a/deps/v8/tools/unittests/testdata/testroot2/v8_build_config.json b/deps/v8/tools/unittests/testdata/testroot2/v8_build_config.json index c375b30f794e6a..7134998e1f245e 100644 --- a/deps/v8/tools/unittests/testdata/testroot2/v8_build_config.json +++ b/deps/v8/tools/unittests/testdata/testroot2/v8_build_config.json @@ -17,6 +17,7 @@ "v8_enable_i18n_support": true, "v8_enable_verify_predictable": false, "v8_target_cpu": "x64", + "v8_enable_concurrent_marking": true, "v8_enable_verify_csa": false, "v8_enable_lite_mode": false, "v8_enable_pointer_compression": false diff --git a/deps/v8/tools/v8heapconst.py b/deps/v8/tools/v8heapconst.py index 31cc9d2a9a23bb..d8e81c49096356 100644 --- a/deps/v8/tools/v8heapconst.py +++ b/deps/v8/tools/v8heapconst.py @@ -205,97 +205,97 @@ # List of known V8 maps. KNOWN_MAPS = { - ("read_only_space", 0x02115): (167, "FreeSpaceMap"), - ("read_only_space", 0x0213d): (170, "MetaMap"), - ("read_only_space", 0x02181): (67, "NullMap"), - ("read_only_space", 0x021b9): (162, "DescriptorArrayMap"), - ("read_only_space", 0x021e9): (156, "WeakFixedArrayMap"), - ("read_only_space", 0x02211): (166, "OnePointerFillerMap"), - ("read_only_space", 0x02239): (166, "TwoPointerFillerMap"), - ("read_only_space", 0x0227d): (67, "UninitializedMap"), - ("read_only_space", 0x022c1): (8, "OneByteInternalizedStringMap"), - ("read_only_space", 0x0231d): (67, "UndefinedMap"), - ("read_only_space", 0x02351): (66, "HeapNumberMap"), - ("read_only_space", 0x02395): (67, "TheHoleMap"), - ("read_only_space", 0x023f5): (67, "BooleanMap"), - ("read_only_space", 0x0247d): (131, "ByteArrayMap"), - ("read_only_space", 0x024a5): (117, "FixedArrayMap"), - ("read_only_space", 0x024cd): (117, "FixedCOWArrayMap"), - ("read_only_space", 0x024f5): (118, "HashTableMap"), - ("read_only_space", 0x0251d): (64, "SymbolMap"), - ("read_only_space", 0x02545): (40, "OneByteStringMap"), - ("read_only_space", 0x0256d): (129, "ScopeInfoMap"), - ("read_only_space", 0x02595): (175, "SharedFunctionInfoMap"), - ("read_only_space", 0x025bd): (159, "CodeMap"), - ("read_only_space", 0x025e5): (158, "CellMap"), - ("read_only_space", 0x0260d): (174, "GlobalPropertyCellMap"), - ("read_only_space", 0x02635): (70, "ForeignMap"), - ("read_only_space", 0x0265d): (157, "TransitionArrayMap"), - ("read_only_space", 0x02685): (45, "ThinOneByteStringMap"), - ("read_only_space", 0x026ad): (165, "FeedbackVectorMap"), - ("read_only_space", 0x02701): (67, "ArgumentsMarkerMap"), - ("read_only_space", 0x02761): (67, "ExceptionMap"), - ("read_only_space", 0x027bd): (67, "TerminationExceptionMap"), - ("read_only_space", 0x02825): (67, "OptimizedOutMap"), - ("read_only_space", 0x02885): (67, "StaleRegisterMap"), - ("read_only_space", 0x028c9): (130, "ScriptContextTableMap"), - ("read_only_space", 0x028f1): (127, "ClosureFeedbackCellArrayMap"), - ("read_only_space", 0x02919): (164, "FeedbackMetadataArrayMap"), - ("read_only_space", 0x02941): (117, "ArrayListMap"), - ("read_only_space", 0x02969): (65, "BigIntMap"), - ("read_only_space", 0x02991): (128, "ObjectBoilerplateDescriptionMap"), - ("read_only_space", 0x029b9): (132, "BytecodeArrayMap"), - ("read_only_space", 0x029e1): (160, "CodeDataContainerMap"), - ("read_only_space", 0x02a09): (161, "CoverageInfoMap"), - ("read_only_space", 0x02a31): (133, "FixedDoubleArrayMap"), - ("read_only_space", 0x02a59): (120, "GlobalDictionaryMap"), - ("read_only_space", 0x02a81): (97, "ManyClosuresCellMap"), - ("read_only_space", 0x02aa9): (117, "ModuleInfoMap"), - ("read_only_space", 0x02ad1): (121, "NameDictionaryMap"), - ("read_only_space", 0x02af9): (97, "NoClosuresCellMap"), - ("read_only_space", 0x02b21): (122, "NumberDictionaryMap"), - ("read_only_space", 0x02b49): (97, "OneClosureCellMap"), - ("read_only_space", 0x02b71): (123, "OrderedHashMapMap"), - ("read_only_space", 0x02b99): (124, "OrderedHashSetMap"), - ("read_only_space", 0x02bc1): (125, "OrderedNameDictionaryMap"), - ("read_only_space", 0x02be9): (172, "PreparseDataMap"), - ("read_only_space", 0x02c11): (173, "PropertyArrayMap"), - ("read_only_space", 0x02c39): (93, "SideEffectCallHandlerInfoMap"), - ("read_only_space", 0x02c61): (93, "SideEffectFreeCallHandlerInfoMap"), - ("read_only_space", 0x02c89): (93, "NextCallSideEffectFreeCallHandlerInfoMap"), - ("read_only_space", 0x02cb1): (126, "SimpleNumberDictionaryMap"), - ("read_only_space", 0x02cd9): (149, "SmallOrderedHashMapMap"), - ("read_only_space", 0x02d01): (150, "SmallOrderedHashSetMap"), - ("read_only_space", 0x02d29): (151, "SmallOrderedNameDictionaryMap"), - ("read_only_space", 0x02d51): (152, "SourceTextModuleMap"), - ("read_only_space", 0x02d79): (153, "SyntheticModuleMap"), - ("read_only_space", 0x02da1): (155, "UncompiledDataWithoutPreparseDataMap"), - ("read_only_space", 0x02dc9): (154, "UncompiledDataWithPreparseDataMap"), - ("read_only_space", 0x02df1): (71, "WasmTypeInfoMap"), - ("read_only_space", 0x02e19): (181, "WeakArrayListMap"), - ("read_only_space", 0x02e41): (119, "EphemeronHashTableMap"), - ("read_only_space", 0x02e69): (163, "EmbedderDataArrayMap"), - ("read_only_space", 0x02e91): (182, "WeakCellMap"), - ("read_only_space", 0x02eb9): (32, "StringMap"), - ("read_only_space", 0x02ee1): (41, "ConsOneByteStringMap"), - ("read_only_space", 0x02f09): (33, "ConsStringMap"), - ("read_only_space", 0x02f31): (37, "ThinStringMap"), - ("read_only_space", 0x02f59): (35, "SlicedStringMap"), - ("read_only_space", 0x02f81): (43, "SlicedOneByteStringMap"), - ("read_only_space", 0x02fa9): (34, "ExternalStringMap"), - ("read_only_space", 0x02fd1): (42, "ExternalOneByteStringMap"), - ("read_only_space", 0x02ff9): (50, "UncachedExternalStringMap"), - ("read_only_space", 0x03021): (0, "InternalizedStringMap"), - ("read_only_space", 0x03049): (2, "ExternalInternalizedStringMap"), - ("read_only_space", 0x03071): (10, "ExternalOneByteInternalizedStringMap"), - ("read_only_space", 0x03099): (18, "UncachedExternalInternalizedStringMap"), - ("read_only_space", 0x030c1): (26, "UncachedExternalOneByteInternalizedStringMap"), - ("read_only_space", 0x030e9): (58, "UncachedExternalOneByteStringMap"), - ("read_only_space", 0x03111): (67, "SelfReferenceMarkerMap"), - ("read_only_space", 0x03139): (67, "BasicBlockCountersMarkerMap"), - ("read_only_space", 0x0316d): (96, "EnumCacheMap"), - ("read_only_space", 0x031bd): (87, "ArrayBoilerplateDescriptionMap"), - ("read_only_space", 0x032a9): (99, "InterceptorInfoMap"), + ("read_only_space", 0x02115): (170, "MetaMap"), + ("read_only_space", 0x0213d): (67, "NullMap"), + ("read_only_space", 0x02165): (162, "DescriptorArrayMap"), + ("read_only_space", 0x0218d): (156, "WeakFixedArrayMap"), + ("read_only_space", 0x021cd): (96, "EnumCacheMap"), + ("read_only_space", 0x02201): (117, "FixedArrayMap"), + ("read_only_space", 0x0224d): (8, "OneByteInternalizedStringMap"), + ("read_only_space", 0x02299): (167, "FreeSpaceMap"), + ("read_only_space", 0x022c1): (166, "OnePointerFillerMap"), + ("read_only_space", 0x022e9): (166, "TwoPointerFillerMap"), + ("read_only_space", 0x02311): (67, "UninitializedMap"), + ("read_only_space", 0x02389): (67, "UndefinedMap"), + ("read_only_space", 0x023cd): (66, "HeapNumberMap"), + ("read_only_space", 0x02401): (67, "TheHoleMap"), + ("read_only_space", 0x02461): (67, "BooleanMap"), + ("read_only_space", 0x02505): (131, "ByteArrayMap"), + ("read_only_space", 0x0252d): (117, "FixedCOWArrayMap"), + ("read_only_space", 0x02555): (118, "HashTableMap"), + ("read_only_space", 0x0257d): (64, "SymbolMap"), + ("read_only_space", 0x025a5): (40, "OneByteStringMap"), + ("read_only_space", 0x025cd): (129, "ScopeInfoMap"), + ("read_only_space", 0x025f5): (175, "SharedFunctionInfoMap"), + ("read_only_space", 0x0261d): (159, "CodeMap"), + ("read_only_space", 0x02645): (158, "CellMap"), + ("read_only_space", 0x0266d): (174, "GlobalPropertyCellMap"), + ("read_only_space", 0x02695): (70, "ForeignMap"), + ("read_only_space", 0x026bd): (157, "TransitionArrayMap"), + ("read_only_space", 0x026e5): (45, "ThinOneByteStringMap"), + ("read_only_space", 0x0270d): (165, "FeedbackVectorMap"), + ("read_only_space", 0x0273d): (67, "ArgumentsMarkerMap"), + ("read_only_space", 0x0279d): (67, "ExceptionMap"), + ("read_only_space", 0x027f9): (67, "TerminationExceptionMap"), + ("read_only_space", 0x02861): (67, "OptimizedOutMap"), + ("read_only_space", 0x028c1): (67, "StaleRegisterMap"), + ("read_only_space", 0x02921): (130, "ScriptContextTableMap"), + ("read_only_space", 0x02949): (127, "ClosureFeedbackCellArrayMap"), + ("read_only_space", 0x02971): (164, "FeedbackMetadataArrayMap"), + ("read_only_space", 0x02999): (117, "ArrayListMap"), + ("read_only_space", 0x029c1): (65, "BigIntMap"), + ("read_only_space", 0x029e9): (128, "ObjectBoilerplateDescriptionMap"), + ("read_only_space", 0x02a11): (132, "BytecodeArrayMap"), + ("read_only_space", 0x02a39): (160, "CodeDataContainerMap"), + ("read_only_space", 0x02a61): (161, "CoverageInfoMap"), + ("read_only_space", 0x02a89): (133, "FixedDoubleArrayMap"), + ("read_only_space", 0x02ab1): (120, "GlobalDictionaryMap"), + ("read_only_space", 0x02ad9): (97, "ManyClosuresCellMap"), + ("read_only_space", 0x02b01): (117, "ModuleInfoMap"), + ("read_only_space", 0x02b29): (121, "NameDictionaryMap"), + ("read_only_space", 0x02b51): (97, "NoClosuresCellMap"), + ("read_only_space", 0x02b79): (122, "NumberDictionaryMap"), + ("read_only_space", 0x02ba1): (97, "OneClosureCellMap"), + ("read_only_space", 0x02bc9): (123, "OrderedHashMapMap"), + ("read_only_space", 0x02bf1): (124, "OrderedHashSetMap"), + ("read_only_space", 0x02c19): (125, "OrderedNameDictionaryMap"), + ("read_only_space", 0x02c41): (172, "PreparseDataMap"), + ("read_only_space", 0x02c69): (173, "PropertyArrayMap"), + ("read_only_space", 0x02c91): (93, "SideEffectCallHandlerInfoMap"), + ("read_only_space", 0x02cb9): (93, "SideEffectFreeCallHandlerInfoMap"), + ("read_only_space", 0x02ce1): (93, "NextCallSideEffectFreeCallHandlerInfoMap"), + ("read_only_space", 0x02d09): (126, "SimpleNumberDictionaryMap"), + ("read_only_space", 0x02d31): (149, "SmallOrderedHashMapMap"), + ("read_only_space", 0x02d59): (150, "SmallOrderedHashSetMap"), + ("read_only_space", 0x02d81): (151, "SmallOrderedNameDictionaryMap"), + ("read_only_space", 0x02da9): (152, "SourceTextModuleMap"), + ("read_only_space", 0x02dd1): (153, "SyntheticModuleMap"), + ("read_only_space", 0x02df9): (155, "UncompiledDataWithoutPreparseDataMap"), + ("read_only_space", 0x02e21): (154, "UncompiledDataWithPreparseDataMap"), + ("read_only_space", 0x02e49): (71, "WasmTypeInfoMap"), + ("read_only_space", 0x02e71): (181, "WeakArrayListMap"), + ("read_only_space", 0x02e99): (119, "EphemeronHashTableMap"), + ("read_only_space", 0x02ec1): (163, "EmbedderDataArrayMap"), + ("read_only_space", 0x02ee9): (182, "WeakCellMap"), + ("read_only_space", 0x02f11): (32, "StringMap"), + ("read_only_space", 0x02f39): (41, "ConsOneByteStringMap"), + ("read_only_space", 0x02f61): (33, "ConsStringMap"), + ("read_only_space", 0x02f89): (37, "ThinStringMap"), + ("read_only_space", 0x02fb1): (35, "SlicedStringMap"), + ("read_only_space", 0x02fd9): (43, "SlicedOneByteStringMap"), + ("read_only_space", 0x03001): (34, "ExternalStringMap"), + ("read_only_space", 0x03029): (42, "ExternalOneByteStringMap"), + ("read_only_space", 0x03051): (50, "UncachedExternalStringMap"), + ("read_only_space", 0x03079): (0, "InternalizedStringMap"), + ("read_only_space", 0x030a1): (2, "ExternalInternalizedStringMap"), + ("read_only_space", 0x030c9): (10, "ExternalOneByteInternalizedStringMap"), + ("read_only_space", 0x030f1): (18, "UncachedExternalInternalizedStringMap"), + ("read_only_space", 0x03119): (26, "UncachedExternalOneByteInternalizedStringMap"), + ("read_only_space", 0x03141): (58, "UncachedExternalOneByteStringMap"), + ("read_only_space", 0x03169): (67, "SelfReferenceMarkerMap"), + ("read_only_space", 0x03191): (67, "BasicBlockCountersMarkerMap"), + ("read_only_space", 0x031d5): (87, "ArrayBoilerplateDescriptionMap"), + ("read_only_space", 0x032a5): (99, "InterceptorInfoMap"), ("read_only_space", 0x05399): (72, "PromiseFulfillReactionJobTaskMap"), ("read_only_space", 0x053c1): (73, "PromiseRejectReactionJobTaskMap"), ("read_only_space", 0x053e9): (74, "CallableTaskMap"), @@ -365,50 +365,50 @@ # List of known V8 objects. KNOWN_OBJECTS = { - ("read_only_space", 0x02165): "NullValue", - ("read_only_space", 0x021a9): "EmptyDescriptorArray", - ("read_only_space", 0x021e1): "EmptyWeakFixedArray", - ("read_only_space", 0x02261): "UninitializedValue", - ("read_only_space", 0x02301): "UndefinedValue", - ("read_only_space", 0x02345): "NanValue", - ("read_only_space", 0x02379): "TheHoleValue", - ("read_only_space", 0x023cd): "HoleNanValue", - ("read_only_space", 0x023d9): "TrueValue", - ("read_only_space", 0x02441): "FalseValue", - ("read_only_space", 0x02471): "empty_string", - ("read_only_space", 0x026d5): "EmptyScopeInfo", - ("read_only_space", 0x026dd): "EmptyFixedArray", - ("read_only_space", 0x026e5): "ArgumentsMarker", - ("read_only_space", 0x02745): "Exception", - ("read_only_space", 0x027a1): "TerminationException", - ("read_only_space", 0x02809): "OptimizedOut", - ("read_only_space", 0x02869): "StaleRegister", - ("read_only_space", 0x03161): "EmptyEnumCache", - ("read_only_space", 0x03195): "EmptyPropertyArray", - ("read_only_space", 0x0319d): "EmptyByteArray", - ("read_only_space", 0x031a5): "EmptyObjectBoilerplateDescription", - ("read_only_space", 0x031b1): "EmptyArrayBoilerplateDescription", - ("read_only_space", 0x031e5): "EmptyClosureFeedbackCellArray", - ("read_only_space", 0x031ed): "EmptySlowElementDictionary", - ("read_only_space", 0x03211): "EmptyOrderedHashMap", - ("read_only_space", 0x03225): "EmptyOrderedHashSet", - ("read_only_space", 0x03239): "EmptyFeedbackMetadata", - ("read_only_space", 0x03245): "EmptyPropertyCell", - ("read_only_space", 0x03259): "EmptyPropertyDictionary", - ("read_only_space", 0x03281): "NoOpInterceptorInfo", - ("read_only_space", 0x032d1): "EmptyWeakArrayList", - ("read_only_space", 0x032dd): "InfinityValue", - ("read_only_space", 0x032e9): "MinusZeroValue", - ("read_only_space", 0x032f5): "MinusInfinityValue", - ("read_only_space", 0x03301): "SelfReferenceMarker", - ("read_only_space", 0x03341): "BasicBlockCountersMarker", - ("read_only_space", 0x03385): "OffHeapTrampolineRelocationInfo", - ("read_only_space", 0x03391): "TrampolineTrivialCodeDataContainer", - ("read_only_space", 0x0339d): "TrampolinePromiseRejectionCodeDataContainer", - ("read_only_space", 0x033a9): "GlobalThisBindingScopeInfo", - ("read_only_space", 0x033e1): "EmptyFunctionScopeInfo", - ("read_only_space", 0x03409): "NativeScopeInfo", - ("read_only_space", 0x03425): "HashSeed", + ("read_only_space", 0x021b5): "EmptyWeakFixedArray", + ("read_only_space", 0x021bd): "EmptyDescriptorArray", + ("read_only_space", 0x021f5): "EmptyEnumCache", + ("read_only_space", 0x02229): "EmptyFixedArray", + ("read_only_space", 0x02231): "NullValue", + ("read_only_space", 0x02339): "UninitializedValue", + ("read_only_space", 0x023b1): "UndefinedValue", + ("read_only_space", 0x023f5): "NanValue", + ("read_only_space", 0x02429): "TheHoleValue", + ("read_only_space", 0x02455): "HoleNanValue", + ("read_only_space", 0x02489): "TrueValue", + ("read_only_space", 0x024c9): "FalseValue", + ("read_only_space", 0x024f9): "empty_string", + ("read_only_space", 0x02735): "EmptyScopeInfo", + ("read_only_space", 0x02765): "ArgumentsMarker", + ("read_only_space", 0x027c5): "Exception", + ("read_only_space", 0x02821): "TerminationException", + ("read_only_space", 0x02889): "OptimizedOut", + ("read_only_space", 0x028e9): "StaleRegister", + ("read_only_space", 0x031b9): "EmptyPropertyArray", + ("read_only_space", 0x031c1): "EmptyByteArray", + ("read_only_space", 0x031c9): "EmptyObjectBoilerplateDescription", + ("read_only_space", 0x031fd): "EmptyArrayBoilerplateDescription", + ("read_only_space", 0x03209): "EmptyClosureFeedbackCellArray", + ("read_only_space", 0x03211): "EmptySlowElementDictionary", + ("read_only_space", 0x03235): "EmptyOrderedHashMap", + ("read_only_space", 0x03249): "EmptyOrderedHashSet", + ("read_only_space", 0x0325d): "EmptyFeedbackMetadata", + ("read_only_space", 0x03269): "EmptyPropertyCell", + ("read_only_space", 0x0327d): "EmptyPropertyDictionary", + ("read_only_space", 0x032cd): "NoOpInterceptorInfo", + ("read_only_space", 0x032f5): "EmptyWeakArrayList", + ("read_only_space", 0x03301): "InfinityValue", + ("read_only_space", 0x0330d): "MinusZeroValue", + ("read_only_space", 0x03319): "MinusInfinityValue", + ("read_only_space", 0x03325): "SelfReferenceMarker", + ("read_only_space", 0x03365): "BasicBlockCountersMarker", + ("read_only_space", 0x033a9): "OffHeapTrampolineRelocationInfo", + ("read_only_space", 0x033b5): "TrampolineTrivialCodeDataContainer", + ("read_only_space", 0x033c1): "TrampolinePromiseRejectionCodeDataContainer", + ("read_only_space", 0x033cd): "GlobalThisBindingScopeInfo", + ("read_only_space", 0x03405): "EmptyFunctionScopeInfo", + ("read_only_space", 0x0342d): "NativeScopeInfo", + ("read_only_space", 0x03449): "HashSeed", ("old_space", 0x02115): "ArgumentsIteratorAccessor", ("old_space", 0x02159): "ArrayLengthAccessor", ("old_space", 0x0219d): "BoundFunctionLengthAccessor", @@ -444,27 +444,27 @@ ("old_space", 0x02a61): "StringSplitCache", ("old_space", 0x02e69): "RegExpMultipleCache", ("old_space", 0x03271): "BuiltinsConstantsTable", - ("old_space", 0x03645): "AsyncFunctionAwaitRejectSharedFun", - ("old_space", 0x0366d): "AsyncFunctionAwaitResolveSharedFun", - ("old_space", 0x03695): "AsyncGeneratorAwaitRejectSharedFun", - ("old_space", 0x036bd): "AsyncGeneratorAwaitResolveSharedFun", - ("old_space", 0x036e5): "AsyncGeneratorYieldResolveSharedFun", - ("old_space", 0x0370d): "AsyncGeneratorReturnResolveSharedFun", - ("old_space", 0x03735): "AsyncGeneratorReturnClosedRejectSharedFun", - ("old_space", 0x0375d): "AsyncGeneratorReturnClosedResolveSharedFun", - ("old_space", 0x03785): "AsyncIteratorValueUnwrapSharedFun", - ("old_space", 0x037ad): "PromiseAllResolveElementSharedFun", - ("old_space", 0x037d5): "PromiseAllSettledResolveElementSharedFun", - ("old_space", 0x037fd): "PromiseAllSettledRejectElementSharedFun", - ("old_space", 0x03825): "PromiseAnyRejectElementSharedFun", - ("old_space", 0x0384d): "PromiseCapabilityDefaultRejectSharedFun", - ("old_space", 0x03875): "PromiseCapabilityDefaultResolveSharedFun", - ("old_space", 0x0389d): "PromiseCatchFinallySharedFun", - ("old_space", 0x038c5): "PromiseGetCapabilitiesExecutorSharedFun", - ("old_space", 0x038ed): "PromiseThenFinallySharedFun", - ("old_space", 0x03915): "PromiseThrowerFinallySharedFun", - ("old_space", 0x0393d): "PromiseValueThunkFinallySharedFun", - ("old_space", 0x03965): "ProxyRevokeSharedFun", + ("old_space", 0x0364d): "AsyncFunctionAwaitRejectSharedFun", + ("old_space", 0x03675): "AsyncFunctionAwaitResolveSharedFun", + ("old_space", 0x0369d): "AsyncGeneratorAwaitRejectSharedFun", + ("old_space", 0x036c5): "AsyncGeneratorAwaitResolveSharedFun", + ("old_space", 0x036ed): "AsyncGeneratorYieldResolveSharedFun", + ("old_space", 0x03715): "AsyncGeneratorReturnResolveSharedFun", + ("old_space", 0x0373d): "AsyncGeneratorReturnClosedRejectSharedFun", + ("old_space", 0x03765): "AsyncGeneratorReturnClosedResolveSharedFun", + ("old_space", 0x0378d): "AsyncIteratorValueUnwrapSharedFun", + ("old_space", 0x037b5): "PromiseAllResolveElementSharedFun", + ("old_space", 0x037dd): "PromiseAllSettledResolveElementSharedFun", + ("old_space", 0x03805): "PromiseAllSettledRejectElementSharedFun", + ("old_space", 0x0382d): "PromiseAnyRejectElementSharedFun", + ("old_space", 0x03855): "PromiseCapabilityDefaultRejectSharedFun", + ("old_space", 0x0387d): "PromiseCapabilityDefaultResolveSharedFun", + ("old_space", 0x038a5): "PromiseCatchFinallySharedFun", + ("old_space", 0x038cd): "PromiseGetCapabilitiesExecutorSharedFun", + ("old_space", 0x038f5): "PromiseThenFinallySharedFun", + ("old_space", 0x0391d): "PromiseThrowerFinallySharedFun", + ("old_space", 0x03945): "PromiseValueThunkFinallySharedFun", + ("old_space", 0x0396d): "ProxyRevokeSharedFun", } # Lower 32 bits of first page addresses for various heap spaces. diff --git a/deps/v8/tools/v8windbg/OWNERS b/deps/v8/tools/v8windbg/OWNERS new file mode 100644 index 00000000000000..01f6b8db3931e8 --- /dev/null +++ b/deps/v8/tools/v8windbg/OWNERS @@ -0,0 +1 @@ +seth.brenith@microsoft.com diff --git a/deps/v8/tools/v8windbg/src/local-variables.cc b/deps/v8/tools/v8windbg/src/local-variables.cc index 20814cf28a8306..e00d06b5955ea7 100644 --- a/deps/v8/tools/v8windbg/src/local-variables.cc +++ b/deps/v8/tools/v8windbg/src/local-variables.cc @@ -4,7 +4,11 @@ #include "tools/v8windbg/src/local-variables.h" +#include + #include "tools/v8windbg/base/utilities.h" +#include "tools/v8windbg/src/object-inspection.h" +#include "tools/v8windbg/src/v8-debug-helper-interop.h" #include "tools/v8windbg/src/v8windbg-extension.h" V8LocalVariables::V8LocalVariables(WRL::ComPtr original, @@ -110,6 +114,14 @@ IFACEMETHODIMP V8LocalVariables::GetValue(PCWSTR key, IModelObject* context, RETURN_IF_FAIL( result->SetKey(L"memory interpreted as Objects", array.Get(), nullptr)); + std::vector properties = GetStackFrame(host_context, frame_offset); + for (const auto& prop : properties) { + WRL::ComPtr property; + RETURN_IF_FAIL(GetModelForProperty(prop, host_context, &property)); + result->SetKey(reinterpret_cast(prop.name.c_str()), + property.Get(), nullptr); + } + *value = result.Detach(); return S_OK; } diff --git a/deps/v8/tools/v8windbg/src/object-inspection.cc b/deps/v8/tools/v8windbg/src/object-inspection.cc index 6f90614bd5c95e..b206dfa792f85d 100644 --- a/deps/v8/tools/v8windbg/src/object-inspection.cc +++ b/deps/v8/tools/v8windbg/src/object-inspection.cc @@ -330,31 +330,6 @@ HRESULT GetModelForCustomArray(const Property& prop, context_data.Get(), result); } -// Creates an IModelObject representing the data in the given property. -HRESULT GetModelForProperty(const Property& prop, - WRL::ComPtr& sp_ctx, - IModelObject** result) { - switch (prop.type) { - case PropertyType::kPointer: - return GetModelForBasicField(prop.addr_value, prop.type_name, - prop.uncompressed_type_name, sp_ctx, result); - case PropertyType::kStruct: - return GetModelForStruct(prop.addr_value, prop.fields, sp_ctx, result); - case PropertyType::kArray: - case PropertyType::kStructArray: - if (prop.type == PropertyType::kArray && - prop.type_name == ConvertToU16String(prop.uncompressed_type_name)) { - // An array of things that are not structs or compressed tagged values - // is most cleanly represented by a native array. - return GetModelForNativeArray(prop.addr_value, prop.type_name, - prop.length, sp_ctx, result); - } - // Otherwise, we must construct a custom iterable object. - return GetModelForCustomArray(prop, sp_ctx, result); - default: - return E_FAIL; - } -} // Creates an IModelObject representing the data in an array at the given index. // context_object is expected to be an object of the form created by @@ -693,3 +668,29 @@ IFACEMETHODIMP InspectV8ObjectMethod::Call(IModelObject* p_context_object, return CreateSyntheticObjectForV8Object(sp_ctx.Get(), cached_object.Get(), pp_result); } + +// Creates an IModelObject representing the data in the given property. +HRESULT GetModelForProperty(const Property& prop, + WRL::ComPtr& sp_ctx, + IModelObject** result) { + switch (prop.type) { + case PropertyType::kPointer: + return GetModelForBasicField(prop.addr_value, prop.type_name, + prop.uncompressed_type_name, sp_ctx, result); + case PropertyType::kStruct: + return GetModelForStruct(prop.addr_value, prop.fields, sp_ctx, result); + case PropertyType::kArray: + case PropertyType::kStructArray: + if (prop.type == PropertyType::kArray && + prop.type_name == ConvertToU16String(prop.uncompressed_type_name)) { + // An array of things that are not structs or compressed tagged values + // is most cleanly represented by a native array. + return GetModelForNativeArray(prop.addr_value, prop.type_name, + prop.length, sp_ctx, result); + } + // Otherwise, we must construct a custom iterable object. + return GetModelForCustomArray(prop, sp_ctx, result); + default: + return E_FAIL; + } +} diff --git a/deps/v8/tools/v8windbg/src/object-inspection.h b/deps/v8/tools/v8windbg/src/object-inspection.h index a280b05cadedfe..238d8610c7823f 100644 --- a/deps/v8/tools/v8windbg/src/object-inspection.h +++ b/deps/v8/tools/v8windbg/src/object-inspection.h @@ -290,4 +290,8 @@ class InspectV8ObjectMethod IKeyStore** pp_metadata); }; +HRESULT GetModelForProperty(const Property& prop, + WRL::ComPtr& sp_ctx, + IModelObject** result); + #endif // V8_TOOLS_V8WINDBG_SRC_OBJECT_INSPECTION_H_ diff --git a/deps/v8/tools/v8windbg/src/v8-debug-helper-interop.cc b/deps/v8/tools/v8windbg/src/v8-debug-helper-interop.cc index 0767ff5f09e974..74d0a9df2646ce 100644 --- a/deps/v8/tools/v8windbg/src/v8-debug-helper-interop.cc +++ b/deps/v8/tools/v8windbg/src/v8-debug-helper-interop.cc @@ -29,7 +29,7 @@ class MemReaderScope { private: MemReaderScope(const MemReaderScope&) = delete; MemReaderScope& operator=(const MemReaderScope&) = delete; - static d::MemoryAccessResult Read(uintptr_t address, uint8_t* destination, + static d::MemoryAccessResult Read(uintptr_t address, void* destination, size_t byte_count) { ULONG64 bytes_read; Location loc{address}; @@ -81,26 +81,12 @@ V8HeapObject::V8HeapObject(V8HeapObject&&) = default; V8HeapObject& V8HeapObject::operator=(const V8HeapObject&) = default; V8HeapObject& V8HeapObject::operator=(V8HeapObject&&) = default; -V8HeapObject GetHeapObject(WRL::ComPtr sp_context, - uint64_t tagged_ptr, uint64_t referring_pointer, - const char* type_name, bool is_compressed) { - // Read the value at the address, and see if it is a tagged pointer - - V8HeapObject obj; - MemReaderScope reader_scope(sp_context); - - d::HeapAddresses heap_addresses = {0, 0, 0, 0}; - // TODO ideally we'd provide real heap page pointers. For now, just testing - // decompression based on the pointer to wherever we found this value, - // which is likely (though not guaranteed) to be a heap pointer itself. - heap_addresses.any_heap_pointer = referring_pointer; - - auto props = d::GetObjectProperties(tagged_ptr, reader_scope.GetReader(), - heap_addresses, type_name); - obj.friendly_name = ConvertToU16String(props->brief); - for (size_t property_index = 0; property_index < props->num_properties; +std::vector GetPropertiesAsVector(size_t num_properties, + d::ObjectProperty** properties) { + std::vector result; + for (size_t property_index = 0; property_index < num_properties; ++property_index) { - const auto& source_prop = *props->properties[property_index]; + const auto& source_prop = *(properties)[property_index]; Property dest_prop(ConvertToU16String(source_prop.name), ConvertToU16String(source_prop.type), source_prop.decompressed_type, source_prop.address, @@ -126,8 +112,30 @@ V8HeapObject GetHeapObject(WRL::ComPtr sp_context, struct_field.shift_bits}); } } - obj.properties.push_back(dest_prop); + result.push_back(dest_prop); } + return result; +} + +V8HeapObject GetHeapObject(WRL::ComPtr sp_context, + uint64_t tagged_ptr, uint64_t referring_pointer, + const char* type_name, bool is_compressed) { + // Read the value at the address, and see if it is a tagged pointer + + V8HeapObject obj; + MemReaderScope reader_scope(sp_context); + + d::HeapAddresses heap_addresses = {0, 0, 0, 0}; + // TODO ideally we'd provide real heap page pointers. For now, just testing + // decompression based on the pointer to wherever we found this value, + // which is likely (though not guaranteed) to be a heap pointer itself. + heap_addresses.any_heap_pointer = referring_pointer; + + auto props = d::GetObjectProperties(tagged_ptr, reader_scope.GetReader(), + heap_addresses, type_name); + obj.friendly_name = ConvertToU16String(props->brief); + obj.properties = + GetPropertiesAsVector(props->num_properties, props->properties); // For each guessed type, create a synthetic property that will request data // about the same object again but with a more specific type hint. @@ -157,3 +165,12 @@ std::vector ListObjectClasses() { } const char* BitsetName(uint64_t payload) { return d::BitsetName(payload); } + +std::vector GetStackFrame(WRL::ComPtr sp_context, + + uint64_t frame_pointer) { + MemReaderScope reader_scope(sp_context); + auto props = d::GetStackFrame(static_cast(frame_pointer), + reader_scope.GetReader()); + return GetPropertiesAsVector(props->num_properties, props->properties); +} diff --git a/deps/v8/tools/v8windbg/src/v8-debug-helper-interop.h b/deps/v8/tools/v8windbg/src/v8-debug-helper-interop.h index 9208f0983270d7..f7d78c5dd3e374 100644 --- a/deps/v8/tools/v8windbg/src/v8-debug-helper-interop.h +++ b/deps/v8/tools/v8windbg/src/v8-debug-helper-interop.h @@ -137,4 +137,7 @@ std::vector ListObjectClasses(); const char* BitsetName(uint64_t payload); +std::vector GetStackFrame(WRL::ComPtr sp_context, + uint64_t frame_pointer); + #endif // V8_TOOLS_V8WINDBG_SRC_V8_DEBUG_HELPER_INTEROP_H_ diff --git a/deps/v8/tools/wasm/update-wasm-spec-tests.sh b/deps/v8/tools/wasm/update-wasm-spec-tests.sh index 2d26c2f5aeb96a..dc9621a83bfd26 100755 --- a/deps/v8/tools/wasm/update-wasm-spec-tests.sh +++ b/deps/v8/tools/wasm/update-wasm-spec-tests.sh @@ -71,7 +71,7 @@ log_and_run cp -r ${TMP_DIR}/spec/test/js-api/* ${JS_API_TEST_DIR}/tests # Generate the proposal tests. ############################################################################### -repos='bulk-memory-operations reference-types js-types tail-call' +repos='bulk-memory-operations reference-types js-types tail-call simd' for repo in ${repos}; do echo "Process ${repo}" @@ -86,9 +86,8 @@ for repo in ${repos}; do # Iterate over all proposal tests. Those which differ from the spec tests are # copied to the output directory and converted to .js tests. - for abs_filename in ${TMP_DIR}/${repo}/test/core/*.wast; do - rel_filename="$(basename -- $abs_filename)" - test_name=${rel_filename%.wast} + for rel_filename in $(find . -name '*.wast'); do + abs_filename=$(realpath $rel_filename) spec_filename=${TMP_DIR}/spec/test/core/${rel_filename} if [ ! -f "$spec_filename" ] || ! cmp -s $abs_filename $spec_filename ; then log_and_run cp ${rel_filename} ${SPEC_TEST_DIR}/tests/proposals/${repo}/ diff --git a/deps/v8/tools/whitespace.txt b/deps/v8/tools/whitespace.txt index 168b574f9ce033..6e2bc1cf764c8d 100644 --- a/deps/v8/tools/whitespace.txt +++ b/deps/v8/tools/whitespace.txt @@ -8,7 +8,7 @@ The doubles heard this and started to unbox. The Smi looked at them when a crazy v8-autoroll account showed up... The autoroller bought a round of Himbeerbrause. Suddenly..... The bartender starts to shake the bottles...................... -I can't add trailing whitespaces, so I'm adding this line..... +I can't add trailing whitespaces, so I'm adding this line...... I'm starting to think that just adding trailing whitespaces might not be bad. Because whitespaces are not that funny..... diff --git a/deps/v8/tools/windows-tick-processor.bat b/deps/v8/tools/windows-tick-processor.bat index 8f8ad0153bccd3..56637e051cb3b3 100755 --- a/deps/v8/tools/windows-tick-processor.bat +++ b/deps/v8/tools/windows-tick-processor.bat @@ -27,4 +27,4 @@ IF NOT %arg8:~0,2% == 8 (IF NOT %arg8:~0,2% == 8- SET log_file=%8) SET arg9=9%9 IF NOT %arg9:~0,2% == 9 (IF NOT %arg9:~0,2% == 9- SET log_file=%9) -type %log_file% | %D8_PATH%\d8 %tools_dir%splaytree.js %tools_dir%codemap.js %tools_dir%csvparser.js %tools_dir%consarray.js %tools_dir%profile.js %tools_dir%profile_view.js %tools_dir%logreader.js %tools_dir%SourceMap.js %tools_dir%arguments.js %tools_dir%tickprocessor.js %tools_dir%tickprocessor-driver.js -- --windows %* +type %log_file% | %D8_PATH%\d8 --module %tools_dir%tickprocessor-driver.js -- --windows %* diff --git a/deps/v8/tools/zone-stats/details-selection.js b/deps/v8/tools/zone-stats/details-selection.js index 039847b0cf2a15..1e57e0aa5a772f 100644 --- a/deps/v8/tools/zone-stats/details-selection.js +++ b/deps/v8/tools/zone-stats/details-selection.js @@ -262,14 +262,10 @@ defineCustomElement('details-selection', (templateText) => const zone_name = checkbox.value; const zone_data = zones_data.get(zone_name); const zone_allocated = zone_data === undefined ? 0 : zone_data.allocated; - if (zone_allocated == 0) { - checkbox.parentNode.style.display = 'none'; - } else { - const percents = zone_allocated / total_allocated; - const percent_div = checkbox.parentNode.querySelector('.percentBackground'); - percent_div.style.left = (percents * 100) + '%'; - checkbox.parentNode.style.display = 'block'; - } + const percents = zone_allocated / total_allocated; + const percent_div = checkbox.parentNode.querySelector('.percentBackground'); + percent_div.style.left = (percents * 100) + '%'; + checkbox.parentNode.style.display = 'block'; }); } diff --git a/deps/v8/tools/zone-stats/global-timeline.js b/deps/v8/tools/zone-stats/global-timeline.js index e9d7280508a02e..85b5d19d7d1750 100644 --- a/deps/v8/tools/zone-stats/global-timeline.js +++ b/deps/v8/tools/zone-stats/global-timeline.js @@ -120,8 +120,9 @@ defineCustomElement('global-timeline', (templateText) => getZoneData() { const isolate_data = this.data[this.selection.isolate]; - const zone_names = isolate_data.sorted_zone_names; const selected_zones = this.selection.zones; + const zone_names = isolate_data.sorted_zone_names.filter( + zone_name => selected_zones.has(zone_name)); const data_kind = this.selection.data_kind; const show_totals = this.selection.show_totals; const zones_labels = this.getZoneLabels(zone_names); From 500ead20eb26be37c50e2ed5851d56a697f28414 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Zasso?= Date: Thu, 19 Nov 2020 21:14:37 +0100 Subject: [PATCH 02/24] build: reset embedder string to "-node.0" --- common.gypi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common.gypi b/common.gypi index 4745bb5ac77639..bced97234749f6 100644 --- a/common.gypi +++ b/common.gypi @@ -36,7 +36,7 @@ # Reset this number to 0 on major V8 upgrades. # Increment by one for each non-official patch applied to deps/v8. - 'v8_embedder_string': '-node.17', + 'v8_embedder_string': '-node.0', ##### V8 defaults for Node.js ##### From ad8eed3783a50885836c0646e405f7f03e4b4688 Mon Sep 17 00:00:00 2001 From: Refael Ackermann Date: Wed, 27 Mar 2019 10:32:10 -0400 Subject: [PATCH 03/24] deps: V8: un-cherry-pick bd019bd MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Original commit message: [testrunner] delete ancient junit compatible format support Testrunner has ancient support for JUnit compatible XML output. This CL removes this old feature. R=mstarzinger@chromium.org,jgruber@chromium.org,jkummerow@chromium.org CC=​machenbach@chromium.org Bug: v8:8728 Change-Id: I7e1beb011dbaec3aa1a27398a5c52abdd778eaf0 Reviewed-on: https://chromium-review.googlesource.com/c/1430065 Reviewed-by: Jakob Gruber Reviewed-by: Michael Starzinger Commit-Queue: Tamer Tas Cr-Commit-Position: refs/heads/master@{#59045} Refs: https://github.com/v8/v8/commit/bd019bdb725cebaa34327634d73936cd7003d17c PR-URL: https://github.com/nodejs/node/pull/32116 Reviewed-By: Michaël Zasso Reviewed-By: Jiawen Geng Reviewed-By: Ruben Bridgewater --- common.gypi | 2 +- deps/v8/tools/testrunner/base_runner.py | 6 +++ .../v8/tools/testrunner/local/junit_output.py | 49 +++++++++++++++++++ deps/v8/tools/testrunner/testproc/progress.py | 40 +++++++++++++++ 4 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 deps/v8/tools/testrunner/local/junit_output.py diff --git a/common.gypi b/common.gypi index bced97234749f6..d79c828b587deb 100644 --- a/common.gypi +++ b/common.gypi @@ -36,7 +36,7 @@ # Reset this number to 0 on major V8 upgrades. # Increment by one for each non-official patch applied to deps/v8. - 'v8_embedder_string': '-node.0', + 'v8_embedder_string': '-node.1', ##### V8 defaults for Node.js ##### diff --git a/deps/v8/tools/testrunner/base_runner.py b/deps/v8/tools/testrunner/base_runner.py index 54a9e61b160a92..d3674a4f8b9ff8 100644 --- a/deps/v8/tools/testrunner/base_runner.py +++ b/deps/v8/tools/testrunner/base_runner.py @@ -351,6 +351,9 @@ def _add_parser_default_options(self, parser): help="Path to a file for storing json results.") parser.add_option('--slow-tests-cutoff', type="int", default=100, help='Collect N slowest tests') + parser.add_option("--junitout", help="File name of the JUnit output") + parser.add_option("--junittestsuite", default="v8tests", + help="The testsuite name in the JUnit output file") parser.add_option("--exit-after-n-failures", type="int", default=100, help="Exit after the first N failures instead of " "running all tests. Pass 0 to disable this feature.") @@ -757,6 +760,9 @@ def _get_shard_info(self, options): def _create_progress_indicators(self, test_count, options): procs = [PROGRESS_INDICATORS[options.progress]()] + if options.junitout: + procs.append(progress.JUnitTestProgressIndicator(options.junitout, + options.junittestsuite)) if options.json_test_results: procs.append(progress.JsonTestProgressIndicator(self.framework_name)) diff --git a/deps/v8/tools/testrunner/local/junit_output.py b/deps/v8/tools/testrunner/local/junit_output.py new file mode 100644 index 00000000000000..52f31ec422a69b --- /dev/null +++ b/deps/v8/tools/testrunner/local/junit_output.py @@ -0,0 +1,49 @@ +# Copyright 2013 the V8 project authors. 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. + + +import xml.etree.ElementTree as xml + + +class JUnitTestOutput: + def __init__(self, test_suite_name): + self.root = xml.Element("testsuite") + self.root.attrib["name"] = test_suite_name + + def HasRunTest(self, test_name, test_cmd, test_duration, test_failure): + testCaseElement = xml.Element("testcase") + testCaseElement.attrib["name"] = test_name + testCaseElement.attrib["cmd"] = test_cmd + testCaseElement.attrib["time"] = str(round(test_duration, 3)) + if len(test_failure): + failureElement = xml.Element("failure") + failureElement.text = test_failure + testCaseElement.append(failureElement) + self.root.append(testCaseElement) + + def FinishAndWrite(self, f): + xml.ElementTree(self.root).write(f, "UTF-8") diff --git a/deps/v8/tools/testrunner/testproc/progress.py b/deps/v8/tools/testrunner/testproc/progress.py index 9ff943a5c2b4bd..634ef7c2f2e3c0 100644 --- a/deps/v8/tools/testrunner/testproc/progress.py +++ b/deps/v8/tools/testrunner/testproc/progress.py @@ -15,6 +15,7 @@ from . import base from . import util +from ..local import junit_output def print_failure_header(test): @@ -348,6 +349,45 @@ def _clear_line(self, last_length): print(("\r" + (" " * last_length) + "\r"), end='') +class JUnitTestProgressIndicator(ProgressIndicator): + def __init__(self, junitout, junittestsuite): + super(JUnitTestProgressIndicator, self).__init__() + self._requirement = base.DROP_PASS_STDOUT + + self.outputter = junit_output.JUnitTestOutput(junittestsuite) + if junitout: + self.outfile = open(junitout, "w") + else: + self.outfile = sys.stdout + + def _on_result_for(self, test, result): + # TODO(majeski): Support for dummy/grouped results + fail_text = "" + output = result.output + if result.has_unexpected_output: + stdout = output.stdout.strip() + if len(stdout): + fail_text += "stdout:\n%s\n" % stdout + stderr = output.stderr.strip() + if len(stderr): + fail_text += "stderr:\n%s\n" % stderr + fail_text += "Command: %s" % result.cmd.to_string() + if output.HasCrashed(): + fail_text += "exit code: %d\n--- CRASHED ---" % output.exit_code + if output.HasTimedOut(): + fail_text += "--- TIMEOUT ---" + self.outputter.HasRunTest( + test_name=str(test), + test_cmd=result.cmd.to_string(relative=True), + test_duration=output.duration, + test_failure=fail_text) + + def finished(self): + self.outputter.FinishAndWrite(self.outfile) + if self.outfile != sys.stdout: + self.outfile.close() + + class JsonTestProgressIndicator(ProgressIndicator): def __init__(self, framework_name): super(JsonTestProgressIndicator, self).__init__() From 6da0120d85a939037e33363e3b4a484a01e218c6 Mon Sep 17 00:00:00 2001 From: Ujjwal Sharma Date: Sat, 14 Sep 2019 09:20:31 +0530 Subject: [PATCH 04/24] deps: patch V8 to run on older XCode versions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Patch V8 (compiler/js-heap-broker.cc) to remove the use of an optional property, which is a fairly new C++ feature, since that requires a newer XCode version than the minimum requirement in BUILDING.md and thus breaks CI. PR-URL: https://github.com/nodejs/node/pull/32116 Reviewed-By: Michaël Zasso Reviewed-By: Jiawen Geng Reviewed-By: Ruben Bridgewater --- common.gypi | 2 +- deps/v8/src/compiler/js-heap-broker.cc | 1 + deps/v8/src/interpreter/interpreter.cc | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/common.gypi b/common.gypi index d79c828b587deb..62081cb7af3b0b 100644 --- a/common.gypi +++ b/common.gypi @@ -36,7 +36,7 @@ # Reset this number to 0 on major V8 upgrades. # Increment by one for each non-official patch applied to deps/v8. - 'v8_embedder_string': '-node.1', + 'v8_embedder_string': '-node.2', ##### V8 defaults for Node.js ##### diff --git a/deps/v8/src/compiler/js-heap-broker.cc b/deps/v8/src/compiler/js-heap-broker.cc index be05929bbc7ced..e3e009bc45848a 100644 --- a/deps/v8/src/compiler/js-heap-broker.cc +++ b/deps/v8/src/compiler/js-heap-broker.cc @@ -4466,6 +4466,7 @@ GlobalAccessFeedback::GlobalAccessFeedback(PropertyCellRef cell, GlobalAccessFeedback::GlobalAccessFeedback(FeedbackSlotKind slot_kind) : ProcessedFeedback(kGlobalAccess, slot_kind), + cell_or_context_(base::nullopt), index_and_immutable_(0 /* doesn't matter */) { DCHECK(IsGlobalICKind(slot_kind)); } diff --git a/deps/v8/src/interpreter/interpreter.cc b/deps/v8/src/interpreter/interpreter.cc index 28dd10a576d5f7..702c0474bcbd67 100644 --- a/deps/v8/src/interpreter/interpreter.cc +++ b/deps/v8/src/interpreter/interpreter.cc @@ -286,7 +286,7 @@ Interpreter::NewSourcePositionCollectionJob( auto job = std::make_unique(parse_info, literal, allocator, nullptr); job->compilation_info()->SetBytecodeArray(existing_bytecode); - return job; + return std::unique_ptr { static_cast(job.release()) }; } void Interpreter::ForEachBytecode( From 3fac79889157a7b98bf1df231254e304c768785c Mon Sep 17 00:00:00 2001 From: Refael Ackermann Date: Wed, 22 May 2019 11:33:02 -0400 Subject: [PATCH 05/24] deps: V8: patch register-arm64.h MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes a compilation issue on some platforms PR-URL: https://github.com/nodejs/node/pull/32116 Reviewed-By: Michaël Zasso Reviewed-By: Jiawen Geng Reviewed-By: Ruben Bridgewater --- common.gypi | 2 +- deps/v8/src/codegen/arm64/register-arm64.h | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/common.gypi b/common.gypi index 62081cb7af3b0b..251da62453cc32 100644 --- a/common.gypi +++ b/common.gypi @@ -36,7 +36,7 @@ # Reset this number to 0 on major V8 upgrades. # Increment by one for each non-official patch applied to deps/v8. - 'v8_embedder_string': '-node.2', + 'v8_embedder_string': '-node.3', ##### V8 defaults for Node.js ##### diff --git a/deps/v8/src/codegen/arm64/register-arm64.h b/deps/v8/src/codegen/arm64/register-arm64.h index fbbb0a18dadf8f..31620ae9658f2f 100644 --- a/deps/v8/src/codegen/arm64/register-arm64.h +++ b/deps/v8/src/codegen/arm64/register-arm64.h @@ -524,6 +524,8 @@ using Simd128Register = VRegister; // Lists of registers. class V8_EXPORT_PRIVATE CPURegList { public: + CPURegList() = default; + template explicit CPURegList(CPURegister reg0, CPURegisters... regs) : list_(CPURegister::ListOf(reg0, regs...)), From a79d6817945fc08bab9798f94ee185f0b749954d Mon Sep 17 00:00:00 2001 From: Refael Ackermann Date: Wed, 22 May 2019 11:47:16 -0400 Subject: [PATCH 06/24] deps: V8: forward declaration of `Rtl*FunctionTable` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This should be semver-patch since actual invocation is version conditional. PR-URL: https://github.com/nodejs/node/pull/32116 Reviewed-By: Michaël Zasso Reviewed-By: Jiawen Geng Reviewed-By: Ruben Bridgewater --- common.gypi | 2 +- .../src/diagnostics/unwinding-info-win64.cc | 31 +++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/common.gypi b/common.gypi index 251da62453cc32..e7e83c71fef4c5 100644 --- a/common.gypi +++ b/common.gypi @@ -36,7 +36,7 @@ # Reset this number to 0 on major V8 upgrades. # Increment by one for each non-official patch applied to deps/v8. - 'v8_embedder_string': '-node.3', + 'v8_embedder_string': '-node.4', ##### V8 defaults for Node.js ##### diff --git a/deps/v8/src/diagnostics/unwinding-info-win64.cc b/deps/v8/src/diagnostics/unwinding-info-win64.cc index f3b9a753aff231..c39adcf7108289 100644 --- a/deps/v8/src/diagnostics/unwinding-info-win64.cc +++ b/deps/v8/src/diagnostics/unwinding-info-win64.cc @@ -16,6 +16,37 @@ #error "Unsupported OS" #endif // V8_OS_WIN_X64 +// Forward declaration to keep this independent of Win8 +NTSYSAPI +DWORD +NTAPI +RtlAddGrowableFunctionTable( + _Out_ PVOID* DynamicTable, + _In_reads_(MaximumEntryCount) PRUNTIME_FUNCTION FunctionTable, + _In_ DWORD EntryCount, + _In_ DWORD MaximumEntryCount, + _In_ ULONG_PTR RangeBase, + _In_ ULONG_PTR RangeEnd + ); + + +NTSYSAPI +void +NTAPI +RtlGrowFunctionTable( + _Inout_ PVOID DynamicTable, + _In_ DWORD NewEntryCount + ); + + +NTSYSAPI +void +NTAPI +RtlDeleteGrowableFunctionTable( + _In_ PVOID DynamicTable + ); + + namespace v8 { namespace internal { namespace win64_unwindinfo { From 60fb21634de0397fef2b1ab089d0aa1770b9e0fb Mon Sep 17 00:00:00 2001 From: Joao Reis Date: Fri, 1 Nov 2019 08:39:18 +0100 Subject: [PATCH 07/24] deps: make v8.h compatible with VS2015 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit There is a bug in the most recent version of VS2015 that affects v8.h and therefore prevents compilation of addons. Refs: https://stackoverflow.com/q/38378693 PR-URL: https://github.com/nodejs/node/pull/32116 Reviewed-By: Michaël Zasso Reviewed-By: Jiawen Geng Reviewed-By: Ruben Bridgewater --- common.gypi | 2 +- deps/v8/include/v8.h | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/common.gypi b/common.gypi index e7e83c71fef4c5..ee7b36cff465c9 100644 --- a/common.gypi +++ b/common.gypi @@ -36,7 +36,7 @@ # Reset this number to 0 on major V8 upgrades. # Increment by one for each non-official patch applied to deps/v8. - 'v8_embedder_string': '-node.4', + 'v8_embedder_string': '-node.5', ##### V8 defaults for Node.js ##### diff --git a/deps/v8/include/v8.h b/deps/v8/include/v8.h index 32687d90b5f96f..49fe066470c1a0 100644 --- a/deps/v8/include/v8.h +++ b/deps/v8/include/v8.h @@ -1834,9 +1834,11 @@ class V8_EXPORT ScriptCompiler { public: enum Encoding { ONE_BYTE, TWO_BYTE, UTF8 }; +#if defined(_MSC_VER) && _MSC_VER >= 1910 /* Disable on VS2015 */ V8_DEPRECATE_SOON( "This class takes ownership of source_stream, so use the constructor " "taking a unique_ptr to make these semantics clearer") +#endif StreamedSource(ExternalSourceStream* source_stream, Encoding encoding); StreamedSource(std::unique_ptr source_stream, Encoding encoding); From dc721eedfba54e8f7278bddb73daebda455ea545 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Zasso?= Date: Wed, 27 Mar 2019 17:57:28 +0100 Subject: [PATCH 08/24] deps: V8: silence irrelevant warnings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR-URL: https://github.com/nodejs/node/pull/26685 Reviewed-By: Anna Henningsen Reviewed-By: Michaël Zasso Reviewed-By: Refael Ackermann PR-URL: https://github.com/nodejs/node/pull/32116 Reviewed-By: Jiawen Geng Reviewed-By: Ruben Bridgewater --- common.gypi | 2 +- deps/v8/include/v8.h | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/common.gypi b/common.gypi index ee7b36cff465c9..80cb4f44edef7a 100644 --- a/common.gypi +++ b/common.gypi @@ -36,7 +36,7 @@ # Reset this number to 0 on major V8 upgrades. # Increment by one for each non-official patch applied to deps/v8. - 'v8_embedder_string': '-node.5', + 'v8_embedder_string': '-node.6', ##### V8 defaults for Node.js ##### diff --git a/deps/v8/include/v8.h b/deps/v8/include/v8.h index 49fe066470c1a0..e2871f1c9d8fd7 100644 --- a/deps/v8/include/v8.h +++ b/deps/v8/include/v8.h @@ -7375,7 +7375,6 @@ class PromiseRejectMessage { typedef void (*PromiseRejectCallback)(PromiseRejectMessage message); // --- Microtasks Callbacks --- -V8_DEPRECATE_SOON("Use *WithData version.") typedef void (*MicrotasksCompletedCallback)(Isolate*); typedef void (*MicrotasksCompletedCallbackWithData)(Isolate*, void*); typedef void (*MicrotaskCallback)(void* data); From b4e1287bb9af4504e1dd3a3cfb8915fafe83396a Mon Sep 17 00:00:00 2001 From: Matheus Marchini Date: Tue, 10 Mar 2020 16:58:15 -0700 Subject: [PATCH 09/24] deps: patch V8 to run on Xcode 8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Patch V8 (wasm/wasm-module.cc) to remove const qualifier from type passed to template call of `OwnedVector::Of`. Xcode 8 can't convert 'OwnedVector' to 'OwnedVector' when returning from a function (which is likely a bug on Xcode, considering this worked on the prior version of Xcode as well as newer versions). This workaround shouldn't affect the application, since the const qualifier is preserved in the AsmJsOffsetInformation::encoded_offset_. There's also a V8 test passing a const-qualified type to ::Of, but since we don't test V8 on Xcode 8, it should be fine to leave it as is. Signed-off-by: Matheus Marchini PR-URL: https://github.com/nodejs/node/pull/32116 Reviewed-By: Michaël Zasso Reviewed-By: Jiawen Geng Reviewed-By: Ruben Bridgewater --- common.gypi | 2 +- deps/v8/src/wasm/wasm-module.cc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/common.gypi b/common.gypi index 80cb4f44edef7a..3a5e7fb2cfefb2 100644 --- a/common.gypi +++ b/common.gypi @@ -36,7 +36,7 @@ # Reset this number to 0 on major V8 upgrades. # Increment by one for each non-official patch applied to deps/v8. - 'v8_embedder_string': '-node.6', + 'v8_embedder_string': '-node.7', ##### V8 defaults for Node.js ##### diff --git a/deps/v8/src/wasm/wasm-module.cc b/deps/v8/src/wasm/wasm-module.cc index 51b2ebcd939c0a..3d935f27be143b 100644 --- a/deps/v8/src/wasm/wasm-module.cc +++ b/deps/v8/src/wasm/wasm-module.cc @@ -137,7 +137,7 @@ void LazilyGeneratedNames::AddForTesting(int function_index, AsmJsOffsetInformation::AsmJsOffsetInformation( Vector encoded_offsets) - : encoded_offsets_(OwnedVector::Of(encoded_offsets)) {} + : encoded_offsets_(OwnedVector::Of(encoded_offsets)) {} AsmJsOffsetInformation::~AsmJsOffsetInformation() = default; From cfd934fb5830e5b9efefdc05703f485687adf673 Mon Sep 17 00:00:00 2001 From: cjihrig Date: Sat, 4 Jul 2020 12:34:50 -0400 Subject: [PATCH 10/24] deps: update V8 postmortem metadata script This commit updates V8's gen-postmortem-metadata.py script to fix SmartOS compilation for V8 8.4. PR-URL: https://github.com/nodejs/node/pull/33579 Reviewed-By: Matteo Collina Reviewed-By: Jiawen Geng Reviewed-By: Michael Dawson Reviewed-By: Rich Trott Reviewed-By: Shelley Vohr --- common.gypi | 2 +- deps/v8/tools/gen-postmortem-metadata.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/common.gypi b/common.gypi index 3a5e7fb2cfefb2..59318710310074 100644 --- a/common.gypi +++ b/common.gypi @@ -36,7 +36,7 @@ # Reset this number to 0 on major V8 upgrades. # Increment by one for each non-official patch applied to deps/v8. - 'v8_embedder_string': '-node.7', + 'v8_embedder_string': '-node.8', ##### V8 defaults for Node.js ##### diff --git a/deps/v8/tools/gen-postmortem-metadata.py b/deps/v8/tools/gen-postmortem-metadata.py index 84b9ad49905cc5..a67897ac4d1af1 100644 --- a/deps/v8/tools/gen-postmortem-metadata.py +++ b/deps/v8/tools/gen-postmortem-metadata.py @@ -277,6 +277,7 @@ 'SlicedString, offset, SMI, kOffsetOffset', 'ThinString, actual, String, kActualOffset', 'Symbol, name, Object, kDescriptionOffset', + 'FixedArrayBase, length, SMI, kLengthOffset', ]; # From 7f96548e4aa22a19f1f833dfd9241222a7035abe Mon Sep 17 00:00:00 2001 From: cjihrig Date: Tue, 15 Sep 2020 00:18:50 -0400 Subject: [PATCH 11/24] deps: update V8 postmortem metadata script This commit updates V8's gen-postmortem-metadata.py script to fix SmartOS compilation with V8 8.5. PR-URL: https://github.com/nodejs/node/pull/35415 Reviewed-By: Rich Trott Reviewed-By: Jiawen Geng Reviewed-By: Daniel Bevenius Reviewed-By: Matteo Collina Reviewed-By: Myles Borins --- common.gypi | 2 +- deps/v8/tools/gen-postmortem-metadata.py | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/common.gypi b/common.gypi index 59318710310074..3eda0054dc79b1 100644 --- a/common.gypi +++ b/common.gypi @@ -36,7 +36,7 @@ # Reset this number to 0 on major V8 upgrades. # Increment by one for each non-official patch applied to deps/v8. - 'v8_embedder_string': '-node.8', + 'v8_embedder_string': '-node.9', ##### V8 defaults for Node.js ##### diff --git a/deps/v8/tools/gen-postmortem-metadata.py b/deps/v8/tools/gen-postmortem-metadata.py index a67897ac4d1af1..07883bb71be1f1 100644 --- a/deps/v8/tools/gen-postmortem-metadata.py +++ b/deps/v8/tools/gen-postmortem-metadata.py @@ -263,6 +263,8 @@ 'UncompiledData, inferred_name, String, kInferredNameOffset', 'UncompiledData, start_position, int32_t, kStartPositionOffset', 'UncompiledData, end_position, int32_t, kEndPositionOffset', + 'Script, name, Object, kNameOffset', + 'Script, line_ends, Object, kLineEndsOffset', 'SharedFunctionInfo, raw_function_token_offset, int16_t, kFunctionTokenOffsetOffset', 'SharedFunctionInfo, internal_formal_parameter_count, uint16_t, kFormalParameterCountOffset', 'SharedFunctionInfo, flags, int, kFlagsOffset', From 5e10ebbdb68523c86b51bf78baaa5233b5bcffd1 Mon Sep 17 00:00:00 2001 From: Jiawen Geng Date: Wed, 14 Oct 2020 12:22:20 +0000 Subject: [PATCH 12/24] deps: fix V8 build issue with inline methods PR-URL: https://github.com/nodejs/node/pull/35415 Reviewed-By: Rich Trott Reviewed-By: Jiawen Geng Reviewed-By: Daniel Bevenius Reviewed-By: Matteo Collina Reviewed-By: Myles Borins --- common.gypi | 2 +- deps/v8/src/objects/fixed-array-inl.h | 2 ++ deps/v8/src/objects/fixed-array.h | 11 +++++++++++ deps/v8/src/objects/tagged-field.h | 6 +++--- 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/common.gypi b/common.gypi index 3eda0054dc79b1..713a1d2fa6a50b 100644 --- a/common.gypi +++ b/common.gypi @@ -36,7 +36,7 @@ # Reset this number to 0 on major V8 upgrades. # Increment by one for each non-official patch applied to deps/v8. - 'v8_embedder_string': '-node.9', + 'v8_embedder_string': '-node.10', ##### V8 defaults for Node.js ##### diff --git a/deps/v8/src/objects/fixed-array-inl.h b/deps/v8/src/objects/fixed-array-inl.h index e60224315826c7..ed2d952b96bd51 100644 --- a/deps/v8/src/objects/fixed-array-inl.h +++ b/deps/v8/src/objects/fixed-array-inl.h @@ -87,6 +87,7 @@ bool FixedArray::is_the_hole(Isolate* isolate, int index) { return get(isolate, index).IsTheHole(isolate); } +#if !defined(_WIN32) || defined(_WIN64) void FixedArray::set(int index, Smi value) { DCHECK_NE(map(), GetReadOnlyRoots().fixed_cow_array_map()); DCHECK_LT(static_cast(index), static_cast(length())); @@ -94,6 +95,7 @@ void FixedArray::set(int index, Smi value) { int offset = OffsetOfElementAt(index); RELAXED_WRITE_FIELD(*this, offset, value); } +#endif void FixedArray::set(int index, Object value) { DCHECK_NE(GetReadOnlyRoots().fixed_cow_array_map(), map()); diff --git a/deps/v8/src/objects/fixed-array.h b/deps/v8/src/objects/fixed-array.h index 5054f16b4105ce..13148b20993049 100644 --- a/deps/v8/src/objects/fixed-array.h +++ b/deps/v8/src/objects/fixed-array.h @@ -122,7 +122,18 @@ class FixedArray inline bool is_the_hole(Isolate* isolate, int index); // Setter that doesn't need write barrier. +#if defined(_WIN32) && !defined(_WIN64) + inline void set(int index, Smi value) { + DCHECK_NE(map(), GetReadOnlyRoots().fixed_cow_array_map()); + DCHECK_LT(static_cast(index), static_cast(length())); + DCHECK(Object(value).IsSmi()); + int offset = OffsetOfElementAt(index); + RELAXED_WRITE_FIELD(*this, offset, value); + } +#else inline void set(int index, Smi value); +#endif + // Setter with explicit barrier mode. inline void set(int index, Object value, WriteBarrierMode mode); diff --git a/deps/v8/src/objects/tagged-field.h b/deps/v8/src/objects/tagged-field.h index 947bf6247b5ff2..82b6268ecd4941 100644 --- a/deps/v8/src/objects/tagged-field.h +++ b/deps/v8/src/objects/tagged-field.h @@ -45,11 +45,11 @@ class TaggedField : public AllStatic { static inline T Relaxed_Load(HeapObject host, int offset = 0); template - static inline T Relaxed_Load(const LocalIsolate* isolate, HeapObject host, - int offset = 0); + static T Relaxed_Load(const LocalIsolate* isolate, HeapObject host, + int offset = 0); static inline void Relaxed_Store(HeapObject host, T value); - static inline void Relaxed_Store(HeapObject host, int offset, T value); + static void Relaxed_Store(HeapObject host, int offset, T value); static inline T Acquire_Load(HeapObject host, int offset = 0); template From ed898f7e6679ede1ce77066e76c78af360e85057 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Zasso?= Date: Wed, 14 Oct 2020 10:39:25 +0200 Subject: [PATCH 13/24] deps: V8: cherry-pick d76abfed3512 Original commit message: [wasm-simd][arm64] fix cross compile arm64 on windows See: https://github.com/nodejs/node/pull/35415 Change-Id: I5d77ae202d4bbfb0971246fe5de9c0ad17c485ff Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2459491 Reviewed-by: Tobias Tebbi Auto-Submit: Jiawen Geng Commit-Queue: Tobias Tebbi Cr-Commit-Position: refs/heads/master@{#70444} Refs: https://github.com/v8/v8/commit/d76abfed3512ceabf91ee1a148845c7592030f76 PR-URL: https://github.com/nodejs/node/pull/35415 Reviewed-By: Rich Trott Reviewed-By: Jiawen Geng Reviewed-By: Daniel Bevenius Reviewed-By: Matteo Collina Reviewed-By: Myles Borins --- common.gypi | 2 +- deps/v8/src/compiler/machine-operator.h | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/common.gypi b/common.gypi index 713a1d2fa6a50b..943bab5add3387 100644 --- a/common.gypi +++ b/common.gypi @@ -36,7 +36,7 @@ # Reset this number to 0 on major V8 upgrades. # Increment by one for each non-official patch applied to deps/v8. - 'v8_embedder_string': '-node.10', + 'v8_embedder_string': '-node.11', ##### V8 defaults for Node.js ##### diff --git a/deps/v8/src/compiler/machine-operator.h b/deps/v8/src/compiler/machine-operator.h index 702c05022373a1..8c373fd6ca1aaa 100644 --- a/deps/v8/src/compiler/machine-operator.h +++ b/deps/v8/src/compiler/machine-operator.h @@ -197,6 +197,8 @@ ShiftKind ShiftKindOf(Operator const*) V8_WARN_UNUSED_RESULT; // makes it easier to detect an overflow. This parameter is ignored on platforms // like x64 and ia32 where a range overflow does not result in INT_MAX. enum class TruncateKind { kArchitectureDefault, kSetOverflowToMin }; +std::ostream& operator<<(std::ostream& os, TruncateKind kind); +size_t hash_value(TruncateKind kind); // Interface for building machine-level operators. These operators are // machine-level but machine-independent and thus define a language suitable From e262dabce012299b3013e7a7799ade8bbb63b2bc Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Mon, 12 Oct 2020 15:01:58 +0200 Subject: [PATCH 14/24] deps: V8: cherry-pick 3176bfd447a9 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Original commit message: [heap-profiler] Fix crash when a snapshot deleted while taking one Fix a crash/hang that occurred when deleting a snapshot during the GC that is part of taking another one. Specifically, when deleting the only other snapshot in such a situation, the `v8::HeapSnapshot::Delete()` method sees that there is only one (complete) snapshot at that point, and decides that it is okay to perform “delete all snapshots” instead of just deleting the requested one. That resets the internal string lookup table of the heap profiler, but the new snapshot that is currently in progress still holds references to the old string lookup table, leading to a use-after-free segfault or infinite loop. Fix this by guarding against resetting the string table while another heap snapshot is being taken, and add a test that would crash before this fix. This can be triggered in Node.js by repeatedly calling `v8.getHeapSnapshot()`, which provides heap snapshots as weakly held host objects. Change-Id: If9ac3728bf79114000982f1e7bb05e8034299e3c Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2464823 Reviewed-by: Ulan Degenbaev Commit-Queue: Ulan Degenbaev Cr-Commit-Position: refs/heads/master@{#70445} Refs: https://github.com/v8/v8/commit/3176bfd447a909fa9608687fe3eabcf62ec7b2eb PR-URL: https://github.com/nodejs/node/pull/35612 Refs: https://github.com/nodejs/node/issues/35559 Reviewed-By: Michaël Zasso Reviewed-By: Colin Ihrig Reviewed-By: Richard Lau Reviewed-By: Jiawen Geng Reviewed-By: Rich Trott Reviewed-By: Gireesh Punathil Reviewed-By: Gerhard Stöbich --- common.gypi | 2 +- deps/v8/src/api/api.cc | 3 +- deps/v8/src/profiler/heap-profiler.cc | 12 ++++++-- deps/v8/src/profiler/heap-profiler.h | 4 ++- deps/v8/test/cctest/test-heap-profiler.cc | 37 +++++++++++++++++++++++ 5 files changed, 52 insertions(+), 6 deletions(-) diff --git a/common.gypi b/common.gypi index 943bab5add3387..5e5ac96a78fa29 100644 --- a/common.gypi +++ b/common.gypi @@ -36,7 +36,7 @@ # Reset this number to 0 on major V8 upgrades. # Increment by one for each non-official patch applied to deps/v8. - 'v8_embedder_string': '-node.11', + 'v8_embedder_string': '-node.12', ##### V8 defaults for Node.js ##### diff --git a/deps/v8/src/api/api.cc b/deps/v8/src/api/api.cc index b49ad728a8e4d5..c27db3e7b876e0 100644 --- a/deps/v8/src/api/api.cc +++ b/deps/v8/src/api/api.cc @@ -10870,7 +10870,8 @@ static i::HeapSnapshot* ToInternal(const HeapSnapshot* snapshot) { void HeapSnapshot::Delete() { i::Isolate* isolate = ToInternal(this)->profiler()->isolate(); - if (isolate->heap_profiler()->GetSnapshotsCount() > 1) { + if (isolate->heap_profiler()->GetSnapshotsCount() > 1 || + isolate->heap_profiler()->IsTakingSnapshot()) { ToInternal(this)->Delete(); } else { // If this is the last snapshot, clean up all accessory data as well. diff --git a/deps/v8/src/profiler/heap-profiler.cc b/deps/v8/src/profiler/heap-profiler.cc index f063fd1f476ad3..fc9bd00f47dd0f 100644 --- a/deps/v8/src/profiler/heap-profiler.cc +++ b/deps/v8/src/profiler/heap-profiler.cc @@ -18,7 +18,8 @@ namespace internal { HeapProfiler::HeapProfiler(Heap* heap) : ids_(new HeapObjectsMap(heap)), names_(new StringsStorage()), - is_tracking_object_moves_(false) {} + is_tracking_object_moves_(false), + is_taking_snapshot_(false) {} HeapProfiler::~HeapProfiler() = default; @@ -28,7 +29,8 @@ void HeapProfiler::DeleteAllSnapshots() { } void HeapProfiler::MaybeClearStringsStorage() { - if (snapshots_.empty() && !sampling_heap_profiler_ && !allocation_tracker_) { + if (snapshots_.empty() && !sampling_heap_profiler_ && !allocation_tracker_ && + !is_taking_snapshot_) { names_.reset(new StringsStorage()); } } @@ -66,6 +68,7 @@ HeapSnapshot* HeapProfiler::TakeSnapshot( v8::ActivityControl* control, v8::HeapProfiler::ObjectNameResolver* resolver, bool treat_global_objects_as_roots) { + is_taking_snapshot_ = true; HeapSnapshot* result = new HeapSnapshot(this, treat_global_objects_as_roots); { HeapSnapshotGenerator generator(result, control, resolver, heap()); @@ -78,6 +81,7 @@ HeapSnapshot* HeapProfiler::TakeSnapshot( } ids_->RemoveDeadEntries(); is_tracking_object_moves_ = true; + is_taking_snapshot_ = false; heap()->isolate()->debug()->feature_tracker()->Track( DebugFeatureTracker::kHeapSnapshot); @@ -138,10 +142,12 @@ void HeapProfiler::StopHeapObjectsTracking() { } } -int HeapProfiler::GetSnapshotsCount() { +int HeapProfiler::GetSnapshotsCount() const { return static_cast(snapshots_.size()); } +bool HeapProfiler::IsTakingSnapshot() const { return is_taking_snapshot_; } + HeapSnapshot* HeapProfiler::GetSnapshot(int index) { return snapshots_.at(index).get(); } diff --git a/deps/v8/src/profiler/heap-profiler.h b/deps/v8/src/profiler/heap-profiler.h index 0d964b5c5d606a..21d9bb8fcfd815 100644 --- a/deps/v8/src/profiler/heap-profiler.h +++ b/deps/v8/src/profiler/heap-profiler.h @@ -49,7 +49,8 @@ class HeapProfiler : public HeapObjectAllocationTracker { SnapshotObjectId PushHeapObjectsStats(OutputStream* stream, int64_t* timestamp_us); - int GetSnapshotsCount(); + int GetSnapshotsCount() const; + bool IsTakingSnapshot() const; HeapSnapshot* GetSnapshot(int index); SnapshotObjectId GetSnapshotObjectId(Handle obj); SnapshotObjectId GetSnapshotObjectId(NativeObject obj); @@ -93,6 +94,7 @@ class HeapProfiler : public HeapObjectAllocationTracker { std::unique_ptr names_; std::unique_ptr allocation_tracker_; bool is_tracking_object_moves_; + bool is_taking_snapshot_; base::Mutex profiler_mutex_; std::unique_ptr sampling_heap_profiler_; std::vector> diff --git a/deps/v8/test/cctest/test-heap-profiler.cc b/deps/v8/test/cctest/test-heap-profiler.cc index 9eff4cbfc1533a..f6197e92872476 100644 --- a/deps/v8/test/cctest/test-heap-profiler.cc +++ b/deps/v8/test/cctest/test-heap-profiler.cc @@ -4119,3 +4119,40 @@ TEST(Bug8373_2) { heap_profiler->StopTrackingHeapObjects(); } + +TEST(HeapSnapshotDeleteDuringTakeSnapshot) { + // Check that a heap snapshot can be deleted during GC while another one + // is being taken. + + LocalContext env; + v8::HandleScope scope(env->GetIsolate()); + v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); + int gc_calls = 0; + v8::Global handle; + + { + struct WeakData { + const v8::HeapSnapshot* snapshot; + int* gc_calls; + v8::Global* handle; + }; + WeakData* data = + new WeakData{heap_profiler->TakeHeapSnapshot(), &gc_calls, &handle}; + + v8::HandleScope scope(env->GetIsolate()); + handle.Reset(env->GetIsolate(), v8::Object::New(env->GetIsolate())); + handle.SetWeak( + data, + [](const v8::WeakCallbackInfo& data) { + std::unique_ptr weakdata{data.GetParameter()}; + const_cast(weakdata->snapshot)->Delete(); + ++*weakdata->gc_calls; + weakdata->handle->Reset(); + }, + v8::WeakCallbackType::kParameter); + } + CHECK_EQ(gc_calls, 0); + + CHECK(ValidateSnapshot(heap_profiler->TakeHeapSnapshot())); + CHECK_EQ(gc_calls, 1); +} From 6218c1c73459a2eca989650c28caad223dd9e351 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Zasso?= Date: Mon, 19 Oct 2020 10:30:24 +0200 Subject: [PATCH 15/24] deps: V8: cherry-pick 7b3a27b7ae65 Original commit message: fix: correct calling convention for Windows on Arm Corrects a "Check failed: kFPParamRegisterCount == kParamRegisterCount" message when compiling v8_snapshot for Windows on Arm. Unlike x64, Windows on Arm's calling convention does not alternate between integer and float registers. Bug: chromium:1052746 Change-Id: I4c9cdafcd6e43742b94613f85b2983761cc0891a Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2440717 Commit-Queue: Maya Lekova Reviewed-by: Jakob Gruber Reviewed-by: Maya Lekova Cr-Commit-Position: refs/heads/master@{#70257} Refs: https://github.com/v8/v8/commit/7b3a27b7ae65333534aea3cafc2a3f16c50e270e PR-URL: https://github.com/nodejs/node/pull/35700 Reviewed-By: Rich Trott Reviewed-By: Colin Ihrig Reviewed-By: Joyee Cheung Reviewed-By: Matteo Collina Reviewed-By: Jiawen Geng Reviewed-By: Shelley Vohr --- common.gypi | 2 +- deps/v8/src/compiler/c-linkage.cc | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/common.gypi b/common.gypi index 5e5ac96a78fa29..d9d29fdca1579c 100644 --- a/common.gypi +++ b/common.gypi @@ -36,7 +36,7 @@ # Reset this number to 0 on major V8 upgrades. # Increment by one for each non-official patch applied to deps/v8. - 'v8_embedder_string': '-node.12', + 'v8_embedder_string': '-node.13', ##### V8 defaults for Node.js ##### diff --git a/deps/v8/src/compiler/c-linkage.cc b/deps/v8/src/compiler/c-linkage.cc index af467f2bb14116..5b395067f08ec0 100644 --- a/deps/v8/src/compiler/c-linkage.cc +++ b/deps/v8/src/compiler/c-linkage.cc @@ -139,7 +139,7 @@ namespace { #endif } // namespace -#ifdef V8_TARGET_OS_WIN +#if defined(V8_TARGET_OS_WIN) && defined(V8_TARGET_ARCH_X64) // As defined in // https://docs.microsoft.com/en-us/cpp/build/x64-calling-convention?view=vs-2019#parameter-passing, // Windows calling convention doesn't differentiate between GP and FP params @@ -176,11 +176,12 @@ void BuildParameterLocations(const MachineSignature* msig, } } } -#else // V8_TARGET_OS_WIN +#else // defined(V8_TARGET_OS_WIN) && defined(V8_TARGET_ARCH_X64) // As defined in https://www.agner.org/optimize/calling_conventions.pdf, // Section 7, Linux and Mac place parameters in consecutive registers, // differentiating between GP and FP params. That's why we maintain two -// separate counters here. +// separate counters here. This also applies to Arm systems following +// the AAPCS and Windows on Arm. void BuildParameterLocations(const MachineSignature* msig, size_t kFPParamRegisterCount, size_t kParamRegisterCount, @@ -216,7 +217,7 @@ void BuildParameterLocations(const MachineSignature* msig, } } } -#endif // V8_TARGET_OS_WIN +#endif // defined(V8_TARGET_OS_WIN) && defined(V8_TARGET_ARCH_X64) // General code uses the above configuration data. CallDescriptor* Linkage::GetSimplifiedCDescriptor(Zone* zone, From 685fbe2d4915f8e869ca3979d033196014c41131 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Zasso?= Date: Wed, 21 Oct 2020 08:50:37 +0200 Subject: [PATCH 16/24] deps: V8: cherry-pick 45e49775f5a3 Original commit message: [arm64][msvc] fix arm64 build on msvc See: https://github.com/nodejs/node/pull/35415#issuecomment-707828213 Co-authored-by: Richard Townsend Change-Id: I440644f55dc8c8ec3108e5015ebbce2829dd8207 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2479602 Reviewed-by: Jakob Gruber Commit-Queue: Jakob Gruber Auto-Submit: Jiawen Geng Cr-Commit-Position: refs/heads/master@{#70648} Refs: https://github.com/v8/v8/commit/45e49775f5a366e4d56de8a043da9d6093d9510e PR-URL: https://github.com/nodejs/node/pull/35700 Reviewed-By: Rich Trott Reviewed-By: Colin Ihrig Reviewed-By: Joyee Cheung Reviewed-By: Matteo Collina Reviewed-By: Jiawen Geng Reviewed-By: Shelley Vohr --- common.gypi | 2 +- .../src/snapshot/embedded/platform-embedded-file-writer-win.cc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/common.gypi b/common.gypi index d9d29fdca1579c..aaedbd14bfe597 100644 --- a/common.gypi +++ b/common.gypi @@ -36,7 +36,7 @@ # Reset this number to 0 on major V8 upgrades. # Increment by one for each non-official patch applied to deps/v8. - 'v8_embedder_string': '-node.13', + 'v8_embedder_string': '-node.14', ##### V8 defaults for Node.js ##### diff --git a/deps/v8/src/snapshot/embedded/platform-embedded-file-writer-win.cc b/deps/v8/src/snapshot/embedded/platform-embedded-file-writer-win.cc index 310da35a7e9ae6..e3250084c4ded3 100644 --- a/deps/v8/src/snapshot/embedded/platform-embedded-file-writer-win.cc +++ b/deps/v8/src/snapshot/embedded/platform-embedded-file-writer-win.cc @@ -485,7 +485,7 @@ void PlatformEmbeddedFileWriterWin::Comment(const char* string) { void PlatformEmbeddedFileWriterWin::DeclareLabel(const char* name) { if (target_arch_ == EmbeddedTargetArch::kArm64) { - fprintf(fp_, "%s%s\t", SYMBOL_PREFIX, name); + fprintf(fp_, "%s%s\n", SYMBOL_PREFIX, name); } else { fprintf(fp_, "%s%s LABEL %s\n", SYMBOL_PREFIX, name, From 1772fe1160157a3a71f94a872b63be695d452903 Mon Sep 17 00:00:00 2001 From: Daniel Bevenius Date: Tue, 3 Nov 2020 05:51:45 +0100 Subject: [PATCH 17/24] deps: cherry-pick 9a49b22 from V8 upstream MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Original commit message: Fix alloc/dealloc size mismatch for v8::BackingStore On newer compilers the {operator delete} with explicit {size_t} argument would be instantiated for {v8::BackingStore} and used in the destructor of {std::unique_ptr}. The {size_t} argument is wrong though, since the pointer actually points to a {v8::internal::BackingStore} object. The solution is to explicitly provide a {operator delete}, preventing an implicitly generated {size_t} operator. Bug:v8:11081 Change-Id: Iee0aa47a67f0e41000bea628942f7e3d70198b83 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2506712 Commit-Queue: Ulan Degenbaev Reviewed-by: Camillo Bruni Cr-Commit-Position: refs/heads/master@{#70916} PR-URL: https://github.com/nodejs/node/pull/35939 Fixes: https://github.com/nodejs/node/issues/35669 Refs: https://github.com/v8/v8/commit/9a49b2298f65f6b18c5245f3681aca04e5fe4e46 Reviewed-By: Jiawen Geng Reviewed-By: Michaël Zasso Reviewed-By: Richard Lau Reviewed-By: Rich Trott Reviewed-By: Colin Ihrig Reviewed-By: Gus Caplan --- common.gypi | 2 +- deps/v8/include/v8.h | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/common.gypi b/common.gypi index aaedbd14bfe597..f8440fef992252 100644 --- a/common.gypi +++ b/common.gypi @@ -36,7 +36,7 @@ # Reset this number to 0 on major V8 upgrades. # Increment by one for each non-official patch applied to deps/v8. - 'v8_embedder_string': '-node.14', + 'v8_embedder_string': '-node.15', ##### V8 defaults for Node.js ##### diff --git a/deps/v8/include/v8.h b/deps/v8/include/v8.h index e2871f1c9d8fd7..7999f358ab5e5d 100644 --- a/deps/v8/include/v8.h +++ b/deps/v8/include/v8.h @@ -5054,6 +5054,13 @@ class V8_EXPORT BackingStore : public v8::internal::BackingStoreBase { */ bool IsShared() const; + /** + * Prevent implicit instantiation of operator delete with size_t argument. + * The size_t argument would be incorrect because ptr points to the + * internal BackingStore object. + */ + void operator delete(void* ptr) { ::operator delete(ptr); } + /** * Wrapper around ArrayBuffer::Allocator::Reallocate that preserves IsShared. * Assumes that the backing_store was allocated by the ArrayBuffer allocator From f4305ddca5e74dc3a928aca6cbdf107732c6526c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Zasso?= Date: Thu, 12 Nov 2020 07:39:19 +0100 Subject: [PATCH 18/24] deps: V8: cherry-pick 821fb3883a8e Original commit message: [serializer] avoid deferring objects with embedder fields JS objects with embedder fields cannot be deferred because the serialize/deserialize callbacks need the back reference immediately to identify the object. Refs: https://github.com/nodejs/node-v8/issues/175 Bug: v8:11146 Change-Id: I4292f2ab0041f7b0779620437ed26905c194cd9b Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2531195 Reviewed-by: Jakob Gruber Commit-Queue: Joyee Cheung Cr-Commit-Position: refs/heads/master@{#71134} Refs: https://github.com/v8/v8/commit/821fb3883a8e388bc125d5e38fad701b4fb163f2 PR-URL: https://github.com/nodejs/node/pull/35700 Reviewed-By: Rich Trott Reviewed-By: Colin Ihrig Reviewed-By: Joyee Cheung Reviewed-By: Matteo Collina Reviewed-By: Jiawen Geng Reviewed-By: Shelley Vohr --- common.gypi | 2 +- deps/v8/src/snapshot/serializer-deserializer.cc | 11 ++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/common.gypi b/common.gypi index f8440fef992252..33b1325eb513ea 100644 --- a/common.gypi +++ b/common.gypi @@ -36,7 +36,7 @@ # Reset this number to 0 on major V8 upgrades. # Increment by one for each non-official patch applied to deps/v8. - 'v8_embedder_string': '-node.15', + 'v8_embedder_string': '-node.16', ##### V8 defaults for Node.js ##### diff --git a/deps/v8/src/snapshot/serializer-deserializer.cc b/deps/v8/src/snapshot/serializer-deserializer.cc index c6aa762f1f3f70..4055d4cca381e5 100644 --- a/deps/v8/src/snapshot/serializer-deserializer.cc +++ b/deps/v8/src/snapshot/serializer-deserializer.cc @@ -30,13 +30,18 @@ void SerializerDeserializer::Iterate(Isolate* isolate, RootVisitor* visitor) { } bool SerializerDeserializer::CanBeDeferred(HeapObject o) { - // Maps cannot be deferred as objects are expected to have a valid map - // immediately. Internalized strings cannot be deferred as they might be + // 1. Maps cannot be deferred as objects are expected to have a valid map + // immediately. + // 2. Internalized strings cannot be deferred as they might be // converted to thin strings during post processing, at which point forward // references to the now-thin string will already have been written. + // 3. JS objects with embedder fields cannot be deferred because the + // serialize/deserialize callbacks need the back reference immediately to + // identify the object. // TODO(leszeks): Could we defer string serialization if forward references // were resolved after object post processing? - return !o.IsMap() && !o.IsInternalizedString(); + return !o.IsMap() && !o.IsInternalizedString() && + !(o.IsJSObject() && JSObject::cast(o).GetEmbedderFieldCount() > 0); } void SerializerDeserializer::RestoreExternalReferenceRedirectors( From d074cfd014bb7b27f85dad99123317d87b52df3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ole=20Andr=C3=A9=20Vadla=20Ravn=C3=A5s?= Date: Fri, 6 Nov 2020 02:46:17 +0100 Subject: [PATCH 19/24] deps: V8: cherry-pick 086eecbd96b6 Original commit message: [platform] Add Permission::kNoAccessWillJitLater enum value This value is unused for now. This CL is part 1 of a 3-step dance. Part 2 will be teaching Chrome's Platform implementation to accept the new value. Part 3 will then actually use it in V8. Bug: chromium:1117591 Change-Id: Ie3aed20d4cc58f3def3be2a3a03bba4c3a37bf44 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2450056 Commit-Queue: Jakob Kummerow Reviewed-by: Michael Lippautz Cr-Commit-Position: refs/heads/master@{#70335} PR-URL: https://github.com/nodejs/node/pull/35986 Reviewed-By: Anna Henningsen Reviewed-By: Richard Lau Reviewed-By: Michael Dawson Reviewed-By: Rich Trott Reviewed-By: Beth Griggs Reviewed-By: Jiawen Geng --- common.gypi | 2 +- deps/v8/include/v8-platform.h | 8 +++++++- deps/v8/test/unittests/heap/unmapper-unittest.cc | 1 + 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/common.gypi b/common.gypi index 33b1325eb513ea..4745bb5ac77639 100644 --- a/common.gypi +++ b/common.gypi @@ -36,7 +36,7 @@ # Reset this number to 0 on major V8 upgrades. # Increment by one for each non-official patch applied to deps/v8. - 'v8_embedder_string': '-node.16', + 'v8_embedder_string': '-node.17', ##### V8 defaults for Node.js ##### diff --git a/deps/v8/include/v8-platform.h b/deps/v8/include/v8-platform.h index 7bb79a18414bec..6669ed9ac7e217 100644 --- a/deps/v8/include/v8-platform.h +++ b/deps/v8/include/v8-platform.h @@ -383,7 +383,13 @@ class PageAllocator { kReadWrite, // TODO(hpayer): Remove this flag. Memory should never be rwx. kReadWriteExecute, - kReadExecute + kReadExecute, + // Set this when reserving memory that will later require kReadWriteExecute + // permissions. The resulting behavior is platform-specific, currently + // this is used to set the MAP_JIT flag on Apple Silicon. + // TODO(jkummerow): Remove this when Wasm has a platform-independent + // w^x implementation. + kNoAccessWillJitLater }; /** diff --git a/deps/v8/test/unittests/heap/unmapper-unittest.cc b/deps/v8/test/unittests/heap/unmapper-unittest.cc index bd476cd1ec1682..a919945d3f4ee7 100644 --- a/deps/v8/test/unittests/heap/unmapper-unittest.cc +++ b/deps/v8/test/unittests/heap/unmapper-unittest.cc @@ -170,6 +170,7 @@ class TrackingPageAllocator : public ::v8::PageAllocator { os << " page: [" << start << ", " << end << "), access: "; switch (access) { case PageAllocator::kNoAccess: + case PageAllocator::kNoAccessWillJitLater: os << "--"; break; case PageAllocator::kRead: From 3e157996cb503a62fcb34c8117a45318c1f1de1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ole=20Andr=C3=A9=20Vadla=20Ravn=C3=A5s?= Date: Fri, 6 Nov 2020 02:46:21 +0100 Subject: [PATCH 20/24] deps: V8: cherry-pick 4e077ff0444a Original commit message: [mac] Set MAP_JIT only when necessary This is a "minimal" change to achieve the required goal: seeing that there is only one place where we need to indicate that memory should be reserved with MAP_JIT, we can add a value to the Permissions enum instead of adding a second, orthogonal parameter. That way we avoid changing public API functions, which makes this CL easier to undo once we have platform-independent w^x in Wasm. Bug: chromium:1117591 Change-Id: I6333d69ab29d5900c689f08dcc892a5f1c1159b8 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2435365 Commit-Queue: Jakob Kummerow Reviewed-by: Michael Lippautz Reviewed-by: Clemens Backes Cr-Commit-Position: refs/heads/master@{#70379} PR-URL: https://github.com/nodejs/node/pull/35986 Reviewed-By: Anna Henningsen Reviewed-By: Richard Lau Reviewed-By: Michael Dawson Reviewed-By: Rich Trott Reviewed-By: Beth Griggs Reviewed-By: Jiawen Geng --- common.gypi | 2 +- deps/v8/src/base/page-allocator.cc | 10 ++++++++++ deps/v8/src/base/platform/platform-cygwin.cc | 1 + deps/v8/src/base/platform/platform-fuchsia.cc | 1 + deps/v8/src/base/platform/platform-posix.cc | 12 +++++------- deps/v8/src/base/platform/platform-win32.cc | 1 + deps/v8/src/base/platform/platform.h | 5 ++++- deps/v8/src/utils/allocation.cc | 10 ++++++---- deps/v8/src/utils/allocation.h | 6 ++++-- deps/v8/src/wasm/wasm-code-manager.cc | 6 +++++- deps/v8/test/cctest/cctest.status | 1 + 11 files changed, 39 insertions(+), 16 deletions(-) diff --git a/common.gypi b/common.gypi index 4745bb5ac77639..e610650a01d4ab 100644 --- a/common.gypi +++ b/common.gypi @@ -36,7 +36,7 @@ # Reset this number to 0 on major V8 upgrades. # Increment by one for each non-official patch applied to deps/v8. - 'v8_embedder_string': '-node.17', + 'v8_embedder_string': '-node.18', ##### V8 defaults for Node.js ##### diff --git a/deps/v8/src/base/page-allocator.cc b/deps/v8/src/base/page-allocator.cc index 98b2c690960336..62dfc94a83be07 100644 --- a/deps/v8/src/base/page-allocator.cc +++ b/deps/v8/src/base/page-allocator.cc @@ -21,6 +21,8 @@ STATIC_ASSERT_ENUM(PageAllocator::kReadWriteExecute, base::OS::MemoryPermission::kReadWriteExecute); STATIC_ASSERT_ENUM(PageAllocator::kReadExecute, base::OS::MemoryPermission::kReadExecute); +STATIC_ASSERT_ENUM(PageAllocator::kNoAccessWillJitLater, + base::OS::MemoryPermission::kNoAccessWillJitLater); #undef STATIC_ASSERT_ENUM @@ -38,6 +40,14 @@ void* PageAllocator::GetRandomMmapAddr() { void* PageAllocator::AllocatePages(void* hint, size_t size, size_t alignment, PageAllocator::Permission access) { +#if !(V8_OS_MACOSX && V8_HOST_ARCH_ARM64 && defined(MAP_JIT)) + // kNoAccessWillJitLater is only used on Apple Silicon. Map it to regular + // kNoAccess on other platforms, so code doesn't have to handle both enum + // values. + if (access == PageAllocator::kNoAccessWillJitLater) { + access = PageAllocator::kNoAccess; + } +#endif return base::OS::Allocate(hint, size, alignment, static_cast(access)); } diff --git a/deps/v8/src/base/platform/platform-cygwin.cc b/deps/v8/src/base/platform/platform-cygwin.cc index 92a5fbe490f4c3..b9da2f1cd592db 100644 --- a/deps/v8/src/base/platform/platform-cygwin.cc +++ b/deps/v8/src/base/platform/platform-cygwin.cc @@ -33,6 +33,7 @@ namespace { DWORD GetProtectionFromMemoryPermission(OS::MemoryPermission access) { switch (access) { case OS::MemoryPermission::kNoAccess: + case OS::MemoryPermission::kNoAccessWillJitLater: return PAGE_NOACCESS; case OS::MemoryPermission::kRead: return PAGE_READONLY; diff --git a/deps/v8/src/base/platform/platform-fuchsia.cc b/deps/v8/src/base/platform/platform-fuchsia.cc index fa175c39177aea..35a508a140ebd7 100644 --- a/deps/v8/src/base/platform/platform-fuchsia.cc +++ b/deps/v8/src/base/platform/platform-fuchsia.cc @@ -18,6 +18,7 @@ namespace { uint32_t GetProtectionFromMemoryPermission(OS::MemoryPermission access) { switch (access) { case OS::MemoryPermission::kNoAccess: + case OS::MemoryPermission::kNoAccessWillJitLater: return 0; // no permissions case OS::MemoryPermission::kRead: return ZX_VM_PERM_READ; diff --git a/deps/v8/src/base/platform/platform-posix.cc b/deps/v8/src/base/platform/platform-posix.cc index 89173b593a6ce8..68d651b15fefdc 100644 --- a/deps/v8/src/base/platform/platform-posix.cc +++ b/deps/v8/src/base/platform/platform-posix.cc @@ -125,6 +125,7 @@ const int kMmapFdOffset = 0; int GetProtectionFromMemoryPermission(OS::MemoryPermission access) { switch (access) { case OS::MemoryPermission::kNoAccess: + case OS::MemoryPermission::kNoAccessWillJitLater: return PROT_NONE; case OS::MemoryPermission::kRead: return PROT_READ; @@ -151,15 +152,12 @@ int GetFlagsForMemoryPermission(OS::MemoryPermission access, #if V8_OS_QNX flags |= MAP_LAZY; #endif // V8_OS_QNX -#if V8_OS_MACOSX && V8_HOST_ARCH_ARM64 && defined(MAP_JIT) && \ - !defined(V8_OS_IOS) - // TODO(jkummerow): using the V8_OS_IOS define is a crude approximation - // of the fact that we don't want to set the MAP_JIT flag when - // FLAG_jitless == true, as src/base/ doesn't know any flags. - // TODO(crbug.com/1117591): This is only needed for code spaces. + } +#if V8_OS_MACOSX && V8_HOST_ARCH_ARM64 && defined(MAP_JIT) + if (access == OS::MemoryPermission::kNoAccessWillJitLater) { flags |= MAP_JIT; -#endif } +#endif return flags; } diff --git a/deps/v8/src/base/platform/platform-win32.cc b/deps/v8/src/base/platform/platform-win32.cc index 3eb11d88f5c339..e7b1e519362350 100644 --- a/deps/v8/src/base/platform/platform-win32.cc +++ b/deps/v8/src/base/platform/platform-win32.cc @@ -752,6 +752,7 @@ namespace { DWORD GetProtectionFromMemoryPermission(OS::MemoryPermission access) { switch (access) { case OS::MemoryPermission::kNoAccess: + case OS::MemoryPermission::kNoAccessWillJitLater: return PAGE_NOACCESS; case OS::MemoryPermission::kRead: return PAGE_READONLY; diff --git a/deps/v8/src/base/platform/platform.h b/deps/v8/src/base/platform/platform.h index caa063944e0360..9c52f218042b74 100644 --- a/deps/v8/src/base/platform/platform.h +++ b/deps/v8/src/base/platform/platform.h @@ -172,7 +172,10 @@ class V8_BASE_EXPORT OS { kReadWrite, // TODO(hpayer): Remove this flag. Memory should never be rwx. kReadWriteExecute, - kReadExecute + kReadExecute, + // TODO(jkummerow): Remove this when Wasm has a platform-independent + // w^x implementation. + kNoAccessWillJitLater }; static bool HasLazyCommits(); diff --git a/deps/v8/src/utils/allocation.cc b/deps/v8/src/utils/allocation.cc index 6169acbfd6687a..022ac82ea6fa28 100644 --- a/deps/v8/src/utils/allocation.cc +++ b/deps/v8/src/utils/allocation.cc @@ -213,15 +213,17 @@ bool OnCriticalMemoryPressure(size_t length) { VirtualMemory::VirtualMemory() = default; VirtualMemory::VirtualMemory(v8::PageAllocator* page_allocator, size_t size, - void* hint, size_t alignment) + void* hint, size_t alignment, JitPermission jit) : page_allocator_(page_allocator) { DCHECK_NOT_NULL(page_allocator); DCHECK(IsAligned(size, page_allocator_->CommitPageSize())); size_t page_size = page_allocator_->AllocatePageSize(); alignment = RoundUp(alignment, page_size); - Address address = reinterpret_cast
( - AllocatePages(page_allocator_, hint, RoundUp(size, page_size), alignment, - PageAllocator::kNoAccess)); + PageAllocator::Permission permissions = + jit == kMapAsJittable ? PageAllocator::kNoAccessWillJitLater + : PageAllocator::kNoAccess; + Address address = reinterpret_cast
(AllocatePages( + page_allocator_, hint, RoundUp(size, page_size), alignment, permissions)); if (address != kNullAddress) { DCHECK(IsAligned(address, alignment)); region_ = base::AddressRegion(address, size); diff --git a/deps/v8/src/utils/allocation.h b/deps/v8/src/utils/allocation.h index 7106b1c749a893..a82012310b8efe 100644 --- a/deps/v8/src/utils/allocation.h +++ b/deps/v8/src/utils/allocation.h @@ -156,6 +156,8 @@ V8_EXPORT_PRIVATE bool OnCriticalMemoryPressure(size_t length); // Represents and controls an area of reserved memory. class VirtualMemory final { public: + enum JitPermission { kNoJit, kMapAsJittable }; + // Empty VirtualMemory object, controlling no reserved memory. V8_EXPORT_PRIVATE VirtualMemory(); @@ -164,8 +166,8 @@ class VirtualMemory final { // size. The |size| must be aligned with |page_allocator|'s commit page size. // This may not be at the position returned by address(). V8_EXPORT_PRIVATE VirtualMemory(v8::PageAllocator* page_allocator, - size_t size, void* hint, - size_t alignment = 1); + size_t size, void* hint, size_t alignment = 1, + JitPermission jit = kNoJit); // Construct a virtual memory by assigning it some already mapped address // and size. diff --git a/deps/v8/src/wasm/wasm-code-manager.cc b/deps/v8/src/wasm/wasm-code-manager.cc index 9511e15ff40c5f..ac68dc970cb005 100644 --- a/deps/v8/src/wasm/wasm-code-manager.cc +++ b/deps/v8/src/wasm/wasm-code-manager.cc @@ -1646,7 +1646,11 @@ VirtualMemory WasmCodeManager::TryAllocate(size_t size, void* hint) { if (!BackingStore::ReserveAddressSpace(size)) return {}; if (hint == nullptr) hint = page_allocator->GetRandomMmapAddr(); - VirtualMemory mem(page_allocator, size, hint, allocate_page_size); + // When we start exposing Wasm in jitless mode, then the jitless flag + // will have to determine whether we set kMapAsJittable or not. + DCHECK(!FLAG_jitless); + VirtualMemory mem(page_allocator, size, hint, allocate_page_size, + VirtualMemory::kMapAsJittable); if (!mem.IsReserved()) { BackingStore::ReleaseReservation(size); return {}; diff --git a/deps/v8/test/cctest/cctest.status b/deps/v8/test/cctest/cctest.status index 4f00dea45727dc..0c4bd967b8f1ef 100644 --- a/deps/v8/test/cctest/cctest.status +++ b/deps/v8/test/cctest/cctest.status @@ -503,6 +503,7 @@ 'test-jump-table-assembler/*': [SKIP], 'test-gc/*': [SKIP], 'test-grow-memory/*': [SKIP], + 'test-liftoff-inspection/*': [SKIP], 'test-run-wasm-64/*': [SKIP], 'test-run-wasm-asmjs/*': [SKIP], 'test-run-wasm-atomics64/*': [SKIP], From de67931d88e254047a9a417d78dcc121a0b27303 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ole=20Andr=C3=A9=20Vadla=20Ravn=C3=A5s?= Date: Fri, 6 Nov 2020 02:46:24 +0100 Subject: [PATCH 21/24] deps: V8: cherry-pick 1d0f426311d4 Original commit message: [mac-arm64] Fix missing #include For an "#if defined(MAP_JIT)" test to work as expected, must be included in the compilation unit. Bug: chromium:1144200 Change-Id: Ia0bf35ec1872c02457f1fbc0ee6689c7f7d27d4a Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2517689 Reviewed-by: Clemens Backes Reviewed-by: Igor Sheludko Reviewed-by: Nico Weber Commit-Queue: Jakob Kummerow Cr-Commit-Position: refs/heads/master@{#70986} PR-URL: https://github.com/nodejs/node/pull/35986 Reviewed-By: Anna Henningsen Reviewed-By: Richard Lau Reviewed-By: Michael Dawson Reviewed-By: Rich Trott Reviewed-By: Beth Griggs Reviewed-By: Jiawen Geng --- common.gypi | 2 +- deps/v8/src/base/page-allocator.cc | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/common.gypi b/common.gypi index e610650a01d4ab..cae6662364984c 100644 --- a/common.gypi +++ b/common.gypi @@ -36,7 +36,7 @@ # Reset this number to 0 on major V8 upgrades. # Increment by one for each non-official patch applied to deps/v8. - 'v8_embedder_string': '-node.18', + 'v8_embedder_string': '-node.19', ##### V8 defaults for Node.js ##### diff --git a/deps/v8/src/base/page-allocator.cc b/deps/v8/src/base/page-allocator.cc index 62dfc94a83be07..9f48ee79fe5424 100644 --- a/deps/v8/src/base/page-allocator.cc +++ b/deps/v8/src/base/page-allocator.cc @@ -6,6 +6,10 @@ #include "src/base/platform/platform.h" +#if V8_OS_MACOSX +#include // For MAP_JIT. +#endif + namespace v8 { namespace base { From 685cb6e1d29d74cce4d60b400f499922ae9cc5fc Mon Sep 17 00:00:00 2001 From: Jiawen Geng Date: Tue, 15 Sep 2020 16:46:53 +0800 Subject: [PATCH 22/24] src: fix v8 api deprecation PR-URL: https://github.com/nodejs/node/pull/35700 Reviewed-By: Rich Trott Reviewed-By: Colin Ihrig Reviewed-By: Joyee Cheung Reviewed-By: Matteo Collina Reviewed-By: Jiawen Geng Reviewed-By: Shelley Vohr --- src/node_file.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/node_file.cc b/src/node_file.cc index de5c455c7a2a85..a2fb9e0b4614d4 100644 --- a/src/node_file.cc +++ b/src/node_file.cc @@ -1944,7 +1944,7 @@ static void WriteString(const FunctionCallbackInfo& args) { auto ext = string->GetExternalOneByteStringResource(); buf = const_cast(ext->data()); len = ext->length(); - } else if (enc == UCS2 && IsLittleEndian() && string->IsExternal()) { + } else if (enc == UCS2 && IsLittleEndian() && string->IsExternalTwoByte()) { auto ext = string->GetExternalStringResource(); buf = reinterpret_cast(const_cast(ext->data())); len = ext->length() * sizeof(*ext->data()); From b7311fb9d5d6e93f630266b5f23184de9a89ea21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Zasso?= Date: Fri, 11 Sep 2020 08:52:05 +0200 Subject: [PATCH 23/24] tools: update V8 gypfiles for 8.7 PR-URL: https://github.com/nodejs/node/pull/35700 Reviewed-By: Rich Trott Reviewed-By: Colin Ihrig Reviewed-By: Joyee Cheung Reviewed-By: Matteo Collina Reviewed-By: Jiawen Geng Reviewed-By: Shelley Vohr --- tools/v8_gypfiles/features.gypi | 6 --- tools/v8_gypfiles/toolchain.gypi | 10 +---- tools/v8_gypfiles/v8.gyp | 68 ++++++++++++++++++-------------- 3 files changed, 39 insertions(+), 45 deletions(-) diff --git a/tools/v8_gypfiles/features.gypi b/tools/v8_gypfiles/features.gypi index 03ad2f90439485..b9b975ed3e7ec3 100644 --- a/tools/v8_gypfiles/features.gypi +++ b/tools/v8_gypfiles/features.gypi @@ -146,9 +146,6 @@ # Sets -dV8_TRACE_FEEDBACK_UPDATES. 'v8_enable_trace_feedback_updates%': 0, - # Sets -dV8_CONCURRENT_MARKING - 'v8_enable_concurrent_marking%': 1, - # Enables various testing features. 'v8_enable_test_features%': 0, @@ -322,9 +319,6 @@ ['v8_enable_third_party_heap==1', { 'defines': ['V8_ENABLE_THIRD_PARTY_HEAP',], }], - ['v8_enable_concurrent_marking==1', { - 'defines': ['V8_CONCURRENT_MARKING',], - }], ['v8_enable_lazy_source_positions==1', { 'defines': ['V8_ENABLE_LAZY_SOURCE_POSITIONS',], }], diff --git a/tools/v8_gypfiles/toolchain.gypi b/tools/v8_gypfiles/toolchain.gypi index d6cc53f8493ecf..1422c91ec4b94f 100644 --- a/tools/v8_gypfiles/toolchain.gypi +++ b/tools/v8_gypfiles/toolchain.gypi @@ -86,9 +86,6 @@ # For a shared library build, results in "libv8-<(soname_version).so". 'soname_version%': '', - # Allow to suppress the array bounds warning (default is no suppression). - 'wno_array_bounds%': '', - # Override where to find binutils 'binutils_dir%': '', @@ -141,7 +138,7 @@ 'cflags': [ '-Werror', '-Wno-unknown-pragmas' ], },{ 'cflags!': [ '-Wall', '-Wextra' ], - 'cflags': [ '-Wno-return-type' ], + 'cflags': [ '-Wno-return-type', '-Wno-int-in-bool-context' ], }], ['v8_target_arch=="arm"', { 'defines': [ @@ -1116,10 +1113,6 @@ 'V8_ENABLE_FORCE_SLOW_PATH', ], 'conditions': [ - ['OS=="linux" or OS=="freebsd" or OS=="openbsd" or OS=="netbsd" or \ - OS=="qnx" or OS=="aix"', { - 'cflags': [ '-Woverloaded-virtual', '<(wno_array_bounds)', ], - }], ['OS=="linux" and v8_enable_backtrace==1', { # Support for backtrace_symbols. 'ldflags': [ '-rdynamic' ], @@ -1276,7 +1269,6 @@ 'cflags': [ '-fdata-sections', '-ffunction-sections', - '<(wno_array_bounds)', ], 'conditions': [ # Don't use -O3 with sanitizers. diff --git a/tools/v8_gypfiles/v8.gyp b/tools/v8_gypfiles/v8.gyp index 6d7df06f735460..8149e8de631977 100644 --- a/tools/v8_gypfiles/v8.gyp +++ b/tools/v8_gypfiles/v8.gyp @@ -35,6 +35,7 @@ "<(V8_ROOT)/src/builtins/array-splice.tq", "<(V8_ROOT)/src/builtins/array-unshift.tq", "<(V8_ROOT)/src/builtins/array.tq", + "<(V8_ROOT)/src/builtins/arraybuffer.tq", "<(V8_ROOT)/src/builtins/base.tq", "<(V8_ROOT)/src/builtins/bigint.tq", "<(V8_ROOT)/src/builtins/boolean.tq", @@ -232,26 +233,30 @@ '<@(torque_files)', ], 'outputs': [ - '<(torque_output_root)/torque-generated/bit-fields-tq.h', - '<(torque_output_root)/torque-generated/builtin-definitions-tq.h', - '<(torque_output_root)/torque-generated/interface-descriptors-tq.inc', - '<(torque_output_root)/torque-generated/factory-tq.cc', - '<(torque_output_root)/torque-generated/factory-tq.inc', - '<(torque_output_root)/torque-generated/field-offsets-tq.h', - '<(torque_output_root)/torque-generated/class-verifiers-tq.cc', - '<(torque_output_root)/torque-generated/class-verifiers-tq.h', - '<(torque_output_root)/torque-generated/enum-verifiers-tq.cc', - '<(torque_output_root)/torque-generated/objects-printer-tq.cc', - '<(torque_output_root)/torque-generated/objects-body-descriptors-tq-inl.inc', - '<(torque_output_root)/torque-generated/class-definitions-tq.cc', - '<(torque_output_root)/torque-generated/class-definitions-tq-inl.h', - '<(torque_output_root)/torque-generated/class-definitions-tq.h', - '<(torque_output_root)/torque-generated/class-debug-readers-tq.cc', - '<(torque_output_root)/torque-generated/class-debug-readers-tq.h', - '<(torque_output_root)/torque-generated/exported-macros-assembler-tq.cc', - '<(torque_output_root)/torque-generated/exported-macros-assembler-tq.h', - '<(torque_output_root)/torque-generated/csa-types-tq.h', - '<(torque_output_root)/torque-generated/instance-types-tq.h', + '<(torque_output_root)/torque-generated/bit-fields.h', + '<(torque_output_root)/torque-generated/builtin-definitions.h', + '<(torque_output_root)/torque-generated/interface-descriptors.inc', + '<(torque_output_root)/torque-generated/factory.cc', + '<(torque_output_root)/torque-generated/factory.inc', + '<(torque_output_root)/torque-generated/field-offsets.h', + '<(torque_output_root)/torque-generated/class-verifiers.cc', + '<(torque_output_root)/torque-generated/class-verifiers.h', + '<(torque_output_root)/torque-generated/enum-verifiers.cc', + '<(torque_output_root)/torque-generated/objects-printer.cc', + '<(torque_output_root)/torque-generated/objects-body-descriptors-inl.inc', + '<(torque_output_root)/torque-generated/class-definitions.cc', + '<(torque_output_root)/torque-generated/class-definitions-inl.h', + '<(torque_output_root)/torque-generated/class-definitions.h', + '<(torque_output_root)/torque-generated/class-debug-readers.cc', + '<(torque_output_root)/torque-generated/class-debug-readers.h', + '<(torque_output_root)/torque-generated/exported-macros-assembler.cc', + '<(torque_output_root)/torque-generated/exported-macros-assembler.h', + '<(torque_output_root)/torque-generated/csa-types.h', + '<(torque_output_root)/torque-generated/instance-types.h', + '<(torque_output_root)/torque-generated/internal-class-definitions.h', + '<(torque_output_root)/torque-generated/internal-class-definitions-inl.h', + '<(torque_output_root)/torque-generated/exported-class-definitions.h', + '<(torque_output_root)/torque-generated/exported-class-definitions-inl.h', '<@(torque_outputs)', ], 'action': [ @@ -298,10 +303,10 @@ ], 'direct_dependent_settings': { 'sources': [ - '<(torque_output_root)/torque-generated/csa-types-tq.h', - '<(torque_output_root)/torque-generated/enum-verifiers-tq.cc', - '<(torque_output_root)/torque-generated/exported-macros-assembler-tq.cc', - '<(torque_output_root)/torque-generated/exported-macros-assembler-tq.h', + '<(torque_output_root)/torque-generated/csa-types.h', + '<(torque_output_root)/torque-generated/enum-verifiers.cc', + '<(torque_output_root)/torque-generated/exported-macros-assembler.cc', + '<(torque_output_root)/torque-generated/exported-macros-assembler.h', '<(V8_ROOT)/src/torque/runtime-support.h', '<@(torque_outputs)', ], @@ -323,11 +328,11 @@ ], 'direct_dependent_settings': { 'sources': [ - '<(torque_output_root)/torque-generated/class-definitions-tq.cc', - '<(torque_output_root)/torque-generated/class-verifiers-tq.cc', - '<(torque_output_root)/torque-generated/class-verifiers-tq.h', - '<(torque_output_root)/torque-generated/factory-tq.cc', - '<(torque_output_root)/torque-generated/objects-printer-tq.cc', + '<(torque_output_root)/torque-generated/class-definitions.cc', + '<(torque_output_root)/torque-generated/class-verifiers.cc', + '<(torque_output_root)/torque-generated/class-verifiers.h', + '<(torque_output_root)/torque-generated/factory.cc', + '<(torque_output_root)/torque-generated/objects-printer.cc', ], 'include_dirs': [ '<(torque_output_root)', @@ -1487,6 +1492,8 @@ 'sources': [ '<(V8_ROOT)/src/heap/base/stack.cc', '<(V8_ROOT)/src/heap/base/stack.h', + '<(V8_ROOT)/src/heap/base/worklist.cc', + '<(V8_ROOT)/src/heap/base/worklist.h', ], 'conditions': [ ['clang or OS!="win"', { @@ -1671,7 +1678,7 @@ 'dependencies': ['run_torque'], 'variables': { 'heapobject_files': [ - '<(torque_output_root)/torque-generated/instance-types-tq.h', + '<(torque_output_root)/torque-generated/instance-types.h', '<(V8_ROOT)/src/objects/allocation-site.h', '<(V8_ROOT)/src/objects/allocation-site-inl.h', '<(V8_ROOT)/src/objects/cell.h', @@ -1695,6 +1702,7 @@ '<(V8_ROOT)/src/objects/js-array-buffer-inl.h', '<(V8_ROOT)/src/objects/js-array.h', '<(V8_ROOT)/src/objects/js-array-inl.h', + '<(V8_ROOT)/src/objects/js-function-inl.h', '<(V8_ROOT)/src/objects/js-function.cc', '<(V8_ROOT)/src/objects/js-function.h', '<(V8_ROOT)/src/objects/js-objects.cc', From ad2fd53fdc82d8beb1e661f1819991690dd6c826 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Zasso?= Date: Thu, 19 Nov 2020 21:31:26 +0100 Subject: [PATCH 24/24] deps: V8: restore compatibility with 8.6 Revert "[unwinder] Delete the old unwinder API" Refs: https://github.com/v8/v8/commit/9c5eed71c75112beaae65f7dcd179068752acc64 --- deps/v8/include/v8.h | 54 ++- deps/v8/src/api/api.cc | 27 ++ deps/v8/src/diagnostics/unwinder.cc | 97 ++++ deps/v8/test/cctest/BUILD.gn | 1 + deps/v8/test/cctest/test-api.cc | 36 ++ deps/v8/test/cctest/test-unwinder.cc | 650 +++++++++++++++++++++++++++ 6 files changed, 855 insertions(+), 10 deletions(-) create mode 100644 deps/v8/test/cctest/test-unwinder.cc diff --git a/deps/v8/include/v8.h b/deps/v8/include/v8.h index 7999f358ab5e5d..fcc6276727adf7 100644 --- a/deps/v8/include/v8.h +++ b/deps/v8/include/v8.h @@ -2294,6 +2294,14 @@ struct JSEntryStub { MemoryRange code; }; +struct UnwindState { + MemoryRange code_range; + MemoryRange embedded_code_range; + JSEntryStub js_entry_stub; + JSEntryStub js_construct_entry_stub; + JSEntryStub js_run_microtasks_entry_stub; +}; + struct JSEntryStubs { JSEntryStub js_entry_stub; JSEntryStub js_construct_entry_stub; @@ -9367,6 +9375,13 @@ class V8_EXPORT Isolate { */ void GetCodeRange(void** start, size_t* length_in_bytes); + /** + * Returns the UnwindState necessary for use with the Unwinder API. + */ + // TODO(petermarshall): Remove this API. + V8_DEPRECATED("Use entry_stubs + code_pages version.") + UnwindState GetUnwindState(); + /** * Returns the JSEntryStubs necessary for use with the Unwinder API. */ @@ -10724,14 +10739,12 @@ class V8_EXPORT Unwinder { * * The unwinder also needs the virtual memory range of all possible V8 code * objects. There are two ranges required - the heap code range and the range - * for code embedded in the binary. - * - * Available on x64, ARM64 and ARM32. + * for code embedded in the binary. The V8 API provides all required inputs + * via an UnwindState object through the Isolate::GetUnwindState() API. These + * values will not change after Isolate initialization, so the same + * |unwind_state| can be used for multiple calls. * - * \param code_pages A list of all of the ranges in which V8 has allocated - * executable code. The caller should obtain this list by calling - * Isolate::CopyCodePages() during the same interrupt/thread suspension that - * captures the stack. + * \param unwind_state Input state for the Isolate that the stack comes from. * \param register_state The current registers. This is an in-out param that * will be overwritten with the register values after unwinding, on success. * \param stack_base The resulting stack pointer and frame pointer values are @@ -10742,6 +10755,20 @@ class V8_EXPORT Unwinder { * * \return True on success. */ + // TODO(petermarshall): Remove this API + V8_DEPRECATED("Use entry_stubs + code_pages version.") + static bool TryUnwindV8Frames(const UnwindState& unwind_state, + RegisterState* register_state, + const void* stack_base); + + /** + * The same as above, but is available on x64, ARM64 and ARM32. + * + * \param code_pages A list of all of the ranges in which V8 has allocated + * executable code. The caller should obtain this list by calling + * Isolate::CopyCodePages() during the same interrupt/thread suspension that + * captures the stack. + */ static bool TryUnwindV8Frames(const JSEntryStubs& entry_stubs, size_t code_pages_length, const MemoryRange* code_pages, @@ -10749,13 +10776,20 @@ class V8_EXPORT Unwinder { const void* stack_base); /** - * Whether the PC is within the V8 code range represented by code_pages. + * Whether the PC is within the V8 code range represented by code_range or + * embedded_code_range in |unwind_state|. * * If this returns false, then calling UnwindV8Frames() with the same PC * and unwind_state will always fail. If it returns true, then unwinding may * (but not necessarily) be successful. - * - * Available on x64, ARM64 and ARM32 + */ + // TODO(petermarshall): Remove this API + V8_DEPRECATED("Use code_pages version.") + static bool PCIsInV8(const UnwindState& unwind_state, void* pc); + + /** + * The same as above, but is available on x64, ARM64 and ARM32. See the + * comment on TryUnwindV8Frames. */ static bool PCIsInV8(size_t code_pages_length, const MemoryRange* code_pages, void* pc); diff --git a/deps/v8/src/api/api.cc b/deps/v8/src/api/api.cc index c27db3e7b876e0..03fc62d2caede2 100644 --- a/deps/v8/src/api/api.cc +++ b/deps/v8/src/api/api.cc @@ -8989,6 +8989,33 @@ void Isolate::GetCodeRange(void** start, size_t* length_in_bytes) { *length_in_bytes = code_range.size(); } +UnwindState Isolate::GetUnwindState() { + UnwindState unwind_state; + void* code_range_start; + GetCodeRange(&code_range_start, &unwind_state.code_range.length_in_bytes); + unwind_state.code_range.start = code_range_start; + + i::Isolate* isolate = reinterpret_cast(this); + unwind_state.embedded_code_range.start = + reinterpret_cast(isolate->embedded_blob_code()); + unwind_state.embedded_code_range.length_in_bytes = + isolate->embedded_blob_code_size(); + + std::array, 3> entry_stubs = { + {{i::Builtins::kJSEntry, &unwind_state.js_entry_stub}, + {i::Builtins::kJSConstructEntry, &unwind_state.js_construct_entry_stub}, + {i::Builtins::kJSRunMicrotasksEntry, + &unwind_state.js_run_microtasks_entry_stub}}}; + for (auto& pair : entry_stubs) { + i::Code js_entry = isolate->heap()->builtin(pair.first); + pair.second->code.start = + reinterpret_cast(js_entry.InstructionStart()); + pair.second->code.length_in_bytes = js_entry.InstructionSize(); + } + + return unwind_state; +} + JSEntryStubs Isolate::GetJSEntryStubs() { JSEntryStubs entry_stubs; diff --git a/deps/v8/src/diagnostics/unwinder.cc b/deps/v8/src/diagnostics/unwinder.cc index c4a559c9d9b344..a1fb4632d038dc 100644 --- a/deps/v8/src/diagnostics/unwinder.cc +++ b/deps/v8/src/diagnostics/unwinder.cc @@ -46,6 +46,21 @@ bool PCIsInCodePages(size_t code_pages_length, const MemoryRange* code_pages, return it->start <= pc && pc < CalculateEnd(it->start, it->length_in_bytes); } +bool IsInJSEntryRange(const UnwindState& unwind_state, void* pc) { + return PCIsInCodeRange(unwind_state.js_entry_stub.code, pc) || + PCIsInCodeRange(unwind_state.js_construct_entry_stub.code, pc) || + PCIsInCodeRange(unwind_state.js_run_microtasks_entry_stub.code, pc); +} + +bool IsInUnsafeJSEntryRange(const UnwindState& unwind_state, void* pc) { + return IsInJSEntryRange(unwind_state, pc); + + // TODO(petermarshall): We can be more precise by checking whether we are + // in JSEntry but after frame setup and before frame teardown, in which case + // we are safe to unwind the stack. For now, we bail out if the PC is anywhere + // within JSEntry. +} + bool IsInJSEntryRange(const JSEntryStubs& entry_stubs, void* pc) { return PCIsInCodeRange(entry_stubs.js_entry_stub.code, pc) || PCIsInCodeRange(entry_stubs.js_construct_entry_stub.code, pc) || @@ -65,6 +80,19 @@ i::Address Load(i::Address address) { return *reinterpret_cast(address); } +void* GetReturnAddressFromFP(void* fp, void* pc, + const v8::UnwindState& unwind_state) { + int caller_pc_offset = i::CommonFrameConstants::kCallerPCOffset; +#ifdef V8_TARGET_ARCH_ARM64 + if (IsInJSEntryRange(unwind_state, pc)) { + caller_pc_offset = i::EntryFrameConstants::kDirectCallerPCOffset; + } +#endif + i::Address ret_addr = + Load(reinterpret_cast(fp) + caller_pc_offset); + return reinterpret_cast(i::PointerAuthentication::StripPAC(ret_addr)); +} + void* GetReturnAddressFromFP(void* fp, void* pc, const JSEntryStubs& entry_stubs) { int caller_pc_offset = i::CommonFrameConstants::kCallerPCOffset; @@ -78,6 +106,18 @@ void* GetReturnAddressFromFP(void* fp, void* pc, return reinterpret_cast(i::PointerAuthentication::StripPAC(ret_addr)); } +void* GetCallerFPFromFP(void* fp, void* pc, + const v8::UnwindState& unwind_state) { + int caller_fp_offset = i::CommonFrameConstants::kCallerFPOffset; +#ifdef V8_TARGET_ARCH_ARM64 + if (IsInJSEntryRange(unwind_state, pc)) { + caller_fp_offset = i::EntryFrameConstants::kDirectCallerFPOffset; + } +#endif + return reinterpret_cast( + Load(reinterpret_cast(fp) + caller_fp_offset)); +} + void* GetCallerFPFromFP(void* fp, void* pc, const JSEntryStubs& entry_stubs) { int caller_fp_offset = i::CommonFrameConstants::kCallerFPOffset; #if V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_ARM @@ -89,6 +129,18 @@ void* GetCallerFPFromFP(void* fp, void* pc, const JSEntryStubs& entry_stubs) { Load(reinterpret_cast(fp) + caller_fp_offset)); } +void* GetCallerSPFromFP(void* fp, void* pc, + const v8::UnwindState& unwind_state) { + int caller_sp_offset = i::CommonFrameConstants::kCallerSPOffset; +#ifdef V8_TARGET_ARCH_ARM64 + if (IsInJSEntryRange(unwind_state, pc)) { + caller_sp_offset = i::EntryFrameConstants::kDirectCallerSPOffset; + } +#endif + return reinterpret_cast(reinterpret_cast(fp) + + caller_sp_offset); +} + void* GetCallerSPFromFP(void* fp, void* pc, const JSEntryStubs& entry_stubs) { int caller_sp_offset = i::CommonFrameConstants::kCallerSPOffset; #if V8_TARGET_ARCH_ARM64 || V8_TARGET_ARCH_ARM @@ -107,6 +159,46 @@ bool AddressIsInStack(const void* address, const void* stack_base, } // namespace +bool Unwinder::TryUnwindV8Frames(const UnwindState& unwind_state, + RegisterState* register_state, + const void* stack_base) { + const void* stack_top = register_state->sp; + + void* pc = register_state->pc; + if (PCIsInV8(unwind_state, pc) && !IsInUnsafeJSEntryRange(unwind_state, pc)) { + void* current_fp = register_state->fp; + if (!AddressIsInStack(current_fp, stack_base, stack_top)) return false; + + // Peek at the return address that the caller pushed. If it's in V8, then we + // assume the caller frame is a JS frame and continue to unwind. + void* next_pc = GetReturnAddressFromFP(current_fp, pc, unwind_state); + while (PCIsInV8(unwind_state, next_pc)) { + current_fp = GetCallerFPFromFP(current_fp, pc, unwind_state); + if (!AddressIsInStack(current_fp, stack_base, stack_top)) return false; + pc = next_pc; + next_pc = GetReturnAddressFromFP(current_fp, pc, unwind_state); + } + + void* final_sp = GetCallerSPFromFP(current_fp, pc, unwind_state); + if (!AddressIsInStack(final_sp, stack_base, stack_top)) return false; + register_state->sp = final_sp; + + // We don't check that the final FP value is within the stack bounds because + // this is just the rbp value that JSEntryStub pushed. On platforms like + // Win64 this is not used as a dedicated FP register, and could contain + // anything. + void* final_fp = GetCallerFPFromFP(current_fp, pc, unwind_state); + register_state->fp = final_fp; + + register_state->pc = next_pc; + + // Link register no longer valid after unwinding. + register_state->lr = nullptr; + return true; + } + return false; +} + bool Unwinder::TryUnwindV8Frames(const JSEntryStubs& entry_stubs, size_t code_pages_length, const MemoryRange* code_pages, @@ -150,6 +242,11 @@ bool Unwinder::TryUnwindV8Frames(const JSEntryStubs& entry_stubs, return false; } +bool Unwinder::PCIsInV8(const UnwindState& unwind_state, void* pc) { + return pc && (PCIsInCodeRange(unwind_state.code_range, pc) || + PCIsInCodeRange(unwind_state.embedded_code_range, pc)); +} + bool Unwinder::PCIsInV8(size_t code_pages_length, const MemoryRange* code_pages, void* pc) { return pc && PCIsInCodePages(code_pages_length, code_pages, pc); diff --git a/deps/v8/test/cctest/BUILD.gn b/deps/v8/test/cctest/BUILD.gn index d2a1c1fad56ef4..41f0541fefc3b6 100644 --- a/deps/v8/test/cctest/BUILD.gn +++ b/deps/v8/test/cctest/BUILD.gn @@ -274,6 +274,7 @@ v8_source_set("cctest_sources") { "test-unboxed-doubles.cc", "test-unscopables-hidden-prototype.cc", "test-unwinder-code-pages.cc", + "test-unwinder.cc", "test-usecounters.cc", "test-utils.cc", "test-version.cc", diff --git a/deps/v8/test/cctest/test-api.cc b/deps/v8/test/cctest/test-api.cc index cd291aa524aa88..986d967aaa97f6 100644 --- a/deps/v8/test/cctest/test-api.cc +++ b/deps/v8/test/cctest/test-api.cc @@ -26759,6 +26759,42 @@ TEST(BigIntAPI) { } } +TEST(TestGetUnwindState) { + LocalContext env; + v8::Isolate* isolate = env->GetIsolate(); + i::Isolate* i_isolate = reinterpret_cast(isolate); + +// Ignore deprecation warnings so that we can keep the tests for now. +// TODO(petermarshall): Remove this once the deprecated API is gone. +#if __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated" +#endif + v8::UnwindState unwind_state = isolate->GetUnwindState(); +#if __clang__ +#pragma clang diagnostic pop +#endif + v8::MemoryRange builtins_range = unwind_state.embedded_code_range; + + // Check that each off-heap builtin is within the builtins code range. + for (int id = 0; id < i::Builtins::builtin_count; id++) { + if (!i::Builtins::IsIsolateIndependent(id)) continue; + i::Code builtin = i_isolate->builtins()->builtin(id); + i::Address start = builtin.InstructionStart(); + i::Address end = start + builtin.InstructionSize(); + + i::Address builtins_start = + reinterpret_cast(builtins_range.start); + CHECK(start >= builtins_start && + end < builtins_start + builtins_range.length_in_bytes); + } + + v8::JSEntryStub js_entry_stub = unwind_state.js_entry_stub; + + CHECK_EQ(i_isolate->heap()->builtin(i::Builtins::kJSEntry).InstructionStart(), + reinterpret_cast(js_entry_stub.code.start)); +} + TEST(GetJSEntryStubs) { LocalContext env; v8::Isolate* isolate = env->GetIsolate(); diff --git a/deps/v8/test/cctest/test-unwinder.cc b/deps/v8/test/cctest/test-unwinder.cc new file mode 100644 index 00000000000000..f2fdf394b2d9f6 --- /dev/null +++ b/deps/v8/test/cctest/test-unwinder.cc @@ -0,0 +1,650 @@ +// Copyright 2018 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "include/v8.h" +#include "src/api/api-inl.h" +#include "src/builtins/builtins.h" +#include "src/execution/isolate.h" +#include "src/execution/pointer-authentication.h" +#include "src/heap/spaces.h" +#include "src/objects/code-inl.h" +#include "test/cctest/cctest.h" + +namespace v8 { +namespace internal { +namespace test_unwinder { + +static const void* fake_stack_base = nullptr; + +// Ignore deprecation warnings so that we can keep the tests for now. +// TODO(petermarshall): Delete all the tests here when the old API is removed to +// reduce the duplication. +#if __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated" +#endif + +TEST(Unwind_BadState_Fail) { + UnwindState unwind_state; // Fields are intialized to nullptr. + RegisterState register_state; + + bool unwound = v8::Unwinder::TryUnwindV8Frames(unwind_state, ®ister_state, + fake_stack_base); + CHECK(!unwound); + // The register state should not change when unwinding fails. + CHECK_NULL(register_state.fp); + CHECK_NULL(register_state.sp); + CHECK_NULL(register_state.pc); +} + +void StorePc(uintptr_t stack[], int index, uintptr_t pc) { +#ifdef V8_ENABLE_CONTROL_FLOW_INTEGRITY + Address sp = reinterpret_cast
(&stack[index]) + kSystemPointerSize; +#ifdef USE_SIMULATOR + stack[index] = Simulator::AddPAC(pc, sp, Simulator::kPACKeyIB, + Simulator::kInstructionPointer); +#else + asm volatile( + " mov x17, %[pc]\n" + " mov x16, %[sp]\n" + " pacib1716\n" + " mov %[pc], x17\n" + : [pc] "+r"(pc) + : [sp] "r"(sp) + : "x16", "x17"); + stack[index] = pc; +#endif // USE_SIMULATOR +#else + stack[index] = pc; +#endif // V8_ENABLE_CONTROL_FLOW_INTEGRITY +} + +TEST(Unwind_BuiltinPCInMiddle_Success) { + LocalContext env; + v8::Isolate* isolate = env->GetIsolate(); + Isolate* i_isolate = reinterpret_cast(isolate); + + UnwindState unwind_state = isolate->GetUnwindState(); + RegisterState register_state; + + uintptr_t stack[3]; + void* stack_base = stack + arraysize(stack); + stack[0] = reinterpret_cast(stack + 2); // saved FP (rbp). + StorePc(stack, 1, 202); // Return address into C++ code. + stack[2] = 303; // The SP points here in the caller's frame. + + register_state.sp = stack; + register_state.fp = stack; + + // Put the current PC inside of a valid builtin. + Code builtin = i_isolate->builtins()->builtin(Builtins::kStringEqual); + const uintptr_t offset = 40; + CHECK_LT(offset, builtin.InstructionSize()); + register_state.pc = + reinterpret_cast(builtin.InstructionStart() + offset); + + bool unwound = v8::Unwinder::TryUnwindV8Frames(unwind_state, ®ister_state, + stack_base); + CHECK(unwound); + CHECK_EQ(reinterpret_cast(stack + 2), register_state.fp); + CHECK_EQ(reinterpret_cast(stack + 2), register_state.sp); + CHECK_EQ(reinterpret_cast(202), register_state.pc); +} + +// The unwinder should be able to unwind even if we haven't properly set up the +// current frame, as long as there is another JS frame underneath us (i.e. as +// long as the PC isn't in JSEntry). This test puts the PC at the start +// of a JS builtin and creates a fake JSEntry frame before it on the stack. The +// unwinder should be able to unwind to the C++ frame before the JSEntry frame. +TEST(Unwind_BuiltinPCAtStart_Success) { + LocalContext env; + v8::Isolate* isolate = env->GetIsolate(); + Isolate* i_isolate = reinterpret_cast(isolate); + + UnwindState unwind_state = isolate->GetUnwindState(); + RegisterState register_state; + + const size_t code_length = 40; + uintptr_t code[code_length] = {0}; + unwind_state.code_range.start = code; + unwind_state.code_range.length_in_bytes = code_length * sizeof(uintptr_t); + + uintptr_t stack[6]; + void* stack_base = stack + arraysize(stack); + stack[0] = 101; + // Return address into JS code. It doesn't matter that this is not actually in + // JSEntry, because we only check that for the top frame. + StorePc(stack, 1, reinterpret_cast(code + 10)); + stack[2] = reinterpret_cast(stack + 5); // saved FP (rbp). + StorePc(stack, 3, 303); // Return address into C++ code. + stack[4] = 404; + stack[5] = 505; + + register_state.sp = stack; + register_state.fp = stack + 2; // FP to the JSEntry frame. + + // Put the current PC at the start of a valid builtin, so that we are setting + // up the frame. + Code builtin = i_isolate->builtins()->builtin(Builtins::kStringEqual); + register_state.pc = reinterpret_cast(builtin.InstructionStart()); + + bool unwound = v8::Unwinder::TryUnwindV8Frames(unwind_state, ®ister_state, + stack_base); + + CHECK(unwound); + CHECK_EQ(reinterpret_cast(stack + 5), register_state.fp); + CHECK_EQ(reinterpret_cast(stack + 4), register_state.sp); + CHECK_EQ(reinterpret_cast(303), register_state.pc); +} + +const char* foo_source = R"( + function foo(a, b) { + let x = a * b; + let y = x ^ b; + let z = y / a; + return x + y - z; + }; + %PrepareFunctionForOptimization(foo); + foo(1, 2); + foo(1, 2); + %OptimizeFunctionOnNextCall(foo); + foo(1, 2); +)"; + +// Check that we can unwind when the pc is within an optimized code object on +// the V8 heap. +TEST(Unwind_CodeObjectPCInMiddle_Success) { + FLAG_allow_natives_syntax = true; + LocalContext env; + v8::Isolate* isolate = env->GetIsolate(); + Isolate* i_isolate = reinterpret_cast(isolate); + HandleScope scope(i_isolate); + + UnwindState unwind_state = isolate->GetUnwindState(); + RegisterState register_state; + + uintptr_t stack[3]; + void* stack_base = stack + arraysize(stack); + stack[0] = reinterpret_cast(stack + 2); // saved FP (rbp). + StorePc(stack, 1, 202); // Return address into C++ code. + stack[2] = 303; // The SP points here in the caller's frame. + + register_state.sp = stack; + register_state.fp = stack; + + // Create an on-heap code object. Make sure we run the function so that it is + // compiled and not just marked for lazy compilation. + CompileRun(foo_source); + v8::Local local_foo = v8::Local::Cast( + env.local()->Global()->Get(env.local(), v8_str("foo")).ToLocalChecked()); + Handle foo = + Handle::cast(v8::Utils::OpenHandle(*local_foo)); + + // Put the current PC inside of the created code object. + AbstractCode abstract_code = foo->abstract_code(); + // We don't produce optimized code when run with --no-opt. + if (!abstract_code.IsCode() && FLAG_opt == false) return; + CHECK(abstract_code.IsCode()); + + Code code = abstract_code.GetCode(); + // We don't want the offset too early or it could be the `push rbp` + // instruction (which is not at the start of generated code, because the lazy + // deopt check happens before frame setup). + const uintptr_t offset = code.InstructionSize() - 20; + CHECK_LT(offset, code.InstructionSize()); + Address pc = code.InstructionStart() + offset; + register_state.pc = reinterpret_cast(pc); + + // Check that the created code is within the code range that we get from the + // API. + Address start = reinterpret_cast
(unwind_state.code_range.start); + CHECK(pc >= start && pc < start + unwind_state.code_range.length_in_bytes); + + bool unwound = v8::Unwinder::TryUnwindV8Frames(unwind_state, ®ister_state, + stack_base); + CHECK(unwound); + CHECK_EQ(reinterpret_cast(stack + 2), register_state.fp); + CHECK_EQ(reinterpret_cast(stack + 2), register_state.sp); + CHECK_EQ(reinterpret_cast(202), register_state.pc); +} + +// If the PC is within JSEntry but we haven't set up the frame yet, then we +// cannot unwind. +TEST(Unwind_JSEntryBeforeFrame_Fail) { + LocalContext env; + v8::Isolate* isolate = env->GetIsolate(); + + UnwindState unwind_state = isolate->GetUnwindState(); + RegisterState register_state; + + const size_t code_length = 40; + uintptr_t code[code_length] = {0}; + unwind_state.code_range.start = code; + unwind_state.code_range.length_in_bytes = code_length * sizeof(uintptr_t); + + // Pretend that it takes 5 instructions to set up the frame in JSEntry. + unwind_state.js_entry_stub.code.start = code + 10; + unwind_state.js_entry_stub.code.length_in_bytes = 10 * sizeof(uintptr_t); + + uintptr_t stack[10]; + void* stack_base = stack + arraysize(stack); + stack[0] = 101; + stack[1] = 111; + stack[2] = 121; + stack[3] = 131; + stack[4] = 141; + stack[5] = 151; + StorePc(stack, 6, 100); // Return address into C++ code. + stack[7] = 303; // The SP points here in the caller's frame. + stack[8] = 404; + stack[9] = 505; + + register_state.sp = stack + 5; + register_state.fp = stack + 9; + + // Put the current PC inside of JSEntry, before the frame is set up. + register_state.pc = code + 12; + bool unwound = v8::Unwinder::TryUnwindV8Frames(unwind_state, ®ister_state, + stack_base); + CHECK(!unwound); + // The register state should not change when unwinding fails. + CHECK_EQ(reinterpret_cast(stack + 9), register_state.fp); + CHECK_EQ(reinterpret_cast(stack + 5), register_state.sp); + CHECK_EQ(code + 12, register_state.pc); + + // Change the PC to a few instructions later, after the frame is set up. + register_state.pc = code + 16; + unwound = v8::Unwinder::TryUnwindV8Frames(unwind_state, ®ister_state, + stack_base); + // TODO(petermarshall): More precisely check position within JSEntry rather + // than just assuming the frame is unreadable. + CHECK(!unwound); + // The register state should not change when unwinding fails. + CHECK_EQ(reinterpret_cast(stack + 9), register_state.fp); + CHECK_EQ(reinterpret_cast(stack + 5), register_state.sp); + CHECK_EQ(code + 16, register_state.pc); +} + +TEST(Unwind_OneJSFrame_Success) { + LocalContext env; + v8::Isolate* isolate = env->GetIsolate(); + + UnwindState unwind_state = isolate->GetUnwindState(); + RegisterState register_state; + + // Use a fake code range so that we can initialize it to 0s. + const size_t code_length = 40; + uintptr_t code[code_length] = {0}; + unwind_state.code_range.start = code; + unwind_state.code_range.length_in_bytes = code_length * sizeof(uintptr_t); + + // Our fake stack has two frames - one C++ frame and one JS frame (on top). + // The stack grows from high addresses to low addresses. + uintptr_t stack[10]; + void* stack_base = stack + arraysize(stack); + stack[0] = 101; + stack[1] = 111; + stack[2] = 121; + stack[3] = 131; + stack[4] = 141; + stack[5] = reinterpret_cast(stack + 9); // saved FP (rbp). + StorePc(stack, 6, 100); // Return address into C++ code. + stack[7] = 303; // The SP points here in the caller's frame. + stack[8] = 404; + stack[9] = 505; + + register_state.sp = stack; + register_state.fp = stack + 5; + + // Put the current PC inside of the code range so it looks valid. + register_state.pc = code + 30; + + bool unwound = v8::Unwinder::TryUnwindV8Frames(unwind_state, ®ister_state, + stack_base); + + CHECK(unwound); + CHECK_EQ(reinterpret_cast(stack + 9), register_state.fp); + CHECK_EQ(reinterpret_cast(stack + 7), register_state.sp); + CHECK_EQ(reinterpret_cast(100), register_state.pc); +} + +// Creates a fake stack with two JS frames on top of a C++ frame and checks that +// the unwinder correctly unwinds past the JS frames and returns the C++ frame's +// details. +TEST(Unwind_TwoJSFrames_Success) { + LocalContext env; + v8::Isolate* isolate = env->GetIsolate(); + + UnwindState unwind_state = isolate->GetUnwindState(); + RegisterState register_state; + + // Use a fake code range so that we can initialize it to 0s. + const size_t code_length = 40; + uintptr_t code[code_length] = {0}; + unwind_state.code_range.start = code; + unwind_state.code_range.length_in_bytes = code_length * sizeof(uintptr_t); + + // Our fake stack has three frames - one C++ frame and two JS frames (on top). + // The stack grows from high addresses to low addresses. + uintptr_t stack[10]; + void* stack_base = stack + arraysize(stack); + stack[0] = 101; + stack[1] = 111; + stack[2] = reinterpret_cast(stack + 5); // saved FP (rbp). + // The fake return address is in the JS code range. + StorePc(stack, 3, reinterpret_cast(code + 10)); + stack[4] = 141; + stack[5] = reinterpret_cast(stack + 9); // saved FP (rbp). + StorePc(stack, 6, 100); // Return address into C++ code. + stack[7] = 303; // The SP points here in the caller's frame. + stack[8] = 404; + stack[9] = 505; + + register_state.sp = stack; + register_state.fp = stack + 2; + + // Put the current PC inside of the code range so it looks valid. + register_state.pc = code + 30; + + bool unwound = v8::Unwinder::TryUnwindV8Frames(unwind_state, ®ister_state, + stack_base); + + CHECK(unwound); + CHECK_EQ(reinterpret_cast(stack + 9), register_state.fp); + CHECK_EQ(reinterpret_cast(stack + 7), register_state.sp); + CHECK_EQ(reinterpret_cast(100), register_state.pc); +} + +// If the PC is in JSEntry then the frame might not be set up correctly, meaning +// we can't unwind the stack properly. +TEST(Unwind_JSEntry_Fail) { + LocalContext env; + v8::Isolate* isolate = env->GetIsolate(); + Isolate* i_isolate = reinterpret_cast(isolate); + + UnwindState unwind_state = isolate->GetUnwindState(); + RegisterState register_state; + + Code js_entry = i_isolate->heap()->builtin(Builtins::kJSEntry); + byte* start = reinterpret_cast(js_entry.InstructionStart()); + register_state.pc = start + 10; + + bool unwound = v8::Unwinder::TryUnwindV8Frames(unwind_state, ®ister_state, + fake_stack_base); + CHECK(!unwound); + // The register state should not change when unwinding fails. + CHECK_NULL(register_state.fp); + CHECK_NULL(register_state.sp); + CHECK_EQ(start + 10, register_state.pc); +} + +TEST(Unwind_StackBounds_Basic) { + LocalContext env; + v8::Isolate* isolate = env->GetIsolate(); + + UnwindState unwind_state = isolate->GetUnwindState(); + RegisterState register_state; + + const size_t code_length = 10; + uintptr_t code[code_length] = {0}; + unwind_state.code_range.start = code; + unwind_state.code_range.length_in_bytes = code_length * sizeof(uintptr_t); + + uintptr_t stack[3]; + stack[0] = reinterpret_cast(stack + 2); // saved FP (rbp). + StorePc(stack, 1, 202); // Return address into C++ code. + stack[2] = 303; // The SP points here in the caller's frame. + + register_state.sp = stack; + register_state.fp = stack; + register_state.pc = code; + + void* wrong_stack_base = reinterpret_cast( + reinterpret_cast(stack) - sizeof(uintptr_t)); + bool unwound = v8::Unwinder::TryUnwindV8Frames(unwind_state, ®ister_state, + wrong_stack_base); + CHECK(!unwound); + + // Correct the stack base and unwinding should succeed. + void* correct_stack_base = stack + arraysize(stack); + unwound = v8::Unwinder::TryUnwindV8Frames(unwind_state, ®ister_state, + correct_stack_base); + CHECK(unwound); +} + +TEST(Unwind_StackBounds_WithUnwinding) { + LocalContext env; + v8::Isolate* isolate = env->GetIsolate(); + + UnwindState unwind_state = isolate->GetUnwindState(); + RegisterState register_state; + + // Use a fake code range so that we can initialize it to 0s. + const size_t code_length = 40; + uintptr_t code[code_length] = {0}; + unwind_state.code_range.start = code; + unwind_state.code_range.length_in_bytes = code_length * sizeof(uintptr_t); + + // Our fake stack has two frames - one C++ frame and one JS frame (on top). + // The stack grows from high addresses to low addresses. + uintptr_t stack[11]; + void* stack_base = stack + arraysize(stack); + stack[0] = 101; + stack[1] = 111; + stack[2] = 121; + stack[3] = 131; + stack[4] = 141; + stack[5] = reinterpret_cast(stack + 9); // saved FP (rbp). + StorePc(stack, 6, reinterpret_cast(code + 20)); // JS code. + stack[7] = 303; // The SP points here in the caller's frame. + stack[8] = 404; + stack[9] = reinterpret_cast(stack) + + (12 * sizeof(uintptr_t)); // saved FP (OOB). + StorePc(stack, 10, reinterpret_cast(code + 20)); // JS code. + + register_state.sp = stack; + register_state.fp = stack + 5; + + // Put the current PC inside of the code range so it looks valid. + register_state.pc = code + 30; + + // Unwind will fail because stack[9] FP points outside of the stack. + bool unwound = v8::Unwinder::TryUnwindV8Frames(unwind_state, ®ister_state, + stack_base); + CHECK(!unwound); + + // Change the return address so that it is not in range. We will not range + // check the stack[9] FP value because we have finished unwinding and the + // contents of rbp does not necessarily have to be the FP in this case. + StorePc(stack, 10, 202); + unwound = v8::Unwinder::TryUnwindV8Frames(unwind_state, ®ister_state, + stack_base); + CHECK(unwound); +} + +TEST(PCIsInV8_BadState_Fail) { + UnwindState unwind_state; + void* pc = nullptr; + + CHECK(!v8::Unwinder::PCIsInV8(unwind_state, pc)); +} + +TEST(PCIsInV8_ValidStateNullPC_Fail) { + LocalContext env; + v8::Isolate* isolate = env->GetIsolate(); + + UnwindState unwind_state = isolate->GetUnwindState(); + void* pc = nullptr; + + CHECK(!v8::Unwinder::PCIsInV8(unwind_state, pc)); +} + +void TestRangeBoundaries(const UnwindState& unwind_state, byte* range_start, + size_t range_length) { + void* pc = range_start - 1; + CHECK(!v8::Unwinder::PCIsInV8(unwind_state, pc)); + pc = range_start; + CHECK(v8::Unwinder::PCIsInV8(unwind_state, pc)); + pc = range_start + 1; + CHECK(v8::Unwinder::PCIsInV8(unwind_state, pc)); + pc = range_start + range_length - 1; + CHECK(v8::Unwinder::PCIsInV8(unwind_state, pc)); + pc = range_start + range_length; + CHECK(!v8::Unwinder::PCIsInV8(unwind_state, pc)); + pc = range_start + range_length + 1; + CHECK(!v8::Unwinder::PCIsInV8(unwind_state, pc)); +} + +TEST(PCIsInV8_InCodeOrEmbeddedRange) { + LocalContext env; + v8::Isolate* isolate = env->GetIsolate(); + + UnwindState unwind_state = isolate->GetUnwindState(); + + byte* code_range_start = const_cast( + reinterpret_cast(unwind_state.code_range.start)); + size_t code_range_length = unwind_state.code_range.length_in_bytes; + TestRangeBoundaries(unwind_state, code_range_start, code_range_length); + + byte* embedded_range_start = const_cast( + reinterpret_cast(unwind_state.embedded_code_range.start)); + size_t embedded_range_length = + unwind_state.embedded_code_range.length_in_bytes; + TestRangeBoundaries(unwind_state, embedded_range_start, + embedded_range_length); +} + +// PCIsInV8 doesn't check if the PC is in JSEntry directly. It's assumed that +// the CodeRange or EmbeddedCodeRange contain JSEntry. +TEST(PCIsInV8_InJSEntryRange) { + LocalContext env; + v8::Isolate* isolate = env->GetIsolate(); + Isolate* i_isolate = reinterpret_cast(isolate); + + UnwindState unwind_state = isolate->GetUnwindState(); + + Code js_entry = i_isolate->heap()->builtin(Builtins::kJSEntry); + byte* start = reinterpret_cast(js_entry.InstructionStart()); + size_t length = js_entry.InstructionSize(); + + void* pc = start; + CHECK(v8::Unwinder::PCIsInV8(unwind_state, pc)); + pc = start + 1; + CHECK(v8::Unwinder::PCIsInV8(unwind_state, pc)); + pc = start + length - 1; + CHECK(v8::Unwinder::PCIsInV8(unwind_state, pc)); +} + +// Large code objects can be allocated in large object space. Check that this is +// inside the CodeRange. +TEST(PCIsInV8_LargeCodeObject) { + FLAG_allow_natives_syntax = true; + LocalContext env; + v8::Isolate* isolate = env->GetIsolate(); + Isolate* i_isolate = reinterpret_cast(isolate); + HandleScope scope(i_isolate); + + UnwindState unwind_state = isolate->GetUnwindState(); + + // Create a big function that ends up in CODE_LO_SPACE. + const int instruction_size = Page::kPageSize + 1; + STATIC_ASSERT(instruction_size > kMaxRegularHeapObjectSize); + std::unique_ptr instructions(new byte[instruction_size]); + + CodeDesc desc; + desc.buffer = instructions.get(); + desc.buffer_size = instruction_size; + desc.instr_size = instruction_size; + desc.reloc_size = 0; + desc.constant_pool_size = 0; + desc.unwinding_info = nullptr; + desc.unwinding_info_size = 0; + desc.origin = nullptr; + Handle foo_code = + Factory::CodeBuilder(i_isolate, desc, CodeKind::WASM_FUNCTION).Build(); + + CHECK(i_isolate->heap()->InSpace(*foo_code, CODE_LO_SPACE)); + byte* start = reinterpret_cast(foo_code->InstructionStart()); + + void* pc = start; + CHECK(v8::Unwinder::PCIsInV8(unwind_state, pc)); +} + +#ifdef USE_SIMULATOR +// TODO(v8:10026): Make this also work without the simulator. The part that +// needs modifications is getting the RegisterState. +class UnwinderTestHelper { + public: + explicit UnwinderTestHelper(const std::string& test_function) + : isolate_(CcTest::isolate()) { + CHECK(!instance_); + instance_ = this; + v8::HandleScope scope(isolate_); + v8::Local global = v8::ObjectTemplate::New(isolate_); + global->Set(v8_str("TryUnwind"), + v8::FunctionTemplate::New(isolate_, TryUnwind)); + LocalContext env(isolate_, nullptr, global); + CompileRun(v8_str(test_function.c_str())); + } + + ~UnwinderTestHelper() { instance_ = nullptr; } + + private: + static void TryUnwind(const v8::FunctionCallbackInfo& args) { + instance_->DoTryUnwind(); + } + + void DoTryUnwind() { + // Set up RegisterState. + v8::RegisterState register_state; + SimulatorHelper simulator_helper; + if (!simulator_helper.Init(isolate_)) return; + simulator_helper.FillRegisters(®ister_state); + // At this point, the PC will point to a Redirection object, which is not + // in V8 as far as the unwinder is concerned. To make this work, point to + // the return address, which is in V8, instead. + register_state.pc = register_state.lr; + + UnwindState unwind_state = isolate_->GetUnwindState(); + void* stack_base = reinterpret_cast(0xffffffffffffffffL); + bool unwound = v8::Unwinder::TryUnwindV8Frames(unwind_state, + ®ister_state, stack_base); + // Check that we have successfully unwound past js_entry_sp. + CHECK(unwound); + CHECK_GT(register_state.sp, + reinterpret_cast(CcTest::i_isolate()->js_entry_sp())); + } + + v8::Isolate* isolate_; + + static UnwinderTestHelper* instance_; +}; + +UnwinderTestHelper* UnwinderTestHelper::instance_; + +TEST(Unwind_TwoNestedFunctions) { + i::FLAG_allow_natives_syntax = true; + const char* test_script = + "function test_unwinder_api_inner() {" + " TryUnwind();" + " return 0;" + "}" + "function test_unwinder_api_outer() {" + " return test_unwinder_api_inner();" + "}" + "%NeverOptimizeFunction(test_unwinder_api_inner);" + "%NeverOptimizeFunction(test_unwinder_api_outer);" + "test_unwinder_api_outer();"; + + UnwinderTestHelper helper(test_script); +} +#endif + +#if __clang__ +#pragma clang diagnostic pop +#endif + +} // namespace test_unwinder +} // namespace internal +} // namespace v8

>>0;r=u;d=k?u:d;p=k?g:p}r=d;i=c[56334]|0;if(r>>>0>>0){ce();return 0;return 0}e=r+b|0;m=e;if(r>>>0>=e>>>0){ce();return 0;return 0}e=c[d+24>>2]|0;f=c[d+12>>2]|0;do{if((f|0)==(d|0)){q=d+20|0;g=c[q>>2]|0;if((g|0)==0){k=d+16|0;l=c[k>>2]|0;if((l|0)==0){v=0;break}else{w=l;x=k}}else{w=g;x=q}while(1){q=w+20|0;g=c[q>>2]|0;if((g|0)!=0){w=g;x=q;continue}q=w+16|0;g=c[q>>2]|0;if((g|0)==0){break}else{w=g;x=q}}if(x>>>0>>0){ce();return 0;return 0}else{c[x>>2]=0;v=w;break}}else{q=c[d+8>>2]|0;if(q>>>0>>0){ce();return 0;return 0}g=q+12|0;if((c[g>>2]|0)!=(d|0)){ce();return 0;return 0}k=f+8|0;if((c[k>>2]|0)==(d|0)){c[g>>2]=f;c[k>>2]=q;v=f;break}else{ce();return 0;return 0}}}while(0);L1026:do{if((e|0)!=0){f=d+28|0;i=225624+(c[f>>2]<<2)|0;do{if((d|0)==(c[i>>2]|0)){c[i>>2]=v;if((v|0)!=0){break}c[56331]=c[56331]&(1<>2]^-1);break L1026}else{if(e>>>0<(c[56334]|0)>>>0){ce();return 0;return 0}q=e+16|0;if((c[q>>2]|0)==(d|0)){c[q>>2]=v}else{c[e+20>>2]=v}if((v|0)==0){break L1026}}}while(0);if(v>>>0<(c[56334]|0)>>>0){ce();return 0;return 0}c[v+24>>2]=e;f=c[d+16>>2]|0;do{if((f|0)!=0){if(f>>>0<(c[56334]|0)>>>0){ce();return 0;return 0}else{c[v+16>>2]=f;c[f+24>>2]=v;break}}}while(0);f=c[d+20>>2]|0;if((f|0)==0){break}if(f>>>0<(c[56334]|0)>>>0){ce();return 0;return 0}else{c[v+20>>2]=f;c[f+24>>2]=v;break}}}while(0);if(p>>>0<16){e=p+b|0;c[d+4>>2]=e|3;f=r+(e+4|0)|0;c[f>>2]=c[f>>2]|1}else{c[d+4>>2]=b|3;c[r+(b|4)>>2]=p|1;c[r+(p+b|0)>>2]=p;f=c[56332]|0;if((f|0)!=0){e=c[56335]|0;i=f>>>3;f=i<<1;q=225360+(f<<2)|0;k=c[56330]|0;g=1<>2]|0;if(l>>>0>=(c[56334]|0)>>>0){y=l;z=i;break}ce();return 0;return 0}}while(0);c[z>>2]=e;c[y+12>>2]=e;c[e+8>>2]=y;c[e+12>>2]=q}c[56332]=p;c[56335]=m}f=d+8|0;if((f|0)==0){o=b;break}else{n=f}return n|0}else{if(a>>>0>4294967231){o=-1;break}f=a+11|0;g=f&-8;k=c[56331]|0;if((k|0)==0){o=g;break}r=-g|0;i=f>>>8;do{if((i|0)==0){A=0}else{if(g>>>0>16777215){A=31;break}f=(i+1048320|0)>>>16&8;l=i<>>16&4;j=l<>>16&2;B=(14-(h|f|l)|0)+(j<>>15)|0;A=g>>>((B+7|0)>>>0)&1|B<<1}}while(0);i=c[225624+(A<<2)>>2]|0;L1074:do{if((i|0)==0){C=0;D=r;E=0}else{if((A|0)==31){F=0}else{F=25-(A>>>1)|0}d=0;m=r;p=i;q=g<>2]&-8;l=B-g|0;if(l>>>0>>0){if((B|0)==(g|0)){C=p;D=l;E=p;break L1074}else{G=p;H=l}}else{G=d;H=m}l=c[p+20>>2]|0;B=c[p+16+(q>>>31<<2)>>2]|0;j=(l|0)==0|(l|0)==(B|0)?e:l;if((B|0)==0){C=G;D=H;E=j;break}else{d=G;m=H;p=B;q=q<<1;e=j}}}}while(0);if((E|0)==0&(C|0)==0){i=2<>>12&16;e=i>>>(r>>>0);i=e>>>5&8;q=e>>>(i>>>0);e=q>>>2&4;p=q>>>(e>>>0);q=p>>>1&2;m=p>>>(q>>>0);p=m>>>1&1;I=c[225624+((i|r|e|q|p)+(m>>>(p>>>0))<<2)>>2]|0}else{I=E}if((I|0)==0){J=D;K=C}else{p=I;m=D;q=C;while(1){e=(c[p+4>>2]&-8)-g|0;r=e>>>0>>0;i=r?e:m;e=r?p:q;r=c[p+16>>2]|0;if((r|0)!=0){p=r;m=i;q=e;continue}r=c[p+20>>2]|0;if((r|0)==0){J=i;K=e;break}else{p=r;m=i;q=e}}}if((K|0)==0){o=g;break}if(J>>>0>=((c[56332]|0)-g|0)>>>0){o=g;break}q=K;m=c[56334]|0;if(q>>>0>>0){ce();return 0;return 0}p=q+g|0;k=p;if(q>>>0>=p>>>0){ce();return 0;return 0}e=c[K+24>>2]|0;i=c[K+12>>2]|0;do{if((i|0)==(K|0)){r=K+20|0;d=c[r>>2]|0;if((d|0)==0){j=K+16|0;B=c[j>>2]|0;if((B|0)==0){L=0;break}else{M=B;N=j}}else{M=d;N=r}while(1){r=M+20|0;d=c[r>>2]|0;if((d|0)!=0){M=d;N=r;continue}r=M+16|0;d=c[r>>2]|0;if((d|0)==0){break}else{M=d;N=r}}if(N>>>0>>0){ce();return 0;return 0}else{c[N>>2]=0;L=M;break}}else{r=c[K+8>>2]|0;if(r>>>0>>0){ce();return 0;return 0}d=r+12|0;if((c[d>>2]|0)!=(K|0)){ce();return 0;return 0}j=i+8|0;if((c[j>>2]|0)==(K|0)){c[d>>2]=i;c[j>>2]=r;L=i;break}else{ce();return 0;return 0}}}while(0);L1124:do{if((e|0)!=0){i=K+28|0;m=225624+(c[i>>2]<<2)|0;do{if((K|0)==(c[m>>2]|0)){c[m>>2]=L;if((L|0)!=0){break}c[56331]=c[56331]&(1<>2]^-1);break L1124}else{if(e>>>0<(c[56334]|0)>>>0){ce();return 0;return 0}r=e+16|0;if((c[r>>2]|0)==(K|0)){c[r>>2]=L}else{c[e+20>>2]=L}if((L|0)==0){break L1124}}}while(0);if(L>>>0<(c[56334]|0)>>>0){ce();return 0;return 0}c[L+24>>2]=e;i=c[K+16>>2]|0;do{if((i|0)!=0){if(i>>>0<(c[56334]|0)>>>0){ce();return 0;return 0}else{c[L+16>>2]=i;c[i+24>>2]=L;break}}}while(0);i=c[K+20>>2]|0;if((i|0)==0){break}if(i>>>0<(c[56334]|0)>>>0){ce();return 0;return 0}else{c[L+20>>2]=i;c[i+24>>2]=L;break}}}while(0);do{if(J>>>0<16){e=J+g|0;c[K+4>>2]=e|3;i=q+(e+4|0)|0;c[i>>2]=c[i>>2]|1}else{c[K+4>>2]=g|3;c[q+(g|4)>>2]=J|1;c[q+(J+g|0)>>2]=J;i=J>>>3;if(J>>>0<256){e=i<<1;m=225360+(e<<2)|0;r=c[56330]|0;j=1<>2]|0;if(d>>>0>=(c[56334]|0)>>>0){O=d;P=i;break}ce();return 0;return 0}}while(0);c[P>>2]=k;c[O+12>>2]=k;c[q+(g+8|0)>>2]=O;c[q+(g+12|0)>>2]=m;break}e=p;j=J>>>8;do{if((j|0)==0){Q=0}else{if(J>>>0>16777215){Q=31;break}r=(j+1048320|0)>>>16&8;i=j<>>16&4;B=i<>>16&2;l=(14-(d|r|i)|0)+(B<>>15)|0;Q=J>>>((l+7|0)>>>0)&1|l<<1}}while(0);j=225624+(Q<<2)|0;c[q+(g+28|0)>>2]=Q;c[q+(g+20|0)>>2]=0;c[q+(g+16|0)>>2]=0;m=c[56331]|0;l=1<>2]=e;c[q+(g+24|0)>>2]=j;c[q+(g+12|0)>>2]=e;c[q+(g+8|0)>>2]=e;break}if((Q|0)==31){R=0}else{R=25-(Q>>>1)|0}l=J<>2]|0;while(1){if((c[m+4>>2]&-8|0)==(J|0)){break}S=m+16+(l>>>31<<2)|0;j=c[S>>2]|0;if((j|0)==0){T=862;break}else{l=l<<1;m=j}}if((T|0)==862){if(S>>>0<(c[56334]|0)>>>0){ce();return 0;return 0}else{c[S>>2]=e;c[q+(g+24|0)>>2]=m;c[q+(g+12|0)>>2]=e;c[q+(g+8|0)>>2]=e;break}}l=m+8|0;j=c[l>>2]|0;i=c[56334]|0;if(m>>>0>>0){ce();return 0;return 0}if(j>>>0>>0){ce();return 0;return 0}else{c[j+12>>2]=e;c[l>>2]=e;c[q+(g+8|0)>>2]=j;c[q+(g+12|0)>>2]=m;c[q+(g+24|0)>>2]=0;break}}}while(0);q=K+8|0;if((q|0)==0){o=g;break}else{n=q}return n|0}}while(0);K=c[56332]|0;if(o>>>0<=K>>>0){S=K-o|0;J=c[56335]|0;if(S>>>0>15){R=J;c[56335]=R+o;c[56332]=S;c[R+(o+4|0)>>2]=S|1;c[R+K>>2]=S;c[J+4>>2]=o|3}else{c[56332]=0;c[56335]=0;c[J+4>>2]=K|3;S=J+(K+4|0)|0;c[S>>2]=c[S>>2]|1}n=J+8|0;return n|0}J=c[56333]|0;if(o>>>0>>0){S=J-o|0;c[56333]=S;J=c[56336]|0;K=J;c[56336]=K+o;c[K+(o+4|0)>>2]=S|1;c[J+4>>2]=o|3;n=J+8|0;return n|0}do{if((c[8408]|0)==0){J=cb(8)|0;if((J-1&J|0)==0){c[8410]=J;c[8409]=J;c[8411]=-1;c[8412]=2097152;c[8413]=0;c[56441]=0;c[8408]=cG(0)&-16^1431655768;break}else{ce();return 0;return 0}}}while(0);J=o+48|0;S=c[8410]|0;K=o+47|0;R=S+K|0;Q=-S|0;S=R&Q;if(S>>>0<=o>>>0){n=0;return n|0}O=c[56440]|0;do{if((O|0)!=0){P=c[56438]|0;L=P+S|0;if(L>>>0<=P>>>0|L>>>0>O>>>0){n=0}else{break}return n|0}}while(0);L1216:do{if((c[56441]&4|0)==0){O=c[56336]|0;L1218:do{if((O|0)==0){T=892}else{L=O;P=225768;while(1){U=P|0;M=c[U>>2]|0;if(M>>>0<=L>>>0){V=P+4|0;if((M+(c[V>>2]|0)|0)>>>0>L>>>0){break}}M=c[P+8>>2]|0;if((M|0)==0){T=892;break L1218}else{P=M}}if((P|0)==0){T=892;break}L=R-(c[56333]|0)&Q;if(L>>>0>=2147483647){W=0;break}m=b_(L|0)|0;e=(m|0)==((c[U>>2]|0)+(c[V>>2]|0)|0);X=e?m:-1;Y=e?L:0;Z=m;_=L;T=901}}while(0);do{if((T|0)==892){O=b_(0)|0;if((O|0)==-1){W=0;break}g=O;L=c[8409]|0;m=L-1|0;if((m&g|0)==0){$=S}else{$=(S-g|0)+(m+g&-L)|0}L=c[56438]|0;g=L+$|0;if(!($>>>0>o>>>0&$>>>0<2147483647)){W=0;break}m=c[56440]|0;if((m|0)!=0){if(g>>>0<=L>>>0|g>>>0>m>>>0){W=0;break}}m=b_($|0)|0;g=(m|0)==(O|0);X=g?O:-1;Y=g?$:0;Z=m;_=$;T=901}}while(0);L1238:do{if((T|0)==901){m=-_|0;if((X|0)!=-1){aa=Y;ab=X;T=912;break L1216}do{if((Z|0)!=-1&_>>>0<2147483647&_>>>0>>0){g=c[8410]|0;O=(K-_|0)+g&-g;if(O>>>0>=2147483647){ac=_;break}if((b_(O|0)|0)==-1){b_(m|0);W=Y;break L1238}else{ac=O+_|0;break}}else{ac=_}}while(0);if((Z|0)==-1){W=Y}else{aa=ac;ab=Z;T=912;break L1216}}}while(0);c[56441]=c[56441]|4;ad=W;T=909}else{ad=0;T=909}}while(0);do{if((T|0)==909){if(S>>>0>=2147483647){break}W=b_(S|0)|0;Z=b_(0)|0;if(!((Z|0)!=-1&(W|0)!=-1&W>>>0>>0)){break}ac=Z-W|0;Z=ac>>>0>(o+40|0)>>>0;Y=Z?W:-1;if((Y|0)!=-1){aa=Z?ac:ad;ab=Y;T=912}}}while(0);do{if((T|0)==912){ad=(c[56438]|0)+aa|0;c[56438]=ad;if(ad>>>0>(c[56439]|0)>>>0){c[56439]=ad}ad=c[56336]|0;L1258:do{if((ad|0)==0){S=c[56334]|0;if((S|0)==0|ab>>>0>>0){c[56334]=ab}c[56442]=ab;c[56443]=aa;c[56445]=0;c[56339]=c[8408];c[56338]=-1;S=0;do{Y=S<<1;ac=225360+(Y<<2)|0;c[225360+(Y+3<<2)>>2]=ac;c[225360+(Y+2<<2)>>2]=ac;S=S+1|0;}while(S>>>0<32);S=ab+8|0;if((S&7|0)==0){ae=0}else{ae=-S&7}S=(aa-40|0)-ae|0;c[56336]=ab+ae;c[56333]=S;c[ab+(ae+4|0)>>2]=S|1;c[ab+(aa-36|0)>>2]=40;c[56337]=c[8412]}else{S=225768;while(1){af=c[S>>2]|0;ag=S+4|0;ah=c[ag>>2]|0;if((ab|0)==(af+ah|0)){T=924;break}ac=c[S+8>>2]|0;if((ac|0)==0){break}else{S=ac}}do{if((T|0)==924){if((c[S+12>>2]&8|0)!=0){break}ac=ad;if(!(ac>>>0>=af>>>0&ac>>>0>>0)){break}c[ag>>2]=ah+aa;ac=c[56336]|0;Y=(c[56333]|0)+aa|0;Z=ac;W=ac+8|0;if((W&7|0)==0){ai=0}else{ai=-W&7}W=Y-ai|0;c[56336]=Z+ai;c[56333]=W;c[Z+(ai+4|0)>>2]=W|1;c[Z+(Y+4|0)>>2]=40;c[56337]=c[8412];break L1258}}while(0);if(ab>>>0<(c[56334]|0)>>>0){c[56334]=ab}S=ab+aa|0;Y=225768;while(1){aj=Y|0;if((c[aj>>2]|0)==(S|0)){T=934;break}Z=c[Y+8>>2]|0;if((Z|0)==0){break}else{Y=Z}}do{if((T|0)==934){if((c[Y+12>>2]&8|0)!=0){break}c[aj>>2]=ab;S=Y+4|0;c[S>>2]=(c[S>>2]|0)+aa;S=ab+8|0;if((S&7|0)==0){ak=0}else{ak=-S&7}S=ab+(aa+8|0)|0;if((S&7|0)==0){al=0}else{al=-S&7}S=ab+(al+aa|0)|0;Z=S;W=ak+o|0;ac=ab+W|0;_=ac;K=(S-(ab+ak|0)|0)-o|0;c[ab+(ak+4|0)>>2]=o|3;do{if((Z|0)==(c[56336]|0)){J=(c[56333]|0)+K|0;c[56333]=J;c[56336]=_;c[ab+(W+4|0)>>2]=J|1}else{if((Z|0)==(c[56335]|0)){J=(c[56332]|0)+K|0;c[56332]=J;c[56335]=_;c[ab+(W+4|0)>>2]=J|1;c[ab+(J+W|0)>>2]=J;break}J=aa+4|0;X=c[ab+(J+al|0)>>2]|0;if((X&3|0)==1){$=X&-8;V=X>>>3;L1293:do{if(X>>>0<256){U=c[ab+((al|8)+aa|0)>>2]|0;Q=c[ab+((aa+12|0)+al|0)>>2]|0;R=225360+(V<<1<<2)|0;do{if((U|0)!=(R|0)){if(U>>>0<(c[56334]|0)>>>0){ce();return 0;return 0}if((c[U+12>>2]|0)==(Z|0)){break}ce();return 0;return 0}}while(0);if((Q|0)==(U|0)){c[56330]=c[56330]&(1<>>0<(c[56334]|0)>>>0){ce();return 0;return 0}m=Q+8|0;if((c[m>>2]|0)==(Z|0)){am=m;break}ce();return 0;return 0}}while(0);c[U+12>>2]=Q;c[am>>2]=U}else{R=S;m=c[ab+((al|24)+aa|0)>>2]|0;P=c[ab+((aa+12|0)+al|0)>>2]|0;do{if((P|0)==(R|0)){O=al|16;g=ab+(J+O|0)|0;L=c[g>>2]|0;if((L|0)==0){e=ab+(O+aa|0)|0;O=c[e>>2]|0;if((O|0)==0){an=0;break}else{ao=O;ap=e}}else{ao=L;ap=g}while(1){g=ao+20|0;L=c[g>>2]|0;if((L|0)!=0){ao=L;ap=g;continue}g=ao+16|0;L=c[g>>2]|0;if((L|0)==0){break}else{ao=L;ap=g}}if(ap>>>0<(c[56334]|0)>>>0){ce();return 0;return 0}else{c[ap>>2]=0;an=ao;break}}else{g=c[ab+((al|8)+aa|0)>>2]|0;if(g>>>0<(c[56334]|0)>>>0){ce();return 0;return 0}L=g+12|0;if((c[L>>2]|0)!=(R|0)){ce();return 0;return 0}e=P+8|0;if((c[e>>2]|0)==(R|0)){c[L>>2]=P;c[e>>2]=g;an=P;break}else{ce();return 0;return 0}}}while(0);if((m|0)==0){break}P=ab+((aa+28|0)+al|0)|0;U=225624+(c[P>>2]<<2)|0;do{if((R|0)==(c[U>>2]|0)){c[U>>2]=an;if((an|0)!=0){break}c[56331]=c[56331]&(1<>2]^-1);break L1293}else{if(m>>>0<(c[56334]|0)>>>0){ce();return 0;return 0}Q=m+16|0;if((c[Q>>2]|0)==(R|0)){c[Q>>2]=an}else{c[m+20>>2]=an}if((an|0)==0){break L1293}}}while(0);if(an>>>0<(c[56334]|0)>>>0){ce();return 0;return 0}c[an+24>>2]=m;R=al|16;P=c[ab+(R+aa|0)>>2]|0;do{if((P|0)!=0){if(P>>>0<(c[56334]|0)>>>0){ce();return 0;return 0}else{c[an+16>>2]=P;c[P+24>>2]=an;break}}}while(0);P=c[ab+(J+R|0)>>2]|0;if((P|0)==0){break}if(P>>>0<(c[56334]|0)>>>0){ce();return 0;return 0}else{c[an+20>>2]=P;c[P+24>>2]=an;break}}}while(0);aq=ab+(($|al)+aa|0)|0;ar=$+K|0}else{aq=Z;ar=K}J=aq+4|0;c[J>>2]=c[J>>2]&-2;c[ab+(W+4|0)>>2]=ar|1;c[ab+(ar+W|0)>>2]=ar;J=ar>>>3;if(ar>>>0<256){V=J<<1;X=225360+(V<<2)|0;P=c[56330]|0;m=1<>2]|0;if(U>>>0>=(c[56334]|0)>>>0){as=U;at=J;break}ce();return 0;return 0}}while(0);c[at>>2]=_;c[as+12>>2]=_;c[ab+(W+8|0)>>2]=as;c[ab+(W+12|0)>>2]=X;break}V=ac;m=ar>>>8;do{if((m|0)==0){au=0}else{if(ar>>>0>16777215){au=31;break}P=(m+1048320|0)>>>16&8;$=m<>>16&4;U=$<>>16&2;Q=(14-(J|P|$)|0)+(U<<$>>>15)|0;au=ar>>>((Q+7|0)>>>0)&1|Q<<1}}while(0);m=225624+(au<<2)|0;c[ab+(W+28|0)>>2]=au;c[ab+(W+20|0)>>2]=0;c[ab+(W+16|0)>>2]=0;X=c[56331]|0;Q=1<>2]=V;c[ab+(W+24|0)>>2]=m;c[ab+(W+12|0)>>2]=V;c[ab+(W+8|0)>>2]=V;break}if((au|0)==31){av=0}else{av=25-(au>>>1)|0}Q=ar<>2]|0;while(1){if((c[X+4>>2]&-8|0)==(ar|0)){break}aw=X+16+(Q>>>31<<2)|0;m=c[aw>>2]|0;if((m|0)==0){T=1007;break}else{Q=Q<<1;X=m}}if((T|0)==1007){if(aw>>>0<(c[56334]|0)>>>0){ce();return 0;return 0}else{c[aw>>2]=V;c[ab+(W+24|0)>>2]=X;c[ab+(W+12|0)>>2]=V;c[ab+(W+8|0)>>2]=V;break}}Q=X+8|0;m=c[Q>>2]|0;$=c[56334]|0;if(X>>>0<$>>>0){ce();return 0;return 0}if(m>>>0<$>>>0){ce();return 0;return 0}else{c[m+12>>2]=V;c[Q>>2]=V;c[ab+(W+8|0)>>2]=m;c[ab+(W+12|0)>>2]=X;c[ab+(W+24|0)>>2]=0;break}}}while(0);n=ab+(ak|8)|0;return n|0}}while(0);Y=ad;W=225768;while(1){ax=c[W>>2]|0;if(ax>>>0<=Y>>>0){ay=c[W+4>>2]|0;az=ax+ay|0;if(az>>>0>Y>>>0){break}}W=c[W+8>>2]|0}W=ax+(ay-39|0)|0;if((W&7|0)==0){aA=0}else{aA=-W&7}W=ax+((ay-47|0)+aA|0)|0;ac=W>>>0<(ad+16|0)>>>0?Y:W;W=ac+8|0;_=ab+8|0;if((_&7|0)==0){aB=0}else{aB=-_&7}_=(aa-40|0)-aB|0;c[56336]=ab+aB;c[56333]=_;c[ab+(aB+4|0)>>2]=_|1;c[ab+(aa-36|0)>>2]=40;c[56337]=c[8412];c[ac+4>>2]=27;c[W>>2]=c[56442];c[W+4>>2]=c[225772>>2];c[W+8>>2]=c[225776>>2];c[W+12>>2]=c[225780>>2];c[56442]=ab;c[56443]=aa;c[56445]=0;c[56444]=W;W=ac+28|0;c[W>>2]=7;if((ac+32|0)>>>0>>0){_=W;while(1){W=_+4|0;c[W>>2]=7;if((_+8|0)>>>0>>0){_=W}else{break}}}if((ac|0)==(Y|0)){break}_=ac-ad|0;W=Y+(_+4|0)|0;c[W>>2]=c[W>>2]&-2;c[ad+4>>2]=_|1;c[Y+_>>2]=_;W=_>>>3;if(_>>>0<256){K=W<<1;Z=225360+(K<<2)|0;S=c[56330]|0;m=1<>2]|0;if(Q>>>0>=(c[56334]|0)>>>0){aC=Q;aD=W;break}ce();return 0;return 0}}while(0);c[aD>>2]=ad;c[aC+12>>2]=ad;c[ad+8>>2]=aC;c[ad+12>>2]=Z;break}K=ad;m=_>>>8;do{if((m|0)==0){aE=0}else{if(_>>>0>16777215){aE=31;break}S=(m+1048320|0)>>>16&8;Y=m<>>16&4;W=Y<>>16&2;Q=(14-(ac|S|Y)|0)+(W<>>15)|0;aE=_>>>((Q+7|0)>>>0)&1|Q<<1}}while(0);m=225624+(aE<<2)|0;c[ad+28>>2]=aE;c[ad+20>>2]=0;c[ad+16>>2]=0;Z=c[56331]|0;Q=1<>2]=K;c[ad+24>>2]=m;c[ad+12>>2]=ad;c[ad+8>>2]=ad;break}if((aE|0)==31){aF=0}else{aF=25-(aE>>>1)|0}Q=_<>2]|0;while(1){if((c[Z+4>>2]&-8|0)==(_|0)){break}aG=Z+16+(Q>>>31<<2)|0;m=c[aG>>2]|0;if((m|0)==0){T=1042;break}else{Q=Q<<1;Z=m}}if((T|0)==1042){if(aG>>>0<(c[56334]|0)>>>0){ce();return 0;return 0}else{c[aG>>2]=K;c[ad+24>>2]=Z;c[ad+12>>2]=ad;c[ad+8>>2]=ad;break}}Q=Z+8|0;_=c[Q>>2]|0;m=c[56334]|0;if(Z>>>0>>0){ce();return 0;return 0}if(_>>>0>>0){ce();return 0;return 0}else{c[_+12>>2]=K;c[Q>>2]=K;c[ad+8>>2]=_;c[ad+12>>2]=Z;c[ad+24>>2]=0;break}}}while(0);ad=c[56333]|0;if(ad>>>0<=o>>>0){break}_=ad-o|0;c[56333]=_;ad=c[56336]|0;Q=ad;c[56336]=Q+o;c[Q+(o+4|0)>>2]=_|1;c[ad+4>>2]=o|3;n=ad+8|0;return n|0}}while(0);c[b0()>>2]=12;n=0;return n|0}function uu(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0;if((a|0)==0){return}b=a-8|0;d=b;e=c[56334]|0;if(b>>>0>>0){ce()}f=c[a-4>>2]|0;g=f&3;if((g|0)==1){ce()}h=f&-8;i=a+(h-8|0)|0;j=i;L1475:do{if((f&1|0)==0){k=c[b>>2]|0;if((g|0)==0){return}l=-8-k|0;m=a+l|0;n=m;o=k+h|0;if(m>>>0>>0){ce()}if((n|0)==(c[56335]|0)){p=a+(h-4|0)|0;if((c[p>>2]&3|0)!=3){q=n;r=o;break}c[56332]=o;c[p>>2]=c[p>>2]&-2;c[a+(l+4|0)>>2]=o|1;c[i>>2]=o;return}p=k>>>3;if(k>>>0<256){k=c[a+(l+8|0)>>2]|0;s=c[a+(l+12|0)>>2]|0;t=225360+(p<<1<<2)|0;do{if((k|0)!=(t|0)){if(k>>>0>>0){ce()}if((c[k+12>>2]|0)==(n|0)){break}ce()}}while(0);if((s|0)==(k|0)){c[56330]=c[56330]&(1<>>0>>0){ce()}v=s+8|0;if((c[v>>2]|0)==(n|0)){u=v;break}ce()}}while(0);c[k+12>>2]=s;c[u>>2]=k;q=n;r=o;break}t=m;p=c[a+(l+24|0)>>2]|0;v=c[a+(l+12|0)>>2]|0;do{if((v|0)==(t|0)){w=a+(l+20|0)|0;x=c[w>>2]|0;if((x|0)==0){y=a+(l+16|0)|0;z=c[y>>2]|0;if((z|0)==0){A=0;break}else{B=z;C=y}}else{B=x;C=w}while(1){w=B+20|0;x=c[w>>2]|0;if((x|0)!=0){B=x;C=w;continue}w=B+16|0;x=c[w>>2]|0;if((x|0)==0){break}else{B=x;C=w}}if(C>>>0>>0){ce()}else{c[C>>2]=0;A=B;break}}else{w=c[a+(l+8|0)>>2]|0;if(w>>>0>>0){ce()}x=w+12|0;if((c[x>>2]|0)!=(t|0)){ce()}y=v+8|0;if((c[y>>2]|0)==(t|0)){c[x>>2]=v;c[y>>2]=w;A=v;break}else{ce()}}}while(0);if((p|0)==0){q=n;r=o;break}v=a+(l+28|0)|0;m=225624+(c[v>>2]<<2)|0;do{if((t|0)==(c[m>>2]|0)){c[m>>2]=A;if((A|0)!=0){break}c[56331]=c[56331]&(1<>2]^-1);q=n;r=o;break L1475}else{if(p>>>0<(c[56334]|0)>>>0){ce()}k=p+16|0;if((c[k>>2]|0)==(t|0)){c[k>>2]=A}else{c[p+20>>2]=A}if((A|0)==0){q=n;r=o;break L1475}}}while(0);if(A>>>0<(c[56334]|0)>>>0){ce()}c[A+24>>2]=p;t=c[a+(l+16|0)>>2]|0;do{if((t|0)!=0){if(t>>>0<(c[56334]|0)>>>0){ce()}else{c[A+16>>2]=t;c[t+24>>2]=A;break}}}while(0);t=c[a+(l+20|0)>>2]|0;if((t|0)==0){q=n;r=o;break}if(t>>>0<(c[56334]|0)>>>0){ce()}else{c[A+20>>2]=t;c[t+24>>2]=A;q=n;r=o;break}}else{q=d;r=h}}while(0);d=q;if(d>>>0>=i>>>0){ce()}A=a+(h-4|0)|0;e=c[A>>2]|0;if((e&1|0)==0){ce()}do{if((e&2|0)==0){if((j|0)==(c[56336]|0)){B=(c[56333]|0)+r|0;c[56333]=B;c[56336]=q;c[q+4>>2]=B|1;if((q|0)==(c[56335]|0)){c[56335]=0;c[56332]=0}if(B>>>0<=(c[56337]|0)>>>0){return}uw(0);return}if((j|0)==(c[56335]|0)){B=(c[56332]|0)+r|0;c[56332]=B;c[56335]=q;c[q+4>>2]=B|1;c[d+B>>2]=B;return}B=(e&-8)+r|0;C=e>>>3;L1581:do{if(e>>>0<256){u=c[a+h>>2]|0;g=c[a+(h|4)>>2]|0;b=225360+(C<<1<<2)|0;do{if((u|0)!=(b|0)){if(u>>>0<(c[56334]|0)>>>0){ce()}if((c[u+12>>2]|0)==(j|0)){break}ce()}}while(0);if((g|0)==(u|0)){c[56330]=c[56330]&(1<>>0<(c[56334]|0)>>>0){ce()}f=g+8|0;if((c[f>>2]|0)==(j|0)){D=f;break}ce()}}while(0);c[u+12>>2]=g;c[D>>2]=u}else{b=i;f=c[a+(h+16|0)>>2]|0;t=c[a+(h|4)>>2]|0;do{if((t|0)==(b|0)){p=a+(h+12|0)|0;v=c[p>>2]|0;if((v|0)==0){m=a+(h+8|0)|0;k=c[m>>2]|0;if((k|0)==0){E=0;break}else{F=k;G=m}}else{F=v;G=p}while(1){p=F+20|0;v=c[p>>2]|0;if((v|0)!=0){F=v;G=p;continue}p=F+16|0;v=c[p>>2]|0;if((v|0)==0){break}else{F=v;G=p}}if(G>>>0<(c[56334]|0)>>>0){ce()}else{c[G>>2]=0;E=F;break}}else{p=c[a+h>>2]|0;if(p>>>0<(c[56334]|0)>>>0){ce()}v=p+12|0;if((c[v>>2]|0)!=(b|0)){ce()}m=t+8|0;if((c[m>>2]|0)==(b|0)){c[v>>2]=t;c[m>>2]=p;E=t;break}else{ce()}}}while(0);if((f|0)==0){break}t=a+(h+20|0)|0;u=225624+(c[t>>2]<<2)|0;do{if((b|0)==(c[u>>2]|0)){c[u>>2]=E;if((E|0)!=0){break}c[56331]=c[56331]&(1<>2]^-1);break L1581}else{if(f>>>0<(c[56334]|0)>>>0){ce()}g=f+16|0;if((c[g>>2]|0)==(b|0)){c[g>>2]=E}else{c[f+20>>2]=E}if((E|0)==0){break L1581}}}while(0);if(E>>>0<(c[56334]|0)>>>0){ce()}c[E+24>>2]=f;b=c[a+(h+8|0)>>2]|0;do{if((b|0)!=0){if(b>>>0<(c[56334]|0)>>>0){ce()}else{c[E+16>>2]=b;c[b+24>>2]=E;break}}}while(0);b=c[a+(h+12|0)>>2]|0;if((b|0)==0){break}if(b>>>0<(c[56334]|0)>>>0){ce()}else{c[E+20>>2]=b;c[b+24>>2]=E;break}}}while(0);c[q+4>>2]=B|1;c[d+B>>2]=B;if((q|0)!=(c[56335]|0)){H=B;break}c[56332]=B;return}else{c[A>>2]=e&-2;c[q+4>>2]=r|1;c[d+r>>2]=r;H=r}}while(0);r=H>>>3;if(H>>>0<256){d=r<<1;e=225360+(d<<2)|0;A=c[56330]|0;E=1<>2]|0;if(h>>>0>=(c[56334]|0)>>>0){I=h;J=r;break}ce()}}while(0);c[J>>2]=q;c[I+12>>2]=q;c[q+8>>2]=I;c[q+12>>2]=e;return}e=q;I=H>>>8;do{if((I|0)==0){K=0}else{if(H>>>0>16777215){K=31;break}J=(I+1048320|0)>>>16&8;d=I<>>16&4;A=d<>>16&2;r=(14-(E|J|d)|0)+(A<>>15)|0;K=H>>>((r+7|0)>>>0)&1|r<<1}}while(0);I=225624+(K<<2)|0;c[q+28>>2]=K;c[q+20>>2]=0;c[q+16>>2]=0;r=c[56331]|0;d=1<>2]=e;c[q+24>>2]=I;c[q+12>>2]=q;c[q+8>>2]=q}else{if((K|0)==31){L=0}else{L=25-(K>>>1)|0}A=H<>2]|0;while(1){if((c[J+4>>2]&-8|0)==(H|0)){break}M=J+16+(A>>>31<<2)|0;E=c[M>>2]|0;if((E|0)==0){N=1221;break}else{A=A<<1;J=E}}if((N|0)==1221){if(M>>>0<(c[56334]|0)>>>0){ce()}else{c[M>>2]=e;c[q+24>>2]=J;c[q+12>>2]=q;c[q+8>>2]=q;break}}A=J+8|0;B=c[A>>2]|0;E=c[56334]|0;if(J>>>0>>0){ce()}if(B>>>0>>0){ce()}else{c[B+12>>2]=e;c[A>>2]=e;c[q+8>>2]=B;c[q+12>>2]=J;c[q+24>>2]=0;break}}}while(0);q=(c[56338]|0)-1|0;c[56338]=q;if((q|0)==0){O=225776}else{return}while(1){q=c[O>>2]|0;if((q|0)==0){break}else{O=q+8|0}}c[56338]=-1;return}function uv(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;if((a|0)==0){d=ut(b)|0;return d|0}if(b>>>0>4294967231){c[b0()>>2]=12;d=0;return d|0}if(b>>>0<11){e=16}else{e=b+11&-8}f=ux(a-8|0,e)|0;if((f|0)!=0){d=f+8|0;return d|0}f=ut(b)|0;if((f|0)==0){d=0;return d|0}e=c[a-4>>2]|0;g=(e&-8)-((e&3|0)==0?8:4)|0;uD(f|0,a|0,g>>>0>>0?g:b);uu(a);d=f;return d|0}function uw(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;do{if((c[8408]|0)==0){b=cb(8)|0;if((b-1&b|0)==0){c[8410]=b;c[8409]=b;c[8411]=-1;c[8412]=2097152;c[8413]=0;c[56441]=0;c[8408]=cG(0)&-16^1431655768;break}else{ce();return 0;return 0}}}while(0);if(a>>>0>=4294967232){d=0;return d|0}b=c[56336]|0;if((b|0)==0){d=0;return d|0}e=c[56333]|0;do{if(e>>>0>(a+40|0)>>>0){f=c[8410]|0;g=aa(((((((-40-a|0)-1|0)+e|0)+f|0)>>>0)/(f>>>0)>>>0)-1|0,f);h=b;i=225768;while(1){j=c[i>>2]|0;if(j>>>0<=h>>>0){if((j+(c[i+4>>2]|0)|0)>>>0>h>>>0){k=i;break}}j=c[i+8>>2]|0;if((j|0)==0){k=0;break}else{i=j}}if((c[k+12>>2]&8|0)!=0){break}i=b_(0)|0;h=k+4|0;if((i|0)!=((c[k>>2]|0)+(c[h>>2]|0)|0)){break}j=b_(-(g>>>0>2147483646?-2147483648-f|0:g)|0)|0;l=b_(0)|0;if(!((j|0)!=-1&l>>>0>>0)){break}j=i-l|0;if((i|0)==(l|0)){break}c[h>>2]=(c[h>>2]|0)-j;c[56438]=(c[56438]|0)-j;h=c[56336]|0;m=(c[56333]|0)-j|0;j=h;n=h+8|0;if((n&7|0)==0){o=0}else{o=-n&7}n=m-o|0;c[56336]=j+o;c[56333]=n;c[j+(o+4|0)>>2]=n|1;c[j+(m+4|0)>>2]=40;c[56337]=c[8412];d=(i|0)!=(l|0)&1;return d|0}}while(0);if((c[56333]|0)>>>0<=(c[56337]|0)>>>0){d=0;return d|0}c[56337]=-1;d=0;return d|0}function ux(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;d=a+4|0;e=c[d>>2]|0;f=e&-8;g=a;h=g+f|0;i=h;j=c[56334]|0;if(g>>>0>>0){ce();return 0;return 0}k=e&3;if(!((k|0)!=1&g>>>0>>0)){ce();return 0;return 0}l=g+(f|4)|0;m=c[l>>2]|0;if((m&1|0)==0){ce();return 0;return 0}if((k|0)==0){if(b>>>0<256){n=0;return n|0}do{if(f>>>0>=(b+4|0)>>>0){if((f-b|0)>>>0>c[8410]<<1>>>0){break}else{n=a}return n|0}}while(0);n=0;return n|0}if(f>>>0>=b>>>0){k=f-b|0;if(k>>>0<=15){n=a;return n|0}c[d>>2]=e&1|b|2;c[g+(b+4|0)>>2]=k|3;c[l>>2]=c[l>>2]|1;uy(g+b|0,k);n=a;return n|0}if((i|0)==(c[56336]|0)){k=(c[56333]|0)+f|0;if(k>>>0<=b>>>0){n=0;return n|0}l=k-b|0;c[d>>2]=e&1|b|2;c[g+(b+4|0)>>2]=l|1;c[56336]=g+b;c[56333]=l;n=a;return n|0}if((i|0)==(c[56335]|0)){l=(c[56332]|0)+f|0;if(l>>>0>>0){n=0;return n|0}k=l-b|0;if(k>>>0>15){c[d>>2]=e&1|b|2;c[g+(b+4|0)>>2]=k|1;c[g+l>>2]=k;o=g+(l+4|0)|0;c[o>>2]=c[o>>2]&-2;p=g+b|0;q=k}else{c[d>>2]=e&1|l|2;e=g+(l+4|0)|0;c[e>>2]=c[e>>2]|1;p=0;q=0}c[56332]=q;c[56335]=p;n=a;return n|0}if((m&2|0)!=0){n=0;return n|0}p=(m&-8)+f|0;if(p>>>0>>0){n=0;return n|0}q=p-b|0;e=m>>>3;L1801:do{if(m>>>0<256){l=c[g+(f+8|0)>>2]|0;k=c[g+(f+12|0)>>2]|0;o=225360+(e<<1<<2)|0;do{if((l|0)!=(o|0)){if(l>>>0>>0){ce();return 0;return 0}if((c[l+12>>2]|0)==(i|0)){break}ce();return 0;return 0}}while(0);if((k|0)==(l|0)){c[56330]=c[56330]&(1<>>0>>0){ce();return 0;return 0}s=k+8|0;if((c[s>>2]|0)==(i|0)){r=s;break}ce();return 0;return 0}}while(0);c[l+12>>2]=k;c[r>>2]=l}else{o=h;s=c[g+(f+24|0)>>2]|0;t=c[g+(f+12|0)>>2]|0;do{if((t|0)==(o|0)){u=g+(f+20|0)|0;v=c[u>>2]|0;if((v|0)==0){w=g+(f+16|0)|0;x=c[w>>2]|0;if((x|0)==0){y=0;break}else{z=x;A=w}}else{z=v;A=u}while(1){u=z+20|0;v=c[u>>2]|0;if((v|0)!=0){z=v;A=u;continue}u=z+16|0;v=c[u>>2]|0;if((v|0)==0){break}else{z=v;A=u}}if(A>>>0>>0){ce();return 0;return 0}else{c[A>>2]=0;y=z;break}}else{u=c[g+(f+8|0)>>2]|0;if(u>>>0>>0){ce();return 0;return 0}v=u+12|0;if((c[v>>2]|0)!=(o|0)){ce();return 0;return 0}w=t+8|0;if((c[w>>2]|0)==(o|0)){c[v>>2]=t;c[w>>2]=u;y=t;break}else{ce();return 0;return 0}}}while(0);if((s|0)==0){break}t=g+(f+28|0)|0;l=225624+(c[t>>2]<<2)|0;do{if((o|0)==(c[l>>2]|0)){c[l>>2]=y;if((y|0)!=0){break}c[56331]=c[56331]&(1<>2]^-1);break L1801}else{if(s>>>0<(c[56334]|0)>>>0){ce();return 0;return 0}k=s+16|0;if((c[k>>2]|0)==(o|0)){c[k>>2]=y}else{c[s+20>>2]=y}if((y|0)==0){break L1801}}}while(0);if(y>>>0<(c[56334]|0)>>>0){ce();return 0;return 0}c[y+24>>2]=s;o=c[g+(f+16|0)>>2]|0;do{if((o|0)!=0){if(o>>>0<(c[56334]|0)>>>0){ce();return 0;return 0}else{c[y+16>>2]=o;c[o+24>>2]=y;break}}}while(0);o=c[g+(f+20|0)>>2]|0;if((o|0)==0){break}if(o>>>0<(c[56334]|0)>>>0){ce();return 0;return 0}else{c[y+20>>2]=o;c[o+24>>2]=y;break}}}while(0);if(q>>>0<16){c[d>>2]=p|c[d>>2]&1|2;y=g+(p|4)|0;c[y>>2]=c[y>>2]|1;n=a;return n|0}else{c[d>>2]=c[d>>2]&1|b|2;c[g+(b+4|0)>>2]=q|3;d=g+(p|4)|0;c[d>>2]=c[d>>2]|1;uy(g+b|0,q);n=a;return n|0}return 0}function uy(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;d=a;e=d+b|0;f=e;g=c[a+4>>2]|0;L1877:do{if((g&1|0)==0){h=c[a>>2]|0;if((g&3|0)==0){return}i=d+(-h|0)|0;j=i;k=h+b|0;l=c[56334]|0;if(i>>>0>>0){ce()}if((j|0)==(c[56335]|0)){m=d+(b+4|0)|0;if((c[m>>2]&3|0)!=3){n=j;o=k;break}c[56332]=k;c[m>>2]=c[m>>2]&-2;c[d+(4-h|0)>>2]=k|1;c[e>>2]=k;return}m=h>>>3;if(h>>>0<256){p=c[d+(8-h|0)>>2]|0;q=c[d+(12-h|0)>>2]|0;r=225360+(m<<1<<2)|0;do{if((p|0)!=(r|0)){if(p>>>0>>0){ce()}if((c[p+12>>2]|0)==(j|0)){break}ce()}}while(0);if((q|0)==(p|0)){c[56330]=c[56330]&(1<>>0>>0){ce()}t=q+8|0;if((c[t>>2]|0)==(j|0)){s=t;break}ce()}}while(0);c[p+12>>2]=q;c[s>>2]=p;n=j;o=k;break}r=i;m=c[d+(24-h|0)>>2]|0;t=c[d+(12-h|0)>>2]|0;do{if((t|0)==(r|0)){u=16-h|0;v=d+(u+4|0)|0;w=c[v>>2]|0;if((w|0)==0){x=d+u|0;u=c[x>>2]|0;if((u|0)==0){y=0;break}else{z=u;A=x}}else{z=w;A=v}while(1){v=z+20|0;w=c[v>>2]|0;if((w|0)!=0){z=w;A=v;continue}v=z+16|0;w=c[v>>2]|0;if((w|0)==0){break}else{z=w;A=v}}if(A>>>0>>0){ce()}else{c[A>>2]=0;y=z;break}}else{v=c[d+(8-h|0)>>2]|0;if(v>>>0>>0){ce()}w=v+12|0;if((c[w>>2]|0)!=(r|0)){ce()}x=t+8|0;if((c[x>>2]|0)==(r|0)){c[w>>2]=t;c[x>>2]=v;y=t;break}else{ce()}}}while(0);if((m|0)==0){n=j;o=k;break}t=d+(28-h|0)|0;l=225624+(c[t>>2]<<2)|0;do{if((r|0)==(c[l>>2]|0)){c[l>>2]=y;if((y|0)!=0){break}c[56331]=c[56331]&(1<>2]^-1);n=j;o=k;break L1877}else{if(m>>>0<(c[56334]|0)>>>0){ce()}i=m+16|0;if((c[i>>2]|0)==(r|0)){c[i>>2]=y}else{c[m+20>>2]=y}if((y|0)==0){n=j;o=k;break L1877}}}while(0);if(y>>>0<(c[56334]|0)>>>0){ce()}c[y+24>>2]=m;r=16-h|0;t=c[d+r>>2]|0;do{if((t|0)!=0){if(t>>>0<(c[56334]|0)>>>0){ce()}else{c[y+16>>2]=t;c[t+24>>2]=y;break}}}while(0);t=c[d+(r+4|0)>>2]|0;if((t|0)==0){n=j;o=k;break}if(t>>>0<(c[56334]|0)>>>0){ce()}else{c[y+20>>2]=t;c[t+24>>2]=y;n=j;o=k;break}}else{n=a;o=b}}while(0);a=c[56334]|0;if(e>>>0>>0){ce()}y=d+(b+4|0)|0;z=c[y>>2]|0;do{if((z&2|0)==0){if((f|0)==(c[56336]|0)){A=(c[56333]|0)+o|0;c[56333]=A;c[56336]=n;c[n+4>>2]=A|1;if((n|0)!=(c[56335]|0)){return}c[56335]=0;c[56332]=0;return}if((f|0)==(c[56335]|0)){A=(c[56332]|0)+o|0;c[56332]=A;c[56335]=n;c[n+4>>2]=A|1;c[n+A>>2]=A;return}A=(z&-8)+o|0;s=z>>>3;L1976:do{if(z>>>0<256){g=c[d+(b+8|0)>>2]|0;t=c[d+(b+12|0)>>2]|0;h=225360+(s<<1<<2)|0;do{if((g|0)!=(h|0)){if(g>>>0>>0){ce()}if((c[g+12>>2]|0)==(f|0)){break}ce()}}while(0);if((t|0)==(g|0)){c[56330]=c[56330]&(1<>>0>>0){ce()}m=t+8|0;if((c[m>>2]|0)==(f|0)){B=m;break}ce()}}while(0);c[g+12>>2]=t;c[B>>2]=g}else{h=e;m=c[d+(b+24|0)>>2]|0;l=c[d+(b+12|0)>>2]|0;do{if((l|0)==(h|0)){i=d+(b+20|0)|0;p=c[i>>2]|0;if((p|0)==0){q=d+(b+16|0)|0;v=c[q>>2]|0;if((v|0)==0){C=0;break}else{D=v;E=q}}else{D=p;E=i}while(1){i=D+20|0;p=c[i>>2]|0;if((p|0)!=0){D=p;E=i;continue}i=D+16|0;p=c[i>>2]|0;if((p|0)==0){break}else{D=p;E=i}}if(E>>>0>>0){ce()}else{c[E>>2]=0;C=D;break}}else{i=c[d+(b+8|0)>>2]|0;if(i>>>0>>0){ce()}p=i+12|0;if((c[p>>2]|0)!=(h|0)){ce()}q=l+8|0;if((c[q>>2]|0)==(h|0)){c[p>>2]=l;c[q>>2]=i;C=l;break}else{ce()}}}while(0);if((m|0)==0){break}l=d+(b+28|0)|0;g=225624+(c[l>>2]<<2)|0;do{if((h|0)==(c[g>>2]|0)){c[g>>2]=C;if((C|0)!=0){break}c[56331]=c[56331]&(1<>2]^-1);break L1976}else{if(m>>>0<(c[56334]|0)>>>0){ce()}t=m+16|0;if((c[t>>2]|0)==(h|0)){c[t>>2]=C}else{c[m+20>>2]=C}if((C|0)==0){break L1976}}}while(0);if(C>>>0<(c[56334]|0)>>>0){ce()}c[C+24>>2]=m;h=c[d+(b+16|0)>>2]|0;do{if((h|0)!=0){if(h>>>0<(c[56334]|0)>>>0){ce()}else{c[C+16>>2]=h;c[h+24>>2]=C;break}}}while(0);h=c[d+(b+20|0)>>2]|0;if((h|0)==0){break}if(h>>>0<(c[56334]|0)>>>0){ce()}else{c[C+20>>2]=h;c[h+24>>2]=C;break}}}while(0);c[n+4>>2]=A|1;c[n+A>>2]=A;if((n|0)!=(c[56335]|0)){F=A;break}c[56332]=A;return}else{c[y>>2]=z&-2;c[n+4>>2]=o|1;c[n+o>>2]=o;F=o}}while(0);o=F>>>3;if(F>>>0<256){z=o<<1;y=225360+(z<<2)|0;C=c[56330]|0;b=1<>2]|0;if(d>>>0>=(c[56334]|0)>>>0){G=d;H=o;break}ce()}}while(0);c[H>>2]=n;c[G+12>>2]=n;c[n+8>>2]=G;c[n+12>>2]=y;return}y=n;G=F>>>8;do{if((G|0)==0){I=0}else{if(F>>>0>16777215){I=31;break}H=(G+1048320|0)>>>16&8;z=G<>>16&4;C=z<>>16&2;o=(14-(b|H|z)|0)+(C<>>15)|0;I=F>>>((o+7|0)>>>0)&1|o<<1}}while(0);G=225624+(I<<2)|0;c[n+28>>2]=I;c[n+20>>2]=0;c[n+16>>2]=0;o=c[56331]|0;z=1<>2]=y;c[n+24>>2]=G;c[n+12>>2]=n;c[n+8>>2]=n;return}if((I|0)==31){J=0}else{J=25-(I>>>1)|0}I=F<>2]|0;while(1){if((c[J+4>>2]&-8|0)==(F|0)){break}K=J+16+(I>>>31<<2)|0;G=c[K>>2]|0;if((G|0)==0){L=1527;break}else{I=I<<1;J=G}}if((L|0)==1527){if(K>>>0<(c[56334]|0)>>>0){ce()}c[K>>2]=y;c[n+24>>2]=J;c[n+12>>2]=n;c[n+8>>2]=n;return}K=J+8|0;L=c[K>>2]|0;I=c[56334]|0;if(J>>>0>>0){ce()}if(L>>>0>>0){ce()}c[L+12>>2]=y;c[K>>2]=y;c[n+8>>2]=L;c[n+12>>2]=J;c[n+24>>2]=0;return}function uz(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0,s=0,t=0,u=0,v=0.0,w=0,x=0,y=0,z=0.0,A=0.0,B=0,C=0,D=0,E=0.0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0.0,O=0,P=0,Q=0.0,R=0.0,S=0.0;e=b;while(1){f=e+1|0;if((aM(a[e]|0|0)|0)==0){break}else{e=f}}g=a[e]|0;if((g<<24>>24|0)==45){i=f;j=1}else if((g<<24>>24|0)==43){i=f;j=0}else{i=e;j=0}e=-1;f=0;g=i;while(1){k=a[g]|0;if(((k<<24>>24)-48|0)>>>0<10){l=e}else{if(k<<24>>24!=46|(e|0)>-1){break}else{l=f}}e=l;f=f+1|0;g=g+1|0}l=g+(-f|0)|0;i=(e|0)<0;m=((i^1)<<31>>31)+f|0;n=(m|0)>18;o=(n?-18:-m|0)+(i?f:e)|0;e=n?18:m;do{if((e|0)==0){p=b;q=0.0}else{if((e|0)>9){m=l;n=e;f=0;while(1){i=a[m]|0;r=m+1|0;if(i<<24>>24==46){s=a[r]|0;t=m+2|0}else{s=i;t=r}u=((f*10&-1)-48|0)+(s<<24>>24)|0;r=n-1|0;if((r|0)>9){m=t;n=r;f=u}else{break}}v=+(u|0)*1.0e9;w=9;x=t;y=1575}else{if((e|0)>0){v=0.0;w=e;x=l;y=1575}else{z=0.0;A=0.0}}if((y|0)==1575){f=x;n=w;m=0;while(1){r=a[f]|0;i=f+1|0;if(r<<24>>24==46){B=a[i]|0;C=f+2|0}else{B=r;C=i}D=((m*10&-1)-48|0)+(B<<24>>24)|0;i=n-1|0;if((i|0)>0){f=C;n=i;m=D}else{break}}z=+(D|0);A=v}E=A+z;do{if((k<<24>>24|0)==69|(k<<24>>24|0)==101){m=g+1|0;n=a[m]|0;if((n<<24>>24|0)==45){F=g+2|0;G=1}else if((n<<24>>24|0)==43){F=g+2|0;G=0}else{F=m;G=0}m=a[F]|0;if(((m<<24>>24)-48|0)>>>0<10){H=F;I=0;J=m}else{K=0;L=F;M=G;break}while(1){m=((I*10&-1)-48|0)+(J<<24>>24)|0;n=H+1|0;f=a[n]|0;if(((f<<24>>24)-48|0)>>>0<10){H=n;I=m;J=f}else{K=m;L=n;M=G;break}}}else{K=0;L=g;M=0}}while(0);n=o+((M|0)==0?K:-K|0)|0;m=(n|0)<0?-n|0:n;if((m|0)>511){c[b0()>>2]=34;N=1.0;O=30088;P=511;y=1592}else{if((m|0)==0){Q=1.0}else{N=1.0;O=30088;P=m;y=1592}}if((y|0)==1592){while(1){y=0;if((P&1|0)==0){R=N}else{R=N*+h[O>>3]}m=P>>1;if((m|0)==0){Q=R;break}else{N=R;O=O+8|0;P=m;y=1592}}}if((n|0)>-1){p=L;q=E*Q;break}else{p=L;q=E/Q;break}}}while(0);if((d|0)!=0){c[d>>2]=p}if((j|0)==0){S=q;return+S}S=-0.0-q;return+S}function uA(b){b=b|0;var c=0;c=b;while(a[c]|0){c=c+1|0}return c-b|0}function uB(b,c){b=b|0;c=c|0;var d=0;do{a[b+d|0]=a[c+d|0];d=d+1|0}while(a[c+(d-1)|0]|0);return b|0}function uC(b,c){b=b|0;c=c|0;var d=0,e=0;d=b+(uA(b)|0)|0;do{a[d+e|0]=a[c+e|0];e=e+1|0}while(a[c+(e-1)|0]|0);return b|0}function uD(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;f=b|0;if((b&3)==(d&3)){while(b&3){if((e|0)==0)return f|0;a[b]=a[d]|0;b=b+1|0;d=d+1|0;e=e-1|0}while((e|0)>=4){c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0;e=e-4|0}}while((e|0)>0){a[b]=a[d]|0;b=b+1|0;d=d+1|0;e=e-1|0}return f|0}function uE(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=b+e|0;if((e|0)>=20){d=d&255;e=b&3;g=d|d<<8|d<<16|d<<24;h=f&~3;if(e){e=b+4-e|0;while((b|0)<(e|0)){a[b]=d;b=b+1|0}}while((b|0)<(h|0)){c[b>>2]=g;b=b+4|0}}while((b|0)<(f|0)){a[b]=d;b=b+1|0}}function uF(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0;while((e|0)<(d|0)){a[b+e|0]=f?0:a[c+e|0]|0;f=f?1:(a[c+e|0]|0)==0;e=e+1|0}return b|0}function uG(a,b,c){a=a|0;b=b|0;c=c|0;var e=0,f=0,g=0;while((e|0)<(c|0)){f=d[a+e|0]|0;g=d[b+e|0]|0;if((f|0)!=(g|0))return((f|0)>(g|0)?1:-1)|0;e=e+1|0}return 0}function uH(b,c,d){b=b|0;c=c|0;d=d|0;if((c|0)<(b|0)&(b|0)<(c+d|0)){c=c+d|0;b=b+d|0;while((d|0)>0){b=b-1|0;c=c-1|0;d=d-1|0;a[b]=a[c]|0}}else{uD(b,c,d)}}function uI(a){a=a|0;if((a|0)<65)return a|0;if((a|0)>90)return a|0;return a-65+97|0}function uJ(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;while(e>>>0>>0){f=uI(a[b+e|0]|0)|0;g=uI(a[c+e|0]|0)|0;if((f|0)==(g|0)&(f|0)==0)return 0;if((f|0)==0)return-1;if((g|0)==0)return 1;if((f|0)==(g|0)){e=e+1|0;continue}else{return(f>>>0>g>>>0?1:-1)|0}}return 0}function uK(a,b){a=a|0;b=b|0;return uJ(a,b,-1)|0}function uL(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;t=t+1|0;c[a>>2]=t;while((e|0)<40){if((c[d+(e<<2)>>2]|0)==0){c[d+(e<<2)>>2]=t;c[d+((e<<2)+4)>>2]=b;c[d+((e<<2)+8)>>2]=0;return 0}e=e+2|0}br(116);br(111);br(111);br(32);br(109);br(97);br(110);br(121);br(32);br(115);br(101);br(116);br(106);br(109);br(112);br(115);br(32);br(105);br(110);br(32);br(97);br(32);br(102);br(117);br(110);br(99);br(116);br(105);br(111);br(110);br(32);br(99);br(97);br(108);br(108);br(44);br(32);br(98);br(117);br(105);br(108);br(100);br(32);br(119);br(105);br(116);br(104);br(32);br(97);br(32);br(104);br(105);br(103);br(104);br(101);br(114);br(32);br(118);br(97);br(108);br(117);br(101);br(32);br(102);br(111);br(114);br(32);br(77);br(65);br(88);br(95);br(83);br(69);br(84);br(74);br(77);br(80);br(83);br(10);ab(0);return 0}function uM(a,b){a=a|0;b=b|0;var d=0,e=0;while((d|0)<20){e=c[b+(d<<2)>>2]|0;if((e|0)==0)break;if((e|0)==(a|0)){return c[b+((d<<2)+4)>>2]|0}d=d+2|0}return 0}function uN(){return b0()|0}function uO(a){a=a|0;bd(a|0)}function uP(a,b){a=a|0;b=b|0;cA(a|0,b|0)}function uQ(a){a=a|0;return bS(a|0)|0}function uR(a){a=a|0;return aR(a|0)|0}function uS(a){a=a|0;return a5(a|0)|0}function uT(a){a=a|0;return aA(a|0)|0}function uU(a){a=a|0;return bP(a|0)|0}function uV(a,b){a=a|0;b=b|0;return aY(a|0,b|0)|0}function uW(a,b){a=a|0;b=b|0;return bA(a|0,b|0)|0}function uX(a,b){a=a|0;b=b|0;return bD(a|0,b|0)|0}function uY(a,b,c){a=a|0;b=b|0;c=c|0;return a_(a|0,b|0,c|0)|0}function uZ(a,b,c){a=a|0;b=b|0;c=c|0;return cf(a|0,b|0,c|0)|0}function u_(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return cH(a|0,b|0,c|0,d|0)|0}function u$(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return aI(a|0,b|0,c|0,d|0)|0}function u0(a,b){a=a|0;b=b|0;return+aV(a|0,b|0)}function u1(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;cI[a&63](b|0,c|0,d|0,e|0,f|0)}function u2(a,b,c,d,e,f,g){a=a|0;b=b|0;c=+c;d=+d;e=e|0;f=f|0;g=g|0;cJ[a&15](b|0,+c,+d,e|0,f|0,g|0)}function u3(a,b){a=a|0;b=+b;cK[a&63](+b)}function u4(a){a=a|0;return cL[a&7]()|0}function u5(a,b){a=a|0;b=b|0;cM[a&511](b|0)}function u6(a,b,c){a=a|0;b=b|0;c=c|0;cN[a&255](b|0,c|0)}function u7(a,b){a=a|0;b=b|0;return cO[a&255](b|0)|0}function u8(a,b,c){a=a|0;b=+b;c=+c;return cP[a&3](+b,+c)|0}function u9(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return cQ[a&7](b|0,c|0,d|0)|0}function va(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;cR[a&127](b|0,c|0,d|0)}function vb(a){a=a|0;cS[a&511]()}function vc(a,b,c,d,e,f){a=a|0;b=b|0;c=+c;d=d|0;e=e|0;f=f|0;cT[a&15](b|0,+c,d|0,e|0,f|0)}function vd(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return cU[a&7](b|0,c|0,d|0,e|0)|0}function ve(a,b,c){a=a|0;b=b|0;c=c|0;return+cV[a&7](b|0,c|0)}function vf(a,b,c){a=a|0;b=b|0;c=c|0;return cW[a&63](b|0,c|0)|0}function vg(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;ab(0)}function vh(a,b,c,d,e,f){a=a|0;b=+b;c=+c;d=d|0;e=e|0;f=f|0;ab(1)}function vi(a){a=+a;ab(2)}function vj(){ab(3);return 0}function vk(a){a=a|0;ab(4)}function vl(a,b){a=a|0;b=b|0;ab(5)}function vm(a){a=a|0;ab(6);return 0}function vn(a,b){a=+a;b=+b;ab(7);return 0}function vo(a,b,c){a=a|0;b=b|0;c=c|0;ab(8);return 0}function vp(a,b,c){a=a|0;b=b|0;c=c|0;ab(9)}function vq(){ab(10)}function vr(a,b,c,d,e){a=a|0;b=+b;c=c|0;d=d|0;e=e|0;ab(11)}function vs(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;ab(12);return 0}function vt(a,b){a=a|0;b=b|0;ab(13);return 0.0}function vu(a,b){a=a|0;b=b|0;ab(14);return 0} -// EMSCRIPTEN_END_FUNCS -var cI=[vg,vg,sZ,vg,rC,vg,pN,vg,rM,vg,qN,vg,s1,vg,l2,vg,rd,vg,sn,vg,rc,vg,sC,vg,qP,vg,sF,vg,qk,vg,sW,vg,n6,vg,pV,vg,sd,vg,oq,vg,r0,vg,nK,vg,pw,vg,on,vg,lD,vg,nd,vg,mV,vg,pK,vg,vg,vg,vg,vg,vg,vg,vg,vg];var cJ=[vh,vh,nD,vh,mS,vh,qq,vh,n3,vh,pW,vh,lH,vh,vh,vh];var cK=[vi,vi,qG,vi,s_,vi,pM,vi,n7,vi,lC,vi,sE,vi,ql,vi,o8,vi,sG,vi,n5,vi,qX,vi,of,vi,nf,vi,sY,vi,mR,vi,mW,vi,lA,vi,op,vi,pP,vi,nb,vi,qL,vi,vi,vi,vi,vi,vi,vi,vi,vi,vi,vi,vi,vi,vi,vi,vi,vi,vi,vi,vi,vi];var cL=[vj,vj,hy,vj,uN,vj,dI,vj];var cM=[vk,vk,g5,vk,iP,vk,kT,vk,th,vk,hg,vk,ku,vk,tm,vk,tn,vk,p4,vk,qf,vk,rk,vk,m_,vk,tb,vk,nu,vk,e0,vk,rj,vk,rZ,vk,kP,vk,mi,vk,mz,vk,hd,vk,kh,vk,sT,vk,rJ,vk,k7,vk,ff,vk,n8,vk,mX,vk,tc,vk,kE,vk,rs,vk,ks,vk,kF,vk,gX,vk,kG,vk,g1,vk,gY,vk,kM,vk,kn,vk,ou,vk,ke,vk,g6,vk,pZ,vk,ta,vk,lP,vk,iN,vk,tk,vk,te,vk,uu,vk,gL,vk,lF,vk,eW,vk,kS,vk,tr,vk,kx,vk,kU,vk,hj,vk,eI,vk,kI,vk,o3,vk,kR,vk,gZ,vk,kB,vk,gK,vk,m$,vk,tp,vk,kC,vk,e5,vk,qQ,vk,mN,vk,sa,vk,lB,vk,nH,vk,r2,vk,dL,vk,kv,vk,ki,vk,oN,vk,l9,vk,q9,vk,kY,vk,kj,vk,g0,vk,ph,vk,gM,vk,gW,vk,lU,vk,eJ,vk,s$,vk,qD,vk,tl,vk,kz,vk,kg,vk,gJ,vk,k5,vk,g$,vk,qi,vk,kQ,vk,g9,vk,e7,vk,kf,vk,sz,vk,g_,vk,g7,vk,gN,vk,sH,vk,eZ,vk,g4,vk,kl,vk,nY,vk,gP,vk,kZ,vk,k_,vk,qs,vk,m7,vk,gS,vk,e_,vk,qV,vk,hb,vk,eG,vk,pI,vk,kq,vk,g2,vk,he,vk,ky,vk,gV,vk,k3,vk,pY,vk,eK,vk,qo,vk,e$,vk,kX,vk,gG,vk,kk,vk,k1,vk,jI,vk,ps,vk,kD,vk,hf,vk,to,vk,s8,vk,gR,vk,pS,vk,gE,vk,rh,vk,gI,vk,ti,vk,g8,vk,nh,vk,k0,vk,k$,vk,td,vk,k6,vk,kJ,vk,tj,vk,gU,vk,km,vk,hc,vk,gH,vk,gF,vk,kH,vk,kO,vk,nE,vk,gO,vk,eF,vk,kL,vk,gQ,vk,gT,vk,hi,vk,oU,vk,k8,vk,k2,vk,kK,vk,hh,vk,s9,vk,g3,vk,kt,vk,uO,vk,qt,vk,eH,vk,mo,vk,os,vk,kN,vk,kw,vk,ha,vk,gD,vk,tq,vk,sl,vk,ko,vk,k4,vk,kp,vk,ol,vk,kA,vk,ow,vk,tf,vk,pX,vk,lT,vk,tg,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk,vk];var cN=[vl,vl,sS,vl,oT,vl,rH,vl,pT,vl,ok,vl,pr,vl,qp,vl,oB,vl,nG,vl,pG,vl,oA,vl,px,vl,oS,vl,nW,vl,p2,vl,qM,vl,l_,vl,r3,vl,oL,vl,m5,vl,my,vl,rr,vl,oM,vl,nX,vl,l7,vl,pf,vl,nn,vl,p3,vl,sy,vl,mt,vl,qe,vl,n9,vl,rY,vl,pg,vl,sR,vl,rI,vl,qd,vl,qR,vl,tM,vl,tU,vl,lZ,vl,py,vl,mh,vl,uP,vl,rX,vl,o2,vl,qB,vl,l8,vl,mY,vl,mL,vl,mg,vl,nO,vl,m6,vl,ns,vl,r9,vl,sx,vl,s0,vl,rq,vl,pH,vl,sI,vl,oj,vl,nP,vl,lO,vl,ms,vl,mM,vl,q3,vl,q2,vl,mx,vl,rT,vl,sk,vl,qC,vl,nm,vl,r8,vl,ot,vl,no,vl,o1,vl,qW,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl,vl];var cO=[vm,vm,o5,vm,e6,vm,qZ,vm,nF,vm,pQ,vm,lv,vm,h2,vm,pm,vm,uQ,vm,mP,vm,oW,vm,im,vm,pB,vm,oP,vm,q7,vm,ia,vm,mI,vm,nZ,vm,sX,vm,h4,vm,qm,vm,id,vm,ij,vm,r1,vm,m8,vm,q_,vm,n1,vm,ut,vm,uR,vm,mU,vm,l0,vm,rx,vm,h8,vm,sD,vm,sj,vm,sp,vm,hP,vm,pi,vm,ie,vm,pu,vm,oe,vm,o6,vm,h5,vm,ry,vm,pL,vm,ic,vm,od,vm,m9,vm,or,vm,h9,vm,uS,vm,h6,vm,nc,vm,uT,vm,qa,vm,sL,vm,q6,vm,rS,vm,oD,vm,h3,vm,hX,vm,lw,vm,tC,vm,rv,vm,rQ,vm,p9,vm,ik,vm,mQ,vm,nq,vm,sM,vm,o9,vm,qj,vm,nr,vm,qz,vm,ii,vm,mD,vm,pC,vm,h7,vm,lR,vm,lS,vm,uU,vm,mb,vm,qH,vm,pj,vm,rR,vm,h1,vm,il,vm,qy,vm,sr,vm,n4,vm,h0,vm,n_,vm,rP,vm,sK,vm,rw,vm,ng,vm,nC,vm,ig,vm,si,vm,sq,vm,ib,vm,qO,vm,ih,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm,vm];var cP=[vn,vn,lu,vn];var cQ=[vo,vo,uY,vo,uZ,vo,vo,vo];var cR=[vp,vp,tw,vp,pt,vp,uf,vp,lL,vp,sA,vp,rt,vp,r$,vp,ri,vp,o4,vp,rA,vp,pl,vp,p5,vp,qF,vp,na,vp,qE,vp,o7,vp,sB,vp,rB,vp,nv,vp,l$,vp,ma,vp,oE,vp,tX,vp,sU,vp,n0,vp,oO,vp,l1,vp,rb,vp,ne,vp,ly,vp,mA,vp,nQ,vp,r_,vp,qg,vp,mT,vp,mp,vp,tR,vp,hw,vp,mu,vp,mj,vp,rL,vp,sc,vp,tB,vp,lQ,vp,ra,vp,sV,vp,oo,vp,q4,vp,oC,vp,rK,vp,n$,vp,nJ,vp,sm,vp,oV,vp,nI,vp,om,vp,pJ,vp,pO,vp,mO,vp,pv,vp,qh,vp,tQ,vp,sb,vp];var cS=[vq,vq,m3,vq,p7,vq,mC,vq,mc,vq,dR,vq,pb,vq,rl,vq,pR,vq,qv,vq,mk,vq,ee,vq,np,vq,ei,vq,nL,vq,dX,vq,nU,vq,p8,vq,d9,vq,jy,vq,nz,vq,pA,vq,dH,vq,ru,vq,l3,vq,mw,vq,mf,vq,sQ,vq,oc,vq,o_,vq,d3,vq,nk,vq,es,vq,mB,vq,pa,vq,pe,vq,ox,vq,sN,vq,qT,vq,ob,vq,mE,vq,qr,vq,rm,vq,nt,vq,pd,vq,nN,vq,lo,vq,sh,vq,dV,vq,l5,vq,me,vq,ml,vq,oX,vq,m0,vq,lE,vq,sP,vq,eb,vq,se,vq,sJ,vq,d1,vq,lY,vq,r6,vq,er,vq,su,vq,eh,vq,qU,vq,pU,vq,oK,vq,n2,vq,t7,vq,fd,vq,dv,vq,dt,vq,pE,vq,mG,vq,m2,vq,qA,vq,rG,vq,qb,vq,q8,vq,rE,vq,pF,vq,rn,vq,d0,vq,m1,vq,mq,vq,mr,vq,eq,vq,r7,vq,oR,vq,qn,vq,nM,vq,en,vq,rg,vq,q5,vq,lN,vq,ov,vq,t5,vq,ny,vq,pq,vq,qx,vq,ex,vq,oY,vq,mF,vq,eg,vq,pn,vq,qc,vq,d_,vq,oF,vq,l4,vq,oz,vq,mH,vq,rF,vq,r4,vq,p_,vq,qS,vq,dQ,vq,mv,vq,dZ,vq,oa,vq,d6,vq,nw,vq,qK,vq,nS,vq,qu,vq,oJ,vq,sw,vq,nB,vq,pp,vq,dw,vq,oI,vq,og,vq,oH,vq,rO,vq,l6,vq,re,vq,oQ,vq,lX,vq,mm,vq,ec,vq,pk,vq,q1,vq,nj,vq,o$,vq,ej,vq,nx,vq,dN,vq,jo,vq,mn,vq,pD,vq,rW,vq,ni,vq,lM,vq,nR,vq,ro,vq,r5,vq,nl,vq,sO,vq,st,vq,p1,vq,po,vq,oi,vq,rU,vq,p0,vq,dW,vq,nV,vq,dY,vq,lI,vq,pc,vq,qI,vq,ek,vq,oy,vq,oG,vq,sg,vq,rN,vq,d5,vq,dE,vq,em,vq,qJ,vq,rV,vq,md,vq,q$,vq,ef,vq,oZ,vq,el,vq,ed,vq,mJ,vq,p$,vq,mZ,vq,pz,vq,rp,vq,nA,vq,dG,vq,sf,vq,d2,vq,sv,vq,so,vq,rz,vq,qw,vq,lV,vq,d4,vq,rf,vq,nT,vq,d7,vq,rD,vq,o0,vq,ss,vq,lW,vq,dS,vq,iK,vq,ds,vq,d$,vq,gk,vq,d8,vq,p6,vq,q0,vq,m4,vq,oh,vq,mK,vq,qY,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq,vq];var cT=[vr,vr,f6,vr,f7,vr,fJ,vr,dC,vr,fH,vr,fI,vr,di,vr];var cU=[vs,vs,u_,vs,u$,vs,vs,vs];var cV=[vt,vt,u0,vt,uz,vt,vt,vt];var cW=[vu,vu,lr,vu,la,vu,gn,vu,uV,vu,uW,vu,f5,vu,go,vu,i2,vu,hm,vu,hA,vu,iV,vu,uq,vu,uX,vu,uB,vu,f4,vu,gl,vu,vu,vu,vu,vu,vu,vu,vu,vu,vu,vu,vu,vu,vu,vu,vu,vu,vu,vu,vu,vu,vu,vu,vu,vu,vu,vu,vu,vu,vu,vu];return{_memcmp:uG,_saveSetjmp:uL,_strcat:uC,_free:uu,_main:iM,_testSetjmp:uM,_strncpy:uF,_memmove:uH,_tolower:uI,_memset:uE,_malloc:ut,_memcpy:uD,_strcasecmp:uK,_strlen:uA,_realloc:uv,_strncasecmp:uJ,_strcpy:uB,stackAlloc:cX,stackSave:cY,stackRestore:cZ,setThrew:c_,setTempRet0:c$,setTempRet1:c0,setTempRet2:c1,setTempRet3:c2,setTempRet4:c3,setTempRet5:c4,setTempRet6:c5,setTempRet7:c6,setTempRet8:c7,setTempRet9:c8,dynCall_viiiii:u1,dynCall_viffiii:u2,dynCall_vf:u3,dynCall_i:u4,dynCall_vi:u5,dynCall_vii:u6,dynCall_ii:u7,dynCall_iff:u8,dynCall_iiii:u9,dynCall_viii:va,dynCall_v:vb,dynCall_vifiii:vc,dynCall_iiiii:vd,dynCall_fii:ve,dynCall_iii:vf}}) -// EMSCRIPTEN_END_ASM -({ "Math": Math, "Int8Array": Int8Array, "Int16Array": Int16Array, "Int32Array": Int32Array, "Uint8Array": Uint8Array, "Uint16Array": Uint16Array, "Uint32Array": Uint32Array, "Float32Array": Float32Array, "Float64Array": Float64Array }, { "abort": abort, "assert": assert, "asmPrintInt": asmPrintInt, "asmPrintFloat": asmPrintFloat, "copyTempDouble": copyTempDouble, "copyTempFloat": copyTempFloat, "min": Math_min, "invoke_viiiii": invoke_viiiii, "invoke_viffiii": invoke_viffiii, "invoke_vf": invoke_vf, "invoke_i": invoke_i, "invoke_vi": invoke_vi, "invoke_vii": invoke_vii, "invoke_ii": invoke_ii, "invoke_iff": invoke_iff, "invoke_iiii": invoke_iiii, "invoke_viii": invoke_viii, "invoke_v": invoke_v, "invoke_vifiii": invoke_vifiii, "invoke_iiiii": invoke_iiiii, "invoke_fii": invoke_fii, "invoke_iii": invoke_iii, "_lseek": _lseek, "__scanString": __scanString, "_fclose": _fclose, "_uname": _uname, "_sleep": _sleep, "__isFloat": __isFloat, "_fflush": _fflush, "_strtol": _strtol, "_fputc": _fputc, "_iconv": _iconv, "___signgam": ___signgam, "_fwrite": _fwrite, "_send": _send, "_fputs": _fputs, "_tmpnam": _tmpnam, "_isspace": _isspace, "_localtime": _localtime, "_read": _read, "_ceil": _ceil, "_strstr": _strstr, "_fileno": _fileno, "_perror": _perror, "_ctime": _ctime, "_fsync": _fsync, "_signal": _signal, "_opendir": _opendir, "_fmod": _fmod, "_strcmp": _strcmp, "_memchr": _memchr, "_strncmp": _strncmp, "_tmpfile": _tmpfile, "_snprintf": _snprintf, "_fgetc": _fgetc, "_pclose": _pclose, "_readdir": _readdir, "_cosh": _cosh, "_atexit": _atexit, "_fgets": _fgets, "_close": _close, "_strchr": _strchr, "_asin": _asin, "_llvm_lifetime_start": _llvm_lifetime_start, "___setErrNo": ___setErrNo, "_ftell": _ftell, "_exit": _exit, "_sprintf": _sprintf, "_llvm_lifetime_end": _llvm_lifetime_end, "_asctime": _asctime, "_strrchr": _strrchr, "_iconv_open": _iconv_open, "_modf": _modf, "_strcspn": _strcspn, "_getcwd": _getcwd, "_gmtime": _gmtime, "_localtime_r": _localtime_r, "_asctime_r": _asctime_r, "_recv": _recv, "_cos": _cos, "_putchar": _putchar, "_isalnum": _isalnum, "_popen": _popen, "_erfc": _erfc, "__exit": __exit, "_strftime": _strftime, "_llvm_va_end": _llvm_va_end, "_tzset": _tzset, "_sinh": _sinh, "_setlocale": _setlocale, "_isprint": _isprint, "_toupper": _toupper, "_printf": _printf, "_pread": _pread, "_fopen": _fopen, "_open": _open, "_usleep": _usleep, "_log": _log, "_puts": _puts, "_mktime": _mktime, "_fdopen": _fdopen, "_qsort": _qsort, "_system": _system, "_isalpha": _isalpha, "_strdup": _strdup, "_log10": _log10, "_closedir": _closedir, "_isatty": _isatty, "__formatString": __formatString, "_getenv": _getenv, "_gettimeofday": _gettimeofday, "_atoi": _atoi, "_vfprintf": _vfprintf, "_chdir": _chdir, "_llvm_pow_f64": _llvm_pow_f64, "_sbrk": _sbrk, "_localeconv": _localeconv, "___errno_location": ___errno_location, "_strerror": _strerror, "_lgamma": _lgamma, "_erf": _erf, "_strspn": _strspn, "__parseInt": __parseInt, "_ungetc": _ungetc, "_llvm_trap": _llvm_trap, "_rename": _rename, "_vsnprintf": _vsnprintf, "_sscanf": _sscanf, "_sysconf": _sysconf, "_acos": _acos, "_fread": _fread, "_abort": _abort, "_fprintf": _fprintf, "___fpclassifyf": ___fpclassifyf, "_tan": _tan, "___buildEnvironment": ___buildEnvironment, "_feof": _feof, "_strncat": _strncat, "_gmtime_r": _gmtime_r, "_fabs": _fabs, "_floor": _floor, "__reallyNegative": __reallyNegative, "_fseek": _fseek, "_sqrt": _sqrt, "_write": _write, "_rewind": _rewind, "_sin": _sin, "_stat": _stat, "_longjmp": _longjmp, "_atan": _atan, "_readdir_r": _readdir_r, "_strpbrk": _strpbrk, "_iconv_close": _iconv_close, "_setbuf": _setbuf, "_nl_langinfo": _nl_langinfo, "_pwrite": _pwrite, "_strerror_r": _strerror_r, "_atan2": _atan2, "_exp": _exp, "_time": _time, "_setvbuf": _setvbuf, "STACKTOP": STACKTOP, "STACK_MAX": STACK_MAX, "tempDoublePtr": tempDoublePtr, "ABORT": ABORT, "NaN": NaN, "Infinity": Infinity, "_stderr": _stderr, "_stdout": _stdout, "_stdin": _stdin }, buffer); -var _memcmp = Module["_memcmp"] = asm["_memcmp"]; -var _saveSetjmp = Module["_saveSetjmp"] = asm["_saveSetjmp"]; -var _strcat = Module["_strcat"] = asm["_strcat"]; -var _free = Module["_free"] = asm["_free"]; -var _main = Module["_main"] = asm["_main"]; -var _testSetjmp = Module["_testSetjmp"] = asm["_testSetjmp"]; -var _strncpy = Module["_strncpy"] = asm["_strncpy"]; -var _memmove = Module["_memmove"] = asm["_memmove"]; -var _tolower = Module["_tolower"] = asm["_tolower"]; -var _memset = Module["_memset"] = asm["_memset"]; -var _malloc = Module["_malloc"] = asm["_malloc"]; -var _memcpy = Module["_memcpy"] = asm["_memcpy"]; -var _strcasecmp = Module["_strcasecmp"] = asm["_strcasecmp"]; -var _strlen = Module["_strlen"] = asm["_strlen"]; -var _realloc = Module["_realloc"] = asm["_realloc"]; -var _strncasecmp = Module["_strncasecmp"] = asm["_strncasecmp"]; -var _strcpy = Module["_strcpy"] = asm["_strcpy"]; -var dynCall_viiiii = Module["dynCall_viiiii"] = asm["dynCall_viiiii"]; -var dynCall_viffiii = Module["dynCall_viffiii"] = asm["dynCall_viffiii"]; -var dynCall_vf = Module["dynCall_vf"] = asm["dynCall_vf"]; -var dynCall_i = Module["dynCall_i"] = asm["dynCall_i"]; -var dynCall_vi = Module["dynCall_vi"] = asm["dynCall_vi"]; -var dynCall_vii = Module["dynCall_vii"] = asm["dynCall_vii"]; -var dynCall_ii = Module["dynCall_ii"] = asm["dynCall_ii"]; -var dynCall_iff = Module["dynCall_iff"] = asm["dynCall_iff"]; -var dynCall_iiii = Module["dynCall_iiii"] = asm["dynCall_iiii"]; -var dynCall_viii = Module["dynCall_viii"] = asm["dynCall_viii"]; -var dynCall_v = Module["dynCall_v"] = asm["dynCall_v"]; -var dynCall_vifiii = Module["dynCall_vifiii"] = asm["dynCall_vifiii"]; -var dynCall_iiiii = Module["dynCall_iiiii"] = asm["dynCall_iiiii"]; -var dynCall_fii = Module["dynCall_fii"] = asm["dynCall_fii"]; -var dynCall_iii = Module["dynCall_iii"] = asm["dynCall_iii"]; -Runtime.stackAlloc = function(size) { return asm['stackAlloc'](size) }; -Runtime.stackSave = function() { return asm['stackSave']() }; -Runtime.stackRestore = function(top) { asm['stackRestore'](top) }; -// Warning: printing of i64 values may be slightly rounded! No deep i64 math used, so precise i64 code not included -var i64Math = null; -// === Auto-generated postamble setup entry stuff === -Module['callMain'] = function callMain(args) { - assert(runDependencies == 0, 'cannot call main when async dependencies remain! (listen on __ATMAIN__)'); - assert(!Module['preRun'] || Module['preRun'].length == 0, 'cannot call main when preRun functions remain to be called'); - args = args || []; - ensureInitRuntime(); - var argc = args.length+1; - function pad() { - for (var i = 0; i < 4-1; i++) { - argv.push(0); - } - } - var argv = [allocate(intArrayFromString("/bin/this.program"), 'i8', ALLOC_NORMAL) ]; - pad(); - for (var i = 0; i < argc-1; i = i + 1) { - argv.push(allocate(intArrayFromString(args[i]), 'i8', ALLOC_NORMAL)); - pad(); - } - argv.push(0); - argv = allocate(argv, 'i32', ALLOC_NORMAL); - var ret; - var initialStackTop = STACKTOP; - try { - ret = Module['_main'](argc, argv, 0); - } - catch(e) { - if (e.name == 'ExitStatus') { - return e.status; - } else if (e == 'SimulateInfiniteLoop') { - Module['noExitRuntime'] = true; - } else { - throw e; - } - } finally { - STACKTOP = initialStackTop; - } - return ret; -} -function run(args) { - args = args || Module['arguments']; - if (runDependencies > 0) { - Module.printErr('run() called, but dependencies remain, so not running'); - return 0; - } - if (Module['preRun']) { - if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']]; - var toRun = Module['preRun']; - Module['preRun'] = []; - for (var i = toRun.length-1; i >= 0; i--) { - toRun[i](); - } - if (runDependencies > 0) { - // a preRun added a dependency, run will be called later - return 0; - } - } - function doRun() { - ensureInitRuntime(); - preMain(); - var ret = 0; - calledRun = true; - if (Module['_main'] && shouldRunNow) { - ret = Module['callMain'](args); - if (!Module['noExitRuntime']) { - exitRuntime(); - } - } - if (Module['postRun']) { - if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']]; - while (Module['postRun'].length > 0) { - Module['postRun'].pop()(); - } - } - return ret; - } - if (Module['setStatus']) { - Module['setStatus']('Running...'); - setTimeout(function() { - setTimeout(function() { - Module['setStatus'](''); - }, 1); - if (!ABORT) doRun(); - }, 1); - return 0; - } else { - return doRun(); - } -} -Module['run'] = Module.run = run; -// {{PRE_RUN_ADDITIONS}} -if (Module['preInit']) { - if (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preInit']]; - while (Module['preInit'].length > 0) { - Module['preInit'].pop()(); - } -} -// shouldRunNow refers to calling main(), not run(). -var shouldRunNow = false; -if (Module['noInitialRun']) { - shouldRunNow = false; -} -run(); -// {{POST_RUN_ADDITIONS}} - // {{MODULE_ADDITIONS}} - shouldRunNow = true; - self['Runtime'] = Runtime; - self['FS'] = FS; -}; -gnuplot_create(); -// This is to avoid name mangling from closure compilers. -self['FS'] = FS; -self['FS']['root'] = FS.root; -self['FS']['deleteFile'] = FS.deleteFile; -self['FS']['findObject'] = FS.findObject; -self['FS']['createDataFile'] = FS.createDataFile; -self['FS']['getFileContents'] = function(name) { - var file = FS.findObject(name); - if (!file) return null; - return file.contents; -}; diff --git a/deps/v8/tools/profviz/profviz.css b/deps/v8/tools/profviz/profviz.css deleted file mode 100644 index c583b8943c7635..00000000000000 --- a/deps/v8/tools/profviz/profviz.css +++ /dev/null @@ -1,138 +0,0 @@ -/* -Copyright 2013 the V8 project authors. 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. -*/ - -body { - background-color: #ddd; -} - -#content { - background-color: #fff; - width: 1200px; - margin-left: auto; - margin-right: auto; - padding: 25px; -} - -textarea { - width: 1200px; - resize: none; - font-family: monospace; - font-size: 12px; - color: #000; - border: 1px dotted #aaa; - padding: 10px; - box-sizing: border-box; -} - -textarea.log { - background-color: #ffe; -} - -.display { - width: 1200px; - height: 600px; - background-color: #fff; - display: block; - box-sizing: border-box; -} - -table { - width: 1200px; -} - -button { - width: 100px; - height: 20px; - border: 1px solid #000; - border-color: #aaa; - font-family: Verdana; - font-size: 12px; - background-color: #ddd; -} - -button:hover { - background-color: #eee; -} - -#file { - width: 200px; - height: 20px; - border: none; - font-family: Verdana; - font-size: 12px; -} - -input.range { - width: 70px; - height: 16px; - text-align: right; - padding-right: 5px; - border: 0px; - background-color: #eee; - font-family: Verdana; - font-size: 12px; -} - -label { - height: 20px; - font-family: Verdana; - font-size: 12px; -} - -.tooltip { - border-bottom: 1px dotted #000; -} - -h1 { - font-family: Verdana; - font-size: 14px; - font-weight: bold; -} - -.text { - font-family: Verdana; - font-size: 12px; -} - -.tt { - font-family: monospace; - font-size: 12px; - color: #822; -} - -a { - font-family: Verdana; - font-size: 12px; - text-decoration: none; - color: #282; -} - -a.unroll { - border-bottom: 1px dotted #000; - color: #222; -} diff --git a/deps/v8/tools/profviz/profviz.html b/deps/v8/tools/profviz/profviz.html deleted file mode 100644 index d7dd9cb9508019..00000000000000 --- a/deps/v8/tools/profviz/profviz.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - V8 profile log plotter - - - - - -