From: Gabriel Corona Date: Fri, 21 Mar 2014 11:45:05 +0000 (+0100) Subject: Merge branch 'mc++' X-Git-Tag: v3_11~199^2~2 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/f2df13795e01302813a6aef10825ec7e922ce530?hp=0b83205608b7fc3e935b970509a08e381ad1dffe Merge branch 'mc++' Conflicts: src/simgrid/sg_config.c src/xbt/mmalloc/mm_diff.c --- diff --git a/.cproject b/.cproject index 12679b9f81..f9a184c573 100644 --- a/.cproject +++ b/.cproject @@ -1,23 +1,42 @@ - - - - + + + + + + + + + - + + + + + + + + + + + + + - + + + + - diff --git a/.gitignore b/.gitignore index 1dfeaafd7f..6dc00ee2e1 100644 --- a/.gitignore +++ b/.gitignore @@ -132,6 +132,12 @@ examples/msg/simulation.trace examples/msg/toto.txt examples/msg/z_gtnets.trace examples/msg/gpu/test_MSG_gpu_task_create +examples/msg/cloud/bound +examples/msg/cloud/migrate_vm +examples/msg/cloud/multicore +examples/msg/cloud/scale +examples/msg/cloud/simple_vm +examples/msg/cloud/two_tasks_vm examples/msg/energy/e1/e1 examples/msg/energy/e2/e2 examples/msg/energy/e3/e3 @@ -147,6 +153,7 @@ examples/msg/tracing/tasks examples/msg/tracing/volume examples/msg/io/file examples/msg/io/file_unlink +examples/msg/io/storage examples/msg/mc/bugged3 examples/msg/mc/test/snapshot_comparison1 examples/msg/mc/test/snapshot_comparison2 @@ -217,6 +224,9 @@ examples/msg/mc/bugged1 examples/msg/parallel_contexts/pcontexts examples/msg/parallel_contexts/pcontexts2 examples/msg/pmm/msg_pmm +examples/smpi/energy/f77/sef +examples/smpi/energy/f90/sef90 +examples/smpi/energy/se examples/smpi/toto.txt examples/smpi/MM/MM_mpi examples/smpi/smpi_replay @@ -618,6 +628,7 @@ teshsuite/smpi/mpich3-test/f77/datatype/hindex1f teshsuite/smpi/mpich3-test/f77/datatype/hindexed_blockf teshsuite/smpi/mpich3-test/f77/datatype/packef teshsuite/smpi/mpich3-test/f77/datatype/typeaints.h +teshsuite/smpi/mpich3-test/f77/datatype/typeaints teshsuite/smpi/mpich3-test/f77/datatype/typecntsf teshsuite/smpi/mpich3-test/f77/datatype/typem2f teshsuite/smpi/mpich3-test/f77/datatype/typename3f @@ -714,9 +725,14 @@ teshsuite/smpi/mpich3-test/pt2pt/sendself teshsuite/smpi/mpich3-test/pt2pt/waitany-null teshsuite/smpi/mpich3-test/pt2pt/waittestnull +teshsuite/msg/host_on_off +teshsuite/msg/process +teshsuite/msg/storage/storage_basic +teshsuite/msg/task_destroy_cancel teshsuite/msg/pid teshsuite/msg/get_sender teshsuite/msg/trace/test_trace_integration +teshsuite/simix/check_defaults teshsuite/simdag/availability/availability_test teshsuite/simdag/basic0 teshsuite/simdag/basic1 diff --git a/CMakeLists.txt b/CMakeLists.txt index cfae0bbc05..8ea7ddf60c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -57,7 +57,7 @@ set(SIMGRID_VERSION_MINOR "11") set(SIMGRID_VERSION_PATCH "0") set(SIMGRID_VERSION_EXTRA "-devel") # Extra words to add to version string (e.g. -rc1) -set(SIMGRID_VERSION_DATE "2013") # Year for copyright information +set(SIMGRID_VERSION_DATE "2014") # Year for copyright information if(${SIMGRID_VERSION_PATCH} EQUAL "0") set(release_version "${SIMGRID_VERSION_MAJOR}.${SIMGRID_VERSION_MINOR}") diff --git a/ChangeLog b/ChangeLog index 4df2e784a3..5abdda77c9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -14,6 +14,8 @@ SimGrid (3.11) NOT RELEASED; urgency=low generate the tarball, or keep using cmake -E tar, but use git-ls-files to get the list of files to pack. + The Class Release. + Tools: * Normalizing pointers addresses tool for better diff between logs @@ -29,10 +31,13 @@ SimGrid (3.11) NOT RELEASED; urgency=low - creation of a VM on a PM - migration of a VM from a PM to another PM - Simcalls: - * Simcalls are now generated by a python script - - generate files include by simgrid - - check that all the functions exists and propose prototypes + SIMIX: + * Protect context stacks against stack overflow. The number of protected memory + pages allocated on the top of each stack (1 by default) can be configured + with the new command line option --cfg=contexts/guard_size:. + * Simcalls are now generated by a python script that + - generates files included by SimGrid + - checks that all the functions exist, and proposes prototypes * Clean simcalls - remove sem_destroy, file_set_data, comm_destroy, vm_set_state, host_set_data, host_get_data @@ -46,7 +51,7 @@ SimGrid (3.11) NOT RELEASED; urgency=low * Translate surf routings from C to C++ * Add callbacks using sigc++ or boost::signals2 - Add callback functions for resource creation/destruction - - Add callback finctions for action state change + - Add callback functions for action state change - Handle Energy as a plugin * Replace swag by boost::intrusive * Add new routing model for torus clusters @@ -68,7 +73,7 @@ SimGrid (3.11) NOT RELEASED; urgency=low * Supernovae build mode is definitively removed. It was used to improve inlining and inter-module optimizations. It is nowadays superseded by link-time optimizations commonly available in compilers. - * Update ns3 find lib + * Update ns-3 find lib. Bindings for ns-3 should work again now. * Add boost dependency for surf++ -- $date Da SimGrid team @@ -293,7 +298,7 @@ SimGrid (3.8) stable; urgency=low * New option "enable_mallocators" to disable mallocators, for debugging purpose ("on" by default). - Simix: + SIMIX: * Bug fixes around the resource failures: don't let the processes survive the host they are running onto. * Add an interface to auto-restart processes when the host in which they are diff --git a/NEWS b/NEWS index 716b19f325..6388d4afe2 100644 --- a/NEWS +++ b/NEWS @@ -5,10 +5,10 @@ __ _____ _ __ ___(_) ___ _ __ |___ / / / | \_/ \___|_| |___/_|\___/|_| |_| |____(_)_|_| The Class Release. Major changes: - * Surf is now in C++ and documented - * Virtual Machine model - * Surf callbacks to create plugins - * Simcalls generated by python script + * Surf is now in C++ (and documented!) + * Virtual Machine model for Cloud Simulation + * Surf callbacks: plug your code directly in Surf! + * Simcalls are script-generated to clean the mess _ _____ _ ___ __ _____ _ __ ___(_) ___ _ __ |___ / / |/ _ \ \ \ / / _ \ '__/ __| |/ _ \| '_ \ |_ \ | | | | | diff --git a/buildtools/Cmake/AddTests.cmake b/buildtools/Cmake/AddTests.cmake index 658b0c71bc..f9b62f92bb 100644 --- a/buildtools/Cmake/AddTests.cmake +++ b/buildtools/Cmake/AddTests.cmake @@ -110,10 +110,37 @@ if(NOT enable_memcheck) ADD_TEST(tesh-msg-pid-ucontext ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/pid.tesh) endif() + ADD_TEST(tesh-msg-host-on-off-thread ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/host_on_off.tesh) + if(HAVE_RAWCTX) + ADD_TEST(tesh-msg-host-on-off-raw ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/host_on_off.tesh) + endif() + if(CONTEXT_UCONTEXT) + ADD_TEST(tesh-msg-host-on-off-ucontext ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/host_on_off.tesh) + endif() + + ADD_TEST(tesh-msg-task-destroy-cancel-thread ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/task_destroy_cancel.tesh) + if(HAVE_RAWCTX) + ADD_TEST(tesh-msg-task-destroy-cancel-raw ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/task_destroy_cancel.tesh) + endif() + if(CONTEXT_UCONTEXT) + ADD_TEST(tesh-msg-task-destroy-cancel-ucontext ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/task_destroy_cancel.tesh) + endif() + + ADD_TEST(tesh-msg-process-thread ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/process.tesh) + if(HAVE_RAWCTX) + ADD_TEST(tesh-msg-process-raw ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/process.tesh) + endif() + if(CONTEXT_UCONTEXT) + ADD_TEST(tesh-msg-process-ucontext ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/process.tesh) + endif() + + # these tests need the assertion mechanism # exclude them from memcheck, as they normally die, leaving lots of unfree'd objects IF(enable_debug AND NOT enable_memcheck) - ADD_TEST(tesh-simdag-parser-bogus-symmetric ${TESH_COMMAND} ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/simdag/platforms --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms two_hosts_asymetric.tesh) + ADD_TEST(tesh-parser-bogus-symmetric ${TESH_COMMAND} ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/simdag/platforms --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms bogus_two_hosts_asymetric.tesh) + ADD_TEST(tesh-parser-bogus-missing-gw ${TESH_COMMAND} ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/simdag/platforms --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms bogus_missing_gateway.tesh) + ADD_TEST(tesh-disk-attachment ${TESH_COMMAND} ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/simdag/platforms --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms bogus_disk_attachment.tesh) ENDIF() ADD_TEST(tesh-simdag-bypass ${TESH_COMMAND} ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/simdag/platforms --setenv srcdir=${CMAKE_HOME_DIRECTORY} --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms basic_parsing_test_bypass.tesh) @@ -447,12 +474,30 @@ if(NOT enable_memcheck) endif() endif() - ADD_TEST(smpi-energy ${TESH_COMMAND} ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/smpi/energy --cd ${CMAKE_BINARY_DIR}/examples/smpi/energy ${CMAKE_HOME_DIRECTORY}/examples/smpi/energy/energy.tesh) + ADD_TEST(smpi-energy-thread ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/smpi/energy --cd ${CMAKE_BINARY_DIR}/examples/smpi/energy ${CMAKE_HOME_DIRECTORY}/examples/smpi/energy/energy.tesh) if(SMPI_F2C) - ADD_TEST(smpi-energy-f77 ${TESH_COMMAND} ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/smpi/energy --cd ${CMAKE_BINARY_DIR}/examples/smpi/energy ${CMAKE_HOME_DIRECTORY}/examples/smpi/energy/f77/energy.tesh) + ADD_TEST(smpi-energy-f77-thread ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/smpi/energy --cd ${CMAKE_BINARY_DIR}/examples/smpi/energy ${CMAKE_HOME_DIRECTORY}/examples/smpi/energy/f77/energy.tesh) endif() if(SMPI_F90) - ADD_TEST(smpi-energy-f90 ${TESH_COMMAND} ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/smpi/energy --cd ${CMAKE_BINARY_DIR}/examples/smpi/energy ${CMAKE_HOME_DIRECTORY}/examples/smpi/energy/f90/energy.tesh) + ADD_TEST(smpi-energy-f90-thread ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/smpi/energy --cd ${CMAKE_BINARY_DIR}/examples/smpi/energy ${CMAKE_HOME_DIRECTORY}/examples/smpi/energy/f90/energy.tesh) + endif() + if(CONTEXT_UCONTEXT) + ADD_TEST(smpi-energy-ucontext ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/smpi/energy --cd ${CMAKE_BINARY_DIR}/examples/smpi/energy ${CMAKE_HOME_DIRECTORY}/examples/smpi/energy/energy.tesh) + if(SMPI_F2C) + ADD_TEST(smpi-energy-f77-ucontext ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/smpi/energy --cd ${CMAKE_BINARY_DIR}/examples/smpi/energy ${CMAKE_HOME_DIRECTORY}/examples/smpi/energy/f77/energy.tesh) + endif() + if(SMPI_F90) + ADD_TEST(smpi-energy-f90-ucontext ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/smpi/energy --cd ${CMAKE_BINARY_DIR}/examples/smpi/energy ${CMAKE_HOME_DIRECTORY}/examples/smpi/energy/f90/energy.tesh) + endif() + endif() + if(HAVE_RAWCTX) + ADD_TEST(smpi-energy-raw ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/smpi/energy --cd ${CMAKE_BINARY_DIR}/examples/smpi/energy ${CMAKE_HOME_DIRECTORY}/examples/smpi/energy/energy.tesh) + if(SMPI_F2C) + ADD_TEST(smpi-energy-f77-raw ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/smpi/energy --cd ${CMAKE_BINARY_DIR}/examples/smpi/energy ${CMAKE_HOME_DIRECTORY}/examples/smpi/energy/f77/energy.tesh) + endif() + if(SMPI_F90) + ADD_TEST(smpi-energy-f90-raw ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/smpi/energy --cd ${CMAKE_BINARY_DIR}/examples/smpi/energy ${CMAKE_HOME_DIRECTORY}/examples/smpi/energy/f90/energy.tesh) + endif() endif() if(HAVE_TRACING) @@ -580,6 +625,7 @@ if(NOT enable_memcheck) ADD_TEST(java-pingPong ${TESH_COMMAND} ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/java --setenv classpath=${TESH_CLASSPATH} --cd ${CMAKE_BINARY_DIR}/examples/java ${CMAKE_HOME_DIRECTORY}/examples/java/pingPong/pingpong.tesh) ADD_TEST(java-priority ${TESH_COMMAND} ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/java --setenv classpath=${TESH_CLASSPATH} --cd ${CMAKE_BINARY_DIR}/examples/java ${CMAKE_HOME_DIRECTORY}/examples/java/priority/priority.tesh) ADD_TEST(java-startKillTime ${TESH_COMMAND} ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/java --setenv classpath=${TESH_CLASSPATH} --cd ${CMAKE_BINARY_DIR}/examples/java ${CMAKE_HOME_DIRECTORY}/examples/java/startKillTime/startKillTime.tesh) + ADD_TEST(java-surf-plugin ${TESH_COMMAND} ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/java --setenv classpath=${TESH_CLASSPATH} --cd ${CMAKE_BINARY_DIR}/examples/java ${CMAKE_HOME_DIRECTORY}/examples/java/surfPlugin/surf_plugin.tesh) ADD_TEST(java-suspend ${TESH_COMMAND} ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/java --setenv classpath=${TESH_CLASSPATH} --cd ${CMAKE_BINARY_DIR}/examples/java ${CMAKE_HOME_DIRECTORY}/examples/java/suspend/suspend.tesh) if(HAVE_TRACING) ADD_TEST(java-tracing ${TESH_COMMAND} ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/java --setenv classpath=${TESH_CLASSPATH} --cd ${CMAKE_BINARY_DIR}/examples/java ${CMAKE_HOME_DIRECTORY}/examples/java/tracing/tracingPingPong.tesh) @@ -599,6 +645,14 @@ if(NOT enable_memcheck) ADD_TEST(scala-masterslave ${TESH_COMMAND} ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/scala --setenv classpath=${TESH_CLASSPATH} --cd ${CMAKE_BINARY_DIR}/examples/scala ${CMAKE_HOME_DIRECTORY}/examples/scala/masterslave/masterslave.tesh) endif() + ADD_TEST(stack-overflow-thread ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simix/stack_overflow.tesh) + if(CONTEXT_UCONTEXT) + ADD_TEST(stack-overflow-ucontext ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simix/stack_overflow.tesh) + endif() + if(HAVE_RAWCTX) + ADD_TEST(stack-overflow-raw ${TESH_COMMAND} ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/simix/stack_overflow.tesh) + endif() + # examples/msg/mc if(HAVE_MC) if(CONTEXT_UCONTEXT) @@ -615,6 +669,23 @@ if(NOT enable_memcheck) endif() endif() + ### + ### Declare that we know that some tests are broken + ### + if(release) + if(CMAKE_SYSTEM_NAME MATCHES "Darwin") + # These tests are known to fail on Mac OS X (the expected error message is + # not shown). + set_tests_properties(stack-overflow-thread PROPERTIES WILL_FAIL true) + if(CONTEXT_UCONTEXT) + set_tests_properties(stack-overflow-ucontext PROPERTIES WILL_FAIL true) + endif() + if(HAVE_RAWCTX) + set_tests_properties(stack-overflow-raw PROPERTIES WILL_FAIL true) + endif() + endif() + endif() + endif() ADD_TEST(tesh-simdag-full-links01 ${CMAKE_BINARY_DIR}/teshsuite/simdag/platforms/basic_parsing_test ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms/two_clusters.xml FULL_LINK) diff --git a/buildtools/Cmake/CompleteInFiles.cmake b/buildtools/Cmake/CompleteInFiles.cmake index 98cc4617c8..1e2124976b 100644 --- a/buildtools/Cmake/CompleteInFiles.cmake +++ b/buildtools/Cmake/CompleteInFiles.cmake @@ -84,6 +84,9 @@ if(enable_java) find_package(JNI REQUIRED) message("-- [Java] JNI found: ${JNI_FOUND}") message("-- [Java] JNI include dirs: ${JNI_INCLUDE_DIRS}") + find_package(SWIG REQUIRED) + include(UseSWIG) + message("-- [Java] Swig found: ${SWIG_FOUND}") set(HAVE_Java 1) endif() if(enable_scala) @@ -107,6 +110,8 @@ else() endif() # Checks for header libraries functions. +CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_DLOPEN_IN_LIBDL) +CHECK_LIBRARY_EXISTS(execinfo backtrace "" HAVE_BACKTRACE_IN_LIBEXECINFO) CHECK_LIBRARY_EXISTS(pthread pthread_create "" pthread) CHECK_LIBRARY_EXISTS(pthread sem_init "" HAVE_SEM_INIT_LIB) CHECK_LIBRARY_EXISTS(pthread sem_open "" HAVE_SEM_OPEN_LIB) @@ -250,7 +255,10 @@ CHECK_TYPE_SIZE(void* SIZEOF_VOIDP) ### Check for GNU dynamic linker CHECK_INCLUDE_FILE("dlfcn.h" HAVE_DLFCN_H) if (HAVE_DLFCN_H) - execute_process(COMMAND ${CMAKE_C_COMPILER} ${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/test_prog/prog_gnu_dynlinker.c -ldl -o test_gnu_ld + if(HAVE_DLOPEN_IN_LIBDL) + set(DL_LIBRARY "-ldl") + endif(HAVE_DLOPEN_IN_LIBDL) + execute_process(COMMAND ${CMAKE_C_COMPILER} ${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/test_prog/prog_gnu_dynlinker.c ${DL_LIBRARY} -o test_gnu_ld WORKING_DIRECTORY ${CMAKE_BINARY_DIR} OUTPUT_VARIABLE HAVE_GNU_LD_compil ) diff --git a/buildtools/Cmake/DefinePackages.cmake b/buildtools/Cmake/DefinePackages.cmake index 0f610f77d8..3b5ee1a049 100644 --- a/buildtools/Cmake/DefinePackages.cmake +++ b/buildtools/Cmake/DefinePackages.cmake @@ -460,6 +460,9 @@ set(JMSG_C_SRC ) set(JMSG_JAVA_SRC + src/bindings/java/org/simgrid/NativeLib.java + #src/bindings/java/org/simgrid/NativeException.java + src/bindings/java/org/simgrid/msg/As.java src/bindings/java/org/simgrid/msg/Comm.java src/bindings/java/org/simgrid/msg/File.java @@ -470,8 +473,7 @@ set(JMSG_JAVA_SRC src/bindings/java/org/simgrid/msg/Msg.java src/bindings/java/org/simgrid/msg/MsgException.java src/bindings/java/org/simgrid/msg/Mutex.java - src/bindings/java/org/simgrid/msg/NativeException.java - src/bindings/java/org/simgrid/msg/NativeLib.java + src/bindings/java/org/simgrid/msg/NativeException.java src/bindings/java/org/simgrid/msg/Process.java src/bindings/java/org/simgrid/msg/ProcessKilledError.java src/bindings/java/org/simgrid/msg/ProcessNotFoundException.java @@ -484,6 +486,30 @@ set(JMSG_JAVA_SRC src/bindings/java/org/simgrid/msg/VM.java ) +set(JSURF_SWIG_SRC + src/bindings/java/surf.i +) +set(JSURF_JAVA_C_SRC + src/bindings/java/surf_swig.cpp + src/bindings/java/surf_swig.hpp +) + +set(JSURF_JAVA_GENERATED_SRC + ${CMAKE_BINARY_DIR}/src/bindings/java/org/simgrid/surf/Surf.java + ${CMAKE_BINARY_DIR}/src/bindings/java/org/simgrid/surf/SurfJNI.java + ${CMAKE_BINARY_DIR}/src/bindings/java/org/simgrid/surf/Plugin.java + ${CMAKE_BINARY_DIR}/src/bindings/java/org/simgrid/surf/Model.java + ${CMAKE_BINARY_DIR}/src/bindings/java/org/simgrid/surf/Resource.java + ${CMAKE_BINARY_DIR}/src/bindings/java/org/simgrid/surf/Action.java + ${CMAKE_BINARY_DIR}/src/bindings/java/org/simgrid/surf/Cpu.java + ${CMAKE_BINARY_DIR}/src/bindings/java/org/simgrid/surf/CpuAction.java + ${CMAKE_BINARY_DIR}/src/bindings/java/org/simgrid/surf/NetworkLink.java + ${CMAKE_BINARY_DIR}/src/bindings/java/org/simgrid/surf/NetworkAction.java + + ${CMAKE_BINARY_DIR}/src/bindings/java/org/simgrid/surf/LmmConstraint.java + ${CMAKE_BINARY_DIR}/src/bindings/java/org/simgrid/surf/XbtDict.java +) + set(JTRACE_C_SRC src/bindings/java/jtrace.c src/bindings/java/jtrace.h @@ -880,6 +906,7 @@ set(EXAMPLES_CMAKEFILES_TXT examples/java/cloud/CMakeLists.txt examples/java/cloud/migration/CMakeLists.txt examples/java/commTime/CMakeLists.txt + examples/java/surfPlugin/CMakeLists.txt examples/java/io/CMakeLists.txt examples/java/kademlia/CMakeLists.txt examples/java/master_slave_bypass/CMakeLists.txt @@ -961,6 +988,7 @@ set(TESHSUITE_CMAKEFILES_TXT teshsuite/smpi/mpich3-test/coll/CMakeLists.txt teshsuite/smpi/mpich3-test/datatype/CMakeLists.txt teshsuite/smpi/mpich3-test/group/CMakeLists.txt + teshsuite/smpi/mpich3-test/topo/CMakeLists.txt teshsuite/smpi/mpich3-test/init/CMakeLists.txt teshsuite/smpi/mpich3-test/pt2pt/CMakeLists.txt teshsuite/smpi/mpich3-test/f77/util/CMakeLists.txt diff --git a/buildtools/Cmake/Distrib.cmake b/buildtools/Cmake/Distrib.cmake index 74b539b171..2bb482a98c 100644 --- a/buildtools/Cmake/Distrib.cmake +++ b/buildtools/Cmake/Distrib.cmake @@ -189,6 +189,8 @@ set(source_to_pack ${JEDULE_SRC} ${JMSG_C_SRC} ${JMSG_JAVA_SRC} + ${JSURF_SWIG_SRC} + ${JSURF_JAVA_C_SRC} ${LUA_SRC} ${MC_SRC} ${MSG_SRC} diff --git a/buildtools/Cmake/Flags.cmake b/buildtools/Cmake/Flags.cmake index eb9d3f4d31..5e959e3602 100644 --- a/buildtools/Cmake/Flags.cmake +++ b/buildtools/Cmake/Flags.cmake @@ -19,7 +19,7 @@ if(enable_compile_warnings) endif() endif() - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wno-unused-function -Wno-unused-parameter -Wno-strict-aliasing -Wno-format-nonliteral -Werror") set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -Wall") # FIXME: Q&D hack diff --git a/buildtools/Cmake/GenerateDoc.cmake b/buildtools/Cmake/GenerateDoc.cmake index 0ef519a377..6d9769e318 100644 --- a/buildtools/Cmake/GenerateDoc.cmake +++ b/buildtools/Cmake/GenerateDoc.cmake @@ -3,6 +3,7 @@ find_path(DOXYGEN_PATH NAMES doxygen PATHS NO_DEFAULT_PATHS) find_path(JAVADOC_PATH NAMES javadoc PATHS NO_DEFAULT_PATHS) find_path(FIG2DEV_PATH NAMES fig2dev PATHS NO_DEFAULT_PATHS) +mark_as_advanced(JAVADOC_PATH) if(DOXYGEN_PATH) diff --git a/buildtools/Cmake/MaintainerMode.cmake b/buildtools/Cmake/MaintainerMode.cmake index cd899125b0..fe93a14eef 100644 --- a/buildtools/Cmake/MaintainerMode.cmake +++ b/buildtools/Cmake/MaintainerMode.cmake @@ -6,6 +6,7 @@ set(FLEXML_MIN_PATCH 6) # the rest should only be changed if you understand what you're doing if(enable_maintainer_mode AND NOT WIN32) find_program(PYTHON_EXE NAMES python) + mark_as_advanced(PYTHON_EXE) if (PYTHON_EXE) add_custom_command( OUTPUT diff --git a/buildtools/Cmake/MakeExe.cmake b/buildtools/Cmake/MakeExe.cmake index b9a64bec73..299103e24d 100644 --- a/buildtools/Cmake/MakeExe.cmake +++ b/buildtools/Cmake/MakeExe.cmake @@ -19,6 +19,7 @@ add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/java/mutualExclusion) add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/java/pingPong) add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/java/priority) add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/java/startKillTime) +add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/java/surfPlugin) add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/java/suspend) add_subdirectory(${CMAKE_HOME_DIRECTORY}/examples/java/tracing) @@ -97,6 +98,7 @@ add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich3-test/coll) add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich3-test/comm) add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich3-test/datatype) add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich3-test/group) +add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich3-test/topo) add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich3-test/init) add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich3-test/pt2pt) diff --git a/buildtools/Cmake/MakeJava.cmake b/buildtools/Cmake/MakeJava.cmake index f1c43dedbf..8091c98306 100644 --- a/buildtools/Cmake/MakeJava.cmake +++ b/buildtools/Cmake/MakeJava.cmake @@ -29,8 +29,6 @@ message("-- [Java] simgrid-java includes: ${CHECK_INCLUDES}") target_link_libraries(simgrid-java simgrid) - - if(WIN32) exec_program("java -d32 -version" OUTPUT_VARIABLE IS_32_BITS_JVM) @@ -65,6 +63,8 @@ set(LIBSIMGRID_SO libsimgrid${CMAKE_SHARED_LIBRARY_SUFFIX}) set(LIBSIMGRID_JAVA_SO ${CMAKE_SHARED_LIBRARY_PREFIX}simgrid-java${CMAKE_SHARED_LIBRARY_SUFFIX}) +set(LIBSURF_JAVA_SO + ${CMAKE_SHARED_LIBRARY_PREFIX}surf-java${CMAKE_SHARED_LIBRARY_SUFFIX}) ## Don't strip libraries if not in release mode ## @@ -78,15 +78,16 @@ endif() ## if(CMAKE_VERSION VERSION_LESS "2.8.12") set(CMAKE_JAVA_TARGET_OUTPUT_NAME simgrid) - add_jar(simgrid-java_pre_jar ${JMSG_JAVA_SRC}) + add_jar(simgrid-java_pre_jar ${JMSG_JAVA_SRC} ${JSURF_JAVA_GENERATED_SRC}) else() - add_jar(simgrid-java_pre_jar ${JMSG_JAVA_SRC} OUTPUT_NAME simgrid) + add_jar(simgrid-java_pre_jar ${JMSG_JAVA_SRC} ${JSURF_JAVA_GENERATED_SRC} OUTPUT_NAME simgrid) endif() set(JAVA_BUNDLE "${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/Scripts/java_bundle.sh") set(JAVA_BUNDLE_SO_FILES ${CMAKE_BINARY_DIR}/lib/${LIBSIMGRID_SO} ${CMAKE_BINARY_DIR}/lib/${LIBSIMGRID_JAVA_SO} + ${CMAKE_BINARY_DIR}/lib/${LIBSURF_JAVA_SO} ) set(JAVA_BUNDLE_TXT_FILES ${CMAKE_HOME_DIRECTORY}/COPYING @@ -111,3 +112,15 @@ add_custom_command( COMMAND ${CMAKE_COMMAND} -E touch ${SIMGRID_JAR}_finalized ) add_custom_target(simgrid-java_jar ALL DEPENDS ${SIMGRID_JAR}_finalized) + +set(CMAKE_SWIG_FLAGS "-package" "org.simgrid.surf") +set(CMAKE_SWIG_OUTDIR "${CMAKE_HOME_DIRECTORY}/src/bindings/java/org/simgrid/surf") +set(CMAKE_SWIG_OUTDIR "${CMAKE_BINARY_DIR}/src/bindings/java/org/simgrid/surf") + +set_source_files_properties(${JSURF_SWIG_SRC} PROPERTIES CPLUSPLUS 1) +#set_source_files_properties(${SURF_SWIG_FILE} PROPERTIES SWIG_FLAGS "-includeall") +include_directories(${JNI_INCLUDE_DIRS}) +swig_add_module(surf-java java ${JSURF_SWIG_SRC} ${JSURF_JAVA_C_SRC}) +swig_link_libraries(surf-java simgrid) + +add_dependencies(simgrid-java surf-java) diff --git a/buildtools/Cmake/MakeLib.cmake b/buildtools/Cmake/MakeLib.cmake index 25fdfad4b9..ef15efa4a7 100644 --- a/buildtools/Cmake/MakeLib.cmake +++ b/buildtools/Cmake/MakeLib.cmake @@ -20,7 +20,16 @@ add_dependencies(simgrid maintainer_files) # Compute the dependencies of SimGrid ##################################### -set(SIMGRID_DEP "-lm -lstdc++") +set(SIMGRID_DEP "-lm") + +if(${CMAKE_SYSTEM_NAME} STREQUAL "FreeBSD" + AND NOT ${CMAKE_SYSTEM_VERSION} VERSION_LESS 10.0 + AND ${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang") + # FreeBSD from 10.0 provide a internal C++ stack (unused by gcc) + set(SIMGRID_DEP "${SIMGRID_DEP} -lc++") +else() + set(SIMGRID_DEP "${SIMGRID_DEP} -lstdc++") +endif() if(pthread) if(${CONTEXT_THREADS}) @@ -90,7 +99,7 @@ if(HAVE_MC) endif() if(MMALLOC_WANT_OVERRIDE_LEGACY AND HAVE_GNU_LD) - SET(SIMGRID_DEP "${SIMGRID_DEP} -ldl") + SET(SIMGRID_DEP "${SIMGRID_DEP} ${DL_LIBRARY}") endif() if(HAVE_NS3) @@ -107,6 +116,10 @@ if(HAVE_POSIX_GETTIME) SET(SIMGRID_DEP "${SIMGRID_DEP} -lrt") endif() +if(HAVE_BACKTRACE_IN_LIBEXECINFO) + SET(SIMGRID_DEP "${SIMGRID_DEP} -lexecinfo") +endif(HAVE_BACKTRACE_IN_LIBEXECINFO) + # Compute the dependencies of SMPI ################################## if(enable_smpi AND APPLE) diff --git a/buildtools/Cmake/Modules/FindNS3.cmake b/buildtools/Cmake/Modules/FindNS3.cmake index 2e0afbd126..eb64091aa0 100644 --- a/buildtools/Cmake/Modules/FindNS3.cmake +++ b/buildtools/Cmake/Modules/FindNS3.cmake @@ -57,35 +57,24 @@ if(HAVE_CORE_MODULE_H) message(STATUS "Warning: NS-3 version <= 3.10") set(HAVE_NS3 1) set(NS3_VERSION_MINOR 10) - string(REPLACE "/libns3.${LIB_EXE}" "" HAVE_NS3_LIB "${HAVE_NS3_LIB}") + get_filename_component(NS3_LIBRARY_PATH "${HAVE_NS3_LIB}" PATH) endif() if(HAVE_NS3_CORE_LIB) message(STATUS "NS-3 version > 3.10") string(REGEX REPLACE ".*ns3.([0-9]+)-core.*" "\\1" NS3_VERSION_MINOR "${HAVE_NS3_CORE_LIB}") set(HAVE_NS3 1) - string(REPLACE "/libns3-core.${LIB_EXE}" "" HAVE_NS3_LIB "${HAVE_NS3_CORE_LIB}") + get_filename_component(NS3_LIBRARY_PATH "${HAVE_NS3_CORE_LIB}" PATH) endif() endif() if(HAVE_NS3) - string(REGEX MATCH "${HAVE_NS3_LIB}" operation "$ENV{LD_LIBRARY_PATH}") + string(REGEX MATCH "${NS3_LIBRARY_PATH}" operation "$ENV{LD_LIBRARY_PATH}") if(NOT operation) - message(STATUS "Warning: To use NS-3 don't forget to set LD_LIBRARY_PATH with: export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${HAVE_NS3_LIB}") - else() - - string(REGEX MATCH "-L${HAVE_NS3_LIB} " operation1 "${CMAKE_C_FLAGS}") - if(NOT operation1) - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}-L${HAVE_NS3_LIB} ") - endif() - - string(REGEX MATCH "-I${HAVE_CORE_MODULE_H} " operation1 "${CMAKE_C_FLAGS}") - if(NOT operation1) - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}-I${HAVE_CORE_MODULE_H} ") - endif() - - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}-I${HAVE_CORE_MODULE_H} -L${HAVE_NS3_LIB} ") - message(STATUS "TEST: ${CMAKE_CXX_FLAGS}") + message(STATUS "Warning: To use NS-3 don't forget to set LD_LIBRARY_PATH with: export LD_LIBRARY_PATH=${NS3_LIBRARY_PATH}\${LD_LIBRARY_PATH:+:\$LD_LIBRARY_PATH}") endif() + + link_directories(${NS3_LIBRARY_PATH}) + include_directories(${HAVE_CORE_MODULE_H}) else() message(STATUS "Warning: To use NS-3 Please install ns3 at least version 3.10 (http://www.nsnam.org/releases/)") endif() diff --git a/buildtools/Cmake/Scripts/java_bundle.sh b/buildtools/Cmake/Scripts/java_bundle.sh index 1c232b82a0..c0d51ce6be 100755 --- a/buildtools/Cmake/Scripts/java_bundle.sh +++ b/buildtools/Cmake/Scripts/java_bundle.sh @@ -20,7 +20,7 @@ JAVA=$2 STRIP=$3 shift 3 -JSG_BUNDLE=$("$JAVA" -classpath "$SIMGRID_JAR" org.simgrid.msg.NativeLib) +JSG_BUNDLE=$("$JAVA" -classpath "$SIMGRID_JAR" org.simgrid.NativeLib) # sanity check case "$JSG_BUNDLE" in diff --git a/buildtools/jenkins/run.sh b/buildtools/jenkins/run.sh index 1d1ad6c8a0..96f8afb178 100755 --- a/buildtools/jenkins/run.sh +++ b/buildtools/jenkins/run.sh @@ -75,7 +75,7 @@ fi echo "running tests with $NUMBER_OF_PROCESSORS processors" -ctest -T test --no-compress-output --timeout 100 -j$NUMBER_OF_PROCESSORS || true +ctest --output-on-failure -T test --no-compress-output --timeout 100 -j$NUMBER_OF_PROCESSORS || true if [ -f Testing/TAG ] ; then xsltproc $WORKSPACE/buildtools/jenkins/ctest2junit.xsl -o "$WORKSPACE/CTestResults.xml" Testing/`head -n 1 < Testing/TAG`/Test.xml fi diff --git a/buildtools/pipol/rc.debian b/buildtools/pipol/rc.debian index 8a65effa15..67e8688e2a 100644 --- a/buildtools/pipol/rc.debian +++ b/buildtools/pipol/rc.debian @@ -4,6 +4,7 @@ sudo aptitude update sudo aptitude -y install cmake sudo aptitude -y install default-jdk +sudo aptitude -y install swig sudo aptitude -y install f2c sudo aptitude -y install g++ sudo aptitude -y install gcc @@ -21,6 +22,7 @@ which_gcc=`which gcc` #gcc gcc necessary which_gpp=`which g++` #gcc g++ necessary which_make=`which make` #make necessary which_java=`which java` #java optional +which_swig=`which swig` #swig optional which_lua=`which lua` #lua which_cmake=`which cmake` #cmake necessary which_unzip=`which unzip` #unzip for gtnets @@ -35,6 +37,7 @@ echo $which_cmake echo $which_unzip echo $which_lua echo $which_java +echo $which_swig echo $which_make echo $which_gcc echo $which_gpp diff --git a/buildtools/pipol/rc.fedora b/buildtools/pipol/rc.fedora index 6dcc08b535..9c0f818880 100644 --- a/buildtools/pipol/rc.fedora +++ b/buildtools/pipol/rc.fedora @@ -11,6 +11,7 @@ sudo yum -y -q install gcc sudo yum -y -q install git-core sudo yum -y -q install graphviz-dev graphviz sudo yum -y -q install java-1.6.0-openjdk +sudo yum -y -q install swig sudo yum -y -q install libunwind libunwind-devel sudo yum -y -q install lua-devel lua sudo yum -y -q install make @@ -24,6 +25,7 @@ which_gcc=`which gcc` #gcc gcc necessary which_gpp=`which g++` #gcc g++ necessary which_make=`which make` #make necessary which_java=`which java` #java optional +which_swig=`which swig` #swig optional which_lua=`which lua` #lua which_cmake=`which cmake` #cmake necessary which_unzip=`which unzip` #unzip for gtnets @@ -38,6 +40,7 @@ echo $which_cmake echo $which_unzip echo $which_lua echo $which_java +echo $which_swig echo $which_make echo $which_gcc echo $which_gpp @@ -48,4 +51,4 @@ echo $which_perl echo $which_f2c echo $which_gcov echo $which_git -echo "FIN------------------------------------" \ No newline at end of file +echo "FIN------------------------------------" diff --git a/buildtools/pipol/rc.mac b/buildtools/pipol/rc.mac index 9fc740a2fa..7538a6cefa 100644 --- a/buildtools/pipol/rc.mac +++ b/buildtools/pipol/rc.mac @@ -4,6 +4,7 @@ #sudo port install gcc46 #sudo port install graphviz-devel #sudo port install lua +#sudo port install swig #sudo port select bf2c sudo port install ruby19 @@ -16,6 +17,7 @@ which_gcc=`which gcc` #gcc gcc necessary which_gpp=`which g++` #gcc g++ necessary which_make=`which make` #make necessary which_java=`which java` #java optional +which_java=`which swig` #swig optional which_lua=`which lua` #lua which_cmake=`which cmake` #cmake necessary which_unzip=`which unzip` #unzip for gtnets @@ -30,6 +32,7 @@ echo $which_cmake echo $which_unzip echo $which_lua echo $which_java +echo $which_swig echo $which_make echo $which_gcc echo $which_gpp @@ -39,4 +42,4 @@ echo $which_perl echo $which_f2c echo $which_gcov echo $which_git -echo "FIN------------------------------------" \ No newline at end of file +echo "FIN------------------------------------" diff --git a/buildtools/pipol/rc.ubuntu b/buildtools/pipol/rc.ubuntu index b2b9d25a32..19658e8b71 100644 --- a/buildtools/pipol/rc.ubuntu +++ b/buildtools/pipol/rc.ubuntu @@ -4,6 +4,7 @@ sudo apt-get update sudo apt-get -y -qq install cmake sudo apt-get -y -qq install default-jdk +sudo apt-get -y -qq install swig sudo apt-get -y -qq install f2c sudo apt-get -y -qq install g++ sudo apt-get -y -qq install gcc @@ -33,6 +34,7 @@ which_gcc=`which gcc` #gcc gcc necessary which_gpp=`which g++` #gcc g++ necessary which_make=`which make` #make necessary which_java=`which java` #java optional +which_swig=`which swig` #swig optional which_lua=`which lua` #lua which_cmake=`which cmake` #cmake necessary which_unzip=`which unzip` #unzip for gtnets @@ -47,6 +49,7 @@ echo $which_cmake echo $which_unzip echo $which_lua echo $which_java +echo $which_swig echo $which_make echo $which_gcc echo $which_gpp @@ -57,4 +60,4 @@ echo $which_perl echo $which_f2c echo $which_gcov echo $which_git -echo "FIN------------------------------------" \ No newline at end of file +echo "FIN------------------------------------" diff --git a/contrib/benchmarking_code_block/Rdhist.R b/contrib/benchmarking_code_block/Rdhist.R new file mode 100644 index 0000000000..76ff210833 --- /dev/null +++ b/contrib/benchmarking_code_block/Rdhist.R @@ -0,0 +1,313 @@ +#------------------------------------------------------------------------------- +# Copyright (c) 2012 University of Illinois, NCSA. +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the +# University of Illinois/NCSA Open Source License +# which accompanies this distribution, and is available at +# http://opensource.ncsa.illinois.edu/license.html +#------------------------------------------------------------------------------- +##--------------------------------------------------------------------------------------------------# +##' Variable-width (dagonally cut) histogram +##' +##' +##' When constructing a histogram, it is common to make all bars the same width. +##' One could also choose to make them all have the same area. +##' These two options have complementary strengths and weaknesses; the equal-width histogram oversmooths in regions of high density, and is poor at identifying sharp peaks; the equal-area histogram oversmooths in regions of low density, and so does not identify outliers. +##' We describe a compromise approach which avoids both of these defects. We regard the histogram as an exploratory device, rather than as an estimate of a density. +##' @name dhist +##' @title Diagonally Cut Histogram +##' @param x is a numeric vector (the data) +##' @param a is the scaling factor, default is 5 * IQR +##' @param nbins is the number of bins, default is assigned by the Stuges method +##' @param rx is the range used for the left of the left-most bin to the right of the right-most bin +##' @param eps used to set artificial bound on min width / max height of bins as described in Denby and Mallows (2009) on page 24. +##' @param xlab is label for the x axis +##' @param plot = TRUE produces the plot, FALSE returns the heights, breaks and counts +##' @param lab.spikes = TRUE labels the \% of data in the spikes +##' @return list with two elements, heights of length n and breaks of length n+1 indicating the heights and break points of the histogram bars. +##' @author Lorraine Denby, Colin Mallows +##' @references Lorraine Denby, Colin Mallows. Journal of Computational and Graphical Statistics. March 1, 2009, 18(1): 21-31. doi:10.1198/jcgs.2009.0002. +dhist <- function(x, a=5*iqr(x), + nbins=nclass.Sturges(x), rx = range(x,na.rm = TRUE), + eps=.15, xlab = "x", plot = TRUE,lab.spikes = TRUE) +{ + + if(is.character(nbins)) + nbins <- switch(casefold(nbins), + sturges = nclass.Sturges(x), + fd = nclass.FD(x), + scott = nclass.scott(x), + stop("Nclass method not recognized")) + else if(is.function(nbins)) + nbins <- nbins(x) + + x <- sort(x[!is.na(x)]) + if(a == 0) + a <- diff(range(x))/100000000 + if(a != 0 & a != Inf) { + n <- length(x) + h <- (rx[2] + a - rx[1])/nbins + ybr <- rx[1] + h * (0:nbins) + yupper <- x + (a * (1:n))/n + # upper and lower corners in the ecdf + ylower <- yupper - a/n + # + cmtx <- cbind(cut(yupper, breaks = ybr), cut(yupper, breaks = + ybr, left.include = TRUE), cut(ylower, breaks = ybr), + cut(ylower, breaks = ybr, left.include = TRUE)) + cmtx[1, 3] <- cmtx[1, 4] <- 1 + # to replace NAs when default r is used + cmtx[n, 1] <- cmtx[n, 2] <- nbins + # + #checksum <- apply(cmtx, 1, sum) %% 4 + checksum <- (cmtx[, 1] + cmtx[, 2] + cmtx[, 3] + cmtx[, 4]) %% + 4 + # will be 2 for obs. that straddle two bins + straddlers <- (1:n)[checksum == 2] + # to allow for zero counts + if(length(straddlers) > 0) { + counts <- table(c(1:nbins, cmtx[ - straddlers, 1])) + } else { + counts <- table(c(1:nbins, cmtx[, 1])) + } + counts <- counts - 1 + # + if(length(straddlers) > 0) { + for(i in straddlers) { + binno <- cmtx[i, 1] + theta <- ((yupper[i] - ybr[binno]) * n)/a + counts[binno - 1] <- counts[binno - 1] + ( + 1 - theta) + counts[binno] <- counts[binno] + theta + } + } + xbr <- ybr + xbr[-1] <- ybr[-1] - (a * cumsum(counts))/n + spike<-eps*diff(rx)/nbins + flag.vec<-c(diff(xbr)1) { + xbr.new<-xbr + counts.new<-counts + diff.xbr<-abs(diff(xbr)) + amt.spike<-diff.xbr[length(diff.xbr)] + for (i in rev(2:length(diff.xbr))) { + if (diff.xbr[i-1] <= spike&diff.xbr[i] <= spike & + !is.na(diff.xbr[i])) { + amt.spike <- amt.spike+diff.xbr[i-1] + counts.new[i-1] <- counts.new[i-1]+counts.new[i] + xbr.new[i] <- NA + counts.new[i] <- NA + flag.vec[i-1] <- T + } + else amt.spike<-diff.xbr[i-1] + } + flag.vec<-flag.vec[!is.na(xbr.new)] + flag.vec<-flag.vec[-length(flag.vec)] + counts<-counts.new[!is.na(counts.new)] + xbr<-xbr.new[!is.na(xbr.new)] + + } + else flag.vec<-flag.vec[-length(flag.vec)] + widths <- abs(diff(xbr)) + ## N.B. argument "widths" in barplot must be xbr + heights <- counts/widths + } + bin.size <- length(x)/nbins + cut.pt <- unique(c(min(x) - abs(min(x))/1000, + approx(seq(length(x)), x, (1:(nbins - 1)) * bin.size, rule = 2)$y, max(x))) + aa <- hist(x, breaks = cut.pt, plot = FALSE, probability = TRUE) + if(a == Inf) { + heights <- aa$counts + xbr <- aa$breaks + } + amt.height<-3 + q75<-quantile(heights,.75) + if (sum(flag.vec)!=0) { + amt<-max(heights[!flag.vec]) + ylim.height<-amt*amt.height + ind.h<-flag.vec&heights> ylim.height + flag.vec[heights=1) { + usr<-par('usr') + for ( i in seq(length(xbr)-1)) { + if (!flag.vec[i]) { + amt.txt<-0 + if (xbr[i]-xbr[1]1) + for(i in 1:(length(h$counts)-1)) + { + if(h$counts[i]!=0 || h$counts[i+1]!=0) + { + counts2[j]<-h$counts[i] + breaks2[j+1]<-h$breaks[i+1]; + j<-j+1 + } + } + counts2[j]<-h$counts[length(h$counts)] + breaks2[j+1]<-h$breaks[length(h$breaks)] + + h$counts<-counts2 + h$breaks<-breaks2 + + return (h) +} + +# Main +source("analysis/hist_script/Rdhist.R") + inputfile<-Sys.getenv("R_INPUT") outputfile<-Sys.getenv("R_OUTPUT") +type<-Sys.getenv("R_TYPE") + +if (!(type %in% c("mean","default","sturges","scott"))) + { + stop("Wrong histogram type") + } df<-read.table(inputfile,header=F) df<-df[,c(1,4)] @@ -21,17 +61,49 @@ attach(df) for(i in unique(NAME)) { vector1<-df[NAME==i,2] - h<-hist(vector1) - + + if (length(vector1)==1) + { + #If there is only one element + h<-hist(vector1) # Just for R compatibility reasons + h$breaks<-c(vector1,vector1) + h$counts<-1 + } + else + { + if (type=="mean") + { + #Mean value only + h<-hist(vector1) # Just for R compatibility reasons + h$breaks<-c(mean(vector1),mean(vector1)) + h$counts<-length(vector1) + } + else + if (type=="default") + #Standard HISTOGRAM: + h<-hist(vector1) + else + { + #Dhist: + h<-dhist(vector1,nbins=type, plot = FALSE, lab.spikes = FALSE, a=5*iqr(vector1), eps=0.15) + h$breaks<-h$xbr + h$count<-as.vector(h$counts) + h$counts<-h$count + h<-merge_empty_bins(h) + } + } + cat(i, file = outputfile, sep = "\t", append = TRUE) - cat(" ", file = outputfile, sep = "\t", append = TRUE) - cat(sprintf("%.8f", mean(vector1)), file =outputfile, sep = "\t ", append = TRUE) + cat("\t", file = outputfile, append = TRUE) + cat(sum(h$counts), file =outputfile, sep = "\t", append = TRUE) + cat("\t", file = outputfile, append = TRUE) + cat(sprintf("%.8f", mean(vector1)), file =outputfile, sep = "\t", append = TRUE) cat("\t", file = outputfile, append = TRUE) cat(length(h$breaks), file = outputfile, append = TRUE) cat("\t", file = outputfile, append = TRUE) - cat(sprintf("%.8f", h$breaks), file = outputfile, sep = " \t", append = TRUE) + cat(sprintf("%.8f", h$breaks), file = outputfile, sep = "\t", append = TRUE) cat("\t", file = outputfile, append = TRUE) h$density = h$counts/sum(h$counts) - cat(sprintf("%.14f", h$density), file = outputfile, sep = " \t", append = TRUE) + cat(sprintf("%.8f", h$density), file = outputfile, sep = "\t", append = TRUE) cat("\n", file = outputfile, append = TRUE) } diff --git a/contrib/benchmarking_code_block/Rplot_hist.R b/contrib/benchmarking_code_block/Rplot_hist.R new file mode 100644 index 0000000000..1f7487addf --- /dev/null +++ b/contrib/benchmarking_code_block/Rplot_hist.R @@ -0,0 +1,72 @@ +# R script showing .pdf file with plots of all injection histograms for a certain file + +# Can be called from the command line with: +# Rscript $this_script.R inputfile + +# Necessary libraries +library(plyr) +library(ggplot2) +library(data.table) +library(grid) + +# Functions for arranging multiple plots +vp.layout <- function(x, y) viewport(layout.pos.row=x, layout.pos.col=y) +arrange_ggplot2 <- function(list, nrow=NULL, ncol=NULL, as.table=FALSE) { +n <- length(list) +if(is.null(nrow) & is.null(ncol)) { nrow = floor(n/2) ; ncol = ceiling(n/nrow)} +if(is.null(nrow)) { nrow = ceiling(n/ncol)} +if(is.null(ncol)) { ncol = ceiling(n/nrow)} +## NOTE see n2mfrow in grDevices for possible alternative +grid.newpage() +pushViewport(viewport(layout=grid.layout(nrow,ncol) ) ) +ii.p <- 1 +for(ii.row in seq(1, nrow)){ +ii.table.row <- ii.row +if(as.table) {ii.table.row <- nrow - ii.table.row + 1} +for(ii.col in seq(1, ncol)){ +ii.table <- ii.p +if(ii.p > n) break +print(list[[ii.table]], vp=vp.layout(ii.table.row, ii.col)) +ii.p <- ii.p + 1 +} +} +} + +### Main + +# Reading command line argument with the input file path +args <- commandArgs(trailingOnly = TRUE) +fp <- file(args[1], open = "r") + +plots<-list() +i<-1 + +# Reading histograms one by one, line by line +while (length(oneLine <- readLines(fp, n = 1, warn = FALSE)) > 0) +{ myVector <- (strsplit(oneLine, "\t")) + + dfl <- ldply (myVector, data.frame) + + name<-as.character(dfl[1,]) + nbins<-as.numeric(as.character(dfl[4,])) + allbreaks<-as.numeric(as.character(dfl[5:(5+nbins-1),])) + + dh<-data.frame(Name=as.character(dfl[1,]), Total=as.numeric(as.character(dfl[2,])), Mean=as.numeric(as.character(dfl[3,])), Nbins=as.numeric(as.character(dfl[4,]))) + dh<-cbind(dh,Bstart=allbreaks[-length(allbreaks)]) + dh<-cbind(dh,Bend=allbreaks[-1]) + dh<-cbind(dh,Density=as.numeric(as.character(dfl[(5+nbins):(5+nbins*2-2),]))) + + # Plotting single histogram, if it only has one value then use geom_bar + if (nbins > 2) + plots[[i]]<-ggplot(data=data.frame(dh), aes(xmin=Bstart, xmax=Bend, ymin=0, ymax=Density)) + geom_rect(aes(fill=Density)) + theme_bw() + scale_x_continuous("Time [s]", allbreaks) + labs(title=name, y=element_text("Density %")) + else + plots[[i]]<-ggplot(data=data.frame(dh), aes(factor(Bstart))) + geom_bar(aes(fill=Density)) + theme_bw() + labs(title=name, y=element_text("Density %"), x=element_text("Time [s]")) + + i<-i+1 +} + +# Printing all plots together in a table +arrange_ggplot2(plots, as.table=TRUE) + +# End +write("Done producing a histogram plot. Open Rplots.pdf located in this folder to see the results", stdout()) diff --git a/contrib/benchmarking_code_block/inject.h b/contrib/benchmarking_code_block/inject.h index f4d9fa2b1f..57e2c8291b 100644 --- a/contrib/benchmarking_code_block/inject.h +++ b/contrib/benchmarking_code_block/inject.h @@ -24,13 +24,14 @@ #include "xbt/dict.h" #include "xbt/sysdep.h" -#define MAX_LINE_INJ 1000 +#define MAX_LINE_INJ 10000 /* * Histogram entry for each measured block * Each entry is guarded inside xbt dictionary which is read from the file */ typedef struct xbt_hist { int n; + int counts; double mean; double *breaks; double *percentage; @@ -68,7 +69,7 @@ static inline void xbt_inject_init(char *inputfile) printf("Error input file is empty!");//Skipping first row while (fgets(line, 200, fpInput) != NULL) { - key = strtok(line, " \t"); + key = strtok(line, "\t"); data = xbt_dict_get_or_null(mydict, key); if (data) @@ -77,15 +78,16 @@ static inline void xbt_inject_init(char *inputfile) data = (xbt_hist_t *) xbt_new(xbt_hist_t, 1); data->block_id = key; - data->mean = atof(strtok(NULL, " \t")); - data->n = atoi(strtok(NULL, " \t")); + data->counts = atoi(strtok(NULL, "\t")); + data->mean = atof(strtok(NULL, "\t")); + data->n = atoi(strtok(NULL, "\t")); data->breaks = (double*) malloc(sizeof(double) * data->n); data->percentage = (double*) malloc(sizeof(double) * (data->n - 1)); for (i = 0; i < data->n; i++) - data->breaks[i] = atof(strtok(NULL, " \t")); + data->breaks[i] = atof(strtok(NULL, "\t")); for (i = 0; i < (data->n - 1); i++) - data->percentage[i] = atof(strtok(NULL, " \t")); + data->percentage[i] = atof(strtok(NULL, "\t")); xbt_dict_set(mydict, key, data, NULL); } @@ -103,7 +105,10 @@ static inline void inject_init_starpu(char *inputfile, xbt_dict_t *dict, RngStre mydict = *dict; FILE* fpInput = fopen(inputfile, "r"); if (fpInput == NULL) + { printf("Error while opening the inputfile"); + return; + } fseek(fpInput, 0, 0); @@ -113,12 +118,15 @@ static inline void inject_init_starpu(char *inputfile, xbt_dict_t *dict, RngStre xbt_hist_t* data; if (fgets(line, MAX_LINE_INJ, fpInput) == NULL) + { printf("Error input file is empty!");//Skipping first row + return; + } while (fgets(line, MAX_LINE_INJ, fpInput) != NULL) { - key = strtok(line, " \t"); + key = strtok(line, "\t"); data = xbt_dict_get_or_null(mydict, key); if (data) @@ -126,16 +134,17 @@ static inline void inject_init_starpu(char *inputfile, xbt_dict_t *dict, RngStre data = (xbt_hist_t *) xbt_new(xbt_hist_t, 1); data->block_id = key; - data->mean = atof(strtok(NULL, " \t")); - data->n = atoi(strtok(NULL, " \t")); + data->counts = atoi(strtok(NULL, "\t")); + data->mean = atof(strtok(NULL, "\t")); + data->n = atoi(strtok(NULL, "\t")); data->breaks = (double*) malloc(sizeof(double) * data->n); data->percentage = (double*) malloc(sizeof(double) * (data->n - 1)); for (i = 0; i < data->n; i++) - data->breaks[i] = atof(strtok(NULL, " \t")); + data->breaks[i] = atof(strtok(NULL, "\t")); for (i = 0; i < (data->n - 1); i++) { - data->percentage[i] = atof(strtok(NULL, " \t")); + data->percentage[i] = atof(strtok(NULL, "\t")); } xbt_dict_set(mydict, key, data, NULL); diff --git a/doc/doxygen/module-surf.doc b/doc/doxygen/module-surf.doc index 7e3733f7ad..e4aed28d19 100644 --- a/doc/doxygen/module-surf.doc +++ b/doc/doxygen/module-surf.doc @@ -3,9 +3,8 @@ \section SURF_doc Surf documentation Surf is composed several components: - \ref SURF_simulation - - \ref SURF_actions - - \ref SURF_resources - \ref SURF_build_api + - \ref SURF_c_bindings - \ref SURF_interface - \ref SURF_routing_interface - \ref SURF_cpu_interface @@ -13,6 +12,7 @@ - \ref SURF_storage_interface - \ref SURF_workstation_interface - \ref SURF_vm_workstation_interface + - \ref SURF_lmm - \ref SURF_callbacks - \ref SURF_plugin_energy @@ -90,19 +90,19 @@ */ /** -@defgroup SURF_routing_interface SURF Routing Interface +@defgroup SURF_interface SURF Interface @ingroup SURF_API -@brief Describes the routing interface +@brief Describes the general interface for all components (Cpu, Network, Storage, Workstation, WorkstationVM) -@htmlonly @endhtmlonly +@htmlonly @endhtmlonly */ /** -@defgroup SURF_interface SURF Interface +@defgroup SURF_routing_interface SURF Routing Interface @ingroup SURF_API -@brief Describes the general interface for all components (Cpu, Network, Storage, Workstation, WorkstationVM) +@brief Describes the routing interface -@htmlonly @endhtmlonly +@htmlonly @endhtmlonly */ /** @@ -167,4 +167,4 @@ @brief Describes how to use the energy plugin. @htmlonly @endhtmlonly -*/ \ No newline at end of file +*/ diff --git a/doc/doxygen/options.doc b/doc/doxygen/options.doc index b9ab520108..b70680d11c 100644 --- a/doc/doxygen/options.doc +++ b/doc/doxygen/options.doc @@ -391,7 +391,7 @@ stacks), leading to segfaults with corrupted stack traces. If you want to push the scalability limits of your code, you really want to reduce the \b contexts/stack_size item. Its default value -is 128 (in KiB), while our Chord simulation works with stacks as small +is 8192 (in KiB), while our Chord simulation works with stacks as small as 16 KiB, for example. For the thread factory, the default value is the one of the system, if it is too large/small, it has to be set with this parameter. diff --git a/doc/doxygen/platform.doc b/doc/doxygen/platform.doc index 5c3ae9ea82..e06e2236eb 100644 --- a/doc/doxygen/platform.doc +++ b/doc/doxygen/platform.doc @@ -366,7 +366,7 @@ the router name is defined as the resulting String in the following java line of code: @verbatim -router_name = prefix + clusterId + router_ + suffix; +router_name = prefix + clusterId + _router + suffix; @endverbatim @@ -383,11 +383,11 @@ The second examples creates one router and 100 machines, which names are the following: \verbatim c-my_cluster_1_router.me -c-0.my_cluster_1.me -c-1.my_cluster_1.me -c-2.my_cluster_1.me +c-0.me +c-1.me +c-2.me ... -c-99.my_cluster_1.me +c-99.me \endverbatim \subsubsection pf_peer peer @@ -637,8 +637,9 @@ the tool you use for rendering your simulation, for example. \li id (mandatory): the identifier of the storage to be used when referring to it. \li typeId (mandatory): the identifier of the storage_type that - this storage belongs to. - + this storage belongs to. +\li attach (mandatory): the host (name) to which the storage is + attached to. \subsubsection pf_sto_mo mount diff --git a/examples/java/bittorrent/Peer.java b/examples/java/bittorrent/Peer.java index 10fd6c55be..6ce5a5473d 100644 --- a/examples/java/bittorrent/Peer.java +++ b/examples/java/bittorrent/Peer.java @@ -419,10 +419,9 @@ public class Peer extends Process { return; } if (true || pieces < 3) { - int i = 0, peerPiece; + int peerPiece; do { currentPiece = stream.randInt(0,Common.FILE_PIECES - 1); - i++; } while (!(bitfield[currentPiece] == '0' && !currentPieces.contains(currentPiece))); } else { diff --git a/examples/java/surfPlugin/CMakeLists.txt b/examples/java/surfPlugin/CMakeLists.txt new file mode 100644 index 0000000000..27738906f0 --- /dev/null +++ b/examples/java/surfPlugin/CMakeLists.txt @@ -0,0 +1,47 @@ +cmake_minimum_required(VERSION 2.6) + +set(example java_surf_plugin) +set(sources + ${CMAKE_CURRENT_SOURCE_DIR}/TestPlugin.java + ${CMAKE_CURRENT_SOURCE_DIR}/TracePlugin.java + ${CMAKE_CURRENT_SOURCE_DIR}/Sender.java + ${CMAKE_CURRENT_SOURCE_DIR}/Receiver.java + ) + +if(enable_java) + add_custom_command( + COMMENT "Building ${example}..." + OUTPUT ${example}_compiled + DEPENDS ${sources} simgrid-java_jar ${SIMGRID_JAR} + COMMAND ${JAVA_COMPILE} -classpath ${SIMGRID_JAR} + -d ${CMAKE_CURRENT_BINARY_DIR}/.. ${sources} + COMMAND ${CMAKE_COMMAND} -E remove ${example}_compiled + COMMAND ${CMAKE_COMMAND} -E touch ${example}_compiled + ) + add_custom_target(${example} ALL DEPENDS ${example}_compiled) +endif() + +set(tesh_files + ${tesh_files} + ${CMAKE_CURRENT_SOURCE_DIR}/surf_plugin.tesh + PARENT_SCOPE + ) +set(xml_files + ${xml_files} + ${CMAKE_CURRENT_SOURCE_DIR}/surfPluginPlatform.xml + ${CMAKE_CURRENT_SOURCE_DIR}/surfPluginDeployment.xml + PARENT_SCOPE + ) +set(examples_src + ${examples_src} + ${sources} + PARENT_SCOPE + ) +set(bin_files + ${bin_files} + PARENT_SCOPE + ) +set(txt_files + ${txt_files} + PARENT_SCOPE + ) diff --git a/examples/java/surfPlugin/Receiver.java b/examples/java/surfPlugin/Receiver.java new file mode 100644 index 0000000000..8d8158f8a6 --- /dev/null +++ b/examples/java/surfPlugin/Receiver.java @@ -0,0 +1,36 @@ +/* Copyright (c) 2006-2014. The SimGrid Team. + * All rights reserved. */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ + +package surfPlugin; +import org.simgrid.msg.Host; +import org.simgrid.msg.Msg; +import org.simgrid.msg.MsgException; +import org.simgrid.msg.Task; +import org.simgrid.msg.Process; + +public class Receiver extends Process { + public Receiver(Host host, String name, String[]args) { + super(host,name,args); + } + final double commSizeLat = 1; + final double commSizeBw = 100000000; + + public void main(String[] args) throws MsgException { + + Msg.info("helloo!"); + double communicationTime=0; + + Msg.info("try to get a task"); + + Task task = Task.receive(getHost().getName()); + double timeGot = Msg.getClock(); + + Msg.info("Got at time "+ timeGot); + task.execute(); + + Msg.info("goodbye!"); + } +} diff --git a/examples/java/surfPlugin/Sender.java b/examples/java/surfPlugin/Sender.java new file mode 100644 index 0000000000..2f4a38268f --- /dev/null +++ b/examples/java/surfPlugin/Sender.java @@ -0,0 +1,55 @@ +/* Copyright (c) 2006-2014. The SimGrid Team. + * All rights reserved. */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ + +package surfPlugin; +import org.simgrid.msg.Host; +import org.simgrid.msg.HostNotFoundException; +import org.simgrid.msg.Msg; +import org.simgrid.msg.MsgException; +import org.simgrid.msg.Process; +import org.simgrid.msg.Task; + +public class Sender extends Process { + public Sender(Host host, String name, String[] args) { + super(host,name,args); + } + private final double commSizeLat = 1; + final double commSizeBw = 100000000; + + public void main(String[] args) throws MsgException { + + Msg.info("helloo!"); + + int hostCount = args.length; + + Msg.info("host count: " + hostCount); + String mailboxes[] = new String[hostCount]; + double time; + double computeDuration = 10000; + Task task; + + for(int pos = 0; pos < args.length ; pos++) { + try { + mailboxes[pos] = Host.getByName(args[pos]).getName(); + } catch (HostNotFoundException e) { + Msg.info("Invalid deployment file: " + e.toString()); + System.exit(1); + } + } + + for (int pos = 0; pos < hostCount; pos++) { + time = Msg.getClock(); + + Msg.info("sender time: " + time); + + task = new Task("no name",computeDuration,commSizeLat); + + task.send(mailboxes[pos]); + } + + Msg.info("goodbye!"); + } +} diff --git a/examples/java/surfPlugin/TestPlugin.java b/examples/java/surfPlugin/TestPlugin.java new file mode 100644 index 0000000000..a4b334c7c9 --- /dev/null +++ b/examples/java/surfPlugin/TestPlugin.java @@ -0,0 +1,36 @@ +/* Copyright (c) 2006-2014. The SimGrid Team. + * All rights reserved. */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ + +package surfPlugin; +import org.simgrid.msg.Msg; +import org.simgrid.msg.NativeException; +import org.simgrid.surf.Surf; +import org.simgrid.surf.Cpu; + +public class TestPlugin { + + /* This only contains the launcher. If you do nothing more than than you can run + * java simgrid.msg.Msg + * which also contains such a launcher + */ + static TracePlugin tp = new TracePlugin(); + + public static void main(String[] args) throws NativeException { + /* initialize the MSG simulation. Must be done before anything else (even logging). */ + Msg.init(args); + if(args.length < 2) { + Msg.info("Usage : TestPlugin platform_file deployment_file"); + Msg.info("example : TestPlugin ping_pong_platform.xml ping_pong_deployment.xml"); + System.exit(1); + } + + /* construct the platform and deploy the application */ + Msg.createEnvironment(args[0]); + Msg.deployApplication(args[1]); + /* execute the simulation. */ + Msg.run(); + } +} diff --git a/examples/java/surfPlugin/TracePlugin.java b/examples/java/surfPlugin/TracePlugin.java new file mode 100644 index 0000000000..6de18235e8 --- /dev/null +++ b/examples/java/surfPlugin/TracePlugin.java @@ -0,0 +1,53 @@ +package surfPlugin; + +import org.simgrid.surf.*; +import org.simgrid.msg.Msg; +import java.util.HashMap; + +public class TracePlugin extends Plugin { + + public TracePlugin() { + activateCpuCreatedCallback(); + activateCpuDestructedCallback(); + activateCpuStateChangedCallback(); + activateCpuActionStateChangedCallback(); + + activateNetworkLinkCreatedCallback(); + activateNetworkLinkDestructedCallback(); + activateNetworkLinkStateChangedCallback(); + activateNetworkActionStateChangedCallback(); + } + + public void cpuCreatedCallback(Cpu cpu) { + Msg.info("Trace: Cpu created "+cpu.getName()); + } + + public void cpuDestructedCallback(Cpu cpu) { + Msg.info("Trace: Cpu destructed "+cpu.getName()); + } + + public void cpuStateChangedCallback(Cpu cpu){ + Msg.info("Trace: Cpu state changed "+cpu.getName()); + } + + public void cpuActionStateChangedCallback(CpuAction action){ + Msg.info("Trace: CpuAction state changed "+action.getModel().getName()); + } + + public void networkLinkCreatedCallback(NetworkLink link) { + Msg.info("Trace: NetworkLink created "+link.getName()); + } + + public void networkLinkDestructedCallback(NetworkLink link) { + Msg.info("Trace: NetworkLink destructed "+link.getName()); + } + + public void networkLinkStateChangedCallback(NetworkLink link){ + Msg.info("Trace: NetworkLink state changed "+link.getName()); + } + + public void networkActionStateChangedCallback(NetworkAction action){ + Msg.info("Trace: NetworkAction state changed "+action.getModel().getName()); + } + +} diff --git a/examples/java/surfPlugin/surfPluginDeployment.xml b/examples/java/surfPlugin/surfPluginDeployment.xml new file mode 100644 index 0000000000..9101480bb0 --- /dev/null +++ b/examples/java/surfPlugin/surfPluginDeployment.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/examples/java/surfPlugin/surfPluginPlatform.xml b/examples/java/surfPlugin/surfPluginPlatform.xml new file mode 100644 index 0000000000..be9a6e1bf0 --- /dev/null +++ b/examples/java/surfPlugin/surfPluginPlatform.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/examples/java/surfPlugin/surf_plugin.tesh b/examples/java/surfPlugin/surf_plugin.tesh new file mode 100644 index 0000000000..a369378b15 --- /dev/null +++ b/examples/java/surfPlugin/surf_plugin.tesh @@ -0,0 +1,27 @@ +#! tesh + +$ java -classpath ${classpath:=.} surfPlugin/TestPlugin ${srcdir:=.}/surfPlugin/surfPluginPlatform.xml ${srcdir:=.}/surfPlugin/surfPluginDeployment.xml +> [0.000000] [jmsg/INFO] Using regular java threads. Coroutines could speed your simulation up. +> [0.000000] [jmsg/INFO] Trace: NetworkLink created __loopback__ +> [0.000000] [jmsg/INFO] Trace: NetworkLink state changed __loopback__ +> [0.000000] [jmsg/INFO] Trace: Cpu created Jacquelin +> [0.000000] [jmsg/INFO] Trace: Cpu state changed Jacquelin +> [0.000000] [jmsg/INFO] Trace: Cpu created Boivin +> [0.000000] [jmsg/INFO] Trace: Cpu state changed Boivin +> [0.000000] [jmsg/INFO] Trace: NetworkLink created link +> [0.000000] [jmsg/INFO] Trace: NetworkLink state changed link +> [Jacquelin:surfPlugin.Sender:(1) 0.000000] [jmsg/INFO] helloo! +> [Jacquelin:surfPlugin.Sender:(1) 0.000000] [jmsg/INFO] host count: 1 +> [Jacquelin:surfPlugin.Sender:(1) 0.000000] [jmsg/INFO] sender time: 0.0 +> [Boivin:surfPlugin.Receiver:(2) 0.000000] [jmsg/INFO] helloo! +> [Boivin:surfPlugin.Receiver:(2) 0.000000] [jmsg/INFO] try to get a task +> [1.301001] [jmsg/INFO] Trace: NetworkAction state changed network +> [Boivin:surfPlugin.Receiver:(2) 1.301001] [jmsg/INFO] Got at time 1.3010010824742269 +> [Jacquelin:surfPlugin.Sender:(1) 1.301001] [jmsg/INFO] goodbye! +> [1.301103] [jmsg/INFO] Trace: CpuAction state changed cpu +> [Boivin:surfPlugin.Receiver:(2) 1.301103] [jmsg/INFO] goodbye! +> [1.301103] [jmsg/INFO] MSG_main finished; Cleaning up the simulation... +> [1.301103] [jmsg/INFO] Trace: Cpu destructed Jacquelin +> [1.301103] [jmsg/INFO] Trace: Cpu destructed Boivin +> [1.301103] [jmsg/INFO] Trace: NetworkLink destructed link +> [1.301103] [jmsg/INFO] Trace: NetworkLink destructed __loopback__ diff --git a/examples/msg/io/file.c b/examples/msg/io/file.c index 1da705b30e..fdc8a30ad2 100644 --- a/examples/msg/io/file.c +++ b/examples/msg/io/file.c @@ -15,10 +15,10 @@ * - io/file.c Example with the disk resource */ -#define FILENAME1 "./doc/simgrid/examples/platforms/g5k.xml" -#define FILENAME2 ".\\Windows\\setupact.log" -#define FILENAME3 "./doc/simgrid/examples/platforms/g5k_cabinets.xml" -#define FILENAME4 "./doc/simgrid/examples/platforms/nancy.xml" +#define FILENAME1 "/home/doc/simgrid/examples/platforms/g5k.xml" +#define FILENAME2 "c:\\Windows\\setupact.log" +#define FILENAME3 "/home/doc/simgrid/examples/platforms/g5k_cabinets.xml" +#define FILENAME4 "/home/doc/simgrid/examples/platforms/nancy.xml" #include #include @@ -33,38 +33,36 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(io_file, int host(int argc, char *argv[]) { msg_file_t file = NULL; - char* mount = xbt_strdup("/home"); sg_size_t read,write; if(!strcmp(MSG_process_get_name(MSG_process_self()),"0")){ - file = MSG_file_open(mount,FILENAME1, NULL); + file = MSG_file_open(FILENAME1, NULL); MSG_file_dump(file); } else if(!strcmp(MSG_process_get_name(MSG_process_self()),"1")) { - free(mount); - mount = xbt_strdup("/windows"); - file = MSG_file_open(mount,FILENAME2, NULL); + file = MSG_file_open(FILENAME2, NULL); } else if(!strcmp(MSG_process_get_name(MSG_process_self()),"2")){ - file = MSG_file_open(mount,FILENAME3, NULL); + file = MSG_file_open(FILENAME3, NULL); } else if(!strcmp(MSG_process_get_name(MSG_process_self()),"3")) - file = MSG_file_open(mount,FILENAME4, NULL); + file = MSG_file_open(FILENAME4, NULL); else xbt_die("FILENAME NOT DEFINED %s",MSG_process_get_name(MSG_process_self())); - XBT_INFO("\tOpen file '%s'",file->fullname); + const char* filename = MSG_file_get_name(file); + XBT_INFO("\tOpen file '%s'",filename); read = MSG_file_read(file, 10000000); // Read for 10MB - XBT_INFO("\tHave read %llu on %s",read,file->fullname); + XBT_INFO("\tHave read %llu on %s",read,filename); write = MSG_file_write(file, 100000); // Write for 100KB - XBT_INFO("\tHave written %llu on %s",write,file->fullname); + XBT_INFO("\tHave written %llu on %s",write,filename); read = MSG_file_read(file, 110000); // Read for 110KB - XBT_INFO("\tHave read %llu on %s (of size %llu)",read,file->fullname, + XBT_INFO("\tHave read %llu on %s (of size %llu)",read,filename, MSG_file_get_size(file)); - XBT_INFO("\tClose file '%s'",file->fullname); + XBT_INFO("\tClose file '%s'",filename); MSG_file_close(file); - free(mount); + return 0; } diff --git a/examples/msg/io/file_unlink.c b/examples/msg/io/file_unlink.c index 49f05232ed..66db92728f 100644 --- a/examples/msg/io/file_unlink.c +++ b/examples/msg/io/file_unlink.c @@ -15,7 +15,7 @@ * - io/file.c Example with the disk resource */ -#define FILENAME1 "./doc/simgrid/examples/platforms/g5k.xml" +#define FILENAME1 "/home/doc/simgrid/examples/platforms/g5k.xml" #include #include @@ -30,59 +30,56 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(io_file, int host(int argc, char *argv[]) { msg_file_t file = NULL; - char* mount = xbt_strdup("/home"); sg_size_t write; // First open XBT_INFO("\tOpen file '%s'",FILENAME1); - file = MSG_file_open(mount,FILENAME1, NULL); + file = MSG_file_open(FILENAME1, NULL); // Unlink the file - XBT_INFO("\tUnlink file '%s'",file->fullname); + XBT_INFO("\tUnlink file '%s'",MSG_file_get_name(file)); MSG_file_unlink(file); // Re Open the file wich is in fact created XBT_INFO("\tOpen file '%s'",FILENAME1); - file = MSG_file_open(mount,FILENAME1, NULL); + file = MSG_file_open(FILENAME1, NULL); // Write into the new file write = MSG_file_write(file,100000); // Write for 100Ko - XBT_INFO("\tHave written %llu on %s",write,file->fullname); + XBT_INFO("\tHave written %llu on %s",write,MSG_file_get_name(file)); // Close the file - XBT_INFO("\tClose file '%s'",file->fullname); + XBT_INFO("\tClose file '%s'",MSG_file_get_name(file)); MSG_file_close(file); - xbt_dict_t dict_ls; - char* key; - surf_stat_t data = NULL; - xbt_dict_cursor_t cursor = NULL; - - dict_ls = MSG_file_ls(mount,"./"); - XBT_INFO(" ");XBT_INFO("ls ./"); - xbt_dict_foreach(dict_ls,cursor,key,data){ - if(data) XBT_INFO("FILE : %s",key); - else XBT_INFO("DIR : %s",key); - } - xbt_dict_free(&dict_ls); - - dict_ls = MSG_file_ls(mount,"./doc/simgrid/examples/platforms/"); - XBT_INFO(" ");XBT_INFO("ls ./doc/simgrid/examples/platforms/"); - xbt_dict_foreach(dict_ls,cursor,key,data){ - if(data) XBT_INFO("FILE : %s",key); - else XBT_INFO("DIR : %s",key); - } - xbt_dict_free(&dict_ls); - - dict_ls = MSG_file_ls(mount,"./doc/simgrid/examples/msg/"); - XBT_INFO(" ");XBT_INFO("ls ./doc/simgrid/examples/msg/"); - xbt_dict_foreach(dict_ls,cursor,key,data){ - if(data) XBT_INFO("FILE : %s",key); - else XBT_INFO("DIR : %s",key); - } - xbt_dict_free(&dict_ls); - - free(mount); +// xbt_dict_t dict_ls; +// char* key; +// surf_stat_t data = NULL; +// xbt_dict_cursor_t cursor = NULL; +// +// dict_ls = MSG_file_ls(mount,"./"); +// XBT_INFO(" ");XBT_INFO("ls ./"); +// xbt_dict_foreach(dict_ls,cursor,key,data){ +// if(data) XBT_INFO("FILE : %s",key); +// else XBT_INFO("DIR : %s",key); +// } +// xbt_dict_free(&dict_ls); +// +// dict_ls = MSG_file_ls(mount,"./doc/simgrid/examples/platforms/"); +// XBT_INFO(" ");XBT_INFO("ls ./doc/simgrid/examples/platforms/"); +// xbt_dict_foreach(dict_ls,cursor,key,data){ +// if(data) XBT_INFO("FILE : %s",key); +// else XBT_INFO("DIR : %s",key); +// } +// xbt_dict_free(&dict_ls); +// +// dict_ls = MSG_file_ls(mount,"./doc/simgrid/examples/msg/"); +// XBT_INFO(" ");XBT_INFO("ls ./doc/simgrid/examples/msg/"); +// xbt_dict_foreach(dict_ls,cursor,key,data){ +// if(data) XBT_INFO("FILE : %s",key); +// else XBT_INFO("DIR : %s",key); +// } +// xbt_dict_free(&dict_ls); return 0; } diff --git a/examples/msg/io/io.tesh b/examples/msg/io/io.tesh index e612c10a90..9013c6e5fa 100644 --- a/examples/msg/io/io.tesh +++ b/examples/msg/io/io.tesh @@ -2,56 +2,40 @@ $ ${bindir:=.}/io/file ${srcdir:=.}/examples/platforms/storage.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" > [ 0.000000] (0:@) Number of host '4' -> [ 0.000000] (2:1@alice) Open file '.\Windows\setupact.log' -> [ 0.000000] (3:2@carl) Open file './doc/simgrid/examples/platforms/g5k_cabinets.xml' -> [ 0.000000] (4:3@bob) Open file './doc/simgrid/examples/platforms/nancy.xml' +> [ 0.000000] (2:1@alice) Open file 'c:\Windows\setupact.log' +> [ 0.000000] (3:2@carl) Open file '/home/doc/simgrid/examples/platforms/g5k_cabinets.xml' +> [ 0.000000] (4:3@bob) Open file '/home/doc/simgrid/examples/platforms/nancy.xml' > [ 0.000000] (1:0@denise) File Descriptor information: -> Full name: './doc/simgrid/examples/platforms/g5k.xml' +> Full path: '/home/doc/simgrid/examples/platforms/g5k.xml' > Size: 17028 > Mount point: '/home' > Storage Id: 'Disk4' > Storage Type: 'single_SSD' > Content Type: 'txt_unix' -> [ 0.000000] (1:0@denise) Open file './doc/simgrid/examples/platforms/g5k.xml' -> [ 0.000040] (4:3@bob) Have read 4028 on ./doc/simgrid/examples/platforms/nancy.xml -> [ 0.000085] (1:0@denise) Have read 17028 on ./doc/simgrid/examples/platforms/g5k.xml -> [ 0.000226] (3:2@carl) Have read 22645 on ./doc/simgrid/examples/platforms/g5k_cabinets.xml -> [ 0.000508] (2:1@alice) Have read 101663 on .\Windows\setupact.log -> [ 0.001752] (1:0@denise) Have written 100000 on ./doc/simgrid/examples/platforms/g5k.xml -> [ 0.002175] (2:1@alice) Have written 100000 on .\Windows\setupact.log -> [ 0.002439] (1:0@denise) Have read 110000 on ./doc/simgrid/examples/platforms/g5k.xml (of size 117026) -> [ 0.002439] (1:0@denise) Close file './doc/simgrid/examples/platforms/g5k.xml' -> [ 0.002862] (2:1@alice) Have read 110000 on .\Windows\setupact.log (of size 201662) -> [ 0.002862] (2:1@alice) Close file '.\Windows\setupact.log' -> [ 0.003374] (4:3@bob) Have written 100000 on ./doc/simgrid/examples/platforms/nancy.xml -> [ 0.003560] (3:2@carl) Have written 100000 on ./doc/simgrid/examples/platforms/g5k_cabinets.xml -> [ 0.004529] (4:3@bob) Have read 104023 on ./doc/simgrid/examples/platforms/nancy.xml (of size 104023) -> [ 0.004529] (4:3@bob) Close file './doc/simgrid/examples/platforms/nancy.xml' -> [ 0.004782] (3:2@carl) Have read 110000 on ./doc/simgrid/examples/platforms/g5k_cabinets.xml (of size 122641) -> [ 0.004782] (3:2@carl) Close file './doc/simgrid/examples/platforms/g5k_cabinets.xml' +> [ 0.000000] (1:0@denise) Open file '/home/doc/simgrid/examples/platforms/g5k.xml' +> [ 0.000040] (4:3@bob) Have read 4028 on /home/doc/simgrid/examples/platforms/nancy.xml +> [ 0.000085] (1:0@denise) Have read 17028 on /home/doc/simgrid/examples/platforms/g5k.xml +> [ 0.000226] (3:2@carl) Have read 22645 on /home/doc/simgrid/examples/platforms/g5k_cabinets.xml +> [ 0.000508] (2:1@alice) Have read 101663 on c:\Windows\setupact.log +> [ 0.001752] (1:0@denise) Have written 100000 on /home/doc/simgrid/examples/platforms/g5k.xml +> [ 0.002175] (2:1@alice) Have written 100000 on c:\Windows\setupact.log +> [ 0.002439] (1:0@denise) Have read 110000 on /home/doc/simgrid/examples/platforms/g5k.xml (of size 117026) +> [ 0.002439] (1:0@denise) Close file '/home/doc/simgrid/examples/platforms/g5k.xml' +> [ 0.002862] (2:1@alice) Have read 110000 on c:\Windows\setupact.log (of size 201662) +> [ 0.002862] (2:1@alice) Close file 'c:\Windows\setupact.log' +> [ 0.003374] (4:3@bob) Have written 100000 on /home/doc/simgrid/examples/platforms/nancy.xml +> [ 0.003560] (3:2@carl) Have written 100000 on /home/doc/simgrid/examples/platforms/g5k_cabinets.xml +> [ 0.004529] (4:3@bob) Have read 104023 on /home/doc/simgrid/examples/platforms/nancy.xml (of size 104023) +> [ 0.004529] (4:3@bob) Close file '/home/doc/simgrid/examples/platforms/nancy.xml' +> [ 0.004782] (3:2@carl) Have read 110000 on /home/doc/simgrid/examples/platforms/g5k_cabinets.xml (of size 122641) +> [ 0.004782] (3:2@carl) Close file '/home/doc/simgrid/examples/platforms/g5k_cabinets.xml' > [ 0.004782] (0:@) Simulation time 0.00478201 $ ${bindir:=.}/io/file_unlink ${srcdir:=.}/examples/platforms/storage.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" > [ 0.000000] (0:@) Number of host '4' -> [ 0.000000] (1:0@denise) Open file './doc/simgrid/examples/platforms/g5k.xml' -> [ 0.000000] (1:0@denise) Unlink file './doc/simgrid/examples/platforms/g5k.xml' -> [ 0.000000] (1:0@denise) Open file './doc/simgrid/examples/platforms/g5k.xml' -> [ 0.001667] (1:0@denise) Have written 100000 on ./doc/simgrid/examples/platforms/g5k.xml -> [ 0.001667] (1:0@denise) Close file './doc/simgrid/examples/platforms/g5k.xml' -> [ 0.001667] (1:0@denise) -> [ 0.001667] (1:0@denise) ls ./ -> [ 0.001667] (1:0@denise) DIR : include -> [ 0.001667] (1:0@denise) DIR : lib -> [ 0.001667] (1:0@denise) DIR : bin -> [ 0.001667] (1:0@denise) DIR : doc -> [ 0.001667] (1:0@denise) -> [ 0.001667] (1:0@denise) ls ./doc/simgrid/examples/platforms/ -> [ 0.001667] (1:0@denise) FILE : g5k.xml -> [ 0.001667] (1:0@denise) -> [ 0.001667] (1:0@denise) ls ./doc/simgrid/examples/msg/ -> [ 0.001667] (1:0@denise) DIR : alias -> [ 0.001667] (1:0@denise) DIR : trace -> [ 0.001667] (1:0@denise) FILE : README -> [ 0.001667] (1:0@denise) DIR : parallel_task -> [ 0.001667] (1:0@denise) DIR : icomms -> [ 0.001667] (0:@) Simulation time 0.00166667 \ No newline at end of file +> [ 0.000000] (1:0@denise) Open file '/home/doc/simgrid/examples/platforms/g5k.xml' +> [ 0.000000] (1:0@denise) Unlink file '/home/doc/simgrid/examples/platforms/g5k.xml' +> [ 0.000000] (1:0@denise) Open file '/home/doc/simgrid/examples/platforms/g5k.xml' +> [ 0.001667] (1:0@denise) Have written 100000 on /home/doc/simgrid/examples/platforms/g5k.xml +> [ 0.001667] (1:0@denise) Close file '/home/doc/simgrid/examples/platforms/g5k.xml' +> [ 0.001667] (0:@) Simulation time 0.00166667 diff --git a/examples/msg/io/storage.c b/examples/msg/io/storage.c index e2778d0e55..66a1fd4d9d 100644 --- a/examples/msg/io/storage.c +++ b/examples/msg/io/storage.c @@ -36,7 +36,7 @@ static int host(int argc, char *argv[]){ msg_storage_t storage; // Retrieve all mount points of current host - xbt_dict_t storage_list = MSG_host_get_storage_list(MSG_host_self()); + xbt_dict_t storage_list = MSG_host_get_mounted_storage_list(MSG_host_self()); xbt_dict_foreach(storage_list,cursor,mount_name,storage_name) { // For each disk mounted on host @@ -56,14 +56,12 @@ static int host(int argc, char *argv[]){ // Create a 200,000 bytes file named './tmp/data.txt' on /sd1 - - char* mount = xbt_strdup("/home"); - char* file_name = xbt_strdup("./tmp/data.txt"); + char* file_name = xbt_strdup("/home/tmp/data.txt"); msg_file_t file = NULL; sg_size_t write, read, file_size; // Open an non-existing file amounts to create it! - file = MSG_file_open(mount, file_name, NULL); + file = MSG_file_open(file_name, NULL); write = MSG_file_write(file, 200000); // Write 200,000 bytes XBT_INFO("Create a %llu bytes file named '%s' on /sd1", write, file_name); MSG_file_dump(file); @@ -84,15 +82,14 @@ static int host(int argc, char *argv[]){ MSG_file_dump(file); MSG_file_close(file); - free(mount); free(file_name); storage_name = xbt_strdup("Disk4"); storage = MSG_storage_get_by_name(storage_name); // Now rename file from ./tmp/data.txt to ./tmp/simgrid.readme - XBT_INFO("*** Renaming './tmp/data.txt' into './tmp/simgrid.readme'"); - MSG_storage_file_rename(storage, "./tmp/data.txt", "./tmp/simgrid.readme"); + XBT_INFO("*** Renaming '/tmp/data.txt' into '/tmp/simgrid.readme'"); + MSG_storage_file_rename(storage, "/tmp/data.txt", "/tmp/simgrid.readme"); // Now attach some user data to disk1 XBT_INFO("*** Get/set data for storage element: %s ***",storage_name); @@ -101,9 +98,10 @@ static int host(int argc, char *argv[]){ XBT_INFO("Get data: '%s'", data); - MSG_storage_set_data(storage,strdup("Some user data")); + MSG_storage_set_data(storage, xbt_strdup("Some user data")); data = MSG_storage_get_data(storage); XBT_INFO("Set and get data: '%s'", data); + xbt_free(data); xbt_free(storage_name); diff --git a/examples/msg/io/storage.tesh b/examples/msg/io/storage.tesh index 3cd10b53d9..e0e74b2754 100644 --- a/examples/msg/io/storage.tesh +++ b/examples/msg/io/storage.tesh @@ -1,106 +1,106 @@ #! ./tesh -$ ${bindir:=.}/io/storage ${srcdir:=.}/examples/platforms/storage.xml "--log=root.fmt:[%8.6r]%e(%i@%h)%e%m%n" -> [0.000000] (1@denise) *** Storage info on denise *** -> [0.000000] (1@denise) Storage name: Disk4, mount name: /home -> [0.000000] (1@denise) Total size: 536870912000 bytes -> [0.000000] (1@denise) Free size: 536857690006 bytes -> [0.000000] (1@denise) Used size: 13221994 bytes -> [0.000000] (1@denise) Storage name: Disk2, mount name: /windows -> [0.000000] (1@denise) Total size: 536870912000 bytes -> [0.000000] (1@denise) Free size: 534479374867 bytes -> [0.000000] (1@denise) Used size: 2391537133 bytes -> [0.003333] (1@denise) Create a 200000 bytes file named './tmp/data.txt' on /sd1 -> [0.003333] (1@denise) File Descriptor information: -> Full name: './tmp/data.txt' +$ ${bindir:=.}/io/storage ${srcdir:=.}/examples/platforms/storage.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" +> [ 0.000000] (1:(null)@denise) *** Storage info on denise *** +> [ 0.000000] (1:(null)@denise) Storage name: Disk2, mount name: c: +> [ 0.000000] (1:(null)@denise) Total size: 536870912000 bytes +> [ 0.000000] (1:(null)@denise) Free size: 534479374867 bytes +> [ 0.000000] (1:(null)@denise) Used size: 2391537133 bytes +> [ 0.000000] (1:(null)@denise) Storage name: Disk4, mount name: /home +> [ 0.000000] (1:(null)@denise) Total size: 536870912000 bytes +> [ 0.000000] (1:(null)@denise) Free size: 536857690006 bytes +> [ 0.000000] (1:(null)@denise) Used size: 13221994 bytes +> [ 0.003333] (1:(null)@denise) Create a 200000 bytes file named '/home/tmp/data.txt' on /sd1 +> [ 0.003333] (1:(null)@denise) File Descriptor information: +> Full path: '/home/tmp/data.txt' > Size: 200000 > Mount point: '/home' > Storage Id: 'Disk4' > Storage Type: 'single_SSD' > Content Type: 'txt_unix' -> [0.003333] (1@denise) Free size: 536857490006 bytes -> [0.003333] (1@denise) Used size: 13421994 bytes -> [0.004583] (1@denise) Read 200000 bytes on ./tmp/data.txt -> [0.007917] (1@denise) Write 100000 bytes on ./tmp/data.txt -> [0.007917] (1@denise) File Descriptor information: -> Full name: './tmp/data.txt' +> [ 0.003333] (1:(null)@denise) Free size: 536857490006 bytes +> [ 0.003333] (1:(null)@denise) Used size: 13421994 bytes +> [ 0.004583] (1:(null)@denise) Read 200000 bytes on /home/tmp/data.txt +> [ 0.007917] (1:(null)@denise) Write 100000 bytes on /home/tmp/data.txt +> [ 0.007917] (1:(null)@denise) File Descriptor information: +> Full path: '/home/tmp/data.txt' > Size: 300000 > Mount point: '/home' > Storage Id: 'Disk4' > Storage Type: 'single_SSD' > Content Type: 'txt_unix' -> [0.007917] (1@denise) *** Renaming './tmp/data.txt' into './tmp/simgrid.readme' -> [0.007917] (1@denise) *** Get/set data for storage element: Disk4 *** -> [0.007917] (1@denise) Get data: '(null)' -> [0.007917] (1@denise) Set and get data: 'Some user data' -> [0.007917] (1@denise) *** Dump content of denise *** -> [0.007917] (1@denise) Print the content of mount point: /home -> [0.007917] (1@denise) ./doc/simgrid/examples/platforms/g5k.xml size: 17028 bytes -> [0.007917] (1@denise) ./include/surf/simgrid_dtd.h size: 23583 bytes -> [0.007917] (1@denise) ./bin/smpicc size: 918 bytes -> [0.007917] (1@denise) ./doc/simgrid/examples/smpi/mc_bugged2.c size: 1387 bytes -> [0.007917] (1@denise) ./include/simdag/simdag.h size: 10325 bytes -> [0.007917] (1@denise) ./doc/simgrid/examples/smpi/NAS/sys/README size: 1461 bytes -> [0.007917] (1@denise) ./tmp/simgrid.readme size: 300000 bytes -> [0.007917] (1@denise) ./doc/simgrid/examples/smpi/NAS/common/randdp.c size: 1441 bytes -> [0.007917] (1@denise) ./include/msg/datatypes.h size: 4635 bytes -> [0.007917] (1@denise) ./doc/simgrid/examples/smpi/NAS/EP/randlc.c size: 3300 bytes -> [0.007917] (1@denise) ./doc/simgrid/examples/msg/parallel_task/test_ptask_deployment.xml size: 654 bytes -> [0.007917] (1@denise) ./doc/simgrid/examples/msg/icomms/small_platform.xml size: 972 bytes -> [0.007917] (1@denise) ./doc/simgrid/examples/msg/trace/test9.xml size: 598 bytes -> [0.007917] (1@denise) ./include/simix/simix.h size: 13003 bytes -> [0.007917] (1@denise) ./include/mc/modelchecker.h size: 96 bytes -> [0.007917] (1@denise) ./doc/simgrid/examples/msg/README size: 4805 bytes -> [0.007917] (1@denise) ./doc/simgrid/examples/smpi/NAS/README size: 1857 bytes -> [0.007917] (1@denise) ./include/instr/instr.h size: 5750 bytes -> [0.007917] (1@denise) ./doc/simgrid/html/group__XBT__str.html size: 36192 bytes -> [0.007917] (1@denise) ./doc/simgrid/examples/smpi/NAS/EP/README size: 347 bytes -> [0.007917] (1@denise) ./bin/tesh size: 356434 bytes -> [0.007917] (1@denise) ./doc/simgrid/examples/smpi/NAS/DT/README size: 999 bytes -> [0.007917] (1@denise) ./doc/simgrid/examples/smpi/NAS/FT/README size: 276 bytes -> [0.007917] (1@denise) ./lib/libsimgrid.so.3.6.2 size: 12710497 bytes -> [0.007917] (1@denise) ./doc/simgrid/examples/xbt/sem_basic.c size: 1970 bytes -> [0.007917] (1@denise) ./doc/simgrid/examples/msg/alias/masterslave_forwarder_with_alias.c size: 6217 bytes -> [0.007917] (1@denise) ./doc/simgrid/examples/smpi/NAS/SP/README size: 926 bytes -> [0.007917] (1@denise) ./include/xbt/fifo.h size: 3626 bytes -> [0.007917] (1@denise) ./doc/simgrid/examples/smpi/NAS/MPI_dummy/README size: 2406 bytes -> [0.007917] (1@denise) ./doc/simgrid/examples/smpi/NAS/MG/README size: 5465 bytes -> [0.007917] (1@denise) ./include/smpi/mpif.h size: 4826 bytes -> [0.007917] (1@denise) Print the content of mount point: /windows -> [0.007917] (1@denise) .\Windows\dcmdev64.exe size: 93288 bytes -> [0.007917] (1@denise) .\Windows\WLXPGSS.SCR size: 322048 bytes -> [0.007917] (1@denise) .\Windows\twain_32.dll size: 50176 bytes -> [0.007917] (1@denise) .\Windows\bootstat.dat size: 67584 bytes -> [0.007917] (1@denise) .\Windows\avastSS.scr size: 41664 bytes -> [0.007917] (1@denise) .\Windows\font1.sii size: 4907 bytes -> [0.007917] (1@denise) .\Windows\write.exe size: 10752 bytes -> [0.007917] (1@denise) .\Windows\font2.sii size: 8698 bytes -> [0.007917] (1@denise) .\Windows\DtcInstall.log size: 1955 bytes -> [0.007917] (1@denise) .\Windows\vmgcoinstall.log size: 1585 bytes -> [0.007917] (1@denise) .\Windows\_isusr32.dll size: 180320 bytes -> [0.007917] (1@denise) .\Windows\winhlp32.exe size: 10752 bytes -> [0.007917] (1@denise) .\Windows\setuperr.log size: 0 bytes -> [0.007917] (1@denise) .\Windows\system.ini size: 219 bytes -> [0.007917] (1@denise) .\Windows\hapint.exe size: 382056 bytes -> [0.007917] (1@denise) .\Windows\Professional.xml size: 31881 bytes -> [0.007917] (1@denise) .\Windows\setupact.log size: 101663 bytes -> [0.007917] (1@denise) .\Windows\notepad.exe size: 243712 bytes -> [0.007917] (1@denise) .\Windows\explorer.exe size: 2380944 bytes -> [0.007917] (1@denise) .\Windows\bfsvc.exe size: 75264 bytes -> [0.007917] (1@denise) .\Windows\WMSysPr9.prx size: 316640 bytes -> [0.007917] (1@denise) .\Windows\PFRO.log size: 6770 bytes -> [0.007917] (1@denise) .\Windows\csup.txt size: 12 bytes -> [0.007917] (1@denise) .\Windows\win.ini size: 92 bytes -> [0.007917] (1@denise) .\Windows\mib.bin size: 43131 bytes -> [0.007917] (1@denise) .\Windows\Starter.xml size: 31537 bytes -> [0.007917] (1@denise) .\Windows\CoreSingleLanguage.xml size: 31497 bytes -> [0.007917] (1@denise) .\Windows\regedit.exe size: 159232 bytes -> [0.007917] (1@denise) .\Windows\dchcfg64.exe size: 335464 bytes -> [0.007917] (1@denise) .\Windows\HelpPane.exe size: 883712 bytes -> [0.007917] (1@denise) .\Windows\WindowsUpdate.log size: 1518934 bytes -> [0.007917] (1@denise) .\Windows\hh.exe size: 17408 bytes -> [0.007917] (1@denise) .\Windows\DPINST.LOG size: 18944 bytes -> [0.007917] (1@denise) .\Windows\DirectX.log size: 10486 bytes -> [0.007917] (1@denise) .\Windows\splwow64.exe size: 126464 bytes -> [0.007917] (1@denise) .\Windows\MEMORY.DMP size: 2384027342 bytes -> [0.007917] (0@) Simulated time: 0.00791667 +> [ 0.007917] (1:(null)@denise) *** Renaming '/tmp/data.txt' into '/tmp/simgrid.readme' +> [ 0.007917] (1:(null)@denise) *** Get/set data for storage element: Disk4 *** +> [ 0.007917] (1:(null)@denise) Get data: '(null)' +> [ 0.007917] (1:(null)@denise) Set and get data: 'Some user data' +> [ 0.007917] (1:(null)@denise) *** Dump content of denise *** +> [ 0.007917] (1:(null)@denise) Print the content of mount point: c: +> [ 0.007917] (1:(null)@denise) \Windows\win.ini size: 92 bytes +> [ 0.007917] (1:(null)@denise) \Windows\mib.bin size: 43131 bytes +> [ 0.007917] (1:(null)@denise) \Windows\DtcInstall.log size: 1955 bytes +> [ 0.007917] (1:(null)@denise) \Windows\vmgcoinstall.log size: 1585 bytes +> [ 0.007917] (1:(null)@denise) \Windows\Starter.xml size: 31537 bytes +> [ 0.007917] (1:(null)@denise) \Windows\_isusr32.dll size: 180320 bytes +> [ 0.007917] (1:(null)@denise) \Windows\winhlp32.exe size: 10752 bytes +> [ 0.007917] (1:(null)@denise) \Windows\setuperr.log size: 0 bytes +> [ 0.007917] (1:(null)@denise) \Windows\system.ini size: 219 bytes +> [ 0.007917] (1:(null)@denise) \Windows\hapint.exe size: 382056 bytes +> [ 0.007917] (1:(null)@denise) \Windows\Professional.xml size: 31881 bytes +> [ 0.007917] (1:(null)@denise) \Windows\regedit.exe size: 159232 bytes +> [ 0.007917] (1:(null)@denise) \Windows\setupact.log size: 101663 bytes +> [ 0.007917] (1:(null)@denise) \Windows\WindowsUpdate.log size: 1518934 bytes +> [ 0.007917] (1:(null)@denise) \Windows\explorer.exe size: 2380944 bytes +> [ 0.007917] (1:(null)@denise) \Windows\DirectX.log size: 10486 bytes +> [ 0.007917] (1:(null)@denise) \Windows\WMSysPr9.prx size: 316640 bytes +> [ 0.007917] (1:(null)@denise) \Windows\PFRO.log size: 6770 bytes +> [ 0.007917] (1:(null)@denise) \Windows\csup.txt size: 12 bytes +> [ 0.007917] (1:(null)@denise) \Windows\WLXPGSS.SCR size: 322048 bytes +> [ 0.007917] (1:(null)@denise) \Windows\avastSS.scr size: 41664 bytes +> [ 0.007917] (1:(null)@denise) \Windows\font1.sii size: 4907 bytes +> [ 0.007917] (1:(null)@denise) \Windows\write.exe size: 10752 bytes +> [ 0.007917] (1:(null)@denise) \Windows\font2.sii size: 8698 bytes +> [ 0.007917] (1:(null)@denise) \Windows\CoreSingleLanguage.xml size: 31497 bytes +> [ 0.007917] (1:(null)@denise) \Windows\dchcfg64.exe size: 335464 bytes +> [ 0.007917] (1:(null)@denise) \Windows\notepad.exe size: 243712 bytes +> [ 0.007917] (1:(null)@denise) \Windows\HelpPane.exe size: 883712 bytes +> [ 0.007917] (1:(null)@denise) \Windows\hh.exe size: 17408 bytes +> [ 0.007917] (1:(null)@denise) \Windows\DPINST.LOG size: 18944 bytes +> [ 0.007917] (1:(null)@denise) \Windows\bfsvc.exe size: 75264 bytes +> [ 0.007917] (1:(null)@denise) \Windows\splwow64.exe size: 126464 bytes +> [ 0.007917] (1:(null)@denise) \Windows\MEMORY.DMP size: 2384027342 bytes +> [ 0.007917] (1:(null)@denise) \Windows\dcmdev64.exe size: 93288 bytes +> [ 0.007917] (1:(null)@denise) \Windows\twain_32.dll size: 50176 bytes +> [ 0.007917] (1:(null)@denise) \Windows\bootstat.dat size: 67584 bytes +> [ 0.007917] (1:(null)@denise) Print the content of mount point: /home +> [ 0.007917] (1:(null)@denise) /include/simix/simix.h size: 13003 bytes +> [ 0.007917] (1:(null)@denise) /include/mc/modelchecker.h size: 96 bytes +> [ 0.007917] (1:(null)@denise) /doc/simgrid/examples/msg/README size: 4805 bytes +> [ 0.007917] (1:(null)@denise) /include/instr/instr.h size: 5750 bytes +> [ 0.007917] (1:(null)@denise) /doc/simgrid/examples/smpi/mc_bugged2.c size: 1387 bytes +> [ 0.007917] (1:(null)@denise) /doc/simgrid/html/group__XBT__str.html size: 36192 bytes +> [ 0.007917] (1:(null)@denise) /doc/simgrid/examples/smpi/NAS/EP/README size: 347 bytes +> [ 0.007917] (1:(null)@denise) /doc/simgrid/examples/smpi/NAS/DT/README size: 999 bytes +> [ 0.007917] (1:(null)@denise) /doc/simgrid/examples/smpi/NAS/FT/README size: 276 bytes +> [ 0.007917] (1:(null)@denise) /lib/libsimgrid.so.3.6.2 size: 12710497 bytes +> [ 0.007917] (1:(null)@denise) /doc/simgrid/examples/smpi/NAS/sys/README size: 1461 bytes +> [ 0.007917] (1:(null)@denise) /doc/simgrid/examples/msg/alias/masterslave_forwarder_with_alias.c size: 6217 bytes +> [ 0.007917] (1:(null)@denise) /doc/simgrid/examples/smpi/NAS/SP/README size: 926 bytes +> [ 0.007917] (1:(null)@denise) /tmp/simgrid.readme size: 300000 bytes +> [ 0.007917] (1:(null)@denise) /doc/simgrid/examples/msg/parallel_task/test_ptask_deployment.xml size: 654 bytes +> [ 0.007917] (1:(null)@denise) /doc/simgrid/examples/msg/icomms/small_platform.xml size: 972 bytes +> [ 0.007917] (1:(null)@denise) /doc/simgrid/examples/smpi/NAS/MG/README size: 5465 bytes +> [ 0.007917] (1:(null)@denise) /doc/simgrid/examples/msg/trace/test9.xml size: 598 bytes +> [ 0.007917] (1:(null)@denise) /include/smpi/mpif.h size: 4826 bytes +> [ 0.007917] (1:(null)@denise) /doc/simgrid/examples/smpi/NAS/README size: 1857 bytes +> [ 0.007917] (1:(null)@denise) /bin/tesh size: 356434 bytes +> [ 0.007917] (1:(null)@denise) /include/simdag/simdag.h size: 10325 bytes +> [ 0.007917] (1:(null)@denise) /doc/simgrid/examples/xbt/sem_basic.c size: 1970 bytes +> [ 0.007917] (1:(null)@denise) /include/xbt/fifo.h size: 3626 bytes +> [ 0.007917] (1:(null)@denise) /doc/simgrid/examples/smpi/NAS/common/randdp.c size: 1441 bytes +> [ 0.007917] (1:(null)@denise) /include/msg/datatypes.h size: 4635 bytes +> [ 0.007917] (1:(null)@denise) /doc/simgrid/examples/smpi/NAS/EP/randlc.c size: 3300 bytes +> [ 0.007917] (1:(null)@denise) /doc/simgrid/examples/smpi/NAS/MPI_dummy/README size: 2406 bytes +> [ 0.007917] (1:(null)@denise) /doc/simgrid/examples/platforms/g5k.xml size: 17028 bytes +> [ 0.007917] (1:(null)@denise) /include/surf/simgrid_dtd.h size: 23583 bytes +> [ 0.007917] (1:(null)@denise) /bin/smpicc size: 918 bytes +> [ 0.007917] (0:@) Simulated time: 0.00791667 diff --git a/examples/msg/pastry/pastry.c b/examples/msg/pastry/pastry.c index 45300c774b..da3f463757 100644 --- a/examples/msg/pastry/pastry.c +++ b/examples/msg/pastry/pastry.c @@ -213,7 +213,7 @@ static void handle_task(node_t node, msg_task_t task) { /* * Try to join the ring */ - case TASK_JOIN:; + case TASK_JOIN: { int next = routing_next(node, task_data->answer_id); XBT_DEBUG("Join request from %08x forwarding to %08x", task_data->answer_id, next); type = TASK_JOIN_LAST_REPLY; @@ -240,7 +240,7 @@ static void handle_task(node_t node, msg_task_t task) { task_sent = MSG_task_create(NULL, COMP_SIZE, COMM_SIZE, req_data); MSG_task_send_with_timeout(task_sent, task_data->answer_to, timeout); break; - + } /* * Join reply from all the node touched by the join */ diff --git a/examples/msg/suspend/suspend.c b/examples/msg/suspend/suspend.c index 1ce043b7ca..b12fbf4a1e 100644 --- a/examples/msg/suspend/suspend.c +++ b/examples/msg/suspend/suspend.c @@ -12,6 +12,12 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test, "Messages specific for this msg example"); +#define SLEEP(duration) \ + if (MSG_process_sleep(duration) != MSG_OK) \ + xbt_die("What's going on??? I failed to sleep!"); \ + else \ + (void)0 + /** @addtogroup MSG_examples * * - suspend/suspend.c: Demonstrates how to suspend and resume processes using @ref MSG_process_suspend and @ref MSG_process_resume. @@ -23,6 +29,15 @@ static int lazy_guy(int argc, char *argv[]) XBT_INFO("Nobody's watching me ? Let's go to sleep."); MSG_process_suspend(MSG_process_self()); XBT_INFO("Uuuh ? Did somebody call me ?"); + + XBT_INFO("Going to sleep..."); + SLEEP(10.0); + XBT_INFO("Mmm... waking up."); + + XBT_INFO("Going to sleep one more time..."); + SLEEP(10.0); + XBT_INFO("Waking up once for all!"); + XBT_INFO("Mmmh, goodbye now."); return 0; } /* end_of_lazy_guy */ @@ -36,9 +51,26 @@ static int dream_master(int argc, char *argv[]) XBT_INFO("Let's create a lazy guy."); lazy = MSG_process_create("Lazy", lazy_guy, NULL, MSG_host_self()); XBT_INFO("Let's wait a little bit..."); - MSG_process_sleep(10.0); + SLEEP(10.0); XBT_INFO("Let's wake the lazy guy up! >:) BOOOOOUUUHHH!!!!"); MSG_process_resume(lazy); + + SLEEP(5.0); + XBT_INFO("Suspend the lazy guy while he's sleeping..."); + MSG_process_suspend(lazy); + XBT_INFO("Let him finish his siesta."); + SLEEP(10.0); + XBT_INFO("Wake up, lazy guy!"); + MSG_process_resume(lazy); + + SLEEP(5.0); + XBT_INFO("Suspend again the lazy guy while he's sleeping..."); + MSG_process_suspend(lazy); + XBT_INFO("This time, don't let him finish his siesta."); + SLEEP(2.0); + XBT_INFO("Wake up, lazy guy!"); + MSG_process_resume(lazy); + XBT_INFO("OK, goodbye now."); return 0; } /* end_of_dram_master */ diff --git a/examples/msg/suspend/suspend.tesh b/examples/msg/suspend/suspend.tesh index d6177b10d2..8a6014f7a1 100644 --- a/examples/msg/suspend/suspend.tesh +++ b/examples/msg/suspend/suspend.tesh @@ -7,8 +7,18 @@ $ $SG_TEST_EXENV suspend/suspend ${srcdir:=.}/msg_platform.xml ${srcdir:=.}/susp > [ 0.000000] (1:dream_master@Jacquelin) Let's create a lazy guy. > [ 0.000000] (1:dream_master@Jacquelin) Let's wait a little bit... > [ 0.000000] (2:Lazy@Jacquelin) Nobody's watching me ? Let's go to sleep. -> [ 10.000000] (0:@) Simulation time 10 > [ 10.000000] (1:dream_master@Jacquelin) Let's wake the lazy guy up! >:) BOOOOOUUUHHH!!!! -> [ 10.000000] (1:dream_master@Jacquelin) OK, goodbye now. > [ 10.000000] (2:Lazy@Jacquelin) Uuuh ? Did somebody call me ? -> [ 10.000000] (2:Lazy@Jacquelin) Mmmh, goodbye now. +> [ 10.000000] (2:Lazy@Jacquelin) Going to sleep... +> [ 15.000000] (1:dream_master@Jacquelin) Suspend the lazy guy while he's sleeping... +> [ 15.000000] (1:dream_master@Jacquelin) Let him finish his siesta. +> [ 25.000000] (1:dream_master@Jacquelin) Wake up, lazy guy! +> [ 25.000000] (2:Lazy@Jacquelin) Mmm... waking up. +> [ 25.000000] (2:Lazy@Jacquelin) Going to sleep one more time... +> [ 30.000000] (1:dream_master@Jacquelin) Suspend again the lazy guy while he's sleeping... +> [ 30.000000] (1:dream_master@Jacquelin) This time, don't let him finish his siesta. +> [ 32.000000] (1:dream_master@Jacquelin) Wake up, lazy guy! +> [ 32.000000] (1:dream_master@Jacquelin) OK, goodbye now. +> [ 35.000000] (0:@) Simulation time 35 +> [ 35.000000] (2:Lazy@Jacquelin) Waking up once for all! +> [ 35.000000] (2:Lazy@Jacquelin) Mmmh, goodbye now. diff --git a/examples/platforms/content/small_content.txt b/examples/platforms/content/small_content.txt index 41bab56704..80d00dd8a6 100644 --- a/examples/platforms/content/small_content.txt +++ b/examples/platforms/content/small_content.txt @@ -1,30 +1,30 @@ -./doc/simgrid/examples/platforms/g5k.xml 17028 -./doc/simgrid/examples/smpi/mc_bugged2.c 1387 -./doc/simgrid/examples/smpi/NAS/README 1857 -./doc/simgrid/examples/smpi/NAS/MPI_dummy/README 2406 -./doc/simgrid/examples/smpi/NAS/common/randdp.c 1441 -./doc/simgrid/examples/smpi/NAS/sys/README 1461 -./doc/simgrid/examples/smpi/NAS/SP/README 926 -./doc/simgrid/examples/smpi/NAS/FT/README 276 -./doc/simgrid/examples/smpi/NAS/DT/README 999 -./doc/simgrid/examples/smpi/NAS/EP/README 347 -./doc/simgrid/examples/smpi/NAS/EP/randlc.c 3300 -./doc/simgrid/examples/smpi/NAS/MG/README 5465 -./doc/simgrid/examples/xbt/sem_basic.c 1970 -./doc/simgrid/examples/msg/README 4805 -./doc/simgrid/examples/msg/icomms/small_platform.xml 972 -./doc/simgrid/examples/msg/parallel_task/test_ptask_deployment.xml 654 -./doc/simgrid/examples/msg/alias/masterslave_forwarder_with_alias.c 6217 -./doc/simgrid/examples/msg/trace/test9.xml 598 -./doc/simgrid/html/group__XBT__str.html 36192 -./include/smpi/mpif.h 4826 -./include/xbt/fifo.h 3626 -./include/msg/datatypes.h 4635 -./include/mc/modelchecker.h 96 -./include/surf/simgrid_dtd.h 23583 -./include/instr/instr.h 5750 -./include/simdag/simdag.h 10325 -./include/simix/simix.h 13003 -./lib/libsimgrid.so.3.6.2 12710497 -./bin/smpicc 918 -./bin/tesh 356434 \ No newline at end of file +/doc/simgrid/examples/platforms/g5k.xml 17028 +/doc/simgrid/examples/smpi/mc_bugged2.c 1387 +/doc/simgrid/examples/smpi/NAS/README 1857 +/doc/simgrid/examples/smpi/NAS/MPI_dummy/README 2406 +/doc/simgrid/examples/smpi/NAS/common/randdp.c 1441 +/doc/simgrid/examples/smpi/NAS/sys/README 1461 +/doc/simgrid/examples/smpi/NAS/SP/README 926 +/doc/simgrid/examples/smpi/NAS/FT/README 276 +/doc/simgrid/examples/smpi/NAS/DT/README 999 +/doc/simgrid/examples/smpi/NAS/EP/README 347 +/doc/simgrid/examples/smpi/NAS/EP/randlc.c 3300 +/doc/simgrid/examples/smpi/NAS/MG/README 5465 +/doc/simgrid/examples/xbt/sem_basic.c 1970 +/doc/simgrid/examples/msg/README 4805 +/doc/simgrid/examples/msg/icomms/small_platform.xml 972 +/doc/simgrid/examples/msg/parallel_task/test_ptask_deployment.xml 654 +/doc/simgrid/examples/msg/alias/masterslave_forwarder_with_alias.c 6217 +/doc/simgrid/examples/msg/trace/test9.xml 598 +/doc/simgrid/html/group__XBT__str.html 36192 +/include/smpi/mpif.h 4826 +/include/xbt/fifo.h 3626 +/include/msg/datatypes.h 4635 +/include/mc/modelchecker.h 96 +/include/surf/simgrid_dtd.h 23583 +/include/instr/instr.h 5750 +/include/simdag/simdag.h 10325 +/include/simix/simix.h 13003 +/lib/libsimgrid.so.3.6.2 12710497 +/bin/smpicc 918 +/bin/tesh 356434 \ No newline at end of file diff --git a/examples/platforms/content/storage_content.txt b/examples/platforms/content/storage_content.txt index b115c53fe8..8e39931056 100644 --- a/examples/platforms/content/storage_content.txt +++ b/examples/platforms/content/storage_content.txt @@ -1,499 +1,499 @@ -./doc/simgrid/examples/cxx/autoDestination/FinalizeTask.cxx 71 -./doc/simgrid/examples/cxx/autoDestination/autoDestination_deployment.xml 1262 -./doc/simgrid/examples/cxx/autoDestination/Main.cxx 148 -./doc/simgrid/examples/cxx/autoDestination/Slave.cxx 870 -./doc/simgrid/examples/cxx/autoDestination/BasicTask.cxx 65 -./doc/simgrid/examples/cxx/autoDestination/Master.cxx 1891 -./doc/simgrid/examples/cxx/autoDestination/autoDestination_platform.xml 2133932 -./doc/simgrid/examples/cxx/autoDestination/Forwarder.cxx 1137 -./doc/simgrid/explicitDestination/FinalizeTask.cxx 71 -./doc/simgrid/examples/cxx/basic/Main.cxx 148 -./doc/simgrid/examples/cxx/basic/Slave.cxx 693 -./doc/simgrid/examples/cxx/basic/BasicTask.cxx 65 -./doc/simgrid/examples/cxx/basic/basic_platform.xml 2133932 -./doc/simgrid/examples/cxx/basic/Master.cxx 2148 -./doc/simgrid/examples/cxx/basic/basic_deployment.xml 1188 -./doc/simgrid/examples/cxx/basic/Forwarder.cxx 1244 -./doc/simgrid/examples/cxx/explicitDestination/FinalizeTask.cxx 71 -./doc/simgrid/examples/cxx/explicitDestination/Main.cxx 148 -./doc/simgrid/examples/cxx/explicitDestination/explicitDestination_platform.xml 2133932 -./doc/simgrid/examples/cxx/explicitDestination/Slave.cxx 913 -./doc/simgrid/examples/cxx/explicitDestination/BasicTask.cxx 65 -./doc/simgrid/examples/cxx/explicitDestination/explicitDestination_deployment.xml 1188 -./doc/simgrid/examples/cxx/explicitDestination/Master.cxx 1896 -./doc/simgrid/examples/cxx/explicitDestination/Forwarder.cxx 1181 -./doc/simgrid/examples/cxx/ping_pong/Main.cxx 149 -./doc/simgrid/examples/cxx/ping_pong/Sender.cxx 1073 -./doc/simgrid/examples/cxx/ping_pong/ping_pong_deployment.xml 275 -./doc/simgrid/examples/cxx/ping_pong/ping_pong_platform.xml 4718 -./doc/simgrid/examples/cxx/ping_pong/Receiver.cxx 957 -./doc/simgrid/examples/cxx/ping_pong/PingPongTask.cxx 71 -./doc/simgrid/examples/cxx/comm_time/FinalizeTask.cxx 71 -./doc/simgrid/examples/cxx/comm_time/Main.cxx 146 -./doc/simgrid/examples/cxx/comm_time/CommTimeTask.cxx 71 -./doc/simgrid/examples/cxx/comm_time/Slave.cxx 889 -./doc/simgrid/examples/cxx/comm_time/comm_time_platform.xml 2133932 -./doc/simgrid/examples/cxx/comm_time/Master.cxx 1730 -./doc/simgrid/examples/cxx/comm_time/comm_time_deployment.xml 1884 -./doc/simgrid/examples/cxx/suspend/Main.cxx 150 -./doc/simgrid/examples/cxx/suspend/suspend_platform.xml 2133932 -./doc/simgrid/examples/cxx/suspend/suspend_deployment.xml 187 -./doc/simgrid/examples/cxx/suspend/DreamMaster.cxx 826 -./doc/simgrid/examples/cxx/suspend/LazyGuy.cxx 429 -./doc/simgrid/examples/smpi/mc_bugged2.c 1387 -./doc/simgrid/examples/smpi/scatter.c 3496 -./doc/simgrid/examples/smpi/mc_bugged1.c 1411 -./doc/simgrid/examples/smpi/get_processor_name.c 649 -./doc/simgrid/examples/smpi/NAS/README 1857 -./doc/simgrid/examples/smpi/NAS/EP-sampling/README 347 -./doc/simgrid/examples/smpi/NAS/EP-sampling/randlc.c 3300 -./doc/simgrid/examples/smpi/NAS/EP-sampling/ep.c 13723 -./doc/simgrid/examples/smpi/NAS/EP-trace/README 347 -./doc/simgrid/examples/smpi/NAS/EP-trace/randlc.c 3300 -./doc/simgrid/examples/smpi/NAS/EP-trace/ep-trace.c 13850 -./doc/simgrid/examples/smpi/NAS/config/NAS.samples/README 394 -./doc/simgrid/examples/smpi/NAS/IS-trace/is-trace.c 38276 -./doc/simgrid/examples/smpi/NAS/DT-trace/README 999 -./doc/simgrid/examples/smpi/NAS/DT-trace/DGraph.c 5451 -./doc/simgrid/examples/smpi/NAS/DT-trace/dt.c 23031 -./doc/simgrid/examples/smpi/NAS/IS/is.c 38077 -./doc/simgrid/examples/smpi/NAS/MPI_dummy/README 2406 -./doc/simgrid/examples/smpi/NAS/MPI_dummy/mpi_dummy.c 5660 -./doc/simgrid/examples/smpi/NAS/MPI_dummy/wtime_sgi64.c 1700 -./doc/simgrid/examples/smpi/NAS/MPI_dummy/wtime.c 228 -./doc/simgrid/examples/smpi/NAS/common/randdp.c 1441 -./doc/simgrid/examples/smpi/NAS/common/c_timers.c 1159 -./doc/simgrid/examples/smpi/NAS/common/c_print_results.c 3086 -./doc/simgrid/examples/smpi/NAS/sys/README 1461 -./doc/simgrid/examples/smpi/NAS/sys/setparams.c 38805 -./doc/simgrid/examples/smpi/NAS/SP/README 926 -./doc/simgrid/examples/smpi/NAS/FT/README 276 -./doc/simgrid/examples/smpi/NAS/DT/README 999 -./doc/simgrid/examples/smpi/NAS/DT/DGraph.c 5451 -./doc/simgrid/examples/smpi/NAS/DT/dt.c 22620 -./doc/simgrid/examples/smpi/NAS/EP/README 347 -./doc/simgrid/examples/smpi/NAS/EP/randlc.c 3300 -./doc/simgrid/examples/smpi/NAS/EP/ep.c 13688 -./doc/simgrid/examples/smpi/NAS/DT-folding/README 999 -./doc/simgrid/examples/smpi/NAS/DT-folding/DGraph.c 5451 -./doc/simgrid/examples/smpi/NAS/DT-folding/dt.c 22704 -./doc/simgrid/examples/smpi/NAS/MG/README 5465 -./doc/simgrid/examples/smpi/bcast.c 983 -./doc/simgrid/examples/smpi/compute2.c 628 -./doc/simgrid/examples/smpi/sendrecv.c 1652 -./doc/simgrid/examples/smpi/allreduce.c 2135 -./doc/simgrid/examples/smpi/mvmul.c 7069 -./doc/simgrid/examples/smpi/alltoallv.c 4441 -./doc/simgrid/examples/smpi/smpi_traced.c 8529 -./doc/simgrid/examples/smpi/compute3.c 816 -./doc/simgrid/examples/smpi/reduce.c 3545 -./doc/simgrid/examples/smpi/bcbench.c 2466 -./doc/simgrid/examples/smpi/ttest01.c 1273 -./doc/simgrid/examples/smpi/compute.c 622 -./doc/simgrid/examples/smpi/barrier.c 766 -./doc/simgrid/examples/smpi/alltoall_basic.c 1453 -./doc/simgrid/examples/smpi/pingpong.c 2286 -./doc/simgrid/examples/smpi/alltoall2.c 2799 -./doc/simgrid/examples/smpi/split.c 705 -./doc/simgrid/examples/xbt/sem_basic.c 1970 -./doc/simgrid/examples/xbt/sem_sched.c 7207 -./doc/simgrid/examples/msg/small_platform.xml 4582 -./doc/simgrid/examples/msg/README 4805 -./doc/simgrid/examples/msg/properties/deployment_properties.xml 272 -./doc/simgrid/examples/msg/properties/msg_prop.c 3853 -./doc/simgrid/examples/msg/ns3/3links-p.xml 856 -./doc/simgrid/examples/msg/ns3/dogbone-d.xml 582 -./doc/simgrid/examples/msg/ns3/Two_clusters.xml 1817 -./doc/simgrid/examples/msg/ns3/3links-d.xml 927 -./doc/simgrid/examples/msg/ns3/3links-d-timer.xml 1280 -./doc/simgrid/examples/msg/ns3/ns3.c 5177 -./doc/simgrid/examples/msg/ns3/Two_clusters-d.xml 369 -./doc/simgrid/examples/msg/ns3/One_cluster-d.xml 367 -./doc/simgrid/examples/msg/ns3/dogbone-p.xml 1497 -./doc/simgrid/examples/msg/ns3/3hosts_2links_p.xml 566 -./doc/simgrid/examples/msg/ns3/3hosts_2links_d.xml 352 -./doc/simgrid/examples/msg/ns3/One_cluster.xml 658 -./doc/simgrid/examples/msg/migration/migration.c 2922 -./doc/simgrid/examples/msg/small_platform_with_failures.xml 4746 -./doc/simgrid/examples/msg/icomms/small_platform.xml 972 -./doc/simgrid/examples/msg/icomms/deployment_peer.xml 678 -./doc/simgrid/examples/msg/icomms/deployment_peer05.xml 891 -./doc/simgrid/examples/msg/icomms/deployment_peer02.xml 855 -./doc/simgrid/examples/msg/icomms/peer2.c 4276 -./doc/simgrid/examples/msg/icomms/deployment_peer03.xml 851 -./doc/simgrid/examples/msg/icomms/deployment_peer04.xml 852 -./doc/simgrid/examples/msg/icomms/peer.c 5102 -./doc/simgrid/examples/msg/icomms/deployment_peer01.xml 855 -./doc/simgrid/examples/msg/icomms/peer3.c 5258 -./doc/simgrid/examples/msg/parallel_task/test_ptask_deployment.xml 654 -./doc/simgrid/examples/msg/parallel_task/test_ptask.c 5423 -./doc/simgrid/examples/msg/parallel_task/test_ptask_platform.xml 2380 -./doc/simgrid/examples/msg/parallel_task/parallel_task.c 2708 -./doc/simgrid/examples/msg/alias/masterslave_forwarder_with_alias.c 6217 -./doc/simgrid/examples/msg/trace/test9.xml 598 -./doc/simgrid/examples/msg/trace/test3.xml 372 -./doc/simgrid/examples/msg/trace/test_trace_integration.xml 206 -./doc/simgrid/examples/msg/trace/test2.xml 370 -./doc/simgrid/examples/msg/trace/test7.xml 501 -./doc/simgrid/examples/msg/trace/test11.xml 683 -./doc/simgrid/examples/msg/trace/test4.xml 371 -./doc/simgrid/examples/msg/trace/test10.xml 598 -./doc/simgrid/examples/msg/trace/test6.xml 372 -./doc/simgrid/examples/msg/trace/test8.xml 498 -./doc/simgrid/examples/msg/trace/test5.xml 371 -./doc/simgrid/examples/msg/trace/test_trace_integration.c 1960 -./doc/simgrid/examples/msg/trace/test1.xml 366 -./doc/simgrid/examples/msg/parallel_contexts/pcontexts_platform.xml 1002 -./doc/simgrid/examples/msg/parallel_contexts/deployment_pcontexts2_4.xml 467 -./doc/simgrid/examples/msg/parallel_contexts/pcontexts2.c 2236 -./doc/simgrid/examples/msg/parallel_contexts/deployment_pcontexts_2.xml 242 -./doc/simgrid/examples/msg/parallel_contexts/deployment_pcontexts_4.xml 353 -./doc/simgrid/examples/msg/parallel_contexts/pcontexts.c 1752 -./doc/simgrid/examples/msg/tracing/deployment.xml 800 -./doc/simgrid/examples/msg/tracing/ms.c 4374 -./doc/simgrid/examples/msg/tracing/platform.xml 3930 -./doc/simgrid/examples/msg/tracing/tasks.c 3594 -./doc/simgrid/examples/msg/tracing/procmig-deploy.xml 223 -./doc/simgrid/examples/msg/tracing/procmig.c 3282 -./doc/simgrid/examples/msg/tracing/categories.c 3358 -./doc/simgrid/examples/msg/sendrecv/README 689 -./doc/simgrid/examples/msg/sendrecv/deployment_sendrecv.xml 321 -./doc/simgrid/examples/msg/sendrecv/sendrecv.c 5098 -./doc/simgrid/examples/msg/sendrecv/platform_sendrecv.xml 528 -./doc/simgrid/examples/msg/gtnets/onelink-p.xml 439 -./doc/simgrid/examples/msg/gtnets/fullduplex-p.xml 575 -./doc/simgrid/examples/msg/gtnets/dogbone-d.xml 576 -./doc/simgrid/examples/msg/gtnets/waxman-d.xml 46642 -./doc/simgrid/examples/msg/gtnets/waxman-p.xml 4964600 -./doc/simgrid/examples/msg/gtnets/fullduplex-d.xml 1029 -./doc/simgrid/examples/msg/gtnets/onelink-d.xml 356 -./doc/simgrid/examples/msg/gtnets/gtnets.c 6172 -./doc/simgrid/examples/msg/gtnets/dogbone-p.xml 1482 -./doc/simgrid/examples/msg/pmm/msg_pmm.c 9688 -./doc/simgrid/examples/msg/pmm/pmm_9_deploy.xml 786 -./doc/simgrid/examples/msg/mc/bugged1.c 1378 -./doc/simgrid/examples/msg/mc/deploy_bugged3.xml 377 -./doc/simgrid/examples/msg/mc/deploy_mutex.xml 925 -./doc/simgrid/examples/msg/mc/platform.xml 876 -./doc/simgrid/examples/msg/mc/deploy_bugged2.xml 377 -./doc/simgrid/examples/msg/mc/random_test.c 563 -./doc/simgrid/examples/msg/mc/deploy_bugged1.xml 459 -./doc/simgrid/examples/msg/mc/bugged3.c 1827 -./doc/simgrid/examples/msg/mc/deploy_random_test.xml 468 -./doc/simgrid/examples/msg/mc/bugged2.c 1957 -./doc/simgrid/examples/msg/mc/centralized_mutex.c 3375 -./doc/simgrid/examples/msg/token_ring/two_clusters.xml 1007 -./doc/simgrid/examples/msg/token_ring/ring_call.c 4205 -./doc/simgrid/examples/msg/token_ring/two_peers.xml 556 -./doc/simgrid/examples/msg/msg_platform.xml 2261806 -./doc/simgrid/examples/msg/priority/deployment_priority.xml 406 -./doc/simgrid/examples/msg/priority/priority.c 2394 -./doc/simgrid/examples/msg/actions/actions.c 19339 -./doc/simgrid/examples/msg/actions/deployment.xml 249 -./doc/simgrid/examples/msg/actions/NAS_LU_S_4/platform_flat.xml 6805 -./doc/simgrid/examples/msg/actions/NAS_LU_S_4/platform.xml 387 -./doc/simgrid/examples/msg/actions/NAS_LU_S_4/deploy_MPI_4.xml 605 -./doc/simgrid/examples/msg/actions/sim.0.bordereau.lu.b.8/toto.xml 1066 -./doc/simgrid/examples/msg/actions/sim.0.bordereau.lu.b.8/titi.xml 1066 -./doc/simgrid/examples/msg/actions/deployment_split.xml 525 -./doc/simgrid/examples/msg/actions/homogeneous_3_hosts.xml 906 -./doc/simgrid/examples/msg/actions/bcast_deployment.xml 224 -./doc/simgrid/examples/msg/actions/actions_deployment_split.xml 501 -./doc/simgrid/examples/msg/masterslave/masterslave_bypass.c 9082 -./doc/simgrid/examples/msg/masterslave/deployment_masterslave_mailbox.xml 990 -./doc/simgrid/examples/msg/masterslave/masterslave_cluster.c 6773 -./doc/simgrid/examples/msg/masterslave/masterslave_console.c 3952 -./doc/simgrid/examples/msg/masterslave/platform_clusters.xml 930 -./doc/simgrid/examples/msg/masterslave/deployment_masterslave_mailbox_multicore.xml 1078 -./doc/simgrid/examples/msg/masterslave/masterslave_failure.c 7120 -./doc/simgrid/examples/msg/masterslave/deployment_masterslave_vivaldi.xml 4170 -./doc/simgrid/examples/msg/masterslave/deployment_masterslave_forwarder.xml 1382 -./doc/simgrid/examples/msg/masterslave/masterslave_forwarder.c 6438 -./doc/simgrid/examples/msg/masterslave/platform_script.lua 2535 -./doc/simgrid/examples/msg/masterslave/deployment_masterslave.xml 998 -./doc/simgrid/examples/msg/masterslave/jumbo_deployment.xml 6805 -./doc/simgrid/examples/msg/masterslave/jumbo_deployment_masterslave_mailbox.xml 878 -./doc/simgrid/examples/msg/masterslave/masterslave_mailbox.c 4118 -./doc/simgrid/examples/msg/suspend/suspend.c 2692 -./doc/simgrid/examples/msg/suspend/deployment_suspend.xml 183 -./doc/simgrid/examples/msg/small_platform_with_routers.xml 5295 -./doc/simgrid/examples/msg/chord/chord90.xml 13992 -./doc/simgrid/examples/msg/chord/chord.xml 2236 -./doc/simgrid/examples/msg/chord/chord10k.xml 1624671 -./doc/simgrid/examples/msg/chord/chord.c 28995 -./doc/simgrid/examples/lua/multi_matrix/quicksort_platform.xml 4628 -./doc/simgrid/examples/lua/multi_matrix/mult_matrix.lua 227 -./doc/simgrid/examples/lua/multi_matrix/receiver.lua 1199 -./doc/simgrid/examples/lua/multi_matrix/quicksort_deployment.xml 524 -./doc/simgrid/examples/lua/multi_matrix/sender.lua 748 -./doc/simgrid/examples/lua/mult_matrix.lua 2196 -./doc/simgrid/examples/lua/README 1416 -./doc/simgrid/examples/lua/deploy.xml 879 -./doc/simgrid/examples/lua/splaySim/master.lua 1125 -./doc/simgrid/examples/lua/splaySim/slave.lua 729 -./doc/simgrid/examples/lua/splaySim/splay_platform.lua 1950 -./doc/simgrid/examples/lua/splaySim/splay_ctrl.lua 304 -./doc/simgrid/examples/lua/splaySim/splay_deploy_masterslave.lua 487 -./doc/simgrid/examples/lua/tracing/master.lua 1390 -./doc/simgrid/examples/lua/tracing/slave.lua 713 -./doc/simgrid/examples/lua/tracing/master_slave_trace.lua 491 -./doc/simgrid/examples/lua/SimSplay/sim_splay.lua 2298 -./doc/simgrid/examples/lua/SimSplay/splay_school.lua 402 -./doc/simgrid/examples/lua/SimSplay/chord.lua 1906 -./doc/simgrid/examples/lua/SimSplay/platform_script.lua 1706 -./doc/simgrid/examples/lua/console/master.lua 1125 -./doc/simgrid/examples/lua/console/deploy.lua 480 -./doc/simgrid/examples/lua/console/slave.lua 730 -./doc/simgrid/examples/lua/console/platform.lua 2424 -./doc/simgrid/examples/lua/console/master_slave_bypass.lua 158 -./doc/simgrid/examples/lua/masterslave/master.lua 1125 -./doc/simgrid/examples/lua/masterslave/slave.lua 730 -./doc/simgrid/examples/lua/masterslave/platform.lua 2424 -./doc/simgrid/examples/lua/masterslave/master_slave.lua 378 -./doc/simgrid/examples/simdag/properties/sd_prop.c 3012 -./doc/simgrid/examples/simdag/dax/Strassen.xml 9663 -./doc/simgrid/examples/simdag/dax/Montage_25.xml 23087 -./doc/simgrid/examples/simdag/dax/Sipht_30.xml 267014 -./doc/simgrid/examples/simdag/dax/dax_test.c 4346 -./doc/simgrid/examples/simdag/dax/Montage_50.xml 48868 -./doc/simgrid/examples/simdag/dax/Inspiral_30.xml 28774 -./doc/simgrid/examples/simdag/dax/sagittaire.xml 289 -./doc/simgrid/examples/simdag/scheduling/minmin_test.c 11328 -./doc/simgrid/examples/simdag/scheduling/Montage_25.xml 23087 -./doc/simgrid/examples/simdag/scheduling/simulacrum_7_hosts.xml 5670 -./doc/simgrid/examples/simdag/sd_seq_access.c 4153 -./doc/simgrid/examples/simdag/sd_test_console.c 6976 -./doc/simgrid/examples/simdag/metaxml/sd_meta.c 2207 -./doc/simgrid/examples/simdag/2clusters.xml 14326 -./doc/simgrid/examples/simdag/sd_test2.c 7538 -./doc/simgrid/examples/simdag/platform_script.lua 1864 -./doc/simgrid/examples/simdag/simdag_trace.c 4354 -./doc/simgrid/examples/simdag/sd_test.c 6964 -./doc/simgrid/examples/simdag/dot/dot_test2.c 1622 -./doc/simgrid/examples/simdag/dot/simulate_dot.c 3590 -./doc/simgrid/examples/simdag/dot/dot_test.c 4002 -./doc/simgrid/examples/platforms/g5k.xml 17028 -./doc/simgrid/examples/platforms/One_cluster_no_backbone.xml 482 -./doc/simgrid/examples/platforms/g5k_cabinets.xml 22645 -./doc/simgrid/examples/platforms/nancy.xml 4028 -./doc/simgrid/examples/platforms/lcg_sept2004_grid.xml 15970 -./doc/simgrid/examples/platforms/Two_clusters.xml 930 -./doc/simgrid/examples/platforms/vivaldi.xml 3274 -./doc/simgrid/examples/platforms/gridpp_grid_2004.xml 6096 -./doc/simgrid/examples/platforms/griffon.xml 1879 -./doc/simgrid/examples/platforms/median_harvard.xml 28125 -./doc/simgrid/examples/platforms/prop.xml 1273 -./doc/simgrid/examples/platforms/One_cluster.xml 661 -./doc/simgrid/examples/platforms/gdx.xml 2323 -./doc/simgrid/examples/platforms/multicore_machine.xml 222 -./doc/simgrid/html/group__XBT__str.html 36192 -./doc/simgrid/html/group__XBT__cfg__decl.html 14505 -./doc/simgrid/html/bug.html 2130 -./doc/simgrid/html/group__MSG__C.html 10658 -./doc/simgrid/html/structs__xbt__strbuff__t.html 2512 -./doc/simgrid/html/MSG_ex_master_slave_lua_bypass.html 4803 -./doc/simgrid/html/simgrid_modules2.png 11932 -./doc/simgrid/html/classsimgrid_1_1msg_1_1Msg.html 1519 -./doc/simgrid/html/group__SURF__actions.html 13562 -./doc/simgrid/html/publis_intra.html 435 -./doc/simgrid/html/simgrid_logo_small.png 8326 -./doc/simgrid/html/group__SURF__resources.html 4203 -./doc/simgrid/html/structsurf__cpu__model__extension__public.html 2751 -./doc/simgrid/html/tabs.css 1095 -./doc/simgrid/html/group__XBT__set.html 6991 -./doc/simgrid/html/group__XBT__set__curs.html 9653 -./doc/simgrid/html/structxbt__ex__t.html 10014 -./doc/simgrid/html/pages.html 5794 -./doc/simgrid/html/MSG_ex_master_slave_scrip_lua.html 30160 -./doc/simgrid/html/group__XBT__API.html 6276 -./doc/simgrid/html/classsimgrid_1_1msg_1_1MsgException.html 1519 -./doc/simgrid/html/todo.html 3202 -./doc/simgrid/html/nav_f.png 159 -./doc/simgrid/html/group__XBT__queue.html 23050 -./doc/simgrid/html/group__XBT__fifo__cons.html 9876 -./doc/simgrid/html/structsurf__model.html 17707 -./doc/simgrid/html/MSG_ex_asynchronous_communications.html 43212 -./doc/simgrid/html/Paje_MSG_screenshot_thn.jpg 30326 -./doc/simgrid/html/structsurf__network__model__extension__public.html 2783 -./doc/simgrid/html/structsurf__model__description.html 2621 -./doc/simgrid/html/group__m__host__management.html 19042 -./doc/simgrid/html/group__XBT__fifo__perl.html 14045 -./doc/simgrid/html/modules.html 12734 -./doc/simgrid/html/annotated.html 7707 -./doc/simgrid/html/group__XBT__fifo.html 6191 -./doc/simgrid/html/group__XBT__parmap.html 3765 -./doc/simgrid/html/tracing.html 58483 -./doc/simgrid/html/structs__surf__metric__t.html 2523 -./doc/simgrid/html/classsimgrid_1_1msg_1_1Task.html 1519 -./doc/simgrid/html/group__XBT__swag.html 5923 -./doc/simgrid/html/functions_vars.html 11436 -./doc/simgrid/html/group__XBT__swag__type.html 8194 -./doc/simgrid/html/win_install_02.png 60084 -./doc/simgrid/html/simgrid_modules.png 8309 -./doc/simgrid/html/group__XBT__error.html 8348 -./doc/simgrid/html/group__XBT__dynar__cons.html 15743 -./doc/simgrid/html/simgrid_logo.png 21536 -./doc/simgrid/html/group__XBT__fifo__misc.html 7717 -./doc/simgrid/html/group__XBT__context.html 3460 -./doc/simgrid/html/group__m__channel__management.html 8963 -./doc/simgrid/html/structm__task.html 4188 -./doc/simgrid/html/group__XBT__swag__curs.html 8561 -./doc/simgrid/html/group__XBT__log.html 60965 -./doc/simgrid/html/open.png 118 -./doc/simgrid/html/group__msg__simulation.html 9008 -./doc/simgrid/html/group__XBT__dynar__cursor.html 11976 -./doc/simgrid/html/group__XBT__log__cats.html 5102 -./doc/simgrid/html/win_install_03.png 55802 -./doc/simgrid/html/poster_thumbnail.png 3249 -./doc/simgrid/html/group__m__datatypes__management__details.html 7557 -./doc/simgrid/html/group__XBT__set__basic.html 24314 -./doc/simgrid/html/win_install_01.png 61053 -./doc/simgrid/html/closed.png 126 -./doc/simgrid/html/group__XBT__adt.html 6958 -./doc/simgrid/html/index.html 9659 -./doc/simgrid/html/group__SD__link__management.html 17867 -./doc/simgrid/html/group__MSG__JAVA.html 5443 -./doc/simgrid/html/group__SURF__simulation.html 10385 -./doc/simgrid/html/structm__host.html 4188 -./doc/simgrid/html/group__XBT__dynar__array.html 22436 -./doc/simgrid/html/simgrid.css 386 -./doc/simgrid/html/group__SD__task__dependency__management.html 15389 -./doc/simgrid/html/group__XBT__grounding.html 7225 -./doc/simgrid/html/pls.html 11863 -./doc/simgrid/html/group__XBT__dynar__ctn.html 12693 -./doc/simgrid/html/functions.html 11564 -./doc/simgrid/html/group__XBT__dynar__speed.html 9616 -./doc/simgrid/html/installSimgrid.html 24837 -./doc/simgrid/html/triva-graph_configuration.png 59769 -./doc/simgrid/html/triva-graph_visualization.png 55335 -./doc/simgrid/html/MSG_ex_master_slave.html 51294 -./doc/simgrid/html/doxygen.png 3942 -./doc/simgrid/html/group__XBT__mallocator__cons.html 10757 -./doc/simgrid/html/group__API__index.html 125324 -./doc/simgrid/html/group__XBT__dict__cons.html 9746 -./doc/simgrid/html/group__XBT__swag__func.html 19885 -./doc/simgrid/html/group__SimGrid__API.html 4674 -./doc/simgrid/html/group__XBT__dynar__misc.html 9591 -./doc/simgrid/html/structxbt__set__elm__.html 5121 -./doc/simgrid/html/group__XBT__cfg__get.html 19320 -./doc/simgrid/html/bindings.html 23685 -./doc/simgrid/html/group__XBT__dict.html 6916 -./doc/simgrid/html/use.html 3904 -./doc/simgrid/html/group__XBT__dict__basic.html 20935 -./doc/simgrid/html/group__XBT__graph.html 23682 -./doc/simgrid/html/group__XBT__mallocator.html 6444 -./doc/simgrid/html/structsurf__workstation__model__extension__public.html 11076 -./doc/simgrid/html/publis.html 435 -./doc/simgrid/html/group__XBT__misc.html 4663 -./doc/simgrid/html/simdag.html 226 -./doc/simgrid/html/Paje_MSG_screenshot.jpg 340759 -./doc/simgrid/html/group__msg__gos__functions.html 65293 -./doc/simgrid/html/classsimgrid_1_1msg_1_1Host.html 1519 -./doc/simgrid/html/publis_extern.html 435 -./doc/simgrid/html/group__MSG__LUA.html 5094 -./doc/simgrid/html/group__XBT__dynar.html 14081 -./doc/simgrid/html/structs__model__type.html 2480 -./doc/simgrid/html/group__XBT__synchro.html 19296 -./doc/simgrid/html/bc_s.png 677 -./doc/simgrid/html/classes.html 6934 -./doc/simgrid/html/group__XBT__fifo__direct.html 29778 -./doc/simgrid/html/group__XBT__cfg__use.html 37757 -./doc/simgrid/html/group__XBT__mallocator__objects.html 9306 -./doc/simgrid/html/classsimgrid_1_1msg_1_1Process.html 1519 -./doc/simgrid/html/group__XBT__dict__multi.html 18525 -./doc/simgrid/html/group__m__datatypes__management.html 16459 -./doc/simgrid/html/tab_b.png 178 -./doc/simgrid/html/group__SD__simulation.html 45009 -./doc/simgrid/html/group__msg__easier__life.html 50885 -./doc/simgrid/html/group__m__task__management.html 35307 -./doc/simgrid/html/tab_a.png 140 -./doc/simgrid/html/group__XBT__config.html 16354 -./doc/simgrid/html/options.html 7629 -./doc/simgrid/html/group__XBT__dict__nnul.html 18891 -./doc/simgrid/html/win_install_04.png 52033 -./doc/simgrid/html/structsurf__action.html 8353 -./doc/simgrid/html/group__XBT__ex.html 32537 -./doc/simgrid/html/group__SURF__API.html 6659 -./doc/simgrid/html/doxygen.css 12350 -./doc/simgrid/html/group__XBT__set__cons.html 7965 -./doc/simgrid/html/group__SURF__build__api.html 7821 -./doc/simgrid/html/group__m__process__management.html 47169 -./doc/simgrid/html/group__XBT__dict__curs.html 19747 -./doc/simgrid/html/group__SD__datatypes__management.html 20816 -./doc/simgrid/html/group__SD__API.html 8379 -./doc/simgrid/html/group__SMPI__API.html 4776 -./doc/simgrid/html/group__XBT__dynar__perl.html 12131 -./doc/simgrid/html/group__XBT__cfg__register.html 15874 -./doc/simgrid/html/publis_core.html 435 -./doc/simgrid/html/group__SD__workstation__management.html 46397 -./doc/simgrid/html/MSG_ex_master_slave_lua.html 4794 -./doc/simgrid/html/group__MSG__API.html 6026 -./doc/simgrid/html/msg.html 227 -./doc/simgrid/html/group__SD__task__management.html 60347 -./doc/simgrid/html/group__XBT__syscall.html 10095 -./doc/simgrid/html/group__XBT__heap.html 18482 -./doc/simgrid/html/structsurf__action__state.html 7301 -./doc/simgrid/html/tab_s.png 189 -./doc/simgrid/html/tab_h.png 192 -./doc/simgrid/html/nav_h.png 97 -./include/smpi/mpif.h 4826 -./include/smpi/smpif.h 1139 -./include/smpi/mpi.h 510 -./include/smpi/smpi_cocci.h 3187 -./include/smpi/smpi.h 24101 -./include/xbt/fifo.h 3626 -./include/xbt/dict.h 7459 -./include/xbt/str.h 2111 -./include/xbt/log.h 25433 -./include/xbt/misc.h 8031 -./include/xbt/synchro_core.h 4477 -./include/xbt/mmalloc.h 1976 -./include/xbt/replay_trace_reader.h 917 -./include/xbt/function_types.h 1111 -./include/xbt/strbuff.h 1281 -./include/xbt/virtu.h 684 -./include/xbt/asserts.h 1871 -./include/xbt/ex.h 23255 -./include/xbt/graph.h 5668 -./include/xbt/graphxml.h 5474 -./include/xbt/queue.h 2252 -./include/xbt/matrix.h 3027 -./include/xbt/setset.h 2422 -./include/xbt/time.h 743 -./include/xbt/lib.h 2014 -./include/xbt/hash.h 1064 -./include/xbt/set.h 4383 -./include/xbt/config.h 9224 -./include/xbt/sysdep.h 4941 -./include/xbt/swag.h 5352 -./include/xbt/graphxml_parse.h 1926 -./include/xbt/peer.h 870 -./include/xbt/module.h 648 -./include/xbt/cunit.h 5523 -./include/xbt/parmap.h 1166 -./include/xbt/mallocator.h 2296 -./include/xbt/dynar.h 9553 -./include/xbt/heap.h 1444 -./include/xbt.h 876 -./include/msg/datatypes.h 4635 -./include/msg/msg.h 12038 -./include/simgrid_config.h 3641 -./include/mc/modelchecker.h 96 -./include/surf/simgrid_dtd.h 23583 -./include/surf/surf_routing.h 1167 -./include/surf/surfxml_parse.h 5343 -./include/instr/instr.h 5750 -./include/simdag/simdag.h 10325 -./include/simdag/datatypes.h 3715 -./include/simix/simix.h 13003 -./include/simix/datatypes.h 3346 -./include/simix/context.h 4040 -./lib/libsimgrid.so.3.6.2 12710497 -./bin/smpicc 918 -./bin/smpirun 7292 -./bin/smpif2c 1990 -./bin/simgrid_update_xml 5018 -./bin/graphicator 66986 -./bin/simgrid-colorizer 2993 -./bin/smpiff 820 -./bin/tesh 356434 +/doc/simgrid/examples/cxx/autoDestination/FinalizeTask.cxx 71 +/doc/simgrid/examples/cxx/autoDestination/autoDestination_deployment.xml 1262 +/doc/simgrid/examples/cxx/autoDestination/Main.cxx 148 +/doc/simgrid/examples/cxx/autoDestination/Slave.cxx 870 +/doc/simgrid/examples/cxx/autoDestination/BasicTask.cxx 65 +/doc/simgrid/examples/cxx/autoDestination/Master.cxx 1891 +/doc/simgrid/examples/cxx/autoDestination/autoDestination_platform.xml 2133932 +/doc/simgrid/examples/cxx/autoDestination/Forwarder.cxx 1137 +/doc/simgrid/explicitDestination/FinalizeTask.cxx 71 +/doc/simgrid/examples/cxx/basic/Main.cxx 148 +/doc/simgrid/examples/cxx/basic/Slave.cxx 693 +/doc/simgrid/examples/cxx/basic/BasicTask.cxx 65 +/doc/simgrid/examples/cxx/basic/basic_platform.xml 2133932 +/doc/simgrid/examples/cxx/basic/Master.cxx 2148 +/doc/simgrid/examples/cxx/basic/basic_deployment.xml 1188 +/doc/simgrid/examples/cxx/basic/Forwarder.cxx 1244 +/doc/simgrid/examples/cxx/explicitDestination/FinalizeTask.cxx 71 +/doc/simgrid/examples/cxx/explicitDestination/Main.cxx 148 +/doc/simgrid/examples/cxx/explicitDestination/explicitDestination_platform.xml 2133932 +/doc/simgrid/examples/cxx/explicitDestination/Slave.cxx 913 +/doc/simgrid/examples/cxx/explicitDestination/BasicTask.cxx 65 +/doc/simgrid/examples/cxx/explicitDestination/explicitDestination_deployment.xml 1188 +/doc/simgrid/examples/cxx/explicitDestination/Master.cxx 1896 +/doc/simgrid/examples/cxx/explicitDestination/Forwarder.cxx 1181 +/doc/simgrid/examples/cxx/ping_pong/Main.cxx 149 +/doc/simgrid/examples/cxx/ping_pong/Sender.cxx 1073 +/doc/simgrid/examples/cxx/ping_pong/ping_pong_deployment.xml 275 +/doc/simgrid/examples/cxx/ping_pong/ping_pong_platform.xml 4718 +/doc/simgrid/examples/cxx/ping_pong/Receiver.cxx 957 +/doc/simgrid/examples/cxx/ping_pong/PingPongTask.cxx 71 +/doc/simgrid/examples/cxx/comm_time/FinalizeTask.cxx 71 +/doc/simgrid/examples/cxx/comm_time/Main.cxx 146 +/doc/simgrid/examples/cxx/comm_time/CommTimeTask.cxx 71 +/doc/simgrid/examples/cxx/comm_time/Slave.cxx 889 +/doc/simgrid/examples/cxx/comm_time/comm_time_platform.xml 2133932 +/doc/simgrid/examples/cxx/comm_time/Master.cxx 1730 +/doc/simgrid/examples/cxx/comm_time/comm_time_deployment.xml 1884 +/doc/simgrid/examples/cxx/suspend/Main.cxx 150 +/doc/simgrid/examples/cxx/suspend/suspend_platform.xml 2133932 +/doc/simgrid/examples/cxx/suspend/suspend_deployment.xml 187 +/doc/simgrid/examples/cxx/suspend/DreamMaster.cxx 826 +/doc/simgrid/examples/cxx/suspend/LazyGuy.cxx 429 +/doc/simgrid/examples/smpi/mc_bugged2.c 1387 +/doc/simgrid/examples/smpi/scatter.c 3496 +/doc/simgrid/examples/smpi/mc_bugged1.c 1411 +/doc/simgrid/examples/smpi/get_processor_name.c 649 +/doc/simgrid/examples/smpi/NAS/README 1857 +/doc/simgrid/examples/smpi/NAS/EP-sampling/README 347 +/doc/simgrid/examples/smpi/NAS/EP-sampling/randlc.c 3300 +/doc/simgrid/examples/smpi/NAS/EP-sampling/ep.c 13723 +/doc/simgrid/examples/smpi/NAS/EP-trace/README 347 +/doc/simgrid/examples/smpi/NAS/EP-trace/randlc.c 3300 +/doc/simgrid/examples/smpi/NAS/EP-trace/ep-trace.c 13850 +/doc/simgrid/examples/smpi/NAS/config/NAS.samples/README 394 +/doc/simgrid/examples/smpi/NAS/IS-trace/is-trace.c 38276 +/doc/simgrid/examples/smpi/NAS/DT-trace/README 999 +/doc/simgrid/examples/smpi/NAS/DT-trace/DGraph.c 5451 +/doc/simgrid/examples/smpi/NAS/DT-trace/dt.c 23031 +/doc/simgrid/examples/smpi/NAS/IS/is.c 38077 +/doc/simgrid/examples/smpi/NAS/MPI_dummy/README 2406 +/doc/simgrid/examples/smpi/NAS/MPI_dummy/mpi_dummy.c 5660 +/doc/simgrid/examples/smpi/NAS/MPI_dummy/wtime_sgi64.c 1700 +/doc/simgrid/examples/smpi/NAS/MPI_dummy/wtime.c 228 +/doc/simgrid/examples/smpi/NAS/common/randdp.c 1441 +/doc/simgrid/examples/smpi/NAS/common/c_timers.c 1159 +/doc/simgrid/examples/smpi/NAS/common/c_print_results.c 3086 +/doc/simgrid/examples/smpi/NAS/sys/README 1461 +/doc/simgrid/examples/smpi/NAS/sys/setparams.c 38805 +/doc/simgrid/examples/smpi/NAS/SP/README 926 +/doc/simgrid/examples/smpi/NAS/FT/README 276 +/doc/simgrid/examples/smpi/NAS/DT/README 999 +/doc/simgrid/examples/smpi/NAS/DT/DGraph.c 5451 +/doc/simgrid/examples/smpi/NAS/DT/dt.c 22620 +/doc/simgrid/examples/smpi/NAS/EP/README 347 +/doc/simgrid/examples/smpi/NAS/EP/randlc.c 3300 +/doc/simgrid/examples/smpi/NAS/EP/ep.c 13688 +/doc/simgrid/examples/smpi/NAS/DT-folding/README 999 +/doc/simgrid/examples/smpi/NAS/DT-folding/DGraph.c 5451 +/doc/simgrid/examples/smpi/NAS/DT-folding/dt.c 22704 +/doc/simgrid/examples/smpi/NAS/MG/README 5465 +/doc/simgrid/examples/smpi/bcast.c 983 +/doc/simgrid/examples/smpi/compute2.c 628 +/doc/simgrid/examples/smpi/sendrecv.c 1652 +/doc/simgrid/examples/smpi/allreduce.c 2135 +/doc/simgrid/examples/smpi/mvmul.c 7069 +/doc/simgrid/examples/smpi/alltoallv.c 4441 +/doc/simgrid/examples/smpi/smpi_traced.c 8529 +/doc/simgrid/examples/smpi/compute3.c 816 +/doc/simgrid/examples/smpi/reduce.c 3545 +/doc/simgrid/examples/smpi/bcbench.c 2466 +/doc/simgrid/examples/smpi/ttest01.c 1273 +/doc/simgrid/examples/smpi/compute.c 622 +/doc/simgrid/examples/smpi/barrier.c 766 +/doc/simgrid/examples/smpi/alltoall_basic.c 1453 +/doc/simgrid/examples/smpi/pingpong.c 2286 +/doc/simgrid/examples/smpi/alltoall2.c 2799 +/doc/simgrid/examples/smpi/split.c 705 +/doc/simgrid/examples/xbt/sem_basic.c 1970 +/doc/simgrid/examples/xbt/sem_sched.c 7207 +/doc/simgrid/examples/msg/small_platform.xml 4582 +/doc/simgrid/examples/msg/README 4805 +/doc/simgrid/examples/msg/properties/deployment_properties.xml 272 +/doc/simgrid/examples/msg/properties/msg_prop.c 3853 +/doc/simgrid/examples/msg/ns3/3links-p.xml 856 +/doc/simgrid/examples/msg/ns3/dogbone-d.xml 582 +/doc/simgrid/examples/msg/ns3/Two_clusters.xml 1817 +/doc/simgrid/examples/msg/ns3/3links-d.xml 927 +/doc/simgrid/examples/msg/ns3/3links-d-timer.xml 1280 +/doc/simgrid/examples/msg/ns3/ns3.c 5177 +/doc/simgrid/examples/msg/ns3/Two_clusters-d.xml 369 +/doc/simgrid/examples/msg/ns3/One_cluster-d.xml 367 +/doc/simgrid/examples/msg/ns3/dogbone-p.xml 1497 +/doc/simgrid/examples/msg/ns3/3hosts_2links_p.xml 566 +/doc/simgrid/examples/msg/ns3/3hosts_2links_d.xml 352 +/doc/simgrid/examples/msg/ns3/One_cluster.xml 658 +/doc/simgrid/examples/msg/migration/migration.c 2922 +/doc/simgrid/examples/msg/small_platform_with_failures.xml 4746 +/doc/simgrid/examples/msg/icomms/small_platform.xml 972 +/doc/simgrid/examples/msg/icomms/deployment_peer.xml 678 +/doc/simgrid/examples/msg/icomms/deployment_peer05.xml 891 +/doc/simgrid/examples/msg/icomms/deployment_peer02.xml 855 +/doc/simgrid/examples/msg/icomms/peer2.c 4276 +/doc/simgrid/examples/msg/icomms/deployment_peer03.xml 851 +/doc/simgrid/examples/msg/icomms/deployment_peer04.xml 852 +/doc/simgrid/examples/msg/icomms/peer.c 5102 +/doc/simgrid/examples/msg/icomms/deployment_peer01.xml 855 +/doc/simgrid/examples/msg/icomms/peer3.c 5258 +/doc/simgrid/examples/msg/parallel_task/test_ptask_deployment.xml 654 +/doc/simgrid/examples/msg/parallel_task/test_ptask.c 5423 +/doc/simgrid/examples/msg/parallel_task/test_ptask_platform.xml 2380 +/doc/simgrid/examples/msg/parallel_task/parallel_task.c 2708 +/doc/simgrid/examples/msg/alias/masterslave_forwarder_with_alias.c 6217 +/doc/simgrid/examples/msg/trace/test9.xml 598 +/doc/simgrid/examples/msg/trace/test3.xml 372 +/doc/simgrid/examples/msg/trace/test_trace_integration.xml 206 +/doc/simgrid/examples/msg/trace/test2.xml 370 +/doc/simgrid/examples/msg/trace/test7.xml 501 +/doc/simgrid/examples/msg/trace/test11.xml 683 +/doc/simgrid/examples/msg/trace/test4.xml 371 +/doc/simgrid/examples/msg/trace/test10.xml 598 +/doc/simgrid/examples/msg/trace/test6.xml 372 +/doc/simgrid/examples/msg/trace/test8.xml 498 +/doc/simgrid/examples/msg/trace/test5.xml 371 +/doc/simgrid/examples/msg/trace/test_trace_integration.c 1960 +/doc/simgrid/examples/msg/trace/test1.xml 366 +/doc/simgrid/examples/msg/parallel_contexts/pcontexts_platform.xml 1002 +/doc/simgrid/examples/msg/parallel_contexts/deployment_pcontexts2_4.xml 467 +/doc/simgrid/examples/msg/parallel_contexts/pcontexts2.c 2236 +/doc/simgrid/examples/msg/parallel_contexts/deployment_pcontexts_2.xml 242 +/doc/simgrid/examples/msg/parallel_contexts/deployment_pcontexts_4.xml 353 +/doc/simgrid/examples/msg/parallel_contexts/pcontexts.c 1752 +/doc/simgrid/examples/msg/tracing/deployment.xml 800 +/doc/simgrid/examples/msg/tracing/ms.c 4374 +/doc/simgrid/examples/msg/tracing/platform.xml 3930 +/doc/simgrid/examples/msg/tracing/tasks.c 3594 +/doc/simgrid/examples/msg/tracing/procmig-deploy.xml 223 +/doc/simgrid/examples/msg/tracing/procmig.c 3282 +/doc/simgrid/examples/msg/tracing/categories.c 3358 +/doc/simgrid/examples/msg/sendrecv/README 689 +/doc/simgrid/examples/msg/sendrecv/deployment_sendrecv.xml 321 +/doc/simgrid/examples/msg/sendrecv/sendrecv.c 5098 +/doc/simgrid/examples/msg/sendrecv/platform_sendrecv.xml 528 +/doc/simgrid/examples/msg/gtnets/onelink-p.xml 439 +/doc/simgrid/examples/msg/gtnets/fullduplex-p.xml 575 +/doc/simgrid/examples/msg/gtnets/dogbone-d.xml 576 +/doc/simgrid/examples/msg/gtnets/waxman-d.xml 46642 +/doc/simgrid/examples/msg/gtnets/waxman-p.xml 4964600 +/doc/simgrid/examples/msg/gtnets/fullduplex-d.xml 1029 +/doc/simgrid/examples/msg/gtnets/onelink-d.xml 356 +/doc/simgrid/examples/msg/gtnets/gtnets.c 6172 +/doc/simgrid/examples/msg/gtnets/dogbone-p.xml 1482 +/doc/simgrid/examples/msg/pmm/msg_pmm.c 9688 +/doc/simgrid/examples/msg/pmm/pmm_9_deploy.xml 786 +/doc/simgrid/examples/msg/mc/bugged1.c 1378 +/doc/simgrid/examples/msg/mc/deploy_bugged3.xml 377 +/doc/simgrid/examples/msg/mc/deploy_mutex.xml 925 +/doc/simgrid/examples/msg/mc/platform.xml 876 +/doc/simgrid/examples/msg/mc/deploy_bugged2.xml 377 +/doc/simgrid/examples/msg/mc/random_test.c 563 +/doc/simgrid/examples/msg/mc/deploy_bugged1.xml 459 +/doc/simgrid/examples/msg/mc/bugged3.c 1827 +/doc/simgrid/examples/msg/mc/deploy_random_test.xml 468 +/doc/simgrid/examples/msg/mc/bugged2.c 1957 +/doc/simgrid/examples/msg/mc/centralized_mutex.c 3375 +/doc/simgrid/examples/msg/token_ring/two_clusters.xml 1007 +/doc/simgrid/examples/msg/token_ring/ring_call.c 4205 +/doc/simgrid/examples/msg/token_ring/two_peers.xml 556 +/doc/simgrid/examples/msg/msg_platform.xml 2261806 +/doc/simgrid/examples/msg/priority/deployment_priority.xml 406 +/doc/simgrid/examples/msg/priority/priority.c 2394 +/doc/simgrid/examples/msg/actions/actions.c 19339 +/doc/simgrid/examples/msg/actions/deployment.xml 249 +/doc/simgrid/examples/msg/actions/NAS_LU_S_4/platform_flat.xml 6805 +/doc/simgrid/examples/msg/actions/NAS_LU_S_4/platform.xml 387 +/doc/simgrid/examples/msg/actions/NAS_LU_S_4/deploy_MPI_4.xml 605 +/doc/simgrid/examples/msg/actions/sim.0.bordereau.lu.b.8/toto.xml 1066 +/doc/simgrid/examples/msg/actions/sim.0.bordereau.lu.b.8/titi.xml 1066 +/doc/simgrid/examples/msg/actions/deployment_split.xml 525 +/doc/simgrid/examples/msg/actions/homogeneous_3_hosts.xml 906 +/doc/simgrid/examples/msg/actions/bcast_deployment.xml 224 +/doc/simgrid/examples/msg/actions/actions_deployment_split.xml 501 +/doc/simgrid/examples/msg/masterslave/masterslave_bypass.c 9082 +/doc/simgrid/examples/msg/masterslave/deployment_masterslave_mailbox.xml 990 +/doc/simgrid/examples/msg/masterslave/masterslave_cluster.c 6773 +/doc/simgrid/examples/msg/masterslave/masterslave_console.c 3952 +/doc/simgrid/examples/msg/masterslave/platform_clusters.xml 930 +/doc/simgrid/examples/msg/masterslave/deployment_masterslave_mailbox_multicore.xml 1078 +/doc/simgrid/examples/msg/masterslave/masterslave_failure.c 7120 +/doc/simgrid/examples/msg/masterslave/deployment_masterslave_vivaldi.xml 4170 +/doc/simgrid/examples/msg/masterslave/deployment_masterslave_forwarder.xml 1382 +/doc/simgrid/examples/msg/masterslave/masterslave_forwarder.c 6438 +/doc/simgrid/examples/msg/masterslave/platform_script.lua 2535 +/doc/simgrid/examples/msg/masterslave/deployment_masterslave.xml 998 +/doc/simgrid/examples/msg/masterslave/jumbo_deployment.xml 6805 +/doc/simgrid/examples/msg/masterslave/jumbo_deployment_masterslave_mailbox.xml 878 +/doc/simgrid/examples/msg/masterslave/masterslave_mailbox.c 4118 +/doc/simgrid/examples/msg/suspend/suspend.c 2692 +/doc/simgrid/examples/msg/suspend/deployment_suspend.xml 183 +/doc/simgrid/examples/msg/small_platform_with_routers.xml 5295 +/doc/simgrid/examples/msg/chord/chord90.xml 13992 +/doc/simgrid/examples/msg/chord/chord.xml 2236 +/doc/simgrid/examples/msg/chord/chord10k.xml 1624671 +/doc/simgrid/examples/msg/chord/chord.c 28995 +/doc/simgrid/examples/lua/multi_matrix/quicksort_platform.xml 4628 +/doc/simgrid/examples/lua/multi_matrix/mult_matrix.lua 227 +/doc/simgrid/examples/lua/multi_matrix/receiver.lua 1199 +/doc/simgrid/examples/lua/multi_matrix/quicksort_deployment.xml 524 +/doc/simgrid/examples/lua/multi_matrix/sender.lua 748 +/doc/simgrid/examples/lua/mult_matrix.lua 2196 +/doc/simgrid/examples/lua/README 1416 +/doc/simgrid/examples/lua/deploy.xml 879 +/doc/simgrid/examples/lua/splaySim/master.lua 1125 +/doc/simgrid/examples/lua/splaySim/slave.lua 729 +/doc/simgrid/examples/lua/splaySim/splay_platform.lua 1950 +/doc/simgrid/examples/lua/splaySim/splay_ctrl.lua 304 +/doc/simgrid/examples/lua/splaySim/splay_deploy_masterslave.lua 487 +/doc/simgrid/examples/lua/tracing/master.lua 1390 +/doc/simgrid/examples/lua/tracing/slave.lua 713 +/doc/simgrid/examples/lua/tracing/master_slave_trace.lua 491 +/doc/simgrid/examples/lua/SimSplay/sim_splay.lua 2298 +/doc/simgrid/examples/lua/SimSplay/splay_school.lua 402 +/doc/simgrid/examples/lua/SimSplay/chord.lua 1906 +/doc/simgrid/examples/lua/SimSplay/platform_script.lua 1706 +/doc/simgrid/examples/lua/console/master.lua 1125 +/doc/simgrid/examples/lua/console/deploy.lua 480 +/doc/simgrid/examples/lua/console/slave.lua 730 +/doc/simgrid/examples/lua/console/platform.lua 2424 +/doc/simgrid/examples/lua/console/master_slave_bypass.lua 158 +/doc/simgrid/examples/lua/masterslave/master.lua 1125 +/doc/simgrid/examples/lua/masterslave/slave.lua 730 +/doc/simgrid/examples/lua/masterslave/platform.lua 2424 +/doc/simgrid/examples/lua/masterslave/master_slave.lua 378 +/doc/simgrid/examples/simdag/properties/sd_prop.c 3012 +/doc/simgrid/examples/simdag/dax/Strassen.xml 9663 +/doc/simgrid/examples/simdag/dax/Montage_25.xml 23087 +/doc/simgrid/examples/simdag/dax/Sipht_30.xml 267014 +/doc/simgrid/examples/simdag/dax/dax_test.c 4346 +/doc/simgrid/examples/simdag/dax/Montage_50.xml 48868 +/doc/simgrid/examples/simdag/dax/Inspiral_30.xml 28774 +/doc/simgrid/examples/simdag/dax/sagittaire.xml 289 +/doc/simgrid/examples/simdag/scheduling/minmin_test.c 11328 +/doc/simgrid/examples/simdag/scheduling/Montage_25.xml 23087 +/doc/simgrid/examples/simdag/scheduling/simulacrum_7_hosts.xml 5670 +/doc/simgrid/examples/simdag/sd_seq_access.c 4153 +/doc/simgrid/examples/simdag/sd_test_console.c 6976 +/doc/simgrid/examples/simdag/metaxml/sd_meta.c 2207 +/doc/simgrid/examples/simdag/2clusters.xml 14326 +/doc/simgrid/examples/simdag/sd_test2.c 7538 +/doc/simgrid/examples/simdag/platform_script.lua 1864 +/doc/simgrid/examples/simdag/simdag_trace.c 4354 +/doc/simgrid/examples/simdag/sd_test.c 6964 +/doc/simgrid/examples/simdag/dot/dot_test2.c 1622 +/doc/simgrid/examples/simdag/dot/simulate_dot.c 3590 +/doc/simgrid/examples/simdag/dot/dot_test.c 4002 +/doc/simgrid/examples/platforms/g5k.xml 17028 +/doc/simgrid/examples/platforms/One_cluster_no_backbone.xml 482 +/doc/simgrid/examples/platforms/g5k_cabinets.xml 22645 +/doc/simgrid/examples/platforms/nancy.xml 4028 +/doc/simgrid/examples/platforms/lcg_sept2004_grid.xml 15970 +/doc/simgrid/examples/platforms/Two_clusters.xml 930 +/doc/simgrid/examples/platforms/vivaldi.xml 3274 +/doc/simgrid/examples/platforms/gridpp_grid_2004.xml 6096 +/doc/simgrid/examples/platforms/griffon.xml 1879 +/doc/simgrid/examples/platforms/median_harvard.xml 28125 +/doc/simgrid/examples/platforms/prop.xml 1273 +/doc/simgrid/examples/platforms/One_cluster.xml 661 +/doc/simgrid/examples/platforms/gdx.xml 2323 +/doc/simgrid/examples/platforms/multicore_machine.xml 222 +/doc/simgrid/html/group__XBT__str.html 36192 +/doc/simgrid/html/group__XBT__cfg__decl.html 14505 +/doc/simgrid/html/bug.html 2130 +/doc/simgrid/html/group__MSG__C.html 10658 +/doc/simgrid/html/structs__xbt__strbuff__t.html 2512 +/doc/simgrid/html/MSG_ex_master_slave_lua_bypass.html 4803 +/doc/simgrid/html/simgrid_modules2.png 11932 +/doc/simgrid/html/classsimgrid_1_1msg_1_1Msg.html 1519 +/doc/simgrid/html/group__SURF__actions.html 13562 +/doc/simgrid/html/publis_intra.html 435 +/doc/simgrid/html/simgrid_logo_small.png 8326 +/doc/simgrid/html/group__SURF__resources.html 4203 +/doc/simgrid/html/structsurf__cpu__model__extension__public.html 2751 +/doc/simgrid/html/tabs.css 1095 +/doc/simgrid/html/group__XBT__set.html 6991 +/doc/simgrid/html/group__XBT__set__curs.html 9653 +/doc/simgrid/html/structxbt__ex__t.html 10014 +/doc/simgrid/html/pages.html 5794 +/doc/simgrid/html/MSG_ex_master_slave_scrip_lua.html 30160 +/doc/simgrid/html/group__XBT__API.html 6276 +/doc/simgrid/html/classsimgrid_1_1msg_1_1MsgException.html 1519 +/doc/simgrid/html/todo.html 3202 +/doc/simgrid/html/nav_f.png 159 +/doc/simgrid/html/group__XBT__queue.html 23050 +/doc/simgrid/html/group__XBT__fifo__cons.html 9876 +/doc/simgrid/html/structsurf__model.html 17707 +/doc/simgrid/html/MSG_ex_asynchronous_communications.html 43212 +/doc/simgrid/html/Paje_MSG_screenshot_thn.jpg 30326 +/doc/simgrid/html/structsurf__network__model__extension__public.html 2783 +/doc/simgrid/html/structsurf__model__description.html 2621 +/doc/simgrid/html/group__m__host__management.html 19042 +/doc/simgrid/html/group__XBT__fifo__perl.html 14045 +/doc/simgrid/html/modules.html 12734 +/doc/simgrid/html/annotated.html 7707 +/doc/simgrid/html/group__XBT__fifo.html 6191 +/doc/simgrid/html/group__XBT__parmap.html 3765 +/doc/simgrid/html/tracing.html 58483 +/doc/simgrid/html/structs__surf__metric__t.html 2523 +/doc/simgrid/html/classsimgrid_1_1msg_1_1Task.html 1519 +/doc/simgrid/html/group__XBT__swag.html 5923 +/doc/simgrid/html/functions_vars.html 11436 +/doc/simgrid/html/group__XBT__swag__type.html 8194 +/doc/simgrid/html/win_install_02.png 60084 +/doc/simgrid/html/simgrid_modules.png 8309 +/doc/simgrid/html/group__XBT__error.html 8348 +/doc/simgrid/html/group__XBT__dynar__cons.html 15743 +/doc/simgrid/html/simgrid_logo.png 21536 +/doc/simgrid/html/group__XBT__fifo__misc.html 7717 +/doc/simgrid/html/group__XBT__context.html 3460 +/doc/simgrid/html/group__m__channel__management.html 8963 +/doc/simgrid/html/structm__task.html 4188 +/doc/simgrid/html/group__XBT__swag__curs.html 8561 +/doc/simgrid/html/group__XBT__log.html 60965 +/doc/simgrid/html/open.png 118 +/doc/simgrid/html/group__msg__simulation.html 9008 +/doc/simgrid/html/group__XBT__dynar__cursor.html 11976 +/doc/simgrid/html/group__XBT__log__cats.html 5102 +/doc/simgrid/html/win_install_03.png 55802 +/doc/simgrid/html/poster_thumbnail.png 3249 +/doc/simgrid/html/group__m__datatypes__management__details.html 7557 +/doc/simgrid/html/group__XBT__set__basic.html 24314 +/doc/simgrid/html/win_install_01.png 61053 +/doc/simgrid/html/closed.png 126 +/doc/simgrid/html/group__XBT__adt.html 6958 +/doc/simgrid/html/index.html 9659 +/doc/simgrid/html/group__SD__link__management.html 17867 +/doc/simgrid/html/group__MSG__JAVA.html 5443 +/doc/simgrid/html/group__SURF__simulation.html 10385 +/doc/simgrid/html/structm__host.html 4188 +/doc/simgrid/html/group__XBT__dynar__array.html 22436 +/doc/simgrid/html/simgrid.css 386 +/doc/simgrid/html/group__SD__task__dependency__management.html 15389 +/doc/simgrid/html/group__XBT__grounding.html 7225 +/doc/simgrid/html/pls.html 11863 +/doc/simgrid/html/group__XBT__dynar__ctn.html 12693 +/doc/simgrid/html/functions.html 11564 +/doc/simgrid/html/group__XBT__dynar__speed.html 9616 +/doc/simgrid/html/installSimgrid.html 24837 +/doc/simgrid/html/triva-graph_configuration.png 59769 +/doc/simgrid/html/triva-graph_visualization.png 55335 +/doc/simgrid/html/MSG_ex_master_slave.html 51294 +/doc/simgrid/html/doxygen.png 3942 +/doc/simgrid/html/group__XBT__mallocator__cons.html 10757 +/doc/simgrid/html/group__API__index.html 125324 +/doc/simgrid/html/group__XBT__dict__cons.html 9746 +/doc/simgrid/html/group__XBT__swag__func.html 19885 +/doc/simgrid/html/group__SimGrid__API.html 4674 +/doc/simgrid/html/group__XBT__dynar__misc.html 9591 +/doc/simgrid/html/structxbt__set__elm__.html 5121 +/doc/simgrid/html/group__XBT__cfg__get.html 19320 +/doc/simgrid/html/bindings.html 23685 +/doc/simgrid/html/group__XBT__dict.html 6916 +/doc/simgrid/html/use.html 3904 +/doc/simgrid/html/group__XBT__dict__basic.html 20935 +/doc/simgrid/html/group__XBT__graph.html 23682 +/doc/simgrid/html/group__XBT__mallocator.html 6444 +/doc/simgrid/html/structsurf__workstation__model__extension__public.html 11076 +/doc/simgrid/html/publis.html 435 +/doc/simgrid/html/group__XBT__misc.html 4663 +/doc/simgrid/html/simdag.html 226 +/doc/simgrid/html/Paje_MSG_screenshot.jpg 340759 +/doc/simgrid/html/group__msg__gos__functions.html 65293 +/doc/simgrid/html/classsimgrid_1_1msg_1_1Host.html 1519 +/doc/simgrid/html/publis_extern.html 435 +/doc/simgrid/html/group__MSG__LUA.html 5094 +/doc/simgrid/html/group__XBT__dynar.html 14081 +/doc/simgrid/html/structs__model__type.html 2480 +/doc/simgrid/html/group__XBT__synchro.html 19296 +/doc/simgrid/html/bc_s.png 677 +/doc/simgrid/html/classes.html 6934 +/doc/simgrid/html/group__XBT__fifo__direct.html 29778 +/doc/simgrid/html/group__XBT__cfg__use.html 37757 +/doc/simgrid/html/group__XBT__mallocator__objects.html 9306 +/doc/simgrid/html/classsimgrid_1_1msg_1_1Process.html 1519 +/doc/simgrid/html/group__XBT__dict__multi.html 18525 +/doc/simgrid/html/group__m__datatypes__management.html 16459 +/doc/simgrid/html/tab_b.png 178 +/doc/simgrid/html/group__SD__simulation.html 45009 +/doc/simgrid/html/group__msg__easier__life.html 50885 +/doc/simgrid/html/group__m__task__management.html 35307 +/doc/simgrid/html/tab_a.png 140 +/doc/simgrid/html/group__XBT__config.html 16354 +/doc/simgrid/html/options.html 7629 +/doc/simgrid/html/group__XBT__dict__nnul.html 18891 +/doc/simgrid/html/win_install_04.png 52033 +/doc/simgrid/html/structsurf__action.html 8353 +/doc/simgrid/html/group__XBT__ex.html 32537 +/doc/simgrid/html/group__SURF__API.html 6659 +/doc/simgrid/html/doxygen.css 12350 +/doc/simgrid/html/group__XBT__set__cons.html 7965 +/doc/simgrid/html/group__SURF__build__api.html 7821 +/doc/simgrid/html/group__m__process__management.html 47169 +/doc/simgrid/html/group__XBT__dict__curs.html 19747 +/doc/simgrid/html/group__SD__datatypes__management.html 20816 +/doc/simgrid/html/group__SD__API.html 8379 +/doc/simgrid/html/group__SMPI__API.html 4776 +/doc/simgrid/html/group__XBT__dynar__perl.html 12131 +/doc/simgrid/html/group__XBT__cfg__register.html 15874 +/doc/simgrid/html/publis_core.html 435 +/doc/simgrid/html/group__SD__workstation__management.html 46397 +/doc/simgrid/html/MSG_ex_master_slave_lua.html 4794 +/doc/simgrid/html/group__MSG__API.html 6026 +/doc/simgrid/html/msg.html 227 +/doc/simgrid/html/group__SD__task__management.html 60347 +/doc/simgrid/html/group__XBT__syscall.html 10095 +/doc/simgrid/html/group__XBT__heap.html 18482 +/doc/simgrid/html/structsurf__action__state.html 7301 +/doc/simgrid/html/tab_s.png 189 +/doc/simgrid/html/tab_h.png 192 +/doc/simgrid/html/nav_h.png 97 +/include/smpi/mpif.h 4826 +/include/smpi/smpif.h 1139 +/include/smpi/mpi.h 510 +/include/smpi/smpi_cocci.h 3187 +/include/smpi/smpi.h 24101 +/include/xbt/fifo.h 3626 +/include/xbt/dict.h 7459 +/include/xbt/str.h 2111 +/include/xbt/log.h 25433 +/include/xbt/misc.h 8031 +/include/xbt/synchro_core.h 4477 +/include/xbt/mmalloc.h 1976 +/include/xbt/replay_trace_reader.h 917 +/include/xbt/function_types.h 1111 +/include/xbt/strbuff.h 1281 +/include/xbt/virtu.h 684 +/include/xbt/asserts.h 1871 +/include/xbt/ex.h 23255 +/include/xbt/graph.h 5668 +/include/xbt/graphxml.h 5474 +/include/xbt/queue.h 2252 +/include/xbt/matrix.h 3027 +/include/xbt/setset.h 2422 +/include/xbt/time.h 743 +/include/xbt/lib.h 2014 +/include/xbt/hash.h 1064 +/include/xbt/set.h 4383 +/include/xbt/config.h 9224 +/include/xbt/sysdep.h 4941 +/include/xbt/swag.h 5352 +/include/xbt/graphxml_parse.h 1926 +/include/xbt/peer.h 870 +/include/xbt/module.h 648 +/include/xbt/cunit.h 5523 +/include/xbt/parmap.h 1166 +/include/xbt/mallocator.h 2296 +/include/xbt/dynar.h 9553 +/include/xbt/heap.h 1444 +/include/xbt.h 876 +/include/msg/datatypes.h 4635 +/include/msg/msg.h 12038 +/include/simgrid_config.h 3641 +/include/mc/modelchecker.h 96 +/include/surf/simgrid_dtd.h 23583 +/include/surf/surf_routing.h 1167 +/include/surf/surfxml_parse.h 5343 +/include/instr/instr.h 5750 +/include/simdag/simdag.h 10325 +/include/simdag/datatypes.h 3715 +/include/simix/simix.h 13003 +/include/simix/datatypes.h 3346 +/include/simix/context.h 4040 +/lib/libsimgrid.so.3.6.2 12710497 +/bin/smpicc 918 +/bin/smpirun 7292 +/bin/smpif2c 1990 +/bin/simgrid_update_xml 5018 +/bin/graphicator 66986 +/bin/simgrid-colorizer 2993 +/bin/smpiff 820 +/bin/tesh 356434 diff --git a/examples/platforms/content/win_storage_content.txt b/examples/platforms/content/win_storage_content.txt index cf109af3fa..48972cabdd 100644 --- a/examples/platforms/content/win_storage_content.txt +++ b/examples/platforms/content/win_storage_content.txt @@ -1,36 +1,36 @@ -.\Windows\avastSS.scr 41664 -.\Windows\bfsvc.exe 75264 -.\Windows\bootstat.dat 67584 -.\Windows\CoreSingleLanguage.xml 31497 -.\Windows\csup.txt 12 -.\Windows\dchcfg64.exe 335464 -.\Windows\dcmdev64.exe 93288 -.\Windows\DirectX.log 10486 -.\Windows\DPINST.LOG 18944 -.\Windows\DtcInstall.log 1955 -.\Windows\explorer.exe 2380944 -.\Windows\font1.sii 4907 -.\Windows\font2.sii 8698 -.\Windows\hapint.exe 382056 -.\Windows\HelpPane.exe 883712 -.\Windows\hh.exe 17408 -.\Windows\MEMORY.DMP 2384027342 -.\Windows\mib.bin 43131 -.\Windows\notepad.exe 243712 -.\Windows\PFRO.log 6770 -.\Windows\Professional.xml 31881 -.\Windows\regedit.exe 159232 -.\Windows\setupact.log 101663 -.\Windows\setuperr.log 0 -.\Windows\splwow64.exe 126464 -.\Windows\Starter.xml 31537 -.\Windows\system.ini 219 -.\Windows\twain_32.dll 50176 -.\Windows\vmgcoinstall.log 1585 -.\Windows\win.ini 92 -.\Windows\WindowsUpdate.log 1518934 -.\Windows\winhlp32.exe 10752 -.\Windows\WLXPGSS.SCR 322048 -.\Windows\WMSysPr9.prx 316640 -.\Windows\write.exe 10752 -.\Windows\_isusr32.dll 180320 \ No newline at end of file +\Windows\avastSS.scr 41664 +\Windows\bfsvc.exe 75264 +\Windows\bootstat.dat 67584 +\Windows\CoreSingleLanguage.xml 31497 +\Windows\csup.txt 12 +\Windows\dchcfg64.exe 335464 +\Windows\dcmdev64.exe 93288 +\Windows\DirectX.log 10486 +\Windows\DPINST.LOG 18944 +\Windows\DtcInstall.log 1955 +\Windows\explorer.exe 2380944 +\Windows\font1.sii 4907 +\Windows\font2.sii 8698 +\Windows\hapint.exe 382056 +\Windows\HelpPane.exe 883712 +\Windows\hh.exe 17408 +\Windows\MEMORY.DMP 2384027342 +\Windows\mib.bin 43131 +\Windows\notepad.exe 243712 +\Windows\PFRO.log 6770 +\Windows\Professional.xml 31881 +\Windows\regedit.exe 159232 +\Windows\setupact.log 101663 +\Windows\setuperr.log 0 +\Windows\splwow64.exe 126464 +\Windows\Starter.xml 31537 +\Windows\system.ini 219 +\Windows\twain_32.dll 50176 +\Windows\vmgcoinstall.log 1585 +\Windows\win.ini 92 +\Windows\WindowsUpdate.log 1518934 +\Windows\winhlp32.exe 10752 +\Windows\WLXPGSS.SCR 322048 +\Windows\WMSysPr9.prx 316640 +\Windows\write.exe 10752 +\Windows\_isusr32.dll 180320 \ No newline at end of file diff --git a/examples/platforms/storage.xml b/examples/platforms/storage.xml index 7f755de7d1..988e40b709 100644 --- a/examples/platforms/storage.xml +++ b/examples/platforms/storage.xml @@ -23,21 +23,21 @@ - + - + content_type="txt_windows" attach="alice" /> + + content_type="txt_unix" attach="denise"/> - + @@ -45,7 +45,7 @@ - + diff --git a/examples/simdag/io/io.tesh b/examples/simdag/io/io.tesh index 928bd2e624..2f2ceed7f5 100644 --- a/examples/simdag/io/io.tesh +++ b/examples/simdag/io/io.tesh @@ -1,8 +1,8 @@ #! ./tesh $ ${bindir:=.}/io/sd_io ${srcdir:=.}/examples/platforms/storage.xml +> [0.000000] [sd_io/INFO] Workstation 'denise' mounts 'c:' > [0.000000] [sd_io/INFO] Workstation 'denise' mounts '/home' -> [0.000000] [sd_io/INFO] Workstation 'denise' mounts '/windows' -> [0.000000] [sd_io/INFO] Workstation 'alice' mounts '/windows' +> [0.000000] [sd_io/INFO] Workstation 'alice' mounts 'c:' > [0.000000] [sd_io/INFO] Workstation 'carl' mounts '/home' > [0.000000] [sd_io/INFO] Workstation 'bob' mounts '/home' diff --git a/examples/simdag/io/sd_io.c b/examples/simdag/io/sd_io.c index 9d62bc67b0..990144fbc1 100644 --- a/examples/simdag/io/sd_io.c +++ b/examples/simdag/io/sd_io.c @@ -32,7 +32,7 @@ int main(int argc, char **argv) total_nworkstations = SD_workstation_get_number(); for (ctr=0; ctrGetStringUTFChars(env, jstorage, 0); +Java_org_simgrid_msg_File_open(JNIEnv *env, jobject jfile, jobject jpath) { const char *path = (*env)->GetStringUTFChars(env, jpath, 0); msg_file_t file; - file = MSG_file_open(storage, path, NULL); + file = MSG_file_open(path, NULL); jfile_bind(env, jfile, file); - (*env)->ReleaseStringUTFChars(env, jstorage, storage); (*env)->ReleaseStringUTFChars(env, jpath, path); } JNIEXPORT jlong JNICALL diff --git a/src/bindings/java/jmsg_file.h b/src/bindings/java/jmsg_file.h index 05dc5751ff..e2c0352e39 100644 --- a/src/bindings/java/jmsg_file.h +++ b/src/bindings/java/jmsg_file.h @@ -28,7 +28,7 @@ Java_org_simgrid_msg_File_nativeInit(JNIEnv*, jclass); * Signature (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V */ JNIEXPORT void JNICALL -Java_org_simgrid_msg_File_open(JNIEnv*, jobject, jobject, jobject); +Java_org_simgrid_msg_File_open(JNIEnv*, jobject, jobject); /** * Class org_simgrid_msg_File * Method read diff --git a/src/bindings/java/jmsg_process.c b/src/bindings/java/jmsg_process.c index fd7b069842..ed259b7440 100644 --- a/src/bindings/java/jmsg_process.c +++ b/src/bindings/java/jmsg_process.c @@ -405,7 +405,7 @@ Java_org_simgrid_msg_Process_setKillTime (JNIEnv *env , jobject jprocess, jdoubl JNIEXPORT jint JNICALL Java_org_simgrid_msg_Process_getCount(JNIEnv * env, jclass cls) { - /* FIXME: the next test on SimGrid version is to ensure that this still compiles with SG 3.8 while the C function were added in SG 3.9 only. + /* The next test on SimGrid version is to ensure that this still compiles with SG 3.8 while the C function were added in SG 3.9 only. * This kind of pimple becomes mandatory when you get so slow to release the java version that it begins evolving further after the C release date. */ #if SIMGRID_VERSION >= 30900 diff --git a/src/bindings/java/org/simgrid/NativeLib.java b/src/bindings/java/org/simgrid/NativeLib.java new file mode 100644 index 0000000000..130c904f6c --- /dev/null +++ b/src/bindings/java/org/simgrid/NativeLib.java @@ -0,0 +1,112 @@ +package org.simgrid; + +import java.io.FileOutputStream; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.File; + +public final class NativeLib { + + public static String getPath() { + String prefix = "NATIVE"; + String os = System.getProperty("os.name"); + String arch = System.getProperty("os.arch"); + + if (os.toLowerCase().startsWith("^win")) + os = "Windows"; + else if (os.contains("OS X")) + os = "Darwin"; + + if (arch.matches("^i[3-6]86$")) + arch = "x86"; + else if (arch.equalsIgnoreCase("amd64")) + arch = "x86_64"; + + os = os.replace(' ', '_'); + arch = arch.replace(' ', '_'); + + return prefix + "/" + os + "/" + arch + "/"; + } + public static void nativeInit(String name) { + try { + /* prefer the version on disk, if existing */ + System.loadLibrary(name); + } catch (UnsatisfiedLinkError e) { + /* If not found, unpack the one bundled into the jar file and use it */ + loadLib(name); + } + } + + private static void loadLib (String name) { + String Path = NativeLib.getPath(); + + String filename=name; + InputStream in = NativeLib.class.getClassLoader().getResourceAsStream(Path+filename); + + if (in == null) { + filename = "lib"+name+".so"; + in = NativeLib.class.getClassLoader().getResourceAsStream(Path+filename); + } + if (in == null) { + filename = name+".dll"; + in = NativeLib.class.getClassLoader().getResourceAsStream(Path+filename); + } + if (in == null) { + filename = "lib"+name+".dll"; + in = NativeLib.class.getClassLoader().getResourceAsStream(Path+filename); + } + if (in == null) { + filename = "lib"+name+".dylib"; + in = NativeLib.class.getClassLoader().getResourceAsStream(Path+filename); + } + if (in == null) { + throw new RuntimeException("Cannot find library "+name+" in path "+Path+". Sorry, but this jar does not seem to be usable on your machine."); + } + try { + // We must write the lib onto the disk before loading it -- stupid operating systems + File fileOut = new File(filename); + fileOut = File.createTempFile(name+"-", ".tmp"); + // don't leak the file on disk, but remove it on JVM shutdown + Runtime.getRuntime().addShutdownHook(new Thread(new FileCleaner(fileOut.getAbsolutePath()))); + OutputStream out = new FileOutputStream(fileOut); + + /* copy the library in position */ + byte[] buffer = new byte[4096]; + int bytes_read; + while ((bytes_read = in.read(buffer)) != -1) // Read until EOF + out.write(buffer, 0, bytes_read); + + /* close all file descriptors, and load that shit */ + in.close(); + out.close(); + System.load(fileOut.getAbsolutePath()); + + } catch (Exception e) { + System.err.println("Cannot load the bindings to the "+name+" library: "); + e.printStackTrace(); + System.err.println("This jar file does not seem to fit your system, sorry"); + System.exit(1); + } + } + + /* A hackish mechanism used to remove the file containing our library when the JVM shuts down */ + private static class FileCleaner implements Runnable { + private String target; + public FileCleaner(String name) { + target = name; + } + public void run() { + try { + new File(target).delete(); + } catch(Exception e) { + System.out.println("Unable to clean temporary file "+target+" during shutdown."); + e.printStackTrace(); + } + } + } + + + public static void main(String[] args) { + System.out.println(getPath()); + } +} diff --git a/src/bindings/java/org/simgrid/msg/Msg.java b/src/bindings/java/org/simgrid/msg/Msg.java index 108c7b53b7..ec212a7d8e 100644 --- a/src/bindings/java/org/simgrid/msg/Msg.java +++ b/src/bindings/java/org/simgrid/msg/Msg.java @@ -7,6 +7,7 @@ * under the terms of the license (GNU LGPL) which comes with this package. */ package org.simgrid.msg; +import org.simgrid.NativeLib; import java.io.FileOutputStream; import java.io.InputStream; @@ -17,98 +18,19 @@ import java.io.File; public final class Msg { /* Statically load the library which contains all native functions used in here */ static private boolean isNativeInited = false; - public static void nativeInit() { - if (isNativeInited) - return; - try { - /* prefer the version on disk, if existing */ - System.loadLibrary("simgrid-java"); - } catch (UnsatisfiedLinkError e) { - /* If not found, unpack the one bundled into the jar file and use it */ - loadLib("simgrid"); - loadLib("simgrid-java"); - } + public static void nativeInit() { + if (isNativeInited) + return; + NativeLib.nativeInit("simgrid"); + NativeLib.nativeInit("simgrid-java"); isNativeInited = true; + } + static { - nativeInit(); + nativeInit(); } - private static void loadLib (String name) { - String Path = NativeLib.getPath(); - - String filename=name; - InputStream in = Msg.class.getClassLoader().getResourceAsStream(Path+filename); - - if (in == null) { - filename = "lib"+name+".so"; - in = Msg.class.getClassLoader().getResourceAsStream(Path+filename); - } - if (in == null) { - filename = name+".dll"; - in = Msg.class.getClassLoader().getResourceAsStream(Path+filename); - } - if (in == null) { - filename = "lib"+name+".dll"; - in = Msg.class.getClassLoader().getResourceAsStream(Path+filename); - } - if (in == null) { - filename = "lib"+name+".dylib"; - in = Msg.class.getClassLoader().getResourceAsStream(Path+filename); - } - if (in == null) { - throw new RuntimeException("Cannot find library "+name+" in path "+Path+". Sorry, but this jar does not seem to be usable on your machine."); - } -// Caching the file on disk: desactivated because it could fool the users -// if (new File(filename).isFile()) { -// // file was already unpacked -- use it directly -// System.load(new File(".").getAbsolutePath()+File.separator+filename); -// return; -// } - try { - // We must write the lib onto the disk before loading it -- stupid operating systems - File fileOut = new File(filename); -// if (!new File(".").canWrite()) { -// System.out.println("Cannot write in ."+File.separator+filename+"; unpacking the library into a temporary file instead"); - fileOut = File.createTempFile("simgrid-", ".tmp"); - // don't leak the file on disk, but remove it on JVM shutdown - Runtime.getRuntime().addShutdownHook(new Thread(new FileCleaner(fileOut.getAbsolutePath()))); -// } -// System.out.println("Unpacking SimGrid native library to " + fileOut.getAbsolutePath()); - OutputStream out = new FileOutputStream(fileOut); - - /* copy the library in position */ - byte[] buffer = new byte[4096]; - int bytes_read; - while ((bytes_read = in.read(buffer)) != -1) // Read until EOF - out.write(buffer, 0, bytes_read); - - /* close all file descriptors, and load that shit */ - in.close(); - out.close(); - System.load(fileOut.getAbsolutePath()); - } catch (Exception e) { - System.err.println("Cannot load the bindings to the simgrid library: "); - e.printStackTrace(); - System.err.println("This jar file does not seem to fit your system, sorry"); - System.exit(1); - } - } - /* A hackish mechanism used to remove the file containing our library when the JVM shuts down */ - private static class FileCleaner implements Runnable { - private String target; - public FileCleaner(String name) { - target = name; - } - public void run() { - try { - new File(target).delete(); - } catch(Exception e) { - System.out.println("Unable to clean temporary file "+target+" during shutdown."); - e.printStackTrace(); - } - } - } - + /** Retrieve the simulation time * @return The simulation time. */ diff --git a/src/bindings/java/surf.i b/src/bindings/java/surf.i new file mode 100644 index 0000000000..3fc90338f1 --- /dev/null +++ b/src/bindings/java/surf.i @@ -0,0 +1,96 @@ +/* File : example.i */ +%module(directors="1") Surf + +%pragma(java) jniclassimports=%{ +import org.simgrid.NativeLib; + +%} +%pragma(java) jniclasscode=%{ + static { + NativeLib.nativeInit("surf-java"); + Runtime.getRuntime().addShutdownHook( + new Thread() { + public void run() { + Thread.currentThread().setName( "Destroyer" ); + Surf.clean(); + } + } + ); + } +%} + +%{ +#include "src/surf/cpu_interface.hpp" +#include "src/surf/network_interface.hpp" +#include "src/bindings/java/surf_swig.hpp" +#include "src/xbt/dict_private.h" +typedef struct lmm_constraint *lmm_constraint_t; +%} + +%feature("director") Plugin; + +%include "src/bindings/java/surf_swig.hpp" + +%nodefaultctor Model; +class Model { +public: + const char *getName(); +}; + +class Resource { +public: + Resource(); + const char *getName(); + virtual bool isUsed()=0; + lmm_constraint *getConstraint(); + s_xbt_dict *getProperties(); +}; + +class Cpu : public Resource { +public: + Cpu(); + ~Cpu(); + double getCurrentPowerPeak(); +}; + +class NetworkLink : public Resource { +public: + NetworkLink(); + ~NetworkLink(); +}; + +class Action { +public: + Model *getModel(); +}; + +class CpuAction : public Action { +public: +%extend { + Cpu *getCpu() {return getActionCpu($self);} +} +}; + +%nodefaultctor NetworkAction; +class NetworkAction : public Action { +public: +%extend { + double getLatency() {return $self->m_latency;} +} +}; + + +%rename lmm_constraint LmmConstraint; +struct lmm_constraint { +%extend { + double getUsage() {return lmm_constraint_get_usage($self);} +} +}; + +%rename s_xbt_dict XbtDict; +struct s_xbt_dict { +%extend { + char *getValue(char *key) {return (char*)xbt_dict_get_or_null($self, key);} +} +}; + diff --git a/src/bindings/java/surf_swig.cpp b/src/bindings/java/surf_swig.cpp new file mode 100644 index 0000000000..b5a376ff0b --- /dev/null +++ b/src/bindings/java/surf_swig.cpp @@ -0,0 +1,48 @@ +#include +#include "src/surf/surf_interface.hpp" +#include "surf_swig.hpp" +#include "src/simix/smx_private.h" + + +double getClock() { + return surf_get_clock(); +} + +void clean() { + SIMIX_clean(); +} + +void Plugin::activateCpuCreatedCallback(){ + surf_callback_connect(cpuCreatedCallbacks, boost::bind(&Plugin::cpuCreatedCallback, this, _1)); +} + +void Plugin::activateCpuDestructedCallback(){ + surf_callback_connect(cpuDestructedCallbacks, boost::bind(&Plugin::cpuDestructedCallback, this, _1)); +} + +void Plugin::activateCpuStateChangedCallback(){ + surf_callback_connect(cpuStateChangedCallbacks, boost::bind(&Plugin::cpuStateChangedCallback, this, _1)); +} + +void Plugin::activateCpuActionStateChangedCallback(){ + surf_callback_connect(cpuActionStateChangedCallbacks, boost::bind(&Plugin::cpuActionStateChangedCallback, this, _1)); +} + + +void Plugin::activateNetworkLinkCreatedCallback(){ + surf_callback_connect(networkLinkCreatedCallbacks, boost::bind(&Plugin::networkLinkCreatedCallback, this, _1)); +} + +void Plugin::activateNetworkLinkDestructedCallback(){ + surf_callback_connect(networkLinkDestructedCallbacks, boost::bind(&Plugin::networkLinkDestructedCallback, this, _1)); +} + +void Plugin::activateNetworkLinkStateChangedCallback(){ + surf_callback_connect(networkLinkStateChangedCallbacks, boost::bind(&Plugin::networkLinkStateChangedCallback, this, _1)); +} + +void Plugin::activateNetworkActionStateChangedCallback(){ + surf_callback_connect(networkActionStateChangedCallbacks, boost::bind(&Plugin::networkActionStateChangedCallback, this, _1)); +} + + diff --git a/src/bindings/java/surf_swig.hpp b/src/bindings/java/surf_swig.hpp new file mode 100644 index 0000000000..39eb67dfc0 --- /dev/null +++ b/src/bindings/java/surf_swig.hpp @@ -0,0 +1,50 @@ +#include +#include +#include "src/surf/cpu_interface.hpp" +#include "src/surf/network_interface.hpp" +#include "src/surf/maxmin_private.hpp" + +double getClock(); + +#ifdef __cplusplus +extern "C" { +#endif +void clean(); +#ifdef __cplusplus +} +#endif + +class Plugin { +public: + virtual ~Plugin() { + std::cout << "Plugin::~Plugin()" << std:: endl; + } + + void activateCpuCreatedCallback(); + virtual void cpuCreatedCallback(Cpu *cpu) {} + + void activateCpuDestructedCallback(); + virtual void cpuDestructedCallback(Cpu *cpu) {} + + void activateCpuStateChangedCallback(); + virtual void cpuStateChangedCallback(Cpu *cpu) {} + + void activateCpuActionStateChangedCallback(); + virtual void cpuActionStateChangedCallback(CpuAction *action) {} + + + void activateNetworkLinkCreatedCallback(); + virtual void networkLinkCreatedCallback(NetworkLink *link) {} + + void activateNetworkLinkDestructedCallback(); + virtual void networkLinkDestructedCallback(NetworkLink *link) {} + + void activateNetworkLinkStateChangedCallback(); + virtual void networkLinkStateChangedCallback(NetworkLink *link) {} + + void activateNetworkActionStateChangedCallback(); + virtual void networkActionStateChangedCallback(NetworkAction *action) {} + +}; + + diff --git a/src/include/mc/mc.h b/src/include/mc/mc.h index 21d00c1a70..d7a6973f6c 100644 --- a/src/include/mc/mc.h +++ b/src/include/mc/mc.h @@ -17,7 +17,7 @@ #include "xbt/automaton.h" #include "xbt/dynar.h" -#define STD_HEAP_SIZE 20480000 /* Maximum size of the system's heap */ +#define STD_HEAP_SIZE (50*1024*1024) /* Maximum size of the system's heap */ SG_BEGIN_DECL() diff --git a/src/include/surf/surf.h b/src/include/surf/surf.h index 196cb156b3..0eeb7c2536 100644 --- a/src/include/surf/surf.h +++ b/src/include/surf/surf.h @@ -413,7 +413,7 @@ XBT_PUBLIC(surf_action_t) surf_workstation_sleep(surf_resource_t resource, doubl * @param path The path to the file * @return The surf action corresponding to the openning */ -XBT_PUBLIC(surf_action_t) surf_workstation_open(surf_resource_t workstation, const char* mount, const char* path); +XBT_PUBLIC(surf_action_t) surf_workstation_open(surf_resource_t workstation, const char* fullpath); /** * @brief Close a file descriptor on a workstation @@ -640,12 +640,20 @@ XBT_PUBLIC(void) surf_workstation_set_power_peak_at(surf_resource_t host, int ps XBT_PUBLIC(double) surf_workstation_get_consumed_energy(surf_resource_t host); /** - * @brief Get the list of storages of a workstation + * @brief Get the list of storages mounted on a workstation * * @param workstation The surf workstation * @return Dictionary of mount point, Storage */ -XBT_PUBLIC(xbt_dict_t) surf_workstation_get_storage_list(surf_resource_t workstation); +XBT_PUBLIC(xbt_dict_t) surf_workstation_get_mounted_storage_list(surf_resource_t workstation); + +/** + * @brief Get the list of storages attached to a workstation + * + * @param workstation The surf workstation + * @return Dictionary of storage + */ +XBT_PUBLIC(xbt_dynar_t) surf_workstation_get_attached_storage_list(surf_resource_t workstation); /** * @brief Unlink a file descriptor @@ -898,6 +906,15 @@ XBT_PUBLIC(surf_file_t) surf_storage_action_get_file(surf_action_t action); */ XBT_PUBLIC(xbt_dict_t) surf_storage_action_get_ls_dict(surf_action_t action); + +/** + * @brief Get the host the storage is attached to + * + * @param resource The surf storage + * @return The host name + */ +XBT_PUBLIC(const char * ) surf_storage_get_host(surf_resource_t resource); + XBT_PUBLIC(surf_model_t) surf_resource_model(const void *host, int level); /** @} */ diff --git a/src/instr/instr_config.c b/src/instr/instr_config.c index 8fa57c0907..4093e78b79 100644 --- a/src/instr/instr_config.c +++ b/src/instr/instr_config.c @@ -353,110 +353,110 @@ void TRACE_global_init(int *argc, char **argv) /* tracing */ xbt_cfg_register(&_sg_cfg_set, OPT_TRACING, "Enable Tracing.", - xbt_cfgelm_boolean, 0, 1, NULL, NULL); + xbt_cfgelm_boolean, 1, 1, NULL, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING, "no"); /* register platform in the trace */ xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_PLATFORM, "Register the platform in the trace as a hierarchy.", - xbt_cfgelm_boolean, 0, 1, NULL, NULL); + xbt_cfgelm_boolean, 1, 1, NULL, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING_PLATFORM, "no"); /* register platform in the trace */ xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_TOPOLOGY, "Register the platform topology in the trace as a graph.", - xbt_cfgelm_boolean, 0, 1, NULL, NULL); + xbt_cfgelm_boolean, 1, 1, NULL, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING_TOPOLOGY, "yes"); /* smpi */ xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_SMPI, "Tracing of the SMPI interface.", - xbt_cfgelm_boolean, 0, 1, NULL, NULL); + xbt_cfgelm_boolean, 1, 1, NULL, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING_SMPI, "no"); /* smpi grouped */ xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_SMPI_GROUP, "Group MPI processes by host.", - xbt_cfgelm_boolean, 0, 1, NULL, NULL); + xbt_cfgelm_boolean, 1, 1, NULL, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING_SMPI_GROUP, "no"); /* smpi computing */ xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_SMPI_COMPUTING, "Generate states for timing out of SMPI parts of the application", - xbt_cfgelm_boolean, 0, 1, NULL, NULL); + xbt_cfgelm_boolean, 1, 1, NULL, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING_SMPI_COMPUTING, "no"); /* smpi internals */ xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_SMPI_INTERNALS, "View internal messages sent by Collective communications in SMPI", - xbt_cfgelm_boolean, 0, 1, NULL, NULL); + xbt_cfgelm_boolean, 1, 1, NULL, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING_SMPI_INTERNALS, "no"); /* tracing categorized resource utilization traces */ xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_CATEGORIZED, "Tracing categorized resource utilization of hosts and links.", - xbt_cfgelm_boolean, 0, 1, NULL, NULL); + xbt_cfgelm_boolean, 1, 1, NULL, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING_CATEGORIZED, "no"); /* tracing uncategorized resource utilization */ xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_UNCATEGORIZED, "Tracing uncategorized resource utilization of hosts and links.", - xbt_cfgelm_boolean, 0, 1, NULL, NULL); + xbt_cfgelm_boolean, 1, 1, NULL, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING_UNCATEGORIZED, "no"); /* msg process */ xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_MSG_PROCESS, "Tracing of MSG process behavior.", - xbt_cfgelm_boolean, 0, 1, NULL, NULL); + xbt_cfgelm_boolean, 1, 1, NULL, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING_MSG_PROCESS, "no"); /* msg process */ xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_MSG_VM, "Tracing of MSG process behavior.", - xbt_cfgelm_boolean, 0, 1, NULL, NULL); + xbt_cfgelm_boolean, 1, 1, NULL, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING_MSG_VM, "no"); /* disable tracing link */ xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_DISABLE_LINK, "Do not trace link bandwidth and latency.", - xbt_cfgelm_boolean, 0, 1, NULL, NULL); + xbt_cfgelm_boolean, 1, 1, NULL, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING_DISABLE_LINK, "no"); /* disable tracing link */ xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_DISABLE_POWER, "Do not trace host power.", - xbt_cfgelm_boolean, 0, 1, NULL, NULL); + xbt_cfgelm_boolean, 1, 1, NULL, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING_DISABLE_POWER, "no"); /* tracing buffer */ xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_BUFFER, "Buffer trace events to put them in temporal order.", - xbt_cfgelm_boolean, 0, 1, NULL, NULL); + xbt_cfgelm_boolean, 1, 1, NULL, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING_BUFFER, "yes"); /* tracing one link only */ xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_ONELINK_ONLY, "Use only routes with one link to trace platform.", - xbt_cfgelm_boolean, 0, 1, NULL, NULL); + xbt_cfgelm_boolean, 1, 1, NULL, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING_ONELINK_ONLY, "no"); /* disable destroy */ xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_DISABLE_DESTROY, "Disable platform containers destruction.", - xbt_cfgelm_boolean, 0, 1, NULL, NULL); + xbt_cfgelm_boolean, 1, 1, NULL, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING_DISABLE_DESTROY, "no"); /* basic -- Avoid extended events (impoverished trace file) */ xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_BASIC, "Avoid extended events (impoverished trace file).", - xbt_cfgelm_boolean, 0, 1, NULL, NULL); + xbt_cfgelm_boolean, 1, 1, NULL, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING_BASIC, "no"); /* display_sizes -- Extended events with message size information */ xbt_cfg_register(&_sg_cfg_set, OPT_TRACING_DISPLAY_SIZES, "(smpi only for now) Extended events with message size information", - xbt_cfgelm_boolean, 0, 1, NULL, NULL); + xbt_cfgelm_boolean, 1, 1, NULL, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, OPT_TRACING_DISPLAY_SIZES, "no"); /* format -- Switch the ouput format of Tracing */ diff --git a/src/instr/jedule/jedule_platform.c b/src/instr/jedule/jedule_platform.c index b096eeddb4..370058c9cc 100644 --- a/src/instr/jedule/jedule_platform.c +++ b/src/instr/jedule/jedule_platform.c @@ -60,7 +60,9 @@ static void jed_free_container(jed_simgrid_container_t container) { xbt_free(container); } -void jed_simgrid_create_container(jed_simgrid_container_t *container, char *name) { +void jed_simgrid_create_container(jed_simgrid_container_t *container, + const char *name) +{ xbt_assert( name != NULL ); *container = xbt_new0(s_jed_simgrid_container_t,1); diff --git a/src/instr/jedule/jedule_sd_binding.c b/src/instr/jedule/jedule_sd_binding.c index ab945ffeae..4d11263c9d 100644 --- a/src/instr/jedule/jedule_sd_binding.c +++ b/src/instr/jedule/jedule_sd_binding.c @@ -16,6 +16,8 @@ #include "instr/jedule/jedule_platform.h" #include "instr/jedule/jedule_output.h" +#include "simdag/private.h" + #include #ifdef HAVE_JEDULE @@ -57,31 +59,33 @@ static void create_hierarchy(AS_t current_comp, jed_simgrid_container_t current_container) { xbt_dict_cursor_t cursor = NULL; - unsigned int dynar_cursor; char *key; AS_t elem; - sg_routing_edge_t network_elem; + xbt_dict_t routing_sons = surf_AS_get_routing_sons(current_comp); - if(xbt_dict_is_empty(current_comp->routing_sons)) { + if (xbt_dict_is_empty(routing_sons)) { // I am no AS // add hosts to jedule platform + xbt_dynar_t table = surf_AS_get_hosts(current_comp); xbt_dynar_t hosts; + unsigned int dynar_cursor; + sg_host_t host_elem; hosts = xbt_dynar_new(sizeof(char*), NULL); - xbt_dynar_foreach(current_comp->index_network_elm, - dynar_cursor, network_elem) { - xbt_dynar_push_as(hosts, char*, network_elem->name); + xbt_dynar_foreach(table, dynar_cursor, host_elem) { + xbt_dynar_push_as(hosts, char*, sg_host_name(host_elem)); } jed_simgrid_add_resources(current_container, hosts); xbt_dynar_free(&hosts); + xbt_dynar_free(&table); } else { - xbt_dict_foreach(current_comp->routing_sons, cursor, key, elem) { + xbt_dict_foreach(routing_sons, cursor, key, elem) { jed_simgrid_container_t child_container; - jed_simgrid_create_container(&child_container, elem->name); + jed_simgrid_create_container(&child_container, surf_AS_get_name(elem)); jed_simgrid_add_container(current_container, child_container); - XBT_DEBUG("name : %s\n", elem->name); + XBT_DEBUG("name : %s\n", surf_AS_get_name(elem)); create_hierarchy(elem, child_container); } } @@ -94,20 +98,15 @@ void jedule_setup_platform() jed_simgrid_container_t root_container; - jed_create_jedule(&jedule); - root_comp = routing_platf->root; - XBT_DEBUG("root name %s\n", root_comp->name); + root_comp = surf_AS_get_routing_root(); + XBT_DEBUG("root name %s\n", surf_AS_get_name(root_comp)); - // that doesn't work - // type = root_comp->get_network_element_type(root_comp->name); - - jed_simgrid_create_container(&root_container, root_comp->name); + jed_simgrid_create_container(&root_container, surf_AS_get_name(root_comp)); jedule->root_container = root_container; create_hierarchy(root_comp, root_container); - } diff --git a/src/mc/mc_memory.c b/src/mc/mc_memory.c index cc6350be6f..f734ec70ad 100644 --- a/src/mc/mc_memory.c +++ b/src/mc/mc_memory.c @@ -30,7 +30,7 @@ void MC_memory_init() raw_heap = NULL; #else /* Create the second region a page after the first one ends + safety gap */ - raw_heap = xbt_mheap_new(-1, (char*)(std_heap) + STD_HEAP_SIZE + getpagesize()); + raw_heap = xbt_mheap_new(-1, (char*)(std_heap) + STD_HEAP_SIZE + xbt_pagesize); xbt_assert(raw_heap != NULL); #endif } diff --git a/src/msg/msg_global.c b/src/msg/msg_global.c index eee4578bde..52d88d8870 100644 --- a/src/msg/msg_global.c +++ b/src/msg/msg_global.c @@ -71,7 +71,7 @@ void MSG_init_nocheck(int *argc, char **argv) { XBT_DEBUG("ADD MSG LEVELS"); MSG_HOST_LEVEL = xbt_lib_add_level(host_lib, (void_f_pvoid_t) __MSG_host_priv_free); MSG_STORAGE_LEVEL = xbt_lib_add_level(storage_lib, (void_f_pvoid_t) __MSG_storage_destroy); - + MSG_FILE_LEVEL = xbt_lib_add_level(file_lib, (void_f_pvoid_t) __MSG_file_destroy); if(sg_cfg_get_boolean("clean_atexit")) atexit(MSG_exit); } diff --git a/src/msg/msg_gos.c b/src/msg/msg_gos.c index b80ae0f7d1..dbf0eac49c 100644 --- a/src/msg/msg_gos.c +++ b/src/msg/msg_gos.c @@ -430,12 +430,10 @@ msg_comm_t MSG_task_isend_internal(msg_task_t task, const char *alias, } #ifdef HAVE_TRACING - if (TRACE_is_enabled()) { - simcall_set_category(comm->s_comm, task->category); - } -#endif + if (TRACE_is_enabled()) { + simcall_set_category(act, task->category); + } -#ifdef HAVE_TRACING if (call_end) TRACE_msg_task_put_end(); #endif diff --git a/src/msg/msg_host.c b/src/msg/msg_host.c index 5c2eec831c..00e126cedb 100644 --- a/src/msg/msg_host.c +++ b/src/msg/msg_host.c @@ -402,10 +402,21 @@ double MSG_get_host_consumed_energy(msg_host_t host) { * \param host a host * \return a dict containing all mount point on the host (mount_name => msg_storage_t) */ -xbt_dict_t MSG_host_get_storage_list(msg_host_t host) +xbt_dict_t MSG_host_get_mounted_storage_list(msg_host_t host) { xbt_assert((host != NULL), "Invalid parameters"); - return (simcall_host_get_storage_list(host)); + return (simcall_host_get_mounted_storage_list(host)); +} + +/** \ingroup m_host_management + * \brief Return the list of storages attached to an host. + * \param host a host + * \return a dynar containing all storages (name) attached to the host + */ +xbt_dynar_t MSG_host_get_attached_storage_list(msg_host_t host) +{ + xbt_assert((host != NULL), "Invalid parameters"); + return (simcall_host_get_attached_storage_list(host)); } /** \ingroup msg_host_management @@ -422,7 +433,7 @@ xbt_dict_t MSG_host_get_storage_content(msg_host_t host) char* mount_name; xbt_dict_cursor_t cursor = NULL; - xbt_dict_t storage_list = simcall_host_get_storage_list(host); + xbt_dict_t storage_list = simcall_host_get_mounted_storage_list(host); xbt_dict_foreach(storage_list,cursor,mount_name,storage_name){ storage = (msg_storage_t)xbt_lib_get_elm_or_null(storage_lib,storage_name); diff --git a/src/msg/msg_io.c b/src/msg/msg_io.c index 003705605f..ec54dd9a59 100644 --- a/src/msg/msg_io.c +++ b/src/msg/msg_io.c @@ -19,15 +19,17 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(msg_io, msg, /********************************* File **************************************/ void __MSG_file_get_info(msg_file_t fd){ - xbt_dynar_t info = simcall_file_get_info(fd->simdata->smx_file); + + msg_file_priv_t priv = MSG_file_priv(fd); + xbt_dynar_t info = simcall_file_get_info(priv->simdata->smx_file); sg_size_t *psize; - fd->info->content_type = xbt_dynar_pop_as(info, char *); - fd->info->storage_type = xbt_dynar_pop_as(info, char *); - fd->info->storageId = xbt_dynar_pop_as(info, char *); - fd->info->mount_point = xbt_dynar_pop_as(info, char *); + priv->content_type = xbt_dynar_pop_as(info, char *); + priv->storage_type = xbt_dynar_pop_as(info, char *); + priv->storageId = xbt_dynar_pop_as(info, char *); + priv->mount_point = xbt_dynar_pop_as(info, char *); psize = xbt_dynar_pop_as(info, sg_size_t*); - fd->info->size = *psize; + priv->size = *psize; xbt_free(psize); xbt_dynar_free_container(&info); } @@ -41,8 +43,8 @@ void __MSG_file_get_info(msg_file_t fd){ */ msg_error_t MSG_file_set_data(msg_file_t fd, void *data) { - SIMIX_file_set_data(fd->simdata->smx_file,data); - + msg_file_priv_t priv = MSG_file_priv(fd); + priv->data = data; return MSG_OK; } @@ -55,7 +57,8 @@ msg_error_t MSG_file_set_data(msg_file_t fd, void *data) */ void *MSG_file_get_data(msg_file_t fd) { - return SIMIX_file_get_data(fd->simdata->smx_file); + msg_file_priv_t priv = MSG_file_priv(fd); + return priv->data; } /** \ingroup msg_file_management @@ -65,19 +68,20 @@ void *MSG_file_get_data(msg_file_t fd) */ void MSG_file_dump (msg_file_t fd){ -// THROW_UNIMPLEMENTED; /* Update the cached information first */ __MSG_file_get_info(fd); + + msg_file_priv_t priv = MSG_file_priv(fd); XBT_INFO("File Descriptor information:\n" - "\t\tFull name: '%s'\n" + "\t\tFull path: '%s'\n" "\t\tSize: %llu\n" "\t\tMount point: '%s'\n" "\t\tStorage Id: '%s'\n" "\t\tStorage Type: '%s'\n" "\t\tContent Type: '%s'", - fd->fullname, fd->info->size, fd->info->mount_point, - fd->info->storageId, fd->info->storage_type, - fd->info->content_type); + priv->fullpath, priv->size, priv->mount_point, + priv->storageId, priv->storage_type, + priv->content_type); } /** \ingroup msg_file_management @@ -89,7 +93,8 @@ void MSG_file_dump (msg_file_t fd){ */ sg_size_t MSG_file_read(msg_file_t fd, sg_size_t size) { - return simcall_file_read(fd->simdata->smx_file, size); + msg_file_priv_t priv = MSG_file_priv(fd); + return simcall_file_read(priv->simdata->smx_file, size); } /** \ingroup msg_file_management @@ -101,27 +106,37 @@ sg_size_t MSG_file_read(msg_file_t fd, sg_size_t size) */ sg_size_t MSG_file_write(msg_file_t fd, sg_size_t size) { - return simcall_file_write(fd->simdata->smx_file, size); + msg_file_priv_t priv = MSG_file_priv(fd); + return simcall_file_write(priv->simdata->smx_file, size); } /** \ingroup msg_file_management * \brief Opens the file whose name is the string pointed to by path * * \param mount is the mount point where find the file is located - * \param fullname is the file location on the storage + * \param fullpath is the file location on the storage * \param data user data to attach to the file * * \return An #msg_file_t associated to the file */ -msg_file_t MSG_file_open(const char* mount, const char* fullname, void* data) +msg_file_t MSG_file_open(const char* fullpath, void* data) +{ + msg_file_priv_t priv = xbt_new(s_msg_file_priv_t, 1); + priv->data = data; + priv->fullpath = xbt_strdup(fullpath); + priv->simdata = xbt_new0(s_simdata_file_t,1); + priv->simdata->smx_file = simcall_file_open(fullpath); + xbt_lib_set(file_lib, fullpath, MSG_FILE_LEVEL, priv); + return (msg_file_t) xbt_lib_get_elm_or_null(file_lib, fullpath); +} + +/** + * \brief Frees private data of a file (internal call only) + */ +void __MSG_file_priv_free(msg_file_priv_t priv) { - msg_file_t file = xbt_new(s_msg_file_t,1); - file->fullname = xbt_strdup(fullname); - file->simdata = xbt_new0(s_simdata_file_t,1); - file->info = xbt_new0(s_msg_file_info_t,1); - file->simdata->smx_file = simcall_file_open(mount, fullname); - SIMIX_file_set_data(file->simdata->smx_file, data); - return file; + xbt_free(&priv->simdata->smx_file); + free(priv); } /** \ingroup msg_file_management @@ -132,11 +147,9 @@ msg_file_t MSG_file_open(const char* mount, const char* fullname, void* data) */ int MSG_file_close(msg_file_t fd) { - int res = simcall_file_close(fd->simdata->smx_file); - free(fd->fullname); - xbt_free(fd->simdata); - xbt_free(fd->info); - xbt_free(fd); + msg_file_priv_t priv = MSG_file_priv(fd); + int res = simcall_file_close(priv->simdata->smx_file); + xbt_lib_unset(file_lib, priv->fullpath, MSG_FILE_LEVEL, 1); return res; } @@ -148,11 +161,8 @@ int MSG_file_close(msg_file_t fd) */ int MSG_file_unlink(msg_file_t fd) { - int res = simcall_file_unlink(fd->simdata->smx_file); - free(fd->fullname); - xbt_free(fd->simdata); - xbt_free(fd->info); - xbt_free(fd); + msg_file_priv_t priv = MSG_file_priv(fd); + int res = simcall_file_unlink(priv->simdata->smx_file); return res; } @@ -163,7 +173,8 @@ int MSG_file_unlink(msg_file_t fd) * \return the size of the file (as a #sg_size_t) */ sg_size_t MSG_file_get_size(msg_file_t fd){ - return simcall_file_get_size(fd->simdata->smx_file); + msg_file_priv_t priv = MSG_file_priv(fd); + return simcall_file_get_size(priv->simdata->smx_file); } /** \ingroup msg_file_management @@ -190,7 +201,7 @@ xbt_dict_t MSG_file_ls(const char *mount, const char *path) return simcall_file_ls(mount, path); } -/* +/** * \ingroup msg_file_management * \brief Set the file position indicator in the msg_file_t by adding offset bytes * to the position specified by origin (either SEEK_SET, SEEK_CUR, or SEEK_END). @@ -198,7 +209,7 @@ xbt_dict_t MSG_file_ls(const char *mount, const char *path) * \param fd : file object that identifies the stream * \param offset : number of bytes to offset from origin * \param origin : Position used as reference for the offset. It is specified by - * one of the following constants defined in exclusively to be used as + * one of the following constants defined in \ exclusively to be used as * arguments for this function (SEEK_SET = beginning of file, SEEK_CUR = current * position of the file pointer, SEEK_END = end of file) * @@ -208,11 +219,11 @@ xbt_dict_t MSG_file_ls(const char *mount, const char *path) */ msg_error_t MSG_file_seek(msg_file_t fd, sg_size_t offset, int origin) { - //THROW_UNIMPLEMENTED; - return simcall_file_seek(fd->simdata->smx_file, offset, origin); + msg_file_priv_t priv = MSG_file_priv(fd); + return simcall_file_seek(priv->simdata->smx_file, offset, origin); } -/* +/** * \ingroup msg_file_management * \brief Returns the current value of the position indicator of the file * @@ -222,10 +233,25 @@ msg_error_t MSG_file_seek(msg_file_t fd, sg_size_t offset, int origin) */ sg_size_t MSG_file_tell(msg_file_t fd) { - return simcall_file_tell(fd->simdata->smx_file); + msg_file_priv_t priv = MSG_file_priv(fd); + return simcall_file_tell(priv->simdata->smx_file); +} + +const char *MSG_file_get_name(msg_file_t fd) { + xbt_assert((fd != NULL), "Invalid parameters"); + msg_file_priv_t priv = MSG_file_priv(fd); + return priv->fullpath; } +/* + * \brief Destroys a file (internal call only) + */ +void __MSG_file_destroy(msg_file_priv_t file) { + xbt_free(file->fullpath); + xbt_free(file->simdata); + xbt_free(file); +} /********************************* Storage **************************************/ /** @addtogroup msg_storage_management @@ -237,7 +263,9 @@ sg_size_t MSG_file_tell(msg_file_t fd) msg_storage_t __MSG_storage_create(smx_storage_t storage) { const char *name = SIMIX_storage_get_name(storage); + const char *host = SIMIX_storage_get_host(storage); msg_storage_priv_t storage_private = xbt_new0(s_msg_storage_priv_t, 1); + storage_private->host = host; xbt_lib_set(storage_lib,name,MSG_STORAGE_LEVEL,storage_private); return xbt_lib_get_elm_or_null(storage_lib, name); } @@ -246,10 +274,10 @@ msg_storage_t __MSG_storage_create(smx_storage_t storage) * \brief Destroys a storage (internal call only) */ void __MSG_storage_destroy(msg_storage_priv_t storage) { - free(storage); } + /** \ingroup msg_storage_management * * \brief Returns the name of the #msg_storage_t. @@ -324,12 +352,11 @@ xbt_dynar_t MSG_storages_as_dynar(void) { xbt_dynar_t res = xbt_dynar_new(sizeof(msg_storage_t),NULL); xbt_lib_foreach(storage_lib, cursor, key, data) { - if(routing_get_network_element_type(key) == MSG_STORAGE_LEVEL) { + if(xbt_lib_get_level(xbt_lib_get_elm_or_null(storage_lib, key), MSG_STORAGE_LEVEL) != NULL) { xbt_dictelm_t elm = xbt_dict_cursor_get_elm(cursor); xbt_dynar_push(res, &elm); } } - return res; } @@ -341,8 +368,8 @@ xbt_dynar_t MSG_storages_as_dynar(void) { */ msg_error_t MSG_storage_set_data(msg_storage_t storage, void *data) { - SIMIX_storage_set_data(storage,data); - + msg_storage_priv_t priv = MSG_storage_priv(storage); + priv->data = data; return MSG_OK; } @@ -355,7 +382,9 @@ msg_error_t MSG_storage_set_data(msg_storage_t storage, void *data) */ void *MSG_storage_get_data(msg_storage_t storage) { - return SIMIX_storage_get_data(storage); + xbt_assert((storage != NULL), "Invalid parameters"); + msg_storage_priv_t priv = MSG_storage_priv(storage); + return priv->data; } /** \ingroup msg_storage_management @@ -374,7 +403,7 @@ sg_size_t MSG_storage_get_size(msg_storage_t storage) return SIMIX_storage_get_size(storage); } -/* +/** * \ingroup msg_storage_management * * \brief Rename the file in the contents of its associated storage. @@ -385,7 +414,7 @@ msg_error_t MSG_storage_file_rename(msg_storage_t storage, const char* src, con return MSG_OK; } -/* +/** * \ingroup msg_storage_management * \brief Move a file to another location. Depending on the values of dest, dest, mount, * and fullname, this move can be local or remote and, within a host, on the same @@ -397,3 +426,15 @@ msg_error_t MSG_storage_file_move (msg_file_t fd, msg_host_t dest, char* mount, THROW_UNIMPLEMENTED; return MSG_OK; } + +/** \ingroup msg_storage_management + * + * \brief Returns the host name the storage is attached to + * + * This functions checks whether a storage is a valid pointer or not and return its name. + */ +const char *MSG_storage_get_host(msg_storage_t storage) { + xbt_assert((storage != NULL), "Invalid parameters"); + msg_storage_priv_t priv = MSG_storage_priv(storage); + return priv->host; +} diff --git a/src/msg/msg_private.h b/src/msg/msg_private.h index d4cc33bc5f..56448820b1 100644 --- a/src/msg/msg_private.h +++ b/src/msg/msg_private.h @@ -50,11 +50,6 @@ typedef struct simdata_file { smx_file_t smx_file; } s_simdata_file_t; -/********************************* Storage **************************************/ -typedef struct simdata_storage { - smx_storage_t smx_storage; -} s_simdata_storage_t; - /*************** Begin GPU ***************/ typedef struct simdata_gpu_task { double computation_amount; /* Computation size */ @@ -146,12 +141,15 @@ msg_host_t __MSG_host_create(smx_host_t workstation); msg_storage_t __MSG_storage_create(smx_storage_t storage); void __MSG_host_destroy(msg_host_t host); void __MSG_storage_destroy(msg_storage_priv_t host); +void __MSG_file_destroy(msg_file_priv_t host); void MSG_process_cleanup_from_SIMIX(smx_process_t smx_proc); void MSG_process_create_from_SIMIX(smx_process_t *process, const char *name, xbt_main_func_t code, void *data, - const char *hostname, double kill_time, int argc, - char **argv, xbt_dict_t properties, int auto_restart); + const char *hostname, double kill_time, + int argc, char **argv, + xbt_dict_t properties, int auto_restart, + smx_process_t parent_process); void MSG_comm_copy_data_from_SIMIX(smx_action_t comm, void* buff, size_t buff_size); void _MSG_action_init(void); diff --git a/src/msg/msg_process.c b/src/msg/msg_process.c index 6fbe364a69..6a64e9db7d 100644 --- a/src/msg/msg_process.c +++ b/src/msg/msg_process.c @@ -56,9 +56,11 @@ void MSG_process_cleanup_from_SIMIX(smx_process_t smx_proc) /* This function creates a MSG process. It has the prototype enforced by SIMIX_function_register_process_create */ void MSG_process_create_from_SIMIX(smx_process_t* process, const char *name, - xbt_main_func_t code, void *data, - const char *hostname, double kill_time, int argc, char **argv, - xbt_dict_t properties, int auto_restart) + xbt_main_func_t code, void *data, + const char *hostname, double kill_time, + int argc, char **argv, + xbt_dict_t properties, int auto_restart, + smx_process_t parent_process) { msg_host_t host = MSG_get_host_by_name(hostname); msg_process_t p = MSG_process_create_with_environment(name, code, data, diff --git a/src/simdag/dax_dtd.c b/src/simdag/dax_dtd.c index 2fcbd20ef2..8e1cded546 100644 --- a/src/simdag/dax_dtd.c +++ b/src/simdag/dax_dtd.c @@ -1337,81 +1337,81 @@ const char dax__flexml_version[] = "1.9.6"; int dax__pcdata_ix; extern char *dax__bufferstack; #define dax__pcdata (dax__bufferstack + dax__pcdata_ix) +AT_dax__adag_version AX_dax__adag_version; +#define A_dax__adag_version (dax__bufferstack + AX_dax__adag_version) +short int dax__adag_version_isset; +AT_dax__uses_type AX_dax__uses_type; +#define A_dax__uses_type (dax__bufferstack + AX_dax__uses_type) +short int dax__uses_type_isset; +AT_dax__uses_optional AX_dax__uses_optional; +#define A_dax__uses_optional AX_dax__uses_optional +short int dax__uses_optional_isset; +AT_dax__adag_name AX_dax__adag_name; +#define A_dax__adag_name (dax__bufferstack + AX_dax__adag_name) +short int dax__adag_name_isset; +AT_dax__child_ref AX_dax__child_ref; +#define A_dax__child_ref (dax__bufferstack + AX_dax__child_ref) +short int dax__child_ref_isset; +AT_dax__adag_xmlns AX_dax__adag_xmlns; +#define A_dax__adag_xmlns (dax__bufferstack + AX_dax__adag_xmlns) +short int dax__adag_xmlns_isset; +AT_dax__uses_transfer AX_dax__uses_transfer; +#define A_dax__uses_transfer AX_dax__uses_transfer +short int dax__uses_transfer_isset; AT_dax__job_id AX_dax__job_id; #define A_dax__job_id (dax__bufferstack + AX_dax__job_id) short int dax__job_id_isset; +AT_dax__uses_file AX_dax__uses_file; +#define A_dax__uses_file (dax__bufferstack + AX_dax__uses_file) +short int dax__uses_file_isset; AT_dax__parent_ref AX_dax__parent_ref; #define A_dax__parent_ref (dax__bufferstack + AX_dax__parent_ref) short int dax__parent_ref_isset; -AT_dax__adag_fileCount AX_dax__adag_fileCount; -#define A_dax__adag_fileCount (dax__bufferstack + AX_dax__adag_fileCount) -short int dax__adag_fileCount_isset; -AT_dax__adag_jobCount AX_dax__adag_jobCount; -#define A_dax__adag_jobCount (dax__bufferstack + AX_dax__adag_jobCount) -short int dax__adag_jobCount_isset; -AT_dax__adag_xmlns AX_dax__adag_xmlns; -#define A_dax__adag_xmlns (dax__bufferstack + AX_dax__adag_xmlns) -short int dax__adag_xmlns_isset; -AT_dax__uses_register AX_dax__uses_register; -#define A_dax__uses_register AX_dax__uses_register -short int dax__uses_register_isset; -AT_dax__adag_name AX_dax__adag_name; -#define A_dax__adag_name (dax__bufferstack + AX_dax__adag_name) -short int dax__adag_name_isset; -AT_dax__adag_xsi_c_schemaLocation AX_dax__adag_xsi_c_schemaLocation; -#define A_dax__adag_xsi_c_schemaLocation (dax__bufferstack + AX_dax__adag_xsi_c_schemaLocation) -short int dax__adag_xsi_c_schemaLocation_isset; -AT_dax__job_level AX_dax__job_level; -#define A_dax__job_level (dax__bufferstack + AX_dax__job_level) -short int dax__job_level_isset; -AT_dax__uses_optional AX_dax__uses_optional; -#define A_dax__uses_optional AX_dax__uses_optional -short int dax__uses_optional_isset; +AT_dax__adag_count AX_dax__adag_count; +#define A_dax__adag_count (dax__bufferstack + AX_dax__adag_count) +short int dax__adag_count_isset; +AT_dax__adag_xmlns_c_xsi AX_dax__adag_xmlns_c_xsi; +#define A_dax__adag_xmlns_c_xsi (dax__bufferstack + AX_dax__adag_xmlns_c_xsi) +short int dax__adag_xmlns_c_xsi_isset; +AT_dax__adag_index AX_dax__adag_index; +#define A_dax__adag_index (dax__bufferstack + AX_dax__adag_index) +short int dax__adag_index_isset; AT_dax__uses_size AX_dax__uses_size; #define A_dax__uses_size (dax__bufferstack + AX_dax__uses_size) short int dax__uses_size_isset; -AT_dax__uses_link AX_dax__uses_link; -#define A_dax__uses_link AX_dax__uses_link -short int dax__uses_link_isset; -AT_dax__uses_transfer AX_dax__uses_transfer; -#define A_dax__uses_transfer AX_dax__uses_transfer -short int dax__uses_transfer_isset; -AT_dax__uses_type AX_dax__uses_type; -#define A_dax__uses_type (dax__bufferstack + AX_dax__uses_type) -short int dax__uses_type_isset; AT_dax__adag_childCount AX_dax__adag_childCount; #define A_dax__adag_childCount (dax__bufferstack + AX_dax__adag_childCount) short int dax__adag_childCount_isset; -AT_dax__job_namespace AX_dax__job_namespace; -#define A_dax__job_namespace (dax__bufferstack + AX_dax__job_namespace) -short int dax__job_namespace_isset; -AT_dax__child_ref AX_dax__child_ref; -#define A_dax__child_ref (dax__bufferstack + AX_dax__child_ref) -short int dax__child_ref_isset; -AT_dax__uses_file AX_dax__uses_file; -#define A_dax__uses_file (dax__bufferstack + AX_dax__uses_file) -short int dax__uses_file_isset; -AT_dax__job_version AX_dax__job_version; -#define A_dax__job_version (dax__bufferstack + AX_dax__job_version) -short int dax__job_version_isset; +AT_dax__uses_link AX_dax__uses_link; +#define A_dax__uses_link AX_dax__uses_link +short int dax__uses_link_isset; AT_dax__job_runtime AX_dax__job_runtime; #define A_dax__job_runtime (dax__bufferstack + AX_dax__job_runtime) short int dax__job_runtime_isset; -AT_dax__adag_index AX_dax__adag_index; -#define A_dax__adag_index (dax__bufferstack + AX_dax__adag_index) -short int dax__adag_index_isset; -AT_dax__adag_version AX_dax__adag_version; -#define A_dax__adag_version (dax__bufferstack + AX_dax__adag_version) -short int dax__adag_version_isset; -AT_dax__adag_count AX_dax__adag_count; -#define A_dax__adag_count (dax__bufferstack + AX_dax__adag_count) -short int dax__adag_count_isset; +AT_dax__job_level AX_dax__job_level; +#define A_dax__job_level (dax__bufferstack + AX_dax__job_level) +short int dax__job_level_isset; +AT_dax__job_namespace AX_dax__job_namespace; +#define A_dax__job_namespace (dax__bufferstack + AX_dax__job_namespace) +short int dax__job_namespace_isset; AT_dax__job_name AX_dax__job_name; #define A_dax__job_name (dax__bufferstack + AX_dax__job_name) short int dax__job_name_isset; -AT_dax__adag_xmlns_c_xsi AX_dax__adag_xmlns_c_xsi; -#define A_dax__adag_xmlns_c_xsi (dax__bufferstack + AX_dax__adag_xmlns_c_xsi) -short int dax__adag_xmlns_c_xsi_isset; +AT_dax__adag_jobCount AX_dax__adag_jobCount; +#define A_dax__adag_jobCount (dax__bufferstack + AX_dax__adag_jobCount) +short int dax__adag_jobCount_isset; +AT_dax__job_version AX_dax__job_version; +#define A_dax__job_version (dax__bufferstack + AX_dax__job_version) +short int dax__job_version_isset; +AT_dax__adag_xsi_c_schemaLocation AX_dax__adag_xsi_c_schemaLocation; +#define A_dax__adag_xsi_c_schemaLocation (dax__bufferstack + AX_dax__adag_xsi_c_schemaLocation) +short int dax__adag_xsi_c_schemaLocation_isset; +AT_dax__uses_register AX_dax__uses_register; +#define A_dax__uses_register AX_dax__uses_register +short int dax__uses_register_isset; +AT_dax__adag_fileCount AX_dax__adag_fileCount; +#define A_dax__adag_fileCount (dax__bufferstack + AX_dax__adag_fileCount) +short int dax__adag_fileCount_isset; /* XML state. */ #ifdef FLEX_DEBUG @@ -2204,10 +2204,10 @@ YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",dax_text[0]); YY_BREAK case YY_STATE_EOF(S_dax__adag_1): -case YY_STATE_EOF(S_dax__adag_3): +case YY_STATE_EOF(S_dax__adag_5): case YY_STATE_EOF(E_dax__adag): +case YY_STATE_EOF(S_dax__adag_3): case YY_STATE_EOF(S_dax__adag): -case YY_STATE_EOF(S_dax__adag_5): FAIL("Premature EOF: `' expected."); YY_BREAK @@ -2313,7 +2313,7 @@ YY_RULE_SETUP if (!AX_dax__job_runtime) FAIL("Required attribute `runtime' not set for `job' element."); LEAVE; STag_dax__job(); dax__pcdata_ix = 0; ETag_dax__job(); popbuffer(); /* attribute */ switch (YY_START) { - case S_dax__adag: case S_dax__adag_3: case S_dax__adag_2: SET(S_dax__adag_3); break; + case S_dax__adag_2: case S_dax__adag_3: case S_dax__adag: SET(S_dax__adag_3); break; } } YY_BREAK @@ -2337,7 +2337,7 @@ YY_RULE_SETUP ETag_dax__job(); popbuffer(); /* attribute */ switch (YY_START) { - case S_dax__adag: case S_dax__adag_3: case S_dax__adag_2: SET(S_dax__adag_3); break; + case S_dax__adag_2: case S_dax__adag_3: case S_dax__adag: SET(S_dax__adag_3); break; } } YY_BREAK @@ -2350,9 +2350,9 @@ case 65: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",dax_text[0]); YY_BREAK -case YY_STATE_EOF(S_dax__job_2): -case YY_STATE_EOF(E_dax__job): case YY_STATE_EOF(S_dax__job): +case YY_STATE_EOF(E_dax__job): +case YY_STATE_EOF(S_dax__job_2): FAIL("Premature EOF: `' expected."); YY_BREAK @@ -2486,7 +2486,7 @@ YY_RULE_SETUP if (!AX_dax__uses_size) FAIL("Required attribute `size' not set for `uses' element."); LEAVE; STag_dax__uses(); dax__pcdata_ix = 0; ETag_dax__uses(); popbuffer(); /* attribute */ switch (YY_START) { - case S_dax__job_2: case S_dax__job_1: case S_dax__job: SET(S_dax__job_2); break; + case S_dax__job: case S_dax__job_2: case S_dax__job_1: SET(S_dax__job_2); break; } } YY_BREAK @@ -2510,7 +2510,7 @@ YY_RULE_SETUP ETag_dax__uses(); popbuffer(); /* attribute */ switch (YY_START) { - case S_dax__job_2: case S_dax__job_1: case S_dax__job: SET(S_dax__job_2); break; + case S_dax__job: case S_dax__job_2: case S_dax__job_1: SET(S_dax__job_2); break; } } YY_BREAK @@ -2565,7 +2565,7 @@ YY_RULE_SETUP if (!AX_dax__child_ref) FAIL("Required attribute `ref' not set for `child' element."); LEAVE; STag_dax__child(); dax__pcdata_ix = 0; ETag_dax__child(); popbuffer(); /* attribute */ switch (YY_START) { - case S_dax__adag_4: case S_dax__adag_1: case S_dax__adag_3: case S_dax__adag: case S_dax__adag_5: SET(S_dax__adag_5); break; + case S_dax__adag_1: case S_dax__adag_4: case S_dax__adag_5: case S_dax__adag_3: case S_dax__adag: SET(S_dax__adag_5); break; } } YY_BREAK @@ -2589,7 +2589,7 @@ YY_RULE_SETUP ETag_dax__child(); popbuffer(); /* attribute */ switch (YY_START) { - case S_dax__adag_4: case S_dax__adag_1: case S_dax__adag_3: case S_dax__adag: case S_dax__adag_5: SET(S_dax__adag_5); break; + case S_dax__adag_1: case S_dax__adag_4: case S_dax__adag_5: case S_dax__adag_3: case S_dax__adag: SET(S_dax__adag_5); break; } } YY_BREAK @@ -2602,9 +2602,9 @@ case 107: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",dax_text[0]); YY_BREAK -case YY_STATE_EOF(S_dax__child): -case YY_STATE_EOF(E_dax__child): case YY_STATE_EOF(S_dax__child_2): +case YY_STATE_EOF(E_dax__child): +case YY_STATE_EOF(S_dax__child): FAIL("Premature EOF: `' expected."); YY_BREAK diff --git a/src/simdag/dax_dtd.h b/src/simdag/dax_dtd.h index 8629a08937..e31871dd23 100644 --- a/src/simdag/dax_dtd.h +++ b/src/simdag/dax_dtd.h @@ -60,132 +60,132 @@ XBT_PUBLIC(void) STag_dax__parent(void); XBT_PUBLIC(void) ETag_dax__parent(void); /* XML application data. */ -typedef int AT_dax__adag_name; -#define AU_dax__adag_name NULL -typedef int AT_dax__job_level; -#define AU_dax__job_level NULL +typedef int AT_dax__adag_version; +#define AU_dax__adag_version NULL typedef int AT_dax__uses_type; #define AU_dax__uses_type NULL -typedef int AT_dax__adag_fileCount; -#define AU_dax__adag_fileCount NULL +typedef enum { AU_dax__uses_optional, A_dax__uses_optional_false,A_dax__uses_optional_true } AT_dax__uses_optional; +typedef int AT_dax__adag_name; +#define AU_dax__adag_name NULL typedef int AT_dax__child_ref; #define AU_dax__child_ref NULL -typedef enum { AU_dax__uses_link, A_dax__uses_link_input,A_dax__uses_link_output } AT_dax__uses_link; -typedef int AT_dax__adag_count; -#define AU_dax__adag_count NULL -typedef int AT_dax__uses_file; -#define AU_dax__uses_file NULL -typedef int AT_dax__adag_xsi_c_schemaLocation; -#define AU_dax__adag_xsi_c_schemaLocation NULL -typedef int AT_dax__job_runtime; -#define AU_dax__job_runtime NULL -typedef int AT_dax__job_namespace; -#define AU_dax__job_namespace NULL typedef int AT_dax__adag_xmlns; #define AU_dax__adag_xmlns NULL +typedef enum { AU_dax__uses_transfer, A_dax__uses_transfer_false,A_dax__uses_transfer_true } AT_dax__uses_transfer; typedef int AT_dax__job_id; #define AU_dax__job_id NULL -typedef int AT_dax__job_version; -#define AU_dax__job_version NULL -typedef enum { AU_dax__uses_optional, A_dax__uses_optional_false,A_dax__uses_optional_true } AT_dax__uses_optional; +typedef int AT_dax__uses_file; +#define AU_dax__uses_file NULL +typedef int AT_dax__parent_ref; +#define AU_dax__parent_ref NULL +typedef int AT_dax__adag_count; +#define AU_dax__adag_count NULL typedef int AT_dax__adag_xmlns_c_xsi; #define AU_dax__adag_xmlns_c_xsi NULL +typedef int AT_dax__adag_index; +#define AU_dax__adag_index NULL typedef int AT_dax__uses_size; #define AU_dax__uses_size NULL -typedef int AT_dax__job_name; -#define AU_dax__job_name NULL typedef int AT_dax__adag_childCount; #define AU_dax__adag_childCount NULL -typedef enum { AU_dax__uses_transfer, A_dax__uses_transfer_false,A_dax__uses_transfer_true } AT_dax__uses_transfer; -typedef int AT_dax__parent_ref; -#define AU_dax__parent_ref NULL -typedef int AT_dax__adag_version; -#define AU_dax__adag_version NULL +typedef enum { AU_dax__uses_link, A_dax__uses_link_input,A_dax__uses_link_output } AT_dax__uses_link; +typedef int AT_dax__job_runtime; +#define AU_dax__job_runtime NULL +typedef int AT_dax__job_level; +#define AU_dax__job_level NULL +typedef int AT_dax__job_namespace; +#define AU_dax__job_namespace NULL +typedef int AT_dax__job_name; +#define AU_dax__job_name NULL typedef int AT_dax__adag_jobCount; #define AU_dax__adag_jobCount NULL +typedef int AT_dax__job_version; +#define AU_dax__job_version NULL +typedef int AT_dax__adag_xsi_c_schemaLocation; +#define AU_dax__adag_xsi_c_schemaLocation NULL typedef enum { AU_dax__uses_register, A_dax__uses_register_false,A_dax__uses_register_true } AT_dax__uses_register; -typedef int AT_dax__adag_index; -#define AU_dax__adag_index NULL +typedef int AT_dax__adag_fileCount; +#define AU_dax__adag_fileCount NULL /* FleXML-provided data. */ XBT_PUBLIC_DATA(int) dax__pcdata_ix; XBT_PUBLIC_DATA(char *) dax__bufferstack; #define dax__pcdata (dax__bufferstack + dax__pcdata_ix) -XBT_PUBLIC_DATA(AT_dax__adag_name) AX_dax__adag_name; -#define A_dax__adag_name (dax__bufferstack + AX_dax__adag_name) -XBT_PUBLIC_DATA(short int) dax__adag_name_isset; -XBT_PUBLIC_DATA(AT_dax__job_level) AX_dax__job_level; -#define A_dax__job_level (dax__bufferstack + AX_dax__job_level) -XBT_PUBLIC_DATA(short int) dax__job_level_isset; +XBT_PUBLIC_DATA(AT_dax__adag_version) AX_dax__adag_version; +#define A_dax__adag_version (dax__bufferstack + AX_dax__adag_version) +XBT_PUBLIC_DATA(short int) dax__adag_version_isset; XBT_PUBLIC_DATA(AT_dax__uses_type) AX_dax__uses_type; #define A_dax__uses_type (dax__bufferstack + AX_dax__uses_type) XBT_PUBLIC_DATA(short int) dax__uses_type_isset; -XBT_PUBLIC_DATA(AT_dax__adag_fileCount) AX_dax__adag_fileCount; -#define A_dax__adag_fileCount (dax__bufferstack + AX_dax__adag_fileCount) -XBT_PUBLIC_DATA(short int) dax__adag_fileCount_isset; +XBT_PUBLIC_DATA(AT_dax__uses_optional) AX_dax__uses_optional; +#define A_dax__uses_optional AX_dax__uses_optional +XBT_PUBLIC_DATA(short int) dax__uses_optional_isset; +XBT_PUBLIC_DATA(AT_dax__adag_name) AX_dax__adag_name; +#define A_dax__adag_name (dax__bufferstack + AX_dax__adag_name) +XBT_PUBLIC_DATA(short int) dax__adag_name_isset; XBT_PUBLIC_DATA(AT_dax__child_ref) AX_dax__child_ref; #define A_dax__child_ref (dax__bufferstack + AX_dax__child_ref) XBT_PUBLIC_DATA(short int) dax__child_ref_isset; -XBT_PUBLIC_DATA(AT_dax__uses_link) AX_dax__uses_link; -#define A_dax__uses_link AX_dax__uses_link -XBT_PUBLIC_DATA(short int) dax__uses_link_isset; -XBT_PUBLIC_DATA(AT_dax__adag_count) AX_dax__adag_count; -#define A_dax__adag_count (dax__bufferstack + AX_dax__adag_count) -XBT_PUBLIC_DATA(short int) dax__adag_count_isset; -XBT_PUBLIC_DATA(AT_dax__uses_file) AX_dax__uses_file; -#define A_dax__uses_file (dax__bufferstack + AX_dax__uses_file) -XBT_PUBLIC_DATA(short int) dax__uses_file_isset; -XBT_PUBLIC_DATA(AT_dax__adag_xsi_c_schemaLocation) AX_dax__adag_xsi_c_schemaLocation; -#define A_dax__adag_xsi_c_schemaLocation (dax__bufferstack + AX_dax__adag_xsi_c_schemaLocation) -XBT_PUBLIC_DATA(short int) dax__adag_xsi_c_schemaLocation_isset; -XBT_PUBLIC_DATA(AT_dax__job_runtime) AX_dax__job_runtime; -#define A_dax__job_runtime (dax__bufferstack + AX_dax__job_runtime) -XBT_PUBLIC_DATA(short int) dax__job_runtime_isset; -XBT_PUBLIC_DATA(AT_dax__job_namespace) AX_dax__job_namespace; -#define A_dax__job_namespace (dax__bufferstack + AX_dax__job_namespace) -XBT_PUBLIC_DATA(short int) dax__job_namespace_isset; XBT_PUBLIC_DATA(AT_dax__adag_xmlns) AX_dax__adag_xmlns; #define A_dax__adag_xmlns (dax__bufferstack + AX_dax__adag_xmlns) XBT_PUBLIC_DATA(short int) dax__adag_xmlns_isset; +XBT_PUBLIC_DATA(AT_dax__uses_transfer) AX_dax__uses_transfer; +#define A_dax__uses_transfer AX_dax__uses_transfer +XBT_PUBLIC_DATA(short int) dax__uses_transfer_isset; XBT_PUBLIC_DATA(AT_dax__job_id) AX_dax__job_id; #define A_dax__job_id (dax__bufferstack + AX_dax__job_id) XBT_PUBLIC_DATA(short int) dax__job_id_isset; -XBT_PUBLIC_DATA(AT_dax__job_version) AX_dax__job_version; -#define A_dax__job_version (dax__bufferstack + AX_dax__job_version) -XBT_PUBLIC_DATA(short int) dax__job_version_isset; -XBT_PUBLIC_DATA(AT_dax__uses_optional) AX_dax__uses_optional; -#define A_dax__uses_optional AX_dax__uses_optional -XBT_PUBLIC_DATA(short int) dax__uses_optional_isset; +XBT_PUBLIC_DATA(AT_dax__uses_file) AX_dax__uses_file; +#define A_dax__uses_file (dax__bufferstack + AX_dax__uses_file) +XBT_PUBLIC_DATA(short int) dax__uses_file_isset; +XBT_PUBLIC_DATA(AT_dax__parent_ref) AX_dax__parent_ref; +#define A_dax__parent_ref (dax__bufferstack + AX_dax__parent_ref) +XBT_PUBLIC_DATA(short int) dax__parent_ref_isset; +XBT_PUBLIC_DATA(AT_dax__adag_count) AX_dax__adag_count; +#define A_dax__adag_count (dax__bufferstack + AX_dax__adag_count) +XBT_PUBLIC_DATA(short int) dax__adag_count_isset; XBT_PUBLIC_DATA(AT_dax__adag_xmlns_c_xsi) AX_dax__adag_xmlns_c_xsi; #define A_dax__adag_xmlns_c_xsi (dax__bufferstack + AX_dax__adag_xmlns_c_xsi) XBT_PUBLIC_DATA(short int) dax__adag_xmlns_c_xsi_isset; +XBT_PUBLIC_DATA(AT_dax__adag_index) AX_dax__adag_index; +#define A_dax__adag_index (dax__bufferstack + AX_dax__adag_index) +XBT_PUBLIC_DATA(short int) dax__adag_index_isset; XBT_PUBLIC_DATA(AT_dax__uses_size) AX_dax__uses_size; #define A_dax__uses_size (dax__bufferstack + AX_dax__uses_size) XBT_PUBLIC_DATA(short int) dax__uses_size_isset; -XBT_PUBLIC_DATA(AT_dax__job_name) AX_dax__job_name; -#define A_dax__job_name (dax__bufferstack + AX_dax__job_name) -XBT_PUBLIC_DATA(short int) dax__job_name_isset; XBT_PUBLIC_DATA(AT_dax__adag_childCount) AX_dax__adag_childCount; #define A_dax__adag_childCount (dax__bufferstack + AX_dax__adag_childCount) XBT_PUBLIC_DATA(short int) dax__adag_childCount_isset; -XBT_PUBLIC_DATA(AT_dax__uses_transfer) AX_dax__uses_transfer; -#define A_dax__uses_transfer AX_dax__uses_transfer -XBT_PUBLIC_DATA(short int) dax__uses_transfer_isset; -XBT_PUBLIC_DATA(AT_dax__parent_ref) AX_dax__parent_ref; -#define A_dax__parent_ref (dax__bufferstack + AX_dax__parent_ref) -XBT_PUBLIC_DATA(short int) dax__parent_ref_isset; -XBT_PUBLIC_DATA(AT_dax__adag_version) AX_dax__adag_version; -#define A_dax__adag_version (dax__bufferstack + AX_dax__adag_version) -XBT_PUBLIC_DATA(short int) dax__adag_version_isset; +XBT_PUBLIC_DATA(AT_dax__uses_link) AX_dax__uses_link; +#define A_dax__uses_link AX_dax__uses_link +XBT_PUBLIC_DATA(short int) dax__uses_link_isset; +XBT_PUBLIC_DATA(AT_dax__job_runtime) AX_dax__job_runtime; +#define A_dax__job_runtime (dax__bufferstack + AX_dax__job_runtime) +XBT_PUBLIC_DATA(short int) dax__job_runtime_isset; +XBT_PUBLIC_DATA(AT_dax__job_level) AX_dax__job_level; +#define A_dax__job_level (dax__bufferstack + AX_dax__job_level) +XBT_PUBLIC_DATA(short int) dax__job_level_isset; +XBT_PUBLIC_DATA(AT_dax__job_namespace) AX_dax__job_namespace; +#define A_dax__job_namespace (dax__bufferstack + AX_dax__job_namespace) +XBT_PUBLIC_DATA(short int) dax__job_namespace_isset; +XBT_PUBLIC_DATA(AT_dax__job_name) AX_dax__job_name; +#define A_dax__job_name (dax__bufferstack + AX_dax__job_name) +XBT_PUBLIC_DATA(short int) dax__job_name_isset; XBT_PUBLIC_DATA(AT_dax__adag_jobCount) AX_dax__adag_jobCount; #define A_dax__adag_jobCount (dax__bufferstack + AX_dax__adag_jobCount) XBT_PUBLIC_DATA(short int) dax__adag_jobCount_isset; +XBT_PUBLIC_DATA(AT_dax__job_version) AX_dax__job_version; +#define A_dax__job_version (dax__bufferstack + AX_dax__job_version) +XBT_PUBLIC_DATA(short int) dax__job_version_isset; +XBT_PUBLIC_DATA(AT_dax__adag_xsi_c_schemaLocation) AX_dax__adag_xsi_c_schemaLocation; +#define A_dax__adag_xsi_c_schemaLocation (dax__bufferstack + AX_dax__adag_xsi_c_schemaLocation) +XBT_PUBLIC_DATA(short int) dax__adag_xsi_c_schemaLocation_isset; XBT_PUBLIC_DATA(AT_dax__uses_register) AX_dax__uses_register; #define A_dax__uses_register AX_dax__uses_register XBT_PUBLIC_DATA(short int) dax__uses_register_isset; -XBT_PUBLIC_DATA(AT_dax__adag_index) AX_dax__adag_index; -#define A_dax__adag_index (dax__bufferstack + AX_dax__adag_index) -XBT_PUBLIC_DATA(short int) dax__adag_index_isset; +XBT_PUBLIC_DATA(AT_dax__adag_fileCount) AX_dax__adag_fileCount; +#define A_dax__adag_fileCount (dax__bufferstack + AX_dax__adag_fileCount) +XBT_PUBLIC_DATA(short int) dax__adag_fileCount_isset; /* XML application utilities. */ XBT_PUBLIC(int) dax__element_context(int); diff --git a/src/simdag/private.h b/src/simdag/private.h index 513dd1e2a6..ada782bbad 100644 --- a/src/simdag/private.h +++ b/src/simdag/private.h @@ -73,8 +73,12 @@ static inline SD_workstation_priv_t SD_workstation_priv(SD_workstation_t host){ typedef s_xbt_dictelm_t s_SD_storage_t; typedef struct SD_storage { void *data; /* user data */ + const char *host; } s_SD_storage_priv_t, *SD_storage_priv_t; +static inline SD_storage_priv_t SD_storage_priv(SD_storage_t storage){ + return xbt_lib_get_level(storage, SD_STORAGE_LEVEL); +} /* Task */ typedef struct SD_task { diff --git a/src/simdag/sd_workstation.c b/src/simdag/sd_workstation.c index 730ef9893e..108e64013c 100644 --- a/src/simdag/sd_workstation.c +++ b/src/simdag/sd_workstation.c @@ -45,8 +45,8 @@ SD_storage_t __SD_storage_create(void *surf_storage, void *data) storage = xbt_new(s_SD_storage_priv_t, 1); storage->data = data; /* user data */ - name = surf_resource_name(surf_storage); + storage->host = surf_storage_get_host(surf_storage_resource_by_name(name)); xbt_lib_set(storage_lib,name, SD_STORAGE_LEVEL, storage); return xbt_lib_get_elm_or_null(storage_lib, name); } @@ -476,8 +476,29 @@ void SD_workstation_set_access_mode(SD_workstation_t workstation, * \param workstation a workstation * \return a dynar containing all mounted storages on the workstation */ -xbt_dict_t SD_workstation_get_storage_list(SD_workstation_t workstation){ - return surf_workstation_get_storage_list(workstation); +xbt_dict_t SD_workstation_get_mounted_storage_list(SD_workstation_t workstation){ + return surf_workstation_get_mounted_storage_list(workstation); +} + +/** + * \brief Return the list of mounted storages on a workstation. + * + * \param workstation a workstation + * \return a dynar containing all mounted storages on the workstation + */ +xbt_dynar_t SD_workstation_get_attached_storage_list(SD_workstation_t workstation){ + return surf_workstation_get_attached_storage_list(workstation); +} + +/** + * \brief Returns the host name the storage is attached to + * + * This functions checks whether a storage is a valid pointer or not and return its name. + */ +const char *SD_storage_get_host(msg_storage_t storage) { + xbt_assert((storage != NULL), "Invalid parameters"); + SD_storage_priv_t priv = SD_storage_priv(storage); + return priv->host; } /* Returns whether a task can start now on a workstation*/ diff --git a/src/simgrid/sg_config.c b/src/simgrid/sg_config.c index 4ebfb8ee45..9a97006461 100644 --- a/src/simgrid/sg_config.c +++ b/src/simgrid/sg_config.c @@ -388,6 +388,12 @@ static void _sg_cfg_cb_context_stack_size(const char *name, int pos) smx_context_stack_size = xbt_cfg_get_int(_sg_cfg_set, name) * 1024; } +static void _sg_cfg_cb_context_guard_size(const char *name, int pos) +{ + smx_context_guard_size_was_set = 1; + smx_context_guard_size = xbt_cfg_get_int(_sg_cfg_set, name) * xbt_pagesize; +} + static void _sg_cfg_cb_contexts_nthreads(const char *name, int pos) { SIMIX_context_set_nthreads(xbt_cfg_get_int(_sg_cfg_set, name)); @@ -477,7 +483,7 @@ void sg_config_init(int *argc, char **argv) describe_model(description, surf_plugin_description, "plugin", "The plugins"); xbt_cfg_register(&_sg_cfg_set, "plugin", description, - xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__plugin, NULL); + xbt_cfgelm_string, 0, 1, &_sg_cfg_cb__plugin, NULL); describe_model(description, surf_cpu_model_description, "model", "The model to use for the CPU"); @@ -538,7 +544,8 @@ void sg_config_init(int *argc, char **argv) xbt_cfg_register(&_sg_cfg_set, "network/sender_gap", "Minimum gap between two overlapping sends", xbt_cfgelm_double, 1, 1, _sg_cfg_cb__sender_gap, NULL); - /* default for "network/sender_gap" is set in network.c */ + /* real default for "network/sender_gap" is set in network_smpi.cpp */ + xbt_cfg_setdefault_double(_sg_cfg_set, "network/sender_gap", NAN); xbt_cfg_register(&_sg_cfg_set, "network/latency_factor", "Correction factor to apply to the provided latency (default value set by network model)", @@ -553,96 +560,97 @@ void sg_config_init(int *argc, char **argv) xbt_cfg_register(&_sg_cfg_set, "network/weight_S", "Correction factor to apply to the weight of competing streams (default value set by network model)", xbt_cfgelm_double, 1, 1, _sg_cfg_cb__weight_S, NULL); - /* default for "network/weight_S" is set in network.c */ + /* real default for "network/weight_S" is set in network_*.cpp */ + xbt_cfg_setdefault_double(_sg_cfg_set, "network/weight_S", NAN); /* Inclusion path */ xbt_cfg_register(&_sg_cfg_set, "path", "Lookup path for inclusions in platform and deployment XML files", - xbt_cfgelm_string, 0, 0, _sg_cfg_cb__surf_path, NULL); + xbt_cfgelm_string, 1, 0, _sg_cfg_cb__surf_path, NULL); xbt_cfg_register(&_sg_cfg_set, "cpu/maxmin_selective_update", "Update the constraint set propagating recursively to others constraints (off by default when optim is set to lazy)", - xbt_cfgelm_boolean, 0, 1, NULL, NULL); + xbt_cfgelm_boolean, 1, 1, NULL, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, "cpu/maxmin_selective_update", "no"); xbt_cfg_register(&_sg_cfg_set, "network/maxmin_selective_update", "Update the constraint set propagating recursively to others constraints (off by default when optim is set to lazy)", - xbt_cfgelm_boolean, 0, 1, NULL, NULL); + xbt_cfgelm_boolean, 1, 1, NULL, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, "network/maxmin_selective_update", "no"); #ifdef HAVE_MC /* do model-checking */ xbt_cfg_register(&_sg_cfg_set, "model-check", "Verify the system through model-checking instead of simulating it (EXPERIMENTAL)", - xbt_cfgelm_boolean, 0, 1, _sg_cfg_cb_model_check, NULL); + xbt_cfgelm_boolean, 1, 1, _sg_cfg_cb_model_check, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, "model-check", "no"); /* do stateful model-checking */ xbt_cfg_register(&_sg_cfg_set, "model-check/checkpoint", "Specify the amount of steps between checkpoints during stateful model-checking (default: 0 => stateless verification). " "If value=1, one checkpoint is saved for each step => faster verification, but huge memory consumption; higher values are good compromises between speed and memory consumption.", - xbt_cfgelm_int, 0, 1, _mc_cfg_cb_checkpoint, NULL); + xbt_cfgelm_int, 1, 1, _mc_cfg_cb_checkpoint, NULL); xbt_cfg_setdefault_int(_sg_cfg_set, "model-check/checkpoint", 0); /* do liveness model-checking */ xbt_cfg_register(&_sg_cfg_set, "model-check/property", "Specify the name of the file containing the property. It must be the result of the ltl2ba program.", - xbt_cfgelm_string, 0, 1, _mc_cfg_cb_property, NULL); + xbt_cfgelm_string, 1, 1, _mc_cfg_cb_property, NULL); xbt_cfg_setdefault_string(_sg_cfg_set, "model-check/property", ""); /* do communications determinism model-checking */ xbt_cfg_register(&_sg_cfg_set, "model-check/communications_determinism", "Enable/disable the detection of determinism in the communications schemes", - xbt_cfgelm_boolean, 0, 1, _mc_cfg_cb_comms_determinism, NULL); + xbt_cfgelm_boolean, 1, 1, _mc_cfg_cb_comms_determinism, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, "model-check/communications_determinism", "no"); /* do send determinism model-checking */ xbt_cfg_register(&_sg_cfg_set, "model-check/send_determinism", "Enable/disable the detection of send-determinism in the communications schemes", - xbt_cfgelm_boolean, 0, 1, _mc_cfg_cb_send_determinism, NULL); + xbt_cfgelm_boolean, 1, 1, _mc_cfg_cb_send_determinism, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, "model-check/send_determinism", "no"); /* Specify the kind of model-checking reduction */ xbt_cfg_register(&_sg_cfg_set, "model-check/reduction", "Specify the kind of exploration reduction (either none or DPOR)", - xbt_cfgelm_string, 0, 1, _mc_cfg_cb_reduce, NULL); + xbt_cfgelm_string, 1, 1, _mc_cfg_cb_reduce, NULL); xbt_cfg_setdefault_string(_sg_cfg_set, "model-check/reduction", "dpor"); /* Enable/disable timeout for wait requests with model-checking */ xbt_cfg_register(&_sg_cfg_set, "model-check/timeout", "Enable/Disable timeout for wait requests", - xbt_cfgelm_boolean, 0, 1, _mc_cfg_cb_timeout, NULL); + xbt_cfgelm_boolean, 1, 1, _mc_cfg_cb_timeout, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, "model-check/timeout", "no"); /* Enable/disable global hash computation with model-checking */ xbt_cfg_register(&_sg_cfg_set, "model-check/hash", "Enable/Disable state hash for state comparison", - xbt_cfgelm_boolean, 0, 1, _mc_cfg_cb_hash, NULL); + xbt_cfgelm_boolean, 1, 1, _mc_cfg_cb_hash, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, "model-check/hash", "no"); /* Set max depth exploration */ xbt_cfg_register(&_sg_cfg_set, "model-check/max_depth", "Specify the max depth of exploration (default : 1000)", - xbt_cfgelm_int, 0, 1, _mc_cfg_cb_max_depth, NULL); + xbt_cfgelm_int, 1, 1, _mc_cfg_cb_max_depth, NULL); xbt_cfg_setdefault_int(_sg_cfg_set, "model-check/max_depth", 1000); /* Set number of visited state stored for state comparison reduction*/ xbt_cfg_register(&_sg_cfg_set, "model-check/visited", "Specify the number of visited state stored for state comparison reduction. If value=5, the last 5 visited states are stored", - xbt_cfgelm_int, 0, 1, _mc_cfg_cb_visited, NULL); + xbt_cfgelm_int, 1, 1, _mc_cfg_cb_visited, NULL); xbt_cfg_setdefault_int(_sg_cfg_set, "model-check/visited", 0); /* Set file name for dot output of graph state */ xbt_cfg_register(&_sg_cfg_set, "model-check/dot_output", "Specify the name of dot file corresponding to graph state", - xbt_cfgelm_string, 0, 1, _mc_cfg_cb_dot_output, NULL); + xbt_cfgelm_string, 1, 1, _mc_cfg_cb_dot_output, NULL); xbt_cfg_setdefault_string(_sg_cfg_set, "model-check/dot_output", ""); #endif /* do verbose-exit */ xbt_cfg_register(&_sg_cfg_set, "verbose-exit", "Activate the \"do nothing\" mode in Ctrl-C", - xbt_cfgelm_boolean, 0, 1, _sg_cfg_cb_verbose_exit, NULL); + xbt_cfgelm_boolean, 1, 1, _sg_cfg_cb_verbose_exit, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, "verbose-exit", "yes"); /* context factory */ @@ -666,14 +674,22 @@ void sg_config_init(int *argc, char **argv) xbt_cfgelm_string, 1, 1, _sg_cfg_cb_context_factory, NULL); xbt_cfg_setdefault_string(_sg_cfg_set, "contexts/factory", dflt_ctx_fact); - /* stack size of contexts in Ko */ + /* stack size of contexts in KiB */ xbt_cfg_register(&_sg_cfg_set, "contexts/stack_size", - "Stack size of contexts in Kib", + "Stack size of contexts in KiB", xbt_cfgelm_int, 1, 1, _sg_cfg_cb_context_stack_size, NULL); - xbt_cfg_setdefault_int(_sg_cfg_set, "contexts/stack_size", 128); + xbt_cfg_setdefault_int(_sg_cfg_set, "contexts/stack_size", 8*1024); /* No, it was not set yet (the above setdefault() changed this to 1). */ smx_context_stack_size_was_set = 0; + /* guard size for contexts stacks in memory pages */ + xbt_cfg_register(&_sg_cfg_set, "contexts/guard_size", + "Guard size for contexts stacks in memory pages", + xbt_cfgelm_int, 1, 1, _sg_cfg_cb_context_guard_size, NULL); + xbt_cfg_setdefault_int(_sg_cfg_set, "contexts/guard_size", 1); + /* No, it was not set yet (the above setdefault() changed this to 1). */ + smx_context_guard_size_was_set = 0; + /* number of parallel threads for user processes */ xbt_cfg_register(&_sg_cfg_set, "contexts/nthreads", "Number of parallel threads used to execute user contexts", @@ -703,7 +719,7 @@ void sg_config_init(int *argc, char **argv) xbt_cfg_register(&_sg_cfg_set, "network/crosstraffic", "Activate the interferences between uploads and downloads for fluid max-min models (LV08, CM02)", - xbt_cfgelm_boolean, 0, 1, _sg_cfg_cb__surf_network_crosstraffic, NULL); + xbt_cfgelm_boolean, 1, 1, _sg_cfg_cb__surf_network_crosstraffic, NULL); xbt_cfg_setdefault_boolean(_sg_cfg_set, "network/crosstraffic", "no"); #ifdef HAVE_GTNETS @@ -795,47 +811,47 @@ void sg_config_init(int *argc, char **argv) xbt_cfg_register(&_sg_cfg_set, "smpi/gather", "Which collective to use for gather", - xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__coll_gather, NULL); + xbt_cfgelm_string, 0, 1, &_sg_cfg_cb__coll_gather, NULL); xbt_cfg_register(&_sg_cfg_set, "smpi/allgather", "Which collective to use for allgather", - xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__coll_allgather, NULL); + xbt_cfgelm_string, 0, 1, &_sg_cfg_cb__coll_allgather, NULL); xbt_cfg_register(&_sg_cfg_set, "smpi/barrier", "Which collective to use for barrier", - xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__coll_barrier, NULL); + xbt_cfgelm_string, 0, 1, &_sg_cfg_cb__coll_barrier, NULL); xbt_cfg_register(&_sg_cfg_set, "smpi/reduce_scatter", "Which collective to use for reduce_scatter", - xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__coll_reduce_scatter, NULL); + xbt_cfgelm_string, 0, 1, &_sg_cfg_cb__coll_reduce_scatter, NULL); xbt_cfg_register(&_sg_cfg_set, "smpi/scatter", "Which collective to use for scatter", - xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__coll_scatter, NULL); + xbt_cfgelm_string, 0, 1, &_sg_cfg_cb__coll_scatter, NULL); xbt_cfg_register(&_sg_cfg_set, "smpi/allgatherv", "Which collective to use for allgatherv", - xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__coll_allgatherv, NULL); + xbt_cfgelm_string, 0, 1, &_sg_cfg_cb__coll_allgatherv, NULL); xbt_cfg_register(&_sg_cfg_set, "smpi/allreduce", "Which collective to use for allreduce", - xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__coll_allreduce, NULL); + xbt_cfgelm_string, 0, 1, &_sg_cfg_cb__coll_allreduce, NULL); xbt_cfg_register(&_sg_cfg_set, "smpi/alltoall", "Which collective to use for alltoall", - xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__coll_alltoall, NULL); + xbt_cfgelm_string, 0, 1, &_sg_cfg_cb__coll_alltoall, NULL); xbt_cfg_register(&_sg_cfg_set, "smpi/alltoallv", "Which collective to use for alltoallv", - xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__coll_alltoallv, NULL); + xbt_cfgelm_string, 0, 1, &_sg_cfg_cb__coll_alltoallv, NULL); xbt_cfg_register(&_sg_cfg_set, "smpi/bcast", "Which collective to use for bcast", - xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__coll_bcast, NULL); + xbt_cfgelm_string, 0, 1, &_sg_cfg_cb__coll_bcast, NULL); xbt_cfg_register(&_sg_cfg_set, "smpi/reduce", "Which collective to use for reduce", - xbt_cfgelm_string, 1, 1, &_sg_cfg_cb__coll_reduce, NULL); + xbt_cfgelm_string, 0, 1, &_sg_cfg_cb__coll_reduce, NULL); #endif // HAVE_SMPI xbt_cfg_register(&_sg_cfg_set, "clean_atexit", @@ -853,6 +869,7 @@ void sg_config_init(int *argc, char **argv) xbt_cfg_setdefault_string(_sg_cfg_set, "path", initial_path); } + xbt_cfg_check(_sg_cfg_set); _sg_cfg_init_status = 1; sg_config_cmd_line(argc, argv); diff --git a/src/simix/simcalls.in b/src/simix/simcalls.in index fcf133ecb6..59865c8b22 100644 --- a/src/simix/simcalls.in +++ b/src/simix/simcalls.in @@ -30,7 +30,8 @@ host_execution_set_priority True (void) (execution, void*, smx_action_t) (priori host_execution_set_bound True (void) (execution, void*, smx_action_t) (bound, double) host_execution_set_affinity True (void) (execution, void*, smx_action_t) (ws, void*, smx_host_t) (mask, unsigned long) host_execution_wait False (int) (execution, void*, smx_action_t) -host_get_storage_list True (void*, xbt_dict_t) (host, void*, smx_host_t) +host_get_mounted_storage_list True (void*, xbt_dict_t) (host, void*, smx_host_t) +host_get_attached_storage_list True (void*, xbt_dynar_t) (host, void*, smx_host_t) host_get_params True (void) (ind_vm, void*, smx_host_t) (params, void*, ws_params_t) host_set_params True (void) (ind_vm, void*, smx_host_t) (params, void*, ws_params_t) vm_create True (void*) (name, const char*) (ind_pm, void*, smx_host_t) @@ -68,7 +69,7 @@ process_auto_restart_set True (void) (process, void*, smx_process_t) (auto_resta process_restart True (void*, smx_process_t) (process, void*, smx_process_t) rdv_create True (void*, smx_rdv_t) (name, const char*) rdv_destroy True (void) (rdv, void*, smx_rdv_t) -rdv_get_by_name True (void*, smx_host_t) (name, const char*) +#rdv_get_by_name True (void*, smx_host_t) (name, const char*) rdv_comm_count_by_host True (unsigned int) (rdv, void*, smx_rdv_t) (host, void*, smx_host_t) rdv_get_head True (void*, smx_action_t) (rdv, void*, smx_rdv_t) rdv_set_receiver True (void) (rdv, void*, smx_rdv_t) (receiver, void*, smx_process_t) @@ -107,11 +108,9 @@ sem_would_block True (int) (sem, void*, smx_sem_t) sem_acquire False (void) (sem, void*, smx_sem_t) sem_acquire_timeout False (void) (sem, void*, smx_sem_t) (timeout, double) sem_get_capacity True (int) (sem, void*, smx_sem_t) -file_get_data True (void*) (fd, void*, smx_file_t) -file_set_data True (void) (fd, void*, smx_file_t) (data, void*) file_read False (sg_size_t) (fd, void*, smx_file_t) (size, sg_size_t) file_write False (sg_size_t) (fd, void*, smx_file_t) (size, sg_size_t) -file_open False (void*, smx_file_t) (mount, const char*) (path, const char*) +file_open False (void*, smx_file_t) (fullpath, const char*) file_close False (int) (fd, void*, smx_file_t) file_unlink True (int) (fd, void*, smx_file_t) file_ls False (void*, xbt_dict_t) (mount, const char*) (path, const char*) diff --git a/src/simix/simcalls_generated_args_getter_setter.h b/src/simix/simcalls_generated_args_getter_setter.h index af7235f798..e76f174fd4 100644 --- a/src/simix/simcalls_generated_args_getter_setter.h +++ b/src/simix/simcalls_generated_args_getter_setter.h @@ -257,10 +257,16 @@ static inline smx_action_t simcall_host_execution_wait__get__execution(smx_simca static inline void simcall_host_execution_wait__set__execution(smx_simcall_t simcall, void* arg){ simcall->args[0].dp = arg; } -static inline smx_host_t simcall_host_get_storage_list__get__host(smx_simcall_t simcall){ +static inline smx_host_t simcall_host_get_mounted_storage_list__get__host(smx_simcall_t simcall){ return (smx_host_t) simcall->args[0].dp; } -static inline void simcall_host_get_storage_list__set__host(smx_simcall_t simcall, void* arg){ +static inline void simcall_host_get_mounted_storage_list__set__host(smx_simcall_t simcall, void* arg){ + simcall->args[0].dp = arg; +} +static inline smx_host_t simcall_host_get_attached_storage_list__get__host(smx_simcall_t simcall){ + return (smx_host_t) simcall->args[0].dp; +} +static inline void simcall_host_get_attached_storage_list__set__host(smx_simcall_t simcall, void* arg){ simcall->args[0].dp = arg; } static inline smx_host_t simcall_host_get_params__get__ind_vm(smx_simcall_t simcall){ @@ -606,12 +612,6 @@ static inline smx_rdv_t simcall_rdv_destroy__get__rdv(smx_simcall_t simcall){ static inline void simcall_rdv_destroy__set__rdv(smx_simcall_t simcall, void* arg){ simcall->args[0].dp = arg; } -static inline const char* simcall_rdv_get_by_name__get__name(smx_simcall_t simcall){ - return simcall->args[0].cc; -} -static inline void simcall_rdv_get_by_name__set__name(smx_simcall_t simcall, const char* arg){ - simcall->args[0].cc = arg; -} static inline smx_rdv_t simcall_rdv_comm_count_by_host__get__rdv(smx_simcall_t simcall){ return (smx_rdv_t) simcall->args[0].dp; } @@ -1052,24 +1052,6 @@ static inline smx_sem_t simcall_sem_get_capacity__get__sem(smx_simcall_t simcall static inline void simcall_sem_get_capacity__set__sem(smx_simcall_t simcall, void* arg){ simcall->args[0].dp = arg; } -static inline smx_file_t simcall_file_get_data__get__fd(smx_simcall_t simcall){ - return (smx_file_t) simcall->args[0].dp; -} -static inline void simcall_file_get_data__set__fd(smx_simcall_t simcall, void* arg){ - simcall->args[0].dp = arg; -} -static inline smx_file_t simcall_file_set_data__get__fd(smx_simcall_t simcall){ - return (smx_file_t) simcall->args[0].dp; -} -static inline void simcall_file_set_data__set__fd(smx_simcall_t simcall, void* arg){ - simcall->args[0].dp = arg; -} -static inline void* simcall_file_set_data__get__data(smx_simcall_t simcall){ - return simcall->args[1].dp; -} -static inline void simcall_file_set_data__set__data(smx_simcall_t simcall, void* arg){ - simcall->args[1].dp = arg; -} static inline smx_file_t simcall_file_read__get__fd(smx_simcall_t simcall){ return (smx_file_t) simcall->args[0].dp; } @@ -1094,18 +1076,12 @@ static inline sg_size_t simcall_file_write__get__size(smx_simcall_t simcall){ static inline void simcall_file_write__set__size(smx_simcall_t simcall, sg_size_t arg){ simcall->args[1].sgsz = arg; } -static inline const char* simcall_file_open__get__mount(smx_simcall_t simcall){ +static inline const char* simcall_file_open__get__fullpath(smx_simcall_t simcall){ return simcall->args[0].cc; } -static inline void simcall_file_open__set__mount(smx_simcall_t simcall, const char* arg){ +static inline void simcall_file_open__set__fullpath(smx_simcall_t simcall, const char* arg){ simcall->args[0].cc = arg; } -static inline const char* simcall_file_open__get__path(smx_simcall_t simcall){ - return simcall->args[1].cc; -} -static inline void simcall_file_open__set__path(smx_simcall_t simcall, const char* arg){ - simcall->args[1].cc = arg; -} static inline smx_file_t simcall_file_close__get__fd(smx_simcall_t simcall){ return (smx_file_t) simcall->args[0].dp; } diff --git a/src/simix/simcalls_generated_body.c b/src/simix/simcalls_generated_body.c index b81e906b86..c37a78b52e 100644 --- a/src/simix/simcalls_generated_body.c +++ b/src/simix/simcalls_generated_body.c @@ -397,9 +397,24 @@ } return self->simcall.result.i; } - inline static xbt_dict_t simcall_BODY_host_get_storage_list(smx_host_t host) { + inline static xbt_dict_t simcall_BODY_host_get_mounted_storage_list(smx_host_t host) { smx_process_t self = SIMIX_process_self(); - self->simcall.call = SIMCALL_HOST_GET_STORAGE_LIST; + self->simcall.call = SIMCALL_HOST_GET_MOUNTED_STORAGE_LIST; + memset(&self->simcall.result, 0, sizeof(self->simcall.result)); + memset(self->simcall.args, 0, sizeof(self->simcall.args)); + self->simcall.args[0].dp = (void*) host; + if (self != simix_global->maestro_process) { + XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name, + SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call); + SIMIX_process_yield(self); + } else { + SIMIX_simcall_pre(&self->simcall, 0); + } + return self->simcall.result.dp; + } + inline static xbt_dynar_t simcall_BODY_host_get_attached_storage_list(smx_host_t host) { + smx_process_t self = SIMIX_process_self(); + self->simcall.call = SIMCALL_HOST_GET_ATTACHED_STORAGE_LIST; memset(&self->simcall.result, 0, sizeof(self->simcall.result)); memset(self->simcall.args, 0, sizeof(self->simcall.args)); self->simcall.args[0].dp = (void*) host; @@ -988,21 +1003,6 @@ } } - inline static smx_host_t simcall_BODY_rdv_get_by_name(const char* name) { - smx_process_t self = SIMIX_process_self(); - self->simcall.call = SIMCALL_RDV_GET_BY_NAME; - memset(&self->simcall.result, 0, sizeof(self->simcall.result)); - memset(self->simcall.args, 0, sizeof(self->simcall.args)); - self->simcall.args[0].cc = (const char*) name; - if (self != simix_global->maestro_process) { - XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name, - SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call); - SIMIX_process_yield(self); - } else { - SIMIX_simcall_pre(&self->simcall, 0); - } - return self->simcall.result.dp; - } inline static unsigned int simcall_BODY_rdv_comm_count_by_host(smx_rdv_t rdv, smx_host_t host) { smx_process_t self = SIMIX_process_self(); self->simcall.call = SIMCALL_RDV_COMM_COUNT_BY_HOST; @@ -1610,37 +1610,6 @@ } return self->simcall.result.i; } - inline static void* simcall_BODY_file_get_data(smx_file_t fd) { - smx_process_t self = SIMIX_process_self(); - self->simcall.call = SIMCALL_FILE_GET_DATA; - memset(&self->simcall.result, 0, sizeof(self->simcall.result)); - memset(self->simcall.args, 0, sizeof(self->simcall.args)); - self->simcall.args[0].dp = (void*) fd; - if (self != simix_global->maestro_process) { - XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name, - SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call); - SIMIX_process_yield(self); - } else { - SIMIX_simcall_pre(&self->simcall, 0); - } - return self->simcall.result.dp; - } - inline static void simcall_BODY_file_set_data(smx_file_t fd, void* data) { - smx_process_t self = SIMIX_process_self(); - self->simcall.call = SIMCALL_FILE_SET_DATA; - memset(&self->simcall.result, 0, sizeof(self->simcall.result)); - memset(self->simcall.args, 0, sizeof(self->simcall.args)); - self->simcall.args[0].dp = (void*) fd; - self->simcall.args[1].dp = (void*) data; - if (self != simix_global->maestro_process) { - XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name, - SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call); - SIMIX_process_yield(self); - } else { - SIMIX_simcall_pre(&self->simcall, 0); - } - - } inline static sg_size_t simcall_BODY_file_read(smx_file_t fd, sg_size_t size) { smx_process_t self = SIMIX_process_self(); self->simcall.call = SIMCALL_FILE_READ; @@ -1673,13 +1642,12 @@ } return self->simcall.result.sgsz; } - inline static smx_file_t simcall_BODY_file_open(const char* mount, const char* path) { + inline static smx_file_t simcall_BODY_file_open(const char* fullpath) { smx_process_t self = SIMIX_process_self(); self->simcall.call = SIMCALL_FILE_OPEN; memset(&self->simcall.result, 0, sizeof(self->simcall.result)); memset(self->simcall.args, 0, sizeof(self->simcall.args)); - self->simcall.args[0].cc = (const char*) mount; - self->simcall.args[1].cc = (const char*) path; + self->simcall.args[0].cc = (const char*) fullpath; if (self != simix_global->maestro_process) { XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name, SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call); diff --git a/src/simix/simcalls_generated_case.c b/src/simix/simcalls_generated_case.c index 1fc92a5aac..cc672efe05 100644 --- a/src/simix/simcalls_generated_case.c +++ b/src/simix/simcalls_generated_case.c @@ -129,8 +129,13 @@ case SIMCALL_HOST_EXECUTION_WAIT: SIMIX_pre_host_execution_wait(simcall , (smx_action_t) simcall->args[0].dp); break; -case SIMCALL_HOST_GET_STORAGE_LIST: - simcall->result.dp = SIMIX_pre_host_get_storage_list(simcall , (smx_host_t) simcall->args[0].dp); +case SIMCALL_HOST_GET_MOUNTED_STORAGE_LIST: + simcall->result.dp = SIMIX_pre_host_get_mounted_storage_list(simcall , (smx_host_t) simcall->args[0].dp); + SIMIX_simcall_answer(simcall); + break; + +case SIMCALL_HOST_GET_ATTACHED_STORAGE_LIST: + simcall->result.dp = SIMIX_pre_host_get_attached_storage_list(simcall , (smx_host_t) simcall->args[0].dp); SIMIX_simcall_answer(simcall); break; @@ -317,11 +322,6 @@ case SIMCALL_RDV_DESTROY: SIMIX_simcall_answer(simcall); break; -case SIMCALL_RDV_GET_BY_NAME: - simcall->result.dp = SIMIX_pre_rdv_get_by_name(simcall , simcall->args[0].cc); - SIMIX_simcall_answer(simcall); - break; - case SIMCALL_RDV_COMM_COUNT_BY_HOST: simcall->result.ui = SIMIX_pre_rdv_comm_count_by_host(simcall , (smx_rdv_t) simcall->args[0].dp, (smx_host_t) simcall->args[1].dp); SIMIX_simcall_answer(simcall); @@ -501,16 +501,6 @@ case SIMCALL_SEM_GET_CAPACITY: SIMIX_simcall_answer(simcall); break; -case SIMCALL_FILE_GET_DATA: - simcall->result.dp = SIMIX_pre_file_get_data(simcall , (smx_file_t) simcall->args[0].dp); - SIMIX_simcall_answer(simcall); - break; - -case SIMCALL_FILE_SET_DATA: - SIMIX_pre_file_set_data(simcall , (smx_file_t) simcall->args[0].dp, simcall->args[1].dp); - SIMIX_simcall_answer(simcall); - break; - case SIMCALL_FILE_READ: SIMIX_pre_file_read(simcall , (smx_file_t) simcall->args[0].dp, simcall->args[1].sgsz); break; @@ -520,7 +510,7 @@ case SIMCALL_FILE_WRITE: break; case SIMCALL_FILE_OPEN: - SIMIX_pre_file_open(simcall , simcall->args[0].cc, simcall->args[1].cc); + SIMIX_pre_file_open(simcall , simcall->args[0].cc); break; case SIMCALL_FILE_CLOSE: diff --git a/src/simix/simcalls_generated_enum.h b/src/simix/simcalls_generated_enum.h index 50460e2b6e..f3a064eb33 100644 --- a/src/simix/simcalls_generated_enum.h +++ b/src/simix/simcalls_generated_enum.h @@ -30,7 +30,8 @@ SIMCALL_HOST_EXECUTION_SET_PRIORITY, SIMCALL_HOST_EXECUTION_SET_BOUND, SIMCALL_HOST_EXECUTION_SET_AFFINITY, SIMCALL_HOST_EXECUTION_WAIT, -SIMCALL_HOST_GET_STORAGE_LIST, +SIMCALL_HOST_GET_MOUNTED_STORAGE_LIST, +SIMCALL_HOST_GET_ATTACHED_STORAGE_LIST, SIMCALL_HOST_GET_PARAMS, SIMCALL_HOST_SET_PARAMS, SIMCALL_VM_CREATE, @@ -68,7 +69,6 @@ SIMCALL_PROCESS_AUTO_RESTART_SET, SIMCALL_PROCESS_RESTART, SIMCALL_RDV_CREATE, SIMCALL_RDV_DESTROY, -SIMCALL_RDV_GET_BY_NAME, SIMCALL_RDV_COMM_COUNT_BY_HOST, SIMCALL_RDV_GET_HEAD, SIMCALL_RDV_SET_RECEIVER, @@ -107,8 +107,6 @@ SIMCALL_SEM_WOULD_BLOCK, SIMCALL_SEM_ACQUIRE, SIMCALL_SEM_ACQUIRE_TIMEOUT, SIMCALL_SEM_GET_CAPACITY, -SIMCALL_FILE_GET_DATA, -SIMCALL_FILE_SET_DATA, SIMCALL_FILE_READ, SIMCALL_FILE_WRITE, SIMCALL_FILE_OPEN, diff --git a/src/simix/simcalls_generated_res_getter_setter.h b/src/simix/simcalls_generated_res_getter_setter.h index 2e051f6690..bcee19440f 100644 --- a/src/simix/simcalls_generated_res_getter_setter.h +++ b/src/simix/simcalls_generated_res_getter_setter.h @@ -123,10 +123,16 @@ static inline int simcall_host_execution_wait__get__result(smx_simcall_t simcall static inline void simcall_host_execution_wait__set__result(smx_simcall_t simcall, int result){ simcall->result.i = result; } -static inline xbt_dict_t simcall_host_get_storage_list__get__result(smx_simcall_t simcall){ +static inline xbt_dict_t simcall_host_get_mounted_storage_list__get__result(smx_simcall_t simcall){ return (xbt_dict_t) simcall->result.dp; } -static inline void simcall_host_get_storage_list__set__result(smx_simcall_t simcall, void* result){ +static inline void simcall_host_get_mounted_storage_list__set__result(smx_simcall_t simcall, void* result){ + simcall->result.dp = result; +} +static inline xbt_dynar_t simcall_host_get_attached_storage_list__get__result(smx_simcall_t simcall){ + return (xbt_dynar_t) simcall->result.dp; +} +static inline void simcall_host_get_attached_storage_list__set__result(smx_simcall_t simcall, void* result){ simcall->result.dp = result; } @@ -259,12 +265,6 @@ static inline void simcall_rdv_create__set__result(smx_simcall_t simcall, void* } -static inline smx_host_t simcall_rdv_get_by_name__get__result(smx_simcall_t simcall){ - return (smx_host_t) simcall->result.dp; -} -static inline void simcall_rdv_get_by_name__set__result(smx_simcall_t simcall, void* result){ - simcall->result.dp = result; -} static inline unsigned int simcall_rdv_comm_count_by_host__get__result(smx_simcall_t simcall){ return simcall->result.ui; } @@ -425,14 +425,6 @@ static inline int simcall_sem_get_capacity__get__result(smx_simcall_t simcall){ static inline void simcall_sem_get_capacity__set__result(smx_simcall_t simcall, int result){ simcall->result.i = result; } -static inline void* simcall_file_get_data__get__result(smx_simcall_t simcall){ - return simcall->result.dp; -} -static inline void simcall_file_get_data__set__result(smx_simcall_t simcall, void* result){ - simcall->result.dp = result; -} - - static inline sg_size_t simcall_file_read__get__result(smx_simcall_t simcall){ return simcall->result.sgsz; } diff --git a/src/simix/simcalls_generated_string.c b/src/simix/simcalls_generated_string.c index 6bbf280100..ed629fa075 100644 --- a/src/simix/simcalls_generated_string.c +++ b/src/simix/simcalls_generated_string.c @@ -30,7 +30,8 @@ [SIMCALL_HOST_EXECUTION_SET_BOUND] = "SIMCALL_HOST_EXECUTION_SET_BOUND", [SIMCALL_HOST_EXECUTION_SET_AFFINITY] = "SIMCALL_HOST_EXECUTION_SET_AFFINITY", [SIMCALL_HOST_EXECUTION_WAIT] = "SIMCALL_HOST_EXECUTION_WAIT", -[SIMCALL_HOST_GET_STORAGE_LIST] = "SIMCALL_HOST_GET_STORAGE_LIST", +[SIMCALL_HOST_GET_MOUNTED_STORAGE_LIST] = "SIMCALL_HOST_GET_MOUNTED_STORAGE_LIST", +[SIMCALL_HOST_GET_ATTACHED_STORAGE_LIST] = "SIMCALL_HOST_GET_ATTACHED_STORAGE_LIST", [SIMCALL_HOST_GET_PARAMS] = "SIMCALL_HOST_GET_PARAMS", [SIMCALL_HOST_SET_PARAMS] = "SIMCALL_HOST_SET_PARAMS", [SIMCALL_VM_CREATE] = "SIMCALL_VM_CREATE", @@ -68,7 +69,6 @@ [SIMCALL_PROCESS_RESTART] = "SIMCALL_PROCESS_RESTART", [SIMCALL_RDV_CREATE] = "SIMCALL_RDV_CREATE", [SIMCALL_RDV_DESTROY] = "SIMCALL_RDV_DESTROY", -[SIMCALL_RDV_GET_BY_NAME] = "SIMCALL_RDV_GET_BY_NAME", [SIMCALL_RDV_COMM_COUNT_BY_HOST] = "SIMCALL_RDV_COMM_COUNT_BY_HOST", [SIMCALL_RDV_GET_HEAD] = "SIMCALL_RDV_GET_HEAD", [SIMCALL_RDV_SET_RECEIVER] = "SIMCALL_RDV_SET_RECEIVER", @@ -107,8 +107,6 @@ [SIMCALL_SEM_ACQUIRE] = "SIMCALL_SEM_ACQUIRE", [SIMCALL_SEM_ACQUIRE_TIMEOUT] = "SIMCALL_SEM_ACQUIRE_TIMEOUT", [SIMCALL_SEM_GET_CAPACITY] = "SIMCALL_SEM_GET_CAPACITY", -[SIMCALL_FILE_GET_DATA] = "SIMCALL_FILE_GET_DATA", -[SIMCALL_FILE_SET_DATA] = "SIMCALL_FILE_SET_DATA", [SIMCALL_FILE_READ] = "SIMCALL_FILE_READ", [SIMCALL_FILE_WRITE] = "SIMCALL_FILE_WRITE", [SIMCALL_FILE_OPEN] = "SIMCALL_FILE_OPEN", diff --git a/src/simix/smx_context.c b/src/simix/smx_context.c index 214ea7197a..0bfad29665 100644 --- a/src/simix/smx_context.c +++ b/src/simix/smx_context.c @@ -13,14 +13,22 @@ #include "smx_private.h" #include "simgrid/sg_config.h" #include "internal_config.h" +#include "simgrid/modelchecker.h" +#include + +#ifdef HAVE_VALGRIND_VALGRIND_H +# include +#endif XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_context, simix, "Context switching mechanism"); char* smx_context_factory_name = NULL; /* factory name specified by --cfg=contexts/factory:value */ smx_ctx_factory_initializer_t smx_factory_initializer_to_use = NULL; -int smx_context_stack_size = 128 * 1024; +int smx_context_stack_size; int smx_context_stack_size_was_set = 0; +int smx_context_guard_size; +int smx_context_guard_size_was_set = 0; #ifdef HAVE_THREAD_LOCAL_STORAGE static __thread smx_context_t smx_current_context_parallel; #else @@ -99,6 +107,68 @@ void SIMIX_context_mod_exit(void) xbt_dict_remove((xbt_dict_t) _sg_cfg_set,"contexts/factory"); } +void *SIMIX_context_stack_new(void) +{ + void *stack; + + if (smx_context_guard_size > 0 && !MC_is_active()) { + size_t size = smx_context_stack_size + smx_context_guard_size; +#ifdef HAVE_MC + /* Cannot use posix_memalign when HAVE_MC. Align stack by hand, and save the + * pointer returned by xbt_malloc0. */ + char *alloc = xbt_malloc0(size + xbt_pagesize); + stack = alloc - ((uintptr_t)alloc & (xbt_pagesize - 1)) + xbt_pagesize; + *((void **)stack - 1) = alloc; +#else + if (posix_memalign(&stack, xbt_pagesize, size) != 0) + xbt_die("Failed to allocate stack."); +#endif + if (mprotect(stack, smx_context_guard_size, PROT_NONE) == -1) { + XBT_WARN("Failed to protect stack: %s", strerror(errno)); + /* That's not fatal, pursue anyway. */ + } + stack = (char *)stack + smx_context_guard_size; + } else { + stack = xbt_malloc0(smx_context_stack_size); + } + +#ifdef HAVE_VALGRIND_VALGRIND_H + unsigned int valgrind_stack_id = + VALGRIND_STACK_REGISTER(stack, (char *)stack + smx_context_stack_size); + memcpy((char *)stack + smx_context_usable_stack_size, &valgrind_stack_id, + sizeof valgrind_stack_id); +#endif + + return stack; +} + +void SIMIX_context_stack_delete(void *stack) +{ + if (!stack) + return; + +#ifdef HAVE_VALGRIND_VALGRIND_H + unsigned int valgrind_stack_id; + memcpy(&valgrind_stack_id, (char *)stack + smx_context_usable_stack_size, + sizeof valgrind_stack_id); + VALGRIND_STACK_DEREGISTER(valgrind_stack_id); +#endif + + if (smx_context_guard_size > 0 && !MC_is_active()) { + stack = (char *)stack - smx_context_guard_size; + if (mprotect(stack, smx_context_guard_size, + PROT_READ | PROT_WRITE | PROT_EXEC) == -1) { + XBT_WARN("Failed to remove page protection: %s", strerror(errno)); + /* try to pursue anyway */ + } +#ifdef HAVE_MC + /* Retrieve the saved pointer. See SIMIX_context_stack_new above. */ + stack = *((void **)stack - 1); +#endif + } + xbt_free(stack); +} + /** * \brief Returns whether some parallel threads are used * for the user contexts. diff --git a/src/simix/smx_context_raw.c b/src/simix/smx_context_raw.c index d475f6be53..37e07636b8 100644 --- a/src/simix/smx_context_raw.c +++ b/src/simix/smx_context_raw.c @@ -10,10 +10,6 @@ #include "xbt/parmap.h" #include "mc/mc.h" -#ifdef HAVE_VALGRIND_VALGRIND_H -# include -#endif /* HAVE_VALGRIND_VALGRIND_H */ - typedef char * raw_stack_t; typedef void (*rawctx_entry_point_t)(void *); @@ -21,9 +17,6 @@ typedef struct s_smx_ctx_raw { s_smx_ctx_base_t super; /* Fields of super implementation */ char *malloced_stack; /* malloced area containing the stack */ raw_stack_t stack_top; /* pointer to stack top (within previous area) */ -#ifdef HAVE_VALGRIND_VALGRIND_H - unsigned int valgrind_stack_id; /* the valgrind stack id */ -#endif #ifdef TIME_BENCH_PER_SR unsigned int thread; /* Just for measuring purposes */ #endif @@ -62,6 +55,7 @@ __asm__ ( #endif " mov %rdi,%rax\n" /* stack */ " add %rsi,%rax\n" /* size */ + " andq $-16, %rax\n" /* align stack */ " movq $0, -8(%rax)\n" /* @return for func */ " mov %rdx,-16(%rax)\n" /* func */ " mov %rcx,-24(%rax)\n" /* arg/rdi */ @@ -137,6 +131,7 @@ __asm__ ( #endif " movl 4(%esp),%eax\n" /* stack */ " addl 8(%esp),%eax\n" /* size */ + " andl $-16, %eax\n" /* align stack */ " movl 12(%esp),%ecx\n" /* func */ " movl 16(%esp),%edx\n" /* arg */ " movl %edx, -4(%eax)\n" @@ -316,16 +311,11 @@ smx_ctx_raw_create_context(xbt_main_func_t code, int argc, char **argv, /* if the user provided a function for the process then use it, otherwise it is the context for maestro */ if (code) { - context->malloced_stack = xbt_malloc0(smx_context_stack_size); + context->malloced_stack = SIMIX_context_stack_new(); context->stack_top = - raw_makecontext(context->malloced_stack, smx_context_stack_size, - (void_f_pvoid_t) smx_ctx_raw_wrapper, context); - -#ifdef HAVE_VALGRIND_VALGRIND_H - context->valgrind_stack_id = - VALGRIND_STACK_REGISTER(context->malloced_stack, - context->malloced_stack + smx_context_stack_size); -#endif /* HAVE_VALGRIND_VALGRIND_H */ + raw_makecontext(context->malloced_stack, + smx_context_usable_stack_size, + (void_f_pvoid_t)smx_ctx_raw_wrapper, context); } else { if(process != NULL && raw_maestro_context==NULL) @@ -346,13 +336,7 @@ smx_ctx_raw_create_context(xbt_main_func_t code, int argc, char **argv, static void smx_ctx_raw_free(smx_context_t context) { if (context) { - -#ifdef HAVE_VALGRIND_VALGRIND_H - VALGRIND_STACK_DEREGISTER(((smx_ctx_raw_t) - context)->valgrind_stack_id); -#endif /* HAVE_VALGRIND_VALGRIND_H */ - - free(((smx_ctx_raw_t) context)->malloced_stack); + SIMIX_context_stack_delete(((smx_ctx_raw_t) context)->malloced_stack); } smx_ctx_base_free(context); } diff --git a/src/simix/smx_context_sysv.c b/src/simix/smx_context_sysv.c index b1906cc105..d8f90fe37e 100644 --- a/src/simix/smx_context_sysv.c +++ b/src/simix/smx_context_sysv.c @@ -20,19 +20,12 @@ # include /* context relative declarations */ #endif -#ifdef HAVE_VALGRIND_VALGRIND_H -# include -#endif /* HAVE_VALGRIND_VALGRIND_H */ - XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(simix_context); typedef struct s_smx_ctx_sysv { s_smx_ctx_base_t super; /* Fields of super implementation */ ucontext_t uc; /* the ucontext that executes the code */ -#ifdef HAVE_VALGRIND_VALGRIND_H - unsigned int valgrind_stack_id; /* the valgrind stack id */ -#endif - char stack[0]; /* the thread stack (must remain the last element of the structure) */ + char *stack; /* the thread stack */ } s_smx_ctx_sysv_t, *smx_ctx_sysv_t; #ifdef CONTEXT_THREADS @@ -46,12 +39,6 @@ static unsigned long sysv_process_index = 0; /* index of the next process to r static smx_ctx_sysv_t sysv_maestro_context; static int smx_ctx_sysv_factory_finalize(smx_context_factory_t *factory); -static smx_context_t -smx_ctx_sysv_create_context_sized(size_t structure_size, - xbt_main_func_t code, int argc, - char **argv, - void_pfn_smxprocess_t cleanup_func, - smx_process_t process); static void smx_ctx_sysv_free(smx_context_t context); static smx_context_t smx_ctx_sysv_create_context(xbt_main_func_t code, int argc, char **argv, @@ -117,40 +104,35 @@ static int smx_ctx_sysv_factory_finalize(smx_context_factory_t *factory) } static smx_context_t -smx_ctx_sysv_create_context_sized(size_t size, xbt_main_func_t code, - int argc, char **argv, - void_pfn_smxprocess_t cleanup_func, - smx_process_t process) +smx_ctx_sysv_create_context(xbt_main_func_t code, int argc, char **argv, + void_pfn_smxprocess_t cleanup_func, + smx_process_t process) { int ctx_addr[CTX_ADDR_LEN]; smx_ctx_sysv_t context = - (smx_ctx_sysv_t) smx_ctx_base_factory_create_context_sized(size, - code, - argc, - argv, - cleanup_func, - process); + (smx_ctx_sysv_t) smx_ctx_base_factory_create_context_sized( + sizeof(s_smx_ctx_sysv_t), + code, + argc, + argv, + cleanup_func, + process); /* if the user provided a function for the process then use it, otherwise it is the context for maestro */ if (code) { + context->stack = SIMIX_context_stack_new(); getcontext(&(context->uc)); context->uc.uc_link = NULL; context->uc.uc_stack.ss_sp = - pth_skaddr_makecontext(context->stack, smx_context_stack_size); + pth_skaddr_makecontext(context->stack, smx_context_usable_stack_size); context->uc.uc_stack.ss_size = - pth_sksize_makecontext(context->stack, smx_context_stack_size); - -#ifdef HAVE_VALGRIND_VALGRIND_H - context->valgrind_stack_id = - VALGRIND_STACK_REGISTER(context->uc.uc_stack.ss_sp, - ((char *) context->uc.uc_stack.ss_sp) + - context->uc.uc_stack.ss_size); -#endif /* HAVE_VALGRIND_VALGRIND_H */ + pth_sksize_makecontext(context->stack, smx_context_usable_stack_size); + memcpy(ctx_addr, &context, sizeof(smx_ctx_sysv_t)); switch (CTX_ADDR_LEN) { case 1: @@ -171,35 +153,17 @@ smx_ctx_sysv_create_context_sized(size_t size, xbt_main_func_t code, } if(MC_is_active() && code) - MC_new_stack_area(context, ((smx_context_t)context)->process->name, - &(context->uc), size); + MC_new_stack_area(context->stack, ((smx_context_t)context)->process->name, + &(context->uc), smx_context_usable_stack_size); return (smx_context_t) context; } -static smx_context_t -smx_ctx_sysv_create_context(xbt_main_func_t code, int argc, char **argv, - void_pfn_smxprocess_t cleanup_func, - smx_process_t process) -{ - - return smx_ctx_sysv_create_context_sized(sizeof(s_smx_ctx_sysv_t) + - smx_context_stack_size, - code, argc, argv, cleanup_func, - process); - -} - static void smx_ctx_sysv_free(smx_context_t context) { if (context) { - -#ifdef HAVE_VALGRIND_VALGRIND_H - VALGRIND_STACK_DEREGISTER(((smx_ctx_sysv_t) - context)->valgrind_stack_id); -#endif /* HAVE_VALGRIND_VALGRIND_H */ - + SIMIX_context_stack_delete(((smx_ctx_sysv_t)context)->stack); } smx_ctx_base_free(context); } diff --git a/src/simix/smx_context_thread.c b/src/simix/smx_context_thread.c index ea06db0105..ee35dfdf64 100644 --- a/src/simix/smx_context_thread.c +++ b/src/simix/smx_context_thread.c @@ -94,6 +94,8 @@ smx_ctx_thread_factory_create_context(xbt_main_func_t code, int argc, context->end = xbt_os_sem_init(0); if (smx_context_stack_size_was_set) xbt_os_thread_setstacksize(smx_context_stack_size); + if (smx_context_guard_size_was_set) + xbt_os_thread_setguardsize(smx_context_guard_size); /* create and start the process */ /* NOTE: The first argument to xbt_os_thread_create used to be the process * @@ -151,6 +153,13 @@ static void *smx_ctx_thread_wrapper(void *param) { smx_ctx_thread_t context = (smx_ctx_thread_t) param; + /* Install alternate signal stack, for SIGSEGV handler. */ + stack_t stack; + stack.ss_sp = sigsegv_stack; + stack.ss_size = sizeof sigsegv_stack; + stack.ss_flags = 0; + sigaltstack(&stack, NULL); + /* Tell the maestro we are starting, and wait for its green light */ xbt_os_sem_release(context->end); xbt_os_sem_acquire(context->begin); diff --git a/src/simix/smx_deployment.c b/src/simix/smx_deployment.c index 894de3c2dd..d1fcee1a94 100644 --- a/src/simix/smx_deployment.c +++ b/src/simix/smx_deployment.c @@ -80,7 +80,7 @@ static void parse_process(sg_platf_process_cbarg_t process) process->argc, (char**)(process->argv), current_property_set, - auto_restart); + auto_restart, NULL); else simcall_process_create(&process_created, (char*)(process->argv)[0], parse_code, NULL, sg_host_name(host), kill_time, process->argc, (char**)process->argv, current_property_set,auto_restart); diff --git a/src/simix/smx_global.c b/src/simix/smx_global.c index 5d2b942d32..7df250c5c1 100644 --- a/src/simix/smx_global.c +++ b/src/simix/smx_global.c @@ -24,8 +24,6 @@ static void* SIMIX_action_mallocator_new_f(void); static void SIMIX_action_mallocator_free_f(void* action); static void SIMIX_action_mallocator_reset_f(void* action); -static void SIMIX_clean(void); - /* FIXME: Yeah, I'll do it in a portable maner one day [Mt] */ #include @@ -42,6 +40,64 @@ static void _XBT_CALL inthandler(int ignored) exit(1); } +static void _XBT_CALL segvhandler(int signum, siginfo_t *siginfo, void *context) +{ + if (siginfo->si_signo == SIGSEGV && siginfo->si_code == SEGV_ACCERR) { + fprintf(stderr, + "Access violation detected. This can result from a stack overflow.\n" + "Try to increase stack size with --cfg=contexts/stack_size (current size is %d KiB).\n", + smx_context_stack_size / 1024); + if (XBT_LOG_ISENABLED(simix_kernel, xbt_log_priority_debug)) { + fprintf(stderr, + "siginfo = {si_signo = %d, si_errno = %d, si_code = %d, si_addr = %p}\n", + siginfo->si_signo, siginfo->si_errno, siginfo->si_code, siginfo->si_addr); + } + } + raise(signum); +} + +char sigsegv_stack[SIGSTKSZ]; /* alternate stack for SIGSEGV handler */ + +/** + * Install signal handler for SIGSEGV. Check that nobody has already installed + * its own handler. For example, the Java VM does this. + */ +static void install_segvhandler(void) +{ + stack_t stack, old_stack; + stack.ss_sp = sigsegv_stack; + stack.ss_size = sizeof sigsegv_stack; + stack.ss_flags = 0; + + if (sigaltstack(&stack, &old_stack) == -1) { + XBT_WARN("Failed to register alternate signal stack: %s", + strerror(errno)); + return; + } + if (!(old_stack.ss_flags & SS_DISABLE)) { + XBT_DEBUG("An alternate stack was already installed (sp=%p, size=%zd, flags=%x). Restore it.", + old_stack.ss_sp, old_stack.ss_size, old_stack.ss_flags); + sigaltstack(&old_stack, NULL); + } + + struct sigaction action, old_action; + action.sa_sigaction = segvhandler; + action.sa_flags = SA_ONSTACK | SA_RESETHAND | SA_SIGINFO; + sigemptyset(&action.sa_mask); + + if (sigaction(SIGSEGV, &action, &old_action) == -1) { + XBT_WARN("Failed to register signal handler for SIGSEGV: %s", + strerror(errno)); + return; + } + if ((old_action.sa_flags & SA_SIGINFO) || old_action.sa_handler != SIG_DFL) { + XBT_DEBUG("A signal handler was already installed for SIGSEGV (%p). Restore it.", + (old_action.sa_flags & SA_SIGINFO) ? + (void*)old_action.sa_sigaction : (void*)old_action.sa_handler); + sigaction(SIGSEGV, &old_action, NULL); + } +} + /********************************* SIMIX **************************************/ XBT_INLINE double SIMIX_timer_next(void) @@ -99,6 +155,9 @@ void SIMIX_global_init(int *argc, char **argv) /* Prepare to display some more info when dying on Ctrl-C pressing */ signal(SIGINT, inthandler); + /* Install SEGV handler */ + install_segvhandler(); + /* register a function to be called by SURF after the environment creation */ sg_platf_init(); sg_platf_postparse_add_cb(SIMIX_post_create_environment); @@ -124,12 +183,14 @@ void SIMIX_global_init(int *argc, char **argv) * * This functions remove the memory used by SIMIX */ -static void SIMIX_clean(void) +int cleaned = 0; +void SIMIX_clean(void) { #ifdef TIME_BENCH_PER_SR smx_ctx_raw_new_sr(); #endif - + if (cleaned) return; // to avoid double cleaning by java and C + cleaned = 1; /* Kill everyone (except maestro) */ SIMIX_process_killall(simix_global->maestro_process, 1); @@ -317,7 +378,7 @@ void SIMIX_run(void) /* Handle any pending timer */ while (xbt_heap_size(simix_timers) > 0 && SIMIX_get_clock() >= SIMIX_timer_next()) { //FIXME: make the timers being real callbacks - // (i.e. provide dispatchers that read and expand the args) + // (i.e. provide dispatchers that read and expand the args) timer = xbt_heap_pop(simix_timers); if (timer->func) ((void (*)(void*))timer->func)(timer->args); @@ -327,8 +388,7 @@ void SIMIX_run(void) /* Wake up all processes waiting for a Surf action to finish */ xbt_dynar_foreach(model_list, iter, model) { while ((action = surf_model_extract_failed_action_set(model))) - - SIMIX_simcall_post((smx_action_t) surf_action_get_data(action)); + SIMIX_simcall_post((smx_action_t) surf_action_get_data(action)); while ((action = surf_model_extract_done_action_set(model))) if (surf_action_get_data(action) == NULL) @@ -352,7 +412,7 @@ void SIMIX_run(void) XBT_DEBUG("### time %f, empty %d", time, xbt_dynar_is_empty(simix_global->process_to_run)); - // !(time == -1.0 && xbt_dynar_is_empty()) + // !(time == -1.0 && xbt_dynar_is_empty()) } while (time != -1.0 || !xbt_dynar_is_empty(simix_global->process_to_run)); diff --git a/src/simix/smx_host.c b/src/simix/smx_host.c index 2f88f82313..83c4cf78f8 100644 --- a/src/simix/smx_host.c +++ b/src/simix/smx_host.c @@ -53,7 +53,7 @@ void SIMIX_host_on(smx_host_t h) xbt_assert((host != NULL), "Invalid parameters"); if (surf_resource_get_state(surf_workstation_resource_priv(h))==SURF_RESOURCE_OFF) { - surf_resource_set_state(surf_workstation_resource_priv(h), SURF_RESOURCE_ON); + surf_resource_set_state(surf_workstation_resource_priv(h), SURF_RESOURCE_ON); unsigned int cpt; smx_process_arg_t arg; xbt_dynar_foreach(host->boot_processes,cpt,arg) { @@ -70,19 +70,19 @@ void SIMIX_host_on(smx_host_t h) arg->argc, arg->argv, arg->properties, - arg->auto_restart); - } - else { + arg->auto_restart, + NULL); + } else { simcall_process_create(&process, - arg->argv[0], - arg->code, - NULL, - arg->hostname, - arg->kill_time, - arg->argc, - arg->argv, - arg->properties, - arg->auto_restart); + arg->argv[0], + arg->code, + NULL, + arg->hostname, + arg->kill_time, + arg->argc, + arg->argv, + arg->properties, + arg->auto_restart); } } } @@ -103,8 +103,8 @@ void SIMIX_host_off(smx_host_t h, smx_process_t issuer) xbt_assert((host != NULL), "Invalid parameters"); - if (surf_resource_get_state(surf_workstation_resource_priv(h))==SURF_RESOURCE_OFF) { - surf_resource_set_state(surf_workstation_resource_priv(h), SURF_RESOURCE_ON); + if (surf_resource_get_state(surf_workstation_resource_priv(h))==SURF_RESOURCE_ON) { + surf_resource_set_state(surf_workstation_resource_priv(h), SURF_RESOURCE_OFF); /* Clean Simulator data */ if (xbt_swag_size(host->process_list) != 0) { @@ -391,7 +391,8 @@ void SIMIX_host_restart_processes(smx_host_t host) arg->argc, arg->argv, arg->properties, - arg->auto_restart); + arg->auto_restart, + NULL); } else { simcall_process_create(&process, arg->argv[0], @@ -462,7 +463,7 @@ smx_action_t SIMIX_host_execute(const char *name, } } - XBT_DEBUG("Create execute action %p", action); + XBT_DEBUG("Create execute action %p: %s", action, action->name); return action; } @@ -524,15 +525,6 @@ smx_action_t SIMIX_host_parallel_execute(const char *name, return action; } -//FIXME: REMOVE not used -static surf_model_t get_ws_model_from_action(smx_action_t action) -{ - xbt_assert(action->type == SIMIX_ACTION_EXECUTE); - smx_host_t host = action->execution.host; - surf_model_t model = surf_resource_model(host, SURF_WKS_LEVEL); - return model; -} - void SIMIX_pre_host_execution_destroy(smx_simcall_t simcall, smx_action_t action){ SIMIX_host_execution_destroy(action); } @@ -758,12 +750,22 @@ void SIMIX_pre_host_set_params(smx_simcall_t simcall, smx_host_t ind_vm, ws_para SIMIX_host_set_params(ind_vm, params); } -xbt_dict_t SIMIX_pre_host_get_storage_list(smx_simcall_t simcall, smx_host_t host){ - return SIMIX_host_get_storage_list(host); +xbt_dict_t SIMIX_pre_host_get_mounted_storage_list(smx_simcall_t simcall, smx_host_t host){ + return SIMIX_host_get_mounted_storage_list(host); +} + +xbt_dict_t SIMIX_host_get_mounted_storage_list(smx_host_t host){ + xbt_assert((host != NULL), "Invalid parameters (simix host is NULL)"); + + return surf_workstation_get_mounted_storage_list(host); +} + +xbt_dynar_t SIMIX_pre_host_get_attached_storage_list(smx_simcall_t simcall, smx_host_t host){ + return SIMIX_host_get_attached_storage_list(host); } -xbt_dict_t SIMIX_host_get_storage_list(smx_host_t host){ +xbt_dynar_t SIMIX_host_get_attached_storage_list(smx_host_t host){ xbt_assert((host != NULL), "Invalid parameters (simix host is NULL)"); - return surf_workstation_get_storage_list(host); + return surf_workstation_get_attached_storage_list(host); } diff --git a/src/simix/smx_host_private.h b/src/simix/smx_host_private.h index 3fe2fa7624..2e17bcf1cc 100644 --- a/src/simix/smx_host_private.h +++ b/src/simix/smx_host_private.h @@ -66,8 +66,8 @@ void SIMIX_host_execution_set_priority(smx_action_t action, double priority); void SIMIX_host_execution_set_bound(smx_action_t action, double bound); void SIMIX_host_execution_set_affinity(smx_action_t action, smx_host_t host, unsigned long mask); void SIMIX_pre_host_execution_wait(smx_simcall_t simcall, smx_action_t action); -xbt_dict_t SIMIX_host_get_storage_list(smx_host_t host); - +xbt_dict_t SIMIX_host_get_mounted_storage_list(smx_host_t host); +xbt_dynar_t SIMIX_host_get_attached_storage_list(smx_host_t host); // pre prototypes smx_host_t SIMIX_pre_host_get_by_name(smx_simcall_t, const char*); const char* SIMIX_pre_host_self_get_name(smx_simcall_t); @@ -101,7 +101,8 @@ void SIMIX_host_execution_suspend(smx_action_t action); void SIMIX_host_execution_resume(smx_action_t action); void SIMIX_post_host_execute(smx_action_t action); -xbt_dict_t SIMIX_pre_host_get_storage_list(smx_simcall_t, smx_host_t); +xbt_dict_t SIMIX_pre_host_get_mounted_storage_list(smx_simcall_t, smx_host_t); +xbt_dynar_t SIMIX_pre_host_get_attached_storage_list(smx_simcall_t, smx_host_t); #ifdef HAVE_TRACING void SIMIX_pre_set_category(smx_simcall_t simcall, smx_action_t action, const char *category); diff --git a/src/simix/smx_io.c b/src/simix/smx_io.c index f504da422f..5bfbe2060e 100644 --- a/src/simix/smx_io.c +++ b/src/simix/smx_io.c @@ -49,26 +49,6 @@ void SIMIX_storage_destroy(void *s) free(storage); } -void* SIMIX_pre_file_get_data(smx_simcall_t simcall,smx_file_t fd){ - return SIMIX_file_get_data(fd); -} - -void* SIMIX_file_get_data(smx_file_t fd){ - xbt_assert((fd != NULL), "Invalid parameters (simix file is NULL)"); - - return fd->data; -} - -void SIMIX_pre_file_set_data(smx_simcall_t simcall, smx_file_t fd, void *data) { - SIMIX_file_set_data(fd, data); -} - -void SIMIX_file_set_data(smx_file_t fd, void *data){ - xbt_assert((fd != NULL), "Invalid parameter"); - - fd->data = data; -} - //SIMIX FILE READ void SIMIX_pre_file_read(smx_simcall_t simcall, smx_file_t fd, sg_size_t size) { @@ -140,16 +120,14 @@ smx_action_t SIMIX_file_write(smx_process_t process, smx_file_t fd, sg_size_t si } //SIMIX FILE OPEN -void SIMIX_pre_file_open(smx_simcall_t simcall, const char* mount, - const char* path) +void SIMIX_pre_file_open(smx_simcall_t simcall, const char* fullpath) { - smx_action_t action = SIMIX_file_open(simcall->issuer, mount, path); + smx_action_t action = SIMIX_file_open(simcall->issuer, fullpath); xbt_fifo_push(action->simcalls, simcall); simcall->issuer->waiting_action = action; } -smx_action_t SIMIX_file_open(smx_process_t process ,const char* mount, - const char* path) +smx_action_t SIMIX_file_open(smx_process_t process, const char* fullpath) { smx_action_t action; smx_host_t host = process->smx_host; @@ -168,7 +146,7 @@ smx_action_t SIMIX_file_open(smx_process_t process ,const char* mount, #endif action->io.host = host; - action->io.surf_io = surf_workstation_open(host, mount, path); + action->io.surf_io = surf_workstation_open(host, fullpath); surf_action_set_data(action->io.surf_io, action); XBT_DEBUG("Create io action %p", action); @@ -361,26 +339,6 @@ const char* SIMIX_storage_get_name(smx_storage_t storage){ return sg_storage_name(storage); } -void SIMIX_pre_storage_set_data(smx_simcall_t simcall, smx_storage_t storage, void *data) { - SIMIX_storage_set_data(storage, data); -} -void SIMIX_storage_set_data(smx_storage_t storage, void *data){ - xbt_assert((storage != NULL), "Invalid parameters"); - xbt_assert((SIMIX_storage_priv(storage)->data == NULL), "Data already set"); - - SIMIX_storage_priv(storage)->data = data; -} - -void* SIMIX_pre_storage_get_data(smx_simcall_t simcall,smx_storage_t storage){ - return SIMIX_storage_get_data(storage); -} - -void* SIMIX_storage_get_data(smx_storage_t storage){ - xbt_assert((storage != NULL), "Invalid parameters (simix storage is NULL)"); - - return SIMIX_storage_priv(storage)->data; -} - xbt_dict_t SIMIX_pre_storage_get_content(smx_simcall_t simcall, smx_storage_t storage){ return SIMIX_storage_get_content(storage); } @@ -395,6 +353,15 @@ sg_size_t SIMIX_storage_get_size(smx_storage_t storage){ return surf_storage_get_size(storage); } +const char* SIMIX_pre_storage_get_host(smx_simcall_t simcall, smx_storage_t storage){ + return SIMIX_storage_get_host(storage); +} + +const char* SIMIX_storage_get_host(smx_storage_t storage){ + xbt_assert((storage != NULL), "Invalid parameters"); + return surf_storage_get_host(storage); +} + void SIMIX_post_io(smx_action_t action) { xbt_fifo_item_t i; @@ -406,12 +373,12 @@ void SIMIX_post_io(smx_action_t action) xbt_fifo_foreach(action->simcalls,i,simcall,smx_simcall_t) { switch (simcall->call) { - case SIMCALL_FILE_OPEN:; + case SIMCALL_FILE_OPEN: { smx_file_t tmp = xbt_new(s_smx_file_t,1); tmp->surf_file = surf_storage_action_get_file(action->io.surf_io); simcall_file_open__set__result(simcall, tmp); break; - + } case SIMCALL_FILE_CLOSE: xbt_free(simcall_file_close__get__fd(simcall)); simcall_file_close__set__result(simcall, 0); diff --git a/src/simix/smx_io_private.h b/src/simix/smx_io_private.h index 6bd066eac8..860c9f66e3 100644 --- a/src/simix/smx_io_private.h +++ b/src/simix/smx_io_private.h @@ -17,17 +17,14 @@ typedef struct s_smx_storage_priv { static inline smx_storage_priv_t SIMIX_storage_priv(smx_storage_t storage){ - return xbt_lib_get_level(storage, SIMIX_STORAGE_LEVEL); + return (smx_storage_priv_t) xbt_lib_get_level(storage, SIMIX_STORAGE_LEVEL); } smx_storage_t SIMIX_storage_create(const char *name, void *storage, void *data); void SIMIX_storage_destroy(void *s); -void* SIMIX_pre_file_get_data(smx_simcall_t simcall,smx_file_t fd); -void SIMIX_pre_file_set_data(smx_simcall_t simcall, smx_file_t fd, void *data); void SIMIX_pre_file_read(smx_simcall_t simcall, smx_file_t fd, sg_size_t size); void SIMIX_pre_file_write(smx_simcall_t simcall,smx_file_t fd, sg_size_t size); -void SIMIX_pre_file_open(smx_simcall_t simcall, const char* mount, - const char* path); +void SIMIX_pre_file_open(smx_simcall_t simcall, const char* fullpath); void SIMIX_pre_file_close(smx_simcall_t simcall, smx_file_t fd); int SIMIX_pre_file_unlink(smx_simcall_t simcall, smx_file_t fd); void SIMIX_pre_file_ls(smx_simcall_t simcall, @@ -38,12 +35,9 @@ xbt_dynar_t SIMIX_pre_file_get_info(smx_simcall_t simcall, smx_file_t fd); int SIMIX_pre_file_seek(smx_simcall_t simcall, smx_file_t fd, sg_size_t offset, int origin); void SIMIX_pre_storage_file_rename(smx_simcall_t simcall,smx_storage_t storage, const char* src, const char* dest); -void* SIMIX_file_get_data(smx_file_t fd); -void SIMIX_file_set_data(smx_file_t fd, void *data); smx_action_t SIMIX_file_read(smx_process_t process, smx_file_t fd, sg_size_t size); smx_action_t SIMIX_file_write(smx_process_t process, smx_file_t fd, sg_size_t size); -smx_action_t SIMIX_file_open(smx_process_t process, const char* storage, - const char* path); +smx_action_t SIMIX_file_open(smx_process_t process, const char* fullpath); smx_action_t SIMIX_file_close(smx_process_t process, smx_file_t fd); int SIMIX_file_unlink(smx_process_t process, smx_file_t fd); smx_action_t SIMIX_file_ls(smx_process_t process, const char *mount, @@ -63,14 +57,11 @@ sg_size_t SIMIX_storage_get_used_size(smx_process_t process,const char* name); xbt_dict_t SIMIX_storage_get_properties(smx_storage_t storage); xbt_dict_t SIMIX_pre_storage_get_properties(smx_simcall_t, smx_storage_t); -void SIMIX_pre_storage_set_data(smx_simcall_t, smx_storage_t, void*); -void* SIMIX_pre_storage_get_data(smx_simcall_t, smx_storage_t); - xbt_dict_t SIMIX_pre_storage_get_content(smx_simcall_t simcall, smx_storage_t storage); xbt_dict_t SIMIX_storage_get_content(smx_storage_t storage); const char* SIMIX_pre_storage_get_name(smx_simcall_t simcall, smx_storage_t storage); - +const char* SIMIX_pre_storage_get_host(smx_simcall_t simcall, smx_storage_t storage); void SIMIX_post_io(smx_action_t action); void SIMIX_io_destroy(smx_action_t action); void SIMIX_io_finish(smx_action_t action); diff --git a/src/simix/smx_network.c b/src/simix/smx_network.c index 09ab3cf3de..b6c5e60d28 100644 --- a/src/simix/smx_network.c +++ b/src/simix/smx_network.c @@ -359,7 +359,7 @@ void SIMIX_pre_comm_send(smx_simcall_t simcall, smx_rdv_t rdv, smx_action_t comm = SIMIX_comm_isend(simcall->issuer, rdv, task_size, rate, src_buff, src_buff_size, match_fun, NULL, data, 0); - simcall->mc_value = 0; + SIMCALL_SET_MC_VALUE(simcall, 0); SIMIX_pre_comm_wait(simcall, comm, timeout); } smx_action_t SIMIX_pre_comm_isend(smx_simcall_t simcall, smx_rdv_t rdv, @@ -454,7 +454,7 @@ void SIMIX_pre_comm_recv(smx_simcall_t simcall, smx_rdv_t rdv, { smx_action_t comm = SIMIX_comm_irecv(simcall->issuer, rdv, dst_buff, dst_buff_size, match_fun, data, rate); - simcall->mc_value = 0; + SIMCALL_SET_MC_VALUE(simcall, 0); SIMIX_pre_comm_wait(simcall, comm, timeout); } @@ -602,7 +602,7 @@ void SIMIX_pre_comm_wait(smx_simcall_t simcall, smx_action_t action, double time simcall->issuer->waiting_action = action; if (MC_is_active()) { - int idx = simcall->mc_value; + int idx = SIMCALL_GET_MC_VALUE(simcall); if (idx == 0) { action->state = SIMIX_DONE; } else { @@ -666,7 +666,7 @@ void SIMIX_pre_comm_testany(smx_simcall_t simcall, xbt_dynar_t actions) simcall_comm_testany__set__result(simcall, -1); if (MC_is_active()){ - int idx = simcall->mc_value; + int idx = SIMCALL_GET_MC_VALUE(simcall); if(idx == -1){ SIMIX_simcall_answer(simcall); }else{ @@ -696,7 +696,7 @@ void SIMIX_pre_comm_waitany(smx_simcall_t simcall, xbt_dynar_t actions) unsigned int cursor = 0; if (MC_is_active()){ - int idx = simcall->mc_value; + int idx = SIMCALL_GET_MC_VALUE(simcall); action = xbt_dynar_get_as(actions, idx, smx_action_t); xbt_fifo_push(action->simcalls, simcall); simcall_comm_waitany__set__result(simcall, idx); diff --git a/src/simix/smx_private.h b/src/simix/smx_private.h index 8462493973..db37ffb679 100644 --- a/src/simix/smx_private.h +++ b/src/simix/smx_private.h @@ -59,6 +59,14 @@ extern unsigned long simix_process_maxpid; extern xbt_dict_t watched_hosts_lib; +#ifdef __cplusplus +extern "C" { +#endif +void SIMIX_clean(void); +#ifdef __cplusplus +} +#endif + /******************************** Exceptions *********************************/ #define SMX_EXCEPTION(issuer, c, v, m) \ @@ -135,8 +143,8 @@ typedef struct s_smx_action { smx_rdv_t rdv; /* Rendez-vous where the comm is queued */ #ifdef HAVE_MC - smx_rdv_t rdv_cpy; /* Copy of the rendez-vous where the comm is queued, MC needs it for DPOR - (comm.rdv set to NULL when the communication is removed from the mailbox + smx_rdv_t rdv_cpy; /* Copy of the rendez-vous where the comm is queued, MC needs it for DPOR + (comm.rdv set to NULL when the communication is removed from the mailbox (used as garbage collector)) */ #endif int refcount; /* Number of processes involved in the cond */ @@ -165,7 +173,7 @@ typedef struct s_smx_action { void* src_data; /* User data associated to communication */ void* dst_data; - } comm; + } comm; struct { smx_host_t host; /* The host that is sleeping */ @@ -198,26 +206,24 @@ typedef struct s_smx_action { #endif } s_smx_action_t; -/* FIXME: check if we can delete this function */ -static XBT_INLINE e_smx_state_t SIMIX_action_map_state(e_surf_action_state_t state) -{ - switch (state) { - case SURF_ACTION_READY: - return SIMIX_READY; - case SURF_ACTION_RUNNING: - return SIMIX_RUNNING; - case SURF_ACTION_FAILED: - return SIMIX_FAILED; - case SURF_ACTION_DONE: - return SIMIX_DONE; - default: - xbt_die("Unexpected SURF action state"); - } -} - void SIMIX_context_mod_init(void); void SIMIX_context_mod_exit(void); +XBT_PUBLIC_DATA(char sigsegv_stack[SIGSTKSZ]); + +/* We are using the bottom of the stack to save some information, like the + * valgrind_stack_id. Define smx_context_usable_stack_size to give the remaining + * size for the stack. */ +#ifdef HAVE_VALGRIND_VALGRIND_H +# define smx_context_usable_stack_size \ + (smx_context_stack_size - sizeof(unsigned int)) /* for valgrind_stack_id */ +#else +# define smx_context_usable_stack_size smx_context_stack_size +#endif + +void *SIMIX_context_stack_new(void); +void SIMIX_context_stack_delete(void *stack); + void SIMIX_context_set_current(smx_context_t context); smx_context_t SIMIX_context_get_current(void); @@ -234,12 +240,12 @@ void SIMIX_ctx_raw_factory_init(smx_context_factory_t *factory); /* Scenario for the end of a context: * * CASE 1: death after end of the main function - * the context_wrapper, called internally by the context module, calls - * SIMIX_context_stop after user code stops, smx_context_stop calls user + * the context_wrapper, called internally by the context module, calls + * SIMIX_context_stop after user code stops, smx_context_stop calls user * cleanup_func if any (in context settings), add current process to trashbin * and yields back to maestro. * From time to time, maestro calls SIMIX_context_empty_trash, which destroy - * all the process and context data structures, and frees the memory + * all the process and context data structures, and frees the memory * * CASE 2: brutal death * SIMIX_process_kill (from any process) set process->iwannadie = 1 and then @@ -270,7 +276,7 @@ static XBT_INLINE smx_context_t SIMIX_context_new(xbt_main_func_t code, } /** - * \brief destroy a context + * \brief destroy a context * \param context the context to destroy * Argument must be stopped first -- runs in maestro context */ @@ -309,7 +315,7 @@ static XBT_INLINE void SIMIX_context_runall(void) } /** - \brief returns the current running context + \brief returns the current running context */ static XBT_INLINE smx_context_t SIMIX_context_self(void) { diff --git a/src/simix/smx_process.c b/src/simix/smx_process.c index 74a4d26ba3..8378a66790 100644 --- a/src/simix/smx_process.c +++ b/src/simix/smx_process.c @@ -137,18 +137,12 @@ void SIMIX_create_maestro_process() /* Create maestro process and intilialize it */ maestro = xbt_new0(s_smx_process_t, 1); maestro->pid = simix_process_maxpid++; + maestro->ppid = -1; maestro->name = (char *) ""; maestro->running_ctx = xbt_new(xbt_running_ctx_t, 1); XBT_RUNNING_CTX_INITIALIZE(maestro->running_ctx); maestro->context = SIMIX_context_new(NULL, 0, NULL, NULL, maestro); maestro->simcall.issuer = maestro; - - if (SIMIX_process_self()) { - maestro->ppid = SIMIX_process_get_PID(SIMIX_process_self()); - } else { - maestro->ppid = -1; - } - simix_global->maestro_process = maestro; return; } @@ -185,17 +179,17 @@ void SIMIX_process_stop(smx_process_t arg) { smx_process_t SIMIX_process_create_from_wrapper(smx_process_arg_t args) { smx_process_t process; - simix_global->create_process_function( - &process, - args->name, - args->code, - args->data, - args->hostname, - args->kill_time, - args->argc, - args->argv, - args->properties, - args->auto_restart); + simix_global->create_process_function(&process, + args->name, + args->code, + args->data, + args->hostname, + args->kill_time, + args->argc, + args->argv, + args->properties, + args->auto_restart, + NULL); xbt_free(args); return process; } @@ -211,8 +205,9 @@ void SIMIX_pre_process_create(smx_simcall_t simcall, int argc, char **argv, xbt_dict_t properties, int auto_restart){ - return SIMIX_process_create(process, name, code, data, hostname, - kill_time, argc, argv, properties, auto_restart); + SIMIX_process_create(process, name, code, data, hostname, + kill_time, argc, argv, properties, auto_restart, + simcall->issuer); } /** * \brief Internal function to create a process. @@ -231,8 +226,9 @@ void SIMIX_process_create(smx_process_t *process, double kill_time, int argc, char **argv, xbt_dict_t properties, - int auto_restart) { - + int auto_restart, + smx_process_t parent_process) +{ *process = NULL; smx_host_t host = SIMIX_host_get_by_name(hostname); @@ -258,8 +254,8 @@ void SIMIX_process_create(smx_process_t *process, (*process)->comms = xbt_fifo_new(); (*process)->simcall.issuer = *process; - if (SIMIX_process_self()) { - (*process)->ppid = SIMIX_process_get_PID(SIMIX_process_self()); + if (parent_process) { + (*process)->ppid = SIMIX_process_get_PID(parent_process); } else { (*process)->ppid = -1; } @@ -722,7 +718,6 @@ void SIMIX_post_process_sleep(smx_action_t action) { smx_simcall_t simcall; e_smx_state_t state; - xbt_assert(action->type == SIMIX_ACTION_SLEEP); while ((simcall = xbt_fifo_shift(action->simcalls))) { @@ -747,9 +742,15 @@ void SIMIX_post_process_sleep(smx_action_t action) } simcall_process_sleep__set__result(simcall, state); simcall->issuer->waiting_action = NULL; - SIMIX_simcall_answer(simcall); - + if (simcall->issuer->suspended) { + XBT_DEBUG("Wait! This process is suspended and can't wake up now."); + simcall->issuer->suspended = 0; + SIMIX_pre_process_suspend(simcall, simcall->issuer); + } else { + SIMIX_simcall_answer(simcall); + } } + SIMIX_process_sleep_destroy(action); } @@ -771,6 +772,7 @@ void SIMIX_process_sleep_suspend(smx_action_t action) void SIMIX_process_sleep_resume(smx_action_t action) { + XBT_DEBUG("Action state is %d on process_sleep_resume.", action->state); xbt_assert(action->type == SIMIX_ACTION_SLEEP); surf_action_resume(action->sleep.surf_sleep); } @@ -803,10 +805,11 @@ void SIMIX_process_yield(smx_process_t self) SIMIX_process_stop(self); } - if(self->suspended) { + if (self->suspended) { + XBT_DEBUG("Hey! I'm suspended."); xbt_assert(!self->doexception, "Gloups! This exception may be lost by subsequent calls."); self->suspended = 0; - SIMIX_process_suspend(self,self); + SIMIX_process_suspend(self, self); } if (self->doexception) { @@ -949,19 +952,19 @@ smx_process_t SIMIX_process_restart(smx_process_t process, smx_process_t issuer) arg.argc, arg.argv, arg.properties, - arg.auto_restart); - } - else { + arg.auto_restart, + NULL); + } else { simcall_process_create(&new_process, - arg.argv[0], - arg.code, - arg.data, - arg.hostname, - arg.kill_time, - arg.argc, - arg.argv, - arg.properties, - arg.auto_restart); + arg.argv[0], + arg.code, + arg.data, + arg.hostname, + arg.kill_time, + arg.argc, + arg.argv, + arg.properties, + arg.auto_restart); } return new_process; diff --git a/src/simix/smx_process_private.h b/src/simix/smx_process_private.h index ac0126e158..eb269f97fa 100644 --- a/src/simix/smx_process_private.h +++ b/src/simix/smx_process_private.h @@ -70,7 +70,8 @@ void SIMIX_process_create(smx_process_t *process, double kill_time, int argc, char **argv, xbt_dict_t properties, - int auto_restart); + int auto_restart, + smx_process_t parent_process); void SIMIX_process_runall(void); void SIMIX_process_kill(smx_process_t process, smx_process_t issuer); void SIMIX_process_killall(smx_process_t issuer, int reset_pid); diff --git a/src/simix/smx_smurf.c b/src/simix/smx_smurf.c index 77623e70ee..515446b43e 100644 --- a/src/simix/smx_smurf.c +++ b/src/simix/smx_smurf.c @@ -56,14 +56,14 @@ void SIMIX_simcall_answer(smx_simcall_t simcall) void SIMIX_simcall_pre(smx_simcall_t simcall, int value) { XBT_DEBUG("Handling simcall %p: %s", simcall, SIMIX_simcall_name(simcall->call)); - simcall->mc_value = value; + SIMCALL_SET_MC_VALUE(simcall, value); if (simcall->issuer->context->iwannadie && simcall->call != SIMCALL_PROCESS_CLEANUP) return; switch (simcall->call) { #include "simcalls_generated_case.c" - case NUM_SIMCALLS:; + case NUM_SIMCALLS: break; - case SIMCALL_NONE:; + case SIMCALL_NONE: THROWF(arg_error,0,"Asked to do the noop syscall on %s@%s", SIMIX_process_get_name(simcall->issuer), SIMIX_host_get_name(SIMIX_process_get_host(simcall->issuer)) diff --git a/src/simix/smx_smurf_private.h b/src/simix/smx_smurf_private.h index f14c89db14..dbd5f92907 100644 --- a/src/simix/smx_smurf_private.h +++ b/src/simix/smx_smurf_private.h @@ -58,7 +58,9 @@ union u_smx_scalar { typedef struct s_smx_simcall { e_smx_simcall_t call; smx_process_t issuer; +#ifdef HAVE_MC int mc_value; +#endif union u_smx_scalar args[10]; union u_smx_scalar result; //FIXME: union u_smx_scalar retval; @@ -72,6 +74,14 @@ typedef struct s_smx_simcall { }; } s_smx_simcall_t, *smx_simcall_t; +#if HAVE_MC +#define SIMCALL_SET_MC_VALUE(simcall, value) ((simcall)->mc_value = (value)) +#define SIMCALL_GET_MC_VALUE(simcall) ((simcall)->mc_value) +#else +#define SIMCALL_SET_MC_VALUE(simcall, value) ((void)0) +#define SIMCALL_GET_MC_VALUE(simcall) 0 +#endif + #include "simcalls_generated_res_getter_setter.h" #include "simcalls_generated_args_getter_setter.h" diff --git a/src/simix/smx_user.c b/src/simix/smx_user.c index 9b6720e6a9..61ffbfec21 100644 --- a/src/simix/smx_user.c +++ b/src/simix/smx_user.c @@ -1314,30 +1314,6 @@ int simcall_sem_get_capacity(smx_sem_t sem) return simcall_BODY_sem_get_capacity(sem); } -/** - * \ingroup simix_file_management - * \brief Returns the user data associated to a file. - * - * \param fd A simix file - * \return the user data of this file - */ -void* simcall_file_get_data(smx_file_t fd) -{ - return simcall_BODY_file_get_data(fd); -} - -/** - * \ingroup simix_file_management - * \brief Sets the user data associated to a file. - * - * \param fd A SIMIX file - * \param data The user data to set - */ -void simcall_file_set_data(smx_file_t fd, void *data) -{ - simcall_BODY_file_set_data(fd, data); -} - /** * \ingroup simix_file_management * @@ -1360,9 +1336,9 @@ sg_size_t simcall_file_write(smx_file_t fd, sg_size_t size) * \ingroup simix_file_management * \brief */ -smx_file_t simcall_file_open(const char* mount, const char* path) +smx_file_t simcall_file_open(const char* fullpath) { - return simcall_BODY_file_open(mount, path); + return simcall_BODY_file_open(fullpath); } /** @@ -1459,9 +1435,20 @@ sg_size_t simcall_storage_get_used_size (const char* name){ * \param host A SIMIX host * \return a dict containing all storages mounted on the host */ -xbt_dict_t simcall_host_get_storage_list(smx_host_t host) +xbt_dict_t simcall_host_get_mounted_storage_list(smx_host_t host) +{ + return simcall_BODY_host_get_mounted_storage_list(host); +} + +/** + * \ingroup simix_storage_management + * \brief Returns the list of storages attached to an host. + * \param host A SIMIX host + * \return a dict containing all storages attached to the host + */ +xbt_dynar_t simcall_host_get_attached_storage_list(smx_host_t host) { - return simcall_BODY_host_get_storage_list(host); + return simcall_BODY_host_get_attached_storage_list(host); } /** diff --git a/src/smpi/private.h b/src/smpi/private.h index 4906753f96..a0af7500a2 100644 --- a/src/smpi/private.h +++ b/src/smpi/private.h @@ -28,6 +28,7 @@ typedef struct s_smpi_process_data *smpi_process_data_t; #define ISEND 0x20 #define SSEND 0x40 #define PREPARED 0x80 +#define FINISHED 0x100 enum smpi_process_state{ diff --git a/src/smpi/smpi_base.c b/src/smpi/smpi_base.c index fa4e70dc99..5362b82ff6 100644 --- a/src/smpi/smpi_base.c +++ b/src/smpi/smpi_base.c @@ -226,8 +226,11 @@ static MPI_Request build_request(void *buf, int count, request->truncated = 0; request->real_size = 0; request->real_tag = 0; + if(flags & PERSISTENT) + request->refcount = 1; + else + request->refcount = 0; - request->refcount=1; #ifdef HAVE_TRACING request->send = 0; request->recv = 0; @@ -290,7 +293,6 @@ MPI_Request smpi_mpi_send_init(void *buf, int count, MPI_Datatype datatype, MPI_Request request = NULL; /* MC needs the comm to be set to NULL during the call */ request = build_request(buf==MPI_BOTTOM ? (void*)0 : buf, count, datatype, smpi_process_index(), smpi_group_index(smpi_comm_group(comm), dst), tag, comm, PERSISTENT | SEND | PREPARED); - request->refcount++; return request; } @@ -300,7 +302,6 @@ MPI_Request smpi_mpi_ssend_init(void *buf, int count, MPI_Datatype datatype, MPI_Request request = NULL; /* MC needs the comm to be set to NULL during the call */ request = build_request(buf==MPI_BOTTOM ? (void*)0 : buf, count, datatype, smpi_process_index(), smpi_group_index(smpi_comm_group(comm), dst), tag, comm, PERSISTENT | SSEND | SEND | PREPARED); - request->refcount++; return request; } @@ -310,7 +311,6 @@ MPI_Request smpi_mpi_recv_init(void *buf, int count, MPI_Datatype datatype, MPI_Request request = NULL; /* MC needs the comm to be set to NULL during the call */ request = build_request(buf==MPI_BOTTOM ? (void*)0 : buf, count, datatype, src == MPI_ANY_SOURCE ? MPI_ANY_SOURCE : smpi_group_index(smpi_comm_group(comm), src), smpi_process_index(), tag, comm, PERSISTENT | RECV | PREPARED); - request->refcount++; return request; } @@ -320,6 +320,9 @@ void smpi_mpi_start(MPI_Request request) xbt_assert(!request->action, "Cannot (re)start a non-finished communication"); request->flags &= ~PREPARED; + request->flags &= ~FINISHED; + request->refcount++; + if (request->flags & RECV) { print_request("New recv", request); //FIXME: if receive is posted with a large size, but send is smaller, mailboxes may not match ! @@ -364,6 +367,8 @@ void smpi_mpi_start(MPI_Request request) XBT_DEBUG("Send request %p is not in the permanent receive mailbox (buf: %p)",request,request->buf); mailbox = smpi_process_remote_mailbox(receiver); } + + void* buf = request->buf; if ( (! (request->flags & SSEND)) && (request->size < sg_cfg_get_int("smpi/send_is_detached_thres"))) { void *oldbuf = NULL; request->detached = 1; @@ -371,8 +376,8 @@ void smpi_mpi_start(MPI_Request request) if(request->old_type->has_subtype == 0){ oldbuf = request->buf; if (!_xbt_replay_is_active() && oldbuf && request->size!=0){ - request->buf = xbt_malloc(request->size); - memcpy(request->buf,oldbuf,request->size); + buf = xbt_malloc(request->size); + memcpy(buf,oldbuf,request->size); } } XBT_DEBUG("Send request %p is detached; buf %p copied into %p",request,oldbuf,request->buf); @@ -384,20 +389,20 @@ void smpi_mpi_start(MPI_Request request) smpi_comm_use(request->comm); //if we are giving back the control to the user without waiting for completion, we have to inject timings - double sleeptime =0.0; + double sleeptime = 0.0; if(request->detached || (request->flags & (ISEND|SSEND))){// issend should be treated as isend //isend and send timings may be different sleeptime = (request->flags & ISEND)? smpi_ois(request->size) : smpi_os(request->size); } - if(sleeptime!=0.0){ + if(sleeptime != 0.0){ simcall_process_sleep(sleeptime); XBT_DEBUG("sending size of %zu : sleep %f ", request->size, smpi_os(request->size)); } request->action = simcall_comm_isend(mailbox, request->size, -1.0, - request->buf, request->real_size, + buf, request->real_size, &match_send, &xbt_free, // how to free the userdata if a detached send fails request, @@ -437,7 +442,6 @@ void smpi_mpi_request_free(MPI_Request * request) *request = MPI_REQUEST_NULL; }else{ print_request("Decrementing", (*request)); - } }else{ xbt_die("freeing an already free request"); @@ -449,7 +453,7 @@ MPI_Request smpi_isend_init(void *buf, int count, MPI_Datatype datatype, { MPI_Request request = NULL; /* MC needs the comm to be set to NULL during the call */ request = build_request(buf==MPI_BOTTOM ? (void*)0 : buf , count, datatype, smpi_process_index(), smpi_group_index(smpi_comm_group(comm), dst), tag, - comm, NON_PERSISTENT | ISEND | SEND | PREPARED); + comm, PERSISTENT | ISEND | SEND | PREPARED); return request; } @@ -480,7 +484,7 @@ MPI_Request smpi_irecv_init(void *buf, int count, MPI_Datatype datatype, { MPI_Request request = NULL; /* MC needs the comm to be set to NULL during the call */ request = build_request(buf==MPI_BOTTOM ? (void*)0 : buf, count, datatype, src == MPI_ANY_SOURCE ? MPI_ANY_SOURCE : smpi_group_index(smpi_comm_group(comm), src), smpi_process_index(), tag, - comm, NON_PERSISTENT | RECV | PREPARED); + comm, PERSISTENT | RECV | PREPARED); return request; } @@ -548,6 +552,8 @@ void smpi_mpi_sendrecv(void *sendbuf, int sendcount, MPI_Datatype sendtype, smpi_irecv_init(recvbuf, recvcount, recvtype, src, recvtag, comm); smpi_mpi_startall(2, requests); smpi_mpi_waitall(2, requests, stats); + smpi_mpi_request_free(&requests[0]); + smpi_mpi_request_free(&requests[1]); if(status != MPI_STATUS_IGNORE) { // Copy receive status *status = stats[1]; @@ -564,7 +570,8 @@ static void finish_wait(MPI_Request * request, MPI_Status * status) MPI_Request req = *request; smpi_empty_status(status); - if(!(req->detached && req->flags & SEND) && !(req->flags & PREPARED)){ + if(!(req->detached && req->flags & SEND) + && !(req->flags & PREPARED)){ if(status != MPI_STATUS_IGNORE) { int src = req->src == MPI_ANY_SOURCE ? req->real_src : req->src; status->MPI_SOURCE = smpi_group_rank(smpi_comm_group(req->comm), src); @@ -606,12 +613,12 @@ static void finish_wait(MPI_Request * request, MPI_Status * status) if(req->detached_sender!=NULL){ smpi_mpi_request_free(&(req->detached_sender)); } - - if(req->flags & NON_PERSISTENT) { - smpi_mpi_request_free(request); - } else { + if(req->flags & PERSISTENT) req->action = NULL; - } + req->flags |= FINISHED; + + smpi_mpi_request_free(request); + } int smpi_mpi_test(MPI_Request * request, MPI_Status * status) { @@ -625,6 +632,7 @@ int smpi_mpi_test(MPI_Request * request, MPI_Status * status) { flag = simcall_comm_test((*request)->action); if (flag) { finish_wait(request, status); + if (*request != MPI_REQUEST_NULL && !((*request)->flags & PERSISTENT)) *request = MPI_REQUEST_NULL; } } @@ -657,6 +665,7 @@ int smpi_mpi_testany(int count, MPI_Request requests[], int *index, if(i != -1) { *index = map[i]; finish_wait(&requests[*index], status); + if (requests[*index] != MPI_REQUEST_NULL && (requests[*index]->flags & NON_PERSISTENT)) requests[*index] = MPI_REQUEST_NULL; flag = 1; } @@ -709,7 +718,7 @@ void smpi_mpi_probe(int source, int tag, MPI_Comm comm, MPI_Status* status){ void smpi_mpi_iprobe(int source, int tag, MPI_Comm comm, int* flag, MPI_Status* status){ MPI_Request request =build_request(NULL, 0, MPI_CHAR, source == MPI_ANY_SOURCE ? MPI_ANY_SOURCE : smpi_group_index(smpi_comm_group(comm), source), smpi_comm_rank(comm), tag, - comm, NON_PERSISTENT | RECV); + comm, PERSISTENT | RECV); //to avoid deadlock, we have to sleep some time here, or the timer won't advance and we will only do iprobe simcalls double sleeptime= sg_cfg_get_double("smpi/iprobe"); @@ -771,7 +780,8 @@ void smpi_mpi_wait(MPI_Request * request, MPI_Status * status) } finish_wait(request, status); - *request = MPI_REQUEST_NULL; + if (*request != MPI_REQUEST_NULL && ((*request)->flags & NON_PERSISTENT)) + *request = MPI_REQUEST_NULL; // FIXME for a detached send, finish_wait is not called: } @@ -790,7 +800,9 @@ int smpi_mpi_waitany(int count, MPI_Request requests[], size = 0; XBT_DEBUG("Wait for one of %d", count); for(i = 0; i < count; i++) { - if (requests[i] != MPI_REQUEST_NULL && !(requests[i]->flags & PREPARED)) { + if (requests[i] != MPI_REQUEST_NULL + && !(requests[i]->flags & PREPARED) + && !(requests[i]->flags & FINISHED)) { if (requests[i]->action != NULL) { XBT_DEBUG("Waiting any %p ", requests[i]); xbt_dynar_push(comms, &requests[i]->action); @@ -801,6 +813,7 @@ int smpi_mpi_waitany(int count, MPI_Request requests[], size=0;//so we free the dynar but don't do the waitany call index=i; finish_wait(&requests[i], status);//cleanup if refcount = 0 + if (requests[i] != MPI_REQUEST_NULL && (requests[i]->flags & NON_PERSISTENT)) requests[i]=MPI_REQUEST_NULL;//set to null break; } @@ -813,6 +826,7 @@ int smpi_mpi_waitany(int count, MPI_Request requests[], if (i != -1) { index = map[i]; finish_wait(&requests[index], status); + if (requests[i] != MPI_REQUEST_NULL && (requests[i]->flags & NON_PERSISTENT)) requests[index] = MPI_REQUEST_NULL; } } @@ -846,6 +860,7 @@ int smpi_mpi_waitall(int count, MPI_Request requests[], } } for(c = 0; c < count; c++) { + if (MC_is_active()) { smpi_mpi_wait(&requests[c], pstat); index = c; @@ -853,6 +868,7 @@ int smpi_mpi_waitall(int count, MPI_Request requests[], index = smpi_mpi_waitany(count, requests, pstat); if (index == MPI_UNDEFINED) break; + if (requests[index] != MPI_REQUEST_NULL && (requests[index]->flags & NON_PERSISTENT)) requests[index]=MPI_REQUEST_NULL; } if (status != MPI_STATUSES_IGNORE) { @@ -882,6 +898,7 @@ int smpi_mpi_waitsome(int incount, MPI_Request requests[], int *indices, if(status != MPI_STATUSES_IGNORE) { status[index] = *pstat; } + if (requests[index] != MPI_REQUEST_NULL && (requests[index]->flags & NON_PERSISTENT)) requests[index]=MPI_REQUEST_NULL; }else{ return MPI_UNDEFINED; @@ -907,8 +924,8 @@ int smpi_mpi_testsome(int incount, MPI_Request requests[], int *indices, if(status != MPI_STATUSES_IGNORE) { status[i] = *pstat; } + if ((requests[i] != MPI_REQUEST_NULL) && requests[i]->flags & NON_PERSISTENT) requests[i]=MPI_REQUEST_NULL; - } }else{ count_dead++; @@ -965,6 +982,9 @@ void smpi_mpi_gather(void *sendbuf, int sendcount, MPI_Datatype sendtype, // Wait for completion of irecv's. smpi_mpi_startall(size - 1, requests); smpi_mpi_waitall(size - 1, requests, MPI_STATUS_IGNORE); + for(src = 0; src < size-1; src++) { + smpi_mpi_request_free(&requests[src]); + } xbt_free(requests); } } @@ -1029,6 +1049,9 @@ void smpi_mpi_gatherv(void *sendbuf, int sendcount, MPI_Datatype sendtype, // Wait for completion of irecv's. smpi_mpi_startall(size - 1, requests); smpi_mpi_waitall(size - 1, requests, MPI_STATUS_IGNORE); + for(src = 0; src < size-1; src++) { + smpi_mpi_request_free(&requests[src]); + } xbt_free(requests); } } @@ -1069,6 +1092,9 @@ void smpi_mpi_allgather(void *sendbuf, int sendcount, // Wait for completion of all comms. smpi_mpi_startall(2 * (size - 1), requests); smpi_mpi_waitall(2 * (size - 1), requests, MPI_STATUS_IGNORE); + for(other = 0; other < 2*(size-1); other++) { + smpi_mpi_request_free(&requests[other]); + } xbt_free(requests); } @@ -1108,6 +1134,9 @@ void smpi_mpi_allgatherv(void *sendbuf, int sendcount, // Wait for completion of all comms. smpi_mpi_startall(2 * (size - 1), requests); smpi_mpi_waitall(2 * (size - 1), requests, MPI_STATUS_IGNORE); + for(other = 0; other < 2*(size-1); other++) { + smpi_mpi_request_free(&requests[other]); + } xbt_free(requests); } @@ -1148,6 +1177,9 @@ void smpi_mpi_scatter(void *sendbuf, int sendcount, MPI_Datatype sendtype, // Wait for completion of isend's. smpi_mpi_startall(size - 1, requests); smpi_mpi_waitall(size - 1, requests, MPI_STATUS_IGNORE); + for(dst = 0; dst < size-1; dst++) { + smpi_mpi_request_free(&requests[dst]); + } xbt_free(requests); } } @@ -1189,6 +1221,9 @@ void smpi_mpi_scatterv(void *sendbuf, int *sendcounts, int *displs, // Wait for completion of isend's. smpi_mpi_startall(size - 1, requests); smpi_mpi_waitall(size - 1, requests, MPI_STATUS_IGNORE); + for(dst = 0; dst < size-1; dst++) { + smpi_mpi_request_free(&requests[dst]); + } xbt_free(requests); } } @@ -1251,6 +1286,8 @@ void smpi_mpi_reduce(void *sendbuf, void *recvbuf, int count, XBT_DEBUG("finished waiting any request with index %d", index); if(index == MPI_UNDEFINED) { break; + }else{ + smpi_mpi_request_free(&requests[index]); } if(op) /* op can be MPI_OP_NULL that does nothing */ smpi_op_apply(op, tmpbufs[index], recvbuf, &count, &datatype); @@ -1336,6 +1373,9 @@ void smpi_mpi_scan(void *sendbuf, void *recvbuf, int count, for(index = 0; index < rank; index++) { xbt_free(tmpbufs[index]); } + for(index = 0; index < size-1; index++) { + smpi_mpi_request_free(&requests[index]); + } xbt_free(tmpbufs); xbt_free(requests); } @@ -1405,6 +1445,9 @@ void smpi_mpi_exscan(void *sendbuf, void *recvbuf, int count, for(index = 0; index < rank; index++) { xbt_free(tmpbufs[index]); } + for(index = 0; index < size-1; index++) { + smpi_mpi_request_free(&requests[index]); + } xbt_free(tmpbufs); xbt_free(requests); } diff --git a/src/smpi/smpi_coll.c b/src/smpi/smpi_coll.c index 346408ca9d..688121eacd 100644 --- a/src/smpi/smpi_coll.c +++ b/src/smpi/smpi_coll.c @@ -274,6 +274,9 @@ static void tree_bcast(void *buf, int count, MPI_Datatype datatype, } smpi_mpi_startall(tree->numChildren, requests); smpi_mpi_waitall(tree->numChildren, requests, MPI_STATUS_IGNORE); + for(i = 0; i < tree->numChildren; i++) { + if(requests[i]!=MPI_REQUEST_NULL) smpi_mpi_request_free(&requests[i]); + } xbt_free(requests); } @@ -312,6 +315,9 @@ static void tree_antibcast(void *buf, int count, MPI_Datatype datatype, } smpi_mpi_startall(tree->numChildren, requests); smpi_mpi_waitall(tree->numChildren, requests, MPI_STATUS_IGNORE); + for(i = 0; i < tree->numChildren; i++) { + if(requests[i]!=MPI_REQUEST_NULL) smpi_mpi_request_free(&requests[i]); + } xbt_free(requests); } @@ -437,6 +443,9 @@ int smpi_coll_tuned_alltoall_bruck(void *sendbuf, int sendcount, smpi_mpi_startall(count, requests); XBT_DEBUG("<%d> wait for %d requests", rank, count); smpi_mpi_waitall(count, requests, MPI_STATUS_IGNORE); + for(i = 0; i < count; i++) { + if(requests[i]!=MPI_REQUEST_NULL) smpi_mpi_request_free(&requests[i]); + } xbt_free(requests); } return MPI_SUCCESS; @@ -493,6 +502,9 @@ int smpi_coll_tuned_alltoall_basic_linear(void *sendbuf, int sendcount, smpi_mpi_startall(count, requests); XBT_DEBUG("<%d> wait for %d requests", rank, count); smpi_mpi_waitall(count, requests, MPI_STATUS_IGNORE); + for(i = 0; i < count; i++) { + if(requests[i]!=MPI_REQUEST_NULL) smpi_mpi_request_free(&requests[i]); + } xbt_free(requests); } return err; @@ -555,6 +567,9 @@ int smpi_coll_basic_alltoallv(void *sendbuf, int *sendcounts, smpi_mpi_startall(count, requests); XBT_DEBUG("<%d> wait for %d requests", rank, count); smpi_mpi_waitall(count, requests, MPI_STATUS_IGNORE); + for(i = 0; i < count; i++) { + if(requests[i]!=MPI_REQUEST_NULL) smpi_mpi_request_free(&requests[i]); + } xbt_free(requests); } return err; diff --git a/src/smpi/smpi_f77.c b/src/smpi/smpi_f77.c index 7c3e483a03..95c40d7209 100644 --- a/src/smpi/smpi_f77.c +++ b/src/smpi/smpi_f77.c @@ -23,29 +23,24 @@ static int running_processes = 0; /* Bindings for MPI special values */ union u_smpi_common { struct s_smpi_common { - integer mpi_in_place; - integer mpi_bottom; - integer mpi_status_ignore; - integer mpi_statuses_ignore; - } f90; /* with gftortran */ - struct s_smpi_common *f77; /* with f2c */ -} smpi_; + integer _MPI_IN_PLACE; + integer _MPI_BOTTOM; + integer _MPI_STATUS_IGNORE; + integer _MPI_STATUSES_IGNORE; + } *f77; /* with f2c, remains NULL with gfortran */ + struct s_smpi_common f90; /* with gfortran */ +} smpi_ = { NULL }; /* Convert between Fortran and C */ -static XBT_INLINE void *f2c_addr(void *addr, void *cval, void *chk1, void *chk2) -{ - return (addr == chk1 || addr == chk2) ? cval : addr; -} -#define F2C_ADDR(addr, cval, fval) \ - f2c_addr(addr, cval, &smpi_.f90.fval, &smpi_.f77[smpi_current_rank].fval) -#define F2C_BOTTOM(addr) \ - F2C_ADDR(addr, MPI_BOTTOM, mpi_bottom) -#define F2C_IN_PLACE(addr) \ - F2C_ADDR(addr, MPI_IN_PLACE, mpi_in_place) -#define F2C_STATUS_IGNORE(addr) \ - F2C_ADDR(addr, MPI_STATUS_IGNORE, mpi_status_ignore) -#define F2C_STATUSES_IGNORE(addr) \ - F2C_ADDR(addr, MPI_STATUSES_IGNORE, mpi_statuses_ignore) +#define F2C_ADDR(addr, val) \ + (((void *)(addr) == (void *)(smpi_.f77 \ + ? &smpi_.f77[smpi_current_rank]._ ## val \ + : &smpi_.f90._ ## val)) \ + ? (val) : (void *)(addr)) +#define F2C_BOTTOM(addr) F2C_ADDR(addr, MPI_BOTTOM) +#define F2C_IN_PLACE(addr) F2C_ADDR(addr, MPI_IN_PLACE) +#define F2C_STATUS_IGNORE(addr) F2C_ADDR(addr, MPI_STATUS_IGNORE) +#define F2C_STATUSES_IGNORE(addr) F2C_ADDR(addr, MPI_STATUSES_IGNORE) #define KEY_SIZE (sizeof(int) * 2 + 1) diff --git a/src/smpi/smpi_global.c b/src/smpi/smpi_global.c index 3bdb895752..37f8dd0ccc 100644 --- a/src/smpi/smpi_global.c +++ b/src/smpi/smpi_global.c @@ -86,6 +86,8 @@ void smpi_process_init(int *argc, char ***argv) simcall_rdv_set_receiver(data->mailbox_small, proc); XBT_DEBUG("<%d> New process in the game: %p", index, proc); } + if (smpi_process_data() == NULL) + xbt_die("smpi_process_data() returned NULL. You probably gave a NULL parameter to MPI_Init. Although it's required by MPI-2, this is currently not supported by SMPI."); } void smpi_process_destroy(void) diff --git a/src/smpi/smpi_pmpi.c b/src/smpi/smpi_pmpi.c index f59f2e636a..cfd9b5bab9 100644 --- a/src/smpi/smpi_pmpi.c +++ b/src/smpi/smpi_pmpi.c @@ -1020,7 +1020,6 @@ int PMPI_Request_free(MPI_Request * request) if (*request == MPI_REQUEST_NULL) { retval = MPI_ERR_ARG; } else { - if((*request)->flags & PERSISTENT)(*request)->refcount--; smpi_mpi_request_free(request); retval = MPI_SUCCESS; } diff --git a/src/smpi/smpirun.in b/src/smpi/smpirun.in index 7126a55906..90c0d1e4ce 100755 --- a/src/smpi/smpirun.in +++ b/src/smpi/smpirun.in @@ -426,10 +426,6 @@ fi ${EXEC} ${TRACEOPTIONS} ${SIMOPTS} ${PLATFORMTMP} ${APPLICATIONTMP} status=$? -if [ ${status} = 139 ]; then echo "ERROR: A segmentation fault was triggered. -A common cause in SimGrid may be the use of a too small stack size for the simulated processes (default 128KiB). -Please see contexts/stack_size parameter , or http://simgrid.org/simgrid/latest/doc/options.html#options_virt_stacksize "; fi - if [ -z "${KEEP}" ] ; then if [ -z "${PLATFORM}" ]; then rm ${PLATFORMTMP} diff --git a/src/surf/cpu_ti.cpp b/src/surf/cpu_ti.cpp index af08127e14..fc07dd59c7 100644 --- a/src/surf/cpu_ti.cpp +++ b/src/surf/cpu_ti.cpp @@ -468,11 +468,6 @@ CpuTiPtr CpuTiModel::createResource(const char *name, return cpu; } -CpuTiActionPtr CpuTiModel::createAction(double /*cost*/, bool /*failed*/) -{ - return NULL;//new CpuTiAction(this, cost, failed); -} - double CpuTiModel::shareResources(double now) { void *_cpu, *_cpu_next; diff --git a/src/surf/cpu_ti.hpp b/src/surf/cpu_ti.hpp index 4e1ac71e1b..b44ff9713b 100644 --- a/src/surf/cpu_ti.hpp +++ b/src/surf/cpu_ti.hpp @@ -92,7 +92,6 @@ public: e_surf_resource_state_t state_initial, tmgr_trace_t state_trace, xbt_dict_t cpu_properties); - CpuTiActionPtr createAction(double cost, bool failed); double shareResources(double now); void updateActionsState(double now, double delta); void addTraces(); diff --git a/src/surf/instr_surf.c b/src/surf/instr_surf.c index f0f3df2493..9a2764ae00 100644 --- a/src/surf/instr_surf.c +++ b/src/surf/instr_surf.c @@ -6,7 +6,6 @@ #include "instr/instr_private.h" #include "surf/surf_private.h" -//FIXME:#include "surf/network_gtnets_private.h" #ifdef HAVE_TRACING diff --git a/src/surf/network_interface.cpp b/src/surf/network_interface.cpp index 244b688e1f..49e4c6d248 100644 --- a/src/surf/network_interface.cpp +++ b/src/surf/network_interface.cpp @@ -28,13 +28,6 @@ surf_callback(void, NetworkActionPtr) networkActionStateChangedCallbacks; NetworkModelPtr surf_network_model = NULL; -xbt_dynar_t NetworkModel::getRoute(RoutingEdgePtr src, RoutingEdgePtr dst) -{ - xbt_dynar_t route = NULL; - routing_platf->getRouteAndLatency(src, dst, &route, NULL); - return route; -} - double NetworkModel::latencyFactor(double /*size*/) { return sg_latency_factor; } diff --git a/src/surf/network_interface.hpp b/src/surf/network_interface.hpp index 994991b3d2..8988357d7c 100644 --- a/src/surf/network_interface.hpp +++ b/src/surf/network_interface.hpp @@ -133,17 +133,6 @@ public: virtual ActionPtr communicate(RoutingEdgePtr src, RoutingEdgePtr dst, double size, double rate)=0; - /** - * @brief Get the route between two RoutingEdge - * @details [TODO] - * - * @param src [TODO] - * @param dst [TODO] - * - * @return A xbt_dynar_t of [TODO] - */ - virtual xbt_dynar_t getRoute(RoutingEdgePtr src, RoutingEdgePtr dst); //FIXME: kill field? That is done by the routing nowadays - /** * @brief Function pointer to the function to use to solve the lmm_system_t * diff --git a/src/surf/network_smpi.cpp b/src/surf/network_smpi.cpp index e9dea0e30a..68174dae76 100644 --- a/src/surf/network_smpi.cpp +++ b/src/surf/network_smpi.cpp @@ -40,7 +40,7 @@ static xbt_dynar_t parse_factor(const char *smpi_coef_string) radical_elements2 = xbt_str_split(value, ":"); if (xbt_dynar_length(radical_elements2) != 2) - xbt_die("Malformed radical for smpi factor!"); + surf_parse_error("Malformed radical for smpi factor!"); fact.factor = atol(xbt_dynar_get_as(radical_elements2, 0, char *)); fact.value = atof(xbt_dynar_get_as(radical_elements2, 1, char *)); xbt_dynar_push_as(smpi_factor, s_smpi_factor_t, fact); diff --git a/src/surf/platf_generator.c b/src/surf/platf_generator.c index 756cf0a849..fadf745abb 100644 --- a/src/surf/platf_generator.c +++ b/src/surf/platf_generator.c @@ -670,6 +670,7 @@ void platf_generate(void) { node_data->router_id = bprintf("router-%d", ++last_router); router_parameters.id = node_data->router_id; sg_platf_new_router(&router_parameters); + break; } } @@ -699,6 +700,7 @@ void platf_generate(void) { break; case HOST: route_parameters.src = src_data->host_parameters.id; + break; } switch(dst_data->kind) { case ROUTER: @@ -709,6 +711,7 @@ void platf_generate(void) { break; case HOST: route_parameters.dst = dst_data->host_parameters.id; + break; } sg_platf_route_begin(&route_parameters); sg_platf_route_add_link(link_parameters->id, &route_parameters); diff --git a/src/surf/simgrid.dtd b/src/surf/simgrid.dtd index 6438fc4fd4..15d00b15d2 100644 --- a/src/surf/simgrid.dtd +++ b/src/surf/simgrid.dtd @@ -36,12 +36,6 @@ - - - - - - @@ -61,6 +55,13 @@ + + + + + + + diff --git a/src/surf/simgrid_dtd.c b/src/surf/simgrid_dtd.c index 18336c938e..3ceb04d4a1 100644 --- a/src/surf/simgrid_dtd.c +++ b/src/surf/simgrid_dtd.c @@ -403,8 +403,8 @@ static void yy_fatal_error (yyconst char msg[] ); *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; -#define YY_NUM_RULES 589 -#define YY_END_OF_BUFFER 590 +#define YY_NUM_RULES 591 +#define YY_END_OF_BUFFER 592 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info @@ -412,7 +412,7 @@ struct yy_trans_info flex_int32_t yy_verify; flex_int32_t yy_nxt; }; -static yyconst flex_int16_t yy_accept[3458] = +static yyconst flex_int16_t yy_accept[3469] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -442,349 +442,349 @@ static yyconst flex_int16_t yy_accept[3458] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 590, 588, 15, 10, 10, 15, 15, 568, - 10, 568, 5, 6, 5, 8, 9, 8, 584, 576, - 577, 585, 582, 585, 583, 587, 576, 577, 587, 588, + 0, 0, 592, 590, 15, 10, 10, 15, 15, 570, + 10, 570, 5, 6, 5, 8, 9, 8, 586, 578, + 579, 587, 584, 587, 585, 589, 578, 579, 589, 590, 22, 10, 22, 22, 22, 20, 22, 26, 10, 26, - 26, 588, 26, 588, 588, 26, 33, 10, 33, 33, + 26, 590, 26, 590, 590, 26, 33, 10, 33, 33, 33, 31, 33, 37, 10, 37, 37, 48, 10, 48, - 48, 48, 46, 48, 48, 48, 585, 584, 78, 10, + 48, 48, 46, 48, 48, 48, 587, 586, 78, 10, 78, 78, 78, 76, 78, 78, 78, 78, 78, 82, 10, 82, 101, 10, 101, 101, 101, 99, 101, 101, 101, 105, 10, 105, 128, 10, 128, 128, 128, 126, - 128, 128, 132, 10, 132, 132, 588, 132, 588, 132, - 132, 588, 588, 132, 588, 132, 588, 132, 147, 10, + 128, 128, 132, 10, 132, 132, 590, 132, 590, 132, + 132, 590, 590, 132, 590, 132, 590, 132, 147, 10, 147, 147, 147, 145, 147, 147, 147, 147, 151, 10, - 151, 588, 151, 164, 10, 164, 164, 164, 162, 164, - - 164, 164, 168, 10, 168, 168, 177, 10, 177, 177, - 177, 175, 177, 177, 181, 10, 181, 190, 10, 190, - 190, 190, 188, 190, 190, 194, 10, 194, 219, 10, - 219, 219, 219, 217, 219, 219, 219, 219, 219, 223, - 10, 223, 588, 223, 230, 10, 230, 230, 230, 228, - 230, 234, 10, 234, 245, 10, 245, 245, 245, 243, - 245, 245, 245, 249, 10, 249, 302, 10, 302, 302, - 302, 300, 302, 302, 302, 302, 302, 302, 302, 302, - 302, 306, 10, 306, 306, 325, 10, 325, 325, 325, - 323, 325, 325, 325, 325, 325, 325, 329, 10, 329, - - 350, 10, 350, 350, 350, 348, 350, 350, 350, 350, - 350, 350, 350, 354, 10, 354, 363, 10, 363, 363, - 363, 361, 363, 363, 367, 10, 367, 378, 10, 378, - 378, 378, 376, 378, 378, 378, 382, 10, 382, 409, - 10, 409, 409, 409, 407, 409, 409, 409, 409, 413, - 10, 413, 413, 426, 10, 426, 426, 426, 424, 426, - 426, 430, 10, 430, 588, 430, 447, 10, 447, 447, - 447, 445, 447, 447, 447, 451, 10, 451, 451, 464, - 10, 464, 464, 464, 462, 464, 464, 468, 10, 468, - 477, 10, 477, 477, 477, 475, 477, 477, 481, 10, - - 481, 481, 494, 10, 494, 494, 494, 492, 494, 494, - 494, 498, 10, 498, 498, 515, 10, 515, 515, 515, - 513, 515, 515, 515, 515, 515, 519, 10, 519, 588, - 519, 526, 10, 526, 526, 526, 524, 526, 530, 10, - 530, 537, 10, 537, 537, 537, 535, 537, 541, 10, - 541, 541, 550, 10, 550, 550, 550, 548, 550, 550, - 554, 10, 554, 563, 10, 563, 563, 563, 561, 563, - 563, 567, 10, 567, 10, 0, 2, 2, 0, 4, - 7, 579, 578, 0, 0, 0, 0, 0, 0, 0, - 21, 23, 23, 0, 0, 0, 0, 0, 0, 0, + 151, 590, 151, 160, 10, 160, 160, 160, 158, 160, + + 160, 164, 10, 164, 173, 10, 173, 173, 173, 171, + 173, 173, 177, 10, 177, 202, 10, 202, 202, 202, + 200, 202, 202, 202, 202, 202, 206, 10, 206, 590, + 206, 221, 10, 221, 221, 221, 219, 221, 221, 221, + 221, 225, 10, 225, 225, 232, 10, 232, 232, 232, + 230, 232, 236, 10, 236, 247, 10, 247, 247, 247, + 245, 247, 247, 247, 251, 10, 251, 304, 10, 304, + 304, 304, 302, 304, 304, 304, 304, 304, 304, 304, + 304, 304, 308, 10, 308, 308, 327, 10, 327, 327, + 327, 325, 327, 327, 327, 327, 327, 327, 331, 10, + + 331, 352, 10, 352, 352, 352, 350, 352, 352, 352, + 352, 352, 352, 352, 356, 10, 356, 365, 10, 365, + 365, 365, 363, 365, 365, 369, 10, 369, 380, 10, + 380, 380, 380, 378, 380, 380, 380, 384, 10, 384, + 411, 10, 411, 411, 411, 409, 411, 411, 411, 411, + 415, 10, 415, 415, 428, 10, 428, 428, 428, 426, + 428, 428, 432, 10, 432, 590, 432, 449, 10, 449, + 449, 449, 447, 449, 449, 449, 453, 10, 453, 453, + 466, 10, 466, 466, 466, 464, 466, 466, 470, 10, + 470, 479, 10, 479, 479, 479, 477, 479, 479, 483, + + 10, 483, 483, 496, 10, 496, 496, 496, 494, 496, + 496, 496, 500, 10, 500, 500, 517, 10, 517, 517, + 517, 515, 517, 517, 517, 517, 517, 521, 10, 521, + 590, 521, 528, 10, 528, 528, 528, 526, 528, 532, + 10, 532, 539, 10, 539, 539, 539, 537, 539, 543, + 10, 543, 543, 552, 10, 552, 552, 552, 550, 552, + 552, 556, 10, 556, 565, 10, 565, 565, 565, 563, + 565, 565, 569, 10, 569, 10, 0, 2, 2, 0, + 4, 7, 581, 580, 0, 0, 0, 0, 0, 0, + 0, 21, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 32, 34, 34, - 0, 47, 49, 49, 49, 49, 0, 0, 0, 77, - 79, 79, 79, 79, 79, 79, 79, 79, 79, 0, - 100, 102, 102, 102, 102, 0, 127, 129, 129, 129, + 0, 0, 0, 0, 0, 0, 0, 0, 32, 34, + 34, 0, 47, 49, 49, 49, 49, 0, 0, 0, + 77, 79, 79, 79, 79, 79, 79, 79, 79, 79, + 0, 100, 102, 102, 102, 102, 0, 127, 129, 129, + 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 146, - 148, 148, 148, 148, 148, 0, 0, 163, 165, 165, - 165, 165, 0, 176, 178, 178, 178, 0, 189, 191, - 191, 191, 0, 218, 220, 220, 220, 220, 220, 220, - - 220, 0, 0, 229, 231, 231, 0, 244, 246, 246, - 246, 246, 0, 301, 303, 303, 303, 303, 303, 303, - 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, - 303, 0, 324, 326, 326, 326, 326, 326, 326, 326, - 326, 0, 349, 351, 351, 351, 351, 351, 351, 351, - 351, 0, 362, 364, 364, 364, 0, 377, 379, 379, - 379, 379, 0, 408, 410, 410, 410, 410, 410, 410, - 0, 425, 427, 427, 427, 427, 0, 0, 446, 448, - 448, 448, 448, 448, 0, 463, 465, 465, 465, 0, - 476, 478, 478, 478, 0, 493, 495, 495, 495, 495, - - 0, 514, 516, 516, 516, 516, 516, 516, 0, 0, - 525, 527, 527, 0, 536, 538, 538, 0, 549, 551, - 551, 551, 0, 562, 564, 564, 564, 0, 0, 0, - 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, - 586, 0, 23, 0, 0, 107, 0, 0, 0, 0, + 146, 148, 148, 148, 148, 148, 0, 0, 159, 161, + 161, 161, 0, 172, 174, 174, 174, 0, 201, 203, + 203, 203, 203, 203, 203, 203, 0, 0, 220, 222, + + 222, 222, 222, 222, 0, 231, 233, 233, 0, 246, + 248, 248, 248, 248, 0, 303, 305, 305, 305, 305, + 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, + 305, 305, 305, 0, 326, 328, 328, 328, 328, 328, + 328, 328, 328, 0, 351, 353, 353, 353, 353, 353, + 353, 353, 353, 0, 364, 366, 366, 366, 0, 379, + 381, 381, 381, 381, 0, 410, 412, 412, 412, 412, + 412, 412, 0, 427, 429, 429, 429, 429, 0, 0, + 448, 450, 450, 450, 450, 450, 0, 465, 467, 467, + 467, 0, 478, 480, 480, 480, 0, 495, 497, 497, + + 497, 497, 0, 516, 518, 518, 518, 518, 518, 518, + 0, 0, 527, 529, 529, 0, 538, 540, 540, 0, + 551, 553, 553, 553, 0, 564, 566, 566, 566, 0, + 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, + 0, 0, 588, 0, 23, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, + 0, 0, 0, 0, 0, 0, 34, 0, 0, 49, + 0, 0, 49, 0, 0, 0, 583, 79, 0, 0, + 79, 79, 79, 79, 79, 79, 0, 0, 102, 102, + + 102, 0, 0, 0, 0, 129, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 106, 0, 0, - 0, 0, 0, 0, 34, 0, 0, 49, 0, 0, - 49, 0, 0, 0, 581, 79, 0, 0, 79, 79, - 79, 79, 79, 79, 0, 0, 102, 102, 102, 0, - - 0, 0, 0, 129, 0, 0, 107, 0, 0, 0, - 0, 0, 0, 0, 0, 106, 0, 0, 0, 0, - 148, 0, 0, 148, 148, 0, 0, 0, 165, 0, - 0, 165, 0, 0, 178, 178, 0, 0, 191, 191, - 0, 0, 220, 220, 220, 0, 0, 220, 220, 220, - 0, 0, 0, 0, 231, 0, 0, 246, 0, 0, - 0, 0, 0, 0, 303, 303, 0, 0, 303, 0, - 0, 303, 303, 303, 303, 303, 303, 303, 303, 303, - 303, 303, 0, 0, 0, 0, 0, 0, 326, 326, - 326, 326, 326, 0, 0, 351, 351, 351, 0, 0, - - 351, 351, 351, 0, 0, 364, 0, 0, 0, 0, - 379, 0, 0, 379, 0, 0, 410, 0, 0, 410, - 410, 410, 0, 0, 427, 427, 427, 0, 0, 0, - 448, 448, 448, 448, 0, 0, 465, 0, 0, 0, - 0, 478, 478, 0, 0, 495, 495, 495, 0, 0, - 516, 516, 516, 516, 516, 0, 0, 0, 527, 0, - 0, 0, 0, 0, 0, 0, 0, 551, 0, 0, - 0, 0, 564, 0, 0, 0, 14, 1, 0, 0, - 574, 0, 0, 0, 571, 570, 0, 0, 23, 0, - 0, 25, 0, 107, 0, 0, 0, 0, 0, 0, - - 0, 224, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 106, 0, 0, - 0, 0, 0, 0, 34, 0, 0, 36, 0, 49, - 0, 41, 40, 49, 0, 0, 0, 51, 0, 79, - 0, 55, 54, 0, 0, 79, 0, 0, 79, 79, - 79, 0, 0, 81, 0, 102, 102, 102, 0, 0, - 104, 0, 0, 109, 108, 129, 0, 0, 131, 0, - 0, 0, 0, 225, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 148, 0, 136, 135, 148, 148, 0, - 0, 150, 0, 0, 165, 0, 155, 154, 165, 0, - - 0, 167, 0, 178, 178, 0, 0, 180, 0, 191, - 191, 0, 0, 193, 0, 220, 220, 220, 0, 198, - 197, 220, 220, 220, 0, 0, 222, 0, 0, 0, - 231, 0, 0, 233, 0, 246, 0, 238, 237, 0, - 240, 239, 0, 0, 248, 0, 303, 303, 303, 303, - 0, 265, 264, 303, 0, 253, 252, 0, 0, 303, - 303, 303, 303, 303, 303, 303, 303, 303, 303, 0, - 0, 305, 0, 0, 320, 319, 0, 310, 309, 0, - 0, 326, 326, 326, 326, 0, 0, 328, 0, 351, - 351, 351, 351, 0, 333, 332, 0, 0, 351, 351, - - 0, 0, 353, 0, 364, 0, 358, 357, 0, 0, - 366, 0, 379, 0, 371, 370, 379, 0, 0, 381, - 0, 410, 0, 386, 385, 410, 410, 410, 0, 0, - 412, 0, 0, 0, 0, 0, 427, 0, 0, 429, - 0, 0, 0, 0, 448, 448, 0, 0, 448, 0, - 0, 450, 0, 465, 0, 455, 454, 0, 0, 467, - 0, 0, 0, 0, 0, 0, 0, 480, 0, 0, - 0, 495, 495, 0, 0, 0, 0, 497, 0, 516, - 516, 516, 516, 516, 0, 0, 518, 0, 0, 527, - 0, 0, 529, 0, 0, 534, 533, 0, 0, 540, - - 0, 0, 545, 544, 551, 0, 0, 553, 0, 0, - 558, 557, 564, 0, 0, 566, 0, 0, 0, 575, - 569, 0, 0, 0, 23, 0, 0, 0, 0, 0, - 0, 0, 0, 224, 195, 0, 383, 0, 0, 0, - 331, 0, 0, 542, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 330, 0, 0, 0, 0, 0, 0, - 0, 49, 0, 0, 79, 0, 59, 58, 0, 0, - 0, 57, 56, 79, 0, 0, 79, 0, 102, 0, - 0, 102, 0, 129, 0, 130, 0, 0, 0, 225, - 196, 384, 543, 0, 0, 0, 0, 0, 0, 148, - - 148, 0, 0, 0, 0, 165, 165, 0, 0, 0, - 178, 0, 0, 0, 191, 0, 220, 220, 0, 0, - 220, 220, 220, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 303, 303, 303, 303, 0, 0, 0, 267, - 266, 303, 303, 303, 303, 303, 303, 303, 303, 303, - 303, 303, 0, 0, 322, 321, 326, 326, 326, 326, - 0, 351, 351, 351, 351, 0, 341, 340, 351, 351, - 0, 364, 0, 379, 379, 0, 410, 410, 410, 410, - 0, 0, 419, 418, 0, 417, 416, 427, 0, 383, - 0, 436, 435, 448, 448, 0, 434, 433, 448, 0, - - 465, 0, 0, 474, 473, 0, 472, 471, 0, 0, - 487, 486, 495, 495, 0, 485, 484, 0, 516, 0, - 0, 516, 516, 516, 0, 0, 527, 0, 0, 551, - 0, 564, 0, 0, 0, 0, 12, 0, 572, 573, - 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, - 195, 0, 0, 383, 0, 0, 169, 0, 331, 0, - 0, 542, 0, 414, 0, 39, 0, 0, 0, 0, - 0, 330, 0, 38, 0, 30, 29, 0, 0, 43, - 42, 49, 0, 0, 79, 0, 61, 60, 79, 0, - 65, 64, 79, 0, 102, 0, 0, 0, 0, 0, - - 0, 129, 0, 0, 0, 196, 0, 384, 543, 415, - 0, 0, 0, 415, 414, 148, 0, 0, 0, 140, - 139, 0, 0, 165, 165, 0, 0, 174, 173, 178, - 0, 0, 187, 186, 191, 0, 220, 220, 0, 202, - 201, 0, 0, 220, 0, 0, 220, 0, 170, 0, - 0, 227, 226, 0, 232, 0, 242, 241, 0, 303, - 0, 0, 303, 303, 0, 263, 262, 303, 303, 0, - 0, 303, 303, 303, 303, 303, 303, 303, 303, 0, - 0, 0, 326, 326, 326, 0, 351, 0, 0, 351, - 351, 0, 0, 351, 0, 364, 0, 379, 379, 0, - - 410, 410, 410, 0, 0, 410, 0, 427, 0, 0, - 448, 448, 448, 0, 465, 0, 0, 495, 495, 0, - 516, 0, 502, 501, 516, 516, 516, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 11, 0, 23, 0, 0, 0, 0, 0, - 0, 0, 532, 0, 0, 0, 0, 169, 0, 0, - 0, 53, 414, 355, 0, 39, 0, 531, 52, 0, - 0, 0, 0, 38, 0, 0, 49, 0, 0, 79, - 79, 79, 0, 102, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 96, 95, 0, 129, 0, 0, 0, - - 0, 415, 356, 0, 0, 0, 148, 0, 138, 137, - 0, 0, 165, 0, 0, 0, 178, 0, 0, 0, - 0, 220, 220, 0, 200, 199, 0, 0, 0, 0, - 0, 220, 0, 221, 170, 0, 0, 303, 0, 281, - 280, 0, 0, 303, 303, 303, 0, 261, 260, 0, - 0, 303, 303, 303, 303, 0, 0, 303, 303, 0, - 0, 318, 317, 0, 0, 326, 0, 0, 0, 351, - 0, 337, 336, 0, 0, 351, 0, 335, 334, 351, - 0, 352, 364, 0, 379, 379, 0, 410, 410, 410, - 0, 0, 0, 410, 0, 411, 427, 0, 0, 0, - - 0, 0, 0, 448, 0, 465, 0, 0, 0, 0, - 0, 0, 0, 516, 516, 516, 516, 0, 0, 0, - 523, 522, 0, 0, 0, 547, 546, 0, 552, 0, - 560, 559, 0, 0, 0, 0, 0, 0, 0, 0, - 431, 0, 0, 0, 0, 308, 251, 532, 0, 28, - 0, 0, 0, 0, 500, 53, 355, 152, 0, 531, - 52, 307, 250, 27, 499, 0, 0, 49, 0, 0, - 50, 79, 0, 0, 79, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 432, 0, 0, 0, 0, 356, 153, 0, 0, - - 148, 0, 0, 0, 0, 165, 0, 157, 156, 0, - 178, 0, 179, 0, 185, 184, 0, 220, 220, 0, - 216, 215, 0, 0, 220, 0, 0, 303, 0, 283, - 282, 303, 303, 303, 0, 255, 254, 0, 0, 303, - 303, 303, 0, 257, 256, 303, 303, 0, 0, 312, - 311, 0, 0, 0, 314, 313, 0, 351, 0, 339, - 338, 351, 351, 364, 0, 379, 0, 0, 0, 410, - 0, 0, 410, 410, 0, 0, 410, 427, 0, 428, - 0, 0, 440, 439, 0, 438, 437, 448, 0, 465, - 0, 0, 0, 491, 490, 0, 489, 488, 0, 516, - - 516, 516, 516, 0, 0, 0, 0, 0, 0, 0, - 0, 17, 0, 19, 18, 0, 431, 520, 368, 0, - 0, 308, 251, 0, 28, 452, 0, 182, 16, 500, - 152, 0, 0, 307, 250, 27, 499, 0, 0, 49, - 580, 79, 0, 67, 66, 79, 0, 80, 0, 98, - 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 432, 369, 0, 0, 0, - 153, 0, 0, 142, 141, 148, 0, 0, 0, 159, - 158, 165, 0, 178, 0, 220, 220, 0, 0, 0, - 0, 220, 183, 0, 303, 303, 303, 303, 0, 259, - - 258, 303, 303, 303, 303, 0, 0, 0, 0, 316, - 315, 0, 351, 351, 351, 364, 0, 365, 379, 0, - 375, 374, 0, 410, 0, 392, 391, 410, 410, 0, - 0, 0, 0, 410, 427, 453, 448, 0, 465, 0, - 0, 0, 0, 0, 516, 516, 516, 0, 521, 0, - 0, 539, 0, 0, 0, 0, 17, 0, 520, 368, - 0, 0, 235, 452, 0, 182, 16, 0, 0, 0, - 0, 35, 49, 0, 0, 79, 0, 0, 0, 0, + 0, 0, 148, 0, 0, 148, 148, 0, 0, 0, + 161, 161, 0, 0, 174, 174, 0, 0, 203, 203, + 203, 0, 0, 203, 203, 203, 0, 0, 0, 0, + 222, 222, 0, 0, 222, 0, 0, 233, 0, 0, + 248, 0, 0, 0, 0, 0, 0, 305, 305, 0, + 0, 305, 0, 0, 305, 305, 305, 305, 305, 305, + 305, 305, 305, 305, 305, 0, 0, 0, 0, 0, + 0, 328, 328, 328, 328, 328, 0, 0, 353, 353, + + 353, 0, 0, 353, 353, 353, 0, 0, 366, 0, + 0, 0, 0, 381, 0, 0, 381, 0, 0, 412, + 0, 0, 412, 412, 412, 0, 0, 429, 429, 429, + 0, 0, 0, 450, 450, 450, 450, 0, 0, 467, + 0, 0, 0, 0, 480, 480, 0, 0, 497, 497, + 497, 0, 0, 518, 518, 518, 518, 518, 0, 0, + 0, 529, 0, 0, 0, 0, 0, 0, 0, 0, + 553, 0, 0, 0, 0, 566, 0, 0, 0, 14, + 1, 0, 0, 576, 0, 0, 0, 573, 572, 0, + 0, 23, 0, 0, 25, 0, 107, 0, 0, 0, + + 0, 0, 0, 0, 226, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 369, 0, 0, - - 236, 0, 148, 0, 0, 165, 0, 166, 0, 0, - 0, 220, 220, 0, 208, 0, 207, 220, 183, 0, - 303, 303, 303, 303, 303, 0, 0, 303, 303, 303, - 0, 0, 0, 0, 304, 0, 327, 351, 351, 351, - 364, 0, 0, 0, 0, 0, 410, 410, 410, 0, - 396, 0, 395, 410, 427, 453, 448, 0, 449, 0, - 0, 0, 0, 0, 0, 504, 503, 0, 0, 516, - 516, 0, 517, 521, 0, 0, 0, 0, 0, 0, - 24, 0, 0, 235, 555, 0, 0, 0, 49, 0, + 106, 0, 0, 0, 0, 0, 0, 34, 0, 0, + 36, 0, 49, 0, 41, 40, 49, 0, 0, 0, + 51, 0, 79, 0, 55, 54, 0, 0, 79, 0, + 0, 79, 79, 79, 0, 0, 81, 0, 102, 102, + 102, 0, 0, 104, 0, 0, 109, 108, 129, 0, + 0, 131, 0, 0, 0, 0, 227, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 148, 0, 136, 135, + 148, 148, 0, 0, 150, 0, 0, 161, 161, 0, + + 0, 163, 0, 174, 174, 0, 0, 176, 0, 203, + 203, 203, 0, 181, 180, 203, 203, 203, 0, 0, + 205, 0, 0, 0, 222, 222, 0, 210, 209, 222, + 0, 0, 224, 0, 233, 0, 0, 235, 0, 248, + 0, 240, 239, 0, 242, 241, 0, 0, 250, 0, + 305, 305, 305, 305, 0, 267, 266, 305, 0, 255, + 254, 0, 0, 305, 305, 305, 305, 305, 305, 305, + 305, 305, 305, 0, 0, 307, 0, 0, 322, 321, + 0, 312, 311, 0, 0, 328, 328, 328, 328, 0, + 0, 330, 0, 353, 353, 353, 353, 0, 335, 334, + + 0, 0, 353, 353, 0, 0, 355, 0, 366, 0, + 360, 359, 0, 0, 368, 0, 381, 0, 373, 372, + 381, 0, 0, 383, 0, 412, 0, 388, 387, 412, + 412, 412, 0, 0, 414, 0, 0, 0, 0, 0, + 429, 0, 0, 431, 0, 0, 0, 0, 450, 450, + 0, 0, 450, 0, 0, 452, 0, 467, 0, 457, + 456, 0, 0, 469, 0, 0, 0, 0, 0, 0, + 0, 482, 0, 0, 0, 497, 497, 0, 0, 0, + 0, 499, 0, 518, 518, 518, 518, 518, 0, 0, + 520, 0, 0, 529, 0, 0, 531, 0, 0, 536, + + 535, 0, 0, 542, 0, 0, 547, 546, 553, 0, + 0, 555, 0, 0, 560, 559, 566, 0, 0, 568, + 0, 0, 0, 577, 571, 0, 0, 0, 23, 0, + 0, 0, 0, 0, 0, 0, 0, 226, 178, 0, + 385, 0, 0, 0, 333, 0, 0, 544, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 332, 0, 0, + 0, 0, 0, 0, 0, 49, 0, 0, 79, 0, + 59, 58, 0, 0, 0, 57, 56, 79, 0, 0, + 79, 0, 102, 0, 0, 102, 0, 129, 0, 130, + 0, 0, 0, 227, 179, 386, 545, 0, 0, 0, + + 0, 0, 0, 148, 148, 0, 0, 0, 0, 0, + 0, 161, 0, 0, 0, 174, 0, 203, 203, 0, + 0, 203, 203, 203, 0, 0, 0, 222, 222, 222, + 0, 0, 0, 0, 0, 0, 0, 305, 305, 305, + 305, 0, 0, 0, 269, 268, 305, 305, 305, 305, + 305, 305, 305, 305, 305, 305, 305, 0, 0, 324, + 323, 328, 328, 328, 328, 0, 353, 353, 353, 353, + 0, 343, 342, 353, 353, 0, 366, 0, 381, 381, + 0, 412, 412, 412, 412, 0, 0, 421, 420, 0, + 419, 418, 429, 0, 385, 0, 438, 437, 450, 450, + + 0, 436, 435, 450, 0, 467, 0, 0, 476, 475, + 0, 474, 473, 0, 0, 489, 488, 497, 497, 0, + 487, 486, 0, 518, 0, 0, 518, 518, 518, 0, + 0, 529, 0, 0, 553, 0, 566, 0, 0, 0, + 0, 12, 0, 574, 575, 0, 23, 0, 0, 0, + 0, 0, 0, 0, 0, 178, 0, 0, 385, 0, + 0, 152, 0, 333, 0, 0, 544, 0, 416, 0, + 39, 0, 0, 0, 0, 0, 332, 0, 38, 0, + 30, 29, 0, 0, 43, 42, 49, 0, 0, 79, + 0, 61, 60, 79, 0, 65, 64, 79, 0, 102, + + 0, 0, 0, 0, 0, 0, 129, 0, 0, 0, + 179, 0, 386, 545, 417, 0, 0, 0, 417, 416, + 148, 0, 0, 0, 140, 139, 0, 0, 0, 157, + 156, 161, 0, 0, 170, 169, 174, 0, 203, 203, + 0, 185, 184, 0, 0, 203, 0, 0, 203, 0, + 153, 0, 222, 222, 222, 0, 0, 229, 228, 0, + 234, 0, 244, 243, 0, 305, 0, 0, 305, 305, + 0, 265, 264, 305, 305, 0, 0, 305, 305, 305, + 305, 305, 305, 305, 305, 0, 0, 0, 328, 328, + 328, 0, 353, 0, 0, 353, 353, 0, 0, 353, + + 0, 366, 0, 381, 381, 0, 412, 412, 412, 0, + 0, 412, 0, 429, 0, 0, 450, 450, 450, 0, + 467, 0, 0, 497, 497, 0, 518, 0, 504, 503, + 518, 518, 518, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, + 23, 0, 0, 0, 0, 0, 0, 0, 534, 0, + 0, 0, 0, 152, 0, 0, 0, 53, 416, 357, + 0, 39, 0, 533, 52, 0, 0, 0, 0, 38, + 0, 0, 49, 0, 0, 79, 79, 79, 0, 102, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, + + 95, 0, 129, 0, 0, 0, 0, 417, 358, 0, + 0, 0, 148, 0, 138, 137, 0, 0, 161, 0, + 0, 0, 0, 203, 203, 0, 183, 182, 0, 0, + 0, 0, 0, 203, 0, 204, 153, 0, 0, 0, + 222, 0, 0, 0, 0, 305, 0, 283, 282, 0, + 0, 305, 305, 305, 0, 263, 262, 0, 0, 305, + 305, 305, 305, 0, 0, 305, 305, 0, 0, 320, + 319, 0, 0, 328, 0, 0, 0, 353, 0, 339, + 338, 0, 0, 353, 0, 337, 336, 353, 0, 354, + 366, 0, 381, 381, 0, 412, 412, 412, 0, 0, + + 0, 412, 0, 413, 429, 0, 0, 0, 0, 0, + 0, 450, 0, 467, 0, 0, 0, 0, 0, 0, + 0, 518, 518, 518, 518, 0, 0, 0, 525, 524, + 0, 0, 0, 549, 548, 0, 554, 0, 562, 561, + 0, 0, 0, 0, 0, 0, 0, 0, 433, 0, + 0, 0, 0, 310, 253, 534, 0, 28, 0, 0, + 0, 0, 502, 53, 357, 207, 0, 533, 52, 309, + 252, 27, 501, 0, 0, 49, 0, 0, 50, 79, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 434, + + 0, 0, 0, 0, 358, 208, 0, 0, 148, 0, + 0, 161, 0, 162, 0, 168, 167, 0, 203, 203, + 0, 199, 198, 0, 0, 203, 0, 0, 218, 217, + 0, 0, 222, 0, 212, 211, 0, 0, 305, 0, + 285, 284, 305, 305, 305, 0, 257, 256, 0, 0, + 305, 305, 305, 0, 259, 258, 305, 305, 0, 0, + 314, 313, 0, 0, 0, 316, 315, 0, 353, 0, + 341, 340, 353, 353, 366, 0, 381, 0, 0, 0, + 412, 0, 0, 412, 412, 0, 0, 412, 429, 0, + 430, 0, 0, 442, 441, 0, 440, 439, 450, 0, + + 467, 0, 0, 0, 493, 492, 0, 491, 490, 0, + 518, 518, 518, 518, 0, 0, 0, 0, 0, 0, + 0, 0, 17, 0, 19, 18, 0, 433, 522, 370, + 0, 0, 310, 253, 0, 28, 454, 0, 165, 16, + 502, 207, 0, 0, 309, 252, 27, 501, 0, 0, + 49, 582, 79, 0, 67, 66, 79, 0, 80, 0, + 98, 97, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 434, 371, 0, 0, + 0, 208, 0, 0, 142, 141, 148, 0, 0, 161, + 0, 203, 203, 0, 0, 0, 0, 203, 166, 0, + + 214, 213, 222, 0, 0, 305, 305, 305, 305, 0, + 261, 260, 305, 305, 305, 305, 0, 0, 0, 0, + 318, 317, 0, 353, 353, 353, 366, 0, 367, 381, + 0, 377, 376, 0, 412, 0, 394, 393, 412, 412, + 0, 0, 0, 0, 412, 429, 455, 450, 0, 467, + 0, 0, 0, 0, 0, 518, 518, 518, 0, 523, + 0, 0, 541, 0, 0, 0, 0, 17, 0, 522, + 370, 0, 0, 237, 454, 0, 165, 16, 0, 0, + 0, 0, 35, 49, 0, 0, 79, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 371, 0, + 0, 238, 0, 148, 0, 0, 0, 0, 0, 203, + 203, 0, 191, 0, 190, 203, 166, 222, 0, 223, + 0, 305, 305, 305, 305, 305, 0, 0, 305, 305, + 305, 0, 0, 0, 0, 306, 0, 329, 353, 353, + 353, 366, 0, 0, 0, 0, 0, 412, 412, 412, + 0, 398, 0, 397, 412, 429, 455, 450, 0, 451, + 0, 0, 0, 0, 0, 0, 506, 505, 0, 0, + 518, 518, 0, 519, 523, 0, 0, 0, 0, 0, + 0, 24, 0, 0, 237, 557, 0, 0, 0, 49, + + 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, 236, 0, - 148, 0, 556, 165, 0, 172, 171, 0, 192, 220, - 220, 210, 209, 0, 0, 0, 303, 303, 303, 303, - 303, 0, 293, 292, 303, 0, 0, 303, 0, 0, - 0, 0, 351, 351, 0, 0, 364, 0, 373, 372, - 0, 380, 0, 388, 387, 410, 410, 410, 398, 397, - 0, 0, 427, 448, 0, 0, 0, 0, 466, 0, - 0, 0, 508, 507, 0, 0, 0, 0, 0, 528, - 0, 0, 0, 0, 0, 469, 555, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, 79, 0, - 0, 0, 0, 88, 0, 0, 0, 0, 87, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 238, + 0, 148, 0, 558, 0, 155, 154, 0, 175, 203, + 203, 193, 192, 0, 0, 222, 0, 305, 305, 305, + 305, 305, 0, 295, 294, 305, 0, 0, 305, 0, + 0, 0, 0, 353, 353, 0, 0, 366, 0, 375, + 374, 0, 382, 0, 390, 389, 412, 412, 412, 400, + 399, 0, 0, 429, 450, 0, 0, 0, 0, 468, + 0, 0, 0, 510, 509, 0, 0, 0, 0, 0, + + 530, 0, 0, 0, 0, 0, 471, 557, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, + 0, 0, 0, 0, 88, 0, 0, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 470, 0, 148, 0, 556, 165, 220, - 0, 0, 0, 212, 211, 0, 247, 303, 303, 303, - 0, 0, 303, 303, 0, 291, 290, 303, 0, 0, - 0, 0, 351, 0, 0, 0, 347, 346, 0, 0, - 410, 410, 410, 0, 400, 399, 0, 0, 0, 0, + 0, 0, 0, 0, 472, 0, 148, 0, 558, 203, + 0, 0, 0, 195, 194, 222, 0, 249, 305, 305, + 305, 0, 0, 305, 305, 0, 293, 292, 305, 0, + 0, 0, 0, 353, 0, 0, 0, 349, 348, 0, + 0, 412, 412, 412, 0, 402, 401, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 506, 505, 0, 0, 0, 0, 0, 469, - 133, 0, 0, 0, 45, 44, 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, 470, 134, 0, - 0, 0, 0, 0, 0, 0, 220, 0, 214, 213, - 303, 303, 0, 0, 0, 297, 296, 0, 0, 303, - 303, 0, 0, 0, 0, 351, 0, 343, 342, 0, - 360, 359, 410, 0, 0, 410, 0, 0, 0, 0, + 0, 0, 0, 508, 507, 0, 0, 0, 0, 0, + 471, 133, 0, 0, 0, 45, 44, 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, 565, 0, 0, 0, 0, - - 482, 133, 84, 83, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 94, 0, 0, 0, - 93, 0, 0, 0, 0, 0, 111, 119, 0, 0, - 0, 0, 110, 118, 0, 483, 134, 0, 144, 143, - 0, 0, 161, 160, 0, 204, 203, 220, 303, 303, - 0, 295, 294, 0, 299, 298, 303, 303, 0, 0, - 0, 0, 351, 410, 0, 394, 393, 410, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, - 0, 456, 0, 479, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 482, 84, 83, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 63, 62, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 113, 0, - 0, 0, 112, 0, 483, 0, 149, 220, 303, 303, - 0, 0, 303, 275, 0, 274, 0, 351, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 472, 134, + 0, 0, 0, 0, 0, 203, 0, 197, 196, 0, + 0, 305, 305, 0, 0, 0, 299, 298, 0, 0, + 305, 305, 0, 0, 0, 0, 353, 0, 345, 344, + 0, 362, 361, 412, 0, 0, 412, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 75, 71, 0, 0, - 74, 70, 0, 92, 0, 0, 91, 0, 0, 0, - 103, 0, 0, 0, 0, 0, 0, 220, 303, 303, - 0, 0, 0, 0, 0, 277, 276, 351, 0, 390, - - 389, 0, 0, 0, 423, 0, 422, 0, 444, 0, - 443, 0, 459, 461, 458, 460, 0, 496, 510, 0, - 509, 0, 0, 0, 0, 12, 0, 12, 0, 0, - 0, 0, 0, 86, 90, 85, 89, 123, 0, 0, - 121, 122, 0, 0, 120, 220, 303, 303, 0, 0, - 0, 0, 0, 279, 278, 351, 0, 0, 0, 0, - 421, 420, 442, 441, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 115, 0, 0, 114, + + 0, 0, 0, 0, 0, 0, 567, 0, 0, 0, + 0, 484, 133, 84, 83, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 94, 0, 0, + 0, 93, 0, 0, 0, 0, 0, 111, 119, 0, + 0, 0, 0, 110, 118, 0, 485, 134, 0, 144, + 143, 0, 0, 187, 186, 203, 0, 216, 215, 305, + 305, 0, 297, 296, 0, 301, 300, 305, 305, 0, + 0, 0, 0, 353, 412, 0, 396, 395, 412, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 459, + 0, 0, 458, 0, 481, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 484, 84, 83, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 63, 62, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 113, + 0, 0, 0, 112, 0, 485, 0, 149, 203, 305, + 305, 0, 0, 305, 277, 0, 276, 0, 353, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 75, 71, 0, + 0, 74, 70, 0, 92, 0, 0, 91, 0, 0, + 0, 103, 0, 0, 0, 0, 0, 0, 203, 305, + + 305, 0, 0, 0, 0, 0, 279, 278, 353, 0, + 392, 391, 0, 0, 0, 425, 0, 424, 0, 446, + 0, 445, 0, 461, 463, 460, 462, 0, 498, 512, + 0, 511, 0, 0, 0, 0, 12, 0, 12, 0, + 0, 0, 0, 0, 86, 90, 85, 89, 123, 0, + 0, 121, 122, 0, 0, 120, 203, 305, 305, 0, + 0, 0, 0, 0, 281, 280, 353, 0, 0, 0, + 0, 423, 422, 444, 443, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 115, 0, 0, + 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 69, 0, 68, 0, 0, - 0, 0, 0, 0, 206, 205, 0, 289, 288, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 345, - 344, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 512, 511, 0, 73, 72, 0, 0, + 0, 0, 0, 0, 0, 0, 69, 0, 68, 0, + 0, 0, 0, 0, 0, 189, 188, 0, 291, 290, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 347, 346, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 514, 513, 0, 73, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 125, 117, 124, 116, 0, 0, 0, 0, 0, 0, - 269, 0, 0, 268, 0, 0, 402, 0, 0, 401, - 0, 0, 0, 0, 0, 273, 0, 272, 0, 404, - 0, 403, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 285, 0, 284, 0, 0, 0, - 0, 0, 0, 287, 286, 271, 270, 406, 405, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 125, 117, 124, 116, 0, 0, 0, 0, 0, + 0, 271, 0, 0, 270, 0, 0, 404, 0, 0, + 403, 0, 0, 0, 0, 0, 275, 0, 274, 0, + 406, 0, 405, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 287, 0, 286, 0, 0, + 0, 0, 0, 0, 289, 288, 273, 272, 408, 407, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -793,7 +793,8 @@ static yyconst flex_int16_t yy_accept[3458] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 13, 0 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 0 } ; static yyconst flex_int32_t yy_ec[256] = @@ -840,7 +841,7 @@ static yyconst flex_int32_t yy_meta[75] = 5, 5, 5, 5 } ; -static yyconst flex_int16_t yy_base[3970] = +static yyconst flex_int16_t yy_base[3981] = { 0, 0, 0, 0, 3, 6, 9, 12, 29, 16, 19, 14, 17, 33, 36, 49, 55, 45, 61, 66, 72, @@ -854,12 +855,12 @@ static yyconst flex_int16_t yy_base[3970] = 801, 804, 807, 811, 814, 867, 870, 873, 877, 880, 897, 903, 921, 988, 941, 944, 947, 951, 1008, 1011, - 1014, 1018, 1055, 1123, 1075, 1078, 1081, 1085, 1143, 1146, - 1149, 1153, 1191, 1258, 1211, 1214, 1325, 1393, 1217, 1221, - 1461, 1528, 1224, 1278, 1281, 1284, 1288, 1291, 1345, 1348, - 1595, 1657, 1351, 1355, 1719, 1788, 1358, 1413, 1857, 0, - 1416, 1419, 1423, 1426, 1481, 1484, 1487, 1491, 1931, 1998, - 1548, 1551, 2065, 2132, 1554, 1558, 2199, 2256, 1615, 1618, + 1014, 1018, 1055, 1122, 1075, 1078, 1189, 1257, 1081, 1085, + 1325, 1392, 1088, 1142, 1145, 1148, 1152, 1155, 1209, 1212, + 1459, 1527, 1215, 1219, 1222, 1277, 1280, 1283, 1287, 1290, + 1595, 1657, 1345, 1348, 1719, 1788, 1351, 1355, 1857, 0, + 1412, 1415, 1418, 1422, 1479, 1482, 1485, 1489, 1931, 1998, + 1547, 1550, 2065, 2132, 1553, 1557, 2199, 2256, 1615, 1618, 2313, 2373, 1621, 1625, 2433, 2500, 1628, 1677, 1680, 1683, 1687, 1690, 1739, 1742, 2567, 2634, 1745, 1749, 1752, 1808, 1811, 1814, 1818, 1821, 2701, 2768, 1951, 1954, 1957, 1961, @@ -870,2254 +871,2262 @@ static yyconst flex_int16_t yy_base[3970] = 2333, 2336, 2339, 2343, 2346, 2393, 2396, 2399, 3351, 3421, 2403, 2406, 3491, 3548, 2453, 2456, 2459, 2463, 2466, 2520, 2523, 2526, 3605, 3675, 2530, 2533, 3745, 3815, 2587, 2590, - 0, 0, 9416,12593,12593, 95, 100, 29, 41,12593, - 103, 51,12593,12593, 9405,12593,12593, 9394,12593, 9405, - 9405, 202,12593,12593,12593,12593, 9403, 9399, 9354, 153, - 12593, 161, 9380, 0, 145,12593, 9342,12593, 165, 3881, - - 73, 2599, 315, 357, 9382, 9329,12593, 168, 9368, 0, - 152,12593, 9330,12593, 261, 9374, 31,12593, 266, 9361, - 0, 245,12593, 9323, 9327, 9321, 421, 9326,12593, 269, - 9352, 0, 340,12593, 9314, 9314, 271, 9316, 238,12593, - 441, 484,12593, 504, 9340, 0, 401,12593, 9299, 9301, - 9287,12593, 561, 548,12593, 571, 9332, 0, 481,12593, - 9299, 9283,12593, 628, 3945, 9281, 163, 2533, 567, 206, - 38, 9332, 954, 2607, 639, 907, 437, 79,12593, 634, - 9319, 0, 546,12593, 9275, 9285, 9269, 9274,12593, 638, - 313, 559, 368,12593, 697, 9310, 0, 549,12593, 9262, - - 9272, 9250,12593, 704, 426, 497,12593, 707, 9298, 0, - 747,12593, 9268, 9248,12593, 767, 753,12593, 773, 9291, - 0, 757,12593, 9261, 9236,12593, 831, 818,12593, 838, - 9284, 0, 758,12593, 9233, 9239, 9245, 251, 9228,12593, - 841, 466, 9234, 530,12593, 906, 9270, 0, 815,12593, - 9240,12593, 914, 891,12593, 977, 9268, 0, 816,12593, - 9220, 9230, 9217,12593, 981, 965,12593, 1021, 9256, 0, - 881,12593, 9205, 203, 9211, 9217, 378, 85, 639, 972, - 9205,12593, 1040, 564, 814,12593, 1044, 9247, 0, 953, - 12593, 9191, 9209, 9211, 157, 8639, 8618,12593, 1048, 1086, - - 12593, 1106, 8665, 0, 966,12593, 8614, 8612, 8619, 8629, - 8631, 8616, 8609,12593, 1111, 1099,12593, 1114, 8656, 0, - 1032,12593, 8611, 8614,12593, 1156, 1160,12593, 1173, 8645, - 0, 1033,12593, 8614, 8603, 8604,12593, 1180, 1228,12593, - 1183, 8632, 0, 1100,12593, 8601, 8593, 8595, 15,12593, - 1186, 899, 963,12593, 1241, 8622, 0, 1157,12593, 8569, - 181,12593, 1244, 1243, 432, 303,12593, 1248, 8614, 0, - 1158,12593, 8563, 8557, 299,12593, 1308, 1229, 350,12593, - 1311, 8607, 0, 1295,12593, 8560, 8554,12593, 1315, 1362, - 12593, 1319, 8585, 0, 1303,12593, 8528, 8528,12593, 1375, - - 1378, 685,12593, 1378, 8572, 0, 1363,12593, 8517, 8511, - 8513,12593, 1445, 1438, 744,12593, 1449, 8557, 0, 1365, - 12593, 8503, 8508, 8503, 8497, 8485,12593, 1454, 1447, 560, - 1007,12593, 1511, 8527, 0, 1370,12593, 8492,12593, 1517, - 1559,12593, 1520, 8520, 0, 1495,12593, 8480,12593, 1579, - 1210, 1433,12593, 1584, 8511, 0, 1496,12593, 8477, 8475, - 12593, 1587, 1632,12593, 1645, 8503, 0, 1563,12593, 8469, - 8463,12593, 1648, 1633, 1707, 719, 8437,12593, 8496, 8467, - 12593,12593,12593, 1700, 375, 8418, 8416, 8410, 8457, 8416, - 12593, 0, 8408, 8396, 8420, 8382, 104, 1037, 8383, 8380, - - 8379, 8383, 889, 1646, 1105, 8371, 8371, 1510, 1577, 8397, - 1701, 8372, 1709, 8361, 1719, 1720, 1721,12593, 0, 8362, - 8364,12593, 0, 8359, 2098, 8344, 666, 8341, 8387,12593, - 0, 8336, 2165, 8321, 8330, 8311, 8320, 8317, 8299, 8280, - 12593, 0, 8292, 8272, 8284, 8263,12593, 0, 2232, 8261, - 8306, 8284, 172, 8248, 8246, 8246, 1777, 1639, 8233, 1778, - 8259, 724, 814, 841, 888, 1770, 1792, 1779, 1046,12593, - 0, 8234, 2289, 8240, 8216, 8212, 897,12593, 0, 8216, - 2596, 8208, 8204,12593, 0, 8197, 8194, 8194,12593, 0, - 8189, 8185, 8186,12593, 0, 8192, 621, 2614, 8168, 8167, - - 8184, 8176, 1027,12593, 0, 8169, 8167,12593, 0, 8148, - 2656, 2666, 8158,12593, 0, 8164, 8153, 2674, 8134, 2680, - 8130, 8117, 8114, 8103, 8118, 8117, 8097, 8095, 8094, 8087, - 8071, 8082,12593, 0, 2721, 2724, 8060, 8056, 8072, 8065, - 8062, 8063,12593, 0, 8059, 8058, 8038, 2727, 8032, 8027, - 8041, 8025,12593, 0, 8020, 2730, 8015,12593, 0, 8018, - 2733, 8010, 8023,12593, 0, 8006, 2788, 7997, 8011, 8010, - 7988,12593, 0, 7979, 7994, 7979, 7973, 7976,12593, 0, - 7964, 7973, 7951, 7939, 7976,12593, 0, 7931, 2791, 7935, - 12593, 0, 7912, 7922, 7922,12593, 0, 7902, 7910, 7906, - - 7897,12593, 0, 7884, 7869, 7875, 7877, 7875, 7858, 7847, - 12593, 0, 7851, 7857,12593, 0, 2794, 7854,12593, 0, - 2797, 7835, 7830,12593, 0, 2800, 7832, 7823, 7863, 7867, - 1558, 7811,12593, 1833, 0, 7807, 7797, 7840, 7835, 7788, - 12593, 7796, 7776, 2600, 2855, 1981, 7787, 7788, 7766, 7755, - 7734, 7737, 7726, 7726, 7741, 7712, 330, 7705, 7710, 7713, - 7697, 7690, 7682, 7686, 7699, 7684, 7682, 1990, 7693, 7672, - 7676, 7673, 7661, 7674, 7668, 2858, 2863, 7667, 2866, 2048, - 7661, 7682, 2869, 2914,12593, 7652, 2917, 2117, 2924, 7633, - 2927, 7637, 7640, 7635, 2920, 2983, 7621, 7628, 7624, 2969, - - 2972, 2975, 2184, 7606, 2979, 3037, 2363, 7617, 7603, 7596, - 7590, 7594, 7588, 7581, 7581, 2423, 7575, 7573, 7566, 7565, - 7564, 3040, 2550, 7574, 7573, 3044, 3047, 1070, 7550, 3050, - 2621, 7564, 3103, 3106, 7562, 7548, 3114, 3117, 7559, 7558, - 3129, 3173, 7548, 7531, 7543, 3109, 2685, 7541, 7540, 7520, - 3179, 3183, 1340, 7504, 7518, 3186, 3245, 7504, 3239, 2755, - 3248, 2822, 3252, 3257, 7508, 1920, 3304, 3002, 7510, 3308, - 3068, 3313, 7491, 7483, 7479, 7477, 7472, 7460, 7451, 7448, - 7457, 7447, 3322, 3383, 3331, 3137, 3371, 3205, 3374, 3392, - 3397, 3450, 3459, 3444, 3468, 7451, 37, 7433, 3454, 3403, - - 3512, 7445, 7427, 3516, 3519, 7428, 3522, 3411, 3525, 3571, - 7440, 3574, 3473, 7432, 3577, 3580, 7425, 3583, 3481, 7423, - 7408, 7405, 3628, 3634, 3637, 3640, 3700, 3643, 3704, 7408, - 3695, 3723, 3709, 3770, 3713, 3766, 7415, 3774, 3662, 3777, - 3780, 3792, 3836, 3839, 3843, 3846, 3854, 3849, 3867, 3878, - 7413, 7384, 7391, 7395, 7375, 3872, 3887, 7385, 7364, 3875, - 3897, 3906, 3732, 3909, 3920, 3916, 3804, 7363, 3924, 3952, - 3956, 3967, 7361, 3977, 3983, 7403,12593,12593, 1210, 7350, - 12593, 7387, 7386, 7334,12593,12593, 7332, 7330, 7333, 3987, - 4012,12593, 4017, 1714, 7325, 7318, 7325, 7329, 7306, 7289, - - 7300, 1781, 7282, 7282, 7271, 7269, 7258, 7237, 7223, 7218, - 446, 7229, 7212, 7208, 7222, 7215, 7215, 2057, 7197, 7185, - 7190, 7179, 716, 7183, 4020, 4023, 4027,12593, 4031, 4038, - 4046,12593,12593, 4056, 7208, 4059, 4065,12593, 4068, 7156, - 4074,12593,12593, 4087, 4090, 4099, 4105, 4119, 7167, 4108, - 7165, 4111, 4130,12593, 4133, 7153, 4136, 7151, 4139, 4142, - 12593, 4145, 4154,12593,12593, 7146, 4164, 4167,12593, 4170, - 7136, 7139, 7144, 2250, 7124, 7131, 1922, 7104, 7101, 7116, - 7115, 7094, 7087, 7100, 4173,12593,12593, 7088, 4189, 4194, - 4197,12593, 4200, 7093, 7090, 4203,12593,12593, 7105, 4219, - - 4222,12593, 4225, 4228, 4231, 4234, 4249,12593, 4253, 4256, - 4262, 4274, 4280,12593, 4283, 7074, 7073, 4287, 4293,12593, - 12593, 7058, 7054, 7064, 4305, 4308,12593, 4311, 7048, 7046, - 4314, 4317, 4332,12593, 4336, 4339, 4344,12593,12593, 4357, - 12593,12593, 4365, 4368,12593, 4371, 7047, 7025, 7046, 7037, - 4377,12593,12593, 4390, 4393,12593,12593, 4404, 4408, 7024, - 7040, 7023, 7024, 7028, 7007, 7002, 7004, 6992, 1376, 4416, - 4422,12593, 4425, 4428,12593,12593, 4437,12593,12593, 4445, - 4448, 6982, 6989, 6987, 6973, 4456, 4459,12593, 4463, 6958, - 6954, 6943, 6955, 4466,12593,12593, 4478, 4482, 6939, 6947, - - 4496, 4499,12593, 4502, 6947, 4505,12593,12593, 4521, 4524, - 12593, 4527, 6912, 4530,12593,12593, 6898, 4546, 4549,12593, - 4554, 6888, 4558,12593,12593, 6888, 6884, 6886, 4568, 4573, - 12593, 4577, 4580, 4583, 4598, 4604, 6885, 4612, 4616,12593, - 4620, 6864, 4623, 4641, 6852, 6847, 4627, 4649, 6832, 4657, - 4660,12593, 4663, 6833, 4666,12593,12593, 4682, 4688,12593, - 4691, 4694, 4697, 4712, 4715, 4723, 4730,12593, 4734, 4737, - 4742, 6800, 6800, 4755, 4758, 4766, 4769,12593, 4773, 6794, - 4776, 6802, 6796, 6776, 4779, 4788,12593, 4798, 6773, 6774, - 4801, 4807,12593, 4810, 4813,12593,12593, 4821, 4829,12593, - - 4832, 4836,12593,12593, 6754, 4844, 4851,12593, 4854, 4864, - 12593,12593, 6733, 4873, 4876,12593, 4879, 1216, 4882,12593, - 12593, 6749, 6747, 6707, 6670, 4885, 6588, 6592, 6517, 6486, - 6486, 6397, 6407, 2307, 2483, 6285, 2492, 6194, 6168, 6087, - 2495, 12, 36, 2559, 131, 264, 311, 352, 389, 436, - 488, 488, 549, 2562, 590, 632, 4888, 4906, 4916, 4919, - 4923, 703, 802, 4931, 782, 4937,12593,12593, 4945, 4952, - 4963,12593,12593, 797, 4971, 4975, 836, 4983, 830, 4989, - 4992, 5002, 5007, 835, 5010,12593, 851, 980, 964, 2662, - 2693, 2763, 2830, 980, 1043, 1099, 1106, 1154, 1178, 1192, - - 5013, 5020, 5034, 5042, 1197, 1236, 1249, 5045, 5048, 5051, - 1286, 5066, 5069, 5072, 1304, 5080, 1315, 1308, 5087, 5090, - 5099, 1332, 5110, 5113, 1320, 1323, 5117, 5121, 5135, 5138, - 5142, 5150, 1383, 5157, 1365, 1386, 5160, 5163, 5171,12593, - 12593, 1389, 1394, 5180, 1382, 1411, 1411, 1430, 1455, 1432, - 1462, 1464, 5183, 5186,12593,12593, 5194, 5198, 5202, 5205, - 5208, 1495, 5212, 1495, 1508, 5223,12593,12593, 5233, 1519, - 5236, 1536, 5239, 1554, 1583, 5242, 1578, 1604, 1594, 5245, - 5251, 5270,12593,12593, 5278,12593,12593, 1605, 5265, 3010, - 5286,12593,12593, 1628, 1646, 5294,12593,12593, 1632, 5302, - - 1639, 5309, 5312,12593,12593, 5321,12593,12593, 5332, 5335, - 12593,12593, 1667, 1707, 5344,12593,12593, 5352, 1702, 5355, - 5358, 1709, 1721, 1756, 5367, 1766, 5373, 5376, 5380, 5386, - 5391, 5395, 5400, 1951, 1829, 5404,12593, 1831,12593,12593, - 1790, 1792, 5413, 1788, 1894, 1899, 1907, 1923, 1936, 1935, - 3076, 1954, 1977, 3266, 1986, 1990, 3279, 1991, 3342, 1978, - 1976, 3377, 1992, 3530, 2008, 3540, 2026, 2035, 2051, 2052, - 2055, 3380, 2041, 3670, 5419,12593,12593, 5427, 5433,12593, - 12593, 2053, 2078, 5446, 2056, 5456,12593,12593, 2067, 5466, - 12593,12593, 2058, 5474, 2062, 5477, 2851, 3945, 5485, 5489, - - 5498, 2076, 2080, 2100, 2104, 3727, 2112, 4268, 4631, 5503, - 2119, 2108, 2110, 5506, 5509, 2117, 5512, 5517, 5526,12593, - 12593, 5536, 2143, 2126, 5539, 5542, 5546,12593,12593, 2142, - 5557, 5561,12593,12593, 5576, 5579, 2147, 2136, 5584,12593, - 12593, 5594, 5598, 5607, 5612, 5615, 2161, 5626, 5016, 2181, - 5630,12593,12593, 5638,12593, 5645,12593,12593, 5653, 2188, - 5657, 5660, 5668, 2173, 5675,12593,12593, 2175, 2191, 5686, - 5689, 5700, 2184, 2200, 2194, 2201, 5704, 2223, 2232, 5707, - 5710, 5722, 5713, 5718, 5731, 5736, 2245, 5739, 5742, 5750, - 2234, 5757, 5761, 2244, 5769, 2237, 5777, 2249, 2232, 5781, - - 2254, 2239, 2274, 5784, 5790, 2290, 5802, 2286, 5805, 2302, - 5808, 5813, 5816, 5834, 2298, 5837, 5840, 5843, 5846, 5849, - 2293, 5864,12593,12593, 2301, 2302, 2300, 5872, 2316, 5875, - 5884, 5893, 5898, 5902, 5906, 5920, 5924, 5927, 5942, 2352, - 2351, 2396,12593, 2338, 5945, 5948, 2359, 2353, 2356, 2450, - 2354, 2362, 5935, 2374, 2379, 2396, 2409, 5954, 2420, 2410, - 2411, 5957, 5963, 5967, 2429, 5970, 2440, 5973, 5976, 2424, - 2450, 2486, 2475, 5979, 2492, 5983, 2498, 2536, 5986, 2532, - 5989, 2539, 5992, 5995, 2584, 2571, 2649, 2573, 2588, 2576, - 2668, 2586, 6013,12593,12593, 6021, 6024, 2573, 2566, 2716, - - 2574, 6027, 6030, 2579, 2717, 2722, 6035, 6042,12593,12593, - 6053, 2597, 6056, 6059, 6062, 6077, 2632, 6082, 6086, 6089, - 6097, 2615, 2625, 6107,12593,12593, 6116, 6119, 6127, 2656, - 2664, 2660, 6135,12593, 6138, 2687, 6141, 2688, 6145,12593, - 12593, 6154, 6160, 2693, 2703, 2703, 6168,12593,12593, 6176, - 6179, 6187, 2706, 2736, 2748, 6190, 6194, 2740, 2735, 6208, - 6211,12593,12593, 6219, 6223, 6231, 6237, 6240, 6249, 2752, - 6256,12593,12593, 6264, 6268, 2763, 6276,12593,12593, 2760, - 6284,12593, 2769, 6287, 2753, 6290, 6293, 2754, 6296, 2779, - 6308, 2793, 2794, 2794, 6316,12593, 2806, 6319, 2796, 6322, - - 6325, 6343, 6346, 2819, 6355, 2814, 6361, 6364, 6367, 6370, - 6385, 6388, 6396, 2817, 2825, 2821, 2834, 6399, 2846, 6404, - 12593,12593, 6418, 6422, 6426,12593,12593, 6437,12593, 6441, - 12593,12593, 6449, 2915, 2894, 2922, 2871, 6456, 6470, 6478, - 6452, 2865, 2884, 2908, 2885, 6481, 6484, 6487, 2903, 6490, - 2922, 2924, 2938, 2932, 6497, 6500, 6503, 6506, 2934, 6509, - 6512, 6515, 6518, 6521, 6524, 2935, 6527, 2943, 2956, 6530, - 12593, 2941, 6533, 6536, 2960, 6553, 6556, 6559, 2975, 2976, - 3005, 3020, 3013, 3025, 3022, 3025, 3031, 3030, 6567, 6574, - 6579, 6587, 3022, 3042, 3019, 3037, 6592, 6595, 6598, 6601, - - 3046, 6609, 3056, 6612, 6617, 3056, 6630,12593,12593, 6638, - 3073, 6643,12593, 6646,12593,12593, 6657, 3067, 3068, 6662, - 12593,12593, 3157, 3177, 3082, 3091, 6670, 3085, 6676,12593, - 12593, 3085, 3088, 3118, 6690,12593,12593, 6684, 6698, 3120, - 3109, 3118, 6707,12593,12593, 3130, 6715, 6718, 6722,12593, - 12593, 6733, 6737, 6745,12593,12593, 6753, 3131, 6756,12593, - 12593, 3126, 3135, 3130, 6765, 3144, 6768, 6772, 6786, 3145, - 6789, 6792, 3156, 3149, 3218, 3239, 3155, 3165, 6800,12593, - 3171, 6807,12593,12593, 6820,12593,12593, 3188, 6815, 3182, - 6829, 6834, 6837,12593,12593, 6849,12593,12593, 6857, 6861, - - 6867, 6871, 6879, 6885, 3189, 6889, 6892, 6897, 6904, 3255, - 3321, 6900, 6912,12593,12593, 6923, 6926, 6929, 6932, 3196, - 3209, 6942, 6945, 3220, 6951, 6954, 3237, 6960, 6963, 6966, - 6969, 3245, 3252, 6972, 6975, 6978, 6983, 3257, 6986, 3253, - 12593, 6989, 6992,12593,12593, 7000, 7007,12593, 7011,12593, - 12593, 3297, 3288, 3303, 3304, 3311, 3314, 3308, 3323, 3335, - 3363, 7019, 7022, 5419, 5856, 7030, 7033, 3325, 3323, 3343, - 7038, 3336, 7041,12593,12593, 3335, 7049, 3347, 7052,12593, - 12593, 3345, 7060, 7068, 7063, 3362, 3384, 3417, 3443, 3423, - 3446, 3406, 7071, 7074, 3403, 3410, 3409, 3480, 7082,12593, - - 12593, 7096, 3411, 3427, 3420, 7099, 7102, 7110, 7117,12593, - 12593, 7125, 3429, 3436, 3482, 3493, 7129,12593, 7135, 7138, - 12593,12593, 7148, 7154, 7157,12593,12593, 7167, 7172, 3520, - 3558, 3543, 3562, 7175, 3540, 7178, 3541, 7185, 7181, 7193, - 7205, 7212, 7208, 7217, 7227, 7234, 7237, 7240, 7245, 7255, - 7259,12593, 7262, 7268, 3581, 3578, 7274, 7281, 7289, 7292, - 3529, 3531, 7295, 7300, 3539, 7303, 7306, 3531, 3559, 3565, - 7309,12593, 3555, 7312, 7315, 3592, 3607, 3605, 3620, 3609, - 3620, 3617, 3613, 3632, 3621, 3632, 7323, 3640, 3644, 3743, - 3642, 3652, 3650, 3663, 3828, 3660, 3680, 7331, 3676, 3672, - - 7334, 3670, 3680, 7337, 3707, 3721, 7342,12593, 7345, 7349, - 7357, 3719, 3721, 3792,12593, 3790,12593, 7363, 7366, 7369, - 3733, 3756, 3747, 3743, 3795, 7372, 7377, 3794, 7390, 3807, - 7393, 3856, 3906, 7404,12593, 7409,12593, 3796, 3799, 7412, - 3800, 7415, 7433, 7418, 7441, 7444, 3830, 3834, 3844, 3899, - 12593, 3905,12593, 7452, 3855, 7423, 3874, 7455,12593, 7459, - 7463, 7477, 7480, 7484, 7487,12593,12593, 7499, 7503, 7511, - 7517, 7520,12593, 7523, 7531, 7535, 3932, 3941, 3945, 7539, - 12593, 3870, 3890, 7542, 7550, 3898, 3911, 3924, 7554, 7558, - 4049, 4091, 3921, 3958, 3971, 3975, 3982, 4004, 3987, 4006, - - 4012, 4016, 4035, 7566, 3976, 3995, 3991, 3996, 4002, 3995, - 4004, 4023, 4023, 4035, 4035, 4028, 4031, 4051, 7572, 4041, - 4067, 7575, 7578, 4077, 7581,12593,12593, 7589,12593, 4078, - 7597,12593,12593, 7600, 7604, 7618, 4079, 4090, 4102, 7621, - 4096, 7627,12593,12593, 4121, 7639, 7643, 4112, 4148, 4147, - 4152, 4150, 4115, 7651, 7657, 7660, 7669, 7675,12593,12593, - 7683,12593, 7687,12593,12593, 4132, 4157, 4154,12593,12593, - 7695, 7698, 7706, 7709, 7713, 4452, 4613, 7727,12593, 7730, - 7733, 7736,12593,12593, 7752, 7755, 7763, 7766, 7774,12593, - 7777, 4195, 4199, 4242, 4145, 7781, 7784, 4163, 4167, 4189, - - 7787, 7798, 4203, 4207, 4310, 4208, 4212, 4322, 4187, 4242, - 4226, 4229, 4237,12593, 4268, 4256, 4256, 4263,12593, 7806, - 4256, 4265, 4253, 4267, 4276, 4281, 4282, 4295, 4282, 4302, - 4311, 4316, 4308, 7809, 4324, 7812, 7815, 7818, 7821, 7825, - 7830, 7844, 7852,12593,12593, 7860,12593, 4334, 4321, 7863, - 7866, 7872, 7884, 4336, 7887,12593,12593, 4336, 4368, 4360, - 4378, 4363, 4355, 7895, 7898, 7906,12593,12593, 7914, 7917, - 4344, 7925, 4362, 7928,12593,12593, 7936, 7939, 7947, 7950, - 4379, 4380, 4384, 4386, 4397, 4398, 7958, 7961, 7965, 4521, - 4540, 7973,12593,12593, 7981, 4424, 4435, 7984, 4400, 7834, - - 7987, 4388, 4403, 7990,12593,12593, 4451, 4439, 4443, 4461, - 4473, 4461, 4475, 4484, 8003, 4475, 4495, 4512, 4498, 4481, - 4513, 4528, 4516, 8006, 4472, 4475, 4491, 4539, 4548, 4503, - 4500, 4506, 4538, 4582, 4585, 4535, 4545, 8010, 8013, 8016, - 8025, 8021, 8034, 8040, 8048, 8052, 4549, 8060,12593,12593, - 4550, 4549, 8068, 8073, 8082,12593,12593, 8090, 8093, 4538, - 4546, 4581, 4587, 4597, 4600, 4595, 8101,12593,12593, 8109, - 12593,12593, 4603, 8117, 8120, 4584, 8128, 4636, 4643, 8136, - 4675, 4677, 4630, 4639, 4670, 4636, 4647, 4678, 8144, 8147, - 4674, 4679, 4677, 4683, 8150,12593, 4743, 8153, 8156, 8159, - - 8178, 8181, 8184, 8187, 4688, 4702, 4705, 4696, 4707, 4721, - 4724, 4713, 8190, 8193, 4726, 4735,12593, 4736, 4755, 4755, - 12593, 4757, 8201, 4735, 4726, 4790,12593,12593, 4754, 4754, - 4752, 4817,12593,12593, 4776, 8204, 8208, 8214,12593,12593, - 8222, 8225,12593,12593, 8234,12593,12593, 4772, 4786, 4787, - 8242,12593,12593, 8250,12593,12593, 8258, 4783, 4845, 4820, - 4851, 4823, 4806, 8261, 8264,12593,12593, 8272, 4833, 4846, - 4859, 4871, 4862, 4874, 4865, 4878, 4871, 4885,12593, 4878, - 4888,12593, 8279,12593, 8282, 4890, 4885, 4902, 4891, 4917, - 8285, 8291, 8304, 8335, 8382, 8312, 8315, 8318, 4917, 4938, - - 4939, 4910, 4927, 4948, 4950, 4920, 8323,12593,12593, 4956, - 4930, 4935, 4961, 4938, 4950, 8346, 4922, 4923,12593, 4940, - 4933, 4934,12593, 4945, 8355, 8358,12593, 4947, 4965, 4975, - 8361, 8365, 8373,12593, 5022,12593, 5020, 4971, 8393, 8402, - 8411, 8414, 5027, 4995, 5032, 5003, 5050, 5020, 5052, 5024, - 5058, 5060, 5068, 5070, 8422, 5074, 5045, 5078, 5055, 5084, - 8429, 5129, 5089, 8449, 8496, 5083,12593,12593, 5067, 5093, - 12593,12593, 5072,12593, 5116, 5120,12593, 5122, 5123, 8442, - 12593, 5172, 5085, 5141, 5182, 5107, 5159, 5118, 5140, 5121, - 8469, 5195, 5236, 8461, 8479,12593,12593, 5166, 8516,12593, - - 12593, 8524, 5239, 5281,12593, 5217,12593, 5224,12593, 5251, - 12593, 5249,12593,12593,12593,12593, 8487,12593,12593, 5238, - 12593, 5239, 5271, 5311, 5322, 5277, 5331, 5277, 8490, 5279, - 5273, 5294, 5293,12593,12593,12593,12593,12593, 5258, 5339, - 12593,12593, 5260, 5403,12593, 8532, 8535, 8542, 5344, 5320, - 5369, 5344, 8546,12593,12593, 8554, 5391, 5357, 5397, 5380, - 12593,12593,12593,12593, 5388, 5402, 8560, 5435, 5430, 5443, - 8563, 5450, 5441, 5455, 5449, 5410,12593, 5433, 5421,12593, - 5436, 8566, 8572, 8584, 8587, 8595, 8598, 5450, 5464, 5481, - 5477, 5489, 5502, 8606, 8609, 5485, 5494, 5511, 5494, 5503, - - 5525, 5513, 5514, 8617, 5537,12593, 5532,12593, 5534, 5505, - 5522, 5508, 5525, 8620,12593,12593, 8629,12593,12593, 8637, - 5567, 5581, 5547, 5556, 5554, 5566, 5572, 5574, 8645,12593, - 12593, 5585, 5590, 5589, 5598, 5604, 5600, 5637, 5635, 5630, - 12593, 5646, 5644, 5596, 5611, 5599, 5618, 5658, 5653, 5661, - 5656, 5656, 5669, 5670, 5667, 5674, 5674, 5688, 5705, 5710, - 5717, 5724, 5729,12593,12593, 5775,12593,12593, 5690, 5709, - 5699, 5715, 5734, 5755, 5742, 5768, 5754, 5759, 5777, 5776, - 5780, 5798, 5787, 5785, 5803, 5792, 5792, 5809, 5844, 5849, - 5850, 5850, 5852, 5826, 5833, 5835, 5851, 5873, 5874, 5908, - - 5891, 5882, 5911, 5906, 5897, 5929, 5915, 5905, 5944, 5981, - 12593,12593,12593,12593, 5933, 5958, 5970, 5978, 5999, 5976, - 12593, 6001, 5980,12593, 6012, 5987,12593, 6012, 6003,12593, - 6062, 6003, 6017, 6010, 6024,12593, 6024,12593, 6026,12593, - 6041,12593, 6044, 8655, 6046, 6068, 6050, 6068, 6043, 6050, - 6059, 6062, 8658, 6101,12593, 6103,12593, 6108, 6106, 6118, - 6117, 6130, 6148,12593,12593,12593,12593,12593,12593, 6107, - 6139, 6140, 6156, 6167, 6199, 6285, 6317, 6225, 6235, 6261, - 6264, 6132, 6310, 6145, 6283, 6196, 6255, 6288, 6340, 6164, - 6198, 6358, 6360, 6286, 6331, 6385, 6398, 6391, 6394, 6373, - - 6413, 6185, 6322, 6475, 6526, 6441, 6529, 6114, 6417, 6617, - 6624, 6552, 6610, 6416, 6544, 6559, 6588, 6618, 6649, 6312, - 6602, 6678, 6694, 6414, 6661, 6604, 6663, 6531, 6554, 6315, - 6656, 6675, 6688, 6566, 6636, 6722, 6724, 6664, 6733, 6743, - 6777, 6730, 6760, 6794, 6836, 6763, 6805, 6808, 6810, 6890, - 6977, 6442, 6902, 8666, 8669,12593,12593, 8689, 8698, 8707, - 8716, 8725, 8734, 8743, 8752, 8761, 8770, 8779, 8788, 8797, - 8806, 8815, 8824, 8833, 8842, 8851, 8860, 8869, 8878, 8887, - 8896, 8905, 8914, 8923, 8932, 8941, 8950, 8959, 8968, 8977, - 8986, 8995, 9004, 9013, 9022, 9031, 9040, 9049, 9058, 9067, - - 9076, 9085, 9094, 9103, 9112, 9121, 9130, 9139, 9148, 9157, - 9166, 9175, 9184, 9193, 9202, 9211, 9220, 9229, 9238, 9247, - 9254, 9261, 9268, 9275, 9282, 9289, 9296, 9303, 9310, 9317, - 9324, 9331, 9338, 9345, 9352, 9359, 9366, 9373, 9380, 9387, - 9394, 9401, 9408, 9415, 9422, 9429, 9436, 9443, 9450, 9459, - 9466, 9471, 9478, 9483, 9490, 9495, 9502, 9507, 9514, 9519, - 9526, 9531, 9538, 9543, 9550, 9555, 9562, 9567, 9574, 9579, - 9586, 9591, 9598, 9603, 9610, 9615, 9622, 9627, 9634, 9639, - 9646, 9651, 9658, 9663, 9670, 9675, 9682, 9687, 9694, 9699, - 9706, 9711, 9718, 9723, 9730, 9735, 9742, 9747, 9754, 9759, - - 9766, 9771, 9778, 9783, 9790, 9795, 9802, 9807, 9816, 9822, - 9829, 9837, 9844, 9852, 9859, 9867, 9874, 9882, 9889, 9897, - 9904, 9912, 9919, 9927, 9934, 9942, 9949, 9957, 9964, 9972, - 9979, 9987, 9994,10002,10009,10017,10024,10032,10040,10048, - 10055,10063,10070,10078,10085,10093,10100,10108,10116,10124, - 10132,10140,10147,10155,10163,10171,10179,10187,10194,10202, - 10209,10217,10225,10232,10240,10247,10255,10264,10270,10277, - 10285,10293,10301,10309,10317,10324,10332,10339,10347,10354, - 10362,10369,10377,10384,10392,10400,10408,10416,10424,10431, - 10439,10447,10455,10463,10471,10478,10486,10493,10501,10508, - - 10516,10523,10531,10538,10546,10553,10561,10568,10576,10583, - 10591,10598,10606,10614,10621,10629,10636,10644,10651,10659, - 10667,10674,10682,10689,10697,10706,10715,10722,10730,10738, - 10745,10753,10760,10768,10775,10783,10790,10797,10805,10812, - 10820,10827,10835,10842,10850,10857,10865,10873,10881,10888, - 10896,10904,10912,10919,10927,10934,10942,10949,10957,10964, - 10972,10979,10987,10994,11002,11009,11017,11025,11032,11040, - 11047,11055,11063,11071,11079,11087,11095,11103,11111,11120, - 11129,11136,11144,11152,11159,11167,11174,11182,11189,11197, - 11204,11211,11219,11226,11234,11241,11249,11257,11265,11272, - - 11280,11288,11295,11303,11311,11319,11326,11334,11341,11349, - 11356,11364,11371,11379,11386,11394,11402,11410,11417,11425, - 11433,11441,11449,11456,11464,11472,11480,11488,11496,11505, - 11514,11522,11530,11538,11545,11553,11560,11568,11576,11584, - 11592,11600,11608,11616,11624,11631,11639,11647,11654,11662, - 11669,11677,11685,11693,11700,11707,11715,11722,11730,11737, - 11744,11752,11759,11767,11774,11782,11790,11798,11805,11813, - 11821,11829,11837,11846,11855,11863,11871,11878,11885,11893, - 11901,11908,11916,11923,11931,11938,11946,11953,11961,11968, - 11976,11984,11991,11998,12006,12013,12021,12028,12035,12042, - - 12050,12057,12065,12073,12081,12089,12097,12105,12113,12121, - 12130,12139,12147,12155,12162,12170,12178,12185,12193,12200, - 12208,12216,12224,12231,12239,12246,12254,12262,12269,12276, - 12284,12292,12300,12307,12314,12322,12330,12338,12346,12354, - 12362,12370,12378,12386,12395,12404,12412,12419,12426,12434, - 12441,12449,12456,12464,12471,12479,12486,12493,12500,12508, - 12515,12522,12529,12538,12547,12556,12565,12574,12583 + 0, 0, 9426,12639,12639, 95, 100, 29, 41,12639, + 103, 51,12639,12639, 9415,12639,12639, 9404,12639, 9415, + 9415, 202,12639,12639,12639,12639, 9413, 9409, 9364, 153, + 12639, 161, 9390, 0, 145,12639, 9352,12639, 165, 3881, + + 73, 2599, 315, 357, 9392, 9339,12639, 168, 9378, 0, + 152,12639, 9340,12639, 261, 9384, 31,12639, 266, 9371, + 0, 245,12639, 9333, 9337, 9331, 421, 9336,12639, 269, + 9362, 0, 340,12639, 9324, 9324, 271, 9326, 238,12639, + 441, 484,12639, 504, 9350, 0, 401,12639, 9309, 9311, + 9297,12639, 561, 548,12639, 571, 9342, 0, 481,12639, + 9309, 9293,12639, 628, 3945, 9291, 163, 2533, 567, 206, + 38, 9342, 954, 2607, 639, 907, 437, 79,12639, 634, + 9329, 0, 546,12639, 9285, 9295, 9279, 9284,12639, 638, + 313, 559, 368,12639, 697, 9320, 0, 549,12639, 9286, + + 9266,12639, 704, 750,12639, 707, 9313, 0, 747,12639, + 9279, 9254,12639, 771, 758,12639, 774, 9306, 0, 748, + 12639, 9251, 9257, 9267, 251, 9246,12639, 831, 429, 9252, + 497,12639, 837, 9292, 0, 815,12639, 9239, 9243, 9253, + 8660,12639, 840, 530, 564,12639, 906, 8712, 0, 816, + 12639, 8681,12639, 914, 891,12639, 977, 8709, 0, 825, + 12639, 8665, 8675, 8662,12639, 981, 965,12639, 1021, 8705, + 0, 881,12639, 8654, 203, 8659, 8669, 970, 85, 429, + 972, 8656,12639, 1040, 814, 833,12639, 1044, 8691, 0, + 953,12639, 8639, 8656, 8651, 157, 8649, 8628,12639, 1048, + + 1092,12639, 1105, 8675, 0, 966,12639, 8620, 8618, 8624, + 8629, 8630, 8612, 8605,12639, 1108, 1093,12639, 1116, 8652, + 0, 1032,12639, 8599, 8599,12639, 1172, 1159,12639, 1175, + 8630, 0, 1033,12639, 8591, 8587, 8588,12639, 1179, 1226, + 12639, 1183, 8609, 0, 1095,12639, 8578, 8572, 8573, 15, + 12639, 1239, 899, 1074,12639, 1242, 8597, 0, 1167,12639, + 8549, 181,12639, 1246, 1242, 367, 303,12639, 1307, 8585, + 0, 1234,12639, 8537, 8527, 299,12639, 1310, 1310, 350, + 12639, 1313, 8572, 0, 1302,12639, 8529, 8533,12639, 1358, + 1363,12639, 1377, 8557, 0, 1362,12639, 8509, 8508,12639, + + 1383, 1430, 370,12639, 1425, 8549, 0, 1426,12639, 8501, + 8495, 8491,12639, 1442, 1436, 488,12639, 1448, 8534, 0, + 1432,12639, 8482, 8469, 8474, 8467, 8456,12639, 1509, 1445, + 560, 1103,12639, 1515, 8502, 0, 1494,12639, 8472,12639, + 1518, 1558,12639, 1521, 8499, 0, 1559,12639, 8453,12639, + 1579, 1141, 1344,12639, 1583, 8484, 0, 1567,12639, 8441, + 8443,12639, 1587, 1632,12639, 1590, 8468, 0, 1629,12639, + 8434, 8436,12639, 1645, 1633, 1707, 677, 8412,12639, 8472, + 8461,12639,12639,12639, 1700, 375, 8411, 8404, 8398, 8446, + 8404,12639, 0, 8389, 8390, 8413, 8377, 104, 1328, 8374, + + 8361, 8356, 8360, 621, 1646, 695, 8347, 8330, 1701, 912, + 8352, 1719, 8328, 1709, 8313, 1724, 1777, 1778,12639, 0, + 8318, 8319,12639, 0, 8315, 2098, 8307, 666, 8300, 8337, + 12639, 0, 8292, 2165, 8276, 8297, 8281, 8289, 8284, 8283, + 8258,12639, 0, 8270, 8255, 8267, 8235,12639, 0, 2232, + 8233, 8278, 8256, 172, 8230, 8229, 8229, 1788, 1171, 8216, + 1789, 8241, 707, 814, 841, 1022, 1577, 1913, 1639, 1179, + 12639, 0, 8216, 2289, 8225, 8201, 8200, 889,12639, 0, + 8203, 8196, 8197,12639, 0, 8185, 8181, 8182,12639, 0, + 8174, 826, 2596, 8151, 8151, 8167, 8158, 897,12639, 0, + + 8143, 8127, 2614, 8124, 8119,12639, 0, 8119, 8123,12639, + 0, 8102, 2656, 2666, 8116,12639, 0, 8121, 8114, 2674, + 8095, 2680, 8091, 8092, 8088, 8075, 8092, 8091, 8066, 8085, + 8079, 8072, 8061, 8072,12639, 0, 2721, 2724, 8050, 8042, + 8057, 8053, 8050, 8042,12639, 0, 8043, 8042, 8022, 2727, + 8016, 8007, 8028, 8002,12639, 0, 7982, 2730, 7977,12639, + 0, 7963, 2733, 7950, 7967,12639, 0, 7953, 2788, 7935, + 7953, 7943, 7931,12639, 0, 7913, 7929, 7909, 7903, 7910, + 12639, 0, 7890, 7908, 7900, 7889, 7926,12639, 0, 7874, + 2791, 7879,12639, 0, 7869, 7881, 7881,12639, 0, 7858, + + 7853, 7849, 7848,12639, 0, 7831, 7825, 7828, 7839, 7831, + 7791, 7787,12639, 0, 7789, 7796,12639, 0, 2794, 7792, + 12639, 0, 2797, 7782, 7760,12639, 0, 2800, 7763, 7752, + 7792, 7800, 1615, 7741,12639, 1970, 0, 7737, 7736, 7781, + 7779, 7731,12639, 7744, 7724, 2600, 2855, 1714, 7722, 7725, + 7710, 7723, 7702, 7708, 7699, 7689, 7704, 7683, 458, 7676, + 7689, 7684, 7669, 7668, 7656, 7661, 7669, 7655, 7653, 1990, + 7657, 7637, 7650, 7647, 7631, 7640, 7634, 2858, 2863, 7632, + 2866, 2048, 7627, 7658, 2869, 2914,12639, 7624, 2917, 2117, + 2924, 7614, 2927, 7611, 7615, 7617, 2920, 2983, 7603, 7610, + + 7610, 2969, 2972, 2975, 2184, 7587, 2979, 3037, 2363, 7596, + 7582, 7575, 7572, 7576, 7559, 7552, 7553, 2423, 7551, 7549, + 7529, 7528, 7514, 3040, 2550, 7528, 7526, 3044, 3047, 868, + 7525, 7501, 3050, 3103, 7513, 7508, 3106, 3114, 7503, 7492, + 7496, 3109, 2621, 7495, 7496, 7476, 3117, 3129, 1204, 7474, + 7486, 7459, 3170, 2685, 7472, 3173, 3180, 7470, 3183, 3242, + 7460, 3176, 2755, 3237, 2822, 3247, 3250, 7463, 1993, 3255, + 3002, 7462, 3305, 3069, 3308, 7457, 7439, 7449, 7443, 7439, + 7426, 7419, 7407, 7411, 7393, 3312, 3315, 3318, 3137, 3374, + 3204, 3377, 3384, 3397, 3387, 3453, 3443, 3467, 7397, 37, + + 7387, 3446, 3405, 3456, 7398, 7373, 3511, 3519, 7373, 3515, + 3474, 3522, 3525, 7386, 3571, 3574, 7375, 3582, 3625, 7372, + 3628, 3594, 7369, 7355, 7342, 3633, 3640, 3636, 3646, 3654, + 3696, 3704, 7346, 3699, 3709, 3723, 3770, 3766, 3775, 7350, + 3778, 3727, 3781, 3835, 3838, 3841, 3844, 3847, 3850, 3872, + 3875, 3878, 3885, 7351, 7312, 7318, 7322, 7308, 3893, 3897, + 7317, 7302, 3905, 3908, 3949, 3735, 3952, 3957, 3967, 3801, + 7300, 3977, 3987, 3980, 3912, 7299, 4012, 4015, 7346,12639, + 12639, 1141, 7275,12639, 7317, 7310, 7259,12639,12639, 7250, + 7245, 7248, 4019, 4022,12639, 4025, 1848, 7240, 7228, 7237, + + 7245, 7235, 7224, 7221, 2250, 7205, 7209, 7209, 7213, 7188, + 7185, 7176, 7173, 1450, 7187, 7170, 7167, 7181, 7167, 7168, + 2307, 7157, 7146, 7151, 7137, 1782, 7150, 4044, 4034, 4047, + 12639, 4053, 4056, 4062,12639,12639, 4077, 7170, 4080, 4083, + 12639, 4086, 7127, 4089,12639,12639, 4105, 4108, 4117, 4123, + 4128, 7131, 4141, 7129, 4144, 4147,12639, 4150, 7123, 4153, + 7121, 4159, 4171,12639, 4174, 4178,12639,12639, 7116, 4186, + 4193,12639, 4196, 7108, 7104, 7113, 2483, 7092, 7100, 2054, + 7088, 7088, 7101, 7089, 7069, 7063, 7076, 4199,12639,12639, + 7067, 4207, 4215, 4218,12639, 4225, 7073, 4228, 4237, 4240, + + 4246,12639, 4249, 4255, 4259, 4273, 4277,12639, 4280, 7041, + 7048, 4268, 4292,12639,12639, 7029, 7026, 7039, 4288, 4300, + 12639, 4303, 7018, 7016, 7021, 7018, 4307,12639,12639, 7039, + 4322, 4325,12639, 4329, 4332, 4335, 4354,12639, 4357, 4350, + 4362,12639,12639, 4376,12639,12639, 4384, 4387,12639, 4391, + 6992, 6979, 6997, 6985, 4394,12639,12639, 4406, 4410,12639, + 12639, 4418, 4425, 6971, 6984, 6967, 6974, 6966, 6941, 6936, + 6931, 6919, 637, 4436, 4439,12639, 4442, 4445,12639,12639, + 4461,12639,12639, 4469, 4472, 6909, 6916, 6921, 6900, 4480, + 4483,12639, 4487, 6896, 6891, 6878, 6893, 4490,12639,12639, + + 4502, 4506, 6878, 6866, 4514, 4520,12639, 4523, 6866, 4526, + 12639,12639, 4542, 4545,12639, 4548, 6841, 4551,12639,12639, + 6848, 4567, 4570,12639, 4575, 6830, 4579,12639,12639, 6838, + 6833, 6831, 4589, 4594,12639, 4598, 4601, 4604, 4619, 4625, + 6828, 4633, 4637,12639, 4641, 6819, 4644, 4662, 6801, 6732, + 4648, 4670, 6695, 4678, 4681,12639, 4684, 6689, 4687,12639, + 12639, 4703, 4709,12639, 4712, 4715, 4718, 4733, 4736, 4744, + 4751,12639, 4755, 4758, 4763, 6598, 6595, 4776, 4779, 4787, + 4790,12639, 4794, 6536, 4797, 6555, 6552, 6520, 4800, 4809, + 12639, 4819, 6517, 6481, 4822, 4828,12639, 4831, 4834,12639, + + 12639, 4842, 4850,12639, 4853, 4857,12639,12639, 6475, 4865, + 4872,12639, 4875, 4885,12639,12639, 6450, 4894, 4897,12639, + 4900, 1280, 4903,12639,12639, 6462, 6436, 6398, 6335, 4906, + 6250, 6247, 6246, 6167, 6159, 6038, 6019, 2492, 2495, 20, + 2559, 134, 249, 294, 2562, 345, 352, 2662, 383, 444, + 450, 497, 561, 580, 667, 697, 698, 2693, 744, 759, + 4909, 4927, 4937, 4940, 4944, 771, 802, 4952, 782, 4958, + 12639,12639, 4966, 4973, 4984,12639,12639, 981, 4992, 4996, + 978, 5004, 1032, 5010, 5013, 5023, 5028, 1059, 5031,12639, + 1093, 1179, 1165, 2763, 3010, 3077, 2830, 1200, 1239, 1229, + + 1230, 1246, 1265, 1259, 5034, 5041, 5055, 5063, 1264, 5066, + 5069, 1286, 5078, 5084, 5087, 1312, 5097, 1316, 1333, 5102, + 5105, 5116, 1370, 5120, 5123, 1364, 1368, 1379, 1392, 1403, + 5128, 5134, 5143, 5152, 5155, 5160, 5173, 1409, 5176, 1407, + 1446, 5179, 5183, 5197,12639,12639, 1449, 1477, 5205, 1471, + 1509, 1496, 1504, 1519, 1497, 1513, 1548, 5208, 5211,12639, + 12639, 5219, 5223, 5227, 5230, 5233, 1603, 5241, 1587, 1599, + 5248,12639,12639, 5259, 1625, 5262, 1639, 5265, 1640, 1649, + 5268, 1650, 1684, 1696, 5277, 5289, 5295,12639,12639, 5304, + 12639,12639, 1691, 5312, 3212, 5315,12639,12639, 1706, 1726, + + 5332,12639,12639, 1710, 5327, 1713, 5340, 5347,12639,12639, + 5355,12639,12639, 5363, 5366,12639,12639, 1715, 1734, 5375, + 12639,12639, 5383, 1729, 5389, 5392, 1736, 1762, 1779, 5402, + 1767, 5407, 5411, 5414, 5417, 5421, 5425, 5435, 1951, 1827, + 5443,12639, 1833,12639,12639, 1793, 1885, 5446, 1902, 1921, + 1917, 1919, 1936, 1937, 1959, 3275, 1969, 1985, 3279, 1987, + 1992, 3342, 1992, 3346, 1984, 1992, 3380, 2000, 3415, 2008, + 3482, 2026, 2035, 2051, 2054, 2056, 3450, 2043, 3666, 5455, + 12639,12639, 5467, 5470,12639,12639, 2067, 2087, 5479, 2060, + 5488,12639,12639, 2070, 5499,12639,12639, 2061, 5507, 2080, + + 5512, 2851, 3032, 5520, 5531, 5526, 2108, 2103, 2109, 2107, + 3486, 2115, 3589, 3796, 5539, 2122, 2118, 2124, 5545, 5548, + 2126, 5552, 5555, 5563,12639,12639, 5571, 2147, 5574,12639, + 12639, 2144, 5582, 5586,12639,12639, 5594, 5597, 2148, 2153, + 5606,12639,12639, 5619, 5622, 5630, 5633, 5637, 2176, 5651, + 3809, 2189, 5654, 5657, 5662, 5665, 5680,12639,12639, 5675, + 12639, 5688,12639,12639, 5696, 2189, 5699, 5702, 5717, 2175, + 5720,12639,12639, 2176, 2193, 5728, 5731, 5739, 2188, 2201, + 2200, 2218, 5746, 2238, 2240, 5749, 5752, 5757, 5770, 5773, + 5776, 5779, 2246, 5782, 5794, 5802, 2236, 5805, 5809, 2245, + + 5823, 2239, 5826, 2253, 2233, 5832, 2260, 2256, 2289, 5835, + 5847, 2298, 5855, 2287, 5858, 2304, 5861, 5864, 5867, 5870, + 2299, 5889, 5885, 5893, 5896, 5899, 2295, 5904,12639,12639, + 2305, 2308, 2301, 5914, 2318, 5919, 5922, 5938, 5941, 5944, + 5947, 5966, 5969, 5972, 5980, 2352, 2402, 2396,12639, 2338, + 5987, 5990, 2359, 2351, 2353, 2450, 2350, 2362, 3931, 2374, + 2379, 2405, 2411, 4652, 2421, 2412, 2415, 5037, 5993, 5999, + 2438, 6005, 2441, 6009, 6012, 2448, 2465, 2486, 2473, 6015, + 2491, 6018, 2498, 2536, 6021, 2532, 6024, 2539, 6027, 6030, + 2584, 2573, 2649, 2574, 2590, 2586, 2668, 2590, 6033,12639, + + 12639, 6042, 6048, 2575, 2569, 2716, 2575, 6052, 6055, 2608, + 2717, 2722, 6061, 6069,12639,12639, 6079, 2598, 2642, 6082, + 6089, 6092, 6101, 2617, 2643, 6108,12639,12639, 6116, 6120, + 6134, 2664, 2681, 2684, 6128,12639, 6142, 2687, 6149, 6152, + 6160, 6163, 6167, 6181, 6184, 2688, 6187,12639,12639, 6195, + 6203, 2693, 2703, 2703, 6213,12639,12639, 6221, 6224, 6235, + 2706, 2736, 2748, 6239, 6243, 2740, 2735, 6253, 6257,12639, + 12639, 6265, 6268, 6276, 6279, 6283, 6297, 2752, 6301,12639, + 12639, 6309, 6312, 2762, 6320,12639,12639, 2755, 6328,12639, + 2768, 6331, 2750, 6334, 6337, 2753, 6340, 2774, 6343, 2791, + + 2793, 2773, 6352,12639, 2794, 6358, 2795, 6361, 6364, 6372, + 6380, 2807, 6390, 2813, 6399, 6402, 6405, 6409, 6423, 6426, + 6434, 2815, 2818, 2817, 2833, 6437, 2829, 6442,12639,12639, + 6457, 6460, 6464,12639,12639, 6472,12639, 6479,12639,12639, + 6487, 2888, 2964, 2922, 2871, 6492, 6496, 6510, 6514, 2865, + 2882, 2898, 2878, 6517, 6520, 6523, 2883, 6529, 2885, 2882, + 2912, 2929, 6534, 6537, 6540, 6543, 2928, 6546, 6549, 6552, + 6555, 6558, 6561, 2930, 6564, 2940, 2952, 6567,12639, 2934, + 6570, 6576, 2953, 6590, 6593, 6596, 2972, 2970, 2970, 3010, + 3013, 3025, 3027, 3034, 3042, 3039, 6604, 6611, 6616, 6624, + + 3046, 3075, 3059, 3062, 6629, 6632, 6635, 6638, 3059, 6646, + 3070, 3090, 6649,12639, 6654,12639,12639, 6668, 3084, 3077, + 6672,12639,12639, 3163, 3164, 3087, 3095, 6680,12639,12639, + 6688, 6691, 3120, 6699,12639,12639, 6707, 6710, 3134, 6713, + 12639,12639, 3139, 3144, 3161, 6722,12639,12639, 6730, 6733, + 3159, 3148, 3173, 6741,12639,12639, 3193, 6749, 6752, 6755, + 12639,12639, 6767, 6771, 6779,12639,12639, 6787, 3183, 6790, + 12639,12639, 3179, 3195, 3193, 6799, 3209, 6802, 6806, 6820, + 3210, 6823, 6826, 3214, 3205, 3298, 3299, 3212, 3224, 6834, + 12639, 3238, 6841,12639,12639, 6854,12639,12639, 3272, 6849, + + 3266, 6863, 6868, 6871,12639,12639, 6883,12639,12639, 6891, + 6895, 6901, 6905, 6913, 6919, 3261, 6923, 6926, 6931, 6938, + 3322, 3353, 6934, 6946,12639,12639, 6957, 6960, 6963, 6966, + 3270, 3270, 6976, 6979, 3282, 6985, 6988, 3304, 6994, 6997, + 7000, 7003, 3306, 3330, 7006, 7009, 7012, 7017, 3332, 7020, + 3327,12639, 7023, 7026,12639,12639, 7034, 7041,12639, 7045, + 12639,12639, 3377, 3364, 3379, 3378, 3386, 3388, 3375, 3417, + 3429, 3436, 7053, 7056, 7039, 7043, 7073, 7080, 3398, 3397, + 3414, 7084, 3406, 7087,12639,12639, 3406, 7095, 3419, 7101, + 7104, 3463, 3479, 3506, 3529, 3509, 3531, 3488, 7107, 7119, + + 12639,12639, 3470, 7110, 7115, 3487, 3491, 3490, 3521, 7130, + 12639,12639, 7142, 3501, 3517, 3518, 7145, 7149, 7163, 7166, + 12639,12639, 7176, 3525, 3534, 3536, 3546, 7182,12639, 7185, + 7188,12639,12639, 7196, 7203, 7206,12639,12639, 7215, 7221, + 3574, 3598, 3594, 3624, 7224, 3585, 7138, 3592, 7227, 7233, + 7242, 7251, 7254, 7257, 7261, 7276, 7279, 7283, 7286, 7297, + 7305, 7308,12639, 7313, 7317, 3639, 3647, 7320, 7327, 7336, + 7339, 3583, 3586, 7342, 7346, 3597, 7349, 7352, 3590, 3602, + 3604, 7355,12639, 3598, 7358, 7361, 3615, 3662, 3661, 3675, + 3669, 3681, 3677, 3675, 3699, 3687, 3702, 7380, 3683, 3714, + + 3727, 3712, 3731, 3730, 3736, 3796, 3731, 3749, 7383, 3745, + 3741, 7386, 3785, 3795, 7389, 3799, 7392, 7395, 7403, 3798, + 3801, 3864,12639, 3862,12639, 7410, 7413, 3809, 7416,12639, + 7423, 3815, 3836, 3828, 3833, 3857, 7428, 7431, 3859, 7442, + 3869, 7446, 3900, 3935, 7456,12639, 7460,12639, 3855, 3859, + 7464, 3862, 7467, 7475, 7470, 7485, 7489, 3889, 3884, 3886, + 3958,12639, 3956,12639, 7497, 3913, 7503, 3916, 7506,12639, + 7509, 7515, 7527, 7530, 7534, 7537,12639,12639, 7549, 7553, + 7561, 7567, 7570,12639, 7573, 7581, 7585, 3973, 3983, 3967, + 7589,12639, 3909, 3932, 7592, 7600, 3924, 3939, 3945, 7604, + + 7608, 4006, 4080, 3941, 3978, 3988, 4010, 4021, 4046, 4031, + 4040, 4045, 4048, 4063, 7616, 4007, 4019, 4031, 4037, 4037, + 4031, 4033, 4055, 4053, 4062, 4061, 4058, 4060, 4080, 7622, + 4074, 4086, 7625, 7628, 7631,12639,12639, 7639,12639, 4068, + 7647,12639,12639, 7650, 7654, 4105, 7668, 4086, 4101, 4107, + 7671, 4100, 7677,12639,12639, 4112, 7689, 7693, 4103, 4150, + 4149, 4153, 4156, 4120, 7701, 7707, 7710, 7719, 7725,12639, + 12639, 7733,12639, 7737,12639,12639, 4147, 4154, 4157,12639, + 12639, 7745, 7748, 7756, 7759, 7763, 4305, 4425, 7777,12639, + 7780, 7783, 7786,12639,12639, 7802, 7805, 7813, 7816, 7824, + + 12639, 7827, 4205, 4253, 4279, 4147, 7831, 7834, 4171, 4182, + 4183, 7837, 7848, 4198, 4201, 4233, 4208, 4228, 4328, 4203, + 4242, 4243, 4267, 4272,12639, 4292, 4277, 4276, 4280,12639, + 7856, 4276, 4285, 4274, 4302, 4314, 4323, 4306, 4316, 4303, + 4321, 4330, 4335, 4331, 7859, 4348, 7862, 7865, 7868, 7871, + 7875, 7880, 7893,12639,12639, 7901, 7904,12639, 4354, 4342, + 7908, 7911, 7919, 7914, 4355, 7932,12639,12639, 4362, 4395, + 4380, 4401, 4386, 4382, 7940, 7943, 7951,12639,12639, 7959, + 7962, 4372, 7970, 4382, 7973,12639,12639, 7981, 7984, 7992, + 7995, 4399, 4400, 4415, 4417, 4419, 4420, 8003, 8006, 8010, + + 4476, 4495, 8018,12639,12639, 8026, 4493, 4511, 8029, 4408, + 8032, 8035, 4400, 4401, 8038,12639,12639, 4455, 4444, 4445, + 4467, 4475, 4463, 4467, 4491, 8048, 4496, 4516, 4533, 4519, + 4502, 4534, 4549, 4537, 8051, 4495, 4497, 4515, 4569, 4574, + 4524, 4518, 4522, 4542, 4590, 4602, 4552, 4562, 8055, 8058, + 8061, 8070, 8066, 8079, 8085, 4562, 8097,12639,12639, 8093, + 8105, 4565, 4564, 8113, 8118, 8127,12639,12639, 8135, 8138, + 4552, 4564, 4592, 4592, 4602, 4608, 4604, 8146,12639,12639, + 8154,12639,12639, 4606, 8162, 8165, 4589, 8173, 4657, 4664, + 8181, 4696, 4698, 4626, 4635, 4669, 4634, 4643, 4685, 8189, + + 8192, 4665, 4671, 4670, 4677, 8195,12639, 4764, 8198, 8201, + 8204, 8223, 8226, 8229, 8232, 4673, 4699, 4701, 4689, 4695, + 4718, 4724, 4712, 8235, 8238, 4727, 4733,12639, 4738, 4741, + 4743,12639, 4746, 8246, 4733, 4719, 4799,12639,12639, 4754, + 4755, 4741, 4806,12639,12639, 4765, 8249, 8253, 8259,12639, + 12639, 8267, 8270,12639,12639, 4770, 8279,12639,12639, 4771, + 4784, 8287,12639,12639, 8295,12639,12639, 8303, 4780, 4843, + 4811, 4855, 4826, 4814, 8306, 8309,12639,12639, 8317, 4836, + 4854, 4845, 4857, 4848, 4864, 4857, 4890, 4883, 4893,12639, + 4886, 4896,12639, 8324,12639, 8327, 4899, 4888, 4906, 4895, + + 4915, 8330, 8336, 8349, 8380, 8427, 8357, 8360, 8363, 4912, + 4939, 4943, 4911, 4933, 4954, 4956, 4926, 8368,12639,12639, + 4965, 4940, 4947, 4972, 4950, 4951, 8391, 4923, 4925,12639, + 4935, 4935, 4938,12639, 4952, 8400, 8403,12639, 4950, 4958, + 4969, 8406, 8410, 8418,12639, 5015,12639, 5014, 4968, 8438, + 8447, 8456, 8459, 5040, 5008, 5040, 5011, 5046, 5015, 5046, + 5023, 5057, 5068, 5067, 5068, 8467, 5078, 5052, 5085, 5055, + 5095, 8474, 5096, 5124, 8494, 8541, 5083,12639,12639, 5072, + 5098,12639,12639, 5075,12639, 5122, 5128,12639, 5132, 5133, + 8487,12639, 5191, 5101, 5145, 5156, 5118, 5161, 5118, 5120, + + 5111, 8514, 5163, 5220, 8506, 8524,12639,12639, 5135, 8561, + 12639,12639, 8569, 5247, 5250,12639, 5190,12639, 5196,12639, + 5210,12639, 5209,12639,12639,12639,12639, 8532,12639,12639, + 5197,12639, 5218, 5285, 5267, 5235, 5242, 5274, 5249, 8535, + 5269, 5274, 5288, 5285,12639,12639,12639,12639,12639, 5244, + 5316,12639,12639, 5252, 5328,12639, 8577, 8580, 8587, 5304, + 5294, 5332, 5310, 8591,12639,12639, 8599, 5333, 5333, 5341, + 5342,12639,12639,12639,12639, 5338, 5350, 8605, 5383, 5376, + 5391, 8608, 5396, 5385, 5421, 5411, 5372,12639, 5391, 5379, + 12639, 5394, 8611, 8617, 8629, 8632, 8640, 8643, 5411, 5419, + + 5432, 5416, 5427, 5440, 8651, 8654, 5425, 5434, 5453, 5437, + 5445, 5462, 5446, 5449, 8662, 5473,12639, 5461,12639, 5464, + 5438, 5455, 5441, 5461, 8665,12639,12639, 8674,12639,12639, + 8682, 5492, 5499, 5480, 5487, 5487, 5507, 5512, 5515, 8690, + 12639,12639, 5523, 5529, 5525, 5531, 5548, 5544, 5581, 5584, + 5574,12639, 5597, 5595, 5537, 5551, 5547, 5562, 5605, 5600, + 5608, 5613, 5614, 5620, 5621, 5618, 5626, 5636, 5640, 5647, + 5648, 5645, 5655, 5661,12639,12639, 5668,12639,12639, 5626, + 5643, 5642, 5657, 5672, 5691, 5675, 5695, 5690, 5687, 5713, + 5702, 5704, 5721, 5720, 5721, 5739, 5730, 5727, 5745, 5770, + + 5781, 5782, 5782, 5784, 5757, 5764, 5777, 5778, 5793, 5783, + 5816, 5797, 5794, 5823, 5814, 5805, 5838, 5819, 5810, 5839, + 5894,12639,12639,12639,12639, 5825, 5850, 5847, 5855, 5878, + 5852,12639, 5885, 5871,12639, 5921, 5896,12639, 5921, 5899, + 12639, 5945, 5898, 5911, 5917, 5930,12639, 5931,12639, 5933, + 12639, 5934,12639, 5936, 8700, 5938, 5971, 5954, 5976, 5943, + 5960, 5961, 6004, 8703, 6054,12639, 6052,12639, 6060, 6059, + 6063, 6065, 6057, 6059,12639,12639,12639,12639,12639,12639, + 6107, 6113, 6127, 6152, 6077, 6096, 6158, 6215, 6137, 6180, + 6182, 6191, 6198, 6209, 6193, 6231, 6067, 6119, 6087, 6242, + + 6228, 6305, 6233, 6338, 6212, 6365, 6282, 6370, 6359, 6376, + 6105, 6255, 6357, 6423, 6367, 6427, 6379, 6401, 6157, 6396, + 6467, 6486, 6451, 6452, 6307, 6403, 6509, 6557, 6589, 6639, + 6271, 6435, 6570, 6653, 6591, 6623, 6563, 6596, 6667, 6686, + 6601, 6698, 6647, 6709, 6701, 6718, 6665, 6721, 6767, 6775, + 6743, 6777, 6726, 6764, 6800, 6828, 6794, 6797, 6793, 6811, + 6839, 6844, 6856, 6080, 8711, 8714,12639,12639, 8734, 8743, + 8752, 8761, 8770, 8779, 8788, 8797, 8806, 8815, 8824, 8833, + 8842, 8851, 8860, 8869, 8878, 8887, 8896, 8905, 8914, 8923, + 8932, 8941, 8950, 8959, 8968, 8977, 8986, 8995, 9004, 9013, + + 9022, 9031, 9040, 9049, 9058, 9067, 9076, 9085, 9094, 9103, + 9112, 9121, 9130, 9139, 9148, 9157, 9166, 9175, 9184, 9193, + 9202, 9211, 9220, 9229, 9238, 9247, 9256, 9265, 9274, 9283, + 9292, 9299, 9306, 9313, 9320, 9327, 9334, 9341, 9348, 9355, + 9362, 9369, 9376, 9383, 9390, 9397, 9404, 9411, 9418, 9425, + 9432, 9439, 9446, 9453, 9460, 9467, 9474, 9481, 9488, 9495, + 9504, 9511, 9516, 9523, 9528, 9535, 9540, 9547, 9552, 9559, + 9564, 9571, 9576, 9583, 9588, 9595, 9600, 9607, 9612, 9619, + 9624, 9631, 9636, 9643, 9648, 9655, 9660, 9667, 9672, 9679, + 9684, 9691, 9696, 9703, 9708, 9715, 9720, 9727, 9732, 9739, + + 9744, 9751, 9756, 9763, 9768, 9775, 9780, 9787, 9792, 9799, + 9804, 9811, 9816, 9823, 9828, 9835, 9840, 9847, 9852, 9861, + 9867, 9874, 9882, 9889, 9897, 9904, 9912, 9919, 9927, 9934, + 9942, 9949, 9957, 9964, 9972, 9979, 9987, 9994,10002,10009, + 10017,10024,10032,10039,10047,10054,10062,10069,10077,10085, + 10093,10100,10108,10115,10123,10130,10138,10145,10153,10161, + 10169,10177,10185,10192,10200,10208,10216,10224,10232,10239, + 10247,10254,10262,10270,10277,10285,10292,10300,10309,10315, + 10322,10330,10338,10346,10354,10362,10369,10377,10384,10392, + 10399,10407,10414,10422,10430,10438,10446,10454,10461,10469, + + 10476,10484,10492,10500,10508,10516,10523,10531,10538,10546, + 10553,10561,10568,10576,10583,10591,10598,10606,10613,10621, + 10628,10636,10643,10651,10659,10666,10674,10681,10689,10696, + 10704,10712,10719,10727,10734,10742,10751,10760,10767,10775, + 10783,10790,10798,10805,10813,10820,10828,10835,10842,10850, + 10857,10865,10872,10880,10887,10895,10902,10910,10918,10926, + 10933,10941,10949,10957,10964,10972,10979,10987,10994,11002, + 11009,11017,11024,11032,11039,11047,11054,11062,11070,11077, + 11085,11092,11100,11108,11116,11124,11132,11140,11148,11156, + 11165,11174,11181,11189,11197,11204,11212,11219,11227,11234, + + 11242,11249,11256,11264,11271,11279,11287,11295,11302,11310, + 11318,11326,11334,11341,11349,11357,11365,11372,11380,11387, + 11395,11402,11410,11417,11425,11432,11440,11448,11456,11463, + 11471,11479,11487,11495,11502,11510,11518,11526,11534,11542, + 11551,11560,11568,11576,11584,11591,11599,11606,11614,11622, + 11630,11638,11646,11654,11661,11669,11677,11684,11692,11700, + 11708,11715,11723,11731,11739,11746,11753,11761,11768,11776, + 11783,11790,11798,11805,11813,11820,11828,11836,11844,11851, + 11859,11867,11875,11883,11892,11901,11909,11917,11924,11931, + 11939,11947,11954,11962,11969,11977,11984,11991,11999,12007, + + 12014,12022,12030,12037,12044,12052,12059,12067,12074,12081, + 12088,12096,12103,12111,12119,12127,12135,12143,12151,12159, + 12167,12176,12185,12193,12201,12208,12216,12224,12231,12239, + 12247,12255,12262,12269,12277,12285,12292,12300,12308,12315, + 12322,12330,12338,12346,12353,12360,12368,12376,12384,12392, + 12400,12408,12416,12424,12432,12441,12450,12458,12465,12472, + 12480,12487,12495,12503,12510,12517,12525,12532,12539,12546, + 12554,12561,12568,12575,12584,12593,12602,12611,12620,12629 } ; -static yyconst flex_int16_t yy_def[3970] = +static yyconst flex_int16_t yy_def[3981] = { 0, - 3458, 3458, 3459, 3459, 3459, 3459, 3460, 3460, 3461, 3461, - 3462, 3462, 3463, 3463, 3463, 3463, 3464, 3464, 3458, 3458, - 3465, 3465, 3466, 3466, 3466, 3466, 3458, 3458, 3466, 3466, - 3466, 3466, 3458, 3458, 3466, 3466, 3458, 3458, 3466, 3466, - 3466, 3466, 3467, 3467, 3468, 3468, 3458, 3458, 3468, 3468, - 3468, 3468, 3469, 3469, 3463, 3463, 3470, 3470, 3471, 3471, - 3472, 3472, 3473, 3473, 3474, 3474, 3475, 3475, 3475, 3475, - 3458, 3458, 3475, 3475, 3475, 3475, 3458, 3458, 3475, 3475, - 3475, 3475, 3458, 3458, 3475, 3475, 3458, 3458, 3475, 3475, - 3475, 3475, 3458, 3458, 3475, 3475, 3458, 3458, 3475, 3475, - - 3475, 3475, 3476, 3476, 3477, 3477, 3458, 3458, 3477, 3477, - 3477, 3477, 3478, 3478, 3479, 3479, 3458, 3458, 3479, 3479, - 3479, 3479, 3480, 3480, 3481, 3481, 3482, 3482, 3483, 3483, - 3484, 3484, 3485, 3485, 3458, 3458, 3485, 3485, 3485, 3485, - 3486, 3486, 3487, 3487, 3488, 3488, 3489, 3489, 3457, 149, - 3490, 3490, 3458, 3458, 3490, 3490, 3490, 3490, 3491, 3491, - 3492, 3492, 3493, 3493, 3494, 3494, 3495, 3495, 3496, 3496, - 3497, 3497, 3498, 3498, 3499, 3499, 3500, 3500, 3458, 3458, - 3500, 3500, 3500, 3500, 3501, 3501, 3502, 3502, 3458, 3458, - 3502, 3502, 3502, 3502, 3503, 3503, 3504, 3504, 3458, 3458, - - 3504, 3504, 3504, 3504, 3505, 3505, 3506, 3506, 3507, 3507, - 3508, 3508, 3458, 3458, 3508, 3508, 3508, 3508, 3509, 3509, - 3510, 3510, 3458, 3458, 3510, 3510, 3510, 3510, 3511, 3511, - 3512, 3512, 3458, 3458, 3512, 3512, 3512, 3512, 3513, 3513, - 3514, 3514, 3515, 3515, 3516, 3516, 3458, 3458, 3516, 3516, - 3516, 3516, 3517, 3517, 3518, 3518, 3519, 3519, 3520, 3520, - 3458, 3458, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3521, 3457, 3457, 3521, 3457, 3457, 3457, - - 300, 300, 302, 300, 303, 303, 3457, 3457, 3457, 3522, - 3457, 3457, 3522, 3457, 3457, 304, 303, 3457, 3457, 3457, - 3523, 3457, 3457, 3523, 3523, 3523, 3457, 3457, 3457, 3457, - 3457, 3524, 3457, 3457, 3524, 3524, 3524, 3524, 3524, 3457, - 3457, 3457, 3457, 3457, 3457, 3525, 3457, 3457, 3525, 3525, - 3525, 3457, 3457, 3457, 3457, 3457, 3457, 3526, 3457, 3457, - 3526, 3526, 3457, 3457, 3457, 365, 303, 303, 304, 369, - 368, 368, 368, 368, 369, 375, 373, 373, 3457, 3457, - 3457, 3527, 3457, 3457, 3527, 3527, 3527, 3527, 3457, 3457, - 303, 303, 303, 3457, 3457, 3457, 3528, 3457, 3457, 3528, - - 3528, 3528, 3457, 3457, 303, 303, 3457, 3457, 3457, 3529, - 3457, 3457, 3529, 3529, 3457, 3457, 3457, 3457, 3457, 3457, - 3530, 3457, 3457, 3530, 3530, 3457, 3457, 3457, 3457, 3457, - 3457, 3531, 3457, 3457, 3531, 3531, 3531, 3531, 3531, 3457, - 3457, 392, 392, 303, 3457, 3457, 3457, 3532, 3457, 3457, - 3532, 3457, 3457, 3457, 3457, 3457, 3457, 3533, 3457, 3457, - 3533, 3533, 3533, 3457, 3457, 3457, 3457, 3457, 3457, 3534, - 3457, 3457, 3534, 3534, 3534, 3534, 3534, 3534, 3534, 3534, - 3534, 3457, 3457, 303, 303, 3457, 3457, 3457, 3535, 3457, - 3457, 3535, 3535, 3535, 3535, 3535, 3535, 3457, 3457, 3457, - - 3457, 3457, 3457, 3536, 3457, 3457, 3536, 3536, 3536, 3536, - 3536, 3536, 3536, 3457, 3457, 3457, 3457, 3457, 3457, 3537, - 3457, 3457, 3537, 3537, 3457, 3457, 3457, 3457, 3457, 3457, - 3538, 3457, 3457, 3538, 3538, 3538, 3457, 3457, 3457, 3457, - 3457, 3457, 3539, 3457, 3457, 3539, 3539, 3539, 3539, 3457, - 3457, 303, 303, 3457, 3457, 3457, 3540, 3457, 3457, 3540, - 3540, 3457, 3457, 303, 373, 373, 3457, 3457, 3457, 3541, - 3457, 3457, 3541, 3541, 3541, 3457, 3457, 373, 373, 3457, - 3457, 3457, 3542, 3457, 3457, 3542, 3542, 3457, 3457, 3457, - 3457, 3457, 3457, 3543, 3457, 3457, 3543, 3543, 3457, 3457, - - 373, 373, 3457, 3457, 3457, 3544, 3457, 3457, 3544, 3544, - 3544, 3457, 3457, 373, 373, 3457, 3457, 3457, 3545, 3457, - 3457, 3545, 3545, 3545, 3545, 3545, 3457, 3457, 303, 392, - 303, 3457, 3457, 3457, 3546, 3457, 3457, 3546, 3457, 3457, - 3457, 3457, 3457, 3457, 3547, 3457, 3457, 3547, 3457, 3457, - 303, 303, 3457, 3457, 3457, 3548, 3457, 3457, 3548, 3548, - 3457, 3457, 3457, 3457, 3457, 3457, 3549, 3457, 3457, 3549, - 3549, 3457, 3457, 3457, 3457, 3550, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3551, 3551, 3552, 3457, 3457, 3457, 3457, 3457, 3457, - - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3553, 3553, - 3554, 3457, 3555, 3555, 3555, 3555, 3457, 3556, 3457, 3457, - 3557, 3557, 3557, 3557, 3557, 3557, 3557, 3557, 3557, 3558, - 3457, 3559, 3559, 3559, 3559, 3560, 3457, 3561, 3561, 3561, - 3562, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3563, 3563, 3563, 3563, 3563, 3564, 3457, 3457, 3565, 3565, - 3565, 3565, 3566, 3457, 3567, 3567, 3567, 3568, 3457, 3569, - 3569, 3569, 3570, 3457, 3571, 3571, 3571, 3571, 3571, 3571, - - 3571, 3572, 3457, 3457, 3573, 3573, 3574, 3457, 3575, 3575, - 3575, 3575, 3576, 3457, 3577, 3577, 3577, 3577, 3577, 3577, - 3577, 3577, 3577, 3577, 3577, 3577, 3577, 3577, 3577, 3577, - 3577, 3578, 3457, 3579, 3579, 3579, 3579, 3579, 3579, 3579, - 3579, 3580, 3457, 3581, 3581, 3581, 3581, 3581, 3581, 3581, - 3581, 3582, 3457, 3583, 3583, 3583, 3584, 3457, 3585, 3585, - 3585, 3585, 3586, 3457, 3587, 3587, 3587, 3587, 3587, 3587, - 3588, 3457, 3589, 3589, 3589, 3589, 3590, 3457, 3457, 3591, - 3591, 3591, 3591, 3591, 3592, 3457, 3593, 3593, 3593, 3594, - 3457, 3595, 3595, 3595, 3596, 3457, 3597, 3597, 3597, 3597, - - 3598, 3457, 3599, 3599, 3599, 3599, 3599, 3599, 3600, 3457, - 3457, 3601, 3601, 3602, 3457, 3603, 3603, 3604, 3457, 3605, - 3605, 3605, 3606, 3457, 3607, 3607, 3607, 3608, 3609, 3457, - 3609, 3457, 3457, 3457, 3610, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3611, 3612, 3612, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3613, 3614, 3614, 3615, 3457, 3457, - 3615, 3457, 3616, 3616, 3457, 3617, 3457, 3457, 3617, 3617, - 3617, 3617, 3617, 3617, 3618, 3618, 3619, 3619, 3619, 3620, - - 3620, 3457, 3457, 3621, 3622, 3622, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3623, 3457, 3457, 3623, 3623, 3624, 3624, 3457, 3625, 3457, - 3457, 3625, 3626, 3626, 3627, 3627, 3628, 3628, 3629, 3629, - 3630, 3630, 3631, 3631, 3631, 3457, 3457, 3631, 3631, 3631, - 3632, 3632, 3457, 3457, 3633, 3634, 3634, 3635, 3457, 3457, - 3457, 3457, 3636, 3636, 3637, 3637, 3457, 3457, 3637, 3457, - 3457, 3637, 3637, 3637, 3637, 3637, 3637, 3637, 3637, 3637, - 3637, 3637, 3638, 3638, 3457, 3457, 3457, 3457, 3639, 3639, - 3639, 3639, 3639, 3640, 3640, 3641, 3641, 3641, 3457, 3457, - - 3641, 3641, 3641, 3642, 3642, 3643, 3457, 3457, 3644, 3644, - 3645, 3457, 3457, 3645, 3646, 3646, 3647, 3457, 3457, 3647, - 3647, 3647, 3648, 3648, 3649, 3649, 3649, 3650, 3650, 3457, - 3651, 3651, 3651, 3651, 3652, 3652, 3653, 3457, 3457, 3654, - 3654, 3655, 3655, 3656, 3656, 3657, 3657, 3657, 3658, 3658, - 3659, 3659, 3659, 3659, 3659, 3660, 3660, 3457, 3661, 3662, - 3662, 3457, 3457, 3663, 3663, 3457, 3457, 3664, 3665, 3665, - 3457, 3457, 3666, 3667, 3667, 3668, 3457, 3457, 3668, 3457, - 3457, 3669, 3457, 3457, 3457, 3457, 3457, 3457, 3670, 3457, - 3671, 3457, 3671, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3672, 3457, 3673, 3457, 3673, 3674, - 3457, 3457, 3457, 3674, 3457, 3457, 3675, 3457, 3675, 3676, - 3457, 3457, 3457, 3457, 3457, 3676, 3457, 3457, 3676, 3676, - 3676, 3457, 3677, 3457, 3677, 3678, 3678, 3678, 3457, 3679, - 3457, 3679, 3457, 3457, 3457, 3680, 3457, 3681, 3457, 3681, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3682, 3457, 3457, 3457, 3682, 3682, 3457, - 3683, 3457, 3683, 3457, 3684, 3457, 3457, 3457, 3684, 3457, - - 3685, 3457, 3685, 3686, 3686, 3457, 3687, 3457, 3687, 3688, - 3688, 3457, 3689, 3457, 3689, 3690, 3690, 3690, 3457, 3457, - 3457, 3690, 3690, 3690, 3457, 3691, 3457, 3691, 3457, 3457, - 3692, 3457, 3693, 3457, 3693, 3694, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3695, 3457, 3695, 3696, 3696, 3696, 3696, - 3457, 3457, 3457, 3696, 3457, 3457, 3457, 3457, 3457, 3696, - 3696, 3696, 3696, 3696, 3696, 3696, 3696, 3696, 3696, 3457, - 3697, 3457, 3697, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3698, 3698, 3698, 3698, 3457, 3699, 3457, 3699, 3700, - 3700, 3700, 3700, 3457, 3457, 3457, 3457, 3457, 3700, 3700, - - 3457, 3701, 3457, 3701, 3702, 3457, 3457, 3457, 3457, 3703, - 3457, 3703, 3704, 3457, 3457, 3457, 3704, 3457, 3705, 3457, - 3705, 3706, 3457, 3457, 3457, 3706, 3706, 3706, 3457, 3707, - 3457, 3707, 3457, 3457, 3457, 3457, 3708, 3457, 3709, 3457, - 3709, 3457, 3457, 3457, 3710, 3710, 3457, 3457, 3710, 3457, - 3711, 3457, 3711, 3712, 3457, 3457, 3457, 3457, 3713, 3457, - 3713, 3457, 3457, 3457, 3457, 3457, 3714, 3457, 3714, 3457, - 3457, 3715, 3715, 3457, 3457, 3457, 3716, 3457, 3716, 3717, - 3717, 3717, 3717, 3717, 3457, 3718, 3457, 3718, 3457, 3719, - 3457, 3720, 3457, 3720, 3457, 3457, 3457, 3457, 3721, 3457, - - 3721, 3457, 3457, 3457, 3722, 3457, 3723, 3457, 3723, 3457, - 3457, 3457, 3724, 3457, 3725, 3457, 3725, 3726, 3727, 3457, - 3457, 3457, 3457, 3457, 3728, 3729, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3730, 3457, - 3457, 3731, 3457, 3732, 3733, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3733, 3457, 3457, 3733, 3734, 3735, 3457, - 3457, 3735, 3736, 3737, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3738, - - 3738, 3457, 3457, 3739, 3457, 3740, 3740, 3741, 3457, 3457, - 3742, 3743, 3457, 3457, 3744, 3745, 3746, 3746, 3457, 3457, - 3746, 3746, 3746, 3747, 3457, 3457, 3457, 3457, 3748, 3457, - 3457, 3749, 3750, 3750, 3750, 3750, 3457, 3457, 3457, 3457, - 3457, 3750, 3750, 3750, 3750, 3750, 3750, 3750, 3750, 3750, - 3750, 3750, 3751, 3457, 3457, 3457, 3752, 3752, 3752, 3752, - 3753, 3754, 3754, 3754, 3754, 3457, 3457, 3457, 3754, 3754, - 3755, 3756, 3757, 3758, 3758, 3759, 3760, 3760, 3760, 3760, - 3761, 3457, 3457, 3457, 3457, 3457, 3457, 3762, 3763, 3457, - 3457, 3457, 3457, 3764, 3764, 3457, 3457, 3457, 3764, 3765, - - 3766, 3767, 3457, 3457, 3457, 3457, 3457, 3457, 3768, 3457, - 3457, 3457, 3769, 3769, 3457, 3457, 3457, 3770, 3771, 3457, - 3457, 3771, 3771, 3771, 3772, 3457, 3773, 3774, 3775, 3776, - 3777, 3778, 3779, 3780, 3781, 3781, 3457, 3781, 3457, 3457, - 3457, 3782, 3783, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3784, 3457, 3457, - 3457, 3785, 3457, 3786, 3787, 3457, 3457, 3457, 3787, 3457, - 3457, 3457, 3787, 3788, 3789, 3457, 3457, 3457, 3457, 3457, - - 3790, 3791, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3792, 3457, 3457, 3457, 3457, - 3457, 3793, 3457, 3794, 3794, 3795, 3457, 3457, 3457, 3796, - 3797, 3457, 3457, 3457, 3798, 3799, 3800, 3800, 3457, 3457, - 3457, 3457, 3457, 3800, 3457, 3457, 3800, 3801, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3802, 3803, - 3457, 3457, 3803, 3803, 3457, 3457, 3457, 3803, 3803, 3457, - 3457, 3803, 3803, 3803, 3803, 3803, 3803, 3803, 3803, 3804, - 3457, 3457, 3805, 3805, 3805, 3806, 3807, 3457, 3457, 3807, - 3807, 3457, 3457, 3807, 3808, 3809, 3810, 3811, 3811, 3812, - - 3813, 3813, 3813, 3457, 3457, 3813, 3814, 3815, 3816, 3457, - 3817, 3817, 3817, 3818, 3819, 3820, 3821, 3822, 3822, 3823, - 3824, 3457, 3457, 3457, 3824, 3824, 3824, 3825, 3457, 3457, - 3457, 3826, 3827, 3457, 3457, 3828, 3457, 3457, 3829, 3830, - 3831, 3831, 3457, 3457, 3832, 3833, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3834, 3835, 3457, 3836, 3837, - 3837, 3837, 3838, 3839, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3840, 3841, 3457, 3457, 3457, - - 3457, 3457, 3457, 3457, 3457, 3457, 3842, 3457, 3457, 3457, - 3843, 3457, 3844, 3457, 3457, 3845, 3846, 3847, 3457, 3457, - 3848, 3849, 3849, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3849, 3457, 3457, 3457, 3457, 3850, 3851, 3457, 3457, - 3457, 3457, 3457, 3851, 3851, 3851, 3457, 3457, 3457, 3457, - 3457, 3851, 3851, 3851, 3851, 3457, 3457, 3851, 3851, 3852, - 3457, 3457, 3457, 3457, 3457, 3853, 3457, 3457, 3854, 3855, - 3457, 3457, 3457, 3457, 3457, 3855, 3457, 3457, 3457, 3855, - 3457, 3457, 3856, 3857, 3858, 3858, 3859, 3860, 3860, 3860, - 3457, 3457, 3457, 3860, 3457, 3457, 3861, 3862, 3457, 3457, - - 3457, 3457, 3457, 3863, 3864, 3865, 3866, 3867, 3457, 3457, - 3457, 3457, 3868, 3869, 3869, 3869, 3869, 3870, 3457, 3457, - 3457, 3457, 3871, 3872, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3873, 3874, 3875, 3875, 3457, 3457, 3457, 3876, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3877, 3878, 3457, 3457, - 3457, 3879, 3457, 3457, 3879, 3880, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3881, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - - 3882, 3883, 3457, 3457, 3457, 3884, 3457, 3457, 3457, 3885, - 3886, 3457, 3457, 3457, 3457, 3457, 3887, 3888, 3888, 3457, - 3457, 3457, 3457, 3457, 3888, 3457, 3889, 3890, 3457, 3457, - 3457, 3890, 3890, 3890, 3457, 3457, 3457, 3457, 3457, 3890, - 3890, 3890, 3457, 3457, 3457, 3890, 3890, 3891, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3892, 3893, 3457, 3457, - 3457, 3893, 3893, 3894, 3895, 3896, 3457, 3457, 3897, 3898, - 3457, 3457, 3898, 3898, 3457, 3457, 3898, 3899, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3900, 3901, 3902, - 3903, 3904, 3457, 3457, 3457, 3457, 3457, 3457, 3905, 3906, - - 3906, 3906, 3906, 3907, 3457, 3908, 3909, 3910, 3911, 3912, - 3912, 3457, 3457, 3457, 3457, 3913, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3914, 3915, - 3457, 3916, 3457, 3457, 3457, 3916, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3917, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3918, 3919, 3457, 3457, 3457, - 3457, 3920, 3921, 3922, 3923, 3924, 3924, 3457, 3457, 3457, - 3457, 3924, 3457, 3925, 3926, 3926, 3926, 3926, 3457, 3457, - - 3457, 3926, 3926, 3926, 3926, 3457, 3457, 3927, 3457, 3457, - 3457, 3928, 3929, 3929, 3929, 3930, 3457, 3457, 3931, 3457, - 3457, 3457, 3932, 3933, 3457, 3457, 3457, 3933, 3933, 3457, - 3457, 3457, 3457, 3933, 3934, 3457, 3935, 3936, 3937, 3938, - 3939, 3940, 3457, 3457, 3941, 3941, 3941, 3942, 3457, 3943, - 3457, 3457, 3944, 3945, 3946, 3946, 3457, 3947, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3948, 3457, 3457, 3949, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3950, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - - 3457, 3457, 3951, 3952, 3457, 3953, 3457, 3457, 3457, 3457, - 3954, 3955, 3955, 3457, 3457, 3457, 3457, 3955, 3457, 3956, - 3957, 3957, 3957, 3957, 3957, 3457, 3457, 3957, 3957, 3957, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3958, 3958, 3958, - 3959, 3457, 3457, 3960, 3457, 3457, 3961, 3961, 3961, 3457, - 3457, 3457, 3457, 3961, 3962, 3457, 3963, 3457, 3457, 3457, - 3457, 3938, 3939, 3940, 3457, 3457, 3457, 3457, 3457, 3941, - 3941, 3457, 3457, 3457, 3943, 3944, 3945, 3946, 3946, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3948, 3457, - 3457, 3457, 3949, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - - 3457, 3457, 3457, 3950, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3951, 3952, 3457, 3953, 3457, 3457, 3457, 3457, 3457, 3955, - 3955, 3457, 3457, 3457, 3457, 3956, 3957, 3957, 3957, 3957, - 3957, 3457, 3457, 3457, 3957, 3457, 3457, 3957, 3457, 3457, - 3457, 3457, 3958, 3958, 3457, 3457, 3959, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3961, 3961, 3961, 3457, 3457, - 3457, 3457, 3962, 3963, 3457, 3457, 3457, 3457, 3457, 3939, - 3940, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3944, 3945, 3946, 3946, 3457, 3457, 3457, 3457, 3457, 3457, - - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3949, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3950, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3951, 3952, 3457, 3953, 3955, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3957, 3957, 3957, - 3457, 3457, 3957, 3957, 3457, 3457, 3457, 3957, 3457, 3457, - 3457, 3457, 3958, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3961, 3961, 3961, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3939, 3940, 3457, 3457, - 3457, 3457, 3457, 3457, 3944, 3945, 3946, 3946, 3457, 3457, - - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3949, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3950, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3952, 3457, 3457, 3457, 3457, 3955, 3457, 3457, 3457, - 3957, 3957, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3957, - 3957, 3457, 3457, 3457, 3457, 3958, 3457, 3457, 3457, 3457, - 3457, 3457, 3961, 3457, 3457, 3961, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3939, 3940, - 3457, 3457, 3457, 3457, 3457, 3457, 3945, 3946, 3946, 3946, - - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3950, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3952, 3457, 3457, 3457, 3457, 3457, 3457, 3955, 3957, 3957, - 3457, 3457, 3457, 3457, 3457, 3457, 3957, 3957, 3457, 3457, - 3457, 3457, 3958, 3961, 3457, 3457, 3457, 3961, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3940, 3457, 3457, 3457, 3457, 3945, - 3946, 3946, 3946, 3964, 3965, 3457, 3457, 3457, 3457, 3457, - - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3950, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3955, 3957, 3957, - 3457, 3457, 3957, 3457, 3457, 3457, 3457, 3958, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3940, 3457, 3457, 3457, 3457, 3945, - 3946, 3966, 3967, 3964, 3965, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3955, 3957, 3957, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3958, 3457, 3457, - - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3945, 3966, 3946, 3968, 3967, 3969, 3946, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3955, 3957, 3957, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3958, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3945, 3968, 3457, 3969, - 3946, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - - 3457, 3457, 3457, 3945, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3945, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3945, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3945, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3945, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3945, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3945, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3945, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3945, 3945, 3457, 3457, 3457, 3457, 3457, 3457, 3945, - 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, - 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, - 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, - - 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, - 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, - 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, - 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, - 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, 3945, - 3945, 3945, 3945, 3945, 3945, 3457, 0, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457 + 3469, 3469, 3470, 3470, 3470, 3470, 3471, 3471, 3472, 3472, + 3473, 3473, 3474, 3474, 3474, 3474, 3475, 3475, 3469, 3469, + 3476, 3476, 3477, 3477, 3477, 3477, 3469, 3469, 3477, 3477, + 3477, 3477, 3469, 3469, 3477, 3477, 3469, 3469, 3477, 3477, + 3477, 3477, 3478, 3478, 3479, 3479, 3469, 3469, 3479, 3479, + 3479, 3479, 3480, 3480, 3474, 3474, 3481, 3481, 3482, 3482, + 3483, 3483, 3484, 3484, 3485, 3485, 3486, 3486, 3486, 3486, + 3469, 3469, 3486, 3486, 3486, 3486, 3469, 3469, 3486, 3486, + 3486, 3486, 3469, 3469, 3486, 3486, 3469, 3469, 3486, 3486, + 3486, 3486, 3469, 3469, 3486, 3486, 3469, 3469, 3486, 3486, + + 3486, 3486, 3487, 3487, 3488, 3488, 3469, 3469, 3488, 3488, + 3488, 3488, 3489, 3489, 3490, 3490, 3491, 3491, 3492, 3492, + 3493, 3493, 3494, 3494, 3469, 3469, 3494, 3494, 3494, 3494, + 3495, 3495, 3496, 3496, 3469, 3469, 3496, 3496, 3496, 3496, + 3497, 3497, 3498, 3498, 3499, 3499, 3500, 3500, 3468, 149, + 3501, 3501, 3469, 3469, 3501, 3501, 3501, 3501, 3502, 3502, + 3503, 3503, 3504, 3504, 3505, 3505, 3506, 3506, 3507, 3507, + 3508, 3508, 3509, 3509, 3510, 3510, 3511, 3511, 3469, 3469, + 3511, 3511, 3511, 3511, 3512, 3512, 3513, 3513, 3469, 3469, + 3513, 3513, 3513, 3513, 3514, 3514, 3515, 3515, 3469, 3469, + + 3515, 3515, 3515, 3515, 3516, 3516, 3517, 3517, 3518, 3518, + 3519, 3519, 3469, 3469, 3519, 3519, 3519, 3519, 3520, 3520, + 3521, 3521, 3469, 3469, 3521, 3521, 3521, 3521, 3522, 3522, + 3523, 3523, 3469, 3469, 3523, 3523, 3523, 3523, 3524, 3524, + 3525, 3525, 3526, 3526, 3527, 3527, 3469, 3469, 3527, 3527, + 3527, 3527, 3528, 3528, 3529, 3529, 3530, 3530, 3531, 3531, + 3469, 3469, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3532, 3468, 3468, 3532, 3468, 3468, 3468, + + 300, 300, 302, 300, 303, 303, 3468, 3468, 3468, 3533, + 3468, 3468, 3533, 3468, 3468, 304, 303, 3468, 3468, 3468, + 3534, 3468, 3468, 3534, 3534, 3534, 3468, 3468, 3468, 3468, + 3468, 3535, 3468, 3468, 3535, 3535, 3535, 3535, 3535, 3468, + 3468, 3468, 3468, 3468, 3468, 3536, 3468, 3468, 3536, 3536, + 3536, 3468, 3468, 3468, 3468, 3468, 3468, 3537, 3468, 3468, + 3537, 3537, 3468, 3468, 3468, 365, 303, 303, 304, 369, + 368, 368, 368, 368, 369, 375, 373, 373, 3468, 3468, + 3468, 3538, 3468, 3468, 3538, 3538, 3538, 3538, 3468, 3468, + 303, 303, 303, 3468, 3468, 3468, 3539, 3468, 3468, 3539, + + 3539, 3468, 3468, 3468, 3468, 3468, 3468, 3540, 3468, 3468, + 3540, 3540, 3468, 3468, 3468, 3468, 3468, 3468, 3541, 3468, + 3468, 3541, 3541, 3541, 3541, 3541, 3468, 3468, 392, 392, + 303, 3468, 3468, 3468, 3542, 3468, 3468, 3542, 3542, 3542, + 3542, 3468, 3468, 303, 303, 3468, 3468, 3468, 3543, 3468, + 3468, 3543, 3468, 3468, 3468, 3468, 3468, 3468, 3544, 3468, + 3468, 3544, 3544, 3544, 3468, 3468, 3468, 3468, 3468, 3468, + 3545, 3468, 3468, 3545, 3545, 3545, 3545, 3545, 3545, 3545, + 3545, 3545, 3468, 3468, 303, 303, 3468, 3468, 3468, 3546, + 3468, 3468, 3546, 3546, 3546, 3546, 3546, 3546, 3468, 3468, + + 3468, 3468, 3468, 3468, 3547, 3468, 3468, 3547, 3547, 3547, + 3547, 3547, 3547, 3547, 3468, 3468, 3468, 3468, 3468, 3468, + 3548, 3468, 3468, 3548, 3548, 3468, 3468, 3468, 3468, 3468, + 3468, 3549, 3468, 3468, 3549, 3549, 3549, 3468, 3468, 3468, + 3468, 3468, 3468, 3550, 3468, 3468, 3550, 3550, 3550, 3550, + 3468, 3468, 303, 303, 3468, 3468, 3468, 3551, 3468, 3468, + 3551, 3551, 3468, 3468, 303, 373, 373, 3468, 3468, 3468, + 3552, 3468, 3468, 3552, 3552, 3552, 3468, 3468, 373, 373, + 3468, 3468, 3468, 3553, 3468, 3468, 3553, 3553, 3468, 3468, + 3468, 3468, 3468, 3468, 3554, 3468, 3468, 3554, 3554, 3468, + + 3468, 373, 373, 3468, 3468, 3468, 3555, 3468, 3468, 3555, + 3555, 3555, 3468, 3468, 373, 373, 3468, 3468, 3468, 3556, + 3468, 3468, 3556, 3556, 3556, 3556, 3556, 3468, 3468, 303, + 392, 303, 3468, 3468, 3468, 3557, 3468, 3468, 3557, 3468, + 3468, 3468, 3468, 3468, 3468, 3558, 3468, 3468, 3558, 3468, + 3468, 303, 303, 3468, 3468, 3468, 3559, 3468, 3468, 3559, + 3559, 3468, 3468, 3468, 3468, 3468, 3468, 3560, 3468, 3468, + 3560, 3560, 3468, 3468, 3468, 3468, 3561, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3562, 3562, 3563, 3468, 3468, 3468, 3468, 3468, + + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3564, + 3564, 3565, 3468, 3566, 3566, 3566, 3566, 3468, 3567, 3468, + 3468, 3568, 3568, 3568, 3568, 3568, 3568, 3568, 3568, 3568, + 3569, 3468, 3570, 3570, 3570, 3570, 3571, 3468, 3572, 3572, + 3572, 3573, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3574, 3574, 3574, 3574, 3574, 3575, 3468, 3468, 3576, + 3576, 3576, 3577, 3468, 3578, 3578, 3578, 3579, 3468, 3580, + 3580, 3580, 3580, 3580, 3580, 3580, 3581, 3468, 3468, 3582, + + 3582, 3582, 3582, 3582, 3583, 3468, 3584, 3584, 3585, 3468, + 3586, 3586, 3586, 3586, 3587, 3468, 3588, 3588, 3588, 3588, + 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, + 3588, 3588, 3588, 3589, 3468, 3590, 3590, 3590, 3590, 3590, + 3590, 3590, 3590, 3591, 3468, 3592, 3592, 3592, 3592, 3592, + 3592, 3592, 3592, 3593, 3468, 3594, 3594, 3594, 3595, 3468, + 3596, 3596, 3596, 3596, 3597, 3468, 3598, 3598, 3598, 3598, + 3598, 3598, 3599, 3468, 3600, 3600, 3600, 3600, 3601, 3468, + 3468, 3602, 3602, 3602, 3602, 3602, 3603, 3468, 3604, 3604, + 3604, 3605, 3468, 3606, 3606, 3606, 3607, 3468, 3608, 3608, + + 3608, 3608, 3609, 3468, 3610, 3610, 3610, 3610, 3610, 3610, + 3611, 3468, 3468, 3612, 3612, 3613, 3468, 3614, 3614, 3615, + 3468, 3616, 3616, 3616, 3617, 3468, 3618, 3618, 3618, 3619, + 3620, 3468, 3620, 3468, 3468, 3468, 3621, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3622, 3623, 3623, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3624, 3625, 3625, 3626, + 3468, 3468, 3626, 3468, 3627, 3627, 3468, 3628, 3468, 3468, + 3628, 3628, 3628, 3628, 3628, 3628, 3629, 3629, 3630, 3630, + + 3630, 3631, 3631, 3468, 3468, 3632, 3633, 3633, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3634, 3468, 3468, 3634, 3634, 3635, 3635, 3468, + 3636, 3636, 3637, 3637, 3638, 3638, 3639, 3639, 3640, 3640, + 3640, 3468, 3468, 3640, 3640, 3640, 3641, 3641, 3468, 3468, + 3642, 3642, 3468, 3468, 3642, 3643, 3643, 3644, 3645, 3645, + 3646, 3468, 3468, 3468, 3468, 3647, 3647, 3648, 3648, 3468, + 3468, 3648, 3468, 3468, 3648, 3648, 3648, 3648, 3648, 3648, + 3648, 3648, 3648, 3648, 3648, 3649, 3649, 3468, 3468, 3468, + 3468, 3650, 3650, 3650, 3650, 3650, 3651, 3651, 3652, 3652, + + 3652, 3468, 3468, 3652, 3652, 3652, 3653, 3653, 3654, 3468, + 3468, 3655, 3655, 3656, 3468, 3468, 3656, 3657, 3657, 3658, + 3468, 3468, 3658, 3658, 3658, 3659, 3659, 3660, 3660, 3660, + 3661, 3661, 3468, 3662, 3662, 3662, 3662, 3663, 3663, 3664, + 3468, 3468, 3665, 3665, 3666, 3666, 3667, 3667, 3668, 3668, + 3668, 3669, 3669, 3670, 3670, 3670, 3670, 3670, 3671, 3671, + 3468, 3672, 3673, 3673, 3468, 3468, 3674, 3674, 3468, 3468, + 3675, 3676, 3676, 3468, 3468, 3677, 3678, 3678, 3679, 3468, + 3468, 3679, 3468, 3468, 3680, 3468, 3468, 3468, 3468, 3468, + 3468, 3681, 3468, 3682, 3468, 3682, 3468, 3468, 3468, 3468, + + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3683, 3468, 3684, + 3468, 3684, 3685, 3468, 3468, 3468, 3685, 3468, 3468, 3686, + 3468, 3686, 3687, 3468, 3468, 3468, 3468, 3468, 3687, 3468, + 3468, 3687, 3687, 3687, 3468, 3688, 3468, 3688, 3689, 3689, + 3689, 3468, 3690, 3468, 3690, 3468, 3468, 3468, 3691, 3468, + 3692, 3468, 3692, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3693, 3468, 3468, 3468, + 3693, 3693, 3468, 3694, 3468, 3694, 3468, 3695, 3695, 3468, + + 3696, 3468, 3696, 3697, 3697, 3468, 3698, 3468, 3698, 3699, + 3699, 3699, 3468, 3468, 3468, 3699, 3699, 3699, 3468, 3700, + 3468, 3700, 3468, 3468, 3701, 3701, 3468, 3468, 3468, 3701, + 3468, 3702, 3468, 3702, 3703, 3468, 3704, 3468, 3704, 3705, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3706, 3468, 3706, + 3707, 3707, 3707, 3707, 3468, 3468, 3468, 3707, 3468, 3468, + 3468, 3468, 3468, 3707, 3707, 3707, 3707, 3707, 3707, 3707, + 3707, 3707, 3707, 3468, 3708, 3468, 3708, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3709, 3709, 3709, 3709, 3468, + 3710, 3468, 3710, 3711, 3711, 3711, 3711, 3468, 3468, 3468, + + 3468, 3468, 3711, 3711, 3468, 3712, 3468, 3712, 3713, 3468, + 3468, 3468, 3468, 3714, 3468, 3714, 3715, 3468, 3468, 3468, + 3715, 3468, 3716, 3468, 3716, 3717, 3468, 3468, 3468, 3717, + 3717, 3717, 3468, 3718, 3468, 3718, 3468, 3468, 3468, 3468, + 3719, 3468, 3720, 3468, 3720, 3468, 3468, 3468, 3721, 3721, + 3468, 3468, 3721, 3468, 3722, 3468, 3722, 3723, 3468, 3468, + 3468, 3468, 3724, 3468, 3724, 3468, 3468, 3468, 3468, 3468, + 3725, 3468, 3725, 3468, 3468, 3726, 3726, 3468, 3468, 3468, + 3727, 3468, 3727, 3728, 3728, 3728, 3728, 3728, 3468, 3729, + 3468, 3729, 3468, 3730, 3468, 3731, 3468, 3731, 3468, 3468, + + 3468, 3468, 3732, 3468, 3732, 3468, 3468, 3468, 3733, 3468, + 3734, 3468, 3734, 3468, 3468, 3468, 3735, 3468, 3736, 3468, + 3736, 3737, 3738, 3468, 3468, 3468, 3468, 3468, 3739, 3740, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3741, 3468, 3468, 3742, 3468, 3743, 3744, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3744, 3468, 3468, + 3744, 3745, 3746, 3468, 3468, 3746, 3747, 3748, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + + 3468, 3468, 3468, 3749, 3749, 3468, 3468, 3750, 3468, 3468, + 3468, 3751, 3752, 3468, 3468, 3753, 3754, 3755, 3755, 3468, + 3468, 3755, 3755, 3755, 3756, 3468, 3468, 3757, 3757, 3757, + 3758, 3468, 3468, 3759, 3468, 3468, 3760, 3761, 3761, 3761, + 3761, 3468, 3468, 3468, 3468, 3468, 3761, 3761, 3761, 3761, + 3761, 3761, 3761, 3761, 3761, 3761, 3761, 3762, 3468, 3468, + 3468, 3763, 3763, 3763, 3763, 3764, 3765, 3765, 3765, 3765, + 3468, 3468, 3468, 3765, 3765, 3766, 3767, 3768, 3769, 3769, + 3770, 3771, 3771, 3771, 3771, 3772, 3468, 3468, 3468, 3468, + 3468, 3468, 3773, 3774, 3468, 3468, 3468, 3468, 3775, 3775, + + 3468, 3468, 3468, 3775, 3776, 3777, 3778, 3468, 3468, 3468, + 3468, 3468, 3468, 3779, 3468, 3468, 3468, 3780, 3780, 3468, + 3468, 3468, 3781, 3782, 3468, 3468, 3782, 3782, 3782, 3783, + 3468, 3784, 3785, 3786, 3787, 3788, 3789, 3790, 3791, 3792, + 3792, 3468, 3792, 3468, 3468, 3468, 3793, 3794, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3795, 3468, 3468, 3468, 3796, 3468, 3797, 3798, + 3468, 3468, 3468, 3798, 3468, 3468, 3468, 3798, 3799, 3800, + + 3468, 3468, 3468, 3468, 3468, 3801, 3802, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3803, 3468, 3468, 3468, 3468, 3468, 3804, 3468, 3468, 3468, + 3468, 3805, 3806, 3468, 3468, 3468, 3807, 3808, 3809, 3809, + 3468, 3468, 3468, 3468, 3468, 3809, 3468, 3468, 3809, 3810, + 3468, 3468, 3811, 3811, 3811, 3812, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3813, 3814, 3468, 3468, 3814, 3814, + 3468, 3468, 3468, 3814, 3814, 3468, 3468, 3814, 3814, 3814, + 3814, 3814, 3814, 3814, 3814, 3815, 3468, 3468, 3816, 3816, + 3816, 3817, 3818, 3468, 3468, 3818, 3818, 3468, 3468, 3818, + + 3819, 3820, 3821, 3822, 3822, 3823, 3824, 3824, 3824, 3468, + 3468, 3824, 3825, 3826, 3827, 3468, 3828, 3828, 3828, 3829, + 3830, 3831, 3832, 3833, 3833, 3834, 3835, 3468, 3468, 3468, + 3835, 3835, 3835, 3836, 3468, 3468, 3468, 3837, 3838, 3468, + 3468, 3839, 3468, 3468, 3840, 3841, 3842, 3842, 3468, 3468, + 3843, 3844, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3845, 3846, 3468, 3847, 3848, 3848, 3848, 3849, 3850, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + + 3468, 3851, 3852, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3853, 3468, 3468, 3468, 3854, 3468, 3855, 3856, + 3468, 3468, 3857, 3858, 3858, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3858, 3468, 3468, 3468, 3468, 3468, 3468, + 3859, 3468, 3468, 3860, 3861, 3862, 3468, 3468, 3468, 3468, + 3468, 3862, 3862, 3862, 3468, 3468, 3468, 3468, 3468, 3862, + 3862, 3862, 3862, 3468, 3468, 3862, 3862, 3863, 3468, 3468, + 3468, 3468, 3468, 3864, 3468, 3468, 3865, 3866, 3468, 3468, + 3468, 3468, 3468, 3866, 3468, 3468, 3468, 3866, 3468, 3468, + 3867, 3868, 3869, 3869, 3870, 3871, 3871, 3871, 3468, 3468, + + 3468, 3871, 3468, 3468, 3872, 3873, 3468, 3468, 3468, 3468, + 3468, 3874, 3875, 3876, 3877, 3878, 3468, 3468, 3468, 3468, + 3879, 3880, 3880, 3880, 3880, 3881, 3468, 3468, 3468, 3468, + 3882, 3883, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3884, 3885, 3886, 3886, 3468, 3468, 3468, 3887, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3888, 3889, 3468, 3468, 3468, 3890, + 3468, 3468, 3890, 3891, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3892, 3468, 3468, 3468, + + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3893, 3894, + 3468, 3895, 3468, 3468, 3468, 3468, 3468, 3896, 3897, 3897, + 3468, 3468, 3468, 3468, 3468, 3897, 3468, 3468, 3468, 3468, + 3468, 3468, 3898, 3468, 3468, 3468, 3899, 3900, 3901, 3468, + 3468, 3468, 3901, 3901, 3901, 3468, 3468, 3468, 3468, 3468, + 3901, 3901, 3901, 3468, 3468, 3468, 3901, 3901, 3902, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3903, 3904, 3468, + 3468, 3468, 3904, 3904, 3905, 3906, 3907, 3468, 3468, 3908, + 3909, 3468, 3468, 3909, 3909, 3468, 3468, 3909, 3910, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3911, 3912, + + 3913, 3914, 3915, 3468, 3468, 3468, 3468, 3468, 3468, 3916, + 3917, 3917, 3917, 3917, 3918, 3468, 3919, 3920, 3921, 3922, + 3923, 3923, 3468, 3468, 3468, 3468, 3924, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3925, + 3926, 3468, 3927, 3468, 3468, 3468, 3927, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3928, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3929, 3930, 3468, 3931, + 3932, 3933, 3933, 3468, 3468, 3468, 3468, 3933, 3468, 3468, + + 3468, 3468, 3934, 3935, 3936, 3937, 3937, 3937, 3937, 3468, + 3468, 3468, 3937, 3937, 3937, 3937, 3468, 3468, 3938, 3468, + 3468, 3468, 3939, 3940, 3940, 3940, 3941, 3468, 3468, 3942, + 3468, 3468, 3468, 3943, 3944, 3468, 3468, 3468, 3944, 3944, + 3468, 3468, 3468, 3468, 3944, 3945, 3468, 3946, 3947, 3948, + 3949, 3950, 3951, 3468, 3468, 3952, 3952, 3952, 3953, 3468, + 3954, 3468, 3468, 3955, 3956, 3957, 3957, 3468, 3958, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3959, 3468, 3468, 3960, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3961, 3468, 3468, + + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3962, 3963, 3468, 3468, 3468, 3964, 3965, + 3965, 3468, 3468, 3468, 3468, 3965, 3468, 3966, 3468, 3468, + 3967, 3968, 3968, 3968, 3968, 3968, 3468, 3468, 3968, 3968, + 3968, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3969, 3969, + 3969, 3970, 3468, 3468, 3971, 3468, 3468, 3972, 3972, 3972, + 3468, 3468, 3468, 3468, 3972, 3973, 3468, 3974, 3468, 3468, + 3468, 3468, 3949, 3950, 3951, 3468, 3468, 3468, 3468, 3468, + 3952, 3952, 3468, 3468, 3468, 3954, 3955, 3956, 3957, 3957, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3959, + + 3468, 3468, 3468, 3960, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3961, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3962, 3963, 3468, 3468, 3468, 3468, 3468, 3468, 3965, + 3965, 3468, 3468, 3468, 3468, 3966, 3967, 3968, 3968, 3968, + 3968, 3968, 3468, 3468, 3468, 3968, 3468, 3468, 3968, 3468, + 3468, 3468, 3468, 3969, 3969, 3468, 3468, 3970, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3972, 3972, 3972, 3468, + 3468, 3468, 3468, 3973, 3974, 3468, 3468, 3468, 3468, 3468, + 3950, 3951, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + + 3468, 3955, 3956, 3957, 3957, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3960, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3961, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3962, 3963, 3468, 3965, + 3468, 3468, 3468, 3468, 3468, 3966, 3468, 3468, 3968, 3968, + 3968, 3468, 3468, 3968, 3968, 3468, 3468, 3468, 3968, 3468, + 3468, 3468, 3468, 3969, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3972, 3972, 3972, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3950, 3951, 3468, + + 3468, 3468, 3468, 3468, 3468, 3955, 3956, 3957, 3957, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3960, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3961, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3963, 3468, 3468, 3965, 3468, 3468, 3468, 3468, + 3468, 3968, 3968, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3968, 3968, 3468, 3468, 3468, 3468, 3969, 3468, 3468, 3468, + 3468, 3468, 3468, 3972, 3468, 3468, 3972, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3950, + + 3951, 3468, 3468, 3468, 3468, 3468, 3468, 3956, 3957, 3957, + 3957, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3961, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3963, 3468, 3468, 3468, 3965, 3468, 3468, 3468, 3968, + 3968, 3468, 3468, 3468, 3468, 3468, 3468, 3968, 3968, 3468, + 3468, 3468, 3468, 3969, 3972, 3468, 3468, 3468, 3972, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3951, 3468, 3468, 3468, 3468, + + 3956, 3957, 3957, 3957, 3975, 3976, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3961, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3965, 3968, + 3968, 3468, 3468, 3968, 3468, 3468, 3468, 3468, 3969, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3951, 3468, 3468, 3468, 3468, + 3956, 3957, 3977, 3978, 3975, 3976, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3965, 3968, + + 3968, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3969, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3956, 3977, 3957, 3979, 3978, 3980, 3957, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3965, 3968, 3968, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3969, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3956, 3979, 3468, + 3980, 3957, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3956, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3956, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3956, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3956, + + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3956, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3956, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3956, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3956, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3956, 3956, 3468, 3468, 3468, 3468, 3468, 3468, + 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956, + 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956, + + 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956, + 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956, + 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956, + 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956, + 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956, + 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956, + 3956, 3956, 3956, 3956, 3956, 3956, 3468, 0, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468 } ; -static yyconst flex_int16_t yy_nxt[12668] = +static yyconst flex_int16_t yy_nxt[12714] = { 0, - 3457, 266, 267, 266, 266, 267, 266, 266, 267, 266, + 3468, 266, 267, 266, 266, 267, 266, 266, 267, 266, 266, 267, 266, 271, 267, 271, 277, 268, 274, 277, - 268, 274, 3457, 269, 3457, 275, 269, 3457, 275, 272, - 271, 267, 271, 676, 278, 280, 281, 278, 280, 281, - 282, 283, 721, 282, 283, 676, 272, 287, 288, 677, - 284, 280, 281, 284, 285, 679, 282, 280, 281, 710, - 285, 678, 282, 287, 288, 1760, 284, 267, 267, 267, - 869, 678, 284, 267, 267, 267, 299, 267, 299, 299, - 267, 299, 870, 290, 299, 267, 299, 697, 1761, 290, - 751, 289, 300, 1391, 713, 300, 675, 675, 675, 1392, - - 301, 675, 675, 675, 675, 675, 675, 289, 291, 292, + 268, 274, 3468, 269, 3468, 275, 269, 3468, 275, 272, + 271, 267, 271, 677, 278, 280, 281, 278, 280, 281, + 282, 283, 722, 282, 283, 677, 272, 287, 288, 678, + 284, 280, 281, 284, 285, 680, 282, 280, 281, 711, + 285, 679, 282, 287, 288, 3468, 284, 267, 267, 267, + 871, 679, 284, 267, 267, 267, 299, 267, 299, 299, + 267, 299, 872, 290, 299, 267, 299, 698, 1758, 290, + 752, 289, 300, 1395, 714, 300, 676, 676, 676, 1396, + + 301, 676, 676, 676, 676, 676, 676, 289, 291, 292, 267, 292, 291, 291, 291, 291, 291, 291, 291, 293, - 291, 291, 291, 708, 291, 295, 291, 296, 291, 299, - 267, 299, 267, 267, 267, 267, 267, 267, 709, 299, - 267, 299, 299, 267, 299, 301, 714, 824, 302, 679, - 825, 302, 948, 291, 291, 300, 679, 679, 300, 299, - 267, 299, 675, 675, 675, 678, 675, 675, 675, 675, - 675, 675, 678, 678, 3457, 303, 949, 297, 291, 292, + 291, 291, 291, 709, 291, 295, 291, 296, 291, 299, + 267, 299, 267, 267, 267, 267, 267, 267, 710, 299, + 267, 299, 299, 267, 299, 301, 715, 826, 302, 680, + 827, 302, 950, 291, 291, 300, 680, 680, 300, 299, + 267, 299, 676, 676, 676, 679, 676, 676, 676, 676, + 676, 676, 679, 679, 3468, 303, 951, 297, 291, 292, 267, 292, 291, 291, 291, 291, 291, 291, 291, 293, - 291, 291, 291, 1763, 291, 295, 291, 296, 291, 299, + 291, 291, 291, 1761, 291, 295, 291, 296, 291, 299, - 267, 299, 267, 267, 267, 267, 267, 267, 684, 299, - 267, 299, 299, 267, 299, 303, 690, 751, 304, 838, - 1008, 304, 839, 291, 291, 301, 760, 752, 301, 267, + 267, 299, 267, 267, 267, 267, 267, 267, 685, 299, + 267, 299, 299, 267, 299, 303, 691, 752, 304, 840, + 1010, 304, 841, 291, 291, 301, 761, 753, 301, 267, 267, 267, 267, 267, 267, 299, 267, 299, 299, 267, - 299, 299, 267, 299, 1009, 305, 875, 297, 305, 679, - 685, 303, 817, 876, 303, 764, 686, 306, 299, 267, - 299, 687, 675, 675, 675, 678, 688, 675, 675, 675, - 675, 675, 675, 818, 306, 307, 308, 267, 308, 307, + 299, 299, 267, 299, 1011, 305, 877, 297, 305, 680, + 686, 303, 819, 878, 303, 765, 687, 306, 299, 267, + 299, 688, 676, 676, 676, 679, 689, 676, 676, 676, + 676, 676, 676, 820, 306, 307, 308, 267, 308, 307, 307, 307, 307, 307, 307, 307, 309, 307, 307, 307, - 738, 307, 311, 307, 312, 307, 315, 267, 315, 315, + 739, 307, 311, 307, 312, 307, 315, 267, 315, 315, - 267, 315, 267, 267, 267, 739, 267, 267, 267, 315, - 267, 315, 316, 799, 877, 316, 1764, 800, 304, 734, - 307, 307, 304, 735, 776, 316, 694, 736, 313, 307, + 267, 315, 267, 267, 267, 740, 267, 267, 267, 315, + 267, 315, 316, 794, 879, 316, 1762, 795, 304, 735, + 307, 307, 304, 736, 777, 316, 695, 737, 313, 307, 308, 267, 308, 307, 307, 307, 307, 307, 307, 307, - 309, 307, 307, 307, 679, 307, 311, 307, 312, 307, - 315, 267, 315, 315, 267, 315, 315, 267, 315, 1765, - 678, 885, 280, 281, 883, 715, 316, 282, 3457, 317, - 714, 884, 317, 777, 307, 307, 760, 327, 716, 776, - 709, 1206, 313, 318, 319, 267, 319, 318, 318, 318, - 318, 318, 318, 318, 320, 318, 318, 318, 1207, 318, - - 322, 318, 323, 318, 1766, 679, 328, 708, 341, 267, - 341, 341, 267, 341, 353, 267, 353, 714, 280, 281, - 717, 678, 709, 282, 342, 727, 821, 342, 318, 318, - 354, 713, 728, 327, 822, 936, 324, 783, 937, 325, - 823, 678, 675, 675, 675, 1767, 326, 318, 319, 267, + 309, 307, 307, 307, 680, 307, 311, 307, 312, 307, + 315, 267, 315, 315, 267, 315, 315, 267, 315, 1763, + 679, 887, 280, 281, 885, 716, 316, 282, 3468, 317, + 715, 886, 317, 778, 307, 307, 761, 327, 717, 777, + 710, 897, 313, 318, 319, 267, 319, 318, 318, 318, + 318, 318, 318, 318, 320, 318, 318, 318, 1765, 318, + + 322, 318, 323, 318, 1766, 680, 328, 709, 341, 267, + 341, 341, 267, 341, 353, 267, 353, 715, 280, 281, + 718, 679, 710, 282, 342, 728, 880, 342, 318, 318, + 354, 714, 729, 327, 715, 938, 324, 715, 939, 325, + 797, 679, 676, 676, 676, 1768, 326, 318, 319, 267, 319, 318, 318, 318, 318, 318, 318, 318, 320, 318, 318, 318, 328, 318, 322, 318, 323, 318, 353, 267, - 353, 364, 267, 364, 364, 267, 364, 802, 364, 267, - 364, 364, 267, 364, 354, 679, 765, 365, 679, 760, - 365, 878, 318, 318, 366, 740, 1543, 366, 1768, 714, + 353, 364, 267, 364, 364, 267, 364, 828, 364, 267, + 364, 364, 267, 364, 354, 680, 766, 365, 680, 798, + 365, 829, 318, 318, 366, 741, 1769, 366, 1770, 903, - 324, 678, 766, 325, 678, 675, 675, 675, 783, 1544, + 324, 679, 767, 325, 679, 676, 676, 676, 797, 1209, 326, 329, 330, 267, 330, 329, 329, 329, 329, 329, - 329, 329, 331, 329, 329, 329, 803, 329, 333, 329, + 329, 329, 331, 329, 329, 329, 1210, 329, 333, 329, 334, 329, 267, 267, 267, 267, 267, 267, 364, 267, - 364, 802, 364, 267, 364, 364, 267, 364, 367, 1769, - 679, 367, 679, 679, 365, 1770, 329, 329, 365, 746, - 713, 368, 675, 675, 675, 335, 678, 336, 678, 678, - 3457, 337, 675, 675, 675, 832, 338, 339, 329, 330, + 364, 805, 364, 267, 364, 364, 267, 364, 367, 1771, + 680, 367, 680, 680, 365, 715, 329, 329, 365, 747, + 714, 368, 676, 676, 676, 335, 679, 336, 679, 679, + 3468, 337, 676, 676, 676, 805, 338, 339, 329, 330, 267, 330, 329, 329, 329, 329, 329, 329, 329, 331, - 329, 329, 329, 713, 329, 333, 329, 334, 329, 364, + 329, 329, 329, 761, 329, 333, 329, 334, 329, 364, - 267, 364, 267, 267, 267, 267, 267, 267, 910, 364, - 267, 364, 364, 267, 364, 368, 763, 1771, 369, 777, - 703, 369, 760, 329, 329, 370, 756, 760, 370, 675, - 675, 675, 335, 759, 336, 675, 675, 675, 337, 675, - 675, 675, 1773, 338, 339, 343, 344, 267, 344, 343, + 267, 364, 267, 267, 267, 267, 267, 267, 912, 364, + 267, 364, 364, 267, 364, 368, 764, 1772, 369, 778, + 704, 369, 761, 329, 329, 370, 757, 714, 370, 676, + 676, 676, 335, 760, 336, 676, 676, 676, 337, 676, + 676, 676, 1773, 338, 339, 343, 344, 267, 344, 343, 343, 343, 343, 343, 343, 343, 345, 343, 343, 343, - 710, 343, 347, 343, 348, 343, 364, 267, 364, 364, - 267, 364, 267, 267, 267, 930, 267, 267, 267, 364, - 267, 364, 371, 1044, 1774, 371, 1045, 826, 372, 767, - 343, 343, 372, 754, 755, 368, 895, 349, 675, 675, - - 675, 827, 713, 350, 768, 675, 675, 675, 675, 675, - 675, 982, 351, 343, 344, 267, 344, 343, 343, 343, - 343, 343, 343, 343, 345, 343, 343, 343, 930, 343, + 711, 343, 347, 343, 348, 343, 364, 267, 364, 364, + 267, 364, 267, 267, 267, 932, 267, 267, 267, 364, + 267, 364, 371, 959, 1656, 371, 932, 960, 372, 768, + 343, 343, 372, 755, 756, 368, 1657, 349, 676, 676, + + 676, 933, 714, 350, 769, 676, 676, 676, 676, 676, + 676, 984, 351, 343, 344, 267, 344, 343, 343, 343, + 343, 343, 343, 343, 345, 343, 343, 343, 1774, 343, 347, 343, 348, 343, 364, 267, 364, 267, 267, 267, - 267, 267, 267, 931, 364, 267, 364, 364, 267, 364, - 368, 679, 714, 373, 1782, 901, 373, 679, 343, 343, - 371, 679, 679, 371, 788, 349, 1555, 678, 675, 675, - 675, 350, 948, 678, 675, 675, 675, 678, 678, 1544, + 267, 267, 267, 964, 364, 267, 364, 364, 267, 364, + 368, 680, 680, 373, 680, 950, 373, 965, 343, 343, + 371, 783, 680, 371, 1775, 349, 1776, 679, 679, 788, + 679, 350, 676, 676, 676, 676, 676, 676, 679, 1019, 351, 355, 356, 267, 356, 355, 355, 355, 355, 355, - 355, 355, 357, 355, 355, 355, 1017, 355, 359, 355, + 355, 355, 357, 355, 355, 355, 1778, 355, 359, 355, 360, 355, 364, 267, 364, 364, 267, 364, 267, 267, - 267, 714, 267, 267, 267, 364, 267, 364, 374, 679, - 679, 374, 679, 1783, 375, 832, 355, 355, 375, 793, - 1785, 376, 675, 675, 675, 678, 678, 361, 678, 675, - 675, 675, 675, 675, 675, 1789, 362, 355, 356, 267, + 267, 1779, 267, 267, 267, 364, 267, 364, 374, 680, + 680, 374, 1787, 1788, 375, 834, 355, 355, 375, 680, + 1790, 376, 676, 676, 676, 679, 679, 361, 676, 676, + 676, 676, 676, 676, 834, 679, 362, 355, 356, 267, 356, 355, 355, 355, 355, 355, 355, 355, 357, 355, - 355, 355, 1008, 355, 359, 355, 360, 355, 364, 267, - 364, 267, 267, 267, 267, 267, 267, 713, 364, 267, - 364, 364, 267, 364, 376, 679, 949, 377, 1793, 1008, - 377, 1795, 355, 355, 374, 679, 1802, 374, 364, 267, + 355, 355, 1010, 355, 359, 355, 360, 355, 364, 267, + 364, 267, 267, 267, 267, 267, 267, 761, 364, 267, + 364, 364, 267, 364, 376, 680, 951, 377, 1040, 1010, + 377, 1041, 355, 355, 374, 680, 714, 374, 364, 267, - 364, 678, 807, 361, 364, 267, 364, 675, 675, 675, - 871, 678, 362, 1017, 378, 675, 675, 675, 751, 1803, + 364, 679, 809, 361, 364, 267, 364, 676, 676, 676, + 873, 679, 362, 1019, 378, 676, 676, 676, 752, 1297, 378, 379, 380, 267, 380, 379, 379, 379, 379, 379, - 379, 379, 381, 379, 379, 379, 948, 379, 383, 379, + 379, 379, 381, 379, 379, 379, 1210, 379, 383, 379, 384, 379, 390, 267, 390, 390, 267, 390, 267, 267, - 267, 957, 267, 267, 267, 958, 769, 679, 391, 1028, - 1018, 391, 760, 958, 392, 3457, 379, 379, 392, 679, - 679, 385, 758, 678, 871, 710, 813, 386, 675, 675, - 675, 387, 675, 675, 675, 678, 678, 388, 379, 380, + 267, 1030, 267, 267, 267, 960, 770, 680, 391, 1049, + 969, 391, 761, 1050, 392, 3468, 379, 379, 392, 680, + 680, 385, 759, 679, 965, 711, 815, 386, 676, 676, + 676, 387, 676, 676, 676, 679, 679, 388, 379, 380, 267, 380, 379, 379, 379, 379, 379, 379, 379, 381, - 379, 379, 379, 697, 379, 383, 379, 384, 379, 390, - 267, 390, 390, 267, 390, 390, 267, 390, 909, 390, - 267, 390, 675, 675, 675, 391, 713, 828, 391, 1804, - 1805, 393, 1810, 379, 379, 393, 679, 679, 385, 829, - 830, 675, 675, 675, 386, 675, 675, 675, 387, 675, - 675, 675, 678, 678, 388, 394, 395, 267, 395, 394, + 379, 379, 379, 698, 379, 383, 379, 384, 379, 390, + 267, 390, 390, 267, 390, 390, 267, 390, 823, 390, + 267, 390, 676, 676, 676, 391, 824, 830, 391, 1794, + 1798, 393, 825, 379, 379, 393, 680, 680, 385, 831, + 832, 676, 676, 676, 386, 676, 676, 676, 387, 676, + 676, 676, 679, 679, 388, 394, 395, 267, 395, 394, 394, 394, 394, 394, 394, 394, 396, 394, 394, 394, - 713, 394, 398, 394, 399, 394, 404, 267, 404, 404, - 267, 404, 267, 267, 267, 950, 267, 267, 267, 1053, - 679, 1811, 405, 1054, 1008, 405, 951, 842, 367, 952, - - 394, 394, 367, 679, 679, 400, 678, 675, 675, 675, - 852, 401, 675, 675, 675, 675, 675, 675, 1018, 678, - 678, 1294, 402, 394, 395, 267, 395, 394, 394, 394, - 394, 394, 394, 394, 396, 394, 394, 394, 1207, 394, - 398, 394, 399, 394, 404, 267, 404, 404, 267, 404, - 404, 267, 404, 962, 404, 267, 404, 675, 675, 675, - 405, 679, 679, 405, 679, 1812, 406, 963, 394, 394, - 406, 857, 1813, 400, 675, 675, 675, 678, 678, 401, - 678, 675, 675, 675, 675, 675, 675, 675, 675, 675, - 402, 407, 408, 267, 408, 407, 407, 407, 407, 407, - - 407, 407, 409, 407, 407, 407, 1814, 407, 411, 407, - 412, 407, 416, 267, 416, 416, 267, 416, 427, 267, - 427, 918, 427, 267, 427, 441, 267, 441, 417, 1177, - 1815, 417, 679, 1518, 428, 1177, 407, 407, 428, 863, - 885, 442, 675, 675, 675, 675, 675, 675, 678, 675, - 675, 675, 413, 1816, 877, 1734, 1823, 414, 407, 408, - 267, 408, 407, 407, 407, 407, 407, 407, 407, 409, - 407, 407, 407, 760, 407, 411, 407, 412, 407, 441, - 267, 441, 267, 267, 267, 267, 267, 267, 878, 441, - 267, 441, 441, 267, 441, 442, 714, 1824, 443, 679, - - 1825, 443, 878, 407, 407, 442, 713, 679, 442, 675, - 675, 675, 675, 675, 675, 678, 675, 675, 675, 413, - 675, 675, 675, 678, 414, 418, 419, 267, 419, 418, - 418, 418, 418, 418, 418, 418, 420, 418, 418, 418, - 1830, 418, 422, 418, 423, 418, 441, 267, 441, 441, - 267, 441, 453, 267, 453, 1835, 453, 267, 453, 465, - 267, 465, 444, 1837, 1838, 444, 679, 679, 454, 679, - 418, 418, 454, 890, 679, 466, 675, 675, 675, 675, - 675, 675, 678, 678, 1844, 678, 424, 1849, 1850, 895, - 678, 1206, 425, 418, 419, 267, 419, 418, 418, 418, - - 418, 418, 418, 418, 420, 418, 418, 418, 1329, 418, - 422, 418, 423, 418, 465, 267, 465, 483, 267, 483, - 483, 267, 483, 1651, 267, 267, 267, 267, 267, 267, - 466, 1860, 1863, 484, 1864, 1652, 484, 878, 418, 418, - 367, 1868, 1869, 367, 918, 714, 675, 675, 675, 901, - 675, 675, 675, 1872, 424, 675, 675, 675, 909, 1873, - 425, 429, 430, 267, 430, 429, 429, 429, 429, 429, - 429, 429, 431, 429, 429, 429, 1874, 429, 433, 429, - 434, 429, 483, 267, 483, 483, 267, 483, 483, 267, - 483, 1875, 483, 267, 483, 910, 713, 878, 484, 679, - - 679, 484, 1876, 1877, 485, 714, 429, 429, 485, 435, - 760, 436, 675, 675, 675, 678, 678, 437, 675, 675, - 675, 675, 675, 675, 438, 1878, 1879, 439, 429, 430, - 267, 430, 429, 429, 429, 429, 429, 429, 429, 431, - 429, 429, 429, 1887, 429, 433, 429, 434, 429, 499, - 267, 499, 499, 267, 499, 515, 267, 515, 950, 515, - 267, 515, 1890, 679, 1891, 500, 1894, 679, 500, 951, - 914, 516, 966, 429, 429, 516, 435, 1177, 436, 678, - 675, 675, 675, 678, 437, 675, 675, 675, 675, 675, - 675, 438, 1896, 1179, 439, 445, 446, 267, 446, 445, - - 445, 445, 445, 445, 445, 445, 447, 445, 445, 445, - 1898, 445, 449, 445, 450, 445, 526, 267, 526, 526, - 267, 526, 538, 267, 538, 967, 538, 267, 538, 551, - 267, 551, 527, 1899, 1901, 527, 679, 679, 539, 963, - 445, 445, 539, 923, 928, 552, 675, 675, 675, 675, - 675, 675, 678, 678, 1902, 1903, 451, 445, 446, 267, - 446, 445, 445, 445, 445, 445, 445, 445, 447, 445, - 445, 445, 1908, 445, 449, 445, 450, 445, 551, 267, - 551, 267, 267, 267, 267, 267, 267, 967, 551, 267, - 551, 551, 267, 551, 552, 1911, 1912, 367, 959, 1913, - - 367, 1014, 445, 445, 552, 960, 1915, 552, 675, 675, - 675, 961, 934, 934, 934, 1194, 1194, 1194, 451, 455, - 456, 267, 456, 455, 455, 455, 455, 455, 455, 455, - 457, 455, 455, 455, 1918, 455, 459, 455, 460, 455, - 551, 267, 551, 551, 267, 551, 563, 267, 563, 969, - 563, 267, 563, 267, 267, 267, 553, 1919, 1921, 553, - 970, 972, 564, 952, 455, 455, 564, 969, 960, 565, - 461, 935, 972, 959, 973, 462, 1925, 1926, 970, 960, - 960, 966, 1534, 1534, 1534, 961, 973, 463, 455, 456, - 267, 456, 455, 455, 455, 455, 455, 455, 455, 457, - - 455, 455, 455, 1927, 455, 459, 455, 460, 455, 267, - 267, 267, 563, 267, 563, 563, 267, 563, 967, 563, - 267, 563, 563, 267, 563, 565, 1929, 967, 564, 959, - 972, 564, 1019, 455, 455, 566, 960, 960, 566, 461, - 950, 1020, 1013, 1013, 462, 934, 934, 934, 1737, 1181, - 1943, 970, 1944, 1945, 966, 1947, 463, 467, 468, 267, - 468, 467, 467, 467, 467, 467, 467, 467, 469, 467, - 467, 467, 470, 467, 471, 467, 472, 467, 470, 470, - 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, - 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, - - 470, 470, 467, 467, 470, 473, 474, 475, 470, 470, - 470, 470, 470, 476, 470, 470, 477, 470, 470, 470, - 478, 470, 479, 480, 481, 470, 470, 470, 470, 470, - 470, 486, 487, 267, 487, 486, 486, 486, 486, 486, - 486, 486, 488, 486, 486, 486, 1948, 486, 490, 486, - 491, 486, 577, 267, 577, 577, 267, 577, 267, 267, - 267, 1949, 267, 267, 267, 577, 267, 577, 578, 1348, - 1177, 578, 1555, 1950, 565, 1951, 486, 486, 565, 1349, - 492, 578, 1194, 1194, 1194, 1593, 1350, 493, 1952, 1953, - 494, 1218, 1218, 1218, 495, 1940, 496, 497, 486, 487, - - 267, 487, 486, 486, 486, 486, 486, 486, 486, 488, - 486, 486, 486, 1954, 486, 490, 486, 491, 486, 577, - 267, 577, 577, 267, 577, 577, 267, 577, 1955, 589, - 267, 589, 589, 267, 589, 578, 1956, 1957, 579, 1959, - 1960, 579, 1961, 486, 486, 590, 1195, 492, 590, 1231, - 1231, 1231, 1962, 1232, 493, 1195, 1233, 494, 1218, 1218, - 1218, 495, 1965, 496, 497, 501, 502, 267, 502, 501, - 501, 501, 501, 501, 501, 501, 503, 501, 501, 501, - 1968, 501, 505, 501, 506, 501, 600, 267, 600, 600, - 267, 600, 267, 267, 267, 1969, 267, 267, 267, 979, - - 979, 979, 601, 1970, 1971, 601, 1972, 1973, 565, 1977, - 501, 501, 565, 507, 508, 509, 980, 1978, 1241, 1241, - 1241, 510, 1242, 1980, 511, 1243, 1981, 1982, 512, 1984, - 1997, 513, 501, 502, 267, 502, 501, 501, 501, 501, - 501, 501, 501, 503, 501, 501, 501, 1998, 501, 505, - 501, 506, 501, 600, 267, 600, 600, 267, 600, 600, - 267, 600, 1999, 600, 267, 600, 987, 987, 987, 601, - 2000, 2001, 601, 2004, 2005, 602, 2006, 501, 501, 602, - 507, 508, 509, 988, 2007, 1263, 1263, 1263, 510, 1264, - 2012, 511, 1265, 2013, 2017, 512, 2022, 2023, 513, 517, - - 518, 267, 518, 517, 517, 517, 517, 517, 517, 517, - 519, 517, 517, 517, 2032, 517, 521, 517, 522, 517, - 613, 267, 613, 613, 267, 613, 267, 267, 267, 2036, - 267, 267, 267, 1002, 1002, 1002, 614, 2038, 2044, 614, - 2045, 2046, 565, 2052, 517, 517, 565, 2053, 2054, 523, - 1003, 1590, 1590, 1590, 2055, 524, 517, 518, 267, 518, - 517, 517, 517, 517, 517, 517, 517, 519, 517, 517, - 517, 2058, 517, 521, 517, 522, 517, 613, 267, 613, - 613, 267, 613, 613, 267, 613, 2059, 613, 267, 613, - 1022, 1022, 1022, 614, 2070, 2076, 614, 2080, 2083, 615, - - 2085, 517, 517, 615, 2086, 2088, 523, 1023, 1534, 1534, - 1534, 2089, 524, 528, 529, 267, 529, 528, 528, 528, - 528, 528, 528, 528, 530, 528, 528, 528, 2090, 528, - 532, 528, 533, 528, 628, 267, 628, 628, 267, 628, - 267, 267, 267, 2094, 267, 267, 267, 628, 267, 628, - 629, 2097, 2099, 629, 2106, 2114, 630, 2115, 528, 528, - 630, 2116, 534, 629, 1194, 1194, 1194, 2117, 2119, 535, - 1737, 1177, 536, 528, 529, 267, 529, 528, 528, 528, - 528, 528, 528, 528, 530, 528, 528, 528, 2134, 528, - 532, 528, 533, 528, 628, 267, 628, 628, 267, 628, - - 628, 267, 628, 2137, 640, 267, 640, 640, 267, 640, - 629, 2141, 2135, 631, 2142, 1737, 631, 2143, 528, 528, - 641, 2146, 534, 641, 1218, 1218, 1218, 2147, 1271, 535, - 2149, 2150, 536, 540, 541, 267, 541, 540, 540, 540, - 540, 540, 540, 540, 542, 540, 540, 540, 2136, 540, - 544, 540, 545, 540, 650, 267, 650, 650, 267, 650, - 267, 267, 267, 2151, 267, 267, 267, 650, 267, 650, - 651, 2144, 2152, 651, 2153, 2154, 367, 2155, 540, 540, - 367, 2158, 546, 651, 1751, 1751, 1751, 2145, 1271, 547, - 2159, 2162, 548, 1754, 1754, 1754, 1759, 1759, 1759, 549, - - 540, 541, 267, 541, 540, 540, 540, 540, 540, 540, - 540, 542, 540, 540, 540, 2163, 540, 544, 540, 545, - 540, 650, 267, 650, 650, 267, 650, 650, 267, 650, - 1752, 662, 267, 662, 662, 267, 662, 651, 2164, 1755, - 652, 2165, 2166, 652, 751, 540, 540, 663, 2168, 546, - 663, 1285, 1285, 1285, 761, 1286, 547, 2169, 1287, 548, - 1762, 1762, 1762, 1772, 1772, 1772, 549, 554, 555, 267, - 555, 554, 554, 554, 554, 554, 554, 554, 556, 554, - 554, 554, 762, 554, 558, 554, 559, 554, 673, 267, - 673, 673, 267, 673, 2172, 2175, 713, 1030, 1030, 1030, - - 707, 1190, 1190, 1190, 674, 2179, 2180, 674, 2183, 2184, - 3457, 2185, 554, 554, 1031, 1046, 1046, 1046, 560, 1192, - 710, 2188, 1296, 1296, 1296, 2192, 1297, 2193, 710, 1298, - 2196, 2198, 1047, 561, 554, 555, 267, 555, 554, 554, - 554, 554, 554, 554, 554, 556, 554, 554, 554, 711, - 554, 558, 554, 559, 554, 712, 765, 1059, 1059, 1059, - 2203, 2211, 713, 1590, 1590, 1590, 714, 1061, 1061, 1061, - 2181, 2218, 766, 2219, 1060, 1067, 1067, 1067, 2182, 554, - 554, 1070, 1070, 1070, 1062, 560, 1319, 1319, 1319, 2186, - 1320, 2223, 1068, 1321, 1806, 1806, 1806, 2187, 1071, 2224, - - 561, 567, 568, 267, 568, 567, 567, 567, 567, 567, - 567, 567, 569, 567, 567, 567, 2225, 567, 571, 567, - 572, 567, 1085, 1085, 1085, 1087, 1087, 1087, 1099, 1099, - 1099, 1107, 1107, 1107, 1112, 1112, 1112, 2194, 2194, 1086, - 1807, 2226, 1088, 2144, 2228, 1100, 567, 567, 1108, 2232, - 2233, 1113, 573, 2195, 2145, 574, 1337, 1337, 1337, 2195, - 1338, 2234, 2240, 1339, 1808, 1808, 1808, 575, 567, 568, - 267, 568, 567, 567, 567, 567, 567, 567, 567, 569, - 567, 567, 567, 2241, 567, 571, 567, 572, 567, 1118, - 1118, 1118, 1138, 1138, 1138, 1162, 1162, 1162, 1166, 1166, - - 1166, 1171, 1171, 1171, 2242, 2246, 1119, 2247, 2258, 1139, - 1755, 2262, 1163, 567, 567, 1167, 2263, 2264, 1172, 573, - 2266, 2270, 574, 1340, 1340, 1340, 2274, 1341, 2275, 2276, - 1342, 1809, 1809, 1809, 575, 580, 581, 267, 581, 580, - 580, 580, 580, 580, 580, 580, 582, 580, 580, 580, - 2277, 580, 584, 580, 585, 580, 1190, 1190, 1190, 1226, - 1226, 1226, 2278, 2281, 1226, 1226, 1226, 979, 979, 979, - 1236, 1236, 1236, 1985, 1192, 2288, 2290, 1228, 2300, 1986, - 580, 580, 1228, 1987, 980, 2301, 586, 1988, 1238, 2302, - 2303, 587, 580, 581, 267, 581, 580, 580, 580, 580, - - 580, 580, 580, 582, 580, 580, 580, 2305, 580, 584, - 580, 585, 580, 1737, 1193, 1236, 1236, 1236, 987, 987, - 987, 1252, 1252, 1252, 1229, 1244, 1244, 1244, 1247, 1247, - 1247, 2312, 2318, 1238, 1177, 988, 2319, 580, 580, 1254, - 2309, 1737, 1245, 586, 2310, 1248, 2320, 2321, 587, 591, - 592, 267, 592, 591, 591, 591, 591, 591, 591, 591, - 593, 591, 591, 591, 2324, 591, 595, 591, 596, 591, - 1259, 1259, 1259, 1259, 1259, 1259, 1002, 1002, 1002, 1239, - 1267, 1267, 1267, 2326, 1252, 1252, 1252, 2311, 1261, 2327, - 2328, 1261, 2329, 1003, 591, 591, 2333, 2338, 1269, 2340, - - 597, 2341, 1254, 1351, 1351, 1351, 2342, 1352, 2346, 2352, - 1353, 1754, 1754, 1754, 2353, 598, 591, 592, 267, 592, - 591, 591, 591, 591, 591, 591, 591, 593, 591, 591, - 591, 1255, 591, 595, 591, 596, 591, 1262, 1267, 1267, - 1267, 1022, 1022, 1022, 2354, 1290, 1290, 1290, 1290, 1290, - 1290, 1030, 1030, 1030, 2355, 2356, 1269, 1910, 1023, 2357, - 2358, 591, 591, 1292, 2359, 2360, 1292, 597, 1031, 1355, - 1355, 1355, 2361, 1356, 2367, 1270, 1357, 1751, 1751, 1751, - 2368, 2369, 598, 603, 604, 267, 604, 603, 603, 603, - 603, 603, 603, 603, 605, 603, 603, 603, 2370, 603, - - 607, 603, 608, 603, 1300, 1300, 1300, 1300, 1300, 1300, - 1046, 1046, 1046, 2376, 1293, 1306, 1306, 1306, 1306, 1306, - 1306, 2378, 1302, 2382, 2384, 1302, 2386, 1047, 603, 603, - 1312, 1312, 1312, 1308, 609, 2387, 1308, 610, 1374, 1374, - 1374, 2392, 1375, 2393, 2395, 1376, 2396, 2397, 1314, 611, - 603, 604, 267, 604, 603, 603, 603, 603, 603, 603, - 603, 605, 603, 603, 603, 2398, 603, 607, 603, 608, - 603, 2402, 2403, 1303, 1312, 1312, 1312, 2404, 2405, 1309, - 1325, 1325, 1325, 2388, 1325, 1325, 1325, 1332, 1332, 1332, - 2413, 2389, 1314, 2414, 2415, 603, 603, 2416, 1327, 2419, - - 2424, 609, 1327, 2390, 610, 1334, 1377, 1377, 1377, 2428, - 1378, 2391, 2429, 1379, 2434, 2435, 611, 616, 617, 267, - 617, 616, 616, 616, 616, 616, 616, 616, 618, 616, - 616, 616, 2436, 616, 620, 616, 621, 616, 2437, 1315, - 1059, 1059, 1059, 2439, 2430, 1328, 1332, 1332, 1332, 1061, - 1061, 1061, 2431, 1343, 1343, 1343, 2449, 1060, 1343, 1343, - 1343, 2461, 616, 616, 1334, 2432, 1062, 1754, 1754, 1754, - 622, 1345, 623, 2433, 1737, 624, 1345, 2462, 2463, 625, - 1958, 1958, 1958, 626, 616, 617, 267, 617, 616, 616, - 616, 616, 616, 616, 616, 618, 616, 616, 616, 2465, - - 616, 620, 616, 621, 616, 1067, 1067, 1067, 1335, 1070, - 1070, 1070, 2468, 2469, 1358, 1358, 1358, 2455, 2470, 1346, - 2473, 2477, 1068, 1370, 1370, 1370, 1071, 2478, 2479, 616, - 616, 1359, 1085, 1085, 1085, 2480, 2481, 622, 2482, 623, - 1737, 1372, 624, 1759, 1759, 1759, 625, 2483, 2484, 1086, - 626, 632, 633, 267, 633, 632, 632, 632, 632, 632, - 632, 632, 634, 632, 632, 632, 2485, 632, 636, 632, - 637, 632, 1087, 1087, 1087, 1380, 1380, 1380, 1762, 1762, - 1762, 1772, 1772, 1772, 1370, 1370, 1370, 2456, 2486, 1088, - 2499, 2500, 1381, 3457, 3457, 3457, 632, 632, 3457, 3457, - - 3457, 2501, 1372, 2502, 1394, 1394, 1394, 2503, 1395, 2505, - 3457, 1396, 1406, 1406, 1406, 3457, 1407, 2506, 2512, 1408, - 638, 632, 633, 267, 633, 632, 632, 632, 632, 632, - 632, 632, 634, 632, 632, 632, 2513, 632, 636, 632, - 637, 632, 1373, 2514, 1382, 1386, 1386, 1386, 2515, 2516, - 1383, 3457, 3457, 3457, 2517, 1099, 1099, 1099, 2518, 2521, - 3457, 3457, 3457, 1388, 2522, 2523, 632, 632, 3457, 1386, - 1386, 1386, 1100, 2528, 1414, 1414, 1414, 3457, 1415, 2529, - 2530, 1416, 1423, 1423, 1423, 2538, 1424, 1388, 2539, 1425, - 638, 642, 643, 267, 643, 642, 642, 642, 642, 642, - - 642, 642, 644, 642, 642, 642, 1384, 642, 646, 642, - 647, 642, 1385, 1397, 1397, 1397, 1389, 1401, 1401, 1401, - 1401, 1401, 1401, 1107, 1107, 1107, 1409, 1409, 1409, 2524, - 1398, 1963, 1963, 1963, 2540, 1403, 642, 642, 1403, 2525, - 1108, 1966, 1966, 1966, 1411, 2541, 2550, 648, 642, 643, - 267, 643, 642, 642, 642, 642, 642, 642, 642, 644, - 642, 642, 642, 2551, 642, 646, 642, 647, 642, 2552, - 2553, 1404, 1409, 1409, 1409, 1112, 1112, 1112, 1418, 1418, - 1418, 1418, 1418, 1418, 1118, 1118, 1118, 1967, 2555, 2557, - 1411, 2582, 1113, 642, 642, 1964, 1420, 1737, 2583, 1420, - - 1737, 1119, 2585, 2586, 648, 653, 654, 267, 654, 653, - 653, 653, 653, 653, 653, 653, 655, 653, 653, 653, - 2587, 653, 657, 653, 658, 653, 2588, 2589, 1421, 1429, - 1429, 1429, 2578, 1412, 2579, 1429, 1429, 1429, 1433, 1433, - 1433, 1435, 1435, 1435, 1438, 1438, 1438, 1431, 2593, 2594, - 653, 653, 2595, 1431, 2596, 1434, 2597, 2598, 1436, 2599, - 2600, 659, 1440, 1455, 1455, 1455, 2601, 1456, 2602, 2603, - 1457, 1974, 1974, 1974, 660, 653, 654, 267, 654, 653, - 653, 653, 653, 653, 653, 653, 655, 653, 653, 653, - 1432, 653, 657, 653, 658, 653, 1443, 1443, 1443, 2605, - - 2606, 3457, 3457, 3457, 2609, 1438, 1438, 1438, 2610, 2611, - 1447, 1447, 1447, 1444, 1450, 1450, 1450, 1975, 3457, 2612, - 653, 653, 2615, 1440, 3457, 3457, 3457, 1448, 1806, 1806, - 1806, 659, 1452, 1495, 1495, 1495, 2616, 1496, 2617, 2618, - 1497, 3457, 2620, 2621, 660, 664, 665, 267, 665, 664, - 664, 664, 664, 664, 664, 664, 666, 664, 664, 664, - 1437, 664, 668, 664, 669, 664, 1441, 1450, 1450, 1450, - 2623, 3457, 3457, 3457, 1445, 1138, 1138, 1138, 1458, 1458, - 1458, 1458, 1458, 1458, 2624, 1452, 2630, 2631, 3457, 1446, - 664, 664, 1139, 1462, 1462, 1462, 1460, 2632, 2633, 1460, - - 2637, 670, 2607, 2638, 1453, 1502, 1502, 1502, 2639, 1503, - 1463, 2608, 1504, 2640, 671, 664, 665, 267, 665, 664, - 664, 664, 664, 664, 664, 664, 666, 664, 664, 664, - 1449, 664, 668, 664, 669, 664, 1461, 1464, 1464, 1464, - 1466, 1466, 1466, 2641, 1466, 1466, 1466, 1470, 1470, 1470, - 1474, 1474, 1474, 2645, 1465, 3457, 3457, 3457, 1468, 2648, - 664, 664, 1468, 2653, 1471, 2654, 2657, 1475, 1476, 1476, - 1476, 670, 3457, 1485, 1485, 1485, 1491, 1491, 1491, 1476, - 1476, 1476, 2649, 2666, 671, 679, 1478, 2613, 1485, 1485, - 1485, 1487, 694, 2667, 1493, 2650, 2614, 1478, 1491, 1491, - - 1491, 678, 695, 2668, 2669, 1472, 1487, 1162, 1162, 1162, - 1498, 1498, 1498, 2670, 2673, 1469, 1493, 1166, 1166, 1166, - 1473, 1498, 1498, 1498, 1163, 1506, 1506, 1506, 1500, 696, - 697, 698, 2651, 2674, 1167, 699, 700, 701, 2695, 1500, - 702, 703, 2696, 1508, 704, 2652, 705, 706, 707, 679, - 1479, 1177, 1488, 1506, 1506, 1506, 751, 1171, 1171, 1171, - 1737, 2698, 1494, 2699, 1737, 678, 752, 1989, 1510, 1510, - 1510, 1508, 1511, 1990, 1172, 1512, 2700, 1991, 1514, 1514, - 1514, 1992, 1501, 2709, 1514, 1514, 1514, 2710, 1190, 1190, - 1190, 2692, 2711, 696, 753, 708, 1516, 2693, 2712, 754, - - 755, 701, 1516, 2713, 756, 703, 1192, 2694, 757, 2714, - 758, 759, 707, 1190, 1190, 1190, 2715, 1509, 1190, 1190, - 1190, 1557, 1557, 1557, 1226, 1226, 1226, 2716, 1226, 1226, - 1226, 1192, 1226, 1226, 1226, 2717, 1192, 2718, 1558, 1560, - 1560, 1560, 1228, 2719, 2721, 1517, 1228, 1231, 1231, 1231, - 1228, 1232, 2722, 2723, 1233, 2724, 1561, 3457, 3457, 3457, - 1236, 1236, 1236, 2725, 2726, 1526, 1236, 1236, 1236, 1236, - 1236, 1236, 2727, 2703, 3457, 1241, 1241, 1241, 1238, 1242, - 2728, 1559, 1243, 2704, 1238, 2729, 2705, 1238, 1244, 1244, - 1244, 1566, 1566, 1566, 2730, 1567, 2731, 2732, 1568, 2733, - - 1569, 1569, 1569, 2734, 2735, 1245, 1247, 1247, 1247, 1575, - 1575, 1575, 1252, 1252, 1252, 2706, 1564, 1570, 1562, 2736, - 1571, 1571, 1571, 1248, 1572, 2707, 1576, 1573, 2708, 2739, - 1254, 1252, 1252, 1252, 1252, 1252, 1252, 1580, 1580, 1580, - 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1254, - 2740, 2748, 1254, 2749, 1581, 1263, 1263, 1263, 1261, 1264, - 2750, 1261, 1265, 2753, 1261, 1267, 1267, 1267, 1267, 1267, - 1267, 1585, 1585, 1585, 1285, 1285, 1285, 2754, 1286, 2758, - 2759, 1287, 2760, 1269, 2761, 2762, 1269, 2763, 2771, 1586, - 1602, 1602, 1602, 1583, 1578, 1290, 1290, 1290, 1290, 1290, - - 1290, 1290, 1290, 1290, 1296, 1296, 1296, 1603, 1297, 2772, - 2773, 1298, 2799, 1292, 1177, 2801, 1292, 2802, 1737, 1292, - 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1300, 1609, - 1609, 1609, 3457, 3457, 3457, 1306, 1306, 1306, 1302, 2803, - 2807, 1302, 2808, 2796, 1302, 2811, 1610, 2812, 2815, 3457, - 1306, 1306, 1306, 1308, 1306, 1306, 1306, 1613, 1613, 1613, - 2797, 1737, 1604, 3457, 3457, 3457, 2816, 2817, 1308, 1808, - 1808, 1808, 1308, 2818, 1614, 1312, 1312, 1312, 2819, 1611, - 3457, 1312, 1312, 1312, 1312, 1312, 1312, 1608, 1619, 1619, - 1619, 1615, 2820, 1314, 1319, 1319, 1319, 2821, 1320, 1314, - - 2822, 1321, 1314, 2798, 2823, 1620, 1325, 1325, 1325, 1325, - 1325, 1325, 1325, 1325, 1325, 1627, 1627, 1627, 1332, 1332, - 1332, 1612, 2825, 2826, 1327, 2827, 2828, 1327, 2829, 2830, - 1327, 2809, 1628, 1332, 1332, 1332, 1334, 1332, 1332, 1332, - 1630, 1630, 1630, 2813, 2810, 1337, 1337, 1337, 2831, 1338, - 1616, 1334, 1339, 2832, 2833, 1334, 2814, 1631, 1340, 1340, - 1340, 2834, 1341, 2835, 2836, 1342, 1343, 1343, 1343, 1343, - 1343, 1343, 1343, 1343, 1343, 2837, 2839, 1624, 1351, 1351, - 1351, 2851, 1352, 2852, 1345, 1353, 2860, 1345, 2861, 2862, - 1345, 1637, 1637, 1637, 1355, 1355, 1355, 2863, 1356, 2864, - - 2865, 1357, 2866, 2873, 1629, 1358, 1358, 1358, 1638, 1639, - 1639, 1639, 2876, 1640, 2883, 2884, 1641, 1370, 1370, 1370, - 2885, 2886, 1359, 1370, 1370, 1370, 1370, 1370, 1370, 1374, - 1374, 1374, 2887, 1375, 2888, 1372, 1376, 1632, 1377, 1377, - 1377, 1372, 1378, 1177, 1372, 1379, 1380, 1380, 1380, 1654, - 1654, 1654, 2901, 1655, 1737, 2903, 1656, 1386, 1386, 1386, - 1386, 1386, 1386, 1381, 1386, 1386, 1386, 1394, 1394, 1394, - 2904, 1395, 2905, 2906, 1396, 1388, 2781, 2907, 1388, 1397, - 1397, 1397, 1388, 1666, 1666, 1666, 2782, 1667, 2908, 2898, - 1668, 2897, 2783, 1653, 2909, 2910, 1398, 1401, 1401, 1401, - - 1401, 1401, 1401, 1401, 1401, 1401, 1406, 1406, 1406, 2911, - 1407, 2912, 1661, 1408, 2915, 1403, 2916, 2917, 1403, 2918, - 2919, 1403, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, - 1409, 1414, 1414, 1414, 2920, 1415, 2921, 2922, 1416, 2924, - 1411, 2925, 2926, 1411, 2927, 2891, 1411, 1418, 1418, 1418, - 1418, 1418, 1418, 2928, 1671, 1418, 1418, 1418, 2892, 1423, - 1423, 1423, 2929, 1424, 2893, 1420, 1425, 2930, 1420, 1429, - 1429, 1429, 2931, 1420, 1429, 1429, 1429, 2894, 1429, 1429, - 1429, 1433, 1433, 1433, 1682, 1682, 1682, 1431, 1683, 2932, - 2933, 1684, 1431, 2934, 2935, 1673, 1431, 2936, 1434, 1435, - - 1435, 1435, 2948, 2949, 1676, 1685, 1685, 1685, 2950, 1686, - 2957, 2958, 1687, 1438, 1438, 1438, 1436, 1438, 1438, 1438, - 2959, 1438, 1438, 1438, 1443, 1443, 1443, 2960, 1447, 1447, - 1447, 1440, 1809, 1809, 1809, 1440, 2961, 2784, 1681, 1440, - 2962, 1444, 1691, 1691, 1691, 1448, 1692, 2785, 2963, 1693, - 1696, 1696, 1696, 2786, 1697, 2964, 2968, 1698, 1450, 1450, - 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1455, 1455, 1455, - 2969, 1456, 2977, 2978, 1457, 2979, 1452, 2971, 2980, 1452, - 2970, 2981, 1452, 1458, 1458, 1458, 2982, 2972, 1689, 1458, - 1458, 1458, 1458, 1458, 1458, 1462, 1462, 1462, 1703, 1703, - - 1703, 1460, 1704, 2986, 2987, 1705, 2988, 1460, 2989, 2973, - 1460, 2975, 1463, 1464, 1464, 1464, 1706, 1706, 1706, 2974, - 1707, 2976, 2999, 1708, 1466, 1466, 1466, 3000, 1700, 3001, - 1465, 1466, 1466, 1466, 3002, 1466, 1466, 1466, 1470, 1470, - 1470, 3003, 1468, 1710, 1710, 1710, 3004, 1711, 3005, 1468, - 1712, 3006, 1702, 1468, 3010, 1471, 1474, 1474, 1474, 1715, - 1715, 1715, 1177, 1716, 3011, 3012, 1717, 1476, 1476, 1476, - 1476, 1476, 1476, 1475, 1476, 1476, 1476, 1720, 1720, 1720, - 1485, 1485, 1485, 3013, 3014, 1478, 3015, 3017, 1478, 1485, - 1485, 1485, 1478, 3018, 1721, 3019, 2990, 1709, 1487, 1485, - - 1485, 1485, 1491, 1491, 1491, 3020, 3021, 1487, 1491, 1491, - 1491, 1491, 1491, 1491, 1495, 1495, 1495, 1487, 1496, 3022, - 1493, 1497, 1498, 1498, 1498, 3023, 1493, 3024, 3028, 1493, - 1498, 1498, 1498, 1498, 1498, 1498, 1718, 1502, 1502, 1502, - 1500, 1503, 3029, 3030, 1504, 1506, 1506, 1506, 1500, 3033, - 3034, 1500, 1506, 1506, 1506, 1506, 1506, 1506, 3035, 3036, - 1725, 3037, 3038, 1508, 1728, 1510, 1510, 1510, 3043, 1511, - 1508, 3044, 1512, 1508, 1514, 1514, 1514, 1514, 1514, 1514, - 1514, 1514, 1514, 1736, 1736, 1736, 1190, 1190, 1190, 1557, - 1557, 1557, 1516, 1729, 3045, 1516, 3046, 3047, 1516, 3048, - - 3049, 1737, 1738, 3050, 1192, 3051, 1558, 1775, 1775, 1775, - 3052, 1776, 3053, 3054, 1777, 3056, 1731, 1226, 1226, 1226, - 1560, 1560, 1560, 3057, 1779, 1779, 1779, 3058, 1780, 3059, - 1733, 1781, 1236, 1236, 1236, 1228, 1177, 1561, 1566, 1566, - 1566, 3066, 1567, 3067, 3068, 1568, 1569, 1569, 1569, 3069, - 1238, 3070, 1743, 1786, 1786, 1786, 3071, 1787, 3072, 3073, - 1788, 3074, 3075, 1570, 1571, 1571, 1571, 3076, 1572, 3077, - 3078, 1573, 1575, 1575, 1575, 1778, 1790, 1790, 1790, 3060, - 1791, 1784, 3079, 1792, 1252, 1252, 1252, 3082, 3083, 1576, - 1580, 1580, 1580, 1796, 1796, 1796, 3084, 1797, 3085, 3086, - - 1798, 3087, 1254, 1799, 1799, 1799, 3088, 1581, 1259, 1259, - 1259, 1585, 1585, 1585, 1817, 1817, 1817, 2035, 2035, 2035, - 1800, 1602, 1602, 1602, 3089, 3090, 1261, 3096, 3097, 1586, - 3098, 1818, 3105, 3106, 1794, 1819, 1819, 1819, 1603, 1820, - 3107, 3108, 1821, 1290, 1290, 1290, 1300, 1300, 1300, 1609, - 1609, 1609, 1827, 1827, 1827, 3109, 1828, 1801, 3110, 1829, - 3111, 1292, 3112, 3113, 1302, 3114, 1610, 1306, 1306, 1306, - 1613, 1613, 1613, 1832, 1832, 1832, 3115, 1833, 3116, 3119, - 1834, 1312, 1312, 1312, 3120, 1308, 3121, 1614, 1619, 1619, - 1619, 1839, 1839, 1839, 3122, 1840, 3130, 3125, 1841, 1314, - - 1842, 1842, 1842, 1177, 3131, 1620, 3132, 1822, 3128, 3133, - 1826, 1845, 1845, 1845, 1325, 1325, 1325, 1843, 1627, 1627, - 1627, 3134, 1851, 1851, 1851, 3135, 1852, 1831, 1846, 1853, - 3136, 3137, 1327, 3140, 3125, 1628, 1854, 1854, 1854, 1630, - 1630, 1630, 1836, 1856, 1856, 1856, 3141, 1857, 3126, 3123, - 1858, 1343, 1343, 1343, 1855, 3144, 1631, 1847, 1861, 1861, - 1861, 1637, 1637, 1637, 1865, 1865, 1865, 3145, 1866, 1345, - 3146, 1867, 1639, 1639, 1639, 1862, 1640, 3138, 1638, 1641, - 1848, 1870, 1870, 1870, 1370, 1370, 1370, 1654, 1654, 1654, - 3142, 1655, 3147, 3148, 1656, 1881, 1881, 1881, 1871, 3457, - - 3457, 3457, 1372, 3457, 3457, 3457, 3457, 3457, 3457, 1386, - 1386, 1386, 1882, 1888, 1888, 1888, 3457, 1859, 3156, 3139, - 3457, 3149, 3161, 3457, 1666, 1666, 1666, 1388, 1667, 3143, - 1889, 1668, 3162, 3150, 1892, 1892, 1892, 1401, 1401, 1401, - 1409, 1409, 1409, 1418, 1418, 1418, 1904, 1904, 1904, 1880, - 1884, 1893, 1429, 1429, 1429, 1403, 3163, 3164, 1411, 3165, - 3166, 1420, 3151, 1905, 1886, 3157, 1438, 1438, 1438, 1883, - 1431, 1682, 1682, 1682, 3152, 1683, 1885, 3158, 1684, 1685, - 1685, 1685, 3169, 1686, 1440, 3169, 1687, 1691, 1691, 1691, - 1177, 1692, 1906, 3172, 1693, 1696, 1696, 1696, 3173, 1697, - - 1900, 1895, 1698, 1450, 1450, 1450, 1897, 3159, 3174, 1907, - 1458, 1458, 1458, 1703, 1703, 1703, 3125, 1704, 3175, 3160, - 1705, 1452, 1706, 1706, 1706, 3176, 1707, 3179, 1460, 1708, - 3126, 3167, 1909, 1466, 1466, 1466, 1710, 1710, 1710, 3125, - 1711, 1737, 1738, 1712, 3177, 1715, 1715, 1715, 3190, 1716, - 3128, 1468, 1717, 1476, 1476, 1476, 1720, 1720, 1720, 1922, - 1922, 1922, 3178, 1923, 1914, 3188, 1924, 1916, 1485, 1485, - 1485, 1478, 3193, 1721, 1930, 1930, 1930, 1491, 1491, 1491, - 1917, 1498, 1498, 1498, 3189, 3198, 1487, 1934, 1934, 1934, - 3191, 1931, 1506, 1506, 1506, 1493, 1937, 1937, 1937, 1500, - - 1920, 1514, 1514, 1514, 1935, 1736, 1736, 1736, 3201, 3192, - 1508, 3180, 3196, 1938, 1190, 1190, 1190, 1928, 3199, 1516, - 1775, 1775, 1775, 1737, 1776, 3202, 3181, 1777, 1226, 1226, - 1226, 3197, 1192, 1933, 1779, 1779, 1779, 3200, 1780, 3203, - 3169, 1781, 2488, 2489, 1932, 2490, 1228, 1236, 1236, 1236, - 3205, 3169, 1939, 2491, 1936, 3206, 1941, 1786, 1786, 1786, - 2492, 1787, 3207, 3208, 1788, 1238, 1946, 1790, 1790, 1790, - 3209, 1791, 3210, 1942, 1792, 1252, 1252, 1252, 1796, 1796, - 1796, 3211, 1797, 3212, 3213, 1798, 1799, 1799, 1799, 3223, - 1993, 1993, 1993, 1254, 1994, 1976, 3224, 1995, 1979, 1259, - - 1259, 1259, 3225, 1800, 2002, 2002, 2002, 2002, 2002, 2002, - 1963, 1963, 1963, 1817, 1817, 1817, 3226, 1261, 2008, 2008, - 2008, 3227, 2009, 3228, 3232, 2010, 3233, 1819, 1819, 1819, - 1818, 1820, 3234, 3235, 1821, 3236, 1983, 1290, 1290, 1290, - 2014, 2014, 2014, 1300, 1300, 1300, 3237, 1827, 1827, 1827, - 1996, 1828, 3238, 3239, 1829, 1292, 3241, 2015, 1306, 1306, - 1306, 1302, 1832, 1832, 1832, 3242, 1833, 3243, 2003, 1834, - 3244, 1964, 3245, 3246, 2003, 3247, 1308, 2019, 2019, 2019, - 1312, 1312, 1312, 3252, 2011, 1839, 1839, 1839, 3253, 1840, - 2016, 3254, 1841, 3248, 2020, 1842, 1842, 1842, 1314, 2024, - - 2024, 2024, 3255, 2025, 3256, 3249, 2026, 3250, 2027, 2027, - 2027, 3257, 1843, 1845, 1845, 1845, 2029, 2029, 2029, 3251, - 2030, 3258, 3259, 2031, 2018, 2028, 3260, 2033, 2033, 2033, - 1846, 1851, 1851, 1851, 3261, 1852, 3262, 3263, 1853, 1854, - 1854, 1854, 3264, 3265, 2021, 2034, 1856, 1856, 1856, 1177, - 1857, 3267, 3268, 1858, 1343, 1343, 1343, 1855, 1861, 1861, - 1861, 2039, 2039, 2039, 3269, 2040, 3270, 3271, 2041, 2042, - 2042, 2042, 1345, 3272, 3266, 1862, 1865, 1865, 1865, 3273, - 1866, 3274, 3275, 1867, 3276, 3277, 2043, 1870, 1870, 1870, - 2047, 2047, 2047, 3278, 2048, 3279, 3280, 2049, 3281, 3282, - - 2037, 2050, 2050, 2050, 1871, 2056, 2056, 2056, 1370, 1370, - 1370, 1881, 1881, 1881, 2064, 2064, 2064, 3283, 2051, 3457, - 3457, 3457, 2057, 2061, 2061, 2061, 1372, 2062, 1882, 3284, - 2063, 2065, 2067, 2067, 2067, 3285, 3457, 1386, 1386, 1386, - 1888, 1888, 1888, 2071, 2071, 2071, 3286, 2072, 3287, 2068, - 2073, 2074, 2074, 2074, 3288, 1388, 3290, 1889, 1892, 1892, - 1892, 3291, 2077, 2077, 2077, 3292, 2078, 3293, 2075, 2079, - 2081, 2081, 2081, 3294, 2060, 1893, 3295, 2066, 1409, 1409, - 1409, 3296, 1418, 1418, 1418, 1904, 1904, 1904, 2082, 3297, - 3298, 2091, 2091, 2091, 1177, 2092, 1411, 2069, 2093, 3299, - - 1420, 3300, 1905, 2095, 2095, 2095, 1438, 1438, 1438, 2100, - 2100, 2100, 3301, 3289, 2102, 2102, 2102, 3457, 3457, 3457, - 3302, 2096, 3303, 3304, 1440, 3305, 2101, 3306, 3307, 2084, - 2087, 2103, 3308, 3309, 3457, 1450, 1450, 1450, 1458, 1458, - 1458, 1466, 1466, 1466, 2109, 2109, 2109, 2111, 2111, 2111, - 1476, 1476, 1476, 1452, 3311, 3312, 1460, 2098, 3313, 1468, - 3314, 2110, 3315, 1177, 2112, 1922, 1922, 1922, 1478, 1923, - 3316, 3317, 1924, 1485, 1485, 1485, 1930, 1930, 1930, 2493, - 2494, 2104, 2495, 3310, 2107, 2120, 2120, 2120, 3318, 2121, - 2496, 1487, 2122, 1931, 1491, 1491, 1491, 2497, 3319, 1498, - - 1498, 1498, 2105, 1934, 1934, 1934, 2108, 2125, 2125, 2125, - 3320, 2126, 1493, 3321, 2127, 2113, 3322, 1500, 3323, 3324, - 1935, 2128, 2128, 2128, 2118, 1937, 1937, 1937, 2130, 2130, - 2130, 3325, 2131, 3326, 3327, 2132, 2148, 2148, 2148, 2129, - 3328, 3329, 1938, 1514, 1514, 1514, 2138, 2138, 2138, 1190, - 1190, 1190, 3330, 2123, 2124, 1958, 1958, 1958, 2156, 2156, - 2156, 1516, 3332, 2139, 1963, 1963, 1963, 1192, 2157, 2157, - 2157, 1966, 1966, 1966, 2160, 2160, 2160, 2161, 2161, 2161, - 1974, 1974, 1974, 3333, 1226, 1226, 1226, 2170, 2170, 2170, - 2173, 2173, 2173, 1252, 1252, 1252, 2177, 2177, 2177, 3334, - - 1177, 2133, 1228, 3335, 3336, 2171, 3331, 2174, 3337, 3338, - 2140, 1254, 3339, 2178, 1993, 1993, 1993, 3340, 1994, 3341, - 3342, 1995, 1259, 1259, 1259, 2190, 2190, 2190, 2002, 2002, - 2002, 2197, 2197, 2197, 2167, 3343, 2199, 2199, 2199, 3345, - 1261, 3346, 2191, 2008, 2008, 2008, 3347, 2009, 3348, 3349, - 2010, 3350, 2176, 2200, 1290, 1290, 1290, 2204, 2204, 2204, - 2014, 2014, 2014, 2207, 2207, 2207, 3351, 2208, 2189, 3352, - 2209, 3354, 1292, 3355, 2205, 3356, 3357, 2015, 1300, 1300, - 1300, 1177, 2201, 2212, 2212, 2212, 3358, 2019, 2019, 2019, - 2214, 2214, 2214, 3359, 2215, 3344, 1302, 2216, 1312, 1312, - - 1312, 2213, 3360, 2206, 2020, 3361, 3364, 2202, 2024, 2024, - 2024, 3365, 2025, 3366, 3367, 2026, 1314, 2027, 2027, 2027, - 2220, 2220, 2220, 3368, 2221, 3369, 1177, 2222, 2029, 2029, - 2029, 2210, 2030, 1177, 2028, 2031, 2033, 2033, 2033, 2035, - 2035, 2035, 1343, 1343, 1343, 2217, 2039, 2039, 2039, 1177, - 2040, 1177, 1758, 2041, 2034, 2042, 2042, 2042, 1177, 1177, - 1345, 2229, 2229, 2229, 1177, 2230, 3410, 1177, 2231, 2047, - 2047, 2047, 2043, 2048, 3372, 1177, 2049, 2050, 2050, 2050, - 2235, 2235, 2235, 1177, 2236, 3370, 1177, 2237, 2238, 2238, - 2238, 2056, 2056, 2056, 2051, 2243, 2243, 2243, 3384, 2244, - - 2227, 3386, 2245, 3371, 1177, 2239, 3373, 3374, 2057, 1370, - 1370, 1370, 2061, 2061, 2061, 1177, 2062, 1177, 1177, 2063, - 2064, 2064, 2064, 3375, 2249, 2249, 2249, 1372, 2250, 3392, - 3376, 2251, 2252, 2252, 2252, 1757, 3380, 2065, 2067, 2067, - 2067, 2254, 2254, 2254, 1177, 2255, 3381, 3404, 2256, 2253, - 1386, 1386, 1386, 1756, 1177, 2068, 3388, 2071, 2071, 2071, - 2248, 2072, 3377, 3393, 2073, 2074, 2074, 2074, 1388, 2259, - 2259, 2259, 3382, 2260, 1177, 3383, 2261, 2077, 2077, 2077, - 1177, 2078, 2075, 1177, 2079, 2081, 2081, 2081, 1409, 1409, - 1409, 2267, 2267, 2267, 1418, 1418, 1418, 2271, 2271, 2271, - - 3378, 2257, 1177, 2082, 1177, 1177, 1411, 1177, 2268, 2091, - 2091, 2091, 1420, 2092, 2272, 3389, 2093, 2095, 2095, 2095, - 2279, 2279, 2279, 2100, 2100, 2100, 2282, 2282, 2282, 1177, - 2283, 1177, 3379, 2284, 1177, 2096, 1177, 3396, 2280, 3387, - 2101, 1177, 3390, 2273, 2102, 2102, 2102, 2285, 2285, 2285, - 1177, 2286, 2265, 1753, 2287, 2269, 1450, 1450, 1450, 1177, - 3422, 2103, 1458, 1458, 1458, 1466, 1466, 1466, 2109, 2109, - 2109, 2293, 2293, 2293, 1452, 2294, 3385, 1177, 2295, 1177, - 1460, 3432, 3397, 1468, 3405, 2110, 2111, 2111, 2111, 2296, - 2296, 2296, 1177, 2297, 3391, 3398, 2298, 1476, 1476, 1476, - - 1485, 1485, 1485, 2112, 1177, 2120, 2120, 2120, 3399, 2121, - 1177, 2291, 2122, 1177, 3394, 1478, 3395, 1177, 1487, 1491, - 1491, 1491, 2289, 1498, 1498, 1498, 3402, 2125, 2125, 2125, - 2292, 2126, 1177, 1177, 2127, 1177, 1177, 1493, 2128, 2128, - 2128, 1500, 2130, 2130, 2130, 3400, 2131, 3454, 3401, 2132, - 1514, 1514, 1514, 2317, 2317, 2317, 2129, 2138, 2138, 2138, - 1177, 1177, 2299, 1750, 1749, 2304, 3403, 3426, 1516, 3411, - 2306, 2313, 2313, 2313, 2139, 2314, 2307, 3416, 2315, 1190, - 1190, 1190, 2322, 2322, 2322, 2323, 2323, 2323, 2148, 2148, - 2148, 2325, 2325, 2325, 1177, 3408, 2308, 1192, 2330, 2330, - - 2330, 2156, 2156, 2156, 2157, 2157, 2157, 2331, 2331, 2331, - 2160, 2160, 2160, 2161, 2161, 2161, 2334, 2334, 2334, 2335, - 2335, 2335, 2336, 2336, 2336, 2337, 2337, 2337, 1226, 1226, - 1226, 2170, 2170, 2170, 2173, 2173, 2173, 2343, 2343, 2343, - 3406, 2344, 3430, 2316, 2345, 1177, 1228, 1748, 1177, 2171, - 1177, 2174, 1747, 2332, 2347, 2347, 2347, 2177, 2177, 2177, - 2349, 2349, 2349, 1177, 2350, 3431, 1746, 2351, 1259, 1259, - 1259, 1177, 2348, 1177, 2178, 2190, 2190, 2190, 1177, 2339, - 2363, 2363, 2363, 3409, 2364, 1177, 1261, 2365, 2366, 2366, - 2366, 3407, 2191, 2197, 2197, 2197, 2371, 2371, 2371, 2199, - - 2199, 2199, 2373, 2373, 2373, 3417, 2374, 1177, 3414, 2375, - 1290, 1290, 1290, 2204, 2204, 2204, 2200, 2362, 2379, 2379, - 2379, 1177, 2380, 1177, 3418, 2381, 3436, 3412, 1292, 1177, - 2205, 2207, 2207, 2207, 3413, 2208, 1177, 1177, 2209, 1300, - 1300, 1300, 2372, 1177, 2212, 2212, 2212, 2214, 2214, 2214, - 3423, 2215, 1745, 3419, 2216, 1177, 1744, 1302, 1312, 1312, - 1312, 2377, 2213, 2220, 2220, 2220, 3415, 2221, 1177, 3428, - 2222, 1343, 1343, 1343, 3420, 1177, 1314, 2229, 2229, 2229, - 1177, 2230, 1177, 1177, 2231, 2238, 2238, 2238, 3424, 1345, - 2383, 2235, 2235, 2235, 1177, 2236, 3437, 1177, 2237, 2399, - - 2399, 2399, 2239, 2400, 3425, 3421, 2401, 1177, 2243, 2243, - 2243, 2385, 2244, 1177, 3427, 2245, 2406, 2406, 2406, 1370, - 1370, 1370, 3433, 2249, 2249, 2249, 2394, 2250, 3429, 3440, - 2251, 3434, 1742, 2407, 2252, 2252, 2252, 1372, 2409, 2409, - 2409, 1177, 2410, 1177, 3435, 2411, 2254, 2254, 2254, 1177, - 2255, 2253, 1177, 2256, 1386, 1386, 1386, 2259, 2259, 2259, - 1741, 2260, 1177, 1740, 2261, 1739, 2417, 2417, 2417, 2267, - 2267, 2267, 1388, 2420, 2420, 2420, 3438, 2421, 3439, 1177, - 2422, 3444, 1177, 2408, 2418, 1732, 2268, 1418, 1418, 1418, - 2271, 2271, 2271, 2425, 2425, 2425, 1177, 2426, 3441, 3442, - - 2427, 2279, 2279, 2279, 3446, 1420, 1730, 2272, 2282, 2282, - 2282, 3445, 2283, 1177, 3448, 2284, 1450, 1450, 1450, 2280, - 2412, 2285, 2285, 2285, 1177, 2286, 1727, 1177, 2287, 1177, - 1458, 1458, 1458, 3443, 1452, 1466, 1466, 1466, 2293, 2293, - 2293, 1726, 2294, 1724, 1723, 2295, 3447, 2423, 1460, 1722, - 2296, 2296, 2296, 1468, 2297, 1177, 3449, 2298, 1476, 1476, - 1476, 1719, 2443, 2443, 2443, 1714, 1713, 2438, 3457, 3457, - 3457, 2441, 3457, 3457, 3457, 3450, 1478, 3451, 2442, 2444, - 3457, 3457, 3457, 1701, 1699, 3457, 1485, 1485, 1485, 3457, - 1491, 1491, 1491, 2451, 2451, 2451, 2440, 3457, 1514, 1514, - - 1514, 2457, 2457, 2457, 1487, 2454, 2454, 2454, 1493, 1177, - 3454, 2452, 1695, 2313, 2313, 2313, 1516, 2314, 1694, 2445, - 2315, 1177, 1690, 1177, 1190, 1190, 1190, 2317, 2317, 2317, - 2459, 2459, 2459, 2460, 2460, 2460, 2446, 1688, 1680, 2447, - 1679, 3452, 1192, 2322, 2322, 2322, 2323, 2323, 2323, 1678, - 2450, 2448, 2325, 2325, 2325, 2464, 2464, 2464, 1677, 1675, - 2453, 2466, 2466, 2466, 2467, 2467, 2467, 2330, 2330, 2330, - 2331, 2331, 2331, 2334, 2334, 2334, 2335, 2335, 2335, 2336, - 2336, 2336, 1674, 2458, 2337, 2337, 2337, 2471, 2471, 2471, - 2474, 2474, 2474, 2343, 2343, 2343, 1177, 2344, 1672, 1670, - - 2345, 3457, 3457, 3457, 1669, 2472, 1665, 2475, 2347, 2347, - 2347, 1664, 2349, 2349, 2349, 1663, 2350, 1662, 3457, 2351, - 1259, 1259, 1259, 2363, 2363, 2363, 2348, 2364, 3453, 1660, - 2365, 2366, 2366, 2366, 2498, 2498, 2498, 1659, 1261, 2371, - 2371, 2371, 2373, 2373, 2373, 1658, 2374, 1657, 1650, 2375, - 1290, 1290, 1290, 2379, 2379, 2379, 1649, 2380, 1648, 1647, - 2381, 2507, 2507, 2507, 1312, 1312, 1312, 2476, 1292, 2509, - 2509, 2509, 2519, 2519, 2519, 1343, 1343, 1343, 1646, 2508, - 1645, 2487, 1314, 2399, 2399, 2399, 2510, 2400, 1644, 1643, - 2401, 1642, 1636, 1345, 1635, 1634, 2504, 2526, 2526, 2526, - - 2406, 2406, 2406, 2531, 2531, 2531, 1633, 2532, 1626, 1625, - 2533, 2534, 2534, 2534, 2527, 2511, 1623, 2407, 2409, 2409, - 2409, 1622, 2410, 1621, 1618, 2411, 2536, 2536, 2536, 2535, - 2417, 2417, 2417, 1617, 1607, 2520, 2542, 2542, 2542, 2420, - 2420, 2420, 1606, 2421, 2537, 1605, 2422, 1601, 2418, 1418, - 1418, 1418, 1600, 2543, 1599, 2545, 2545, 2545, 2425, 2425, - 2425, 1598, 2426, 1597, 1596, 2427, 1595, 1420, 3457, 3457, - 3457, 1594, 2546, 3457, 3457, 3457, 3457, 3457, 3457, 2556, - 2556, 2556, 2560, 2560, 2560, 3457, 2558, 2558, 2558, 1592, - 3457, 1591, 1589, 3457, 1458, 1458, 1458, 1588, 1587, 2561, - - 2544, 2547, 1584, 1582, 2559, 1579, 1466, 1466, 1466, 2443, - 2443, 2443, 1460, 1476, 1476, 1476, 1577, 1574, 2565, 2565, - 2565, 1565, 2566, 2548, 1468, 2567, 2444, 2554, 2568, 2568, - 2568, 1478, 1563, 1556, 2549, 3457, 3457, 3457, 3457, 3457, - 3457, 2572, 2572, 2572, 1554, 2569, 2574, 2574, 2574, 1553, - 2564, 1552, 3457, 1551, 2562, 3457, 1491, 1491, 1491, 2573, - 2451, 2451, 2451, 1514, 1514, 1514, 1550, 2563, 1549, 2454, - 2454, 2454, 1548, 1547, 1493, 2457, 2457, 2457, 2452, 1546, - 1545, 1516, 2580, 2580, 2580, 1542, 2570, 1177, 1541, 2571, - 2459, 2459, 2459, 2460, 2460, 2460, 2584, 2584, 2584, 1540, - - 2581, 2464, 2464, 2464, 2466, 2466, 2466, 2467, 2467, 2467, - 2471, 2471, 2471, 2474, 2474, 2474, 2590, 2590, 2590, 1539, - 2591, 1538, 2575, 2592, 1259, 1259, 1259, 2576, 2472, 1537, - 2475, 2577, 2498, 2498, 2498, 2619, 2619, 2619, 1290, 1290, - 1290, 1536, 1261, 2507, 2507, 2507, 2509, 2509, 2509, 1535, - 2625, 2625, 2625, 1533, 2626, 1532, 1292, 2627, 2628, 2628, - 2628, 2508, 1531, 2510, 2634, 2634, 2634, 2519, 2519, 2519, - 1343, 1343, 1343, 2526, 2526, 2526, 2629, 1530, 2642, 2642, - 2642, 2635, 2643, 1529, 2604, 2644, 1528, 1527, 1345, 1525, - 2527, 2646, 2646, 2646, 2531, 2531, 2531, 1524, 2532, 1523, - - 1522, 2533, 1521, 1520, 2622, 2534, 2534, 2534, 2647, 1519, - 2536, 2536, 2536, 2655, 2655, 2655, 2542, 2542, 2542, 2661, - 2661, 2661, 1177, 2535, 2556, 2556, 2556, 2636, 2537, 1513, - 2656, 1505, 1490, 2543, 2658, 2658, 2658, 2662, 2659, 1489, - 1484, 2660, 2545, 2545, 2545, 2663, 2663, 2663, 1483, 2664, - 1482, 1481, 2665, 2671, 2671, 2671, 2558, 2558, 2558, 2546, - 2560, 2560, 2560, 1480, 2675, 2675, 2675, 1454, 2676, 1442, - 2672, 2677, 1428, 1427, 2559, 1426, 1422, 2561, 2678, 2678, - 2678, 1466, 1466, 1466, 1417, 1476, 1476, 1476, 2565, 2565, - 2565, 1413, 2566, 1405, 1400, 2567, 2679, 1399, 1393, 1468, - - 2568, 2568, 2568, 1478, 2682, 2682, 2682, 1390, 2683, 1369, - 1368, 2684, 2685, 2685, 2685, 1367, 1366, 2569, 2687, 2687, - 2687, 2572, 2572, 2572, 2574, 2574, 2574, 1365, 1364, 2686, - 1363, 1362, 2689, 2689, 2689, 2688, 1514, 1514, 1514, 2573, - 2580, 2580, 2580, 2584, 2584, 2584, 1361, 1360, 2680, 2681, - 2690, 2697, 2697, 2697, 1516, 2701, 2701, 2701, 2581, 2590, - 2590, 2590, 1354, 2591, 1347, 1336, 2592, 1259, 1259, 1259, - 1331, 1330, 2702, 2619, 2619, 2619, 1290, 1290, 1290, 2738, - 2738, 2738, 2625, 2625, 2625, 1261, 2626, 1324, 1323, 2627, - 2628, 2628, 2628, 1322, 1292, 1318, 1317, 2691, 2741, 2741, - - 2741, 2634, 2634, 2634, 1316, 2743, 2743, 2743, 2629, 2744, - 1311, 1310, 2745, 1305, 1304, 2742, 1299, 1295, 2635, 2746, - 2746, 2746, 2751, 2751, 2751, 1289, 1288, 2720, 2642, 2642, - 2642, 1284, 2643, 1283, 1282, 2644, 1281, 2747, 1280, 2752, - 2646, 2646, 2646, 1279, 2755, 2755, 2755, 2737, 2756, 1278, - 1277, 2757, 2764, 2764, 2764, 1276, 1275, 2647, 2655, 2655, - 2655, 2766, 2766, 2766, 1274, 2767, 1273, 1272, 2768, 2765, - 2769, 2769, 2769, 1266, 1258, 2656, 2658, 2658, 2658, 1257, - 2659, 1256, 1251, 2660, 2661, 2661, 2661, 2770, 2663, 2663, - 2663, 1250, 2664, 1249, 1246, 2665, 2671, 2671, 2671, 2774, - - 2774, 2774, 2662, 2775, 1240, 1235, 2776, 2777, 2777, 2777, - 2779, 2779, 2779, 2672, 2675, 2675, 2675, 1234, 2676, 1230, - 1225, 2677, 1224, 1223, 2778, 1222, 1221, 2780, 2678, 2678, - 2678, 1466, 1466, 1466, 1476, 1476, 1476, 2682, 2682, 2682, - 1220, 2683, 1219, 1217, 2684, 1216, 2679, 1215, 1214, 1468, - 1213, 1212, 1478, 2685, 2685, 2685, 2789, 2789, 2789, 1211, - 2790, 1210, 1209, 2791, 2687, 2687, 2687, 2792, 2792, 2792, - 2686, 2793, 1208, 1205, 2794, 2689, 2689, 2689, 1514, 1514, - 1514, 2688, 2800, 2800, 2800, 2697, 2697, 2697, 2701, 2701, - 2701, 1204, 1203, 2690, 1202, 2788, 1516, 2787, 1201, 2804, - - 2804, 2804, 1200, 2805, 1199, 2702, 2806, 1259, 1259, 1259, - 2838, 2838, 2838, 2840, 2840, 2840, 1290, 1290, 1290, 2738, - 2738, 2738, 2843, 2843, 2843, 1261, 2845, 2845, 2845, 1198, - 2841, 2741, 2741, 2741, 1292, 2800, 2800, 2800, 1197, 2844, - 2795, 1196, 1189, 2846, 1188, 2848, 2848, 2848, 2742, 2849, - 1187, 1186, 2850, 2743, 2743, 2743, 1185, 2744, 2824, 1184, - 2745, 2746, 2746, 2746, 2853, 2853, 2853, 2751, 2751, 2751, - 1183, 1180, 2847, 2855, 2855, 2855, 1178, 2856, 2842, 2747, - 2857, 2854, 1177, 1175, 2752, 2858, 2858, 2858, 2755, 2755, - 2755, 1173, 2756, 1170, 1168, 2757, 2764, 2764, 2764, 2867, - - 2867, 2867, 2859, 2868, 1165, 1161, 2869, 2766, 2766, 2766, - 1159, 2767, 1158, 2765, 2768, 2769, 2769, 2769, 2870, 2870, - 2870, 1157, 2871, 1155, 1154, 2872, 2874, 2874, 2874, 2774, - 2774, 2774, 2770, 2775, 1153, 1152, 2776, 2777, 2777, 2777, - 2877, 2877, 2877, 2875, 2878, 1151, 1150, 2879, 2779, 2779, - 2779, 2880, 2880, 2880, 2778, 2881, 1148, 1147, 2882, 1466, - 1466, 1466, 1476, 1476, 1476, 2780, 2789, 2789, 2789, 1146, - 2790, 1145, 1143, 2791, 2792, 2792, 2792, 1468, 2793, 1142, - 1478, 2794, 2895, 2895, 2895, 2899, 2899, 2899, 2902, 2902, - 2902, 2804, 2804, 2804, 1141, 2805, 1137, 1136, 2806, 1134, - - 2896, 1133, 2900, 1737, 2913, 2913, 2913, 1259, 1259, 1259, - 2889, 2838, 2838, 2838, 2937, 2937, 2937, 2840, 2840, 2840, - 1132, 2914, 1290, 1290, 1290, 1261, 2938, 2938, 2938, 2890, - 2939, 1131, 1130, 2940, 2841, 2843, 2843, 2843, 1129, 1127, - 1292, 2942, 2942, 2942, 1126, 2943, 1125, 1124, 2944, 2845, - 2845, 2845, 2844, 2945, 2945, 2945, 2923, 2946, 1122, 1121, - 2947, 2848, 2848, 2848, 1120, 2849, 2846, 1117, 2850, 2853, - 2853, 2853, 1116, 2941, 2951, 2951, 2951, 1114, 2952, 1111, - 1110, 2953, 1106, 2855, 2855, 2855, 2854, 2856, 1105, 1103, - 2857, 2858, 2858, 2858, 2954, 2954, 2954, 1102, 2955, 1101, - - 1098, 2956, 2867, 2867, 2867, 1097, 2868, 1096, 2859, 2869, - 2870, 2870, 2870, 1095, 2871, 1093, 1092, 2872, 2874, 2874, - 2874, 2965, 2965, 2965, 1091, 2966, 1090, 1089, 2967, 2877, - 2877, 2877, 1084, 2878, 1082, 2875, 2879, 2880, 2880, 2880, - 1081, 2881, 1080, 1079, 2882, 2983, 2983, 2983, 1476, 1476, - 1476, 2895, 2895, 2895, 2991, 2991, 2991, 2899, 2899, 2899, - 2993, 2993, 2993, 2984, 2994, 1078, 1478, 2995, 1077, 2896, - 1076, 2992, 1737, 1075, 2900, 1737, 1074, 1073, 1737, 2996, - 2996, 2996, 2902, 2902, 2902, 2997, 2997, 2997, 2998, 2998, - 2998, 2913, 2913, 2913, 3007, 3007, 3007, 1072, 3008, 1069, - - 1066, 3009, 1259, 1259, 1259, 3025, 3025, 3025, 2914, 2937, - 2937, 2937, 1065, 1064, 2985, 2938, 2938, 2938, 1058, 2939, - 1261, 1057, 2940, 3026, 3026, 3026, 2942, 2942, 2942, 1055, - 2943, 1052, 1050, 2944, 1049, 2945, 2945, 2945, 1048, 2946, - 1043, 3027, 2947, 2951, 2951, 2951, 1042, 2952, 1040, 1039, - 2953, 2954, 2954, 2954, 1038, 2955, 1036, 1035, 2956, 3031, - 3031, 3031, 3039, 3039, 3039, 2965, 2965, 2965, 3016, 2966, - 1034, 1032, 2967, 3041, 3041, 3041, 3032, 1029, 1027, 3040, - 2983, 2983, 2983, 1476, 1476, 1476, 2991, 2991, 2991, 1025, - 3042, 1024, 3061, 3061, 3061, 1021, 3062, 1016, 2984, 3063, - - 1015, 1478, 1012, 2992, 1737, 2993, 2993, 2993, 1011, 2994, - 1737, 1010, 2995, 2996, 2996, 2996, 2997, 2997, 2997, 2998, - 2998, 2998, 1007, 1737, 3007, 3007, 3007, 1006, 3008, 1004, - 1001, 3009, 999, 998, 3055, 1735, 1735, 1735, 1735, 1735, - 1735, 1735, 1735, 1735, 997, 996, 1735, 3080, 3080, 3080, - 994, 1735, 1735, 1735, 1737, 1735, 3025, 3025, 3025, 3026, - 3026, 3026, 3031, 3031, 3031, 3081, 3091, 3091, 3091, 993, - 3092, 992, 991, 3093, 3094, 3094, 3094, 3027, 990, 3032, - 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, - 1735, 3095, 989, 1735, 3039, 3039, 3039, 986, 1735, 1735, - - 1735, 1737, 1735, 3099, 3099, 3099, 985, 3100, 984, 981, - 3101, 3040, 3041, 3041, 3041, 3102, 3102, 3102, 978, 3103, - 977, 975, 3104, 3117, 3117, 3117, 974, 1735, 1735, 3042, - 3061, 3061, 3061, 971, 3062, 968, 965, 3063, 964, 956, - 955, 3118, 954, 3080, 3080, 3080, 953, 947, 1737, 1735, - 1735, 1735, 1735, 1735, 3129, 1735, 1735, 1735, 946, 945, - 1735, 3081, 3094, 3094, 3094, 1735, 1735, 1735, 1737, 1735, - 3091, 3091, 3091, 943, 3092, 942, 941, 3093, 940, 3095, - 3153, 3153, 3153, 939, 3154, 938, 933, 3155, 3117, 3117, - 3117, 3171, 3171, 3171, 1735, 1735, 1735, 1735, 1735, 1735, - - 1735, 1735, 1735, 1735, 3129, 930, 3118, 1735, 932, 1737, - 1738, 927, 1735, 1735, 1735, 1737, 1735, 3099, 3099, 3099, - 926, 3100, 924, 922, 3101, 3102, 3102, 3102, 921, 3103, - 919, 917, 3104, 3182, 3182, 3182, 3184, 3184, 3184, 915, - 913, 1735, 1735, 3186, 3186, 3186, 911, 3153, 3153, 3153, - 3183, 3154, 908, 3185, 3155, 3194, 3194, 3194, 907, 906, - 3187, 3204, 3204, 3204, 3171, 3171, 3171, 3182, 3182, 3182, - 905, 904, 3195, 3214, 3214, 3214, 902, 3215, 900, 1177, - 3216, 899, 1737, 898, 3183, 3184, 3184, 3184, 3217, 3217, - 3217, 896, 3218, 894, 893, 3219, 3186, 3186, 3186, 3220, - - 3220, 3220, 3185, 3221, 891, 889, 3222, 3194, 3194, 3194, - 3229, 3229, 3229, 3187, 3230, 1941, 888, 3231, 3204, 3204, - 3204, 3214, 3214, 3214, 3195, 3215, 886, 882, 3216, 881, - 3217, 3217, 3217, 879, 3218, 874, 1177, 3219, 3220, 3220, - 3220, 872, 3221, 868, 867, 3222, 3229, 3229, 3229, 866, - 3230, 864, 862, 3231, 861, 3240, 3353, 3353, 3353, 3353, - 3353, 3353, 860, 3362, 858, 856, 3363, 3455, 3455, 3455, - 3455, 3455, 3455, 855, 1177, 853, 851, 1177, 850, 849, - 848, 847, 846, 845, 843, 3456, 841, 840, 3456, 264, - 264, 264, 264, 264, 264, 264, 264, 264, 265, 265, - - 265, 265, 265, 265, 265, 265, 265, 270, 270, 270, - 270, 270, 270, 270, 270, 270, 273, 273, 273, 273, - 273, 273, 273, 273, 273, 276, 276, 276, 276, 276, - 276, 276, 276, 276, 279, 279, 279, 279, 279, 279, - 279, 279, 279, 286, 286, 286, 286, 286, 286, 286, - 286, 286, 294, 294, 294, 294, 294, 294, 294, 294, - 294, 298, 298, 298, 298, 298, 298, 298, 298, 298, - 310, 310, 310, 310, 310, 310, 310, 310, 310, 314, - 314, 314, 314, 314, 314, 314, 314, 314, 321, 321, - 321, 321, 321, 321, 321, 321, 321, 332, 332, 332, - - 332, 332, 332, 332, 332, 332, 340, 340, 340, 340, - 340, 340, 340, 340, 340, 346, 346, 346, 346, 346, - 346, 346, 346, 346, 352, 352, 352, 352, 352, 352, - 352, 352, 352, 358, 358, 358, 358, 358, 358, 358, - 358, 358, 363, 363, 363, 363, 363, 363, 363, 363, - 363, 382, 382, 382, 382, 382, 382, 382, 382, 382, - 389, 389, 389, 389, 389, 389, 389, 389, 389, 397, - 397, 397, 397, 397, 397, 397, 397, 397, 403, 403, - 403, 403, 403, 403, 403, 403, 403, 410, 410, 410, - 410, 410, 410, 410, 410, 410, 415, 415, 415, 415, - - 415, 415, 415, 415, 415, 421, 421, 421, 421, 421, - 421, 421, 421, 421, 426, 426, 426, 426, 426, 426, - 426, 426, 426, 432, 432, 432, 432, 432, 432, 432, - 432, 432, 440, 440, 440, 440, 440, 440, 440, 440, - 440, 448, 448, 448, 448, 448, 448, 448, 448, 448, - 452, 452, 452, 452, 452, 452, 452, 452, 452, 458, - 458, 458, 458, 458, 458, 458, 458, 458, 464, 464, - 464, 464, 464, 464, 464, 464, 464, 482, 482, 482, - 482, 482, 482, 482, 482, 482, 489, 489, 489, 489, - 489, 489, 489, 489, 489, 498, 498, 498, 498, 498, - - 498, 498, 498, 498, 504, 504, 504, 504, 504, 504, - 504, 504, 504, 514, 514, 514, 514, 514, 514, 514, - 514, 514, 520, 520, 520, 520, 520, 520, 520, 520, - 520, 525, 525, 525, 525, 525, 525, 525, 525, 525, - 531, 531, 531, 531, 531, 531, 531, 531, 531, 537, - 537, 537, 537, 537, 537, 537, 537, 537, 543, 543, - 543, 543, 543, 543, 543, 543, 543, 550, 550, 550, - 550, 550, 550, 550, 550, 550, 557, 557, 557, 557, - 557, 557, 557, 557, 557, 562, 562, 562, 562, 562, - 562, 562, 562, 562, 570, 570, 570, 570, 570, 570, - - 570, 570, 570, 576, 576, 576, 576, 576, 576, 576, - 576, 576, 583, 583, 583, 583, 583, 583, 583, 583, - 583, 588, 588, 588, 588, 588, 588, 588, 588, 588, - 594, 594, 594, 594, 594, 594, 594, 594, 594, 599, - 599, 599, 599, 599, 599, 599, 599, 599, 606, 606, - 606, 606, 606, 606, 606, 606, 606, 612, 612, 612, - 612, 612, 612, 612, 612, 612, 619, 619, 619, 619, - 619, 619, 619, 619, 619, 627, 627, 627, 627, 627, - 627, 627, 627, 627, 635, 635, 635, 635, 635, 635, - 635, 635, 635, 639, 639, 639, 639, 639, 639, 639, - - 639, 639, 645, 645, 645, 645, 645, 645, 645, 645, - 645, 649, 649, 649, 649, 649, 649, 649, 649, 649, - 656, 656, 656, 656, 656, 656, 656, 656, 656, 661, - 661, 661, 661, 661, 661, 661, 661, 661, 667, 667, - 667, 667, 667, 667, 667, 667, 667, 672, 672, 672, - 672, 672, 672, 672, 672, 672, 692, 692, 692, 837, - 836, 835, 692, 719, 719, 719, 833, 831, 820, 719, - 723, 723, 723, 819, 816, 814, 723, 731, 731, 731, - 812, 811, 810, 731, 742, 742, 742, 808, 806, 804, - 742, 748, 748, 748, 803, 801, 798, 748, 771, 771, - - 771, 797, 796, 794, 771, 779, 779, 779, 792, 791, - 789, 779, 785, 785, 785, 787, 786, 784, 785, 790, - 790, 790, 782, 781, 780, 790, 795, 795, 795, 778, - 775, 774, 795, 805, 805, 805, 773, 772, 770, 805, - 809, 809, 809, 3457, 717, 750, 809, 815, 815, 815, - 749, 747, 745, 815, 834, 834, 834, 744, 743, 741, - 834, 844, 844, 844, 737, 733, 732, 844, 854, 854, - 854, 730, 729, 726, 854, 859, 859, 859, 725, 724, - 722, 859, 865, 865, 865, 721, 720, 718, 865, 873, - 873, 873, 713, 3457, 693, 873, 880, 880, 880, 691, - - 689, 683, 880, 887, 887, 887, 682, 683, 682, 887, - 892, 892, 892, 681, 680, 3457, 892, 897, 897, 897, - 3457, 3457, 3457, 897, 903, 903, 903, 3457, 3457, 3457, - 903, 912, 912, 912, 3457, 3457, 3457, 912, 916, 916, - 916, 3457, 3457, 3457, 916, 920, 920, 920, 3457, 3457, - 3457, 920, 925, 925, 925, 3457, 3457, 3457, 925, 929, - 929, 929, 929, 929, 929, 929, 3457, 929, 692, 692, - 692, 3457, 3457, 3457, 692, 944, 3457, 3457, 3457, 944, - 719, 719, 719, 3457, 3457, 3457, 719, 976, 3457, 3457, - 3457, 976, 723, 723, 723, 3457, 3457, 3457, 723, 983, - - 3457, 3457, 3457, 983, 731, 731, 731, 3457, 3457, 3457, - 731, 995, 3457, 3457, 3457, 995, 742, 742, 742, 3457, - 3457, 3457, 742, 1000, 3457, 3457, 3457, 1000, 748, 748, - 748, 3457, 3457, 3457, 748, 1005, 3457, 3457, 3457, 1005, - 771, 771, 771, 3457, 3457, 3457, 771, 1026, 3457, 3457, - 3457, 1026, 779, 779, 779, 3457, 3457, 3457, 779, 1033, - 3457, 3457, 3457, 1033, 785, 785, 785, 3457, 3457, 3457, - 785, 1037, 3457, 3457, 3457, 1037, 790, 790, 790, 3457, - 3457, 3457, 790, 1041, 3457, 3457, 3457, 1041, 795, 795, - 795, 3457, 3457, 3457, 795, 1051, 3457, 3457, 3457, 1051, - - 805, 805, 805, 3457, 3457, 3457, 805, 1056, 3457, 3457, - 3457, 1056, 809, 809, 809, 3457, 3457, 3457, 809, 1063, - 3457, 3457, 3457, 1063, 815, 815, 815, 3457, 3457, 3457, - 815, 1083, 3457, 3457, 3457, 1083, 834, 834, 834, 3457, - 3457, 3457, 834, 1094, 3457, 3457, 3457, 1094, 844, 844, - 844, 3457, 3457, 3457, 844, 1104, 3457, 3457, 3457, 1104, - 854, 854, 854, 3457, 3457, 3457, 854, 1109, 3457, 3457, - 3457, 1109, 859, 859, 859, 3457, 3457, 3457, 859, 1115, - 3457, 3457, 3457, 1115, 865, 865, 865, 3457, 3457, 3457, - 865, 1123, 3457, 3457, 3457, 1123, 873, 873, 873, 3457, - - 3457, 3457, 873, 1128, 3457, 3457, 3457, 1128, 880, 880, - 880, 3457, 3457, 3457, 880, 1135, 3457, 3457, 3457, 1135, - 887, 887, 887, 3457, 3457, 3457, 887, 1140, 3457, 3457, - 3457, 1140, 892, 892, 892, 3457, 3457, 3457, 892, 1144, - 3457, 3457, 3457, 1144, 897, 897, 897, 3457, 3457, 3457, - 897, 1149, 3457, 3457, 3457, 1149, 903, 903, 903, 3457, - 3457, 3457, 903, 1156, 3457, 3457, 3457, 1156, 912, 912, - 912, 3457, 3457, 3457, 912, 1160, 3457, 3457, 3457, 1160, - 916, 916, 916, 3457, 3457, 3457, 916, 1164, 3457, 3457, - 3457, 1164, 920, 920, 920, 3457, 3457, 3457, 920, 1169, - - 3457, 3457, 3457, 1169, 925, 925, 925, 3457, 3457, 3457, - 925, 1174, 3457, 3457, 3457, 1174, 1176, 1176, 1176, 1176, - 1176, 1176, 1176, 1176, 1176, 1182, 3457, 3457, 3457, 3457, - 1182, 692, 692, 692, 3457, 3457, 3457, 692, 1191, 1191, - 1191, 1191, 3457, 3457, 1191, 1191, 719, 719, 719, 3457, - 3457, 3457, 719, 1227, 1227, 1227, 1227, 3457, 3457, 1227, - 1227, 723, 723, 723, 3457, 3457, 3457, 723, 1237, 1237, - 1237, 1237, 3457, 3457, 1237, 1237, 731, 731, 731, 3457, - 3457, 3457, 731, 1253, 1253, 1253, 1253, 3457, 3457, 1253, - 1253, 742, 742, 742, 3457, 3457, 3457, 742, 1260, 1260, - - 1260, 1260, 3457, 3457, 1260, 1260, 748, 748, 748, 3457, - 3457, 3457, 748, 1268, 1268, 1268, 1268, 3457, 3457, 1268, - 1268, 771, 771, 771, 3457, 3457, 3457, 771, 1291, 1291, - 1291, 1291, 3457, 3457, 1291, 1291, 779, 779, 779, 3457, - 3457, 3457, 779, 1301, 1301, 1301, 1301, 3457, 3457, 1301, - 1301, 785, 785, 785, 3457, 3457, 3457, 785, 1307, 1307, - 1307, 1307, 3457, 3457, 1307, 1307, 790, 790, 790, 3457, - 3457, 3457, 790, 1313, 1313, 1313, 1313, 3457, 3457, 1313, - 1313, 795, 795, 795, 3457, 3457, 3457, 795, 1326, 1326, - 1326, 1326, 3457, 3457, 1326, 1326, 805, 805, 805, 3457, - - 3457, 3457, 805, 1333, 1333, 1333, 1333, 3457, 3457, 1333, - 1333, 809, 809, 809, 3457, 3457, 3457, 809, 1344, 1344, - 1344, 1344, 3457, 3457, 1344, 1344, 815, 815, 815, 3457, - 3457, 3457, 815, 1371, 1371, 1371, 1371, 3457, 3457, 1371, - 1371, 834, 834, 834, 834, 3457, 834, 3457, 834, 1387, - 1387, 1387, 1387, 3457, 3457, 1387, 1387, 844, 844, 844, - 3457, 3457, 3457, 844, 1402, 1402, 1402, 1402, 3457, 3457, - 1402, 1402, 854, 854, 854, 3457, 3457, 3457, 854, 1410, - 1410, 1410, 1410, 3457, 3457, 1410, 1410, 859, 859, 859, - 3457, 3457, 3457, 859, 1419, 1419, 1419, 1419, 3457, 3457, - - 1419, 1419, 865, 865, 865, 3457, 3457, 3457, 865, 1430, - 1430, 1430, 1430, 3457, 3457, 1430, 1430, 873, 873, 873, - 873, 3457, 873, 3457, 873, 1439, 1439, 1439, 1439, 3457, - 3457, 1439, 1439, 880, 880, 880, 880, 3457, 880, 3457, - 880, 1451, 1451, 1451, 1451, 3457, 3457, 1451, 1451, 887, - 887, 887, 3457, 3457, 3457, 887, 1459, 1459, 1459, 1459, - 3457, 3457, 1459, 1459, 892, 892, 892, 892, 3457, 892, - 3457, 892, 1467, 1467, 1467, 1467, 3457, 3457, 1467, 1467, - 897, 897, 897, 897, 3457, 897, 3457, 897, 1477, 1477, - 1477, 1477, 3457, 3457, 1477, 1477, 903, 903, 903, 3457, - - 3457, 3457, 903, 1486, 1486, 1486, 1486, 3457, 3457, 1486, - 1486, 912, 912, 912, 3457, 3457, 3457, 912, 1492, 1492, - 1492, 1492, 3457, 3457, 1492, 1492, 1499, 1499, 1499, 1499, - 3457, 3457, 1499, 1499, 920, 920, 920, 3457, 3457, 3457, - 920, 1507, 1507, 1507, 1507, 3457, 3457, 1507, 1507, 925, - 925, 925, 3457, 3457, 3457, 925, 1515, 1515, 1515, 1515, - 3457, 3457, 1515, 1515, 1176, 1176, 1176, 1176, 1176, 1176, - 1176, 1176, 1176, 1182, 3457, 1182, 3457, 3457, 1182, 692, - 692, 692, 3457, 3457, 3457, 692, 1191, 1191, 1191, 1191, - 3457, 3457, 1191, 1191, 719, 719, 719, 719, 3457, 719, - - 3457, 719, 1227, 1227, 1227, 1227, 3457, 3457, 1227, 1227, - 723, 723, 723, 723, 3457, 723, 3457, 723, 1237, 1237, - 1237, 1237, 3457, 3457, 1237, 1237, 731, 731, 731, 3457, - 3457, 3457, 731, 1253, 1253, 1253, 1253, 3457, 3457, 1253, - 1253, 742, 742, 742, 3457, 3457, 3457, 742, 1260, 1260, - 1260, 1260, 3457, 3457, 1260, 1260, 748, 748, 748, 3457, - 3457, 3457, 748, 1268, 1268, 1268, 1268, 3457, 3457, 1268, - 1268, 771, 771, 771, 3457, 3457, 3457, 771, 1291, 1291, - 1291, 1291, 3457, 3457, 1291, 1291, 779, 779, 779, 3457, - 3457, 3457, 779, 1301, 1301, 1301, 1301, 3457, 3457, 1301, - - 1301, 785, 785, 785, 785, 3457, 785, 3457, 785, 1307, - 1307, 1307, 1307, 3457, 3457, 1307, 1307, 790, 790, 790, - 790, 3457, 790, 3457, 790, 1313, 1313, 1313, 1313, 3457, - 3457, 1313, 1313, 795, 795, 795, 3457, 3457, 3457, 795, - 1326, 1326, 1326, 1326, 3457, 3457, 1326, 1326, 805, 805, - 805, 805, 3457, 805, 3457, 805, 1333, 1333, 1333, 1333, - 3457, 3457, 1333, 1333, 809, 809, 809, 809, 3457, 809, - 3457, 809, 1344, 1344, 1344, 1344, 3457, 3457, 1344, 1344, - 815, 815, 815, 3457, 3457, 3457, 815, 1371, 1371, 1371, - 1371, 3457, 3457, 1371, 1371, 834, 834, 834, 3457, 3457, - - 3457, 834, 1387, 1387, 1387, 1387, 3457, 3457, 1387, 1387, - 844, 844, 844, 3457, 3457, 3457, 844, 1402, 1402, 1402, - 1402, 3457, 3457, 1402, 1402, 854, 854, 854, 3457, 3457, - 3457, 854, 1410, 1410, 1410, 1410, 3457, 3457, 1410, 1410, - 859, 859, 859, 3457, 3457, 3457, 859, 1419, 1419, 1419, - 1419, 3457, 3457, 1419, 1419, 865, 865, 865, 3457, 3457, - 3457, 865, 1430, 1430, 1430, 1430, 3457, 3457, 1430, 1430, - 873, 873, 873, 3457, 3457, 3457, 873, 1439, 1439, 1439, - 1439, 3457, 3457, 1439, 1439, 880, 880, 880, 3457, 3457, - 3457, 880, 1451, 1451, 1451, 1451, 3457, 3457, 1451, 1451, - - 887, 887, 887, 3457, 3457, 3457, 887, 1459, 1459, 1459, - 1459, 3457, 3457, 1459, 1459, 1467, 1467, 1467, 1467, 3457, - 3457, 1467, 1467, 897, 897, 897, 3457, 3457, 3457, 897, - 1477, 1477, 1477, 1477, 3457, 3457, 1477, 1477, 903, 903, - 903, 3457, 3457, 3457, 903, 1486, 1486, 1486, 1486, 3457, - 3457, 1486, 1486, 912, 912, 912, 3457, 3457, 3457, 912, - 1492, 1492, 1492, 1492, 3457, 3457, 1492, 1492, 1499, 1499, - 1499, 1499, 3457, 3457, 1499, 1499, 920, 920, 920, 3457, - 3457, 3457, 920, 1507, 1507, 1507, 1507, 3457, 3457, 1507, - 1507, 925, 925, 925, 3457, 3457, 3457, 925, 1515, 1515, - - 1515, 1515, 3457, 3457, 1515, 1515, 1176, 1176, 1176, 1176, - 1176, 1176, 1176, 1176, 1176, 1735, 1735, 1735, 1735, 1735, - 1735, 1735, 1735, 1735, 692, 692, 692, 3457, 3457, 3457, - 692, 1191, 1191, 1191, 1191, 3457, 3457, 1191, 1191, 1227, - 1227, 1227, 1227, 3457, 3457, 1227, 1227, 723, 723, 723, - 3457, 3457, 3457, 723, 1237, 1237, 1237, 1237, 3457, 3457, - 1237, 1237, 731, 731, 731, 3457, 3457, 3457, 731, 1253, - 1253, 1253, 1253, 3457, 3457, 1253, 1253, 742, 742, 742, - 3457, 3457, 3457, 742, 1260, 1260, 1260, 1260, 3457, 3457, - 1260, 1260, 748, 748, 748, 3457, 3457, 3457, 748, 771, - - 771, 771, 3457, 3457, 3457, 771, 1291, 1291, 1291, 1291, - 3457, 3457, 1291, 1291, 779, 779, 779, 3457, 3457, 3457, - 779, 1301, 1301, 1301, 1301, 3457, 3457, 1301, 1301, 785, - 785, 785, 3457, 3457, 3457, 785, 1307, 1307, 1307, 1307, - 3457, 3457, 1307, 1307, 790, 790, 790, 3457, 3457, 3457, - 790, 1313, 1313, 1313, 1313, 3457, 3457, 1313, 1313, 795, - 795, 795, 3457, 3457, 3457, 795, 1326, 1326, 1326, 1326, - 3457, 3457, 1326, 1326, 1333, 1333, 1333, 1333, 3457, 3457, - 1333, 1333, 1344, 1344, 1344, 1344, 3457, 3457, 1344, 1344, - 815, 815, 815, 3457, 3457, 3457, 815, 1371, 1371, 1371, - - 1371, 3457, 3457, 1371, 1371, 834, 834, 834, 834, 3457, - 834, 3457, 834, 1387, 1387, 1387, 1387, 3457, 3457, 1387, - 1387, 844, 844, 844, 3457, 3457, 3457, 844, 1402, 1402, - 1402, 1402, 3457, 3457, 1402, 1402, 854, 854, 854, 3457, - 3457, 3457, 854, 1410, 1410, 1410, 1410, 3457, 3457, 1410, - 1410, 859, 859, 859, 3457, 3457, 3457, 859, 1419, 1419, - 1419, 1419, 3457, 3457, 1419, 1419, 865, 865, 865, 3457, - 3457, 3457, 865, 1430, 1430, 1430, 1430, 3457, 3457, 1430, - 1430, 873, 873, 873, 3457, 3457, 3457, 873, 1439, 1439, - 1439, 1439, 3457, 3457, 1439, 1439, 880, 880, 880, 3457, - - 3457, 3457, 880, 1451, 1451, 1451, 1451, 3457, 3457, 1451, - 1451, 887, 887, 887, 3457, 3457, 3457, 887, 1459, 1459, - 1459, 1459, 3457, 3457, 1459, 1459, 1467, 1467, 1467, 1467, - 3457, 3457, 1467, 1467, 897, 897, 897, 3457, 3457, 3457, - 897, 1477, 1477, 1477, 1477, 3457, 3457, 1477, 1477, 903, - 903, 903, 3457, 3457, 3457, 903, 1486, 1486, 1486, 1486, - 3457, 3457, 1486, 1486, 912, 912, 912, 912, 3457, 912, - 3457, 912, 1492, 1492, 1492, 1492, 3457, 3457, 1492, 1492, - 1499, 1499, 1499, 1499, 3457, 3457, 1499, 1499, 920, 920, - 920, 920, 3457, 920, 3457, 920, 1507, 1507, 1507, 1507, - - 3457, 3457, 1507, 1507, 925, 925, 925, 925, 3457, 925, - 3457, 925, 1515, 1515, 1515, 1515, 3457, 3457, 1515, 1515, - 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1735, - 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 692, 692, - 692, 3457, 3457, 3457, 692, 1191, 1191, 1191, 1191, 3457, - 3457, 1191, 1191, 1227, 1227, 1227, 1227, 3457, 3457, 1227, - 1227, 723, 723, 723, 3457, 3457, 3457, 723, 1237, 1237, - 1237, 1237, 3457, 3457, 1237, 1237, 731, 731, 731, 3457, - 3457, 3457, 731, 1253, 1253, 1253, 1253, 3457, 3457, 1253, - 1253, 742, 742, 742, 3457, 3457, 3457, 742, 1260, 1260, - - 1260, 1260, 3457, 3457, 1260, 1260, 748, 748, 748, 3457, - 3457, 3457, 748, 771, 771, 771, 3457, 3457, 3457, 771, - 1291, 1291, 1291, 1291, 3457, 3457, 1291, 1291, 779, 779, - 779, 3457, 3457, 3457, 779, 1301, 1301, 1301, 1301, 3457, - 3457, 1301, 1301, 785, 785, 785, 3457, 3457, 3457, 785, - 1307, 1307, 1307, 1307, 3457, 3457, 1307, 1307, 790, 790, - 790, 790, 3457, 790, 3457, 790, 1313, 1313, 1313, 1313, - 3457, 3457, 1313, 1313, 795, 795, 795, 3457, 3457, 3457, - 795, 1326, 1326, 1326, 1326, 3457, 3457, 1326, 1326, 1344, - 1344, 1344, 1344, 3457, 3457, 1344, 1344, 815, 815, 815, - - 3457, 3457, 3457, 815, 1371, 1371, 1371, 1371, 3457, 3457, - 1371, 1371, 834, 834, 834, 834, 3457, 834, 3457, 834, - 1387, 1387, 1387, 1387, 3457, 3457, 1387, 1387, 844, 844, - 844, 3457, 3457, 3457, 844, 1402, 1402, 1402, 1402, 3457, - 3457, 1402, 1402, 854, 854, 854, 3457, 3457, 3457, 854, - 1410, 1410, 1410, 1410, 3457, 3457, 1410, 1410, 859, 859, - 859, 3457, 3457, 3457, 859, 1419, 1419, 1419, 1419, 3457, - 3457, 1419, 1419, 865, 865, 865, 3457, 3457, 3457, 865, - 1430, 1430, 1430, 1430, 3457, 3457, 1430, 1430, 873, 873, - 873, 3457, 3457, 3457, 873, 1439, 1439, 1439, 1439, 3457, - - 3457, 1439, 1439, 880, 880, 880, 880, 3457, 880, 3457, - 880, 1451, 1451, 1451, 1451, 3457, 3457, 1451, 1451, 887, - 887, 887, 3457, 3457, 3457, 887, 1459, 1459, 1459, 1459, - 3457, 3457, 1459, 1459, 1467, 1467, 1467, 1467, 3457, 3457, - 1467, 1467, 897, 897, 897, 897, 3457, 897, 3457, 897, - 1477, 1477, 1477, 1477, 3457, 3457, 1477, 1477, 903, 903, - 903, 3457, 3457, 3457, 903, 1486, 1486, 1486, 1486, 3457, - 3457, 1486, 1486, 1492, 1492, 1492, 1492, 3457, 3457, 1492, - 1492, 1499, 1499, 1499, 1499, 3457, 3457, 1499, 1499, 1507, - 1507, 1507, 1507, 3457, 3457, 1507, 1507, 1515, 1515, 1515, - - 1515, 3457, 3457, 1515, 1515, 1176, 1176, 1176, 1176, 1176, - 1176, 1176, 1176, 1176, 1735, 1735, 1735, 1735, 1735, 1735, - 1735, 1735, 1735, 692, 692, 692, 692, 3457, 692, 3457, - 692, 1191, 1191, 1191, 1191, 3457, 3457, 1191, 1191, 1227, - 1227, 1227, 1227, 3457, 3457, 1227, 1227, 723, 723, 723, - 3457, 3457, 3457, 723, 1237, 1237, 1237, 1237, 3457, 3457, - 1237, 1237, 731, 731, 731, 3457, 3457, 3457, 731, 1253, - 1253, 1253, 1253, 3457, 3457, 1253, 1253, 742, 742, 742, - 742, 3457, 742, 3457, 742, 1260, 1260, 1260, 1260, 3457, - 3457, 1260, 1260, 748, 748, 748, 748, 3457, 748, 3457, - - 748, 771, 771, 771, 771, 3457, 771, 3457, 771, 1291, - 1291, 1291, 1291, 3457, 3457, 1291, 1291, 779, 779, 779, - 779, 3457, 779, 3457, 779, 1301, 1301, 1301, 1301, 3457, - 3457, 1301, 1301, 785, 785, 785, 3457, 3457, 3457, 785, - 1307, 1307, 1307, 1307, 3457, 3457, 1307, 1307, 1313, 1313, - 1313, 1313, 3457, 3457, 1313, 1313, 795, 795, 795, 3457, - 3457, 3457, 795, 1344, 1344, 1344, 1344, 3457, 3457, 1344, - 1344, 815, 815, 815, 3457, 3457, 3457, 815, 1371, 1371, - 1371, 1371, 3457, 3457, 1371, 1371, 834, 834, 834, 834, - 3457, 834, 3457, 834, 1387, 1387, 1387, 1387, 3457, 3457, - - 1387, 1387, 844, 844, 844, 3457, 3457, 3457, 844, 854, - 854, 854, 3457, 3457, 3457, 854, 1410, 1410, 1410, 1410, - 3457, 3457, 1410, 1410, 859, 859, 859, 3457, 3457, 3457, - 859, 1419, 1419, 1419, 1419, 3457, 3457, 1419, 1419, 865, - 865, 865, 3457, 3457, 3457, 865, 873, 873, 873, 3457, - 3457, 3457, 873, 1439, 1439, 1439, 1439, 3457, 3457, 1439, - 1439, 880, 880, 880, 3457, 3457, 3457, 880, 1451, 1451, - 1451, 1451, 3457, 3457, 1451, 1451, 887, 887, 887, 3457, - 3457, 3457, 887, 1459, 1459, 1459, 1459, 3457, 3457, 1459, - 1459, 1467, 1467, 1467, 1467, 3457, 3457, 1467, 1467, 1477, - - 1477, 1477, 1477, 3457, 3457, 1477, 1477, 903, 903, 903, - 3457, 3457, 3457, 903, 1486, 1486, 1486, 1486, 3457, 3457, - 1486, 1486, 1492, 1492, 1492, 1492, 3457, 3457, 1492, 1492, - 1499, 1499, 1499, 1499, 3457, 3457, 1499, 1499, 1515, 1515, - 1515, 1515, 3457, 3457, 1515, 1515, 1176, 1176, 1176, 1176, - 1176, 1176, 1176, 1176, 1176, 1735, 1735, 1735, 1735, 1735, - 1735, 1735, 1735, 1735, 1191, 1191, 1191, 1191, 3457, 3457, - 1191, 1191, 1227, 1227, 1227, 1227, 3457, 3457, 1227, 1227, - 723, 723, 723, 3457, 3457, 3457, 723, 731, 731, 731, - 3457, 3457, 3457, 731, 1253, 1253, 1253, 1253, 3457, 3457, - - 1253, 1253, 1260, 1260, 1260, 1260, 3457, 3457, 1260, 1260, - 771, 771, 771, 3457, 3457, 3457, 771, 1291, 1291, 1291, - 1291, 3457, 3457, 1291, 1291, 779, 779, 779, 3457, 3457, - 3457, 779, 1301, 1301, 1301, 1301, 3457, 3457, 1301, 1301, - 785, 785, 785, 3457, 3457, 3457, 785, 1313, 1313, 1313, - 1313, 3457, 3457, 1313, 1313, 795, 795, 795, 3457, 3457, - 3457, 795, 1344, 1344, 1344, 1344, 3457, 3457, 1344, 1344, - 815, 815, 815, 3457, 3457, 3457, 815, 1371, 1371, 1371, - 1371, 3457, 3457, 1371, 1371, 1387, 1387, 1387, 1387, 3457, - 3457, 1387, 1387, 844, 844, 844, 3457, 3457, 3457, 844, - - 854, 854, 854, 3457, 3457, 3457, 854, 1410, 1410, 1410, - 1410, 3457, 3457, 1410, 1410, 859, 859, 859, 3457, 3457, - 3457, 859, 1419, 1419, 1419, 1419, 3457, 3457, 1419, 1419, - 865, 865, 865, 3457, 3457, 3457, 865, 873, 873, 873, - 3457, 3457, 3457, 873, 880, 880, 880, 3457, 3457, 3457, - 880, 1451, 1451, 1451, 1451, 3457, 3457, 1451, 1451, 887, - 887, 887, 3457, 3457, 3457, 887, 1459, 1459, 1459, 1459, - 3457, 3457, 1459, 1459, 1467, 1467, 1467, 1467, 3457, 3457, - 1467, 1467, 1477, 1477, 1477, 1477, 3457, 3457, 1477, 1477, - 903, 903, 903, 903, 3457, 903, 3457, 903, 1486, 1486, - - 1486, 1486, 3457, 3457, 1486, 1486, 1492, 1492, 1492, 1492, - 3457, 3457, 1492, 1492, 1499, 1499, 1499, 1499, 3457, 3457, - 1499, 1499, 1515, 1515, 1515, 1515, 3457, 3457, 1515, 1515, - 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1735, - 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1735, 1191, 1191, - 1191, 1191, 3457, 3457, 1191, 1191, 1227, 1227, 1227, 1227, - 3457, 3457, 1227, 1227, 723, 723, 723, 3457, 3457, 3457, - 723, 731, 731, 731, 731, 3457, 731, 3457, 731, 1260, - 1260, 1260, 1260, 3457, 3457, 1260, 1260, 771, 771, 771, - 3457, 3457, 3457, 771, 1291, 1291, 1291, 1291, 3457, 3457, - - 1291, 1291, 779, 779, 779, 3457, 3457, 3457, 779, 1301, - 1301, 1301, 1301, 3457, 3457, 1301, 1301, 785, 785, 785, - 785, 3457, 785, 3457, 785, 1313, 1313, 1313, 1313, 3457, - 3457, 1313, 1313, 795, 795, 795, 3457, 3457, 3457, 795, - 1344, 1344, 1344, 1344, 3457, 3457, 1344, 1344, 815, 815, - 815, 3457, 3457, 3457, 815, 1371, 1371, 1371, 1371, 3457, - 3457, 1371, 1371, 1387, 1387, 1387, 1387, 3457, 3457, 1387, - 1387, 844, 844, 844, 3457, 3457, 3457, 844, 854, 854, - 854, 3457, 3457, 3457, 854, 859, 859, 859, 859, 3457, - 859, 3457, 859, 1419, 1419, 1419, 1419, 3457, 3457, 1419, - - 1419, 865, 865, 865, 865, 3457, 865, 3457, 865, 873, - 873, 873, 3457, 3457, 3457, 873, 880, 880, 880, 3457, - 3457, 3457, 880, 1451, 1451, 1451, 1451, 3457, 3457, 1451, - 1451, 887, 887, 887, 887, 3457, 887, 3457, 887, 1459, - 1459, 1459, 1459, 3457, 3457, 1459, 1459, 1467, 1467, 1467, - 1467, 3457, 3457, 1467, 1467, 1477, 1477, 1477, 1477, 3457, - 3457, 1477, 1477, 903, 903, 903, 903, 3457, 903, 3457, - 903, 1486, 1486, 1486, 1486, 3457, 3457, 1486, 1486, 1492, - 1492, 1492, 1492, 3457, 3457, 1492, 1492, 1515, 1515, 1515, - 1515, 3457, 3457, 1515, 1515, 1176, 1176, 1176, 1176, 1176, - - 1176, 1176, 1176, 1176, 1735, 1735, 1735, 1735, 1735, 1735, - 1735, 1735, 1735, 1191, 1191, 1191, 1191, 3457, 3457, 1191, - 1191, 723, 723, 723, 3457, 3457, 3457, 723, 731, 731, - 731, 3457, 3457, 3457, 731, 1260, 1260, 1260, 1260, 3457, - 3457, 1260, 1260, 771, 771, 771, 3457, 3457, 3457, 771, - 1291, 1291, 1291, 1291, 3457, 3457, 1291, 1291, 779, 779, - 779, 3457, 3457, 3457, 779, 1313, 1313, 1313, 1313, 3457, - 3457, 1313, 1313, 795, 795, 795, 3457, 3457, 3457, 795, - 1344, 1344, 1344, 1344, 3457, 3457, 1344, 1344, 815, 815, - 815, 3457, 3457, 3457, 815, 844, 844, 844, 3457, 3457, - - 3457, 844, 854, 854, 854, 3457, 3457, 3457, 854, 1419, - 1419, 1419, 1419, 3457, 3457, 1419, 1419, 865, 865, 865, - 3457, 3457, 3457, 865, 873, 873, 873, 3457, 3457, 3457, - 873, 880, 880, 880, 3457, 3457, 3457, 880, 3064, 3064, - 3064, 3064, 3064, 3064, 3064, 3064, 3064, 3065, 3065, 3065, - 3065, 3065, 3065, 3065, 3065, 3065, 3124, 3124, 3124, 3124, - 3124, 3124, 3124, 3124, 3124, 3127, 3127, 3127, 3127, 3127, - 3127, 3127, 3127, 3127, 3168, 3168, 3168, 3168, 3168, 3168, - 3168, 3168, 3168, 3170, 3170, 3170, 3170, 3170, 3170, 3170, - 3170, 3170, 263, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457 + 950, 394, 398, 394, 399, 394, 403, 267, 403, 403, + 267, 403, 414, 267, 414, 873, 414, 267, 414, 428, + 267, 428, 404, 1800, 1020, 404, 680, 680, 415, 680, + + 394, 394, 415, 844, 854, 429, 676, 676, 676, 676, + 676, 676, 679, 679, 911, 679, 400, 676, 676, 676, + 1807, 401, 394, 395, 267, 395, 394, 394, 394, 394, + 394, 394, 394, 396, 394, 394, 394, 714, 394, 398, + 394, 399, 394, 428, 267, 428, 267, 267, 267, 267, + 267, 267, 920, 428, 267, 428, 428, 267, 428, 429, + 1180, 1808, 430, 680, 1522, 430, 714, 394, 394, 429, + 859, 680, 429, 676, 676, 676, 676, 676, 676, 679, + 676, 676, 676, 400, 676, 676, 676, 679, 401, 405, + 406, 267, 406, 405, 405, 405, 405, 405, 405, 405, + + 407, 405, 405, 405, 761, 405, 409, 405, 410, 405, + 428, 267, 428, 428, 267, 428, 443, 267, 443, 969, + 443, 267, 443, 267, 267, 267, 431, 1010, 1809, 431, + 680, 1810, 444, 1016, 405, 405, 444, 865, 680, 367, + 676, 676, 676, 676, 676, 676, 679, 676, 676, 676, + 411, 1020, 1815, 879, 679, 1209, 412, 405, 406, 267, + 406, 405, 405, 405, 405, 405, 405, 405, 407, 405, + 405, 405, 1323, 405, 409, 405, 410, 405, 267, 267, + 267, 443, 267, 443, 443, 267, 443, 1816, 443, 267, + 443, 443, 267, 443, 367, 1817, 1818, 444, 1819, 1180, + + 444, 880, 405, 405, 445, 714, 680, 445, 676, 676, + 676, 676, 676, 676, 676, 676, 676, 1820, 411, 1739, + 1821, 887, 679, 1828, 412, 416, 417, 267, 417, 416, + 416, 416, 416, 416, 416, 416, 418, 416, 416, 416, + 1832, 416, 420, 416, 421, 416, 454, 267, 454, 454, + 267, 454, 466, 267, 466, 920, 466, 267, 466, 676, + 676, 676, 455, 1837, 1839, 455, 680, 680, 467, 880, + 416, 416, 467, 422, 892, 423, 952, 715, 676, 676, + 676, 424, 679, 679, 676, 676, 676, 953, 425, 1840, + 954, 426, 416, 417, 267, 417, 416, 416, 416, 416, + + 416, 416, 416, 418, 416, 416, 416, 714, 416, 420, + 416, 421, 416, 484, 267, 484, 484, 267, 484, 267, + 267, 267, 1846, 267, 267, 267, 676, 676, 676, 485, + 680, 1851, 485, 1852, 1853, 367, 680, 416, 416, 367, + 422, 897, 423, 676, 676, 676, 679, 903, 424, 676, + 676, 676, 679, 1854, 1855, 425, 911, 1866, 426, 432, + 433, 267, 433, 432, 432, 432, 432, 432, 432, 432, + 434, 432, 432, 432, 1869, 432, 436, 432, 437, 432, + 484, 267, 484, 484, 267, 484, 484, 267, 484, 880, + 484, 267, 484, 912, 1870, 880, 485, 715, 680, 485, + + 1547, 1874, 486, 715, 432, 432, 486, 438, 761, 439, + 676, 676, 676, 1548, 679, 440, 676, 676, 676, 676, + 676, 676, 676, 676, 676, 1875, 441, 432, 433, 267, + 433, 432, 432, 432, 432, 432, 432, 432, 434, 432, + 432, 432, 1878, 432, 436, 432, 437, 432, 500, 267, + 500, 500, 267, 500, 516, 267, 516, 1879, 516, 267, + 516, 1880, 680, 680, 501, 1881, 1882, 501, 1883, 916, + 517, 680, 432, 432, 517, 438, 1884, 439, 679, 679, + 676, 676, 676, 440, 676, 676, 676, 679, 676, 676, + 676, 676, 676, 676, 441, 446, 447, 267, 447, 446, + + 446, 446, 446, 446, 446, 446, 448, 446, 446, 446, + 1885, 446, 450, 446, 451, 446, 527, 267, 527, 527, + 267, 527, 539, 267, 539, 969, 539, 267, 539, 552, + 267, 552, 528, 680, 1180, 528, 680, 680, 540, 1021, + 446, 446, 540, 925, 930, 553, 676, 676, 676, 679, + 1182, 1893, 679, 679, 1896, 1897, 452, 446, 447, 267, + 447, 446, 446, 446, 446, 446, 446, 446, 448, 446, + 446, 446, 1900, 446, 450, 446, 451, 446, 552, 267, + 552, 267, 267, 267, 267, 267, 267, 969, 552, 267, + 552, 552, 267, 552, 553, 1902, 1904, 367, 961, 1905, + + 367, 1022, 446, 446, 553, 962, 1907, 553, 676, 676, + 676, 963, 936, 936, 936, 1197, 1197, 1197, 452, 456, + 457, 267, 457, 456, 456, 456, 456, 456, 456, 456, + 458, 456, 456, 456, 1908, 456, 460, 456, 461, 456, + 552, 267, 552, 552, 267, 552, 564, 267, 564, 952, + 564, 267, 564, 267, 267, 267, 554, 1909, 1914, 554, + 953, 974, 565, 968, 456, 456, 565, 971, 962, 566, + 462, 937, 971, 1917, 975, 463, 1918, 1919, 972, 1198, + 1921, 954, 1924, 972, 1925, 1927, 968, 464, 456, 457, + 267, 457, 456, 456, 456, 456, 456, 456, 456, 458, + + 456, 456, 456, 1931, 456, 460, 456, 461, 456, 267, + 267, 267, 564, 267, 564, 564, 267, 564, 1932, 564, + 267, 564, 564, 267, 564, 566, 1933, 1935, 565, 974, + 961, 565, 1559, 456, 456, 567, 962, 962, 567, 462, + 961, 974, 963, 975, 463, 1548, 1742, 962, 962, 1197, + 1197, 1197, 1949, 1015, 1015, 1950, 464, 468, 469, 267, + 469, 468, 468, 468, 468, 468, 468, 468, 470, 468, + 468, 468, 471, 468, 472, 468, 473, 468, 471, 471, + 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, + 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, + + 471, 471, 468, 468, 471, 474, 475, 476, 471, 471, + 471, 471, 471, 477, 471, 471, 478, 471, 471, 471, + 479, 471, 480, 481, 482, 471, 471, 471, 471, 471, + 471, 487, 488, 267, 488, 487, 487, 487, 487, 487, + 487, 487, 489, 487, 487, 487, 1951, 487, 491, 487, + 492, 487, 578, 267, 578, 578, 267, 578, 267, 267, + 267, 952, 267, 267, 267, 578, 267, 578, 579, 1953, + 1180, 579, 972, 1954, 566, 968, 487, 487, 566, 1955, + 493, 579, 936, 936, 936, 1956, 1184, 494, 1957, 1958, + 495, 1221, 1221, 1221, 496, 1946, 497, 498, 487, 488, + + 267, 488, 487, 487, 487, 487, 487, 487, 487, 489, + 487, 487, 487, 1959, 487, 491, 487, 492, 487, 578, + 267, 578, 578, 267, 578, 578, 267, 578, 1960, 590, + 267, 590, 590, 267, 590, 579, 1961, 1962, 580, 1963, + 1965, 580, 1352, 487, 487, 591, 1966, 493, 591, 1234, + 1234, 1234, 1353, 1235, 494, 1198, 1236, 495, 1967, 1354, + 1968, 496, 1971, 497, 498, 502, 503, 267, 503, 502, + 502, 502, 502, 502, 502, 502, 504, 502, 502, 502, + 1974, 502, 506, 502, 507, 502, 601, 267, 601, 601, + 267, 601, 267, 267, 267, 1975, 267, 267, 267, 981, + + 981, 981, 602, 1976, 1559, 602, 1977, 1978, 566, 1979, + 502, 502, 566, 508, 509, 510, 982, 1597, 1244, 1244, + 1244, 511, 1245, 1983, 512, 1246, 1984, 1986, 513, 1987, + 1988, 514, 502, 503, 267, 503, 502, 502, 502, 502, + 502, 502, 502, 504, 502, 502, 502, 1990, 502, 506, + 502, 507, 502, 601, 267, 601, 601, 267, 601, 601, + 267, 601, 2003, 601, 267, 601, 989, 989, 989, 602, + 2004, 2005, 602, 2006, 2007, 603, 2010, 502, 502, 603, + 508, 509, 510, 990, 2011, 1266, 1266, 1266, 511, 1267, + 2012, 512, 1268, 2013, 2018, 513, 2019, 2024, 514, 518, + + 519, 267, 519, 518, 518, 518, 518, 518, 518, 518, + 520, 518, 518, 518, 2025, 518, 522, 518, 523, 518, + 614, 267, 614, 614, 267, 614, 267, 267, 267, 2034, + 267, 267, 267, 1004, 1004, 1004, 615, 2038, 2046, 615, + 2052, 2053, 566, 2054, 518, 518, 566, 2060, 2061, 524, + 1005, 1538, 1538, 1538, 2062, 525, 518, 519, 267, 519, + 518, 518, 518, 518, 518, 518, 518, 520, 518, 518, + 518, 2063, 518, 522, 518, 523, 518, 614, 267, 614, + 614, 267, 614, 614, 267, 614, 2066, 614, 267, 614, + 1024, 1024, 1024, 615, 2067, 2078, 615, 2084, 2088, 616, + + 2091, 518, 518, 616, 2093, 2094, 524, 1025, 1221, 1221, + 1221, 2096, 525, 529, 530, 267, 530, 529, 529, 529, + 529, 529, 529, 529, 531, 529, 529, 529, 2097, 529, + 533, 529, 534, 529, 629, 267, 629, 629, 267, 629, + 267, 267, 267, 2098, 267, 267, 267, 629, 267, 629, + 630, 2102, 2105, 630, 2107, 2114, 631, 2122, 529, 529, + 631, 2123, 535, 630, 1197, 1197, 1197, 2124, 2125, 536, + 2127, 1180, 537, 529, 530, 267, 530, 529, 529, 529, + 529, 529, 529, 529, 531, 529, 529, 529, 2142, 529, + 533, 529, 534, 529, 629, 267, 629, 629, 267, 629, + + 629, 267, 629, 2145, 641, 267, 641, 641, 267, 641, + 630, 2149, 2150, 632, 2151, 1742, 632, 2154, 529, 529, + 642, 1742, 535, 642, 1221, 1221, 1221, 2155, 1274, 536, + 2157, 2158, 537, 541, 542, 267, 542, 541, 541, 541, + 541, 541, 541, 541, 543, 541, 541, 541, 2144, 541, + 545, 541, 546, 541, 651, 267, 651, 651, 267, 651, + 267, 267, 267, 2143, 267, 267, 267, 651, 267, 651, + 652, 2152, 2159, 652, 2160, 2161, 367, 2162, 541, 541, + 367, 2163, 547, 652, 1594, 1594, 1594, 2153, 1274, 548, + 2166, 2167, 549, 1538, 1538, 1538, 1756, 1756, 1756, 550, + + 541, 542, 267, 542, 541, 541, 541, 541, 541, 541, + 541, 543, 541, 541, 541, 2170, 541, 545, 541, 546, + 541, 651, 267, 651, 651, 267, 651, 651, 267, 651, + 2171, 663, 267, 663, 663, 267, 663, 652, 2172, 2173, + 653, 2174, 1757, 653, 752, 541, 541, 664, 2176, 547, + 664, 1288, 1288, 1288, 762, 1289, 548, 2177, 1290, 549, + 1759, 1759, 1759, 1764, 1764, 1764, 550, 555, 556, 267, + 556, 555, 555, 555, 555, 555, 555, 555, 557, 555, + 555, 555, 763, 555, 559, 555, 560, 555, 674, 267, + 674, 674, 267, 674, 2180, 2183, 714, 1042, 1042, 1042, + + 708, 1193, 1193, 1193, 675, 2187, 1760, 675, 2188, 2191, + 3468, 2192, 555, 555, 1043, 1053, 1053, 1053, 561, 1195, + 711, 2193, 1313, 1313, 1313, 2196, 1314, 2200, 711, 1315, + 2201, 2204, 1054, 562, 555, 556, 267, 556, 555, 555, + 555, 555, 555, 555, 555, 557, 555, 555, 555, 712, + 555, 559, 555, 560, 555, 713, 766, 1062, 1062, 1062, + 2206, 2211, 714, 1767, 1767, 1767, 715, 1064, 1064, 1064, + 2189, 2212, 767, 2219, 1063, 1070, 1070, 1070, 2190, 555, + 555, 1073, 1073, 1073, 1065, 561, 1327, 1327, 1327, 2194, + 1328, 2220, 1071, 1329, 1777, 1777, 1777, 2195, 1074, 2224, + + 562, 568, 569, 267, 569, 568, 568, 568, 568, 568, + 568, 568, 570, 568, 568, 568, 2225, 568, 572, 568, + 573, 568, 1088, 1088, 1088, 1090, 1090, 1090, 1102, 1102, + 1102, 1110, 1110, 1110, 1115, 1115, 1115, 2202, 2202, 1089, + 2226, 2227, 1091, 2152, 2239, 1103, 568, 568, 1111, 2243, + 2244, 1116, 574, 2203, 2153, 575, 1341, 1341, 1341, 2203, + 1342, 2245, 2251, 1343, 1594, 1594, 1594, 576, 568, 569, + 267, 569, 568, 568, 568, 568, 568, 568, 568, 570, + 568, 568, 568, 2252, 568, 572, 568, 573, 568, 1121, + 1121, 1121, 1141, 1141, 1141, 1165, 1165, 1165, 1169, 1169, + + 1169, 1174, 1174, 1174, 2253, 2257, 1122, 2258, 2269, 1142, + 2273, 2274, 1166, 568, 568, 1170, 2275, 2277, 1175, 574, + 2281, 2285, 575, 1344, 1344, 1344, 2286, 1345, 2287, 2288, + 1346, 1814, 1814, 1814, 576, 581, 582, 267, 582, 581, + 581, 581, 581, 581, 581, 581, 583, 581, 581, 581, + 2289, 581, 585, 581, 586, 581, 1193, 1193, 1193, 1229, + 1229, 1229, 2292, 2299, 1229, 1229, 1229, 981, 981, 981, + 1239, 1239, 1239, 1991, 1195, 2301, 2311, 1231, 2312, 1992, + 581, 581, 1231, 1993, 982, 2313, 587, 1994, 1241, 2314, + 2316, 588, 581, 582, 267, 582, 581, 581, 581, 581, + + 581, 581, 581, 583, 581, 581, 581, 1180, 581, 585, + 581, 586, 581, 2320, 1196, 1239, 1239, 1239, 989, 989, + 989, 1255, 1255, 1255, 1232, 1247, 1247, 1247, 1250, 1250, + 1250, 2323, 2329, 1241, 2330, 990, 2331, 581, 581, 1257, + 2332, 1742, 1248, 587, 2335, 1251, 2337, 2338, 588, 592, + 593, 267, 593, 592, 592, 592, 592, 592, 592, 592, + 594, 592, 592, 592, 2339, 592, 596, 592, 597, 592, + 1262, 1262, 1262, 1262, 1262, 1262, 1004, 1004, 1004, 1242, + 1270, 1270, 1270, 1742, 1255, 1255, 1255, 2322, 1264, 2340, + 2344, 1264, 2349, 1005, 592, 592, 2351, 2352, 1272, 2353, + + 598, 2357, 1257, 1355, 1355, 1355, 2363, 1356, 2364, 2365, + 1357, 1811, 1811, 1811, 2321, 599, 592, 593, 267, 593, + 592, 592, 592, 592, 592, 592, 592, 594, 592, 592, + 592, 1258, 592, 596, 592, 597, 592, 1265, 1270, 1270, + 1270, 1024, 1024, 1024, 2366, 1293, 1293, 1293, 1293, 1293, + 1293, 1300, 1300, 1300, 1995, 2367, 1272, 1812, 1025, 2368, + 1996, 592, 592, 1295, 1997, 2369, 1295, 598, 1998, 1302, + 1359, 1359, 1359, 2370, 1360, 1273, 2371, 1361, 1813, 1813, + 1813, 2372, 599, 604, 605, 267, 605, 604, 604, 604, + 604, 604, 604, 604, 606, 604, 604, 604, 2378, 604, + + 608, 604, 609, 604, 1300, 1300, 1300, 1306, 1306, 1306, + 1042, 1042, 1042, 2379, 1296, 1306, 1306, 1306, 1319, 1319, + 1319, 2380, 1302, 2381, 1760, 1308, 2387, 1043, 604, 604, + 1319, 1319, 1319, 1308, 610, 2389, 1321, 611, 1378, 1378, + 1378, 2390, 1379, 2392, 2393, 1380, 2398, 2399, 1321, 612, + 604, 605, 267, 605, 604, 604, 604, 604, 604, 604, + 604, 606, 604, 604, 604, 1303, 604, 608, 604, 609, + 604, 1053, 1053, 1053, 1331, 1331, 1331, 1062, 1062, 1062, + 1309, 1331, 1331, 1331, 1336, 1336, 1336, 2403, 1054, 2394, + 2396, 1322, 1333, 2406, 1063, 604, 604, 2395, 2397, 1333, + + 2407, 610, 1338, 2408, 611, 1381, 1381, 1381, 2409, 1382, + 2413, 2414, 1383, 1759, 1759, 1759, 612, 617, 618, 267, + 618, 617, 617, 617, 617, 617, 617, 617, 619, 617, + 617, 617, 2415, 617, 621, 617, 622, 617, 1064, 1064, + 1064, 2416, 2424, 1336, 1336, 1336, 2425, 1334, 1347, 1347, + 1347, 1347, 1347, 1347, 2426, 1065, 1070, 1070, 1070, 1916, + 2427, 1338, 617, 617, 2430, 2435, 1349, 2439, 2440, 1349, + 623, 2445, 624, 1071, 2446, 625, 1756, 1756, 1756, 626, + 1759, 1759, 1759, 627, 617, 618, 267, 618, 617, 617, + 617, 617, 617, 617, 617, 619, 617, 617, 617, 2447, + + 617, 621, 617, 622, 617, 1339, 1073, 1073, 1073, 1362, + 1362, 1362, 1350, 1374, 1374, 1374, 1374, 1374, 1374, 1088, + 1088, 1088, 2448, 1074, 2441, 2443, 1363, 2450, 2460, 617, + 617, 1376, 2442, 2444, 1376, 2472, 1089, 623, 2473, 624, + 2474, 1742, 625, 1964, 1964, 1964, 626, 1764, 1764, 1764, + 627, 633, 634, 267, 634, 633, 633, 633, 633, 633, + 633, 633, 635, 633, 633, 633, 2476, 633, 637, 633, + 638, 633, 1742, 2479, 1377, 1090, 1090, 1090, 1384, 1384, + 1384, 1767, 1767, 1767, 2466, 3468, 3468, 3468, 3468, 3468, + 3468, 2480, 1091, 2481, 2484, 1385, 633, 633, 3468, 3468, + + 3468, 2488, 3468, 2489, 2490, 3468, 1398, 1398, 1398, 2491, + 1399, 2492, 2493, 1400, 2494, 3468, 1969, 1969, 1969, 2467, + 639, 633, 634, 267, 634, 633, 633, 633, 633, 633, + 633, 633, 635, 633, 633, 633, 1386, 633, 637, 633, + 638, 633, 2495, 1388, 1390, 1390, 1390, 1102, 1102, 1102, + 1387, 1777, 1777, 1777, 3468, 3468, 3468, 1401, 1401, 1401, + 2496, 2497, 1392, 2510, 1103, 2511, 633, 633, 1390, 1390, + 1390, 3468, 2512, 2513, 1402, 1410, 1410, 1410, 2514, 1411, + 1970, 2516, 1412, 1972, 1972, 1972, 1392, 1811, 1811, 1811, + 639, 643, 644, 267, 644, 643, 643, 643, 643, 643, + + 643, 643, 645, 643, 643, 643, 1389, 643, 647, 643, + 648, 643, 1405, 1405, 1405, 1393, 1110, 1110, 1110, 2520, + 1405, 1405, 1405, 1413, 1413, 1413, 1413, 1413, 1413, 1973, + 1407, 2521, 2522, 1111, 2523, 2524, 643, 643, 1407, 2525, + 2526, 1415, 2528, 2532, 1415, 2533, 2534, 649, 643, 644, + 267, 644, 643, 643, 643, 643, 643, 643, 643, 645, + 643, 643, 643, 2539, 643, 647, 643, 648, 643, 2540, + 2535, 1408, 1115, 1115, 1115, 1418, 1418, 1418, 2541, 1419, + 2536, 2549, 1420, 1422, 1422, 1422, 2550, 1416, 2551, 1116, + 1813, 1813, 1813, 643, 643, 1427, 1427, 1427, 2552, 1428, + + 2561, 1424, 1429, 2562, 649, 654, 655, 267, 655, 654, + 654, 654, 654, 654, 654, 654, 656, 654, 654, 654, + 2563, 654, 658, 654, 659, 654, 1422, 1422, 1422, 1121, + 1121, 1121, 2564, 2566, 1433, 1433, 1433, 1437, 1437, 1437, + 2568, 1433, 1433, 1433, 1424, 2593, 1122, 1439, 1439, 1439, + 654, 654, 1435, 2594, 1438, 3468, 3468, 3468, 1742, 1435, + 2596, 660, 2597, 2598, 1440, 2599, 1742, 1980, 1980, 1980, + 2600, 2604, 3468, 1425, 661, 654, 655, 267, 655, 654, + 654, 654, 654, 654, 654, 654, 656, 654, 654, 654, + 2589, 654, 658, 654, 659, 654, 1436, 1442, 1442, 1442, + + 1447, 1447, 1447, 2590, 2605, 1442, 1442, 1442, 2606, 2607, + 3468, 3468, 3468, 1981, 1441, 1444, 2608, 1448, 2609, 2610, + 654, 654, 2611, 1444, 1451, 1451, 1451, 3468, 1459, 1459, + 1459, 660, 1460, 2612, 2613, 1461, 1499, 1499, 1499, 2614, + 1500, 1452, 2616, 1501, 661, 665, 666, 267, 666, 665, + 665, 665, 665, 665, 665, 665, 667, 665, 665, 665, + 1449, 665, 669, 665, 670, 665, 1445, 1454, 1454, 1454, + 2617, 3468, 3468, 3468, 2620, 1450, 1454, 1454, 1454, 1141, + 1141, 1141, 1462, 1462, 1462, 1456, 2618, 2621, 3468, 2622, + 665, 665, 2623, 2626, 1456, 2619, 1142, 1814, 1814, 1814, + + 1464, 671, 1506, 1506, 1506, 2627, 1507, 2628, 2629, 1508, + 2037, 2037, 2037, 1457, 672, 665, 666, 267, 666, 665, + 665, 665, 665, 665, 665, 665, 667, 665, 665, 665, + 1453, 665, 669, 665, 670, 665, 1462, 1462, 1462, 1466, + 1466, 1466, 1468, 1468, 1468, 1470, 1470, 1470, 1470, 1470, + 1470, 1474, 1474, 1474, 1464, 2624, 1467, 2631, 2632, 1469, + 665, 665, 2634, 1472, 2625, 2640, 1472, 2641, 1475, 2642, + 2643, 671, 2646, 3468, 3468, 3468, 1478, 1478, 1478, 1480, + 1480, 1480, 2648, 2649, 672, 680, 1480, 1480, 1480, 2650, + 3468, 1465, 695, 1479, 1489, 1489, 1489, 1482, 1489, 1489, + + 1489, 679, 696, 2651, 1482, 2652, 1495, 1495, 1495, 1495, + 1495, 1495, 1491, 1514, 1514, 1514, 1491, 1515, 2656, 1473, + 1516, 2659, 2664, 1476, 1497, 2665, 2660, 1497, 2668, 697, + 698, 699, 2156, 2156, 2156, 700, 701, 702, 1477, 2661, + 703, 704, 2677, 2678, 705, 2679, 706, 707, 708, 680, + 1165, 1165, 1165, 1502, 1502, 1502, 752, 1483, 1502, 1502, + 1502, 2662, 1492, 2680, 2681, 679, 753, 1166, 1169, 1169, + 1169, 1504, 2684, 1498, 2663, 2685, 1504, 2706, 1510, 1510, + 1510, 1174, 1174, 1174, 2707, 1170, 1742, 2709, 1510, 1510, + 1510, 2710, 1180, 697, 754, 709, 1512, 2711, 1175, 755, + + 756, 702, 1742, 2720, 757, 704, 1512, 2721, 758, 2722, + 759, 760, 708, 1518, 1518, 1518, 1518, 1518, 1518, 1505, + 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 2705, + 2714, 1520, 2703, 2723, 1520, 1229, 1229, 1229, 1195, 2704, + 2715, 1195, 2724, 2716, 1195, 1561, 1561, 1561, 1229, 1229, + 1229, 2725, 1513, 1231, 1229, 1229, 1229, 1564, 1564, 1564, + 2726, 2727, 1562, 1234, 1234, 1234, 1231, 1235, 2728, 2729, + 1236, 2730, 1231, 1530, 1565, 2732, 2733, 1521, 3468, 3468, + 3468, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, + 1244, 1244, 1244, 2734, 1245, 3468, 2735, 1246, 2736, 1241, + + 2737, 2738, 1241, 1563, 2717, 1241, 1247, 1247, 1247, 1570, + 1570, 1570, 2739, 1571, 2718, 2740, 1572, 2719, 1573, 1573, + 1573, 2741, 2742, 1248, 1250, 1250, 1250, 2743, 2744, 1575, + 1575, 1575, 2745, 1576, 1568, 1574, 1577, 2746, 2747, 1566, + 2750, 1251, 1579, 1579, 1579, 1255, 1255, 1255, 1255, 1255, + 1255, 1255, 1255, 1255, 1584, 1584, 1584, 2756, 2759, 1580, + 1262, 1262, 1262, 1257, 2760, 2761, 1257, 2764, 2765, 1257, + 2769, 1585, 1262, 1262, 1262, 1262, 1262, 1262, 1264, 1266, + 1266, 1266, 2770, 1267, 2771, 2772, 1268, 1270, 1270, 1270, + 1264, 2773, 2774, 1264, 1270, 1270, 1270, 1589, 1589, 1589, + + 1288, 1288, 1288, 2782, 1289, 1272, 2783, 1290, 1606, 1606, + 1606, 1582, 1272, 2784, 2810, 1590, 1293, 1293, 1293, 1293, + 1293, 1293, 1587, 2812, 1180, 1607, 1293, 1293, 1293, 1610, + 1610, 1610, 2813, 2814, 1295, 2818, 2819, 1295, 3468, 3468, + 3468, 1300, 1300, 1300, 1295, 2822, 1611, 1300, 1300, 1300, + 1300, 1300, 1300, 2807, 2820, 3468, 1614, 1614, 1614, 1302, + 3468, 3468, 3468, 2823, 2826, 1302, 2827, 2821, 1302, 1620, + 1620, 1620, 1742, 1615, 1306, 1306, 1306, 3468, 1306, 1306, + 1306, 1306, 1306, 1306, 2828, 1612, 1621, 1608, 1616, 1319, + 1319, 1319, 1308, 1313, 1313, 1313, 1308, 1314, 1742, 1308, + + 1315, 1319, 1319, 1319, 1319, 1319, 1319, 1321, 1327, 1327, + 1327, 2829, 1328, 2830, 2808, 1329, 2831, 1613, 2832, 1321, + 2833, 2834, 1321, 1331, 1331, 1331, 1331, 1331, 1331, 2792, + 1331, 1331, 1331, 1632, 1632, 1632, 1336, 1336, 1336, 2793, + 2809, 1333, 2836, 2837, 1333, 2794, 2838, 1617, 1333, 2824, + 1633, 1635, 1635, 1635, 1338, 1336, 1336, 1336, 1336, 1336, + 1336, 2839, 2825, 1341, 1341, 1341, 2840, 1342, 1636, 1625, + 1343, 2841, 2842, 1338, 2843, 2844, 1338, 1344, 1344, 1344, + 2845, 1345, 2846, 2847, 1346, 1347, 1347, 1347, 1347, 1347, + 1347, 1631, 1347, 1347, 1347, 1355, 1355, 1355, 2848, 1356, + + 2850, 2862, 1357, 1349, 2863, 2871, 1349, 1642, 1642, 1642, + 1349, 1359, 1359, 1359, 2872, 1360, 2873, 2874, 1361, 1362, + 1362, 1362, 2875, 2876, 1643, 1634, 1644, 1644, 1644, 2877, + 1645, 2884, 2887, 1646, 2894, 2895, 1363, 1374, 1374, 1374, + 1374, 1374, 1374, 1374, 1374, 1374, 1378, 1378, 1378, 2795, + 1379, 2896, 2897, 1380, 2898, 1376, 2899, 1637, 1376, 2796, + 2912, 1376, 1381, 1381, 1381, 2797, 1382, 2914, 2915, 1383, + 1384, 1384, 1384, 1659, 1659, 1659, 2916, 1660, 2917, 2918, + 1661, 1390, 1390, 1390, 1390, 1390, 1390, 1385, 1390, 1390, + 1390, 1398, 1398, 1398, 2919, 1399, 2920, 2921, 1400, 1392, + + 2902, 2922, 1392, 1401, 1401, 1401, 1392, 1671, 1671, 1671, + 1658, 1672, 1180, 2903, 1673, 1405, 1405, 1405, 2923, 2904, + 1402, 1405, 1405, 1405, 1405, 1405, 1405, 1410, 1410, 1410, + 1742, 1411, 2905, 1407, 1412, 2926, 1666, 2927, 2928, 1407, + 2929, 2930, 1407, 1413, 1413, 1413, 1413, 1413, 1413, 1413, + 1413, 1413, 1418, 1418, 1418, 2931, 1419, 2932, 2933, 1420, + 2908, 1415, 2935, 2936, 1415, 2909, 2937, 1415, 1422, 1422, + 1422, 1422, 1422, 1422, 2938, 1676, 1422, 1422, 1422, 2939, + 1427, 1427, 1427, 2940, 1428, 2941, 1424, 1429, 2942, 1424, + 1433, 1433, 1433, 2943, 1424, 1433, 1433, 1433, 2944, 1433, + + 1433, 1433, 1437, 1437, 1437, 1687, 1687, 1687, 1435, 1688, + 2945, 2946, 1689, 1435, 2947, 2956, 1678, 1435, 2960, 1438, + 1439, 1439, 1439, 2961, 2968, 1681, 1690, 1690, 1690, 2969, + 1691, 2970, 2971, 1692, 1442, 1442, 1442, 1440, 1442, 1442, + 1442, 2972, 1442, 1442, 1442, 1447, 1447, 1447, 2973, 1451, + 1451, 1451, 1444, 1964, 1964, 1964, 1444, 2974, 2975, 1686, + 1444, 2979, 1448, 1696, 1696, 1696, 1452, 1697, 2988, 2989, + 1698, 1701, 1701, 1701, 2990, 1702, 2991, 2992, 1703, 1454, + 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1454, 1459, 1459, + 1459, 2980, 1460, 2993, 2997, 1461, 2998, 1456, 2982, 2999, + + 1456, 2981, 3000, 1456, 1462, 1462, 1462, 3010, 2983, 1694, + 1462, 1462, 1462, 1462, 1462, 1462, 1466, 1466, 1466, 1708, + 1708, 1708, 1464, 1709, 3011, 3012, 1710, 3013, 1464, 3014, + 2984, 1464, 2986, 1467, 1468, 1468, 1468, 1711, 1711, 1711, + 2985, 1712, 2987, 3015, 1713, 1470, 1470, 1470, 3016, 1705, + 3017, 1469, 1470, 1470, 1470, 3021, 1470, 1470, 1470, 1474, + 1474, 1474, 3022, 1472, 1715, 1715, 1715, 3023, 1716, 3024, + 1472, 1717, 3025, 1707, 1472, 3026, 1475, 1478, 1478, 1478, + 1720, 1720, 1720, 1180, 1721, 3028, 3029, 1722, 1480, 1480, + 1480, 1480, 1480, 1480, 1479, 1480, 1480, 1480, 1725, 1725, + + 1725, 1489, 1489, 1489, 3030, 3031, 1482, 3032, 3033, 1482, + 1489, 1489, 1489, 1482, 3034, 1726, 3035, 3001, 1714, 1491, + 1489, 1489, 1489, 1495, 1495, 1495, 3039, 3040, 1491, 1495, + 1495, 1495, 1495, 1495, 1495, 1499, 1499, 1499, 1491, 1500, + 3041, 1497, 1501, 1502, 1502, 1502, 3044, 1497, 3045, 3046, + 1497, 1502, 1502, 1502, 1502, 1502, 1502, 1723, 1506, 1506, + 1506, 1504, 1507, 3047, 3048, 1508, 1510, 1510, 1510, 1504, + 3049, 3054, 1504, 1510, 1510, 1510, 1510, 1510, 1510, 3055, + 3056, 1730, 3057, 3058, 1512, 1733, 1514, 1514, 1514, 3059, + 1515, 1512, 3060, 1516, 1512, 1518, 1518, 1518, 1518, 1518, + + 1518, 1518, 1518, 1518, 1741, 1741, 1741, 1193, 1193, 1193, + 1561, 1561, 1561, 1520, 1734, 3061, 1520, 3062, 3063, 1520, + 3064, 3065, 1742, 1743, 3067, 1195, 3068, 1562, 1780, 1780, + 1780, 3069, 1781, 3070, 1180, 1782, 3077, 1736, 1229, 1229, + 1229, 1564, 1564, 1564, 3078, 1784, 1784, 1784, 3079, 1785, + 3080, 1738, 1786, 1239, 1239, 1239, 1231, 3081, 1565, 1570, + 1570, 1570, 3082, 1571, 3083, 3084, 1572, 1573, 1573, 1573, + 3085, 1241, 3086, 1748, 1791, 1791, 1791, 3071, 1792, 3087, + 3088, 1793, 3089, 3090, 1574, 1575, 1575, 1575, 3093, 1576, + 3094, 3095, 1577, 1579, 1579, 1579, 1783, 1795, 1795, 1795, + + 3096, 1796, 1789, 3097, 1797, 1255, 1255, 1255, 3098, 3099, + 1580, 1584, 1584, 1584, 1801, 1801, 1801, 3100, 1802, 3101, + 3107, 1803, 3108, 1257, 1804, 1804, 1804, 3109, 1585, 1262, + 1262, 1262, 1589, 1589, 1589, 1822, 1822, 1822, 2164, 2164, + 2164, 1805, 1606, 1606, 1606, 3116, 3117, 1264, 3118, 3119, + 1590, 3120, 1823, 3121, 3122, 1799, 1824, 1824, 1824, 1607, + 1825, 3123, 3124, 1826, 1293, 1293, 1293, 1610, 1610, 1610, + 1829, 1829, 1829, 3125, 1830, 3126, 3127, 1831, 1806, 1300, + 1300, 1300, 1295, 3130, 1611, 1614, 1614, 1614, 1834, 1834, + 1834, 3131, 1835, 3132, 3133, 1836, 3141, 1302, 1306, 1306, + + 1306, 3136, 1615, 1620, 1620, 1620, 1841, 1841, 1841, 3142, + 1842, 3143, 3144, 1843, 1180, 3137, 1308, 1844, 1844, 1844, + 1621, 1847, 1847, 1847, 1319, 1319, 1319, 3145, 1827, 1331, + 1331, 1331, 3136, 3146, 1845, 1632, 1632, 1632, 1848, 1833, + 3147, 3148, 1321, 3139, 1857, 1857, 1857, 1333, 1858, 3151, + 3152, 1859, 1633, 1860, 1860, 1860, 1635, 1635, 1635, 1838, + 3134, 1862, 1862, 1862, 3153, 1863, 3155, 1849, 1864, 3156, + 3157, 1861, 3158, 1636, 1347, 1347, 1347, 1867, 1867, 1867, + 1642, 1642, 1642, 3159, 1871, 1871, 1871, 3167, 1872, 3160, + 1850, 1873, 1349, 1856, 1868, 3172, 3149, 1643, 1644, 1644, + + 1644, 3161, 1645, 3154, 3173, 1646, 1876, 1876, 1876, 1374, + 1374, 1374, 1659, 1659, 1659, 3174, 1660, 3175, 3176, 1661, + 1887, 1887, 1887, 1877, 3468, 3468, 3468, 1376, 3468, 3468, + 3468, 3468, 3468, 3468, 1390, 1390, 1390, 1888, 3150, 3177, + 1865, 3468, 1894, 1894, 1894, 3468, 3162, 3180, 3468, 1671, + 1671, 1671, 1392, 1672, 1742, 1743, 1673, 3180, 3163, 1895, + 1898, 1898, 1898, 1405, 1405, 1405, 1413, 1413, 1413, 1422, + 1422, 1422, 3136, 3168, 1886, 1890, 3170, 1899, 1910, 1910, + 1910, 1407, 3136, 3183, 1415, 3169, 3137, 1424, 3171, 1892, + 1433, 1433, 1433, 3139, 1889, 1911, 1687, 1687, 1687, 3184, + + 1688, 1891, 3185, 1689, 1180, 1690, 1690, 1690, 1435, 1691, + 3186, 3187, 1692, 1442, 1442, 1442, 1696, 1696, 1696, 3190, + 1697, 3188, 3201, 1698, 1912, 3199, 1906, 1901, 1454, 1454, + 1454, 1444, 1903, 1701, 1701, 1701, 3191, 1702, 3204, 3189, + 1703, 1462, 1462, 1462, 3200, 3178, 1456, 1913, 1708, 1708, + 1708, 3192, 1709, 3202, 3207, 1710, 1711, 1711, 1711, 1464, + 1712, 3209, 3210, 1713, 1470, 1470, 1470, 1715, 1715, 1715, + 3212, 1716, 3203, 3208, 1717, 3213, 1720, 1720, 1720, 1915, + 1721, 3211, 1472, 1722, 1480, 1480, 1480, 3214, 3180, 1920, + 1725, 1725, 1725, 1928, 1928, 1928, 3216, 1929, 1922, 3180, + + 1930, 3217, 1482, 1489, 1489, 1489, 3218, 1726, 1936, 1936, + 1936, 1923, 1495, 1495, 1495, 1502, 1502, 1502, 1940, 1940, + 1940, 1491, 1510, 1510, 1510, 1937, 1943, 1943, 1943, 3219, + 1497, 1926, 3220, 1504, 3221, 1941, 1518, 1518, 1518, 3222, + 1512, 3223, 3224, 1944, 1741, 1741, 1741, 1193, 1193, 1193, + 3234, 3235, 1934, 3236, 1520, 3237, 1780, 1780, 1780, 3238, + 1781, 3239, 1742, 1782, 3243, 1195, 3244, 1939, 1229, 1229, + 1229, 1784, 1784, 1784, 3245, 1785, 3246, 3247, 1786, 1938, + 1239, 1239, 1239, 3248, 1942, 3249, 1231, 1945, 3250, 1791, + 1791, 1791, 3252, 1792, 3253, 1947, 1793, 3254, 1241, 1952, + + 1795, 1795, 1795, 3255, 1796, 3256, 3257, 1797, 1255, 1255, + 1255, 3258, 1948, 1801, 1801, 1801, 3263, 1802, 3259, 3264, + 1803, 1804, 1804, 1804, 3265, 3261, 1257, 1262, 1262, 1262, + 3260, 1985, 1999, 1999, 1999, 1982, 2000, 3262, 1805, 2001, + 2008, 2008, 2008, 3266, 3267, 1264, 2008, 2008, 2008, 1969, + 1969, 1969, 3268, 1822, 1822, 1822, 2014, 2014, 2014, 3269, + 2015, 3270, 3271, 2016, 1824, 1824, 1824, 3272, 1825, 1989, + 1823, 1826, 1293, 1293, 1293, 1829, 1829, 1829, 2002, 1830, + 3273, 3274, 1831, 1300, 1300, 1300, 3275, 1834, 1834, 1834, + 1295, 1835, 3276, 1180, 1836, 2021, 2021, 2021, 1306, 1306, + + 1306, 1302, 3278, 3279, 2009, 3280, 3281, 1841, 1841, 1841, + 1970, 1842, 2022, 2009, 1843, 3282, 1308, 3283, 3277, 2017, + 1844, 1844, 1844, 2026, 2026, 2026, 3284, 2027, 3285, 3286, + 2028, 2029, 2029, 2029, 1847, 1847, 1847, 1845, 2031, 2031, + 2031, 3287, 2032, 3288, 3289, 2033, 3290, 3291, 2030, 2020, + 3292, 1848, 2035, 2035, 2035, 2039, 2039, 2039, 3468, 3468, + 3468, 3293, 2023, 2042, 2042, 2042, 1331, 1331, 1331, 3294, + 2036, 3295, 2040, 3296, 3297, 3468, 1860, 1860, 1860, 3298, + 2043, 1857, 1857, 1857, 1333, 1858, 3299, 1180, 1859, 1862, + 1862, 1862, 3301, 1863, 1861, 3302, 1864, 1347, 1347, 1347, + + 1867, 1867, 1867, 2047, 2047, 2047, 3300, 2048, 3303, 3304, + 2049, 3305, 3306, 2044, 3307, 1349, 3308, 1868, 2050, 2050, + 2050, 1871, 1871, 1871, 2041, 1872, 3309, 3310, 1873, 1876, + 1876, 1876, 2055, 2055, 2055, 2051, 2056, 3311, 3312, 2057, + 2058, 2058, 2058, 2045, 3313, 3314, 1877, 2064, 2064, 2064, + 1374, 1374, 1374, 1887, 1887, 1887, 3315, 2059, 2069, 2069, + 2069, 3316, 2070, 3317, 2065, 2071, 3318, 3319, 1376, 3320, + 1888, 2072, 2072, 2072, 3468, 3468, 3468, 2075, 2075, 2075, + 1390, 1390, 1390, 1894, 1894, 1894, 3322, 3323, 2073, 1180, + 3324, 3468, 3325, 3326, 2076, 2079, 2079, 2079, 1392, 2080, + + 1895, 3327, 2081, 2082, 2082, 2082, 1898, 1898, 1898, 3321, + 2085, 2085, 2085, 3328, 2086, 3329, 2068, 2087, 3330, 3331, + 2083, 3332, 3333, 1899, 2089, 2089, 2089, 1413, 1413, 1413, + 3334, 3335, 2074, 1422, 1422, 1422, 1910, 1910, 1910, 3336, + 2077, 3337, 2090, 3338, 3339, 1415, 3340, 3341, 2099, 2099, + 2099, 1424, 2100, 1911, 3343, 2101, 2103, 2103, 2103, 1442, + 1442, 1442, 2108, 2108, 2108, 2110, 2110, 2110, 3468, 3468, + 3468, 1454, 1454, 1454, 2104, 3344, 3345, 1444, 2092, 2109, + 3346, 2095, 2111, 3347, 3348, 3468, 1470, 1470, 1470, 1456, + 1462, 1462, 1462, 3349, 2117, 2117, 2117, 2119, 2119, 2119, + + 1480, 1480, 1480, 3350, 1472, 1928, 1928, 1928, 1464, 1929, + 2106, 2118, 1930, 1180, 2120, 1489, 1489, 1489, 1482, 3342, + 1936, 1936, 1936, 2128, 2128, 2128, 3351, 2129, 3352, 3353, + 2130, 3354, 2112, 1491, 3356, 3357, 2115, 1937, 2113, 1495, + 1495, 1495, 1502, 1502, 1502, 1940, 1940, 1940, 2133, 2133, + 2133, 2116, 2134, 3358, 3359, 2135, 3360, 1497, 3361, 3362, + 1504, 3363, 1941, 3365, 1180, 2121, 2126, 2136, 2136, 2136, + 1943, 1943, 1943, 2138, 2138, 2138, 3366, 2139, 3355, 3367, + 2140, 1518, 1518, 1518, 3368, 2137, 3369, 1944, 2146, 2146, + 2146, 1193, 1193, 1193, 1969, 1969, 1969, 2132, 2131, 1520, + + 2165, 2165, 2165, 3370, 3371, 2147, 1972, 1972, 1972, 1195, + 2168, 2168, 2168, 2169, 2169, 2169, 1980, 1980, 1980, 1229, + 1229, 1229, 2178, 2178, 2178, 2181, 2181, 2181, 1255, 1255, + 1255, 2185, 2185, 2185, 1999, 1999, 1999, 1231, 2000, 2141, + 2179, 2001, 2182, 1262, 1262, 1262, 1257, 3372, 2186, 2198, + 2198, 2198, 2148, 2008, 2008, 2008, 2205, 2205, 2205, 3375, + 3376, 1264, 2207, 2207, 2207, 3377, 2199, 3378, 3379, 2175, + 2014, 2014, 2014, 3380, 2015, 1755, 1180, 2016, 1180, 2208, + 1293, 1293, 1293, 2213, 2213, 2213, 1180, 2184, 3465, 2197, + 2021, 2021, 2021, 2215, 2215, 2215, 1180, 2216, 1295, 1180, + + 2217, 2214, 1306, 1306, 1306, 1754, 1180, 2022, 2209, 2026, + 2026, 2026, 3381, 2027, 3382, 1180, 2028, 2029, 2029, 2029, + 1308, 2221, 2221, 2221, 1180, 2222, 1180, 3399, 2223, 2035, + 2035, 2035, 1180, 2210, 2030, 2031, 2031, 2031, 1180, 2032, + 3387, 3401, 2033, 2037, 2037, 2037, 1180, 2036, 3391, 2218, + 2039, 2039, 2039, 2228, 2228, 2228, 1180, 2229, 3413, 3388, + 2230, 2231, 2231, 2231, 2042, 2042, 2042, 2040, 2234, 2234, + 2234, 1180, 2235, 3389, 3383, 2236, 1180, 1180, 2232, 3400, + 3384, 2043, 1331, 1331, 1331, 1347, 1347, 1347, 2047, 2047, + 2047, 3392, 2048, 3393, 3385, 2049, 2050, 2050, 2050, 1180, + + 1333, 1180, 3394, 1349, 2240, 2240, 2240, 2233, 2241, 3421, + 1180, 2242, 1180, 2051, 2055, 2055, 2055, 1180, 2056, 3386, + 1753, 2057, 2058, 2058, 2058, 2246, 2246, 2246, 1180, 2247, + 3390, 1180, 2248, 1752, 1180, 2237, 2249, 2249, 2249, 2059, + 2064, 2064, 2064, 2238, 2254, 2254, 2254, 1180, 2255, 3397, + 1180, 2256, 1180, 2250, 1374, 1374, 1374, 2065, 2069, 2069, + 2069, 1180, 2070, 3407, 3395, 2071, 2072, 2072, 2072, 2260, + 2260, 2260, 1376, 2261, 1180, 3396, 2262, 2263, 2263, 2263, + 2075, 2075, 2075, 2073, 2265, 2265, 2265, 3398, 2266, 3405, + 1180, 2267, 3409, 3403, 2264, 1751, 3402, 2076, 1390, 1390, + + 1390, 1180, 2079, 2079, 2079, 2259, 2080, 1750, 3414, 2081, + 2082, 2082, 2082, 2270, 2270, 2270, 1392, 2271, 1749, 3433, + 2272, 2085, 2085, 2085, 1180, 2086, 1180, 2083, 2087, 2089, + 2089, 2089, 1413, 1413, 1413, 2278, 2278, 2278, 1422, 1422, + 1422, 2282, 2282, 2282, 2099, 2099, 2099, 2090, 2100, 2268, + 1415, 2101, 2279, 2103, 2103, 2103, 1424, 1180, 2283, 2290, + 2290, 2290, 2108, 2108, 2108, 2293, 2293, 2293, 3427, 2294, + 3404, 2104, 2295, 2110, 2110, 2110, 1180, 2291, 1180, 2109, + 3410, 2296, 2296, 2296, 1180, 2297, 1180, 2284, 2298, 1180, + 2111, 1454, 1454, 1454, 3406, 1180, 2276, 1747, 1180, 2280, + + 1462, 1462, 1462, 1470, 1470, 1470, 2117, 2117, 2117, 1456, + 2304, 2304, 2304, 3411, 2305, 1180, 3408, 2306, 1464, 3415, + 1180, 1472, 1180, 2118, 2119, 2119, 2119, 2307, 2307, 2307, + 3412, 2308, 3417, 3419, 2309, 1480, 1480, 1480, 1489, 1489, + 1489, 2120, 1180, 2128, 2128, 2128, 1180, 2129, 3422, 2302, + 2130, 1746, 1745, 1482, 1180, 3420, 1491, 2300, 1495, 1495, + 1495, 1502, 1502, 1502, 3428, 2133, 2133, 2133, 2303, 2134, + 1180, 1180, 2135, 2136, 2136, 2136, 1497, 3423, 1744, 1504, + 2138, 2138, 2138, 3434, 2139, 3416, 1180, 2140, 1518, 1518, + 1518, 2137, 3418, 2146, 2146, 2146, 3424, 2324, 2324, 2324, + + 2310, 2325, 1737, 2315, 2326, 1180, 1520, 3425, 3426, 2317, + 2147, 1193, 1193, 1193, 2318, 2328, 2328, 2328, 2333, 2333, + 2333, 2334, 2334, 2334, 2156, 2156, 2156, 1735, 1180, 1195, + 2336, 2336, 2336, 1732, 2319, 2341, 2341, 2341, 2164, 2164, + 2164, 2165, 2165, 2165, 2342, 2342, 2342, 2168, 2168, 2168, + 2169, 2169, 2169, 2345, 2345, 2345, 2346, 2346, 2346, 2347, + 2347, 2347, 2348, 2348, 2348, 1229, 1229, 1229, 2178, 2178, + 2178, 2181, 2181, 2181, 3429, 2327, 1180, 2354, 2354, 2354, + 3435, 2355, 1180, 1231, 2356, 1731, 2179, 1729, 2182, 1180, + 2343, 2358, 2358, 2358, 2185, 2185, 2185, 2360, 2360, 2360, + + 1728, 2361, 1727, 1724, 2362, 1262, 1262, 1262, 1180, 2359, + 1180, 2186, 2198, 2198, 2198, 1180, 2350, 2374, 2374, 2374, + 1180, 2375, 3430, 1264, 2376, 2377, 2377, 2377, 3439, 2199, + 2205, 2205, 2205, 2382, 2382, 2382, 2207, 2207, 2207, 2384, + 2384, 2384, 1180, 2385, 3437, 3431, 2386, 1293, 1293, 1293, + 2213, 2213, 2213, 2208, 2373, 2215, 2215, 2215, 1180, 2216, + 1719, 3440, 2217, 3436, 1718, 1295, 1180, 3443, 2214, 1306, + 1306, 1306, 1180, 2221, 2221, 2221, 3438, 2222, 3441, 2383, + 2223, 2228, 2228, 2228, 1180, 2229, 1180, 1308, 2230, 2231, + 2231, 2231, 2400, 2400, 2400, 3432, 2401, 3442, 2388, 2402, + + 2234, 2234, 2234, 3445, 2235, 1180, 2232, 2236, 1331, 1331, + 1331, 1347, 1347, 1347, 2240, 2240, 2240, 1180, 2241, 3449, + 1180, 2242, 2391, 2246, 2246, 2246, 1333, 2247, 1180, 1349, + 2248, 2249, 2249, 2249, 2410, 2410, 2410, 1180, 2411, 1706, + 1180, 2412, 2254, 2254, 2254, 1180, 2255, 1704, 2250, 2256, + 2417, 2417, 2417, 1374, 1374, 1374, 2260, 2260, 2260, 2404, + 2261, 3447, 1180, 2262, 3444, 3446, 2405, 2418, 2263, 2263, + 2263, 1376, 2420, 2420, 2420, 3450, 2421, 3455, 3448, 2422, + 2265, 2265, 2265, 1180, 2266, 2264, 1180, 2267, 1390, 1390, + 1390, 2270, 2270, 2270, 1180, 2271, 1180, 1700, 2272, 3453, + + 2428, 2428, 2428, 2278, 2278, 2278, 1392, 2431, 2431, 2431, + 3457, 2432, 1180, 1180, 2433, 3456, 1180, 2419, 2429, 1180, + 2279, 1422, 1422, 1422, 2282, 2282, 2282, 2436, 2436, 2436, + 1180, 2437, 3451, 3454, 2438, 2290, 2290, 2290, 3458, 1424, + 3452, 2283, 2293, 2293, 2293, 3459, 2294, 1180, 3460, 2295, + 1454, 1454, 1454, 2291, 2423, 2296, 2296, 2296, 1180, 2297, + 3461, 3465, 2298, 1180, 1462, 1462, 1462, 1699, 1456, 1470, + 1470, 1470, 2304, 2304, 2304, 1180, 2305, 1695, 3462, 2306, + 1693, 2434, 1464, 1685, 2307, 2307, 2307, 1472, 2308, 1684, + 3463, 2309, 1480, 1480, 1480, 3464, 2454, 2454, 2454, 1683, + + 1682, 2449, 3468, 3468, 3468, 2452, 3468, 3468, 3468, 1680, + 1482, 1679, 2453, 2455, 3468, 3468, 3468, 1677, 1675, 3468, + 1489, 1489, 1489, 3468, 1495, 1495, 1495, 2462, 2462, 2462, + 2451, 3468, 1518, 1518, 1518, 2468, 2468, 2468, 1491, 2465, + 2465, 2465, 1497, 1674, 1670, 2463, 1669, 2324, 2324, 2324, + 1520, 2325, 1668, 2456, 2326, 1667, 1665, 1180, 1193, 1193, + 1193, 2328, 2328, 2328, 2470, 2470, 2470, 2471, 2471, 2471, + 2457, 1664, 1663, 2458, 1662, 1655, 1195, 2333, 2333, 2333, + 2334, 2334, 2334, 1654, 2461, 2459, 2336, 2336, 2336, 2475, + 2475, 2475, 1653, 1652, 2464, 2477, 2477, 2477, 2478, 2478, + + 2478, 2341, 2341, 2341, 2342, 2342, 2342, 2345, 2345, 2345, + 2346, 2346, 2346, 2347, 2347, 2347, 1651, 2469, 2348, 2348, + 2348, 2482, 2482, 2482, 2485, 2485, 2485, 2354, 2354, 2354, + 1650, 2355, 1649, 1648, 2356, 3468, 3468, 3468, 1647, 2483, + 1641, 2486, 2358, 2358, 2358, 1640, 2360, 2360, 2360, 1639, + 2361, 1638, 3468, 2362, 1262, 1262, 1262, 2374, 2374, 2374, + 2359, 2375, 2499, 2500, 2376, 2501, 2504, 2505, 1630, 2506, + 1629, 1628, 1264, 2502, 2377, 2377, 2377, 2507, 1627, 1626, + 2503, 2509, 2509, 2509, 2508, 2382, 2382, 2382, 2384, 2384, + 2384, 1624, 2385, 1623, 1622, 2386, 1293, 1293, 1293, 1619, + + 1618, 2487, 2517, 2517, 2517, 1306, 1306, 1306, 2527, 2527, + 2527, 2529, 2529, 2529, 1295, 2498, 1347, 1347, 1347, 2518, + 2400, 2400, 2400, 1308, 2401, 1609, 1605, 2402, 1604, 2530, + 1603, 2410, 2410, 2410, 1349, 2411, 1602, 1601, 2412, 2567, + 2567, 2567, 2515, 2537, 2537, 2537, 2417, 2417, 2417, 1600, + 2542, 2542, 2542, 1599, 2543, 1598, 2519, 2544, 1596, 1595, + 2538, 1593, 1592, 2418, 2545, 2545, 2545, 2420, 2420, 2420, + 1591, 2421, 1588, 1586, 2422, 1583, 2531, 2547, 2547, 2547, + 1581, 1578, 2546, 2428, 2428, 2428, 2553, 2553, 2553, 2431, + 2431, 2431, 1569, 2432, 1567, 2548, 2433, 1422, 1422, 1422, + + 1560, 2429, 1558, 2554, 2556, 2556, 2556, 2436, 2436, 2436, + 1557, 2437, 1556, 1555, 2438, 1424, 3468, 3468, 3468, 1554, + 1553, 2557, 3468, 3468, 3468, 3468, 3468, 3468, 2569, 2569, + 2569, 1552, 1551, 3468, 2571, 2571, 2571, 1550, 1549, 3468, + 1546, 1545, 3468, 1462, 1462, 1462, 2570, 1544, 2555, 1543, + 2558, 2572, 1470, 1470, 1470, 1480, 1480, 1480, 2454, 2454, + 2454, 1464, 2576, 2576, 2576, 1542, 2577, 1541, 1540, 2578, + 1472, 2559, 1539, 1482, 1537, 2455, 2565, 2579, 2579, 2579, + 3468, 3468, 3468, 2560, 3468, 3468, 3468, 2583, 2583, 2583, + 1536, 1535, 2575, 1534, 2580, 1533, 1532, 3468, 2585, 2585, + + 2585, 3468, 1531, 2573, 1529, 2584, 1495, 1495, 1495, 2462, + 2462, 2462, 1528, 2574, 1518, 1518, 1518, 1527, 2465, 2465, + 2465, 2468, 2468, 2468, 1497, 1526, 1525, 2463, 2591, 2591, + 2591, 2581, 1520, 1524, 1523, 2582, 1180, 2470, 2470, 2470, + 2471, 2471, 2471, 2595, 2595, 2595, 2592, 2475, 2475, 2475, + 2477, 2477, 2477, 2478, 2478, 2478, 2482, 2482, 2482, 2485, + 2485, 2485, 2601, 2601, 2601, 1180, 2602, 1517, 1509, 2603, + 1494, 1493, 2586, 1488, 2483, 1487, 2486, 1486, 2587, 1485, + 2588, 1262, 1262, 1262, 2509, 2509, 2509, 2630, 2630, 2630, + 1293, 1293, 1293, 2517, 2517, 2517, 2635, 2635, 2635, 1264, + + 2636, 1484, 1458, 2637, 2638, 2638, 2638, 1446, 1295, 1432, + 2518, 2644, 2644, 2644, 2527, 2527, 2527, 2529, 2529, 2529, + 1431, 1430, 2639, 1426, 1347, 1347, 1347, 1421, 2645, 2537, + 2537, 2537, 2653, 2653, 2653, 2530, 2654, 1417, 1409, 2655, + 1404, 2615, 1349, 2657, 2657, 2657, 2538, 2542, 2542, 2542, + 1403, 2543, 1397, 1394, 2544, 1373, 2633, 2545, 2545, 2545, + 2658, 2547, 2547, 2547, 1372, 2666, 2666, 2666, 2553, 2553, + 2553, 2672, 2672, 2672, 1371, 2546, 2669, 2669, 2669, 2548, + 2670, 2647, 2667, 2671, 1370, 2554, 2556, 2556, 2556, 2673, + 2674, 2674, 2674, 1369, 2675, 1368, 1367, 2676, 2682, 2682, + + 2682, 1366, 1365, 2557, 2567, 2567, 2567, 2569, 2569, 2569, + 2571, 2571, 2571, 1364, 1358, 2683, 2686, 2686, 2686, 1351, + 2687, 1340, 1335, 2688, 1330, 2570, 1326, 2572, 2689, 2689, + 2689, 1470, 1470, 1470, 1325, 1480, 1480, 1480, 2576, 2576, + 2576, 1324, 2577, 1318, 1317, 2578, 2690, 1316, 1312, 1472, + 2579, 2579, 2579, 1482, 2693, 2693, 2693, 1311, 2694, 1310, + 1305, 2695, 2696, 2696, 2696, 1304, 1299, 2580, 2698, 2698, + 2698, 2583, 2583, 2583, 2585, 2585, 2585, 1298, 1292, 2697, + 1291, 1287, 2700, 2700, 2700, 2699, 1518, 1518, 1518, 2584, + 2591, 2591, 2591, 2595, 2595, 2595, 1286, 1285, 2691, 2692, + + 2701, 2708, 2708, 2708, 1520, 2712, 2712, 2712, 2592, 2601, + 2601, 2601, 1284, 2602, 1283, 1282, 2603, 1262, 1262, 1262, + 1281, 1280, 2713, 2630, 2630, 2630, 1293, 1293, 1293, 2749, + 2749, 2749, 2635, 2635, 2635, 1264, 2636, 1279, 1278, 2637, + 2638, 2638, 2638, 1277, 1295, 1276, 1275, 2702, 2751, 2751, + 2751, 2644, 2644, 2644, 1269, 2753, 2753, 2753, 2639, 2754, + 1261, 1260, 2755, 1259, 1254, 2752, 1253, 1252, 2645, 2757, + 2757, 2757, 2762, 2762, 2762, 1249, 1243, 2731, 2653, 2653, + 2653, 1238, 2654, 1237, 1233, 2655, 1228, 2758, 1227, 2763, + 2657, 2657, 2657, 1226, 2766, 2766, 2766, 2748, 2767, 1225, + + 1224, 2768, 2775, 2775, 2775, 1223, 1222, 2658, 2666, 2666, + 2666, 2777, 2777, 2777, 1220, 2778, 1219, 1218, 2779, 2776, + 2780, 2780, 2780, 1217, 1216, 2667, 2669, 2669, 2669, 1215, + 2670, 1214, 1213, 2671, 2672, 2672, 2672, 2781, 2674, 2674, + 2674, 1212, 2675, 1211, 1208, 2676, 2682, 2682, 2682, 2785, + 2785, 2785, 2673, 2786, 1207, 1206, 2787, 2788, 2788, 2788, + 2790, 2790, 2790, 2683, 2686, 2686, 2686, 1205, 2687, 1204, + 1203, 2688, 1202, 1201, 2789, 1200, 1199, 2791, 2689, 2689, + 2689, 1470, 1470, 1470, 1480, 1480, 1480, 2693, 2693, 2693, + 1192, 2694, 1191, 1190, 2695, 1189, 2690, 1188, 1187, 1472, + + 1186, 1183, 1482, 2696, 2696, 2696, 2800, 2800, 2800, 1181, + 2801, 1180, 1178, 2802, 2698, 2698, 2698, 2803, 2803, 2803, + 2697, 2804, 1176, 1173, 2805, 2700, 2700, 2700, 1518, 1518, + 1518, 2699, 2811, 2811, 2811, 2708, 2708, 2708, 2712, 2712, + 2712, 1171, 1168, 2701, 1164, 2799, 1520, 2798, 1162, 2815, + 2815, 2815, 1161, 2816, 1160, 2713, 2817, 1262, 1262, 1262, + 2849, 2849, 2849, 2851, 2851, 2851, 1293, 1293, 1293, 2749, + 2749, 2749, 2854, 2854, 2854, 1264, 2751, 2751, 2751, 1158, + 2852, 2857, 2857, 2857, 1295, 2858, 1157, 1156, 2859, 2855, + 2806, 1155, 1154, 2752, 2753, 2753, 2753, 1153, 2754, 1151, + + 1150, 2755, 2860, 2860, 2860, 2757, 2757, 2757, 2835, 2864, + 2864, 2864, 2762, 2762, 2762, 2869, 2869, 2869, 2856, 2861, + 2866, 2866, 2866, 2758, 2867, 1149, 2865, 2868, 2853, 2763, + 1148, 1146, 2870, 2766, 2766, 2766, 1145, 2767, 1144, 1140, + 2768, 2775, 2775, 2775, 2878, 2878, 2878, 1139, 2879, 1137, + 1136, 2880, 2777, 2777, 2777, 1135, 2778, 1134, 2776, 2779, + 2780, 2780, 2780, 2881, 2881, 2881, 1133, 2882, 1132, 1130, + 2883, 2885, 2885, 2885, 2785, 2785, 2785, 2781, 2786, 1129, + 1128, 2787, 2788, 2788, 2788, 2888, 2888, 2888, 2886, 2889, + 1127, 1125, 2890, 2790, 2790, 2790, 2891, 2891, 2891, 2789, + + 2892, 1124, 1123, 2893, 1470, 1470, 1470, 1480, 1480, 1480, + 2791, 2800, 2800, 2800, 1120, 2801, 1119, 1117, 2802, 2803, + 2803, 2803, 1472, 2804, 1114, 1482, 2805, 2906, 2906, 2906, + 2910, 2910, 2910, 2811, 2811, 2811, 2913, 2913, 2913, 2815, + 2815, 2815, 1113, 2816, 1109, 2907, 2817, 2911, 1742, 2924, + 2924, 2924, 1262, 1262, 1262, 2900, 2849, 2849, 2849, 2948, + 2948, 2948, 2851, 2851, 2851, 1108, 2925, 1293, 1293, 1293, + 1264, 2949, 2949, 2949, 2901, 2950, 1106, 1105, 2951, 2852, + 2854, 2854, 2854, 1104, 1101, 1295, 2953, 2953, 2953, 1100, + 2954, 1099, 1098, 2955, 2860, 2860, 2860, 2855, 2857, 2857, + + 2857, 2934, 2858, 1096, 1095, 2859, 2957, 2957, 2957, 1094, + 2958, 2861, 1093, 2959, 2864, 2864, 2864, 1092, 2952, 2962, + 2962, 2962, 1087, 2963, 1085, 1084, 2964, 1083, 2866, 2866, + 2866, 2865, 2867, 1082, 1081, 2868, 2869, 2869, 2869, 2965, + 2965, 2965, 1080, 2966, 1079, 1078, 2967, 2878, 2878, 2878, + 1077, 2879, 1076, 2870, 2880, 2881, 2881, 2881, 1075, 2882, + 1072, 1069, 2883, 2885, 2885, 2885, 2976, 2976, 2976, 1068, + 2977, 1067, 1061, 2978, 2888, 2888, 2888, 1060, 2889, 1058, + 2886, 2890, 2891, 2891, 2891, 1057, 2892, 1055, 1052, 2893, + 2994, 2994, 2994, 1480, 1480, 1480, 2906, 2906, 2906, 3002, + + 3002, 3002, 2910, 2910, 2910, 3004, 3004, 3004, 2995, 3005, + 1051, 1482, 3006, 1048, 2907, 1046, 3003, 1742, 1045, 2911, + 1742, 1044, 1039, 1742, 3007, 3007, 3007, 2913, 2913, 2913, + 3008, 3008, 3008, 3009, 3009, 3009, 2924, 2924, 2924, 3018, + 3018, 3018, 1038, 3019, 1036, 1035, 3020, 1262, 1262, 1262, + 3036, 3036, 3036, 2925, 2948, 2948, 2948, 1034, 1032, 2996, + 2949, 2949, 2949, 1031, 2950, 1264, 1029, 2951, 3037, 3037, + 3037, 2953, 2953, 2953, 1027, 2954, 1026, 1023, 2955, 1018, + 2957, 2957, 2957, 1017, 2958, 1014, 3038, 2959, 2962, 2962, + 2962, 1013, 2963, 1012, 1009, 2964, 2965, 2965, 2965, 1008, + + 2966, 1006, 1003, 2967, 3042, 3042, 3042, 3050, 3050, 3050, + 2976, 2976, 2976, 3027, 2977, 1001, 1000, 2978, 3052, 3052, + 3052, 3043, 999, 998, 3051, 2994, 2994, 2994, 1480, 1480, + 1480, 3002, 3002, 3002, 996, 3053, 995, 3072, 3072, 3072, + 994, 3073, 993, 2995, 3074, 992, 1482, 991, 3003, 1742, + 3004, 3004, 3004, 988, 3005, 1742, 987, 3006, 3007, 3007, + 3007, 3008, 3008, 3008, 3009, 3009, 3009, 986, 1742, 3018, + 3018, 3018, 983, 3019, 980, 979, 3020, 977, 976, 3066, + 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 973, + 970, 1740, 3091, 3091, 3091, 967, 1740, 1740, 1740, 1742, + + 1740, 3036, 3036, 3036, 3037, 3037, 3037, 3042, 3042, 3042, + 3092, 3102, 3102, 3102, 966, 3103, 958, 957, 3104, 3105, + 3105, 3105, 3038, 956, 3043, 1740, 1740, 1740, 1740, 1740, + 1740, 1740, 1740, 1740, 1740, 1740, 3106, 955, 1740, 3050, + 3050, 3050, 949, 1740, 1740, 1740, 1742, 1740, 3110, 3110, + 3110, 948, 3111, 947, 945, 3112, 3051, 3052, 3052, 3052, + 3113, 3113, 3113, 944, 3114, 943, 942, 3115, 3128, 3128, + 3128, 941, 1740, 1740, 3053, 3072, 3072, 3072, 940, 3073, + 935, 932, 3074, 934, 929, 928, 3129, 926, 3091, 3091, + 3091, 924, 923, 1742, 1740, 1740, 1740, 1740, 1740, 3140, + + 1740, 1740, 1740, 921, 919, 1740, 3092, 3105, 3105, 3105, + 1740, 1740, 1740, 1742, 1740, 3102, 3102, 3102, 917, 3103, + 915, 913, 3104, 910, 3106, 3164, 3164, 3164, 909, 3165, + 908, 907, 3166, 3128, 3128, 3128, 3182, 3182, 3182, 1740, + 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 3140, + 906, 3129, 1740, 904, 1742, 1743, 902, 1740, 1740, 1740, + 1742, 1740, 3110, 3110, 3110, 901, 3111, 900, 898, 3112, + 3113, 3113, 3113, 896, 3114, 895, 893, 3115, 3193, 3193, + 3193, 3195, 3195, 3195, 891, 890, 1740, 1740, 3197, 3197, + 3197, 888, 3164, 3164, 3164, 3194, 3165, 884, 3196, 3166, + + 3205, 3205, 3205, 883, 881, 3198, 3215, 3215, 3215, 3182, + 3182, 3182, 3193, 3193, 3193, 876, 874, 3206, 3225, 3225, + 3225, 870, 3226, 869, 1180, 3227, 868, 1742, 866, 3194, + 3195, 3195, 3195, 3228, 3228, 3228, 864, 3229, 863, 862, + 3230, 3197, 3197, 3197, 3231, 3231, 3231, 3196, 3232, 860, + 858, 3233, 3205, 3205, 3205, 3240, 3240, 3240, 3198, 3241, + 1947, 857, 3242, 3215, 3215, 3215, 3225, 3225, 3225, 3206, + 3226, 855, 853, 3227, 852, 3228, 3228, 3228, 851, 3229, + 850, 1180, 3230, 3231, 3231, 3231, 849, 3232, 848, 847, + 3233, 3240, 3240, 3240, 845, 3241, 843, 842, 3242, 839, + + 3251, 3364, 3364, 3364, 3364, 3364, 3364, 838, 3373, 837, + 835, 3374, 3466, 3466, 3466, 3466, 3466, 3466, 833, 1180, + 822, 821, 1180, 818, 816, 814, 813, 812, 810, 808, + 3467, 806, 804, 3467, 264, 264, 264, 264, 264, 264, + 264, 264, 264, 265, 265, 265, 265, 265, 265, 265, + 265, 265, 270, 270, 270, 270, 270, 270, 270, 270, + 270, 273, 273, 273, 273, 273, 273, 273, 273, 273, + 276, 276, 276, 276, 276, 276, 276, 276, 276, 279, + 279, 279, 279, 279, 279, 279, 279, 279, 286, 286, + 286, 286, 286, 286, 286, 286, 286, 294, 294, 294, + + 294, 294, 294, 294, 294, 294, 298, 298, 298, 298, + 298, 298, 298, 298, 298, 310, 310, 310, 310, 310, + 310, 310, 310, 310, 314, 314, 314, 314, 314, 314, + 314, 314, 314, 321, 321, 321, 321, 321, 321, 321, + 321, 321, 332, 332, 332, 332, 332, 332, 332, 332, + 332, 340, 340, 340, 340, 340, 340, 340, 340, 340, + 346, 346, 346, 346, 346, 346, 346, 346, 346, 352, + 352, 352, 352, 352, 352, 352, 352, 352, 358, 358, + 358, 358, 358, 358, 358, 358, 358, 363, 363, 363, + 363, 363, 363, 363, 363, 363, 382, 382, 382, 382, + + 382, 382, 382, 382, 382, 389, 389, 389, 389, 389, + 389, 389, 389, 389, 397, 397, 397, 397, 397, 397, + 397, 397, 397, 402, 402, 402, 402, 402, 402, 402, + 402, 402, 408, 408, 408, 408, 408, 408, 408, 408, + 408, 413, 413, 413, 413, 413, 413, 413, 413, 413, + 419, 419, 419, 419, 419, 419, 419, 419, 419, 427, + 427, 427, 427, 427, 427, 427, 427, 427, 435, 435, + 435, 435, 435, 435, 435, 435, 435, 442, 442, 442, + 442, 442, 442, 442, 442, 442, 449, 449, 449, 449, + 449, 449, 449, 449, 449, 453, 453, 453, 453, 453, + + 453, 453, 453, 453, 459, 459, 459, 459, 459, 459, + 459, 459, 459, 465, 465, 465, 465, 465, 465, 465, + 465, 465, 483, 483, 483, 483, 483, 483, 483, 483, + 483, 490, 490, 490, 490, 490, 490, 490, 490, 490, + 499, 499, 499, 499, 499, 499, 499, 499, 499, 505, + 505, 505, 505, 505, 505, 505, 505, 505, 515, 515, + 515, 515, 515, 515, 515, 515, 515, 521, 521, 521, + 521, 521, 521, 521, 521, 521, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 532, 532, 532, 532, 532, + 532, 532, 532, 532, 538, 538, 538, 538, 538, 538, + + 538, 538, 538, 544, 544, 544, 544, 544, 544, 544, + 544, 544, 551, 551, 551, 551, 551, 551, 551, 551, + 551, 558, 558, 558, 558, 558, 558, 558, 558, 558, + 563, 563, 563, 563, 563, 563, 563, 563, 563, 571, + 571, 571, 571, 571, 571, 571, 571, 571, 577, 577, + 577, 577, 577, 577, 577, 577, 577, 584, 584, 584, + 584, 584, 584, 584, 584, 584, 589, 589, 589, 589, + 589, 589, 589, 589, 589, 595, 595, 595, 595, 595, + 595, 595, 595, 595, 600, 600, 600, 600, 600, 600, + 600, 600, 600, 607, 607, 607, 607, 607, 607, 607, + + 607, 607, 613, 613, 613, 613, 613, 613, 613, 613, + 613, 620, 620, 620, 620, 620, 620, 620, 620, 620, + 628, 628, 628, 628, 628, 628, 628, 628, 628, 636, + 636, 636, 636, 636, 636, 636, 636, 636, 640, 640, + 640, 640, 640, 640, 640, 640, 640, 646, 646, 646, + 646, 646, 646, 646, 646, 646, 650, 650, 650, 650, + 650, 650, 650, 650, 650, 657, 657, 657, 657, 657, + 657, 657, 657, 657, 662, 662, 662, 662, 662, 662, + 662, 662, 662, 668, 668, 668, 668, 668, 668, 668, + 668, 668, 673, 673, 673, 673, 673, 673, 673, 673, + + 673, 693, 693, 693, 803, 802, 801, 693, 720, 720, + 720, 799, 798, 796, 720, 724, 724, 724, 793, 792, + 791, 724, 732, 732, 732, 789, 787, 786, 732, 743, + 743, 743, 784, 782, 781, 743, 749, 749, 749, 779, + 776, 775, 749, 772, 772, 772, 774, 773, 771, 772, + 780, 780, 780, 3468, 718, 751, 780, 785, 785, 785, + 750, 748, 746, 785, 790, 790, 790, 745, 744, 742, + 790, 800, 800, 800, 738, 734, 733, 800, 807, 807, + 807, 731, 730, 727, 807, 811, 811, 811, 726, 725, + 723, 811, 817, 817, 817, 722, 721, 719, 817, 836, + + 836, 836, 714, 3468, 694, 836, 846, 846, 846, 692, + 690, 684, 846, 856, 856, 856, 683, 684, 683, 856, + 861, 861, 861, 682, 681, 3468, 861, 867, 867, 867, + 3468, 3468, 3468, 867, 875, 875, 875, 3468, 3468, 3468, + 875, 882, 882, 882, 3468, 3468, 3468, 882, 889, 889, + 889, 3468, 3468, 3468, 889, 894, 894, 894, 3468, 3468, + 3468, 894, 899, 899, 899, 3468, 3468, 3468, 899, 905, + 905, 905, 3468, 3468, 3468, 905, 914, 914, 914, 3468, + 3468, 3468, 914, 918, 918, 918, 3468, 3468, 3468, 918, + 922, 922, 922, 3468, 3468, 3468, 922, 927, 927, 927, + + 3468, 3468, 3468, 927, 931, 931, 931, 931, 931, 931, + 931, 3468, 931, 693, 693, 693, 3468, 3468, 3468, 693, + 946, 3468, 3468, 3468, 946, 720, 720, 720, 3468, 3468, + 3468, 720, 978, 3468, 3468, 3468, 978, 724, 724, 724, + 3468, 3468, 3468, 724, 985, 3468, 3468, 3468, 985, 732, + 732, 732, 3468, 3468, 3468, 732, 997, 3468, 3468, 3468, + 997, 743, 743, 743, 3468, 3468, 3468, 743, 1002, 3468, + 3468, 3468, 1002, 749, 749, 749, 3468, 3468, 3468, 749, + 1007, 3468, 3468, 3468, 1007, 772, 772, 772, 3468, 3468, + 3468, 772, 1028, 3468, 3468, 3468, 1028, 780, 780, 780, + + 3468, 3468, 3468, 780, 1033, 3468, 3468, 3468, 1033, 785, + 785, 785, 3468, 3468, 3468, 785, 1037, 3468, 3468, 3468, + 1037, 790, 790, 790, 3468, 3468, 3468, 790, 1047, 3468, + 3468, 3468, 1047, 800, 800, 800, 3468, 3468, 3468, 800, + 1056, 3468, 3468, 3468, 1056, 807, 807, 807, 3468, 3468, + 3468, 807, 1059, 3468, 3468, 3468, 1059, 811, 811, 811, + 3468, 3468, 3468, 811, 1066, 3468, 3468, 3468, 1066, 817, + 817, 817, 3468, 3468, 3468, 817, 1086, 3468, 3468, 3468, + 1086, 836, 836, 836, 3468, 3468, 3468, 836, 1097, 3468, + 3468, 3468, 1097, 846, 846, 846, 3468, 3468, 3468, 846, + + 1107, 3468, 3468, 3468, 1107, 856, 856, 856, 3468, 3468, + 3468, 856, 1112, 3468, 3468, 3468, 1112, 861, 861, 861, + 3468, 3468, 3468, 861, 1118, 3468, 3468, 3468, 1118, 867, + 867, 867, 3468, 3468, 3468, 867, 1126, 3468, 3468, 3468, + 1126, 875, 875, 875, 3468, 3468, 3468, 875, 1131, 3468, + 3468, 3468, 1131, 882, 882, 882, 3468, 3468, 3468, 882, + 1138, 3468, 3468, 3468, 1138, 889, 889, 889, 3468, 3468, + 3468, 889, 1143, 3468, 3468, 3468, 1143, 894, 894, 894, + 3468, 3468, 3468, 894, 1147, 3468, 3468, 3468, 1147, 899, + 899, 899, 3468, 3468, 3468, 899, 1152, 3468, 3468, 3468, + + 1152, 905, 905, 905, 3468, 3468, 3468, 905, 1159, 3468, + 3468, 3468, 1159, 914, 914, 914, 3468, 3468, 3468, 914, + 1163, 3468, 3468, 3468, 1163, 918, 918, 918, 3468, 3468, + 3468, 918, 1167, 3468, 3468, 3468, 1167, 922, 922, 922, + 3468, 3468, 3468, 922, 1172, 3468, 3468, 3468, 1172, 927, + 927, 927, 3468, 3468, 3468, 927, 1177, 3468, 3468, 3468, + 1177, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, + 1185, 3468, 3468, 3468, 3468, 1185, 693, 693, 693, 3468, + 3468, 3468, 693, 1194, 1194, 1194, 1194, 3468, 3468, 1194, + 1194, 720, 720, 720, 3468, 3468, 3468, 720, 1230, 1230, + + 1230, 1230, 3468, 3468, 1230, 1230, 724, 724, 724, 3468, + 3468, 3468, 724, 1240, 1240, 1240, 1240, 3468, 3468, 1240, + 1240, 732, 732, 732, 3468, 3468, 3468, 732, 1256, 1256, + 1256, 1256, 3468, 3468, 1256, 1256, 743, 743, 743, 3468, + 3468, 3468, 743, 1263, 1263, 1263, 1263, 3468, 3468, 1263, + 1263, 749, 749, 749, 3468, 3468, 3468, 749, 1271, 1271, + 1271, 1271, 3468, 3468, 1271, 1271, 772, 772, 772, 3468, + 3468, 3468, 772, 1294, 1294, 1294, 1294, 3468, 3468, 1294, + 1294, 780, 780, 780, 3468, 3468, 3468, 780, 1301, 1301, + 1301, 1301, 3468, 3468, 1301, 1301, 785, 785, 785, 3468, + + 3468, 3468, 785, 1307, 1307, 1307, 1307, 3468, 3468, 1307, + 1307, 790, 790, 790, 3468, 3468, 3468, 790, 1320, 1320, + 1320, 1320, 3468, 3468, 1320, 1320, 800, 800, 800, 3468, + 3468, 3468, 800, 1332, 1332, 1332, 1332, 3468, 3468, 1332, + 1332, 807, 807, 807, 3468, 3468, 3468, 807, 1337, 1337, + 1337, 1337, 3468, 3468, 1337, 1337, 811, 811, 811, 3468, + 3468, 3468, 811, 1348, 1348, 1348, 1348, 3468, 3468, 1348, + 1348, 817, 817, 817, 3468, 3468, 3468, 817, 1375, 1375, + 1375, 1375, 3468, 3468, 1375, 1375, 836, 836, 836, 836, + 3468, 836, 3468, 836, 1391, 1391, 1391, 1391, 3468, 3468, + + 1391, 1391, 846, 846, 846, 3468, 3468, 3468, 846, 1406, + 1406, 1406, 1406, 3468, 3468, 1406, 1406, 856, 856, 856, + 3468, 3468, 3468, 856, 1414, 1414, 1414, 1414, 3468, 3468, + 1414, 1414, 861, 861, 861, 3468, 3468, 3468, 861, 1423, + 1423, 1423, 1423, 3468, 3468, 1423, 1423, 867, 867, 867, + 3468, 3468, 3468, 867, 1434, 1434, 1434, 1434, 3468, 3468, + 1434, 1434, 875, 875, 875, 875, 3468, 875, 3468, 875, + 1443, 1443, 1443, 1443, 3468, 3468, 1443, 1443, 882, 882, + 882, 882, 3468, 882, 3468, 882, 1455, 1455, 1455, 1455, + 3468, 3468, 1455, 1455, 889, 889, 889, 3468, 3468, 3468, + + 889, 1463, 1463, 1463, 1463, 3468, 3468, 1463, 1463, 894, + 894, 894, 894, 3468, 894, 3468, 894, 1471, 1471, 1471, + 1471, 3468, 3468, 1471, 1471, 899, 899, 899, 899, 3468, + 899, 3468, 899, 1481, 1481, 1481, 1481, 3468, 3468, 1481, + 1481, 905, 905, 905, 3468, 3468, 3468, 905, 1490, 1490, + 1490, 1490, 3468, 3468, 1490, 1490, 914, 914, 914, 3468, + 3468, 3468, 914, 1496, 1496, 1496, 1496, 3468, 3468, 1496, + 1496, 1503, 1503, 1503, 1503, 3468, 3468, 1503, 1503, 922, + 922, 922, 3468, 3468, 3468, 922, 1511, 1511, 1511, 1511, + 3468, 3468, 1511, 1511, 927, 927, 927, 3468, 3468, 3468, + + 927, 1519, 1519, 1519, 1519, 3468, 3468, 1519, 1519, 1179, + 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1185, 3468, + 1185, 3468, 3468, 1185, 693, 693, 693, 3468, 3468, 3468, + 693, 1194, 1194, 1194, 1194, 3468, 3468, 1194, 1194, 720, + 720, 720, 720, 3468, 720, 3468, 720, 1230, 1230, 1230, + 1230, 3468, 3468, 1230, 1230, 724, 724, 724, 724, 3468, + 724, 3468, 724, 1240, 1240, 1240, 1240, 3468, 3468, 1240, + 1240, 732, 732, 732, 3468, 3468, 3468, 732, 1256, 1256, + 1256, 1256, 3468, 3468, 1256, 1256, 743, 743, 743, 3468, + 3468, 3468, 743, 1263, 1263, 1263, 1263, 3468, 3468, 1263, + + 1263, 749, 749, 749, 3468, 3468, 3468, 749, 1271, 1271, + 1271, 1271, 3468, 3468, 1271, 1271, 772, 772, 772, 3468, + 3468, 3468, 772, 1294, 1294, 1294, 1294, 3468, 3468, 1294, + 1294, 780, 780, 780, 780, 3468, 780, 3468, 780, 1301, + 1301, 1301, 1301, 3468, 3468, 1301, 1301, 785, 785, 785, + 785, 3468, 785, 3468, 785, 1307, 1307, 1307, 1307, 3468, + 3468, 1307, 1307, 790, 790, 790, 3468, 3468, 3468, 790, + 1320, 1320, 1320, 1320, 3468, 3468, 1320, 1320, 800, 800, + 800, 3468, 3468, 3468, 800, 1332, 1332, 1332, 1332, 3468, + 3468, 1332, 1332, 807, 807, 807, 807, 3468, 807, 3468, + + 807, 1337, 1337, 1337, 1337, 3468, 3468, 1337, 1337, 811, + 811, 811, 811, 3468, 811, 3468, 811, 1348, 1348, 1348, + 1348, 3468, 3468, 1348, 1348, 817, 817, 817, 3468, 3468, + 3468, 817, 1375, 1375, 1375, 1375, 3468, 3468, 1375, 1375, + 836, 836, 836, 3468, 3468, 3468, 836, 1391, 1391, 1391, + 1391, 3468, 3468, 1391, 1391, 846, 846, 846, 3468, 3468, + 3468, 846, 1406, 1406, 1406, 1406, 3468, 3468, 1406, 1406, + 856, 856, 856, 3468, 3468, 3468, 856, 1414, 1414, 1414, + 1414, 3468, 3468, 1414, 1414, 861, 861, 861, 3468, 3468, + 3468, 861, 1423, 1423, 1423, 1423, 3468, 3468, 1423, 1423, + + 867, 867, 867, 3468, 3468, 3468, 867, 1434, 1434, 1434, + 1434, 3468, 3468, 1434, 1434, 875, 875, 875, 3468, 3468, + 3468, 875, 1443, 1443, 1443, 1443, 3468, 3468, 1443, 1443, + 882, 882, 882, 3468, 3468, 3468, 882, 1455, 1455, 1455, + 1455, 3468, 3468, 1455, 1455, 889, 889, 889, 3468, 3468, + 3468, 889, 1463, 1463, 1463, 1463, 3468, 3468, 1463, 1463, + 1471, 1471, 1471, 1471, 3468, 3468, 1471, 1471, 899, 899, + 899, 3468, 3468, 3468, 899, 1481, 1481, 1481, 1481, 3468, + 3468, 1481, 1481, 905, 905, 905, 3468, 3468, 3468, 905, + 1490, 1490, 1490, 1490, 3468, 3468, 1490, 1490, 914, 914, + + 914, 3468, 3468, 3468, 914, 1496, 1496, 1496, 1496, 3468, + 3468, 1496, 1496, 1503, 1503, 1503, 1503, 3468, 3468, 1503, + 1503, 922, 922, 922, 3468, 3468, 3468, 922, 1511, 1511, + 1511, 1511, 3468, 3468, 1511, 1511, 927, 927, 927, 3468, + 3468, 3468, 927, 1519, 1519, 1519, 1519, 3468, 3468, 1519, + 1519, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, + 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 693, + 693, 693, 3468, 3468, 3468, 693, 1194, 1194, 1194, 1194, + 3468, 3468, 1194, 1194, 1230, 1230, 1230, 1230, 3468, 3468, + 1230, 1230, 724, 724, 724, 3468, 3468, 3468, 724, 1240, + + 1240, 1240, 1240, 3468, 3468, 1240, 1240, 732, 732, 732, + 3468, 3468, 3468, 732, 1256, 1256, 1256, 1256, 3468, 3468, + 1256, 1256, 743, 743, 743, 3468, 3468, 3468, 743, 1263, + 1263, 1263, 1263, 3468, 3468, 1263, 1263, 749, 749, 749, + 3468, 3468, 3468, 749, 772, 772, 772, 3468, 3468, 3468, + 772, 1294, 1294, 1294, 1294, 3468, 3468, 1294, 1294, 780, + 780, 780, 3468, 3468, 3468, 780, 1301, 1301, 1301, 1301, + 3468, 3468, 1301, 1301, 785, 785, 785, 3468, 3468, 3468, + 785, 1307, 1307, 1307, 1307, 3468, 3468, 1307, 1307, 790, + 790, 790, 3468, 3468, 3468, 790, 1320, 1320, 1320, 1320, + + 3468, 3468, 1320, 1320, 800, 800, 800, 3468, 3468, 3468, + 800, 1332, 1332, 1332, 1332, 3468, 3468, 1332, 1332, 1337, + 1337, 1337, 1337, 3468, 3468, 1337, 1337, 1348, 1348, 1348, + 1348, 3468, 3468, 1348, 1348, 817, 817, 817, 3468, 3468, + 3468, 817, 1375, 1375, 1375, 1375, 3468, 3468, 1375, 1375, + 836, 836, 836, 836, 3468, 836, 3468, 836, 1391, 1391, + 1391, 1391, 3468, 3468, 1391, 1391, 846, 846, 846, 3468, + 3468, 3468, 846, 1406, 1406, 1406, 1406, 3468, 3468, 1406, + 1406, 856, 856, 856, 3468, 3468, 3468, 856, 1414, 1414, + 1414, 1414, 3468, 3468, 1414, 1414, 861, 861, 861, 3468, + + 3468, 3468, 861, 1423, 1423, 1423, 1423, 3468, 3468, 1423, + 1423, 867, 867, 867, 3468, 3468, 3468, 867, 1434, 1434, + 1434, 1434, 3468, 3468, 1434, 1434, 875, 875, 875, 3468, + 3468, 3468, 875, 1443, 1443, 1443, 1443, 3468, 3468, 1443, + 1443, 882, 882, 882, 3468, 3468, 3468, 882, 1455, 1455, + 1455, 1455, 3468, 3468, 1455, 1455, 889, 889, 889, 3468, + 3468, 3468, 889, 1463, 1463, 1463, 1463, 3468, 3468, 1463, + 1463, 1471, 1471, 1471, 1471, 3468, 3468, 1471, 1471, 899, + 899, 899, 3468, 3468, 3468, 899, 1481, 1481, 1481, 1481, + 3468, 3468, 1481, 1481, 905, 905, 905, 3468, 3468, 3468, + + 905, 1490, 1490, 1490, 1490, 3468, 3468, 1490, 1490, 914, + 914, 914, 914, 3468, 914, 3468, 914, 1496, 1496, 1496, + 1496, 3468, 3468, 1496, 1496, 1503, 1503, 1503, 1503, 3468, + 3468, 1503, 1503, 922, 922, 922, 922, 3468, 922, 3468, + 922, 1511, 1511, 1511, 1511, 3468, 3468, 1511, 1511, 927, + 927, 927, 927, 3468, 927, 3468, 927, 1519, 1519, 1519, + 1519, 3468, 3468, 1519, 1519, 1179, 1179, 1179, 1179, 1179, + 1179, 1179, 1179, 1179, 1740, 1740, 1740, 1740, 1740, 1740, + 1740, 1740, 1740, 693, 693, 693, 3468, 3468, 3468, 693, + 1194, 1194, 1194, 1194, 3468, 3468, 1194, 1194, 1230, 1230, + + 1230, 1230, 3468, 3468, 1230, 1230, 724, 724, 724, 3468, + 3468, 3468, 724, 1240, 1240, 1240, 1240, 3468, 3468, 1240, + 1240, 732, 732, 732, 3468, 3468, 3468, 732, 1256, 1256, + 1256, 1256, 3468, 3468, 1256, 1256, 743, 743, 743, 3468, + 3468, 3468, 743, 1263, 1263, 1263, 1263, 3468, 3468, 1263, + 1263, 749, 749, 749, 3468, 3468, 3468, 749, 772, 772, + 772, 3468, 3468, 3468, 772, 1294, 1294, 1294, 1294, 3468, + 3468, 1294, 1294, 780, 780, 780, 3468, 3468, 3468, 780, + 1301, 1301, 1301, 1301, 3468, 3468, 1301, 1301, 785, 785, + 785, 785, 3468, 785, 3468, 785, 1307, 1307, 1307, 1307, + + 3468, 3468, 1307, 1307, 790, 790, 790, 3468, 3468, 3468, + 790, 1320, 1320, 1320, 1320, 3468, 3468, 1320, 1320, 800, + 800, 800, 800, 3468, 800, 3468, 800, 1332, 1332, 1332, + 1332, 3468, 3468, 1332, 1332, 1348, 1348, 1348, 1348, 3468, + 3468, 1348, 1348, 817, 817, 817, 3468, 3468, 3468, 817, + 1375, 1375, 1375, 1375, 3468, 3468, 1375, 1375, 836, 836, + 836, 836, 3468, 836, 3468, 836, 1391, 1391, 1391, 1391, + 3468, 3468, 1391, 1391, 846, 846, 846, 3468, 3468, 3468, + 846, 1406, 1406, 1406, 1406, 3468, 3468, 1406, 1406, 856, + 856, 856, 3468, 3468, 3468, 856, 1414, 1414, 1414, 1414, + + 3468, 3468, 1414, 1414, 861, 861, 861, 3468, 3468, 3468, + 861, 1423, 1423, 1423, 1423, 3468, 3468, 1423, 1423, 867, + 867, 867, 3468, 3468, 3468, 867, 1434, 1434, 1434, 1434, + 3468, 3468, 1434, 1434, 875, 875, 875, 3468, 3468, 3468, + 875, 1443, 1443, 1443, 1443, 3468, 3468, 1443, 1443, 882, + 882, 882, 882, 3468, 882, 3468, 882, 1455, 1455, 1455, + 1455, 3468, 3468, 1455, 1455, 889, 889, 889, 3468, 3468, + 3468, 889, 1463, 1463, 1463, 1463, 3468, 3468, 1463, 1463, + 1471, 1471, 1471, 1471, 3468, 3468, 1471, 1471, 899, 899, + 899, 899, 3468, 899, 3468, 899, 1481, 1481, 1481, 1481, + + 3468, 3468, 1481, 1481, 905, 905, 905, 3468, 3468, 3468, + 905, 1490, 1490, 1490, 1490, 3468, 3468, 1490, 1490, 1496, + 1496, 1496, 1496, 3468, 3468, 1496, 1496, 1503, 1503, 1503, + 1503, 3468, 3468, 1503, 1503, 1511, 1511, 1511, 1511, 3468, + 3468, 1511, 1511, 1519, 1519, 1519, 1519, 3468, 3468, 1519, + 1519, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, + 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 693, + 693, 693, 693, 3468, 693, 3468, 693, 1194, 1194, 1194, + 1194, 3468, 3468, 1194, 1194, 1230, 1230, 1230, 1230, 3468, + 3468, 1230, 1230, 724, 724, 724, 3468, 3468, 3468, 724, + + 1240, 1240, 1240, 1240, 3468, 3468, 1240, 1240, 732, 732, + 732, 3468, 3468, 3468, 732, 1256, 1256, 1256, 1256, 3468, + 3468, 1256, 1256, 743, 743, 743, 743, 3468, 743, 3468, + 743, 1263, 1263, 1263, 1263, 3468, 3468, 1263, 1263, 749, + 749, 749, 749, 3468, 749, 3468, 749, 772, 772, 772, + 772, 3468, 772, 3468, 772, 1294, 1294, 1294, 1294, 3468, + 3468, 1294, 1294, 780, 780, 780, 3468, 3468, 3468, 780, + 1301, 1301, 1301, 1301, 3468, 3468, 1301, 1301, 1307, 1307, + 1307, 1307, 3468, 3468, 1307, 1307, 790, 790, 790, 3468, + 3468, 3468, 790, 800, 800, 800, 800, 3468, 800, 3468, + + 800, 1332, 1332, 1332, 1332, 3468, 3468, 1332, 1332, 1348, + 1348, 1348, 1348, 3468, 3468, 1348, 1348, 817, 817, 817, + 3468, 3468, 3468, 817, 1375, 1375, 1375, 1375, 3468, 3468, + 1375, 1375, 836, 836, 836, 836, 3468, 836, 3468, 836, + 1391, 1391, 1391, 1391, 3468, 3468, 1391, 1391, 846, 846, + 846, 3468, 3468, 3468, 846, 856, 856, 856, 3468, 3468, + 3468, 856, 1414, 1414, 1414, 1414, 3468, 3468, 1414, 1414, + 861, 861, 861, 3468, 3468, 3468, 861, 1423, 1423, 1423, + 1423, 3468, 3468, 1423, 1423, 867, 867, 867, 3468, 3468, + 3468, 867, 875, 875, 875, 3468, 3468, 3468, 875, 1443, + + 1443, 1443, 1443, 3468, 3468, 1443, 1443, 882, 882, 882, + 3468, 3468, 3468, 882, 1455, 1455, 1455, 1455, 3468, 3468, + 1455, 1455, 889, 889, 889, 3468, 3468, 3468, 889, 1463, + 1463, 1463, 1463, 3468, 3468, 1463, 1463, 1471, 1471, 1471, + 1471, 3468, 3468, 1471, 1471, 1481, 1481, 1481, 1481, 3468, + 3468, 1481, 1481, 905, 905, 905, 3468, 3468, 3468, 905, + 1490, 1490, 1490, 1490, 3468, 3468, 1490, 1490, 1496, 1496, + 1496, 1496, 3468, 3468, 1496, 1496, 1503, 1503, 1503, 1503, + 3468, 3468, 1503, 1503, 1519, 1519, 1519, 1519, 3468, 3468, + 1519, 1519, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, + + 1179, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, + 1194, 1194, 1194, 1194, 3468, 3468, 1194, 1194, 1230, 1230, + 1230, 1230, 3468, 3468, 1230, 1230, 724, 724, 724, 3468, + 3468, 3468, 724, 732, 732, 732, 3468, 3468, 3468, 732, + 1256, 1256, 1256, 1256, 3468, 3468, 1256, 1256, 1263, 1263, + 1263, 1263, 3468, 3468, 1263, 1263, 772, 772, 772, 3468, + 3468, 3468, 772, 1294, 1294, 1294, 1294, 3468, 3468, 1294, + 1294, 780, 780, 780, 3468, 3468, 3468, 780, 1307, 1307, + 1307, 1307, 3468, 3468, 1307, 1307, 790, 790, 790, 3468, + 3468, 3468, 790, 800, 800, 800, 3468, 3468, 3468, 800, + + 1332, 1332, 1332, 1332, 3468, 3468, 1332, 1332, 1348, 1348, + 1348, 1348, 3468, 3468, 1348, 1348, 817, 817, 817, 3468, + 3468, 3468, 817, 1375, 1375, 1375, 1375, 3468, 3468, 1375, + 1375, 1391, 1391, 1391, 1391, 3468, 3468, 1391, 1391, 846, + 846, 846, 3468, 3468, 3468, 846, 856, 856, 856, 3468, + 3468, 3468, 856, 1414, 1414, 1414, 1414, 3468, 3468, 1414, + 1414, 861, 861, 861, 3468, 3468, 3468, 861, 1423, 1423, + 1423, 1423, 3468, 3468, 1423, 1423, 867, 867, 867, 3468, + 3468, 3468, 867, 875, 875, 875, 3468, 3468, 3468, 875, + 882, 882, 882, 3468, 3468, 3468, 882, 1455, 1455, 1455, + + 1455, 3468, 3468, 1455, 1455, 889, 889, 889, 3468, 3468, + 3468, 889, 1463, 1463, 1463, 1463, 3468, 3468, 1463, 1463, + 1471, 1471, 1471, 1471, 3468, 3468, 1471, 1471, 1481, 1481, + 1481, 1481, 3468, 3468, 1481, 1481, 905, 905, 905, 905, + 3468, 905, 3468, 905, 1490, 1490, 1490, 1490, 3468, 3468, + 1490, 1490, 1496, 1496, 1496, 1496, 3468, 3468, 1496, 1496, + 1503, 1503, 1503, 1503, 3468, 3468, 1503, 1503, 1519, 1519, + 1519, 1519, 3468, 3468, 1519, 1519, 1179, 1179, 1179, 1179, + 1179, 1179, 1179, 1179, 1179, 1740, 1740, 1740, 1740, 1740, + 1740, 1740, 1740, 1740, 1194, 1194, 1194, 1194, 3468, 3468, + + 1194, 1194, 1230, 1230, 1230, 1230, 3468, 3468, 1230, 1230, + 724, 724, 724, 3468, 3468, 3468, 724, 732, 732, 732, + 732, 3468, 732, 3468, 732, 1263, 1263, 1263, 1263, 3468, + 3468, 1263, 1263, 772, 772, 772, 3468, 3468, 3468, 772, + 1294, 1294, 1294, 1294, 3468, 3468, 1294, 1294, 780, 780, + 780, 780, 3468, 780, 3468, 780, 1307, 1307, 1307, 1307, + 3468, 3468, 1307, 1307, 790, 790, 790, 3468, 3468, 3468, + 790, 800, 800, 800, 3468, 3468, 3468, 800, 1332, 1332, + 1332, 1332, 3468, 3468, 1332, 1332, 1348, 1348, 1348, 1348, + 3468, 3468, 1348, 1348, 817, 817, 817, 3468, 3468, 3468, + + 817, 1375, 1375, 1375, 1375, 3468, 3468, 1375, 1375, 1391, + 1391, 1391, 1391, 3468, 3468, 1391, 1391, 846, 846, 846, + 3468, 3468, 3468, 846, 856, 856, 856, 3468, 3468, 3468, + 856, 861, 861, 861, 861, 3468, 861, 3468, 861, 1423, + 1423, 1423, 1423, 3468, 3468, 1423, 1423, 867, 867, 867, + 867, 3468, 867, 3468, 867, 875, 875, 875, 3468, 3468, + 3468, 875, 882, 882, 882, 3468, 3468, 3468, 882, 1455, + 1455, 1455, 1455, 3468, 3468, 1455, 1455, 889, 889, 889, + 889, 3468, 889, 3468, 889, 1463, 1463, 1463, 1463, 3468, + 3468, 1463, 1463, 1471, 1471, 1471, 1471, 3468, 3468, 1471, + + 1471, 1481, 1481, 1481, 1481, 3468, 3468, 1481, 1481, 905, + 905, 905, 905, 3468, 905, 3468, 905, 1490, 1490, 1490, + 1490, 3468, 3468, 1490, 1490, 1496, 1496, 1496, 1496, 3468, + 3468, 1496, 1496, 1519, 1519, 1519, 1519, 3468, 3468, 1519, + 1519, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, + 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1740, 1194, + 1194, 1194, 1194, 3468, 3468, 1194, 1194, 724, 724, 724, + 3468, 3468, 3468, 724, 732, 732, 732, 3468, 3468, 3468, + 732, 1263, 1263, 1263, 1263, 3468, 3468, 1263, 1263, 772, + 772, 772, 3468, 3468, 3468, 772, 1294, 1294, 1294, 1294, + + 3468, 3468, 1294, 1294, 1307, 1307, 1307, 1307, 3468, 3468, + 1307, 1307, 790, 790, 790, 3468, 3468, 3468, 790, 800, + 800, 800, 3468, 3468, 3468, 800, 1348, 1348, 1348, 1348, + 3468, 3468, 1348, 1348, 817, 817, 817, 3468, 3468, 3468, + 817, 846, 846, 846, 3468, 3468, 3468, 846, 856, 856, + 856, 3468, 3468, 3468, 856, 1423, 1423, 1423, 1423, 3468, + 3468, 1423, 1423, 867, 867, 867, 3468, 3468, 3468, 867, + 875, 875, 875, 3468, 3468, 3468, 875, 882, 882, 882, + 3468, 3468, 3468, 882, 3075, 3075, 3075, 3075, 3075, 3075, + 3075, 3075, 3075, 3076, 3076, 3076, 3076, 3076, 3076, 3076, + + 3076, 3076, 3135, 3135, 3135, 3135, 3135, 3135, 3135, 3135, + 3135, 3138, 3138, 3138, 3138, 3138, 3138, 3138, 3138, 3138, + 3179, 3179, 3179, 3179, 3179, 3179, 3179, 3179, 3179, 3181, + 3181, 3181, 3181, 3181, 3181, 3181, 3181, 3181, 263, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468 } ; -static yyconst flex_int16_t yy_chk[12668] = +static yyconst flex_int16_t yy_chk[12714] = { 0, 0, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 11, 3, 9, 12, @@ -3125,204 +3134,204 @@ static yyconst flex_int16_t yy_chk[12668] = 8, 8, 8, 268, 11, 13, 13, 12, 14, 14, 13, 13, 317, 14, 14, 269, 8, 17, 17, 268, 13, 15, 15, 14, 15, 272, 15, 16, 16, 371, - 16, 269, 16, 18, 18, 1542, 15, 19, 19, 19, - 549, 272, 16, 20, 20, 20, 23, 23, 23, 24, - 24, 24, 549, 19, 25, 25, 25, 371, 1543, 20, - 378, 17, 23, 1097, 317, 24, 266, 266, 266, 1097, + 16, 269, 16, 18, 18, 0, 15, 19, 19, 19, + 550, 272, 16, 20, 20, 20, 23, 23, 23, 24, + 24, 24, 550, 19, 25, 25, 25, 371, 1540, 20, + 378, 17, 23, 1100, 317, 24, 266, 266, 266, 1100, 25, 267, 267, 267, 271, 271, 271, 18, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 301, 21, 21, 21, 21, 21, 26, 26, 26, 27, 27, 27, 28, 28, 28, 301, 29, - 29, 29, 30, 30, 30, 26, 378, 478, 27, 295, - 478, 28, 697, 21, 21, 29, 311, 290, 30, 31, + 29, 29, 30, 30, 30, 26, 378, 479, 27, 295, + 479, 28, 698, 21, 21, 29, 311, 290, 30, 31, 31, 31, 292, 292, 292, 295, 299, 299, 299, 308, - 308, 308, 311, 290, 367, 31, 697, 21, 22, 22, + 308, 308, 311, 290, 367, 31, 698, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 22, 1545, 22, 22, 22, 22, 22, 32, + 22, 22, 22, 1542, 22, 22, 22, 22, 22, 32, 32, 32, 33, 33, 33, 34, 34, 34, 282, 35, - 35, 35, 36, 36, 36, 32, 290, 370, 33, 495, - 753, 34, 495, 22, 22, 35, 367, 370, 36, 37, + 35, 35, 36, 36, 36, 32, 290, 370, 33, 496, + 754, 34, 496, 22, 22, 35, 367, 370, 36, 37, 37, 37, 38, 38, 38, 39, 39, 39, 40, 40, - 40, 41, 41, 41, 753, 37, 561, 22, 38, 322, - 282, 39, 474, 561, 40, 370, 282, 41, 42, 42, + 40, 41, 41, 41, 754, 37, 562, 22, 38, 322, + 282, 39, 475, 562, 40, 370, 282, 41, 42, 42, 42, 282, 315, 315, 315, 322, 282, 319, 319, 319, - 330, 330, 330, 474, 42, 43, 43, 43, 43, 43, + 330, 330, 330, 475, 42, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 339, 43, 43, 43, 43, 43, 45, 45, 45, 46, 46, 46, 47, 47, 47, 339, 48, 48, 48, 49, - 49, 49, 45, 438, 566, 46, 1546, 438, 47, 337, + 49, 49, 45, 425, 567, 46, 1543, 425, 47, 337, 43, 43, 48, 337, 391, 49, 303, 337, 43, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 333, 44, 44, 44, 44, 44, - 50, 50, 50, 51, 51, 51, 52, 52, 52, 1547, - 333, 579, 55, 55, 575, 303, 50, 55, 304, 51, - 566, 575, 52, 391, 44, 44, 391, 55, 303, 393, - 303, 957, 44, 53, 53, 53, 53, 53, 53, 53, - 53, 53, 53, 53, 53, 53, 53, 53, 957, 53, - - 53, 53, 53, 53, 1548, 347, 55, 304, 59, 59, - 59, 60, 60, 60, 63, 63, 63, 579, 56, 56, - 304, 347, 304, 56, 59, 327, 477, 60, 53, 53, - 63, 393, 327, 56, 477, 685, 53, 405, 685, 53, - 477, 327, 341, 341, 341, 1549, 53, 54, 54, 54, + 50, 50, 50, 51, 51, 51, 52, 52, 52, 1544, + 333, 580, 55, 55, 576, 303, 50, 55, 304, 51, + 567, 576, 52, 391, 44, 44, 391, 55, 303, 393, + 303, 603, 44, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, 1546, 53, + + 53, 53, 53, 53, 1547, 347, 55, 304, 59, 59, + 59, 60, 60, 60, 63, 63, 63, 580, 56, 56, + 304, 347, 304, 56, 59, 327, 566, 60, 53, 53, + 63, 393, 327, 56, 566, 686, 53, 603, 686, 53, + 429, 327, 341, 341, 341, 1549, 53, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 56, 54, 54, 54, 54, 54, 64, 64, - 64, 67, 67, 67, 68, 68, 68, 442, 69, 69, - 69, 70, 70, 70, 64, 359, 377, 67, 342, 405, - 68, 565, 54, 54, 69, 342, 1211, 70, 1550, 565, + 64, 67, 67, 67, 68, 68, 68, 480, 69, 69, + 69, 70, 70, 70, 64, 359, 377, 67, 342, 429, + 68, 480, 54, 54, 69, 342, 1550, 70, 1551, 616, - 54, 359, 377, 54, 342, 344, 344, 344, 406, 1211, + 54, 359, 377, 54, 342, 344, 344, 344, 431, 959, 54, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 442, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 959, 57, 57, 57, 57, 57, 71, 71, 71, 72, 72, 72, 73, 73, - 73, 444, 74, 74, 74, 75, 75, 75, 71, 1551, - 383, 72, 354, 398, 73, 1552, 57, 57, 74, 354, - 406, 75, 353, 353, 353, 57, 383, 57, 354, 398, - 392, 57, 356, 356, 356, 484, 57, 57, 58, 58, + 73, 444, 74, 74, 74, 75, 75, 75, 71, 1552, + 383, 72, 354, 398, 73, 616, 57, 57, 74, 354, + 431, 75, 353, 353, 353, 57, 383, 57, 354, 398, + 392, 57, 356, 356, 356, 445, 57, 57, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 444, 58, 58, 58, 58, 58, 76, - 76, 76, 77, 77, 77, 78, 78, 78, 630, 79, + 76, 76, 77, 77, 77, 78, 78, 78, 631, 79, 79, 79, 80, 80, 80, 76, 369, 1553, 77, 392, - 630, 78, 392, 58, 58, 79, 369, 484, 80, 364, + 631, 78, 392, 58, 58, 79, 369, 445, 80, 364, 364, 364, 58, 369, 58, 380, 380, 380, 58, 390, - 390, 390, 1555, 58, 58, 61, 61, 61, 61, 61, + 390, 390, 1554, 58, 58, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 375, 61, 61, 61, 61, 61, 81, 81, 81, 82, - 82, 82, 83, 83, 83, 727, 84, 84, 84, 85, - 85, 85, 81, 797, 1556, 82, 797, 479, 83, 375, - 61, 61, 84, 375, 375, 85, 602, 61, 395, 395, + 82, 82, 83, 83, 83, 728, 84, 84, 84, 85, + 85, 85, 81, 704, 1373, 82, 677, 704, 83, 375, + 61, 61, 84, 375, 375, 85, 1373, 61, 395, 395, - 395, 479, 375, 61, 375, 404, 404, 404, 408, 408, - 408, 727, 61, 62, 62, 62, 62, 62, 62, 62, - 62, 62, 62, 62, 62, 62, 62, 62, 676, 62, + 395, 677, 375, 61, 375, 403, 403, 403, 406, 406, + 406, 728, 61, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 1555, 62, 62, 62, 62, 62, 86, 86, 86, 87, 87, 87, - 88, 88, 88, 676, 89, 89, 89, 90, 90, 90, - 86, 411, 602, 87, 1562, 615, 88, 417, 62, 62, - 89, 422, 433, 90, 417, 62, 1223, 411, 416, 416, - 416, 62, 762, 417, 419, 419, 419, 422, 433, 1223, + 88, 88, 88, 706, 89, 89, 89, 90, 90, 90, + 86, 409, 420, 87, 404, 763, 88, 706, 62, 62, + 89, 404, 415, 90, 1556, 62, 1557, 409, 420, 415, + 404, 62, 414, 414, 414, 417, 417, 417, 415, 763, 62, 65, 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 762, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 1559, 65, 65, 65, 65, 65, 91, 91, 91, 92, 92, 92, 93, 93, - 93, 615, 94, 94, 94, 95, 95, 95, 91, 449, - 459, 92, 428, 1563, 93, 485, 65, 65, 94, 428, - 1565, 95, 427, 427, 427, 449, 459, 65, 428, 430, - 430, 430, 441, 441, 441, 1574, 65, 66, 66, 66, + 93, 1560, 94, 94, 94, 95, 95, 95, 91, 436, + 450, 92, 1566, 1567, 93, 485, 65, 65, 94, 460, + 1569, 95, 428, 428, 428, 436, 450, 65, 433, 433, + 433, 443, 443, 443, 486, 460, 65, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 763, 66, 66, 66, 66, 66, 96, 96, + 66, 66, 764, 66, 66, 66, 66, 66, 96, 96, 96, 97, 97, 97, 98, 98, 98, 485, 99, 99, - 99, 100, 100, 100, 96, 471, 763, 97, 1577, 764, - 98, 1579, 66, 66, 99, 454, 1584, 100, 101, 101, + 99, 100, 100, 100, 96, 472, 764, 97, 792, 765, + 98, 792, 66, 66, 99, 455, 486, 100, 101, 101, - 101, 471, 454, 66, 102, 102, 102, 446, 446, 446, - 552, 454, 66, 764, 101, 453, 453, 453, 376, 1587, + 101, 472, 455, 66, 102, 102, 102, 447, 447, 447, + 553, 455, 66, 765, 101, 454, 454, 454, 376, 1030, 102, 103, 103, 103, 103, 103, 103, 103, 103, 103, - 103, 103, 103, 103, 103, 103, 765, 103, 103, 103, + 103, 103, 103, 103, 103, 103, 1030, 103, 103, 103, 103, 103, 105, 105, 105, 106, 106, 106, 107, 107, - 107, 703, 108, 108, 108, 703, 376, 490, 105, 777, - 765, 106, 552, 777, 107, 373, 103, 103, 108, 466, - 505, 103, 376, 490, 553, 373, 466, 103, 456, 456, - 456, 103, 465, 465, 465, 466, 505, 103, 104, 104, + 107, 778, 108, 108, 108, 778, 376, 491, 105, 798, + 710, 106, 553, 798, 107, 373, 103, 103, 108, 467, + 506, 103, 376, 491, 710, 373, 467, 103, 457, 457, + 457, 103, 466, 466, 466, 467, 506, 103, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 373, 104, 104, 104, 104, 104, 109, - 109, 109, 110, 110, 110, 111, 111, 111, 631, 112, - 112, 112, 468, 468, 468, 109, 553, 480, 110, 1588, - 1589, 111, 1594, 104, 104, 112, 521, 532, 104, 480, - 480, 483, 483, 483, 104, 487, 487, 487, 104, 499, - 499, 499, 521, 532, 104, 113, 113, 113, 113, 113, + 109, 109, 110, 110, 110, 111, 111, 111, 478, 112, + 112, 112, 469, 469, 469, 109, 478, 481, 110, 1578, + 1581, 111, 478, 104, 104, 112, 522, 533, 104, 481, + 481, 484, 484, 484, 104, 488, 488, 488, 104, 500, + 500, 500, 522, 533, 104, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, - 631, 113, 113, 113, 113, 113, 115, 115, 115, 116, - 116, 116, 117, 117, 117, 698, 118, 118, 118, 803, - 500, 1595, 115, 803, 769, 116, 698, 500, 117, 698, - - 113, 113, 118, 516, 544, 113, 500, 502, 502, 502, - 516, 113, 515, 515, 515, 518, 518, 518, 769, 516, - 544, 1028, 113, 114, 114, 114, 114, 114, 114, 114, - 114, 114, 114, 114, 114, 114, 114, 114, 1028, 114, - 114, 114, 114, 114, 119, 119, 119, 120, 120, 120, - 121, 121, 121, 705, 122, 122, 122, 526, 526, 526, - 119, 558, 571, 120, 527, 1596, 121, 705, 114, 114, - 122, 527, 1597, 114, 529, 529, 529, 558, 571, 114, - 527, 538, 538, 538, 541, 541, 541, 551, 551, 551, - 114, 123, 123, 123, 123, 123, 123, 123, 123, 123, - - 123, 123, 123, 123, 123, 123, 1598, 123, 123, 123, - 123, 123, 125, 125, 125, 126, 126, 126, 129, 129, - 129, 651, 130, 130, 130, 133, 133, 133, 125, 1179, - 1599, 126, 539, 1179, 129, 1518, 123, 123, 130, 539, - 578, 133, 555, 555, 555, 563, 563, 563, 539, 568, - 568, 568, 123, 1600, 564, 1518, 1605, 123, 124, 124, - 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, - 124, 124, 124, 651, 124, 124, 124, 124, 124, 134, - 134, 134, 135, 135, 135, 136, 136, 136, 578, 137, - 137, 137, 138, 138, 138, 134, 578, 1606, 135, 584, - - 1607, 136, 564, 124, 124, 137, 564, 595, 138, 577, - 577, 577, 581, 581, 581, 584, 589, 589, 589, 124, - 592, 592, 592, 595, 124, 127, 127, 127, 127, 127, - 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, - 1611, 127, 127, 127, 127, 127, 139, 139, 139, 140, - 140, 140, 143, 143, 143, 1615, 144, 144, 144, 147, - 147, 147, 139, 1617, 1618, 140, 590, 607, 143, 620, - 127, 127, 144, 590, 636, 147, 600, 600, 600, 604, - 604, 604, 590, 607, 1622, 620, 127, 1625, 1626, 601, - 636, 1053, 127, 128, 128, 128, 128, 128, 128, 128, - - 128, 128, 128, 128, 128, 128, 128, 128, 1053, 128, - 128, 128, 128, 128, 148, 148, 148, 151, 151, 151, - 152, 152, 152, 1369, 153, 153, 153, 154, 154, 154, - 148, 1633, 1635, 151, 1636, 1369, 152, 601, 128, 128, - 153, 1642, 1643, 154, 652, 601, 613, 613, 613, 614, - 617, 617, 617, 1645, 128, 628, 628, 628, 629, 1646, - 128, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 131, 131, 131, 1647, 131, 131, 131, - 131, 131, 155, 155, 155, 156, 156, 156, 157, 157, - 157, 1648, 158, 158, 158, 629, 652, 614, 155, 646, - - 657, 156, 1649, 1650, 157, 614, 131, 131, 158, 131, - 629, 131, 633, 633, 633, 646, 657, 131, 640, 640, - 640, 643, 643, 643, 131, 1651, 1652, 131, 132, 132, + 766, 113, 113, 113, 113, 113, 115, 115, 115, 116, + 116, 116, 119, 119, 119, 554, 120, 120, 120, 123, + 123, 123, 115, 1583, 766, 116, 501, 517, 119, 545, + + 113, 113, 120, 501, 517, 123, 503, 503, 503, 516, + 516, 516, 501, 517, 632, 545, 113, 519, 519, 519, + 1588, 113, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 554, 114, 114, + 114, 114, 114, 124, 124, 124, 125, 125, 125, 126, + 126, 126, 652, 127, 127, 127, 128, 128, 128, 124, + 1182, 1591, 125, 528, 1182, 126, 632, 114, 114, 127, + 528, 559, 128, 527, 527, 527, 530, 530, 530, 528, + 539, 539, 539, 114, 542, 542, 542, 559, 114, 117, + 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, + + 117, 117, 117, 117, 652, 117, 117, 117, 117, 117, + 129, 129, 129, 130, 130, 130, 133, 133, 133, 759, + 134, 134, 134, 135, 135, 135, 129, 770, 1592, 130, + 540, 1593, 133, 759, 117, 117, 134, 540, 572, 135, + 552, 552, 552, 556, 556, 556, 540, 564, 564, 564, + 117, 770, 1598, 565, 572, 1049, 117, 118, 118, 118, + 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, + 118, 118, 1049, 118, 118, 118, 118, 118, 136, 136, + 136, 137, 137, 137, 138, 138, 138, 1599, 139, 139, + 139, 140, 140, 140, 136, 1600, 1601, 137, 1602, 1522, + + 138, 565, 118, 118, 139, 565, 585, 140, 569, 569, + 569, 578, 578, 578, 582, 582, 582, 1603, 118, 1522, + 1604, 579, 585, 1609, 118, 121, 121, 121, 121, 121, + 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, + 1612, 121, 121, 121, 121, 121, 143, 143, 143, 144, + 144, 144, 147, 147, 147, 653, 148, 148, 148, 590, + 590, 590, 143, 1616, 1618, 144, 596, 591, 147, 579, + 121, 121, 148, 121, 591, 121, 699, 579, 593, 593, + 593, 121, 596, 591, 601, 601, 601, 699, 121, 1619, + 699, 121, 122, 122, 122, 122, 122, 122, 122, 122, + + 122, 122, 122, 122, 122, 122, 122, 653, 122, 122, + 122, 122, 122, 151, 151, 151, 152, 152, 152, 153, + 153, 153, 1623, 154, 154, 154, 605, 605, 605, 151, + 608, 1626, 152, 1627, 1628, 153, 621, 122, 122, 154, + 122, 602, 122, 614, 614, 614, 608, 615, 122, 618, + 618, 618, 621, 1629, 1630, 122, 630, 1638, 122, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 1640, 131, 131, 131, 131, 131, + 155, 155, 155, 156, 156, 156, 157, 157, 157, 602, + 158, 158, 158, 630, 1641, 615, 155, 602, 637, 156, + + 1214, 1647, 157, 615, 131, 131, 158, 131, 630, 131, + 629, 629, 629, 1214, 637, 131, 634, 634, 634, 641, + 641, 641, 644, 644, 644, 1648, 131, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 1662, 132, 132, 132, 132, 132, 161, - 161, 161, 162, 162, 162, 165, 165, 165, 708, 166, - 166, 166, 1664, 641, 1665, 161, 1670, 668, 162, 708, - 641, 165, 708, 132, 132, 166, 132, 931, 132, 641, - 650, 650, 650, 668, 132, 654, 654, 654, 662, 662, - 662, 132, 1672, 931, 132, 141, 141, 141, 141, 141, + 132, 132, 1650, 132, 132, 132, 132, 132, 161, 161, + 161, 162, 162, 162, 165, 165, 165, 1651, 166, 166, + 166, 1652, 642, 647, 161, 1653, 1654, 162, 1655, 642, + 165, 658, 132, 132, 166, 132, 1656, 132, 642, 647, + 651, 651, 651, 132, 655, 655, 655, 658, 663, 663, + 663, 666, 666, 666, 132, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, - 1674, 141, 141, 141, 141, 141, 169, 169, 169, 170, - 170, 170, 173, 173, 173, 709, 174, 174, 174, 177, - 177, 177, 169, 1675, 1677, 170, 663, 674, 173, 709, - 141, 141, 174, 663, 674, 177, 665, 665, 665, 673, - 673, 673, 663, 674, 1678, 1679, 141, 142, 142, 142, + 1657, 141, 141, 141, 141, 141, 169, 169, 169, 170, + 170, 170, 173, 173, 173, 767, 174, 174, 174, 177, + 177, 177, 169, 669, 933, 170, 664, 675, 173, 767, + 141, 141, 174, 664, 675, 177, 674, 674, 674, 669, + 933, 1667, 664, 675, 1669, 1670, 141, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, - 142, 142, 1688, 142, 142, 142, 142, 142, 178, 178, - 178, 179, 179, 179, 180, 180, 180, 758, 181, 181, - 181, 182, 182, 182, 178, 1694, 1695, 179, 704, 1699, + 142, 142, 1675, 142, 142, 142, 142, 142, 178, 178, + 178, 179, 179, 179, 180, 180, 180, 769, 181, 181, + 181, 182, 182, 182, 178, 1677, 1679, 179, 705, 1680, - 180, 758, 142, 142, 181, 704, 1701, 182, 675, 675, - 675, 704, 684, 684, 684, 1194, 1194, 1194, 142, 145, + 180, 769, 142, 142, 181, 705, 1682, 182, 676, 676, + 676, 705, 685, 685, 685, 948, 948, 948, 142, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, - 145, 145, 145, 145, 1713, 145, 145, 145, 145, 145, - 183, 183, 183, 184, 184, 184, 187, 187, 187, 711, - 188, 188, 188, 189, 189, 189, 183, 1714, 1719, 184, - 711, 713, 187, 711, 145, 145, 188, 715, 713, 189, - 145, 684, 716, 717, 713, 145, 1722, 1723, 715, 716, - 717, 715, 1202, 1202, 1202, 716, 717, 145, 146, 146, + 145, 145, 145, 145, 1683, 145, 145, 145, 145, 145, + 183, 183, 183, 184, 184, 184, 187, 187, 187, 709, + 188, 188, 188, 189, 189, 189, 183, 1684, 1693, 184, + 709, 714, 187, 709, 145, 145, 188, 712, 714, 189, + 145, 685, 716, 1699, 714, 145, 1700, 1704, 712, 948, + 1706, 712, 1718, 716, 1719, 1724, 716, 145, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, - 146, 146, 146, 1724, 146, 146, 146, 146, 146, 190, - 190, 190, 191, 191, 191, 192, 192, 192, 766, 193, - 193, 193, 194, 194, 194, 190, 1726, 768, 191, 757, - 760, 192, 766, 146, 146, 193, 757, 760, 194, 146, - 767, 768, 757, 760, 146, 934, 934, 934, 1735, 934, - 1738, 767, 1741, 1742, 767, 1744, 146, 149, 149, 149, + 146, 146, 146, 1727, 146, 146, 146, 146, 146, 190, + 190, 190, 191, 191, 191, 192, 192, 192, 1728, 193, + 193, 193, 194, 194, 194, 190, 1729, 1731, 191, 717, + 718, 192, 1226, 146, 146, 193, 717, 718, 194, 146, + 758, 761, 717, 718, 146, 1226, 1740, 758, 761, 1197, + 1197, 1197, 1743, 758, 761, 1746, 146, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, @@ -3332,1190 +3341,1196 @@ static yyconst flex_int16_t yy_chk[12668] = 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 159, 159, 159, 159, 159, 159, 159, 159, 159, - 159, 159, 159, 159, 159, 159, 1745, 159, 159, 159, + 159, 159, 159, 159, 159, 159, 1747, 159, 159, 159, 159, 159, 197, 197, 197, 198, 198, 198, 199, 199, - 199, 1746, 200, 200, 200, 201, 201, 201, 197, 1066, - 1734, 198, 1277, 1747, 199, 1748, 159, 159, 200, 1066, - 159, 201, 946, 946, 946, 1277, 1066, 159, 1749, 1750, - 159, 968, 968, 968, 159, 1734, 159, 159, 160, 160, + 199, 768, 200, 200, 200, 201, 201, 201, 197, 1749, + 1739, 198, 768, 1750, 199, 768, 159, 159, 200, 1751, + 159, 201, 936, 936, 936, 1752, 936, 159, 1753, 1754, + 159, 970, 970, 970, 159, 1739, 159, 159, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 1752, 160, 160, 160, 160, 160, 202, - 202, 202, 203, 203, 203, 204, 204, 204, 1753, 207, - 207, 207, 208, 208, 208, 202, 1755, 1756, 203, 1758, - 1760, 204, 1761, 160, 160, 207, 946, 160, 208, 980, - 980, 980, 1763, 980, 160, 968, 980, 160, 1218, 1218, - 1218, 160, 1765, 160, 160, 163, 163, 163, 163, 163, + 160, 160, 160, 1755, 160, 160, 160, 160, 160, 202, + 202, 202, 203, 203, 203, 204, 204, 204, 1757, 207, + 207, 207, 208, 208, 208, 202, 1758, 1760, 203, 1761, + 1763, 204, 1069, 160, 160, 207, 1765, 160, 208, 982, + 982, 982, 1069, 982, 160, 970, 982, 160, 1766, 1069, + 1768, 160, 1770, 160, 160, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, - 1767, 163, 163, 163, 163, 163, 211, 211, 211, 212, - 212, 212, 213, 213, 213, 1768, 214, 214, 214, 725, - - 725, 725, 211, 1769, 1770, 212, 1771, 1773, 213, 1782, - 163, 163, 214, 163, 163, 163, 725, 1783, 988, 988, - 988, 163, 988, 1785, 163, 988, 1789, 1793, 163, 1795, - 1802, 163, 164, 164, 164, 164, 164, 164, 164, 164, - 164, 164, 164, 164, 164, 164, 164, 1803, 164, 164, + 1772, 163, 163, 163, 163, 163, 211, 211, 211, 212, + 212, 212, 213, 213, 213, 1773, 214, 214, 214, 726, + + 726, 726, 211, 1774, 1280, 212, 1775, 1776, 213, 1778, + 163, 163, 214, 163, 163, 163, 726, 1280, 990, 990, + 990, 163, 990, 1787, 163, 990, 1788, 1790, 163, 1794, + 1798, 163, 164, 164, 164, 164, 164, 164, 164, 164, + 164, 164, 164, 164, 164, 164, 164, 1800, 164, 164, 164, 164, 164, 215, 215, 215, 216, 216, 216, 217, - 217, 217, 1804, 218, 218, 218, 733, 733, 733, 215, - 1805, 1807, 216, 1811, 1812, 217, 1813, 164, 164, 218, - 164, 164, 164, 733, 1816, 1003, 1003, 1003, 164, 1003, - 1823, 164, 1003, 1824, 1830, 164, 1837, 1838, 164, 167, + 217, 217, 1807, 218, 218, 218, 734, 734, 734, 215, + 1808, 1809, 216, 1810, 1812, 217, 1816, 164, 164, 218, + 164, 164, 164, 734, 1817, 1005, 1005, 1005, 164, 1005, + 1818, 164, 1005, 1821, 1828, 164, 1832, 1839, 164, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, - 167, 167, 167, 167, 1847, 167, 167, 167, 167, 167, - 221, 221, 221, 222, 222, 222, 223, 223, 223, 1850, - 224, 224, 224, 749, 749, 749, 221, 1860, 1864, 222, - 1868, 1869, 223, 1873, 167, 167, 224, 1874, 1875, 167, - 749, 1274, 1274, 1274, 1876, 167, 168, 168, 168, 168, + 167, 167, 167, 167, 1840, 167, 167, 167, 167, 167, + 221, 221, 221, 222, 222, 222, 223, 223, 223, 1849, + 224, 224, 224, 750, 750, 750, 221, 1852, 1866, 222, + 1870, 1874, 223, 1875, 167, 167, 224, 1879, 1880, 167, + 750, 1205, 1205, 1205, 1881, 167, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, - 168, 1878, 168, 168, 168, 168, 168, 225, 225, 225, - 226, 226, 226, 227, 227, 227, 1879, 228, 228, 228, - 773, 773, 773, 225, 1887, 1891, 226, 1894, 1896, 227, + 168, 1882, 168, 168, 168, 168, 168, 225, 225, 225, + 226, 226, 226, 227, 227, 227, 1884, 228, 228, 228, + 774, 774, 774, 225, 1885, 1893, 226, 1897, 1900, 227, - 1898, 168, 168, 228, 1899, 1901, 168, 773, 1534, 1534, - 1534, 1902, 168, 171, 171, 171, 171, 171, 171, 171, - 171, 171, 171, 171, 171, 171, 171, 171, 1903, 171, + 1902, 168, 168, 228, 1904, 1905, 168, 774, 1221, 1221, + 1221, 1907, 168, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 171, 1908, 171, 171, 171, 171, 171, 231, 231, 231, 232, 232, 232, - 233, 233, 233, 1906, 234, 234, 234, 235, 235, 235, - 231, 1908, 1910, 232, 1915, 1921, 233, 1925, 171, 171, - 234, 1926, 171, 235, 1007, 1007, 1007, 1927, 1929, 171, - 1941, 1940, 171, 172, 172, 172, 172, 172, 172, 172, - 172, 172, 172, 172, 172, 172, 172, 172, 1940, 172, + 233, 233, 233, 1909, 234, 234, 234, 235, 235, 235, + 231, 1912, 1914, 232, 1916, 1921, 233, 1927, 171, 171, + 234, 1931, 171, 235, 1009, 1009, 1009, 1932, 1933, 171, + 1935, 1946, 171, 172, 172, 172, 172, 172, 172, 172, + 172, 172, 172, 172, 172, 172, 172, 172, 1946, 172, 172, 172, 172, 172, 236, 236, 236, 237, 237, 237, - 238, 238, 238, 1944, 241, 241, 241, 242, 242, 242, - 236, 1947, 1941, 237, 1948, 1942, 238, 1949, 172, 172, - 241, 1951, 172, 242, 1016, 1016, 1016, 1952, 1007, 172, - 1954, 1955, 172, 175, 175, 175, 175, 175, 175, 175, - 175, 175, 175, 175, 175, 175, 175, 175, 1942, 175, + 238, 238, 238, 1950, 241, 241, 241, 242, 242, 242, + 236, 1953, 1954, 237, 1955, 1948, 238, 1957, 172, 172, + 241, 1947, 172, 242, 1018, 1018, 1018, 1958, 1009, 172, + 1960, 1961, 172, 175, 175, 175, 175, 175, 175, 175, + 175, 175, 175, 175, 175, 175, 175, 175, 1948, 175, 175, 175, 175, 175, 245, 245, 245, 246, 246, 246, - 247, 247, 247, 1956, 248, 248, 248, 249, 249, 249, - 245, 1950, 1957, 246, 1959, 1960, 247, 1961, 175, 175, - 248, 1965, 175, 249, 1535, 1535, 1535, 1950, 1016, 175, - 1967, 1970, 175, 1537, 1537, 1537, 1541, 1541, 1541, 175, + 247, 247, 247, 1947, 248, 248, 248, 249, 249, 249, + 245, 1956, 1962, 246, 1963, 1965, 247, 1966, 175, 175, + 248, 1967, 175, 249, 1277, 1277, 1277, 1956, 1018, 175, + 1971, 1973, 175, 1538, 1538, 1538, 1539, 1539, 1539, 175, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, - 176, 176, 176, 176, 176, 1971, 176, 176, 176, 176, + 176, 176, 176, 176, 176, 1976, 176, 176, 176, 176, 176, 250, 250, 250, 251, 251, 251, 252, 252, 252, - 1535, 255, 255, 255, 256, 256, 256, 250, 1972, 1537, - 251, 1973, 1975, 252, 368, 176, 176, 255, 1977, 176, - 256, 1023, 1023, 1023, 368, 1023, 176, 1978, 1023, 176, - 1544, 1544, 1544, 1554, 1554, 1554, 176, 185, 185, 185, + 1977, 255, 255, 255, 256, 256, 256, 250, 1978, 1979, + 251, 1981, 1539, 252, 368, 176, 176, 255, 1983, 176, + 256, 1025, 1025, 1025, 368, 1025, 176, 1984, 1025, 176, + 1541, 1541, 1541, 1545, 1545, 1545, 176, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 368, 185, 185, 185, 185, 185, 259, 259, - 259, 260, 260, 260, 1980, 1982, 368, 781, 781, 781, + 259, 260, 260, 260, 1986, 1988, 368, 793, 793, 793, - 368, 944, 944, 944, 259, 1985, 1986, 260, 1988, 1989, - 302, 1990, 185, 185, 781, 798, 798, 798, 185, 944, - 302, 1992, 1031, 1031, 1031, 1998, 1031, 1999, 374, 1031, - 2001, 2004, 798, 185, 186, 186, 186, 186, 186, 186, + 368, 946, 946, 946, 259, 1991, 1541, 260, 1992, 1994, + 302, 1995, 185, 185, 793, 803, 803, 803, 185, 946, + 302, 1996, 1043, 1043, 1043, 1998, 1043, 2004, 374, 1043, + 2005, 2007, 803, 185, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 302, - 186, 186, 186, 186, 186, 302, 374, 811, 811, 811, - 2012, 2017, 302, 1590, 1590, 1590, 302, 812, 812, 812, - 1987, 2022, 374, 2023, 811, 818, 818, 818, 1987, 186, - 186, 820, 820, 820, 812, 186, 1047, 1047, 1047, 1991, - 1047, 2030, 818, 1047, 1591, 1591, 1591, 1991, 820, 2031, + 186, 186, 186, 186, 186, 302, 374, 813, 813, 813, + 2010, 2018, 302, 1548, 1548, 1548, 302, 814, 814, 814, + 1993, 2019, 374, 2024, 813, 820, 820, 820, 1993, 186, + 186, 822, 822, 822, 814, 186, 1054, 1054, 1054, 1997, + 1054, 2025, 820, 1054, 1558, 1558, 1558, 1997, 822, 2032, 186, 195, 195, 195, 195, 195, 195, 195, 195, 195, - 195, 195, 195, 195, 195, 195, 2032, 195, 195, 195, - 195, 195, 835, 835, 835, 836, 836, 836, 848, 848, - 848, 856, 856, 856, 861, 861, 861, 2000, 2005, 835, - 1591, 2036, 836, 2006, 2038, 848, 195, 195, 856, 2044, - 2045, 861, 195, 2000, 2005, 195, 1060, 1060, 1060, 2006, - 1060, 2046, 2053, 1060, 1592, 1592, 1592, 195, 196, 196, + 195, 195, 195, 195, 195, 195, 2033, 195, 195, 195, + 195, 195, 837, 837, 837, 838, 838, 838, 850, 850, + 850, 858, 858, 858, 863, 863, 863, 2006, 2011, 837, + 2034, 2038, 838, 2012, 2046, 850, 195, 195, 858, 2052, + 2053, 863, 195, 2006, 2011, 195, 1063, 1063, 1063, 2012, + 1063, 2054, 2061, 1063, 1594, 1594, 1594, 195, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, - 196, 196, 196, 2054, 196, 196, 196, 196, 196, 867, - 867, 867, 889, 889, 889, 917, 917, 917, 921, 921, + 196, 196, 196, 2062, 196, 196, 196, 196, 196, 869, + 869, 869, 891, 891, 891, 919, 919, 919, 923, 923, - 921, 926, 926, 926, 2055, 2058, 867, 2059, 2070, 889, - 1592, 2076, 917, 196, 196, 921, 2080, 2083, 926, 196, - 2085, 2088, 196, 1062, 1062, 1062, 2090, 1062, 2092, 2093, - 1062, 1593, 1593, 1593, 196, 205, 205, 205, 205, 205, + 923, 928, 928, 928, 2063, 2066, 869, 2067, 2078, 891, + 2084, 2088, 919, 196, 196, 923, 2091, 2093, 928, 196, + 2096, 2098, 196, 1065, 1065, 1065, 2100, 1065, 2101, 2102, + 1065, 1597, 1597, 1597, 196, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, - 2094, 205, 205, 205, 205, 205, 945, 945, 945, 976, - 976, 976, 2097, 2099, 977, 977, 977, 979, 979, 979, - 983, 983, 983, 1797, 945, 2104, 2106, 976, 2114, 1797, - 205, 205, 977, 1797, 979, 2115, 205, 1797, 983, 2116, - 2117, 205, 206, 206, 206, 206, 206, 206, 206, 206, - - 206, 206, 206, 206, 206, 206, 206, 2119, 206, 206, - 206, 206, 206, 2135, 945, 984, 984, 984, 987, 987, - 987, 995, 995, 995, 977, 989, 989, 989, 991, 991, - 991, 2137, 2142, 984, 2134, 987, 2143, 206, 206, 995, - 2134, 2136, 989, 206, 2135, 991, 2144, 2145, 206, 209, + 2105, 205, 205, 205, 205, 205, 947, 947, 947, 978, + 978, 978, 2107, 2112, 979, 979, 979, 981, 981, 981, + 985, 985, 985, 1802, 947, 2114, 2122, 978, 2123, 1802, + 205, 205, 979, 1802, 981, 2124, 205, 1802, 985, 2125, + 2127, 205, 206, 206, 206, 206, 206, 206, 206, 206, + + 206, 206, 206, 206, 206, 206, 206, 2142, 206, 206, + 206, 206, 206, 2142, 947, 986, 986, 986, 989, 989, + 989, 997, 997, 997, 979, 991, 991, 991, 993, 993, + 993, 2145, 2150, 986, 2151, 989, 2152, 206, 206, 997, + 2153, 2144, 991, 206, 2157, 993, 2159, 2160, 206, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, - 209, 209, 209, 209, 2149, 209, 209, 209, 209, 209, - 1000, 1000, 1000, 1001, 1001, 1001, 1002, 1002, 1002, 984, - 1005, 1005, 1005, 2151, 996, 996, 996, 2136, 1000, 2152, - 2153, 1001, 2154, 1002, 209, 209, 2159, 2166, 1005, 2168, + 209, 209, 209, 209, 2161, 209, 209, 209, 209, 209, + 1002, 1002, 1002, 1003, 1003, 1003, 1004, 1004, 1004, 986, + 1007, 1007, 1007, 2143, 998, 998, 998, 2144, 1002, 2162, + 2167, 1003, 2174, 1004, 209, 209, 2176, 2177, 1007, 2180, - 209, 2169, 996, 1068, 1068, 1068, 2172, 1068, 2175, 2179, - 1068, 1690, 1690, 1690, 2180, 209, 210, 210, 210, 210, + 209, 2183, 998, 1071, 1071, 1071, 2187, 1071, 2188, 2189, + 1071, 1595, 1595, 1595, 2143, 209, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, - 210, 996, 210, 210, 210, 210, 210, 1001, 1006, 1006, - 1006, 1022, 1022, 1022, 2181, 1026, 1026, 1026, 1027, 1027, - 1027, 1030, 1030, 1030, 2182, 2183, 1006, 1690, 1022, 2184, - 2185, 210, 210, 1026, 2186, 2187, 1027, 210, 1030, 1071, - 1071, 1071, 2188, 1071, 2193, 1006, 1071, 1751, 1751, 1751, - 2194, 2195, 210, 219, 219, 219, 219, 219, 219, 219, - 219, 219, 219, 219, 219, 219, 219, 219, 2196, 219, - - 219, 219, 219, 219, 1033, 1033, 1033, 1034, 1034, 1034, - 1046, 1046, 1046, 2201, 1027, 1037, 1037, 1037, 1038, 1038, - 1038, 2203, 1033, 2206, 2211, 1034, 2218, 1046, 219, 219, - 1041, 1041, 1041, 1037, 219, 2219, 1038, 219, 1086, 1086, - 1086, 2225, 1086, 2226, 2228, 1086, 2232, 2233, 1041, 219, + 210, 998, 210, 210, 210, 210, 210, 1003, 1008, 1008, + 1008, 1024, 1024, 1024, 2190, 1028, 1028, 1028, 1029, 1029, + 1029, 1033, 1033, 1033, 1803, 2191, 1008, 1595, 1024, 2192, + 1803, 210, 210, 1028, 1803, 2193, 1029, 210, 1803, 1033, + 1074, 1074, 1074, 2194, 1074, 1008, 2195, 1074, 1596, 1596, + 1596, 2196, 210, 219, 219, 219, 219, 219, 219, 219, + 219, 219, 219, 219, 219, 219, 219, 219, 2201, 219, + + 219, 219, 219, 219, 1034, 1034, 1034, 1037, 1037, 1037, + 1042, 1042, 1042, 2202, 1029, 1038, 1038, 1038, 1047, 1047, + 1047, 2203, 1034, 2204, 1596, 1037, 2209, 1042, 219, 219, + 1048, 1048, 1048, 1038, 219, 2211, 1047, 219, 1089, 1089, + 1089, 2212, 1089, 2219, 2220, 1089, 2226, 2227, 1048, 219, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, - 220, 220, 220, 220, 220, 2234, 220, 220, 220, 220, - 220, 2240, 2241, 1034, 1042, 1042, 1042, 2242, 2246, 1038, - 1051, 1051, 1051, 2223, 1052, 1052, 1052, 1056, 1056, 1056, - 2258, 2223, 1042, 2262, 2263, 220, 220, 2264, 1051, 2266, + 220, 220, 220, 220, 220, 1034, 220, 220, 220, 220, + 220, 1053, 1053, 1053, 1056, 1056, 1056, 1062, 1062, 1062, + 1038, 1057, 1057, 1057, 1059, 1059, 1059, 2233, 1053, 2224, + 2225, 1048, 1056, 2239, 1062, 220, 220, 2224, 2225, 1057, - 2270, 220, 1052, 2224, 220, 1056, 1088, 1088, 1088, 2273, - 1088, 2224, 2274, 1088, 2277, 2278, 220, 229, 229, 229, + 2243, 220, 1059, 2244, 220, 1091, 1091, 1091, 2245, 1091, + 2251, 2252, 1091, 1695, 1695, 1695, 220, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, - 229, 229, 2281, 229, 229, 229, 229, 229, 2288, 1042, - 1059, 1059, 1059, 2290, 2275, 1052, 1057, 1057, 1057, 1061, - 1061, 1061, 2275, 1063, 1063, 1063, 2305, 1059, 1064, 1064, - 1064, 2320, 229, 229, 1057, 2276, 1061, 1754, 1754, 1754, - 229, 1063, 229, 2276, 2310, 229, 1064, 2321, 2324, 229, - 1757, 1757, 1757, 229, 230, 230, 230, 230, 230, 230, - 230, 230, 230, 230, 230, 230, 230, 230, 230, 2327, - - 230, 230, 230, 230, 230, 1067, 1067, 1067, 1057, 1070, - 1070, 1070, 2332, 2333, 1072, 1072, 1072, 2310, 2338, 1064, - 2340, 2352, 1067, 1083, 1083, 1083, 1070, 2353, 2354, 230, - 230, 1072, 1085, 1085, 1085, 2355, 2356, 230, 2357, 230, - 2311, 1083, 230, 1759, 1759, 1759, 230, 2358, 2359, 1085, + 229, 229, 2253, 229, 229, 229, 229, 229, 1064, 1064, + 1064, 2257, 2269, 1060, 1060, 1060, 2273, 1057, 1066, 1066, + 1066, 1067, 1067, 1067, 2274, 1064, 1070, 1070, 1070, 1695, + 2275, 1060, 229, 229, 2277, 2281, 1066, 2284, 2285, 1067, + 229, 2288, 229, 1070, 2289, 229, 1756, 1756, 1756, 229, + 1759, 1759, 1759, 229, 230, 230, 230, 230, 230, 230, + 230, 230, 230, 230, 230, 230, 230, 230, 230, 2292, + + 230, 230, 230, 230, 230, 1060, 1073, 1073, 1073, 1075, + 1075, 1075, 1067, 1086, 1086, 1086, 1087, 1087, 1087, 1088, + 1088, 1088, 2299, 1073, 2286, 2287, 1075, 2301, 2316, 230, + 230, 1086, 2286, 2287, 1087, 2331, 1088, 230, 2332, 230, + 2335, 2321, 230, 1762, 1762, 1762, 230, 1764, 1764, 1764, 230, 239, 239, 239, 239, 239, 239, 239, 239, 239, - 239, 239, 239, 239, 239, 239, 2360, 239, 239, 239, - 239, 239, 1087, 1087, 1087, 1089, 1089, 1089, 1762, 1762, - 1762, 1772, 1772, 1772, 1084, 1084, 1084, 2311, 2361, 1087, - 2368, 2369, 1089, 1090, 1090, 1090, 239, 239, 1091, 1091, + 239, 239, 239, 239, 239, 239, 2338, 239, 239, 239, + 239, 239, 2322, 2343, 1087, 1090, 1090, 1090, 1092, 1092, + 1092, 1767, 1767, 1767, 2321, 1093, 1093, 1093, 1095, 1095, + 1095, 2344, 1090, 2349, 2351, 1092, 239, 239, 1094, 1094, - 1091, 2370, 1084, 2372, 1100, 1100, 1100, 2376, 1100, 2378, - 1090, 1100, 1108, 1108, 1108, 1091, 1108, 2382, 2386, 1108, + 1094, 2363, 1093, 2364, 2365, 1095, 1103, 1103, 1103, 2366, + 1103, 2367, 2368, 1103, 2369, 1094, 1769, 1769, 1769, 2322, 239, 240, 240, 240, 240, 240, 240, 240, 240, 240, - 240, 240, 240, 240, 240, 240, 2387, 240, 240, 240, - 240, 240, 1084, 2388, 1090, 1094, 1094, 1094, 2389, 2390, - 1091, 1092, 1092, 1092, 2391, 1099, 1099, 1099, 2392, 2395, - 1093, 1093, 1093, 1094, 2396, 2397, 240, 240, 1092, 1095, - 1095, 1095, 1099, 2403, 1113, 1113, 1113, 1093, 1113, 2404, - 2405, 1113, 1119, 1119, 1119, 2413, 1119, 1095, 2414, 1119, + 240, 240, 240, 240, 240, 240, 1093, 240, 240, 240, + 240, 240, 2370, 1095, 1097, 1097, 1097, 1102, 1102, 1102, + 1094, 1777, 1777, 1777, 1096, 1096, 1096, 1104, 1104, 1104, + 2371, 2372, 1097, 2379, 1102, 2380, 240, 240, 1098, 1098, + 1098, 1096, 2381, 2383, 1104, 1111, 1111, 1111, 2387, 1111, + 1769, 2389, 1111, 1771, 1771, 1771, 1098, 1811, 1811, 1811, 240, 243, 243, 243, 243, 243, 243, 243, 243, 243, - 243, 243, 243, 243, 243, 243, 1092, 243, 243, 243, - 243, 243, 1093, 1101, 1101, 1101, 1095, 1104, 1104, 1104, - 1105, 1105, 1105, 1107, 1107, 1107, 1109, 1109, 1109, 2398, - 1101, 1764, 1764, 1764, 2415, 1104, 243, 243, 1105, 2398, - 1107, 1766, 1766, 1766, 1109, 2416, 2430, 243, 244, 244, + 243, 243, 243, 243, 243, 243, 1096, 243, 243, 243, + 243, 243, 1107, 1107, 1107, 1098, 1110, 1110, 1110, 2392, + 1108, 1108, 1108, 1112, 1112, 1112, 1113, 1113, 1113, 1771, + 1107, 2393, 2394, 1110, 2395, 2396, 243, 243, 1108, 2397, + 2398, 1112, 2403, 2406, 1113, 2407, 2408, 243, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, - 244, 244, 244, 2431, 244, 244, 244, 244, 244, 2432, - 2433, 1105, 1110, 1110, 1110, 1112, 1112, 1112, 1115, 1115, - 1115, 1116, 1116, 1116, 1118, 1118, 1118, 1766, 2435, 2437, - 1110, 2461, 1112, 244, 244, 1764, 1115, 2456, 2462, 1116, + 244, 244, 244, 2414, 244, 244, 244, 244, 244, 2415, + 2409, 1108, 1115, 1115, 1115, 1116, 1116, 1116, 2416, 1116, + 2409, 2424, 1116, 1118, 1118, 1118, 2425, 1113, 2426, 1115, + 1813, 1813, 1813, 244, 244, 1122, 1122, 1122, 2427, 1122, - 2455, 1118, 2465, 2468, 244, 253, 253, 253, 253, 253, + 2441, 1118, 1122, 2442, 244, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, - 2469, 253, 253, 253, 253, 253, 2470, 2473, 1116, 1123, - 1123, 1123, 2455, 1110, 2456, 1124, 1124, 1124, 1125, 1125, - 1125, 1126, 1126, 1126, 1128, 1128, 1128, 1123, 2476, 2477, - 253, 253, 2478, 1124, 2479, 1125, 2480, 2481, 1126, 2482, - 2483, 253, 1128, 1139, 1139, 1139, 2484, 1139, 2485, 2486, - 1139, 1774, 1774, 1774, 253, 254, 254, 254, 254, 254, + 2443, 253, 253, 253, 253, 253, 1119, 1119, 1119, 1121, + 1121, 1121, 2444, 2446, 1126, 1126, 1126, 1128, 1128, 1128, + 2448, 1127, 1127, 1127, 1119, 2472, 1121, 1129, 1129, 1129, + 253, 253, 1126, 2473, 1128, 1130, 1130, 1130, 2466, 1127, + 2476, 253, 2479, 2480, 1129, 2481, 2467, 1779, 1779, 1779, + 2484, 2487, 1130, 1119, 253, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, - 1124, 254, 254, 254, 254, 254, 1131, 1131, 1131, 2488, + 2466, 254, 254, 254, 254, 254, 1127, 1131, 1131, 1131, - 2489, 1127, 1127, 1127, 2491, 1129, 1129, 1129, 2492, 2493, - 1133, 1133, 1133, 1131, 1135, 1135, 1135, 1774, 1127, 2494, - 254, 254, 2496, 1129, 1132, 1132, 1132, 1133, 1806, 1806, - 1806, 254, 1135, 1163, 1163, 1163, 2497, 1163, 2499, 2500, - 1163, 1132, 2502, 2503, 254, 257, 257, 257, 257, 257, + 1134, 1134, 1134, 2467, 2488, 1132, 1132, 1132, 2489, 2490, + 1135, 1135, 1135, 1779, 1130, 1131, 2491, 1134, 2492, 2493, + 254, 254, 2494, 1132, 1136, 1136, 1136, 1135, 1142, 1142, + 1142, 254, 1142, 2495, 2496, 1142, 1166, 1166, 1166, 2497, + 1166, 1136, 2499, 1166, 254, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, - 1127, 257, 257, 257, 257, 257, 1129, 1136, 1136, 1136, - 2505, 1134, 1134, 1134, 1132, 1138, 1138, 1138, 1140, 1140, - 1140, 1141, 1141, 1141, 2506, 1136, 2512, 2513, 1134, 1132, - 257, 257, 1138, 1142, 1142, 1142, 1140, 2514, 2516, 1141, + 1135, 257, 257, 257, 257, 257, 1132, 1138, 1138, 1138, + 2500, 1137, 1137, 1137, 2502, 1135, 1139, 1139, 1139, 1141, + 1141, 1141, 1143, 1143, 1143, 1138, 2501, 2503, 1137, 2504, + 257, 257, 2505, 2507, 1139, 2501, 1141, 1814, 1814, 1814, - 2521, 257, 2490, 2522, 1136, 1167, 1167, 1167, 2523, 1167, - 1142, 2490, 1167, 2524, 257, 258, 258, 258, 258, 258, + 1143, 257, 1170, 1170, 1170, 2508, 1170, 2510, 2511, 1170, + 1851, 1851, 1851, 1139, 257, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, - 1134, 258, 258, 258, 258, 258, 1141, 1143, 1143, 1143, - 1144, 1144, 1144, 2525, 1145, 1145, 1145, 1146, 1146, 1146, - 1148, 1148, 1148, 2528, 1143, 1147, 1147, 1147, 1144, 2530, - 258, 258, 1145, 2538, 1146, 2539, 2541, 1148, 1149, 1149, - 1149, 258, 1147, 1156, 1156, 1156, 1160, 1160, 1160, 1150, - 1150, 1150, 2532, 2547, 258, 300, 1149, 2495, 1157, 1157, - 1157, 1156, 300, 2548, 1160, 2532, 2495, 1150, 1161, 1161, - - 1161, 300, 300, 2549, 2550, 1147, 1157, 1162, 1162, 1162, - 1164, 1164, 1164, 2552, 2555, 1145, 1161, 1166, 1166, 1166, - 1147, 1165, 1165, 1165, 1162, 1169, 1169, 1169, 1164, 300, - 300, 300, 2533, 2557, 1166, 300, 300, 300, 2582, 1165, - 300, 300, 2583, 1169, 300, 2533, 300, 300, 300, 365, - 1150, 2577, 1157, 1170, 1170, 1170, 365, 1171, 1171, 1171, - 2578, 2586, 1161, 2587, 2579, 365, 365, 1798, 1172, 1172, - 1172, 1170, 1172, 1798, 1171, 1172, 2588, 1798, 1174, 1174, - 1174, 1798, 1165, 2593, 1175, 1175, 1175, 2594, 1190, 1190, - 1190, 2577, 2595, 365, 365, 365, 1174, 2578, 2596, 365, - - 365, 365, 1175, 2597, 365, 365, 1190, 2579, 365, 2598, - 365, 365, 365, 1191, 1191, 1191, 2599, 1170, 1193, 1193, - 1193, 1225, 1225, 1225, 1226, 1226, 1226, 2600, 1227, 1227, - 1227, 1191, 1229, 1229, 1229, 2601, 1193, 2602, 1225, 1230, - 1230, 1230, 1226, 2603, 2605, 1175, 1227, 1231, 1231, 1231, - 1229, 1231, 2606, 2607, 1231, 2608, 1230, 1234, 1234, 1234, - 1236, 1236, 1236, 2609, 2610, 1193, 1237, 1237, 1237, 1239, - 1239, 1239, 2611, 2591, 1234, 1241, 1241, 1241, 1236, 1241, - 2612, 1229, 1241, 2591, 1237, 2613, 2591, 1239, 1244, 1244, - 1244, 1245, 1245, 1245, 2614, 1245, 2615, 2616, 1245, 2617, - - 1246, 1246, 1246, 2618, 2620, 1244, 1247, 1247, 1247, 1250, - 1250, 1250, 1252, 1252, 1252, 2592, 1239, 1246, 1234, 2621, - 1248, 1248, 1248, 1247, 1248, 2592, 1250, 1248, 2592, 2624, - 1252, 1253, 1253, 1253, 1255, 1255, 1255, 1257, 1257, 1257, - 1259, 1259, 1259, 1260, 1260, 1260, 1262, 1262, 1262, 1253, - 2630, 2637, 1255, 2638, 1257, 1263, 1263, 1263, 1259, 1263, - 2639, 1260, 1263, 2641, 1262, 1267, 1267, 1267, 1268, 1268, - 1268, 1270, 1270, 1270, 1285, 1285, 1285, 2645, 1285, 2648, - 2649, 1285, 2650, 1267, 2651, 2652, 1268, 2653, 2666, 1270, - 1289, 1289, 1289, 1262, 1255, 1290, 1290, 1290, 1291, 1291, - - 1291, 1293, 1293, 1293, 1296, 1296, 1296, 1289, 1296, 2667, - 2668, 1296, 2695, 1290, 2692, 2698, 1291, 2699, 2693, 1293, - 1300, 1300, 1300, 1301, 1301, 1301, 1303, 1303, 1303, 1304, - 1304, 1304, 1305, 1305, 1305, 1306, 1306, 1306, 1300, 2700, - 2703, 1301, 2704, 2692, 1303, 2706, 1304, 2707, 2709, 1305, - 1307, 1307, 1307, 1306, 1309, 1309, 1309, 1310, 1310, 1310, - 2693, 2694, 1293, 1311, 1311, 1311, 2710, 2711, 1307, 1808, - 1808, 1808, 1309, 2712, 1310, 1312, 1312, 1312, 2713, 1305, - 1311, 1313, 1313, 1313, 1315, 1315, 1315, 1303, 1318, 1318, - 1318, 1311, 2715, 1312, 1319, 1319, 1319, 2716, 1319, 1313, - - 2717, 1319, 1315, 2694, 2718, 1318, 1325, 1325, 1325, 1326, - 1326, 1326, 1328, 1328, 1328, 1331, 1331, 1331, 1332, 1332, - 1332, 1309, 2721, 2722, 1325, 2723, 2724, 1326, 2725, 2726, - 1328, 2705, 1331, 1333, 1333, 1333, 1332, 1335, 1335, 1335, - 1336, 1336, 1336, 2708, 2705, 1337, 1337, 1337, 2727, 1337, - 1315, 1333, 1337, 2728, 2729, 1335, 2708, 1336, 1340, 1340, - 1340, 2730, 1340, 2731, 2732, 1340, 1343, 1343, 1343, 1344, - 1344, 1344, 1346, 1346, 1346, 2733, 2735, 1328, 1351, 1351, - 1351, 2748, 1351, 2749, 1343, 1351, 2754, 1344, 2758, 2759, - 1346, 1354, 1354, 1354, 1355, 1355, 1355, 2760, 1355, 2761, - - 2762, 1355, 2763, 2771, 1335, 1358, 1358, 1358, 1354, 1359, - 1359, 1359, 2773, 1359, 2781, 2782, 1359, 1370, 1370, 1370, - 2783, 2784, 1358, 1371, 1371, 1371, 1373, 1373, 1373, 1374, - 1374, 1374, 2785, 1374, 2786, 1370, 1374, 1346, 1377, 1377, - 1377, 1371, 1377, 2796, 1373, 1377, 1380, 1380, 1380, 1381, - 1381, 1381, 2799, 1381, 2797, 2802, 1381, 1386, 1386, 1386, - 1387, 1387, 1387, 1380, 1389, 1389, 1389, 1394, 1394, 1394, - 2803, 1394, 2807, 2808, 1394, 1386, 2676, 2809, 1387, 1397, - 1397, 1397, 1389, 1398, 1398, 1398, 2676, 1398, 2810, 2797, - 1398, 2796, 2676, 1373, 2811, 2812, 1397, 1401, 1401, 1401, - - 1402, 1402, 1402, 1404, 1404, 1404, 1406, 1406, 1406, 2813, - 1406, 2814, 1389, 1406, 2816, 1401, 2817, 2818, 1402, 2819, - 2820, 1404, 1409, 1409, 1409, 1410, 1410, 1410, 1412, 1412, - 1412, 1414, 1414, 1414, 2821, 1414, 2822, 2823, 1414, 2825, - 1409, 2826, 2827, 1410, 2828, 2790, 1412, 1418, 1418, 1418, - 1419, 1419, 1419, 2829, 1404, 1421, 1421, 1421, 2790, 1423, - 1423, 1423, 2830, 1423, 2791, 1418, 1423, 2831, 1419, 1429, - 1429, 1429, 2832, 1421, 1430, 1430, 1430, 2791, 1432, 1432, - 1432, 1433, 1433, 1433, 1434, 1434, 1434, 1429, 1434, 2833, - 2834, 1434, 1430, 2835, 2836, 1412, 1432, 2837, 1433, 1435, - - 1435, 1435, 2847, 2851, 1421, 1436, 1436, 1436, 2852, 1436, - 2860, 2861, 1436, 1438, 1438, 1438, 1435, 1439, 1439, 1439, - 2862, 1441, 1441, 1441, 1443, 1443, 1443, 2863, 1447, 1447, - 1447, 1438, 1809, 1809, 1809, 1439, 2864, 2677, 1432, 1441, - 2865, 1443, 1444, 1444, 1444, 1447, 1444, 2677, 2866, 1444, - 1448, 1448, 1448, 2677, 1448, 2873, 2876, 1448, 1450, 1450, - 1450, 1451, 1451, 1451, 1453, 1453, 1453, 1455, 1455, 1455, - 2878, 1455, 2883, 2884, 1455, 2885, 1450, 2879, 2886, 1451, - 2878, 2887, 1453, 1458, 1458, 1458, 2888, 2879, 1441, 1459, - 1459, 1459, 1461, 1461, 1461, 1462, 1462, 1462, 1463, 1463, - - 1463, 1458, 1463, 2891, 2892, 1463, 2893, 1459, 2894, 2881, - 1461, 2882, 1462, 1464, 1464, 1464, 1465, 1465, 1465, 2881, - 1465, 2882, 2905, 1465, 1466, 1466, 1466, 2906, 1453, 2907, - 1464, 1467, 1467, 1467, 2908, 1469, 1469, 1469, 1470, 1470, - 1470, 2909, 1466, 1471, 1471, 1471, 2910, 1471, 2911, 1467, - 1471, 2912, 1461, 1469, 2915, 1470, 1474, 1474, 1474, 1475, - 1475, 1475, 2897, 1475, 2916, 2918, 1475, 1476, 1476, 1476, - 1477, 1477, 1477, 1474, 1479, 1479, 1479, 1481, 1481, 1481, - 1485, 1485, 1485, 2919, 2920, 1476, 2922, 2924, 1477, 1486, - 1486, 1486, 1479, 2925, 1481, 2926, 2897, 1469, 1485, 1488, - - 1488, 1488, 1491, 1491, 1491, 2929, 2930, 1486, 1492, 1492, - 1492, 1494, 1494, 1494, 1495, 1495, 1495, 1488, 1495, 2931, - 1491, 1495, 1498, 1498, 1498, 2932, 1492, 2935, 2948, 1494, - 1499, 1499, 1499, 1501, 1501, 1501, 1479, 1502, 1502, 1502, - 1498, 1502, 2949, 2950, 1502, 1506, 1506, 1506, 1499, 2958, - 2959, 1501, 1507, 1507, 1507, 1509, 1509, 1509, 2960, 2961, - 1488, 2962, 2963, 1506, 1494, 1510, 1510, 1510, 2969, 1510, - 1507, 2970, 1510, 1509, 1514, 1514, 1514, 1515, 1515, 1515, - 1517, 1517, 1517, 1519, 1519, 1519, 1526, 1526, 1526, 1557, - 1557, 1557, 1514, 1501, 2971, 1515, 2972, 2973, 1517, 2974, - - 2975, 1519, 1519, 2976, 1526, 2977, 1557, 1558, 1558, 1558, - 2978, 1558, 2980, 2981, 1558, 2986, 1509, 1559, 1559, 1559, - 1560, 1560, 1560, 2987, 1561, 1561, 1561, 2988, 1561, 2989, - 1517, 1561, 1564, 1564, 1564, 1559, 2990, 1560, 1566, 1566, - 1566, 2999, 1566, 3000, 3001, 1566, 1569, 1569, 1569, 3002, - 1564, 3003, 1526, 1570, 1570, 1570, 3004, 1570, 3005, 3006, - 1570, 3010, 3011, 1569, 1571, 1571, 1571, 3012, 1571, 3013, - 3014, 1571, 1575, 1575, 1575, 1559, 1576, 1576, 1576, 2990, - 1576, 1564, 3015, 1576, 1578, 1578, 1578, 3017, 3018, 1575, - 1580, 1580, 1580, 1581, 1581, 1581, 3020, 1581, 3021, 3022, - - 1581, 3024, 1578, 1582, 1582, 1582, 3028, 1580, 1583, 1583, - 1583, 1585, 1585, 1585, 1601, 1601, 1601, 1849, 1849, 1849, - 1582, 1602, 1602, 1602, 3029, 3030, 1583, 3035, 3037, 1585, - 3038, 1601, 3043, 3044, 1578, 1603, 1603, 1603, 1602, 1603, - 3045, 3046, 1603, 1604, 1604, 1604, 1608, 1608, 1608, 1609, - 1609, 1609, 1610, 1610, 1610, 3047, 1610, 1583, 3048, 1610, - 3049, 1604, 3050, 3051, 1608, 3052, 1609, 1612, 1612, 1612, - 1613, 1613, 1613, 1614, 1614, 1614, 3053, 1614, 3054, 3056, - 1614, 1616, 1616, 1616, 3057, 1612, 3058, 1613, 1619, 1619, - 1619, 1620, 1620, 1620, 3059, 1620, 3066, 3063, 1620, 1616, - - 1621, 1621, 1621, 3060, 3069, 1619, 3070, 1604, 3063, 3073, - 1608, 1623, 1623, 1623, 1624, 1624, 1624, 1621, 1627, 1627, - 1627, 3075, 1628, 1628, 1628, 3076, 1628, 1612, 1623, 1628, - 3078, 3079, 1624, 3083, 3062, 1627, 1629, 1629, 1629, 1630, - 1630, 1630, 1616, 1631, 1631, 1631, 3084, 1631, 3062, 3060, - 1631, 1632, 1632, 1632, 1629, 3086, 1630, 1623, 1634, 1634, - 1634, 1637, 1637, 1637, 1638, 1638, 1638, 3087, 1638, 1632, - 3088, 1638, 1639, 1639, 1639, 1634, 1639, 3082, 1637, 1639, - 1624, 1644, 1644, 1644, 1653, 1653, 1653, 1654, 1654, 1654, - 3085, 1654, 3089, 3090, 1654, 1657, 1657, 1657, 1644, 1658, - - 1658, 1658, 1653, 1659, 1659, 1659, 1660, 1660, 1660, 1661, - 1661, 1661, 1657, 1663, 1663, 1663, 1658, 1632, 3098, 3082, - 1659, 3092, 3106, 1660, 1666, 1666, 1666, 1661, 1666, 3085, - 1663, 1666, 3108, 3092, 1669, 1669, 1669, 1671, 1671, 1671, - 1673, 1673, 1673, 1676, 1676, 1676, 1680, 1680, 1680, 1653, - 1659, 1669, 1681, 1681, 1681, 1671, 3110, 3112, 1673, 3120, - 3122, 1676, 3093, 1680, 1661, 3103, 1689, 1689, 1689, 1658, - 1681, 1682, 1682, 1682, 3093, 1682, 1660, 3103, 1682, 1685, - 1685, 1685, 3126, 1685, 1689, 3128, 1685, 1691, 1691, 1691, - 3123, 1691, 1680, 3130, 1691, 1696, 1696, 1696, 3131, 1696, - - 1676, 1671, 1696, 1700, 1700, 1700, 1673, 3104, 3132, 1681, - 1702, 1702, 1702, 1703, 1703, 1703, 3124, 1703, 3133, 3104, - 1703, 1700, 1706, 1706, 1706, 3139, 1706, 3143, 1702, 1706, - 3124, 3123, 1689, 1709, 1709, 1709, 1710, 1710, 1710, 3127, - 1710, 3125, 3125, 1710, 3140, 1715, 1715, 1715, 3150, 1715, - 3127, 1709, 1715, 1718, 1718, 1718, 1720, 1720, 1720, 1721, - 1721, 1721, 3140, 1721, 1700, 3149, 1721, 1702, 1725, 1725, - 1725, 1718, 3152, 1720, 1727, 1727, 1727, 1728, 1728, 1728, - 1709, 1729, 1729, 1729, 3149, 3158, 1725, 1730, 1730, 1730, - 3151, 1727, 1731, 1731, 1731, 1728, 1732, 1732, 1732, 1729, - - 1718, 1733, 1733, 1733, 1730, 1736, 1736, 1736, 3160, 3151, - 1731, 3144, 3157, 1732, 1743, 1743, 1743, 1725, 3159, 1733, - 1775, 1775, 1775, 1736, 1775, 3165, 3144, 1775, 1778, 1778, - 1778, 3157, 1743, 1729, 1779, 1779, 1779, 3159, 1779, 3166, - 3168, 1779, 2364, 2364, 1728, 2364, 1778, 1784, 1784, 1784, - 3169, 3170, 1733, 2364, 1731, 3172, 1736, 1786, 1786, 1786, - 2364, 1786, 3173, 3174, 1786, 1784, 1743, 1790, 1790, 1790, - 3175, 1790, 3176, 1736, 1790, 1794, 1794, 1794, 1796, 1796, - 1796, 3178, 1796, 3179, 3181, 1796, 1799, 1799, 1799, 3188, - 1800, 1800, 1800, 1794, 1800, 1778, 3189, 1800, 1784, 1801, - - 1801, 1801, 3190, 1799, 1810, 1810, 1810, 1814, 1814, 1814, - 1815, 1815, 1815, 1817, 1817, 1817, 3191, 1801, 1818, 1818, - 1818, 3192, 1818, 3193, 3196, 1818, 3197, 1819, 1819, 1819, - 1817, 1819, 3198, 3199, 1819, 3200, 1794, 1822, 1822, 1822, - 1825, 1825, 1825, 1826, 1826, 1826, 3201, 1827, 1827, 1827, - 1801, 1827, 3202, 3203, 1827, 1822, 3205, 1825, 1831, 1831, - 1831, 1826, 1832, 1832, 1832, 3207, 1832, 3209, 1810, 1832, - 3210, 1814, 3211, 3212, 1815, 3213, 1831, 1835, 1835, 1835, - 1836, 1836, 1836, 3223, 1822, 1839, 1839, 1839, 3224, 1839, - 1826, 3225, 1839, 3221, 1835, 1842, 1842, 1842, 1836, 1843, - - 1843, 1843, 3226, 1843, 3227, 3221, 1843, 3222, 1844, 1844, - 1844, 3228, 1842, 1845, 1845, 1845, 1846, 1846, 1846, 3222, - 1846, 3232, 3233, 1846, 1831, 1844, 3234, 1848, 1848, 1848, - 1845, 1851, 1851, 1851, 3235, 1851, 3236, 3237, 1851, 1854, - 1854, 1854, 3238, 3239, 1836, 1848, 1856, 1856, 1856, 3240, - 1856, 3242, 3243, 1856, 1859, 1859, 1859, 1854, 1861, 1861, - 1861, 1862, 1862, 1862, 3244, 1862, 3245, 3246, 1862, 1863, - 1863, 1863, 1859, 3247, 3240, 1861, 1865, 1865, 1865, 3248, - 1865, 3249, 3250, 1865, 3251, 3252, 1863, 1870, 1870, 1870, - 1871, 1871, 1871, 3253, 1871, 3254, 3255, 1871, 3256, 3257, - - 1859, 1872, 1872, 1872, 1870, 1877, 1877, 1877, 1880, 1880, - 1880, 1881, 1881, 1881, 1883, 1883, 1883, 3258, 1872, 1884, - 1884, 1884, 1877, 1882, 1882, 1882, 1880, 1882, 1881, 3259, - 1882, 1883, 1885, 1885, 1885, 3260, 1884, 1886, 1886, 1886, - 1888, 1888, 1888, 1889, 1889, 1889, 3261, 1889, 3262, 1885, - 1889, 1890, 1890, 1890, 3263, 1886, 3269, 1888, 1892, 1892, - 1892, 3270, 1893, 1893, 1893, 3271, 1893, 3272, 1890, 1893, - 1895, 1895, 1895, 3273, 1880, 1892, 3274, 1884, 1897, 1897, - 1897, 3275, 1900, 1900, 1900, 1904, 1904, 1904, 1895, 3276, - 3277, 1905, 1905, 1905, 3266, 1905, 1897, 1886, 1905, 3278, - - 1900, 3279, 1904, 1907, 1907, 1907, 1909, 1909, 1909, 1911, - 1911, 1911, 3280, 3266, 1912, 1912, 1912, 1913, 1913, 1913, - 3281, 1907, 3282, 3283, 1909, 3284, 1911, 3285, 3286, 1897, - 1900, 1912, 3287, 3288, 1913, 1914, 1914, 1914, 1916, 1916, - 1916, 1917, 1917, 1917, 1918, 1918, 1918, 1919, 1919, 1919, - 1920, 1920, 1920, 1914, 3290, 3291, 1916, 1909, 3292, 1917, - 3293, 1918, 3294, 3289, 1919, 1922, 1922, 1922, 1920, 1922, - 3295, 3296, 1922, 1928, 1928, 1928, 1930, 1930, 1930, 2365, - 2365, 1913, 2365, 3289, 1916, 1931, 1931, 1931, 3297, 1931, - 2365, 1928, 1931, 1930, 1932, 1932, 1932, 2365, 3298, 1933, - - 1933, 1933, 1914, 1934, 1934, 1934, 1917, 1935, 1935, 1935, - 3299, 1935, 1932, 3300, 1935, 1920, 3301, 1933, 3302, 3303, - 1934, 1936, 1936, 1936, 1928, 1937, 1937, 1937, 1938, 1938, - 1938, 3304, 1938, 3305, 3306, 1938, 1953, 1953, 1953, 1936, - 3307, 3308, 1937, 1939, 1939, 1939, 1945, 1945, 1945, 1946, - 1946, 1946, 3309, 1932, 1933, 1958, 1958, 1958, 1962, 1962, - 1962, 1939, 3315, 1945, 1963, 1963, 1963, 1946, 1964, 1964, - 1964, 1966, 1966, 1966, 1968, 1968, 1968, 1969, 1969, 1969, - 1974, 1974, 1974, 3316, 1976, 1976, 1976, 1979, 1979, 1979, - 1981, 1981, 1981, 1983, 1983, 1983, 1984, 1984, 1984, 3317, - - 3310, 1939, 1976, 3318, 3319, 1979, 3310, 1981, 3320, 3322, - 1946, 1983, 3323, 1984, 1993, 1993, 1993, 3325, 1993, 3326, - 3328, 1993, 1996, 1996, 1996, 1997, 1997, 1997, 2002, 2002, - 2002, 2003, 2003, 2003, 1976, 3329, 2007, 2007, 2007, 3332, - 1996, 3333, 1997, 2008, 2008, 2008, 3334, 2008, 3335, 3337, - 2008, 3339, 1983, 2007, 2011, 2011, 2011, 2013, 2013, 2013, - 2014, 2014, 2014, 2015, 2015, 2015, 3341, 2015, 1996, 3343, - 2015, 3345, 2011, 3346, 2013, 3347, 3348, 2014, 2016, 2016, - 2016, 3331, 2007, 2018, 2018, 2018, 3349, 2019, 2019, 2019, - 2020, 2020, 2020, 3350, 2020, 3331, 2016, 2020, 2021, 2021, - - 2021, 2018, 3351, 2013, 2019, 3352, 3354, 2011, 2024, 2024, - 2024, 3356, 2024, 3358, 3359, 2024, 2021, 2027, 2027, 2027, - 2028, 2028, 2028, 3360, 2028, 3361, 3370, 2028, 2029, 2029, - 2029, 2016, 2029, 3408, 2027, 2029, 2033, 2033, 2033, 2035, - 2035, 2035, 2037, 2037, 2037, 2021, 2039, 2039, 2039, 3362, - 2039, 3382, 1540, 2039, 2033, 2042, 2042, 2042, 3371, 3372, - 2037, 2043, 2043, 2043, 3384, 2043, 3408, 3363, 2043, 2047, - 2047, 2047, 2042, 2047, 3370, 3373, 2047, 2050, 2050, 2050, - 2051, 2051, 2051, 3390, 2051, 3362, 3374, 2051, 2052, 2052, - 2052, 2056, 2056, 2056, 2050, 2057, 2057, 2057, 3382, 2057, - - 2037, 3384, 2057, 3363, 3402, 2052, 3371, 3372, 2056, 2060, - 2060, 2060, 2061, 2061, 2061, 3386, 2061, 3391, 3375, 2061, - 2064, 2064, 2064, 3373, 2065, 2065, 2065, 2060, 2065, 3390, - 3374, 2065, 2066, 2066, 2066, 1539, 3378, 2064, 2067, 2067, - 2067, 2068, 2068, 2068, 3378, 2068, 3379, 3402, 2068, 2066, - 2069, 2069, 2069, 1538, 3379, 2067, 3386, 2071, 2071, 2071, - 2060, 2071, 3375, 3391, 2071, 2074, 2074, 2074, 2069, 2075, - 2075, 2075, 3380, 2075, 3387, 3381, 2075, 2077, 2077, 2077, - 3380, 2077, 2074, 3381, 2077, 2081, 2081, 2081, 2084, 2084, - 2084, 2086, 2086, 2086, 2087, 2087, 2087, 2089, 2089, 2089, - - 3376, 2069, 3385, 2081, 3376, 3394, 2084, 3388, 2086, 2091, - 2091, 2091, 2087, 2091, 2089, 3387, 2091, 2095, 2095, 2095, - 2098, 2098, 2098, 2100, 2100, 2100, 2101, 2101, 2101, 3383, - 2101, 3420, 3377, 2101, 3430, 2095, 3377, 3394, 2098, 3385, - 2100, 3403, 3388, 2089, 2102, 2102, 2102, 2103, 2103, 2103, - 3395, 2103, 2084, 1536, 2103, 2087, 2105, 2105, 2105, 3389, - 3420, 2102, 2107, 2107, 2107, 2108, 2108, 2108, 2109, 2109, - 2109, 2110, 2110, 2110, 2105, 2110, 3383, 3392, 2110, 3393, - 2107, 3430, 3395, 2108, 3403, 2109, 2111, 2111, 2111, 2112, - 2112, 2112, 3400, 2112, 3389, 3396, 2112, 2113, 2113, 2113, - - 2118, 2118, 2118, 2111, 3396, 2120, 2120, 2120, 3397, 2120, - 3398, 2107, 2120, 3399, 3392, 2113, 3393, 3397, 2118, 2123, - 2123, 2123, 2105, 2124, 2124, 2124, 3400, 2125, 2125, 2125, - 2108, 2125, 3401, 3424, 2125, 3414, 3409, 2123, 2128, 2128, - 2128, 2124, 2130, 2130, 2130, 3398, 2130, 3452, 3399, 2130, - 2133, 2133, 2133, 2141, 2141, 2141, 2128, 2138, 2138, 2138, - 3406, 3452, 2113, 1533, 1532, 2118, 3401, 3424, 2133, 3409, - 2123, 2139, 2139, 2139, 2138, 2139, 2124, 3414, 2139, 2140, - 2140, 2140, 2146, 2146, 2146, 2147, 2147, 2147, 2148, 2148, - 2148, 2150, 2150, 2150, 3404, 3406, 2133, 2140, 2155, 2155, - - 2155, 2156, 2156, 2156, 2157, 2157, 2157, 2158, 2158, 2158, - 2160, 2160, 2160, 2161, 2161, 2161, 2162, 2162, 2162, 2163, - 2163, 2163, 2164, 2164, 2164, 2165, 2165, 2165, 2167, 2167, - 2167, 2170, 2170, 2170, 2173, 2173, 2173, 2174, 2174, 2174, - 3404, 2174, 3428, 2140, 2174, 3405, 2167, 1531, 3407, 2170, - 3428, 2173, 1530, 2158, 2176, 2176, 2176, 2177, 2177, 2177, - 2178, 2178, 2178, 3415, 2178, 3429, 1529, 2178, 2189, 2189, - 2189, 3412, 2176, 3429, 2177, 2190, 2190, 2190, 3416, 2167, - 2191, 2191, 2191, 3407, 2191, 3434, 2189, 2191, 2192, 2192, - 2192, 3405, 2190, 2197, 2197, 2197, 2198, 2198, 2198, 2199, - - 2199, 2199, 2200, 2200, 2200, 3415, 2200, 3417, 3412, 2200, - 2202, 2202, 2202, 2204, 2204, 2204, 2199, 2189, 2205, 2205, - 2205, 3421, 2205, 3426, 3416, 2205, 3434, 3410, 2202, 3413, - 2204, 2207, 2207, 2207, 3411, 2207, 3410, 3418, 2207, 2210, - 2210, 2210, 2198, 3411, 2212, 2212, 2212, 2214, 2214, 2214, - 3421, 2214, 1528, 3417, 2214, 3435, 1527, 2210, 2217, 2217, - 2217, 2202, 2212, 2220, 2220, 2220, 3413, 2220, 3419, 3426, - 2220, 2227, 2227, 2227, 3418, 3431, 2217, 2229, 2229, 2229, - 3425, 2229, 3427, 3438, 2229, 2238, 2238, 2238, 3422, 2227, - 2210, 2235, 2235, 2235, 3432, 2235, 3435, 3422, 2235, 2239, - - 2239, 2239, 2238, 2239, 3423, 3419, 2239, 3433, 2243, 2243, - 2243, 2217, 2243, 3423, 3425, 2243, 2247, 2247, 2247, 2248, - 2248, 2248, 3431, 2249, 2249, 2249, 2227, 2249, 3427, 3438, - 2249, 3432, 1525, 2247, 2252, 2252, 2252, 2248, 2253, 2253, - 2253, 3436, 2253, 3437, 3433, 2253, 2254, 2254, 2254, 3442, - 2254, 2252, 3439, 2254, 2257, 2257, 2257, 2259, 2259, 2259, - 1524, 2259, 3440, 1523, 2259, 1522, 2265, 2265, 2265, 2267, - 2267, 2267, 2257, 2268, 2268, 2268, 3436, 2268, 3437, 3443, - 2268, 3442, 3446, 2248, 2265, 1513, 2267, 2269, 2269, 2269, - 2271, 2271, 2271, 2272, 2272, 2272, 3441, 2272, 3439, 3440, - - 2272, 2279, 2279, 2279, 3444, 2269, 1505, 2271, 2282, 2282, - 2282, 3443, 2282, 3444, 3446, 2282, 2289, 2289, 2289, 2279, - 2257, 2285, 2285, 2285, 3447, 2285, 1490, 3448, 2285, 3449, - 2291, 2291, 2291, 3441, 2289, 2292, 2292, 2292, 2293, 2293, - 2293, 1489, 2293, 1484, 1483, 2293, 3445, 2269, 2291, 1482, - 2296, 2296, 2296, 2292, 2296, 3445, 3447, 2296, 2299, 2299, - 2299, 1480, 2300, 2300, 2300, 1473, 1472, 2289, 2301, 2301, - 2301, 2292, 2302, 2302, 2302, 3448, 2299, 3449, 2299, 2300, - 2303, 2303, 2303, 1454, 1449, 2301, 2304, 2304, 2304, 2302, - 2306, 2306, 2306, 2307, 2307, 2307, 2291, 2303, 2308, 2308, - - 2308, 2312, 2312, 2312, 2304, 2309, 2309, 2309, 2306, 3450, - 3453, 2307, 1446, 2313, 2313, 2313, 2308, 2313, 1445, 2301, - 2313, 3453, 1442, 2309, 2316, 2316, 2316, 2317, 2317, 2317, - 2318, 2318, 2318, 2319, 2319, 2319, 2302, 1437, 1428, 2303, - 1427, 3450, 2316, 2322, 2322, 2322, 2323, 2323, 2323, 1426, - 2306, 2304, 2325, 2325, 2325, 2326, 2326, 2326, 1422, 1417, - 2308, 2328, 2328, 2328, 2329, 2329, 2329, 2330, 2330, 2330, - 2331, 2331, 2331, 2334, 2334, 2334, 2335, 2335, 2335, 2336, - 2336, 2336, 1413, 2316, 2337, 2337, 2337, 2339, 2339, 2339, - 2342, 2342, 2342, 2343, 2343, 2343, 3451, 2343, 1405, 1400, - - 2343, 2346, 2346, 2346, 1399, 2339, 1393, 2342, 2347, 2347, - 2347, 1392, 2349, 2349, 2349, 1391, 2349, 1390, 2346, 2349, - 2362, 2362, 2362, 2363, 2363, 2363, 2347, 2363, 3451, 1385, - 2363, 2366, 2366, 2366, 2367, 2367, 2367, 1384, 2362, 2371, - 2371, 2371, 2373, 2373, 2373, 1383, 2373, 1382, 1368, 2373, - 2377, 2377, 2377, 2379, 2379, 2379, 1367, 2379, 1366, 1365, - 2379, 2383, 2383, 2383, 2385, 2385, 2385, 2346, 2377, 2384, - 2384, 2384, 2393, 2393, 2393, 2394, 2394, 2394, 1364, 2383, - 1363, 2362, 2385, 2399, 2399, 2399, 2384, 2399, 1362, 1361, - 2399, 1360, 1350, 2394, 1349, 1348, 2377, 2402, 2402, 2402, - - 2406, 2406, 2406, 2407, 2407, 2407, 1347, 2407, 1330, 1329, - 2407, 2408, 2408, 2408, 2402, 2385, 1324, 2406, 2409, 2409, - 2409, 1323, 2409, 1322, 1317, 2409, 2412, 2412, 2412, 2408, - 2417, 2417, 2417, 1316, 1299, 2394, 2419, 2419, 2419, 2420, - 2420, 2420, 1295, 2420, 2412, 1294, 2420, 1288, 2417, 2423, - 2423, 2423, 1284, 2419, 1283, 2424, 2424, 2424, 2425, 2425, - 2425, 1282, 2425, 1281, 1280, 2425, 1279, 2423, 2428, 2428, - 2428, 1278, 2424, 2429, 2429, 2429, 2434, 2434, 2434, 2436, - 2436, 2436, 2439, 2439, 2439, 2428, 2438, 2438, 2438, 1276, - 2429, 1275, 1273, 2434, 2440, 2440, 2440, 1272, 1271, 2439, - - 2423, 2424, 1266, 1258, 2438, 1256, 2441, 2441, 2441, 2443, - 2443, 2443, 2440, 2442, 2442, 2442, 1251, 1249, 2444, 2444, - 2444, 1240, 2444, 2428, 2441, 2444, 2443, 2434, 2445, 2445, - 2445, 2442, 1235, 1224, 2429, 2446, 2446, 2446, 2447, 2447, - 2447, 2448, 2448, 2448, 1222, 2445, 2449, 2449, 2449, 1221, - 2442, 1220, 2446, 1219, 2440, 2447, 2450, 2450, 2450, 2448, - 2451, 2451, 2451, 2453, 2453, 2453, 1217, 2441, 1216, 2454, - 2454, 2454, 1215, 1214, 2450, 2457, 2457, 2457, 2451, 1213, - 1212, 2453, 2458, 2458, 2458, 1210, 2446, 2454, 1209, 2447, - 2459, 2459, 2459, 2460, 2460, 2460, 2463, 2463, 2463, 1208, - - 2458, 2464, 2464, 2464, 2466, 2466, 2466, 2467, 2467, 2467, - 2471, 2471, 2471, 2474, 2474, 2474, 2475, 2475, 2475, 1207, - 2475, 1206, 2450, 2475, 2487, 2487, 2487, 2453, 2471, 1205, - 2474, 2454, 2498, 2498, 2498, 2501, 2501, 2501, 2504, 2504, - 2504, 1204, 2487, 2507, 2507, 2507, 2509, 2509, 2509, 1203, - 2510, 2510, 2510, 1201, 2510, 1200, 2504, 2510, 2511, 2511, - 2511, 2507, 1199, 2509, 2518, 2518, 2518, 2519, 2519, 2519, - 2520, 2520, 2520, 2526, 2526, 2526, 2511, 1198, 2527, 2527, - 2527, 2518, 2527, 1197, 2487, 2527, 1196, 1195, 2520, 1189, - 2526, 2529, 2529, 2529, 2531, 2531, 2531, 1188, 2531, 1187, - - 1184, 2531, 1183, 1182, 2504, 2534, 2534, 2534, 2529, 1180, - 2536, 2536, 2536, 2540, 2540, 2540, 2542, 2542, 2542, 2544, - 2544, 2544, 1176, 2534, 2556, 2556, 2556, 2520, 2536, 1173, - 2540, 1168, 1159, 2542, 2543, 2543, 2543, 2544, 2543, 1158, - 1155, 2543, 2545, 2545, 2545, 2546, 2546, 2546, 1154, 2546, - 1153, 1152, 2546, 2554, 2554, 2554, 2558, 2558, 2558, 2545, - 2560, 2560, 2560, 1151, 2561, 2561, 2561, 1137, 2561, 1130, - 2554, 2561, 1122, 1121, 2558, 1120, 1117, 2560, 2562, 2562, - 2562, 2563, 2563, 2563, 1114, 2564, 2564, 2564, 2565, 2565, - 2565, 1111, 2565, 1106, 1103, 2565, 2562, 1102, 1098, 2563, - - 2568, 2568, 2568, 2564, 2569, 2569, 2569, 1096, 2569, 1082, - 1081, 2569, 2570, 2570, 2570, 1080, 1079, 2568, 2571, 2571, - 2571, 2572, 2572, 2572, 2574, 2574, 2574, 1078, 1077, 2570, - 1076, 1075, 2575, 2575, 2575, 2571, 2576, 2576, 2576, 2572, - 2580, 2580, 2580, 2584, 2584, 2584, 1074, 1073, 2563, 2564, - 2575, 2585, 2585, 2585, 2576, 2589, 2589, 2589, 2580, 2590, - 2590, 2590, 1069, 2590, 1065, 1058, 2590, 2604, 2604, 2604, - 1055, 1054, 2589, 2619, 2619, 2619, 2622, 2622, 2622, 2623, - 2623, 2623, 2625, 2625, 2625, 2604, 2625, 1050, 1049, 2625, - 2628, 2628, 2628, 1048, 2622, 1045, 1044, 2576, 2631, 2631, - - 2631, 2634, 2634, 2634, 1043, 2635, 2635, 2635, 2628, 2635, - 1040, 1039, 2635, 1036, 1035, 2631, 1032, 1029, 2634, 2636, - 2636, 2636, 2640, 2640, 2640, 1025, 1024, 2604, 2642, 2642, - 2642, 1021, 2642, 1020, 1019, 2642, 1018, 2636, 1017, 2640, - 2646, 2646, 2646, 1015, 2647, 2647, 2647, 2622, 2647, 1014, - 1013, 2647, 2654, 2654, 2654, 1012, 1011, 2646, 2655, 2655, - 2655, 2656, 2656, 2656, 1010, 2656, 1009, 1008, 2656, 2654, - 2657, 2657, 2657, 1004, 999, 2655, 2658, 2658, 2658, 998, - 2658, 997, 994, 2658, 2661, 2661, 2661, 2657, 2663, 2663, - 2663, 993, 2663, 992, 990, 2663, 2671, 2671, 2671, 2672, - - 2672, 2672, 2661, 2672, 986, 982, 2672, 2673, 2673, 2673, - 2674, 2674, 2674, 2671, 2675, 2675, 2675, 981, 2675, 978, - 975, 2675, 974, 973, 2673, 972, 971, 2674, 2678, 2678, - 2678, 2680, 2680, 2680, 2681, 2681, 2681, 2682, 2682, 2682, - 970, 2682, 969, 967, 2682, 966, 2678, 965, 964, 2680, - 963, 962, 2681, 2685, 2685, 2685, 2686, 2686, 2686, 961, - 2686, 960, 959, 2686, 2687, 2687, 2687, 2688, 2688, 2688, - 2685, 2688, 958, 956, 2688, 2689, 2689, 2689, 2691, 2691, - 2691, 2687, 2696, 2696, 2696, 2697, 2697, 2697, 2701, 2701, - 2701, 955, 954, 2689, 953, 2681, 2691, 2680, 952, 2702, - - 2702, 2702, 951, 2702, 950, 2701, 2702, 2720, 2720, 2720, - 2734, 2734, 2734, 2736, 2736, 2736, 2737, 2737, 2737, 2738, - 2738, 2738, 2739, 2739, 2739, 2720, 2740, 2740, 2740, 949, - 2736, 2741, 2741, 2741, 2737, 2800, 2800, 2800, 948, 2739, - 2691, 947, 943, 2740, 942, 2742, 2742, 2742, 2741, 2742, - 940, 939, 2742, 2743, 2743, 2743, 938, 2743, 2720, 937, - 2743, 2746, 2746, 2746, 2750, 2750, 2750, 2751, 2751, 2751, - 936, 932, 2740, 2752, 2752, 2752, 930, 2752, 2737, 2746, - 2752, 2750, 929, 928, 2751, 2753, 2753, 2753, 2755, 2755, - 2755, 927, 2755, 923, 922, 2755, 2764, 2764, 2764, 2765, - - 2765, 2765, 2753, 2765, 918, 914, 2765, 2766, 2766, 2766, - 913, 2766, 910, 2764, 2766, 2769, 2769, 2769, 2770, 2770, - 2770, 909, 2770, 908, 907, 2770, 2772, 2772, 2772, 2774, - 2774, 2774, 2769, 2774, 906, 905, 2774, 2777, 2777, 2777, - 2778, 2778, 2778, 2772, 2778, 904, 901, 2778, 2779, 2779, - 2779, 2780, 2780, 2780, 2777, 2780, 900, 899, 2780, 2787, - 2787, 2787, 2788, 2788, 2788, 2779, 2789, 2789, 2789, 898, - 2789, 895, 894, 2789, 2792, 2792, 2792, 2787, 2792, 893, - 2788, 2792, 2795, 2795, 2795, 2798, 2798, 2798, 2801, 2801, - 2801, 2804, 2804, 2804, 890, 2804, 888, 885, 2804, 884, - - 2795, 883, 2798, 2798, 2815, 2815, 2815, 2824, 2824, 2824, - 2787, 2838, 2838, 2838, 2839, 2839, 2839, 2840, 2840, 2840, - 882, 2815, 2842, 2842, 2842, 2824, 2841, 2841, 2841, 2788, - 2841, 881, 878, 2841, 2840, 2843, 2843, 2843, 877, 876, - 2842, 2844, 2844, 2844, 875, 2844, 874, 871, 2844, 2845, - 2845, 2845, 2843, 2846, 2846, 2846, 2824, 2846, 870, 869, - 2846, 2848, 2848, 2848, 868, 2848, 2845, 866, 2848, 2853, - 2853, 2853, 863, 2842, 2854, 2854, 2854, 862, 2854, 860, - 857, 2854, 855, 2855, 2855, 2855, 2853, 2855, 852, 851, - 2855, 2858, 2858, 2858, 2859, 2859, 2859, 850, 2859, 849, - - 847, 2859, 2867, 2867, 2867, 846, 2867, 845, 2858, 2867, - 2870, 2870, 2870, 842, 2870, 841, 840, 2870, 2874, 2874, - 2874, 2875, 2875, 2875, 839, 2875, 838, 837, 2875, 2877, - 2877, 2877, 832, 2877, 831, 2874, 2877, 2880, 2880, 2880, - 830, 2880, 829, 828, 2880, 2889, 2889, 2889, 2890, 2890, - 2890, 2895, 2895, 2895, 2898, 2898, 2898, 2899, 2899, 2899, - 2900, 2900, 2900, 2889, 2900, 827, 2890, 2900, 826, 2895, - 825, 2898, 2898, 824, 2899, 2899, 823, 822, 2900, 2901, - 2901, 2901, 2902, 2902, 2902, 2903, 2903, 2903, 2904, 2904, - 2904, 2913, 2913, 2913, 2914, 2914, 2914, 821, 2914, 819, - - 817, 2914, 2923, 2923, 2923, 2936, 2936, 2936, 2913, 2937, - 2937, 2937, 816, 813, 2890, 2938, 2938, 2938, 810, 2938, - 2923, 807, 2938, 2941, 2941, 2941, 2942, 2942, 2942, 806, - 2942, 802, 801, 2942, 800, 2945, 2945, 2945, 799, 2945, - 796, 2941, 2945, 2951, 2951, 2951, 793, 2951, 792, 791, - 2951, 2954, 2954, 2954, 788, 2954, 787, 786, 2954, 2957, - 2957, 2957, 2964, 2964, 2964, 2965, 2965, 2965, 2923, 2965, - 783, 782, 2965, 2968, 2968, 2968, 2957, 780, 776, 2964, - 2983, 2983, 2983, 2985, 2985, 2985, 2991, 2991, 2991, 775, - 2968, 774, 2992, 2992, 2992, 772, 2992, 761, 2983, 2992, - - 759, 2985, 756, 2991, 2991, 2993, 2993, 2993, 755, 2993, - 2992, 754, 2993, 2996, 2996, 2996, 2997, 2997, 2997, 2998, - 2998, 2998, 752, 2993, 3007, 3007, 3007, 751, 3007, 750, - 746, 3007, 745, 744, 2985, 2994, 2994, 2994, 2994, 2994, - 2994, 2994, 2994, 2994, 743, 740, 2994, 3016, 3016, 3016, - 739, 2994, 2994, 2994, 2994, 2994, 3025, 3025, 3025, 3026, - 3026, 3026, 3031, 3031, 3031, 3016, 3032, 3032, 3032, 738, - 3032, 737, 736, 3032, 3033, 3033, 3033, 3026, 735, 3031, - 2994, 2994, 2995, 2995, 2995, 2995, 2995, 2995, 2995, 2995, - 2995, 3033, 734, 2995, 3039, 3039, 3039, 732, 2995, 2995, - - 2995, 2995, 2995, 3040, 3040, 3040, 729, 3040, 728, 726, - 3040, 3039, 3041, 3041, 3041, 3042, 3042, 3042, 724, 3042, - 721, 720, 3042, 3055, 3055, 3055, 714, 2995, 2995, 3041, - 3061, 3061, 3061, 712, 3061, 710, 707, 3061, 706, 702, - 701, 3055, 700, 3080, 3080, 3080, 699, 696, 3061, 3064, - 3064, 3064, 3064, 3064, 3064, 3064, 3064, 3064, 695, 694, - 3064, 3080, 3094, 3094, 3094, 3064, 3064, 3064, 3064, 3064, - 3091, 3091, 3091, 693, 3091, 690, 689, 3091, 688, 3094, - 3095, 3095, 3095, 687, 3095, 686, 680, 3095, 3117, 3117, - 3117, 3129, 3129, 3129, 3064, 3064, 3065, 3065, 3065, 3065, - - 3065, 3065, 3065, 3065, 3065, 679, 3117, 3065, 677, 3129, - 3129, 671, 3065, 3065, 3065, 3065, 3065, 3099, 3099, 3099, - 670, 3099, 666, 660, 3099, 3102, 3102, 3102, 659, 3102, - 655, 648, 3102, 3146, 3146, 3146, 3147, 3147, 3147, 644, - 638, 3065, 3065, 3148, 3148, 3148, 634, 3153, 3153, 3153, - 3146, 3153, 626, 3147, 3153, 3156, 3156, 3156, 625, 624, - 3148, 3167, 3167, 3167, 3171, 3171, 3171, 3182, 3182, 3182, - 623, 622, 3156, 3183, 3183, 3183, 618, 3183, 611, 3167, - 3183, 610, 3171, 609, 3182, 3184, 3184, 3184, 3185, 3185, - 3185, 605, 3185, 598, 597, 3185, 3186, 3186, 3186, 3187, - - 3187, 3187, 3184, 3187, 593, 587, 3187, 3194, 3194, 3194, - 3195, 3195, 3195, 3186, 3195, 3171, 586, 3195, 3204, 3204, - 3204, 3214, 3214, 3214, 3194, 3214, 582, 574, 3214, 573, - 3217, 3217, 3217, 569, 3217, 560, 3204, 3217, 3220, 3220, - 3220, 556, 3220, 548, 547, 3220, 3229, 3229, 3229, 546, - 3229, 542, 536, 3229, 535, 3204, 3344, 3344, 3344, 3353, - 3353, 3353, 534, 3353, 530, 524, 3353, 3454, 3454, 3454, - 3455, 3455, 3455, 523, 3344, 519, 513, 3353, 512, 511, - 510, 509, 508, 507, 503, 3454, 497, 496, 3455, 3458, - 3458, 3458, 3458, 3458, 3458, 3458, 3458, 3458, 3459, 3459, - - 3459, 3459, 3459, 3459, 3459, 3459, 3459, 3460, 3460, 3460, - 3460, 3460, 3460, 3460, 3460, 3460, 3461, 3461, 3461, 3461, - 3461, 3461, 3461, 3461, 3461, 3462, 3462, 3462, 3462, 3462, - 3462, 3462, 3462, 3462, 3463, 3463, 3463, 3463, 3463, 3463, - 3463, 3463, 3463, 3464, 3464, 3464, 3464, 3464, 3464, 3464, - 3464, 3464, 3465, 3465, 3465, 3465, 3465, 3465, 3465, 3465, - 3465, 3466, 3466, 3466, 3466, 3466, 3466, 3466, 3466, 3466, - 3467, 3467, 3467, 3467, 3467, 3467, 3467, 3467, 3467, 3468, - 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3469, 3469, - 3469, 3469, 3469, 3469, 3469, 3469, 3469, 3470, 3470, 3470, - - 3470, 3470, 3470, 3470, 3470, 3470, 3471, 3471, 3471, 3471, - 3471, 3471, 3471, 3471, 3471, 3472, 3472, 3472, 3472, 3472, - 3472, 3472, 3472, 3472, 3473, 3473, 3473, 3473, 3473, 3473, - 3473, 3473, 3473, 3474, 3474, 3474, 3474, 3474, 3474, 3474, - 3474, 3474, 3475, 3475, 3475, 3475, 3475, 3475, 3475, 3475, - 3475, 3476, 3476, 3476, 3476, 3476, 3476, 3476, 3476, 3476, - 3477, 3477, 3477, 3477, 3477, 3477, 3477, 3477, 3477, 3478, - 3478, 3478, 3478, 3478, 3478, 3478, 3478, 3478, 3479, 3479, - 3479, 3479, 3479, 3479, 3479, 3479, 3479, 3480, 3480, 3480, - 3480, 3480, 3480, 3480, 3480, 3480, 3481, 3481, 3481, 3481, - - 3481, 3481, 3481, 3481, 3481, 3482, 3482, 3482, 3482, 3482, - 3482, 3482, 3482, 3482, 3483, 3483, 3483, 3483, 3483, 3483, - 3483, 3483, 3483, 3484, 3484, 3484, 3484, 3484, 3484, 3484, - 3484, 3484, 3485, 3485, 3485, 3485, 3485, 3485, 3485, 3485, - 3485, 3486, 3486, 3486, 3486, 3486, 3486, 3486, 3486, 3486, - 3487, 3487, 3487, 3487, 3487, 3487, 3487, 3487, 3487, 3488, - 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3489, 3489, - 3489, 3489, 3489, 3489, 3489, 3489, 3489, 3490, 3490, 3490, - 3490, 3490, 3490, 3490, 3490, 3490, 3491, 3491, 3491, 3491, - 3491, 3491, 3491, 3491, 3491, 3492, 3492, 3492, 3492, 3492, - - 3492, 3492, 3492, 3492, 3493, 3493, 3493, 3493, 3493, 3493, - 3493, 3493, 3493, 3494, 3494, 3494, 3494, 3494, 3494, 3494, - 3494, 3494, 3495, 3495, 3495, 3495, 3495, 3495, 3495, 3495, - 3495, 3496, 3496, 3496, 3496, 3496, 3496, 3496, 3496, 3496, - 3497, 3497, 3497, 3497, 3497, 3497, 3497, 3497, 3497, 3498, - 3498, 3498, 3498, 3498, 3498, 3498, 3498, 3498, 3499, 3499, - 3499, 3499, 3499, 3499, 3499, 3499, 3499, 3500, 3500, 3500, - 3500, 3500, 3500, 3500, 3500, 3500, 3501, 3501, 3501, 3501, - 3501, 3501, 3501, 3501, 3501, 3502, 3502, 3502, 3502, 3502, - 3502, 3502, 3502, 3502, 3503, 3503, 3503, 3503, 3503, 3503, - - 3503, 3503, 3503, 3504, 3504, 3504, 3504, 3504, 3504, 3504, - 3504, 3504, 3505, 3505, 3505, 3505, 3505, 3505, 3505, 3505, - 3505, 3506, 3506, 3506, 3506, 3506, 3506, 3506, 3506, 3506, - 3507, 3507, 3507, 3507, 3507, 3507, 3507, 3507, 3507, 3508, - 3508, 3508, 3508, 3508, 3508, 3508, 3508, 3508, 3509, 3509, - 3509, 3509, 3509, 3509, 3509, 3509, 3509, 3510, 3510, 3510, - 3510, 3510, 3510, 3510, 3510, 3510, 3511, 3511, 3511, 3511, - 3511, 3511, 3511, 3511, 3511, 3512, 3512, 3512, 3512, 3512, - 3512, 3512, 3512, 3512, 3513, 3513, 3513, 3513, 3513, 3513, - 3513, 3513, 3513, 3514, 3514, 3514, 3514, 3514, 3514, 3514, - - 3514, 3514, 3515, 3515, 3515, 3515, 3515, 3515, 3515, 3515, - 3515, 3516, 3516, 3516, 3516, 3516, 3516, 3516, 3516, 3516, - 3517, 3517, 3517, 3517, 3517, 3517, 3517, 3517, 3517, 3518, - 3518, 3518, 3518, 3518, 3518, 3518, 3518, 3518, 3519, 3519, - 3519, 3519, 3519, 3519, 3519, 3519, 3519, 3520, 3520, 3520, - 3520, 3520, 3520, 3520, 3520, 3520, 3521, 3521, 3521, 494, - 493, 492, 3521, 3522, 3522, 3522, 488, 481, 476, 3522, - 3523, 3523, 3523, 475, 473, 469, 3523, 3524, 3524, 3524, - 463, 462, 461, 3524, 3525, 3525, 3525, 457, 451, 447, - 3525, 3526, 3526, 3526, 443, 439, 437, 3526, 3527, 3527, - - 3527, 436, 435, 431, 3527, 3528, 3528, 3528, 425, 424, - 420, 3528, 3529, 3529, 3529, 414, 413, 409, 3529, 3530, - 3530, 3530, 402, 401, 400, 3530, 3531, 3531, 3531, 396, - 388, 387, 3531, 3532, 3532, 3532, 386, 385, 381, 3532, - 3533, 3533, 3533, 372, 366, 362, 3533, 3534, 3534, 3534, - 361, 357, 351, 3534, 3535, 3535, 3535, 350, 349, 345, - 3535, 3536, 3536, 3536, 338, 336, 335, 3536, 3537, 3537, - 3537, 331, 328, 326, 3537, 3538, 3538, 3538, 325, 324, - 320, 3538, 3539, 3539, 3539, 316, 313, 309, 3539, 3540, - 3540, 3540, 306, 305, 297, 3540, 3541, 3541, 3541, 293, - - 289, 288, 3541, 3542, 3542, 3542, 287, 281, 280, 3542, - 3543, 3543, 3543, 278, 275, 263, 3543, 3544, 3544, 3544, - 0, 0, 0, 3544, 3545, 3545, 3545, 0, 0, 0, - 3545, 3546, 3546, 3546, 0, 0, 0, 3546, 3547, 3547, - 3547, 0, 0, 0, 3547, 3548, 3548, 3548, 0, 0, - 0, 3548, 3549, 3549, 3549, 0, 0, 0, 3549, 3550, - 3550, 3550, 3550, 3550, 3550, 3550, 0, 3550, 3551, 3551, - 3551, 0, 0, 0, 3551, 3552, 0, 0, 0, 3552, - 3553, 3553, 3553, 0, 0, 0, 3553, 3554, 0, 0, + 1137, 258, 258, 258, 258, 258, 1144, 1144, 1144, 1145, + 1145, 1145, 1146, 1146, 1146, 1147, 1147, 1147, 1148, 1148, + 1148, 1149, 1149, 1149, 1144, 2506, 1145, 2513, 2514, 1146, + 258, 258, 2516, 1147, 2506, 2520, 1148, 2521, 1149, 2522, + 2524, 258, 2528, 1150, 1150, 1150, 1151, 1151, 1151, 1152, + 1152, 1152, 2532, 2533, 258, 300, 1153, 1153, 1153, 2534, + 1150, 1144, 300, 1151, 1159, 1159, 1159, 1152, 1160, 1160, + + 1160, 300, 300, 2535, 1153, 2536, 1163, 1163, 1163, 1164, + 1164, 1164, 1159, 1175, 1175, 1175, 1160, 1175, 2539, 1148, + 1175, 2541, 2549, 1150, 1163, 2550, 2543, 1164, 2552, 300, + 300, 300, 1959, 1959, 1959, 300, 300, 300, 1150, 2543, + 300, 300, 2558, 2559, 300, 2560, 300, 300, 300, 365, + 1165, 1165, 1165, 1167, 1167, 1167, 365, 1153, 1168, 1168, + 1168, 2544, 1160, 2561, 2563, 365, 365, 1165, 1169, 1169, + 1169, 1167, 2566, 1164, 2544, 2568, 1168, 2593, 1172, 1172, + 1172, 1174, 1174, 1174, 2594, 1169, 2590, 2597, 1173, 1173, + 1173, 2598, 2588, 365, 365, 365, 1172, 2599, 1174, 365, + + 365, 365, 2589, 2604, 365, 365, 1173, 2605, 365, 2606, + 365, 365, 365, 1177, 1177, 1177, 1178, 1178, 1178, 1168, + 1193, 1193, 1193, 1194, 1194, 1194, 1196, 1196, 1196, 2590, + 2602, 1177, 2588, 2607, 1178, 1229, 1229, 1229, 1193, 2589, + 2602, 1194, 2608, 2602, 1196, 1228, 1228, 1228, 1230, 1230, + 1230, 2609, 1173, 1229, 1232, 1232, 1232, 1233, 1233, 1233, + 2610, 2611, 1228, 1234, 1234, 1234, 1230, 1234, 2612, 2613, + 1234, 2614, 1232, 1196, 1233, 2616, 2617, 1178, 1237, 1237, + 1237, 1239, 1239, 1239, 1240, 1240, 1240, 1242, 1242, 1242, + 1244, 1244, 1244, 2618, 1244, 1237, 2619, 1244, 2620, 1239, + + 2621, 2622, 1240, 1232, 2603, 1242, 1247, 1247, 1247, 1248, + 1248, 1248, 2623, 1248, 2603, 2624, 1248, 2603, 1249, 1249, + 1249, 2625, 2626, 1247, 1250, 1250, 1250, 2627, 2628, 1251, + 1251, 1251, 2629, 1251, 1242, 1249, 1251, 2631, 2632, 1237, + 2640, 1250, 1253, 1253, 1253, 1255, 1255, 1255, 1256, 1256, + 1256, 1258, 1258, 1258, 1260, 1260, 1260, 2646, 2648, 1253, + 1262, 1262, 1262, 1255, 2649, 2650, 1256, 2652, 2656, 1258, + 2659, 1260, 1263, 1263, 1263, 1265, 1265, 1265, 1262, 1266, + 1266, 1266, 2660, 1266, 2661, 2662, 1266, 1270, 1270, 1270, + 1263, 2663, 2664, 1265, 1271, 1271, 1271, 1273, 1273, 1273, + + 1288, 1288, 1288, 2677, 1288, 1270, 2678, 1288, 1292, 1292, + 1292, 1258, 1271, 2679, 2706, 1273, 1293, 1293, 1293, 1294, + 1294, 1294, 1265, 2709, 2703, 1292, 1296, 1296, 1296, 1298, + 1298, 1298, 2710, 2711, 1293, 2714, 2715, 1294, 1299, 1299, + 1299, 1300, 1300, 1300, 1296, 2717, 1298, 1301, 1301, 1301, + 1303, 1303, 1303, 2703, 2716, 1299, 1304, 1304, 1304, 1300, + 1305, 1305, 1305, 2718, 2720, 1301, 2721, 2716, 1303, 1312, + 1312, 1312, 2704, 1304, 1306, 1306, 1306, 1305, 1307, 1307, + 1307, 1309, 1309, 1309, 2722, 1299, 1312, 1296, 1305, 1319, + 1319, 1319, 1306, 1313, 1313, 1313, 1307, 1313, 2705, 1309, + + 1313, 1320, 1320, 1320, 1322, 1322, 1322, 1319, 1327, 1327, + 1327, 2723, 1327, 2724, 2704, 1327, 2726, 1303, 2727, 1320, + 2728, 2729, 1322, 1331, 1331, 1331, 1332, 1332, 1332, 2687, + 1334, 1334, 1334, 1335, 1335, 1335, 1336, 1336, 1336, 2687, + 2705, 1331, 2732, 2733, 1332, 2687, 2734, 1309, 1334, 2719, + 1335, 1340, 1340, 1340, 1336, 1337, 1337, 1337, 1339, 1339, + 1339, 2735, 2719, 1341, 1341, 1341, 2736, 1341, 1340, 1322, + 1341, 2737, 2738, 1337, 2739, 2740, 1339, 1344, 1344, 1344, + 2741, 1344, 2742, 2743, 1344, 1347, 1347, 1347, 1348, 1348, + 1348, 1334, 1350, 1350, 1350, 1355, 1355, 1355, 2744, 1355, + + 2746, 2759, 1355, 1347, 2760, 2765, 1348, 1358, 1358, 1358, + 1350, 1359, 1359, 1359, 2769, 1359, 2770, 2771, 1359, 1362, + 1362, 1362, 2772, 2773, 1358, 1339, 1363, 1363, 1363, 2774, + 1363, 2782, 2784, 1363, 2792, 2793, 1362, 1374, 1374, 1374, + 1375, 1375, 1375, 1377, 1377, 1377, 1378, 1378, 1378, 2688, + 1378, 2794, 2795, 1378, 2796, 1374, 2797, 1350, 1375, 2688, + 2810, 1377, 1381, 1381, 1381, 2688, 1381, 2813, 2814, 1381, + 1384, 1384, 1384, 1385, 1385, 1385, 2818, 1385, 2819, 2820, + 1385, 1390, 1390, 1390, 1391, 1391, 1391, 1384, 1393, 1393, + 1393, 1398, 1398, 1398, 2821, 1398, 2822, 2823, 1398, 1390, + + 2801, 2824, 1391, 1401, 1401, 1401, 1393, 1402, 1402, 1402, + 1377, 1402, 2807, 2801, 1402, 1405, 1405, 1405, 2825, 2802, + 1401, 1406, 1406, 1406, 1408, 1408, 1408, 1410, 1410, 1410, + 2808, 1410, 2802, 1405, 1410, 2827, 1393, 2828, 2829, 1406, + 2830, 2831, 1408, 1413, 1413, 1413, 1414, 1414, 1414, 1416, + 1416, 1416, 1418, 1418, 1418, 2832, 1418, 2833, 2834, 1418, + 2807, 1413, 2836, 2837, 1414, 2808, 2838, 1416, 1422, 1422, + 1422, 1423, 1423, 1423, 2839, 1408, 1425, 1425, 1425, 2840, + 1427, 1427, 1427, 2841, 1427, 2842, 1422, 1427, 2843, 1423, + 1433, 1433, 1433, 2844, 1425, 1434, 1434, 1434, 2845, 1436, + + 1436, 1436, 1437, 1437, 1437, 1438, 1438, 1438, 1433, 1438, + 2846, 2847, 1438, 1434, 2848, 2856, 1416, 1436, 2862, 1437, + 1439, 1439, 1439, 2863, 2871, 1425, 1440, 1440, 1440, 2872, + 1440, 2873, 2874, 1440, 1442, 1442, 1442, 1439, 1443, 1443, + 1443, 2875, 1445, 1445, 1445, 1447, 1447, 1447, 2876, 1451, + 1451, 1451, 1442, 1964, 1964, 1964, 1443, 2877, 2884, 1436, + 1445, 2887, 1447, 1448, 1448, 1448, 1451, 1448, 2894, 2895, + 1448, 1452, 1452, 1452, 2896, 1452, 2897, 2898, 1452, 1454, + 1454, 1454, 1455, 1455, 1455, 1457, 1457, 1457, 1459, 1459, + 1459, 2889, 1459, 2899, 2902, 1459, 2903, 1454, 2890, 2904, + + 1455, 2889, 2905, 1457, 1462, 1462, 1462, 2916, 2890, 1445, + 1463, 1463, 1463, 1465, 1465, 1465, 1466, 1466, 1466, 1467, + 1467, 1467, 1462, 1467, 2917, 2918, 1467, 2919, 1463, 2920, + 2892, 1465, 2893, 1466, 1468, 1468, 1468, 1469, 1469, 1469, + 2892, 1469, 2893, 2921, 1469, 1470, 1470, 1470, 2922, 1457, + 2923, 1468, 1471, 1471, 1471, 2926, 1473, 1473, 1473, 1474, + 1474, 1474, 2927, 1470, 1475, 1475, 1475, 2929, 1475, 2930, + 1471, 1475, 2931, 1465, 1473, 2933, 1474, 1478, 1478, 1478, + 1479, 1479, 1479, 2908, 1479, 2935, 2936, 1479, 1480, 1480, + 1480, 1481, 1481, 1481, 1478, 1483, 1483, 1483, 1485, 1485, + + 1485, 1489, 1489, 1489, 2937, 2940, 1480, 2941, 2942, 1481, + 1490, 1490, 1490, 1483, 2943, 1485, 2946, 2908, 1473, 1489, + 1492, 1492, 1492, 1495, 1495, 1495, 2956, 2960, 1490, 1496, + 1496, 1496, 1498, 1498, 1498, 1499, 1499, 1499, 1492, 1499, + 2961, 1495, 1499, 1502, 1502, 1502, 2969, 1496, 2970, 2971, + 1498, 1503, 1503, 1503, 1505, 1505, 1505, 1483, 1506, 1506, + 1506, 1502, 1506, 2972, 2973, 1506, 1510, 1510, 1510, 1503, + 2974, 2980, 1505, 1511, 1511, 1511, 1513, 1513, 1513, 2981, + 2982, 1492, 2983, 2984, 1510, 1498, 1514, 1514, 1514, 2985, + 1514, 1511, 2986, 1514, 1513, 1518, 1518, 1518, 1519, 1519, + + 1519, 1521, 1521, 1521, 1523, 1523, 1523, 1530, 1530, 1530, + 1561, 1561, 1561, 1518, 1505, 2987, 1519, 2988, 2989, 1521, + 2991, 2992, 1523, 1523, 2997, 1530, 2998, 1561, 1562, 1562, + 1562, 2999, 1562, 3000, 3001, 1562, 3010, 1513, 1563, 1563, + 1563, 1564, 1564, 1564, 3011, 1565, 1565, 1565, 3012, 1565, + 3013, 1521, 1565, 1568, 1568, 1568, 1563, 3014, 1564, 1570, + 1570, 1570, 3015, 1570, 3016, 3017, 1570, 1573, 1573, 1573, + 3021, 1568, 3022, 1530, 1574, 1574, 1574, 3001, 1574, 3023, + 3024, 1574, 3025, 3026, 1573, 1575, 1575, 1575, 3028, 1575, + 3029, 3031, 1575, 1579, 1579, 1579, 1563, 1580, 1580, 1580, + + 3032, 1580, 1568, 3033, 1580, 1582, 1582, 1582, 3035, 3039, + 1579, 1584, 1584, 1584, 1585, 1585, 1585, 3040, 1585, 3041, + 3046, 1585, 3048, 1582, 1586, 1586, 1586, 3049, 1584, 1587, + 1587, 1587, 1589, 1589, 1589, 1605, 1605, 1605, 1968, 1968, + 1968, 1586, 1606, 1606, 1606, 3054, 3055, 1587, 3056, 3057, + 1589, 3058, 1605, 3059, 3060, 1582, 1607, 1607, 1607, 1606, + 1607, 3061, 3062, 1607, 1608, 1608, 1608, 1610, 1610, 1610, + 1611, 1611, 1611, 3063, 1611, 3064, 3065, 1611, 1587, 1613, + 1613, 1613, 1608, 3067, 1610, 1614, 1614, 1614, 1615, 1615, + 1615, 3068, 1615, 3069, 3070, 1615, 3077, 1613, 1617, 1617, + + 1617, 3073, 1614, 1620, 1620, 1620, 1621, 1621, 1621, 3080, + 1621, 3081, 3084, 1621, 3071, 3073, 1617, 1622, 1622, 1622, + 1620, 1624, 1624, 1624, 1625, 1625, 1625, 3086, 1608, 1631, + 1631, 1631, 3074, 3087, 1622, 1632, 1632, 1632, 1624, 1613, + 3089, 3090, 1625, 3074, 1633, 1633, 1633, 1631, 1633, 3094, + 3095, 1633, 1632, 1634, 1634, 1634, 1635, 1635, 1635, 1617, + 3071, 1636, 1636, 1636, 3096, 1636, 3097, 1624, 1636, 3098, + 3099, 1634, 3100, 1635, 1637, 1637, 1637, 1639, 1639, 1639, + 1642, 1642, 1642, 3101, 1643, 1643, 1643, 3109, 1643, 3103, + 1625, 1643, 1637, 1631, 1639, 3117, 3093, 1642, 1644, 1644, + + 1644, 3103, 1644, 3096, 3119, 1644, 1649, 1649, 1649, 1658, + 1658, 1658, 1659, 1659, 1659, 3121, 1659, 3123, 3131, 1659, + 1662, 1662, 1662, 1649, 1663, 1663, 1663, 1658, 1664, 1664, + 1664, 1665, 1665, 1665, 1666, 1666, 1666, 1662, 3093, 3133, + 1637, 1663, 1668, 1668, 1668, 1664, 3104, 3137, 1665, 1671, + 1671, 1671, 1666, 1671, 3136, 3136, 1671, 3139, 3104, 1668, + 1674, 1674, 1674, 1676, 1676, 1676, 1678, 1678, 1678, 1681, + 1681, 1681, 3135, 3114, 1658, 1664, 3115, 1674, 1685, 1685, + 1685, 1676, 3138, 3141, 1678, 3114, 3135, 1681, 3115, 1666, + 1686, 1686, 1686, 3138, 1663, 1685, 1687, 1687, 1687, 3142, + + 1687, 1665, 3143, 1687, 3134, 1690, 1690, 1690, 1686, 1690, + 3144, 3150, 1690, 1694, 1694, 1694, 1696, 1696, 1696, 3154, + 1696, 3151, 3161, 1696, 1685, 3160, 1681, 1676, 1705, 1705, + 1705, 1694, 1678, 1701, 1701, 1701, 3155, 1701, 3163, 3151, + 1701, 1707, 1707, 1707, 3160, 3134, 1705, 1686, 1708, 1708, + 1708, 3155, 1708, 3162, 3168, 1708, 1711, 1711, 1711, 1707, + 1711, 3169, 3170, 1711, 1714, 1714, 1714, 1715, 1715, 1715, + 3171, 1715, 3162, 3168, 1715, 3176, 1720, 1720, 1720, 1694, + 1720, 3170, 1714, 1720, 1723, 1723, 1723, 3177, 3179, 1705, + 1725, 1725, 1725, 1726, 1726, 1726, 3180, 1726, 1707, 3181, + + 1726, 3183, 1723, 1730, 1730, 1730, 3184, 1725, 1732, 1732, + 1732, 1714, 1733, 1733, 1733, 1734, 1734, 1734, 1735, 1735, + 1735, 1730, 1736, 1736, 1736, 1732, 1737, 1737, 1737, 3185, + 1733, 1723, 3186, 1734, 3187, 1735, 1738, 1738, 1738, 3189, + 1736, 3190, 3192, 1737, 1741, 1741, 1741, 1748, 1748, 1748, + 3199, 3200, 1730, 3201, 1738, 3202, 1780, 1780, 1780, 3203, + 1780, 3204, 1741, 1780, 3207, 1748, 3208, 1734, 1783, 1783, + 1783, 1784, 1784, 1784, 3209, 1784, 3210, 3211, 1784, 1733, + 1789, 1789, 1789, 3212, 1736, 3213, 1783, 1738, 3214, 1791, + 1791, 1791, 3216, 1791, 3218, 1741, 1791, 3220, 1789, 1748, + + 1795, 1795, 1795, 3221, 1795, 3222, 3223, 1795, 1799, 1799, + 1799, 3224, 1741, 1801, 1801, 1801, 3234, 1801, 3232, 3235, + 1801, 1804, 1804, 1804, 3236, 3233, 1799, 1806, 1806, 1806, + 3232, 1789, 1805, 1805, 1805, 1783, 1805, 3233, 1804, 1805, + 1815, 1815, 1815, 3237, 3238, 1806, 1819, 1819, 1819, 1820, + 1820, 1820, 3239, 1822, 1822, 1822, 1823, 1823, 1823, 3243, + 1823, 3244, 3245, 1823, 1824, 1824, 1824, 3246, 1824, 1799, + 1822, 1824, 1827, 1827, 1827, 1829, 1829, 1829, 1806, 1829, + 3247, 3248, 1829, 1833, 1833, 1833, 3249, 1834, 1834, 1834, + 1827, 1834, 3250, 3251, 1834, 1837, 1837, 1837, 1838, 1838, + + 1838, 1833, 3253, 3254, 1815, 3255, 3256, 1841, 1841, 1841, + 1819, 1841, 1837, 1820, 1841, 3257, 1838, 3258, 3251, 1827, + 1844, 1844, 1844, 1845, 1845, 1845, 3259, 1845, 3260, 3261, + 1845, 1846, 1846, 1846, 1847, 1847, 1847, 1844, 1848, 1848, + 1848, 3262, 1848, 3263, 3264, 1848, 3265, 3266, 1846, 1833, + 3267, 1847, 1850, 1850, 1850, 1853, 1853, 1853, 1854, 1854, + 1854, 3268, 1838, 1855, 1855, 1855, 1856, 1856, 1856, 3269, + 1850, 3270, 1853, 3271, 3272, 1854, 1860, 1860, 1860, 3273, + 1855, 1857, 1857, 1857, 1856, 1857, 3274, 3277, 1857, 1862, + 1862, 1862, 3280, 1862, 1860, 3281, 1862, 1865, 1865, 1865, + + 1867, 1867, 1867, 1868, 1868, 1868, 3277, 1868, 3282, 3283, + 1868, 3284, 3285, 1856, 3286, 1865, 3287, 1867, 1869, 1869, + 1869, 1871, 1871, 1871, 1854, 1871, 3288, 3289, 1871, 1876, + 1876, 1876, 1877, 1877, 1877, 1869, 1877, 3290, 3291, 1877, + 1878, 1878, 1878, 1865, 3292, 3293, 1876, 1883, 1883, 1883, + 1886, 1886, 1886, 1887, 1887, 1887, 3294, 1878, 1888, 1888, + 1888, 3295, 1888, 3296, 1883, 1888, 3297, 3298, 1886, 3299, + 1887, 1889, 1889, 1889, 1890, 1890, 1890, 1891, 1891, 1891, + 1892, 1892, 1892, 1894, 1894, 1894, 3301, 3302, 1889, 3300, + 3303, 1890, 3304, 3305, 1891, 1895, 1895, 1895, 1892, 1895, + + 1894, 3306, 1895, 1896, 1896, 1896, 1898, 1898, 1898, 3300, + 1899, 1899, 1899, 3307, 1899, 3308, 1886, 1899, 3309, 3310, + 1896, 3311, 3312, 1898, 1901, 1901, 1901, 1903, 1903, 1903, + 3313, 3314, 1890, 1906, 1906, 1906, 1910, 1910, 1910, 3315, + 1892, 3316, 1901, 3317, 3318, 1903, 3319, 3320, 1911, 1911, + 1911, 1906, 1911, 1910, 3326, 1911, 1913, 1913, 1913, 1915, + 1915, 1915, 1917, 1917, 1917, 1918, 1918, 1918, 1919, 1919, + 1919, 1920, 1920, 1920, 1913, 3327, 3328, 1915, 1903, 1917, + 3329, 1906, 1918, 3330, 3331, 1919, 1923, 1923, 1923, 1920, + 1922, 1922, 1922, 3333, 1924, 1924, 1924, 1925, 1925, 1925, + + 1926, 1926, 1926, 3334, 1923, 1928, 1928, 1928, 1922, 1928, + 1915, 1924, 1928, 3321, 1925, 1934, 1934, 1934, 1926, 3321, + 1936, 1936, 1936, 1937, 1937, 1937, 3336, 1937, 3337, 3339, + 1937, 3340, 1919, 1934, 3343, 3344, 1922, 1936, 1920, 1938, + 1938, 1938, 1939, 1939, 1939, 1940, 1940, 1940, 1941, 1941, + 1941, 1923, 1941, 3345, 3346, 1941, 3348, 1938, 3350, 3352, + 1939, 3354, 1940, 3356, 3342, 1926, 1934, 1942, 1942, 1942, + 1943, 1943, 1943, 1944, 1944, 1944, 3357, 1944, 3342, 3358, + 1944, 1945, 1945, 1945, 3359, 1942, 3360, 1943, 1951, 1951, + 1951, 1952, 1952, 1952, 1969, 1969, 1969, 1939, 1938, 1945, + + 1970, 1970, 1970, 3361, 3362, 1951, 1972, 1972, 1972, 1952, + 1974, 1974, 1974, 1975, 1975, 1975, 1980, 1980, 1980, 1982, + 1982, 1982, 1985, 1985, 1985, 1987, 1987, 1987, 1989, 1989, + 1989, 1990, 1990, 1990, 1999, 1999, 1999, 1982, 1999, 1945, + 1985, 1999, 1987, 2002, 2002, 2002, 1989, 3363, 1990, 2003, + 2003, 2003, 1952, 2008, 2008, 2008, 2009, 2009, 2009, 3365, + 3367, 2002, 2013, 2013, 2013, 3369, 2003, 3370, 3371, 1982, + 2014, 2014, 2014, 3372, 2014, 1537, 3373, 2014, 3374, 2013, + 2017, 2017, 2017, 2020, 2020, 2020, 3397, 1989, 3464, 2002, + 2021, 2021, 2021, 2022, 2022, 2022, 3385, 2022, 2017, 3464, + + 2022, 2020, 2023, 2023, 2023, 1536, 3399, 2021, 2013, 2026, + 2026, 2026, 3373, 2026, 3374, 3386, 2026, 2029, 2029, 2029, + 2023, 2030, 2030, 2030, 3411, 2030, 3381, 3397, 2030, 2035, + 2035, 2035, 3382, 2017, 2029, 2031, 2031, 2031, 3398, 2031, + 3385, 3399, 2031, 2037, 2037, 2037, 3383, 2035, 3389, 2023, + 2039, 2039, 2039, 2040, 2040, 2040, 3389, 2040, 3411, 3386, + 2040, 2041, 2041, 2041, 2042, 2042, 2042, 2039, 2043, 2043, + 2043, 3384, 2043, 3387, 3381, 2043, 3419, 3387, 2041, 3398, + 3382, 2042, 2044, 2044, 2044, 2045, 2045, 2045, 2047, 2047, + 2047, 3390, 2047, 3391, 3383, 2047, 2050, 2050, 2050, 3390, + + 2044, 3391, 3392, 2045, 2051, 2051, 2051, 2041, 2051, 3419, + 3392, 2051, 3395, 2050, 2055, 2055, 2055, 3393, 2055, 3384, + 1535, 2055, 2058, 2058, 2058, 2059, 2059, 2059, 3394, 2059, + 3388, 3405, 2059, 1534, 3388, 2044, 2060, 2060, 2060, 2058, + 2064, 2064, 2064, 2045, 2065, 2065, 2065, 3401, 2065, 3395, + 3396, 2065, 3403, 2060, 2068, 2068, 2068, 2064, 2069, 2069, + 2069, 3400, 2069, 3405, 3393, 2069, 2072, 2072, 2072, 2073, + 2073, 2073, 2068, 2073, 3412, 3394, 2073, 2074, 2074, 2074, + 2075, 2075, 2075, 2072, 2076, 2076, 2076, 3396, 2076, 3403, + 3431, 2076, 3407, 3401, 2074, 1533, 3400, 2075, 2077, 2077, + + 2077, 3407, 2079, 2079, 2079, 2068, 2079, 1532, 3412, 2079, + 2082, 2082, 2082, 2083, 2083, 2083, 2077, 2083, 1531, 3431, + 2083, 2085, 2085, 2085, 3402, 2085, 3425, 2082, 2085, 2089, + 2089, 2089, 2092, 2092, 2092, 2094, 2094, 2094, 2095, 2095, + 2095, 2097, 2097, 2097, 2099, 2099, 2099, 2089, 2099, 2077, + 2092, 2099, 2094, 2103, 2103, 2103, 2095, 3404, 2097, 2106, + 2106, 2106, 2108, 2108, 2108, 2109, 2109, 2109, 3425, 2109, + 3402, 2103, 2109, 2110, 2110, 2110, 3413, 2106, 3409, 2108, + 3408, 2111, 2111, 2111, 3406, 2111, 3415, 2097, 2111, 3408, + 2110, 2113, 2113, 2113, 3404, 3410, 2092, 1529, 3417, 2095, + + 2115, 2115, 2115, 2116, 2116, 2116, 2117, 2117, 2117, 2113, + 2118, 2118, 2118, 3409, 2118, 3420, 3406, 2118, 2115, 3413, + 3418, 2116, 3426, 2117, 2119, 2119, 2119, 2120, 2120, 2120, + 3410, 2120, 3415, 3417, 2120, 2121, 2121, 2121, 2126, 2126, + 2126, 2119, 3414, 2128, 2128, 2128, 3416, 2128, 3420, 2115, + 2128, 1528, 1527, 2121, 3432, 3418, 2126, 2113, 2131, 2131, + 2131, 2132, 2132, 2132, 3426, 2133, 2133, 2133, 2116, 2133, + 3423, 3424, 2133, 2136, 2136, 2136, 2131, 3421, 1526, 2132, + 2138, 2138, 2138, 3432, 2138, 3414, 3421, 2138, 2141, 2141, + 2141, 2136, 3416, 2146, 2146, 2146, 3422, 2147, 2147, 2147, + + 2121, 2147, 1517, 2126, 2147, 3422, 2141, 3423, 3424, 2131, + 2146, 2148, 2148, 2148, 2132, 2149, 2149, 2149, 2154, 2154, + 2154, 2155, 2155, 2155, 2156, 2156, 2156, 1509, 3427, 2148, + 2158, 2158, 2158, 1494, 2141, 2163, 2163, 2163, 2164, 2164, + 2164, 2165, 2165, 2165, 2166, 2166, 2166, 2168, 2168, 2168, + 2169, 2169, 2169, 2170, 2170, 2170, 2171, 2171, 2171, 2172, + 2172, 2172, 2173, 2173, 2173, 2175, 2175, 2175, 2178, 2178, + 2178, 2181, 2181, 2181, 3427, 2148, 3428, 2182, 2182, 2182, + 3433, 2182, 3437, 2175, 2182, 1493, 2178, 1488, 2181, 3433, + 2166, 2184, 2184, 2184, 2185, 2185, 2185, 2186, 2186, 2186, + + 1487, 2186, 1486, 1484, 2186, 2197, 2197, 2197, 3429, 2184, + 3435, 2185, 2198, 2198, 2198, 3438, 2175, 2199, 2199, 2199, + 3441, 2199, 3428, 2197, 2199, 2200, 2200, 2200, 3437, 2198, + 2205, 2205, 2205, 2206, 2206, 2206, 2207, 2207, 2207, 2208, + 2208, 2208, 3436, 2208, 3435, 3429, 2208, 2210, 2210, 2210, + 2213, 2213, 2213, 2207, 2197, 2215, 2215, 2215, 3430, 2215, + 1477, 3438, 2215, 3434, 1476, 2210, 3443, 3441, 2213, 2218, + 2218, 2218, 3434, 2221, 2221, 2221, 3436, 2221, 3439, 2206, + 2221, 2228, 2228, 2228, 3447, 2228, 3439, 2218, 2228, 2231, + 2231, 2231, 2232, 2232, 2232, 3430, 2232, 3440, 2210, 2232, + + 2234, 2234, 2234, 3443, 2234, 3440, 2231, 2234, 2237, 2237, + 2237, 2238, 2238, 2238, 2240, 2240, 2240, 3442, 2240, 3447, + 3445, 2240, 2218, 2246, 2246, 2246, 2237, 2246, 3444, 2238, + 2246, 2249, 2249, 2249, 2250, 2250, 2250, 3446, 2250, 1458, + 3448, 2250, 2254, 2254, 2254, 3453, 2254, 1453, 2249, 2254, + 2258, 2258, 2258, 2259, 2259, 2259, 2260, 2260, 2260, 2237, + 2260, 3445, 3451, 2260, 3442, 3444, 2238, 2258, 2263, 2263, + 2263, 2259, 2264, 2264, 2264, 3448, 2264, 3453, 3446, 2264, + 2265, 2265, 2265, 3454, 2265, 2263, 3449, 2265, 2268, 2268, + 2268, 2270, 2270, 2270, 3450, 2270, 3452, 1450, 2270, 3451, + + 2276, 2276, 2276, 2278, 2278, 2278, 2268, 2279, 2279, 2279, + 3455, 2279, 3459, 3457, 2279, 3454, 3458, 2259, 2276, 3455, + 2278, 2280, 2280, 2280, 2282, 2282, 2282, 2283, 2283, 2283, + 3460, 2283, 3449, 3452, 2283, 2290, 2290, 2290, 3456, 2280, + 3450, 2282, 2293, 2293, 2293, 3457, 2293, 3456, 3458, 2293, + 2300, 2300, 2300, 2290, 2268, 2296, 2296, 2296, 3461, 2296, + 3459, 3463, 2296, 3462, 2302, 2302, 2302, 1449, 2300, 2303, + 2303, 2303, 2304, 2304, 2304, 3463, 2304, 1446, 3460, 2304, + 1441, 2280, 2302, 1432, 2307, 2307, 2307, 2303, 2307, 1431, + 3461, 2307, 2310, 2310, 2310, 3462, 2311, 2311, 2311, 1430, + + 1426, 2300, 2312, 2312, 2312, 2303, 2313, 2313, 2313, 1421, + 2310, 1417, 2310, 2311, 2314, 2314, 2314, 1409, 1404, 2312, + 2315, 2315, 2315, 2313, 2317, 2317, 2317, 2318, 2318, 2318, + 2302, 2314, 2319, 2319, 2319, 2323, 2323, 2323, 2315, 2320, + 2320, 2320, 2317, 1403, 1397, 2318, 1396, 2324, 2324, 2324, + 2319, 2324, 1395, 2312, 2324, 1394, 1389, 2320, 2327, 2327, + 2327, 2328, 2328, 2328, 2329, 2329, 2329, 2330, 2330, 2330, + 2313, 1388, 1387, 2314, 1386, 1372, 2327, 2333, 2333, 2333, + 2334, 2334, 2334, 1371, 2317, 2315, 2336, 2336, 2336, 2337, + 2337, 2337, 1370, 1369, 2319, 2339, 2339, 2339, 2340, 2340, + + 2340, 2341, 2341, 2341, 2342, 2342, 2342, 2345, 2345, 2345, + 2346, 2346, 2346, 2347, 2347, 2347, 1368, 2327, 2348, 2348, + 2348, 2350, 2350, 2350, 2353, 2353, 2353, 2354, 2354, 2354, + 1367, 2354, 1366, 1365, 2354, 2357, 2357, 2357, 1364, 2350, + 1354, 2353, 2358, 2358, 2358, 1353, 2360, 2360, 2360, 1352, + 2360, 1351, 2357, 2360, 2373, 2373, 2373, 2374, 2374, 2374, + 2358, 2374, 2375, 2375, 2374, 2375, 2376, 2376, 1330, 2376, + 1326, 1325, 2373, 2375, 2377, 2377, 2377, 2376, 1324, 1323, + 2375, 2378, 2378, 2378, 2376, 2382, 2382, 2382, 2384, 2384, + 2384, 1318, 2384, 1317, 1316, 2384, 2388, 2388, 2388, 1311, + + 1310, 2357, 2390, 2390, 2390, 2391, 2391, 2391, 2399, 2399, + 2399, 2404, 2404, 2404, 2388, 2373, 2405, 2405, 2405, 2390, + 2400, 2400, 2400, 2391, 2400, 1297, 1291, 2400, 1287, 2404, + 1286, 2410, 2410, 2410, 2405, 2410, 1285, 1284, 2410, 2447, + 2447, 2447, 2388, 2413, 2413, 2413, 2417, 2417, 2417, 1283, + 2418, 2418, 2418, 1282, 2418, 1281, 2391, 2418, 1279, 1278, + 2413, 1276, 1275, 2417, 2419, 2419, 2419, 2420, 2420, 2420, + 1274, 2420, 1269, 1261, 2420, 1259, 2405, 2423, 2423, 2423, + 1254, 1252, 2419, 2428, 2428, 2428, 2430, 2430, 2430, 2431, + 2431, 2431, 1243, 2431, 1238, 2423, 2431, 2434, 2434, 2434, + + 1227, 2428, 1225, 2430, 2435, 2435, 2435, 2436, 2436, 2436, + 1224, 2436, 1223, 1222, 2436, 2434, 2439, 2439, 2439, 1220, + 1219, 2435, 2440, 2440, 2440, 2445, 2445, 2445, 2449, 2449, + 2449, 1218, 1217, 2439, 2450, 2450, 2450, 1216, 1215, 2440, + 1213, 1212, 2445, 2451, 2451, 2451, 2449, 1211, 2434, 1210, + 2435, 2450, 2452, 2452, 2452, 2453, 2453, 2453, 2454, 2454, + 2454, 2451, 2455, 2455, 2455, 1209, 2455, 1208, 1207, 2455, + 2452, 2439, 1206, 2453, 1204, 2454, 2445, 2456, 2456, 2456, + 2457, 2457, 2457, 2440, 2458, 2458, 2458, 2459, 2459, 2459, + 1203, 1202, 2453, 1201, 2456, 1200, 1199, 2457, 2460, 2460, + + 2460, 2458, 1198, 2451, 1192, 2459, 2461, 2461, 2461, 2462, + 2462, 2462, 1191, 2452, 2464, 2464, 2464, 1190, 2465, 2465, + 2465, 2468, 2468, 2468, 2461, 1187, 1186, 2462, 2469, 2469, + 2469, 2457, 2464, 1185, 1183, 2458, 2465, 2470, 2470, 2470, + 2471, 2471, 2471, 2474, 2474, 2474, 2469, 2475, 2475, 2475, + 2477, 2477, 2477, 2478, 2478, 2478, 2482, 2482, 2482, 2485, + 2485, 2485, 2486, 2486, 2486, 1179, 2486, 1176, 1171, 2486, + 1162, 1161, 2461, 1158, 2482, 1157, 2485, 1156, 2464, 1155, + 2465, 2498, 2498, 2498, 2509, 2509, 2509, 2512, 2512, 2512, + 2515, 2515, 2515, 2517, 2517, 2517, 2518, 2518, 2518, 2498, + + 2518, 1154, 1140, 2518, 2519, 2519, 2519, 1133, 2515, 1125, + 2517, 2526, 2526, 2526, 2527, 2527, 2527, 2529, 2529, 2529, + 1124, 1123, 2519, 1120, 2531, 2531, 2531, 1117, 2526, 2537, + 2537, 2537, 2538, 2538, 2538, 2529, 2538, 1114, 1109, 2538, + 1106, 2498, 2531, 2540, 2540, 2540, 2537, 2542, 2542, 2542, + 1105, 2542, 1101, 1099, 2542, 1085, 2515, 2545, 2545, 2545, + 2540, 2547, 2547, 2547, 1084, 2551, 2551, 2551, 2553, 2553, + 2553, 2555, 2555, 2555, 1083, 2545, 2554, 2554, 2554, 2547, + 2554, 2531, 2551, 2554, 1082, 2553, 2556, 2556, 2556, 2555, + 2557, 2557, 2557, 1081, 2557, 1080, 1079, 2557, 2565, 2565, + + 2565, 1078, 1077, 2556, 2567, 2567, 2567, 2569, 2569, 2569, + 2571, 2571, 2571, 1076, 1072, 2565, 2572, 2572, 2572, 1068, + 2572, 1061, 1058, 2572, 1055, 2569, 1052, 2571, 2573, 2573, + 2573, 2574, 2574, 2574, 1051, 2575, 2575, 2575, 2576, 2576, + 2576, 1050, 2576, 1046, 1045, 2576, 2573, 1044, 1041, 2574, + 2579, 2579, 2579, 2575, 2580, 2580, 2580, 1040, 2580, 1039, + 1036, 2580, 2581, 2581, 2581, 1035, 1032, 2579, 2582, 2582, + 2582, 2583, 2583, 2583, 2585, 2585, 2585, 1031, 1027, 2581, + 1026, 1023, 2586, 2586, 2586, 2582, 2587, 2587, 2587, 2583, + 2591, 2591, 2591, 2595, 2595, 2595, 1022, 1021, 2574, 2575, + + 2586, 2596, 2596, 2596, 2587, 2600, 2600, 2600, 2591, 2601, + 2601, 2601, 1020, 2601, 1019, 1017, 2601, 2615, 2615, 2615, + 1016, 1015, 2600, 2630, 2630, 2630, 2633, 2633, 2633, 2634, + 2634, 2634, 2635, 2635, 2635, 2615, 2635, 1014, 1013, 2635, + 2638, 2638, 2638, 1012, 2633, 1011, 1010, 2587, 2641, 2641, + 2641, 2644, 2644, 2644, 1006, 2645, 2645, 2645, 2638, 2645, + 1001, 1000, 2645, 999, 996, 2641, 995, 994, 2644, 2647, + 2647, 2647, 2651, 2651, 2651, 992, 988, 2615, 2653, 2653, + 2653, 984, 2653, 983, 980, 2653, 977, 2647, 976, 2651, + 2657, 2657, 2657, 975, 2658, 2658, 2658, 2633, 2658, 974, + + 973, 2658, 2665, 2665, 2665, 972, 971, 2657, 2666, 2666, + 2666, 2667, 2667, 2667, 969, 2667, 968, 967, 2667, 2665, + 2668, 2668, 2668, 966, 965, 2666, 2669, 2669, 2669, 964, + 2669, 963, 962, 2669, 2672, 2672, 2672, 2668, 2674, 2674, + 2674, 961, 2674, 960, 958, 2674, 2682, 2682, 2682, 2683, + 2683, 2683, 2672, 2683, 957, 956, 2683, 2684, 2684, 2684, + 2685, 2685, 2685, 2682, 2686, 2686, 2686, 955, 2686, 954, + 953, 2686, 952, 951, 2684, 950, 949, 2685, 2689, 2689, + 2689, 2691, 2691, 2691, 2692, 2692, 2692, 2693, 2693, 2693, + 945, 2693, 944, 942, 2693, 941, 2689, 940, 939, 2691, + + 938, 934, 2692, 2696, 2696, 2696, 2697, 2697, 2697, 932, + 2697, 931, 930, 2697, 2698, 2698, 2698, 2699, 2699, 2699, + 2696, 2699, 929, 925, 2699, 2700, 2700, 2700, 2702, 2702, + 2702, 2698, 2707, 2707, 2707, 2708, 2708, 2708, 2712, 2712, + 2712, 924, 920, 2700, 916, 2692, 2702, 2691, 915, 2713, + 2713, 2713, 912, 2713, 911, 2712, 2713, 2731, 2731, 2731, + 2745, 2745, 2745, 2747, 2747, 2747, 2748, 2748, 2748, 2749, + 2749, 2749, 2750, 2750, 2750, 2731, 2751, 2751, 2751, 910, + 2747, 2752, 2752, 2752, 2748, 2752, 909, 908, 2752, 2750, + 2702, 907, 906, 2751, 2753, 2753, 2753, 903, 2753, 902, + + 901, 2753, 2756, 2756, 2756, 2757, 2757, 2757, 2731, 2761, + 2761, 2761, 2762, 2762, 2762, 2764, 2764, 2764, 2750, 2756, + 2763, 2763, 2763, 2757, 2763, 900, 2761, 2763, 2748, 2762, + 897, 896, 2764, 2766, 2766, 2766, 895, 2766, 892, 890, + 2766, 2775, 2775, 2775, 2776, 2776, 2776, 887, 2776, 886, + 885, 2776, 2777, 2777, 2777, 884, 2777, 883, 2775, 2777, + 2780, 2780, 2780, 2781, 2781, 2781, 880, 2781, 879, 878, + 2781, 2783, 2783, 2783, 2785, 2785, 2785, 2780, 2785, 877, + 876, 2785, 2788, 2788, 2788, 2789, 2789, 2789, 2783, 2789, + 873, 872, 2789, 2790, 2790, 2790, 2791, 2791, 2791, 2788, + + 2791, 871, 870, 2791, 2798, 2798, 2798, 2799, 2799, 2799, + 2790, 2800, 2800, 2800, 868, 2800, 865, 864, 2800, 2803, + 2803, 2803, 2798, 2803, 862, 2799, 2803, 2806, 2806, 2806, + 2809, 2809, 2809, 2811, 2811, 2811, 2812, 2812, 2812, 2815, + 2815, 2815, 859, 2815, 857, 2806, 2815, 2809, 2809, 2826, + 2826, 2826, 2835, 2835, 2835, 2798, 2849, 2849, 2849, 2850, + 2850, 2850, 2851, 2851, 2851, 854, 2826, 2853, 2853, 2853, + 2835, 2852, 2852, 2852, 2799, 2852, 853, 852, 2852, 2851, + 2854, 2854, 2854, 851, 849, 2853, 2855, 2855, 2855, 848, + 2855, 847, 844, 2855, 2860, 2860, 2860, 2854, 2857, 2857, + + 2857, 2835, 2857, 843, 842, 2857, 2861, 2861, 2861, 841, + 2861, 2860, 840, 2861, 2864, 2864, 2864, 839, 2853, 2865, + 2865, 2865, 834, 2865, 833, 832, 2865, 831, 2866, 2866, + 2866, 2864, 2866, 830, 829, 2866, 2869, 2869, 2869, 2870, + 2870, 2870, 828, 2870, 827, 826, 2870, 2878, 2878, 2878, + 825, 2878, 824, 2869, 2878, 2881, 2881, 2881, 823, 2881, + 821, 819, 2881, 2885, 2885, 2885, 2886, 2886, 2886, 818, + 2886, 815, 812, 2886, 2888, 2888, 2888, 809, 2888, 808, + 2885, 2888, 2891, 2891, 2891, 805, 2891, 804, 802, 2891, + 2900, 2900, 2900, 2901, 2901, 2901, 2906, 2906, 2906, 2909, + + 2909, 2909, 2910, 2910, 2910, 2911, 2911, 2911, 2900, 2911, + 801, 2901, 2911, 797, 2906, 796, 2909, 2909, 795, 2910, + 2910, 794, 791, 2911, 2912, 2912, 2912, 2913, 2913, 2913, + 2914, 2914, 2914, 2915, 2915, 2915, 2924, 2924, 2924, 2925, + 2925, 2925, 788, 2925, 787, 786, 2925, 2934, 2934, 2934, + 2947, 2947, 2947, 2924, 2948, 2948, 2948, 783, 782, 2901, + 2949, 2949, 2949, 781, 2949, 2934, 777, 2949, 2952, 2952, + 2952, 2953, 2953, 2953, 776, 2953, 775, 773, 2953, 762, + 2957, 2957, 2957, 760, 2957, 757, 2952, 2957, 2962, 2962, + 2962, 756, 2962, 755, 753, 2962, 2965, 2965, 2965, 752, + + 2965, 751, 747, 2965, 2968, 2968, 2968, 2975, 2975, 2975, + 2976, 2976, 2976, 2934, 2976, 746, 745, 2976, 2979, 2979, + 2979, 2968, 744, 741, 2975, 2994, 2994, 2994, 2996, 2996, + 2996, 3002, 3002, 3002, 740, 2979, 739, 3003, 3003, 3003, + 738, 3003, 737, 2994, 3003, 736, 2996, 735, 3002, 3002, + 3004, 3004, 3004, 733, 3004, 3003, 730, 3004, 3007, 3007, + 3007, 3008, 3008, 3008, 3009, 3009, 3009, 729, 3004, 3018, + 3018, 3018, 727, 3018, 725, 722, 3018, 721, 715, 2996, + 3005, 3005, 3005, 3005, 3005, 3005, 3005, 3005, 3005, 713, + 711, 3005, 3027, 3027, 3027, 708, 3005, 3005, 3005, 3005, + + 3005, 3036, 3036, 3036, 3037, 3037, 3037, 3042, 3042, 3042, + 3027, 3043, 3043, 3043, 707, 3043, 703, 702, 3043, 3044, + 3044, 3044, 3037, 701, 3042, 3005, 3005, 3006, 3006, 3006, + 3006, 3006, 3006, 3006, 3006, 3006, 3044, 700, 3006, 3050, + 3050, 3050, 697, 3006, 3006, 3006, 3006, 3006, 3051, 3051, + 3051, 696, 3051, 695, 694, 3051, 3050, 3052, 3052, 3052, + 3053, 3053, 3053, 691, 3053, 690, 689, 3053, 3066, 3066, + 3066, 688, 3006, 3006, 3052, 3072, 3072, 3072, 687, 3072, + 681, 680, 3072, 678, 672, 671, 3066, 667, 3091, 3091, + 3091, 661, 660, 3072, 3075, 3075, 3075, 3075, 3075, 3075, + + 3075, 3075, 3075, 656, 649, 3075, 3091, 3105, 3105, 3105, + 3075, 3075, 3075, 3075, 3075, 3102, 3102, 3102, 645, 3102, + 639, 635, 3102, 627, 3105, 3106, 3106, 3106, 626, 3106, + 625, 624, 3106, 3128, 3128, 3128, 3140, 3140, 3140, 3075, + 3075, 3076, 3076, 3076, 3076, 3076, 3076, 3076, 3076, 3076, + 623, 3128, 3076, 619, 3140, 3140, 612, 3076, 3076, 3076, + 3076, 3076, 3110, 3110, 3110, 611, 3110, 610, 606, 3110, + 3113, 3113, 3113, 599, 3113, 598, 594, 3113, 3157, 3157, + 3157, 3158, 3158, 3158, 588, 587, 3076, 3076, 3159, 3159, + 3159, 583, 3164, 3164, 3164, 3157, 3164, 575, 3158, 3164, + + 3167, 3167, 3167, 574, 570, 3159, 3178, 3178, 3178, 3182, + 3182, 3182, 3193, 3193, 3193, 561, 557, 3167, 3194, 3194, + 3194, 549, 3194, 548, 3178, 3194, 547, 3182, 543, 3193, + 3195, 3195, 3195, 3196, 3196, 3196, 537, 3196, 536, 535, + 3196, 3197, 3197, 3197, 3198, 3198, 3198, 3195, 3198, 531, + 525, 3198, 3205, 3205, 3205, 3206, 3206, 3206, 3197, 3206, + 3182, 524, 3206, 3215, 3215, 3215, 3225, 3225, 3225, 3205, + 3225, 520, 514, 3225, 513, 3228, 3228, 3228, 512, 3228, + 511, 3215, 3228, 3231, 3231, 3231, 510, 3231, 509, 508, + 3231, 3240, 3240, 3240, 504, 3240, 498, 497, 3240, 495, + + 3215, 3355, 3355, 3355, 3364, 3364, 3364, 494, 3364, 493, + 489, 3364, 3465, 3465, 3465, 3466, 3466, 3466, 482, 3355, + 477, 476, 3364, 474, 470, 464, 463, 462, 458, 452, + 3465, 448, 441, 3466, 3469, 3469, 3469, 3469, 3469, 3469, + 3469, 3469, 3469, 3470, 3470, 3470, 3470, 3470, 3470, 3470, + 3470, 3470, 3471, 3471, 3471, 3471, 3471, 3471, 3471, 3471, + 3471, 3472, 3472, 3472, 3472, 3472, 3472, 3472, 3472, 3472, + 3473, 3473, 3473, 3473, 3473, 3473, 3473, 3473, 3473, 3474, + 3474, 3474, 3474, 3474, 3474, 3474, 3474, 3474, 3475, 3475, + 3475, 3475, 3475, 3475, 3475, 3475, 3475, 3476, 3476, 3476, + + 3476, 3476, 3476, 3476, 3476, 3476, 3477, 3477, 3477, 3477, + 3477, 3477, 3477, 3477, 3477, 3478, 3478, 3478, 3478, 3478, + 3478, 3478, 3478, 3478, 3479, 3479, 3479, 3479, 3479, 3479, + 3479, 3479, 3479, 3480, 3480, 3480, 3480, 3480, 3480, 3480, + 3480, 3480, 3481, 3481, 3481, 3481, 3481, 3481, 3481, 3481, + 3481, 3482, 3482, 3482, 3482, 3482, 3482, 3482, 3482, 3482, + 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3483, 3484, + 3484, 3484, 3484, 3484, 3484, 3484, 3484, 3484, 3485, 3485, + 3485, 3485, 3485, 3485, 3485, 3485, 3485, 3486, 3486, 3486, + 3486, 3486, 3486, 3486, 3486, 3486, 3487, 3487, 3487, 3487, + + 3487, 3487, 3487, 3487, 3487, 3488, 3488, 3488, 3488, 3488, + 3488, 3488, 3488, 3488, 3489, 3489, 3489, 3489, 3489, 3489, + 3489, 3489, 3489, 3490, 3490, 3490, 3490, 3490, 3490, 3490, + 3490, 3490, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3492, 3492, 3492, 3492, 3492, 3492, 3492, 3492, 3492, + 3493, 3493, 3493, 3493, 3493, 3493, 3493, 3493, 3493, 3494, + 3494, 3494, 3494, 3494, 3494, 3494, 3494, 3494, 3495, 3495, + 3495, 3495, 3495, 3495, 3495, 3495, 3495, 3496, 3496, 3496, + 3496, 3496, 3496, 3496, 3496, 3496, 3497, 3497, 3497, 3497, + 3497, 3497, 3497, 3497, 3497, 3498, 3498, 3498, 3498, 3498, + + 3498, 3498, 3498, 3498, 3499, 3499, 3499, 3499, 3499, 3499, + 3499, 3499, 3499, 3500, 3500, 3500, 3500, 3500, 3500, 3500, + 3500, 3500, 3501, 3501, 3501, 3501, 3501, 3501, 3501, 3501, + 3501, 3502, 3502, 3502, 3502, 3502, 3502, 3502, 3502, 3502, + 3503, 3503, 3503, 3503, 3503, 3503, 3503, 3503, 3503, 3504, + 3504, 3504, 3504, 3504, 3504, 3504, 3504, 3504, 3505, 3505, + 3505, 3505, 3505, 3505, 3505, 3505, 3505, 3506, 3506, 3506, + 3506, 3506, 3506, 3506, 3506, 3506, 3507, 3507, 3507, 3507, + 3507, 3507, 3507, 3507, 3507, 3508, 3508, 3508, 3508, 3508, + 3508, 3508, 3508, 3508, 3509, 3509, 3509, 3509, 3509, 3509, + + 3509, 3509, 3509, 3510, 3510, 3510, 3510, 3510, 3510, 3510, + 3510, 3510, 3511, 3511, 3511, 3511, 3511, 3511, 3511, 3511, + 3511, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, + 3513, 3513, 3513, 3513, 3513, 3513, 3513, 3513, 3513, 3514, + 3514, 3514, 3514, 3514, 3514, 3514, 3514, 3514, 3515, 3515, + 3515, 3515, 3515, 3515, 3515, 3515, 3515, 3516, 3516, 3516, + 3516, 3516, 3516, 3516, 3516, 3516, 3517, 3517, 3517, 3517, + 3517, 3517, 3517, 3517, 3517, 3518, 3518, 3518, 3518, 3518, + 3518, 3518, 3518, 3518, 3519, 3519, 3519, 3519, 3519, 3519, + 3519, 3519, 3519, 3520, 3520, 3520, 3520, 3520, 3520, 3520, + + 3520, 3520, 3521, 3521, 3521, 3521, 3521, 3521, 3521, 3521, + 3521, 3522, 3522, 3522, 3522, 3522, 3522, 3522, 3522, 3522, + 3523, 3523, 3523, 3523, 3523, 3523, 3523, 3523, 3523, 3524, + 3524, 3524, 3524, 3524, 3524, 3524, 3524, 3524, 3525, 3525, + 3525, 3525, 3525, 3525, 3525, 3525, 3525, 3526, 3526, 3526, + 3526, 3526, 3526, 3526, 3526, 3526, 3527, 3527, 3527, 3527, + 3527, 3527, 3527, 3527, 3527, 3528, 3528, 3528, 3528, 3528, + 3528, 3528, 3528, 3528, 3529, 3529, 3529, 3529, 3529, 3529, + 3529, 3529, 3529, 3530, 3530, 3530, 3530, 3530, 3530, 3530, + 3530, 3530, 3531, 3531, 3531, 3531, 3531, 3531, 3531, 3531, + + 3531, 3532, 3532, 3532, 440, 439, 438, 3532, 3533, 3533, + 3533, 434, 430, 426, 3533, 3534, 3534, 3534, 424, 423, + 422, 3534, 3535, 3535, 3535, 418, 412, 411, 3535, 3536, + 3536, 3536, 407, 401, 400, 3536, 3537, 3537, 3537, 396, + 388, 387, 3537, 3538, 3538, 3538, 386, 385, 381, 3538, + 3539, 3539, 3539, 372, 366, 362, 3539, 3540, 3540, 3540, + 361, 357, 351, 3540, 3541, 3541, 3541, 350, 349, 345, + 3541, 3542, 3542, 3542, 338, 336, 335, 3542, 3543, 3543, + 3543, 331, 328, 326, 3543, 3544, 3544, 3544, 325, 324, + 320, 3544, 3545, 3545, 3545, 316, 313, 309, 3545, 3546, + + 3546, 3546, 306, 305, 297, 3546, 3547, 3547, 3547, 293, + 289, 288, 3547, 3548, 3548, 3548, 287, 281, 280, 3548, + 3549, 3549, 3549, 278, 275, 263, 3549, 3550, 3550, 3550, + 0, 0, 0, 3550, 3551, 3551, 3551, 0, 0, 0, + 3551, 3552, 3552, 3552, 0, 0, 0, 3552, 3553, 3553, + 3553, 0, 0, 0, 3553, 3554, 3554, 3554, 0, 0, 0, 3554, 3555, 3555, 3555, 0, 0, 0, 3555, 3556, - - 0, 0, 0, 3556, 3557, 3557, 3557, 0, 0, 0, - 3557, 3558, 0, 0, 0, 3558, 3559, 3559, 3559, 0, - 0, 0, 3559, 3560, 0, 0, 0, 3560, 3561, 3561, - 3561, 0, 0, 0, 3561, 3562, 0, 0, 0, 3562, - 3563, 3563, 3563, 0, 0, 0, 3563, 3564, 0, 0, - 0, 3564, 3565, 3565, 3565, 0, 0, 0, 3565, 3566, - 0, 0, 0, 3566, 3567, 3567, 3567, 0, 0, 0, - 3567, 3568, 0, 0, 0, 3568, 3569, 3569, 3569, 0, - 0, 0, 3569, 3570, 0, 0, 0, 3570, 3571, 3571, - 3571, 0, 0, 0, 3571, 3572, 0, 0, 0, 3572, - - 3573, 3573, 3573, 0, 0, 0, 3573, 3574, 0, 0, - 0, 3574, 3575, 3575, 3575, 0, 0, 0, 3575, 3576, - 0, 0, 0, 3576, 3577, 3577, 3577, 0, 0, 0, - 3577, 3578, 0, 0, 0, 3578, 3579, 3579, 3579, 0, - 0, 0, 3579, 3580, 0, 0, 0, 3580, 3581, 3581, - 3581, 0, 0, 0, 3581, 3582, 0, 0, 0, 3582, - 3583, 3583, 3583, 0, 0, 0, 3583, 3584, 0, 0, - 0, 3584, 3585, 3585, 3585, 0, 0, 0, 3585, 3586, - 0, 0, 0, 3586, 3587, 3587, 3587, 0, 0, 0, - 3587, 3588, 0, 0, 0, 3588, 3589, 3589, 3589, 0, - - 0, 0, 3589, 3590, 0, 0, 0, 3590, 3591, 3591, - 3591, 0, 0, 0, 3591, 3592, 0, 0, 0, 3592, - 3593, 3593, 3593, 0, 0, 0, 3593, 3594, 0, 0, - 0, 3594, 3595, 3595, 3595, 0, 0, 0, 3595, 3596, - 0, 0, 0, 3596, 3597, 3597, 3597, 0, 0, 0, - 3597, 3598, 0, 0, 0, 3598, 3599, 3599, 3599, 0, - 0, 0, 3599, 3600, 0, 0, 0, 3600, 3601, 3601, - 3601, 0, 0, 0, 3601, 3602, 0, 0, 0, 3602, - 3603, 3603, 3603, 0, 0, 0, 3603, 3604, 0, 0, - 0, 3604, 3605, 3605, 3605, 0, 0, 0, 3605, 3606, - - 0, 0, 0, 3606, 3607, 3607, 3607, 0, 0, 0, - 3607, 3608, 0, 0, 0, 3608, 3609, 3609, 3609, 3609, - 3609, 3609, 3609, 3609, 3609, 3610, 0, 0, 0, 0, - 3610, 3611, 3611, 3611, 0, 0, 0, 3611, 3612, 3612, - 3612, 3612, 0, 0, 3612, 3612, 3613, 3613, 3613, 0, - 0, 0, 3613, 3614, 3614, 3614, 3614, 0, 0, 3614, - 3614, 3615, 3615, 3615, 0, 0, 0, 3615, 3616, 3616, - 3616, 3616, 0, 0, 3616, 3616, 3617, 3617, 3617, 0, - 0, 0, 3617, 3618, 3618, 3618, 3618, 0, 0, 3618, - 3618, 3619, 3619, 3619, 0, 0, 0, 3619, 3620, 3620, - - 3620, 3620, 0, 0, 3620, 3620, 3621, 3621, 3621, 0, - 0, 0, 3621, 3622, 3622, 3622, 3622, 0, 0, 3622, - 3622, 3623, 3623, 3623, 0, 0, 0, 3623, 3624, 3624, - 3624, 3624, 0, 0, 3624, 3624, 3625, 3625, 3625, 0, - 0, 0, 3625, 3626, 3626, 3626, 3626, 0, 0, 3626, - 3626, 3627, 3627, 3627, 0, 0, 0, 3627, 3628, 3628, - 3628, 3628, 0, 0, 3628, 3628, 3629, 3629, 3629, 0, - 0, 0, 3629, 3630, 3630, 3630, 3630, 0, 0, 3630, - 3630, 3631, 3631, 3631, 0, 0, 0, 3631, 3632, 3632, - 3632, 3632, 0, 0, 3632, 3632, 3633, 3633, 3633, 0, - - 0, 0, 3633, 3634, 3634, 3634, 3634, 0, 0, 3634, - 3634, 3635, 3635, 3635, 0, 0, 0, 3635, 3636, 3636, - 3636, 3636, 0, 0, 3636, 3636, 3637, 3637, 3637, 0, - 0, 0, 3637, 3638, 3638, 3638, 3638, 0, 0, 3638, - 3638, 3639, 3639, 3639, 3639, 0, 3639, 0, 3639, 3640, - 3640, 3640, 3640, 0, 0, 3640, 3640, 3641, 3641, 3641, - 0, 0, 0, 3641, 3642, 3642, 3642, 3642, 0, 0, - 3642, 3642, 3643, 3643, 3643, 0, 0, 0, 3643, 3644, - 3644, 3644, 3644, 0, 0, 3644, 3644, 3645, 3645, 3645, - 0, 0, 0, 3645, 3646, 3646, 3646, 3646, 0, 0, - - 3646, 3646, 3647, 3647, 3647, 0, 0, 0, 3647, 3648, - 3648, 3648, 3648, 0, 0, 3648, 3648, 3649, 3649, 3649, - 3649, 0, 3649, 0, 3649, 3650, 3650, 3650, 3650, 0, - 0, 3650, 3650, 3651, 3651, 3651, 3651, 0, 3651, 0, - 3651, 3652, 3652, 3652, 3652, 0, 0, 3652, 3652, 3653, - 3653, 3653, 0, 0, 0, 3653, 3654, 3654, 3654, 3654, - 0, 0, 3654, 3654, 3655, 3655, 3655, 3655, 0, 3655, - 0, 3655, 3656, 3656, 3656, 3656, 0, 0, 3656, 3656, - 3657, 3657, 3657, 3657, 0, 3657, 0, 3657, 3658, 3658, - 3658, 3658, 0, 0, 3658, 3658, 3659, 3659, 3659, 0, - - 0, 0, 3659, 3660, 3660, 3660, 3660, 0, 0, 3660, - 3660, 3661, 3661, 3661, 0, 0, 0, 3661, 3662, 3662, - 3662, 3662, 0, 0, 3662, 3662, 3663, 3663, 3663, 3663, + 3556, 3556, 0, 0, 0, 3556, 3557, 3557, 3557, 0, + 0, 0, 3557, 3558, 3558, 3558, 0, 0, 0, 3558, + 3559, 3559, 3559, 0, 0, 0, 3559, 3560, 3560, 3560, + + 0, 0, 0, 3560, 3561, 3561, 3561, 3561, 3561, 3561, + 3561, 0, 3561, 3562, 3562, 3562, 0, 0, 0, 3562, + 3563, 0, 0, 0, 3563, 3564, 3564, 3564, 0, 0, + 0, 3564, 3565, 0, 0, 0, 3565, 3566, 3566, 3566, + 0, 0, 0, 3566, 3567, 0, 0, 0, 3567, 3568, + 3568, 3568, 0, 0, 0, 3568, 3569, 0, 0, 0, + 3569, 3570, 3570, 3570, 0, 0, 0, 3570, 3571, 0, + 0, 0, 3571, 3572, 3572, 3572, 0, 0, 0, 3572, + 3573, 0, 0, 0, 3573, 3574, 3574, 3574, 0, 0, + 0, 3574, 3575, 0, 0, 0, 3575, 3576, 3576, 3576, + + 0, 0, 0, 3576, 3577, 0, 0, 0, 3577, 3578, + 3578, 3578, 0, 0, 0, 3578, 3579, 0, 0, 0, + 3579, 3580, 3580, 3580, 0, 0, 0, 3580, 3581, 0, + 0, 0, 3581, 3582, 3582, 3582, 0, 0, 0, 3582, + 3583, 0, 0, 0, 3583, 3584, 3584, 3584, 0, 0, + 0, 3584, 3585, 0, 0, 0, 3585, 3586, 3586, 3586, + 0, 0, 0, 3586, 3587, 0, 0, 0, 3587, 3588, + 3588, 3588, 0, 0, 0, 3588, 3589, 0, 0, 0, + 3589, 3590, 3590, 3590, 0, 0, 0, 3590, 3591, 0, + 0, 0, 3591, 3592, 3592, 3592, 0, 0, 0, 3592, + + 3593, 0, 0, 0, 3593, 3594, 3594, 3594, 0, 0, + 0, 3594, 3595, 0, 0, 0, 3595, 3596, 3596, 3596, + 0, 0, 0, 3596, 3597, 0, 0, 0, 3597, 3598, + 3598, 3598, 0, 0, 0, 3598, 3599, 0, 0, 0, + 3599, 3600, 3600, 3600, 0, 0, 0, 3600, 3601, 0, + 0, 0, 3601, 3602, 3602, 3602, 0, 0, 0, 3602, + 3603, 0, 0, 0, 3603, 3604, 3604, 3604, 0, 0, + 0, 3604, 3605, 0, 0, 0, 3605, 3606, 3606, 3606, + 0, 0, 0, 3606, 3607, 0, 0, 0, 3607, 3608, + 3608, 3608, 0, 0, 0, 3608, 3609, 0, 0, 0, + + 3609, 3610, 3610, 3610, 0, 0, 0, 3610, 3611, 0, + 0, 0, 3611, 3612, 3612, 3612, 0, 0, 0, 3612, + 3613, 0, 0, 0, 3613, 3614, 3614, 3614, 0, 0, + 0, 3614, 3615, 0, 0, 0, 3615, 3616, 3616, 3616, + 0, 0, 0, 3616, 3617, 0, 0, 0, 3617, 3618, + 3618, 3618, 0, 0, 0, 3618, 3619, 0, 0, 0, + 3619, 3620, 3620, 3620, 3620, 3620, 3620, 3620, 3620, 3620, + 3621, 0, 0, 0, 0, 3621, 3622, 3622, 3622, 0, + 0, 0, 3622, 3623, 3623, 3623, 3623, 0, 0, 3623, + 3623, 3624, 3624, 3624, 0, 0, 0, 3624, 3625, 3625, + + 3625, 3625, 0, 0, 3625, 3625, 3626, 3626, 3626, 0, + 0, 0, 3626, 3627, 3627, 3627, 3627, 0, 0, 3627, + 3627, 3628, 3628, 3628, 0, 0, 0, 3628, 3629, 3629, + 3629, 3629, 0, 0, 3629, 3629, 3630, 3630, 3630, 0, + 0, 0, 3630, 3631, 3631, 3631, 3631, 0, 0, 3631, + 3631, 3632, 3632, 3632, 0, 0, 0, 3632, 3633, 3633, + 3633, 3633, 0, 0, 3633, 3633, 3634, 3634, 3634, 0, + 0, 0, 3634, 3635, 3635, 3635, 3635, 0, 0, 3635, + 3635, 3636, 3636, 3636, 0, 0, 0, 3636, 3637, 3637, + 3637, 3637, 0, 0, 3637, 3637, 3638, 3638, 3638, 0, + + 0, 0, 3638, 3639, 3639, 3639, 3639, 0, 0, 3639, + 3639, 3640, 3640, 3640, 0, 0, 0, 3640, 3641, 3641, + 3641, 3641, 0, 0, 3641, 3641, 3642, 3642, 3642, 0, + 0, 0, 3642, 3643, 3643, 3643, 3643, 0, 0, 3643, + 3643, 3644, 3644, 3644, 0, 0, 0, 3644, 3645, 3645, + 3645, 3645, 0, 0, 3645, 3645, 3646, 3646, 3646, 0, + 0, 0, 3646, 3647, 3647, 3647, 3647, 0, 0, 3647, + 3647, 3648, 3648, 3648, 0, 0, 0, 3648, 3649, 3649, + 3649, 3649, 0, 0, 3649, 3649, 3650, 3650, 3650, 3650, + 0, 3650, 0, 3650, 3651, 3651, 3651, 3651, 0, 0, + + 3651, 3651, 3652, 3652, 3652, 0, 0, 0, 3652, 3653, + 3653, 3653, 3653, 0, 0, 3653, 3653, 3654, 3654, 3654, + 0, 0, 0, 3654, 3655, 3655, 3655, 3655, 0, 0, + 3655, 3655, 3656, 3656, 3656, 0, 0, 0, 3656, 3657, + 3657, 3657, 3657, 0, 0, 3657, 3657, 3658, 3658, 3658, + 0, 0, 0, 3658, 3659, 3659, 3659, 3659, 0, 0, + 3659, 3659, 3660, 3660, 3660, 3660, 0, 3660, 0, 3660, + 3661, 3661, 3661, 3661, 0, 0, 3661, 3661, 3662, 3662, + 3662, 3662, 0, 3662, 0, 3662, 3663, 3663, 3663, 3663, 0, 0, 3663, 3663, 3664, 3664, 3664, 0, 0, 0, + 3664, 3665, 3665, 3665, 3665, 0, 0, 3665, 3665, 3666, - 3666, 3666, 0, 0, 0, 3666, 3667, 3667, 3667, 3667, - 0, 0, 3667, 3667, 3668, 3668, 3668, 3668, 3668, 3668, - 3668, 3668, 3668, 3669, 0, 3669, 0, 0, 3669, 3670, - 3670, 3670, 0, 0, 0, 3670, 3671, 3671, 3671, 3671, - 0, 0, 3671, 3671, 3672, 3672, 3672, 3672, 0, 3672, - - 0, 3672, 3673, 3673, 3673, 3673, 0, 0, 3673, 3673, - 3674, 3674, 3674, 3674, 0, 3674, 0, 3674, 3675, 3675, - 3675, 3675, 0, 0, 3675, 3675, 3676, 3676, 3676, 0, - 0, 0, 3676, 3677, 3677, 3677, 3677, 0, 0, 3677, - 3677, 3678, 3678, 3678, 0, 0, 0, 3678, 3679, 3679, - 3679, 3679, 0, 0, 3679, 3679, 3680, 3680, 3680, 0, - 0, 0, 3680, 3681, 3681, 3681, 3681, 0, 0, 3681, - 3681, 3682, 3682, 3682, 0, 0, 0, 3682, 3683, 3683, - 3683, 3683, 0, 0, 3683, 3683, 3684, 3684, 3684, 0, - 0, 0, 3684, 3685, 3685, 3685, 3685, 0, 0, 3685, - - 3685, 3686, 3686, 3686, 3686, 0, 3686, 0, 3686, 3687, - 3687, 3687, 3687, 0, 0, 3687, 3687, 3688, 3688, 3688, - 3688, 0, 3688, 0, 3688, 3689, 3689, 3689, 3689, 0, - 0, 3689, 3689, 3690, 3690, 3690, 0, 0, 0, 3690, - 3691, 3691, 3691, 3691, 0, 0, 3691, 3691, 3692, 3692, - 3692, 3692, 0, 3692, 0, 3692, 3693, 3693, 3693, 3693, - 0, 0, 3693, 3693, 3694, 3694, 3694, 3694, 0, 3694, - 0, 3694, 3695, 3695, 3695, 3695, 0, 0, 3695, 3695, - 3696, 3696, 3696, 0, 0, 0, 3696, 3697, 3697, 3697, - 3697, 0, 0, 3697, 3697, 3698, 3698, 3698, 0, 0, - - 0, 3698, 3699, 3699, 3699, 3699, 0, 0, 3699, 3699, - 3700, 3700, 3700, 0, 0, 0, 3700, 3701, 3701, 3701, - 3701, 0, 0, 3701, 3701, 3702, 3702, 3702, 0, 0, - 0, 3702, 3703, 3703, 3703, 3703, 0, 0, 3703, 3703, - 3704, 3704, 3704, 0, 0, 0, 3704, 3705, 3705, 3705, - 3705, 0, 0, 3705, 3705, 3706, 3706, 3706, 0, 0, - 0, 3706, 3707, 3707, 3707, 3707, 0, 0, 3707, 3707, - 3708, 3708, 3708, 0, 0, 0, 3708, 3709, 3709, 3709, - 3709, 0, 0, 3709, 3709, 3710, 3710, 3710, 0, 0, - 0, 3710, 3711, 3711, 3711, 3711, 0, 0, 3711, 3711, - - 3712, 3712, 3712, 0, 0, 0, 3712, 3713, 3713, 3713, - 3713, 0, 0, 3713, 3713, 3714, 3714, 3714, 3714, 0, - 0, 3714, 3714, 3715, 3715, 3715, 0, 0, 0, 3715, - 3716, 3716, 3716, 3716, 0, 0, 3716, 3716, 3717, 3717, - 3717, 0, 0, 0, 3717, 3718, 3718, 3718, 3718, 0, - 0, 3718, 3718, 3719, 3719, 3719, 0, 0, 0, 3719, - 3720, 3720, 3720, 3720, 0, 0, 3720, 3720, 3721, 3721, - 3721, 3721, 0, 0, 3721, 3721, 3722, 3722, 3722, 0, - 0, 0, 3722, 3723, 3723, 3723, 3723, 0, 0, 3723, - 3723, 3724, 3724, 3724, 0, 0, 0, 3724, 3725, 3725, - - 3725, 3725, 0, 0, 3725, 3725, 3726, 3726, 3726, 3726, - 3726, 3726, 3726, 3726, 3726, 3727, 3727, 3727, 3727, 3727, - 3727, 3727, 3727, 3727, 3728, 3728, 3728, 0, 0, 0, - 3728, 3729, 3729, 3729, 3729, 0, 0, 3729, 3729, 3730, - 3730, 3730, 3730, 0, 0, 3730, 3730, 3731, 3731, 3731, - 0, 0, 0, 3731, 3732, 3732, 3732, 3732, 0, 0, - 3732, 3732, 3733, 3733, 3733, 0, 0, 0, 3733, 3734, - 3734, 3734, 3734, 0, 0, 3734, 3734, 3735, 3735, 3735, - 0, 0, 0, 3735, 3736, 3736, 3736, 3736, 0, 0, - 3736, 3736, 3737, 3737, 3737, 0, 0, 0, 3737, 3738, - - 3738, 3738, 0, 0, 0, 3738, 3739, 3739, 3739, 3739, - 0, 0, 3739, 3739, 3740, 3740, 3740, 0, 0, 0, - 3740, 3741, 3741, 3741, 3741, 0, 0, 3741, 3741, 3742, - 3742, 3742, 0, 0, 0, 3742, 3743, 3743, 3743, 3743, - 0, 0, 3743, 3743, 3744, 3744, 3744, 0, 0, 0, - 3744, 3745, 3745, 3745, 3745, 0, 0, 3745, 3745, 3746, - 3746, 3746, 0, 0, 0, 3746, 3747, 3747, 3747, 3747, - 0, 0, 3747, 3747, 3748, 3748, 3748, 3748, 0, 0, - 3748, 3748, 3749, 3749, 3749, 3749, 0, 0, 3749, 3749, - 3750, 3750, 3750, 0, 0, 0, 3750, 3751, 3751, 3751, - - 3751, 0, 0, 3751, 3751, 3752, 3752, 3752, 3752, 0, - 3752, 0, 3752, 3753, 3753, 3753, 3753, 0, 0, 3753, - 3753, 3754, 3754, 3754, 0, 0, 0, 3754, 3755, 3755, - 3755, 3755, 0, 0, 3755, 3755, 3756, 3756, 3756, 0, - 0, 0, 3756, 3757, 3757, 3757, 3757, 0, 0, 3757, - 3757, 3758, 3758, 3758, 0, 0, 0, 3758, 3759, 3759, - 3759, 3759, 0, 0, 3759, 3759, 3760, 3760, 3760, 0, - 0, 0, 3760, 3761, 3761, 3761, 3761, 0, 0, 3761, - 3761, 3762, 3762, 3762, 0, 0, 0, 3762, 3763, 3763, - 3763, 3763, 0, 0, 3763, 3763, 3764, 3764, 3764, 0, - - 0, 0, 3764, 3765, 3765, 3765, 3765, 0, 0, 3765, - 3765, 3766, 3766, 3766, 0, 0, 0, 3766, 3767, 3767, - 3767, 3767, 0, 0, 3767, 3767, 3768, 3768, 3768, 3768, - 0, 0, 3768, 3768, 3769, 3769, 3769, 0, 0, 0, - 3769, 3770, 3770, 3770, 3770, 0, 0, 3770, 3770, 3771, - 3771, 3771, 0, 0, 0, 3771, 3772, 3772, 3772, 3772, - 0, 0, 3772, 3772, 3773, 3773, 3773, 3773, 0, 3773, - 0, 3773, 3774, 3774, 3774, 3774, 0, 0, 3774, 3774, - 3775, 3775, 3775, 3775, 0, 0, 3775, 3775, 3776, 3776, - 3776, 3776, 0, 3776, 0, 3776, 3777, 3777, 3777, 3777, - - 0, 0, 3777, 3777, 3778, 3778, 3778, 3778, 0, 3778, - 0, 3778, 3779, 3779, 3779, 3779, 0, 0, 3779, 3779, - 3780, 3780, 3780, 3780, 3780, 3780, 3780, 3780, 3780, 3781, - 3781, 3781, 3781, 3781, 3781, 3781, 3781, 3781, 3782, 3782, - 3782, 0, 0, 0, 3782, 3783, 3783, 3783, 3783, 0, - 0, 3783, 3783, 3784, 3784, 3784, 3784, 0, 0, 3784, - 3784, 3785, 3785, 3785, 0, 0, 0, 3785, 3786, 3786, - 3786, 3786, 0, 0, 3786, 3786, 3787, 3787, 3787, 0, - 0, 0, 3787, 3788, 3788, 3788, 3788, 0, 0, 3788, - 3788, 3789, 3789, 3789, 0, 0, 0, 3789, 3790, 3790, - - 3790, 3790, 0, 0, 3790, 3790, 3791, 3791, 3791, 0, - 0, 0, 3791, 3792, 3792, 3792, 0, 0, 0, 3792, - 3793, 3793, 3793, 3793, 0, 0, 3793, 3793, 3794, 3794, - 3794, 0, 0, 0, 3794, 3795, 3795, 3795, 3795, 0, - 0, 3795, 3795, 3796, 3796, 3796, 0, 0, 0, 3796, - 3797, 3797, 3797, 3797, 0, 0, 3797, 3797, 3798, 3798, - 3798, 3798, 0, 3798, 0, 3798, 3799, 3799, 3799, 3799, - 0, 0, 3799, 3799, 3800, 3800, 3800, 0, 0, 0, - 3800, 3801, 3801, 3801, 3801, 0, 0, 3801, 3801, 3802, - 3802, 3802, 3802, 0, 0, 3802, 3802, 3803, 3803, 3803, - - 0, 0, 0, 3803, 3804, 3804, 3804, 3804, 0, 0, - 3804, 3804, 3805, 3805, 3805, 3805, 0, 3805, 0, 3805, + 3666, 3666, 3666, 0, 3666, 0, 3666, 3667, 3667, 3667, + 3667, 0, 0, 3667, 3667, 3668, 3668, 3668, 3668, 0, + 3668, 0, 3668, 3669, 3669, 3669, 3669, 0, 0, 3669, + 3669, 3670, 3670, 3670, 0, 0, 0, 3670, 3671, 3671, + 3671, 3671, 0, 0, 3671, 3671, 3672, 3672, 3672, 0, + 0, 0, 3672, 3673, 3673, 3673, 3673, 0, 0, 3673, + 3673, 3674, 3674, 3674, 3674, 0, 0, 3674, 3674, 3675, + 3675, 3675, 0, 0, 0, 3675, 3676, 3676, 3676, 3676, + 0, 0, 3676, 3676, 3677, 3677, 3677, 0, 0, 0, + + 3677, 3678, 3678, 3678, 3678, 0, 0, 3678, 3678, 3679, + 3679, 3679, 3679, 3679, 3679, 3679, 3679, 3679, 3680, 0, + 3680, 0, 0, 3680, 3681, 3681, 3681, 0, 0, 0, + 3681, 3682, 3682, 3682, 3682, 0, 0, 3682, 3682, 3683, + 3683, 3683, 3683, 0, 3683, 0, 3683, 3684, 3684, 3684, + 3684, 0, 0, 3684, 3684, 3685, 3685, 3685, 3685, 0, + 3685, 0, 3685, 3686, 3686, 3686, 3686, 0, 0, 3686, + 3686, 3687, 3687, 3687, 0, 0, 0, 3687, 3688, 3688, + 3688, 3688, 0, 0, 3688, 3688, 3689, 3689, 3689, 0, + 0, 0, 3689, 3690, 3690, 3690, 3690, 0, 0, 3690, + + 3690, 3691, 3691, 3691, 0, 0, 0, 3691, 3692, 3692, + 3692, 3692, 0, 0, 3692, 3692, 3693, 3693, 3693, 0, + 0, 0, 3693, 3694, 3694, 3694, 3694, 0, 0, 3694, + 3694, 3695, 3695, 3695, 3695, 0, 3695, 0, 3695, 3696, + 3696, 3696, 3696, 0, 0, 3696, 3696, 3697, 3697, 3697, + 3697, 0, 3697, 0, 3697, 3698, 3698, 3698, 3698, 0, + 0, 3698, 3698, 3699, 3699, 3699, 0, 0, 0, 3699, + 3700, 3700, 3700, 3700, 0, 0, 3700, 3700, 3701, 3701, + 3701, 0, 0, 0, 3701, 3702, 3702, 3702, 3702, 0, + 0, 3702, 3702, 3703, 3703, 3703, 3703, 0, 3703, 0, + + 3703, 3704, 3704, 3704, 3704, 0, 0, 3704, 3704, 3705, + 3705, 3705, 3705, 0, 3705, 0, 3705, 3706, 3706, 3706, + 3706, 0, 0, 3706, 3706, 3707, 3707, 3707, 0, 0, + 0, 3707, 3708, 3708, 3708, 3708, 0, 0, 3708, 3708, + 3709, 3709, 3709, 0, 0, 0, 3709, 3710, 3710, 3710, + 3710, 0, 0, 3710, 3710, 3711, 3711, 3711, 0, 0, + 0, 3711, 3712, 3712, 3712, 3712, 0, 0, 3712, 3712, + 3713, 3713, 3713, 0, 0, 0, 3713, 3714, 3714, 3714, + 3714, 0, 0, 3714, 3714, 3715, 3715, 3715, 0, 0, + 0, 3715, 3716, 3716, 3716, 3716, 0, 0, 3716, 3716, + + 3717, 3717, 3717, 0, 0, 0, 3717, 3718, 3718, 3718, + 3718, 0, 0, 3718, 3718, 3719, 3719, 3719, 0, 0, + 0, 3719, 3720, 3720, 3720, 3720, 0, 0, 3720, 3720, + 3721, 3721, 3721, 0, 0, 0, 3721, 3722, 3722, 3722, + 3722, 0, 0, 3722, 3722, 3723, 3723, 3723, 0, 0, + 0, 3723, 3724, 3724, 3724, 3724, 0, 0, 3724, 3724, + 3725, 3725, 3725, 3725, 0, 0, 3725, 3725, 3726, 3726, + 3726, 0, 0, 0, 3726, 3727, 3727, 3727, 3727, 0, + 0, 3727, 3727, 3728, 3728, 3728, 0, 0, 0, 3728, + 3729, 3729, 3729, 3729, 0, 0, 3729, 3729, 3730, 3730, + + 3730, 0, 0, 0, 3730, 3731, 3731, 3731, 3731, 0, + 0, 3731, 3731, 3732, 3732, 3732, 3732, 0, 0, 3732, + 3732, 3733, 3733, 3733, 0, 0, 0, 3733, 3734, 3734, + 3734, 3734, 0, 0, 3734, 3734, 3735, 3735, 3735, 0, + 0, 0, 3735, 3736, 3736, 3736, 3736, 0, 0, 3736, + 3736, 3737, 3737, 3737, 3737, 3737, 3737, 3737, 3737, 3737, + 3738, 3738, 3738, 3738, 3738, 3738, 3738, 3738, 3738, 3739, + 3739, 3739, 0, 0, 0, 3739, 3740, 3740, 3740, 3740, + 0, 0, 3740, 3740, 3741, 3741, 3741, 3741, 0, 0, + 3741, 3741, 3742, 3742, 3742, 0, 0, 0, 3742, 3743, + + 3743, 3743, 3743, 0, 0, 3743, 3743, 3744, 3744, 3744, + 0, 0, 0, 3744, 3745, 3745, 3745, 3745, 0, 0, + 3745, 3745, 3746, 3746, 3746, 0, 0, 0, 3746, 3747, + 3747, 3747, 3747, 0, 0, 3747, 3747, 3748, 3748, 3748, + 0, 0, 0, 3748, 3749, 3749, 3749, 0, 0, 0, + 3749, 3750, 3750, 3750, 3750, 0, 0, 3750, 3750, 3751, + 3751, 3751, 0, 0, 0, 3751, 3752, 3752, 3752, 3752, + 0, 0, 3752, 3752, 3753, 3753, 3753, 0, 0, 0, + 3753, 3754, 3754, 3754, 3754, 0, 0, 3754, 3754, 3755, + 3755, 3755, 0, 0, 0, 3755, 3756, 3756, 3756, 3756, + + 0, 0, 3756, 3756, 3757, 3757, 3757, 0, 0, 0, + 3757, 3758, 3758, 3758, 3758, 0, 0, 3758, 3758, 3759, + 3759, 3759, 3759, 0, 0, 3759, 3759, 3760, 3760, 3760, + 3760, 0, 0, 3760, 3760, 3761, 3761, 3761, 0, 0, + 0, 3761, 3762, 3762, 3762, 3762, 0, 0, 3762, 3762, + 3763, 3763, 3763, 3763, 0, 3763, 0, 3763, 3764, 3764, + 3764, 3764, 0, 0, 3764, 3764, 3765, 3765, 3765, 0, + 0, 0, 3765, 3766, 3766, 3766, 3766, 0, 0, 3766, + 3766, 3767, 3767, 3767, 0, 0, 0, 3767, 3768, 3768, + 3768, 3768, 0, 0, 3768, 3768, 3769, 3769, 3769, 0, + + 0, 0, 3769, 3770, 3770, 3770, 3770, 0, 0, 3770, + 3770, 3771, 3771, 3771, 0, 0, 0, 3771, 3772, 3772, + 3772, 3772, 0, 0, 3772, 3772, 3773, 3773, 3773, 0, + 0, 0, 3773, 3774, 3774, 3774, 3774, 0, 0, 3774, + 3774, 3775, 3775, 3775, 0, 0, 0, 3775, 3776, 3776, + 3776, 3776, 0, 0, 3776, 3776, 3777, 3777, 3777, 0, + 0, 0, 3777, 3778, 3778, 3778, 3778, 0, 0, 3778, + 3778, 3779, 3779, 3779, 3779, 0, 0, 3779, 3779, 3780, + 3780, 3780, 0, 0, 0, 3780, 3781, 3781, 3781, 3781, + 0, 0, 3781, 3781, 3782, 3782, 3782, 0, 0, 0, + + 3782, 3783, 3783, 3783, 3783, 0, 0, 3783, 3783, 3784, + 3784, 3784, 3784, 0, 3784, 0, 3784, 3785, 3785, 3785, + 3785, 0, 0, 3785, 3785, 3786, 3786, 3786, 3786, 0, + 0, 3786, 3786, 3787, 3787, 3787, 3787, 0, 3787, 0, + 3787, 3788, 3788, 3788, 3788, 0, 0, 3788, 3788, 3789, + 3789, 3789, 3789, 0, 3789, 0, 3789, 3790, 3790, 3790, + 3790, 0, 0, 3790, 3790, 3791, 3791, 3791, 3791, 3791, + 3791, 3791, 3791, 3791, 3792, 3792, 3792, 3792, 3792, 3792, + 3792, 3792, 3792, 3793, 3793, 3793, 0, 0, 0, 3793, + 3794, 3794, 3794, 3794, 0, 0, 3794, 3794, 3795, 3795, + + 3795, 3795, 0, 0, 3795, 3795, 3796, 3796, 3796, 0, + 0, 0, 3796, 3797, 3797, 3797, 3797, 0, 0, 3797, + 3797, 3798, 3798, 3798, 0, 0, 0, 3798, 3799, 3799, + 3799, 3799, 0, 0, 3799, 3799, 3800, 3800, 3800, 0, + 0, 0, 3800, 3801, 3801, 3801, 3801, 0, 0, 3801, + 3801, 3802, 3802, 3802, 0, 0, 0, 3802, 3803, 3803, + 3803, 0, 0, 0, 3803, 3804, 3804, 3804, 3804, 0, + 0, 3804, 3804, 3805, 3805, 3805, 0, 0, 0, 3805, 3806, 3806, 3806, 3806, 0, 0, 3806, 3806, 3807, 3807, - 3807, 0, 0, 0, 3807, 3808, 3808, 3808, 3808, 0, - 0, 3808, 3808, 3809, 3809, 3809, 0, 0, 0, 3809, - 3810, 3810, 3810, 3810, 0, 0, 3810, 3810, 3811, 3811, - 3811, 0, 0, 0, 3811, 3812, 3812, 3812, 3812, 0, - 0, 3812, 3812, 3813, 3813, 3813, 0, 0, 0, 3813, - 3814, 3814, 3814, 3814, 0, 0, 3814, 3814, 3815, 3815, - 3815, 0, 0, 0, 3815, 3816, 3816, 3816, 3816, 0, - - 0, 3816, 3816, 3817, 3817, 3817, 3817, 0, 3817, 0, - 3817, 3818, 3818, 3818, 3818, 0, 0, 3818, 3818, 3819, - 3819, 3819, 0, 0, 0, 3819, 3820, 3820, 3820, 3820, - 0, 0, 3820, 3820, 3821, 3821, 3821, 3821, 0, 0, - 3821, 3821, 3822, 3822, 3822, 3822, 0, 3822, 0, 3822, - 3823, 3823, 3823, 3823, 0, 0, 3823, 3823, 3824, 3824, - 3824, 0, 0, 0, 3824, 3825, 3825, 3825, 3825, 0, - 0, 3825, 3825, 3826, 3826, 3826, 3826, 0, 0, 3826, + 3807, 3807, 0, 3807, 0, 3807, 3808, 3808, 3808, 3808, + + 0, 0, 3808, 3808, 3809, 3809, 3809, 0, 0, 0, + 3809, 3810, 3810, 3810, 3810, 0, 0, 3810, 3810, 3811, + 3811, 3811, 3811, 0, 3811, 0, 3811, 3812, 3812, 3812, + 3812, 0, 0, 3812, 3812, 3813, 3813, 3813, 3813, 0, + 0, 3813, 3813, 3814, 3814, 3814, 0, 0, 0, 3814, + 3815, 3815, 3815, 3815, 0, 0, 3815, 3815, 3816, 3816, + 3816, 3816, 0, 3816, 0, 3816, 3817, 3817, 3817, 3817, + 0, 0, 3817, 3817, 3818, 3818, 3818, 0, 0, 0, + 3818, 3819, 3819, 3819, 3819, 0, 0, 3819, 3819, 3820, + 3820, 3820, 0, 0, 0, 3820, 3821, 3821, 3821, 3821, + + 0, 0, 3821, 3821, 3822, 3822, 3822, 0, 0, 0, + 3822, 3823, 3823, 3823, 3823, 0, 0, 3823, 3823, 3824, + 3824, 3824, 0, 0, 0, 3824, 3825, 3825, 3825, 3825, + 0, 0, 3825, 3825, 3826, 3826, 3826, 0, 0, 0, 3826, 3827, 3827, 3827, 3827, 0, 0, 3827, 3827, 3828, - 3828, 3828, 3828, 0, 0, 3828, 3828, 3829, 3829, 3829, - - 3829, 0, 0, 3829, 3829, 3830, 3830, 3830, 3830, 3830, - 3830, 3830, 3830, 3830, 3831, 3831, 3831, 3831, 3831, 3831, - 3831, 3831, 3831, 3832, 3832, 3832, 3832, 0, 3832, 0, - 3832, 3833, 3833, 3833, 3833, 0, 0, 3833, 3833, 3834, - 3834, 3834, 3834, 0, 0, 3834, 3834, 3835, 3835, 3835, - 0, 0, 0, 3835, 3836, 3836, 3836, 3836, 0, 0, - 3836, 3836, 3837, 3837, 3837, 0, 0, 0, 3837, 3838, - 3838, 3838, 3838, 0, 0, 3838, 3838, 3839, 3839, 3839, - 3839, 0, 3839, 0, 3839, 3840, 3840, 3840, 3840, 0, - 0, 3840, 3840, 3841, 3841, 3841, 3841, 0, 3841, 0, - - 3841, 3842, 3842, 3842, 3842, 0, 3842, 0, 3842, 3843, - 3843, 3843, 3843, 0, 0, 3843, 3843, 3844, 3844, 3844, - 3844, 0, 3844, 0, 3844, 3845, 3845, 3845, 3845, 0, + 3828, 3828, 3828, 0, 3828, 0, 3828, 3829, 3829, 3829, + 3829, 0, 0, 3829, 3829, 3830, 3830, 3830, 0, 0, + 0, 3830, 3831, 3831, 3831, 3831, 0, 0, 3831, 3831, + 3832, 3832, 3832, 3832, 0, 0, 3832, 3832, 3833, 3833, + 3833, 3833, 0, 3833, 0, 3833, 3834, 3834, 3834, 3834, + + 0, 0, 3834, 3834, 3835, 3835, 3835, 0, 0, 0, + 3835, 3836, 3836, 3836, 3836, 0, 0, 3836, 3836, 3837, + 3837, 3837, 3837, 0, 0, 3837, 3837, 3838, 3838, 3838, + 3838, 0, 0, 3838, 3838, 3839, 3839, 3839, 3839, 0, + 0, 3839, 3839, 3840, 3840, 3840, 3840, 0, 0, 3840, + 3840, 3841, 3841, 3841, 3841, 3841, 3841, 3841, 3841, 3841, + 3842, 3842, 3842, 3842, 3842, 3842, 3842, 3842, 3842, 3843, + 3843, 3843, 3843, 0, 3843, 0, 3843, 3844, 3844, 3844, + 3844, 0, 0, 3844, 3844, 3845, 3845, 3845, 3845, 0, 0, 3845, 3845, 3846, 3846, 3846, 0, 0, 0, 3846, + 3847, 3847, 3847, 3847, 0, 0, 3847, 3847, 3848, 3848, - 3848, 3848, 0, 0, 3848, 3848, 3849, 3849, 3849, 0, - 0, 0, 3849, 3850, 3850, 3850, 3850, 0, 0, 3850, - 3850, 3851, 3851, 3851, 0, 0, 0, 3851, 3852, 3852, - 3852, 3852, 0, 0, 3852, 3852, 3853, 3853, 3853, 3853, - 0, 3853, 0, 3853, 3854, 3854, 3854, 3854, 0, 0, - - 3854, 3854, 3855, 3855, 3855, 0, 0, 0, 3855, 3856, - 3856, 3856, 0, 0, 0, 3856, 3857, 3857, 3857, 3857, - 0, 0, 3857, 3857, 3858, 3858, 3858, 0, 0, 0, - 3858, 3859, 3859, 3859, 3859, 0, 0, 3859, 3859, 3860, - 3860, 3860, 0, 0, 0, 3860, 3861, 3861, 3861, 0, - 0, 0, 3861, 3862, 3862, 3862, 3862, 0, 0, 3862, - 3862, 3863, 3863, 3863, 0, 0, 0, 3863, 3864, 3864, - 3864, 3864, 0, 0, 3864, 3864, 3865, 3865, 3865, 0, - 0, 0, 3865, 3866, 3866, 3866, 3866, 0, 0, 3866, - 3866, 3867, 3867, 3867, 3867, 0, 0, 3867, 3867, 3868, - - 3868, 3868, 3868, 0, 0, 3868, 3868, 3869, 3869, 3869, - 0, 0, 0, 3869, 3870, 3870, 3870, 3870, 0, 0, - 3870, 3870, 3871, 3871, 3871, 3871, 0, 0, 3871, 3871, - 3872, 3872, 3872, 3872, 0, 0, 3872, 3872, 3873, 3873, - 3873, 3873, 0, 0, 3873, 3873, 3874, 3874, 3874, 3874, - 3874, 3874, 3874, 3874, 3874, 3875, 3875, 3875, 3875, 3875, - 3875, 3875, 3875, 3875, 3876, 3876, 3876, 3876, 0, 0, - 3876, 3876, 3877, 3877, 3877, 3877, 0, 0, 3877, 3877, - 3878, 3878, 3878, 0, 0, 0, 3878, 3879, 3879, 3879, - 0, 0, 0, 3879, 3880, 3880, 3880, 3880, 0, 0, - - 3880, 3880, 3881, 3881, 3881, 3881, 0, 0, 3881, 3881, - 3882, 3882, 3882, 0, 0, 0, 3882, 3883, 3883, 3883, - 3883, 0, 0, 3883, 3883, 3884, 3884, 3884, 0, 0, - 0, 3884, 3885, 3885, 3885, 3885, 0, 0, 3885, 3885, - 3886, 3886, 3886, 0, 0, 0, 3886, 3887, 3887, 3887, - 3887, 0, 0, 3887, 3887, 3888, 3888, 3888, 0, 0, - 0, 3888, 3889, 3889, 3889, 3889, 0, 0, 3889, 3889, - 3890, 3890, 3890, 0, 0, 0, 3890, 3891, 3891, 3891, - 3891, 0, 0, 3891, 3891, 3892, 3892, 3892, 3892, 0, - 0, 3892, 3892, 3893, 3893, 3893, 0, 0, 0, 3893, - - 3894, 3894, 3894, 0, 0, 0, 3894, 3895, 3895, 3895, - 3895, 0, 0, 3895, 3895, 3896, 3896, 3896, 0, 0, - 0, 3896, 3897, 3897, 3897, 3897, 0, 0, 3897, 3897, - 3898, 3898, 3898, 0, 0, 0, 3898, 3899, 3899, 3899, - 0, 0, 0, 3899, 3900, 3900, 3900, 0, 0, 0, - 3900, 3901, 3901, 3901, 3901, 0, 0, 3901, 3901, 3902, - 3902, 3902, 0, 0, 0, 3902, 3903, 3903, 3903, 3903, - 0, 0, 3903, 3903, 3904, 3904, 3904, 3904, 0, 0, - 3904, 3904, 3905, 3905, 3905, 3905, 0, 0, 3905, 3905, - 3906, 3906, 3906, 3906, 0, 3906, 0, 3906, 3907, 3907, - - 3907, 3907, 0, 0, 3907, 3907, 3908, 3908, 3908, 3908, - 0, 0, 3908, 3908, 3909, 3909, 3909, 3909, 0, 0, - 3909, 3909, 3910, 3910, 3910, 3910, 0, 0, 3910, 3910, - 3911, 3911, 3911, 3911, 3911, 3911, 3911, 3911, 3911, 3912, - 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3913, 3913, - 3913, 3913, 0, 0, 3913, 3913, 3914, 3914, 3914, 3914, - 0, 0, 3914, 3914, 3915, 3915, 3915, 0, 0, 0, - 3915, 3916, 3916, 3916, 3916, 0, 3916, 0, 3916, 3917, - 3917, 3917, 3917, 0, 0, 3917, 3917, 3918, 3918, 3918, - 0, 0, 0, 3918, 3919, 3919, 3919, 3919, 0, 0, - - 3919, 3919, 3920, 3920, 3920, 0, 0, 0, 3920, 3921, - 3921, 3921, 3921, 0, 0, 3921, 3921, 3922, 3922, 3922, - 3922, 0, 3922, 0, 3922, 3923, 3923, 3923, 3923, 0, - 0, 3923, 3923, 3924, 3924, 3924, 0, 0, 0, 3924, - 3925, 3925, 3925, 3925, 0, 0, 3925, 3925, 3926, 3926, - 3926, 0, 0, 0, 3926, 3927, 3927, 3927, 3927, 0, - 0, 3927, 3927, 3928, 3928, 3928, 3928, 0, 0, 3928, - 3928, 3929, 3929, 3929, 0, 0, 0, 3929, 3930, 3930, - 3930, 0, 0, 0, 3930, 3931, 3931, 3931, 3931, 0, - 3931, 0, 3931, 3932, 3932, 3932, 3932, 0, 0, 3932, - - 3932, 3933, 3933, 3933, 3933, 0, 3933, 0, 3933, 3934, - 3934, 3934, 0, 0, 0, 3934, 3935, 3935, 3935, 0, - 0, 0, 3935, 3936, 3936, 3936, 3936, 0, 0, 3936, - 3936, 3937, 3937, 3937, 3937, 0, 3937, 0, 3937, 3938, - 3938, 3938, 3938, 0, 0, 3938, 3938, 3939, 3939, 3939, - 3939, 0, 0, 3939, 3939, 3940, 3940, 3940, 3940, 0, - 0, 3940, 3940, 3941, 3941, 3941, 3941, 0, 3941, 0, - 3941, 3942, 3942, 3942, 3942, 0, 0, 3942, 3942, 3943, + 3848, 0, 0, 0, 3848, 3849, 3849, 3849, 3849, 0, + 0, 3849, 3849, 3850, 3850, 3850, 3850, 0, 3850, 0, + 3850, 3851, 3851, 3851, 3851, 0, 0, 3851, 3851, 3852, + 3852, 3852, 3852, 0, 3852, 0, 3852, 3853, 3853, 3853, + 3853, 0, 3853, 0, 3853, 3854, 3854, 3854, 3854, 0, + 0, 3854, 3854, 3855, 3855, 3855, 0, 0, 0, 3855, + 3856, 3856, 3856, 3856, 0, 0, 3856, 3856, 3857, 3857, + 3857, 3857, 0, 0, 3857, 3857, 3858, 3858, 3858, 0, + 0, 0, 3858, 3859, 3859, 3859, 3859, 0, 3859, 0, + + 3859, 3860, 3860, 3860, 3860, 0, 0, 3860, 3860, 3861, + 3861, 3861, 3861, 0, 0, 3861, 3861, 3862, 3862, 3862, + 0, 0, 0, 3862, 3863, 3863, 3863, 3863, 0, 0, + 3863, 3863, 3864, 3864, 3864, 3864, 0, 3864, 0, 3864, + 3865, 3865, 3865, 3865, 0, 0, 3865, 3865, 3866, 3866, + 3866, 0, 0, 0, 3866, 3867, 3867, 3867, 0, 0, + 0, 3867, 3868, 3868, 3868, 3868, 0, 0, 3868, 3868, + 3869, 3869, 3869, 0, 0, 0, 3869, 3870, 3870, 3870, + 3870, 0, 0, 3870, 3870, 3871, 3871, 3871, 0, 0, + 0, 3871, 3872, 3872, 3872, 0, 0, 0, 3872, 3873, + + 3873, 3873, 3873, 0, 0, 3873, 3873, 3874, 3874, 3874, + 0, 0, 0, 3874, 3875, 3875, 3875, 3875, 0, 0, + 3875, 3875, 3876, 3876, 3876, 0, 0, 0, 3876, 3877, + 3877, 3877, 3877, 0, 0, 3877, 3877, 3878, 3878, 3878, + 3878, 0, 0, 3878, 3878, 3879, 3879, 3879, 3879, 0, + 0, 3879, 3879, 3880, 3880, 3880, 0, 0, 0, 3880, + 3881, 3881, 3881, 3881, 0, 0, 3881, 3881, 3882, 3882, + 3882, 3882, 0, 0, 3882, 3882, 3883, 3883, 3883, 3883, + 0, 0, 3883, 3883, 3884, 3884, 3884, 3884, 0, 0, + 3884, 3884, 3885, 3885, 3885, 3885, 3885, 3885, 3885, 3885, + + 3885, 3886, 3886, 3886, 3886, 3886, 3886, 3886, 3886, 3886, + 3887, 3887, 3887, 3887, 0, 0, 3887, 3887, 3888, 3888, + 3888, 3888, 0, 0, 3888, 3888, 3889, 3889, 3889, 0, + 0, 0, 3889, 3890, 3890, 3890, 0, 0, 0, 3890, + 3891, 3891, 3891, 3891, 0, 0, 3891, 3891, 3892, 3892, + 3892, 3892, 0, 0, 3892, 3892, 3893, 3893, 3893, 0, + 0, 0, 3893, 3894, 3894, 3894, 3894, 0, 0, 3894, + 3894, 3895, 3895, 3895, 0, 0, 0, 3895, 3896, 3896, + 3896, 3896, 0, 0, 3896, 3896, 3897, 3897, 3897, 0, + 0, 0, 3897, 3898, 3898, 3898, 0, 0, 0, 3898, + + 3899, 3899, 3899, 3899, 0, 0, 3899, 3899, 3900, 3900, + 3900, 3900, 0, 0, 3900, 3900, 3901, 3901, 3901, 0, + 0, 0, 3901, 3902, 3902, 3902, 3902, 0, 0, 3902, + 3902, 3903, 3903, 3903, 3903, 0, 0, 3903, 3903, 3904, + 3904, 3904, 0, 0, 0, 3904, 3905, 3905, 3905, 0, + 0, 0, 3905, 3906, 3906, 3906, 3906, 0, 0, 3906, + 3906, 3907, 3907, 3907, 0, 0, 0, 3907, 3908, 3908, + 3908, 3908, 0, 0, 3908, 3908, 3909, 3909, 3909, 0, + 0, 0, 3909, 3910, 3910, 3910, 0, 0, 0, 3910, + 3911, 3911, 3911, 0, 0, 0, 3911, 3912, 3912, 3912, + + 3912, 0, 0, 3912, 3912, 3913, 3913, 3913, 0, 0, + 0, 3913, 3914, 3914, 3914, 3914, 0, 0, 3914, 3914, + 3915, 3915, 3915, 3915, 0, 0, 3915, 3915, 3916, 3916, + 3916, 3916, 0, 0, 3916, 3916, 3917, 3917, 3917, 3917, + 0, 3917, 0, 3917, 3918, 3918, 3918, 3918, 0, 0, + 3918, 3918, 3919, 3919, 3919, 3919, 0, 0, 3919, 3919, + 3920, 3920, 3920, 3920, 0, 0, 3920, 3920, 3921, 3921, + 3921, 3921, 0, 0, 3921, 3921, 3922, 3922, 3922, 3922, + 3922, 3922, 3922, 3922, 3922, 3923, 3923, 3923, 3923, 3923, + 3923, 3923, 3923, 3923, 3924, 3924, 3924, 3924, 0, 0, + + 3924, 3924, 3925, 3925, 3925, 3925, 0, 0, 3925, 3925, + 3926, 3926, 3926, 0, 0, 0, 3926, 3927, 3927, 3927, + 3927, 0, 3927, 0, 3927, 3928, 3928, 3928, 3928, 0, + 0, 3928, 3928, 3929, 3929, 3929, 0, 0, 0, 3929, + 3930, 3930, 3930, 3930, 0, 0, 3930, 3930, 3931, 3931, + 3931, 3931, 0, 3931, 0, 3931, 3932, 3932, 3932, 3932, + 0, 0, 3932, 3932, 3933, 3933, 3933, 0, 0, 0, + 3933, 3934, 3934, 3934, 0, 0, 0, 3934, 3935, 3935, + 3935, 3935, 0, 0, 3935, 3935, 3936, 3936, 3936, 3936, + 0, 0, 3936, 3936, 3937, 3937, 3937, 0, 0, 0, + + 3937, 3938, 3938, 3938, 3938, 0, 0, 3938, 3938, 3939, + 3939, 3939, 3939, 0, 0, 3939, 3939, 3940, 3940, 3940, + 0, 0, 0, 3940, 3941, 3941, 3941, 0, 0, 0, + 3941, 3942, 3942, 3942, 3942, 0, 3942, 0, 3942, 3943, 3943, 3943, 3943, 0, 0, 3943, 3943, 3944, 3944, 3944, - 3944, 0, 0, 3944, 3944, 3945, 3945, 3945, 3945, 3945, - - 3945, 3945, 3945, 3945, 3946, 3946, 3946, 3946, 3946, 3946, - 3946, 3946, 3946, 3947, 3947, 3947, 3947, 0, 0, 3947, - 3947, 3948, 3948, 3948, 0, 0, 0, 3948, 3949, 3949, - 3949, 0, 0, 0, 3949, 3950, 3950, 3950, 3950, 0, - 0, 3950, 3950, 3951, 3951, 3951, 0, 0, 0, 3951, - 3952, 3952, 3952, 3952, 0, 0, 3952, 3952, 3953, 3953, - 3953, 0, 0, 0, 3953, 3954, 3954, 3954, 3954, 0, - 0, 3954, 3954, 3955, 3955, 3955, 0, 0, 0, 3955, - 3956, 3956, 3956, 3956, 0, 0, 3956, 3956, 3957, 3957, - 3957, 0, 0, 0, 3957, 3958, 3958, 3958, 0, 0, - - 0, 3958, 3959, 3959, 3959, 0, 0, 0, 3959, 3960, - 3960, 3960, 3960, 0, 0, 3960, 3960, 3961, 3961, 3961, - 0, 0, 0, 3961, 3962, 3962, 3962, 0, 0, 0, - 3962, 3963, 3963, 3963, 0, 0, 0, 3963, 3964, 3964, - 3964, 3964, 3964, 3964, 3964, 3964, 3964, 3965, 3965, 3965, - 3965, 3965, 3965, 3965, 3965, 3965, 3966, 3966, 3966, 3966, - 3966, 3966, 3966, 3966, 3966, 3967, 3967, 3967, 3967, 3967, - 3967, 3967, 3967, 3967, 3968, 3968, 3968, 3968, 3968, 3968, - 3968, 3968, 3968, 3969, 3969, 3969, 3969, 3969, 3969, 3969, - 3969, 3969, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, - 3457, 3457, 3457, 3457, 3457, 3457, 3457 + 3944, 0, 3944, 0, 3944, 3945, 3945, 3945, 0, 0, + 0, 3945, 3946, 3946, 3946, 0, 0, 0, 3946, 3947, + 3947, 3947, 3947, 0, 0, 3947, 3947, 3948, 3948, 3948, + 3948, 0, 3948, 0, 3948, 3949, 3949, 3949, 3949, 0, + 0, 3949, 3949, 3950, 3950, 3950, 3950, 0, 0, 3950, + + 3950, 3951, 3951, 3951, 3951, 0, 0, 3951, 3951, 3952, + 3952, 3952, 3952, 0, 3952, 0, 3952, 3953, 3953, 3953, + 3953, 0, 0, 3953, 3953, 3954, 3954, 3954, 3954, 0, + 0, 3954, 3954, 3955, 3955, 3955, 3955, 0, 0, 3955, + 3955, 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956, 3956, + 3957, 3957, 3957, 3957, 3957, 3957, 3957, 3957, 3957, 3958, + 3958, 3958, 3958, 0, 0, 3958, 3958, 3959, 3959, 3959, + 0, 0, 0, 3959, 3960, 3960, 3960, 0, 0, 0, + 3960, 3961, 3961, 3961, 3961, 0, 0, 3961, 3961, 3962, + 3962, 3962, 0, 0, 0, 3962, 3963, 3963, 3963, 3963, + + 0, 0, 3963, 3963, 3964, 3964, 3964, 3964, 0, 0, + 3964, 3964, 3965, 3965, 3965, 0, 0, 0, 3965, 3966, + 3966, 3966, 0, 0, 0, 3966, 3967, 3967, 3967, 3967, + 0, 0, 3967, 3967, 3968, 3968, 3968, 0, 0, 0, + 3968, 3969, 3969, 3969, 0, 0, 0, 3969, 3970, 3970, + 3970, 0, 0, 0, 3970, 3971, 3971, 3971, 3971, 0, + 0, 3971, 3971, 3972, 3972, 3972, 0, 0, 0, 3972, + 3973, 3973, 3973, 0, 0, 0, 3973, 3974, 3974, 3974, + 0, 0, 0, 3974, 3975, 3975, 3975, 3975, 3975, 3975, + 3975, 3975, 3975, 3976, 3976, 3976, 3976, 3976, 3976, 3976, + + 3976, 3976, 3977, 3977, 3977, 3977, 3977, 3977, 3977, 3977, + 3977, 3978, 3978, 3978, 3978, 3978, 3978, 3978, 3978, 3978, + 3979, 3979, 3979, 3979, 3979, 3979, 3979, 3979, 3979, 3980, + 3980, 3980, 3980, 3980, 3980, 3980, 3980, 3980, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + + 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, 3468, + 3468, 3468, 3468 } ; /* Table of booleans, true if rule could match eol. */ -static yyconst flex_int32_t yy_rule_can_match_eol[590] = +static yyconst flex_int32_t yy_rule_can_match_eol[592] = { 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, @@ -4524,29 +4539,29 @@ static yyconst flex_int32_t yy_rule_can_match_eol[590] = 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, - 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, - 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, - 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, - 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, - 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, - 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, - 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, - 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, - 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, - 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, }; + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, + 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, + 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, + 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, }; static yy_state_type yy_last_accepting_state; static char *yy_last_accepting_cpos; @@ -4797,6 +4812,9 @@ short int surfxml_random_mean_isset; AT_surfxml_storage___type_size AX_surfxml_storage___type_size; #define A_surfxml_storage___type_size (surfxml_bufferstack + AX_surfxml_storage___type_size) short int surfxml_storage___type_size_isset; +AT_surfxml_storage_attach AX_surfxml_storage_attach; +#define A_surfxml_storage_attach (surfxml_bufferstack + AX_surfxml_storage_attach) +short int surfxml_storage_attach_isset; AT_surfxml_cluster_bb___lat AX_surfxml_cluster_bb___lat; #define A_surfxml_cluster_bb___lat (surfxml_bufferstack + AX_surfxml_cluster_bb___lat) short int surfxml_cluster_bb___lat_isset; @@ -4914,15 +4932,15 @@ short int surfxml_peer_id_isset; AT_surfxml_cabinet_radical AX_surfxml_cabinet_radical; #define A_surfxml_cabinet_radical (surfxml_bufferstack + AX_surfxml_cabinet_radical) short int surfxml_cabinet_radical_isset; +AT_surfxml_cluster_loopback___lat AX_surfxml_cluster_loopback___lat; +#define A_surfxml_cluster_loopback___lat (surfxml_bufferstack + AX_surfxml_cluster_loopback___lat) +short int surfxml_cluster_loopback___lat_isset; AT_surfxml_storage_content___type AX_surfxml_storage_content___type; #define A_surfxml_storage_content___type (surfxml_bufferstack + AX_surfxml_storage_content___type) short int surfxml_storage_content___type_isset; AT_surfxml_cluster_router___id AX_surfxml_cluster_router___id; #define A_surfxml_cluster_router___id (surfxml_bufferstack + AX_surfxml_cluster_router___id) short int surfxml_cluster_router___id_isset; -AT_surfxml_cluster_loopback___lat AX_surfxml_cluster_loopback___lat; -#define A_surfxml_cluster_loopback___lat (surfxml_bufferstack + AX_surfxml_cluster_loopback___lat) -short int surfxml_cluster_loopback___lat_isset; AT_surfxml_cluster_sharing___policy AX_surfxml_cluster_sharing___policy; #define A_surfxml_cluster_sharing___policy AX_surfxml_cluster_sharing___policy short int surfxml_cluster_sharing___policy_isset; @@ -4935,12 +4953,12 @@ short int surfxml_cabinet_power_isset; AT_surfxml_host_core AX_surfxml_host_core; #define A_surfxml_host_core (surfxml_bufferstack + AX_surfxml_host_core) short int surfxml_host_core_isset; -AT_surfxml_storage___type_model AX_surfxml_storage___type_model; -#define A_surfxml_storage___type_model (surfxml_bufferstack + AX_surfxml_storage___type_model) -short int surfxml_storage___type_model_isset; AT_surfxml_host_availability AX_surfxml_host_availability; #define A_surfxml_host_availability (surfxml_bufferstack + AX_surfxml_host_availability) short int surfxml_host_availability_isset; +AT_surfxml_storage___type_model AX_surfxml_storage___type_model; +#define A_surfxml_storage___type_model (surfxml_bufferstack + AX_surfxml_storage___type_model) +short int surfxml_storage___type_model_isset; AT_surfxml_bypassRoute_src AX_surfxml_bypassRoute_src; #define A_surfxml_bypassRoute_src (surfxml_bufferstack + AX_surfxml_bypassRoute_src) short int surfxml_bypassRoute_src_isset; @@ -5206,20 +5224,20 @@ const char* *surfxml_statenames=NULL; #define S_surfxml_storage___type_1 53 #define S_surfxml_storage___type_2 54 #define E_surfxml_storage___type 55 -#define AL_surfxml_storage 56 -#define S_surfxml_storage 57 -#define S_surfxml_storage_1 58 -#define S_surfxml_storage_2 59 -#define E_surfxml_storage 60 -#define AL_surfxml_mount 61 -#define E_surfxml_mount 62 -#define AL_surfxml_mstorage 63 -#define E_surfxml_mstorage 64 -#define AL_surfxml_host 65 -#define S_surfxml_host 66 -#define S_surfxml_host_1 67 -#define S_surfxml_host_2 68 -#define E_surfxml_host 69 +#define AL_surfxml_mount 56 +#define E_surfxml_mount 57 +#define AL_surfxml_mstorage 58 +#define E_surfxml_mstorage 59 +#define AL_surfxml_host 60 +#define S_surfxml_host 61 +#define S_surfxml_host_1 62 +#define S_surfxml_host_2 63 +#define E_surfxml_host 64 +#define AL_surfxml_storage 65 +#define S_surfxml_storage 66 +#define S_surfxml_storage_1 67 +#define S_surfxml_storage_2 68 +#define E_surfxml_storage 69 #define AL_surfxml_gpu 70 #define E_surfxml_gpu 71 #define AL_surfxml_host___link 72 @@ -5501,10 +5519,10 @@ YY_DECL surfxml_bufferliteral('\0', &bnext, "0.0"); surfxml_bufferliteral('\0', &bnext, "2147483647"); surfxml_bufferliteral('\0', &bnext, "txt_unix"); - surfxml_bufferliteral('\0', &bnext, "txt_unix"); surfxml_bufferliteral('\0', &bnext, "1"); surfxml_bufferliteral('\0', &bnext, "1.0"); surfxml_bufferliteral('\0', &bnext, "0.0"); + surfxml_bufferliteral('\0', &bnext, "txt_unix"); surfxml_bufferliteral('\0', &bnext, "1"); surfxml_bufferliteral('\0', &bnext, "0.0"); surfxml_bufferliteral('\0', &bnext, "-1.0"); @@ -5565,11 +5583,6 @@ YY_DECL surfxml_statenames[S_surfxml_storage___type_1] = "storage_type"; surfxml_statenames[S_surfxml_storage___type_2] = "storage_type"; surfxml_statenames[E_surfxml_storage___type] = "storage_type"; - surfxml_statenames[AL_surfxml_storage] = NULL; - surfxml_statenames[S_surfxml_storage] = "storage"; - surfxml_statenames[S_surfxml_storage_1] = "storage"; - surfxml_statenames[S_surfxml_storage_2] = "storage"; - surfxml_statenames[E_surfxml_storage] = "storage"; surfxml_statenames[AL_surfxml_mount] = NULL; surfxml_statenames[E_surfxml_mount] = "mount"; surfxml_statenames[AL_surfxml_mstorage] = NULL; @@ -5579,6 +5592,11 @@ YY_DECL surfxml_statenames[S_surfxml_host_1] = "host"; surfxml_statenames[S_surfxml_host_2] = "host"; surfxml_statenames[E_surfxml_host] = "host"; + surfxml_statenames[AL_surfxml_storage] = NULL; + surfxml_statenames[S_surfxml_storage] = "storage"; + surfxml_statenames[S_surfxml_storage_1] = "storage"; + surfxml_statenames[S_surfxml_storage_2] = "storage"; + surfxml_statenames[E_surfxml_storage] = "storage"; surfxml_statenames[AL_surfxml_gpu] = NULL; surfxml_statenames[E_surfxml_gpu] = "gpu"; surfxml_statenames[AL_surfxml_host___link] = NULL; @@ -5694,13 +5712,13 @@ yy_match: while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 3458 ) + if ( yy_current_state >= 3469 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; ++yy_cp; } - while ( yy_base[yy_current_state] != 12593 ); + while ( yy_base[yy_current_state] != 12639 ); yy_find_action: yy_act = yy_accept[yy_current_state]; @@ -6720,132 +6738,11 @@ if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expecte case 152: /* rule 152 can match eol */ YY_RULE_SETUP -FAIL("Starting tag is not allowed here."); +FAIL("Starting tag is not allowed here."); YY_BREAK case 153: /* rule 153 can match eol */ YY_RULE_SETUP -{ - AX_surfxml_storage_id = 0; - surfxml_storage_id_isset = 0; - AX_surfxml_storage_typeId = 0; - surfxml_storage_typeId_isset = 0; - AX_surfxml_storage_content = 0; - surfxml_storage_content_isset = 0; - AX_surfxml_storage_content___type = 25; - surfxml_storage_content___type_isset = 0; - ENTER(AL_surfxml_storage); pushbuffer(0); - } - YY_BREAK - -case 154: -/* rule 154 can match eol */ -YY_RULE_SETUP -if (surfxml_storage_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_storage_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage_id); - YY_BREAK -case 155: -/* rule 155 can match eol */ -YY_RULE_SETUP -if (surfxml_storage_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_storage_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage_id); - YY_BREAK -case 156: -/* rule 156 can match eol */ -YY_RULE_SETUP -if (surfxml_storage_typeId_isset != 0) {FAIL("Multiple definition of attribute typeId in ");} surfxml_storage_typeId_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage_typeId); - YY_BREAK -case 157: -/* rule 157 can match eol */ -YY_RULE_SETUP -if (surfxml_storage_typeId_isset != 0) {FAIL("Multiple definition of attribute typeId in ");} surfxml_storage_typeId_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage_typeId); - YY_BREAK -case 158: -/* rule 158 can match eol */ -YY_RULE_SETUP -if (surfxml_storage_content_isset != 0) {FAIL("Multiple definition of attribute content in ");} surfxml_storage_content_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage_content); - YY_BREAK -case 159: -/* rule 159 can match eol */ -YY_RULE_SETUP -if (surfxml_storage_content_isset != 0) {FAIL("Multiple definition of attribute content in ");} surfxml_storage_content_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage_content); - YY_BREAK -case 160: -/* rule 160 can match eol */ -YY_RULE_SETUP -if (surfxml_storage_content___type_isset != 0) {FAIL("Multiple definition of attribute content_type in ");} surfxml_storage_content___type_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage_content___type); - YY_BREAK -case 161: -/* rule 161 can match eol */ -YY_RULE_SETUP -if (surfxml_storage_content___type_isset != 0) {FAIL("Multiple definition of attribute content_type in ");} surfxml_storage_content___type_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage_content___type); - YY_BREAK -case 162: -YY_RULE_SETUP -{ - if (!AX_surfxml_storage_id) FAIL("Required attribute `id' not set for `storage' element."); - if (!AX_surfxml_storage_typeId) FAIL("Required attribute `typeId' not set for `storage' element."); - LEAVE; STag_surfxml_storage();surfxml_pcdata_ix = 0; ENTER(S_surfxml_storage); - } - YY_BREAK -case 163: -YY_RULE_SETUP -{ - if (!AX_surfxml_storage_id) FAIL("Required attribute `id' not set for `storage' element."); - if (!AX_surfxml_storage_typeId) FAIL("Required attribute `typeId' not set for `storage' element."); - LEAVE; STag_surfxml_storage(); surfxml_pcdata_ix = 0; ETag_surfxml_storage(); popbuffer(); /* attribute */ - switch (YY_START) { - case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break; - case S_surfxml_AS_1: case S_surfxml_AS_14: case S_surfxml_AS_13: case S_surfxml_AS: case S_surfxml_AS_3: SET(S_surfxml_AS_14); break; - } - } - YY_BREAK -case 164: -YY_RULE_SETUP -FAIL("Unexpected character `%c' in attribute list of storage element.", surf_parse_text[0]); - YY_BREAK -case 165: -YY_RULE_SETUP -FAIL("Bad attribute `%s' in `storage' element start tag.",surf_parse_text); - YY_BREAK -case YY_STATE_EOF(AL_surfxml_storage): -FAIL("EOF in attribute list of `storage' element."); - YY_BREAK - -case 166: -/* rule 166 can match eol */ -YY_RULE_SETUP -{ - LEAVE; - ETag_surfxml_storage(); - popbuffer(); /* attribute */ - switch (YY_START) { - case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break; - case S_surfxml_AS_1: case S_surfxml_AS_14: case S_surfxml_AS_13: case S_surfxml_AS: case S_surfxml_AS_3: SET(S_surfxml_AS_14); break; - } - } - YY_BREAK -case 167: -/* rule 167 can match eol */ -YY_RULE_SETUP -FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); - YY_BREAK -case 168: -YY_RULE_SETUP -FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); - YY_BREAK -case YY_STATE_EOF(E_surfxml_storage): -case YY_STATE_EOF(S_surfxml_storage): -case YY_STATE_EOF(S_surfxml_storage_2): -if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); - YY_BREAK - -case 169: -/* rule 169 can match eol */ -YY_RULE_SETUP -FAIL("Starting tag is not allowed here."); - YY_BREAK -case 170: -/* rule 170 can match eol */ -YY_RULE_SETUP { AX_surfxml_mount_storageId = 0; surfxml_mount_storageId_isset = 0; @@ -6855,27 +6752,27 @@ YY_RULE_SETUP } YY_BREAK -case 171: -/* rule 171 can match eol */ +case 154: +/* rule 154 can match eol */ YY_RULE_SETUP if (surfxml_mount_storageId_isset != 0) {FAIL("Multiple definition of attribute storageId in ");} surfxml_mount_storageId_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_mount_storageId); YY_BREAK -case 172: -/* rule 172 can match eol */ +case 155: +/* rule 155 can match eol */ YY_RULE_SETUP if (surfxml_mount_storageId_isset != 0) {FAIL("Multiple definition of attribute storageId in ");} surfxml_mount_storageId_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_mount_storageId); YY_BREAK -case 173: -/* rule 173 can match eol */ +case 156: +/* rule 156 can match eol */ YY_RULE_SETUP if (surfxml_mount_name_isset != 0) {FAIL("Multiple definition of attribute name in ");} surfxml_mount_name_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_mount_name); YY_BREAK -case 174: -/* rule 174 can match eol */ +case 157: +/* rule 157 can match eol */ YY_RULE_SETUP if (surfxml_mount_name_isset != 0) {FAIL("Multiple definition of attribute name in ");} surfxml_mount_name_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_mount_name); YY_BREAK -case 175: +case 158: YY_RULE_SETUP { if (!AX_surfxml_mount_storageId) FAIL("Required attribute `storageId' not set for `mount' element."); @@ -6883,7 +6780,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_mount();surfxml_pcdata_ix = 0; ENTER(E_surfxml_mount); } YY_BREAK -case 176: +case 159: YY_RULE_SETUP { if (!AX_surfxml_mount_storageId) FAIL("Required attribute `storageId' not set for `mount' element."); @@ -6894,11 +6791,11 @@ YY_RULE_SETUP } } YY_BREAK -case 177: +case 160: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of mount element.", surf_parse_text[0]); YY_BREAK -case 178: +case 161: YY_RULE_SETUP FAIL("Bad attribute `%s' in `mount' element start tag.",surf_parse_text); YY_BREAK @@ -6906,8 +6803,8 @@ case YY_STATE_EOF(AL_surfxml_mount): FAIL("EOF in attribute list of `mount' element."); YY_BREAK -case 179: -/* rule 179 can match eol */ +case 162: +/* rule 162 can match eol */ YY_RULE_SETUP { LEAVE; @@ -6918,12 +6815,12 @@ YY_RULE_SETUP } } YY_BREAK -case 180: -/* rule 180 can match eol */ +case 163: +/* rule 163 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 181: +case 164: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -6931,13 +6828,13 @@ case YY_STATE_EOF(E_surfxml_mount): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 182: -/* rule 182 can match eol */ +case 165: +/* rule 165 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 183: -/* rule 183 can match eol */ +case 166: +/* rule 166 can match eol */ YY_RULE_SETUP { AX_surfxml_mstorage_typeId = 0; @@ -6948,27 +6845,27 @@ YY_RULE_SETUP } YY_BREAK -case 184: -/* rule 184 can match eol */ +case 167: +/* rule 167 can match eol */ YY_RULE_SETUP if (surfxml_mstorage_typeId_isset != 0) {FAIL("Multiple definition of attribute typeId in ");} surfxml_mstorage_typeId_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_mstorage_typeId); YY_BREAK -case 185: -/* rule 185 can match eol */ +case 168: +/* rule 168 can match eol */ YY_RULE_SETUP if (surfxml_mstorage_typeId_isset != 0) {FAIL("Multiple definition of attribute typeId in ");} surfxml_mstorage_typeId_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_mstorage_typeId); YY_BREAK -case 186: -/* rule 186 can match eol */ +case 169: +/* rule 169 can match eol */ YY_RULE_SETUP if (surfxml_mstorage_name_isset != 0) {FAIL("Multiple definition of attribute name in ");} surfxml_mstorage_name_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_mstorage_name); YY_BREAK -case 187: -/* rule 187 can match eol */ +case 170: +/* rule 170 can match eol */ YY_RULE_SETUP if (surfxml_mstorage_name_isset != 0) {FAIL("Multiple definition of attribute name in ");} surfxml_mstorage_name_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_mstorage_name); YY_BREAK -case 188: +case 171: YY_RULE_SETUP { if (!AX_surfxml_mstorage_typeId) FAIL("Required attribute `typeId' not set for `mstorage' element."); @@ -6976,7 +6873,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_mstorage();surfxml_pcdata_ix = 0; ENTER(E_surfxml_mstorage); } YY_BREAK -case 189: +case 172: YY_RULE_SETUP { if (!AX_surfxml_mstorage_typeId) FAIL("Required attribute `typeId' not set for `mstorage' element."); @@ -6987,11 +6884,11 @@ YY_RULE_SETUP } } YY_BREAK -case 190: +case 173: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of mstorage element.", surf_parse_text[0]); YY_BREAK -case 191: +case 174: YY_RULE_SETUP FAIL("Bad attribute `%s' in `mstorage' element start tag.",surf_parse_text); YY_BREAK @@ -6999,8 +6896,8 @@ case YY_STATE_EOF(AL_surfxml_mstorage): FAIL("EOF in attribute list of `mstorage' element."); YY_BREAK -case 192: -/* rule 192 can match eol */ +case 175: +/* rule 175 can match eol */ YY_RULE_SETUP { LEAVE; @@ -7011,12 +6908,12 @@ YY_RULE_SETUP } } YY_BREAK -case 193: -/* rule 193 can match eol */ +case 176: +/* rule 176 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 194: +case 177: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -7024,22 +6921,22 @@ case YY_STATE_EOF(E_surfxml_mstorage): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 195: -/* rule 195 can match eol */ +case 178: +/* rule 178 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 196: -/* rule 196 can match eol */ +case 179: +/* rule 179 can match eol */ YY_RULE_SETUP { AX_surfxml_host_id = 0; surfxml_host_id_isset = 0; AX_surfxml_host_power = 0; surfxml_host_power_isset = 0; - AX_surfxml_host_core = 34; + AX_surfxml_host_core = 25; surfxml_host_core_isset = 0; - AX_surfxml_host_availability = 36; + AX_surfxml_host_availability = 27; surfxml_host_availability_isset = 0; AX_surfxml_host_availability___file = 0; surfxml_host_availability___file_isset = 0; @@ -7049,107 +6946,107 @@ YY_RULE_SETUP surfxml_host_state___file_isset = 0; AX_surfxml_host_coordinates = 0; surfxml_host_coordinates_isset = 0; - AX_surfxml_host_pstate = 40; + AX_surfxml_host_pstate = 31; surfxml_host_pstate_isset = 0; ENTER(AL_surfxml_host); pushbuffer(0); } YY_BREAK -case 197: -/* rule 197 can match eol */ +case 180: +/* rule 180 can match eol */ YY_RULE_SETUP if (surfxml_host_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_host_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_id); YY_BREAK -case 198: -/* rule 198 can match eol */ +case 181: +/* rule 181 can match eol */ YY_RULE_SETUP if (surfxml_host_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_host_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_id); YY_BREAK -case 199: -/* rule 199 can match eol */ +case 182: +/* rule 182 can match eol */ YY_RULE_SETUP if (surfxml_host_power_isset != 0) {FAIL("Multiple definition of attribute power in ");} surfxml_host_power_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_power); YY_BREAK -case 200: -/* rule 200 can match eol */ +case 183: +/* rule 183 can match eol */ YY_RULE_SETUP if (surfxml_host_power_isset != 0) {FAIL("Multiple definition of attribute power in ");} surfxml_host_power_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_power); YY_BREAK -case 201: -/* rule 201 can match eol */ +case 184: +/* rule 184 can match eol */ YY_RULE_SETUP if (surfxml_host_core_isset != 0) {FAIL("Multiple definition of attribute core in ");} surfxml_host_core_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_core); YY_BREAK -case 202: -/* rule 202 can match eol */ +case 185: +/* rule 185 can match eol */ YY_RULE_SETUP if (surfxml_host_core_isset != 0) {FAIL("Multiple definition of attribute core in ");} surfxml_host_core_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_core); YY_BREAK -case 203: -/* rule 203 can match eol */ +case 186: +/* rule 186 can match eol */ YY_RULE_SETUP if (surfxml_host_availability_isset != 0) {FAIL("Multiple definition of attribute availability in ");} surfxml_host_availability_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_availability); YY_BREAK -case 204: -/* rule 204 can match eol */ +case 187: +/* rule 187 can match eol */ YY_RULE_SETUP if (surfxml_host_availability_isset != 0) {FAIL("Multiple definition of attribute availability in ");} surfxml_host_availability_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_availability); YY_BREAK -case 205: -/* rule 205 can match eol */ +case 188: +/* rule 188 can match eol */ YY_RULE_SETUP if (surfxml_host_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in ");} surfxml_host_availability___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_availability___file); YY_BREAK -case 206: -/* rule 206 can match eol */ +case 189: +/* rule 189 can match eol */ YY_RULE_SETUP if (surfxml_host_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in ");} surfxml_host_availability___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_availability___file); YY_BREAK -case 207: -/* rule 207 can match eol */ -case 208: -/* rule 208 can match eol */ +case 190: +/* rule 190 can match eol */ +case 191: +/* rule 191 can match eol */ YY_RULE_SETUP A_surfxml_host_state = A_surfxml_host_state_ON; YY_BREAK -case 209: -/* rule 209 can match eol */ -case 210: -/* rule 210 can match eol */ +case 192: +/* rule 192 can match eol */ +case 193: +/* rule 193 can match eol */ YY_RULE_SETUP A_surfxml_host_state = A_surfxml_host_state_OFF; YY_BREAK -case 211: -/* rule 211 can match eol */ +case 194: +/* rule 194 can match eol */ YY_RULE_SETUP if (surfxml_host_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in ");} surfxml_host_state___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_state___file); YY_BREAK -case 212: -/* rule 212 can match eol */ +case 195: +/* rule 195 can match eol */ YY_RULE_SETUP if (surfxml_host_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in ");} surfxml_host_state___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_state___file); YY_BREAK -case 213: -/* rule 213 can match eol */ +case 196: +/* rule 196 can match eol */ YY_RULE_SETUP if (surfxml_host_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in ");} surfxml_host_coordinates_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_coordinates); YY_BREAK -case 214: -/* rule 214 can match eol */ +case 197: +/* rule 197 can match eol */ YY_RULE_SETUP if (surfxml_host_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in ");} surfxml_host_coordinates_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_coordinates); YY_BREAK -case 215: -/* rule 215 can match eol */ +case 198: +/* rule 198 can match eol */ YY_RULE_SETUP if (surfxml_host_pstate_isset != 0) {FAIL("Multiple definition of attribute pstate in ");} surfxml_host_pstate_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_pstate); YY_BREAK -case 216: -/* rule 216 can match eol */ +case 199: +/* rule 199 can match eol */ YY_RULE_SETUP if (surfxml_host_pstate_isset != 0) {FAIL("Multiple definition of attribute pstate in ");} surfxml_host_pstate_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_pstate); YY_BREAK -case 217: +case 200: YY_RULE_SETUP { if (!AX_surfxml_host_id) FAIL("Required attribute `id' not set for `host' element."); @@ -7157,7 +7054,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_host();surfxml_pcdata_ix = 0; ENTER(S_surfxml_host); } YY_BREAK -case 218: +case 201: YY_RULE_SETUP { if (!AX_surfxml_host_id) FAIL("Required attribute `id' not set for `host' element."); @@ -7168,11 +7065,11 @@ YY_RULE_SETUP } } YY_BREAK -case 219: +case 202: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of host element.", surf_parse_text[0]); YY_BREAK -case 220: +case 203: YY_RULE_SETUP FAIL("Bad attribute `%s' in `host' element start tag.",surf_parse_text); YY_BREAK @@ -7180,8 +7077,8 @@ case YY_STATE_EOF(AL_surfxml_host): FAIL("EOF in attribute list of `host' element."); YY_BREAK -case 221: -/* rule 221 can match eol */ +case 204: +/* rule 204 can match eol */ YY_RULE_SETUP { LEAVE; @@ -7192,12 +7089,12 @@ YY_RULE_SETUP } } YY_BREAK -case 222: -/* rule 222 can match eol */ +case 205: +/* rule 205 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 223: +case 206: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -7207,13 +7104,148 @@ case YY_STATE_EOF(S_surfxml_host_2): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK +case 207: +/* rule 207 can match eol */ +YY_RULE_SETUP +FAIL("Starting tag is not allowed here."); + YY_BREAK +case 208: +/* rule 208 can match eol */ +YY_RULE_SETUP +{ + AX_surfxml_storage_id = 0; + surfxml_storage_id_isset = 0; + AX_surfxml_storage_typeId = 0; + surfxml_storage_typeId_isset = 0; + AX_surfxml_storage_content = 0; + surfxml_storage_content_isset = 0; + AX_surfxml_storage_content___type = 35; + surfxml_storage_content___type_isset = 0; + AX_surfxml_storage_attach = 0; + surfxml_storage_attach_isset = 0; + ENTER(AL_surfxml_storage); pushbuffer(0); + } + YY_BREAK + +case 209: +/* rule 209 can match eol */ +YY_RULE_SETUP +if (surfxml_storage_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_storage_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage_id); + YY_BREAK +case 210: +/* rule 210 can match eol */ +YY_RULE_SETUP +if (surfxml_storage_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_storage_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage_id); + YY_BREAK +case 211: +/* rule 211 can match eol */ +YY_RULE_SETUP +if (surfxml_storage_typeId_isset != 0) {FAIL("Multiple definition of attribute typeId in ");} surfxml_storage_typeId_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage_typeId); + YY_BREAK +case 212: +/* rule 212 can match eol */ +YY_RULE_SETUP +if (surfxml_storage_typeId_isset != 0) {FAIL("Multiple definition of attribute typeId in ");} surfxml_storage_typeId_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage_typeId); + YY_BREAK +case 213: +/* rule 213 can match eol */ +YY_RULE_SETUP +if (surfxml_storage_content_isset != 0) {FAIL("Multiple definition of attribute content in ");} surfxml_storage_content_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage_content); + YY_BREAK +case 214: +/* rule 214 can match eol */ +YY_RULE_SETUP +if (surfxml_storage_content_isset != 0) {FAIL("Multiple definition of attribute content in ");} surfxml_storage_content_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage_content); + YY_BREAK +case 215: +/* rule 215 can match eol */ +YY_RULE_SETUP +if (surfxml_storage_content___type_isset != 0) {FAIL("Multiple definition of attribute content_type in ");} surfxml_storage_content___type_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage_content___type); + YY_BREAK +case 216: +/* rule 216 can match eol */ +YY_RULE_SETUP +if (surfxml_storage_content___type_isset != 0) {FAIL("Multiple definition of attribute content_type in ");} surfxml_storage_content___type_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage_content___type); + YY_BREAK +case 217: +/* rule 217 can match eol */ +YY_RULE_SETUP +if (surfxml_storage_attach_isset != 0) {FAIL("Multiple definition of attribute attach in ");} surfxml_storage_attach_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage_attach); + YY_BREAK +case 218: +/* rule 218 can match eol */ +YY_RULE_SETUP +if (surfxml_storage_attach_isset != 0) {FAIL("Multiple definition of attribute attach in ");} surfxml_storage_attach_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage_attach); + YY_BREAK +case 219: +YY_RULE_SETUP +{ + if (!AX_surfxml_storage_id) FAIL("Required attribute `id' not set for `storage' element."); + if (!AX_surfxml_storage_typeId) FAIL("Required attribute `typeId' not set for `storage' element."); + if (!AX_surfxml_storage_attach) FAIL("Required attribute `attach' not set for `storage' element."); + LEAVE; STag_surfxml_storage();surfxml_pcdata_ix = 0; ENTER(S_surfxml_storage); + } + YY_BREAK +case 220: +YY_RULE_SETUP +{ + if (!AX_surfxml_storage_id) FAIL("Required attribute `id' not set for `storage' element."); + if (!AX_surfxml_storage_typeId) FAIL("Required attribute `typeId' not set for `storage' element."); + if (!AX_surfxml_storage_attach) FAIL("Required attribute `attach' not set for `storage' element."); + LEAVE; STag_surfxml_storage(); surfxml_pcdata_ix = 0; ETag_surfxml_storage(); popbuffer(); /* attribute */ + switch (YY_START) { + case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break; + case S_surfxml_AS_1: case S_surfxml_AS_14: case S_surfxml_AS_13: case S_surfxml_AS: case S_surfxml_AS_3: SET(S_surfxml_AS_14); break; + } + } + YY_BREAK +case 221: +YY_RULE_SETUP +FAIL("Unexpected character `%c' in attribute list of storage element.", surf_parse_text[0]); + YY_BREAK +case 222: +YY_RULE_SETUP +FAIL("Bad attribute `%s' in `storage' element start tag.",surf_parse_text); + YY_BREAK +case YY_STATE_EOF(AL_surfxml_storage): +FAIL("EOF in attribute list of `storage' element."); + YY_BREAK + +case 223: +/* rule 223 can match eol */ +YY_RULE_SETUP +{ + LEAVE; + ETag_surfxml_storage(); + popbuffer(); /* attribute */ + switch (YY_START) { + case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break; + case S_surfxml_AS_1: case S_surfxml_AS_14: case S_surfxml_AS_13: case S_surfxml_AS: case S_surfxml_AS_3: SET(S_surfxml_AS_14); break; + } + } + YY_BREAK case 224: /* rule 224 can match eol */ YY_RULE_SETUP -FAIL("Starting tag is not allowed here."); +FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK case 225: -/* rule 225 can match eol */ +YY_RULE_SETUP +FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); + YY_BREAK +case YY_STATE_EOF(E_surfxml_storage): +case YY_STATE_EOF(S_surfxml_storage): +case YY_STATE_EOF(S_surfxml_storage_2): +if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); + YY_BREAK + +case 226: +/* rule 226 can match eol */ +YY_RULE_SETUP +FAIL("Starting tag is not allowed here."); + YY_BREAK +case 227: +/* rule 227 can match eol */ YY_RULE_SETUP { AX_surfxml_gpu_name = 0; @@ -7222,24 +7254,24 @@ YY_RULE_SETUP } YY_BREAK -case 226: -/* rule 226 can match eol */ +case 228: +/* rule 228 can match eol */ YY_RULE_SETUP if (surfxml_gpu_name_isset != 0) {FAIL("Multiple definition of attribute name in ");} surfxml_gpu_name_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_gpu_name); YY_BREAK -case 227: -/* rule 227 can match eol */ +case 229: +/* rule 229 can match eol */ YY_RULE_SETUP if (surfxml_gpu_name_isset != 0) {FAIL("Multiple definition of attribute name in ");} surfxml_gpu_name_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_gpu_name); YY_BREAK -case 228: +case 230: YY_RULE_SETUP { if (!AX_surfxml_gpu_name) FAIL("Required attribute `name' not set for `gpu' element."); LEAVE; STag_surfxml_gpu();surfxml_pcdata_ix = 0; ENTER(E_surfxml_gpu); } YY_BREAK -case 229: +case 231: YY_RULE_SETUP { if (!AX_surfxml_gpu_name) FAIL("Required attribute `name' not set for `gpu' element."); @@ -7249,11 +7281,11 @@ YY_RULE_SETUP } } YY_BREAK -case 230: +case 232: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of gpu element.", surf_parse_text[0]); YY_BREAK -case 231: +case 233: YY_RULE_SETUP FAIL("Bad attribute `%s' in `gpu' element start tag.",surf_parse_text); YY_BREAK @@ -7261,8 +7293,8 @@ case YY_STATE_EOF(AL_surfxml_gpu): FAIL("EOF in attribute list of `gpu' element."); YY_BREAK -case 232: -/* rule 232 can match eol */ +case 234: +/* rule 234 can match eol */ YY_RULE_SETUP { LEAVE; @@ -7273,12 +7305,12 @@ YY_RULE_SETUP } } YY_BREAK -case 233: -/* rule 233 can match eol */ +case 235: +/* rule 235 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 234: +case 236: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -7286,13 +7318,13 @@ case YY_STATE_EOF(E_surfxml_gpu): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 235: -/* rule 235 can match eol */ +case 237: +/* rule 237 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 236: -/* rule 236 can match eol */ +case 238: +/* rule 238 can match eol */ YY_RULE_SETUP { AX_surfxml_host___link_id = 0; @@ -7305,37 +7337,37 @@ YY_RULE_SETUP } YY_BREAK -case 237: -/* rule 237 can match eol */ +case 239: +/* rule 239 can match eol */ YY_RULE_SETUP if (surfxml_host___link_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_host___link_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host___link_id); YY_BREAK -case 238: -/* rule 238 can match eol */ +case 240: +/* rule 240 can match eol */ YY_RULE_SETUP if (surfxml_host___link_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_host___link_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host___link_id); YY_BREAK -case 239: -/* rule 239 can match eol */ +case 241: +/* rule 241 can match eol */ YY_RULE_SETUP if (surfxml_host___link_up_isset != 0) {FAIL("Multiple definition of attribute up in ");} surfxml_host___link_up_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host___link_up); YY_BREAK -case 240: -/* rule 240 can match eol */ +case 242: +/* rule 242 can match eol */ YY_RULE_SETUP if (surfxml_host___link_up_isset != 0) {FAIL("Multiple definition of attribute up in ");} surfxml_host___link_up_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host___link_up); YY_BREAK -case 241: -/* rule 241 can match eol */ +case 243: +/* rule 243 can match eol */ YY_RULE_SETUP if (surfxml_host___link_down_isset != 0) {FAIL("Multiple definition of attribute down in ");} surfxml_host___link_down_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host___link_down); YY_BREAK -case 242: -/* rule 242 can match eol */ +case 244: +/* rule 244 can match eol */ YY_RULE_SETUP if (surfxml_host___link_down_isset != 0) {FAIL("Multiple definition of attribute down in ");} surfxml_host___link_down_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host___link_down); YY_BREAK -case 243: +case 245: YY_RULE_SETUP { if (!AX_surfxml_host___link_id) FAIL("Required attribute `id' not set for `host_link' element."); @@ -7344,7 +7376,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_host___link();surfxml_pcdata_ix = 0; ENTER(E_surfxml_host___link); } YY_BREAK -case 244: +case 246: YY_RULE_SETUP { if (!AX_surfxml_host___link_id) FAIL("Required attribute `id' not set for `host_link' element."); @@ -7356,11 +7388,11 @@ YY_RULE_SETUP } } YY_BREAK -case 245: +case 247: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of host_link element.", surf_parse_text[0]); YY_BREAK -case 246: +case 248: YY_RULE_SETUP FAIL("Bad attribute `%s' in `host_link' element start tag.",surf_parse_text); YY_BREAK @@ -7368,8 +7400,8 @@ case YY_STATE_EOF(AL_surfxml_host___link): FAIL("EOF in attribute list of `host_link' element."); YY_BREAK -case 247: -/* rule 247 can match eol */ +case 249: +/* rule 249 can match eol */ YY_RULE_SETUP { LEAVE; @@ -7380,12 +7412,12 @@ YY_RULE_SETUP } } YY_BREAK -case 248: -/* rule 248 can match eol */ +case 250: +/* rule 250 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 249: +case 251: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -7393,13 +7425,13 @@ case YY_STATE_EOF(E_surfxml_host___link): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 250: -/* rule 250 can match eol */ +case 252: +/* rule 252 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 251: -/* rule 251 can match eol */ +case 253: +/* rule 253 can match eol */ YY_RULE_SETUP { AX_surfxml_cluster_id = 0; @@ -7446,226 +7478,226 @@ YY_RULE_SETUP } YY_BREAK -case 252: -/* rule 252 can match eol */ -YY_RULE_SETUP -if (surfxml_cluster_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_cluster_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_id); - YY_BREAK -case 253: -/* rule 253 can match eol */ -YY_RULE_SETUP -if (surfxml_cluster_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_cluster_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_id); - YY_BREAK case 254: /* rule 254 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_prefix_isset != 0) {FAIL("Multiple definition of attribute prefix in ");} surfxml_cluster_prefix_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_prefix); +if (surfxml_cluster_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_cluster_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_id); YY_BREAK case 255: /* rule 255 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_prefix_isset != 0) {FAIL("Multiple definition of attribute prefix in ");} surfxml_cluster_prefix_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_prefix); +if (surfxml_cluster_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_cluster_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_id); YY_BREAK case 256: /* rule 256 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_suffix_isset != 0) {FAIL("Multiple definition of attribute suffix in ");} surfxml_cluster_suffix_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_suffix); +if (surfxml_cluster_prefix_isset != 0) {FAIL("Multiple definition of attribute prefix in ");} surfxml_cluster_prefix_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_prefix); YY_BREAK case 257: /* rule 257 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_suffix_isset != 0) {FAIL("Multiple definition of attribute suffix in ");} surfxml_cluster_suffix_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_suffix); +if (surfxml_cluster_prefix_isset != 0) {FAIL("Multiple definition of attribute prefix in ");} surfxml_cluster_prefix_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_prefix); YY_BREAK case 258: /* rule 258 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_radical_isset != 0) {FAIL("Multiple definition of attribute radical in ");} surfxml_cluster_radical_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_radical); +if (surfxml_cluster_suffix_isset != 0) {FAIL("Multiple definition of attribute suffix in ");} surfxml_cluster_suffix_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_suffix); YY_BREAK case 259: /* rule 259 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_radical_isset != 0) {FAIL("Multiple definition of attribute radical in ");} surfxml_cluster_radical_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_radical); +if (surfxml_cluster_suffix_isset != 0) {FAIL("Multiple definition of attribute suffix in ");} surfxml_cluster_suffix_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_suffix); YY_BREAK case 260: /* rule 260 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_power_isset != 0) {FAIL("Multiple definition of attribute power in ");} surfxml_cluster_power_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_power); +if (surfxml_cluster_radical_isset != 0) {FAIL("Multiple definition of attribute radical in ");} surfxml_cluster_radical_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_radical); YY_BREAK case 261: /* rule 261 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_power_isset != 0) {FAIL("Multiple definition of attribute power in ");} surfxml_cluster_power_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_power); +if (surfxml_cluster_radical_isset != 0) {FAIL("Multiple definition of attribute radical in ");} surfxml_cluster_radical_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_radical); YY_BREAK case 262: /* rule 262 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_core_isset != 0) {FAIL("Multiple definition of attribute core in ");} surfxml_cluster_core_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_core); +if (surfxml_cluster_power_isset != 0) {FAIL("Multiple definition of attribute power in ");} surfxml_cluster_power_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_power); YY_BREAK case 263: /* rule 263 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_core_isset != 0) {FAIL("Multiple definition of attribute core in ");} surfxml_cluster_core_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_core); +if (surfxml_cluster_power_isset != 0) {FAIL("Multiple definition of attribute power in ");} surfxml_cluster_power_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_power); YY_BREAK case 264: /* rule 264 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_bw_isset != 0) {FAIL("Multiple definition of attribute bw in ");} surfxml_cluster_bw_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_bw); +if (surfxml_cluster_core_isset != 0) {FAIL("Multiple definition of attribute core in ");} surfxml_cluster_core_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_core); YY_BREAK case 265: /* rule 265 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_bw_isset != 0) {FAIL("Multiple definition of attribute bw in ");} surfxml_cluster_bw_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_bw); +if (surfxml_cluster_core_isset != 0) {FAIL("Multiple definition of attribute core in ");} surfxml_cluster_core_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_core); YY_BREAK case 266: /* rule 266 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_lat_isset != 0) {FAIL("Multiple definition of attribute lat in ");} surfxml_cluster_lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_lat); +if (surfxml_cluster_bw_isset != 0) {FAIL("Multiple definition of attribute bw in ");} surfxml_cluster_bw_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_bw); YY_BREAK case 267: /* rule 267 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_lat_isset != 0) {FAIL("Multiple definition of attribute lat in ");} surfxml_cluster_lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_lat); +if (surfxml_cluster_bw_isset != 0) {FAIL("Multiple definition of attribute bw in ");} surfxml_cluster_bw_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_bw); YY_BREAK case 268: /* rule 268 can match eol */ +YY_RULE_SETUP +if (surfxml_cluster_lat_isset != 0) {FAIL("Multiple definition of attribute lat in ");} surfxml_cluster_lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_lat); + YY_BREAK case 269: /* rule 269 can match eol */ YY_RULE_SETUP -A_surfxml_cluster_sharing___policy = A_surfxml_cluster_sharing___policy_SHARED; +if (surfxml_cluster_lat_isset != 0) {FAIL("Multiple definition of attribute lat in ");} surfxml_cluster_lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_lat); YY_BREAK case 270: /* rule 270 can match eol */ case 271: /* rule 271 can match eol */ YY_RULE_SETUP -A_surfxml_cluster_sharing___policy = A_surfxml_cluster_sharing___policy_FULLDUPLEX; +A_surfxml_cluster_sharing___policy = A_surfxml_cluster_sharing___policy_SHARED; YY_BREAK case 272: /* rule 272 can match eol */ case 273: /* rule 273 can match eol */ YY_RULE_SETUP -A_surfxml_cluster_sharing___policy = A_surfxml_cluster_sharing___policy_FATPIPE; +A_surfxml_cluster_sharing___policy = A_surfxml_cluster_sharing___policy_FULLDUPLEX; YY_BREAK case 274: /* rule 274 can match eol */ case 275: /* rule 275 can match eol */ YY_RULE_SETUP -A_surfxml_cluster_topology = A_surfxml_cluster_topology_FLAT; +A_surfxml_cluster_sharing___policy = A_surfxml_cluster_sharing___policy_FATPIPE; YY_BREAK case 276: /* rule 276 can match eol */ case 277: /* rule 277 can match eol */ YY_RULE_SETUP -A_surfxml_cluster_topology = A_surfxml_cluster_topology_TORUS; +A_surfxml_cluster_topology = A_surfxml_cluster_topology_FLAT; YY_BREAK case 278: /* rule 278 can match eol */ -YY_RULE_SETUP -if (surfxml_cluster_topo___parameters_isset != 0) {FAIL("Multiple definition of attribute topo_parameters in ");} surfxml_cluster_topo___parameters_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_topo___parameters); - YY_BREAK case 279: /* rule 279 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_topo___parameters_isset != 0) {FAIL("Multiple definition of attribute topo_parameters in ");} surfxml_cluster_topo___parameters_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_topo___parameters); +A_surfxml_cluster_topology = A_surfxml_cluster_topology_TORUS; YY_BREAK case 280: /* rule 280 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_bb___bw_isset != 0) {FAIL("Multiple definition of attribute bb_bw in ");} surfxml_cluster_bb___bw_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_bb___bw); +if (surfxml_cluster_topo___parameters_isset != 0) {FAIL("Multiple definition of attribute topo_parameters in ");} surfxml_cluster_topo___parameters_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_topo___parameters); YY_BREAK case 281: /* rule 281 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_bb___bw_isset != 0) {FAIL("Multiple definition of attribute bb_bw in ");} surfxml_cluster_bb___bw_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_bb___bw); +if (surfxml_cluster_topo___parameters_isset != 0) {FAIL("Multiple definition of attribute topo_parameters in ");} surfxml_cluster_topo___parameters_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_topo___parameters); YY_BREAK case 282: /* rule 282 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_bb___lat_isset != 0) {FAIL("Multiple definition of attribute bb_lat in ");} surfxml_cluster_bb___lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_bb___lat); +if (surfxml_cluster_bb___bw_isset != 0) {FAIL("Multiple definition of attribute bb_bw in ");} surfxml_cluster_bb___bw_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_bb___bw); YY_BREAK case 283: /* rule 283 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_bb___lat_isset != 0) {FAIL("Multiple definition of attribute bb_lat in ");} surfxml_cluster_bb___lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_bb___lat); +if (surfxml_cluster_bb___bw_isset != 0) {FAIL("Multiple definition of attribute bb_bw in ");} surfxml_cluster_bb___bw_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_bb___bw); YY_BREAK case 284: /* rule 284 can match eol */ +YY_RULE_SETUP +if (surfxml_cluster_bb___lat_isset != 0) {FAIL("Multiple definition of attribute bb_lat in ");} surfxml_cluster_bb___lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_bb___lat); + YY_BREAK case 285: /* rule 285 can match eol */ YY_RULE_SETUP -A_surfxml_cluster_bb___sharing___policy = A_surfxml_cluster_bb___sharing___policy_SHARED; +if (surfxml_cluster_bb___lat_isset != 0) {FAIL("Multiple definition of attribute bb_lat in ");} surfxml_cluster_bb___lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_bb___lat); YY_BREAK case 286: /* rule 286 can match eol */ case 287: /* rule 287 can match eol */ YY_RULE_SETUP -A_surfxml_cluster_bb___sharing___policy = A_surfxml_cluster_bb___sharing___policy_FATPIPE; +A_surfxml_cluster_bb___sharing___policy = A_surfxml_cluster_bb___sharing___policy_SHARED; YY_BREAK case 288: /* rule 288 can match eol */ -YY_RULE_SETUP -if (surfxml_cluster_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in ");} surfxml_cluster_availability___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_availability___file); - YY_BREAK case 289: /* rule 289 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in ");} surfxml_cluster_availability___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_availability___file); +A_surfxml_cluster_bb___sharing___policy = A_surfxml_cluster_bb___sharing___policy_FATPIPE; YY_BREAK case 290: /* rule 290 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in ");} surfxml_cluster_state___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_state___file); +if (surfxml_cluster_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in ");} surfxml_cluster_availability___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_availability___file); YY_BREAK case 291: /* rule 291 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in ");} surfxml_cluster_state___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_state___file); +if (surfxml_cluster_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in ");} surfxml_cluster_availability___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_availability___file); YY_BREAK case 292: /* rule 292 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_router___id_isset != 0) {FAIL("Multiple definition of attribute router_id in ");} surfxml_cluster_router___id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_router___id); +if (surfxml_cluster_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in ");} surfxml_cluster_state___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_state___file); YY_BREAK case 293: /* rule 293 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_router___id_isset != 0) {FAIL("Multiple definition of attribute router_id in ");} surfxml_cluster_router___id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_router___id); +if (surfxml_cluster_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in ");} surfxml_cluster_state___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_state___file); YY_BREAK case 294: /* rule 294 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_limiter___link_isset != 0) {FAIL("Multiple definition of attribute limiter_link in ");} surfxml_cluster_limiter___link_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_limiter___link); +if (surfxml_cluster_router___id_isset != 0) {FAIL("Multiple definition of attribute router_id in ");} surfxml_cluster_router___id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_router___id); YY_BREAK case 295: /* rule 295 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_limiter___link_isset != 0) {FAIL("Multiple definition of attribute limiter_link in ");} surfxml_cluster_limiter___link_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_limiter___link); +if (surfxml_cluster_router___id_isset != 0) {FAIL("Multiple definition of attribute router_id in ");} surfxml_cluster_router___id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_router___id); YY_BREAK case 296: /* rule 296 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_loopback___bw_isset != 0) {FAIL("Multiple definition of attribute loopback_bw in ");} surfxml_cluster_loopback___bw_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_loopback___bw); +if (surfxml_cluster_limiter___link_isset != 0) {FAIL("Multiple definition of attribute limiter_link in ");} surfxml_cluster_limiter___link_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_limiter___link); YY_BREAK case 297: /* rule 297 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_loopback___bw_isset != 0) {FAIL("Multiple definition of attribute loopback_bw in ");} surfxml_cluster_loopback___bw_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_loopback___bw); +if (surfxml_cluster_limiter___link_isset != 0) {FAIL("Multiple definition of attribute limiter_link in ");} surfxml_cluster_limiter___link_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_limiter___link); YY_BREAK case 298: /* rule 298 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_loopback___lat_isset != 0) {FAIL("Multiple definition of attribute loopback_lat in ");} surfxml_cluster_loopback___lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_loopback___lat); +if (surfxml_cluster_loopback___bw_isset != 0) {FAIL("Multiple definition of attribute loopback_bw in ");} surfxml_cluster_loopback___bw_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_loopback___bw); YY_BREAK case 299: /* rule 299 can match eol */ YY_RULE_SETUP -if (surfxml_cluster_loopback___lat_isset != 0) {FAIL("Multiple definition of attribute loopback_lat in ");} surfxml_cluster_loopback___lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_loopback___lat); +if (surfxml_cluster_loopback___bw_isset != 0) {FAIL("Multiple definition of attribute loopback_bw in ");} surfxml_cluster_loopback___bw_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_loopback___bw); YY_BREAK case 300: +/* rule 300 can match eol */ +YY_RULE_SETUP +if (surfxml_cluster_loopback___lat_isset != 0) {FAIL("Multiple definition of attribute loopback_lat in ");} surfxml_cluster_loopback___lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_loopback___lat); + YY_BREAK +case 301: +/* rule 301 can match eol */ +YY_RULE_SETUP +if (surfxml_cluster_loopback___lat_isset != 0) {FAIL("Multiple definition of attribute loopback_lat in ");} surfxml_cluster_loopback___lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_loopback___lat); + YY_BREAK +case 302: YY_RULE_SETUP { if (!AX_surfxml_cluster_id) FAIL("Required attribute `id' not set for `cluster' element."); @@ -7678,7 +7710,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_cluster();surfxml_pcdata_ix = 0; ENTER(S_surfxml_cluster); } YY_BREAK -case 301: +case 303: YY_RULE_SETUP { if (!AX_surfxml_cluster_id) FAIL("Required attribute `id' not set for `cluster' element."); @@ -7696,11 +7728,11 @@ YY_RULE_SETUP } } YY_BREAK -case 302: +case 304: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of cluster element.", surf_parse_text[0]); YY_BREAK -case 303: +case 305: YY_RULE_SETUP FAIL("Bad attribute `%s' in `cluster' element start tag.",surf_parse_text); YY_BREAK @@ -7708,8 +7740,8 @@ case YY_STATE_EOF(AL_surfxml_cluster): FAIL("EOF in attribute list of `cluster' element."); YY_BREAK -case 304: -/* rule 304 can match eol */ +case 306: +/* rule 306 can match eol */ YY_RULE_SETUP { LEAVE; @@ -7722,12 +7754,12 @@ YY_RULE_SETUP } } YY_BREAK -case 305: -/* rule 305 can match eol */ +case 307: +/* rule 307 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 306: +case 308: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -7737,13 +7769,13 @@ case YY_STATE_EOF(E_surfxml_cluster): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 307: -/* rule 307 can match eol */ +case 309: +/* rule 309 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 308: -/* rule 308 can match eol */ +case 310: +/* rule 310 can match eol */ YY_RULE_SETUP { AX_surfxml_cabinet_id = 0; @@ -7764,77 +7796,77 @@ YY_RULE_SETUP } YY_BREAK -case 309: -/* rule 309 can match eol */ -YY_RULE_SETUP -if (surfxml_cabinet_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_cabinet_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_id); - YY_BREAK -case 310: -/* rule 310 can match eol */ -YY_RULE_SETUP -if (surfxml_cabinet_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_cabinet_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_id); - YY_BREAK case 311: /* rule 311 can match eol */ YY_RULE_SETUP -if (surfxml_cabinet_prefix_isset != 0) {FAIL("Multiple definition of attribute prefix in ");} surfxml_cabinet_prefix_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_prefix); +if (surfxml_cabinet_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_cabinet_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_id); YY_BREAK case 312: /* rule 312 can match eol */ YY_RULE_SETUP -if (surfxml_cabinet_prefix_isset != 0) {FAIL("Multiple definition of attribute prefix in ");} surfxml_cabinet_prefix_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_prefix); +if (surfxml_cabinet_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_cabinet_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_id); YY_BREAK case 313: /* rule 313 can match eol */ YY_RULE_SETUP -if (surfxml_cabinet_suffix_isset != 0) {FAIL("Multiple definition of attribute suffix in ");} surfxml_cabinet_suffix_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_suffix); +if (surfxml_cabinet_prefix_isset != 0) {FAIL("Multiple definition of attribute prefix in ");} surfxml_cabinet_prefix_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_prefix); YY_BREAK case 314: /* rule 314 can match eol */ YY_RULE_SETUP -if (surfxml_cabinet_suffix_isset != 0) {FAIL("Multiple definition of attribute suffix in ");} surfxml_cabinet_suffix_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_suffix); +if (surfxml_cabinet_prefix_isset != 0) {FAIL("Multiple definition of attribute prefix in ");} surfxml_cabinet_prefix_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_prefix); YY_BREAK case 315: /* rule 315 can match eol */ YY_RULE_SETUP -if (surfxml_cabinet_radical_isset != 0) {FAIL("Multiple definition of attribute radical in ");} surfxml_cabinet_radical_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_radical); +if (surfxml_cabinet_suffix_isset != 0) {FAIL("Multiple definition of attribute suffix in ");} surfxml_cabinet_suffix_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_suffix); YY_BREAK case 316: /* rule 316 can match eol */ YY_RULE_SETUP -if (surfxml_cabinet_radical_isset != 0) {FAIL("Multiple definition of attribute radical in ");} surfxml_cabinet_radical_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_radical); +if (surfxml_cabinet_suffix_isset != 0) {FAIL("Multiple definition of attribute suffix in ");} surfxml_cabinet_suffix_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_suffix); YY_BREAK case 317: /* rule 317 can match eol */ YY_RULE_SETUP -if (surfxml_cabinet_power_isset != 0) {FAIL("Multiple definition of attribute power in ");} surfxml_cabinet_power_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_power); +if (surfxml_cabinet_radical_isset != 0) {FAIL("Multiple definition of attribute radical in ");} surfxml_cabinet_radical_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_radical); YY_BREAK case 318: /* rule 318 can match eol */ YY_RULE_SETUP -if (surfxml_cabinet_power_isset != 0) {FAIL("Multiple definition of attribute power in ");} surfxml_cabinet_power_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_power); +if (surfxml_cabinet_radical_isset != 0) {FAIL("Multiple definition of attribute radical in ");} surfxml_cabinet_radical_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_radical); YY_BREAK case 319: /* rule 319 can match eol */ YY_RULE_SETUP -if (surfxml_cabinet_bw_isset != 0) {FAIL("Multiple definition of attribute bw in ");} surfxml_cabinet_bw_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_bw); +if (surfxml_cabinet_power_isset != 0) {FAIL("Multiple definition of attribute power in ");} surfxml_cabinet_power_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_power); YY_BREAK case 320: /* rule 320 can match eol */ YY_RULE_SETUP -if (surfxml_cabinet_bw_isset != 0) {FAIL("Multiple definition of attribute bw in ");} surfxml_cabinet_bw_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_bw); +if (surfxml_cabinet_power_isset != 0) {FAIL("Multiple definition of attribute power in ");} surfxml_cabinet_power_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_power); YY_BREAK case 321: /* rule 321 can match eol */ YY_RULE_SETUP -if (surfxml_cabinet_lat_isset != 0) {FAIL("Multiple definition of attribute lat in ");} surfxml_cabinet_lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_lat); +if (surfxml_cabinet_bw_isset != 0) {FAIL("Multiple definition of attribute bw in ");} surfxml_cabinet_bw_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_bw); YY_BREAK case 322: /* rule 322 can match eol */ YY_RULE_SETUP -if (surfxml_cabinet_lat_isset != 0) {FAIL("Multiple definition of attribute lat in ");} surfxml_cabinet_lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_lat); +if (surfxml_cabinet_bw_isset != 0) {FAIL("Multiple definition of attribute bw in ");} surfxml_cabinet_bw_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_bw); YY_BREAK case 323: +/* rule 323 can match eol */ +YY_RULE_SETUP +if (surfxml_cabinet_lat_isset != 0) {FAIL("Multiple definition of attribute lat in ");} surfxml_cabinet_lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_lat); + YY_BREAK +case 324: +/* rule 324 can match eol */ +YY_RULE_SETUP +if (surfxml_cabinet_lat_isset != 0) {FAIL("Multiple definition of attribute lat in ");} surfxml_cabinet_lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_lat); + YY_BREAK +case 325: YY_RULE_SETUP { if (!AX_surfxml_cabinet_id) FAIL("Required attribute `id' not set for `cabinet' element."); @@ -7847,7 +7879,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_cabinet();surfxml_pcdata_ix = 0; ENTER(E_surfxml_cabinet); } YY_BREAK -case 324: +case 326: YY_RULE_SETUP { if (!AX_surfxml_cabinet_id) FAIL("Required attribute `id' not set for `cabinet' element."); @@ -7866,11 +7898,11 @@ YY_RULE_SETUP } } YY_BREAK -case 325: +case 327: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of cabinet element.", surf_parse_text[0]); YY_BREAK -case 326: +case 328: YY_RULE_SETUP FAIL("Bad attribute `%s' in `cabinet' element start tag.",surf_parse_text); YY_BREAK @@ -7878,8 +7910,8 @@ case YY_STATE_EOF(AL_surfxml_cabinet): FAIL("EOF in attribute list of `cabinet' element."); YY_BREAK -case 327: -/* rule 327 can match eol */ +case 329: +/* rule 329 can match eol */ YY_RULE_SETUP { LEAVE; @@ -7893,12 +7925,12 @@ YY_RULE_SETUP } } YY_BREAK -case 328: -/* rule 328 can match eol */ +case 330: +/* rule 330 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 329: +case 331: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -7906,13 +7938,13 @@ case YY_STATE_EOF(E_surfxml_cabinet): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 330: -/* rule 330 can match eol */ +case 332: +/* rule 332 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 331: -/* rule 331 can match eol */ +case 333: +/* rule 333 can match eol */ YY_RULE_SETUP { AX_surfxml_peer_id = 0; @@ -7935,87 +7967,87 @@ YY_RULE_SETUP } YY_BREAK -case 332: -/* rule 332 can match eol */ -YY_RULE_SETUP -if (surfxml_peer_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_peer_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_id); - YY_BREAK -case 333: -/* rule 333 can match eol */ -YY_RULE_SETUP -if (surfxml_peer_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_peer_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_id); - YY_BREAK case 334: /* rule 334 can match eol */ YY_RULE_SETUP -if (surfxml_peer_power_isset != 0) {FAIL("Multiple definition of attribute power in ");} surfxml_peer_power_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_power); +if (surfxml_peer_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_peer_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_id); YY_BREAK case 335: /* rule 335 can match eol */ YY_RULE_SETUP -if (surfxml_peer_power_isset != 0) {FAIL("Multiple definition of attribute power in ");} surfxml_peer_power_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_power); +if (surfxml_peer_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_peer_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_id); YY_BREAK case 336: /* rule 336 can match eol */ YY_RULE_SETUP -if (surfxml_peer_bw___in_isset != 0) {FAIL("Multiple definition of attribute bw_in in ");} surfxml_peer_bw___in_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_bw___in); +if (surfxml_peer_power_isset != 0) {FAIL("Multiple definition of attribute power in ");} surfxml_peer_power_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_power); YY_BREAK case 337: /* rule 337 can match eol */ YY_RULE_SETUP -if (surfxml_peer_bw___in_isset != 0) {FAIL("Multiple definition of attribute bw_in in ");} surfxml_peer_bw___in_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_bw___in); +if (surfxml_peer_power_isset != 0) {FAIL("Multiple definition of attribute power in ");} surfxml_peer_power_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_power); YY_BREAK case 338: /* rule 338 can match eol */ YY_RULE_SETUP -if (surfxml_peer_bw___out_isset != 0) {FAIL("Multiple definition of attribute bw_out in ");} surfxml_peer_bw___out_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_bw___out); +if (surfxml_peer_bw___in_isset != 0) {FAIL("Multiple definition of attribute bw_in in ");} surfxml_peer_bw___in_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_bw___in); YY_BREAK case 339: /* rule 339 can match eol */ YY_RULE_SETUP -if (surfxml_peer_bw___out_isset != 0) {FAIL("Multiple definition of attribute bw_out in ");} surfxml_peer_bw___out_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_bw___out); +if (surfxml_peer_bw___in_isset != 0) {FAIL("Multiple definition of attribute bw_in in ");} surfxml_peer_bw___in_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_bw___in); YY_BREAK case 340: /* rule 340 can match eol */ YY_RULE_SETUP -if (surfxml_peer_lat_isset != 0) {FAIL("Multiple definition of attribute lat in ");} surfxml_peer_lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_lat); +if (surfxml_peer_bw___out_isset != 0) {FAIL("Multiple definition of attribute bw_out in ");} surfxml_peer_bw___out_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_bw___out); YY_BREAK case 341: /* rule 341 can match eol */ YY_RULE_SETUP -if (surfxml_peer_lat_isset != 0) {FAIL("Multiple definition of attribute lat in ");} surfxml_peer_lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_lat); +if (surfxml_peer_bw___out_isset != 0) {FAIL("Multiple definition of attribute bw_out in ");} surfxml_peer_bw___out_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_bw___out); YY_BREAK case 342: /* rule 342 can match eol */ YY_RULE_SETUP -if (surfxml_peer_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in ");} surfxml_peer_coordinates_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_coordinates); +if (surfxml_peer_lat_isset != 0) {FAIL("Multiple definition of attribute lat in ");} surfxml_peer_lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_lat); YY_BREAK case 343: /* rule 343 can match eol */ YY_RULE_SETUP -if (surfxml_peer_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in ");} surfxml_peer_coordinates_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_coordinates); +if (surfxml_peer_lat_isset != 0) {FAIL("Multiple definition of attribute lat in ");} surfxml_peer_lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_lat); YY_BREAK case 344: /* rule 344 can match eol */ YY_RULE_SETUP -if (surfxml_peer_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in ");} surfxml_peer_availability___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_availability___file); +if (surfxml_peer_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in ");} surfxml_peer_coordinates_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_coordinates); YY_BREAK case 345: /* rule 345 can match eol */ YY_RULE_SETUP -if (surfxml_peer_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in ");} surfxml_peer_availability___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_availability___file); +if (surfxml_peer_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in ");} surfxml_peer_coordinates_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_coordinates); YY_BREAK case 346: /* rule 346 can match eol */ YY_RULE_SETUP -if (surfxml_peer_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in ");} surfxml_peer_state___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_state___file); +if (surfxml_peer_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in ");} surfxml_peer_availability___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_availability___file); YY_BREAK case 347: /* rule 347 can match eol */ YY_RULE_SETUP -if (surfxml_peer_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in ");} surfxml_peer_state___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_state___file); +if (surfxml_peer_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in ");} surfxml_peer_availability___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_availability___file); YY_BREAK case 348: +/* rule 348 can match eol */ +YY_RULE_SETUP +if (surfxml_peer_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in ");} surfxml_peer_state___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_state___file); + YY_BREAK +case 349: +/* rule 349 can match eol */ +YY_RULE_SETUP +if (surfxml_peer_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in ");} surfxml_peer_state___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_state___file); + YY_BREAK +case 350: YY_RULE_SETUP { if (!AX_surfxml_peer_id) FAIL("Required attribute `id' not set for `peer' element."); @@ -8026,7 +8058,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_peer();surfxml_pcdata_ix = 0; ENTER(E_surfxml_peer); } YY_BREAK -case 349: +case 351: YY_RULE_SETUP { if (!AX_surfxml_peer_id) FAIL("Required attribute `id' not set for `peer' element."); @@ -8042,11 +8074,11 @@ YY_RULE_SETUP } } YY_BREAK -case 350: +case 352: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of peer element.", surf_parse_text[0]); YY_BREAK -case 351: +case 353: YY_RULE_SETUP FAIL("Bad attribute `%s' in `peer' element start tag.",surf_parse_text); YY_BREAK @@ -8054,8 +8086,8 @@ case YY_STATE_EOF(AL_surfxml_peer): FAIL("EOF in attribute list of `peer' element."); YY_BREAK -case 352: -/* rule 352 can match eol */ +case 354: +/* rule 354 can match eol */ YY_RULE_SETUP { LEAVE; @@ -8068,12 +8100,12 @@ YY_RULE_SETUP } } YY_BREAK -case 353: -/* rule 353 can match eol */ +case 355: +/* rule 355 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 354: +case 356: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -8081,13 +8113,13 @@ case YY_STATE_EOF(E_surfxml_peer): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 355: -/* rule 355 can match eol */ +case 357: +/* rule 357 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 356: -/* rule 356 can match eol */ +case 358: +/* rule 358 can match eol */ YY_RULE_SETUP { AX_surfxml_router_id = 0; @@ -8098,34 +8130,34 @@ YY_RULE_SETUP } YY_BREAK -case 357: -/* rule 357 can match eol */ +case 359: +/* rule 359 can match eol */ YY_RULE_SETUP if (surfxml_router_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_router_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_router_id); YY_BREAK -case 358: -/* rule 358 can match eol */ +case 360: +/* rule 360 can match eol */ YY_RULE_SETUP if (surfxml_router_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_router_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_router_id); YY_BREAK -case 359: -/* rule 359 can match eol */ +case 361: +/* rule 361 can match eol */ YY_RULE_SETUP if (surfxml_router_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in ");} surfxml_router_coordinates_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_router_coordinates); YY_BREAK -case 360: -/* rule 360 can match eol */ +case 362: +/* rule 362 can match eol */ YY_RULE_SETUP if (surfxml_router_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in ");} surfxml_router_coordinates_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_router_coordinates); YY_BREAK -case 361: +case 363: YY_RULE_SETUP { if (!AX_surfxml_router_id) FAIL("Required attribute `id' not set for `router' element."); LEAVE; STag_surfxml_router();surfxml_pcdata_ix = 0; ENTER(E_surfxml_router); } YY_BREAK -case 362: +case 364: YY_RULE_SETUP { if (!AX_surfxml_router_id) FAIL("Required attribute `id' not set for `router' element."); @@ -8135,11 +8167,11 @@ YY_RULE_SETUP } } YY_BREAK -case 363: +case 365: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of router element.", surf_parse_text[0]); YY_BREAK -case 364: +case 366: YY_RULE_SETUP FAIL("Bad attribute `%s' in `router' element start tag.",surf_parse_text); YY_BREAK @@ -8147,8 +8179,8 @@ case YY_STATE_EOF(AL_surfxml_router): FAIL("EOF in attribute list of `router' element."); YY_BREAK -case 365: -/* rule 365 can match eol */ +case 367: +/* rule 367 can match eol */ YY_RULE_SETUP { LEAVE; @@ -8159,12 +8191,12 @@ YY_RULE_SETUP } } YY_BREAK -case 366: -/* rule 366 can match eol */ +case 368: +/* rule 368 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 367: +case 369: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -8172,13 +8204,13 @@ case YY_STATE_EOF(E_surfxml_router): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 368: -/* rule 368 can match eol */ +case 370: +/* rule 370 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 369: -/* rule 369 can match eol */ +case 371: +/* rule 371 can match eol */ YY_RULE_SETUP { AX_surfxml_backbone_id = 0; @@ -8191,37 +8223,37 @@ YY_RULE_SETUP } YY_BREAK -case 370: -/* rule 370 can match eol */ +case 372: +/* rule 372 can match eol */ YY_RULE_SETUP if (surfxml_backbone_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_backbone_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_backbone_id); YY_BREAK -case 371: -/* rule 371 can match eol */ +case 373: +/* rule 373 can match eol */ YY_RULE_SETUP if (surfxml_backbone_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_backbone_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_backbone_id); YY_BREAK -case 372: -/* rule 372 can match eol */ +case 374: +/* rule 374 can match eol */ YY_RULE_SETUP if (surfxml_backbone_bandwidth_isset != 0) {FAIL("Multiple definition of attribute bandwidth in ");} surfxml_backbone_bandwidth_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_backbone_bandwidth); YY_BREAK -case 373: -/* rule 373 can match eol */ +case 375: +/* rule 375 can match eol */ YY_RULE_SETUP if (surfxml_backbone_bandwidth_isset != 0) {FAIL("Multiple definition of attribute bandwidth in ");} surfxml_backbone_bandwidth_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_backbone_bandwidth); YY_BREAK -case 374: -/* rule 374 can match eol */ +case 376: +/* rule 376 can match eol */ YY_RULE_SETUP if (surfxml_backbone_latency_isset != 0) {FAIL("Multiple definition of attribute latency in ");} surfxml_backbone_latency_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_backbone_latency); YY_BREAK -case 375: -/* rule 375 can match eol */ +case 377: +/* rule 377 can match eol */ YY_RULE_SETUP if (surfxml_backbone_latency_isset != 0) {FAIL("Multiple definition of attribute latency in ");} surfxml_backbone_latency_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_backbone_latency); YY_BREAK -case 376: +case 378: YY_RULE_SETUP { if (!AX_surfxml_backbone_id) FAIL("Required attribute `id' not set for `backbone' element."); @@ -8230,7 +8262,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_backbone();surfxml_pcdata_ix = 0; ENTER(E_surfxml_backbone); } YY_BREAK -case 377: +case 379: YY_RULE_SETUP { if (!AX_surfxml_backbone_id) FAIL("Required attribute `id' not set for `backbone' element."); @@ -8243,11 +8275,11 @@ YY_RULE_SETUP } } YY_BREAK -case 378: +case 380: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of backbone element.", surf_parse_text[0]); YY_BREAK -case 379: +case 381: YY_RULE_SETUP FAIL("Bad attribute `%s' in `backbone' element start tag.",surf_parse_text); YY_BREAK @@ -8255,8 +8287,8 @@ case YY_STATE_EOF(AL_surfxml_backbone): FAIL("EOF in attribute list of `backbone' element."); YY_BREAK -case 380: -/* rule 380 can match eol */ +case 382: +/* rule 382 can match eol */ YY_RULE_SETUP { LEAVE; @@ -8268,12 +8300,12 @@ YY_RULE_SETUP } } YY_BREAK -case 381: -/* rule 381 can match eol */ +case 383: +/* rule 383 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 382: +case 384: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -8281,13 +8313,13 @@ case YY_STATE_EOF(E_surfxml_backbone): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 383: -/* rule 383 can match eol */ +case 385: +/* rule 385 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 384: -/* rule 384 can match eol */ +case 386: +/* rule 386 can match eol */ YY_RULE_SETUP { AX_surfxml_link_id = 0; @@ -8305,107 +8337,107 @@ YY_RULE_SETUP AX_surfxml_link_state___file = 0; surfxml_link_state___file_isset = 0; AX_surfxml_link_sharing___policy = A_surfxml_link_sharing___policy_SHARED; - surfxml_link_sharing___policy_isset = 0; - ENTER(AL_surfxml_link); pushbuffer(0); - } - YY_BREAK - -case 385: -/* rule 385 can match eol */ -YY_RULE_SETUP -if (surfxml_link_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_link_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_id); - YY_BREAK -case 386: -/* rule 386 can match eol */ -YY_RULE_SETUP -if (surfxml_link_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_link_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_id); + surfxml_link_sharing___policy_isset = 0; + ENTER(AL_surfxml_link); pushbuffer(0); + } YY_BREAK + case 387: /* rule 387 can match eol */ YY_RULE_SETUP -if (surfxml_link_bandwidth_isset != 0) {FAIL("Multiple definition of attribute bandwidth in ");} surfxml_link_bandwidth_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_bandwidth); +if (surfxml_link_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_link_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_id); YY_BREAK case 388: /* rule 388 can match eol */ YY_RULE_SETUP -if (surfxml_link_bandwidth_isset != 0) {FAIL("Multiple definition of attribute bandwidth in ");} surfxml_link_bandwidth_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_bandwidth); +if (surfxml_link_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_link_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_id); YY_BREAK case 389: /* rule 389 can match eol */ YY_RULE_SETUP -if (surfxml_link_bandwidth___file_isset != 0) {FAIL("Multiple definition of attribute bandwidth_file in ");} surfxml_link_bandwidth___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_bandwidth___file); +if (surfxml_link_bandwidth_isset != 0) {FAIL("Multiple definition of attribute bandwidth in ");} surfxml_link_bandwidth_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_bandwidth); YY_BREAK case 390: /* rule 390 can match eol */ YY_RULE_SETUP -if (surfxml_link_bandwidth___file_isset != 0) {FAIL("Multiple definition of attribute bandwidth_file in ");} surfxml_link_bandwidth___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_bandwidth___file); +if (surfxml_link_bandwidth_isset != 0) {FAIL("Multiple definition of attribute bandwidth in ");} surfxml_link_bandwidth_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_bandwidth); YY_BREAK case 391: /* rule 391 can match eol */ YY_RULE_SETUP -if (surfxml_link_latency_isset != 0) {FAIL("Multiple definition of attribute latency in ");} surfxml_link_latency_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_latency); +if (surfxml_link_bandwidth___file_isset != 0) {FAIL("Multiple definition of attribute bandwidth_file in ");} surfxml_link_bandwidth___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_bandwidth___file); YY_BREAK case 392: /* rule 392 can match eol */ YY_RULE_SETUP -if (surfxml_link_latency_isset != 0) {FAIL("Multiple definition of attribute latency in ");} surfxml_link_latency_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_latency); +if (surfxml_link_bandwidth___file_isset != 0) {FAIL("Multiple definition of attribute bandwidth_file in ");} surfxml_link_bandwidth___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_bandwidth___file); YY_BREAK case 393: /* rule 393 can match eol */ YY_RULE_SETUP -if (surfxml_link_latency___file_isset != 0) {FAIL("Multiple definition of attribute latency_file in ");} surfxml_link_latency___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_latency___file); +if (surfxml_link_latency_isset != 0) {FAIL("Multiple definition of attribute latency in ");} surfxml_link_latency_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_latency); YY_BREAK case 394: /* rule 394 can match eol */ YY_RULE_SETUP -if (surfxml_link_latency___file_isset != 0) {FAIL("Multiple definition of attribute latency_file in ");} surfxml_link_latency___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_latency___file); +if (surfxml_link_latency_isset != 0) {FAIL("Multiple definition of attribute latency in ");} surfxml_link_latency_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_latency); YY_BREAK case 395: /* rule 395 can match eol */ +YY_RULE_SETUP +if (surfxml_link_latency___file_isset != 0) {FAIL("Multiple definition of attribute latency_file in ");} surfxml_link_latency___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_latency___file); + YY_BREAK case 396: /* rule 396 can match eol */ YY_RULE_SETUP -A_surfxml_link_state = A_surfxml_link_state_ON; +if (surfxml_link_latency___file_isset != 0) {FAIL("Multiple definition of attribute latency_file in ");} surfxml_link_latency___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_latency___file); YY_BREAK case 397: /* rule 397 can match eol */ case 398: /* rule 398 can match eol */ YY_RULE_SETUP -A_surfxml_link_state = A_surfxml_link_state_OFF; +A_surfxml_link_state = A_surfxml_link_state_ON; YY_BREAK case 399: /* rule 399 can match eol */ -YY_RULE_SETUP -if (surfxml_link_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in ");} surfxml_link_state___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_state___file); - YY_BREAK case 400: /* rule 400 can match eol */ YY_RULE_SETUP -if (surfxml_link_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in ");} surfxml_link_state___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_state___file); +A_surfxml_link_state = A_surfxml_link_state_OFF; YY_BREAK case 401: /* rule 401 can match eol */ +YY_RULE_SETUP +if (surfxml_link_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in ");} surfxml_link_state___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_state___file); + YY_BREAK case 402: /* rule 402 can match eol */ YY_RULE_SETUP -A_surfxml_link_sharing___policy = A_surfxml_link_sharing___policy_SHARED; +if (surfxml_link_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in ");} surfxml_link_state___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_state___file); YY_BREAK case 403: /* rule 403 can match eol */ case 404: /* rule 404 can match eol */ YY_RULE_SETUP -A_surfxml_link_sharing___policy = A_surfxml_link_sharing___policy_FATPIPE; +A_surfxml_link_sharing___policy = A_surfxml_link_sharing___policy_SHARED; YY_BREAK case 405: /* rule 405 can match eol */ case 406: /* rule 406 can match eol */ YY_RULE_SETUP -A_surfxml_link_sharing___policy = A_surfxml_link_sharing___policy_FULLDUPLEX; +A_surfxml_link_sharing___policy = A_surfxml_link_sharing___policy_FATPIPE; YY_BREAK case 407: +/* rule 407 can match eol */ +case 408: +/* rule 408 can match eol */ +YY_RULE_SETUP +A_surfxml_link_sharing___policy = A_surfxml_link_sharing___policy_FULLDUPLEX; + YY_BREAK +case 409: YY_RULE_SETUP { if (!AX_surfxml_link_id) FAIL("Required attribute `id' not set for `link' element."); @@ -8413,7 +8445,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_link();surfxml_pcdata_ix = 0; ENTER(S_surfxml_link); } YY_BREAK -case 408: +case 410: YY_RULE_SETUP { if (!AX_surfxml_link_id) FAIL("Required attribute `id' not set for `link' element."); @@ -8425,11 +8457,11 @@ YY_RULE_SETUP } } YY_BREAK -case 409: +case 411: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of link element.", surf_parse_text[0]); YY_BREAK -case 410: +case 412: YY_RULE_SETUP FAIL("Bad attribute `%s' in `link' element start tag.",surf_parse_text); YY_BREAK @@ -8437,8 +8469,8 @@ case YY_STATE_EOF(AL_surfxml_link): FAIL("EOF in attribute list of `link' element."); YY_BREAK -case 411: -/* rule 411 can match eol */ +case 413: +/* rule 413 can match eol */ YY_RULE_SETUP { LEAVE; @@ -8450,12 +8482,12 @@ YY_RULE_SETUP } } YY_BREAK -case 412: -/* rule 412 can match eol */ +case 414: +/* rule 414 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 413: +case 415: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -8465,13 +8497,13 @@ case YY_STATE_EOF(S_surfxml_link): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 414: -/* rule 414 can match eol */ +case 416: +/* rule 416 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 415: -/* rule 415 can match eol */ +case 417: +/* rule 417 can match eol */ YY_RULE_SETUP { AX_surfxml_route_src = 0; @@ -8484,41 +8516,41 @@ YY_RULE_SETUP } YY_BREAK -case 416: -/* rule 416 can match eol */ -YY_RULE_SETUP -if (surfxml_route_src_isset != 0) {FAIL("Multiple definition of attribute src in ");} surfxml_route_src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_route_src); - YY_BREAK -case 417: -/* rule 417 can match eol */ -YY_RULE_SETUP -if (surfxml_route_src_isset != 0) {FAIL("Multiple definition of attribute src in ");} surfxml_route_src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_route_src); - YY_BREAK case 418: /* rule 418 can match eol */ YY_RULE_SETUP -if (surfxml_route_dst_isset != 0) {FAIL("Multiple definition of attribute dst in ");} surfxml_route_dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_route_dst); +if (surfxml_route_src_isset != 0) {FAIL("Multiple definition of attribute src in ");} surfxml_route_src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_route_src); YY_BREAK case 419: /* rule 419 can match eol */ YY_RULE_SETUP -if (surfxml_route_dst_isset != 0) {FAIL("Multiple definition of attribute dst in ");} surfxml_route_dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_route_dst); +if (surfxml_route_src_isset != 0) {FAIL("Multiple definition of attribute src in ");} surfxml_route_src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_route_src); YY_BREAK case 420: /* rule 420 can match eol */ +YY_RULE_SETUP +if (surfxml_route_dst_isset != 0) {FAIL("Multiple definition of attribute dst in ");} surfxml_route_dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_route_dst); + YY_BREAK case 421: /* rule 421 can match eol */ YY_RULE_SETUP -A_surfxml_route_symmetrical = A_surfxml_route_symmetrical_YES; +if (surfxml_route_dst_isset != 0) {FAIL("Multiple definition of attribute dst in ");} surfxml_route_dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_route_dst); YY_BREAK case 422: /* rule 422 can match eol */ case 423: /* rule 423 can match eol */ YY_RULE_SETUP -A_surfxml_route_symmetrical = A_surfxml_route_symmetrical_NO; +A_surfxml_route_symmetrical = A_surfxml_route_symmetrical_YES; YY_BREAK case 424: +/* rule 424 can match eol */ +case 425: +/* rule 425 can match eol */ +YY_RULE_SETUP +A_surfxml_route_symmetrical = A_surfxml_route_symmetrical_NO; + YY_BREAK +case 426: YY_RULE_SETUP { if (!AX_surfxml_route_src) FAIL("Required attribute `src' not set for `route' element."); @@ -8526,7 +8558,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_route();surfxml_pcdata_ix = 0; ENTER(S_surfxml_route); } YY_BREAK -case 425: +case 427: YY_RULE_SETUP { if (!AX_surfxml_route_src) FAIL("Required attribute `src' not set for `route' element."); @@ -8537,11 +8569,11 @@ YY_RULE_SETUP } } YY_BREAK -case 426: +case 428: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of route element.", surf_parse_text[0]); YY_BREAK -case 427: +case 429: YY_RULE_SETUP FAIL("Bad attribute `%s' in `route' element start tag.",surf_parse_text); YY_BREAK @@ -8549,8 +8581,8 @@ case YY_STATE_EOF(AL_surfxml_route): FAIL("EOF in attribute list of `route' element."); YY_BREAK -case 428: -/* rule 428 can match eol */ +case 430: +/* rule 430 can match eol */ YY_RULE_SETUP { LEAVE; @@ -8561,12 +8593,12 @@ YY_RULE_SETUP } } YY_BREAK -case 429: -/* rule 429 can match eol */ +case 431: +/* rule 431 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 430: +case 432: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -8576,13 +8608,13 @@ case YY_STATE_EOF(E_surfxml_route): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 431: -/* rule 431 can match eol */ +case 433: +/* rule 433 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 432: -/* rule 432 can match eol */ +case 434: +/* rule 434 can match eol */ YY_RULE_SETUP { AX_surfxml_ASroute_src = 0; @@ -8599,61 +8631,61 @@ YY_RULE_SETUP } YY_BREAK -case 433: -/* rule 433 can match eol */ -YY_RULE_SETUP -if (surfxml_ASroute_src_isset != 0) {FAIL("Multiple definition of attribute src in ");} surfxml_ASroute_src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_ASroute_src); - YY_BREAK -case 434: -/* rule 434 can match eol */ -YY_RULE_SETUP -if (surfxml_ASroute_src_isset != 0) {FAIL("Multiple definition of attribute src in ");} surfxml_ASroute_src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_ASroute_src); - YY_BREAK case 435: /* rule 435 can match eol */ YY_RULE_SETUP -if (surfxml_ASroute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in ");} surfxml_ASroute_dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_ASroute_dst); +if (surfxml_ASroute_src_isset != 0) {FAIL("Multiple definition of attribute src in ");} surfxml_ASroute_src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_ASroute_src); YY_BREAK case 436: /* rule 436 can match eol */ YY_RULE_SETUP -if (surfxml_ASroute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in ");} surfxml_ASroute_dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_ASroute_dst); +if (surfxml_ASroute_src_isset != 0) {FAIL("Multiple definition of attribute src in ");} surfxml_ASroute_src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_ASroute_src); YY_BREAK case 437: /* rule 437 can match eol */ YY_RULE_SETUP -if (surfxml_ASroute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in ");} surfxml_ASroute_gw___src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_ASroute_gw___src); +if (surfxml_ASroute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in ");} surfxml_ASroute_dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_ASroute_dst); YY_BREAK case 438: /* rule 438 can match eol */ YY_RULE_SETUP -if (surfxml_ASroute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in ");} surfxml_ASroute_gw___src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_ASroute_gw___src); +if (surfxml_ASroute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in ");} surfxml_ASroute_dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_ASroute_dst); YY_BREAK case 439: /* rule 439 can match eol */ YY_RULE_SETUP -if (surfxml_ASroute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in ");} surfxml_ASroute_gw___dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_ASroute_gw___dst); +if (surfxml_ASroute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in ");} surfxml_ASroute_gw___src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_ASroute_gw___src); YY_BREAK case 440: /* rule 440 can match eol */ YY_RULE_SETUP -if (surfxml_ASroute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in ");} surfxml_ASroute_gw___dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_ASroute_gw___dst); +if (surfxml_ASroute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in ");} surfxml_ASroute_gw___src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_ASroute_gw___src); YY_BREAK case 441: /* rule 441 can match eol */ +YY_RULE_SETUP +if (surfxml_ASroute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in ");} surfxml_ASroute_gw___dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_ASroute_gw___dst); + YY_BREAK case 442: /* rule 442 can match eol */ YY_RULE_SETUP -A_surfxml_ASroute_symmetrical = A_surfxml_ASroute_symmetrical_YES; +if (surfxml_ASroute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in ");} surfxml_ASroute_gw___dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_ASroute_gw___dst); YY_BREAK case 443: /* rule 443 can match eol */ case 444: /* rule 444 can match eol */ YY_RULE_SETUP -A_surfxml_ASroute_symmetrical = A_surfxml_ASroute_symmetrical_NO; +A_surfxml_ASroute_symmetrical = A_surfxml_ASroute_symmetrical_YES; YY_BREAK case 445: +/* rule 445 can match eol */ +case 446: +/* rule 446 can match eol */ +YY_RULE_SETUP +A_surfxml_ASroute_symmetrical = A_surfxml_ASroute_symmetrical_NO; + YY_BREAK +case 447: YY_RULE_SETUP { if (!AX_surfxml_ASroute_src) FAIL("Required attribute `src' not set for `ASroute' element."); @@ -8663,7 +8695,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_ASroute();surfxml_pcdata_ix = 0; ENTER(S_surfxml_ASroute); } YY_BREAK -case 446: +case 448: YY_RULE_SETUP { if (!AX_surfxml_ASroute_src) FAIL("Required attribute `src' not set for `ASroute' element."); @@ -8676,11 +8708,11 @@ YY_RULE_SETUP } } YY_BREAK -case 447: +case 449: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of ASroute element.", surf_parse_text[0]); YY_BREAK -case 448: +case 450: YY_RULE_SETUP FAIL("Bad attribute `%s' in `ASroute' element start tag.",surf_parse_text); YY_BREAK @@ -8688,8 +8720,8 @@ case YY_STATE_EOF(AL_surfxml_ASroute): FAIL("EOF in attribute list of `ASroute' element."); YY_BREAK -case 449: -/* rule 449 can match eol */ +case 451: +/* rule 451 can match eol */ YY_RULE_SETUP { LEAVE; @@ -8700,12 +8732,12 @@ YY_RULE_SETUP } } YY_BREAK -case 450: -/* rule 450 can match eol */ +case 452: +/* rule 452 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 451: +case 453: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -8715,13 +8747,13 @@ case YY_STATE_EOF(S_surfxml_ASroute_2): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 452: -/* rule 452 can match eol */ +case 454: +/* rule 454 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 453: -/* rule 453 can match eol */ +case 455: +/* rule 455 can match eol */ YY_RULE_SETUP { AX_surfxml_link___ctn_id = 0; @@ -8732,45 +8764,45 @@ YY_RULE_SETUP } YY_BREAK -case 454: -/* rule 454 can match eol */ +case 456: +/* rule 456 can match eol */ YY_RULE_SETUP if (surfxml_link___ctn_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_link___ctn_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link___ctn_id); YY_BREAK -case 455: -/* rule 455 can match eol */ -YY_RULE_SETUP -if (surfxml_link___ctn_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_link___ctn_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link___ctn_id); - YY_BREAK -case 456: -/* rule 456 can match eol */ case 457: /* rule 457 can match eol */ YY_RULE_SETUP -A_surfxml_link___ctn_direction = A_surfxml_link___ctn_direction_UP; +if (surfxml_link___ctn_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_link___ctn_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link___ctn_id); YY_BREAK case 458: /* rule 458 can match eol */ case 459: /* rule 459 can match eol */ YY_RULE_SETUP -A_surfxml_link___ctn_direction = A_surfxml_link___ctn_direction_DOWN; +A_surfxml_link___ctn_direction = A_surfxml_link___ctn_direction_UP; YY_BREAK case 460: /* rule 460 can match eol */ case 461: /* rule 461 can match eol */ YY_RULE_SETUP -A_surfxml_link___ctn_direction = A_surfxml_link___ctn_direction_NONE; +A_surfxml_link___ctn_direction = A_surfxml_link___ctn_direction_DOWN; YY_BREAK case 462: +/* rule 462 can match eol */ +case 463: +/* rule 463 can match eol */ +YY_RULE_SETUP +A_surfxml_link___ctn_direction = A_surfxml_link___ctn_direction_NONE; + YY_BREAK +case 464: YY_RULE_SETUP { if (!AX_surfxml_link___ctn_id) FAIL("Required attribute `id' not set for `link_ctn' element."); LEAVE; STag_surfxml_link___ctn();surfxml_pcdata_ix = 0; ENTER(E_surfxml_link___ctn); } YY_BREAK -case 463: +case 465: YY_RULE_SETUP { if (!AX_surfxml_link___ctn_id) FAIL("Required attribute `id' not set for `link_ctn' element."); @@ -8783,11 +8815,11 @@ YY_RULE_SETUP } } YY_BREAK -case 464: +case 466: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of link_ctn element.", surf_parse_text[0]); YY_BREAK -case 465: +case 467: YY_RULE_SETUP FAIL("Bad attribute `%s' in `link_ctn' element start tag.",surf_parse_text); YY_BREAK @@ -8795,8 +8827,8 @@ case YY_STATE_EOF(AL_surfxml_link___ctn): FAIL("EOF in attribute list of `link_ctn' element."); YY_BREAK -case 466: -/* rule 466 can match eol */ +case 468: +/* rule 468 can match eol */ YY_RULE_SETUP { LEAVE; @@ -8810,12 +8842,12 @@ YY_RULE_SETUP } } YY_BREAK -case 467: -/* rule 467 can match eol */ +case 469: +/* rule 469 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 468: +case 470: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -8823,13 +8855,13 @@ case YY_STATE_EOF(E_surfxml_link___ctn): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 469: -/* rule 469 can match eol */ +case 471: +/* rule 471 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 470: -/* rule 470 can match eol */ +case 472: +/* rule 472 can match eol */ YY_RULE_SETUP { AX_surfxml_bypassRoute_src = 0; @@ -8840,27 +8872,27 @@ YY_RULE_SETUP } YY_BREAK -case 471: -/* rule 471 can match eol */ +case 473: +/* rule 473 can match eol */ YY_RULE_SETUP if (surfxml_bypassRoute_src_isset != 0) {FAIL("Multiple definition of attribute src in ");} surfxml_bypassRoute_src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassRoute_src); YY_BREAK -case 472: -/* rule 472 can match eol */ +case 474: +/* rule 474 can match eol */ YY_RULE_SETUP if (surfxml_bypassRoute_src_isset != 0) {FAIL("Multiple definition of attribute src in ");} surfxml_bypassRoute_src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassRoute_src); YY_BREAK -case 473: -/* rule 473 can match eol */ +case 475: +/* rule 475 can match eol */ YY_RULE_SETUP if (surfxml_bypassRoute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in ");} surfxml_bypassRoute_dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassRoute_dst); YY_BREAK -case 474: -/* rule 474 can match eol */ +case 476: +/* rule 476 can match eol */ YY_RULE_SETUP if (surfxml_bypassRoute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in ");} surfxml_bypassRoute_dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassRoute_dst); YY_BREAK -case 475: +case 477: YY_RULE_SETUP { if (!AX_surfxml_bypassRoute_src) FAIL("Required attribute `src' not set for `bypassRoute' element."); @@ -8868,7 +8900,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_bypassRoute();surfxml_pcdata_ix = 0; ENTER(S_surfxml_bypassRoute); } YY_BREAK -case 476: +case 478: YY_RULE_SETUP { if (!AX_surfxml_bypassRoute_src) FAIL("Required attribute `src' not set for `bypassRoute' element."); @@ -8879,11 +8911,11 @@ YY_RULE_SETUP } } YY_BREAK -case 477: +case 479: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of bypassRoute element.", surf_parse_text[0]); YY_BREAK -case 478: +case 480: YY_RULE_SETUP FAIL("Bad attribute `%s' in `bypassRoute' element start tag.",surf_parse_text); YY_BREAK @@ -8891,8 +8923,8 @@ case YY_STATE_EOF(AL_surfxml_bypassRoute): FAIL("EOF in attribute list of `bypassRoute' element."); YY_BREAK -case 479: -/* rule 479 can match eol */ +case 481: +/* rule 481 can match eol */ YY_RULE_SETUP { LEAVE; @@ -8903,12 +8935,12 @@ YY_RULE_SETUP } } YY_BREAK -case 480: -/* rule 480 can match eol */ +case 482: +/* rule 482 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 481: +case 483: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -8918,13 +8950,13 @@ case YY_STATE_EOF(E_surfxml_bypassRoute): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 482: -/* rule 482 can match eol */ +case 484: +/* rule 484 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 483: -/* rule 483 can match eol */ +case 485: +/* rule 485 can match eol */ YY_RULE_SETUP { AX_surfxml_bypassASroute_src = 0; @@ -8936,50 +8968,50 @@ YY_RULE_SETUP AX_surfxml_bypassASroute_gw___dst = 0; surfxml_bypassASroute_gw___dst_isset = 0; ENTER(AL_surfxml_bypassASroute); pushbuffer(0); - } - YY_BREAK - -case 484: -/* rule 484 can match eol */ -YY_RULE_SETUP -if (surfxml_bypassASroute_src_isset != 0) {FAIL("Multiple definition of attribute src in ");} surfxml_bypassASroute_src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassASroute_src); - YY_BREAK -case 485: -/* rule 485 can match eol */ -YY_RULE_SETUP -if (surfxml_bypassASroute_src_isset != 0) {FAIL("Multiple definition of attribute src in ");} surfxml_bypassASroute_src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassASroute_src); + } YY_BREAK + case 486: /* rule 486 can match eol */ YY_RULE_SETUP -if (surfxml_bypassASroute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in ");} surfxml_bypassASroute_dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassASroute_dst); +if (surfxml_bypassASroute_src_isset != 0) {FAIL("Multiple definition of attribute src in ");} surfxml_bypassASroute_src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassASroute_src); YY_BREAK case 487: /* rule 487 can match eol */ YY_RULE_SETUP -if (surfxml_bypassASroute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in ");} surfxml_bypassASroute_dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassASroute_dst); +if (surfxml_bypassASroute_src_isset != 0) {FAIL("Multiple definition of attribute src in ");} surfxml_bypassASroute_src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassASroute_src); YY_BREAK case 488: /* rule 488 can match eol */ YY_RULE_SETUP -if (surfxml_bypassASroute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in ");} surfxml_bypassASroute_gw___src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassASroute_gw___src); +if (surfxml_bypassASroute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in ");} surfxml_bypassASroute_dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassASroute_dst); YY_BREAK case 489: /* rule 489 can match eol */ YY_RULE_SETUP -if (surfxml_bypassASroute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in ");} surfxml_bypassASroute_gw___src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassASroute_gw___src); +if (surfxml_bypassASroute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in ");} surfxml_bypassASroute_dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassASroute_dst); YY_BREAK case 490: /* rule 490 can match eol */ YY_RULE_SETUP -if (surfxml_bypassASroute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in ");} surfxml_bypassASroute_gw___dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassASroute_gw___dst); +if (surfxml_bypassASroute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in ");} surfxml_bypassASroute_gw___src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassASroute_gw___src); YY_BREAK case 491: /* rule 491 can match eol */ YY_RULE_SETUP -if (surfxml_bypassASroute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in ");} surfxml_bypassASroute_gw___dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassASroute_gw___dst); +if (surfxml_bypassASroute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in ");} surfxml_bypassASroute_gw___src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassASroute_gw___src); YY_BREAK case 492: +/* rule 492 can match eol */ +YY_RULE_SETUP +if (surfxml_bypassASroute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in ");} surfxml_bypassASroute_gw___dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassASroute_gw___dst); + YY_BREAK +case 493: +/* rule 493 can match eol */ +YY_RULE_SETUP +if (surfxml_bypassASroute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in ");} surfxml_bypassASroute_gw___dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassASroute_gw___dst); + YY_BREAK +case 494: YY_RULE_SETUP { if (!AX_surfxml_bypassASroute_src) FAIL("Required attribute `src' not set for `bypassASroute' element."); @@ -8989,7 +9021,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_bypassASroute();surfxml_pcdata_ix = 0; ENTER(S_surfxml_bypassASroute); } YY_BREAK -case 493: +case 495: YY_RULE_SETUP { if (!AX_surfxml_bypassASroute_src) FAIL("Required attribute `src' not set for `bypassASroute' element."); @@ -9002,11 +9034,11 @@ YY_RULE_SETUP } } YY_BREAK -case 494: +case 496: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of bypassASroute element.", surf_parse_text[0]); YY_BREAK -case 495: +case 497: YY_RULE_SETUP FAIL("Bad attribute `%s' in `bypassASroute' element start tag.",surf_parse_text); YY_BREAK @@ -9014,8 +9046,8 @@ case YY_STATE_EOF(AL_surfxml_bypassASroute): FAIL("EOF in attribute list of `bypassASroute' element."); YY_BREAK -case 496: -/* rule 496 can match eol */ +case 498: +/* rule 498 can match eol */ YY_RULE_SETUP { LEAVE; @@ -9026,12 +9058,12 @@ YY_RULE_SETUP } } YY_BREAK -case 497: -/* rule 497 can match eol */ +case 499: +/* rule 499 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 498: +case 500: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -9041,13 +9073,13 @@ case YY_STATE_EOF(S_surfxml_bypassASroute): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 499: -/* rule 499 can match eol */ +case 501: +/* rule 501 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 500: -/* rule 500 can match eol */ +case 502: +/* rule 502 can match eol */ YY_RULE_SETUP { AX_surfxml_process_host = 0; @@ -9064,61 +9096,61 @@ YY_RULE_SETUP } YY_BREAK -case 501: -/* rule 501 can match eol */ -YY_RULE_SETUP -if (surfxml_process_host_isset != 0) {FAIL("Multiple definition of attribute host in ");} surfxml_process_host_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_process_host); - YY_BREAK -case 502: -/* rule 502 can match eol */ -YY_RULE_SETUP -if (surfxml_process_host_isset != 0) {FAIL("Multiple definition of attribute host in ");} surfxml_process_host_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_process_host); - YY_BREAK case 503: /* rule 503 can match eol */ YY_RULE_SETUP -if (surfxml_process_function_isset != 0) {FAIL("Multiple definition of attribute function in ");} surfxml_process_function_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_process_function); +if (surfxml_process_host_isset != 0) {FAIL("Multiple definition of attribute host in ");} surfxml_process_host_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_process_host); YY_BREAK case 504: /* rule 504 can match eol */ YY_RULE_SETUP -if (surfxml_process_function_isset != 0) {FAIL("Multiple definition of attribute function in ");} surfxml_process_function_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_process_function); +if (surfxml_process_host_isset != 0) {FAIL("Multiple definition of attribute host in ");} surfxml_process_host_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_process_host); YY_BREAK case 505: /* rule 505 can match eol */ YY_RULE_SETUP -if (surfxml_process_start___time_isset != 0) {FAIL("Multiple definition of attribute start_time in ");} surfxml_process_start___time_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_process_start___time); +if (surfxml_process_function_isset != 0) {FAIL("Multiple definition of attribute function in ");} surfxml_process_function_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_process_function); YY_BREAK case 506: /* rule 506 can match eol */ YY_RULE_SETUP -if (surfxml_process_start___time_isset != 0) {FAIL("Multiple definition of attribute start_time in ");} surfxml_process_start___time_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_process_start___time); +if (surfxml_process_function_isset != 0) {FAIL("Multiple definition of attribute function in ");} surfxml_process_function_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_process_function); YY_BREAK case 507: /* rule 507 can match eol */ YY_RULE_SETUP -if (surfxml_process_kill___time_isset != 0) {FAIL("Multiple definition of attribute kill_time in ");} surfxml_process_kill___time_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_process_kill___time); +if (surfxml_process_start___time_isset != 0) {FAIL("Multiple definition of attribute start_time in ");} surfxml_process_start___time_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_process_start___time); YY_BREAK case 508: /* rule 508 can match eol */ YY_RULE_SETUP -if (surfxml_process_kill___time_isset != 0) {FAIL("Multiple definition of attribute kill_time in ");} surfxml_process_kill___time_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_process_kill___time); +if (surfxml_process_start___time_isset != 0) {FAIL("Multiple definition of attribute start_time in ");} surfxml_process_start___time_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_process_start___time); YY_BREAK case 509: /* rule 509 can match eol */ +YY_RULE_SETUP +if (surfxml_process_kill___time_isset != 0) {FAIL("Multiple definition of attribute kill_time in ");} surfxml_process_kill___time_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_process_kill___time); + YY_BREAK case 510: /* rule 510 can match eol */ YY_RULE_SETUP -A_surfxml_process_on___failure = A_surfxml_process_on___failure_DIE; +if (surfxml_process_kill___time_isset != 0) {FAIL("Multiple definition of attribute kill_time in ");} surfxml_process_kill___time_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_process_kill___time); YY_BREAK case 511: /* rule 511 can match eol */ case 512: /* rule 512 can match eol */ YY_RULE_SETUP -A_surfxml_process_on___failure = A_surfxml_process_on___failure_RESTART; +A_surfxml_process_on___failure = A_surfxml_process_on___failure_DIE; YY_BREAK case 513: +/* rule 513 can match eol */ +case 514: +/* rule 514 can match eol */ +YY_RULE_SETUP +A_surfxml_process_on___failure = A_surfxml_process_on___failure_RESTART; + YY_BREAK +case 515: YY_RULE_SETUP { if (!AX_surfxml_process_host) FAIL("Required attribute `host' not set for `process' element."); @@ -9126,7 +9158,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_process();surfxml_pcdata_ix = 0; ENTER(S_surfxml_process); } YY_BREAK -case 514: +case 516: YY_RULE_SETUP { if (!AX_surfxml_process_host) FAIL("Required attribute `host' not set for `process' element."); @@ -9137,11 +9169,11 @@ YY_RULE_SETUP } } YY_BREAK -case 515: +case 517: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of process element.", surf_parse_text[0]); YY_BREAK -case 516: +case 518: YY_RULE_SETUP FAIL("Bad attribute `%s' in `process' element start tag.",surf_parse_text); YY_BREAK @@ -9149,8 +9181,8 @@ case YY_STATE_EOF(AL_surfxml_process): FAIL("EOF in attribute list of `process' element."); YY_BREAK -case 517: -/* rule 517 can match eol */ +case 519: +/* rule 519 can match eol */ YY_RULE_SETUP { LEAVE; @@ -9161,12 +9193,12 @@ YY_RULE_SETUP } } YY_BREAK -case 518: -/* rule 518 can match eol */ +case 520: +/* rule 520 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 519: +case 521: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -9176,13 +9208,13 @@ case YY_STATE_EOF(S_surfxml_process_2): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 520: -/* rule 520 can match eol */ +case 522: +/* rule 522 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 521: -/* rule 521 can match eol */ +case 523: +/* rule 523 can match eol */ YY_RULE_SETUP { AX_surfxml_argument_value = 0; @@ -9191,24 +9223,24 @@ YY_RULE_SETUP } YY_BREAK -case 522: -/* rule 522 can match eol */ +case 524: +/* rule 524 can match eol */ YY_RULE_SETUP if (surfxml_argument_value_isset != 0) {FAIL("Multiple definition of attribute value in ");} surfxml_argument_value_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_argument_value); YY_BREAK -case 523: -/* rule 523 can match eol */ +case 525: +/* rule 525 can match eol */ YY_RULE_SETUP if (surfxml_argument_value_isset != 0) {FAIL("Multiple definition of attribute value in ");} surfxml_argument_value_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_argument_value); YY_BREAK -case 524: +case 526: YY_RULE_SETUP { if (!AX_surfxml_argument_value) FAIL("Required attribute `value' not set for `argument' element."); LEAVE; STag_surfxml_argument();surfxml_pcdata_ix = 0; ENTER(E_surfxml_argument); } YY_BREAK -case 525: +case 527: YY_RULE_SETUP { if (!AX_surfxml_argument_value) FAIL("Required attribute `value' not set for `argument' element."); @@ -9218,11 +9250,11 @@ YY_RULE_SETUP } } YY_BREAK -case 526: +case 528: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of argument element.", surf_parse_text[0]); YY_BREAK -case 527: +case 529: YY_RULE_SETUP FAIL("Bad attribute `%s' in `argument' element start tag.",surf_parse_text); YY_BREAK @@ -9230,8 +9262,8 @@ case YY_STATE_EOF(AL_surfxml_argument): FAIL("EOF in attribute list of `argument' element."); YY_BREAK -case 528: -/* rule 528 can match eol */ +case 530: +/* rule 530 can match eol */ YY_RULE_SETUP { LEAVE; @@ -9242,12 +9274,12 @@ YY_RULE_SETUP } } YY_BREAK -case 529: -/* rule 529 can match eol */ +case 531: +/* rule 531 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 530: +case 532: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -9255,13 +9287,13 @@ case YY_STATE_EOF(E_surfxml_argument): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 531: -/* rule 531 can match eol */ +case 533: +/* rule 533 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 532: -/* rule 532 can match eol */ +case 534: +/* rule 534 can match eol */ YY_RULE_SETUP { AX_surfxml_config_id = 0; @@ -9270,23 +9302,23 @@ YY_RULE_SETUP } YY_BREAK -case 533: -/* rule 533 can match eol */ +case 535: +/* rule 535 can match eol */ YY_RULE_SETUP if (surfxml_config_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_config_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_config_id); YY_BREAK -case 534: -/* rule 534 can match eol */ +case 536: +/* rule 536 can match eol */ YY_RULE_SETUP if (surfxml_config_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_config_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_config_id); YY_BREAK -case 535: +case 537: YY_RULE_SETUP { LEAVE; STag_surfxml_config();surfxml_pcdata_ix = 0; ENTER(S_surfxml_config); } YY_BREAK -case 536: +case 538: YY_RULE_SETUP { LEAVE; STag_surfxml_config(); surfxml_pcdata_ix = 0; ETag_surfxml_config(); popbuffer(); /* attribute */ @@ -9295,11 +9327,11 @@ YY_RULE_SETUP } } YY_BREAK -case 537: +case 539: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of config element.", surf_parse_text[0]); YY_BREAK -case 538: +case 540: YY_RULE_SETUP FAIL("Bad attribute `%s' in `config' element start tag.",surf_parse_text); YY_BREAK @@ -9307,8 +9339,8 @@ case YY_STATE_EOF(AL_surfxml_config): FAIL("EOF in attribute list of `config' element."); YY_BREAK -case 539: -/* rule 539 can match eol */ +case 541: +/* rule 541 can match eol */ YY_RULE_SETUP { LEAVE; @@ -9319,12 +9351,12 @@ YY_RULE_SETUP } } YY_BREAK -case 540: -/* rule 540 can match eol */ +case 542: +/* rule 542 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 541: +case 543: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -9336,13 +9368,13 @@ if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); /* * */ -case 542: -/* rule 542 can match eol */ +case 544: +/* rule 544 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 543: -/* rule 543 can match eol */ +case 545: +/* rule 545 can match eol */ YY_RULE_SETUP { AX_surfxml_prop_id = 0; @@ -9353,27 +9385,27 @@ YY_RULE_SETUP } YY_BREAK -case 544: -/* rule 544 can match eol */ +case 546: +/* rule 546 can match eol */ YY_RULE_SETUP if (surfxml_prop_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_prop_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_prop_id); YY_BREAK -case 545: -/* rule 545 can match eol */ +case 547: +/* rule 547 can match eol */ YY_RULE_SETUP if (surfxml_prop_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_prop_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_prop_id); YY_BREAK -case 546: -/* rule 546 can match eol */ +case 548: +/* rule 548 can match eol */ YY_RULE_SETUP if (surfxml_prop_value_isset != 0) {FAIL("Multiple definition of attribute value in ");} surfxml_prop_value_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_prop_value); YY_BREAK -case 547: -/* rule 547 can match eol */ +case 549: +/* rule 549 can match eol */ YY_RULE_SETUP if (surfxml_prop_value_isset != 0) {FAIL("Multiple definition of attribute value in ");} surfxml_prop_value_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_prop_value); YY_BREAK -case 548: +case 550: YY_RULE_SETUP { if (!AX_surfxml_prop_id) FAIL("Required attribute `id' not set for `prop' element."); @@ -9381,7 +9413,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_prop();surfxml_pcdata_ix = 0; ENTER(E_surfxml_prop); } YY_BREAK -case 549: +case 551: YY_RULE_SETUP { if (!AX_surfxml_prop_id) FAIL("Required attribute `id' not set for `prop' element."); @@ -9399,11 +9431,11 @@ YY_RULE_SETUP } } YY_BREAK -case 550: +case 552: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of prop element.", surf_parse_text[0]); YY_BREAK -case 551: +case 553: YY_RULE_SETUP FAIL("Bad attribute `%s' in `prop' element start tag.",surf_parse_text); YY_BREAK @@ -9411,8 +9443,8 @@ case YY_STATE_EOF(AL_surfxml_prop): FAIL("EOF in attribute list of `prop' element."); YY_BREAK -case 552: -/* rule 552 can match eol */ +case 554: +/* rule 554 can match eol */ YY_RULE_SETUP { LEAVE; @@ -9430,12 +9462,12 @@ YY_RULE_SETUP } } YY_BREAK -case 553: -/* rule 553 can match eol */ +case 555: +/* rule 555 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 554: +case 556: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -9445,13 +9477,13 @@ if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); /* * */ -case 555: -/* rule 555 can match eol */ +case 557: +/* rule 557 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 556: -/* rule 556 can match eol */ +case 558: +/* rule 558 can match eol */ YY_RULE_SETUP { AX_surfxml_model___prop_id = 0; @@ -9462,27 +9494,27 @@ YY_RULE_SETUP } YY_BREAK -case 557: -/* rule 557 can match eol */ +case 559: +/* rule 559 can match eol */ YY_RULE_SETUP if (surfxml_model___prop_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_model___prop_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_model___prop_id); YY_BREAK -case 558: -/* rule 558 can match eol */ +case 560: +/* rule 560 can match eol */ YY_RULE_SETUP if (surfxml_model___prop_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_model___prop_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_model___prop_id); YY_BREAK -case 559: -/* rule 559 can match eol */ +case 561: +/* rule 561 can match eol */ YY_RULE_SETUP if (surfxml_model___prop_value_isset != 0) {FAIL("Multiple definition of attribute value in ");} surfxml_model___prop_value_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_model___prop_value); YY_BREAK -case 560: -/* rule 560 can match eol */ +case 562: +/* rule 562 can match eol */ YY_RULE_SETUP if (surfxml_model___prop_value_isset != 0) {FAIL("Multiple definition of attribute value in ");} surfxml_model___prop_value_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_model___prop_value); YY_BREAK -case 561: +case 563: YY_RULE_SETUP { if (!AX_surfxml_model___prop_id) FAIL("Required attribute `id' not set for `model_prop' element."); @@ -9490,7 +9522,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_model___prop();surfxml_pcdata_ix = 0; ENTER(E_surfxml_model___prop); } YY_BREAK -case 562: +case 564: YY_RULE_SETUP { if (!AX_surfxml_model___prop_id) FAIL("Required attribute `id' not set for `model_prop' element."); @@ -9501,11 +9533,11 @@ YY_RULE_SETUP } } YY_BREAK -case 563: +case 565: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of model_prop element.", surf_parse_text[0]); YY_BREAK -case 564: +case 566: YY_RULE_SETUP FAIL("Bad attribute `%s' in `model_prop' element start tag.",surf_parse_text); YY_BREAK @@ -9513,8 +9545,8 @@ case YY_STATE_EOF(AL_surfxml_model___prop): FAIL("EOF in attribute list of `model_prop' element."); YY_BREAK -case 565: -/* rule 565 can match eol */ +case 567: +/* rule 567 can match eol */ YY_RULE_SETUP { LEAVE; @@ -9525,12 +9557,12 @@ YY_RULE_SETUP } } YY_BREAK -case 566: -/* rule 566 can match eol */ +case 568: +/* rule 568 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 567: +case 569: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -9540,7 +9572,7 @@ if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected. /* EPILOG: after the root element. */ -case 568: +case 570: YY_RULE_SETUP {SET(PROLOG); yyless(0); CLEANUP; return -1;} YY_BREAK @@ -9551,58 +9583,58 @@ SUCCEED; /* CHARACTER DATA. */ /* Non-defined standard entities... */ -case 569: +case 571: YY_RULE_SETUP BUFFERPUTC('&'); YY_BREAK -case 570: +case 572: YY_RULE_SETUP BUFFERPUTC('<'); YY_BREAK -case 571: +case 573: YY_RULE_SETUP BUFFERPUTC('>'); YY_BREAK -case 572: +case 574: YY_RULE_SETUP BUFFERPUTC('\''); YY_BREAK -case 573: +case 575: YY_RULE_SETUP BUFFERPUTC('"'); YY_BREAK /* Character entities. */ -case 574: +case 576: YY_RULE_SETUP BUFFERPUTC((unsigned char)atoi(surf_parse_text+2)); YY_BREAK -case 575: +case 577: YY_RULE_SETUP BUFFERPUTC((unsigned char)strtol(surf_parse_text+3,NULL,16)); YY_BREAK -case 576: -/* rule 576 can match eol */ -case 577: -/* rule 577 can match eol */ case 578: /* rule 578 can match eol */ case 579: /* rule 579 can match eol */ +case 580: +/* rule 580 can match eol */ +case 581: +/* rule 581 can match eol */ YY_RULE_SETUP BUFFERPUTC('\n'); YY_BREAK -case 580: +case 582: YY_RULE_SETUP ENTER(CDATA); YY_BREAK -case 581: +case 583: YY_RULE_SETUP FAIL("Unexpected `]""]>' in character data."); YY_BREAK -case 582: +case 584: YY_RULE_SETUP BUFFERDONE; LEAVE; YY_BREAK @@ -9610,7 +9642,7 @@ case YY_STATE_EOF(VALUE1): FAIL("EOF in literal (\"'\" expected)."); YY_BREAK -case 583: +case 585: YY_RULE_SETUP BUFFERDONE; LEAVE; YY_BREAK @@ -9618,22 +9650,22 @@ case YY_STATE_EOF(VALUE2): FAIL("EOF in literal (`\"' expected)."); YY_BREAK -case 584: -/* rule 584 can match eol */ +case 586: +/* rule 586 can match eol */ YY_RULE_SETUP BUFFERPUTC(surf_parse_text[0]); YY_BREAK -case 585: +case 587: YY_RULE_SETUP FAIL("Spurious `%c' in character data.",surf_parse_text[0]); YY_BREAK -case 586: +case 588: YY_RULE_SETUP LEAVE; YY_BREAK /* "]""]" BUFFERPUTC(surf_parse_text[0]); BUFFERPUTC(surf_parse_text[1]); */ -case 587: +case 589: YY_RULE_SETUP BUFFERPUTC(surf_parse_text[0]); YY_BREAK @@ -9645,13 +9677,13 @@ FAIL("EOF in CDATA section."); /* Ideally, this should be replaced by code in flexml.pl that generates just the states not covered by other rules. */ -case 588: -/* rule 588 can match eol */ +case 590: +/* rule 590 can match eol */ YY_RULE_SETUP FAIL("Syntax error on character `%c'.", surf_parse_text[0]); YY_BREAK -case 589: +case 591: YY_RULE_SETUP ECHO; YY_BREAK @@ -9668,8 +9700,8 @@ case YY_STATE_EOF(S_surfxml_AS_10): case YY_STATE_EOF(S_surfxml_AS_13): case YY_STATE_EOF(S_surfxml_AS_15): case YY_STATE_EOF(S_surfxml_storage___type_1): -case YY_STATE_EOF(S_surfxml_storage_1): case YY_STATE_EOF(S_surfxml_host_1): +case YY_STATE_EOF(S_surfxml_storage_1): case YY_STATE_EOF(S_surfxml_cluster_1): case YY_STATE_EOF(S_surfxml_link_1): case YY_STATE_EOF(S_surfxml_route_1): @@ -9969,7 +10001,7 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 3458 ) + if ( yy_current_state >= 3469 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; @@ -9997,11 +10029,11 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 3458 ) + if ( yy_current_state >= 3469 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - yy_is_jam = (yy_current_state == 3457); + yy_is_jam = (yy_current_state == 3468); return yy_is_jam ? 0 : yy_current_state; } diff --git a/src/surf/storage_interface.cpp b/src/surf/storage_interface.cpp index 4ddc3c9296..5e1ef7340f 100644 --- a/src/surf/storage_interface.cpp +++ b/src/surf/storage_interface.cpp @@ -10,13 +10,13 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_storage, surf, "Logging specific to the SURF storage module"); +xbt_lib_t file_lib; xbt_lib_t storage_lib; int ROUTING_STORAGE_LEVEL; //Routing for storagelevel int ROUTING_STORAGE_HOST_LEVEL; int SURF_STORAGE_LEVEL; xbt_lib_t storage_type_lib; int ROUTING_STORAGE_TYPE_LEVEL; //Routing for storage_type level - xbt_dynar_t mount_list = NULL; StorageModelPtr surf_storage_model = NULL; @@ -64,7 +64,7 @@ Storage::Storage(ModelPtr model, const char *name, xbt_dict_t props, Storage::Storage(ModelPtr model, const char *name, xbt_dict_t props, lmm_system_t maxminSystem, double bread, double bwrite, double bconnection, - const char* type_id, char *content_name, char *content_type, sg_size_t size) + const char* type_id, char *content_name, char *content_type, sg_size_t size, char *attach) : Resource(model, name, props, lmm_constraint_new(maxminSystem, this, bconnection)) , p_contentType(content_type) , m_size(size), m_usedSize(0) @@ -72,6 +72,7 @@ Storage::Storage(ModelPtr model, const char *name, xbt_dict_t props, , p_writeActions(xbt_dynar_new(sizeof(ActionPtr),NULL)) { surf_callback_emit(storageCreatedCallbacks, this); p_content = parseContent(content_name); + p_attach = xbt_strdup(attach); setState(SURF_RESOURCE_ON); XBT_DEBUG("Create resource with Bconnection '%f' Bread '%f' Bwrite '%f' and Size '%llu'", bconnection, bread, bwrite, size); p_constraintRead = lmm_constraint_new(maxminSystem, this, bread); @@ -84,6 +85,7 @@ Storage::~Storage(){ xbt_dynar_free(&p_writeActions); free(p_typeId); free(p_contentType); + free(p_attach); } xbt_dict_t Storage::parseContent(char *filename) @@ -96,8 +98,9 @@ xbt_dict_t Storage::parseContent(char *filename) FILE *file = NULL; file = surf_fopen(filename, "r"); - xbt_assert(file != NULL, "Cannot open file '%s' (path=%s)", filename, - xbt_str_join(surf_path, ":")); + if (file == NULL) + xbt_die("Cannot open file '%s' (path=%s)", filename, + xbt_str_join(surf_path, ":")); char *line = NULL; size_t len = 0; @@ -105,10 +108,9 @@ xbt_dict_t Storage::parseContent(char *filename) char path[1024]; sg_size_t size; - while ((read = xbt_getline(&line, &len, file)) != -1) { if (read){ - if(sscanf(line,"%s %llu", path, &size) == 2) { + if(sscanf(line,"%s %llu", path, &size) == 2) { m_usedSize += size; sg_size_t *psize = xbt_new(sg_size_t, 1); *psize = size; diff --git a/src/surf/storage_interface.hpp b/src/surf/storage_interface.hpp index 23c82b4c32..7e17d8e183 100644 --- a/src/surf/storage_interface.hpp +++ b/src/surf/storage_interface.hpp @@ -85,10 +85,15 @@ public: * @param content_name [description] * @param content_type [description] * @param properties [description] + * @param attach [description] * @return The created Storage */ - virtual StoragePtr createResource(const char* id, const char* type_id, - const char* content_name, const char* content_type, xbt_dict_t properties)=0; + virtual StoragePtr createResource(const char* id, + const char* type_id, + const char* content_name, + const char* content_type, + xbt_dict_t properties, + const char *attach) = 0; xbt_dynar_t p_storageList; }; @@ -131,12 +136,13 @@ public: * @param content_name [description] * @param content_type [description] * @param size [description] + * @param attach [description] */ Storage(ModelPtr model, const char *name, xbt_dict_t props, lmm_system_t maxminSystem, double bread, double bwrite, double bconnection, const char* type_id, char *content_name, char *content_type, - sg_size_t size); + sg_size_t size, char *attach); /** * @brief Storage destructor @@ -166,6 +172,7 @@ public: sg_size_t m_size; sg_size_t m_usedSize; char * p_typeId; + char* p_attach; /** * @brief Open a file @@ -175,7 +182,7 @@ public: * * @return The StorageAction corresponding to the opening */ - virtual StorageActionPtr open(const char* mount, const char* path)=0; + virtual StorageActionPtr open(char* mount, char* path)=0; /** * @brief Close a file diff --git a/src/surf/storage_n11.cpp b/src/surf/storage_n11.cpp index 4e07fe53c7..289e657470 100644 --- a/src/surf/storage_n11.cpp +++ b/src/surf/storage_n11.cpp @@ -72,7 +72,8 @@ static void parse_storage_init(sg_platf_storage_cbarg_t storage) ((storage_type_t) stype)->type_id, storage->content, storage->content_type, - storage->properties); + storage->properties, + storage->attach); } static void parse_mstorage_init(sg_platf_mstorage_cbarg_t /*mstorage*/) @@ -234,7 +235,7 @@ StorageN11Model::~StorageN11Model(){ } StoragePtr StorageN11Model::createResource(const char* id, const char* type_id, - const char* content_name, const char* content_type, xbt_dict_t properties) + const char* content_name, const char* content_type, xbt_dict_t properties, const char* attach) { xbt_assert(!surf_storage_resource_priv(surf_storage_resource_by_name(id)), @@ -249,7 +250,7 @@ StoragePtr StorageN11Model::createResource(const char* id, const char* type_id, StoragePtr storage = new StorageN11(this, id, properties, p_maxminSystem, Bread, Bwrite, Bconnection, - type_id, (char *)content_name, xbt_strdup(content_type), storage_type->size); + type_id, (char *)content_name, xbt_strdup(content_type), storage_type->size, (char *) attach); xbt_lib_set(storage_lib, id, SURF_STORAGE_LEVEL, static_cast(storage)); @@ -354,9 +355,9 @@ void StorageN11Model::updateActionsState(double /*now*/, double delta) StorageN11::StorageN11(StorageModelPtr model, const char* name, xbt_dict_t properties, lmm_system_t maxminSystem, double bread, double bwrite, double bconnection, - const char* type_id, char *content_name, char *content_type, sg_size_t size) + const char* type_id, char *content_name, char *content_type, sg_size_t size, char *attach) : Storage(model, name, properties, - maxminSystem, bread, bwrite, bconnection, type_id, content_name, content_type, size) { + maxminSystem, bread, bwrite, bconnection, type_id, content_name, content_type, size, attach) { XBT_DEBUG("Create resource with Bconnection '%f' Bread '%f' Bwrite '%f' and Size '%llu'", bconnection, bread, bwrite, size); } @@ -405,9 +406,10 @@ StorageActionPtr StorageN11::ls(const char* path) return action; } -StorageActionPtr StorageN11::open(const char* mount, const char* path) +StorageActionPtr StorageN11::open(char* mount, char* path) { XBT_DEBUG("\tOpen file '%s'",path); + sg_size_t size, *psize; psize = (sg_size_t*) xbt_dict_get_or_null(p_content, path); // if file does not exist create an empty file @@ -428,6 +430,9 @@ StorageActionPtr StorageN11::open(const char* mount, const char* path) StorageActionPtr action = new StorageN11Action(getModel(), 0, getState() != SURF_RESOURCE_ON, this, OPEN); action->p_file = file; + free(path); + free(mount); + return action; } @@ -496,26 +501,6 @@ void StorageN11::rename(const char *src, const char *dest) XBT_DEBUG("File %s doesn't exist",src); } -xbt_dict_t StorageN11::getContent() -{ - /* For the moment this action has no cost, but in the future we could take in account access latency of the disk */ - /*surf_action_t action = storage_action_execute(storage,0, LS);*/ - - xbt_dict_t content_dict = xbt_dict_new_homogeneous(NULL); - xbt_dict_cursor_t cursor = NULL; - char *file; - sg_size_t *psize; - - xbt_dict_foreach(p_content, cursor, file, psize){ - xbt_dict_set(content_dict,file,psize,NULL); - } - return content_dict; -} - -sg_size_t StorageN11::getSize(){ - return m_size; -} - /********** * Action * **********/ diff --git a/src/surf/storage_n11.hpp b/src/surf/storage_n11.hpp index 5582e961d0..86139ccc92 100644 --- a/src/surf/storage_n11.hpp +++ b/src/surf/storage_n11.hpp @@ -38,7 +38,7 @@ public: StorageN11Model(); ~StorageN11Model(); StoragePtr createResource(const char* id, const char* type_id, - const char* content_name, const char* content_type, xbt_dict_t properties); + const char* content_name, const char* content_type, xbt_dict_t properties, const char* attach); double shareResources(double now); void updateActionsState(double now, double delta); }; @@ -51,13 +51,11 @@ class StorageN11 : public Storage { public: StorageN11(StorageModelPtr model, const char* name, xbt_dict_t properties, lmm_system_t maxminSystem, double bread, double bwrite, double bconnection, - const char* type_id, char *content_name, char *content_type, sg_size_t size); + const char* type_id, char *content_name, char *content_type, sg_size_t size, char *attach); - StorageActionPtr open(const char* mount, const char* path); + StorageActionPtr open(char* mount, char* path); StorageActionPtr close(surf_file_t fd); StorageActionPtr ls(const char *path); - xbt_dict_t getContent(); - sg_size_t getSize(); StorageActionPtr read(surf_file_t fd, sg_size_t size);//FIXME:why we have a useless param ptr ?? StorageActionPtr write(surf_file_t fd, sg_size_t size);//FIXME:why we have a useless param ptr ?? void rename(const char *src, const char *dest); diff --git a/src/surf/surf_c_bindings.cpp b/src/surf/surf_c_bindings.cpp index 1bcc47f1d9..c4326917c9 100644 --- a/src/surf/surf_c_bindings.cpp +++ b/src/surf/surf_c_bindings.cpp @@ -278,9 +278,12 @@ surf_action_t surf_workstation_model_communicate(surf_workstation_model_t model, return model->communicate(get_casted_workstation(src), get_casted_workstation(dst), size, rate); } -xbt_dynar_t surf_workstation_model_get_route(surf_workstation_model_t model, - surf_resource_t src, surf_resource_t dst){ - return model->getRoute(get_casted_workstation(src), get_casted_workstation(dst)); +xbt_dynar_t surf_workstation_model_get_route(surf_workstation_model_t /*model*/, + surf_resource_t src, surf_resource_t dst){ + xbt_dynar_t route = NULL; + routing_platf->getRouteAndLatency(get_casted_workstation(src)->p_netElm, + get_casted_workstation(dst)->p_netElm, &route, NULL); + return route; } void surf_vm_workstation_model_create(const char *name, surf_resource_t ind_phys_host){ @@ -349,12 +352,16 @@ double surf_workstation_get_consumed_energy(surf_resource_t resource){ return cpuIt->second->getConsumedEnergy(); } -xbt_dict_t surf_workstation_get_storage_list(surf_resource_t workstation){ - return get_casted_workstation(workstation)->getStorageList(); +xbt_dict_t surf_workstation_get_mounted_storage_list(surf_resource_t workstation){ + return get_casted_workstation(workstation)->getMountedStorageList(); } -surf_action_t surf_workstation_open(surf_resource_t workstation, const char* mount, const char* path){ - return get_casted_workstation(workstation)->open(mount, path); +xbt_dynar_t surf_workstation_get_attached_storage_list(surf_resource_t workstation){ + return get_casted_workstation(workstation)->getAttachedStorageList(); +} + +surf_action_t surf_workstation_open(surf_resource_t workstation, const char* fullpath){ + return get_casted_workstation(workstation)->open(fullpath); } surf_action_t surf_workstation_close(surf_resource_t workstation, surf_file_t fd){ @@ -469,6 +476,10 @@ sg_size_t surf_storage_get_size(surf_resource_t resource){ return static_cast(surf_storage_resource_priv(resource))->getSize(); } +const char* surf_storage_get_host(surf_resource_t resource){ + return static_cast(surf_storage_resource_priv(resource))->p_attach; +} + void surf_storage_rename(surf_resource_t resource, const char* src, const char* dest){ static_cast(surf_storage_resource_priv(resource))->rename(src, dest); } diff --git a/src/surf/surf_interface.cpp b/src/surf/surf_interface.cpp index 4b1889a43c..6be998b709 100644 --- a/src/surf/surf_interface.cpp +++ b/src/surf/surf_interface.cpp @@ -334,7 +334,9 @@ int find_model_description(s_surf_model_description_t * table, if (!strcmp(name, table[i].name)) { return i; } - name_list = strdup(table[0].name); + if (!table[0].name) + xbt_die("No model is valid! This is a bug."); + name_list = xbt_strdup(table[0].name); for (i = 1; table[i].name; i++) { name_list = (char *) xbt_realloc(name_list, strlen(name_list) + strlen(table[i].name) + 3); strcat(name_list, ", "); @@ -370,6 +372,11 @@ static XBT_INLINE void surf_workstation_free(void *r) delete static_cast(r); } +static XBT_INLINE void surf_storage_free(void *r) +{ + delete static_cast(r); +} + void sg_version(int *ver_major,int *ver_minor,int *ver_patch) { *ver_major = SIMGRID_VERSION_MAJOR; @@ -385,6 +392,7 @@ void surf_init(int *argc, char **argv) as_router_lib = xbt_lib_new(); storage_lib = xbt_lib_new(); storage_type_lib = xbt_lib_new(); + file_lib = xbt_lib_new(); watched_hosts_lib = xbt_dict_new_homogeneous(NULL); XBT_DEBUG("Add routing levels"); @@ -396,6 +404,7 @@ void surf_init(int *argc, char **argv) SURF_CPU_LEVEL = xbt_lib_add_level(host_lib,surf_cpu_free); SURF_WKS_LEVEL = xbt_lib_add_level(host_lib,surf_workstation_free); SURF_LINK_LEVEL = xbt_lib_add_level(link_lib,surf_link_free); + SURF_STORAGE_LEVEL = xbt_lib_add_level(storage_lib,surf_storage_free); xbt_init(argc, argv); if (!model_list) @@ -436,7 +445,7 @@ void surf_exit(void) xbt_lib_free(&as_router_lib); xbt_lib_free(&storage_lib); xbt_lib_free(&storage_type_lib); - + xbt_lib_free(&file_lib); xbt_dict_free(&watched_hosts_lib); xbt_dynar_foreach(model_list, iter, model) diff --git a/src/surf/surf_interface.hpp b/src/surf/surf_interface.hpp index 7dac3413f2..a56495f557 100644 --- a/src/surf/surf_interface.hpp +++ b/src/surf/surf_interface.hpp @@ -365,7 +365,6 @@ private: const char *p_name; xbt_dict_t p_properties; ModelPtr p_model; - void *p_resource; bool m_running; e_surf_resource_state_t m_stateCurrent; @@ -632,6 +631,8 @@ public: s_xbt_swag_hookup_t p_stateHookup; + ModelPtr getModel() {return p_model;} + protected: ActionListPtr p_stateSet; double m_priority; /**< priority (1.0 by default) */ @@ -640,8 +641,6 @@ protected: double m_maxDuration; /*< max_duration (may fluctuate until the task is completed) */ double m_finish; /**< finish time : this is modified during the run and fluctuates until the task is completed */ - ModelPtr getModel() {return p_model;} - private: int resourceUsed(void *resource_id); diff --git a/src/surf/surf_routing.cpp b/src/surf/surf_routing.cpp index 3828ad2532..f62f852947 100644 --- a/src/surf/surf_routing.cpp +++ b/src/surf/surf_routing.cpp @@ -12,9 +12,11 @@ #include "simgrid/platf_interface.h" // platform creation API internal interface #include "simgrid/sg_config.h" +#include "storage_interface.hpp" #include "surf/surfxml_parse_values.h" + /** * @ingroup SURF_build_api * @brief A library containing all known workstations @@ -28,6 +30,7 @@ int SIMIX_HOST_LEVEL; //Simix host level int SIMIX_STORAGE_LEVEL; //Simix storage level int MSG_HOST_LEVEL; //Msg host level int MSG_STORAGE_LEVEL; //Msg storage level +int MSG_FILE_LEVEL; //Msg file level int SD_HOST_LEVEL; //Simdag host level int SD_STORAGE_LEVEL; //Simdag storage level int COORD_HOST_LEVEL=0; //Coordinates level @@ -137,7 +140,7 @@ static void parse_S_host_link(sg_platf_host_link_cbarg_t host) // If dynar is is greater than edge id and if the host_link is already defined if((int)xbt_dynar_length(current_routing->p_linkUpDownList) > info->getId() && xbt_dynar_get_as(current_routing->p_linkUpDownList, info->getId(), void*)) - xbt_die("Host_link for '%s' is already defined!",host->id); + surf_parse_error("Host_link for '%s' is already defined!",host->id); XBT_DEBUG("Push Host_link for host '%s' to position %d", info->getName(), info->getId()); xbt_dynar_set_as(current_routing->p_linkUpDownList, info->getId(), s_surf_parsing_link_up_down_t, link_up_down); @@ -319,7 +322,7 @@ static void routing_parse_trace_connect(sg_platf_trace_connect_cbarg_t trace_con xbt_strdup(trace_connect->element), NULL); break; default: - xbt_die("Cannot connect trace %s to %s: kind of trace unknown", + surf_parse_error("Cannot connect trace %s to %s: kind of trace unknown", trace_connect->trace, trace_connect->element); break; } @@ -1238,6 +1241,22 @@ static void routing_parse_peer(sg_platf_peer_cbarg_t peer) // } // } +static void check_disk_attachment() +{ + xbt_lib_cursor_t cursor; + char *key; + void **data; + RoutingEdgePtr host_elm; + xbt_lib_foreach(storage_lib, cursor, key, data) { + if(xbt_lib_get_level(xbt_lib_get_elm_or_null(storage_lib, key), SURF_STORAGE_LEVEL) != NULL) { + StoragePtr storage = static_cast(xbt_lib_get_level(xbt_lib_get_elm_or_null(storage_lib, key), SURF_STORAGE_LEVEL)); + host_elm = sg_routing_edge_by_name_or_null(storage->p_attach); + if(!host_elm) + surf_parse_error("Enable to attach storage %s: host %s doesn't exist.", storage->getName(), storage->p_attach); + } + } +} + void routing_register_callbacks() { sg_platf_host_add_cb(parse_S_host); @@ -1253,6 +1272,7 @@ void routing_register_callbacks() sg_platf_peer_add_cb(routing_parse_peer); sg_platf_postparse_add_cb(routing_parse_postparse); + sg_platf_postparse_add_cb(check_disk_attachment); /* we care about the ASes while parsing the platf. Incredible, isnt it? */ sg_platf_AS_end_add_cb(routing_AS_end); diff --git a/src/surf/surf_routing_dijkstra.cpp b/src/surf/surf_routing_dijkstra.cpp index 48a3ae2a29..805dd10299 100644 --- a/src/surf/surf_routing_dijkstra.cpp +++ b/src/surf/surf_routing_dijkstra.cpp @@ -475,9 +475,9 @@ void AsDijkstra::parseRoute(sg_platf_route_cbarg_t route) route->gw_src->getName(), dst, route->gw_dst->getName()); as_route = 1; if(route->gw_dst->getRcType() == SURF_NETWORK_ELEMENT_NULL) - xbt_die("The gw_dst '%s' does not exist!",route->gw_dst->getName()); + surf_parse_error("The gw_dst '%s' does not exist!",route->gw_dst->getName()); if(route->gw_src->getRcType() == SURF_NETWORK_ELEMENT_NULL) - xbt_die("The gw_src '%s' does not exist!",route->gw_src->getName()); + surf_parse_error("The gw_src '%s' does not exist!",route->gw_src->getName()); } RoutingEdgePtr src_net_elm, dst_net_elm; diff --git a/src/surf/surf_routing_floyd.cpp b/src/surf/surf_routing_floyd.cpp index f116c4e8cc..18d3c9ef66 100644 --- a/src/surf/surf_routing_floyd.cpp +++ b/src/surf/surf_routing_floyd.cpp @@ -177,9 +177,9 @@ void AsFloyd::parseRoute(sg_platf_route_cbarg_t route) XBT_DEBUG("Load ASroute from \"%s(%s)\" to \"%s(%s)\"", src, route->gw_src->getName(), dst, route->gw_dst->getName()); if(route->gw_dst->getRcType() == SURF_NETWORK_ELEMENT_NULL) - xbt_die("The dst_gateway '%s' does not exist!",route->gw_dst->getName()); + surf_parse_error("The dst_gateway '%s' does not exist!",route->gw_dst->getName()); if(route->gw_src->getRcType() == SURF_NETWORK_ELEMENT_NULL) - xbt_die("The src_gateway '%s' does not exist!",route->gw_src->getName()); + surf_parse_error("The src_gateway '%s' does not exist!",route->gw_src->getName()); } if(TO_FLOYD_LINK(src_net_elm->getId(), dst_net_elm->getId())) diff --git a/src/surf/surf_routing_full.cpp b/src/surf/surf_routing_full.cpp index 4c0aeb0359..d00fdb8f1f 100644 --- a/src/surf/surf_routing_full.cpp +++ b/src/surf/surf_routing_full.cpp @@ -54,17 +54,19 @@ AsFull::AsFull(){ } AsFull::~AsFull(){ - int table_size = (int)xbt_dynar_length(p_indexNetworkElm); - int i, j; - /* Delete routing table */ - for (i = 0; i < table_size; i++) - for (j = 0; j < table_size; j++) { - if (TO_ROUTE_FULL(i,j)){ - xbt_dynar_free(&TO_ROUTE_FULL(i,j)->link_list); - xbt_free(TO_ROUTE_FULL(i,j)); + if (p_routingTable) { + int table_size = (int)xbt_dynar_length(p_indexNetworkElm); + int i, j; + /* Delete routing table */ + for (i = 0; i < table_size; i++) + for (j = 0; j < table_size; j++) { + if (TO_ROUTE_FULL(i,j)){ + xbt_dynar_free(&TO_ROUTE_FULL(i,j)->link_list); + xbt_free(TO_ROUTE_FULL(i,j)); + } } - } - xbt_free(p_routingTable); + xbt_free(p_routingTable); + } } xbt_dynar_t AsFull::getOneLinkRoutes() @@ -182,7 +184,7 @@ void AsFull::parseRoute(sg_platf_route_cbarg_t route) "between \"%s\" and \"%s\"", src, dst); } } else { - if (!route->gw_dst && !route->gw_dst) + if (!route->gw_src && !route->gw_dst) XBT_DEBUG("Load Route from \"%s\" to \"%s\"", src, dst); else { // FIXME We can call a gw which is down the current AS (cf g5k.xml) but not upper. @@ -212,12 +214,17 @@ void AsFull::parseRoute(sg_platf_route_cbarg_t route) // "but '%s' is not in '%s'.", // route->dst_gateway, subas->name); as_route = 1; - XBT_DEBUG("Load ASroute from \"%s(%s)\" to \"%s(%s)\"", - src, route->gw_src->getName(), dst, route->gw_dst->getName()); - if (route->gw_dst->getRcType() == SURF_NETWORK_ELEMENT_NULL) - xbt_die("The dst_gateway '%s' does not exist!", route->gw_dst->getName()); - if (route->gw_src->getRcType() == SURF_NETWORK_ELEMENT_NULL) - xbt_die("The src_gateway '%s' does not exist!", route->gw_src->getName()); + XBT_DEBUG("Load ASroute from \"%s\" to \"%s\"", src, dst); + if (!route->gw_src || + route->gw_src->getRcType() == SURF_NETWORK_ELEMENT_NULL) + surf_parse_error("The src_gateway \"%s\" does not exist!", + route->gw_src ? route->gw_src->getName() : "(null)"); + if (!route->gw_dst || + route->gw_dst->getRcType() == SURF_NETWORK_ELEMENT_NULL) + surf_parse_error("The dst_gateway \"%s\" does not exist!", + route->gw_dst ? route->gw_dst->getName() : "(null)"); + XBT_DEBUG("ASroute goes from \"%s\" to \"%s\"", + route->gw_src->getName(), route->gw_dst->getName()); } TO_ROUTE_FULL(src_net_elm->getId(), dst_net_elm->getId()) = newExtendedRoute(p_hierarchy, route, 1); xbt_dynar_shrink(TO_ROUTE_FULL(src_net_elm->getId(), dst_net_elm->getId())->link_list, 0); diff --git a/src/surf/surf_routing_generic.cpp b/src/surf/surf_routing_generic.cpp index 908e46ecb8..c67abb4407 100644 --- a/src/surf/surf_routing_generic.cpp +++ b/src/surf/surf_routing_generic.cpp @@ -234,7 +234,8 @@ sg_platf_route_cbarg_t AsGeneric::getBypassRoute(RoutingEdgePtr src, if (src == NULL || dst == NULL) xbt_die("Ask for route \"from\"(%s) or \"to\"(%s) no found at AS \"%s\"", - src->getName(), dst->getName(), p_name); + src ? src->getName() : "(null)", + dst ? dst->getName() : "(null)", p_name); src_as = src->getRcComponent(); dst_as = dst->getRcComponent(); @@ -439,20 +440,14 @@ AsPtr AsGeneric::processingUnitsExist(char *element) void AsGeneric::srcDstCheck(RoutingEdgePtr src, RoutingEdgePtr dst) { - - RoutingEdgePtr src_data = src; - RoutingEdgePtr dst_data = dst; - - if (src_data == NULL || dst_data == NULL) + if (src == NULL || dst == NULL) xbt_die("Ask for route \"from\"(%s) or \"to\"(%s) no found at AS \"%s\"", - src->getName(), - dst->getName(), - p_name); + src ? src->getName() : "(null)", + dst ? dst->getName() : "(null)", + p_name); - AsPtr src_as = - (src_data)->getRcComponent(); - AsPtr dst_as = - (dst_data)->getRcComponent(); + AsPtr src_as = src->getRcComponent(); + AsPtr dst_as = dst->getRcComponent(); if (src_as != dst_as) xbt_die("The src(%s in %s) and dst(%s in %s) are in differents AS", diff --git a/src/surf/surfxml_parse.c b/src/surf/surfxml_parse.c index 6c757e587c..ff091ec252 100644 --- a/src/surf/surfxml_parse.c +++ b/src/surf/surfxml_parse.c @@ -27,7 +27,6 @@ int ETag_surfxml_include_state(void); char* surf_parsed_filename = NULL; // to locate parse error messages xbt_dynar_t parsed_link_list = NULL; /* temporary store of current list link of a route */ -extern AS_t current_routing; /* * Helping functions */ @@ -217,9 +216,6 @@ xbt_dict_t random_data_list = NULL; YY_BUFFER_STATE surf_input_buffer; FILE *surf_file_to_parse = NULL; -static void init_randomness(void); -static void add_randomness(void); - /* * Stuff relative to storage */ @@ -239,6 +235,7 @@ void ETag_surfxml_storage(void) storage.content = A_surfxml_storage_content; storage.content_type = A_surfxml_storage_content___type; storage.properties = current_property_set; + storage.attach = A_surfxml_storage_attach; sg_platf_new_storage(&storage); current_property_set = NULL; } @@ -768,6 +765,13 @@ void ETag_surfxml_ASroute(void){ ASroute.gw_src = sg_routing_edge_by_name_or_null(A_surfxml_ASroute_gw___src); ASroute.gw_dst = sg_routing_edge_by_name_or_null(A_surfxml_ASroute_gw___dst); + if (A_surfxml_ASroute_gw___src && !ASroute.gw_src) + surf_parse_error("gw_src=\"%s\" not found for ASroute from \"%s\" to \"%s\"", + A_surfxml_ASroute_gw___src, ASroute.src, ASroute.dst); + if (A_surfxml_ASroute_gw___dst && !ASroute.gw_dst) + surf_parse_error("gw_dst=\"%s\" not found for ASroute from \"%s\" to \"%s\"", + A_surfxml_ASroute_gw___dst, ASroute.src, ASroute.dst); + ASroute.link_list = parsed_link_list; switch (A_surfxml_ASroute_symmetrical) { @@ -1049,8 +1053,6 @@ int_f_void_t surf_parse = _surf_parse; * With XML parser */ -/* Random tag functions */ - double get_cpu_power(const char *power) { double power_scale = 0.0; @@ -1078,44 +1080,6 @@ double random_min, random_max, random_mean, random_std_deviation; e_random_generator_t random_generator; char *random_id; -static void init_randomness(void) -{ - random_id = A_surfxml_random_id; - random_min = surf_parse_get_double(A_surfxml_random_min); - random_max = surf_parse_get_double(A_surfxml_random_max); - random_mean = surf_parse_get_double(A_surfxml_random_mean); - random_std_deviation = surf_parse_get_double(A_surfxml_random_std___deviation); - switch (A_surfxml_random_generator) { - case AU_surfxml_random_generator: - case A_surfxml_random_generator_NONE: - random_generator = NONE; - break; - case A_surfxml_random_generator_DRAND48: - random_generator = DRAND48; - break; - case A_surfxml_random_generator_RAND: - random_generator = RAND; - break; - case A_surfxml_random_generator_RNGSTREAM: - random_generator = RNGSTREAM; - break; - default: - surf_parse_error("Invalid random generator"); - break; - } -} - -static void add_randomness(void) -{ - /* If needed, additional properties can be added by using the prop tag */ - random_data_t random = - random_new(random_generator, 0, random_min, random_max, random_mean, - random_std_deviation); - xbt_dict_set(random_data_list, random_id, (void *) random, - &xbt_free_ref); -} - - xbt_dict_t get_as_router_properties(const char* name) { return xbt_lib_get_or_null(as_router_lib, name, ROUTING_PROP_ASR_LEVEL); diff --git a/src/surf/surfxml_parseplatf.c b/src/surf/surfxml_parseplatf.c index 198b74563c..2c93389049 100644 --- a/src/surf/surfxml_parseplatf.c +++ b/src/surf/surfxml_parseplatf.c @@ -119,6 +119,6 @@ void parse_platform_file(const char *file) /* Stop the flex parser */ surf_parse_close(); if (parse_status) - xbt_die("Parse error in %s", file); + surf_parse_error("Parse error in %s", file); } diff --git a/src/surf/vm_workstation_hl13.cpp b/src/surf/vm_workstation_hl13.cpp index baad9aeb82..92b02461a9 100644 --- a/src/surf/vm_workstation_hl13.cpp +++ b/src/surf/vm_workstation_hl13.cpp @@ -31,11 +31,6 @@ void WorkstationVMHL13Model::updateActionsState(double /*now*/, double /*delta*/ return; } -xbt_dynar_t WorkstationVMHL13Model::getRoute(WorkstationPtr src, WorkstationPtr dst){ - XBT_DEBUG("ws_get_route"); - return surf_network_model->getRoute(src->p_netElm, dst->p_netElm); -} - ActionPtr WorkstationVMHL13Model::communicate(WorkstationPtr src, WorkstationPtr dst, double size, double rate){ return surf_network_model->communicate(src->p_netElm, dst->p_netElm, size, rate); } diff --git a/src/surf/vm_workstation_hl13.hpp b/src/surf/vm_workstation_hl13.hpp index cf3d23f517..24d6175e70 100644 --- a/src/surf/vm_workstation_hl13.hpp +++ b/src/surf/vm_workstation_hl13.hpp @@ -39,7 +39,6 @@ public: void createResource(const char *name, void *ind_phys_workstation); double shareResources(double now); void adjustWeightOfDummyCpuActions() {}; - xbt_dynar_t getRoute(WorkstationPtr src, WorkstationPtr dst); ActionPtr communicate(WorkstationPtr src, WorkstationPtr dst, double size, double rate); ActionPtr executeParallelTask(int workstation_nb, void **workstation_list, diff --git a/src/surf/workstation_clm03.cpp b/src/surf/workstation_clm03.cpp index 1848fd5396..254c1d1755 100644 --- a/src/surf/workstation_clm03.cpp +++ b/src/surf/workstation_clm03.cpp @@ -50,11 +50,6 @@ void surf_workstation_model_init_compound() sg_platf_host_add_cb(workstation_new); } -WorkstationCLM03Model::WorkstationCLM03Model(const char *name) - : WorkstationModel(name) -{} - - WorkstationCLM03Model::WorkstationCLM03Model() : WorkstationModel("Workstation") { @@ -139,13 +134,6 @@ ActionPtr WorkstationCLM03Model::executeParallelTask(int workstation_nb, return NULL; } -/* returns an array of network_link_CM02_t */ -xbt_dynar_t WorkstationCLM03Model::getRoute(WorkstationPtr src, WorkstationPtr dst) -{ - XBT_DEBUG("ws_get_route"); - return surf_network_model->getRoute(src->p_netElm, dst->p_netElm); -} - ActionPtr WorkstationCLM03Model::communicate(WorkstationPtr src, WorkstationPtr dst, double size, double rate){ return surf_network_model->communicate(src->p_netElm, dst->p_netElm, size, rate); } diff --git a/src/surf/workstation_clm03.hpp b/src/surf/workstation_clm03.hpp index 0028c52a61..f471b16f5c 100644 --- a/src/surf/workstation_clm03.hpp +++ b/src/surf/workstation_clm03.hpp @@ -31,7 +31,6 @@ typedef WorkstationCLM03Action *WorkstationCLM03ActionPtr; class WorkstationCLM03Model : public WorkstationModel { public: - WorkstationCLM03Model(const char *name); WorkstationCLM03Model(); ~WorkstationCLM03Model(); void parseInit(sg_platf_host_cbarg_t host); @@ -45,7 +44,6 @@ public: double *computation_amount, double *communication_amount, double rate); - xbt_dynar_t getRoute(WorkstationPtr src, WorkstationPtr dst); ActionPtr communicate(WorkstationPtr src, WorkstationPtr dst, double size, double rate); }; @@ -77,11 +75,6 @@ public: * Action * **********/ -class WorkstationCLM03Action : public WorkstationAction { -public: - WorkstationCLM03Action(ModelPtr model, double cost, bool failed) - : WorkstationAction(model, cost, failed) {} -}; #endif /* SURF_WORKSTATION_CLM03_HPP_ */ diff --git a/src/surf/workstation_interface.cpp b/src/surf/workstation_interface.cpp index 1b41b0cf1a..09f8af3b69 100644 --- a/src/surf/workstation_interface.cpp +++ b/src/surf/workstation_interface.cpp @@ -170,7 +170,7 @@ StoragePtr Workstation::findStorageOnMountList(const char* mount) return st; } -xbt_dict_t Workstation::getStorageList() +xbt_dict_t Workstation::getMountedStorageList() { s_mount_t mnt; unsigned int i; @@ -184,10 +184,60 @@ xbt_dict_t Workstation::getStorageList() return storage_list; } -ActionPtr Workstation::open(const char* mount, const char* path) { - StoragePtr st = findStorageOnMountList(mount); - XBT_DEBUG("OPEN on disk '%s'", st->getName()); - return st->open(mount, path); +xbt_dynar_t Workstation::getAttachedStorageList() +{ + xbt_lib_cursor_t cursor; + char *key; + void **data; + xbt_dynar_t result = xbt_dynar_new(sizeof(void*), NULL); + xbt_lib_foreach(storage_lib, cursor, key, data) { + if(xbt_lib_get_level(xbt_lib_get_elm_or_null(storage_lib, key), SURF_STORAGE_LEVEL) != NULL) { + StoragePtr storage = static_cast(xbt_lib_get_level(xbt_lib_get_elm_or_null(storage_lib, key), SURF_STORAGE_LEVEL)); + if(!strcmp((const char*)storage->p_attach,this->getName())){ + xbt_dynar_push_as(result, void *,(void *)static_cast(storage)->getName()); + } + } + } + return result; +} + +ActionPtr Workstation::open(const char* fullpath) { + + StoragePtr st = NULL; + s_mount_t mnt; + unsigned int cursor; + size_t longest_prefix_length = 0; + char *path = NULL; + char *file_mount_name = NULL; + char *mount_name = NULL; + + XBT_DEBUG("Search for storage name for '%s' on '%s'", fullpath, getName()); + xbt_dynar_foreach(p_storage,cursor,mnt) + { + XBT_DEBUG("See '%s'",mnt.name); + file_mount_name = (char *) xbt_malloc ((strlen(mnt.name)+1)); + strncpy(file_mount_name,fullpath,strlen(mnt.name)); + file_mount_name[strlen(mnt.name)] = '\0'; + + if(!strcmp(file_mount_name,mnt.name) && strlen(mnt.name)>longest_prefix_length) + {/* The current mount name is found in the full path and is bigger than the previous*/ + longest_prefix_length = strlen(mnt.name); + st = static_cast(mnt.storage); + } + free(file_mount_name); + } + if(longest_prefix_length>0) + { /* Mount point found, split fullpath into mount_name and path+filename*/ + path = (char *) xbt_malloc ((strlen(fullpath)-longest_prefix_length+1)); + mount_name = (char *) xbt_malloc ((longest_prefix_length+1)); + strncpy(mount_name, fullpath, longest_prefix_length); + path[strlen(fullpath)-longest_prefix_length] = '\0'; + mount_name[longest_prefix_length] = '\0'; + } + else + xbt_die("Can't find mount point for '%s' on '%s'", fullpath, getName()); + + return st->open(mount_name, path); } ActionPtr Workstation::close(surf_file_t fd) { diff --git a/src/surf/workstation_interface.hpp b/src/surf/workstation_interface.hpp index d0546b5394..621771d0f1 100644 --- a/src/surf/workstation_interface.hpp +++ b/src/surf/workstation_interface.hpp @@ -107,17 +107,6 @@ public: double *communication_amount, double rate)=0; - /** - * @brief [brief description] - * @details [long description] - * - * @param src [description] - * @param dst [description] - * - * @return [description] - */ - virtual xbt_dynar_t getRoute(WorkstationPtr src, WorkstationPtr dst)=0; - /** * @brief [brief description] * @details [long description] @@ -257,17 +246,24 @@ public: * * @return The xbt_dict_t of mount_point: Storage */ - virtual xbt_dict_t getStorageList(); + virtual xbt_dict_t getMountedStorageList(); + + /** + * @brief Get the xbt_dynar_t of storages attached to the workstation + * + * @return The xbt_dynar_t of Storage names + */ + virtual xbt_dynar_t getAttachedStorageList(); /** * @brief Open a file * * @param mount The mount point - * @param path The path to the file + * @param path The full path to the file * * @return The StorageAction corresponding to the opening */ - virtual ActionPtr open(const char* mount, const char* path); + virtual ActionPtr open(const char* fullpath); /** * @brief Close a file @@ -408,6 +404,7 @@ public: /********** * Action * **********/ + /** @ingroup SURF_workstation_interface * @brief SURF workstation action interface class */ diff --git a/src/xbt/automaton/parserPromela.tab.cacc b/src/xbt/automaton/parserPromela.tab.cacc index 898e1e4bf4..a0cf8ed065 100644 --- a/src/xbt/automaton/parserPromela.tab.cacc +++ b/src/xbt/automaton/parserPromela.tab.cacc @@ -1,19 +1,19 @@ -/* A Bison parser, made by GNU Bison 3.0.2. */ +/* A Bison parser, made by GNU Bison 2.5. */ /* Bison implementation for Yacc-like parsers in C - - Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc. - + + Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc. + This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - + You should have received a copy of the GNU General Public License along with this program. If not, see . */ @@ -26,7 +26,7 @@ special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. - + This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ @@ -44,7 +44,7 @@ #define YYBISON 1 /* Bison version. */ -#define YYBISON_VERSION "3.0.2" +#define YYBISON_VERSION "2.5" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" @@ -58,19 +58,23 @@ /* Pull parsers. */ #define YYPULL 1 +/* Using locations. */ +#define YYLSP_NEEDED 0 /* Substitute the variable and function names. */ #define yyparse xbt_automaton_parser_parse #define yylex xbt_automaton_parser_lex #define yyerror xbt_automaton_parser_error +#define yylval xbt_automaton_parser_lval +#define yychar xbt_automaton_parser_char #define yydebug xbt_automaton_parser_debug #define yynerrs xbt_automaton_parser_nerrs -#define yylval xbt_automaton_parser_lval -#define yychar xbt_automaton_parser_char /* Copy the first part of user declarations. */ -#line 7 "parserPromela.yacc" /* yacc.c:339 */ + +/* Line 268 of yacc.c */ +#line 7 "parserPromela.yacc" #include "automaton_lexer.yy.c" @@ -79,15 +83,14 @@ void yyerror(const char *s); -#line 83 "parserPromela.tab.cacc" /* yacc.c:339 */ -# ifndef YY_NULLPTR -# if defined __cplusplus && 201103L <= __cplusplus -# define YY_NULLPTR nullptr -# else -# define YY_NULLPTR 0 -# endif -# endif +/* Line 268 of yacc.c */ +#line 89 "parserPromela.tab.cacc" + +/* Enabling traces. */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif /* Enabling verbose error messages. */ #ifdef YYERROR_VERBOSE @@ -97,74 +100,71 @@ void yyerror(const char *s); # define YYERROR_VERBOSE 0 #endif -/* In a future release of Bison, this section will be replaced - by #include "parserPromela.tab.hacc". */ -#ifndef YY_XBT_AUTOMATON_PARSER_PARSERPROMELA_TAB_HACC_INCLUDED -# define YY_XBT_AUTOMATON_PARSER_PARSERPROMELA_TAB_HACC_INCLUDED -/* Debug traces. */ -#ifndef YYDEBUG -# define YYDEBUG 0 -#endif -#if YYDEBUG -extern int xbt_automaton_parser_debug; +/* Enabling the token table. */ +#ifndef YYTOKEN_TABLE +# define YYTOKEN_TABLE 0 #endif -/* Token type. */ + +/* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE - enum yytokentype - { - NEVER = 258, - IF = 259, - FI = 260, - IMPLIES = 261, - GOTO = 262, - AND = 263, - OR = 264, - NOT = 265, - LEFT_PAR = 266, - RIGHT_PAR = 267, - CASE = 268, - COLON = 269, - SEMI_COLON = 270, - CASE_TRUE = 271, - LEFT_BRACE = 272, - RIGHT_BRACE = 273, - LITT_ENT = 274, - LITT_CHAINE = 275, - LITT_REEL = 276, - ID = 277 - }; + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + NEVER = 258, + IF = 259, + FI = 260, + IMPLIES = 261, + GOTO = 262, + AND = 263, + OR = 264, + NOT = 265, + LEFT_PAR = 266, + RIGHT_PAR = 267, + CASE = 268, + COLON = 269, + SEMI_COLON = 270, + CASE_TRUE = 271, + LEFT_BRACE = 272, + RIGHT_BRACE = 273, + LITT_ENT = 274, + LITT_CHAINE = 275, + LITT_REEL = 276, + ID = 277 + }; #endif -/* Value type. */ + + #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED -typedef union YYSTYPE YYSTYPE; -union YYSTYPE +typedef union YYSTYPE { -#line 16 "parserPromela.yacc" /* yacc.c:355 */ + +/* Line 293 of yacc.c */ +#line 16 "parserPromela.yacc" double real; int integer; char* string; xbt_automaton_exp_label_t label; -#line 153 "parserPromela.tab.cacc" /* yacc.c:355 */ -}; + + +/* Line 293 of yacc.c */ +#line 156 "parserPromela.tab.cacc" +} YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 #endif -extern YYSTYPE xbt_automaton_parser_lval; - -int xbt_automaton_parser_parse (void); - -#endif /* !YY_XBT_AUTOMATON_PARSER_PARSERPROMELA_TAB_HACC_INCLUDED */ - /* Copy the second part of user declarations. */ -#line 168 "parserPromela.tab.cacc" /* yacc.c:358 */ + +/* Line 343 of yacc.c */ +#line 168 "parserPromela.tab.cacc" #ifdef short # undef short @@ -178,8 +178,11 @@ typedef unsigned char yytype_uint8; #ifdef YYTYPE_INT8 typedef YYTYPE_INT8 yytype_int8; -#else +#elif (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) typedef signed char yytype_int8; +#else +typedef short int yytype_int8; #endif #ifdef YYTYPE_UINT16 @@ -199,7 +202,8 @@ typedef short int yytype_int16; # define YYSIZE_T __SIZE_TYPE__ # elif defined size_t # define YYSIZE_T size_t -# elif ! defined YYSIZE_T +# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # else @@ -213,68 +217,39 @@ typedef short int yytype_int16; # if defined YYENABLE_NLS && YYENABLE_NLS # if ENABLE_NLS # include /* INFRINGES ON USER NAME SPACE */ -# define YY_(Msgid) dgettext ("bison-runtime", Msgid) +# define YY_(msgid) dgettext ("bison-runtime", msgid) # endif # endif # ifndef YY_ -# define YY_(Msgid) Msgid -# endif -#endif - -#ifndef YY_ATTRIBUTE -# if (defined __GNUC__ \ - && (2 < __GNUC__ || (__GNUC__ == 2 && 96 <= __GNUC_MINOR__))) \ - || defined __SUNPRO_C && 0x5110 <= __SUNPRO_C -# define YY_ATTRIBUTE(Spec) __attribute__(Spec) -# else -# define YY_ATTRIBUTE(Spec) /* empty */ -# endif -#endif - -#ifndef YY_ATTRIBUTE_PURE -# define YY_ATTRIBUTE_PURE YY_ATTRIBUTE ((__pure__)) -#endif - -#ifndef YY_ATTRIBUTE_UNUSED -# define YY_ATTRIBUTE_UNUSED YY_ATTRIBUTE ((__unused__)) -#endif - -#if !defined _Noreturn \ - && (!defined __STDC_VERSION__ || __STDC_VERSION__ < 201112) -# if defined _MSC_VER && 1200 <= _MSC_VER -# define _Noreturn __declspec (noreturn) -# else -# define _Noreturn YY_ATTRIBUTE ((__noreturn__)) +# define YY_(msgid) msgid # endif #endif /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ -# define YYUSE(E) ((void) (E)) +# define YYUSE(e) ((void) (e)) #else -# define YYUSE(E) /* empty */ +# define YYUSE(e) /* empty */ #endif -#if defined __GNUC__ && 407 <= __GNUC__ * 100 + __GNUC_MINOR__ -/* Suppress an incorrect diagnostic about yylval being uninitialized. */ -# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ - _Pragma ("GCC diagnostic push") \ - _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")\ - _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") -# define YY_IGNORE_MAYBE_UNINITIALIZED_END \ - _Pragma ("GCC diagnostic pop") +/* Identity function, used to suppress warnings about constant conditions. */ +#ifndef lint +# define YYID(n) (n) #else -# define YY_INITIAL_VALUE(Value) Value -#endif -#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN -# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN -# define YY_IGNORE_MAYBE_UNINITIALIZED_END +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static int +YYID (int yyi) +#else +static int +YYID (yyi) + int yyi; #endif -#ifndef YY_INITIAL_VALUE -# define YY_INITIAL_VALUE(Value) /* Nothing. */ +{ + return yyi; +} #endif - #if ! defined yyoverflow || YYERROR_VERBOSE /* The parser invokes alloca or malloc; define the necessary symbols. */ @@ -292,9 +267,9 @@ typedef short int yytype_int16; # define alloca _alloca # else # define YYSTACK_ALLOC alloca -# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS +# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ - /* Use EXIT_SUCCESS as a witness for stdlib.h. */ # ifndef EXIT_SUCCESS # define EXIT_SUCCESS 0 # endif @@ -304,8 +279,8 @@ typedef short int yytype_int16; # endif # ifdef YYSTACK_ALLOC - /* Pacify GCC's 'empty if-body' warning. */ -# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) + /* Pacify GCC's `empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) # ifndef YYSTACK_ALLOC_MAXIMUM /* The OS might guarantee only one guard page at the bottom of the stack, and a page size can be as small as 4096 bytes. So we cannot safely @@ -321,7 +296,7 @@ typedef short int yytype_int16; # endif # if (defined __cplusplus && ! defined EXIT_SUCCESS \ && ! ((defined YYMALLOC || defined malloc) \ - && (defined YYFREE || defined free))) + && (defined YYFREE || defined free))) # include /* INFRINGES ON USER NAME SPACE */ # ifndef EXIT_SUCCESS # define EXIT_SUCCESS 0 @@ -329,13 +304,15 @@ typedef short int yytype_int16; # endif # ifndef YYMALLOC # define YYMALLOC malloc -# if ! defined malloc && ! defined EXIT_SUCCESS +# if ! defined malloc && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ # endif # endif # ifndef YYFREE # define YYFREE free -# if ! defined free && ! defined EXIT_SUCCESS +# if ! defined free && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) void free (void *); /* INFRINGES ON USER NAME SPACE */ # endif # endif @@ -345,7 +322,7 @@ void free (void *); /* INFRINGES ON USER NAME SPACE */ #if (! defined yyoverflow \ && (! defined __cplusplus \ - || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) + || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) /* A type that is properly aligned for any stack member. */ union yyalloc @@ -370,35 +347,35 @@ union yyalloc elements in the stack, and YYPTR gives the new location of the stack. Advance YYPTR to a properly aligned location for the next stack. */ -# define YYSTACK_RELOCATE(Stack_alloc, Stack) \ - do \ - { \ - YYSIZE_T yynewbytes; \ - YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ - Stack = &yyptr->Stack_alloc; \ - yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ - yyptr += yynewbytes / sizeof (*yyptr); \ - } \ - while (0) +# define YYSTACK_RELOCATE(Stack_alloc, Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ + Stack = &yyptr->Stack_alloc; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (YYID (0)) #endif #if defined YYCOPY_NEEDED && YYCOPY_NEEDED -/* Copy COUNT objects from SRC to DST. The source and destination do +/* Copy COUNT objects from FROM to TO. The source and destination do not overlap. */ # ifndef YYCOPY # if defined __GNUC__ && 1 < __GNUC__ -# define YYCOPY(Dst, Src, Count) \ - __builtin_memcpy (Dst, Src, (Count) * sizeof (*(Src))) +# define YYCOPY(To, From, Count) \ + __builtin_memcpy (To, From, (Count) * sizeof (*(From))) # else -# define YYCOPY(Dst, Src, Count) \ - do \ - { \ - YYSIZE_T yyi; \ - for (yyi = 0; yyi < (Count); yyi++) \ - (Dst)[yyi] = (Src)[yyi]; \ - } \ - while (0) +# define YYCOPY(To, From, Count) \ + do \ + { \ + YYSIZE_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (To)[yyi] = (From)[yyi]; \ + } \ + while (YYID (0)) # endif # endif #endif /* !YYCOPY_NEEDED */ @@ -414,19 +391,17 @@ union yyalloc #define YYNNTS 6 /* YYNRULES -- Number of rules. */ #define YYNRULES 13 -/* YYNSTATES -- Number of states. */ +/* YYNRULES -- Number of states. */ #define YYNSTATES 32 -/* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned - by yylex, with out-of-bounds checking. */ +/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 #define YYMAXUTOK 277 -#define YYTRANSLATE(YYX) \ +#define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) -/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM - as returned by yylex, without out-of-bounds checking. */ +/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ static const yytype_uint8 yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -460,7 +435,25 @@ static const yytype_uint8 yytranslate[] = }; #if YYDEBUG - /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ +/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in + YYRHS. */ +static const yytype_uint8 yyprhs[] = +{ + 0, 0, 3, 8, 9, 10, 19, 20, 27, 31, + 35, 39, 42, 44 +}; + +/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +static const yytype_int8 yyrhs[] = +{ + 24, 0, -1, 3, 17, 25, 18, -1, -1, -1, + 22, 14, 26, 4, 27, 5, 15, 25, -1, -1, + 13, 28, 6, 7, 22, 27, -1, 11, 28, 12, + -1, 28, 9, 28, -1, 28, 8, 28, -1, 10, + 28, -1, 16, -1, 22, -1 +}; + +/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const yytype_uint8 yyrline[] = { 0, 53, 53, 56, 57, 57, 60, 61, 64, 65, @@ -468,7 +461,7 @@ static const yytype_uint8 yyrline[] = }; #endif -#if YYDEBUG || YYERROR_VERBOSE || 0 +#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = @@ -477,13 +470,13 @@ static const char *const yytname[] = "AND", "OR", "NOT", "LEFT_PAR", "RIGHT_PAR", "CASE", "COLON", "SEMI_COLON", "CASE_TRUE", "LEFT_BRACE", "RIGHT_BRACE", "LITT_ENT", "LITT_CHAINE", "LITT_REEL", "ID", "$accept", "automaton", "stateseq", - "$@1", "option", "exp", YY_NULLPTR + "$@1", "option", "exp", 0 }; #endif # ifdef YYPRINT -/* YYTOKNUM[NUM] -- (External) token number corresponding to the - (internal) symbol number NUM (which must be that of a token). */ +/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to + token YYLEX-NUM. */ static const yytype_uint16 yytoknum[] = { 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, @@ -492,29 +485,23 @@ static const yytype_uint16 yytoknum[] = }; # endif -#define YYPACT_NINF -16 - -#define yypact_value_is_default(Yystate) \ - (!!((Yystate) == (-16))) - -#define YYTABLE_NINF -1 - -#define yytable_value_is_error(Yytable_value) \ - 0 +/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +static const yytype_uint8 yyr1[] = +{ + 0, 23, 24, 25, 26, 25, 27, 27, 28, 28, + 28, 28, 28, 28 +}; - /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing - STATE-NUM. */ -static const yytype_int8 yypact[] = +/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +static const yytype_uint8 yyr2[] = { - 0, -15, 10, -13, -16, 2, 1, -16, -16, 16, - 8, -10, 17, -10, -10, -16, -16, 9, 11, -16, - -1, 18, -10, -10, -13, -16, 5, -16, -16, -16, - 8, -16 + 0, 2, 4, 0, 0, 8, 0, 6, 3, 3, + 3, 2, 1, 1 }; - /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. - Performed when YYTABLE does not specify something else to do. Zero - means the default is an error. */ +/* YYDEFACT[STATE-NAME] -- Default reduction number in state STATE-NUM. + Performed when YYTABLE doesn't specify something else to do. Zero + means the default is an error. */ static const yytype_uint8 yydefact[] = { 0, 0, 0, 3, 1, 0, 0, 4, 2, 0, @@ -523,21 +510,33 @@ static const yytype_uint8 yydefact[] = 6, 7 }; - /* YYPGOTO[NTERM-NUM]. */ -static const yytype_int8 yypgoto[] = +/* YYDEFGOTO[NTERM-NUM]. */ +static const yytype_int8 yydefgoto[] = { - -16, -16, 4, -16, -7, -9 + -1, 2, 6, 9, 12, 17 }; - /* YYDEFGOTO[NTERM-NUM]. */ -static const yytype_int8 yydefgoto[] = +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +#define YYPACT_NINF -16 +static const yytype_int8 yypact[] = { - -1, 2, 6, 9, 12, 17 + 0, -15, 10, -13, -16, 2, 1, -16, -16, 16, + 8, -10, 17, -10, -10, -16, -16, 9, 11, -16, + -1, 18, -10, -10, -13, -16, 5, -16, -16, -16, + 8, -16 }; - /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If - positive, shift that token. If negative, reduce the rule whose - number is the opposite. If YYTABLE_NINF, syntax error. */ +/* YYPGOTO[NTERM-NUM]. */ +static const yytype_int8 yypgoto[] = +{ + -16, -16, 4, -16, -7, -9 +}; + +/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule which + number is the opposite. If YYTABLE_NINF, syntax error. */ +#define YYTABLE_NINF -1 static const yytype_uint8 yytable[] = { 13, 14, 3, 1, 19, 20, 15, 22, 23, 5, @@ -545,6 +544,12 @@ static const yytype_uint8 yytable[] = 10, 11, 18, 31, 0, 26, 24, 30, 29 }; +#define yypact_value_is_default(yystate) \ + ((yystate) == (-16)) + +#define yytable_value_is_error(yytable_value) \ + YYID (0) + static const yytype_int8 yycheck[] = { 10, 11, 17, 3, 13, 14, 16, 8, 9, 22, @@ -552,8 +557,8 @@ static const yytype_int8 yycheck[] = 4, 13, 5, 30, -1, 7, 15, 22, 24 }; - /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing - symbol of state STATE-NUM. */ +/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ static const yytype_uint8 yystos[] = { 0, 3, 24, 17, 0, 22, 25, 14, 18, 26, @@ -562,55 +567,94 @@ static const yytype_uint8 yystos[] = 22, 27 }; - /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ -static const yytype_uint8 yyr1[] = -{ - 0, 23, 24, 25, 26, 25, 27, 27, 28, 28, - 28, 28, 28, 28 -}; - - /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ -static const yytype_uint8 yyr2[] = -{ - 0, 2, 4, 0, 0, 8, 0, 6, 3, 3, - 3, 2, 1, 1 -}; - +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) +#define YYEMPTY (-2) +#define YYEOF 0 + +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrorlab + + +/* Like YYERROR except do call yyerror. This remains here temporarily + to ease the transition to the new meaning of YYERROR, for GCC. + Once GCC version 2 has supplanted version 1, this can go. However, + YYFAIL appears to be in use. Nevertheless, it is formally deprecated + in Bison 2.4.2's NEWS entry, where a plan to phase it out is + discussed. */ + +#define YYFAIL goto yyerrlab +#if defined YYFAIL + /* This is here to suppress warnings from the GCC cpp's + -Wunused-macros. Normally we don't worry about that warning, but + some users do, and we want to make it easy for users to remove + YYFAIL uses, which will produce warnings from Bison 2.5. */ +#endif -#define yyerrok (yyerrstatus = 0) -#define yyclearin (yychar = YYEMPTY) -#define YYEMPTY (-2) -#define YYEOF 0 +#define YYRECOVERING() (!!yyerrstatus) -#define YYACCEPT goto yyacceptlab -#define YYABORT goto yyabortlab -#define YYERROR goto yyerrorlab +#define YYBACKUP(Token, Value) \ +do \ + if (yychar == YYEMPTY && yylen == 1) \ + { \ + yychar = (Token); \ + yylval = (Value); \ + YYPOPSTACK (1); \ + goto yybackup; \ + } \ + else \ + { \ + yyerror (YY_("syntax error: cannot back up")); \ + YYERROR; \ + } \ +while (YYID (0)) + + +#define YYTERROR 1 +#define YYERRCODE 256 + + +/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. + If N is 0, then set CURRENT to the empty location which ends + the previous symbol: RHS[0] (always defined). */ + +#define YYRHSLOC(Rhs, K) ((Rhs)[K]) +#ifndef YYLLOC_DEFAULT +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + do \ + if (YYID (N)) \ + { \ + (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ + (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ + (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ + (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ + } \ + else \ + { \ + (Current).first_line = (Current).last_line = \ + YYRHSLOC (Rhs, 0).last_line; \ + (Current).first_column = (Current).last_column = \ + YYRHSLOC (Rhs, 0).last_column; \ + } \ + while (YYID (0)) +#endif -#define YYRECOVERING() (!!yyerrstatus) +/* This macro is provided for backward compatibility. */ -#define YYBACKUP(Token, Value) \ -do \ - if (yychar == YYEMPTY) \ - { \ - yychar = (Token); \ - yylval = (Value); \ - YYPOPSTACK (yylen); \ - yystate = *yyssp; \ - goto yybackup; \ - } \ - else \ - { \ - yyerror (YY_("syntax error: cannot back up")); \ - YYERROR; \ - } \ -while (0) +#ifndef YY_LOCATION_PRINT +# define YY_LOCATION_PRINT(File, Loc) ((void) 0) +#endif -/* Error token number */ -#define YYTERROR 1 -#define YYERRCODE 256 +/* YYLEX -- calling `yylex' with the right arguments. */ +#ifdef YYLEX_PARAM +# define YYLEX yylex (YYLEX_PARAM) +#else +# define YYLEX yylex () +#endif /* Enable debugging if requested. */ #if YYDEBUG @@ -620,46 +664,54 @@ while (0) # define YYFPRINTF fprintf # endif -# define YYDPRINTF(Args) \ -do { \ - if (yydebug) \ - YYFPRINTF Args; \ -} while (0) - -/* This macro is provided for backward compatibility. */ -#ifndef YY_LOCATION_PRINT -# define YY_LOCATION_PRINT(File, Loc) ((void) 0) -#endif - +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (YYID (0)) -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ -do { \ - if (yydebug) \ - { \ - YYFPRINTF (stderr, "%s ", Title); \ - yy_symbol_print (stderr, \ - Type, Value); \ - YYFPRINTF (stderr, "\n"); \ - } \ -} while (0) +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yy_symbol_print (stderr, \ + Type, Value); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (YYID (0)) -/*----------------------------------------. -| Print this symbol's value on YYOUTPUT. | -`----------------------------------------*/ +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ +/*ARGSUSED*/ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) static void yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) +#else +static void +yy_symbol_value_print (yyoutput, yytype, yyvaluep) + FILE *yyoutput; + int yytype; + YYSTYPE const * const yyvaluep; +#endif { - FILE *yyo = yyoutput; - YYUSE (yyo); if (!yyvaluep) return; # ifdef YYPRINT if (yytype < YYNTOKENS) YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); +# else + YYUSE (yyoutput); # endif - YYUSE (yytype); + switch (yytype) + { + default: + break; + } } @@ -667,11 +719,22 @@ yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvalue | Print this symbol on YYOUTPUT. | `--------------------------------*/ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) static void yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) +#else +static void +yy_symbol_print (yyoutput, yytype, yyvaluep) + FILE *yyoutput; + int yytype; + YYSTYPE const * const yyvaluep; +#endif { - YYFPRINTF (yyoutput, "%s %s (", - yytype < YYNTOKENS ? "token" : "nterm", yytname[yytype]); + if (yytype < YYNTOKENS) + YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); + else + YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); yy_symbol_value_print (yyoutput, yytype, yyvaluep); YYFPRINTF (yyoutput, ")"); @@ -682,8 +745,16 @@ yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) | TOP (included). | `------------------------------------------------------------------*/ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) static void yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop) +#else +static void +yy_stack_print (yybottom, yytop) + yytype_int16 *yybottom; + yytype_int16 *yytop; +#endif { YYFPRINTF (stderr, "Stack now"); for (; yybottom <= yytop; yybottom++) @@ -694,42 +765,49 @@ yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop) YYFPRINTF (stderr, "\n"); } -# define YY_STACK_PRINT(Bottom, Top) \ -do { \ - if (yydebug) \ - yy_stack_print ((Bottom), (Top)); \ -} while (0) +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (YYID (0)) /*------------------------------------------------. | Report that the YYRULE is going to be reduced. | `------------------------------------------------*/ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_reduce_print (YYSTYPE *yyvsp, int yyrule) +#else static void -yy_reduce_print (yytype_int16 *yyssp, YYSTYPE *yyvsp, int yyrule) +yy_reduce_print (yyvsp, yyrule) + YYSTYPE *yyvsp; + int yyrule; +#endif { - unsigned long int yylno = yyrline[yyrule]; int yynrhs = yyr2[yyrule]; int yyi; + unsigned long int yylno = yyrline[yyrule]; YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", - yyrule - 1, yylno); + yyrule - 1, yylno); /* The symbols being reduced. */ for (yyi = 0; yyi < yynrhs; yyi++) { YYFPRINTF (stderr, " $%d = ", yyi + 1); - yy_symbol_print (stderr, - yystos[yyssp[yyi + 1 - yynrhs]], - &(yyvsp[(yyi + 1) - (yynrhs)]) - ); + yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], + &(yyvsp[(yyi + 1) - (yynrhs)]) + ); YYFPRINTF (stderr, "\n"); } } -# define YY_REDUCE_PRINT(Rule) \ -do { \ - if (yydebug) \ - yy_reduce_print (yyssp, yyvsp, Rule); \ -} while (0) +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (yyvsp, Rule); \ +} while (YYID (0)) /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ @@ -743,7 +821,7 @@ int yydebug; /* YYINITDEPTH -- initial size of the parser's stacks. */ -#ifndef YYINITDEPTH +#ifndef YYINITDEPTH # define YYINITDEPTH 200 #endif @@ -766,8 +844,15 @@ int yydebug; # define yystrlen strlen # else /* Return the length of YYSTR. */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) static YYSIZE_T yystrlen (const char *yystr) +#else +static YYSIZE_T +yystrlen (yystr) + const char *yystr; +#endif { YYSIZE_T yylen; for (yylen = 0; yystr[yylen]; yylen++) @@ -783,8 +868,16 @@ yystrlen (const char *yystr) # else /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in YYDEST. */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) static char * yystpcpy (char *yydest, const char *yysrc) +#else +static char * +yystpcpy (yydest, yysrc) + char *yydest; + const char *yysrc; +#endif { char *yyd = yydest; const char *yys = yysrc; @@ -814,27 +907,27 @@ yytnamerr (char *yyres, const char *yystr) char const *yyp = yystr; for (;;) - switch (*++yyp) - { - case '\'': - case ',': - goto do_not_strip_quotes; - - case '\\': - if (*++yyp != '\\') - goto do_not_strip_quotes; - /* Fall through. */ - default: - if (yyres) - yyres[yyn] = *yyp; - yyn++; - break; - - case '"': - if (yyres) - yyres[yyn] = '\0'; - return yyn; - } + switch (*++yyp) + { + case '\'': + case ',': + goto do_not_strip_quotes; + + case '\\': + if (*++yyp != '\\') + goto do_not_strip_quotes; + /* Fall through. */ + default: + if (yyres) + yyres[yyn] = *yyp; + yyn++; + break; + + case '"': + if (yyres) + yyres[yyn] = '\0'; + return yyn; + } do_not_strip_quotes: ; } @@ -857,11 +950,12 @@ static int yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, yytype_int16 *yyssp, int yytoken) { - YYSIZE_T yysize0 = yytnamerr (YY_NULLPTR, yytname[yytoken]); + YYSIZE_T yysize0 = yytnamerr (0, yytname[yytoken]); YYSIZE_T yysize = yysize0; + YYSIZE_T yysize1; enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; /* Internationalized format string. */ - const char *yyformat = YY_NULLPTR; + const char *yyformat = 0; /* Arguments of yyformat. */ char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; /* Number of reported tokens (one for the "unexpected", one per @@ -869,6 +963,10 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, int yycount = 0; /* There are many possibilities here to consider: + - Assume YYFAIL is not used. It's too flawed to consider. See + + for details. YYERROR is fine as it does not invoke this + function. - If this state is a consistent state with a default action, then the only way this function was invoked is if the default action is an error action. In that case, don't check for expected @@ -917,13 +1015,11 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, break; } yyarg[yycount++] = yytname[yyx]; - { - YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULLPTR, yytname[yyx]); - if (! (yysize <= yysize1 - && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) - return 2; - yysize = yysize1; - } + yysize1 = yysize + yytnamerr (0, yytname[yyx]); + if (! (yysize <= yysize1 + && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) + return 2; + yysize = yysize1; } } } @@ -943,12 +1039,10 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, # undef YYCASE_ } - { - YYSIZE_T yysize1 = yysize + yystrlen (yyformat); - if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) - return 2; - yysize = yysize1; - } + yysize1 = yysize + yystrlen (yyformat); + if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) + return 2; + yysize = yysize1; if (*yymsg_alloc < yysize) { @@ -985,20 +1079,48 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, | Release the memory associated to this symbol. | `-----------------------------------------------*/ +/*ARGSUSED*/ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) static void yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) +#else +static void +yydestruct (yymsg, yytype, yyvaluep) + const char *yymsg; + int yytype; + YYSTYPE *yyvaluep; +#endif { YYUSE (yyvaluep); + if (!yymsg) yymsg = "Deleting"; YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); - YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN - YYUSE (yytype); - YY_IGNORE_MAYBE_UNINITIALIZED_END + switch (yytype) + { + + default: + break; + } } +/* Prevent warnings from -Wmissing-prototypes. */ +#ifdef YYPARSE_PARAM +#if defined __STDC__ || defined __cplusplus +int yyparse (void *YYPARSE_PARAM); +#else +int yyparse (); +#endif +#else /* ! YYPARSE_PARAM */ +#if defined __STDC__ || defined __cplusplus +int yyparse (void); +#else +int yyparse (); +#endif +#endif /* ! YYPARSE_PARAM */ /* The lookahead symbol. */ @@ -1006,6 +1128,7 @@ int yychar; /* The semantic value of the lookahead symbol. */ YYSTYPE yylval; + /* Number of syntax errors so far. */ int yynerrs; @@ -1014,18 +1137,37 @@ int yynerrs; | yyparse. | `----------*/ +#ifdef YYPARSE_PARAM +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +int +yyparse (void *YYPARSE_PARAM) +#else +int +yyparse (YYPARSE_PARAM) + void *YYPARSE_PARAM; +#endif +#else /* ! YYPARSE_PARAM */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) int yyparse (void) +#else +int +yyparse () + +#endif +#endif { int yystate; /* Number of tokens to shift before error messages enabled. */ int yyerrstatus; /* The stacks and their tools: - 'yyss': related to states. - 'yyvs': related to semantic values. + `yyss': related to states. + `yyvs': related to semantic values. - Refer to the stacks through separate pointers, to allow yyoverflow + Refer to the stacks thru separate pointers, to allow yyoverflow to reallocate them elsewhere. */ /* The state stack. */ @@ -1043,7 +1185,7 @@ yyparse (void) int yyn; int yyresult; /* Lookahead token as an internal (translated) token number. */ - int yytoken = 0; + int yytoken; /* The variables used to return semantic value and location from the action routines. */ YYSTYPE yyval; @@ -1061,8 +1203,9 @@ yyparse (void) Keep to zero when no symbol should be popped. */ int yylen = 0; - yyssp = yyss = yyssa; - yyvsp = yyvs = yyvsa; + yytoken = 0; + yyss = yyssa; + yyvs = yyvsa; yystacksize = YYINITDEPTH; YYDPRINTF ((stderr, "Starting parse\n")); @@ -1071,6 +1214,14 @@ yyparse (void) yyerrstatus = 0; yynerrs = 0; yychar = YYEMPTY; /* Cause a token to be read. */ + + /* Initialize stack pointers. + Waste one element of value and location stack + so that they stay on the same level as the state stack. + The wasted elements are never initialized. */ + yyssp = yyss; + yyvsp = yyvs; + goto yysetstate; /*------------------------------------------------------------. @@ -1091,23 +1242,23 @@ yyparse (void) #ifdef yyoverflow { - /* Give user a chance to reallocate the stack. Use copies of - these so that the &'s don't force the real ones into - memory. */ - YYSTYPE *yyvs1 = yyvs; - yytype_int16 *yyss1 = yyss; - - /* Each stack pointer address is followed by the size of the - data in use in that stack, in bytes. This used to be a - conditional around just the two extra args, but that might - be undefined if yyoverflow is a macro. */ - yyoverflow (YY_("memory exhausted"), - &yyss1, yysize * sizeof (*yyssp), - &yyvs1, yysize * sizeof (*yyvsp), - &yystacksize); - - yyss = yyss1; - yyvs = yyvs1; + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + YYSTYPE *yyvs1 = yyvs; + yytype_int16 *yyss1 = yyss; + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow (YY_("memory exhausted"), + &yyss1, yysize * sizeof (*yyssp), + &yyvs1, yysize * sizeof (*yyvsp), + &yystacksize); + + yyss = yyss1; + yyvs = yyvs1; } #else /* no yyoverflow */ # ifndef YYSTACK_RELOCATE @@ -1115,22 +1266,22 @@ yyparse (void) # else /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) - goto yyexhaustedlab; + goto yyexhaustedlab; yystacksize *= 2; if (YYMAXDEPTH < yystacksize) - yystacksize = YYMAXDEPTH; + yystacksize = YYMAXDEPTH; { - yytype_int16 *yyss1 = yyss; - union yyalloc *yyptr = - (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); - if (! yyptr) - goto yyexhaustedlab; - YYSTACK_RELOCATE (yyss_alloc, yyss); - YYSTACK_RELOCATE (yyvs_alloc, yyvs); + yytype_int16 *yyss1 = yyss; + union yyalloc *yyptr = + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); + if (! yyptr) + goto yyexhaustedlab; + YYSTACK_RELOCATE (yyss_alloc, yyss); + YYSTACK_RELOCATE (yyvs_alloc, yyvs); # undef YYSTACK_RELOCATE - if (yyss1 != yyssa) - YYSTACK_FREE (yyss1); + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); } # endif #endif /* no yyoverflow */ @@ -1139,10 +1290,10 @@ yyparse (void) yyvsp = yyvs + yysize - 1; YYDPRINTF ((stderr, "Stack size increased to %lu\n", - (unsigned long int) yystacksize)); + (unsigned long int) yystacksize)); if (yyss + yystacksize - 1 <= yyssp) - YYABORT; + YYABORT; } YYDPRINTF ((stderr, "Entering state %d\n", yystate)); @@ -1171,7 +1322,7 @@ yybackup: if (yychar == YYEMPTY) { YYDPRINTF ((stderr, "Reading a token: ")); - yychar = yylex (); + yychar = YYLEX; } if (yychar <= YYEOF) @@ -1211,9 +1362,7 @@ yybackup: yychar = YYEMPTY; yystate = yyn; - YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN *++yyvsp = yylval; - YY_IGNORE_MAYBE_UNINITIALIZED_END goto yynewstate; @@ -1236,7 +1385,7 @@ yyreduce: yylen = yyr2[yyn]; /* If YYLEN is nonzero, implement the default value of the action: - '$$ = $1'. + `$$ = $1'. Otherwise, the following line sets YYVAL to garbage. This behavior is undocumented and Bison @@ -1250,55 +1399,65 @@ yyreduce: switch (yyn) { case 4: -#line 57 "parserPromela.yacc" /* yacc.c:1646 */ - { new_state((yyvsp[-1].string), 1);} -#line 1256 "parserPromela.tab.cacc" /* yacc.c:1646 */ + +/* Line 1806 of yacc.c */ +#line 57 "parserPromela.yacc" + { new_state((yyvsp[(1) - (2)].string), 1);} break; case 7: -#line 61 "parserPromela.yacc" /* yacc.c:1646 */ - { new_transition((yyvsp[-1].string), (yyvsp[-4].label));} -#line 1262 "parserPromela.tab.cacc" /* yacc.c:1646 */ + +/* Line 1806 of yacc.c */ +#line 61 "parserPromela.yacc" + { new_transition((yyvsp[(5) - (6)].string), (yyvsp[(2) - (6)].label));} break; case 8: -#line 64 "parserPromela.yacc" /* yacc.c:1646 */ - { (yyval.label) = (yyvsp[-1].label); } -#line 1268 "parserPromela.tab.cacc" /* yacc.c:1646 */ + +/* Line 1806 of yacc.c */ +#line 64 "parserPromela.yacc" + { (yyval.label) = (yyvsp[(2) - (3)].label); } break; case 9: -#line 65 "parserPromela.yacc" /* yacc.c:1646 */ - { (yyval.label) = new_label(0, (yyvsp[-2].label), (yyvsp[0].label)); } -#line 1274 "parserPromela.tab.cacc" /* yacc.c:1646 */ + +/* Line 1806 of yacc.c */ +#line 65 "parserPromela.yacc" + { (yyval.label) = new_label(0, (yyvsp[(1) - (3)].label), (yyvsp[(3) - (3)].label)); } break; case 10: -#line 66 "parserPromela.yacc" /* yacc.c:1646 */ - { (yyval.label) = new_label(1, (yyvsp[-2].label), (yyvsp[0].label)); } -#line 1280 "parserPromela.tab.cacc" /* yacc.c:1646 */ + +/* Line 1806 of yacc.c */ +#line 66 "parserPromela.yacc" + { (yyval.label) = new_label(1, (yyvsp[(1) - (3)].label), (yyvsp[(3) - (3)].label)); } break; case 11: -#line 67 "parserPromela.yacc" /* yacc.c:1646 */ - { (yyval.label) = new_label(2, (yyvsp[0].label)); } -#line 1286 "parserPromela.tab.cacc" /* yacc.c:1646 */ + +/* Line 1806 of yacc.c */ +#line 67 "parserPromela.yacc" + { (yyval.label) = new_label(2, (yyvsp[(2) - (2)].label)); } break; case 12: -#line 68 "parserPromela.yacc" /* yacc.c:1646 */ + +/* Line 1806 of yacc.c */ +#line 68 "parserPromela.yacc" { (yyval.label) = new_label(4); } -#line 1292 "parserPromela.tab.cacc" /* yacc.c:1646 */ break; case 13: -#line 69 "parserPromela.yacc" /* yacc.c:1646 */ - { (yyval.label) = new_label(3, (yyvsp[0].string)); } -#line 1298 "parserPromela.tab.cacc" /* yacc.c:1646 */ + +/* Line 1806 of yacc.c */ +#line 69 "parserPromela.yacc" + { (yyval.label) = new_label(3, (yyvsp[(1) - (1)].string)); } break; -#line 1302 "parserPromela.tab.cacc" /* yacc.c:1646 */ + +/* Line 1806 of yacc.c */ +#line 1461 "parserPromela.tab.cacc" default: break; } /* User semantic actions sometimes alter yychar, and that requires @@ -1320,7 +1479,7 @@ yyreduce: *++yyvsp = yyval; - /* Now 'shift' the result of the reduction. Determine what state + /* Now `shift' the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ @@ -1335,9 +1494,9 @@ yyreduce: goto yynewstate; -/*--------------------------------------. -| yyerrlab -- here on detecting error. | -`--------------------------------------*/ +/*------------------------------------. +| yyerrlab -- here on detecting error | +`------------------------------------*/ yyerrlab: /* Make sure we have latest lookahead translation. See comments at user semantic actions for why this is necessary. */ @@ -1388,20 +1547,20 @@ yyerrlab: if (yyerrstatus == 3) { /* If just tried and failed to reuse lookahead token after an - error, discard it. */ + error, discard it. */ if (yychar <= YYEOF) - { - /* Return failure if at end of input. */ - if (yychar == YYEOF) - YYABORT; - } + { + /* Return failure if at end of input. */ + if (yychar == YYEOF) + YYABORT; + } else - { - yydestruct ("Error: discarding", - yytoken, &yylval); - yychar = YYEMPTY; - } + { + yydestruct ("Error: discarding", + yytoken, &yylval); + yychar = YYEMPTY; + } } /* Else will try to reuse lookahead token after shifting the error @@ -1420,7 +1579,7 @@ yyerrorlab: if (/*CONSTCOND*/ 0) goto yyerrorlab; - /* Do not reclaim the symbols of the rule whose action triggered + /* Do not reclaim the symbols of the rule which action triggered this YYERROR. */ YYPOPSTACK (yylen); yylen = 0; @@ -1433,37 +1592,35 @@ yyerrorlab: | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ yyerrlab1: - yyerrstatus = 3; /* Each real token shifted decrements this. */ + yyerrstatus = 3; /* Each real token shifted decrements this. */ for (;;) { yyn = yypact[yystate]; if (!yypact_value_is_default (yyn)) - { - yyn += YYTERROR; - if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) - { - yyn = yytable[yyn]; - if (0 < yyn) - break; - } - } + { + yyn += YYTERROR; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } /* Pop the current state because it cannot handle the error token. */ if (yyssp == yyss) - YYABORT; + YYABORT; yydestruct ("Error: popping", - yystos[yystate], yyvsp); + yystos[yystate], yyvsp); YYPOPSTACK (1); yystate = *yyssp; YY_STACK_PRINT (yyss, yyssp); } - YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN *++yyvsp = yylval; - YY_IGNORE_MAYBE_UNINITIALIZED_END /* Shift the error token. */ @@ -1487,7 +1644,7 @@ yyabortlab: yyresult = 1; goto yyreturn; -#if !defined yyoverflow || YYERROR_VERBOSE +#if !defined(yyoverflow) || YYERROR_VERBOSE /*-------------------------------------------------. | yyexhaustedlab -- memory exhaustion comes here. | `-------------------------------------------------*/ @@ -1506,14 +1663,14 @@ yyreturn: yydestruct ("Cleanup: discarding lookahead", yytoken, &yylval); } - /* Do not reclaim the symbols of the rule whose action triggered + /* Do not reclaim the symbols of the rule which action triggered this YYABORT or YYACCEPT. */ YYPOPSTACK (yylen); YY_STACK_PRINT (yyss, yyssp); while (yyssp != yyss) { yydestruct ("Cleanup: popping", - yystos[*yyssp], yyvsp); + yystos[*yyssp], yyvsp); YYPOPSTACK (1); } #ifndef yyoverflow @@ -1524,9 +1681,14 @@ yyreturn: if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); #endif - return yyresult; + /* Make sure YYID is used. */ + return YYID (yyresult); } -#line 72 "parserPromela.yacc" /* yacc.c:1906 */ + + + +/* Line 2067 of yacc.c */ +#line 72 "parserPromela.yacc" @@ -1537,3 +1699,4 @@ void yyerror(const char *s){ + diff --git a/src/xbt/automaton/parserPromela.tab.hacc b/src/xbt/automaton/parserPromela.tab.hacc index 587506e790..27ae7bf0cc 100644 --- a/src/xbt/automaton/parserPromela.tab.hacc +++ b/src/xbt/automaton/parserPromela.tab.hacc @@ -1,19 +1,19 @@ -/* A Bison parser, made by GNU Bison 3.0.2. */ +/* A Bison parser, made by GNU Bison 2.5. */ /* Bison interface for Yacc-like parsers in C - - Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc. - + + Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc. + This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - + You should have received a copy of the GNU General Public License along with this program. If not, see . */ @@ -26,69 +26,64 @@ special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. - + This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ -#ifndef YY_XBT_AUTOMATON_PARSER_PARSERPROMELA_TAB_HACC_INCLUDED -# define YY_XBT_AUTOMATON_PARSER_PARSERPROMELA_TAB_HACC_INCLUDED -/* Debug traces. */ -#ifndef YYDEBUG -# define YYDEBUG 0 -#endif -#if YYDEBUG -extern int xbt_automaton_parser_debug; -#endif -/* Token type. */ +/* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE - enum yytokentype - { - NEVER = 258, - IF = 259, - FI = 260, - IMPLIES = 261, - GOTO = 262, - AND = 263, - OR = 264, - NOT = 265, - LEFT_PAR = 266, - RIGHT_PAR = 267, - CASE = 268, - COLON = 269, - SEMI_COLON = 270, - CASE_TRUE = 271, - LEFT_BRACE = 272, - RIGHT_BRACE = 273, - LITT_ENT = 274, - LITT_CHAINE = 275, - LITT_REEL = 276, - ID = 277 - }; + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + NEVER = 258, + IF = 259, + FI = 260, + IMPLIES = 261, + GOTO = 262, + AND = 263, + OR = 264, + NOT = 265, + LEFT_PAR = 266, + RIGHT_PAR = 267, + CASE = 268, + COLON = 269, + SEMI_COLON = 270, + CASE_TRUE = 271, + LEFT_BRACE = 272, + RIGHT_BRACE = 273, + LITT_ENT = 274, + LITT_CHAINE = 275, + LITT_REEL = 276, + ID = 277 + }; #endif -/* Value type. */ + + #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED -typedef union YYSTYPE YYSTYPE; -union YYSTYPE +typedef union YYSTYPE { -#line 16 "parserPromela.yacc" /* yacc.c:1909 */ + +/* Line 2068 of yacc.c */ +#line 16 "parserPromela.yacc" double real; int integer; char* string; xbt_automaton_exp_label_t label; -#line 84 "parserPromela.tab.hacc" /* yacc.c:1909 */ -}; + + +/* Line 2068 of yacc.c */ +#line 81 "parserPromela.tab.hacc" +} YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 #endif - extern YYSTYPE xbt_automaton_parser_lval; -int xbt_automaton_parser_parse (void); -#endif /* !YY_XBT_AUTOMATON_PARSER_PARSERPROMELA_TAB_HACC_INCLUDED */ diff --git a/src/xbt/config.c b/src/xbt/config.c index 0eb3145b86..49667ddf5e 100644 --- a/src/xbt/config.c +++ b/src/xbt/config.c @@ -380,10 +380,11 @@ void xbt_cfg_help(xbt_cfg_t cfg) printf(" %s: %s\n", name, variable->desc); printf(" Type: %s; ", xbt_cfgelm_type_name[variable->type]); if (variable->min != 1 || variable->max != 1) { - if (variable->min == 0 && variable->max == 0) - printf("Arity: no bound; "); + printf("Arity: min:%d to max:", variable->min); + if (variable->max == 0) + printf("(no bound); "); else - printf("Arity: min:%d to max:%d; ", variable->min, variable->max); + printf("%d; ", variable->max); } size = xbt_dynar_length(variable->content); printf("Current value%s: ", (size <= 1 ? "" : "s")); @@ -453,6 +454,13 @@ void xbt_cfg_check(xbt_cfg_t cfg) size); } + if (variable->isdefault && size > variable->min) { + xbt_dict_cursor_free(&cursor); + THROWF(mismatch_error, 0, + "Config elem %s theoretically accepts %d %s, but has a default of %d values.", + name, variable->min, xbt_cfgelm_type_name[variable->type], size); + } + if (variable->max > 0 && variable->max < size) { xbt_dict_cursor_free(&cursor); THROWF(mismatch_error, 0, diff --git a/src/xbt/dynar.c b/src/xbt/dynar.c index 7b026573e1..26c9196a7f 100644 --- a/src/xbt/dynar.c +++ b/src/xbt/dynar.c @@ -82,17 +82,6 @@ _xbt_dynar_get_elm(void *const dst, memcpy(dst, elm, dynar->elmsize); } -static XBT_INLINE - void -_xbt_dynar_put_elm(const xbt_dynar_t dynar, - const unsigned long idx, const void *const src) -{ - void *const elm = _xbt_dynar_elm(dynar, idx); - const unsigned long elmsize = dynar->elmsize; - - memcpy(elm, src, elmsize); -} - void xbt_dynar_dump(xbt_dynar_t dynar) { XBT_INFO("Dynar dump: size=%lu; used=%lu; elmsize=%lu; data=%p; free_f=%p", diff --git a/src/xbt/graphxml.c b/src/xbt/graphxml.c index 7c6579dd5b..0f5a9e4ce3 100644 --- a/src/xbt/graphxml.c +++ b/src/xbt/graphxml.c @@ -474,8 +474,8 @@ static yyconst flex_int16_t yy_accept[564] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 15, 0, 0, 13, - 0, 14, 0 + 0, 0, 0, 0, 0, 0, 13, 0, 0, 14, + 0, 15, 0 } ; static yyconst flex_int32_t yy_ec[256] = @@ -1135,42 +1135,42 @@ const char graphxml_flexml_version[] = "1.9.6"; int graphxml_pcdata_ix; extern char *graphxml_bufferstack; #define graphxml_pcdata (graphxml_bufferstack + graphxml_pcdata_ix) +AT_graphxml_node_name AX_graphxml_node_name; +#define A_graphxml_node_name (graphxml_bufferstack + AX_graphxml_node_name) +short int graphxml_node_name_isset; AT_graphxml_edge_source AX_graphxml_edge_source; #define A_graphxml_edge_source (graphxml_bufferstack + AX_graphxml_edge_source) short int graphxml_edge_source_isset; -AT_graphxml_edge_target AX_graphxml_edge_target; -#define A_graphxml_edge_target (graphxml_bufferstack + AX_graphxml_edge_target) -short int graphxml_edge_target_isset; -AT_graphxml_edge_name AX_graphxml_edge_name; -#define A_graphxml_edge_name (graphxml_bufferstack + AX_graphxml_edge_name) -short int graphxml_edge_name_isset; AT_graphxml_node_position___y AX_graphxml_node_position___y; #define A_graphxml_node_position___y (graphxml_bufferstack + AX_graphxml_node_position___y) short int graphxml_node_position___y_isset; -AT_graphxml_node_data AX_graphxml_node_data; -#define A_graphxml_node_data (graphxml_bufferstack + AX_graphxml_node_data) -short int graphxml_node_data_isset; -AT_graphxml_edge_length AX_graphxml_edge_length; -#define A_graphxml_edge_length (graphxml_bufferstack + AX_graphxml_edge_length) -short int graphxml_edge_length_isset; -AT_graphxml_node_label AX_graphxml_node_label; -#define A_graphxml_node_label (graphxml_bufferstack + AX_graphxml_node_label) -short int graphxml_node_label_isset; -AT_graphxml_edge_label AX_graphxml_edge_label; -#define A_graphxml_edge_label (graphxml_bufferstack + AX_graphxml_edge_label) -short int graphxml_edge_label_isset; -AT_graphxml_graph_isDirected AX_graphxml_graph_isDirected; -#define A_graphxml_graph_isDirected AX_graphxml_graph_isDirected -short int graphxml_graph_isDirected_isset; AT_graphxml_node_position___x AX_graphxml_node_position___x; #define A_graphxml_node_position___x (graphxml_bufferstack + AX_graphxml_node_position___x) short int graphxml_node_position___x_isset; AT_graphxml_edge_data AX_graphxml_edge_data; #define A_graphxml_edge_data (graphxml_bufferstack + AX_graphxml_edge_data) short int graphxml_edge_data_isset; -AT_graphxml_node_name AX_graphxml_node_name; -#define A_graphxml_node_name (graphxml_bufferstack + AX_graphxml_node_name) -short int graphxml_node_name_isset; +AT_graphxml_edge_target AX_graphxml_edge_target; +#define A_graphxml_edge_target (graphxml_bufferstack + AX_graphxml_edge_target) +short int graphxml_edge_target_isset; +AT_graphxml_graph_isDirected AX_graphxml_graph_isDirected; +#define A_graphxml_graph_isDirected AX_graphxml_graph_isDirected +short int graphxml_graph_isDirected_isset; +AT_graphxml_node_label AX_graphxml_node_label; +#define A_graphxml_node_label (graphxml_bufferstack + AX_graphxml_node_label) +short int graphxml_node_label_isset; +AT_graphxml_node_data AX_graphxml_node_data; +#define A_graphxml_node_data (graphxml_bufferstack + AX_graphxml_node_data) +short int graphxml_node_data_isset; +AT_graphxml_edge_label AX_graphxml_edge_label; +#define A_graphxml_edge_label (graphxml_bufferstack + AX_graphxml_edge_label) +short int graphxml_edge_label_isset; +AT_graphxml_edge_length AX_graphxml_edge_length; +#define A_graphxml_edge_length (graphxml_bufferstack + AX_graphxml_edge_length) +short int graphxml_edge_length_isset; +AT_graphxml_edge_name AX_graphxml_edge_name; +#define A_graphxml_edge_name (graphxml_bufferstack + AX_graphxml_edge_name) +short int graphxml_edge_name_isset; /* XML state. */ #ifdef FLEX_DEBUG @@ -1744,17 +1744,17 @@ FAIL("Bad declaration %s.",xbt_graph_parse_text); case 13: /* rule 13 can match eol */ YY_RULE_SETUP -SET(ROOT_graphxml_node); +SET(ROOT_graphxml_edge); YY_BREAK case 14: /* rule 14 can match eol */ YY_RULE_SETUP -SET(ROOT_graphxml_graph); +SET(ROOT_graphxml_node); YY_BREAK case 15: /* rule 15 can match eol */ YY_RULE_SETUP -SET(ROOT_graphxml_edge); +SET(ROOT_graphxml_graph); YY_BREAK case 16: /* rule 16 can match eol */ @@ -1851,11 +1851,11 @@ case 30: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",xbt_graph_parse_text[0]); YY_BREAK -case YY_STATE_EOF(S_graphxml_graph_3): -case YY_STATE_EOF(E_graphxml_graph): case YY_STATE_EOF(S_graphxml_graph_1): -case YY_STATE_EOF(S_graphxml_graph): +case YY_STATE_EOF(E_graphxml_graph): +case YY_STATE_EOF(S_graphxml_graph_3): case YY_STATE_EOF(S_graphxml_graph_5): +case YY_STATE_EOF(S_graphxml_graph): FAIL("Premature EOF: `' expected."); YY_BREAK @@ -1951,7 +1951,7 @@ YY_RULE_SETUP if (!AX_graphxml_node_name) FAIL("Required attribute `name' not set for `node' element."); LEAVE; STag_graphxml_node(); graphxml_pcdata_ix = 0; ETag_graphxml_node(); popbuffer(); /* attribute */ switch (YY_START) { - case S_graphxml_graph_3: case S_graphxml_graph_2: case S_graphxml_graph: SET(S_graphxml_graph_3); break; + case S_graphxml_graph_2: case S_graphxml_graph_3: case S_graphxml_graph: SET(S_graphxml_graph_3); break; case ROOT_graphxml_node: SET(EPILOG); break; } } @@ -1976,7 +1976,7 @@ YY_RULE_SETUP ETag_graphxml_node(); popbuffer(); /* attribute */ switch (YY_START) { - case S_graphxml_graph_3: case S_graphxml_graph_2: case S_graphxml_graph: SET(S_graphxml_graph_3); break; + case S_graphxml_graph_2: case S_graphxml_graph_3: case S_graphxml_graph: SET(S_graphxml_graph_3); break; case ROOT_graphxml_node: SET(EPILOG); break; } } @@ -2101,7 +2101,7 @@ YY_RULE_SETUP if (!AX_graphxml_edge_target) FAIL("Required attribute `target' not set for `edge' element."); LEAVE; STag_graphxml_edge(); graphxml_pcdata_ix = 0; ETag_graphxml_edge(); popbuffer(); /* attribute */ switch (YY_START) { - case S_graphxml_graph_3: case S_graphxml_graph_1: case S_graphxml_graph: case S_graphxml_graph_4: case S_graphxml_graph_5: SET(S_graphxml_graph_5); break; + case S_graphxml_graph_1: case S_graphxml_graph_3: case S_graphxml_graph_5: case S_graphxml_graph_4: case S_graphxml_graph: SET(S_graphxml_graph_5); break; case ROOT_graphxml_edge: SET(EPILOG); break; } } @@ -2126,7 +2126,7 @@ YY_RULE_SETUP ETag_graphxml_edge(); popbuffer(); /* attribute */ switch (YY_START) { - case S_graphxml_graph_3: case S_graphxml_graph_1: case S_graphxml_graph: case S_graphxml_graph_4: case S_graphxml_graph_5: SET(S_graphxml_graph_5); break; + case S_graphxml_graph_1: case S_graphxml_graph_3: case S_graphxml_graph_5: case S_graphxml_graph_4: case S_graphxml_graph: SET(S_graphxml_graph_5); break; case ROOT_graphxml_edge: SET(EPILOG); break; } } diff --git a/src/xbt/lib.c b/src/xbt/lib.c index 8c594cfb82..7fa4bc7caa 100644 --- a/src/xbt/lib.c +++ b/src/xbt/lib.c @@ -80,25 +80,28 @@ void xbt_lib_unset(xbt_lib_t lib, const char *key, int level, int invoke_callbac } void *obj = elts[level]; - if (!obj) { XBT_WARN("no key %s at level %d", key, level); - } else { - XBT_DEBUG("Remove %p of key %s at level %d", obj, key, level); - if (invoke_callback) - lib->free_f[level](obj); - elts[level] = NULL; + return; } + XBT_DEBUG("Remove %p of key %s at level %d", obj, key, level); + elts[level] = NULL; + /* check if there still remains any elements of this key */ + int empty = 1; int i; - for (i = 0; i < lib->levels; i++) { + for (i = 0; i < lib->levels && empty; i++) { if (elts[i] != NULL) - return; + empty = 0; + } + if (empty) { + /* there is no element at any level, so delete the key */ + xbt_dict_remove(lib->dict, key); } - /* there is no element at any level, so delete the key */ - xbt_dict_remove(lib->dict, key); + if (invoke_callback) + lib->free_f[level](obj); } void *xbt_lib_get_or_null(xbt_lib_t lib, const char *key, int level) diff --git a/src/xbt/mmalloc/mm_diff.c b/src/xbt/mmalloc/mm_diff.c index a17a4a311b..7258e6f1b3 100644 --- a/src/xbt/mmalloc/mm_diff.c +++ b/src/xbt/mmalloc/mm_diff.c @@ -347,7 +347,7 @@ int init_heap_information(xbt_mheap_t heap1, xbt_mheap_t heap2, xbt_dynar_t i1, state->heaplimit = ((struct mdesc *)heap1)->heaplimit; - state->s_heap = (char *)mmalloc_get_current_heap() - STD_HEAP_SIZE - getpagesize(); + state->s_heap = (char *)mmalloc_get_current_heap() - STD_HEAP_SIZE - xbt_pagesize; state->heapbase1 = (char *)heap1 + BLOCKSIZE; state->heapbase2 = (char *)heap2 + BLOCKSIZE; @@ -1435,7 +1435,7 @@ int mmalloc_linear_compare_heap(xbt_mheap_t heap1, xbt_mheap_t heap2){ /* Heap information */ state->heaplimit = ((struct mdesc *)heap1)->heaplimit; - state->s_heap = (char *)mmalloc_get_current_heap() - STD_HEAP_SIZE - getpagesize(); + state->s_heap = (char *)mmalloc_get_current_heap() - STD_HEAP_SIZE - xbt_pagesize; state->heapbase1 = (char *)heap1 + BLOCKSIZE; state->heapbase2 = (char *)heap2 + BLOCKSIZE; diff --git a/src/xbt/mmalloc/mm_legacy.c b/src/xbt/mmalloc/mm_legacy.c index 7984ad0bfe..0073245ad5 100644 --- a/src/xbt/mmalloc/mm_legacy.c +++ b/src/xbt/mmalloc/mm_legacy.c @@ -7,6 +7,7 @@ /* Redefine the classical malloc/free/realloc functions so that they fit well in the mmalloc framework */ #include "mmprivate.h" +#include "xbt_modinter.h" #include "internal_config.h" #include diff --git a/src/xbt/mmalloc/mm_module.c b/src/xbt/mmalloc/mm_module.c index 7cfde64607..08f9de28e8 100644 --- a/src/xbt/mmalloc/mm_module.c +++ b/src/xbt/mmalloc/mm_module.c @@ -323,7 +323,7 @@ void *mmalloc_preinit(void) { int res; if (__mmalloc_default_mdp == NULL) { - unsigned long mask = ~((unsigned long)getpagesize() - 1); + unsigned long mask = ~((unsigned long)xbt_pagesize - 1); void *addr = (void*)(((unsigned long)sbrk(0) + HEAP_OFFSET) & mask); __mmalloc_default_mdp = xbt_mheap_new(-1, addr); /* Fixme? only the default mdp in protected against forks */ diff --git a/src/xbt/mmalloc/mmorecore.c b/src/xbt/mmalloc/mmorecore.c index 5ad7cd37af..014b8b81c2 100644 --- a/src/xbt/mmalloc/mmorecore.c +++ b/src/xbt/mmalloc/mmorecore.c @@ -19,18 +19,12 @@ #include #include #include +#include #include "mmprivate.h" -/* Cache the pagesize for the current host machine. Note that if the host - does not readily provide a getpagesize() function, we need to emulate it - elsewhere, not clutter up this file with lots of kluges to try to figure - it out. */ - -static size_t pagesize; - -#define PAGE_ALIGN(addr) (void*) (((long)(addr) + pagesize - 1) & \ - ~(pagesize - 1)) +#define PAGE_ALIGN(addr) (void*) (((long)(addr) + xbt_pagesize - 1) & \ + ~((long)xbt_pagesize - 1)) /* Return MAP_PRIVATE if MDP represents /dev/zero. Otherwise, return MAP_SHARED. */ @@ -65,8 +59,6 @@ void *mmorecore(struct mdesc *mdp, ssize_t size) char buf = 0; /* Single byte to write to extend mapped file */ // fprintf(stderr,"increase %p by %u\n",mdp,size); - if (pagesize == 0) - pagesize = getpagesize(); if (size == 0) { /* Just return the current "break" value. */ diff --git a/src/xbt/set.c b/src/xbt/set.c index 7f2030e91b..01d2982998 100644 --- a/src/xbt/set.c +++ b/src/xbt/set.c @@ -382,6 +382,9 @@ static void search_name(xbt_set_t head, const char *key) elm = (my_elem_t) xbt_set_get_by_name(head, key); xbt_test_log(" Found %s (under ID %u)\n", elm ? elm->data : "(null)", elm ? elm->ID : -1); + if (elm == NULL) + THROWF(mismatch_error, 0, + "Got a null elm for name %s", key); if (strcmp(key, elm->name)) THROWF(mismatch_error, 0, "The key (%s) is not the one expected (%s)", key, elm->name); @@ -399,6 +402,9 @@ static void search_id(xbt_set_t head, int id, const char *key) elm = (my_elem_t) xbt_set_get_by_id(head, id); xbt_test_log("Found %s (data %s)", elm ? elm->name : "(null)", elm ? elm->data : "(null)"); + if (elm == NULL) + THROWF(mismatch_error, 0, + "Got a null elm for id %d", id); if (id != elm->ID) THROWF(mismatch_error, 0, "The found ID (%u) is not the one expected (%d)", elm->ID, id); @@ -418,6 +424,8 @@ static void traverse(xbt_set_t set) xbt_set_foreach(set, cursor, elm) { xbt_test_assert(elm, "Dude ! Got a null elm during traversal!"); + if (!elm) + continue; xbt_test_log("Id(%u): %s->%s\n", elm->ID, elm->name, elm->data); xbt_test_assert(!strcmp(elm->name, elm->data), "Key(%s) != value(%s). Aborting", elm->name, @@ -489,7 +497,7 @@ XBT_TEST_UNIT("retrieve", test_set_retrieve, "Retrieving some values") xbt_test_add("Search 123"); elm = (my_elem_t) xbt_set_get_by_name(set, "123"); xbt_test_assert(elm, "elm must be there"); - xbt_assert(!strcmp("123", elm->data)); + xbt_assert(elm && !strcmp("123", elm->data)); search_not_found(set, "Can't be found"); search_not_found(set, "123 Can't be found"); diff --git a/src/xbt/xbt_main.c b/src/xbt/xbt_main.c index 26e8dd1a71..30c1a8427a 100644 --- a/src/xbt/xbt_main.c +++ b/src/xbt/xbt_main.c @@ -9,7 +9,7 @@ #include "xbt/misc.h" #include "simgrid_config.h" /* _XBT_WIN32 */ #include "internal_config.h" /* MMALLOC_WANT_OVERRIDE_LEGACY */ - +#include "portable.h" #include "xbt/sysdep.h" #include "xbt/log.h" #include "xbt/dynar.h" @@ -35,6 +35,8 @@ xbt_dynar_t xbt_cmdline = NULL; /* all we got in argv */ int xbt_initialized = 0; int _sg_do_clean_atexit = 1; +int xbt_pagesize; + /* Declare xbt_preinit and xbt_postexit as constructor/destructor of the library. * This is crude and rather compiler-specific, unfortunately. */ @@ -84,6 +86,8 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, static void xbt_preinit(void) { unsigned int seed = 2147483647; + xbt_pagesize = sysconf(_SC_PAGESIZE); + #ifdef MMALLOC_WANT_OVERRIDE_LEGACY mmalloc_preinit(); #endif diff --git a/src/xbt/xbt_os_thread.c b/src/xbt/xbt_os_thread.c index ff9d996ee3..f29549575c 100644 --- a/src/xbt/xbt_os_thread.c +++ b/src/xbt/xbt_os_thread.c @@ -54,10 +54,9 @@ static xbt_os_thread_t main_thread = NULL; static pthread_key_t xbt_self_thread_key; static int thread_mod_inited = 0; -/* attribute structure to handle pthread stack size changing */ +/* defaults attribute for pthreads */ //FIXME: find where to put this -static pthread_attr_t attr; -static int thread_attr_inited = 0; +static pthread_attr_t thread_attr; /* frees the xbt_os_thread_t corresponding to the current thread */ static void xbt_os_thread_free_thread_data(xbt_os_thread_t thread) @@ -105,11 +104,12 @@ void xbt_os_thread_mod_preinit(void) if ((errcode = pthread_setspecific(xbt_self_thread_key, main_thread))) THROWF(system_error, errcode, "pthread_setspecific failed for xbt_self_thread_key"); - __xbt_running_ctx_fetch = _os_thread_get_running_ctx; __xbt_ex_terminate = _os_thread_ex_terminate; + pthread_attr_init(&thread_attr); + thread_mod_inited = 1; #ifndef HAVE_SEM_INIT @@ -182,7 +182,7 @@ xbt_os_thread_t xbt_os_thread_create(const char *name, XBT_RUNNING_CTX_INITIALIZE(res_thread->running_ctx); res_thread->extra_data = extra_data; - if ((errcode = pthread_create(&(res_thread->t), thread_attr_inited!=0? &attr: NULL, + if ((errcode = pthread_create(&(res_thread->t), &thread_attr, wrapper_start_routine, res_thread))) THROWF(system_error, errcode, "pthread_create failed: %s", strerror(errcode)); @@ -195,35 +195,47 @@ xbt_os_thread_t xbt_os_thread_create(const char *name, void xbt_os_thread_setstacksize(int stack_size) { + size_t alignment[] = { + xbt_pagesize, +#ifdef PTHREAD_STACK_MIN + PTHREAD_STACK_MIN, +#endif + 0 + }; size_t sz; int res; + int i; if (stack_size < 0) xbt_die("stack size %d is negative, maybe it exceeds MAX_INT?", stack_size); sz = stack_size; - pthread_attr_init(&attr); - res = pthread_attr_setstacksize(&attr, sz); + res = pthread_attr_setstacksize(&thread_attr, sz); -#ifdef PTHREAD_STACK_MIN - if (res == EINVAL) { - /* Invalid size, try again with a multiple of PTHREAD_STACK_MIN. */ - size_t rem = sz % PTHREAD_STACK_MIN; + for (i = 0; res == EINVAL && alignment[i] > 0; i++) { + /* Invalid size, try again with next multiple of alignment[i]. */ + size_t rem = sz % alignment[i]; if (rem != 0 || sz == 0) { - size_t sz2 = sz - rem + PTHREAD_STACK_MIN; - XBT_DEBUG("pthread_attr_setstacksize failed for %#zx, try again with %#zx", + size_t sz2 = sz - rem + alignment[i]; + XBT_DEBUG("pthread_attr_setstacksize failed for %zd, try again with %zd", sz, sz2); sz = sz2; - res = pthread_attr_setstacksize(&attr, sz); + res = pthread_attr_setstacksize(&thread_attr, sz); } } -#endif if (res == EINVAL) - XBT_WARN("invalid stack size (maybe too big): %#zx", sz); + XBT_WARN("invalid stack size (maybe too big): %zd", sz); else if (res != 0) - XBT_WARN("unknown error %d in pthread stacksize setting: %#zx", res, sz); - thread_attr_inited = 1; + XBT_WARN("unknown error %d in pthread stacksize setting: %zd", res, sz); +} + +void xbt_os_thread_setguardsize(int guard_size) +{ + size_t sz = guard_size; + int res = pthread_attr_setguardsize(&thread_attr, sz); + if (res) + XBT_WARN("pthread_attr_setguardsize failed (%d) for size: %zd", res, sz); } const char *xbt_os_thread_name(xbt_os_thread_t t) @@ -754,6 +766,11 @@ void xbt_os_thread_setstacksize(int size) stack_size = size; } +void xbt_os_thread_setguardsize(int size) +{ + XBT_WARN("xbt_os_thread_setguardsize is not implemented (%d)", size); +} + const char *xbt_os_thread_name(xbt_os_thread_t t) { return t->name; diff --git a/teshsuite/msg/CMakeLists.txt b/teshsuite/msg/CMakeLists.txt index 065b8f68f1..670d9dcf5c 100644 --- a/teshsuite/msg/CMakeLists.txt +++ b/teshsuite/msg/CMakeLists.txt @@ -4,34 +4,52 @@ set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}") add_executable(get_sender ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/get_sender.c) add_executable(pid ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/pid.c) +add_executable(host_on_off ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/host_on_off.c) +add_executable(task_destroy_cancel ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/task_destroy_cancel.c) +add_executable(process ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/process.c) + ### Add definitions for compile +target_link_libraries(get_sender simgrid) +target_link_libraries(host_on_off simgrid) +target_link_libraries(task_destroy_cancel simgrid) +target_link_libraries(process simgrid) if(NOT WIN32) - target_link_libraries(get_sender simgrid) target_link_libraries(pid simgrid m pthread) else() - target_link_libraries(get_sender simgrid) target_link_libraries(pid simgrid) endif() set(tesh_files ${tesh_files} ${CMAKE_CURRENT_SOURCE_DIR}/get_sender.tesh + ${CMAKE_CURRENT_SOURCE_DIR}/host_on_off.tesh ${CMAKE_CURRENT_SOURCE_DIR}/pid.tesh + ${CMAKE_CURRENT_SOURCE_DIR}/process.tesh + ${CMAKE_CURRENT_SOURCE_DIR}/task_destroy_cancel.tesh PARENT_SCOPE ) set(xml_files ${xml_files} ${CMAKE_CURRENT_SOURCE_DIR}/get_sender_d.xml ${CMAKE_CURRENT_SOURCE_DIR}/get_sender_p.xml + ${CMAKE_CURRENT_SOURCE_DIR}/host_on_off_d.xml + ${CMAKE_CURRENT_SOURCE_DIR}/host_on_off_p.xml ${CMAKE_CURRENT_SOURCE_DIR}/pid_d.xml ${CMAKE_CURRENT_SOURCE_DIR}/pid_p.xml + ${CMAKE_CURRENT_SOURCE_DIR}/process_d.xml + ${CMAKE_CURRENT_SOURCE_DIR}/process_p.xml + ${CMAKE_CURRENT_SOURCE_DIR}/task_destroy_cancel_d.xml + ${CMAKE_CURRENT_SOURCE_DIR}/task_destroy_cancel_p.xml PARENT_SCOPE ) set(teshsuite_src ${teshsuite_src} ${CMAKE_CURRENT_SOURCE_DIR}/get_sender.c + ${CMAKE_CURRENT_SOURCE_DIR}/host_on_off.c ${CMAKE_CURRENT_SOURCE_DIR}/pid.c + ${CMAKE_CURRENT_SOURCE_DIR}/process.c + ${CMAKE_CURRENT_SOURCE_DIR}/task_destroy_cancel.c PARENT_SCOPE ) set(bin_files diff --git a/teshsuite/msg/host_on_off.c b/teshsuite/msg/host_on_off.c new file mode 100644 index 0000000000..3b42831c95 --- /dev/null +++ b/teshsuite/msg/host_on_off.c @@ -0,0 +1,132 @@ +/* Copyright (c) 2010-2014. The SimGrid Team. + * All rights reserved. */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ + +#include +#include "msg/msg.h" /* Yeah! If you want to use msg, you need to include msg/msg.h */ +#include "xbt/sysdep.h" /* calloc, printf */ + +/* Create a log channel to have nice outputs. */ +#include "xbt/log.h" +#include "xbt/asserts.h" +XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test, + "Messages specific for this msg example"); + +int master(int argc, char *argv[]); +int slave(int argc, char *argv[]); + +/** Emitter function */ +int master(int argc, char *argv[]) +{ + double task_comp_size = 5E7; + double task_comm_size = 1E6; + + char mailbox[256]; + msg_task_t task = NULL; + + sprintf(mailbox, "jupi"); + + task = MSG_task_create("task on", task_comp_size, task_comm_size, NULL); + XBT_INFO("Sending \"%s\"", task->name); + if (MSG_task_send_with_timeout(task, mailbox, 1) != MSG_OK) + MSG_task_destroy(task); + + MSG_process_sleep(1); + MSG_host_off(MSG_get_host_by_name("Jupiter")); + + task = MSG_task_create("task off", task_comp_size, task_comm_size, NULL); + XBT_INFO("Sending \"%s\"", task->name); + if (MSG_task_send_with_timeout(task, mailbox, 1) != MSG_OK) + MSG_task_destroy(task); + + MSG_host_on(MSG_get_host_by_name("Jupiter")); + + task = MSG_task_create("task on without proc", task_comp_size, task_comm_size, NULL); + XBT_INFO("Sending \"%s\"", task->name); + if (MSG_task_send_with_timeout(task, mailbox, 1) != MSG_OK) + MSG_task_destroy(task); + + char **argvF = xbt_new(char*, 2); + argvF[0] = xbt_strdup("slave"); + MSG_process_create_with_arguments("slave", slave, NULL, MSG_get_host_by_name("Jupiter"), 1, argvF); + + task = MSG_task_create("task on with proc", task_comp_size, task_comm_size, NULL); + XBT_INFO("Sending \"%s\"", task->name); + if (MSG_task_send_with_timeout(task, mailbox, 1) != MSG_OK) + MSG_task_destroy(task); + + task = MSG_task_create("finalize", 0, 0, 0); + XBT_INFO("Sending \"%s\"", task->name); + if (MSG_task_send_with_timeout(task, mailbox, 1) != MSG_OK) + MSG_task_destroy(task); + + XBT_INFO("Goodbye now!"); + return 0; +} /* end_of_master */ + +/** Receiver function */ +int slave(int argc, char *argv[]) +{ + msg_task_t task = NULL; + _XBT_GNUC_UNUSED int res; + int id = -1; + char mailbox[80]; + + sprintf(mailbox, "jupi"); + + while (1) { + res = MSG_task_receive(&(task), mailbox); + xbt_assert(res == MSG_OK, "MSG_task_get failed"); + + if (!strcmp(MSG_task_get_name(task), "finalize")) { + MSG_task_destroy(task); + break; + } + MSG_task_execute(task); + XBT_INFO("Task \"%s\" done", MSG_task_get_name(task)); + + MSG_task_destroy(task); + task = NULL; + id--; + } + XBT_INFO("I'm done. See you!"); + return 0; +} /* end_of_slave */ + +/** Main function */ +int main(int argc, char *argv[]) +{ + msg_error_t res; + const char *platform_file; + const char *application_file; + + MSG_init(&argc, argv); + if (argc != 3) { + printf("Usage: %s platform_file deployment_file\n", argv[0]); + printf("example: %s msg_platform.xml msg_deployment.xml\n", argv[0]); + exit(1); + } + platform_file = argv[1]; + application_file = argv[2]; + + /* MSG_config("workstation/model","KCCFLN05"); */ + { /* Simulation setting */ + MSG_create_environment(platform_file); + } + { /* Application deployment */ + MSG_function_register("master", master); + MSG_function_register("slave", slave); + + MSG_launch_application(application_file); + } + res = MSG_main(); + + XBT_INFO("Simulation time %g", MSG_get_clock()); + + if (res == MSG_OK) + return 0; + else + return 1; +} /* end_of_main */ diff --git a/teshsuite/msg/host_on_off.tesh b/teshsuite/msg/host_on_off.tesh new file mode 100644 index 0000000000..2e3e45664d --- /dev/null +++ b/teshsuite/msg/host_on_off.tesh @@ -0,0 +1,13 @@ + +$ msg/host_on_off ${srcdir:=.}/msg/host_on_off_p.xml ${srcdir:=.}/msg/host_on_off_d.xml +> [Tremblay:master:(1) 0.000000] [msg_test/INFO] Sending "task on" +> [Jupiter:slave:(2) 0.682345] [msg_test/INFO] Task "task on" done +> [Tremblay:master:(1) 1.027003] [msg_test/INFO] Sending "task off" +> [Tremblay:master:(1) 2.027003] [msg_test/INFO] Sending "task on without proc" +> [Tremblay:master:(1) 3.027003] [msg_test/INFO] Sending "task on with proc" +> [Tremblay:master:(1) 3.054005] [msg_test/INFO] Sending "finalize" +> [Jupiter:slave:(3) 3.709348] [msg_test/INFO] Task "task on with proc" done +> [Tremblay:master:(1) 3.710127] [msg_test/INFO] Goodbye now! +> [Jupiter:slave:(3) 3.710127] [msg_test/INFO] I'm done. See you! +> [3.710127] [msg_test/INFO] Simulation time 3.71013 + diff --git a/teshsuite/msg/host_on_off_d.xml b/teshsuite/msg/host_on_off_d.xml new file mode 100644 index 0000000000..5c8fc7fa6a --- /dev/null +++ b/teshsuite/msg/host_on_off_d.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/teshsuite/msg/host_on_off_p.xml b/teshsuite/msg/host_on_off_p.xml new file mode 100644 index 0000000000..1947841342 --- /dev/null +++ b/teshsuite/msg/host_on_off_p.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/teshsuite/msg/process.c b/teshsuite/msg/process.c new file mode 100644 index 0000000000..e999b4bed0 --- /dev/null +++ b/teshsuite/msg/process.c @@ -0,0 +1,107 @@ +/* Copyright (c) 2010-2014. The SimGrid Team. + * All rights reserved. */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ + +#include +#include "msg/msg.h" /* Yeah! If you want to use msg, you need to include msg/msg.h */ +#include "xbt/sysdep.h" /* calloc, printf */ + +/* Create a log channel to have nice outputs. */ +#include "xbt/log.h" +#include "xbt/asserts.h" +XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test, + "Messages specific for this msg example"); + +int master(int argc, char *argv[]); +int slave(int argc, char *argv[]); + +/** Emitter function */ +int master(int argc, char *argv[]) +{ + xbt_swag_t process_list = MSG_host_get_process_list(MSG_host_self()); + msg_process_t process = NULL; + MSG_process_sleep(1); + xbt_swag_foreach(process, process_list) { + XBT_INFO("Process(pid=%d, ppid=%d, name=%s)", + MSG_process_get_PID(process), MSG_process_get_PPID(process), + MSG_process_get_name(process)); + if (MSG_process_self_PID() != MSG_process_get_PID(process)) + MSG_process_kill(process); + } + process = MSG_process_create("slave from master", + slave, NULL, MSG_host_self()); + MSG_process_sleep(2); + + XBT_INFO("Suspend Process(pid=%d)", MSG_process_get_PID(process)); + MSG_process_suspend(process); + + XBT_INFO("Process(pid=%d) is %ssuspended", + MSG_process_get_PID(process), + (MSG_process_is_suspended(process)) ? "" : "not "); + MSG_process_sleep(2); + + XBT_INFO("Resume Process(pid=%d)", MSG_process_get_PID(process)); + MSG_process_resume(process); + + XBT_INFO("Process(pid=%d) is %ssuspended", + MSG_process_get_PID(process), + (MSG_process_is_suspended(process)) ? "" : "not "); + MSG_process_sleep(2); + MSG_process_kill(process); + + XBT_INFO("Goodbye now!"); + return 0; +} /* end_of_master */ + +/** Receiver function */ +int slave(int argc, char *argv[]) +{ + MSG_process_sleep(.5); + XBT_INFO("Slave started (PID:%d, PPID:%d)", + MSG_process_self_PID(), MSG_process_self_PPID()); + while(1){ + XBT_INFO("Plop i am %ssuspended", + (MSG_process_is_suspended(MSG_process_self())) ? "" : "not "); + MSG_process_sleep(1); + } + XBT_INFO("I'm done. See you!"); + return 0; +} /* end_of_slave */ + +/** Main function */ +int main(int argc, char *argv[]) +{ + msg_error_t res; + const char *platform_file; + const char *application_file; + + MSG_init(&argc, argv); + if (argc != 3) { + printf("Usage: %s platform_file deployment_file\n", argv[0]); + printf("example: %s msg_platform.xml msg_deployment.xml\n", argv[0]); + exit(1); + } + platform_file = argv[1]; + application_file = argv[2]; + + /* MSG_config("workstation/model","KCCFLN05"); */ + { /* Simulation setting */ + MSG_create_environment(platform_file); + } + { /* Application deployment */ + MSG_function_register("master", master); + MSG_function_register("slave", slave); + + MSG_launch_application(application_file); + } + res = MSG_main(); + + XBT_INFO("Simulation time %g", MSG_get_clock()); + + if (res == MSG_OK) + return 0; + else + return 1; +} /* end_of_main */ diff --git a/teshsuite/msg/process.tesh b/teshsuite/msg/process.tesh new file mode 100644 index 0000000000..728b65c56f --- /dev/null +++ b/teshsuite/msg/process.tesh @@ -0,0 +1,17 @@ + +$ msg/process ${srcdir:=.}/msg/process_p.xml ${srcdir:=.}/msg/process_d.xml +> [Tremblay:slave:(2) 0.500000] [msg_test/INFO] Slave started (PID:2, PPID:0) +> [Tremblay:slave:(2) 0.500000] [msg_test/INFO] Plop i am not suspended +> [Tremblay:master:(1) 1.000000] [msg_test/INFO] Process(pid=1, ppid=0, name=master) +> [Tremblay:master:(1) 1.000000] [msg_test/INFO] Process(pid=2, ppid=0, name=slave) +> [Tremblay:slave from master:(3) 1.500000] [msg_test/INFO] Slave started (PID:3, PPID:1) +> [Tremblay:slave from master:(3) 1.500000] [msg_test/INFO] Plop i am not suspended +> [Tremblay:slave from master:(3) 2.500000] [msg_test/INFO] Plop i am not suspended +> [Tremblay:master:(1) 3.000000] [msg_test/INFO] Suspend Process(pid=3) +> [Tremblay:master:(1) 3.000000] [msg_test/INFO] Process(pid=3) is suspended +> [Tremblay:master:(1) 5.000000] [msg_test/INFO] Resume Process(pid=3) +> [Tremblay:master:(1) 5.000000] [msg_test/INFO] Process(pid=3) is not suspended +> [Tremblay:slave from master:(3) 5.000000] [msg_test/INFO] Plop i am not suspended +> [Tremblay:slave from master:(3) 6.000000] [msg_test/INFO] Plop i am not suspended +> [Tremblay:master:(1) 7.000000] [msg_test/INFO] Goodbye now! +> [7.000000] [msg_test/INFO] Simulation time 7 diff --git a/teshsuite/msg/process_d.xml b/teshsuite/msg/process_d.xml new file mode 100644 index 0000000000..ee058c5ecf --- /dev/null +++ b/teshsuite/msg/process_d.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/teshsuite/msg/process_p.xml b/teshsuite/msg/process_p.xml new file mode 100644 index 0000000000..90e976acee --- /dev/null +++ b/teshsuite/msg/process_p.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/teshsuite/msg/storage/platform.xml b/teshsuite/msg/storage/platform.xml index 18382b2160..aa6b27110e 100644 --- a/teshsuite/msg/storage/platform.xml +++ b/teshsuite/msg/storage/platform.xml @@ -24,13 +24,13 @@ - + - + - + diff --git a/teshsuite/msg/storage/storage_basic.c b/teshsuite/msg/storage/storage_basic.c index c386966d46..38e07ee6a1 100644 --- a/teshsuite/msg/storage/storage_basic.c +++ b/teshsuite/msg/storage/storage_basic.c @@ -12,7 +12,7 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(storage,"Messages specific for this simulation"); void storage_info(msg_host_t host); void display_storage_properties(msg_storage_t storage); int hsm_put(const char *remote_host, const char *src, const char *dest); -sg_size_t write_local_file(char *dest, sg_size_t file_size); +sg_size_t write_local_file(const char *dest, sg_size_t file_size); sg_size_t read_local_file(const char *src); void dump_storage_by_name(char *name); void display_storage_content(msg_storage_t storage); @@ -30,7 +30,7 @@ void storage_info(msg_host_t host) char* storage_name; msg_storage_t storage; - xbt_dict_t storage_list = MSG_host_get_storage_list(MSG_host_self()); + xbt_dict_t storage_list = MSG_host_get_mounted_storage_list(MSG_host_self()); xbt_dict_foreach(storage_list,cursor,mount_name,storage_name) { @@ -76,10 +76,10 @@ int hsm_put(const char *remote_host, const char *src, const char *dest){ return 1; } -sg_size_t write_local_file(char *dest, sg_size_t file_size) +sg_size_t write_local_file(const char *dest, sg_size_t file_size) { sg_size_t written; - msg_file_t file = MSG_file_open("/sd1",dest, NULL); + msg_file_t file = MSG_file_open(dest, NULL); written = MSG_file_write(file, file_size); XBT_INFO("%llu bytes on %llu bytes have been written by %s on /sd1",written, file_size, MSG_host_get_name(MSG_host_self())); MSG_file_close(file); @@ -89,7 +89,7 @@ sg_size_t write_local_file(char *dest, sg_size_t file_size) sg_size_t read_local_file(const char *src) { sg_size_t read, file_size; - msg_file_t file = MSG_file_open("/sd1",src, NULL); + msg_file_t file = MSG_file_open(src, NULL); file_size = MSG_file_get_size(file); read = MSG_file_read(file, file_size); @@ -132,16 +132,17 @@ void get_set_storage_data(const char *storage_name){ char *data = MSG_storage_get_data(storage); XBT_INFO("Get data: '%s'", data); - MSG_storage_set_data(storage,strdup("Some data")); + MSG_storage_set_data(storage, xbt_strdup("Some data")); data = MSG_storage_get_data(storage); XBT_INFO("\tSet and get data: '%s'", data); + xbt_free(data); } int client(int argc, char *argv[]) { - hsm_put("server","./doc/simgrid/examples/cxx/autoDestination/FinalizeTask.cxx","./scratch/toto.cxx"); - hsm_put("server","./doc/simgrid/examples/cxx/autoDestination/autoDestination_deployment.xml","./scratch/titi.xml"); - hsm_put("server","./doc/simgrid/examples/cxx/autoDestination/Slave.cxx","./scratch/tata.cxx"); + hsm_put("server","/sd1/doc/simgrid/examples/cxx/autoDestination/FinalizeTask.cxx","/sd2/scratch/toto.cxx"); + hsm_put("server","/sd1/doc/simgrid/examples/cxx/autoDestination/autoDestination_deployment.xml","/sd2/scratch/titi.xml"); + hsm_put("server","/sd1/doc/simgrid/examples/cxx/autoDestination/Slave.cxx","/sd2/scratch/tata.cxx"); msg_task_t finalize = MSG_task_create("finalize", 0, 0, NULL); MSG_task_send(finalize, "server"); diff --git a/teshsuite/msg/storage/storage_basic.tesh b/teshsuite/msg/storage/storage_basic.tesh index 210727f10b..3c3c5a6120 100644 --- a/teshsuite/msg/storage/storage_basic.tesh +++ b/teshsuite/msg/storage/storage_basic.tesh @@ -7,10 +7,10 @@ $ msg/storage/storage_basic --cfg=path:${srcdir:=.} ${srcdir:=.}/msg/storage/pla > [ 0.000000] (1:server@server) 'usage' -> 'File system' > [ 0.000000] (1:server@server) *** Dump a storage element *** > [ 0.000000] (1:server@server) Print the content of the storage element: sdisk1 -> [ 0.000000] (1:server@server) ./doc/simgrid/examples/cxx/autoDestination/autoDestination_platform.xml size: 10 bytes -> [ 0.000000] (1:server@server) ./doc/simgrid/examples/cxx/autoDestination/Forwarder.cxx size: 10 bytes -> [ 0.000000] (1:server@server) ./doc/simgrid/examples/cxx/autoDestination/Master.cxx size: 10 bytes -> [ 0.000000] (1:server@server) ./doc/simgrid/examples/cxx/basic/FinalizeTask.cxx size: 10 bytes +> [ 0.000000] (1:server@server) /doc/simgrid/examples/cxx/autoDestination/Master.cxx size: 10 bytes +> [ 0.000000] (1:server@server) /doc/simgrid/examples/cxx/basic/FinalizeTask.cxx size: 10 bytes +> [ 0.000000] (1:server@server) /doc/simgrid/examples/cxx/autoDestination/Forwarder.cxx size: 10 bytes +> [ 0.000000] (1:server@server) /doc/simgrid/examples/cxx/autoDestination/autoDestination_platform.xml size: 10 bytes > [ 0.000000] (1:server@server) Storage name: sdisk2, mount name: /sd2 > [ 0.000000] (1:server@server) Free size: 805306367980 bytes > [ 0.000000] (1:server@server) Used size: 20 bytes @@ -18,16 +18,16 @@ $ msg/storage/storage_basic --cfg=path:${srcdir:=.} ${srcdir:=.}/msg/storage/pla > [ 0.000000] (1:server@server) 'usage' -> 'Cache' > [ 0.000000] (1:server@server) *** Dump a storage element *** > [ 0.000000] (1:server@server) Print the content of the storage element: sdisk2 -> [ 0.000000] (1:server@server) ./doc/simgrid/examples/cxx/basic/Slave.cxx size: 10 bytes -> [ 0.000000] (1:server@server) ./doc/simgrid/examples/cxx/basic/Main.cxx size: 10 bytes +> [ 0.000000] (1:server@server) /doc/simgrid/examples/cxx/basic/Main.cxx size: 10 bytes +> [ 0.000000] (1:server@server) /doc/simgrid/examples/cxx/basic/Slave.cxx size: 10 bytes > [ 0.000000] (1:server@server) Server waiting for transfers ... -> [ 0.005000] (2:client@client) client has read 500001 on ./doc/simgrid/examples/cxx/autoDestination/FinalizeTask.cxx +> [ 0.005000] (2:client@client) client has read 500001 on /sd1/doc/simgrid/examples/cxx/autoDestination/FinalizeTask.cxx > [ 0.005000] (2:client@client) client sends 500001 to server > [ 0.026647] (1:server@server) 500001 bytes on 500001 bytes have been written by server on /sd1 -> [ 0.417980] (2:client@client) client has read 800000 on ./doc/simgrid/examples/cxx/autoDestination/autoDestination_deployment.xml +> [ 0.417980] (2:client@client) client has read 800000 on /sd1/doc/simgrid/examples/cxx/autoDestination/autoDestination_deployment.xml > [ 0.417980] (2:client@client) client sends 800000 to server > [ 0.452225] (1:server@server) 800000 bytes on 800000 bytes have been written by server on /sd1 -> [ 1.283559] (2:client@client) client has read 45800000 on ./doc/simgrid/examples/cxx/autoDestination/Slave.cxx +> [ 1.283559] (2:client@client) client has read 45800000 on /sd1/doc/simgrid/examples/cxx/autoDestination/Slave.cxx > [ 1.283559] (2:client@client) client sends 45800000 to server > [ 3.207494] (1:server@server) 45800000 bytes on 45800000 bytes have been written by server on /sd1 > [ 3.208145] (2:client@client) *** GET/SET DATA for storage element: cdisk *** @@ -35,27 +35,26 @@ $ msg/storage/storage_basic --cfg=path:${srcdir:=.} ${srcdir:=.}/msg/storage/pla > [ 3.208145] (2:client@client) Set and get data: 'Some data' > [ 3.208145] (1:server@server) *** Storage info on server *** > [ 3.208145] (1:server@server) Storage name: sdisk1, mount name: /sd1 -> [ 3.208145] (1:server@server) Free size: 322075447159 bytes -> [ 3.208145] (1:server@server) Used size: 47100041 bytes +> [ 3.208145] (1:server@server) Free size: 322122547160 bytes +> [ 3.208145] (1:server@server) Used size: 40 bytes > [ 3.208145] (1:server@server) Properties of mounted storage: sdisk1 > [ 3.208145] (1:server@server) 'usage' -> 'File system' > [ 3.208145] (1:server@server) *** Dump a storage element *** > [ 3.208145] (1:server@server) Print the content of the storage element: sdisk1 -> [ 3.208145] (1:server@server) ./scratch/titi.xml size: 800000 bytes -> [ 3.208145] (1:server@server) ./doc/simgrid/examples/cxx/autoDestination/autoDestination_platform.xml size: 10 bytes -> [ 3.208145] (1:server@server) ./scratch/tata.cxx size: 45800000 bytes -> [ 3.208145] (1:server@server) ./doc/simgrid/examples/cxx/autoDestination/Forwarder.cxx size: 10 bytes -> [ 3.208145] (1:server@server) ./scratch/toto.cxx size: 500001 bytes -> [ 3.208145] (1:server@server) ./doc/simgrid/examples/cxx/autoDestination/Master.cxx size: 10 bytes -> [ 3.208145] (1:server@server) ./doc/simgrid/examples/cxx/basic/FinalizeTask.cxx size: 10 bytes +> [ 3.208145] (1:server@server) /doc/simgrid/examples/cxx/autoDestination/Master.cxx size: 10 bytes +> [ 3.208145] (1:server@server) /doc/simgrid/examples/cxx/basic/FinalizeTask.cxx size: 10 bytes +> [ 3.208145] (1:server@server) /doc/simgrid/examples/cxx/autoDestination/Forwarder.cxx size: 10 bytes +> [ 3.208145] (1:server@server) /doc/simgrid/examples/cxx/autoDestination/autoDestination_platform.xml size: 10 bytes > [ 3.208145] (1:server@server) Storage name: sdisk2, mount name: /sd2 -> [ 3.208145] (1:server@server) Free size: 805306367980 bytes -> [ 3.208145] (1:server@server) Used size: 20 bytes +> [ 3.208145] (1:server@server) Free size: 805259267979 bytes +> [ 3.208145] (1:server@server) Used size: 47100021 bytes > [ 3.208145] (1:server@server) Properties of mounted storage: sdisk2 > [ 3.208145] (1:server@server) 'usage' -> 'Cache' > [ 3.208145] (1:server@server) *** Dump a storage element *** > [ 3.208145] (1:server@server) Print the content of the storage element: sdisk2 -> [ 3.208145] (1:server@server) ./doc/simgrid/examples/cxx/basic/Slave.cxx size: 10 bytes -> [ 3.208145] (1:server@server) ./doc/simgrid/examples/cxx/basic/Main.cxx size: 10 bytes +> [ 3.208145] (1:server@server) /scratch/titi.xml size: 800000 bytes +> [ 3.208145] (1:server@server) /scratch/tata.cxx size: 45800000 bytes +> [ 3.208145] (1:server@server) /doc/simgrid/examples/cxx/basic/Main.cxx size: 10 bytes +> [ 3.208145] (1:server@server) /scratch/toto.cxx size: 500001 bytes +> [ 3.208145] (1:server@server) /doc/simgrid/examples/cxx/basic/Slave.cxx size: 10 bytes > [ 3.208145] (0:@) Simulated time: 3.20814 - diff --git a/teshsuite/msg/storage/storage_content_c.txt b/teshsuite/msg/storage/storage_content_c.txt index 1c5713fc83..e495e7e3c4 100644 --- a/teshsuite/msg/storage/storage_content_c.txt +++ b/teshsuite/msg/storage/storage_content_c.txt @@ -1,5 +1,5 @@ -./doc/simgrid/examples/cxx/autoDestination/FinalizeTask.cxx 500001 -./doc/simgrid/examples/cxx/autoDestination/autoDestination_deployment.xml 800000 -./doc/simgrid/examples/cxx/autoDestination/Main.cxx 75000000 -./doc/simgrid/examples/cxx/autoDestination/Slave.cxx 45800000 -./doc/simgrid/examples/cxx/autoDestination/BasicTask.cxx 400000 +/doc/simgrid/examples/cxx/autoDestination/FinalizeTask.cxx 500001 +/doc/simgrid/examples/cxx/autoDestination/autoDestination_deployment.xml 800000 +/doc/simgrid/examples/cxx/autoDestination/Main.cxx 75000000 +/doc/simgrid/examples/cxx/autoDestination/Slave.cxx 45800000 +/doc/simgrid/examples/cxx/autoDestination/BasicTask.cxx 400000 diff --git a/teshsuite/msg/storage/storage_content_s1.txt b/teshsuite/msg/storage/storage_content_s1.txt index 34cb554c7c..f2adbfbd6c 100644 --- a/teshsuite/msg/storage/storage_content_s1.txt +++ b/teshsuite/msg/storage/storage_content_s1.txt @@ -1,4 +1,4 @@ -./doc/simgrid/examples/cxx/autoDestination/Master.cxx 10 -./doc/simgrid/examples/cxx/autoDestination/autoDestination_platform.xml 10 -./doc/simgrid/examples/cxx/autoDestination/Forwarder.cxx 10 -./doc/simgrid/examples/cxx/basic/FinalizeTask.cxx 10 +/doc/simgrid/examples/cxx/autoDestination/Master.cxx 10 +/doc/simgrid/examples/cxx/autoDestination/autoDestination_platform.xml 10 +/doc/simgrid/examples/cxx/autoDestination/Forwarder.cxx 10 +/doc/simgrid/examples/cxx/basic/FinalizeTask.cxx 10 diff --git a/teshsuite/msg/storage/storage_content_s2.txt b/teshsuite/msg/storage/storage_content_s2.txt index 06ed884aa8..e1497a00b3 100644 --- a/teshsuite/msg/storage/storage_content_s2.txt +++ b/teshsuite/msg/storage/storage_content_s2.txt @@ -1,2 +1,2 @@ -./doc/simgrid/examples/cxx/basic/Main.cxx 10 -./doc/simgrid/examples/cxx/basic/Slave.cxx 10 \ No newline at end of file +/doc/simgrid/examples/cxx/basic/Main.cxx 10 +/doc/simgrid/examples/cxx/basic/Slave.cxx 10 \ No newline at end of file diff --git a/teshsuite/msg/task_destroy_cancel.c b/teshsuite/msg/task_destroy_cancel.c new file mode 100644 index 0000000000..6dda8b5a96 --- /dev/null +++ b/teshsuite/msg/task_destroy_cancel.c @@ -0,0 +1,172 @@ +/* Copyright (c) 2010-2014. The SimGrid Team. + * All rights reserved. */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ + +#include +#include "msg/msg.h" /* Yeah! If you want to use msg, you need to include msg/msg.h */ +#include "xbt/sysdep.h" /* calloc, printf */ + +/* Create a log channel to have nice outputs. */ +#include "xbt/log.h" +#include "xbt/asserts.h" +XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test, + "Messages specific for this msg example"); + +int master(int argc, char *argv[]); +int slave(int argc, char *argv[]); + +/** Emitter function */ +int master(int argc, char *argv[]) +{ + double task_comp_size = 5E7; + double task_comm_size = 1E6; + double timeout = 1; + + char mailbox[256]; + msg_task_t task = NULL; + msg_comm_t comm = NULL; + xbt_ex_t ex; + + sprintf(mailbox, "jupi"); + + task = MSG_task_create("normal", task_comp_size, task_comm_size, NULL); + XBT_INFO("Sending task: \"%s\"", task->name); + MSG_task_send_with_timeout(task, mailbox, timeout); + + task = MSG_task_create("cancel directly", task_comp_size, task_comm_size, NULL); + XBT_INFO("Canceling task \"%s\" directly", task->name); + MSG_task_cancel(task); + MSG_task_destroy(task); + + task = MSG_task_create("destroy directly", task_comp_size, task_comm_size, NULL); + XBT_INFO("Destroying task \"%s\" directly", task->name); + MSG_task_destroy(task); + + task = MSG_task_create("cancel", task_comp_size, task_comm_size, NULL); + comm = MSG_task_isend(task, mailbox); + XBT_INFO("Canceling task \"%s\" during comm", task->name); + MSG_task_cancel(task); + TRY { + MSG_comm_wait(comm, -1); + } + CATCH (ex) { + xbt_ex_free(ex); + MSG_comm_destroy(comm); + } + MSG_task_destroy(task); + + task = MSG_task_create("finalize", task_comp_size, task_comm_size, NULL); + comm = MSG_task_isend(task, mailbox); + XBT_INFO("Destroying task \"%s\" during comm", task->name); + MSG_task_destroy(task); + TRY { + MSG_comm_wait(comm, -1); + } + CATCH (ex) { + xbt_ex_free(ex); + MSG_comm_destroy(comm); + } + + task = MSG_task_create("cancel", task_comp_size, task_comm_size, NULL); + MSG_task_send_with_timeout(task, mailbox, timeout); + + task = MSG_task_create("finalize", task_comp_size, task_comm_size, NULL); + MSG_task_send_with_timeout(task, mailbox, timeout); + + XBT_INFO("Goodbye now!"); + return 0; +} /* end_of_master */ + +static int worker_main(int argc, char *argv[]) +{ + msg_task_t task = MSG_process_get_data(MSG_process_self()); + msg_error_t res; + XBT_INFO("Start %s", task->name); + res = MSG_task_execute(task); + XBT_INFO("Task %s", res == MSG_OK ? "done" : "failed"); + MSG_task_destroy(task); + return 0; +} + +/** Receiver function */ +int slave(int argc, char *argv[]) +{ + msg_task_t task; + _XBT_GNUC_UNUSED int res; + int id = -1; + char mailbox[80]; + double start, end; + sprintf(mailbox, "jupi"); + + while (1) { + task = NULL; + res = MSG_task_receive(&(task), mailbox); + xbt_assert(res == MSG_OK, "MSG_task_get failed"); + XBT_INFO("Handling task \"%s\"", MSG_task_get_name(task)); + + if (!strcmp(MSG_task_get_name(task), "finalize")) { + XBT_INFO("Destroying task \"%s\"", task->name); + MSG_task_destroy(task); + break; + } + + if (!strcmp(MSG_task_get_name(task), "cancel")) { + MSG_process_create("worker1", worker_main, task, MSG_host_self()); + XBT_INFO("Canceling task \"%s\"", task->name); + MSG_task_cancel(task); + continue; + } + + start = MSG_get_clock(); + MSG_task_execute(task); + end = MSG_get_clock(); + XBT_INFO("Task \"%s\" done in %f (amount %f)" + , MSG_task_get_name(task) + , end - start + , MSG_task_get_remaining_computation(task)); + + MSG_task_destroy(task); + task = NULL; + id--; + } + XBT_INFO("I'm done. See you!"); + return 0; +} /* end_of_slave */ + +/** Main function */ +int main(int argc, char *argv[]) +{ + msg_error_t res; + const char *platform_file; + const char *application_file; + + MSG_init(&argc, argv); + if (argc != 3) { + printf("Usage: %s platform_file deployment_file\n", argv[0]); + printf("example: %s msg_platform.xml msg_deployment.xml\n", argv[0]); + exit(1); + } + platform_file = argv[1]; + application_file = argv[2]; + + /* MSG_config("workstation/model","KCCFLN05"); */ + { /* Simulation setting */ + MSG_create_environment(platform_file); + } + { /* Application deployment */ + MSG_function_register("master", master); + MSG_function_register("slave", slave); + + MSG_launch_application(application_file); + } + res = MSG_main(); + + XBT_INFO("Simulation time %g", MSG_get_clock()); + + if (res == MSG_OK) + return 0; + else + return 1; +} /* end_of_main */ diff --git a/teshsuite/msg/task_destroy_cancel.tesh b/teshsuite/msg/task_destroy_cancel.tesh new file mode 100644 index 0000000000..d125183c36 --- /dev/null +++ b/teshsuite/msg/task_destroy_cancel.tesh @@ -0,0 +1,18 @@ + +$ msg/task_destroy_cancel ${srcdir:=.}/msg/task_destroy_cancel_p.xml ${srcdir:=.}/msg/task_destroy_cancel_d.xml +> [Tremblay:master:(1) 0.000000] [msg_test/INFO] Sending task: "normal" +> [Jupiter:slave:(2) 0.027003] [msg_test/INFO] Handling task "normal" +> [Tremblay:master:(1) 0.027003] [msg_test/INFO] Canceling task "cancel directly" directly +> [Tremblay:master:(1) 0.027003] [msg_test/INFO] Destroying task "destroy directly" directly +> [Tremblay:master:(1) 0.027003] [msg_test/INFO] Canceling task "cancel" during comm +> [Tremblay:master:(1) 0.027003] [msg_test/INFO] Destroying task "finalize" during comm +> [Jupiter:slave:(2) 0.682345] [msg_test/INFO] Task "normal" done in 0.655342 (amount 0.000000) +> [Jupiter:slave:(2) 0.709348] [msg_test/INFO] Handling task "cancel" +> [Jupiter:worker1:(3) 0.709348] [msg_test/INFO] Start cancel +> [Jupiter:slave:(2) 0.709348] [msg_test/INFO] Canceling task "cancel" +> [Jupiter:worker1:(3) 0.710127] [msg_test/INFO] Task failed +> [Tremblay:master:(1) 0.736350] [msg_test/INFO] Goodbye now! +> [Jupiter:slave:(2) 0.736350] [msg_test/INFO] Handling task "finalize" +> [Jupiter:slave:(2) 0.736350] [msg_test/INFO] Destroying task "finalize" +> [Jupiter:slave:(2) 0.736350] [msg_test/INFO] I'm done. See you! +> [0.736350] [msg_test/INFO] Simulation time 0.73635 diff --git a/teshsuite/msg/task_destroy_cancel_d.xml b/teshsuite/msg/task_destroy_cancel_d.xml new file mode 100644 index 0000000000..5c8fc7fa6a --- /dev/null +++ b/teshsuite/msg/task_destroy_cancel_d.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/teshsuite/msg/task_destroy_cancel_p.xml b/teshsuite/msg/task_destroy_cancel_p.xml new file mode 100644 index 0000000000..1947841342 --- /dev/null +++ b/teshsuite/msg/task_destroy_cancel_p.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/teshsuite/simdag/platforms/CMakeLists.txt b/teshsuite/simdag/platforms/CMakeLists.txt index 2db733ee87..5fe5c14a33 100644 --- a/teshsuite/simdag/platforms/CMakeLists.txt +++ b/teshsuite/simdag/platforms/CMakeLists.txt @@ -36,7 +36,9 @@ set(tesh_files ${CMAKE_CURRENT_SOURCE_DIR}/basic_link_test.tesh ${CMAKE_CURRENT_SOURCE_DIR}/flatifier.tesh ${CMAKE_CURRENT_SOURCE_DIR}/get_full_link.tesh - ${CMAKE_CURRENT_SOURCE_DIR}/two_hosts_asymetric.tesh + ${CMAKE_CURRENT_SOURCE_DIR}/bogus_two_hosts_asymetric.tesh + ${CMAKE_CURRENT_SOURCE_DIR}/bogus_missing_gateway.tesh + ${CMAKE_CURRENT_SOURCE_DIR}/bogus_disk_attachment.tesh PARENT_SCOPE ) set(xml_files @@ -77,14 +79,17 @@ set(xml_files ${CMAKE_CURRENT_SOURCE_DIR}/two_clusters_router_id.xml ${CMAKE_CURRENT_SOURCE_DIR}/two_clusters_symmetric.xml ${CMAKE_CURRENT_SOURCE_DIR}/two_clusters.xml - ${CMAKE_CURRENT_SOURCE_DIR}/two_hosts_asymetric_BOGUS2.xml - ${CMAKE_CURRENT_SOURCE_DIR}/two_hosts_asymetric_BOGUS.xml + ${CMAKE_CURRENT_SOURCE_DIR}/bogus_missing_src_gateway.xml + ${CMAKE_CURRENT_SOURCE_DIR}/bogus_missing_dst_gateway.xml + ${CMAKE_CURRENT_SOURCE_DIR}/bogus_two_hosts_asymetric.xml + ${CMAKE_CURRENT_SOURCE_DIR}/bogus_two_hosts_asymetric-2.xml ${CMAKE_CURRENT_SOURCE_DIR}/two_hosts_one_link_fullduplex.xml ${CMAKE_CURRENT_SOURCE_DIR}/two_hosts_one_link_symmetrical.xml ${CMAKE_CURRENT_SOURCE_DIR}/two_hosts_one_link.xml ${CMAKE_CURRENT_SOURCE_DIR}/clusterA.xml ${CMAKE_CURRENT_SOURCE_DIR}/clusterB.xml ${CMAKE_CURRENT_SOURCE_DIR}/Dijkstra.xml + ${CMAKE_CURRENT_SOURCE_DIR}/bogus_disk_attachment.xml PARENT_SCOPE ) set(teshsuite_src diff --git a/teshsuite/simdag/platforms/basic_parsing_test.c b/teshsuite/simdag/platforms/basic_parsing_test.c index 245cd48ddc..f34e57f899 100644 --- a/teshsuite/simdag/platforms/basic_parsing_test.c +++ b/teshsuite/simdag/platforms/basic_parsing_test.c @@ -9,8 +9,6 @@ #include "simdag/simdag.h" #include "surf/surf_private.h" -extern routing_platf_t routing_platf; - int main(int argc, char **argv) { /* initialisation of SD */ diff --git a/teshsuite/simdag/platforms/bogus_disk_attachment.tesh b/teshsuite/simdag/platforms/bogus_disk_attachment.tesh new file mode 100644 index 0000000000..534cd7fcea --- /dev/null +++ b/teshsuite/simdag/platforms/bogus_disk_attachment.tesh @@ -0,0 +1,4 @@ +! expect signal SIGABRT +$ ${bindir:=.}/flatifier bogus_disk_attachment.xml "--log=root.fmt:[%10.6r]%e[%i:%P@%h]%e%m%n" +> [ 0.000000] [0:@] surf_workstation_model_init_ptask_L07 +> [ 0.000000] [0:@] Parse error at bogus_disk_attachment.xml:26: Enable to attach storage cdisk: host plouf doesn't exist. diff --git a/teshsuite/simdag/platforms/bogus_disk_attachment.xml b/teshsuite/simdag/platforms/bogus_disk_attachment.xml new file mode 100644 index 0000000000..c5ca5dc192 --- /dev/null +++ b/teshsuite/simdag/platforms/bogus_disk_attachment.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/teshsuite/simdag/platforms/bogus_missing_dst_gateway.xml b/teshsuite/simdag/platforms/bogus_missing_dst_gateway.xml new file mode 100644 index 0000000000..5ffbd2fa5c --- /dev/null +++ b/teshsuite/simdag/platforms/bogus_missing_dst_gateway.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/teshsuite/simdag/platforms/bogus_missing_gateway.tesh b/teshsuite/simdag/platforms/bogus_missing_gateway.tesh new file mode 100644 index 0000000000..f571ffa06c --- /dev/null +++ b/teshsuite/simdag/platforms/bogus_missing_gateway.tesh @@ -0,0 +1,9 @@ +! expect signal SIGABRT +$ ${bindir:=.}/flatifier bogus_missing_src_gateway.xml "--log=root.fmt:[%10.6r]%e[%i:%P@%h]%e%m%n" +> [ 0.000000] [0:@] surf_workstation_model_init_ptask_L07 +> [ 0.000000] [0:@] Parse error at bogus_missing_src_gateway.xml:16: gw_src="nod-cluster_router.cluster.us" not found for ASroute from "us" to "fr" + +! expect signal SIGABRT +$ ${bindir:=.}/flatifier bogus_missing_dst_gateway.xml "--log=root.fmt:[%10.6r]%e[%i:%P@%h]%e%m%n" +> [ 0.000000] [0:@] surf_workstation_model_init_ptask_L07 +> [ 0.000000] [0:@] Parse error at bogus_missing_dst_gateway.xml:16: gw_dst="neud-grappe_router.grappe.fr" not found for ASroute from "us" to "fr" diff --git a/teshsuite/simdag/platforms/bogus_missing_src_gateway.xml b/teshsuite/simdag/platforms/bogus_missing_src_gateway.xml new file mode 100644 index 0000000000..a97b589b55 --- /dev/null +++ b/teshsuite/simdag/platforms/bogus_missing_src_gateway.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/teshsuite/simdag/platforms/two_hosts_asymetric_BOGUS2.xml b/teshsuite/simdag/platforms/bogus_two_hosts_asymetric-2.xml similarity index 100% rename from teshsuite/simdag/platforms/two_hosts_asymetric_BOGUS2.xml rename to teshsuite/simdag/platforms/bogus_two_hosts_asymetric-2.xml diff --git a/teshsuite/simdag/platforms/bogus_two_hosts_asymetric.tesh b/teshsuite/simdag/platforms/bogus_two_hosts_asymetric.tesh new file mode 100644 index 0000000000..a18c41736a --- /dev/null +++ b/teshsuite/simdag/platforms/bogus_two_hosts_asymetric.tesh @@ -0,0 +1,9 @@ +! expect signal SIGABRT +$ ${bindir:=.}/flatifier bogus_two_hosts_asymetric.xml "--log=root.fmt:[%10.6r]%e[%i:%P@%h]%e%m%n" +> [ 0.000000] [0:@] surf_workstation_model_init_ptask_L07 +> [ 0.000000] [0:@] Parse error at bogus_two_hosts_asymetric.xml:24: A route between "alice" and "bob" already exists with a different content. If you are trying to define a reverse route, you must set the symmetrical=no attribute to your routes tags. + +! expect signal SIGABRT +$ ${bindir:=.}/flatifier bogus_two_hosts_asymetric-2.xml "--log=root.fmt:[%10.6r]%e[%i:%P@%h]%e%m%n" +> [ 0.000000] [0:@] surf_workstation_model_init_ptask_L07 +> [ 0.000000] [0:@] Parse error at bogus_two_hosts_asymetric-2.xml:26: A route between "alice" and "bob" already exists with a different content. If you are trying to define a reverse route, you must set the symmetrical=no attribute to your routes tags. diff --git a/teshsuite/simdag/platforms/two_hosts_asymetric_BOGUS.xml b/teshsuite/simdag/platforms/bogus_two_hosts_asymetric.xml similarity index 100% rename from teshsuite/simdag/platforms/two_hosts_asymetric_BOGUS.xml rename to teshsuite/simdag/platforms/bogus_two_hosts_asymetric.xml diff --git a/teshsuite/simdag/platforms/two_hosts_asymetric.tesh b/teshsuite/simdag/platforms/two_hosts_asymetric.tesh deleted file mode 100644 index 84cc3900db..0000000000 --- a/teshsuite/simdag/platforms/two_hosts_asymetric.tesh +++ /dev/null @@ -1,9 +0,0 @@ -! expect signal SIGABRT -$ ${bindir:=.}/flatifier two_hosts_asymetric_BOGUS.xml "--log=root.fmt:[%10.6r]%e[%i:%P@%h]%e%m%n" -> [ 0.000000] [0:@] surf_workstation_model_init_ptask_L07 -> [ 0.000000] [0:@] Parse error at two_hosts_asymetric_BOGUS.xml:24: A route between "alice" and "bob" already exists with a different content. If you are trying to define a reverse route, you must set the symmetrical=no attribute to your routes tags. - -! expect signal SIGABRT -$ ${bindir:=.}/flatifier two_hosts_asymetric_BOGUS2.xml "--log=root.fmt:[%10.6r]%e[%i:%P@%h]%e%m%n" -> [ 0.000000] [0:@] surf_workstation_model_init_ptask_L07 -> [ 0.000000] [0:@] Parse error at two_hosts_asymetric_BOGUS2.xml:26: A route between "alice" and "bob" already exists with a different content. If you are trying to define a reverse route, you must set the symmetrical=no attribute to your routes tags. diff --git a/teshsuite/simix/CMakeLists.txt b/teshsuite/simix/CMakeLists.txt index 4c789622b0..8a22a1af57 100644 --- a/teshsuite/simix/CMakeLists.txt +++ b/teshsuite/simix/CMakeLists.txt @@ -5,20 +5,26 @@ set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}") add_executable(check_defaults check_defaults.c) target_link_libraries(check_defaults simgrid) +add_executable(stack_overflow stack_overflow.c) +target_link_libraries(stack_overflow simgrid) + set(tesh_files ${tesh_files} ${CMAKE_CURRENT_SOURCE_DIR}/factory_raw.tesh ${CMAKE_CURRENT_SOURCE_DIR}/factory_thread.tesh ${CMAKE_CURRENT_SOURCE_DIR}/factory_ucontext.tesh + ${CMAKE_CURRENT_SOURCE_DIR}/stack_overflow.tesh PARENT_SCOPE ) set(xml_files ${xml_files} + ${CMAKE_CURRENT_SOURCE_DIR}/stack_overflow.xml PARENT_SCOPE ) set(teshsuite_src ${teshsuite_src} ${CMAKE_CURRENT_SOURCE_DIR}/check_defaults.c + ${CMAKE_CURRENT_SOURCE_DIR}/stack_overflow.c PARENT_SCOPE ) set(bin_files diff --git a/teshsuite/simix/stack_overflow.c b/teshsuite/simix/stack_overflow.c new file mode 100644 index 0000000000..0ae6ffadaa --- /dev/null +++ b/teshsuite/simix/stack_overflow.c @@ -0,0 +1,58 @@ +/* stack_overflow -- simple program generating a stack overflow */ + +/* Copyright (c) 2014. The SimGrid Team. + * All rights reserved. */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ + +#include "simgrid/platf.h" +#include "simgrid/simix.h" +#include "surf/surfxml_parse.h" +#include "xbt/log.h" + +XBT_LOG_NEW_DEFAULT_CATEGORY(test, "my log messages"); + +static unsigned collatz(unsigned c0, unsigned n) +{ + unsigned x; + if (n == 0) { + x = c0; + } else { + x = collatz(c0, n - 1); + if (x % 2 == 0) + x = x / 2; + else + x = 3 * x + 1; + } + return x; +} + +static int master(int argc, char *argv[]) +{ + XBT_INFO("Launching our nice bugged recursive function..."); + unsigned i = 1; + do { + i *= 2; + unsigned res = collatz(i, i); + XBT_VERB("collatz(%u, %u) returned %u", i, i, res); + } while (i <= 0x80000000u); + return 0; +} + +int main(int argc, char *argv[]) +{ + SIMIX_global_init(&argc, argv); + + if (argc != 2) { + printf("Usage: %s platform_and_deployment.xml\n", argv[0]); + exit(EXIT_FAILURE); + } + + SIMIX_function_register("master", master); + SIMIX_create_environment(argv[1]); + SIMIX_launch_application(argv[1]); + SIMIX_run(); + + return 0; +} diff --git a/teshsuite/simix/stack_overflow.tesh b/teshsuite/simix/stack_overflow.tesh new file mode 100644 index 0000000000..2606c83a4b --- /dev/null +++ b/teshsuite/simix/stack_overflow.tesh @@ -0,0 +1,5 @@ +! expect signal SIGSEGV +$ ./simix/stack_overflow --cfg=contexts/stack_size:96 ${srcdir:=.}/simix/stack_overflow.xml +> [Tremblay:master:(0) 0.000000] [test/INFO] Launching our nice bugged recursive function... +> Access violation detected. This can result from a stack overflow. +> Try to increase stack size with --cfg=contexts/stack_size (current size is 96 KiB). diff --git a/teshsuite/simix/stack_overflow.xml b/teshsuite/simix/stack_overflow.xml new file mode 100644 index 0000000000..8ac632add2 --- /dev/null +++ b/teshsuite/simix/stack_overflow.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/teshsuite/smpi/allreduce_coll_large.tesh b/teshsuite/smpi/allreduce_coll_large.tesh index ec96371807..e13e40c43a 100644 --- a/teshsuite/smpi/allreduce_coll_large.tesh +++ b/teshsuite/smpi/allreduce_coll_large.tesh @@ -4,7 +4,7 @@ ! timeout 20 p Test allreduce -$ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ./allreduce_coll 300000 --log=smpi_kernel.thres:warning +$ ../../smpi_script/bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 16 --log=xbt_cfg.thres:critical ./allreduce_coll 30000 --log=smpi_kernel.thres:warning > You requested to use 16 processes, but there is only 5 processes in your hostfile... > [rank 0] -> Tremblay > [rank 1] -> Jupiter diff --git a/teshsuite/smpi/mpich3-test/f90/datatype/indtype.f90 b/teshsuite/smpi/mpich3-test/f90/datatype/indtype.f90 index 5367f998cc..123a6230e8 100644 --- a/teshsuite/smpi/mpich3-test/f90/datatype/indtype.f90 +++ b/teshsuite/smpi/mpich3-test/f90/datatype/indtype.f90 @@ -23,7 +23,7 @@ call mpi_comm_rank( MPI_COMM_WORLD, rank, ierr ) if (size .lt. 2) then print *, "Must have at least 2 processes" - call MPI_Abort( 1, MPI_COMM_WORLD, ierr ) + call MPI_Abort( MPI_COMM_WORLD, 1, ierr ) stop endif diff --git a/teshsuite/smpi/mpich3-test/f90/datatype/structf.f90 b/teshsuite/smpi/mpich3-test/f90/datatype/structf.f90 index 71e9735422..8227ef06cd 100644 --- a/teshsuite/smpi/mpich3-test/f90/datatype/structf.f90 +++ b/teshsuite/smpi/mpich3-test/f90/datatype/structf.f90 @@ -44,7 +44,7 @@ call mpi_comm_size(MPI_COMM_WORLD, size, ierr ) if (size .lt. 2) then print *, "Must have at least 2 processes" - call MPI_Abort( 1, MPI_COMM_WORLD, ierr ) + call MPI_Abort( MPI_COMM_WORLD, 1, ierr ) stop endif diff --git a/teshsuite/smpi/mpich3-test/topo/CMakeLists.txt b/teshsuite/smpi/mpich3-test/topo/CMakeLists.txt new file mode 100644 index 0000000000..6bc6b43270 --- /dev/null +++ b/teshsuite/smpi/mpich3-test/topo/CMakeLists.txt @@ -0,0 +1,87 @@ +cmake_minimum_required(VERSION 2.6) + +if(enable_smpi AND enable_smpi_MPICH3_testsuite) + if(WIN32) + set(CMAKE_C_FLAGS "-include ${CMAKE_HOME_DIRECTORY}/include/smpi/smpi_main.h") + else() + set(CMAKE_C_COMPILER "${CMAKE_BINARY_DIR}/smpi_script/bin/smpicc") + set(CMAKE_Fortran_COMPILER "${CMAKE_BINARY_DIR}/smpi_script/bin/smpiff") + endif() + + set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}") + include_directories("${CMAKE_HOME_DIRECTORY}/include/smpi") + include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../include/") + + +# add_executable(cartcreates cartcreates.c) +# add_executable(cartmap1 cartmap1.c) +# add_executable(cartshift1 cartshift1.c) +# add_executable(cartsuball cartsuball.c) +# add_executable(cartzero cartzero.c) +# add_executable(dgraph_unwgt dgraph_unwgt.c) +# add_executable(dims1 dims1.c) +# add_executable(dims2 dims2.c) +# add_executable(distgraph1 distgraph1.c) +# add_executable(graphcr2 graphcr2.c) +# add_executable(graphcr graphcr.c) +# add_executable(graphmap1 graphmap1.c) +# add_executable(neighb_coll neighb_coll.c) +# add_executable(topodup topodup.c) +# add_executable(topotest topotest.c) + + +# target_link_libraries(cartcreates simgrid mtest_c) +# target_link_libraries(cartmap1 simgrid mtest_c) +# target_link_libraries(cartshift1 simgrid mtest_c) +# target_link_libraries(cartsuball simgrid mtest_c) +# target_link_libraries(cartzero simgrid mtest_c) +# target_link_libraries(dgraph_unwgt simgrid mtest_c) +# target_link_libraries(dims1 simgrid mtest_c) +# target_link_libraries(dims2 simgrid mtest_c) +# target_link_libraries(distgraph1 simgrid mtest_c) +# target_link_libraries(graphcr2 simgrid mtest_c) +# target_link_libraries(graphcr simgrid mtest_c) +# target_link_libraries(graphmap1 simgrid mtest_c) +# target_link_libraries(neighb_coll simgrid mtest_c) +# target_link_libraries(topodup simgrid mtest_c) +# target_link_libraries(topotest simgrid mtest_c) + +endif() + +set(tesh_files + ${tesh_files} + PARENT_SCOPE + ) +set(xml_files + ${xml_files} + PARENT_SCOPE + ) +set(examples_src + ${examples_src} + ${CMAKE_CURRENT_SOURCE_DIR}/cartcreates.c + ${CMAKE_CURRENT_SOURCE_DIR}/cartmap1.c + ${CMAKE_CURRENT_SOURCE_DIR}/cartshift1.c + ${CMAKE_CURRENT_SOURCE_DIR}/cartsuball.c + ${CMAKE_CURRENT_SOURCE_DIR}/cartzero.c + ${CMAKE_CURRENT_SOURCE_DIR}/dgraph_unwgt.c + ${CMAKE_CURRENT_SOURCE_DIR}/dims1.c + ${CMAKE_CURRENT_SOURCE_DIR}/dims2.c + ${CMAKE_CURRENT_SOURCE_DIR}/distgraph1.c + ${CMAKE_CURRENT_SOURCE_DIR}/graphcr2.c + ${CMAKE_CURRENT_SOURCE_DIR}/graphcr.c + ${CMAKE_CURRENT_SOURCE_DIR}/graphmap1.c + ${CMAKE_CURRENT_SOURCE_DIR}/neighb_coll.c + ${CMAKE_CURRENT_SOURCE_DIR}/testlist + ${CMAKE_CURRENT_SOURCE_DIR}/topodup.c + ${CMAKE_CURRENT_SOURCE_DIR}/topotest.c + PARENT_SCOPE + ) +set(bin_files + ${bin_files} + PARENT_SCOPE + ) +set(txt_files + ${txt_files} + ${CMAKE_CURRENT_SOURCE_DIR}/testlist + PARENT_SCOPE + ) diff --git a/teshsuite/smpi/mpich3-test/topo/cartcreates.c b/teshsuite/smpi/mpich3-test/topo/cartcreates.c new file mode 100644 index 0000000000..92365d7f01 --- /dev/null +++ b/teshsuite/smpi/mpich3-test/topo/cartcreates.c @@ -0,0 +1,54 @@ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ +/* + * + * (C) 2003 by Argonne National Laboratory. + * See COPYRIGHT in top-level directory. + */ +#include "mpi.h" +#include +#include "mpitest.h" + +int main( int argc, char *argv[] ) +{ + int errs = 0; + int size, rank; + int dims[2], periods[2]; + MPI_Comm comm; + + MTest_Init( &argc, &argv ); + + /* Create a new cartesian communicator in a subset of the processes */ + MPI_Comm_size( MPI_COMM_WORLD, &size ); + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + if (size < 2) { + fprintf( stderr, "This test needs at least 2 processes\n" ); + MPI_Abort( MPI_COMM_WORLD, 1 ); + } + dims[0] = size-1; + periods[0] = 1; + MPI_Cart_create( MPI_COMM_WORLD, 1, dims, periods, 0, &comm ); + + if (comm != MPI_COMM_NULL) { + int csize; + MPI_Comm_size( comm, &csize ); + if (csize != dims[0]) { + errs++; + fprintf( stderr, + "Sizes is wrong in cart communicator. Is %d, should be %d\n", + csize, dims[0] ); + } + MPI_Barrier( comm ); + + MPI_Comm_free( &comm ); + } + else if (rank < dims[0]) { + errs++; + fprintf( stderr, "Communicator returned is null!" ); + } + + MTest_Finalize( errs ); + + MPI_Finalize(); + + return 0; +} diff --git a/teshsuite/smpi/mpich3-test/topo/cartmap1.c b/teshsuite/smpi/mpich3-test/topo/cartmap1.c new file mode 100644 index 0000000000..1ce5ad8d89 --- /dev/null +++ b/teshsuite/smpi/mpich3-test/topo/cartmap1.c @@ -0,0 +1,64 @@ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ +/* + * + * (C) 2003 by Argonne National Laboratory. + * See COPYRIGHT in top-level directory. + */ +#include "mpi.h" +#include +#include "mpitest.h" + +int main( int argc, char *argv[] ) +{ + int errs = 0; + int dims[2]; + int periods[2]; + int size, rank, newrank; + + MTest_Init( &argc, &argv ); + + MPI_Comm_size( MPI_COMM_WORLD, &size ); + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + + /* This defines a one dimensional cartision grid with a single point */ + periods[0] = 1; + dims[0] = 1; + + MPI_Cart_map( MPI_COMM_WORLD, 1, dims, periods, &newrank ); + if (rank > 0) { + if (newrank != MPI_UNDEFINED) { + errs++; + printf( "rank outside of input communicator not UNDEFINED\n" ); + } + } + else { + if (rank != newrank) { + errs++; + printf( "Newrank not defined and should be 0\n" ); + } + } + + + /* As of MPI 2.1, a 0-dimensional topology is valid (its also a + point) */ + MPI_Cart_map( MPI_COMM_WORLD, 0, dims, periods, &newrank ); + if (rank > 0) { + if (newrank != MPI_UNDEFINED) { + errs++; + printf( "rank outside of input communicator not UNDEFINED\n" ); + } + } + else { + /* rank == 0 */ + if (rank != newrank) { + errs++; + printf( "Newrank not defined and should be 0\n" ); + } + } + + + MTest_Finalize( errs ); + MPI_Finalize(); + return 0; + +} diff --git a/teshsuite/smpi/mpich3-test/topo/cartshift1.c b/teshsuite/smpi/mpich3-test/topo/cartshift1.c new file mode 100644 index 0000000000..679f12c18c --- /dev/null +++ b/teshsuite/smpi/mpich3-test/topo/cartshift1.c @@ -0,0 +1,96 @@ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ +/* + * + * (C) 2003 by Argonne National Laboratory. + * See COPYRIGHT in top-level directory. + */ +#include "mpi.h" +#include +#include "mpitest.h" + +int main( int argc, char *argv[] ) +{ + int errs = 0; + int size, rank; + int source, dest; + int dims[2], periods[2]; + MPI_Comm comm; + + MTest_Init( &argc, &argv ); + + MPI_Comm_size( MPI_COMM_WORLD, &size ); + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + dims[0] = size; + periods[0] = 1; + MPI_Cart_create( MPI_COMM_WORLD, 1, dims, periods, 0, &comm ); + MPI_Cart_shift( comm, 0, 1, &source, &dest ); + if (source != ((rank - 1 + size) % size)) { + errs++; + printf( "source for shift 1 is %d\n", source ); + } + if (dest != ((rank + 1) % size)) { + errs++; + printf( "dest for shift 1 is %d\n", dest ); + } + MPI_Cart_shift( comm, 0, 0, &source, &dest ); + if (source != rank) { + errs++; + printf( "Source for shift 0 is %d\n", source ); + } + if (dest != rank) { + errs++; + printf( "Dest for shift 0 is %d\n", dest ); + } + MPI_Cart_shift( comm, 0, -1, &source, &dest ); + if (source != ((rank + 1) % size)) { + errs++; + printf( "source for shift -1 is %d\n", source ); + } + if (dest != ((rank - 1 + size) % size)) { + errs++; + printf( "dest for shift -1 is %d\n", dest ); + } + + /* Now, with non-periodic */ + MPI_Comm_free( &comm ); + periods[0] = 0; + MPI_Cart_create( MPI_COMM_WORLD, 1, dims, periods, 0, &comm ); + MPI_Cart_shift( comm, 0, 1, &source, &dest ); + if ((rank > 0 && source != (rank - 1)) || + (rank == 0 && source != MPI_PROC_NULL)) { + errs++; + printf( "source for non-periodic shift 1 is %d\n", source ); + } + if ((rank < size-1 && dest != rank + 1) || + ((rank == size-1) && dest != MPI_PROC_NULL)) { + errs++; + printf( "dest for non-periodic shift 1 is %d\n", dest ); + } + MPI_Cart_shift( comm, 0, 0, &source, &dest ); + if (source != rank) { + errs++; + printf( "Source for non-periodic shift 0 is %d\n", source ); + } + if (dest != rank) { + errs++; + printf( "Dest for non-periodic shift 0 is %d\n", dest ); + } + MPI_Cart_shift( comm, 0, -1, &source, &dest ); + if ((rank < size - 1 && source != rank + 1) || + (rank == size - 1 && source != MPI_PROC_NULL)) { + + errs++; + printf( "source for non-periodic shift -1 is %d\n", source ); + } + if ((rank > 0 && dest != rank - 1) || + (rank == 0 && dest != MPI_PROC_NULL)) { + errs++; + printf( "dest for non-periodic shift -1 is %d\n", dest ); + } + MPI_Comm_free( &comm ); + + MTest_Finalize( errs ); + MPI_Finalize(); + return 0; + +} diff --git a/teshsuite/smpi/mpich3-test/topo/cartsuball.c b/teshsuite/smpi/mpich3-test/topo/cartsuball.c new file mode 100644 index 0000000000..890db5a633 --- /dev/null +++ b/teshsuite/smpi/mpich3-test/topo/cartsuball.c @@ -0,0 +1,54 @@ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ +/* + * + * (C) 2003 by Argonne National Laboratory. + * See COPYRIGHT in top-level directory. + */ +#include "mpi.h" +#include +#include "mpitest.h" + +int main( int argc, char *argv[] ) +{ + int errs = 0; + int size, dims[2], periods[2], remain[2]; + int result, rank; + MPI_Comm comm, newcomm; + + MTest_Init( &argc, &argv ); + + /* First, create a 1-dim cartesian communicator */ + periods[0] = 0; + MPI_Comm_size( MPI_COMM_WORLD, &size ); + dims[0] = size; + MPI_Cart_create( MPI_COMM_WORLD, 1, dims, periods, 0, &comm ); + + /* Now, extract a communicator with no dimensions */ + remain[0] = 0; + MPI_Cart_sub( comm, remain, &newcomm ); + + MPI_Comm_rank(comm, &rank); + + if (rank == 0) { + /* This should be congruent to MPI_COMM_SELF */ + MPI_Comm_compare( MPI_COMM_SELF, newcomm, &result ); + if (result != MPI_CONGRUENT) { + errs++; + printf( "cart sub to size 0 did not give self\n" ); + } + MPI_Comm_free( &newcomm ); + } + else if (newcomm != MPI_COMM_NULL) { + errs++; + printf( "cart sub to size 0 did not give null\n" ); + } + + /* Free the new communicator so that storage leak tests will + be happy */ + MPI_Comm_free( &comm ); + + MTest_Finalize( errs ); + MPI_Finalize(); + return 0; + +} diff --git a/teshsuite/smpi/mpich3-test/topo/cartzero.c b/teshsuite/smpi/mpich3-test/topo/cartzero.c new file mode 100644 index 0000000000..c8e601ee3e --- /dev/null +++ b/teshsuite/smpi/mpich3-test/topo/cartzero.c @@ -0,0 +1,92 @@ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ +/* + * + * (C) 2008 by Argonne National Laboratory. + * See COPYRIGHT in top-level directory. + */ +#include "mpi.h" +#include +#include "mpitest.h" + +/* + Check that the MPI implementation properly handles zero-dimensional + Cartesian communicators - the original standard implies that these + should be consistent with higher dimensional topologies and thus + these should work with any MPI implementation. MPI 2.1 made this + requirement explicit. +*/ +int main( int argc, char *argv[] ) +{ + int errs = 0; + int size, rank, ndims; + MPI_Comm comm, newcomm; + + MTest_Init( &argc, &argv ); + + /* Create a new cartesian communicator in a subset of the processes */ + MPI_Comm_size( MPI_COMM_WORLD, &size ); + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + if (size < 2) { + fprintf( stderr, "This test needs at least 2 processes\n" ); + MPI_Abort( MPI_COMM_WORLD, 1 ); + } + + MPI_Cart_create( MPI_COMM_WORLD, 0, NULL, NULL, 0, &comm ); + + if (comm != MPI_COMM_NULL) { + int csize; + MPI_Comm_size( comm, &csize ); + if (csize != 1) { + errs++; + fprintf( stderr, + "Sizes is wrong in cart communicator. Is %d, should be 1\n", + csize ); + } + + /* This function is not meaningful, but should not fail */ + MPI_Dims_create(1, 0, NULL); + + ndims = -1; + MPI_Cartdim_get(comm, &ndims); + if (ndims != 0) { + errs++; + fprintf(stderr, "MPI_Cartdim_get: ndims is %d, should be 0\n", ndims); + } + + /* this function should not fail */ + MPI_Cart_get(comm, 0, NULL, NULL, NULL); + + MPI_Cart_rank(comm, NULL, &rank); + if (rank != 0) { + errs++; + fprintf(stderr, "MPI_Cart_rank: rank is %d, should be 0\n", rank); + } + + /* this function should not fail */ + MPI_Cart_coords(comm, 0, 0, NULL); + + MPI_Cart_sub(comm, NULL, &newcomm); + ndims = -1; + MPI_Cartdim_get(newcomm, &ndims); + if (ndims != 0) { + errs++; + fprintf(stderr, + "MPI_Cart_sub did not return zero-dimensional communicator\n"); + } + + MPI_Barrier( comm ); + + MPI_Comm_free( &comm ); + MPI_Comm_free( &newcomm ); + } + else if (rank == 0) { + errs++; + fprintf( stderr, "Communicator returned is null!" ); + } + + MTest_Finalize( errs ); + + MPI_Finalize(); + + return 0; +} diff --git a/teshsuite/smpi/mpich3-test/topo/dgraph_unwgt.c b/teshsuite/smpi/mpich3-test/topo/dgraph_unwgt.c new file mode 100644 index 0000000000..e29b3a4275 --- /dev/null +++ b/teshsuite/smpi/mpich3-test/topo/dgraph_unwgt.c @@ -0,0 +1,171 @@ +#include +#include +#include +#include "mpi.h" +#include "mpitest.h" + +#define RING_NUM_NEIGHBORS 2 + +static int validate_dgraph(MPI_Comm dgraph_comm) +{ + int comm_topo; + int src_sz, dest_sz; + int wgt_flag, ierr; + int srcs[RING_NUM_NEIGHBORS], dests[RING_NUM_NEIGHBORS]; + int *src_wgts, *dest_wgts; + + int world_rank, world_size; + int idx, nbr_sep; + + comm_topo = MPI_UNDEFINED; + MPI_Topo_test(dgraph_comm, &comm_topo); + switch (comm_topo) { + case MPI_DIST_GRAPH : + break; + default: + fprintf(stderr, "dgraph_comm is NOT of type MPI_DIST_GRAPH\n"); + return 0; + } + + ierr = MPI_Dist_graph_neighbors_count(dgraph_comm, + &src_sz, &dest_sz, &wgt_flag); + if (ierr != MPI_SUCCESS) { + fprintf(stderr, "MPI_Dist_graph_neighbors_count() fails!\n"); + return 0; + } +/* + else + fprintf(stderr, "MPI_Dist_graph_neighbors_count() succeeds!\n"); +*/ + + if (wgt_flag) { + fprintf(stderr, "dgraph_comm is NOT created with MPI_UNWEIGHTED\n"); + return 0; + } +/* + else + fprintf(stderr, "dgraph_comm is created with MPI_UNWEIGHTED\n"); +*/ + if (src_sz != RING_NUM_NEIGHBORS || dest_sz != RING_NUM_NEIGHBORS) { + fprintf(stderr, "source or destination edge array is not of size %d.\n", + RING_NUM_NEIGHBORS); + fprintf(stderr, "src_sz = %d, dest_sz = %d\n", src_sz, dest_sz); + return 0; + } + + /* + src_wgts and dest_wgts could be anything, e.g. NULL, since + MPI_Dist_graph_neighbors_count() returns MPI_UNWEIGHTED. + Since this program has a Fortran77 version, and standard Fortran77 + has no pointer and NULL, so use MPI_UNWEIGHTED for the weighted arrays. + */ + src_wgts = MPI_UNWEIGHTED; + dest_wgts = MPI_UNWEIGHTED; + ierr = MPI_Dist_graph_neighbors(dgraph_comm, + src_sz, srcs, src_wgts, + dest_sz, dests, dest_wgts); + if (ierr != MPI_SUCCESS) { + fprintf(stderr, "MPI_Dist_graph_neighbors() fails!\n"); + return 0; + } +/* + else + fprintf(stderr, "MPI_Dist_graph_neighbors() succeeds!\n"); +*/ + + /* + Check if the neighbors returned from MPI are really + the nearest neighbors within a ring. + */ + MPI_Comm_size(MPI_COMM_WORLD, &world_size); + MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); + + for (idx=0; idx < src_sz; idx++) { + nbr_sep = abs(srcs[idx] - world_rank); + if ( nbr_sep != 1 && nbr_sep != (world_size-1) ) { + fprintf(stderr, "srcs[%d]=%d is NOT a neighbor of my rank %d.\n", + idx, srcs[idx], world_rank); + return 0; + } + } + for (idx=0; idx < dest_sz; idx++) { + nbr_sep = abs(dests[idx] - world_rank); + if ( nbr_sep != 1 && nbr_sep != (world_size-1) ) { + fprintf(stderr, "dests[%d]=%d is NOT a neighbor of my rank %d.\n", + idx, dests[idx], world_rank); + return 0; + } + } + + /* + fprintf(stderr, "dgraph_comm is of type MPI_DIST_GRAPH " + "of a bidirectional ring.\n"); + */ + return 1; +} + +/* + Specify a distributed graph of a bidirectional ring of the MPI_COMM_WORLD, + i.e. everyone only talks to left and right neighbors. +*/ +int main(int argc, char *argv[]) +{ + MPI_Comm dgraph_comm; + int world_size, world_rank, ierr; + int errs = 0; + + int src_sz, dest_sz; + int degs[1]; + int srcs[RING_NUM_NEIGHBORS], dests[RING_NUM_NEIGHBORS]; + + MTest_Init(&argc, &argv); + MPI_Comm_size(MPI_COMM_WORLD, &world_size); + MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); + + degs[0] = 2; + srcs[0] = world_rank; + dests[0] = world_rank-1 < 0 ? world_size-1 : world_rank-1 ; + dests[1] = world_rank+1 >= world_size ? 0 : world_rank+1 ; + ierr = MPI_Dist_graph_create(MPI_COMM_WORLD, 1, srcs, degs, dests, + MPI_UNWEIGHTED, MPI_INFO_NULL, 1, + &dgraph_comm); + if ( ierr != MPI_SUCCESS ) { + fprintf(stderr, "MPI_Dist_graph_create() fails!\n"); + MPI_Abort(MPI_COMM_WORLD, 1); + return 1; + } + if (!validate_dgraph(dgraph_comm)) { + fprintf(stderr, "MPI_Dist_graph_create() does NOT create " + "a bidirectional ring graph!\n"); + MPI_Abort(MPI_COMM_WORLD, 1); + return 1; + } + MPI_Comm_free(&dgraph_comm); + + src_sz = 2; + srcs[0] = world_rank-1 < 0 ? world_size-1 : world_rank-1 ; + srcs[1] = world_rank+1 >= world_size ? 0 : world_rank+1 ; + dest_sz = 2; + dests[0] = world_rank-1 < 0 ? world_size-1 : world_rank-1 ; + dests[1] = world_rank+1 >= world_size ? 0 : world_rank+1 ; + ierr = MPI_Dist_graph_create_adjacent(MPI_COMM_WORLD, + src_sz, srcs, MPI_UNWEIGHTED, + dest_sz, dests, MPI_UNWEIGHTED, + MPI_INFO_NULL, 1, &dgraph_comm); + if ( ierr != MPI_SUCCESS ) { + fprintf(stderr, "MPI_Dist_graph_create_adjacent() fails!\n"); + MPI_Abort(MPI_COMM_WORLD, 1); + return 1; + } + if (!validate_dgraph(dgraph_comm)) { + fprintf(stderr, "MPI_Dist_graph_create_adjacent() does NOT create " + "a bidirectional ring graph!\n"); + MPI_Abort(MPI_COMM_WORLD, 1); + return 1; + } + MPI_Comm_free(&dgraph_comm); + + MTest_Finalize(errs); + MPI_Finalize(); + return 0; +} diff --git a/teshsuite/smpi/mpich3-test/topo/dims1.c b/teshsuite/smpi/mpich3-test/topo/dims1.c new file mode 100644 index 0000000000..b429776470 --- /dev/null +++ b/teshsuite/smpi/mpich3-test/topo/dims1.c @@ -0,0 +1,144 @@ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ +/* + * (C) 2003 by Argonne National Laboratory. + * See COPYRIGHT in top-level directory. + */ +#include "mpi.h" +#include +#include "mpitest.h" + +int prodof( int ndims, const int dims[] ); +int increasing( int ndims, const int dims[] ); + +int prodof( int ndims, const int dims[] ) +{ + int i, prod=1; + for (i=0; i dims[i-1]) { + printf ("%d = dims[%d] > dims[%d] = %d\n", dims[i], i, + i-1, dims[i-1] ); + err = 1; + } + } + return err; +} +int main( int argc, char *argv[] ) +{ + int errs = 0; + int dims[4], nnodes, ndims; + + MTest_Init( &argc, &argv ); + + /* Test multiple dims create values. For each, make sure that the + product of dims is the number of input nodes */ + nnodes = 2*3*5*7*11; + ndims = 2; + dims[0] = dims[1] = 0; + MPI_Dims_create( nnodes, ndims, dims ); + if (prodof(ndims,dims) != nnodes) { + errs++; + printf( "dims create returned the wrong decomposition for %d in %d dims\n", + nnodes, ndims ); + } + if (increasing( ndims, dims )) { + errs++; + printf( "dims create returned a decomposition with increasing dimensions (see MPI-1 standard section 6.5)\n" ); + printf( "dims create returned the wrong decomposition for %d in %d dims\n", + nnodes, ndims ); + } + + /* Test multiple dims create values. For each, make sure that the + product of dims is the number of input nodes */ + nnodes = 2*7; + ndims = 2; + dims[0] = dims[1] = 0; + MPI_Dims_create( nnodes, ndims, dims ); + if (prodof(ndims,dims) != nnodes) { + errs++; + printf( "dims create returned the wrong decomposition for %d in %d dims\n", + nnodes, ndims ); + } + if (increasing( ndims, dims )) { + errs++; + printf( "dims create returned a decomposition with increasing dimensions (see MPI-1 standard section 6.5)\n" ); + printf( "dims create returned the wrong decomposition for %d in %d dims\n", + nnodes, ndims ); + } + + nnodes = 2*2*3*3*5*7*11; + ndims = 2; + dims[0] = dims[1] = 0; + MPI_Dims_create( nnodes, ndims, dims ); + if (prodof(ndims,dims) != nnodes) { + errs++; + printf( "dims create returned the wrong decomposition for %d in %d dims\n", + nnodes, ndims ); + } + if (increasing( ndims, dims )) { + errs++; + printf( "dims create returned a decomposition with increasing dimensions (see MPI-1 standard section 6.5)\n" ); + printf( "dims create returned the wrong decomposition for %d in %d dims\n", + nnodes, ndims ); + } + + nnodes = 11; + ndims = 2; + dims[0] = dims[1] = 0; + MPI_Dims_create( nnodes, ndims, dims ); + if (prodof(ndims,dims) != nnodes) { + errs++; + printf( "dims create returned the wrong decomposition for %d in %d dims\n", + nnodes, ndims ); + } + if (increasing( ndims, dims )) { + errs++; + printf( "dims create returned a decomposition with increasing dimensions (see MPI-1 standard section 6.5)\n" ); + printf( "dims create returned the wrong decomposition for %d in %d dims\n", + nnodes, ndims ); + } + + nnodes = 5*7*11; + ndims = 4; + dims[0] = dims[1] = dims[2] = dims[3] = 0; + MPI_Dims_create( nnodes, ndims, dims ); + if (prodof(ndims,dims) != nnodes) { + errs++; + printf( "dims create returned the wrong decomposition for %d in %d dims\n", + nnodes, ndims ); + } + if (increasing( ndims, dims )) { + errs++; + printf( "dims create returned a decomposition with increasing dimensions (see MPI-1 standard section 6.5)\n" ); + printf( "dims create returned the wrong decomposition for %d in %d dims\n", + nnodes, ndims ); + } + + nnodes = 64; + ndims = 4; + dims[0] = dims[1] = dims[2] = dims[3] = 0; + MPI_Dims_create( nnodes, ndims, dims ); + if (prodof(ndims,dims) != nnodes) { + errs++; + printf( "dims create returned the wrong decomposition for %d in %d dims\n", + nnodes, ndims ); + } + if (increasing( ndims, dims )) { + errs++; + printf( "dims create returned a decomposition with increasing dimensions (see MPI-1 standard section 6.5)\n" ); + printf( "dims create returned the wrong decomposition for %d in %d dims\n", + nnodes, ndims ); + } + + MTest_Finalize( errs ); + MPI_Finalize(); + return 0; + +} diff --git a/teshsuite/smpi/mpich3-test/topo/dims2.c b/teshsuite/smpi/mpich3-test/topo/dims2.c new file mode 100644 index 0000000000..aa453eb89a --- /dev/null +++ b/teshsuite/smpi/mpich3-test/topo/dims2.c @@ -0,0 +1,93 @@ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ +/* + * (C) 2003 by Argonne National Laboratory. + * See COPYRIGHT in top-level directory. + */ +#include "mpi.h" +#include +#include "mpitest.h" + +int prodof( int, const int[] ); +/* + * Test edge cases of Dims_create + */ +int prodof( int ndims, const int dims[] ) +{ + int i, prod=1; + for (i=0; i +#include +#include +#include +#include "mpitest.h" + +#define NUM_GRAPHS 10 +#define MAX_WEIGHT 100 + +/* convenience globals */ +int size, rank; + +/* We need MPI 2.2 to be able to compile the following routines. */ +#if MTEST_HAVE_MIN_MPI_VERSION(2,2) + +/* Maybe use a bit vector instead? */ +int **layout; + +#define MAX_LAYOUT_NAME_LEN 256 +char graph_layout_name[MAX_LAYOUT_NAME_LEN] = {'\0'}; + +static void create_graph_layout(int graph_num) +{ + int i, j; + + if (rank == 0) { + switch (graph_num) { + case 0: + strncpy(graph_layout_name, "deterministic complete graph", MAX_LAYOUT_NAME_LEN); + for (i = 0; i < size; i++) + for (j = 0; j < size; j++) + layout[i][j] = (i + 2) * (j + 1); + break; + case 1: + strncpy(graph_layout_name, "every other edge deleted", MAX_LAYOUT_NAME_LEN); + for (i = 0; i < size; i++) + for (j = 0; j < size; j++) + layout[i][j] = (j % 2 ? (i + 2) * (j + 1) : 0); + break; + case 2: + strncpy(graph_layout_name, "only self-edges", MAX_LAYOUT_NAME_LEN); + for (i = 0; i < size; i++) { + for (j = 0; j < size; j++) { + if (i == rank && j == rank) + layout[i][j] = 10 * (i + 1); + else + layout[i][j] = 0; + } + } + break; + case 3: + strncpy(graph_layout_name, "no edges", MAX_LAYOUT_NAME_LEN); + for (i = 0; i < size; i++) + for (j = 0; j < size; j++) + layout[i][j] = 0; + break; + default: + strncpy(graph_layout_name, "a random incomplete graph", MAX_LAYOUT_NAME_LEN); + srand(graph_num); + + /* Create a connectivity graph; layout[i,j]==w represents an outward + * connectivity from i to j with weight w, w==0 is no edge. */ + for (i = 0; i < size; i++) { + for (j = 0; j < size; j++) { + /* disable about a third of the edges */ + if (((rand() * 1.0) / RAND_MAX) < 0.33) + layout[i][j] = 0; + else + layout[i][j] = rand() % MAX_WEIGHT; + } + } + break; + } + } + + /* because of the randomization we must determine the graph on rank 0 and + * send the layout to all other processes */ + MPI_Bcast(graph_layout_name, MAX_LAYOUT_NAME_LEN, MPI_CHAR, 0, MPI_COMM_WORLD); + for (i = 0; i < size; ++i) { + MPI_Bcast(layout[i], size, MPI_INT, 0, MPI_COMM_WORLD); + } +} + +static int verify_comm(MPI_Comm comm) +{ + int local_errs = 0; + int i, j; + int indegree, outdegree, weighted; + int *sources, *sweights, *destinations, *dweights; + int use_dup; + int topo_type = MPI_UNDEFINED; + MPI_Comm dupcomm = MPI_COMM_NULL; + + sources = (int *) malloc(size * sizeof(int)); + sweights = (int *) malloc(size * sizeof(int)); + destinations = (int *) malloc(size * sizeof(int)); + dweights = (int *) malloc(size * sizeof(int)); + + for (use_dup = 0; use_dup <= 1; ++use_dup) { + if (!use_dup) { + MPI_Dist_graph_neighbors_count(comm, &indegree, &outdegree, &weighted); + } + else { + MPI_Comm_dup(comm, &dupcomm); + comm = dupcomm; /* caller retains original comm value */ + } + + MPI_Topo_test(comm, &topo_type); + if (topo_type != MPI_DIST_GRAPH) { + fprintf(stderr, "topo_type != MPI_DIST_GRAPH\n"); + ++local_errs; + } + + j = 0; + for (i = 0; i < size; i++) + if (layout[i][rank]) + j++; + if (j != indegree) { + fprintf(stderr, "indegree does not match, expected=%d got=%d, layout='%s'\n", indegree, j, graph_layout_name); + ++local_errs; + } + + j = 0; + for (i = 0; i < size; i++) + if (layout[rank][i]) + j++; + if (j != outdegree) { + fprintf(stderr, "outdegree does not match, expected=%d got=%d, layout='%s'\n", outdegree, j, graph_layout_name); + ++local_errs; + } + + if ((indegree || outdegree) && (weighted == 0)) { + fprintf(stderr, "MPI_Dist_graph_neighbors_count thinks the graph is not weighted\n"); + ++local_errs; + } + + + MPI_Dist_graph_neighbors(comm, indegree, sources, sweights, outdegree, destinations, dweights); + + /* For each incoming and outgoing edge in the matrix, search if + * the query function listed it in the sources. */ + for (i = 0; i < size; i++) { + if (layout[i][rank]) { + for (j = 0; j < indegree; j++) { + assert(sources[j] >= 0); + assert(sources[j] < size); + if (sources[j] == i) + break; + } + if (j == indegree) { + fprintf(stderr, "no edge from %d to %d specified\n", i, rank); + ++local_errs; + } + else { + if (sweights[j] != layout[i][rank]) { + fprintf(stderr, "incorrect weight for edge (%d,%d): %d instead of %d\n", + i, rank, sweights[j], layout[i][rank]); + ++local_errs; + } + } + } + if (layout[rank][i]) { + for (j = 0; j < outdegree; j++) { + assert(destinations[j] >= 0); + assert(destinations[j] < size); + if (destinations[j] == i) + break; + } + if (j == outdegree) { + fprintf(stderr, "no edge from %d to %d specified\n", rank, i); + ++local_errs; + } + else { + if (dweights[j] != layout[rank][i]) { + fprintf(stderr, "incorrect weight for edge (%d,%d): %d instead of %d\n", + rank, i, dweights[j], layout[rank][i]); + ++local_errs; + } + } + } + } + + /* For each incoming and outgoing edge in the sources, we should + * have an entry in the matrix */ + for (i = 0; i < indegree; i++) { + if (layout[sources[i]][rank] != sweights[i]) { + fprintf(stderr, "edge (%d,%d) has a weight %d instead of %d\n", i, rank, + sweights[i], layout[sources[i]][rank]); + ++local_errs; + } + } + for (i = 0; i < outdegree; i++) { + if (layout[rank][destinations[i]] != dweights[i]) { + fprintf(stderr, "edge (%d,%d) has a weight %d instead of %d\n", rank, i, + dweights[i], layout[rank][destinations[i]]); + ++local_errs; + } + } + + } + + if (dupcomm != MPI_COMM_NULL) + MPI_Comm_free(&dupcomm); + + return local_errs; +} + +#endif /* At least MPI 2.2 */ + +int main(int argc, char *argv[]) +{ + int errs = 0; + int i, j, k, p; + int indegree, outdegree, reorder; + int check_indegree, check_outdegree, check_weighted; + int *sources, *sweights, *destinations, *dweights, *degrees; + MPI_Comm comm; + + MTest_Init(&argc, &argv); + + MPI_Comm_size(MPI_COMM_WORLD, &size); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + +#if MTEST_HAVE_MIN_MPI_VERSION(2,2) + layout = (int **) malloc(size * sizeof(int *)); + assert(layout); + for (i = 0; i < size; i++) { + layout[i] = (int *) malloc(size * sizeof(int)); + assert(layout[i]); + } + /* alloc size*size ints to handle the all-on-one-process case */ + sources = (int *) malloc(size * size * sizeof(int)); + sweights = (int *) malloc(size * size * sizeof(int)); + destinations = (int *) malloc(size * size * sizeof(int)); + dweights = (int *) malloc(size * size * sizeof(int)); + degrees = (int *) malloc(size * size * sizeof(int)); + + for (i = 0; i < NUM_GRAPHS; i++) { + create_graph_layout(i); + if (rank == 0) { + MTestPrintfMsg( 1, "using graph layout '%s'\n", graph_layout_name ); + } + + /* MPI_Dist_graph_create_adjacent */ + if (rank == 0) { + MTestPrintfMsg( 1, "testing MPI_Dist_graph_create_adjacent\n" ); + } + indegree = 0; + k = 0; + for (j = 0; j < size; j++) { + if (layout[j][rank]) { + indegree++; + sources[k] = j; + sweights[k++] = layout[j][rank]; + } + } + + outdegree = 0; + k = 0; + for (j = 0; j < size; j++) { + if (layout[rank][j]) { + outdegree++; + destinations[k] = j; + dweights[k++] = layout[rank][j]; + } + } + + for (reorder = 0; reorder <= 1; reorder++) { + MPI_Dist_graph_create_adjacent(MPI_COMM_WORLD, indegree, sources, sweights, + outdegree, destinations, dweights, MPI_INFO_NULL, + reorder, &comm); + MPI_Barrier(comm); + errs += verify_comm(comm); + MPI_Comm_free(&comm); + } + + /* a weak check that passing MPI_UNWEIGHTED doesn't cause + * create_adjacent to explode */ + MPI_Dist_graph_create_adjacent(MPI_COMM_WORLD, indegree, sources, MPI_UNWEIGHTED, + outdegree, destinations, MPI_UNWEIGHTED, MPI_INFO_NULL, + reorder, &comm); + MPI_Barrier(comm); + /* intentionally no verify here, weights won't match */ + MPI_Comm_free(&comm); + + + /* MPI_Dist_graph_create() where each process specifies its + * outgoing edges */ + if (rank == 0) { + MTestPrintfMsg( 1, + "testing MPI_Dist_graph_create w/ outgoing only\n" ); + } + sources[0] = rank; + k = 0; + for (j = 0; j < size; j++) { + if (layout[rank][j]) { + destinations[k] = j; + dweights[k++] = layout[rank][j]; + } + } + degrees[0] = k; + for (reorder = 0; reorder <= 1; reorder++) { + MPI_Dist_graph_create(MPI_COMM_WORLD, 1, sources, degrees, destinations, dweights, + MPI_INFO_NULL, reorder, &comm); + MPI_Barrier(comm); + errs += verify_comm(comm); + MPI_Comm_free(&comm); + } + + + /* MPI_Dist_graph_create() where each process specifies its + * incoming edges */ + if (rank == 0) { + MTestPrintfMsg( 1, + "testing MPI_Dist_graph_create w/ incoming only\n" ); + } + k = 0; + for (j = 0; j < size; j++) { + if (layout[j][rank]) { + sources[k] = j; + sweights[k] = layout[j][rank]; + degrees[k] = 1; + destinations[k++] = rank; + } + } + for (reorder = 0; reorder <= 1; reorder++) { + MPI_Dist_graph_create(MPI_COMM_WORLD, k, sources, degrees, destinations, sweights, + MPI_INFO_NULL, reorder, &comm); + MPI_Barrier(comm); + errs += verify_comm(comm); + MPI_Comm_free(&comm); + } + + + /* MPI_Dist_graph_create() where rank 0 specifies the entire + * graph */ + if (rank == 0) { + MTestPrintfMsg( 1, + "testing MPI_Dist_graph_create w/ rank 0 specifies only\n" ); + } + p = 0; + for (j = 0; j < size; j++) { + for (k = 0; k < size; k++) { + if (layout[j][k]) { + sources[p] = j; + sweights[p] = layout[j][k]; + degrees[p] = 1; + destinations[p++] = k; + } + } + } + for (reorder = 0; reorder <= 1; reorder++) { + MPI_Dist_graph_create(MPI_COMM_WORLD, (rank == 0) ? p : 0, sources, degrees, + destinations, sweights, MPI_INFO_NULL, reorder, &comm); + MPI_Barrier(comm); + errs += verify_comm(comm); + MPI_Comm_free(&comm); + } + + /* MPI_Dist_graph_create() where rank 0 specifies the entire + * graph and all other ranks pass NULL. Can catch implementation + * problems when MPI_UNWEIGHTED==NULL. */ + if (rank == 0) { + MTestPrintfMsg( 1, + "testing MPI_Dist_graph_create w/ rank 0 specifies only -- NULLs\n"); + } + p = 0; + for (j = 0; j < size; j++) { + for (k = 0; k < size; k++) { + if (layout[j][k]) { + sources[p] = j; + sweights[p] = layout[j][k]; + degrees[p] = 1; + destinations[p++] = k; + } + } + } + for (reorder = 0; reorder <= 1; reorder++) { + if (rank == 0) { + MPI_Dist_graph_create(MPI_COMM_WORLD, p, sources, degrees, + destinations, sweights, MPI_INFO_NULL, reorder, &comm); + } + else { + MPI_Dist_graph_create(MPI_COMM_WORLD, 0, NULL, NULL, + NULL, NULL, MPI_INFO_NULL, reorder, &comm); + } + MPI_Barrier(comm); + errs += verify_comm(comm); + MPI_Comm_free(&comm); + } + + } + + /* now tests that don't depend on the layout[][] array */ + + /* The MPI-2.2 standard recommends implementations set + * MPI_UNWEIGHTED==NULL, but this leads to an ambiguity. The draft + * MPI-3.0 standard specifically recommends _not_ setting it equal + * to NULL. */ + if (MPI_UNWEIGHTED == NULL) { + fprintf(stderr, "MPI_UNWEIGHTED should not be NULL\n"); + ++errs; + } + + /* MPI_Dist_graph_create() with no graph */ + if (rank == 0) { + MTestPrintfMsg( 1, "testing MPI_Dist_graph_create w/ no graph\n" ); + } + for (reorder = 0; reorder <= 1; reorder++) { + MPI_Dist_graph_create(MPI_COMM_WORLD, 0, sources, degrees, + destinations, sweights, MPI_INFO_NULL, reorder, &comm); + MPI_Dist_graph_neighbors_count(comm, &check_indegree, &check_outdegree, &check_weighted); + if (!check_weighted) { + fprintf(stderr, "expected weighted == TRUE for the \"no graph\" case\n"); + ++errs; + } + MPI_Comm_free(&comm); + } + + /* MPI_Dist_graph_create() with no graph -- passing MPI_WEIGHTS_EMPTY + instead */ + /* NOTE that MPI_WEIGHTS_EMPTY was added in MPI-3 and does not + appear before then. This part of the test thus requires a check + on the MPI major version */ +#if MPI_VERSION >= 3 + if (rank == 0) { + MTestPrintfMsg( 1, "testing MPI_Dist_graph_create w/ no graph\n" ); + } + for (reorder = 0; reorder <= 1; reorder++) { + MPI_Dist_graph_create(MPI_COMM_WORLD, 0, sources, degrees, + destinations, MPI_WEIGHTS_EMPTY, MPI_INFO_NULL, reorder, &comm); + MPI_Dist_graph_neighbors_count(comm, &check_indegree, &check_outdegree, &check_weighted); + if (!check_weighted) { + fprintf(stderr, "expected weighted == TRUE for the \"no graph -- MPI_WEIGHTS_EMPTY\" case\n"); + ++errs; + } + MPI_Comm_free(&comm); + } +#endif + + /* MPI_Dist_graph_create() with no graph -- passing NULLs instead */ + if (rank == 0) { + MTestPrintfMsg( 1, + "testing MPI_Dist_graph_create w/ no graph -- NULLs\n" ); + } + for (reorder = 0; reorder <= 1; reorder++) { + MPI_Dist_graph_create(MPI_COMM_WORLD, 0, NULL, NULL, + NULL, NULL, MPI_INFO_NULL, reorder, &comm); + MPI_Dist_graph_neighbors_count(comm, &check_indegree, &check_outdegree, &check_weighted); + /* ambiguous if they are equal, only check when they are distinct values. */ + if (MPI_UNWEIGHTED != NULL) { + if (!check_weighted) { + fprintf(stderr, "expected weighted == TRUE for the \"no graph -- NULLs\" case\n"); + ++errs; + } + } + MPI_Comm_free(&comm); + } + + /* MPI_Dist_graph_create() with no graph -- passing NULLs+MPI_UNWEIGHTED instead */ + if (rank == 0) { + MTestPrintfMsg( 1, + "testing MPI_Dist_graph_create w/ no graph -- NULLs+MPI_UNWEIGHTED\n" ); + } + for (reorder = 0; reorder <= 1; reorder++) { + MPI_Dist_graph_create(MPI_COMM_WORLD, 0, NULL, NULL, + NULL, MPI_UNWEIGHTED, MPI_INFO_NULL, reorder, &comm); + MPI_Dist_graph_neighbors_count(comm, &check_indegree, &check_outdegree, &check_weighted); + /* ambiguous if they are equal, only check when they are distinct values. */ + if (MPI_UNWEIGHTED != NULL) { + if (check_weighted) { + fprintf(stderr, "expected weighted == FALSE for the \"no graph -- NULLs+MPI_UNWEIGHTED\" case\n"); + ++errs; + } + } + MPI_Comm_free(&comm); + } + + /* MPI_Dist_graph_create_adjacent() with no graph */ + if (rank == 0) { + MTestPrintfMsg( 1, + "testing MPI_Dist_graph_create_adjacent w/ no graph\n" ); + } + for (reorder = 0; reorder <= 1; reorder++) { + MPI_Dist_graph_create_adjacent(MPI_COMM_WORLD, 0, sources, sweights, + 0, destinations, dweights, MPI_INFO_NULL, reorder, &comm); + MPI_Dist_graph_neighbors_count(comm, &check_indegree, &check_outdegree, &check_weighted); + if (!check_weighted) { + fprintf(stderr, "expected weighted == TRUE for the \"no graph\" case\n"); + ++errs; + } + MPI_Comm_free(&comm); + } + + /* MPI_Dist_graph_create_adjacent() with no graph -- passing MPI_WEIGHTS_EMPTY instead */ + /* NOTE that MPI_WEIGHTS_EMPTY was added in MPI-3 and does not + appear before then. This part of the test thus requires a check + on the MPI major version */ +#if MPI_VERSION >= 3 + if (rank == 0) { + MTestPrintfMsg( 1, + "testing MPI_Dist_graph_create_adjacent w/ no graph -- MPI_WEIGHTS_EMPTY\n" ); + } + for (reorder = 0; reorder <= 1; reorder++) { + MPI_Dist_graph_create_adjacent(MPI_COMM_WORLD, 0, sources, MPI_WEIGHTS_EMPTY, + 0, destinations, MPI_WEIGHTS_EMPTY, MPI_INFO_NULL, reorder, &comm); + MPI_Dist_graph_neighbors_count(comm, &check_indegree, &check_outdegree, &check_weighted); + if (!check_weighted) { + fprintf(stderr, "expected weighted == TRUE for the \"no graph -- MPI_WEIGHTS_EMPTY\" case\n"); + ++errs; + } + MPI_Comm_free(&comm); + } +#endif + + /* MPI_Dist_graph_create_adjacent() with no graph -- passing NULLs instead */ + if (rank == 0) { + MTestPrintfMsg( 1, + "testing MPI_Dist_graph_create_adjacent w/ no graph -- NULLs\n" ); + } + for (reorder = 0; reorder <= 1; reorder++) { + MPI_Dist_graph_create_adjacent(MPI_COMM_WORLD, 0, NULL, NULL, + 0, NULL, NULL, MPI_INFO_NULL, reorder, &comm); + MPI_Dist_graph_neighbors_count(comm, &check_indegree, &check_outdegree, &check_weighted); + /* ambiguous if they are equal, only check when they are distinct values. */ + if (MPI_UNWEIGHTED != NULL) { + if (!check_weighted) { + fprintf(stderr, "expected weighted == TRUE for the \"no graph -- NULLs\" case\n"); + ++errs; + } + } + MPI_Comm_free(&comm); + } + + /* MPI_Dist_graph_create_adjacent() with no graph -- passing NULLs+MPI_UNWEIGHTED instead */ + if (rank == 0) { + MTestPrintfMsg( 1, +"testing MPI_Dist_graph_create_adjacent w/ no graph -- NULLs+MPI_UNWEIGHTED\n"); + } + for (reorder = 0; reorder <= 1; reorder++) { + MPI_Dist_graph_create_adjacent(MPI_COMM_WORLD, 0, NULL, MPI_UNWEIGHTED, + 0, NULL, MPI_UNWEIGHTED, MPI_INFO_NULL, reorder, &comm); + MPI_Dist_graph_neighbors_count(comm, &check_indegree, &check_outdegree, &check_weighted); + /* ambiguous if they are equal, only check when they are distinct values. */ + if (MPI_UNWEIGHTED != NULL) { + if (check_weighted) { + fprintf(stderr, "expected weighted == FALSE for the \"no graph -- NULLs+MPI_UNWEIGHTED\" case\n"); + ++errs; + } + } + MPI_Comm_free(&comm); + } + + + for (i = 0; i < size; i++) + free(layout[i]); + free(layout); +#endif + + MTest_Finalize(errs); + MPI_Finalize(); + + return 0; +} diff --git a/teshsuite/smpi/mpich3-test/topo/graphcr.c b/teshsuite/smpi/mpich3-test/topo/graphcr.c new file mode 100644 index 0000000000..2bfac484ab --- /dev/null +++ b/teshsuite/smpi/mpich3-test/topo/graphcr.c @@ -0,0 +1,34 @@ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ +/* + * + * (C) 2003 by Argonne National Laboratory. + * See COPYRIGHT in top-level directory. + */ +#include "mpi.h" +#include +#include "mpitest.h" + +/* +static char MTEST_Descrip[] = "Create a communicator with a graph that contains no processes"; +*/ + +int main( int argc, char *argv[] ) +{ + int errs = 0; + int *index = 0, *edges = 0; + MPI_Comm comm; + + MTest_Init( &argc, &argv ); + + /* MPI 2.1, page 246, lines 29-30 make it clear that this is a valid + (not erroneous) call that must return MPI_COMM_NULL */ + MPI_Graph_create( MPI_COMM_WORLD, 0, index, edges, 0, &comm ); + if (comm != MPI_COMM_NULL) { + errs++; + fprintf( stderr, "Expected MPI_COMM_NULL from empty graph create\n" ); + } + + MTest_Finalize( errs ); + MPI_Finalize(); + return 0; +} diff --git a/teshsuite/smpi/mpich3-test/topo/graphcr2.c b/teshsuite/smpi/mpich3-test/topo/graphcr2.c new file mode 100644 index 0000000000..6d5fd2ae30 --- /dev/null +++ b/teshsuite/smpi/mpich3-test/topo/graphcr2.c @@ -0,0 +1,70 @@ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ +/* + * + * (C) 2003 by Argonne National Laboratory. + * See COPYRIGHT in top-level directory. + */ +#include "mpi.h" +#include +#include +#include "mpitest.h" + +/* +static char MTEST_Descrip[] = "Create a communicator with a graph that contains null edges and one that contains duplicate edges"; +*/ + +int main( int argc, char *argv[] ) +{ + int errs = 0; + int *index = 0, *edges = 0; + int rank, size, i, j, crank, csize; + MPI_Comm comm; + + MTest_Init( &argc, &argv ); + + MPI_Comm_size( MPI_COMM_WORLD, &size ); + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + + index = (int *)malloc( size*sizeof(int) ); + edges = (int *)malloc( size*sizeof(int) ); + for (i=0; i +#include "mpitest.h" + +int main( int argc, char *argv[] ) +{ + int errs = 0; + int newrank, merr, rank; + int index[2], edges[2]; + + MTest_Init( &argc, &argv ); + + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + /* Graph map where there are no nodes for this process */ + MPI_Comm_set_errhandler( MPI_COMM_WORLD, MPI_ERRORS_RETURN ); + /* Here is a singleton graph, containing only the root process */ + index[0] = 0; + edges[0] = 0; + merr = MPI_Graph_map( MPI_COMM_WORLD, 1, index, edges, &newrank ); + if (merr) { + errs++; + printf( "Graph map returned an error\n" ); + MTestPrintError( merr ); + } + if (rank != 0 && newrank != MPI_UNDEFINED) { + errs++; + printf( "Graph map with no local nodes did not return MPI_UNDEFINED\n" ); + } + + MTest_Finalize( errs ); + MPI_Finalize(); + return 0; + +} diff --git a/teshsuite/smpi/mpich3-test/topo/neighb_coll.c b/teshsuite/smpi/mpich3-test/topo/neighb_coll.c new file mode 100644 index 0000000000..0c4a7fd882 --- /dev/null +++ b/teshsuite/smpi/mpich3-test/topo/neighb_coll.c @@ -0,0 +1,179 @@ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ +/* + * (C) 2012 by Argonne National Laboratory. + * See COPYRIGHT in top-level directory. + */ +#include +#include +#include + +#include +#include "mpitest.h" + +#if !defined(USE_STRICT_MPI) && defined(MPICH) +#define TEST_NEIGHB_COLL 1 +#endif + +/* assert-like macro that bumps the err count and emits a message */ +#define check(x_) \ + do { \ + if (!(x_)) { \ + ++errs; \ + if (errs < 10) { \ + fprintf(stderr, "check failed: (%s), line %d\n", #x_, __LINE__); \ + } \ + } \ + } while (0) + +int main(int argc, char *argv[]) +{ + int errs = 0; + int wrank, wsize; + int periods[1] = { 0 }; + MPI_Comm cart, dgraph, graph; + + MPI_Init(&argc, &argv); + MPI_Comm_rank(MPI_COMM_WORLD, &wrank); + MPI_Comm_size(MPI_COMM_WORLD, &wsize); + +#if defined(TEST_NEIGHB_COLL) + /* a basic test for the 10 (5 patterns x {blocking,nonblocking}) MPI-3 + * neighborhood collective routines */ + + /* (wrap)--> 0 <--> 1 <--> ... <--> p-1 <--(wrap) */ + MPI_Cart_create(MPI_COMM_WORLD, 1, &wsize, periods, /*reorder=*/0, &cart); + + /* allgather */ + { + int sendbuf[1] = { wrank }; + int recvbuf[2] = { 0xdeadbeef, 0xdeadbeef }; + + /* should see one send to each neighbor (rank-1 and rank+1) and one receive + * each from same */ + MPI_Neighbor_allgather(sendbuf, 1, MPI_INT, recvbuf, 1, MPI_INT, cart); + + if (wrank == 0) + check(recvbuf[0] == 0xdeadbeef); + else + check(recvbuf[0] == wrank - 1); + + if (wrank == wsize - 1) + check(recvbuf[1] == 0xdeadbeef); + else + check(recvbuf[1] == wrank + 1); + } + + /* allgatherv */ + { + int sendbuf[1] = { wrank }; + int recvbuf[2] = { 0xdeadbeef, 0xdeadbeef }; + int recvcounts[2] = { 1, 1 }; + int displs[2] = { 1, 0}; + + /* should see one send to each neighbor (rank-1 and rank+1) and one receive + * each from same, but put them in opposite slots in the buffer */ + MPI_Neighbor_allgatherv(sendbuf, 1, MPI_INT, recvbuf, recvcounts, displs, MPI_INT, cart); + + if (wrank == 0) + check(recvbuf[1] == 0xdeadbeef); + else + check(recvbuf[1] == wrank - 1); + + if (wrank == wsize - 1) + check(recvbuf[0] == 0xdeadbeef); + else + check(recvbuf[0] == wrank + 1); + } + + /* alltoall */ + { + int sendbuf[2] = { -(wrank+1), wrank+1 }; + int recvbuf[2] = { 0xdeadbeef, 0xdeadbeef }; + + /* should see one send to each neighbor (rank-1 and rank+1) and one + * receive each from same */ + MPI_Neighbor_alltoall(sendbuf, 1, MPI_INT, recvbuf, 1, MPI_INT, cart); + + if (wrank == 0) + check(recvbuf[0] == 0xdeadbeef); + else + check(recvbuf[0] == wrank); + + if (wrank == wsize - 1) + check(recvbuf[1] == 0xdeadbeef); + else + check(recvbuf[1] == -(wrank + 2)); + } + + /* alltoallv */ + { + int sendbuf[2] = { -(wrank+1), wrank+1 }; + int recvbuf[2] = { 0xdeadbeef, 0xdeadbeef }; + int sendcounts[2] = { 1, 1 }; + int recvcounts[2] = { 1, 1 }; + int sdispls[2] = { 0, 1 }; + int rdispls[2] = { 1, 0 }; + + /* should see one send to each neighbor (rank-1 and rank+1) and one receive + * each from same, but put them in opposite slots in the buffer */ + MPI_Neighbor_alltoallv(sendbuf, sendcounts, sdispls, MPI_INT, + recvbuf, recvcounts, rdispls, MPI_INT, + cart); + + if (wrank == 0) + check(recvbuf[1] == 0xdeadbeef); + else + check(recvbuf[1] == wrank); + + if (wrank == wsize - 1) + check(recvbuf[0] == 0xdeadbeef); + else + check(recvbuf[0] == -(wrank + 2)); + } + + /* alltoallw */ + { + int sendbuf[2] = { -(wrank+1), wrank+1 }; + int recvbuf[2] = { 0xdeadbeef, 0xdeadbeef }; + int sendcounts[2] = { 1, 1 }; + int recvcounts[2] = { 1, 1 }; + MPI_Aint sdispls[2] = { 0, sizeof(int) }; + MPI_Aint rdispls[2] = { sizeof(int), 0 }; + MPI_Datatype sendtypes[2] = { MPI_INT, MPI_INT }; + MPI_Datatype recvtypes[2] = { MPI_INT, MPI_INT }; + + /* should see one send to each neighbor (rank-1 and rank+1) and one receive + * each from same, but put them in opposite slots in the buffer */ + MPI_Neighbor_alltoallw(sendbuf, sendcounts, sdispls, sendtypes, + recvbuf, recvcounts, rdispls, recvtypes, + cart); + + if (wrank == 0) + check(recvbuf[1] == 0xdeadbeef); + else + check(recvbuf[1] == wrank); + + if (wrank == wsize - 1) + check(recvbuf[0] == 0xdeadbeef); + else + check(recvbuf[0] == -(wrank + 2)); + } + + + MPI_Comm_free(&cart); +#endif /* defined(TEST_NEIGHB_COLL) */ + + MPI_Reduce((wrank == 0 ? MPI_IN_PLACE : &errs), &errs, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); + if (wrank == 0) { + if (errs) { + printf("found %d errors\n", errs); + } + else { + printf(" No errors\n"); + } + } + MPI_Finalize(); + + return 0; +} + diff --git a/teshsuite/smpi/mpich3-test/topo/testlist b/teshsuite/smpi/mpich3-test/topo/testlist new file mode 100644 index 0000000000..0ec8867d09 --- /dev/null +++ b/teshsuite/smpi/mpich3-test/topo/testlist @@ -0,0 +1,21 @@ +#need Cart implem +#cartmap1 4 +#cartzero 4 +#cartshift1 4 +#cartsuball 4 +#cartcreates 4 +#need MPI_Dims_create +#dims1 4 +#dims2 1 +#need MPI_Error_class, MPI_Comm_remote_size, MPI_Graph_map +#graphmap1 4 +#need MPI_Topo_test, MPI_Cart_create +#topotest 4 +#need MPI_Cart_create, MPI_Cart_get, MPI_Comm_remote_size, MPI_Dims_create ... +#topodup 4 +#need MPI_Graph* +#graphcr 4 +#graphcr2 4 +#distgraph1 4 mpiversion=2.2 +#dgraph_unwgt 4 mpiversion=2.2 +#neighb_coll 4 mpiversion=3.0 diff --git a/teshsuite/smpi/mpich3-test/topo/topodup.c b/teshsuite/smpi/mpich3-test/topo/topodup.c new file mode 100644 index 0000000000..f1c5515ff1 --- /dev/null +++ b/teshsuite/smpi/mpich3-test/topo/topodup.c @@ -0,0 +1,129 @@ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ +/* + * + * (C) 2003 by Argonne National Laboratory. + * See COPYRIGHT in top-level directory. + */ +#include "mpi.h" +#include +#include +#include "mpitest.h" + +int main( int argc, char *argv[] ) +{ + int errs = 0, i, k; + int dims[2], periods[2], wsize; + int outdims[2], outperiods[2], outcoords[2]; + int topo_type; + int *index, *edges, *outindex, *outedges; + MPI_Comm comm1, comm2; + + MTest_Init( &argc, &argv ); + + MPI_Comm_size( MPI_COMM_WORLD, &wsize ); + + /* Create a cartesian topology, get its characteristics, then + dup it and check that the new communicator has the same properties */ + dims[0] = dims[1] = 0; + MPI_Dims_create( wsize, 2, dims ); + periods[0] = periods[1] = 0; + MPI_Cart_create( MPI_COMM_WORLD, 2, dims, periods, 0, &comm1 ); + + MPI_Comm_dup( comm1, &comm2 ); + MPI_Topo_test( comm2, &topo_type ); + if (topo_type != MPI_CART) { + errs++; + printf( "Topo type of duped cart was not cart\n" ); + } + else { + MPI_Cart_get( comm2, 2, outdims, outperiods, outcoords ); + for (i=0; i<2; i++) { + if (outdims[i] != dims[i]) { + errs++; + printf( "%d = outdims[%d] != dims[%d] = %d\n", outdims[i], + i, i, dims[i] ); + } + if (outperiods[i] != periods[i]) { + errs++; + printf( "%d = outperiods[%d] != periods[%d] = %d\n", + outperiods[i], i, i, periods[i] ); + } + } + } + MPI_Comm_free( &comm2 ); + MPI_Comm_free( &comm1 ); + + /* Now do the same with a graph topology */ + if (wsize >= 3) { + index = (int*)malloc(wsize * sizeof(int) ); + edges = (int*)malloc(wsize * 2 * sizeof(int) ); + if (!index || !edges) { + printf( "Unable to allocate %d words for index or edges\n", + 3 * wsize ); + MPI_Abort( MPI_COMM_WORLD, 1 ); + } + index[0] = 2; + for (i=1; i +#include "mpitest.h" + +int main( int argc, char *argv[] ) +{ + int errs = 0; + int topo_type, size, dims[1], periods[1]; + MPI_Comm comm; + + MTest_Init( &argc, &argv ); + + /* Check that topo test returns the correct type, including + MPI_UNDEFINED */ + + MPI_Topo_test( MPI_COMM_WORLD, &topo_type ); + if (topo_type != MPI_UNDEFINED) { + errs++; + printf( "Topo type of comm world is not UNDEFINED\n" ); + } + + MPI_Comm_size( MPI_COMM_WORLD, &size ); + dims[0] = size; + periods[0] = 0; + MPI_Cart_create( MPI_COMM_WORLD, 1, dims, periods, 0, &comm ); + MPI_Topo_test( comm, &topo_type ); + if (topo_type != MPI_CART) { + errs++; + printf( "Topo type of cart comm is not CART\n" ); + } + + MPI_Comm_free( &comm ); + /* FIXME: still need graph example */ + + MTest_Finalize( errs ); + MPI_Finalize(); + return 0; + +} diff --git a/teshsuite/xbt/mmalloc_test.c b/teshsuite/xbt/mmalloc_test.c index a09704de3e..b9a074c648 100644 --- a/teshsuite/xbt/mmalloc_test.c +++ b/teshsuite/xbt/mmalloc_test.c @@ -27,7 +27,7 @@ int main(int argc, char**argv) xbt_init(&argc,argv); XBT_INFO("Allocating a new heap"); - unsigned long mask = ~((unsigned long)getpagesize() - 1); + unsigned long mask = ~((unsigned long)xbt_pagesize - 1); void *addr = (void*)(((unsigned long)sbrk(0) + BUFFSIZE) & mask); heapA = xbt_mheap_new(-1, addr); if (heapA == NULL) { diff --git a/tools/tesh/background.tesh b/tools/tesh/background.tesh index 359d2a5446..1029d89c3a 100644 --- a/tools/tesh/background.tesh +++ b/tools/tesh/background.tesh @@ -43,7 +43,7 @@ $ cd temp_testdir_background < } $ mkfile delayed_cat.c -$ gcc -Wall -o delayed_cat delayed_cat.c +$ cc -Wall -o delayed_cat delayed_cat.c & ./delayed_cat > TOTO diff --git a/tools/tesh/bg-set-signal.tesh b/tools/tesh/bg-set-signal.tesh index 3efe2c359d..ff9c3d5401 100644 --- a/tools/tesh/bg-set-signal.tesh +++ b/tools/tesh/bg-set-signal.tesh @@ -13,7 +13,7 @@ $ cd temp_testdir-bg-set-signal < } $ mkfile segfault.c -$ gcc -o segfault segfault.c +$ cc -o segfault segfault.c ! expect signal SIGSEGV & ./segfault $ sleep 1 diff --git a/tools/tesh/catch-return.tesh b/tools/tesh/catch-return.tesh index ea794f1bbb..f9d21a29fc 100644 --- a/tools/tesh/catch-return.tesh +++ b/tools/tesh/catch-return.tesh @@ -12,7 +12,7 @@ $ cd temp_testdir-catch-return < } $ mkfile return1.c -$ gcc -o return1 return1.c +$ cc -o return1 return1.c ! expect return 41 < $ ./return1 diff --git a/tools/tesh/catch-signal.tesh b/tools/tesh/catch-signal.tesh index 5c7b45f05e..64d37e8a20 100644 --- a/tools/tesh/catch-signal.tesh +++ b/tools/tesh/catch-signal.tesh @@ -13,7 +13,7 @@ $ cd temp_testdir-catch-signal < } $ mkfile segfault.c -$ gcc -o segfault segfault.c +$ cc -o segfault segfault.c ! expect return 15 < $ ./segfault diff --git a/tools/tesh/set-return.tesh b/tools/tesh/set-return.tesh index ff0dd17760..679234de34 100644 --- a/tools/tesh/set-return.tesh +++ b/tools/tesh/set-return.tesh @@ -12,7 +12,7 @@ $ cd temp_testdir-set-return < } $ mkfile return1.c -$ gcc -o return1 return1.c +$ cc -o return1 return1.c ! expect return 1 $ ./return1 diff --git a/tools/tesh/set-signal.tesh b/tools/tesh/set-signal.tesh index 43f105e06e..314b7f0fe8 100644 --- a/tools/tesh/set-signal.tesh +++ b/tools/tesh/set-signal.tesh @@ -13,7 +13,7 @@ $ cd temp_testdir-set-signal < } $ mkfile segfault.c -$ gcc -o segfault segfault.c +$ cc -o segfault segfault.c ! expect signal SIGSEGV $ ./segfault $ cd .. diff --git a/tools/tesh/setenv.tesh b/tools/tesh/setenv.tesh index 72d5566d33..632fd8bb44 100644 --- a/tools/tesh/setenv.tesh +++ b/tools/tesh/setenv.tesh @@ -21,7 +21,7 @@ $ cd temp_testdir-setenv < } $ mkfile getenv.c -$ gcc -o getenv getenv.c -g +$ cc -o getenv getenv.c -g ! setenv tesh_test_toto=blah $ ./getenv diff --git a/tools/tesh/signal.c b/tools/tesh/signal.c index a43da9b3a7..204d52a90b 100644 --- a/tools/tesh/signal.c +++ b/tools/tesh/signal.c @@ -48,7 +48,7 @@ static const s_signal_entry_t signals[] = { }; -const char *signal_name(unsigned int got, char *expected) +const char *signal_name(int got, char *expected) { int i; diff --git a/tools/tesh/tesh.h b/tools/tesh/tesh.h index cd9236d654..1fc2d89771 100644 --- a/tools/tesh/tesh.h +++ b/tools/tesh/tesh.h @@ -17,7 +17,7 @@ /******************************************/ /* return the name of a signal, aliasing SIGBUS to SIGSEGV since segfault leads to any of them depending on the system */ -const char *signal_name(unsigned int got, char *expected); +const char *signal_name(int got, char *expected); #include "run_context.h"